#101 Team sharing form
* adds team sharing field to share form * splits sharing logic into user based and teams based * adds TeamAdmin for admin backend * adds validity check on Team name -> only unused names shall be valid
This commit is contained in:
@@ -378,6 +378,7 @@ class CheckableObjectMixin(models.Model):
|
||||
class ShareableObjectMixin(models.Model):
|
||||
# Users having access on this object
|
||||
users = models.ManyToManyField("user.User", help_text="Users having access (data shared with)")
|
||||
teams = models.ManyToManyField("user.Team", help_text="Teams having access (data shared with)")
|
||||
access_token = models.CharField(
|
||||
max_length=255,
|
||||
null=True,
|
||||
@@ -435,9 +436,36 @@ class ShareableObjectMixin(models.Model):
|
||||
Returns:
|
||||
|
||||
"""
|
||||
return self.users.filter(id=user.id)
|
||||
directly_shared = self.users.filter(id=user.id).exists()
|
||||
team_shared = self.teams.filter(
|
||||
users__in=[user]
|
||||
).exists()
|
||||
is_shared = directly_shared or team_shared
|
||||
return is_shared
|
||||
|
||||
def share_with(self, user):
|
||||
def share_with_team(self, team):
|
||||
""" Adds team to list of shared access teans
|
||||
|
||||
Args:
|
||||
team (Team): The team to be added to the object
|
||||
|
||||
Returns:
|
||||
|
||||
"""
|
||||
self.teams.add(team)
|
||||
|
||||
def share_with_team_list(self, team_list: list):
|
||||
""" Sets the list of shared access teams
|
||||
|
||||
Args:
|
||||
team_list (list): The teams to be added to the object
|
||||
|
||||
Returns:
|
||||
|
||||
"""
|
||||
self.teams.set(team_list)
|
||||
|
||||
def share_with_user(self, user):
|
||||
""" Adds user to list of shared access users
|
||||
|
||||
Args:
|
||||
@@ -449,7 +477,7 @@ class ShareableObjectMixin(models.Model):
|
||||
if not self.is_shared_with(user):
|
||||
self.users.add(user)
|
||||
|
||||
def share_with_list(self, user_list: list):
|
||||
def share_with_user_list(self, user_list: list):
|
||||
""" Sets the list of shared access users
|
||||
|
||||
Args:
|
||||
@@ -472,24 +500,32 @@ class ShareableObjectMixin(models.Model):
|
||||
from user.models import User
|
||||
form_data = form.cleaned_data
|
||||
|
||||
keep_accessing_users = form_data["users"]
|
||||
# Fetch selected teams and find out which user IDs are in removed teams -> mails need to be sent
|
||||
accessing_teams = form_data["team_select"]
|
||||
removed_team_users = self.teams.all().exclude(
|
||||
id__in=accessing_teams
|
||||
).values_list("users__id", flat=True)
|
||||
|
||||
new_accessing_users = list(form_data["user_select"].values_list("id", flat=True))
|
||||
keep_accessing_users = form_data["users"]
|
||||
accessing_users = keep_accessing_users + new_accessing_users
|
||||
users = User.objects.filter(
|
||||
id__in=accessing_users
|
||||
)
|
||||
removed_users = self.users.all().exclude(
|
||||
id__in=accessing_users
|
||||
).values("id")
|
||||
).values_list("id", flat=True)
|
||||
removed_users = removed_users.union(removed_team_users)
|
||||
|
||||
# Send mails
|
||||
for user in removed_users:
|
||||
celery_send_mail_shared_access_removed.delay(self.identifier, self.title, user["id"])
|
||||
for user in new_accessing_users:
|
||||
celery_send_mail_shared_access_given.delay(self.identifier, self.title, user)
|
||||
for user_id in removed_users:
|
||||
celery_send_mail_shared_access_removed.delay(self.identifier, self.title, user_id)
|
||||
for user_id in new_accessing_users:
|
||||
celery_send_mail_shared_access_given.delay(self.identifier, self.title, user_id)
|
||||
|
||||
# Set new shared users
|
||||
self.share_with_list(users)
|
||||
self.share_with_user_list(users)
|
||||
self.share_with_team_list(accessing_teams)
|
||||
|
||||
@property
|
||||
def shared_users(self) -> QuerySet:
|
||||
|
||||
Reference in New Issue
Block a user