goodmap 0.5.3__tar.gz → 1.0.2__tar.gz
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.
- {goodmap-0.5.3 → goodmap-1.0.2}/PKG-INFO +6 -4
- {goodmap-0.5.3 → goodmap-1.0.2}/README.md +1 -1
- {goodmap-0.5.3 → goodmap-1.0.2}/goodmap/core_api.py +18 -90
- goodmap-1.0.2/goodmap/db.py +1282 -0
- {goodmap-0.5.3 → goodmap-1.0.2}/pyproject.toml +26 -3
- goodmap-0.5.3/goodmap/db.py +0 -564
- {goodmap-0.5.3 → goodmap-1.0.2}/LICENSE.md +0 -0
- {goodmap-0.5.3 → goodmap-1.0.2}/goodmap/__init__.py +0 -0
- {goodmap-0.5.3 → goodmap-1.0.2}/goodmap/core.py +0 -0
- {goodmap-0.5.3 → goodmap-1.0.2}/goodmap/data_models/location.py +0 -0
- {goodmap-0.5.3 → goodmap-1.0.2}/goodmap/data_validator.py +0 -0
- {goodmap-0.5.3 → goodmap-1.0.2}/goodmap/formatter.py +0 -0
- {goodmap-0.5.3 → goodmap-1.0.2}/goodmap/goodmap.py +0 -0
- {goodmap-0.5.3 → goodmap-1.0.2}/goodmap/templates/goodmap-admin.html +0 -0
- {goodmap-0.5.3 → goodmap-1.0.2}/goodmap/templates/map.html +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: goodmap
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 1.0.2
|
|
4
4
|
Summary: Map engine to serve all the people :)
|
|
5
|
+
License-File: LICENSE.md
|
|
5
6
|
Author: Krzysztof Kolodzinski
|
|
6
7
|
Author-email: krzysztof.kolodzinski@problematy.pl
|
|
7
8
|
Requires-Python: >=3.10,<4.0
|
|
@@ -10,6 +11,7 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
10
11
|
Classifier: Programming Language :: Python :: 3.11
|
|
11
12
|
Classifier: Programming Language :: Python :: 3.12
|
|
12
13
|
Classifier: Programming Language :: Python :: 3.13
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
13
15
|
Requires-Dist: Babel (>=2.10.3,<3.0.0)
|
|
14
16
|
Requires-Dist: Flask (==3.0.3)
|
|
15
17
|
Requires-Dist: Flask-Babel (>=4.0.0,<5.0.0)
|
|
@@ -22,11 +24,11 @@ Requires-Dist: google-cloud-storage (>=2.7.0,<3.0.0)
|
|
|
22
24
|
Requires-Dist: gql (>=3.4.0,<4.0.0)
|
|
23
25
|
Requires-Dist: gunicorn (>=20.1.0,<21.0.0)
|
|
24
26
|
Requires-Dist: humanize (>=4.6.0,<5.0.0)
|
|
25
|
-
Requires-Dist: platzky (>=0.
|
|
27
|
+
Requires-Dist: platzky (>=0.4.0,<0.5.0)
|
|
26
28
|
Requires-Dist: pydantic (>=2.7.1,<3.0.0)
|
|
27
29
|
Description-Content-Type: text/markdown
|
|
28
30
|
|
|
29
|
-

|
|
30
32
|
[](https://coveralls.io/github/Problematy/goodmap)
|
|
31
33
|
|
|
32
34
|
# Good Map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-

|
|
2
2
|
[](https://coveralls.io/github/Problematy/goodmap)
|
|
3
3
|
|
|
4
4
|
# Good Map
|
|
@@ -22,74 +22,6 @@ def get_or_none(data, *keys):
|
|
|
22
22
|
return data
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
def paginate_results(items, raw_params, sort_by_default=None):
|
|
26
|
-
"""
|
|
27
|
-
Apply pagination and sorting to a list of items.
|
|
28
|
-
|
|
29
|
-
Args:
|
|
30
|
-
items: The list of items to paginate
|
|
31
|
-
raw_params: The query parameters dictionary
|
|
32
|
-
|
|
33
|
-
Returns:
|
|
34
|
-
Tuple of (paginated_items, pagination_metadata)
|
|
35
|
-
"""
|
|
36
|
-
# Extract pagination parameters
|
|
37
|
-
try:
|
|
38
|
-
page = int(raw_params.pop("page", ["1"])[0])
|
|
39
|
-
except ValueError:
|
|
40
|
-
page = 1
|
|
41
|
-
|
|
42
|
-
per_page_raw = raw_params.pop("per_page", [None])[0]
|
|
43
|
-
if per_page_raw is None:
|
|
44
|
-
per_page = 20
|
|
45
|
-
elif per_page_raw == "all":
|
|
46
|
-
per_page = None
|
|
47
|
-
else:
|
|
48
|
-
try:
|
|
49
|
-
per_page = max(1, int(per_page_raw))
|
|
50
|
-
except ValueError:
|
|
51
|
-
per_page = 20
|
|
52
|
-
|
|
53
|
-
sort_by = raw_params.pop("sort_by", [None])[0] or sort_by_default
|
|
54
|
-
sort_order = raw_params.pop("sort_order", ["asc"])[0].lower()
|
|
55
|
-
|
|
56
|
-
def get_sort_key(item):
|
|
57
|
-
if not sort_by:
|
|
58
|
-
return None
|
|
59
|
-
|
|
60
|
-
value = None
|
|
61
|
-
if isinstance(item, dict):
|
|
62
|
-
value = item.get(sort_by)
|
|
63
|
-
else:
|
|
64
|
-
value = getattr(item, sort_by, None)
|
|
65
|
-
|
|
66
|
-
return (value is not None, value)
|
|
67
|
-
|
|
68
|
-
if sort_by:
|
|
69
|
-
reverse = sort_order == "desc"
|
|
70
|
-
items.sort(key=get_sort_key, reverse=reverse)
|
|
71
|
-
|
|
72
|
-
# Apply pagination
|
|
73
|
-
total = len(items)
|
|
74
|
-
if per_page:
|
|
75
|
-
start = (page - 1) * per_page
|
|
76
|
-
end = start + per_page
|
|
77
|
-
page_items = items[start:end]
|
|
78
|
-
total_pages = (total + per_page - 1) // per_page
|
|
79
|
-
else:
|
|
80
|
-
page_items = items
|
|
81
|
-
total_pages = 1
|
|
82
|
-
page = 1
|
|
83
|
-
per_page = total
|
|
84
|
-
|
|
85
|
-
return page_items, {
|
|
86
|
-
"total": total,
|
|
87
|
-
"page": page,
|
|
88
|
-
"per_page": per_page,
|
|
89
|
-
"total_pages": total_pages,
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
|
|
93
25
|
def core_pages(
|
|
94
26
|
database,
|
|
95
27
|
languages: LanguagesMapping,
|
|
@@ -207,13 +139,14 @@ def core_pages(
|
|
|
207
139
|
class Categories(Resource):
|
|
208
140
|
def get(self):
|
|
209
141
|
"""Shows all available categories"""
|
|
210
|
-
|
|
211
|
-
categories = make_tuple_translation(
|
|
142
|
+
raw_categories = database.get_categories()
|
|
143
|
+
categories = make_tuple_translation(raw_categories)
|
|
212
144
|
|
|
213
145
|
if not feature_flags.get("CATEGORIES_HELP", False):
|
|
214
146
|
return jsonify(categories)
|
|
215
147
|
else:
|
|
216
|
-
|
|
148
|
+
category_data = database.get_category_data()
|
|
149
|
+
categories_help = category_data["categories_help"]
|
|
217
150
|
proper_categories_help = []
|
|
218
151
|
if categories_help is not None:
|
|
219
152
|
for option in categories_help:
|
|
@@ -233,11 +166,11 @@ def core_pages(
|
|
|
233
166
|
class CategoryTypes(Resource):
|
|
234
167
|
def get(self, category_type):
|
|
235
168
|
"""Shows all available types in category"""
|
|
236
|
-
|
|
237
|
-
local_data = make_tuple_translation(
|
|
169
|
+
category_data = database.get_category_data(category_type)
|
|
170
|
+
local_data = make_tuple_translation(category_data["categories"][category_type])
|
|
238
171
|
|
|
239
172
|
categories_options_help = get_or_none(
|
|
240
|
-
|
|
173
|
+
category_data, "categories_options_help", category_type
|
|
241
174
|
)
|
|
242
175
|
proper_categories_options_help = []
|
|
243
176
|
if categories_options_help is not None:
|
|
@@ -268,14 +201,11 @@ def core_pages(
|
|
|
268
201
|
Shows full list of locations, with optional server-side pagination, sorting,
|
|
269
202
|
and filtering.
|
|
270
203
|
"""
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
)
|
|
277
|
-
items = [x.model_dump() for x in page_items]
|
|
278
|
-
return jsonify({"items": items, **pagination})
|
|
204
|
+
query_params = request.args.to_dict(flat=False)
|
|
205
|
+
if "sort_by" not in query_params:
|
|
206
|
+
query_params["sort_by"] = ["name"]
|
|
207
|
+
result = database.get_locations_paginated(query_params)
|
|
208
|
+
return jsonify(result)
|
|
279
209
|
|
|
280
210
|
def post(self):
|
|
281
211
|
"""
|
|
@@ -328,10 +258,9 @@ def core_pages(
|
|
|
328
258
|
List location suggestions, with optional server-side pagination, sorting,
|
|
329
259
|
and filtering by status.
|
|
330
260
|
"""
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
return jsonify({"items": page_items, **pagination})
|
|
261
|
+
query_params = request.args.to_dict(flat=False)
|
|
262
|
+
result = database.get_suggestions_paginated(query_params)
|
|
263
|
+
return jsonify(result)
|
|
335
264
|
|
|
336
265
|
@core_api.route("/admin/suggestions/<suggestion_id>")
|
|
337
266
|
class AdminManageSuggestion(Resource):
|
|
@@ -364,10 +293,9 @@ def core_pages(
|
|
|
364
293
|
List location reports, with optional server-side pagination, sorting,
|
|
365
294
|
and filtering by status/priority.
|
|
366
295
|
"""
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
return jsonify({"items": page_items, **pagination})
|
|
296
|
+
query_params = request.args.to_dict(flat=False)
|
|
297
|
+
result = database.get_reports_paginated(query_params)
|
|
298
|
+
return jsonify(result)
|
|
371
299
|
|
|
372
300
|
@core_api.route("/admin/reports/<report_id>")
|
|
373
301
|
class AdminManageReport(Resource):
|