diff --git a/atlas/models.py b/atlas/models.py index 3759d2b6..7949a338 100644 --- a/atlas/models.py +++ b/atlas/models.py @@ -1047,6 +1047,27 @@ class Series(SeriesBase): return self.description else: return f"{self.examination} ({self.plane})" + + def user_can_edit(self, user, allow_if_can_edit_cases=True) -> bool: + """Check if the user can edit the series. + + Args: + user (User): The user to check. + Returns: + bool: True if the user can edit the series, False otherwise. + """ + if user.is_superuser: + return True + + if self.author.filter(id=user.id).exists(): + return True + + if allow_if_can_edit_cases: + # Check if user can edit any of the cases this series is in + for case in self.case.all(): + if case.check_user_can_edit(user): + return True + return False def get_full_str(self): if self.case: diff --git a/atlas/views.py b/atlas/views.py index ff01dd32..3d8fbd7a 100755 --- a/atlas/views.py +++ b/atlas/views.py @@ -2740,7 +2740,7 @@ def case_order_dicom(request, pk): # TODO: don't try to order non stack series for series in case.series.all(): try: - if request.user in series.get_author_objects(): + if series.check_user_can_edit(request.user): series.order_by_dicom() else: fail.append(f"{series.pk}: invalid permission") diff --git a/generic/mixins.py b/generic/mixins.py index 75898e4e..0f8146d3 100644 --- a/generic/mixins.py +++ b/generic/mixins.py @@ -70,6 +70,9 @@ class AuthorMixin(): return self.author.filter(id=user.id).exists() + def get_author_display(self): + return ", ".join([i.username for i in self.get_author_objects()]) + class UserConfigurablePaginationMixin: default_per_page = 25 diff --git a/generic/models.py b/generic/models.py index 99ec9da4..280db3b1 100644 --- a/generic/models.py +++ b/generic/models.py @@ -387,7 +387,7 @@ class SeriesImageBase(models.Model): super().save(*args, **kwargs) # Call the "real" save() method. -class SeriesBase(models.Model): +class SeriesBase(models.Model, AuthorMixin): info = models.TextField( blank=True, help_text="Description of stack, for admin organisation, will not be visible when taking", @@ -444,16 +444,6 @@ class SeriesBase(models.Model): return False - def get_author_objects(self): - """Returns a list of authors""" - if self.author: - return self.author.all() - else: - return ["None"] - - def get_author_display(self): - return ", ".join([i.username for i in self.get_author_objects()]) - def get_examination(self): """Returns a comma seperated text list of regions""" return str(self.examination)