djangoadmin.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. """
  2. Defines `UserAdminModel` for registration of Misago `User` model in django
  3. admin panel.
  4. The model supposed to be used for interaction of third party django apps with
  5. Misago `User` model, i.e. assignment to a `User` permissions or groups.
  6. Registration call is placed in :mod:`misago.users.admin`.
  7. Test for the model is placed in :mod:`misago.users.tests.test_djangoadmin_user`.
  8. """
  9. from django import forms
  10. from django.contrib import admin
  11. from django.contrib.auth import get_user_model
  12. from django.urls import reverse
  13. from django.utils.html import format_html
  14. from django.utils.translation import ugettext as _
  15. # Misago user model
  16. UserModel = get_user_model()
  17. class UserAdminForm(forms.ModelForm):
  18. """
  19. This form adds `edit_from_misago_link` pseudo-field, that renders
  20. itself like an html hyperlink to a user edit page in misago admin panel.
  21. This could be done with `User` edit template overwrite, but
  22. it is kind of overkill - overwrite the whole template just to add one
  23. button - isn't it?
  24. """
  25. edit_from_misago_link = forms.Field()
  26. def __init__(self, *args, **kwargs):
  27. super(UserAdminForm, self).__init__(*args, **kwargs)
  28. self.init_edit_from_misago_link_field()
  29. def init_edit_from_misago_link_field(self):
  30. """init for the pseudo-field, and replace it's widget `render`"""
  31. field = self.fields['edit_from_misago_link']
  32. field.required = False
  33. field.label = ''
  34. field.widget.render = self.render_edit_from_misago_link
  35. def render_edit_from_misago_link(self, *args, **kwargs):
  36. """composes an html hyperlink for the pseudo-field render"""
  37. text = _('Edit this user in Misago admin panel')
  38. link_html_template = ('<a href="{}" target="blank">' + text + '</a>')
  39. link_url = reverse(
  40. viewname='misago:admin:users:accounts:edit',
  41. kwargs={'pk': self.instance.pk},
  42. )
  43. link_html = format_html(link_html_template, link_url)
  44. return link_html
  45. class Meta:
  46. model = UserModel
  47. fields = ['edit_from_misago_link']
  48. class UserAdmin(admin.ModelAdmin):
  49. """
  50. Redeclare most of the model fields like read-only.
  51. Prevents new/delete actions (users should use misago admin panel for
  52. that).
  53. Replaces default form with custom `UserAdminForm`.
  54. """
  55. list_display = ['username', 'email', 'is_staff', 'is_superuser']
  56. search_fields = ['username', 'email']
  57. list_filter = ['groups', 'is_staff', 'is_superuser']
  58. form = UserAdminForm
  59. actions = None
  60. readonly_fields = [
  61. 'username', 'email', 'rank', 'last_login', 'joined_on', 'is_staff', 'is_superuser'
  62. ]
  63. fieldsets = [
  64. [
  65. _('Misago user data'),
  66. {
  67. 'fields': (
  68. 'username', 'email', 'rank', 'last_login', 'joined_on', 'is_staff',
  69. 'is_superuser', 'edit_from_misago_link',
  70. )
  71. },
  72. ],
  73. [
  74. _('Edit permissions and groups'),
  75. {
  76. 'fields': ('groups', 'user_permissions', )
  77. },
  78. ],
  79. ]
  80. def has_add_permission(self, request):
  81. return False
  82. def has_delete_permission(self, request, obj=None):
  83. return False