djangoadmin.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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.contrib import admin
  10. from django.contrib.auth import get_user_model
  11. from django.urls import reverse
  12. from django.utils.html import format_html
  13. from django.utils.translation import ugettext as _
  14. from misago.core import forms
  15. # Misago user model
  16. User = 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. #: pseudo-field
  26. edit_from_misago_link = forms.Field()
  27. def __init__(self, *args, **kwargs):
  28. # noinspection PyArgumentList
  29. super(UserAdminForm, self).__init__(*args, **kwargs)
  30. self.init_edit_from_misago_link_field()
  31. def init_edit_from_misago_link_field(self):
  32. """
  33. Init for the pseudo-field, and replace it's widget `render`.
  34. """
  35. field = self.fields['edit_from_misago_link']
  36. field.required = False
  37. field.label = ''
  38. field.widget.render = self.render_edit_from_misago_link
  39. # noinspection PyUnusedLocal
  40. def render_edit_from_misago_link(self, *args, **kwargs):
  41. """
  42. Composes an html hyperlink for the pseudo-field render.
  43. `*args` and `**kwargs` arguments need to mimic widget `render()`
  44. signature.
  45. :rtype: str
  46. """
  47. text = _('Edit this user in Misago admin panel')
  48. link_html_template = ('<a href="{}" target="blank">' + text + '</a>')
  49. link_url = reverse(
  50. viewname='misago:admin:users:accounts:edit',
  51. kwargs={'pk': self.instance.pk},
  52. )
  53. link_html = format_html(link_html_template, link_url)
  54. return link_html
  55. class Meta:
  56. model = User
  57. fields = ['edit_from_misago_link']
  58. class UserAdminModel(admin.ModelAdmin):
  59. """
  60. Redeclare most of the model fields like read-only.
  61. Prevents new/delete actions (users should use misago admin panel for
  62. that).
  63. Replaces default form with custom `UserAdminForm`.
  64. """
  65. list_display = (
  66. 'username',
  67. 'email',
  68. 'is_staff',
  69. 'is_superuser',
  70. )
  71. search_fields = ('username', 'email')
  72. list_filter = ('groups', 'is_staff', 'is_superuser')
  73. form = UserAdminForm
  74. actions = None
  75. readonly_fields = (
  76. 'username',
  77. 'email',
  78. 'rank',
  79. 'last_login',
  80. 'joined_on',
  81. 'is_staff',
  82. 'is_superuser',
  83. )
  84. fieldsets = (
  85. (
  86. _('Misago user data'),
  87. {'fields': (
  88. 'username',
  89. 'email',
  90. 'rank',
  91. 'last_login',
  92. 'joined_on',
  93. 'is_staff',
  94. 'is_superuser',
  95. 'edit_from_misago_link',
  96. )},
  97. ),
  98. (
  99. _('Edit permissions and groups'),
  100. {'fields': (
  101. 'groups',
  102. 'user_permissions',
  103. )},
  104. ),
  105. )
  106. def has_add_permission(self, request):
  107. return False
  108. def has_delete_permission(self, request, obj=None):
  109. return False