admin.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. from django.conf.urls import url
  2. from django.conf.urls import url
  3. from django.contrib import admin as djadmin
  4. from django.contrib.auth import get_user_model
  5. from django.db import transaction
  6. from django.utils.translation import ugettext_lazy as _
  7. from misago.acl.models import Role
  8. from misago.users.views.admin.bans import BansList, NewBan, EditBan, DeleteBan
  9. from misago.users.views.admin.ranks import (RanksList, NewRank, EditRank,
  10. DeleteRank, MoveDownRank,
  11. MoveUpRank, DefaultRank)
  12. from misago.users.views.admin.users import UsersList, NewUser, EditUser
  13. from misago.users.views.admin.warnings import (WarningsList, NewWarning,
  14. EditWarning, MoveDownWarning,
  15. MoveUpWarning, DeleteWarning)
  16. class UserAdmin(djadmin.ModelAdmin):
  17. actions = None
  18. list_display = ('username', 'email', 'is_staff', 'is_superuser')
  19. search_fields = ('username', 'email')
  20. list_filter = ('groups', 'is_staff', 'is_superuser')
  21. readonly_fields = ('username', 'email', 'is_staff', 'is_superuser')
  22. fieldsets = (
  23. (_('User data'),
  24. {'fields': ('username', 'email', 'is_staff', 'is_superuser')}),
  25. (_('Misago permissions'),
  26. {'fields': ('rank', 'roles')}),
  27. (_('Change Django Permissions'),
  28. {'fields': ('groups', 'user_permissions')}),
  29. )
  30. def has_add_permission(self, request):
  31. return False
  32. def has_delete_permission(self, request, obj=None):
  33. return False
  34. def save_related(self, request, form, formsets, change):
  35. with transaction.atomic():
  36. obj = form.instance
  37. obj.roles.clear()
  38. obj.roles.add(*form.cleaned_data['roles'])
  39. member_role = Role.objects.get(special_role='authenticated')
  40. if not member_role.pk in [r.pk for r in form.cleaned_data['roles']]:
  41. obj.roles.add(member_role)
  42. # Update ACL key
  43. obj.update_acl_key()
  44. obj.save(update_fields=['acl_key'])
  45. obj.groups.clear()
  46. if form.cleaned_data['groups']:
  47. obj.groups.add(*form.cleaned_data['groups'])
  48. obj.user_permissions.clear()
  49. if form.cleaned_data['user_permissions']:
  50. obj.user_permissions.add(*form.cleaned_data['user_permissions'])
  51. djadmin.site.register(get_user_model(), UserAdmin)
  52. class MisagoAdminExtension(object):
  53. def register_urlpatterns(self, urlpatterns):
  54. # Users section
  55. urlpatterns.namespace(r'^users/', 'users')
  56. # Accounts
  57. urlpatterns.namespace(r'^accounts/', 'accounts', 'users')
  58. urlpatterns.patterns('users:accounts',
  59. url(r'^$', UsersList.as_view(), name='index'),
  60. url(r'^(?P<page>\d+)/$', UsersList.as_view(), name='index'),
  61. url(r'^new/$', NewUser.as_view(), name='new'),
  62. url(r'^edit/(?P<user_id>\d+)/$', EditUser.as_view(), name='edit'),
  63. )
  64. # Ranks
  65. urlpatterns.namespace(r'^ranks/', 'ranks', 'users')
  66. urlpatterns.patterns('users:ranks',
  67. url(r'^$', RanksList.as_view(), name='index'),
  68. url(r'^new/$', NewRank.as_view(), name='new'),
  69. url(r'^edit/(?P<rank_id>\d+)/$', EditRank.as_view(), name='edit'),
  70. url(r'^default/(?P<rank_id>\d+)/$', DefaultRank.as_view(), name='default'),
  71. url(r'^move/down/(?P<rank_id>\d+)/$', MoveDownRank.as_view(), name='down'),
  72. url(r'^move/up/(?P<rank_id>\d+)/$', MoveUpRank.as_view(), name='up'),
  73. url(r'^delete/(?P<rank_id>\d+)/$', DeleteRank.as_view(), name='delete'),
  74. )
  75. # Bans
  76. urlpatterns.namespace(r'^bans/', 'bans', 'users')
  77. urlpatterns.patterns('users:bans',
  78. url(r'^$', BansList.as_view(), name='index'),
  79. url(r'^(?P<page>\d+)/$', BansList.as_view(), name='index'),
  80. url(r'^new/$', NewBan.as_view(), name='new'),
  81. url(r'^edit/(?P<ban_id>\d+)/$', EditBan.as_view(), name='edit'),
  82. url(r'^delete/(?P<ban_id>\d+)/$', DeleteBan.as_view(), name='delete'),
  83. )
  84. # Warnings
  85. urlpatterns.namespace(r'^warnings/', 'warnings', 'users')
  86. urlpatterns.patterns('users:warnings',
  87. url(r'^$', WarningsList.as_view(), name='index'),
  88. url(r'^new/$', NewWarning.as_view(), name='new'),
  89. url(r'^edit/(?P<warning_id>\d+)/$', EditWarning.as_view(), name='edit'),
  90. url(r'^move/down/(?P<warning_id>\d+)/$', MoveDownWarning.as_view(), name='down'),
  91. url(r'^move/up/(?P<warning_id>\d+)/$', MoveUpWarning.as_view(), name='up'),
  92. url(r'^delete/(?P<warning_id>\d+)/$', DeleteWarning.as_view(), name='delete'),
  93. )
  94. def register_navigation_nodes(self, site):
  95. site.add_node(name=_("Users"),
  96. icon='fa fa-users',
  97. parent='misago:admin',
  98. after='misago:admin:index',
  99. namespace='misago:admin:users',
  100. link='misago:admin:users:accounts:index')
  101. site.add_node(name=_("User Accounts"),
  102. icon='fa fa-users',
  103. parent='misago:admin:users',
  104. namespace='misago:admin:users:accounts',
  105. link='misago:admin:users:accounts:index')
  106. site.add_node(name=_("Ranks"),
  107. icon='fa fa-graduation-cap',
  108. parent='misago:admin:users',
  109. after='misago:admin:users:accounts:index',
  110. namespace='misago:admin:users:ranks',
  111. link='misago:admin:users:ranks:index')
  112. site.add_node(name=_("Bans"),
  113. icon='fa fa-lock',
  114. parent='misago:admin:users',
  115. after='misago:admin:users:ranks:index',
  116. namespace='misago:admin:users:bans',
  117. link='misago:admin:users:bans:index')
  118. site.add_node(name=_("Warning levels"),
  119. icon='fa fa-exclamation-triangle',
  120. parent='misago:admin:users',
  121. after='misago:admin:users:bans:index',
  122. namespace='misago:admin:users:warnings',
  123. link='misago:admin:users:warnings:index')