forked from enviPath/enviPy
Implement basic Group handling (#3)
Co-authored-by: Tim Lorsbach <tim@lorsba.ch> Reviewed-on: enviPath/enviPy#3
This commit is contained in:
@ -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}$")
|
||||
|
||||
@ -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()
|
||||
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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)
|
||||
|
||||
Reference in New Issue
Block a user