from django.conf.urls import url from django.conf.urls import url from django.contrib import admin as djadmin from django.contrib.auth import get_user_model from django.db import transaction from django.utils.translation import ugettext_lazy as _ from misago.acl.models import Role from misago.users.views.admin.bans import BansList, NewBan, EditBan, DeleteBan from misago.users.views.admin.ranks import (RanksList, NewRank, EditRank, DeleteRank, MoveDownRank, MoveUpRank, DefaultRank) from misago.users.views.admin.users import UsersList, NewUser, EditUser from misago.users.views.admin.warnings import (WarningsList, NewWarning, EditWarning, MoveDownWarning, MoveUpWarning, DeleteWarning) class UserAdmin(djadmin.ModelAdmin): actions = None list_display = ('username', 'email', 'is_staff', 'is_superuser') search_fields = ('username', 'email') list_filter = ('groups', 'is_staff', 'is_superuser') readonly_fields = ('username', 'email', 'is_staff', 'is_superuser') fieldsets = ( (_('User data'), {'fields': ('username', 'email', 'is_staff', 'is_superuser')}), (_('Misago permissions'), {'fields': ('rank', 'roles')}), (_('Change Django Permissions'), {'fields': ('groups', 'user_permissions')}), ) def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False def save_related(self, request, form, formsets, change): with transaction.atomic(): obj = form.instance obj.roles.clear() obj.roles.add(*form.cleaned_data['roles']) member_role = Role.objects.get(special_role='authenticated') if not member_role.pk in [r.pk for r in form.cleaned_data['roles']]: obj.roles.add(member_role) # Update ACL key obj.update_acl_key() obj.save(update_fields=['acl_key']) obj.groups.clear() if form.cleaned_data['groups']: obj.groups.add(*form.cleaned_data['groups']) obj.user_permissions.clear() if form.cleaned_data['user_permissions']: obj.user_permissions.add(*form.cleaned_data['user_permissions']) djadmin.site.register(get_user_model(), UserAdmin) class MisagoAdminExtension(object): def register_urlpatterns(self, urlpatterns): # Users section urlpatterns.namespace(r'^users/', 'users') # Accounts urlpatterns.namespace(r'^accounts/', 'accounts', 'users') urlpatterns.patterns('users:accounts', url(r'^$', UsersList.as_view(), name='index'), url(r'^(?P\d+)/$', UsersList.as_view(), name='index'), url(r'^new/$', NewUser.as_view(), name='new'), url(r'^edit/(?P\d+)/$', EditUser.as_view(), name='edit'), ) # Ranks urlpatterns.namespace(r'^ranks/', 'ranks', 'users') urlpatterns.patterns('users:ranks', url(r'^$', RanksList.as_view(), name='index'), url(r'^new/$', NewRank.as_view(), name='new'), url(r'^edit/(?P\d+)/$', EditRank.as_view(), name='edit'), url(r'^default/(?P\d+)/$', DefaultRank.as_view(), name='default'), url(r'^move/down/(?P\d+)/$', MoveDownRank.as_view(), name='down'), url(r'^move/up/(?P\d+)/$', MoveUpRank.as_view(), name='up'), url(r'^delete/(?P\d+)/$', DeleteRank.as_view(), name='delete'), ) # Bans urlpatterns.namespace(r'^bans/', 'bans', 'users') urlpatterns.patterns('users:bans', url(r'^$', BansList.as_view(), name='index'), url(r'^(?P\d+)/$', BansList.as_view(), name='index'), url(r'^new/$', NewBan.as_view(), name='new'), url(r'^edit/(?P\d+)/$', EditBan.as_view(), name='edit'), url(r'^delete/(?P\d+)/$', DeleteBan.as_view(), name='delete'), ) # Warnings urlpatterns.namespace(r'^warnings/', 'warnings', 'users') urlpatterns.patterns('users:warnings', url(r'^$', WarningsList.as_view(), name='index'), url(r'^new/$', NewWarning.as_view(), name='new'), url(r'^edit/(?P\d+)/$', EditWarning.as_view(), name='edit'), url(r'^move/down/(?P\d+)/$', MoveDownWarning.as_view(), name='down'), url(r'^move/up/(?P\d+)/$', MoveUpWarning.as_view(), name='up'), url(r'^delete/(?P\d+)/$', DeleteWarning.as_view(), name='delete'), ) def register_navigation_nodes(self, site): site.add_node(name=_("Users"), icon='fa fa-users', parent='misago:admin', after='misago:admin:index', namespace='misago:admin:users', link='misago:admin:users:accounts:index') site.add_node(name=_("User Accounts"), icon='fa fa-users', parent='misago:admin:users', namespace='misago:admin:users:accounts', link='misago:admin:users:accounts:index') site.add_node(name=_("Ranks"), icon='fa fa-graduation-cap', parent='misago:admin:users', after='misago:admin:users:accounts:index', namespace='misago:admin:users:ranks', link='misago:admin:users:ranks:index') site.add_node(name=_("Bans"), icon='fa fa-lock', parent='misago:admin:users', after='misago:admin:users:ranks:index', namespace='misago:admin:users:bans', link='misago:admin:users:bans:index') site.add_node(name=_("Warning levels"), icon='fa fa-exclamation-triangle', parent='misago:admin:users', after='misago:admin:users:bans:index', namespace='misago:admin:users:warnings', link='misago:admin:users:warnings:index')