diff --git a/epdb/logic.py b/epdb/logic.py index bfaeaac2..978eb754 100644 --- a/epdb/logic.py +++ b/epdb/logic.py @@ -44,15 +44,22 @@ class UserManager(object): def get_users(): return [] + @staticmethod + def get_user_lp(user_url: str): + uuid = user_url.strip().split('/')[-1] + return get_user_model().objects.get(uuid=uuid) class GroupManager(object): @staticmethod - def create_group(owner): + def create_group(current_user, name, description): g = Group() - g.name = 'enviPath Users' - g.description = 'All enviPath Users' - g.owner = owner + g.name = name + g.description = description + g.owner = current_user + g.save() + + g.user_member.add(current_user) g.save() return g @@ -78,6 +85,26 @@ class GroupManager(object): def get_groups(user): return Group.objects.filter(user_member=user) + @staticmethod + @transaction.atomic + def update_members(caller: User, group: Group, member: Union[User, Group], add_or_remove: str): + + if caller != group.owner: + raise ValueError('Only the group Owner is allowed to add members!') + + if isinstance(member, Group): + if add_or_remove == 'add': + group.group_member.add(member) + else: + group.group_member.remove(member) + else: + if add_or_remove == 'add': + group.user_member.add(member) + else: + group.user_member.remove(member) + + group.save() + class PackageManager(object): package_pattern = re.compile(r".*/package/[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$") diff --git a/epdb/management/commands/bootstrap.py b/epdb/management/commands/bootstrap.py index 8a4d50b4..50907fd2 100644 --- a/epdb/management/commands/bootstrap.py +++ b/epdb/management/commands/bootstrap.py @@ -25,7 +25,7 @@ class Command(BaseCommand): else: admin = User.objects.get(email='admin@lorsba.ch') - g = GroupManager.create_group(admin) + g = GroupManager.create_group(admin, 'enviPath Users', 'All enviPath Users') g.user_member.add(anon) g.save() diff --git a/epdb/models.py b/epdb/models.py index d3882c74..a009f1b9 100644 --- a/epdb/models.py +++ b/epdb/models.py @@ -43,6 +43,7 @@ class User(AbstractUser): on_delete=models.SET_NULL, related_name='default_group') default_setting = models.ForeignKey('epdb.Setting', on_delete=models.SET_NULL, verbose_name='The users default settings', null=True, blank=False) + # TODO remove groups = models.ManyToManyField("Group", verbose_name='groups') USERNAME_FIELD = "email" diff --git a/epdb/views.py b/epdb/views.py index e3f7fbee..4244529b 100644 --- a/epdb/views.py +++ b/epdb/views.py @@ -1248,6 +1248,8 @@ def user(request, user_uuid): def groups(request): + current_user = _anonymous_or_real(request) + if request.method == 'GET': context = get_base_context(request) context['title'] = f'enviPath - Groups' @@ -1266,13 +1268,7 @@ def groups(request): group_name = request.POST.get('group-name') group_description = request.POST.get('group-description', s.DEFAULT_VALUES['description']) - g = Group() - g.name = group_name - g.description = group_description - g.save() - - g.user_member.add(request.user) - g.save() + g = GroupManager.create_group(current_user, group_name, group_description) return redirect(g.url) @@ -1294,8 +1290,39 @@ def group(request, group_uuid): context['group'] = current_group + # TODO use managers + context['users'] = get_user_model().objects.exclude(id__in=current_group.user_member.all()) + context['groups'] = Group.objects.exclude(id__in=current_group.group_member.all()).exclude(id=current_group.pk) + + context['packages'] = Package.objects.filter(id__in=GroupPackagePermission.objects.filter(group=current_group).values('package').distinct()) + return render(request, 'objects/group.html', context) + elif request.method == 'POST': + + if s.DEBUG: + for k, v in request.POST.items(): + print(k, v) + + if hidden := request.POST.get('hidden', None): + if hidden == 'delete-group': + current_group.delete() + return redirect(s.SERVER_URL + '/group') + else: + return HttpResponseBadRequest() + + member_url = request.POST.get('member') + action = request.POST.get('action') + + if all([member_url, action]) and action in ['add', 'remove']: + if 'user' in member_url: + member = UserManager.get_user_lp(member_url) + else: + member = GroupManager.get_group_lp(member_url) + + GroupManager.update_members(current_user, current_group, member, action) + + return redirect(current_group.url) def settings(request): current_user = _anonymous_or_real(request) diff --git a/templates/actions/objects/group.html b/templates/actions/objects/group.html index e69de29b..1cd6f1dc 100644 --- a/templates/actions/objects/group.html +++ b/templates/actions/objects/group.html @@ -0,0 +1,8 @@ +
List of members of this group
+Packages where this group has access to
+