oarepo-runtime 1.5.35__py3-none-any.whl → 1.5.37__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- oarepo_runtime/services/files/components.py +55 -0
- oarepo_runtime/services/schema/ui.py +1 -0
- {oarepo_runtime-1.5.35.dist-info → oarepo_runtime-1.5.37.dist-info}/METADATA +1 -1
- {oarepo_runtime-1.5.35.dist-info → oarepo_runtime-1.5.37.dist-info}/RECORD +8 -7
- {oarepo_runtime-1.5.35.dist-info → oarepo_runtime-1.5.37.dist-info}/WHEEL +1 -1
- {oarepo_runtime-1.5.35.dist-info → oarepo_runtime-1.5.37.dist-info}/LICENSE +0 -0
- {oarepo_runtime-1.5.35.dist-info → oarepo_runtime-1.5.37.dist-info}/entry_points.txt +0 -0
- {oarepo_runtime-1.5.35.dist-info → oarepo_runtime-1.5.37.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,55 @@
|
|
1
|
+
import mimetypes
|
2
|
+
import os
|
3
|
+
from invenio_records_resources.services.files.components import FileServiceComponent
|
4
|
+
from marshmallow.exceptions import ValidationError
|
5
|
+
|
6
|
+
class AllowedFileTypesComponent(FileServiceComponent):
|
7
|
+
|
8
|
+
def guess_content_type(self, filename: str | None) -> str | None:
|
9
|
+
if filename:
|
10
|
+
return mimetypes.guess_type(filename)[0] or "application/octet-stream"
|
11
|
+
return None
|
12
|
+
|
13
|
+
@property
|
14
|
+
def allowed_mimetypes(self):
|
15
|
+
"""Returns files attribute (field) key."""
|
16
|
+
return getattr(self.service.config, "allowed_mimetypes", [])
|
17
|
+
|
18
|
+
def guess_extension(self, file, mimetype):
|
19
|
+
"""File extension."""
|
20
|
+
# The ``ext`` property is used to in search to aggregate file types, and we want e.g. both ``.jpeg`` and
|
21
|
+
# ``.jpg`` to be aggregated under ``.jpg``
|
22
|
+
ext_guessed = mimetypes.guess_extension(mimetype)
|
23
|
+
|
24
|
+
# Check if a valid extension is guessed and it's not the default mimetype
|
25
|
+
if (
|
26
|
+
ext_guessed is not None
|
27
|
+
and mimetype != "application/octet-stream"
|
28
|
+
):
|
29
|
+
return ext_guessed[1:]
|
30
|
+
|
31
|
+
# Support non-standard file extensions that cannot be guessed
|
32
|
+
_, ext = os.path.splitext(file)
|
33
|
+
if ext and len(ext) <= 5:
|
34
|
+
return ext[1:].lower()
|
35
|
+
|
36
|
+
if ext_guessed:
|
37
|
+
return ext_guessed[1:]
|
38
|
+
|
39
|
+
@property
|
40
|
+
def allowed_extensions(self):
|
41
|
+
"""Returns files attribute (field) key."""
|
42
|
+
return getattr(self.service.config, "allowed_extensions", [])
|
43
|
+
|
44
|
+
def init_files(self, identity, id_, data, uow=None):
|
45
|
+
"""Initialize the file upload for the record."""
|
46
|
+
list_files = list(data.files.entries)
|
47
|
+
|
48
|
+
for file in list_files:
|
49
|
+
allowed_type = self.guess_content_type(file)
|
50
|
+
allowed_ext = self.guess_extension(file, allowed_type)
|
51
|
+
if len(self.allowed_mimetypes) > 0 and allowed_type not in self.allowed_mimetypes:
|
52
|
+
raise ValidationError(f"Mimetype not supported, supported mimetypes: {self.allowed_mimetypes}")
|
53
|
+
elif len(self.allowed_extensions) > 0 and allowed_ext not in self.allowed_extensions:
|
54
|
+
raise ValidationError(f"Extension not supported, supported extensions: {self.allowed_extensions}")
|
55
|
+
|
@@ -89,6 +89,7 @@ oarepo_runtime/services/facets/max_facet.py,sha256=TZ4KMKKVJHzyU1KgNne4V7IMQPu1A
|
|
89
89
|
oarepo_runtime/services/facets/nested_facet.py,sha256=y0xgjx37HsSj2xW7URxNemYTksD8hpPs7kOEfIBw22k,971
|
90
90
|
oarepo_runtime/services/facets/params.py,sha256=5z8I4wKdp-7RJK4x6cSKE92fDJI8OkUz5JR5UKWAeYg,3564
|
91
91
|
oarepo_runtime/services/files/__init__.py,sha256=K8MStrEQf_BUhvzhwPTF93Hkhwrd1dtv35LDo7iZeTM,268
|
92
|
+
oarepo_runtime/services/files/components.py,sha256=yQpZ0rCaIUkECPZMZ4aH2m1NIRlEWPgiPPV_6yUoPbY,2272
|
92
93
|
oarepo_runtime/services/files/service.py,sha256=8DH0Pefr9kilM2JnOb-UYsnqerE8Z1Mu4p6DOJ4j_ZU,608
|
93
94
|
oarepo_runtime/services/relations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
94
95
|
oarepo_runtime/services/relations/components.py,sha256=3g0VdnGUM-2yYt50fPi-OADReBGJb4h05vmYHfh-QFs,592
|
@@ -102,7 +103,7 @@ oarepo_runtime/services/schema/i18n_validation.py,sha256=fyMTi2Rw-KiHv7c7HN61zGx
|
|
102
103
|
oarepo_runtime/services/schema/marshmallow.py,sha256=LmcSxvbZ9jIhkNHCqqxt1SA2UNijoDmIzqli1MkoTrE,1153
|
103
104
|
oarepo_runtime/services/schema/oneofschema.py,sha256=X_pXzrkYcLGGAtGN1qltrz45OzD_atrJHkHkp3L01xg,6660
|
104
105
|
oarepo_runtime/services/schema/polymorphic.py,sha256=f9yC7MGVynAFGM0fXIq0NbqGJxI65Xpi8GaM2ZM4c6Q,561
|
105
|
-
oarepo_runtime/services/schema/ui.py,sha256=
|
106
|
+
oarepo_runtime/services/schema/ui.py,sha256=xQgW-zLyZoHldGw47uVtXQj-5LexVNKTholyq4MiBZo,3777
|
106
107
|
oarepo_runtime/services/schema/validation.py,sha256=fahqKGDdIYWux5ZeoljrEe8VD2fDZR9VpfvYmTYAmpw,1050
|
107
108
|
oarepo_runtime/translations/default_translations.py,sha256=060GBlA1ghWxfeumo6NqxCCZDb-6OezOuF6pr-_GEOQ,104
|
108
109
|
oarepo_runtime/translations/jinjax_messages.jinja,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -115,9 +116,9 @@ oarepo_runtime/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
|
|
115
116
|
oarepo_runtime/utils/functools.py,sha256=gKS9YZtlIYcDvdNA9cmYO00yjiXBYV1jg8VpcRUyQyg,1324
|
116
117
|
oarepo_runtime/utils/path.py,sha256=V1NVyk3m12_YLbj7QHYvUpE1wScO78bYsX1LOLeXDkI,3108
|
117
118
|
tests/pkg_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
118
|
-
oarepo_runtime-1.5.
|
119
|
-
oarepo_runtime-1.5.
|
120
|
-
oarepo_runtime-1.5.
|
121
|
-
oarepo_runtime-1.5.
|
122
|
-
oarepo_runtime-1.5.
|
123
|
-
oarepo_runtime-1.5.
|
119
|
+
oarepo_runtime-1.5.37.dist-info/LICENSE,sha256=h2uWz0OaB3EN-J1ImdGJZzc7yvfQjvHVYdUhQ-H7ypY,1064
|
120
|
+
oarepo_runtime-1.5.37.dist-info/METADATA,sha256=9DcMboRlkhaXmUfLa6t8nUSTjoCJS26u7e2OjxXb7jI,4680
|
121
|
+
oarepo_runtime-1.5.37.dist-info/WHEEL,sha256=mguMlWGMX-VHnMpKOjjQidIo1ssRlCFu4a4mBpz1s2M,91
|
122
|
+
oarepo_runtime-1.5.37.dist-info/entry_points.txt,sha256=QrlXAKuPDVBinaSh_v3yO9_Nb9ZNmJCJ0VFcCW-z0Jg,327
|
123
|
+
oarepo_runtime-1.5.37.dist-info/top_level.txt,sha256=bHhlkT1_RQC4IkfTQCqA3iN4KCB6cSFQlsXpQMSP-bE,21
|
124
|
+
oarepo_runtime-1.5.37.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|