umap-project 2.8.2__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.

Potentially problematic release.


This version of umap-project might be problematic. Click here for more details.

Files changed (260) hide show
  1. umap/__init__.py +1 -1
  2. umap/admin.py +15 -2
  3. umap/asgi.py +12 -7
  4. umap/context_processors.py +1 -0
  5. umap/locale/br/LC_MESSAGES/django.mo +0 -0
  6. umap/locale/br/LC_MESSAGES/django.po +111 -67
  7. umap/locale/cs_CZ/LC_MESSAGES/django.mo +0 -0
  8. umap/locale/cs_CZ/LC_MESSAGES/django.po +110 -66
  9. umap/locale/el/LC_MESSAGES/django.mo +0 -0
  10. umap/locale/el/LC_MESSAGES/django.po +129 -85
  11. umap/locale/en/LC_MESSAGES/django.po +103 -60
  12. umap/locale/es/LC_MESSAGES/django.mo +0 -0
  13. umap/locale/es/LC_MESSAGES/django.po +114 -69
  14. umap/locale/fr/LC_MESSAGES/django.mo +0 -0
  15. umap/locale/fr/LC_MESSAGES/django.po +105 -61
  16. umap/locale/gl/LC_MESSAGES/django.mo +0 -0
  17. umap/locale/gl/LC_MESSAGES/django.po +216 -171
  18. umap/locale/it/LC_MESSAGES/django.mo +0 -0
  19. umap/locale/it/LC_MESSAGES/django.po +142 -98
  20. umap/locale/nl/LC_MESSAGES/django.mo +0 -0
  21. umap/locale/nl/LC_MESSAGES/django.po +196 -151
  22. umap/locale/pt/LC_MESSAGES/django.mo +0 -0
  23. umap/locale/pt/LC_MESSAGES/django.po +115 -71
  24. umap/locale/zh_TW/LC_MESSAGES/django.mo +0 -0
  25. umap/locale/zh_TW/LC_MESSAGES/django.po +109 -65
  26. umap/management/commands/empty_trash.py +12 -1
  27. umap/migrations/0026_datalayer_modified_at_datalayer_share_status.py +26 -0
  28. umap/models.py +43 -13
  29. umap/settings/base.py +5 -2
  30. umap/static/umap/base.css +5 -2
  31. umap/static/umap/content.css +2 -22
  32. umap/static/umap/css/bar.css +39 -10
  33. umap/static/umap/css/contextmenu.css +14 -2
  34. umap/static/umap/css/form.css +33 -39
  35. umap/static/umap/css/icon.css +47 -5
  36. umap/static/umap/css/panel.css +20 -2
  37. umap/static/umap/css/popup.css +0 -1
  38. umap/static/umap/css/tooltip.css +33 -31
  39. umap/static/umap/img/16-white.svg +5 -3
  40. umap/static/umap/img/16.svg +1 -1
  41. umap/static/umap/img/24-white.svg +17 -16
  42. umap/static/umap/img/24.svg +29 -18
  43. umap/static/umap/img/providers/bitbucket.png +0 -0
  44. umap/static/umap/img/providers/github.png +0 -0
  45. umap/static/umap/img/providers/keycloak.png +0 -0
  46. umap/static/umap/img/providers/openstreetmap-oauth2.png +0 -0
  47. umap/static/umap/img/providers/twitter-oauth2.png +0 -0
  48. umap/static/umap/img/source/16-white.svg +6 -4
  49. umap/static/umap/img/source/16.svg +1 -1
  50. umap/static/umap/img/source/24-white.svg +20 -18
  51. umap/static/umap/img/source/24.svg +30 -19
  52. umap/static/umap/js/components/alerts/alert.js +4 -1
  53. umap/static/umap/js/modules/browser.js +8 -8
  54. umap/static/umap/js/modules/caption.js +30 -7
  55. umap/static/umap/js/modules/data/features.js +101 -56
  56. umap/static/umap/js/modules/data/layer.js +108 -83
  57. umap/static/umap/js/modules/form/builder.js +242 -0
  58. umap/static/umap/js/modules/form/fields.js +1346 -0
  59. umap/static/umap/js/modules/formatter.js +9 -8
  60. umap/static/umap/js/modules/help.js +20 -24
  61. umap/static/umap/js/modules/importer.js +6 -3
  62. umap/static/umap/js/modules/permissions.js +11 -6
  63. umap/static/umap/js/modules/rendering/icon.js +5 -1
  64. umap/static/umap/js/modules/rendering/layers/classified.js +12 -8
  65. umap/static/umap/js/modules/rendering/layers/cluster.js +11 -1
  66. umap/static/umap/js/modules/rendering/map.js +1 -23
  67. umap/static/umap/js/modules/rendering/ui.js +20 -38
  68. umap/static/umap/js/modules/rules.js +3 -2
  69. umap/static/umap/js/modules/saving.js +5 -0
  70. umap/static/umap/js/modules/schema.js +8 -6
  71. umap/static/umap/js/modules/share.js +3 -3
  72. umap/static/umap/js/modules/sync/engine.js +56 -26
  73. umap/static/umap/js/modules/sync/updaters.js +15 -6
  74. umap/static/umap/js/modules/sync/websocket.js +50 -37
  75. umap/static/umap/js/modules/tableeditor.js +3 -2
  76. umap/static/umap/js/modules/ui/bar.js +101 -9
  77. umap/static/umap/js/modules/ui/base.js +7 -24
  78. umap/static/umap/js/modules/ui/contextmenu.js +9 -2
  79. umap/static/umap/js/modules/ui/panel.js +5 -1
  80. umap/static/umap/js/modules/ui/tooltip.js +19 -11
  81. umap/static/umap/js/modules/umap.js +121 -68
  82. umap/static/umap/js/modules/utils.js +196 -12
  83. umap/static/umap/js/umap.controls.js +11 -353
  84. umap/static/umap/locale/am_ET.js +17 -5
  85. umap/static/umap/locale/am_ET.json +17 -5
  86. umap/static/umap/locale/ar.js +17 -5
  87. umap/static/umap/locale/ar.json +17 -5
  88. umap/static/umap/locale/ast.js +17 -5
  89. umap/static/umap/locale/ast.json +17 -5
  90. umap/static/umap/locale/bg.js +17 -5
  91. umap/static/umap/locale/bg.json +17 -5
  92. umap/static/umap/locale/br.js +33 -20
  93. umap/static/umap/locale/br.json +33 -20
  94. umap/static/umap/locale/ca.js +17 -5
  95. umap/static/umap/locale/ca.json +17 -5
  96. umap/static/umap/locale/cs_CZ.js +15 -5
  97. umap/static/umap/locale/cs_CZ.json +15 -5
  98. umap/static/umap/locale/da.js +17 -5
  99. umap/static/umap/locale/da.json +17 -5
  100. umap/static/umap/locale/de.js +17 -5
  101. umap/static/umap/locale/de.json +17 -5
  102. umap/static/umap/locale/el.js +63 -51
  103. umap/static/umap/locale/el.json +63 -51
  104. umap/static/umap/locale/en.js +15 -5
  105. umap/static/umap/locale/en.json +15 -5
  106. umap/static/umap/locale/en_US.json +17 -5
  107. umap/static/umap/locale/es.js +25 -13
  108. umap/static/umap/locale/es.json +25 -13
  109. umap/static/umap/locale/et.js +17 -5
  110. umap/static/umap/locale/et.json +17 -5
  111. umap/static/umap/locale/eu.js +17 -5
  112. umap/static/umap/locale/eu.json +17 -5
  113. umap/static/umap/locale/fa_IR.js +17 -5
  114. umap/static/umap/locale/fa_IR.json +17 -5
  115. umap/static/umap/locale/fi.js +17 -5
  116. umap/static/umap/locale/fi.json +17 -5
  117. umap/static/umap/locale/fr.js +16 -6
  118. umap/static/umap/locale/fr.json +16 -6
  119. umap/static/umap/locale/gl.js +357 -345
  120. umap/static/umap/locale/gl.json +357 -345
  121. umap/static/umap/locale/he.js +17 -5
  122. umap/static/umap/locale/he.json +17 -5
  123. umap/static/umap/locale/hr.js +17 -5
  124. umap/static/umap/locale/hr.json +17 -5
  125. umap/static/umap/locale/hu.js +14 -5
  126. umap/static/umap/locale/hu.json +14 -5
  127. umap/static/umap/locale/id.js +17 -5
  128. umap/static/umap/locale/id.json +17 -5
  129. umap/static/umap/locale/is.js +17 -5
  130. umap/static/umap/locale/is.json +17 -5
  131. umap/static/umap/locale/it.js +125 -113
  132. umap/static/umap/locale/it.json +125 -113
  133. umap/static/umap/locale/ja.js +17 -5
  134. umap/static/umap/locale/ja.json +17 -5
  135. umap/static/umap/locale/ko.js +17 -5
  136. umap/static/umap/locale/ko.json +17 -5
  137. umap/static/umap/locale/lt.js +17 -5
  138. umap/static/umap/locale/lt.json +17 -5
  139. umap/static/umap/locale/ms.js +17 -5
  140. umap/static/umap/locale/ms.json +17 -5
  141. umap/static/umap/locale/nl.js +132 -119
  142. umap/static/umap/locale/nl.json +132 -119
  143. umap/static/umap/locale/no.js +17 -5
  144. umap/static/umap/locale/no.json +17 -5
  145. umap/static/umap/locale/pl.js +17 -5
  146. umap/static/umap/locale/pl.json +17 -5
  147. umap/static/umap/locale/pl_PL.json +17 -5
  148. umap/static/umap/locale/pt.js +38 -25
  149. umap/static/umap/locale/pt.json +38 -25
  150. umap/static/umap/locale/pt_BR.js +17 -5
  151. umap/static/umap/locale/pt_BR.json +17 -5
  152. umap/static/umap/locale/pt_PT.js +17 -5
  153. umap/static/umap/locale/pt_PT.json +17 -5
  154. umap/static/umap/locale/ro.js +17 -5
  155. umap/static/umap/locale/ro.json +17 -5
  156. umap/static/umap/locale/ru.js +17 -5
  157. umap/static/umap/locale/ru.json +17 -5
  158. umap/static/umap/locale/sk_SK.js +17 -5
  159. umap/static/umap/locale/sk_SK.json +17 -5
  160. umap/static/umap/locale/sl.js +17 -5
  161. umap/static/umap/locale/sl.json +17 -5
  162. umap/static/umap/locale/sr.js +17 -5
  163. umap/static/umap/locale/sr.json +17 -5
  164. umap/static/umap/locale/sv.js +17 -5
  165. umap/static/umap/locale/sv.json +17 -5
  166. umap/static/umap/locale/th_TH.js +17 -5
  167. umap/static/umap/locale/th_TH.json +17 -5
  168. umap/static/umap/locale/tr.js +17 -5
  169. umap/static/umap/locale/tr.json +17 -5
  170. umap/static/umap/locale/uk_UA.js +17 -5
  171. umap/static/umap/locale/uk_UA.json +17 -5
  172. umap/static/umap/locale/vi.js +17 -5
  173. umap/static/umap/locale/vi.json +17 -5
  174. umap/static/umap/locale/vi_VN.json +17 -5
  175. umap/static/umap/locale/zh.js +17 -5
  176. umap/static/umap/locale/zh.json +17 -5
  177. umap/static/umap/locale/zh_CN.json +17 -5
  178. umap/static/umap/locale/zh_TW.Big5.json +17 -5
  179. umap/static/umap/locale/zh_TW.js +15 -5
  180. umap/static/umap/locale/zh_TW.json +15 -5
  181. umap/static/umap/map.css +29 -76
  182. umap/static/umap/nav.css +6 -3
  183. umap/static/umap/unittests/utils.js +14 -0
  184. umap/static/umap/vars.css +3 -0
  185. umap/static/umap/vendors/dompurify/purify.es.js +138 -354
  186. umap/static/umap/vendors/dompurify/purify.es.mjs.map +1 -1
  187. umap/static/umap/vendors/editable/Leaflet.Editable.js +1 -0
  188. umap/sync/__init__.py +0 -0
  189. umap/sync/app.py +187 -0
  190. umap/sync/payloads.py +56 -0
  191. umap/templates/auth/user_detail.html +4 -0
  192. umap/templates/auth/user_form.html +9 -6
  193. umap/templates/auth/user_stars.html +4 -0
  194. umap/templates/base.html +1 -1
  195. umap/templates/registration/login.html +2 -5
  196. umap/templates/umap/about.html +5 -0
  197. umap/templates/umap/about_summary.html +2 -2
  198. umap/templates/umap/components/provider.html +8 -0
  199. umap/templates/umap/content_footer.html +1 -1
  200. umap/templates/umap/css.html +0 -2
  201. umap/templates/umap/js.html +0 -4
  202. umap/templates/umap/map_detail.html +1 -1
  203. umap/templates/umap/password_change.html +4 -0
  204. umap/templates/umap/password_change_done.html +4 -0
  205. umap/templates/umap/search.html +4 -0
  206. umap/templates/umap/search_bar.html +1 -0
  207. umap/templates/umap/team_confirm_delete.html +4 -0
  208. umap/templates/umap/team_detail.html +4 -0
  209. umap/templates/umap/team_form.html +4 -0
  210. umap/templates/umap/user_dashboard.html +1 -1
  211. umap/templates/umap/user_teams.html +4 -0
  212. umap/tests/base.py +3 -1
  213. umap/tests/integration/conftest.py +16 -23
  214. umap/tests/integration/test_anonymous_owned_map.py +2 -2
  215. umap/tests/integration/test_basics.py +4 -7
  216. umap/tests/integration/test_caption.py +1 -0
  217. umap/tests/integration/test_categorized_layer.py +4 -8
  218. umap/tests/integration/test_choropleth.py +1 -1
  219. umap/tests/integration/test_conditional_rules.py +3 -3
  220. umap/tests/integration/test_draw_polygon.py +14 -22
  221. umap/tests/integration/test_draw_polyline.py +6 -14
  222. umap/tests/integration/test_edit_datalayer.py +11 -11
  223. umap/tests/integration/test_edit_map.py +30 -4
  224. umap/tests/integration/test_edit_marker.py +5 -5
  225. umap/tests/integration/test_edit_polygon.py +6 -6
  226. umap/tests/integration/test_features_id_generation.py +2 -6
  227. umap/tests/integration/test_import.py +115 -29
  228. umap/tests/integration/test_optimistic_merge.py +1 -0
  229. umap/tests/integration/test_owned_map.py +1 -1
  230. umap/tests/integration/test_picto.py +8 -8
  231. umap/tests/integration/test_save.py +3 -2
  232. umap/tests/integration/test_star.py +13 -9
  233. umap/tests/integration/test_tableeditor.py +8 -7
  234. umap/tests/integration/test_view_marker.py +10 -0
  235. umap/tests/integration/test_websocket_sync.py +239 -64
  236. umap/tests/settings.py +2 -0
  237. umap/tests/test_datalayer.py +2 -3
  238. umap/tests/test_datalayer_views.py +20 -1
  239. umap/tests/test_empty_trash.py +10 -3
  240. umap/tests/test_map_views.py +11 -0
  241. umap/utils.py +27 -11
  242. umap/views.py +37 -6
  243. {umap_project-2.8.2.dist-info → umap_project-2.9.0.dist-info}/METADATA +22 -22
  244. {umap_project-2.8.2.dist-info → umap_project-2.9.0.dist-info}/RECORD +247 -248
  245. {umap_project-2.8.2.dist-info → umap_project-2.9.0.dist-info}/WHEEL +1 -1
  246. umap/management/commands/run_websocket_server.py +0 -23
  247. umap/settings/local_s3.py +0 -45
  248. umap/static/umap/bitbucket.png +0 -0
  249. umap/static/umap/github.png +0 -0
  250. umap/static/umap/js/umap.forms.js +0 -1242
  251. umap/static/umap/keycloak.png +0 -0
  252. umap/static/umap/openstreetmap.png +0 -0
  253. umap/static/umap/twitter.png +0 -0
  254. umap/static/umap/vendors/formbuilder/Leaflet.FormBuilder.js +0 -468
  255. umap/static/umap/vendors/toolbar/leaflet.toolbar.css +0 -1
  256. umap/static/umap/vendors/toolbar/leaflet.toolbar.js +0 -1
  257. umap/tests/test_websocket_server.py +0 -22
  258. umap/websocket_server.py +0 -202
  259. {umap_project-2.8.2.dist-info → umap_project-2.9.0.dist-info}/entry_points.txt +0 -0
  260. {umap_project-2.8.2.dist-info → umap_project-2.9.0.dist-info}/licenses/LICENSE +0 -0
@@ -3,7 +3,7 @@
3
3
  # This file is distributed under the same license as the PACKAGE package.
4
4
  #
5
5
  # Translators:
6
- # Supaplex <bejokeup@gmail.com>, 2019,2023-2024
6
+ # Supaplex <bejokeup@gmail.com>, 2019,2023-2025
7
7
  # Chia-liang Kao <clkao@clkao.org>, 2014
8
8
  # coop.shen <coop.shen@gmail.com>, 2014
9
9
  # coop.shen <coop.shen@gmail.com>, 2014
@@ -15,9 +15,9 @@ msgid ""
15
15
  msgstr ""
16
16
  "Project-Id-Version: uMap\n"
17
17
  "Report-Msgid-Bugs-To: \n"
18
- "POT-Creation-Date: 2024-12-24 08:39+0000\n"
18
+ "POT-Creation-Date: 2025-01-31 17:29+0000\n"
19
19
  "PO-Revision-Date: 2013-11-22 14:00+0000\n"
20
- "Last-Translator: Supaplex <bejokeup@gmail.com>, 2019,2023-2024\n"
20
+ "Last-Translator: Supaplex <bejokeup@gmail.com>, 2019,2023-2025\n"
21
21
  "Language-Team: Chinese (Taiwan) (http://app.transifex.com/openstreetmap/umap/language/zh_TW/)\n"
22
22
  "MIME-Version: 1.0\n"
23
23
  "Content-Type: text/plain; charset=UTF-8\n"
@@ -31,7 +31,7 @@ msgstr "CSV 匯出"
31
31
 
32
32
  #: decorators.py:60
33
33
  msgid "This map is not publicly available"
34
- msgstr ""
34
+ msgstr "這份地圖並非公開可及的"
35
35
 
36
36
  #: middleware.py:13
37
37
  msgid "Site is readonly for maintenance"
@@ -41,7 +41,7 @@ msgstr "網站目前因維護中設定為唯讀狀態"
41
41
  msgid "name"
42
42
  msgstr "名稱"
43
43
 
44
- #: models.py:62 models.py:475
44
+ #: models.py:62 models.py:485
45
45
  msgid "description"
46
46
  msgstr "描述"
47
47
 
@@ -61,23 +61,23 @@ msgstr "URL 樣板,使用 OSM 地圖磚格式"
61
61
  msgid "Order of the tilelayers in the edit box"
62
62
  msgstr "編輯方塊中地圖磚的圖層順序"
63
63
 
64
- #: models.py:175 models.py:469
64
+ #: models.py:175 models.py:479
65
65
  msgid "Only editable with secret edit link"
66
66
  msgstr "僅能由私密連結編輯"
67
67
 
68
- #: models.py:176 models.py:470
68
+ #: models.py:176 models.py:480
69
69
  msgid "Everyone can edit"
70
70
  msgstr "所有人皆可編輯"
71
71
 
72
- #: models.py:179 models.py:463
72
+ #: models.py:179 models.py:473
73
73
  msgid "Everyone"
74
74
  msgstr "所有人"
75
75
 
76
- #: models.py:180 models.py:189 models.py:464
76
+ #: models.py:180 models.py:189 models.py:474
77
77
  msgid "Editors and team only"
78
78
  msgstr "只有編輯者與團隊"
79
79
 
80
- #: models.py:181 models.py:465
80
+ #: models.py:181 models.py:475
81
81
  msgid "Owner only"
82
82
  msgstr "只有擁有者"
83
83
 
@@ -97,7 +97,7 @@ msgstr "任何有連結的人"
97
97
  msgid "Blocked"
98
98
  msgstr "已經封銷了"
99
99
 
100
- #: models.py:191
100
+ #: models.py:191 models.py:469
101
101
  msgid "Deleted"
102
102
  msgstr "已刪除"
103
103
 
@@ -137,31 +137,31 @@ msgstr "編輯者"
137
137
  msgid "team"
138
138
  msgstr "團隊"
139
139
 
140
- #: models.py:229 models.py:491
140
+ #: models.py:229 models.py:501
141
141
  msgid "edit status"
142
142
  msgstr "編輯狀態"
143
143
 
144
- #: models.py:234
144
+ #: models.py:234 models.py:506
145
145
  msgid "share status"
146
146
  msgstr "分享狀態"
147
147
 
148
- #: models.py:237 models.py:486
148
+ #: models.py:237 models.py:496
149
149
  msgid "settings"
150
150
  msgstr "設定"
151
151
 
152
- #: models.py:402
152
+ #: models.py:407
153
153
  msgid "Clone of"
154
154
  msgstr "複製"
155
155
 
156
- #: models.py:462 models.py:468
156
+ #: models.py:468 models.py:472 models.py:478
157
157
  msgid "Inherit"
158
158
  msgstr "繼承"
159
159
 
160
- #: models.py:481
160
+ #: models.py:491
161
161
  msgid "display on load"
162
162
  msgstr "載入時顯示"
163
163
 
164
- #: models.py:482
164
+ #: models.py:492
165
165
  msgid "Display this layer on load."
166
166
  msgstr "載入此圖層時顯示"
167
167
 
@@ -170,50 +170,64 @@ msgid ""
170
170
  "<a href=\"https://discover.umap-project.org/support/faq/#map-statuses\" "
171
171
  "target=\"_blank\">Find out here the documentation</a> on how to manage map’s"
172
172
  " permissions."
173
- msgstr ""
173
+ msgstr "<a href=\"https://discover.umap-project.org/support/faq/#map-statuses\" target=\"_blank\">在說明文件尋找資訊</a>,要如何管理地圖權限。"
174
174
 
175
175
  #: templates/403.html:10 templates/404.html:8
176
176
  msgid "← Go to the homepage"
177
- msgstr ""
177
+ msgstr "← 回到首頁"
178
178
 
179
179
  #: templates/404.html:7
180
180
  msgid "404 Page Not Found"
181
- msgstr ""
181
+ msgstr "404 頁面"
182
182
 
183
- #: templates/auth/user_detail.html:8
183
+ #: templates/auth/user_detail.html:6
184
+ #, python-format
185
+ msgid "%(current_user)s’s maps"
186
+ msgstr "%(current_user)s的地圖"
187
+
188
+ #: templates/auth/user_detail.html:12
184
189
  #, python-format
185
190
  msgid "Browse %(current_user)s's maps"
186
191
  msgstr "瀏覽 %(current_user)s 的地圖"
187
192
 
188
- #: templates/auth/user_detail.html:17
193
+ #: templates/auth/user_detail.html:21
189
194
  #, python-format
190
195
  msgid "%(current_user)s has no maps."
191
196
  msgstr "%(current_user)s 沒有任何地圖。"
192
197
 
193
- #: templates/auth/user_form.html:21 templates/umap/team_form.html:21
198
+ #: templates/auth/user_form.html:6
199
+ msgid "My Profile"
200
+ msgstr "我的檔案"
201
+
202
+ #: templates/auth/user_form.html:24 templates/umap/team_form.html:25
194
203
  msgid "Save"
195
204
  msgstr "儲存"
196
205
 
197
- #: templates/auth/user_form.html:27
206
+ #: templates/auth/user_form.html:30
198
207
  msgid "Your current providers"
199
208
  msgstr "你目前的供應商"
200
209
 
201
- #: templates/auth/user_form.html:39
210
+ #: templates/auth/user_form.html:44
202
211
  msgid "Connect to another provider"
203
212
  msgstr "連線到其他供應商"
204
213
 
205
- #: templates/auth/user_form.html:42
214
+ #: templates/auth/user_form.html:47
206
215
  msgid ""
207
216
  "It's a good habit to connect your account to more than one provider, in case"
208
217
  " one provider becomes unavailable, temporarily or even permanently."
209
218
  msgstr "用你的帳號連到多個供應商是好的習慣,因為有時候供應商會出狀況,甚至永久停止運作。"
210
219
 
211
- #: templates/auth/user_stars.html:8
220
+ #: templates/auth/user_stars.html:6
221
+ #, python-format
222
+ msgid "%(current_user)s’s starred maps"
223
+ msgstr "%(current_user)s的打星號地圖"
224
+
225
+ #: templates/auth/user_stars.html:12
212
226
  #, python-format
213
227
  msgid "Browse %(current_user)s's starred maps"
214
228
  msgstr "瀏覽 %(current_user)s 已打心號的地圖"
215
229
 
216
- #: templates/auth/user_stars.html:17
230
+ #: templates/auth/user_stars.html:21
217
231
  #, python-format
218
232
  msgid "%(current_user)s has no starred maps yet."
219
233
  msgstr "%(current_user)s 沒有任何打心號的地圖。"
@@ -248,6 +262,10 @@ msgstr "密碼"
248
262
  msgid "Please choose a provider:"
249
263
  msgstr "請選擇提供商:"
250
264
 
265
+ #: templates/umap/about.html:5 templates/umap/navigation.html:22
266
+ msgid "About"
267
+ msgstr "關於"
268
+
251
269
  #: templates/umap/about_summary.html:12
252
270
  #, python-format
253
271
  msgid ""
@@ -415,7 +433,7 @@ msgstr "由"
415
433
  msgid "More"
416
434
  msgstr "更多"
417
435
 
418
- #: templates/umap/map_table.html:8 templates/umap/user_teams.html:14
436
+ #: templates/umap/map_table.html:8 templates/umap/user_teams.html:18
419
437
  msgid "Name"
420
438
  msgstr "名稱"
421
439
 
@@ -439,7 +457,7 @@ msgstr "最後儲存"
439
457
  msgid "Owner"
440
458
  msgstr "擁有者"
441
459
 
442
- #: templates/umap/map_table.html:26 templates/umap/user_teams.html:20
460
+ #: templates/umap/map_table.html:26 templates/umap/user_teams.html:24
443
461
  msgid "Actions"
444
462
  msgstr "動作"
445
463
 
@@ -452,7 +470,7 @@ msgid "Share"
452
470
  msgstr "分享"
453
471
 
454
472
  #: templates/umap/map_table.html:78 templates/umap/map_table.html:80
455
- #: templates/umap/user_teams.html:38 templates/umap/user_teams.html:40
473
+ #: templates/umap/user_teams.html:42 templates/umap/user_teams.html:44
456
474
  msgid "Edit"
457
475
  msgstr "編輯"
458
476
 
@@ -515,10 +533,6 @@ msgstr "登入"
515
533
  msgid "Sign in"
516
534
  msgstr "註冊"
517
535
 
518
- #: templates/umap/navigation.html:22
519
- msgid "About"
520
- msgstr "關於"
521
-
522
536
  #: templates/umap/navigation.html:30
523
537
  msgid "Change password"
524
538
  msgstr "更改密碼"
@@ -527,51 +541,57 @@ msgstr "更改密碼"
527
541
  msgid "Log out"
528
542
  msgstr "登出"
529
543
 
530
- #: templates/umap/password_change.html:7
544
+ #: templates/umap/password_change.html:6
545
+ #: templates/umap/password_change.html:11
531
546
  msgid "Password change"
532
547
  msgstr "密碼變更"
533
548
 
534
- #: templates/umap/password_change.html:10
549
+ #: templates/umap/password_change.html:14
535
550
  msgid ""
536
551
  "Please enter your old password, for security's sake, and then enter your new"
537
552
  " password twice so we can verify you typed it in correctly."
538
553
  msgstr "為確保賬戸安全,請先輸入你的舊有密碼。然後輸入新密碼兩次,以便確認新密碼輸入正確。"
539
554
 
540
- #: templates/umap/password_change.html:17
555
+ #: templates/umap/password_change.html:21
541
556
  msgid "Old password"
542
557
  msgstr "舊密碼"
543
558
 
544
- #: templates/umap/password_change.html:22
559
+ #: templates/umap/password_change.html:26
545
560
  msgid "New password"
546
561
  msgstr "新密碼"
547
562
 
548
- #: templates/umap/password_change.html:26
563
+ #: templates/umap/password_change.html:30
549
564
  msgid "New password confirmation"
550
565
  msgstr "再次輸入新密碼"
551
566
 
552
- #: templates/umap/password_change.html:27
567
+ #: templates/umap/password_change.html:31
553
568
  msgid "Change my password"
554
569
  msgstr "更改我的密碼"
555
570
 
556
- #: templates/umap/password_change_done.html:7
571
+ #: templates/umap/password_change_done.html:6
572
+ #: templates/umap/password_change_done.html:11
557
573
  msgid "Password change successful"
558
574
  msgstr "成功更改密碼"
559
575
 
560
- #: templates/umap/password_change_done.html:10
576
+ #: templates/umap/password_change_done.html:14
561
577
  msgid "Your password was changed."
562
578
  msgstr "你的密碼已更改。"
563
579
 
564
- #: templates/umap/search.html:15
580
+ #: templates/umap/search.html:6
581
+ msgid "Explore maps"
582
+ msgstr "瀏覽地圖"
583
+
584
+ #: templates/umap/search.html:19
565
585
  #, python-format
566
586
  msgid "%(count)s map found:"
567
587
  msgid_plural "%(count)s maps found:"
568
588
  msgstr[0] "已找到%(count)s份地圖:"
569
589
 
570
- #: templates/umap/search.html:24
590
+ #: templates/umap/search.html:28
571
591
  msgid "No map found."
572
592
  msgstr "找不到地圖。"
573
593
 
574
- #: templates/umap/search.html:29
594
+ #: templates/umap/search.html:33
575
595
  msgid "Latest created maps"
576
596
  msgstr "最新創建地圖"
577
597
 
@@ -583,21 +603,34 @@ msgstr "搜尋地圖"
583
603
  msgid "Search"
584
604
  msgstr "搜尋"
585
605
 
586
- #: templates/umap/team_detail.html:10
606
+ #: templates/umap/team_confirm_delete.html:6
607
+ msgid "Team deletion"
608
+ msgstr "團隊刪除"
609
+
610
+ #: templates/umap/team_detail.html:6
611
+ #, python-format
612
+ msgid "%(current_team)s’s maps"
613
+ msgstr "%(current_team)s的地圖"
614
+
615
+ #: templates/umap/team_detail.html:14
587
616
  #, python-format
588
617
  msgid "Browse %(current_team)s's maps"
589
618
  msgstr "瀏覽%(current_team)s的地圖"
590
619
 
591
- #: templates/umap/team_detail.html:22
620
+ #: templates/umap/team_detail.html:26
592
621
  #, python-format
593
622
  msgid "%(current_team)s has no public maps."
594
623
  msgstr "%(current_team)s沒有公開地圖"
595
624
 
596
- #: templates/umap/team_form.html:24
625
+ #: templates/umap/team_form.html:6
626
+ msgid "Create or edit a team"
627
+ msgstr "創建或是編輯團隊"
628
+
629
+ #: templates/umap/team_form.html:28
597
630
  msgid "Delete this team"
598
631
  msgstr "刪除這個團隊"
599
632
 
600
- #: templates/umap/team_form.html:47
633
+ #: templates/umap/team_form.html:51
601
634
  msgid "Add user"
602
635
  msgstr "新增使用者"
603
636
 
@@ -618,11 +651,15 @@ msgstr "下載%(count)s地圖"
618
651
  msgid "You have no map yet."
619
652
  msgstr "你目前還沒有地圖。"
620
653
 
621
- #: templates/umap/user_teams.html:17
654
+ #: templates/umap/user_teams.html:6
655
+ msgid "My Teams"
656
+ msgstr "我的團隊"
657
+
658
+ #: templates/umap/user_teams.html:21
622
659
  msgid "Users"
623
660
  msgstr "使用者"
624
661
 
625
- #: templates/umap/user_teams.html:48
662
+ #: templates/umap/user_teams.html:52
626
663
  msgid "New team"
627
664
  msgstr "新的團隊"
628
665
 
@@ -639,57 +676,64 @@ msgstr "已經刪除團隊 \"%(name)s\" "
639
676
  msgid "View the map"
640
677
  msgstr "檢視地圖"
641
678
 
642
- #: views.py:825
679
+ #: views.py:838
643
680
  msgid "See full screen"
644
681
  msgstr "檢視全螢幕"
645
682
 
646
- #: views.py:968
683
+ #: views.py:981
647
684
  msgid "Map editors updated with success!"
648
685
  msgstr "地圖編輯者更新完成"
649
686
 
650
- #: views.py:1004
687
+ #: views.py:1017
651
688
  #, python-format
652
689
  msgid "The uMap edit link for your map: %(map_name)s"
653
690
  msgstr "你的地圖 uMap 編輯連結:%(map_name)s"
654
691
 
655
- #: views.py:1007
692
+ #: views.py:1020
656
693
  #, python-format
657
694
  msgid "Here is your secret edit link: %(link)s"
658
695
  msgstr "這是你的祕密編輯連結:%(link)s"
659
696
 
660
- #: views.py:1014
697
+ #: views.py:1027
661
698
  #, python-format
662
699
  msgid "Can't send email to %(email)s"
663
700
  msgstr "無法傳送電子郵件到%(email)s"
664
701
 
665
- #: views.py:1017
702
+ #: views.py:1030
666
703
  #, python-format
667
704
  msgid "Email sent to %(email)s"
668
705
  msgstr "電子郵件寄至 %(email)s"
669
706
 
670
- #: views.py:1028
707
+ #: views.py:1041
671
708
  msgid "Only its owner can delete the map."
672
709
  msgstr "只有擁有者可以刪除此地圖"
673
710
 
674
- #: views.py:1031
711
+ #: views.py:1044
675
712
  msgid "Map successfully deleted."
676
713
  msgstr "成功刪除地圖"
677
714
 
678
- #: views.py:1057
715
+ #: views.py:1070
679
716
  #, python-format
680
717
  msgid ""
681
718
  "Your map has been cloned! If you want to edit this map from another "
682
719
  "computer, please use this link: %(anonymous_url)s"
683
720
  msgstr "您的地圖已複製完成!如果您想在不同的機器編輯這個地圖,請使用這個連結:%(anonymous_url)s"
684
721
 
685
- #: views.py:1062
722
+ #: views.py:1075
686
723
  msgid "Congratulations, your map has been cloned!"
687
724
  msgstr "恭喜,您的地圖已被複製!"
688
725
 
689
- #: views.py:1313
726
+ #: views.py:1329
690
727
  msgid "Layer successfully deleted."
691
728
  msgstr "圖層已刪除"
692
729
 
693
- #: views.py:1335
730
+ #: views.py:1351
694
731
  msgid "Permissions updated with success!"
695
732
  msgstr "權限更新完成"
733
+
734
+ #: views.py:1430
735
+ #, python-format
736
+ msgid ""
737
+ "Using “%(name)s” to authenticate is deprecated. Please configure another "
738
+ "provider in your profile page."
739
+ msgstr "使用\"%(name)s\"來認證已經廢棄了,請在你的個人檔案頁面使用其他供應商來設定認證。"
@@ -2,7 +2,7 @@ from datetime import datetime, timedelta
2
2
 
3
3
  from django.core.management.base import BaseCommand
4
4
 
5
- from umap.models import Map
5
+ from umap.models import DataLayer, Map
6
6
 
7
7
 
8
8
  class Command(BaseCommand):
@@ -33,3 +33,14 @@ class Command(BaseCommand):
33
33
  if not options["dry_run"]:
34
34
  map.delete()
35
35
  print(f"Deleted map {map_name} ({map_id}), trashed at {trashed_at}")
36
+ print(f"Deleting layers in trash since {since}")
37
+ layers = DataLayer.objects.filter(
38
+ share_status=DataLayer.DELETED, modified_at__lt=since
39
+ )
40
+ for layer in layers:
41
+ layer_id = layer.uuid
42
+ layer_name = layer.name
43
+ trashed_at = layer.modified_at.date()
44
+ if not options["dry_run"]:
45
+ layer.delete()
46
+ print(f"Deleted layer {layer_name} ({layer_id}), trashed at {trashed_at}")
@@ -0,0 +1,26 @@
1
+ # Generated by Django 5.1.4 on 2025-01-29 18:06
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+ dependencies = [
8
+ ("umap", "0025_alter_datalayer_geojson"),
9
+ ]
10
+
11
+ operations = [
12
+ migrations.AddField(
13
+ model_name="datalayer",
14
+ name="modified_at",
15
+ field=models.DateTimeField(auto_now=True),
16
+ ),
17
+ migrations.AddField(
18
+ model_name="datalayer",
19
+ name="share_status",
20
+ field=models.SmallIntegerField(
21
+ choices=[(0, "Inherit"), (99, "Deleted")],
22
+ default=0,
23
+ verbose_name="share status",
24
+ ),
25
+ ),
26
+ ]
umap/models.py CHANGED
@@ -247,9 +247,13 @@ class Map(NamedModel):
247
247
  except KeyError:
248
248
  return ""
249
249
 
250
+ @property
251
+ def datalayers(self):
252
+ return self.datalayer_set.filter(share_status=DataLayer.INHERIT).all()
253
+
250
254
  @property
251
255
  def preview_settings(self):
252
- layers = self.datalayer_set.all()
256
+ layers = self.datalayers
253
257
  datalayer_data = [c.metadata() for c in layers]
254
258
  map_settings = self.settings
255
259
  if "properties" not in map_settings:
@@ -278,6 +282,7 @@ class Map(NamedModel):
278
282
  def delete(self, **kwargs):
279
283
  # Explicitely call datalayers.delete, so we can deal with removing files
280
284
  # (the cascade delete would not call the model delete method)
285
+ # Use datalayer_set so to get also the deleted ones.
281
286
  for datalayer in self.datalayer_set.all():
282
287
  datalayer.delete()
283
288
  return super().delete(**kwargs)
@@ -287,7 +292,7 @@ class Map(NamedModel):
287
292
  umapjson["type"] = "umap"
288
293
  umapjson["uri"] = request.build_absolute_uri(self.get_absolute_url())
289
294
  datalayers = []
290
- for datalayer in self.datalayer_set.all():
295
+ for datalayer in self.datalayers:
291
296
  with datalayer.geojson.open("rb") as f:
292
297
  layer = json.loads(f.read())
293
298
  if datalayer.settings:
@@ -406,7 +411,7 @@ class Map(NamedModel):
406
411
  new.save()
407
412
  for editor in self.editors.all():
408
413
  new.editors.add(editor)
409
- for datalayer in self.datalayer_set.all():
414
+ for datalayer in self.datalayers:
410
415
  datalayer.clone(map_inst=new)
411
416
  return new
412
417
 
@@ -458,6 +463,11 @@ class DataLayer(NamedModel):
458
463
  ANONYMOUS = 1
459
464
  COLLABORATORS = 2
460
465
  OWNER = 3
466
+ DELETED = 99
467
+ SHARE_STATUS = (
468
+ (INHERIT, _("Inherit")),
469
+ (DELETED, _("Deleted")),
470
+ )
461
471
  EDIT_STATUS = (
462
472
  (INHERIT, _("Inherit")),
463
473
  (ANONYMOUS, _("Everyone")),
@@ -490,6 +500,12 @@ class DataLayer(NamedModel):
490
500
  default=INHERIT,
491
501
  verbose_name=_("edit status"),
492
502
  )
503
+ share_status = models.SmallIntegerField(
504
+ choices=SHARE_STATUS,
505
+ default=INHERIT,
506
+ verbose_name=_("share status"),
507
+ )
508
+ modified_at = models.DateTimeField(auto_now=True)
493
509
 
494
510
  class Meta:
495
511
  ordering = ("rank",)
@@ -507,17 +523,27 @@ class DataLayer(NamedModel):
507
523
  def metadata(self, request=None):
508
524
  # Retrocompat: minimal settings for maps not saved after settings property
509
525
  # has been introduced
510
- obj = self.settings or {
511
- "name": self.name,
512
- "displayOnLoad": self.display_on_load,
513
- }
526
+ metadata = self.settings
527
+ if not metadata:
528
+ # Fallback to file for old datalayers.
529
+ data = json.loads(self.geojson.read().decode())
530
+ metadata = data.get("_umap_options")
531
+ if not metadata:
532
+ metadata = {
533
+ "name": self.name,
534
+ "displayOnLoad": self.display_on_load,
535
+ }
536
+ # Save it to prevent file reading at each map load.
537
+ self.settings = metadata
538
+ # Do not update the modified_at.
539
+ self.save(update_fields=["settings"])
514
540
  if self.old_id:
515
- obj["old_id"] = self.old_id
516
- obj["id"] = self.pk
517
- obj["permissions"] = {"edit_status": self.edit_status}
518
- obj["editMode"] = "advanced" if self.can_edit(request) else "disabled"
519
- obj["_referenceVersion"] = self.reference_version
520
- return obj
541
+ metadata["old_id"] = self.old_id
542
+ metadata["id"] = self.pk
543
+ metadata["permissions"] = {"edit_status": self.edit_status}
544
+ metadata["editMode"] = "advanced" if self.can_edit(request) else "disabled"
545
+ metadata["_referenceVersion"] = self.reference_version
546
+ return metadata
521
547
 
522
548
  def clone(self, map_inst=None):
523
549
  new = self.__class__.objects.get(pk=self.pk)
@@ -568,6 +594,10 @@ class DataLayer(NamedModel):
568
594
  can = True
569
595
  return can
570
596
 
597
+ def move_to_trash(self):
598
+ self.share_status = DataLayer.DELETED
599
+ self.save()
600
+
571
601
 
572
602
  class Star(models.Model):
573
603
  at = models.DateTimeField(auto_now=True)
umap/settings/base.py CHANGED
@@ -267,13 +267,14 @@ UMAP_KEEP_VERSIONS = env.int("UMAP_KEEP_VERSIONS", default=10)
267
267
  SITE_URL = env("SITE_URL", default="http://umap.org")
268
268
  SHORT_SITE_URL = env("SHORT_SITE_URL", default=None)
269
269
  SITE_NAME = "uMap"
270
+ SITE_DESCRIPTION = "Online map creator"
270
271
  UMAP_DEMO_SITE = env("UMAP_DEMO_SITE", default=False)
271
272
  UMAP_EXCLUDE_DEFAULT_MAPS = False
272
273
  UMAP_MAPS_PER_PAGE = 5
273
274
  UMAP_MAPS_PER_SEARCH = 25
274
275
  UMAP_MAPS_PER_PAGE_OWNER = 10
275
276
  UMAP_SEARCH_CONFIGURATION = "simple"
276
- UMAP_HELP_URL = "https://wiki.openstreetmap.org/wiki/UMap#Feedback_and_help"
277
+ UMAP_HELP_URL = "https://discover.umap-project.org/"
277
278
  USER_MAPS_URL = "user_maps"
278
279
  DATABASES = {
279
280
  "default": env.db(
@@ -305,6 +306,7 @@ LOGIN_URL = "login"
305
306
  SOCIAL_AUTH_LOGIN_REDIRECT_URL = "/login/popup/end/"
306
307
 
307
308
  AUTHENTICATION_BACKENDS = ()
309
+ DEPRECATED_AUTHENTICATION_BACKENDS = []
308
310
 
309
311
  SOCIAL_AUTH_OPENSTREETMAP_OAUTH2_KEY = env(
310
312
  "SOCIAL_AUTH_OPENSTREETMAP_OAUTH2_KEY", default=""
@@ -342,4 +344,5 @@ LOGGING = {
342
344
  WEBSOCKET_ENABLED = env.bool("WEBSOCKET_ENABLED", default=False)
343
345
  WEBSOCKET_BACK_HOST = env("WEBSOCKET_BACK_HOST", default="localhost")
344
346
  WEBSOCKET_BACK_PORT = env.int("WEBSOCKET_BACK_PORT", default=8001)
345
- WEBSOCKET_FRONT_URI = env("WEBSOCKET_FRONT_URI", default="ws://localhost:8001")
347
+
348
+ REDIS_URL = "redis://localhost:6379"
umap/static/umap/base.css CHANGED
@@ -19,7 +19,10 @@ h1, h2, h3, h4, h5, h6, label, hr {
19
19
  }
20
20
  a {
21
21
  text-decoration: none;
22
- color: SeaGreen;
22
+ color: #1F5C39;
23
+ }
24
+ a[href^="http"]:not(nav.umap-nav a) {
25
+ text-decoration: underline;
23
26
  }
24
27
  button {
25
28
  cursor: pointer;
@@ -46,7 +49,7 @@ h3, h4, h5 {
46
49
  margin-bottom: 14px;
47
50
  }
48
51
  p {
49
- line-height: 21px;
52
+ line-height: 1.4;
50
53
  margin-top: 14px;
51
54
  margin-bottom: 14px;
52
55
  }