views.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. from django.contrib import messages
  2. from django.utils.translation import gettext_lazy as _
  3. from ...admin.views import generic
  4. from ..cache import clear_socialauth_cache
  5. from ..models import SocialAuthProvider
  6. from ..providers import providers
  7. class SocialAuthProviderAdmin(generic.AdminBaseMixin):
  8. root_link = "misago:admin:settings:socialauth:index"
  9. model = SocialAuthProvider
  10. form_class = None
  11. templates_dir = "misago/admin/socialauth"
  12. message_404 = _("Requested social login provider does not exist.")
  13. def get_target(self, kwargs):
  14. queryset = SocialAuthProvider.objects.filter(is_active=True)
  15. if self.is_atomic:
  16. queryset = queryset.select_for_update()
  17. return queryset.get(pk=kwargs["pk"])
  18. def get_queryset(self):
  19. return super().get_queryset().filter(is_active=True)
  20. class SocialAuthProvidersList(SocialAuthProviderAdmin, generic.ListView):
  21. def process_context(self, request, context):
  22. active_providers = [i.pk for i in context["items"]]
  23. context["inactive_providers"] = []
  24. for provider in providers.list():
  25. if provider["provider"] not in active_providers:
  26. context["inactive_providers"].append(provider)
  27. return context
  28. class EditSocialAuthProvider(SocialAuthProviderAdmin, generic.ModelFormView):
  29. def get_target(self, kwargs):
  30. try:
  31. return SocialAuthProvider.objects.get(provider=kwargs["pk"])
  32. except SocialAuthProvider.DoesNotExist:
  33. if not providers.is_registered(kwargs["pk"]):
  34. raise
  35. return SocialAuthProvider(provider=kwargs["pk"])
  36. def get_form_class(self, request, target):
  37. return providers.get_admin_form_class(target.provider)
  38. def get_form(self, form_class, request, target):
  39. if request.method == "POST":
  40. return form_class(request.POST, instance=target, request=request)
  41. return form_class(instance=target, initial=target.settings, request=request)
  42. def get_template_name(self, request, target):
  43. return providers.get_admin_template_name(target.provider)
  44. def handle_form(self, form, request, target):
  45. form.save()
  46. clear_socialauth_cache()
  47. message = _("Login with %(provider)s has been updated.")
  48. messages.success(request, message % {"provider": target})
  49. class DisableSocialAuthProvider(SocialAuthProviderAdmin, generic.ButtonView):
  50. def button_action(self, request, target):
  51. target.is_active = False
  52. target.save(update_fields=["is_active"])
  53. clear_socialauth_cache()
  54. message = _("Login with %(provider)s has been disabled.")
  55. messages.success(request, message % {"provider": target})
  56. class MoveDownSocialAuthProvider(SocialAuthProviderAdmin, generic.ButtonView):
  57. def button_action(self, request, target):
  58. try:
  59. other_target = SocialAuthProvider.objects.filter(
  60. is_active=True, order__gt=target.order
  61. )
  62. other_target = other_target.earliest("order")
  63. except SocialAuthProvider.DoesNotExist:
  64. other_target = None
  65. if other_target:
  66. other_target.order, target.order = target.order, other_target.order
  67. other_target.save(update_fields=["order"])
  68. target.save(update_fields=["order"])
  69. clear_socialauth_cache()
  70. message = _("Login with %(provider)s has been moved after %(other)s.")
  71. targets_names = {"provider": target, "other": other_target}
  72. messages.success(request, message % targets_names)
  73. class MoveUpSocialAuthProvider(SocialAuthProviderAdmin, generic.ButtonView):
  74. def button_action(self, request, target):
  75. try:
  76. other_target = SocialAuthProvider.objects.filter(
  77. is_active=True, order__lt=target.order
  78. )
  79. other_target = other_target.latest("order")
  80. except SocialAuthProvider.DoesNotExist:
  81. other_target = None
  82. if other_target:
  83. other_target.order, target.order = target.order, other_target.order
  84. other_target.save(update_fields=["order"])
  85. target.save(update_fields=["order"])
  86. clear_socialauth_cache()
  87. message = _("Login with %(provider)s has been moved before %(other)s.")
  88. targets_names = {"provider": target, "other": other_target}
  89. messages.success(request, message % targets_names)