blob: 20a4b2a9dd75d1b829ca4a7505c61f4aa24173ad [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from django.contrib.auth.models import Group
from django.conf import settings
from django.contrib.contenttypes.models import ContentType
from django.apps import apps
from guardian.shortcuts import assign_perm, get_user_perms, get_users_with_perms, remove_perm, get_perms_for_model
from django.db.models.signals import pre_save, post_save, pre_delete
from django.dispatch import receiver
from rest_framework.authtoken.models import Token
# Define signals here
### UserProfile Signals
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def set_user_perms(sender, instance=None, created=False, **kwargs):
perms = get_perms_for_model(apps.get_model('app_mgr', 'UserProfile'))
for perm in perms:
assign_perm(perm.codename, instance, instance)
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
Token.objects.create(user=instance)
### Organization Signals
@receiver(pre_delete, sender='app_mgr.Organization')
def delete_org_groups(sender, instance=None, **kwargs):
if instance.member_group != None:
instance.member_group.delete()
if instance.admin_group != None:
instance.admin_group.delete()
@receiver(pre_save, sender='app_mgr.Organization')
def create_org_groups(sender, instance=None, created=False, **kwargs):
if instance.member_group == None:
g_name = '%s members' % (instance.name)
instance.member_group = Group.objects.create(name=g_name)
if instance.admin_group == None:
g_name = '%s admins' % (instance.name)
instance.admin_group = Group.objects.create(name=g_name)
@receiver(post_save, sender='app_mgr.Organization')
def set_org_perms(sender, instance=None, created=False, **kwargs):
perms = get_perms_for_model(apps.get_model('app_mgr', 'Organization'))
if not created:
old_members = get_users_with_perms(instance)
for member in old_members:
instance.member_group.user_set.remove(member)
instance.admin_group.user_set.remove(member)
for perm in perms:
remove_perm(perm.codename, member, instance)
new_members = instance.members.all()
for member in (m for m in new_members if m.is_admin):
instance.admin_group.user_set.add(member)
instance.member_group.user_set.add(member)
for perm in perms:
assign_perm(perm.codename, member.user, instance)
for member in (m for m in new_members if not m.is_admin):
instance.member_group.user_set.add(member)
assign_perm('view_organization', member.user, instance)
### Membership Signals
@receiver(post_save, sender='app_mgr.Membership')
def set_member_perms(sender, instance=None, created=False, **kwargs):
perms = get_perms_for_model(apps.get_model('app_mgr', 'Organization'))
was_admin = len(get_user_perms(instance.user, instance.org)) > 1
if instance.is_admin and not was_admin:
instance.org.admin_group.user_set.add(instance.user)
for perm in perms:
assign_perm(perm.codename, instance.user, instance.org)
if not instance.is_admin and was_admin:
instance.org.admin_group.user_set.remove(instance.user)
for perm in perms:
remove_perm(perm.codename, instance.user, instance.org)
instance.org.member_group.user_set.add(instance.user)
assign_perm('view_organization', instance.user, instance.org)
@receiver(pre_delete, sender='app_mgr.Membership')
def rm_org_perms(sender, instance=None, **kwargs):
perms = get_perms_for_model(apps.get_model('app_mgr', 'Organization'))
instance.org.admin_group.user_set.remove(instance.user)
instance.org.member_group.user_set.remove(instance.user)
for perm in perms:
remove_perm(perm.codename, instance.user, instance.org)
### Application Signals
@receiver(post_save, sender='app_mgr.Application')
def set_app_perms(sender, instance=None, created=False, **kwargs):
perms = get_perms_for_model(apps.get_model('app_mgr', 'Application'))
if not created:
old_members = get_users_with_perms(instance)
for member in old_members:
for perm in perms:
remove_perm(perm.codename, member, instance)
if instance.content_type.name == u'user profile':
for perm in perms:
assign_perm(perm.codename, instance.content_object, instance)
if instance.content_type.name == u'organization':
for perm in perms:
assign_perm(perm.codename, instance.content_object.member_group, instance)