/site_permissions/admin.py

https://github.com/peperzaken/django-site-permissions
Python | 62 lines | 50 code | 11 blank | 1 comment | 12 complexity | ef2b70294ce1e393c6a038a94bd34dd6 MD5 | raw file
  1. from django.contrib import admin
  2. from django.contrib import auth
  3. from django.forms import ModelMultipleChoiceField
  4. from django.contrib.sites.models import Site
  5. from django.contrib.auth.models import User
  6. from guardian.admin import GuardedModelAdmin
  7. from guardian.shortcuts import get_objects_for_user, assign, remove_perm
  8. class SiteAdmin(GuardedModelAdmin):
  9. pass
  10. admin.site.unregister(Site)
  11. admin.site.register(Site, SiteAdmin)
  12. class UserForm(auth.forms.UserChangeForm):
  13. sites = ModelMultipleChoiceField(Site.objects.all(), required=False)
  14. def __init__(self, *args, **kwargs):
  15. super(UserForm, self).__init__(*args, **kwargs)
  16. # DJANGO YOU SUCK
  17. if 'instance' in kwargs and hasattr(kwargs['instance'], 'sites'):
  18. self.fields['sites'].initial = [s.id for s in kwargs['instance'].sites]
  19. class UserAdmin(auth.admin.UserAdmin):
  20. form = UserForm
  21. fieldsets = auth.admin.UserAdmin.fieldsets + (
  22. ('This user can edit the following sites', {
  23. 'fields': ('sites',)
  24. }
  25. ),
  26. )
  27. def save_form(self, request, form, change):
  28. obj = super(type(self), self).save_form(request, form, change)
  29. try:
  30. obj.sites = form.cleaned_data['sites']
  31. except KeyError:
  32. obj.sites = []
  33. return obj
  34. def save_model(self, request, obj, model, change):
  35. if hasattr(obj, 'sites'):
  36. existing = get_objects_for_user(obj, 'change_site_content', Site)
  37. for s in obj.sites:
  38. if not s in existing:
  39. assign('change_site_content', obj, s)
  40. for s in existing:
  41. if not s in obj.sites:
  42. remove_perm('change_site_content', obj, s)
  43. return super(type(self), self).save_model(request, obj, model, change)
  44. def get_object(self, request, object_id):
  45. obj = super(type(self), self).get_object(request, object_id)
  46. if not obj is None and not hasattr(obj, "sites"):
  47. obj.sites = get_objects_for_user(obj, 'change_site_content', Site)
  48. return obj
  49. pass
  50. admin.site.unregister(User)
  51. admin.site.register(User, UserAdmin)