geovisio 2.8.0__py3-none-any.whl → 2.9.0__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.
- geovisio/__init__.py +16 -3
- geovisio/config_app.py +11 -1
- geovisio/translations/br/LC_MESSAGES/messages.mo +0 -0
- geovisio/translations/br/LC_MESSAGES/messages.po +762 -0
- geovisio/translations/da/LC_MESSAGES/messages.mo +0 -0
- geovisio/translations/da/LC_MESSAGES/messages.po +10 -1
- geovisio/translations/de/LC_MESSAGES/messages.mo +0 -0
- geovisio/translations/de/LC_MESSAGES/messages.po +10 -1
- geovisio/translations/en/LC_MESSAGES/messages.mo +0 -0
- geovisio/translations/en/LC_MESSAGES/messages.po +9 -7
- geovisio/translations/eo/LC_MESSAGES/messages.mo +0 -0
- geovisio/translations/eo/LC_MESSAGES/messages.po +67 -1
- geovisio/translations/es/LC_MESSAGES/messages.mo +0 -0
- geovisio/translations/es/LC_MESSAGES/messages.po +4 -3
- geovisio/translations/fr/LC_MESSAGES/messages.mo +0 -0
- geovisio/translations/fr/LC_MESSAGES/messages.po +37 -4
- geovisio/translations/hu/LC_MESSAGES/messages.mo +0 -0
- geovisio/translations/hu/LC_MESSAGES/messages.po +4 -3
- geovisio/translations/it/LC_MESSAGES/messages.mo +0 -0
- geovisio/translations/it/LC_MESSAGES/messages.po +10 -1
- geovisio/translations/ja/LC_MESSAGES/messages.mo +0 -0
- geovisio/translations/ja/LC_MESSAGES/messages.po +242 -154
- geovisio/translations/nl/LC_MESSAGES/messages.mo +0 -0
- geovisio/translations/nl/LC_MESSAGES/messages.po +131 -25
- geovisio/translations/pl/LC_MESSAGES/messages.mo +0 -0
- geovisio/translations/pl/LC_MESSAGES/messages.po +4 -3
- geovisio/translations/sv/LC_MESSAGES/messages.mo +0 -0
- geovisio/translations/sv/LC_MESSAGES/messages.po +822 -0
- geovisio/utils/annotations.py +186 -0
- geovisio/utils/cql2.py +134 -0
- geovisio/utils/db.py +7 -0
- geovisio/utils/fields.py +24 -7
- geovisio/utils/loggers.py +14 -0
- geovisio/utils/model_query.py +2 -2
- geovisio/utils/params.py +7 -4
- geovisio/utils/pic_shape.py +63 -0
- geovisio/utils/pictures.py +54 -12
- geovisio/utils/reports.py +10 -17
- geovisio/utils/semantics.py +165 -55
- geovisio/utils/sentry.py +0 -1
- geovisio/utils/sequences.py +141 -60
- geovisio/utils/tags.py +31 -0
- geovisio/utils/upload_set.py +26 -21
- geovisio/utils/website.py +3 -0
- geovisio/web/annotations.py +205 -9
- geovisio/web/auth.py +3 -2
- geovisio/web/collections.py +49 -34
- geovisio/web/configuration.py +2 -1
- geovisio/web/docs.py +55 -16
- geovisio/web/items.py +55 -54
- geovisio/web/map.py +25 -13
- geovisio/web/params.py +11 -21
- geovisio/web/stac.py +19 -12
- geovisio/web/upload_set.py +92 -11
- geovisio/web/users.py +31 -4
- geovisio/workers/runner_pictures.py +71 -10
- {geovisio-2.8.0.dist-info → geovisio-2.9.0.dist-info}/METADATA +24 -22
- geovisio-2.9.0.dist-info/RECORD +98 -0
- {geovisio-2.8.0.dist-info → geovisio-2.9.0.dist-info}/WHEEL +1 -1
- geovisio-2.8.0.dist-info/RECORD +0 -89
- {geovisio-2.8.0.dist-info → geovisio-2.9.0.dist-info/licenses}/LICENSE +0 -0
geovisio/web/upload_set.py
CHANGED
|
@@ -2,7 +2,7 @@ from copy import deepcopy
|
|
|
2
2
|
from dataclasses import dataclass
|
|
3
3
|
|
|
4
4
|
import PIL
|
|
5
|
-
from geovisio.utils import auth
|
|
5
|
+
from geovisio.utils import auth, model_query
|
|
6
6
|
from psycopg.rows import class_row, dict_row
|
|
7
7
|
from psycopg.sql import SQL
|
|
8
8
|
from flask import current_app, request, Blueprint, url_for
|
|
@@ -68,30 +68,53 @@ class UploadSetCreationParameter(BaseModel):
|
|
|
68
68
|
model_config = ConfigDict(use_attribute_docstrings=True)
|
|
69
69
|
|
|
70
70
|
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
class UploadSetUpdateParameter(BaseModel):
|
|
72
|
+
"""Parameters used to update an UploadSet"""
|
|
73
|
+
|
|
74
|
+
sort_method: Optional[geopic_sequence.SortMethod] = None
|
|
75
|
+
"""Strategy used for sorting your pictures. Either by filename or EXIF time, in ascending or descending order."""
|
|
76
|
+
split_distance: Optional[int] = None
|
|
77
|
+
"""Maximum distance between two pictures to be considered in the same sequence (in meters)."""
|
|
78
|
+
split_time: Optional[timedelta] = None
|
|
79
|
+
"""Maximum time interval between two pictures to be considered in the same sequence."""
|
|
80
|
+
duplicate_distance: Optional[float] = None
|
|
81
|
+
"""Maximum distance between two pictures to be considered as duplicates (in meters)."""
|
|
82
|
+
duplicate_rotation: Optional[int] = None
|
|
83
|
+
"""Maximum angle of rotation for two too-close-pictures to be considered as duplicates (in degrees)."""
|
|
73
84
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
85
|
+
model_config = ConfigDict(use_attribute_docstrings=True, extra="forbid")
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def create_upload_set(params: UploadSetCreationParameter, accountId: UUID) -> UploadSet:
|
|
89
|
+
db_params = model_query.get_db_params_and_values(params, account_id=accountId)
|
|
79
90
|
|
|
80
91
|
db_upload_set = db.fetchone(
|
|
81
92
|
current_app,
|
|
82
93
|
SQL("INSERT INTO upload_sets({fields}) VALUES({values}) RETURNING *").format(
|
|
83
|
-
fields=
|
|
94
|
+
fields=db_params.fields(), values=db_params.placeholders()
|
|
84
95
|
),
|
|
85
|
-
params_as_dict,
|
|
96
|
+
db_params.params_as_dict,
|
|
86
97
|
row_factory=class_row(UploadSet),
|
|
87
98
|
)
|
|
88
99
|
|
|
89
100
|
if db_upload_set is None:
|
|
90
|
-
raise Exception("Impossible to insert
|
|
101
|
+
raise Exception("Impossible to insert upload_set in database")
|
|
91
102
|
|
|
92
103
|
return db_upload_set
|
|
93
104
|
|
|
94
105
|
|
|
106
|
+
def update_upload_set(upload_set_id: UUID, params: UploadSetUpdateParameter) -> UploadSet:
|
|
107
|
+
db_params = model_query.get_db_params_and_values(params)
|
|
108
|
+
|
|
109
|
+
with db.execute(
|
|
110
|
+
current_app,
|
|
111
|
+
SQL("UPDATE upload_sets SET {fields} WHERE id = %(upload_set_id)s").format(fields=db_params.fields_for_set()),
|
|
112
|
+
db_params.params_as_dict | {"upload_set_id": upload_set_id},
|
|
113
|
+
):
|
|
114
|
+
# we get a full uploadset response
|
|
115
|
+
return get_upload_set(upload_set_id)
|
|
116
|
+
|
|
117
|
+
|
|
95
118
|
@bp.route("/upload_sets", methods=["POST"])
|
|
96
119
|
@auth.login_required_by_setting("API_FORCE_AUTH_ON_UPLOAD")
|
|
97
120
|
def postUploadSet(account=None):
|
|
@@ -150,6 +173,64 @@ def postUploadSet(account=None):
|
|
|
150
173
|
)
|
|
151
174
|
|
|
152
175
|
|
|
176
|
+
@bp.route("/upload_sets/<uuid:upload_set_id>", methods=["PATCH"])
|
|
177
|
+
@auth.login_required_by_setting("API_FORCE_AUTH_ON_UPLOAD")
|
|
178
|
+
def patchUploadSet(upload_set_id, account=None):
|
|
179
|
+
"""Update an existing UploadSet.
|
|
180
|
+
|
|
181
|
+
Note that the upload set will not be dispatched again, so if you changed the dispatch parameters (like split_distance, split_time, duplicate_distance, duplicate_rotation, ...), you need to call the `POST /api/upload_sets/:id/complete` endpoint to dispatch the upload set afterward.
|
|
182
|
+
---
|
|
183
|
+
tags:
|
|
184
|
+
- Upload
|
|
185
|
+
- UploadSet
|
|
186
|
+
parameters:
|
|
187
|
+
- name: upload_set_id
|
|
188
|
+
in: path
|
|
189
|
+
description: ID of the UploadSet
|
|
190
|
+
required: true
|
|
191
|
+
schema:
|
|
192
|
+
type: string
|
|
193
|
+
requestBody:
|
|
194
|
+
content:
|
|
195
|
+
application/json:
|
|
196
|
+
schema:
|
|
197
|
+
$ref: '#/components/schemas/UploadSetUpdateParameter'
|
|
198
|
+
security:
|
|
199
|
+
- bearerToken: []
|
|
200
|
+
- cookieAuth: []
|
|
201
|
+
responses:
|
|
202
|
+
200:
|
|
203
|
+
description: the UploadSet metadata
|
|
204
|
+
content:
|
|
205
|
+
application/json:
|
|
206
|
+
schema:
|
|
207
|
+
$ref: '#/components/schemas/GeoVisioUploadSet'
|
|
208
|
+
"""
|
|
209
|
+
|
|
210
|
+
if request.is_json and request.json is not None:
|
|
211
|
+
try:
|
|
212
|
+
params = UploadSetUpdateParameter(**request.json)
|
|
213
|
+
except ValidationError as ve:
|
|
214
|
+
raise errors.InvalidAPIUsage(_("Impossible to update the UploadSet"), payload=validation_error(ve))
|
|
215
|
+
else:
|
|
216
|
+
raise errors.InvalidAPIUsage(_("Parameter for updating an UploadSet should be a valid JSON"), status_code=415)
|
|
217
|
+
|
|
218
|
+
upload_set = get_simple_upload_set(upload_set_id)
|
|
219
|
+
if upload_set is None:
|
|
220
|
+
raise errors.InvalidAPIUsage(_("UploadSet doesn't exist"), status_code=404)
|
|
221
|
+
|
|
222
|
+
if account and str(upload_set.account_id) != account.id:
|
|
223
|
+
raise errors.InvalidAPIUsage(_("You are not allowed to update this upload set"), status_code=403)
|
|
224
|
+
|
|
225
|
+
if not params.model_fields_set:
|
|
226
|
+
# nothing to update, return the upload set
|
|
227
|
+
upload_set = get_upload_set(upload_set_id)
|
|
228
|
+
else:
|
|
229
|
+
upload_set = update_upload_set(upload_set_id, params)
|
|
230
|
+
|
|
231
|
+
return upload_set.model_dump_json(exclude_none=True), 200, {"Content-Type": "application/json"}
|
|
232
|
+
|
|
233
|
+
|
|
153
234
|
@bp.route("/upload_sets/<uuid:upload_set_id>", methods=["GET"])
|
|
154
235
|
def getUploadSet(upload_set_id):
|
|
155
236
|
"""Get an existing UploadSet
|
geovisio/web/users.py
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
from typing import List, Optional
|
|
2
2
|
from uuid import UUID
|
|
3
3
|
import flask
|
|
4
|
-
from flask import
|
|
4
|
+
from flask import request, current_app, session, url_for
|
|
5
5
|
from flask_babel import gettext as _
|
|
6
|
-
from pydantic import BaseModel,
|
|
6
|
+
from pydantic import BaseModel, ConfigDict, ValidationError, computed_field
|
|
7
7
|
from geovisio.utils import auth, db
|
|
8
8
|
from geovisio import errors
|
|
9
9
|
from psycopg.rows import dict_row, class_row
|
|
@@ -19,6 +19,21 @@ from geovisio.web.utils import get_root_link
|
|
|
19
19
|
bp = flask.Blueprint("user", __name__, url_prefix="/api/users")
|
|
20
20
|
|
|
21
21
|
|
|
22
|
+
class Permissions(BaseModel):
|
|
23
|
+
"""Role and permissions of a user"""
|
|
24
|
+
|
|
25
|
+
role: auth.AccountRole
|
|
26
|
+
"""Role of the user"""
|
|
27
|
+
can_check_reports: bool
|
|
28
|
+
"""Is account legitimate to read any report ?"""
|
|
29
|
+
can_edit_excluded_areas: bool
|
|
30
|
+
"""Is account legitimate to read and edit excluded areas ?"""
|
|
31
|
+
can_edit_pages: bool
|
|
32
|
+
"""Is account legitimate to edit web pages ?"""
|
|
33
|
+
|
|
34
|
+
model_config = ConfigDict(use_attribute_docstrings=True, use_enum_values=True)
|
|
35
|
+
|
|
36
|
+
|
|
22
37
|
class UserInfo(BaseModel):
|
|
23
38
|
name: str
|
|
24
39
|
"""Name of the user"""
|
|
@@ -30,6 +45,11 @@ class UserInfo(BaseModel):
|
|
|
30
45
|
tos_accepted: Optional[bool] = None
|
|
31
46
|
"""True means the user has accepted the terms of service (tos). Can only be seen by the user itself"""
|
|
32
47
|
|
|
48
|
+
permissions: Optional[Permissions] = None
|
|
49
|
+
"""The user role and permissions. Can only be seen by the user itself"""
|
|
50
|
+
|
|
51
|
+
model_config = ConfigDict(use_attribute_docstrings=True)
|
|
52
|
+
|
|
33
53
|
@computed_field
|
|
34
54
|
@property
|
|
35
55
|
def links(self) -> List[Link]:
|
|
@@ -55,8 +75,15 @@ def _get_user_info(account: auth.Account):
|
|
|
55
75
|
user_info = UserInfo(id=account.id, name=account.name, collaborative_metadata=account.collaborative_metadata)
|
|
56
76
|
logged_account = auth.get_current_account()
|
|
57
77
|
if logged_account is not None and account.id == logged_account.id:
|
|
58
|
-
# we show the term of service acceptance only if the user is the logged user
|
|
59
|
-
|
|
78
|
+
# we show the term of service acceptance only if the user is the logged user and if ToS are mandatory
|
|
79
|
+
if flask.current_app.config["API_ENFORCE_TOS_ACCEPTANCE"]:
|
|
80
|
+
user_info.tos_accepted = account.tos_accepted
|
|
81
|
+
user_info.permissions = Permissions(
|
|
82
|
+
role=account.role,
|
|
83
|
+
can_check_reports=account.can_check_reports(),
|
|
84
|
+
can_edit_excluded_areas=account.can_edit_excluded_areas(),
|
|
85
|
+
can_edit_pages=account.can_edit_pages(),
|
|
86
|
+
)
|
|
60
87
|
|
|
61
88
|
return user_info.model_dump(exclude_unset=True), 200, {"Content-Type": "application/json"}
|
|
62
89
|
|
|
@@ -2,7 +2,7 @@ from fs.path import dirname
|
|
|
2
2
|
from PIL import Image, ImageOps
|
|
3
3
|
from flask import current_app
|
|
4
4
|
from geovisio import utils
|
|
5
|
-
from geovisio.utils import db, sequences, upload_set
|
|
5
|
+
from geovisio.utils import db, semantics, sequences, upload_set
|
|
6
6
|
import psycopg
|
|
7
7
|
from psycopg.rows import dict_row
|
|
8
8
|
from psycopg.sql import SQL
|
|
@@ -22,8 +22,6 @@ import geovisio.utils.filesystems
|
|
|
22
22
|
|
|
23
23
|
log = logging.getLogger("geovisio.runner_pictures")
|
|
24
24
|
|
|
25
|
-
PROCESS_MAX_RETRY = 5 # Number of times a job will be retryed if there is a `RecoverableProcessException` during process (like if the blurring api is not reachable).
|
|
26
|
-
|
|
27
25
|
|
|
28
26
|
class PictureBackgroundProcessor(object):
|
|
29
27
|
def __init__(self, app):
|
|
@@ -50,6 +48,10 @@ class PictureBackgroundProcessor(object):
|
|
|
50
48
|
worker = PictureProcessor(app=current_app)
|
|
51
49
|
return self.executor.submit(worker.process_jobs)
|
|
52
50
|
|
|
51
|
+
def stop(self):
|
|
52
|
+
if self.enabled:
|
|
53
|
+
self.executor.shutdown(cancel_futures=True, wait=True)
|
|
54
|
+
|
|
53
55
|
|
|
54
56
|
class ProcessTask(str, Enum):
|
|
55
57
|
prepare = "prepare"
|
|
@@ -103,6 +105,55 @@ class DbJob:
|
|
|
103
105
|
return f"{self.task} for {impacted_object}"
|
|
104
106
|
|
|
105
107
|
|
|
108
|
+
def store_detection_semantics(pic: DbPicture, metadata: Dict[str, Any], store_id: bool):
|
|
109
|
+
"""store the detection returned by the blurring API in the database.
|
|
110
|
+
|
|
111
|
+
The semantics part is stored as annotations, linked to the default account.
|
|
112
|
+
|
|
113
|
+
The blurring id, which could be used to unblur the picture later, is stored in a separate column?
|
|
114
|
+
|
|
115
|
+
Note that all old semantics tags are removed, and to know this, we check the `service_name` field returned by the blurring API, and the special qualifier tag
|
|
116
|
+
`detection_model` that is formated like a user-agent.
|
|
117
|
+
So we delete all old tags (and related qualifiers) o
|
|
118
|
+
"""
|
|
119
|
+
from geovisio.utils import annotations
|
|
120
|
+
|
|
121
|
+
tags = metadata.pop("annotations", [])
|
|
122
|
+
|
|
123
|
+
with db.conn(current_app) as conn, conn.cursor() as cursor:
|
|
124
|
+
blurring_id = metadata.get("blurring_id")
|
|
125
|
+
if blurring_id and store_id:
|
|
126
|
+
# we store the blurring id to be able to unblur the picture later
|
|
127
|
+
cursor.execute(
|
|
128
|
+
"UPDATE pictures SET blurring_id = %(blurring_id)s WHERE id = %(id)s",
|
|
129
|
+
{"blurring_id": blurring_id, "id": pic.id},
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
if not tags:
|
|
133
|
+
return
|
|
134
|
+
|
|
135
|
+
default_account_id = cursor.execute("SELECT id from accounts where is_default = true").fetchone()
|
|
136
|
+
if not default_account_id:
|
|
137
|
+
log.error("Impossible to find a default account, cannot add semantics from blurring api")
|
|
138
|
+
default_account_id = default_account_id[0]
|
|
139
|
+
|
|
140
|
+
# we want to remove all the tags added by the same bluring api previously
|
|
141
|
+
# it's especially usefull when a picture is blurred multiple times
|
|
142
|
+
# and if the detection model has been updated between the blurrings
|
|
143
|
+
semantics.delete_annotation_tags_from_service(conn, pic.id, service_name="SGBlur", account=default_account_id)
|
|
144
|
+
try:
|
|
145
|
+
annotations_to_create = [
|
|
146
|
+
annotations.AnnotationCreationParameter(**t, account_id=default_account_id, picture_id=pic.id) for t in tags
|
|
147
|
+
]
|
|
148
|
+
except Exception as e:
|
|
149
|
+
# if the detections are not in the correct format, we skip them
|
|
150
|
+
msg = errors.getMessageFromException(e)
|
|
151
|
+
log.error(f"impossible to save blurring detections, skipping it for picture {pic.id}: {msg}")
|
|
152
|
+
return
|
|
153
|
+
for a in annotations_to_create:
|
|
154
|
+
annotations.creation_annotation(a)
|
|
155
|
+
|
|
156
|
+
|
|
106
157
|
def processPictureFiles(pic: DbPicture, config):
|
|
107
158
|
"""Generates the files associated with a sequence picture.
|
|
108
159
|
|
|
@@ -140,15 +191,23 @@ def processPictureFiles(pic: DbPicture, config):
|
|
|
140
191
|
if not skipBlur:
|
|
141
192
|
with sentry_sdk.start_span(description="Blurring picture"):
|
|
142
193
|
try:
|
|
143
|
-
|
|
194
|
+
res = utils.pictures.createBlurredHDPicture(
|
|
144
195
|
fses.permanent,
|
|
145
196
|
config.get("API_BLUR_URL"),
|
|
146
197
|
pictureBytes,
|
|
147
198
|
picHdPath,
|
|
199
|
+
keep_unblured_parts=config["PICTURE_PROCESS_KEEP_UNBLURRED_PARTS"],
|
|
148
200
|
)
|
|
149
201
|
except Exception as e:
|
|
150
|
-
|
|
151
|
-
|
|
202
|
+
msg = errors.getMessageFromException(e)
|
|
203
|
+
log.error(f"impossible to blur picture {pic.id}: {msg}")
|
|
204
|
+
raise RecoverableProcessException("Blur API failure: " + msg) from e
|
|
205
|
+
if res is None:
|
|
206
|
+
picture = None
|
|
207
|
+
else:
|
|
208
|
+
picture = res.image
|
|
209
|
+
if res.metadata:
|
|
210
|
+
store_detection_semantics(pic, res.metadata, store_id=config["PICTURE_PROCESS_KEEP_UNBLURRED_PARTS"])
|
|
152
211
|
|
|
153
212
|
# Delete original unblurred file
|
|
154
213
|
geovisio.utils.filesystems.removeFsEvenNotFound(fses.tmp, picHdPath)
|
|
@@ -383,12 +442,13 @@ def _get_next_job(app):
|
|
|
383
442
|
_finalize_job(locking_transaction, job)
|
|
384
443
|
log.debug(f"Job {job.label()} processed")
|
|
385
444
|
except RecoverableProcessException as e:
|
|
386
|
-
_mark_process_as_error(locking_transaction, job, e, recoverable=True)
|
|
445
|
+
_mark_process_as_error(locking_transaction, job, e, config=app.config, recoverable=True)
|
|
387
446
|
except RetryLaterProcessException as e:
|
|
388
447
|
_mark_process_as_error(
|
|
389
448
|
locking_transaction,
|
|
390
449
|
job,
|
|
391
450
|
e,
|
|
451
|
+
config=app.config,
|
|
392
452
|
recoverable=True,
|
|
393
453
|
mark_as_error=False,
|
|
394
454
|
)
|
|
@@ -396,11 +456,11 @@ def _get_next_job(app):
|
|
|
396
456
|
log.error(f"Interruption received, stoping job {job.label()}")
|
|
397
457
|
# starts a new connection, since the current one can be corrupted by the exception
|
|
398
458
|
with app.pool.connection() as t:
|
|
399
|
-
_mark_process_as_error(t, job, interruption, recoverable=True)
|
|
459
|
+
_mark_process_as_error(t, job, interruption, config=app.config, recoverable=True)
|
|
400
460
|
error = interruption
|
|
401
461
|
except Exception as e:
|
|
402
462
|
log.exception(f"Impossible to finish job {job.label()}")
|
|
403
|
-
_mark_process_as_error(locking_transaction, job, e, recoverable=False)
|
|
463
|
+
_mark_process_as_error(locking_transaction, job, e, config=app.config, recoverable=False)
|
|
404
464
|
|
|
405
465
|
# try to finalize the sequence anyway
|
|
406
466
|
_finalize_sequence(job)
|
|
@@ -506,6 +566,7 @@ def _mark_process_as_error(
|
|
|
506
566
|
conn,
|
|
507
567
|
job: DbJob,
|
|
508
568
|
e: Exception,
|
|
569
|
+
config: Dict,
|
|
509
570
|
recoverable: bool = False,
|
|
510
571
|
mark_as_error: bool = True,
|
|
511
572
|
):
|
|
@@ -524,7 +585,7 @@ def _mark_process_as_error(
|
|
|
524
585
|
RETURNING nb_errors""",
|
|
525
586
|
{"err": str(e), "id": job.job_queue_id},
|
|
526
587
|
).fetchone()
|
|
527
|
-
if nb_error and nb_error[0] >
|
|
588
|
+
if nb_error and nb_error[0] > config["PICTURE_PROCESS_NB_RETRIES"]:
|
|
528
589
|
logging.info(f"Job {job.label()} has failed {nb_error} times, we stop trying to process it.")
|
|
529
590
|
recoverable = False
|
|
530
591
|
else:
|
|
@@ -1,39 +1,41 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: geovisio
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.9.0
|
|
4
4
|
Summary: GeoVisio API - Main
|
|
5
5
|
Author-email: Adrien PAVIE <panieravide@riseup.net>, Antoine Desbordes <antoine.desbordes@gmail.com>
|
|
6
6
|
Requires-Python: >=3.10
|
|
7
7
|
Description-Content-Type: text/markdown
|
|
8
8
|
Classifier: License :: OSI Approved :: MIT License
|
|
9
|
-
|
|
10
|
-
Requires-Dist:
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Requires-Dist: Flask ~= 3.1
|
|
11
|
+
Requires-Dist: psycopg[pool] ~= 3.2
|
|
11
12
|
Requires-Dist: flasgger ~= 0.9.7
|
|
12
|
-
Requires-Dist: Pillow ~=
|
|
13
|
-
Requires-Dist: Flask-Cors ~=
|
|
13
|
+
Requires-Dist: Pillow ~= 11.1
|
|
14
|
+
Requires-Dist: Flask-Cors ~= 5.0
|
|
14
15
|
Requires-Dist: fs ~= 2.4
|
|
15
|
-
Requires-Dist: fs-s3fs-forked ~= 1.1.
|
|
16
|
+
Requires-Dist: fs-s3fs-forked ~= 1.1.4
|
|
16
17
|
Requires-Dist: flask-compress ~= 1.14
|
|
17
18
|
Requires-Dist: requests ~= 2.31
|
|
18
|
-
Requires-Dist: yoyo-migrations ~=
|
|
19
|
-
Requires-Dist: psycopg-binary ~= 3.
|
|
20
|
-
Requires-Dist: python-dotenv ~=
|
|
21
|
-
Requires-Dist: authlib ~= 1.
|
|
19
|
+
Requires-Dist: yoyo-migrations ~= 9.0
|
|
20
|
+
Requires-Dist: psycopg-binary ~= 3.2
|
|
21
|
+
Requires-Dist: python-dotenv ~= 1.1
|
|
22
|
+
Requires-Dist: authlib ~= 1.5
|
|
22
23
|
Requires-Dist: Flask-Executor ~= 1.0
|
|
23
24
|
Requires-Dist: geopic-tag-reader[write-exif] == 1.4.2
|
|
24
25
|
Requires-Dist: rfeed ~= 1.1.1
|
|
25
|
-
Requires-Dist: sentry-sdk[flask] ~=
|
|
26
|
-
Requires-Dist: pygeofilter[backend-native] ~= 0.
|
|
26
|
+
Requires-Dist: sentry-sdk[flask] ~= 2.24
|
|
27
|
+
Requires-Dist: pygeofilter[backend-native] ~= 0.3.1
|
|
27
28
|
Requires-Dist: python-dateutil ~= 2.9.0
|
|
28
|
-
Requires-Dist: tzdata ~=
|
|
29
|
-
Requires-Dist: croniter ~=
|
|
30
|
-
Requires-Dist: pydantic ~= 2.
|
|
29
|
+
Requires-Dist: tzdata ~= 2025.2
|
|
30
|
+
Requires-Dist: croniter ~= 6.0.0
|
|
31
|
+
Requires-Dist: pydantic ~= 2.11
|
|
31
32
|
Requires-Dist: pydantic-extra-types ~= 2.7
|
|
32
33
|
Requires-Dist: flask-babel ~= 4.0.0
|
|
33
|
-
Requires-Dist: geojson-pydantic ~= 1.
|
|
34
|
+
Requires-Dist: geojson-pydantic ~= 1.2.0
|
|
34
35
|
Requires-Dist: email-validator ~= 2.2.0
|
|
36
|
+
Requires-Dist: multipart>=1.2.1
|
|
35
37
|
Requires-Dist: flit ~= 3.9.0 ; extra == "build"
|
|
36
|
-
Requires-Dist: coverage ~=
|
|
38
|
+
Requires-Dist: coverage ~= 7.7 ; extra == "dev"
|
|
37
39
|
Requires-Dist: protobuf ~= 4.21 ; extra == "dev"
|
|
38
40
|
Requires-Dist: mapbox-vector-tile ~= 2.0 ; extra == "dev"
|
|
39
41
|
Requires-Dist: pystac ~= 1.9 ; extra == "dev"
|
|
@@ -42,13 +44,13 @@ Requires-Dist: pytest-datafiles ~= 2.0 ; extra == "dev"
|
|
|
42
44
|
Requires-Dist: pyexiv2 ~= 2.15 ; extra == "dev"
|
|
43
45
|
Requires-Dist: testcontainers ~= 4.1 ; extra == "dev"
|
|
44
46
|
Requires-Dist: requests-mock ~= 1.11 ; extra == "dev"
|
|
45
|
-
Requires-Dist: black ~=
|
|
46
|
-
Requires-Dist: pre-commit ~=
|
|
47
|
+
Requires-Dist: black ~= 25.1 ; extra == "dev"
|
|
48
|
+
Requires-Dist: pre-commit ~= 4.2 ; extra == "dev"
|
|
47
49
|
Requires-Dist: pyyaml ~= 6.0 ; extra == "dev"
|
|
48
50
|
Requires-Dist: openapi-spec-validator ~= 0.7 ; extra == "dev"
|
|
49
51
|
Requires-Dist: stac-api-validator ~= 0.6.4 ; extra == "dev"
|
|
50
|
-
Requires-Dist: mkdocs-material ~= 9.
|
|
51
|
-
Requires-Dist: mkdocs-swagger-ui-tag ~= 0.6.
|
|
52
|
+
Requires-Dist: mkdocs-material ~= 9.6.9 ; extra == "docs"
|
|
53
|
+
Requires-Dist: mkdocs-swagger-ui-tag ~= 0.6.11 ; extra == "docs"
|
|
52
54
|
Project-URL: Home, https://gitlab.com/panoramax/server/api
|
|
53
55
|
Project-URL: Source Code, https://gitlab.com/panoramax/server/api
|
|
54
56
|
Provides-Extra: build
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
geovisio/__init__.py,sha256=SvZzsivuPLnCTK00mHY3F_HCW9e-xAQtcaAReDi85fI,7754
|
|
2
|
+
geovisio/config_app.py,sha256=Ct2YduFY3rWRAKM8Qic7yTN63m2jWzTPGwkQ7AHKfLs,14853
|
|
3
|
+
geovisio/db_migrations.py,sha256=9lHkyG_RiCWzrFkfwhkslScUsbCZScN-KVhkXrtnPDo,4560
|
|
4
|
+
geovisio/errors.py,sha256=uTn-kI7SUl5OPB8Mv3Qqu7Ucp5JvcqWPQFfgLCqsEpI,1376
|
|
5
|
+
geovisio/admin_cli/__init__.py,sha256=1e0hX771-3iG8eBcNmVvUYyg8qXnpng-9YWvi3MI3Kg,3248
|
|
6
|
+
geovisio/admin_cli/cleanup.py,sha256=G85I7rrfPJwaArL6MQAnC04Ye9wWciA-Yqu5iv23uJ0,4862
|
|
7
|
+
geovisio/admin_cli/db.py,sha256=mJ-cGuOAAsg-ovbP9L1kyL4xE0C4bYRuozzqQkaFyw8,897
|
|
8
|
+
geovisio/admin_cli/default_account_tokens.py,sha256=W-v5uPjCBvAujjAUx1HrfgjPj-tEyncb-EUMLpsWc9w,469
|
|
9
|
+
geovisio/admin_cli/reorder_sequences.py,sha256=LKKzdO2w4N-cQmi6rqKHKYG5YGzPxYRTbnfcPKakuYM,2826
|
|
10
|
+
geovisio/admin_cli/sequence_heading.py,sha256=BEPuRfCDXXpqSSzK2ysrxHf0OD4THzrMI_YK2uXQlGk,633
|
|
11
|
+
geovisio/admin_cli/user.py,sha256=4ml2E_aphz3I3NcuUPB2dwe_jXhcE7AGa0R5VTm3_ik,2753
|
|
12
|
+
geovisio/templates/main.html,sha256=VDVQwCZ1mNjH7sH4VOIdn8gM09R9LJZX49SPtA2VEzM,2963
|
|
13
|
+
geovisio/templates/viewer.html,sha256=JErXdU2ujj4LdMHgQbYNCTfKuYGEXbJTQwBE-K_MNXQ,892
|
|
14
|
+
geovisio/translations/messages.pot,sha256=SUPAgov3RzwVw0LNOMn2NkTthXfirbBDIQK_2BaZ2FI,19445
|
|
15
|
+
geovisio/translations/br/LC_MESSAGES/messages.mo,sha256=FjvUouzaLCBxvVH51A4PVwGGFk6mAepYasnI4v8LcnQ,719
|
|
16
|
+
geovisio/translations/br/LC_MESSAGES/messages.po,sha256=rHkbb3QTngCJxz0WmoBqMl4H-x2bXKYKxdZCEZv2P9w,19434
|
|
17
|
+
geovisio/translations/da/LC_MESSAGES/messages.mo,sha256=46hqJP4gsM3ZK2DG3L47GeC9Q-xFWrY36_OkAJCkuIg,21262
|
|
18
|
+
geovisio/translations/da/LC_MESSAGES/messages.po,sha256=MRmMNc6oQL9R8rvDewHCUhZMSH2TbsfskspCFQzKk2s,29393
|
|
19
|
+
geovisio/translations/de/LC_MESSAGES/messages.mo,sha256=hWb_yaHUHan3tFTyTbnDKJgfnD4wuaeO2nhc24V2ARM,22831
|
|
20
|
+
geovisio/translations/de/LC_MESSAGES/messages.po,sha256=nmlWG_BmcvksfDW9H8d3bTTgIgd-8ucF9lcLg3WB6us,31078
|
|
21
|
+
geovisio/translations/el/LC_MESSAGES/messages.mo,sha256=vy1jtEG6mLS5sYWPfQIr5U4XsZ21ZzSbsHAJHGQXZSY,433
|
|
22
|
+
geovisio/translations/el/LC_MESSAGES/messages.po,sha256=gDr-pDCsQGrCXBMBcDwlfsxcGWF1NIEqGrqPcZy65-4,17405
|
|
23
|
+
geovisio/translations/en/LC_MESSAGES/messages.mo,sha256=KzPxb2olWNvZrUZE9hY0ComHM6t1B2kV5bWvQQ9GUMo,20018
|
|
24
|
+
geovisio/translations/en/LC_MESSAGES/messages.po,sha256=RRfEZ2nZFNWhrbZOPzigy63TVK8cbp8vRikXIj0ibT4,28041
|
|
25
|
+
geovisio/translations/eo/LC_MESSAGES/messages.mo,sha256=67UES-hJwqciW0AiJ2fwcN0K34dBkYNRG2SqVQn3va8,21029
|
|
26
|
+
geovisio/translations/eo/LC_MESSAGES/messages.po,sha256=rzlHUGUoaRkYZY431Y3d7GaAbEcvo9NUL1wSn9Gzapw,29177
|
|
27
|
+
geovisio/translations/es/LC_MESSAGES/messages.mo,sha256=R5JmcfauTrQxIynQNT7asjdLEJC9-VEMXYrcugfBbsY,18950
|
|
28
|
+
geovisio/translations/es/LC_MESSAGES/messages.po,sha256=XzVBY4dISzRcZWw7jMmbGsnDrJvyhzX2L_o9k5B14Hw,26780
|
|
29
|
+
geovisio/translations/fi/LC_MESSAGES/messages.mo,sha256=6-WCesFiV00MkNM_Wpi7-D51DOZRNg_QOM2sL7-UPhA,626
|
|
30
|
+
geovisio/translations/fi/LC_MESSAGES/messages.po,sha256=UFT4YCfEazxLij8Ovk2vZqx55e2Yctbf_3xM5KDrXhw,14685
|
|
31
|
+
geovisio/translations/fr/LC_MESSAGES/messages.mo,sha256=_sJ-9pPfsyW7ivL1hra7A0zZHmqFr_dvsHLPDJ0H2-E,22687
|
|
32
|
+
geovisio/translations/fr/LC_MESSAGES/messages.po,sha256=qndor7UXtyRwyefPaWXMR5xJqyk062InAnuR-ynxMRA,30562
|
|
33
|
+
geovisio/translations/hu/LC_MESSAGES/messages.mo,sha256=0Hb7mv7p1BVM8QqZIYUtF3LRym8Sl9HFWfZAa00TobU,20013
|
|
34
|
+
geovisio/translations/hu/LC_MESSAGES/messages.po,sha256=0nLbjStLDrj7U9mqdIf5gnQ_XzSnhnGQeJ1wLK8l8GM,27494
|
|
35
|
+
geovisio/translations/it/LC_MESSAGES/messages.mo,sha256=a9vR4JuHQY0kwET-OUAD51FgUcCGf68_Cg-P-UOpxRc,22533
|
|
36
|
+
geovisio/translations/it/LC_MESSAGES/messages.po,sha256=kKMX_OabFjzMfYwKA4Gu_n1kND1OKokYwAGs9SSXcj0,30669
|
|
37
|
+
geovisio/translations/ja/LC_MESSAGES/messages.mo,sha256=ZPHJrNdf4bgiNFjxP8W41fkZ2OTJ7Swrqt-Hkh5LfO8,24194
|
|
38
|
+
geovisio/translations/ja/LC_MESSAGES/messages.po,sha256=hE6WOQPaLPjury-bFO3xUJin7bWlcwv0ewSsCpScDdY,32627
|
|
39
|
+
geovisio/translations/ko/LC_MESSAGES/messages.mo,sha256=eKuQS9zLcJ9s-DzbfR-QK2INBJL10jTIQ1kuSTdJ9Rg,426
|
|
40
|
+
geovisio/translations/ko/LC_MESSAGES/messages.po,sha256=uq19EZaeRB-obmE1hYnckA8T12JuuU3nXYyKaMR4tiU,17405
|
|
41
|
+
geovisio/translations/nl/LC_MESSAGES/messages.mo,sha256=HP-evCZLxS_rKlzmIthYOM-ueJShTpqRhq2DpHe_xmM,7896
|
|
42
|
+
geovisio/translations/nl/LC_MESSAGES/messages.po,sha256=v22VpXyXKwYDcwjBJ6r-DAfGwAwxUmUBQHW7nZMQVxY,20576
|
|
43
|
+
geovisio/translations/pl/LC_MESSAGES/messages.mo,sha256=0iFTAhma7jjyl13DCLr2Xr0hgDSN-_fOqcKoYcdDwGE,9912
|
|
44
|
+
geovisio/translations/pl/LC_MESSAGES/messages.po,sha256=e8HW1RKsdkR-aL7peBMuqRUQoqKvzr6Eq0sC1in5XY0,22187
|
|
45
|
+
geovisio/translations/sv/LC_MESSAGES/messages.mo,sha256=HZOV2wRp6rKhd86033u022LWU9TlPPvK3Z1ihdKg638,20719
|
|
46
|
+
geovisio/translations/sv/LC_MESSAGES/messages.po,sha256=OMj2ABVytPbHEa_Fz8Qb3Nof7MjaUl_y8K28KXAaJEg,28748
|
|
47
|
+
geovisio/translations/zh_Hant/LC_MESSAGES/messages.mo,sha256=TmRUyfTGoBpU-2BE-nKjhwdr9r0ikDioVQU-JQ_ih90,431
|
|
48
|
+
geovisio/translations/zh_Hant/LC_MESSAGES/messages.po,sha256=LnnKlHy8t_54nNsLDBqC1eEPwPx49h1Um9mQj6l9hv0,18357
|
|
49
|
+
geovisio/utils/__init__.py,sha256=g4SWVoV73cSXjf5-5D9-HmyB5xKmHSuxxOGWnx7W3V0,71
|
|
50
|
+
geovisio/utils/annotations.py,sha256=9Opfzogx1Pqn6mhbJvaoL2Q2RGPWdFhpHXCA7M7kXQc,6896
|
|
51
|
+
geovisio/utils/auth.py,sha256=_vvkBTvjRXYlnyaHziNWJjiGKulomMqex-CDbv1dbKQ,13845
|
|
52
|
+
geovisio/utils/cql2.py,sha256=hGFRWAMYu4-PPKZWS3wJKNqDdu-XEwnl5zhCIu986A0,4719
|
|
53
|
+
geovisio/utils/db.py,sha256=cxetPL-URdeOxmDMPwxKovB93yQYLNlOL8UHvP4DHg0,2856
|
|
54
|
+
geovisio/utils/excluded_areas.py,sha256=6f3wwsgNpJKxAXnHH8RKlktgHpsG-0QVNTWDDTFqPZ8,2585
|
|
55
|
+
geovisio/utils/extent.py,sha256=vzOHvbG6lpSNt7KrsaonBOx7Tz46S1J603gLbZvs36g,557
|
|
56
|
+
geovisio/utils/fields.py,sha256=oII5uv_n-DXTSYiDBGMM3XDYAuBbYVakKIVTQfFcSLI,3015
|
|
57
|
+
geovisio/utils/filesystems.py,sha256=W_wH7TlvdEux_q4FP0XInxruxlbepFSEpJbPLO9Cnr4,4133
|
|
58
|
+
geovisio/utils/link.py,sha256=u9x4xJa57L1448neD7uPJuAA76_sFXVE0-9_zPW-bJM,490
|
|
59
|
+
geovisio/utils/loggers.py,sha256=_OrGXME4o5qQz8VBaLxYopHVK0DY0QgzXu6O2W0WBjo,477
|
|
60
|
+
geovisio/utils/model_query.py,sha256=027Um4NqkRS6dUjhjHcVbmZjA-_jsy24bN5W6dRPg5Q,2072
|
|
61
|
+
geovisio/utils/params.py,sha256=Yj9-PwC8jxb9LjQZ5K8TERimSsWKwJBHPhUxlzDVMhg,714
|
|
62
|
+
geovisio/utils/pic_shape.py,sha256=di49MT2djHI7zm13Q5DhhB70wji2lCuB7UAYjEWi7Yo,2270
|
|
63
|
+
geovisio/utils/pictures.py,sha256=rrKgkUhFU9pEPLp1jXLc2iUZKlIfPafD_UK1LLNmVUA,24765
|
|
64
|
+
geovisio/utils/reports.py,sha256=3simWHf6t_OuLw2hh2HPYj8vsji00Pz9iRnJOqbTnPs,5227
|
|
65
|
+
geovisio/utils/semantics.py,sha256=7HOCgG57yexOOhBRtAN7bvsTb6v8tscC0ZhOqzKJB1s,8627
|
|
66
|
+
geovisio/utils/sentry.py,sha256=kl1NVir8fr2w1ZUPNAkdFsZzA4xpTlD9eS_TGQMyK9k,3738
|
|
67
|
+
geovisio/utils/sequences.py,sha256=z8lhSEgEMGGWM3y0PafuFU1vkrRhrDGcEhfeuoSGRqI,29329
|
|
68
|
+
geovisio/utils/tags.py,sha256=GyihW-TgQk1ZCpqYPMoN64qOZ6PCFCvCLK9HQnZhtY8,868
|
|
69
|
+
geovisio/utils/time.py,sha256=-hOs7FSx-8eiGmMQtTOrCoF8d_yMlj2306vfxJftEr8,642
|
|
70
|
+
geovisio/utils/tokens.py,sha256=tkihnnXqgQeIME_d12tC8PVrPN90A0i9k6UPEbgZ9TQ,3047
|
|
71
|
+
geovisio/utils/upload_set.py,sha256=k3xeMMFxYFuX8SXaOAayRqwY8mxqLOVG1aVr4UhVyqU,26843
|
|
72
|
+
geovisio/utils/website.py,sha256=812_leydUaI_gPZAnkVizGH1ZJqJkoAE1usFCrRNHCI,1959
|
|
73
|
+
geovisio/web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
74
|
+
geovisio/web/annotations.py,sha256=VqBYWHmWDFV8XJesUIf7YsQFvaaZYUNDX_VpWMAXlmI,7476
|
|
75
|
+
geovisio/web/auth.py,sha256=d0g3EweC74_OOvD9fxb71M-VuQLD_BdlOcKtpwH4t5o,7143
|
|
76
|
+
geovisio/web/collections.py,sha256=Y8Jvsg0sJ9Bd89T3e5tTSEB9nbHD-Y7rq_lYxleUesw,47524
|
|
77
|
+
geovisio/web/configuration.py,sha256=udvBqdkmzL0ycgy8wbHQbp7vrXxYbjXdBKXZ7MqiMm8,2272
|
|
78
|
+
geovisio/web/docs.py,sha256=dVpTK46EsOqqGhYhwE49niRW6ss21w9b4pFVFx1Ijo8,58237
|
|
79
|
+
geovisio/web/excluded_areas.py,sha256=5BNSZ0UqgFMtgvgrJ73eYGJXPJRnV-mGEs36WDRRxTk,13024
|
|
80
|
+
geovisio/web/items.py,sha256=nJ0qWgP-oY121Z2h0tE33ULNpPPbowhVna_d_5kEHoU,61571
|
|
81
|
+
geovisio/web/map.py,sha256=hzVC0vS-71mFEvRmfCxAprums2Zz5baP6EFTL0uW02M,26136
|
|
82
|
+
geovisio/web/pages.py,sha256=Hkc3KJFE6D38vGnkCK5WUBJ8KQemI1f1wGXpxeiOiNo,6632
|
|
83
|
+
geovisio/web/params.py,sha256=O48U-G0uVY2Ee7RgyX_BQ4WBtw8dPEIQ__Na7_bJPpE,20752
|
|
84
|
+
geovisio/web/pictures.py,sha256=qbhgLsI6YtpFxXn1a3dzO66nnVrWglRZSXWmlfJr1tU,6394
|
|
85
|
+
geovisio/web/prepare.py,sha256=R10_xf6O9dmAAwOMC-vsaxgNTdc9BkDJLATqH6MKtCw,5620
|
|
86
|
+
geovisio/web/reports.py,sha256=8v9a4PMM9RsvSGadZEN2o5PTKG_TohjyMMEBfFeY13E,14123
|
|
87
|
+
geovisio/web/rss.py,sha256=NLUd2Or92tcKRaGUHAze6QMLWczHyzag9ybOzrA8djE,2962
|
|
88
|
+
geovisio/web/stac.py,sha256=PQqbUHBDi0xqVmYjH1oC16qtuaZbU8P0SufM0gdiG9w,14853
|
|
89
|
+
geovisio/web/tokens.py,sha256=l7CAM0FQ6qAcoUhtIRysKc9Gndlji_wOMpkXLsPP1pI,9599
|
|
90
|
+
geovisio/web/upload_set.py,sha256=g49FuOYABhAz1UJcT0AwO5V4z3rue0ppZzemEZiyG6o,33922
|
|
91
|
+
geovisio/web/users.py,sha256=PeB2hcyyLvNDi98iNl8P4wr3X4r3Yz6FVP8Yx_U6Nac,14054
|
|
92
|
+
geovisio/web/utils.py,sha256=kudTbV4Tgtkbd4oUWFTFpyWNINpxAa-VQNbxYEiR6pM,3640
|
|
93
|
+
geovisio/workers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
94
|
+
geovisio/workers/runner_pictures.py,sha256=Mls2iOJKygJ1f7M1q3MTWljB38mJ6U88OtwT7lLGYMU,25754
|
|
95
|
+
geovisio-2.9.0.dist-info/licenses/LICENSE,sha256=iRFSz7MJ7_j4hh3hvIgzNbS2buy5NMva8lulaixd3IE,1069
|
|
96
|
+
geovisio-2.9.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
|
|
97
|
+
geovisio-2.9.0.dist-info/METADATA,sha256=M5h-xEUTKpvD7IkISMRcTp-pm5N35n542Weus4Ep8YU,4353
|
|
98
|
+
geovisio-2.9.0.dist-info/RECORD,,
|
geovisio-2.8.0.dist-info/RECORD
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
geovisio/__init__.py,sha256=SPh7-7e0TuxuQNMcF9hDwkg7hW0bJDpbcRnxwu_5DQk,7145
|
|
2
|
-
geovisio/config_app.py,sha256=8RlBxn2LcA71o0jcfR5UrVz12ig985MNUgCj54ZydpA,14356
|
|
3
|
-
geovisio/db_migrations.py,sha256=9lHkyG_RiCWzrFkfwhkslScUsbCZScN-KVhkXrtnPDo,4560
|
|
4
|
-
geovisio/errors.py,sha256=uTn-kI7SUl5OPB8Mv3Qqu7Ucp5JvcqWPQFfgLCqsEpI,1376
|
|
5
|
-
geovisio/admin_cli/__init__.py,sha256=1e0hX771-3iG8eBcNmVvUYyg8qXnpng-9YWvi3MI3Kg,3248
|
|
6
|
-
geovisio/admin_cli/cleanup.py,sha256=G85I7rrfPJwaArL6MQAnC04Ye9wWciA-Yqu5iv23uJ0,4862
|
|
7
|
-
geovisio/admin_cli/db.py,sha256=mJ-cGuOAAsg-ovbP9L1kyL4xE0C4bYRuozzqQkaFyw8,897
|
|
8
|
-
geovisio/admin_cli/default_account_tokens.py,sha256=W-v5uPjCBvAujjAUx1HrfgjPj-tEyncb-EUMLpsWc9w,469
|
|
9
|
-
geovisio/admin_cli/reorder_sequences.py,sha256=LKKzdO2w4N-cQmi6rqKHKYG5YGzPxYRTbnfcPKakuYM,2826
|
|
10
|
-
geovisio/admin_cli/sequence_heading.py,sha256=BEPuRfCDXXpqSSzK2ysrxHf0OD4THzrMI_YK2uXQlGk,633
|
|
11
|
-
geovisio/admin_cli/user.py,sha256=4ml2E_aphz3I3NcuUPB2dwe_jXhcE7AGa0R5VTm3_ik,2753
|
|
12
|
-
geovisio/templates/main.html,sha256=VDVQwCZ1mNjH7sH4VOIdn8gM09R9LJZX49SPtA2VEzM,2963
|
|
13
|
-
geovisio/templates/viewer.html,sha256=JErXdU2ujj4LdMHgQbYNCTfKuYGEXbJTQwBE-K_MNXQ,892
|
|
14
|
-
geovisio/translations/messages.pot,sha256=SUPAgov3RzwVw0LNOMn2NkTthXfirbBDIQK_2BaZ2FI,19445
|
|
15
|
-
geovisio/translations/da/LC_MESSAGES/messages.mo,sha256=zFlDCgA4l-1MamoKMXfFR3diQk67gXM2pEFiZvZwsow,21014
|
|
16
|
-
geovisio/translations/da/LC_MESSAGES/messages.po,sha256=Yt1JSEG9e_ljgRvc0u3cknQ5ViU-eJq9XNQ__1Nz-Vs,29084
|
|
17
|
-
geovisio/translations/de/LC_MESSAGES/messages.mo,sha256=rO-g7WJC74c9MeuqSAuc3bNZX4G5Vz4O-sHILirjYYk,22590
|
|
18
|
-
geovisio/translations/de/LC_MESSAGES/messages.po,sha256=0LcBQjH0LpsHSypXo7kKQKZC0K_yPNyHBuEh5aF7lIk,30776
|
|
19
|
-
geovisio/translations/el/LC_MESSAGES/messages.mo,sha256=vy1jtEG6mLS5sYWPfQIr5U4XsZ21ZzSbsHAJHGQXZSY,433
|
|
20
|
-
geovisio/translations/el/LC_MESSAGES/messages.po,sha256=gDr-pDCsQGrCXBMBcDwlfsxcGWF1NIEqGrqPcZy65-4,17405
|
|
21
|
-
geovisio/translations/en/LC_MESSAGES/messages.mo,sha256=TdE2eywWyvkF0x0qsBPHju3TugQLLqtTk4ZqnAxuJHs,19953
|
|
22
|
-
geovisio/translations/en/LC_MESSAGES/messages.po,sha256=Q7j87mLUtyG-wrVvLQXlbTecW8p04a71FnN919UjZN8,27942
|
|
23
|
-
geovisio/translations/eo/LC_MESSAGES/messages.mo,sha256=3xtkpuSWl-Wb61cwlB7yK40_JgLMJNB5k1FCFuCfqM8,19330
|
|
24
|
-
geovisio/translations/eo/LC_MESSAGES/messages.po,sha256=Gd9n9ZalupqFAlI48y-VQ-XZumTVWnpEOy8-VXnR3Us,26977
|
|
25
|
-
geovisio/translations/es/LC_MESSAGES/messages.mo,sha256=ULQDhq4enQyjfAWxDq13BwHBPibg3Yt4ys6XrfQF5tM,19111
|
|
26
|
-
geovisio/translations/es/LC_MESSAGES/messages.po,sha256=NoyuXR_2iugWHLTcoUZSNLUSCpt8jMyl0FUD4p7N99w,26775
|
|
27
|
-
geovisio/translations/fi/LC_MESSAGES/messages.mo,sha256=6-WCesFiV00MkNM_Wpi7-D51DOZRNg_QOM2sL7-UPhA,626
|
|
28
|
-
geovisio/translations/fi/LC_MESSAGES/messages.po,sha256=UFT4YCfEazxLij8Ovk2vZqx55e2Yctbf_3xM5KDrXhw,14685
|
|
29
|
-
geovisio/translations/fr/LC_MESSAGES/messages.mo,sha256=2kjpCTUbrbAUfFJZ17kR5FAdY_LD5Bh9POzkQvo06-Q,21712
|
|
30
|
-
geovisio/translations/fr/LC_MESSAGES/messages.po,sha256=e-PEtl8S4Hjymh9-rv4R45RM3dq-C1M2hdF4CE5Nm6E,29384
|
|
31
|
-
geovisio/translations/hu/LC_MESSAGES/messages.mo,sha256=R-0QJl78CNJepsXi8uunlCA-QHhB0_t1Xj6e_EI_NI4,20156
|
|
32
|
-
geovisio/translations/hu/LC_MESSAGES/messages.po,sha256=Cs1EaEfVISyIsKxnK-f0gy0ocJdey5o-620mkvW1SAs,27472
|
|
33
|
-
geovisio/translations/it/LC_MESSAGES/messages.mo,sha256=jpTyt3Kv19Qu7EHGTzunZyXGMGsg3cg3_EBVxvNmuYA,22260
|
|
34
|
-
geovisio/translations/it/LC_MESSAGES/messages.po,sha256=Jw3y5igDkAVvTmJz0sYoopXvOBops5lRqdC6F-j2AXQ,30335
|
|
35
|
-
geovisio/translations/ja/LC_MESSAGES/messages.mo,sha256=5t8PzVwGf7ePX3mCQI65pGFOLzF2sQbMPm8svxkxNAE,426
|
|
36
|
-
geovisio/translations/ja/LC_MESSAGES/messages.po,sha256=a5S3Lceg47RFSuq7Lcytmu1ni0JGj8nPjWXdF1ZWRVs,18352
|
|
37
|
-
geovisio/translations/ko/LC_MESSAGES/messages.mo,sha256=eKuQS9zLcJ9s-DzbfR-QK2INBJL10jTIQ1kuSTdJ9Rg,426
|
|
38
|
-
geovisio/translations/ko/LC_MESSAGES/messages.po,sha256=uq19EZaeRB-obmE1hYnckA8T12JuuU3nXYyKaMR4tiU,17405
|
|
39
|
-
geovisio/translations/nl/LC_MESSAGES/messages.mo,sha256=aKM90Hp4Eh9vCQba_tlfjEWlhygLXWGq_SVYqBw9IA4,1592
|
|
40
|
-
geovisio/translations/nl/LC_MESSAGES/messages.po,sha256=m69xfphxpgfPOuUrBK51XrR8UFwqCEBZpnb_5B1mGOU,15302
|
|
41
|
-
geovisio/translations/pl/LC_MESSAGES/messages.mo,sha256=0RiGTq49esjtIrBomzeFwG6dWdAlDhJxIOv4AgNjyOQ,10083
|
|
42
|
-
geovisio/translations/pl/LC_MESSAGES/messages.po,sha256=JpN6yFqnpyqkMjU3YZLAMr65npQ7AybOLB3ARJoL94g,22192
|
|
43
|
-
geovisio/translations/zh_Hant/LC_MESSAGES/messages.mo,sha256=TmRUyfTGoBpU-2BE-nKjhwdr9r0ikDioVQU-JQ_ih90,431
|
|
44
|
-
geovisio/translations/zh_Hant/LC_MESSAGES/messages.po,sha256=LnnKlHy8t_54nNsLDBqC1eEPwPx49h1Um9mQj6l9hv0,18357
|
|
45
|
-
geovisio/utils/__init__.py,sha256=g4SWVoV73cSXjf5-5D9-HmyB5xKmHSuxxOGWnx7W3V0,71
|
|
46
|
-
geovisio/utils/auth.py,sha256=_vvkBTvjRXYlnyaHziNWJjiGKulomMqex-CDbv1dbKQ,13845
|
|
47
|
-
geovisio/utils/db.py,sha256=DFyCEB5-xTUo6sn79SYJCzuvlgFNDVyNJ48Mana5vPI,2625
|
|
48
|
-
geovisio/utils/excluded_areas.py,sha256=6f3wwsgNpJKxAXnHH8RKlktgHpsG-0QVNTWDDTFqPZ8,2585
|
|
49
|
-
geovisio/utils/extent.py,sha256=vzOHvbG6lpSNt7KrsaonBOx7Tz46S1J603gLbZvs36g,557
|
|
50
|
-
geovisio/utils/fields.py,sha256=sNAmrSJ4e-nqm0-LoyO3l4Zynb-Jy8swhwmL3UcDN_o,2129
|
|
51
|
-
geovisio/utils/filesystems.py,sha256=W_wH7TlvdEux_q4FP0XInxruxlbepFSEpJbPLO9Cnr4,4133
|
|
52
|
-
geovisio/utils/link.py,sha256=u9x4xJa57L1448neD7uPJuAA76_sFXVE0-9_zPW-bJM,490
|
|
53
|
-
geovisio/utils/model_query.py,sha256=PtvYCjKVygmicvqqYpCpEKWUIEvwdEG6QMh-JL5E8AQ,2031
|
|
54
|
-
geovisio/utils/params.py,sha256=s9kBPHm4gRhMx10SD7mOPdG0tR_n_O-g_rgL8Fife6s,630
|
|
55
|
-
geovisio/utils/pictures.py,sha256=cDDOABzZaTn98Bg8lYgoMlkTNklS9-y-qB-HXTcJ0YM,23092
|
|
56
|
-
geovisio/utils/reports.py,sha256=PgU0Td48WJg6XCq043he8Jif3WCA9nOTaGE0Yovo3h0,5626
|
|
57
|
-
geovisio/utils/semantics.py,sha256=bsPo4n0R0_pU5NdL7-dkx-bMYPhtyVq85z4nHNLptto,4572
|
|
58
|
-
geovisio/utils/sentry.py,sha256=Dw0rW2sNFbcpGojzpa-vjtJ5S7BH_XhsqfuGYBjHCG0,3759
|
|
59
|
-
geovisio/utils/sequences.py,sha256=S3OaMozzk9viYJMgHyzGYP1hZFsYjF8Ez2hXFTIBimI,25307
|
|
60
|
-
geovisio/utils/time.py,sha256=-hOs7FSx-8eiGmMQtTOrCoF8d_yMlj2306vfxJftEr8,642
|
|
61
|
-
geovisio/utils/tokens.py,sha256=tkihnnXqgQeIME_d12tC8PVrPN90A0i9k6UPEbgZ9TQ,3047
|
|
62
|
-
geovisio/utils/upload_set.py,sha256=P27ABINmMgNaFGMqd6rLLbeaOSddTz7Tchs2ByKDHeM,26478
|
|
63
|
-
geovisio/utils/website.py,sha256=wQosLHD-7_ONReJijKCjGUawKz1eCyBLWwkSWxd6ei8,1909
|
|
64
|
-
geovisio/web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
65
|
-
geovisio/web/annotations.py,sha256=TdivDOcVh83HRkBXBTxFD7J-VbZ1gnVesPfTNY-3uW4,653
|
|
66
|
-
geovisio/web/auth.py,sha256=-msYF5q2OUsa3rYH7H0vjclt6JEaPy9CHzjWmCCwZUU,7139
|
|
67
|
-
geovisio/web/collections.py,sha256=pt181nK3bTa1UYn9qpi3RBGH5h5I8VKMOb_Kfa-c-EU,46470
|
|
68
|
-
geovisio/web/configuration.py,sha256=tWZYxOoqI2MQwmuHk1I9J2DKzDqpLBVmWRDSsx18U7E,2177
|
|
69
|
-
geovisio/web/docs.py,sha256=RxMtyH_Urcr0YWPTZz1epMKr-iHRwRXBdRzgdhZzaWU,56054
|
|
70
|
-
geovisio/web/excluded_areas.py,sha256=5BNSZ0UqgFMtgvgrJ73eYGJXPJRnV-mGEs36WDRRxTk,13024
|
|
71
|
-
geovisio/web/items.py,sha256=1a_O5tes2NL4DHqDWsgJn_PQQYx4Ft6v4t7ibzkgtdw,61357
|
|
72
|
-
geovisio/web/map.py,sha256=DaigXevz4lL7WGjPFCsKbXvjdDevFj9gpH0-22JsJOI,25328
|
|
73
|
-
geovisio/web/pages.py,sha256=Hkc3KJFE6D38vGnkCK5WUBJ8KQemI1f1wGXpxeiOiNo,6632
|
|
74
|
-
geovisio/web/params.py,sha256=Ip2qFR2Z28OTP7Fe1EuineHKUMmlZ_u5dFW77MqdLD0,21071
|
|
75
|
-
geovisio/web/pictures.py,sha256=qbhgLsI6YtpFxXn1a3dzO66nnVrWglRZSXWmlfJr1tU,6394
|
|
76
|
-
geovisio/web/prepare.py,sha256=R10_xf6O9dmAAwOMC-vsaxgNTdc9BkDJLATqH6MKtCw,5620
|
|
77
|
-
geovisio/web/reports.py,sha256=8v9a4PMM9RsvSGadZEN2o5PTKG_TohjyMMEBfFeY13E,14123
|
|
78
|
-
geovisio/web/rss.py,sha256=NLUd2Or92tcKRaGUHAze6QMLWczHyzag9ybOzrA8djE,2962
|
|
79
|
-
geovisio/web/stac.py,sha256=1uoSUOgCxOdH4UQuUvt-0xJaPLtPcAD54WvQg0lvxwM,14850
|
|
80
|
-
geovisio/web/tokens.py,sha256=l7CAM0FQ6qAcoUhtIRysKc9Gndlji_wOMpkXLsPP1pI,9599
|
|
81
|
-
geovisio/web/upload_set.py,sha256=IkZrSosJ6LenqEsNFx4BOULZCUrcl8yIz_sO4B5xyeM,30671
|
|
82
|
-
geovisio/web/users.py,sha256=CB5fJxZyIUDtlQ-BKfV4zZtnlSGqgZehsMk2rlVTvHk,13038
|
|
83
|
-
geovisio/web/utils.py,sha256=kudTbV4Tgtkbd4oUWFTFpyWNINpxAa-VQNbxYEiR6pM,3640
|
|
84
|
-
geovisio/workers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
85
|
-
geovisio/workers/runner_pictures.py,sha256=Y4x345tp0Y3RAFnoYpcDhyg6dJS1OYx79XGGDIttcps,22898
|
|
86
|
-
geovisio-2.8.0.dist-info/LICENSE,sha256=iRFSz7MJ7_j4hh3hvIgzNbS2buy5NMva8lulaixd3IE,1069
|
|
87
|
-
geovisio-2.8.0.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
|
|
88
|
-
geovisio-2.8.0.dist-info/METADATA,sha256=xWj0uWtGYpQQ_Fmcp6XPd6MslTkeQHlVybq_7zSEjgs,4299
|
|
89
|
-
geovisio-2.8.0.dist-info/RECORD,,
|
|
File without changes
|