Loading src/resources/models.py +111 −37 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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 Loading @@ -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) Loading Loading @@ -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: Loading Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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): Loading Loading @@ -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() ): Loading @@ -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() ): Loading @@ -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() ): Loading Loading @@ -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})" Loading Loading
src/resources/models.py +111 −37 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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 Loading @@ -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) Loading Loading @@ -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: Loading Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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): Loading Loading @@ -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() ): Loading @@ -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() ): Loading @@ -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() ): Loading Loading @@ -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})" Loading