djangoadmin.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. # 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 = UserModel
  57. fields = ['edit_from_misago_link']
  58. class UserAdmin(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 = ('username', 'email', 'is_staff', 'is_superuser', )
  66. search_fields = ('username', 'email')
  67. list_filter = ('groups', 'is_staff', 'is_superuser')
  68. form = UserAdminForm
  69. actions = None
  70. readonly_fields = (
  71. 'username', 'email', 'rank', 'last_login', 'joined_on', 'is_staff', 'is_superuser',
  72. )
  73. fieldsets = ((
  74. _('Misago user data'), {
  75. 'fields': (
  76. 'username', 'email', 'rank', 'last_login', 'joined_on', 'is_staff', 'is_superuser',
  77. 'edit_from_misago_link',
  78. )
  79. },
  80. ), (_('Edit permissions and groups'), {
  81. 'fields': ('groups', 'user_permissions', )
  82. }, ), )
  83. def has_add_permission(self, request):
  84. return False
  85. def has_delete_permission(self, request, obj=None):
  86. return False