djangoadmin.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. #: 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. def render_edit_from_misago_link(self, *args, **kwargs):
  40. """
  41. Composes an html hyperlink for the pseudo-field render.
  42. """
  43. text = _('Edit this user in Misago admin panel')
  44. link_html_template = ('<a href="{}" target="blank">' + text + '</a>')
  45. link_url = reverse(
  46. viewname='misago:admin:users:accounts:edit',
  47. kwargs={'pk': self.instance.pk},
  48. )
  49. link_html = format_html(link_html_template, link_url)
  50. return link_html
  51. class Meta:
  52. model = UserModel
  53. fields = ['edit_from_misago_link']
  54. class UserAdmin(admin.ModelAdmin):
  55. """
  56. Redeclare most of the model fields like read-only.
  57. Prevents new/delete actions (users should use misago admin panel for
  58. that).
  59. Replaces default form with custom `UserAdminForm`.
  60. """
  61. list_display = ('username', 'email', 'is_staff', 'is_superuser', )
  62. search_fields = ('username', 'email')
  63. list_filter = ('groups', 'is_staff', 'is_superuser')
  64. form = UserAdminForm
  65. actions = None
  66. readonly_fields = (
  67. 'username', 'email', 'rank', 'last_login', 'joined_on', 'is_staff', 'is_superuser',
  68. )
  69. fieldsets = ((
  70. _('Misago user data'), {
  71. 'fields': (
  72. 'username', 'email', 'rank', 'last_login', 'joined_on', 'is_staff', 'is_superuser',
  73. 'edit_from_misago_link',
  74. )
  75. },
  76. ), (_('Edit permissions and groups'), {
  77. 'fields': ('groups', 'user_permissions', )
  78. }, ), )
  79. def has_add_permission(self, request):
  80. return False
  81. def has_delete_permission(self, request, obj=None):
  82. return False