From 8b097ef242442f90212c4ca8fc4b31b0c3fb4755 Mon Sep 17 00:00:00 2001
From: Yoann Schneider <yschneider@teklia.com>
Date: Wed, 24 Apr 2024 07:23:27 +0000
Subject: [PATCH] Introduce flake8 return

---
 arkindex/documents/api/ml.py                          |  2 +-
 arkindex/documents/dates.py                           |  2 +-
 arkindex/documents/serializers/elements.py            |  3 +--
 arkindex/documents/serializers/entities.py            |  3 +--
 arkindex/documents/tests/test_edit_elementpath.py     |  2 +-
 arkindex/images/managers.py                           |  2 +-
 arkindex/images/models.py                             |  2 +-
 arkindex/images/serializers.py                        |  2 +-
 arkindex/process/api.py                               |  7 +++----
 arkindex/process/models.py                            |  3 +--
 arkindex/process/serializers/imports.py               |  4 ++--
 arkindex/project/argparse.py                          |  3 +--
 arkindex/project/serializer_fields.py                 |  2 +-
 arkindex/project/tests/test_config.py                 |  2 +-
 arkindex/training/admin.py                            |  3 +--
 arkindex/training/api.py                              |  5 ++---
 .../training/management/commands/migrate_workers.py   |  4 ++--
 arkindex/users/api.py                                 | 11 +++++------
 ruff.toml                                             |  4 +++-
 19 files changed, 30 insertions(+), 36 deletions(-)

diff --git a/arkindex/documents/api/ml.py b/arkindex/documents/api/ml.py
index 7e852fc139..62fea8eafa 100644
--- a/arkindex/documents/api/ml.py
+++ b/arkindex/documents/api/ml.py
@@ -440,7 +440,7 @@ class ManageClassificationsSelection(SelectionMixin, CorpusACLMixin, CreateAPIVi
         mode = serializer.validated_data["mode"]
         if mode == ClassificationMode.Create:
             return self.create(corpus, request, *args, **kwargs)
-        elif mode == ClassificationMode.Validate:
+        if mode == ClassificationMode.Validate:
             elements = self.get_selection(corpus.id)
             Classification.objects.filter(
                 element__in=elements,
diff --git a/arkindex/documents/dates.py b/arkindex/documents/dates.py
index 10643931a2..dc3012bef8 100644
--- a/arkindex/documents/dates.py
+++ b/arkindex/documents/dates.py
@@ -45,7 +45,7 @@ class InterpretedDate(object):
         """
         if self.month and self.day:
             return DatePrecision.Day
-        elif self.month:
+        if self.month:
             return DatePrecision.Month
         return DatePrecision.Year
 
diff --git a/arkindex/documents/serializers/elements.py b/arkindex/documents/serializers/elements.py
index 7c70990226..d8ba836bed 100644
--- a/arkindex/documents/serializers/elements.py
+++ b/arkindex/documents/serializers/elements.py
@@ -667,8 +667,7 @@ class ElementSerializer(ElementTinySerializer):
 
             validated_data.update(image=image, polygon=polygon)
 
-        instance = super().update(instance, validated_data)
-        return instance
+        return super().update(instance, validated_data)
 
 
 class ElementNeighborsSerializer(serializers.ModelSerializer):
diff --git a/arkindex/documents/serializers/entities.py b/arkindex/documents/serializers/entities.py
index 1f107ee06b..335e63e450 100644
--- a/arkindex/documents/serializers/entities.py
+++ b/arkindex/documents/serializers/entities.py
@@ -32,8 +32,7 @@ class EntityTypeSerializer(serializers.ModelSerializer):
         corpus = data.get("corpus")
         if self.instance and corpus:
             raise ValidationError({"corpus": ["It is not possible to update an Entity Type's corpus."]})
-        data = super().to_internal_value(data)
-        return data
+        return super().to_internal_value(data)
 
     def validate(self, data):
         name = data.get("name") if "name" in data else self.instance.name
diff --git a/arkindex/documents/tests/test_edit_elementpath.py b/arkindex/documents/tests/test_edit_elementpath.py
index 21455699fd..ac0f945e98 100644
--- a/arkindex/documents/tests/test_edit_elementpath.py
+++ b/arkindex/documents/tests/test_edit_elementpath.py
@@ -363,7 +363,7 @@ class TestEditElementPath(FixtureTestCase):
                 path_id = elements["B"].paths.get().id
                 if path1.id == path_id:
                     return str(path1.path[0])
-                elif path2.id == path_id:
+                if path2.id == path_id:
                     return str(path2.path[0])
                 raise AssertionError("Unexpected top-level path ID")
 
diff --git a/arkindex/images/managers.py b/arkindex/images/managers.py
index d3d9769256..61ffb364bb 100644
--- a/arkindex/images/managers.py
+++ b/arkindex/images/managers.py
@@ -47,7 +47,7 @@ class ImageServerManager(models.Manager):
                 f'The URL "{url}" does not match any existing image server. '
                 "Please ask an instance administrator to register the IIIF server for this image."
             )
-        elif servers_count > 1:
+        if servers_count > 1:
             raise self.model.MultipleObjectsReturned(
                 f'The URL "{url}" matched multiple existing image servers'
             )
diff --git a/arkindex/images/models.py b/arkindex/images/models.py
index aecc25fca6..8b904acaf9 100644
--- a/arkindex/images/models.py
+++ b/arkindex/images/models.py
@@ -108,7 +108,7 @@ class ImageServer(models.Model):
         src_url, dest_url = map(urllib.parse.urlsplit, (self.url, other.url))
         if src_url.scheme != dest_url.scheme:
             raise ValueError("Cannot merge into an image server of a different protocol")
-        elif src_url.netloc != dest_url.netloc:
+        if src_url.netloc != dest_url.netloc:
             raise ValueError("Cannot merge into an image server on a different domain")
 
         # Check paths
diff --git a/arkindex/images/serializers.py b/arkindex/images/serializers.py
index 1b0805674f..bef4751cb1 100644
--- a/arkindex/images/serializers.py
+++ b/arkindex/images/serializers.py
@@ -68,7 +68,7 @@ class ImageSerializer(serializers.ModelSerializer):
         if not self.instance:
             # Force the Unchecked status when creating a new image
             return S3FileStatus.Unchecked
-        elif value == S3FileStatus.Checked:
+        if value == S3FileStatus.Checked:
             # Perform image validation if we are updating an existing image to Checked
             try:
                 if self.instance.server.s3_bucket and not self.instance.server.s3_read_only_bucket:
diff --git a/arkindex/process/api.py b/arkindex/process/api.py
index e6c154ea70..8d478b2aa9 100644
--- a/arkindex/process/api.py
+++ b/arkindex/process/api.py
@@ -427,9 +427,9 @@ class ProcessRetry(ProcessACLMixin, ProcessQuerysetMixin, GenericAPIView):
         # Allow 'retrying' a process that has no Ponos tasks (that has never been started)
         if len(process.tasks.all()) and state in (State.Unscheduled, State.Pending):
             raise ValidationError({"__all__": ["This process is already pending"]})
-        elif state == State.Running:
+        if state == State.Running:
             raise ValidationError({"__all__": ["This process is already running"]})
-        elif state == State.Stopping:
+        if state == State.Stopping:
             raise ValidationError({"__all__": ["This process is stopping"]})
 
     @extend_schema(
@@ -1579,8 +1579,7 @@ class ListProcessElements(CorpusACLMixin, ListAPIView):
     def get_serializer_class(self):
         if self.with_image:
             return ProcessElementSerializer
-        else:
-            return ProcessElementLightSerializer
+        return ProcessElementLightSerializer
 
     def get_queryset(self):
         if not self.has_admin_access(self.process.corpus):
diff --git a/arkindex/process/models.py b/arkindex/process/models.py
index 94d0412029..8e8dff5625 100644
--- a/arkindex/process/models.py
+++ b/arkindex/process/models.py
@@ -232,8 +232,7 @@ class Process(IndexableModel):
         """
         if self.has_prefetched_tasks:
             return max((t.expiry for t in self.tasks.all()), default=None)
-        else:
-            return self.tasks.aggregate(models.Max("expiry"))["expiry__max"]
+        return self.tasks.aggregate(models.Max("expiry"))["expiry__max"]
 
     def get_last_run(self) -> int:
         """
diff --git a/arkindex/process/serializers/imports.py b/arkindex/process/serializers/imports.py
index 2e01179db6..23e6017546 100644
--- a/arkindex/process/serializers/imports.py
+++ b/arkindex/process/serializers/imports.py
@@ -545,7 +545,7 @@ class ApplyProcessTemplateSerializer(ProcessACLMixin, serializers.Serializer):
         access_level = self.process_access_level(process)
         if not access_level:
             raise ValidationError(detail="Process with this ID does not exist.")
-        elif access_level < Role.Contributor.value:
+        if access_level < Role.Contributor.value:
             raise PermissionDenied(detail="You do not have a contributor access to this process.")
 
         errors = []
@@ -627,7 +627,7 @@ class CorpusProcessSerializer(serializers.Serializer):
         access_level = get_max_level(self.context["request"].user, corpus)
         if not access_level:
             raise ValidationError(["Corpus with this ID does not exist."])
-        elif access_level < Role.Admin.value:
+        if access_level < Role.Admin.value:
             raise ValidationError(["You do not have an admin access to this corpus."])
         return corpus
 
diff --git a/arkindex/project/argparse.py b/arkindex/project/argparse.py
index 7f0f9330c6..bbb3dcf17c 100644
--- a/arkindex/project/argparse.py
+++ b/arkindex/project/argparse.py
@@ -37,8 +37,7 @@ class ModelArgument(object):
         text_filter = {f"{self.text_search_field}__{self.text_search_lookup}": arg}
         if self.many:
             return qs.filter(**text_filter)
-        else:
-            return qs.get(**text_filter)
+        return qs.get(**text_filter)
 
 
 class CorpusArgument(ModelArgument):
diff --git a/arkindex/project/serializer_fields.py b/arkindex/project/serializer_fields.py
index 230bafd373..06245b86fc 100644
--- a/arkindex/project/serializer_fields.py
+++ b/arkindex/project/serializer_fields.py
@@ -304,4 +304,4 @@ class NullField(serializers.CharField):
     def to_internal_value(self, data):
         if data is not None:
             self.fail("invalid")
-        return None
+        return
diff --git a/arkindex/project/tests/test_config.py b/arkindex/project/tests/test_config.py
index 4a046d010a..ec9eb25440 100644
--- a/arkindex/project/tests/test_config.py
+++ b/arkindex/project/tests/test_config.py
@@ -26,7 +26,7 @@ class TestConfig(TestCase):
                 data = data.value
             if data is None:
                 return self.represent_none(data)
-            elif isinstance(data, (bool, int, float, bytes, str)):
+            if isinstance(data, (bool, int, float, bytes, str)):
                 return self.represent_data(data)
             return self.represent_str(str(data))
 
diff --git a/arkindex/training/admin.py b/arkindex/training/admin.py
index f8cc278929..c3c6c7a8b5 100644
--- a/arkindex/training/admin.py
+++ b/arkindex/training/admin.py
@@ -48,8 +48,7 @@ class DatasetAdmin(admin.ModelAdmin):
         self.readonly_fields = self.__class__.readonly_fields
         if obj is not None:
             self.readonly_fields += ("unique_elements",)
-        form = super().get_form(request, obj=None, **kwargs)
-        return form
+        return super().get_form(request, obj=None, **kwargs)
 
 
 admin.site.register(Model, ModelAdmin)
diff --git a/arkindex/training/api.py b/arkindex/training/api.py
index 66b6d00a37..c7d7220ae9 100644
--- a/arkindex/training/api.py
+++ b/arkindex/training/api.py
@@ -417,8 +417,7 @@ class ModelsList(TrainingModelMixin, ListCreateAPIView):
                     "id": str(existing_model.id),
                     "name": "A model with this name already exists",
                 })
-            else:
-                raise PermissionDenied()
+            raise PermissionDenied()
         return serializer.save()
 
 
@@ -753,7 +752,7 @@ class DatasetSetBase():
         )
         if self.request.method == "DELETE" and not Corpus.objects.admin(self.request.user).filter(pk=dataset.corpus_id).exists():
             raise PermissionDenied(detail="You do not have admin access to this dataset.")
-        elif self.request.method != "DELETE" and not Corpus.objects.writable(self.request.user).filter(pk=dataset.corpus_id).exists():
+        if self.request.method != "DELETE" and not Corpus.objects.writable(self.request.user).filter(pk=dataset.corpus_id).exists():
             raise PermissionDenied(detail="You do not have contributor access to this dataset.")
         if dataset.state != DatasetState.Open:
             raise ValidationError(detail="You can only add or update sets from a dataset in an open state.")
diff --git a/arkindex/training/management/commands/migrate_workers.py b/arkindex/training/management/commands/migrate_workers.py
index 51e1516508..6e011fe5a6 100644
--- a/arkindex/training/management/commands/migrate_workers.py
+++ b/arkindex/training/management/commands/migrate_workers.py
@@ -23,7 +23,7 @@ def ask(phrase):
         choice = input(phrase + " [y/n]: ")
         if choice.lower() == "y":
             return True
-        elif choice.lower() == "n":
+        if choice.lower() == "n":
             return False
 
 
@@ -33,7 +33,7 @@ def choose(instances, name_field="name", title="Pick one item", allow_skip=False
     nb = instances.count()
     if nb == 0:
         return
-    elif nb == 1:
+    if nb == 1:
         return instances.first()
 
     # Build internal representation
diff --git a/arkindex/users/api.py b/arkindex/users/api.py
index 5c4b9c40df..467fd2e728 100644
--- a/arkindex/users/api.py
+++ b/arkindex/users/api.py
@@ -261,12 +261,11 @@ class PasswordReset(CreateAPIView):
                 status=status.HTTP_201_CREATED,
                 headers=headers,
             )
-        else:
-            return Response(
-                form.errors.get_json_data(),
-                status=status.HTTP_400_BAD_REQUEST,
-                headers=self.default_response_headers
-            )
+        return Response(
+            form.errors.get_json_data(),
+            status=status.HTTP_400_BAD_REQUEST,
+            headers=self.default_response_headers
+        )
 
 
 @extend_schema_view(post=extend_schema(operation_id="PasswordResetConfirm", tags=["users"]))
diff --git a/ruff.toml b/ruff.toml
index 622b1a91e3..1be3c758e8 100644
--- a/ruff.toml
+++ b/ruff.toml
@@ -8,5 +8,7 @@ quote-style = "double"
 select = ["Q0", "F", "W", "E",
     # request-without-timeout
     "S113",
+    # flake8-return
+    "RET",
 ]
-ignore = ["E501"]
+ignore = ["E501", "RET502", "RET503"]
-- 
GitLab