diff --git a/compensation/forms/forms.py b/compensation/forms/forms.py index eadee2f..1b9f050 100644 --- a/compensation/forms/forms.py +++ b/compensation/forms/forms.py @@ -380,7 +380,7 @@ class NewEcoAccountForm(AbstractCompensationForm, CompensationResponsibleFormMix legal=legal ) acc.fundings.set(fundings) - acc.users.add(user) + acc.share_with(user) # Add the log entry to the main objects log list acc.log.add(action) diff --git a/compensation/models.py b/compensation/models.py index e7d62dd..672d4e0 100644 --- a/compensation/models.py +++ b/compensation/models.py @@ -235,12 +235,13 @@ class Compensation(AbstractCompensation): Checks whether a given user has access to this object Args: - user (): + user (User): The user to be checked Returns: """ - return self.intervention.users.filter(id=user.id) + # Compensations inherit their shared state from the interventions + return self.intervention.is_shared_with(user) def get_LANIS_link(self) -> str: """ Generates a link for LANIS depending on the geometry diff --git a/compensation/tests/test_views.py b/compensation/tests/test_views.py index 5d865ed..ff9bc72 100644 --- a/compensation/tests/test_views.py +++ b/compensation/tests/test_views.py @@ -88,7 +88,7 @@ class CompensationViewTestCase(BaseViewTestCase): client = Client() client.login(username=self.superuser.username, password=self.superuser_pw) self.superuser.groups.set([]) - self.intervention.users.set([self.superuser]) + self.intervention.share_with_list([self.superuser]) # Since the user has no groups, it does not matter that data has been shared. There SHOULD not be any difference # to a user without access, since the important permissions are missing @@ -126,7 +126,7 @@ class CompensationViewTestCase(BaseViewTestCase): client.login(username=self.superuser.username, password=self.superuser_pw) self.superuser.groups.set([]) # Sharing is inherited by base intervention for compensation. Therefore configure the interventions share state - self.intervention.users.set([]) + self.intervention.share_with_list([]) # Since the user has no groups, it does not matter that data is unshared. There SHOULD not be any difference # to a user having shared access, since all important permissions are missing @@ -166,7 +166,7 @@ class CompensationViewTestCase(BaseViewTestCase): group = self.groups.get(name=DEFAULT_GROUP) self.superuser.groups.set([group]) # Sharing is inherited by base intervention for compensation. Therefore configure the interventions share state - self.intervention.users.set([self.superuser]) + self.intervention.share_with_list([self.superuser]) success_urls = [ self.index_url, @@ -200,7 +200,7 @@ class CompensationViewTestCase(BaseViewTestCase): group = self.groups.get(name=DEFAULT_GROUP) self.superuser.groups.set([group]) # Sharing is inherited by base intervention for compensation. Therefore configure the interventions share state - self.intervention.users.set([]) + self.intervention.share_with_list([]) success_urls = [ self.index_url, @@ -271,7 +271,7 @@ class EcoAccountViewTestCase(CompensationViewTestCase): client = Client() client.login(username=self.superuser.username, password=self.superuser_pw) self.superuser.groups.set([]) - self.eco_account.users.set([self.superuser]) + self.eco_account.share_with_list([self.superuser]) # Since the user has no groups, it does not matter that data has been shared. There SHOULD not be any difference # to a user without access, since the important permissions are missing @@ -308,7 +308,7 @@ class EcoAccountViewTestCase(CompensationViewTestCase): client = Client() client.login(username=self.superuser.username, password=self.superuser_pw) self.superuser.groups.set([]) - self.eco_account.users.set([]) + self.eco_account.share_with_list([]) # Since the user has no groups, it does not matter that data is unshared. There SHOULD not be any difference # to a user having shared access, since all important permissions are missing @@ -348,7 +348,7 @@ class EcoAccountViewTestCase(CompensationViewTestCase): group = self.groups.get(name=DEFAULT_GROUP) self.superuser.groups.set([group]) # Sharing is inherited by base intervention for compensation. Therefore configure the interventions share state - self.eco_account.users.set([self.superuser]) + self.eco_account.share_with_list([self.superuser]) success_urls = [ self.index_url, @@ -381,7 +381,7 @@ class EcoAccountViewTestCase(CompensationViewTestCase): client.login(username=self.superuser.username, password=self.superuser_pw) group = self.groups.get(name=DEFAULT_GROUP) self.superuser.groups.set([group]) - self.eco_account.users.set([]) + self.eco_account.share_with_list([]) success_urls = [ self.index_url, diff --git a/compensation/tests/test_workflow.py b/compensation/tests/test_workflow.py index 73c728c..d8e8314 100644 --- a/compensation/tests/test_workflow.py +++ b/compensation/tests/test_workflow.py @@ -21,7 +21,7 @@ class CompensationWorkflowTestCase(BaseWorkflowTestCase): super().setUpTestData() # Give the user shared access to the dummy intervention -> inherits the access to the compensation - cls.intervention.users.add(cls.superuser) + cls.intervention.share_with(cls.superuser) # Make sure the intervention itself would be fine with valid data cls.intervention = cls.fill_out_intervention(cls.intervention) @@ -142,7 +142,7 @@ class EcoAccountWorkflowTestCase(BaseWorkflowTestCase): # Add user to conservation office group and give shared access to the account cls.superuser.groups.add(cls.groups.get(name=ETS_GROUP)) - cls.eco_account.users.set([cls.superuser]) + cls.eco_account.share_with_list([cls.superuser]) def test_deductability(self): """ @@ -154,7 +154,7 @@ class EcoAccountWorkflowTestCase(BaseWorkflowTestCase): """ # Give user shared access to the dummy intervention, which will be needed here - self.intervention.users.add(self.superuser) + self.intervention.share_with(self.superuser) # Prepare data for deduction creation deduct_url = reverse("compensation:acc-new-deduction", args=(self.eco_account.id,)) diff --git a/compensation/views/eco_account_views.py b/compensation/views/eco_account_views.py index 83493fa..e9934d4 100644 --- a/compensation/views/eco_account_views.py +++ b/compensation/views/eco_account_views.py @@ -616,7 +616,7 @@ def share_view(request: HttpRequest, id: str, token: str): request, _("{} has been shared with you").format(obj.identifier) ) - obj.users.add(user) + obj.share_with(user) return redirect("compensation:acc-detail", id=id) else: messages.error( diff --git a/ema/forms.py b/ema/forms.py index 7fd42a5..44d186c 100644 --- a/ema/forms.py +++ b/ema/forms.py @@ -83,7 +83,7 @@ class NewEmaForm(AbstractCompensationForm, CompensationResponsibleFormMixin): acc.fundings.set(fundings) # Add the creating user to the list of shared users - acc.users.add(user) + acc.share_with(user) # Add the log entry to the main objects log list acc.log.add(action) diff --git a/ema/tests/test_views.py b/ema/tests/test_views.py index 0ab54e0..07d761c 100644 --- a/ema/tests/test_views.py +++ b/ema/tests/test_views.py @@ -97,7 +97,7 @@ class EmaViewTestCase(CompensationViewTestCase): # Sharing does not have any effect in here, since the default group will prohibit further functionality access # to this user - self.ema.users.set([self.superuser]) + self.ema.share_with_list([self.superuser]) success_urls = [ self.index_url, @@ -143,7 +143,7 @@ class EmaViewTestCase(CompensationViewTestCase): # Sharing does not have any effect in here, since the default group will prohibit further functionality access # to this user - self.ema.users.set([]) + self.ema.share_with_list([]) success_urls = [ self.index_url, @@ -182,7 +182,7 @@ class EmaViewTestCase(CompensationViewTestCase): groups = self.groups.filter(Q(name=ETS_GROUP)|Q(name=DEFAULT_GROUP)) self.superuser.groups.set(groups) # Sharing is inherited by base intervention for compensation. Therefore configure the interventions share state - self.ema.users.set([self.superuser]) + self.ema.share_with_list([self.superuser]) success_urls = [ self.index_url, @@ -218,7 +218,7 @@ class EmaViewTestCase(CompensationViewTestCase): groups = self.groups.filter(Q(name=ETS_GROUP)|Q(name=DEFAULT_GROUP)) self.superuser.groups.set(groups) # Sharing is inherited by base intervention for compensation. Therefore configure the interventions share state - self.ema.users.set([]) + self.ema.share_with_list([]) success_urls = [ self.index_url, diff --git a/ema/views.py b/ema/views.py index 30b7d09..496c55b 100644 --- a/ema/views.py +++ b/ema/views.py @@ -521,7 +521,7 @@ def share_view(request: HttpRequest, id: str, token: str): request, _("{} has been shared with you").format(obj.identifier) ) - obj.users.add(user) + obj.share_with(user) return redirect("ema:detail", id=id) else: messages.error( diff --git a/intervention/forms/forms.py b/intervention/forms/forms.py index 67a58a4..d1c4043 100644 --- a/intervention/forms/forms.py +++ b/intervention/forms/forms.py @@ -255,7 +255,7 @@ class NewInterventionForm(BaseForm): intervention.log.add(action) # Add the performing user as the first user having access to the data - intervention.users.add(user) + intervention.share_with(user) return intervention diff --git a/intervention/forms/modalForms.py b/intervention/forms/modalForms.py index 6ef384a..fe24efa 100644 --- a/intervention/forms/modalForms.py +++ b/intervention/forms/modalForms.py @@ -99,7 +99,7 @@ class ShareInterventionModalForm(BaseModalForm): accessing_users = User.objects.filter( id__in=self.cleaned_data["users"] ) - self.instance.users.set(accessing_users) + self.instance.share_with_list(accessing_users) class NewRevocationModalForm(BaseModalForm): diff --git a/intervention/models.py b/intervention/models.py index 304869b..47d3a58 100644 --- a/intervention/models.py +++ b/intervention/models.py @@ -323,7 +323,6 @@ class Intervention(BaseObject, ShareableObject, RecordableObject, CheckableObjec comp.log.add(log_entry) - class InterventionDocument(AbstractDocument): """ Specializes document upload for an intervention with certain path diff --git a/intervention/tests/test_views.py b/intervention/tests/test_views.py index 62f8d33..23da913 100644 --- a/intervention/tests/test_views.py +++ b/intervention/tests/test_views.py @@ -116,7 +116,7 @@ class InterventionViewTestCase(BaseViewTestCase): # Add user to default group default_group = Group.objects.get(name=DEFAULT_GROUP) self.superuser.groups.set([default_group]) - self.intervention.users.set([self.superuser]) + self.intervention.share_with_list([self.superuser]) success_urls = [ self.index_url, @@ -156,7 +156,7 @@ class InterventionViewTestCase(BaseViewTestCase): # Add user to default group default_group = Group.objects.get(name=DEFAULT_GROUP) self.superuser.groups.set([default_group]) - self.intervention.users.set([]) + self.intervention.share_with_list([]) success_urls = [ self.index_url, @@ -196,7 +196,7 @@ class InterventionViewTestCase(BaseViewTestCase): # Add user to zb group zb_group = self.groups.get(name=ZB_GROUP) self.superuser.groups.set([zb_group]) - self.intervention.users.set([self.superuser]) + self.intervention.share_with_list([self.superuser]) success_urls = [ self.index_url, @@ -236,7 +236,7 @@ class InterventionViewTestCase(BaseViewTestCase): # Add user to zb group zb_group = self.groups.get(name=ZB_GROUP) self.superuser.groups.set([zb_group]) - self.intervention.users.set([]) + self.intervention.share_with_list([]) success_urls = [ self.index_url, @@ -276,7 +276,7 @@ class InterventionViewTestCase(BaseViewTestCase): # Add user to ets group ets_group = Group.objects.get(name=ETS_GROUP) self.superuser.groups.set([ets_group]) - self.intervention.users.set([self.superuser]) + self.intervention.share_with_list([self.superuser]) success_urls = [ self.index_url, @@ -316,7 +316,7 @@ class InterventionViewTestCase(BaseViewTestCase): # Add user to default group ets_group = Group.objects.get(name=ETS_GROUP) self.superuser.groups.set([ets_group]) - self.intervention.users.set([]) + self.intervention.share_with_list([]) success_urls = [ self.index_url, diff --git a/intervention/tests/test_workflow.py b/intervention/tests/test_workflow.py index 9fa0307..d0f3a83 100644 --- a/intervention/tests/test_workflow.py +++ b/intervention/tests/test_workflow.py @@ -26,8 +26,7 @@ class InterventionWorkflowTestCase(BaseWorkflowTestCase): def setUpTestData(cls): super().setUpTestData() - # Give the user shared access to the dummy intervention - cls.intervention.users.add(cls.superuser) + cls.intervention.share_with(cls.superuser) def test_new(self): """ @@ -312,7 +311,7 @@ class InterventionWorkflowTestCase(BaseWorkflowTestCase): # Now restore the deductable surface to a valid size back again but remove the user from the shared list self.eco_account.deductable_surface = test_surface + 100.00 - self.eco_account.users.set([]) + self.eco_account.share_with_list([]) self.eco_account.save() # Now perform the (expected) failing request (again) @@ -323,7 +322,7 @@ class InterventionWorkflowTestCase(BaseWorkflowTestCase): self.assertEqual(num_deductions_total, EcoAccountDeduction.objects.count()) # Restore the sharing but remove the recording state - self.eco_account.users.set([self.superuser]) + self.eco_account.share_with_list([self.superuser]) self.eco_account.recorded.delete() self.eco_account.refresh_from_db() self.eco_account.save() @@ -354,7 +353,7 @@ class InterventionWorkflowTestCase(BaseWorkflowTestCase): action=UserAction.RECORDED ) self.eco_account.recorded = rec_action - self.eco_account.users.set([self.superuser]) + self.eco_account.share_with_list([self.superuser]) self.eco_account.save() # Run the request diff --git a/intervention/views.py b/intervention/views.py index a1e45ce..a535d75 100644 --- a/intervention/views.py +++ b/intervention/views.py @@ -378,7 +378,7 @@ def share_view(request: HttpRequest, id: str, token: str): request, _("{} has been shared with you").format(intervention.identifier) ) - intervention.users.add(user) + intervention.share_with(user) return redirect("intervention:detail", id=id) else: messages.error( diff --git a/konova/models.py b/konova/models.py index 7acf0ba..cc836a2 100644 --- a/konova/models.py +++ b/konova/models.py @@ -155,6 +155,29 @@ class BaseObject(BaseResource): else: return User.objects.none() + def share_with(self, user: User): + """ Adds user to list of shared access users + + Args: + user (User): The user to be added to the object + + Returns: + + """ + if not self.is_shared_with(user): + self.users.add(user) + + def share_with_list(self, user_list: list): + """ Sets the list of shared access users + + Args: + user_list (list): The users to be added to the object + + Returns: + + """ + self.users.set(user_list) + def generate_new_identifier(self) -> str: """ Generates a new identifier for the intervention object