Commit 75115c4f authored by Mickaël Desfrênes's avatar Mickaël Desfrênes
Browse files

small query optimizations

parent bc381d01
Loading
Loading
Loading
Loading
+111 −37
Original line number Diff line number Diff line
@@ -555,10 +555,14 @@ class File(Resource):
        val = None
        if self.should_have_iiif:
            if self.project.use_exiftool:
                prop = self.metadataresourcevalue_set.filter(
                prop = (
                    self.metadataresourcevalue_set.filter(
                        metadata__title__iendswith="imagewidth",
                        metadata__set__title__iexact="exiftool",
                ).first()
                    )
                    .only("id", "value")
                    .first()
                )
                if prop:
                    try:
                        val = int(prop.value)
@@ -570,7 +574,7 @@ class File(Resource):
                    val, _ = image.size
                except (UnidentifiedImageError, FileNotFoundError):
                    logger.warning(
                        f"Could not get width for file({self.pk}) using PIL. Possible image corruption."
                        f"Could not get width for file({self.pk}) using PIL. Possible image corruption or pixels limit exceeded."
                    )
        return val

@@ -578,10 +582,14 @@ class File(Resource):
        val = None
        if self.should_have_iiif:
            if self.project.use_exiftool:
                prop = self.metadataresourcevalue_set.filter(
                prop = (
                    self.metadataresourcevalue_set.filter(
                        metadata__title__iendswith="imageheight",
                        metadata__set__title__iexact="exiftool",
                ).first()
                    )
                    .only("id", "value")
                    .first()
                )
                if prop:
                    try:
                        val = int(prop.value)
@@ -611,12 +619,23 @@ class File(Resource):
            some_file.filter_meta("ExifTool:ID3:Album", "")
        """
        full_meta_title = full_meta_title.lower()
        for metaval in self.metadataresourcevalue_set.all():
            current_meta_title = "{}:{}".format(
                metaval.metadata.set.title, metaval.metadata.title
            ).lower()
            if current_meta_title == full_meta_title:
                return metaval.value
        try:
            meta_set_title, meta_title = [
                title_part.strip() for title_part in full_meta_title.split(":", 1)
            ]
        except ValueError:
            return default_value

        meta_value = (
            self.metadataresourcevalue_set.filter(
                metadata__set__title__iexact=meta_set_title,
                metadata__title__iexact=meta_title,
            )
            .only("id", "value")
            .first()
        )
        if meta_value:
            return meta_value.value
        return default_value

    def iiif_infos_url(self) -> str:
@@ -742,7 +761,9 @@ class File(Resource):
            title="tesseract output", set=metas_set, project=self.project
        )
        try:
            meta_value = MetadataResourceValue.objects.get(metadata=meta, resource=self)
            meta_value = MetadataResourceValue.objects.only("id", "value").get(
                metadata=meta, resource=self
            )
            return meta_value.value
        except MetadataResourceValue.DoesNotExist:
            return None
@@ -817,11 +838,7 @@ class File(Resource):
                    )

    def has_extension(self, extension: str) -> bool:
        extension = extension.lower()
        for ext in self.file_type.extensions.all():
            if ext.label == extension:
                return True
        return False
        return self.file_type.extensions.filter(label=extension.lower()).exists()

    def save(self, *args, **kwargs):
        self.ptr_project = self.project
@@ -1064,22 +1081,37 @@ class Collection(models.Model):
    def dublin_core_metas(self) -> List["MetadataCollectionValue"]:
        metas = []
        try:
            dublin_core_set = MetadataSet.objects.get(
            dublin_core_set = MetadataSet.objects.only("id").get(
                title__iexact="Dublin Core", project=self.project
            )
            for metadata in self.metadatacollectionvalue_set.filter(
                metadata__set=dublin_core_set
            ).iterator():
            for metadata in (
                self.metadatacollectionvalue_set.filter(metadata__set=dublin_core_set)
                .select_related("metadata")
                .only(
                    "id",
                    "value",
                    "metadata_id",
                    "metadata__id",
                    "metadata__title",
                )
                .iterator()
            ):
                metas.append(metadata)
            return metas
        except MetadataSet.DoesNotExist:
            return []

    def dublin_core_title(self) -> str:
        dc_metas = self.dublin_core_metas()
        for m in dc_metas:
            if m.metadata.title == "title":
                return m.value
        meta_value = (
            self.metadatacollectionvalue_set.filter(
                metadata__set__title__iexact="Dublin Core",
                metadata__title="title",
            )
            .only("id", "value")
            .first()
        )
        if meta_value:
            return meta_value.value
        return self.title

    def to_path(self, include_pk: bool = False):
@@ -1172,7 +1204,7 @@ class Collection(models.Model):
                    metadata_id__in=metadata_column_indexes.keys(),
                )
                .exclude(metadata__title__in=XLSX_EXPORT_EXCLUDED_METADATA_TITLES)
                .select_related("metadata__set")
                .only("id", "collection_id", "metadata_id", "value")
                .order_by("collection_id", "metadata_id", "id")
                .iterator()
            ):
@@ -1188,6 +1220,14 @@ class Collection(models.Model):
                    collection_id__in=collection_ids, resource__deleted_at__isnull=True
                )
                .select_related("resource")
                .only(
                    "id",
                    "collection_id",
                    "resource_id",
                    "resource__id",
                    "resource__title",
                    "resource__ark",
                )
                .order_by("collection_id", "rank", "resource__title")
                .iterator()
            ):
@@ -1204,7 +1244,7 @@ class Collection(models.Model):
                    metadata_id__in=metadata_column_indexes.keys(),
                )
                .exclude(metadata__title__in=XLSX_EXPORT_EXCLUDED_METADATA_TITLES)
                .select_related("metadata__set")
                .only("id", "resource_id", "metadata_id", "value")
                .order_by("resource_id", "metadata_id", "id")
                .iterator()
            ):
@@ -1342,24 +1382,58 @@ class ObjectPermission(models.Model):
    def serialization_label(self):
        if self.object_pk:
            if self.object_class == "collection":
                col = Collection.objects.filter(pk=self.object_pk).first()
                col = (
                    Collection.objects.filter(pk=self.object_pk)
                    .only("id", "parent_id", "title")
                    .first()
                )
                if col:
                    ancestors = []
                    parent_id = col.parent_id
                    while parent_id:
                        parent = (
                            Collection.objects.filter(pk=parent_id)
                            .only("id", "parent_id", "title")
                            .first()
                        )
                        if not parent:
                            break
                        ancestors.append(parent)
                        parent_id = parent.parent_id
                    ancestors.reverse()
                    return (
                        " / ".join([c.title for c in col.ancestors()])
                        " / ".join([ancestor.title for ancestor in ancestors])
                        + " / "
                        + col.title
                    )
            if self.object_class == "resource":
                res = Resource.objects.filter(pk=self.object_pk).first()
                res = (
                    Resource.objects.filter(pk=self.object_pk)
                    .only("id", "title")
                    .first()
                )
                if res:
                    return f"{res.title}"
            obj_instance = None
            if self.object_class == "metadataset":
                obj_instance = MetadataSet.objects.filter(pk=self.object_pk).first()
                obj_instance = (
                    MetadataSet.objects.filter(pk=self.object_pk)
                    .only("id", "title")
                    .first()
                )
            if self.object_class == "metadata":
                obj_instance = Metadata.objects.filter(pk=self.object_pk).first()
                obj_instance = (
                    Metadata.objects.filter(pk=self.object_pk)
                    .select_related("set")
                    .only("id", "title", "set_id", "set__id", "set__title")
                    .first()
                )
            if self.object_class == "tag":
                obj_instance = Tag.objects.filter(pk=self.object_pk).first()
                obj_instance = (
                    Tag.objects.filter(pk=self.object_pk)
                    .only("id", "uid", "label")
                    .first()
                )
            if obj_instance:
                return str(obj_instance)
        return f"{self.object_class}({self.object_pk})"