geovisio 2.9.0__py3-none-any.whl → 2.10.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 (65) hide show
  1. geovisio/__init__.py +6 -1
  2. geovisio/config_app.py +5 -5
  3. geovisio/translations/ar/LC_MESSAGES/messages.mo +0 -0
  4. geovisio/translations/ar/LC_MESSAGES/messages.po +818 -0
  5. geovisio/translations/br/LC_MESSAGES/messages.po +1 -1
  6. geovisio/translations/da/LC_MESSAGES/messages.mo +0 -0
  7. geovisio/translations/da/LC_MESSAGES/messages.po +4 -3
  8. geovisio/translations/de/LC_MESSAGES/messages.mo +0 -0
  9. geovisio/translations/de/LC_MESSAGES/messages.po +55 -2
  10. geovisio/translations/el/LC_MESSAGES/messages.po +1 -1
  11. geovisio/translations/en/LC_MESSAGES/messages.mo +0 -0
  12. geovisio/translations/en/LC_MESSAGES/messages.po +193 -139
  13. geovisio/translations/eo/LC_MESSAGES/messages.mo +0 -0
  14. geovisio/translations/eo/LC_MESSAGES/messages.po +53 -4
  15. geovisio/translations/es/LC_MESSAGES/messages.po +1 -1
  16. geovisio/translations/fi/LC_MESSAGES/messages.po +1 -1
  17. geovisio/translations/fr/LC_MESSAGES/messages.mo +0 -0
  18. geovisio/translations/fr/LC_MESSAGES/messages.po +91 -3
  19. geovisio/translations/hu/LC_MESSAGES/messages.po +1 -1
  20. geovisio/translations/it/LC_MESSAGES/messages.mo +0 -0
  21. geovisio/translations/it/LC_MESSAGES/messages.po +63 -3
  22. geovisio/translations/ja/LC_MESSAGES/messages.po +1 -1
  23. geovisio/translations/ko/LC_MESSAGES/messages.po +1 -1
  24. geovisio/translations/messages.pot +185 -129
  25. geovisio/translations/nl/LC_MESSAGES/messages.mo +0 -0
  26. geovisio/translations/nl/LC_MESSAGES/messages.po +292 -63
  27. geovisio/translations/oc/LC_MESSAGES/messages.mo +0 -0
  28. geovisio/translations/oc/LC_MESSAGES/messages.po +818 -0
  29. geovisio/translations/pl/LC_MESSAGES/messages.po +1 -1
  30. geovisio/translations/sv/LC_MESSAGES/messages.mo +0 -0
  31. geovisio/translations/sv/LC_MESSAGES/messages.po +4 -3
  32. geovisio/translations/ti/LC_MESSAGES/messages.mo +0 -0
  33. geovisio/translations/ti/LC_MESSAGES/messages.po +762 -0
  34. geovisio/translations/zh_Hant/LC_MESSAGES/messages.po +1 -1
  35. geovisio/utils/annotations.py +14 -17
  36. geovisio/utils/auth.py +14 -13
  37. geovisio/utils/cql2.py +2 -2
  38. geovisio/utils/fields.py +14 -2
  39. geovisio/utils/items.py +44 -0
  40. geovisio/utils/model_query.py +2 -2
  41. geovisio/utils/pic_shape.py +1 -1
  42. geovisio/utils/pictures.py +111 -18
  43. geovisio/utils/semantics.py +32 -3
  44. geovisio/utils/sentry.py +1 -1
  45. geovisio/utils/sequences.py +51 -34
  46. geovisio/utils/upload_set.py +285 -198
  47. geovisio/utils/website.py +1 -1
  48. geovisio/web/annotations.py +209 -68
  49. geovisio/web/auth.py +1 -1
  50. geovisio/web/collections.py +26 -22
  51. geovisio/web/configuration.py +24 -4
  52. geovisio/web/docs.py +93 -11
  53. geovisio/web/items.py +197 -121
  54. geovisio/web/params.py +44 -31
  55. geovisio/web/pictures.py +34 -0
  56. geovisio/web/tokens.py +49 -1
  57. geovisio/web/upload_set.py +150 -32
  58. geovisio/web/users.py +4 -4
  59. geovisio/web/utils.py +2 -2
  60. geovisio/workers/runner_pictures.py +128 -23
  61. {geovisio-2.9.0.dist-info → geovisio-2.10.0.dist-info}/METADATA +13 -13
  62. geovisio-2.10.0.dist-info/RECORD +105 -0
  63. geovisio-2.9.0.dist-info/RECORD +0 -98
  64. {geovisio-2.9.0.dist-info → geovisio-2.10.0.dist-info}/WHEEL +0 -0
  65. {geovisio-2.9.0.dist-info → geovisio-2.10.0.dist-info}/licenses/LICENSE +0 -0
@@ -17,7 +17,7 @@ from typing import Any, Dict, Optional
17
17
  import threading
18
18
  from uuid import UUID
19
19
  from croniter import croniter
20
- from datetime import datetime, timezone
20
+ from datetime import datetime, timezone, timedelta
21
21
  import geovisio.utils.filesystems
22
22
 
23
23
  log = logging.getLogger("geovisio.runner_pictures")
@@ -58,6 +58,7 @@ class ProcessTask(str, Enum):
58
58
  delete = "delete"
59
59
  dispatch = "dispatch"
60
60
  finalize = "finalize"
61
+ read_metadata = "read_metadata"
61
62
 
62
63
 
63
64
  @dataclass
@@ -65,6 +66,7 @@ class DbPicture:
65
66
  id: UUID
66
67
  metadata: dict
67
68
  skip_blurring: bool
69
+ orientation: str
68
70
 
69
71
  def blurred_by_author(self):
70
72
  return self.metadata.get("blurredByAuthor", False)
@@ -90,6 +92,8 @@ class DbJob:
90
92
  seq: Optional[DbSequence]
91
93
 
92
94
  task: ProcessTask
95
+ args: Optional[Dict[Any, Any]] = None
96
+ warning: Optional[str] = None
93
97
 
94
98
  def label(self):
95
99
  impacted_object = ""
@@ -105,7 +109,7 @@ class DbJob:
105
109
  return f"{self.task} for {impacted_object}"
106
110
 
107
111
 
108
- def store_detection_semantics(pic: DbPicture, metadata: Dict[str, Any], store_id: bool):
112
+ def store_detection_semantics(job: DbJob, metadata: Dict[str, Any], store_id: bool):
109
113
  """store the detection returned by the blurring API in the database.
110
114
 
111
115
  The semantics part is stored as annotations, linked to the default account.
@@ -120,13 +124,13 @@ def store_detection_semantics(pic: DbPicture, metadata: Dict[str, Any], store_id
120
124
 
121
125
  tags = metadata.pop("annotations", [])
122
126
 
123
- with db.conn(current_app) as conn, conn.cursor() as cursor:
127
+ with job.reporting_conn.cursor() as cursor:
124
128
  blurring_id = metadata.get("blurring_id")
125
129
  if blurring_id and store_id:
126
130
  # we store the blurring id to be able to unblur the picture later
127
131
  cursor.execute(
128
132
  "UPDATE pictures SET blurring_id = %(blurring_id)s WHERE id = %(id)s",
129
- {"blurring_id": blurring_id, "id": pic.id},
133
+ {"blurring_id": blurring_id, "id": job.pic.id},
130
134
  )
131
135
 
132
136
  if not tags:
@@ -140,21 +144,48 @@ def store_detection_semantics(pic: DbPicture, metadata: Dict[str, Any], store_id
140
144
  # we want to remove all the tags added by the same bluring api previously
141
145
  # it's especially usefull when a picture is blurred multiple times
142
146
  # 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)
147
+ semantics.delete_annotation_tags_from_service(job.reporting_conn, job.pic.id, service_name="SGBlur", account=default_account_id)
144
148
  try:
145
149
  annotations_to_create = [
146
- annotations.AnnotationCreationParameter(**t, account_id=default_account_id, picture_id=pic.id) for t in tags
150
+ annotations.AnnotationCreationParameter(**t, account_id=default_account_id, picture_id=job.pic.id) for t in tags
147
151
  ]
152
+ for a in annotations_to_create:
153
+ annotations.creation_annotation(a, job.reporting_conn)
148
154
  except Exception as e:
149
155
  # if the detections are not in the correct format, we skip them
150
156
  msg = errors.getMessageFromException(e)
151
- log.error(f"impossible to save blurring detections, skipping it for picture {pic.id}: {msg}")
157
+ if hasattr(e, "payload"):
158
+ msg += f": {e.payload}"
159
+ log.error(f"impossible to save blurring detections, skipping it for picture {job.pic.id}: {msg}")
160
+ job.warning = msg
161
+
162
+
163
+ def update_picture_orientation(conn: psycopg.Connection, db_pic: DbPicture, picturePillow: Image):
164
+ """if the picture is side oriented, we need to check if the blurring API has rotated the picture, and update its size"""
165
+ if db_pic.orientation not in ("6", "8"):
152
166
  return
153
- for a in annotations_to_create:
154
- annotations.creation_annotation(a)
167
+
168
+ new_size = utils.pictures.getPictureSizing(picturePillow)
169
+ if new_size["width"] != db_pic.metadata["width"] or new_size["height"] != db_pic.metadata["height"]:
170
+ with conn.cursor() as cursor:
171
+ # update the new X/Y dimensions and reset the orientation, to tell that it's no longer side oriented
172
+ cursor.execute(
173
+ """UPDATE pictures SET
174
+ exif = exif - 'Exif.Image.Orientation' || jsonb_build_object('Exif.Photo.PixelXDimension', %(width)s, 'Exif.Photo.PixelYDimension', %(height)s),
175
+ metadata = metadata || jsonb_build_object('width', %(width)s, 'height', %(height)s, 'cols', %(cols)s, 'rows', %(rows)s)
176
+ WHERE id = %(id)s
177
+ """,
178
+ {
179
+ "width": new_size["width"],
180
+ "height": new_size["height"],
181
+ "id": db_pic.id,
182
+ "cols": new_size["cols"],
183
+ "rows": new_size["rows"],
184
+ },
185
+ )
155
186
 
156
187
 
157
- def processPictureFiles(pic: DbPicture, config):
188
+ def processPictureFiles(job: DbJob, config):
158
189
  """Generates the files associated with a sequence picture.
159
190
 
160
191
  If needed the image is blurred before the tiles and thumbnail are generated.
@@ -168,6 +199,7 @@ def processPictureFiles(pic: DbPicture, config):
168
199
  config : dict
169
200
  Flask app.config (passed as param to allow using ThreadPoolExecutor)
170
201
  """
202
+ pic = job.pic
171
203
  skipBlur = pic.skip_blurring or config.get("API_BLUR_URL") is None
172
204
  fses = config["FILESYSTEMS"]
173
205
  fs = fses.permanent if skipBlur else fses.tmp
@@ -206,8 +238,12 @@ def processPictureFiles(pic: DbPicture, config):
206
238
  picture = None
207
239
  else:
208
240
  picture = res.image
241
+
242
+ if pic.orientation in ("6", "8"):
243
+ update_picture_orientation(job.reporting_conn, pic, picture)
244
+
209
245
  if res.metadata:
210
- store_detection_semantics(pic, res.metadata, store_id=config["PICTURE_PROCESS_KEEP_UNBLURRED_PARTS"])
246
+ store_detection_semantics(job, res.metadata, store_id=config["PICTURE_PROCESS_KEEP_UNBLURRED_PARTS"])
211
247
 
212
248
  # Delete original unblurred file
213
249
  geovisio.utils.filesystems.removeFsEvenNotFound(fses.tmp, picHdPath)
@@ -287,7 +323,9 @@ class PictureProcessor:
287
323
  if self.app.pool.closed and self.stop:
288
324
  # in some tests, the pool is closed before the worker is stopped, we check this here
289
325
  return
290
- self.check_periodic_tasks()
326
+ if not self.stop:
327
+ # periodic tasks are only checked by permanent workers
328
+ self.check_periodic_tasks()
291
329
  r = process_next_job(self.app)
292
330
  if not r:
293
331
  if self.stop:
@@ -308,7 +346,7 @@ class PictureProcessor:
308
346
  signal.signal(signal.SIGTERM, self._graceful_shutdown)
309
347
 
310
348
  def _graceful_shutdown(self, *args):
311
- log.info("Stoping worker, waiting for last picture processing to finish...")
349
+ log.info("Stopping worker, waiting for last picture processing to finish...")
312
350
  self.stop = True
313
351
 
314
352
  def check_periodic_tasks(self):
@@ -364,16 +402,19 @@ def process_next_job(app):
364
402
  span.set_data("pic_id", job.pic.id)
365
403
  with utils.time.log_elapsed(f"Processing picture {job.pic.id}"):
366
404
  # open another connection for reporting and queries
367
- processPictureFiles(job.pic, app.config)
405
+ processPictureFiles(job, app.config)
368
406
  elif job.task == ProcessTask.delete and job.pic:
369
407
  with sentry_sdk.start_span(description="Deleting picture") as span:
370
408
  span.set_data("pic_id", job.pic.id)
371
409
  with utils.time.log_elapsed(f"Deleting picture {job.pic.id}"):
372
- _delete_picture(job.pic)
410
+ _delete_picture(job.reporting_conn, job.pic)
411
+ elif job.task == ProcessTask.read_metadata and job.pic:
412
+ with utils.time.log_elapsed(f"Reading metadata of picture {job.pic.id}"):
413
+ _read_picture_metadata(job.pic, **(job.args or {}))
373
414
  elif job.task == ProcessTask.dispatch and job.upload_set:
374
415
  with utils.time.log_elapsed(f"Dispatching upload set {job.upload_set.id}"):
375
416
  try:
376
- upload_set.dispatch(job.upload_set.id)
417
+ upload_set.dispatch(job.reporting_conn, job.upload_set.id)
377
418
  except Exception as e:
378
419
  log.exception(f"impossible to dispatch upload set {job.upload_set.id}")
379
420
  raise RecoverableProcessException("Upload set dispatch error: " + errors.getMessageFromException(e)) from e
@@ -399,7 +440,7 @@ def _get_next_job(app):
399
440
  with app.pool.connection() as locking_transaction:
400
441
  with locking_transaction.transaction(), locking_transaction.cursor(row_factory=dict_row) as cursor:
401
442
  r = cursor.execute(
402
- """SELECT j.id, j.picture_id, j.upload_set_id, j.sequence_id, j.task, j.picture_to_delete_id, p.metadata, j.args
443
+ """SELECT j.id, j.picture_id, j.upload_set_id, j.sequence_id, j.task, j.picture_to_delete_id, p.metadata, j.args, p.exif->'Exif.Image.Orientation' as orientation
403
444
  FROM job_queue j
404
445
  LEFT JOIN pictures p ON p.id = j.picture_id
405
446
  ORDER by
@@ -418,7 +459,12 @@ def _get_next_job(app):
418
459
  # (and it will not a foreign key since the picture's row will already have been deleted from the db)
419
460
  pic_id = r["picture_id"] or r["picture_to_delete_id"]
420
461
  db_pic = (
421
- DbPicture(id=pic_id, metadata=r["metadata"], skip_blurring=(r["args"] or {}).get("skip_blurring", False))
462
+ DbPicture(
463
+ id=pic_id,
464
+ metadata=r["metadata"],
465
+ skip_blurring=(r["args"] or {}).get("skip_blurring", False),
466
+ orientation=r["orientation"],
467
+ )
422
468
  if pic_id is not None
423
469
  else None
424
470
  )
@@ -466,7 +512,7 @@ def _get_next_job(app):
466
512
  _finalize_sequence(job)
467
513
  error = e
468
514
 
469
- # we raise an error after the transaction has been comited to be sure to have the state persisted in the database
515
+ # we raise an error after the transaction has been committed to be sure to have the state persisted in the database
470
516
  if error:
471
517
  raise error
472
518
 
@@ -507,9 +553,16 @@ def _finalize_job(conn, job: DbJob):
507
553
  f"The job {job.job_history_id} ({job.label()}) has likely been deleted during the process (it can happen if the picture/upload_set/sequence has been deleted by another process), we don't need to finalize it"
508
554
  )
509
555
  return
556
+
557
+ params = {"id": job.job_history_id}
558
+ fields = [SQL("finished_at = CURRENT_TIMESTAMP")]
559
+ if job.warning:
560
+ fields.append(SQL("warning = %(warn)s"))
561
+ params["warn"] = job.warning
562
+
510
563
  job.reporting_conn.execute(
511
- "UPDATE job_history SET finished_at = CURRENT_TIMESTAMP WHERE id = %(id)s",
512
- {"id": job.job_history_id},
564
+ SQL("UPDATE job_history SET {fields} WHERE id = %(id)s").format(fields=SQL(", ").join(fields)),
565
+ params,
513
566
  )
514
567
  if job.task == ProcessTask.prepare and job.pic:
515
568
  # Note: the status is slowly been deprecated by replacing it with more precise status, and in the end it will be removed
@@ -544,7 +597,7 @@ def _initialize_job(
544
597
  "pic_to_delete": db_pic.id if db_pic and task == ProcessTask.delete else None,
545
598
  "us_id": db_upload_set.id if db_upload_set else None,
546
599
  "task": task.value,
547
- "args": Jsonb(args),
600
+ "args": Jsonb(args) if args else None,
548
601
  },
549
602
  ).fetchone()
550
603
 
@@ -559,6 +612,7 @@ def _initialize_job(
559
612
  upload_set=db_upload_set,
560
613
  task=task,
561
614
  job_history_id=r[0],
615
+ args=args,
562
616
  )
563
617
 
564
618
 
@@ -608,7 +662,58 @@ def _mark_process_as_error(
608
662
  conn.execute("DELETE FROM job_queue WHERE id = %(id)s", {"id": job.job_queue_id})
609
663
 
610
664
 
611
- def _delete_picture(pic: DbPicture):
665
+ def _delete_picture(conn: psycopg.Connection, pic: DbPicture):
612
666
  """Delete a picture from the filesystem"""
613
667
  log.debug(f"Deleting picture files {pic.id}")
668
+
669
+ def check_if_no_workers_preparing():
670
+ try:
671
+ # We try to check if there at some workers preparing this picture, if it's the case, we wait a bit and retry.
672
+ # after some time, if the lock is still not released, we raise a RetryLaterProcessException, to reschedule the whole job later
673
+ conn.execute(
674
+ "SELECT id FROM job_queue WHERE picture_id = %(id)s and task = 'prepare' FOR UPDATE NOWAIT",
675
+ {"id": pic.id},
676
+ )
677
+ return True
678
+ except psycopg.errors.LockNotAvailable:
679
+ logging.debug(f"The picture {pic.id} is being processed, we'll retry later")
680
+ return False
681
+
682
+ _retry_for(check_if_no_workers_preparing, error=f"Picture {pic.id} is being processed")
683
+
684
+ # Delete the row if needed (note that it can have already been deleted (for example if a whole upload_set has been deleted, the `ON DELETE CASCADE` deletes all the pictures's row (but the files still need to be deleted)))
685
+ conn.execute("DELETE FROM pictures WHERE id = %(id)s", {"id": pic.id})
686
+
614
687
  utils.pictures.removeAllFiles(pic.id)
688
+
689
+
690
+ def _retry_for(func, error, timeout=timedelta(minutes=1), sleep=timedelta(seconds=5)):
691
+ import time
692
+
693
+ cur_duration = timedelta(seconds=0)
694
+ while cur_duration < timeout:
695
+ r = func()
696
+ if r:
697
+ return
698
+ cur_duration += sleep
699
+ time.sleep(sleep.total_seconds())
700
+
701
+ raise RetryLaterProcessException(error)
702
+
703
+
704
+ def _read_picture_metadata(picture: DbPicture, read_file=False):
705
+ """Reread the picture metadata.
706
+
707
+ Normally the picture's metadata are read during upload, but sometimes (mainly when the geopic-tag-reader library has been updated),
708
+ we need to read the metadata again.
709
+
710
+ Parameters
711
+ ----------
712
+ picture_id : UUID
713
+ The ID of the picture to read the metadata from
714
+ read_file : bool
715
+ If True, the picture's raw metadata will be read again, else the Exif tools stored in the database will be used (way faster).
716
+ """
717
+
718
+ with db.conn(current_app) as conn:
719
+ utils.pictures.update_picture_metadata(conn, picture.id, read_file)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: geovisio
3
- Version: 2.9.0
3
+ Version: 2.10.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
@@ -11,7 +11,7 @@ Requires-Dist: Flask ~= 3.1
11
11
  Requires-Dist: psycopg[pool] ~= 3.2
12
12
  Requires-Dist: flasgger ~= 0.9.7
13
13
  Requires-Dist: Pillow ~= 11.1
14
- Requires-Dist: Flask-Cors ~= 5.0
14
+ Requires-Dist: Flask-Cors ~= 6.0
15
15
  Requires-Dist: fs ~= 2.4
16
16
  Requires-Dist: fs-s3fs-forked ~= 1.1.4
17
17
  Requires-Dist: flask-compress ~= 1.14
@@ -19,9 +19,9 @@ Requires-Dist: requests ~= 2.31
19
19
  Requires-Dist: yoyo-migrations ~= 9.0
20
20
  Requires-Dist: psycopg-binary ~= 3.2
21
21
  Requires-Dist: python-dotenv ~= 1.1
22
- Requires-Dist: authlib ~= 1.5
22
+ Requires-Dist: authlib ~= 1.6
23
23
  Requires-Dist: Flask-Executor ~= 1.0
24
- Requires-Dist: geopic-tag-reader[write-exif] == 1.4.2
24
+ Requires-Dist: geopic-tag-reader[write-exif] ~= 1.8.0
25
25
  Requires-Dist: rfeed ~= 1.1.1
26
26
  Requires-Dist: sentry-sdk[flask] ~= 2.24
27
27
  Requires-Dist: pygeofilter[backend-native] ~= 0.3.1
@@ -31,26 +31,26 @@ Requires-Dist: croniter ~= 6.0.0
31
31
  Requires-Dist: pydantic ~= 2.11
32
32
  Requires-Dist: pydantic-extra-types ~= 2.7
33
33
  Requires-Dist: flask-babel ~= 4.0.0
34
- Requires-Dist: geojson-pydantic ~= 1.2.0
34
+ Requires-Dist: geojson-pydantic ~= 2.0.0
35
35
  Requires-Dist: email-validator ~= 2.2.0
36
36
  Requires-Dist: multipart>=1.2.1
37
37
  Requires-Dist: flit ~= 3.9.0 ; extra == "build"
38
- Requires-Dist: coverage ~= 7.7 ; extra == "dev"
39
- Requires-Dist: protobuf ~= 4.21 ; extra == "dev"
40
- Requires-Dist: mapbox-vector-tile ~= 2.0 ; extra == "dev"
38
+ Requires-Dist: coverage ~= 7.9 ; extra == "dev"
39
+ Requires-Dist: protobuf ~= 5.26 ; extra == "dev"
40
+ Requires-Dist: mapbox-vector-tile ~= 2.1 ; extra == "dev"
41
41
  Requires-Dist: pystac ~= 1.9 ; extra == "dev"
42
- Requires-Dist: pytest ~= 8.3 ; extra == "dev"
43
- Requires-Dist: pytest-datafiles ~= 2.0 ; extra == "dev"
42
+ Requires-Dist: pytest ~= 8.4 ; extra == "dev"
43
+ Requires-Dist: pytest-datafiles ~= 3.0 ; extra == "dev"
44
44
  Requires-Dist: pyexiv2 ~= 2.15 ; extra == "dev"
45
- Requires-Dist: testcontainers ~= 4.1 ; extra == "dev"
45
+ Requires-Dist: testcontainers ~= 4.10 ; extra == "dev"
46
46
  Requires-Dist: requests-mock ~= 1.11 ; extra == "dev"
47
47
  Requires-Dist: black ~= 25.1 ; extra == "dev"
48
48
  Requires-Dist: pre-commit ~= 4.2 ; extra == "dev"
49
49
  Requires-Dist: pyyaml ~= 6.0 ; extra == "dev"
50
50
  Requires-Dist: openapi-spec-validator ~= 0.7 ; extra == "dev"
51
51
  Requires-Dist: stac-api-validator ~= 0.6.4 ; extra == "dev"
52
- Requires-Dist: mkdocs-material ~= 9.6.9 ; extra == "docs"
53
- Requires-Dist: mkdocs-swagger-ui-tag ~= 0.6.11 ; extra == "docs"
52
+ Requires-Dist: mkdocs-material ~= 9.6.14 ; extra == "docs"
53
+ Requires-Dist: mkdocs-swagger-ui-tag ~= 0.7.1 ; extra == "docs"
54
54
  Project-URL: Home, https://gitlab.com/panoramax/server/api
55
55
  Project-URL: Source Code, https://gitlab.com/panoramax/server/api
56
56
  Provides-Extra: build
@@ -0,0 +1,105 @@
1
+ geovisio/__init__.py,sha256=LcHU6JLcjjGDdaFgc83jbxUV_Zc8YXUkD_dIBA7u-nQ,7952
2
+ geovisio/config_app.py,sha256=cS4TtW7ESy5jeaHi_9neJYWwA21VBNNrh4IDgf2iMmI,14848
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=zSzcuOQtONiGQrZE2hRkrB7thd5UGyC41dox867kV88,20827
15
+ geovisio/translations/ar/LC_MESSAGES/messages.mo,sha256=2OvIx-hvvhBbjXvVhc5MaQ-0QnzTWISmNeb4vPthffM,516
16
+ geovisio/translations/ar/LC_MESSAGES/messages.po,sha256=WcdpU3LH1Qf39WiIXQ8UMy1SyL7DHiWCbv0BVG_crW4,20816
17
+ geovisio/translations/br/LC_MESSAGES/messages.mo,sha256=FjvUouzaLCBxvVH51A4PVwGGFk6mAepYasnI4v8LcnQ,719
18
+ geovisio/translations/br/LC_MESSAGES/messages.po,sha256=tGJK1DoeKM-fRHuGa716xHkYtprVoKSNcB4oIqL0JtY,19433
19
+ geovisio/translations/da/LC_MESSAGES/messages.mo,sha256=ketqWtB3ymB0tUaHEp2_nnqFrRX25pwuE2AcCno9W-Q,21197
20
+ geovisio/translations/da/LC_MESSAGES/messages.po,sha256=af7uax57NEw_JFNO11lFKGPGYJ05bOQCGryw15wP8Ms,29397
21
+ geovisio/translations/de/LC_MESSAGES/messages.mo,sha256=4YJijXlC1Dix39oX6CxNYd0J6k-I4AFx5jXyZq7Jib4,24359
22
+ geovisio/translations/de/LC_MESSAGES/messages.po,sha256=6S7rJpu7qfq78_YwZ9M5ueF4-TpvlZmF14b13g_aF8Y,33121
23
+ geovisio/translations/el/LC_MESSAGES/messages.mo,sha256=vy1jtEG6mLS5sYWPfQIr5U4XsZ21ZzSbsHAJHGQXZSY,433
24
+ geovisio/translations/el/LC_MESSAGES/messages.po,sha256=kIz9QJr_GPk_Eh7bJ2vxjsFbIGyvt_-hwra0zVlupyM,17404
25
+ geovisio/translations/en/LC_MESSAGES/messages.mo,sha256=i7HmGj2_mAgGDV9b5dZwSNawx7WNlVBqV5T5uXVl8ok,21397
26
+ geovisio/translations/en/LC_MESSAGES/messages.po,sha256=KD-Fq-gCywKcQnBw7B-Rhfk0s2-xAraXiBqUEPmNjNo,29920
27
+ geovisio/translations/eo/LC_MESSAGES/messages.mo,sha256=AdSbZMS6Fj10_w5dQVpgLgjfs32EHw5m87eTp0IaFmo,22387
28
+ geovisio/translations/eo/LC_MESSAGES/messages.po,sha256=0vgsW6aWR0xUZptAym4HyO8pQh1yEShbojurjZvp0nU,30954
29
+ geovisio/translations/es/LC_MESSAGES/messages.mo,sha256=R5JmcfauTrQxIynQNT7asjdLEJC9-VEMXYrcugfBbsY,18950
30
+ geovisio/translations/es/LC_MESSAGES/messages.po,sha256=sn3UQXBk6pg7ny4ndaPxbvZzTBzNFQBsmJY2lJxTXFQ,26779
31
+ geovisio/translations/fi/LC_MESSAGES/messages.mo,sha256=6-WCesFiV00MkNM_Wpi7-D51DOZRNg_QOM2sL7-UPhA,626
32
+ geovisio/translations/fi/LC_MESSAGES/messages.po,sha256=AS-VBD2kM0lXQXCvMu_CqaPxGtZj1uzkJJV8ex7coVU,14684
33
+ geovisio/translations/fr/LC_MESSAGES/messages.mo,sha256=i1RnE28Jom-bzN6lzf6qO8AuXpJ5bTNLjerwU2P1y34,25063
34
+ geovisio/translations/fr/LC_MESSAGES/messages.po,sha256=Q_VNX6EdCjwilbptnB4PaWJToPMZ0NkxtXXYfCESpzY,33759
35
+ geovisio/translations/hu/LC_MESSAGES/messages.mo,sha256=0Hb7mv7p1BVM8QqZIYUtF3LRym8Sl9HFWfZAa00TobU,20013
36
+ geovisio/translations/hu/LC_MESSAGES/messages.po,sha256=HudkPHKwEdCoY-vwCtSilSqPe88jcDIn8_hF6U6CThg,27493
37
+ geovisio/translations/it/LC_MESSAGES/messages.mo,sha256=8vLUUFP157568oUM25eft0UJtA6AcTTUykRNZ-WiQpc,24087
38
+ geovisio/translations/it/LC_MESSAGES/messages.po,sha256=uMme7kN5KJobxs2J611WG-jEuxVCt9G6IjCRzmRyJZo,32828
39
+ geovisio/translations/ja/LC_MESSAGES/messages.mo,sha256=ZPHJrNdf4bgiNFjxP8W41fkZ2OTJ7Swrqt-Hkh5LfO8,24194
40
+ geovisio/translations/ja/LC_MESSAGES/messages.po,sha256=JWjqZnlmM_decqpVrFAc79sV3yIxAF9nkGSiB5ocZtU,32626
41
+ geovisio/translations/ko/LC_MESSAGES/messages.mo,sha256=eKuQS9zLcJ9s-DzbfR-QK2INBJL10jTIQ1kuSTdJ9Rg,426
42
+ geovisio/translations/ko/LC_MESSAGES/messages.po,sha256=Bdj_LmU69MWZCmajgCm_QNxlKETmN8jzaJnmemuftHg,17404
43
+ geovisio/translations/nl/LC_MESSAGES/messages.mo,sha256=ZSjPgkgVdFD1EU39I9MvbS0WmCz_GiZb-gS-GbbiEWg,22878
44
+ geovisio/translations/nl/LC_MESSAGES/messages.po,sha256=dUg-xm7cr6yL1eKITjNJQBLPxgkQYE_34H1EgNrOQ6c,32005
45
+ geovisio/translations/oc/LC_MESSAGES/messages.mo,sha256=zaKy9mleHCTWd7rLFV2Ced4KvdD-rZhxVafQEIBuQnY,433
46
+ geovisio/translations/oc/LC_MESSAGES/messages.po,sha256=-sLU4ULuSarTqt26XCq5xU6pwTTr_xGpcogmYnb7xqI,20816
47
+ geovisio/translations/pl/LC_MESSAGES/messages.mo,sha256=0iFTAhma7jjyl13DCLr2Xr0hgDSN-_fOqcKoYcdDwGE,9912
48
+ geovisio/translations/pl/LC_MESSAGES/messages.po,sha256=p2SV3x0LvOJFT41eaJ0_p1COHt78N2AiZoQhbwJS98k,22186
49
+ geovisio/translations/sv/LC_MESSAGES/messages.mo,sha256=k7Ssr8tax43wmVy_wVsL5oM03qykV0WeG8-ClxkSZoE,20659
50
+ geovisio/translations/sv/LC_MESSAGES/messages.po,sha256=yglWtKCyLiivuMfKI-ret2GLs98aRYaAOvk6YTCBkO4,28760
51
+ geovisio/translations/ti/LC_MESSAGES/messages.mo,sha256=YeCBuScoL_qi-ZSA4v2O-h0PxKWjRWDgh_de3sJaUas,433
52
+ geovisio/translations/ti/LC_MESSAGES/messages.po,sha256=4Oju5eWJkD3DxjKoOseSr4geWPnZ8iOUIZR8ApvYyPc,19433
53
+ geovisio/translations/zh_Hant/LC_MESSAGES/messages.mo,sha256=TmRUyfTGoBpU-2BE-nKjhwdr9r0ikDioVQU-JQ_ih90,431
54
+ geovisio/translations/zh_Hant/LC_MESSAGES/messages.po,sha256=HcorbHk7OpRWL6v3oEiWxeifaentdF5xgcY_oFAOGEI,18356
55
+ geovisio/utils/__init__.py,sha256=g4SWVoV73cSXjf5-5D9-HmyB5xKmHSuxxOGWnx7W3V0,71
56
+ geovisio/utils/annotations.py,sha256=vLP6YRJgqFUfGHvX9qQabBduMaHGLWiivEk8YH9fdEA,6884
57
+ geovisio/utils/auth.py,sha256=WDwllPHp7WI38SilT2mf29IinRsPR5nnbBVxGjYKkQQ,13934
58
+ geovisio/utils/cql2.py,sha256=42igfsnpTAW8Ee70uvq7wAeTrDZ9JwDyIOWJuV_hkDI,4720
59
+ geovisio/utils/db.py,sha256=cxetPL-URdeOxmDMPwxKovB93yQYLNlOL8UHvP4DHg0,2856
60
+ geovisio/utils/excluded_areas.py,sha256=6f3wwsgNpJKxAXnHH8RKlktgHpsG-0QVNTWDDTFqPZ8,2585
61
+ geovisio/utils/extent.py,sha256=vzOHvbG6lpSNt7KrsaonBOx7Tz46S1J603gLbZvs36g,557
62
+ geovisio/utils/fields.py,sha256=Q1o3_eSo66UAyFdmhK2kz-drVWnHA2cbvWCZ5eP0fPk,3475
63
+ geovisio/utils/filesystems.py,sha256=W_wH7TlvdEux_q4FP0XInxruxlbepFSEpJbPLO9Cnr4,4133
64
+ geovisio/utils/items.py,sha256=8-F9zYmcFzrXCtQyWqZhXvojV34RC-aw1d9d9MbxXkc,1557
65
+ geovisio/utils/link.py,sha256=u9x4xJa57L1448neD7uPJuAA76_sFXVE0-9_zPW-bJM,490
66
+ geovisio/utils/loggers.py,sha256=_OrGXME4o5qQz8VBaLxYopHVK0DY0QgzXu6O2W0WBjo,477
67
+ geovisio/utils/model_query.py,sha256=Rdd0_mWJp5nmABVNzzVapaai413PxjgMzmo9NjjUrmI,2074
68
+ geovisio/utils/params.py,sha256=Yj9-PwC8jxb9LjQZ5K8TERimSsWKwJBHPhUxlzDVMhg,714
69
+ geovisio/utils/pic_shape.py,sha256=1HVlhgxNDtGpSFumL_GUc7JOsYWOi1wjtAtkhCijxGo,2271
70
+ geovisio/utils/pictures.py,sha256=Xv3eOIPp4fycGRNAs3VJRt3kArOajQ4t3QtjF8A83M8,28889
71
+ geovisio/utils/reports.py,sha256=3simWHf6t_OuLw2hh2HPYj8vsji00Pz9iRnJOqbTnPs,5227
72
+ geovisio/utils/semantics.py,sha256=MCJtxFSIsuDez8807hGHdlkOuVey6ThCFvUfJvva9f0,9832
73
+ geovisio/utils/sentry.py,sha256=lGDhm0ROW2Z-Ugtzq_M9R8yTKalYN4Etq19Uz63c6Tk,3737
74
+ geovisio/utils/sequences.py,sha256=1rPkUjOrat6jl1Ev3As_idhRMAmPQ6fTJpjfl5ql9-s,30735
75
+ geovisio/utils/tags.py,sha256=GyihW-TgQk1ZCpqYPMoN64qOZ6PCFCvCLK9HQnZhtY8,868
76
+ geovisio/utils/time.py,sha256=-hOs7FSx-8eiGmMQtTOrCoF8d_yMlj2306vfxJftEr8,642
77
+ geovisio/utils/tokens.py,sha256=tkihnnXqgQeIME_d12tC8PVrPN90A0i9k6UPEbgZ9TQ,3047
78
+ geovisio/utils/upload_set.py,sha256=Aym0K93PlNe8JzHPpdTEvKOPOdQ3mDOAGemc0fDTFQI,31038
79
+ geovisio/utils/website.py,sha256=3U9-WL0WGLKPDQHU8N08QCmUL6rKp54yRatpQ64kQhM,1958
80
+ geovisio/web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
+ geovisio/web/annotations.py,sha256=Sz-n6eYyiWtwFUo0wjQE-CDepsJtWkmtzAXGXE0P6sw,12178
82
+ geovisio/web/auth.py,sha256=coY35MzOXJQ8QocmAopWztecBUTVT4YBPTovXQhxEpw,7142
83
+ geovisio/web/collections.py,sha256=ABFOhrUqqIERBTi-hr1dexWFw1LFEf42SijmVgsC9lg,48054
84
+ geovisio/web/configuration.py,sha256=uRSfRQIBZqAfH09QFZP_8ofu-bajJUvrhToev1DgzJE,3143
85
+ geovisio/web/docs.py,sha256=b-tBrKRrtF7UsblOhKaL247c9pmM9MDavzdg1YILJLc,62741
86
+ geovisio/web/excluded_areas.py,sha256=5BNSZ0UqgFMtgvgrJ73eYGJXPJRnV-mGEs36WDRRxTk,13024
87
+ geovisio/web/items.py,sha256=cFEJevQWP0a-9rrXBPK5ogWSfIGpy564HkPPylvT9pk,65090
88
+ geovisio/web/map.py,sha256=hzVC0vS-71mFEvRmfCxAprums2Zz5baP6EFTL0uW02M,26136
89
+ geovisio/web/pages.py,sha256=Hkc3KJFE6D38vGnkCK5WUBJ8KQemI1f1wGXpxeiOiNo,6632
90
+ geovisio/web/params.py,sha256=W1wLGFjSztAx9Xl-zzqQSNPtD28trsxqr_qc5fzL6Dw,21523
91
+ geovisio/web/pictures.py,sha256=dr-oSl2_k-sl1ZmfrwyW2HZPxPsSzxOHtY5a0-9u_Gk,7471
92
+ geovisio/web/prepare.py,sha256=R10_xf6O9dmAAwOMC-vsaxgNTdc9BkDJLATqH6MKtCw,5620
93
+ geovisio/web/reports.py,sha256=8v9a4PMM9RsvSGadZEN2o5PTKG_TohjyMMEBfFeY13E,14123
94
+ geovisio/web/rss.py,sha256=NLUd2Or92tcKRaGUHAze6QMLWczHyzag9ybOzrA8djE,2962
95
+ geovisio/web/stac.py,sha256=PQqbUHBDi0xqVmYjH1oC16qtuaZbU8P0SufM0gdiG9w,14853
96
+ geovisio/web/tokens.py,sha256=natYQT1kdmlT2h0t3R1y0B6W4qhGfFmQR3UER9_KvkQ,11215
97
+ geovisio/web/upload_set.py,sha256=64Hr5Kv3Ixp57CMZavOCf1XL11kO7KiQ6L89j2cXSMM,41231
98
+ geovisio/web/users.py,sha256=DNbg7fKqoP__TKTD-xSIb250rYEBftyi17kclGlBXeg,14056
99
+ geovisio/web/utils.py,sha256=43zf8qAnRn6L_tEvf4h14mLQXKQHmuAW4EN3yYGKP7o,3638
100
+ geovisio/workers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
101
+ geovisio/workers/runner_pictures.py,sha256=0EMTR1N_3VhpLA66nrQcRkKONl7Ojf8SyT8BXlF5pOw,30359
102
+ geovisio-2.10.0.dist-info/licenses/LICENSE,sha256=iRFSz7MJ7_j4hh3hvIgzNbS2buy5NMva8lulaixd3IE,1069
103
+ geovisio-2.10.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
104
+ geovisio-2.10.0.dist-info/METADATA,sha256=yUEAR-PkyLi9ZhTnZJmzJ5bR5cdTiqo_Bq9U7TARFUs,4355
105
+ geovisio-2.10.0.dist-info/RECORD,,
@@ -1,98 +0,0 @@
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,,