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.
Files changed (61) hide show
  1. geovisio/__init__.py +16 -3
  2. geovisio/config_app.py +11 -1
  3. geovisio/translations/br/LC_MESSAGES/messages.mo +0 -0
  4. geovisio/translations/br/LC_MESSAGES/messages.po +762 -0
  5. geovisio/translations/da/LC_MESSAGES/messages.mo +0 -0
  6. geovisio/translations/da/LC_MESSAGES/messages.po +10 -1
  7. geovisio/translations/de/LC_MESSAGES/messages.mo +0 -0
  8. geovisio/translations/de/LC_MESSAGES/messages.po +10 -1
  9. geovisio/translations/en/LC_MESSAGES/messages.mo +0 -0
  10. geovisio/translations/en/LC_MESSAGES/messages.po +9 -7
  11. geovisio/translations/eo/LC_MESSAGES/messages.mo +0 -0
  12. geovisio/translations/eo/LC_MESSAGES/messages.po +67 -1
  13. geovisio/translations/es/LC_MESSAGES/messages.mo +0 -0
  14. geovisio/translations/es/LC_MESSAGES/messages.po +4 -3
  15. geovisio/translations/fr/LC_MESSAGES/messages.mo +0 -0
  16. geovisio/translations/fr/LC_MESSAGES/messages.po +37 -4
  17. geovisio/translations/hu/LC_MESSAGES/messages.mo +0 -0
  18. geovisio/translations/hu/LC_MESSAGES/messages.po +4 -3
  19. geovisio/translations/it/LC_MESSAGES/messages.mo +0 -0
  20. geovisio/translations/it/LC_MESSAGES/messages.po +10 -1
  21. geovisio/translations/ja/LC_MESSAGES/messages.mo +0 -0
  22. geovisio/translations/ja/LC_MESSAGES/messages.po +242 -154
  23. geovisio/translations/nl/LC_MESSAGES/messages.mo +0 -0
  24. geovisio/translations/nl/LC_MESSAGES/messages.po +131 -25
  25. geovisio/translations/pl/LC_MESSAGES/messages.mo +0 -0
  26. geovisio/translations/pl/LC_MESSAGES/messages.po +4 -3
  27. geovisio/translations/sv/LC_MESSAGES/messages.mo +0 -0
  28. geovisio/translations/sv/LC_MESSAGES/messages.po +822 -0
  29. geovisio/utils/annotations.py +186 -0
  30. geovisio/utils/cql2.py +134 -0
  31. geovisio/utils/db.py +7 -0
  32. geovisio/utils/fields.py +24 -7
  33. geovisio/utils/loggers.py +14 -0
  34. geovisio/utils/model_query.py +2 -2
  35. geovisio/utils/params.py +7 -4
  36. geovisio/utils/pic_shape.py +63 -0
  37. geovisio/utils/pictures.py +54 -12
  38. geovisio/utils/reports.py +10 -17
  39. geovisio/utils/semantics.py +165 -55
  40. geovisio/utils/sentry.py +0 -1
  41. geovisio/utils/sequences.py +141 -60
  42. geovisio/utils/tags.py +31 -0
  43. geovisio/utils/upload_set.py +26 -21
  44. geovisio/utils/website.py +3 -0
  45. geovisio/web/annotations.py +205 -9
  46. geovisio/web/auth.py +3 -2
  47. geovisio/web/collections.py +49 -34
  48. geovisio/web/configuration.py +2 -1
  49. geovisio/web/docs.py +55 -16
  50. geovisio/web/items.py +55 -54
  51. geovisio/web/map.py +25 -13
  52. geovisio/web/params.py +11 -21
  53. geovisio/web/stac.py +19 -12
  54. geovisio/web/upload_set.py +92 -11
  55. geovisio/web/users.py +31 -4
  56. geovisio/workers/runner_pictures.py +71 -10
  57. {geovisio-2.8.0.dist-info → geovisio-2.9.0.dist-info}/METADATA +24 -22
  58. geovisio-2.9.0.dist-info/RECORD +98 -0
  59. {geovisio-2.8.0.dist-info → geovisio-2.9.0.dist-info}/WHEEL +1 -1
  60. geovisio-2.8.0.dist-info/RECORD +0 -89
  61. {geovisio-2.8.0.dist-info → geovisio-2.9.0.dist-info/licenses}/LICENSE +0 -0
@@ -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
- def create_upload_set(params: UploadSetCreationParameter, accountId: UUID) -> UploadSet:
72
- params_as_dict = params.model_dump(exclude_none=True) | {"account_id": accountId}
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
- fields = [SQL(f) for f in params_as_dict.keys()] # type: ignore (we can ignore psycopg types there as we control those keys since they are the attributes of UploadSetCreationParameter)
75
- values = [SQL(f"%({f})s") for f in params_as_dict.keys()] # type: ignore
76
- for k, v in params_as_dict.items():
77
- if isinstance(v, Dict):
78
- params_as_dict[k] = Jsonb(v) # convert dict to jsonb in database
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=SQL(", ").join(fields), values=SQL(", ").join(values)
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 sequence in database")
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 redirect, request, current_app, session, url_for
4
+ from flask import request, current_app, session, url_for
5
5
  from flask_babel import gettext as _
6
- from pydantic import BaseModel, Field, ValidationError, computed_field
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
- user_info.tos_accepted = account.tos_accepted
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
- picture = utils.pictures.createBlurredHDPicture(
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
- log.exception(f"impossible to blur picture {pic.id}")
151
- raise RecoverableProcessException("Blur API failure: " + errors.getMessageFromException(e)) from e
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] > PROCESS_MAX_RETRY:
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.3
1
+ Metadata-Version: 2.4
2
2
  Name: geovisio
3
- Version: 2.8.0
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
- Requires-Dist: Flask ~= 2.3
10
- Requires-Dist: psycopg[pool] ~= 3.1
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 ~= 9.4
13
- Requires-Dist: Flask-Cors ~= 4.0
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.3
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 ~= 8.2
19
- Requires-Dist: psycopg-binary ~= 3.1
20
- Requires-Dist: python-dotenv ~= 0.21
21
- Requires-Dist: authlib ~= 1.2
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] ~= 1.31
26
- Requires-Dist: pygeofilter[backend-native] ~= 0.2.4
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 ~= 2024.1
29
- Requires-Dist: croniter ~= 2.0.5
30
- Requires-Dist: pydantic ~= 2.7
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.1.0
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 ~= 6.5 ; extra == "dev"
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 ~= 24.1 ; extra == "dev"
46
- Requires-Dist: pre-commit ~= 3.3 ; extra == "dev"
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.5.21 ; extra == "docs"
51
- Requires-Dist: mkdocs-swagger-ui-tag ~= 0.6.10 ; extra == "docs"
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,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: flit 3.10.1
2
+ Generator: flit 3.12.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -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,,