Solicitando ayuda para degradar usuarios con direcciones de correo electrónico no válidas

Por razones históricas, mi importador de Google+ importó usuarios en TL1 para darles una ventaja a los refugiados de Google+. Se importan con direcciones de correo electrónico .invalid, y lo arreglamos cuando inician sesión y se conectan a su registro de usuario existente a través de su ID de Google mediante la autenticación de Google.

Pero ahora mi grupo trust_level_1 está inflado con miles de usuarios que aún no han seguido su contenido, y si aparecen después de unos años (como a veces continúan haciendo), no hay ninguna razón particular para que entren como usuarios Básicos; deberían ser usuarios Nuevos. El arranque ya pasó. Me gustaría degradar a esos usuarios que nunca han iniciado sesión a TL0 hasta que aparezcan y echen un vistazo, y simplemente depender del proceso de promoción normal.

Intenté esto en la consola de Rails:

User.where(trust_level: 1) do |u|
    u.change_trust_level!(TrustLevel[0]) if !Email.is_valid?(u.primary_email&.email)
    u.save!
end

Tardó minutos consumiendo una CPU completa, pero no hizo nada. (Intenté otras variaciones en el camino, como if !u.primary_email.is_valid? y if !Email.is_valid?(u.primary_email) y sé que el problema real es que toco Ruby una vez al año más o menos…) Estoy seguro de que me estoy perdiendo algo obvio para otros. ¡Agradecería una pista si a alguien se le ocurre una!

2 Me gusta

Claramente me faltaba .each

User.where(trust_level: 1).each do |u|
    u.change_trust_level!(TrustLevel[0]) if !Email.is_valid?(u.primary_email&.email)
    u.save!
end

Esto hizo que mi sitio se cayera mientras se ejecutaba con mucha E/S y aún así no hizo ningún cambio. Así que todavía estoy haciendo algo mal y no estoy un poco preocupado por seguir intentándolo en el sistema en vivo. :smiling_face:

Me di cuenta de que esto no es lo que significa is_valid?. Así que ahora estoy buscando la cadena literal en su lugar, y lo probé imprimiendo la dirección de correo electrónico. También veo que change_trust_level ya guarda el usuario, así que no necesito hacerlo dos veces.

User.where(trust_level: 1).each do |u|
   if u.primary_email&.email.end_with?(".invalid")
     u.change_trust_level!(TrustLevel[0])
   end
end

Pero el número de usuarios en trust_level_1 todavía no cambia, así que todavía me falta algo importante.

¿Podrías usar la tarea de administración masiva en este caso?


Aunque acabo de probar tu segundo código y funcionó para mí en mi usuario de prueba (correo electrónico: test_thirteen@here.invalid, era TL1 y ahora es TL0).

User.where(trust_level: 1).each do |u|
   if u.primary_email&.email.end_with?(".invalid")  
     u.change_trust_level!(TrustLevel[0])    
   end  
end
3 Me gusta

Empezaría con el modelo UserEmail y buscaría los que tienen “invalid” en su dirección de correo electrónico y los recorrería, pero eso no es algo que pueda averiguar exactamente en mi teléfono.

Si esas direcciones con “invalid” fueran realmente inválidas, entonces no podrían guardarse.

1 me gusta

¡Gracias!

He promovido manualmente a algunos usuarios que ya eran bien conocidos por los miembros existentes de la comunidad, por lo que un recálculo masivo no haría lo que quiero. (Sí encontré esa página mientras buscaba).

Lo último en realidad estaba funcionando, como te sucedió a ti. Mi problema era que estaba mirando la página de descripción general de grupos /g y actualizándola, y buscando que el recuento del grupo trust_level_1 disminuyera. No mostraba un cambio en el recuento mientras lo ejecutaba, así que lo detuve con control-C. Esta mañana, el grupo trust_level_1 ahora tiene miles de miembros menos que se muestran en esa página. Así que ahora me doy cuenta de que el recuento allí está en caché, y debería haber hecho clic en esa tarjeta y mirado el recuento en la página /g/trust_level_1.

Ahora entiendo que debería haber seguido con Group.ensure_consistency! para reparar los recuentos en esa página.

Aquí está todo, expresado de manera más compacta e idiomática:

User.where(trust_level: 1).each do |u|
     u.change_trust_level!(TrustLevel[0]) if u.primary_email&.email.end_with?(".invalid")  
end
Group.ensure_consistency!

Tengo un registro de algunos usuarios con solo un correo electrónico no válido que han utilizado el sitio y cumplen los requisitos de TL1. No sé cómo sucedió eso, pero por ahora no me importa. Lo único que me importa es ocuparme de la mayoría de miles, sin preocuparme por las pocas excepciones. Si esto le sucede a alguien más, esto funcionó para mí:

User.where(trust_level: 1).each do |u|
  begin
     u.change_trust_level!(TrustLevel[0]) if u.primary_email&.email.end_with?(".invalid")  
  rescue
  end
end
Group.ensure_consistency!
2 Me gusta

Aquí está el contexto:

script/import_scripts/friendsmegplus.rb

  def import_google_user(id, name)
    if !@emails[id].present?
      google_user_info = UserAssociatedAccount.find_by(provider_name: 'google_oauth2', provider_u
id: id.to_i)
      if google_user_info.nil?
        # crear nuevo usuario de google en el sistema; se espera que este usuario se fusione
        # cuando más tarde inicie sesión con autenticación de google
        # Tenga en cuenta que debido a que la dirección de correo electrónico no está incluida en los datos de G+,
        # no sabemos si ya tienen otra cuenta que aún no está asociada
        # con google ooauth2. Si no iniciaron sesión, tendrán una dirección
        # @gplus.invalid asociada con su cuenta
        email = "#{id}@gplus.invalid"

Esto significa que solo me importa primary_email y no tengo que empezar con UserEmail. Empecé por ese camino antes de darme cuenta de que cualquier cosa que cambiara eso para que no fuera el primary_email haría que no quisiera cambiarlos de todos modos. Así que aquí se trata muy específicamente de usuarios cuyo único (por lo tanto, principal) correo electrónico termina literalmente en .invalid, que es lo que he hecho.

1 me gusta

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.