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.
@@ -1,7 +1,8 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: goodmap
3
- Version: 0.5.3
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.3.6,<0.4.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
- ![Github Actions](https://github.com/problematy/goodmap/actions/workflows/tests.yml/badge.svg?event=push&branch=main)
31
+ ![Github Actions](https://github.com/problematy/goodmap/actions/workflows/release.yml/badge.svg?event=push&branch=main)
30
32
  [![Coverage Status](https://coveralls.io/repos/github/Problematy/goodmap/badge.png)](https://coveralls.io/github/Problematy/goodmap)
31
33
 
32
34
  # Good Map
@@ -1,4 +1,4 @@
1
- ![Github Actions](https://github.com/problematy/goodmap/actions/workflows/tests.yml/badge.svg?event=push&branch=main)
1
+ ![Github Actions](https://github.com/problematy/goodmap/actions/workflows/release.yml/badge.svg?event=push&branch=main)
2
2
  [![Coverage Status](https://coveralls.io/repos/github/Problematy/goodmap/badge.png)](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
- all_data = database.get_data()
211
- categories = make_tuple_translation(all_data["categories"].keys())
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
- categories_help = all_data["categories_help"]
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
- all_data = database.get_data()
237
- local_data = make_tuple_translation(all_data["categories"][category_type])
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
- all_data, "categories_options_help", category_type
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
- # Raw query params from request
272
- raw_params = request.args.to_dict(flat=False)
273
- all_locations = database.get_locations(raw_params)
274
- page_items, pagination = paginate_results(
275
- all_locations, raw_params, sort_by_default="name"
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
- raw_params = request.args.to_dict(flat=False)
332
- suggestions = database.get_suggestions(raw_params)
333
- page_items, pagination = paginate_results(suggestions, raw_params)
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
- raw_params = request.args.to_dict(flat=False)
368
- reports = database.get_reports(raw_params)
369
- page_items, pagination = paginate_results(reports, raw_params)
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):