cap-composer 1.2.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 (294) hide show
  1. cap_composer-1.2.0.dist-info/METADATA +59 -0
  2. cap_composer-1.2.0.dist-info/RECORD +294 -0
  3. cap_composer-1.2.0.dist-info/WHEEL +5 -0
  4. cap_composer-1.2.0.dist-info/entry_points.txt +2 -0
  5. cap_composer-1.2.0.dist-info/top_level.txt +1 -0
  6. capcomposer/__init__.py +9 -0
  7. capcomposer/cap/__init__.py +0 -0
  8. capcomposer/cap/admin.py +4 -0
  9. capcomposer/cap/apps.py +30 -0
  10. capcomposer/cap/cache.py +5 -0
  11. capcomposer/cap/exceptions.py +2 -0
  12. capcomposer/cap/external_feed/__init__.py +0 -0
  13. capcomposer/cap/external_feed/models.py +81 -0
  14. capcomposer/cap/external_feed/utils.py +87 -0
  15. capcomposer/cap/locale/am/LC_MESSAGES/django.mo +0 -0
  16. capcomposer/cap/locale/am/LC_MESSAGES/django.po +626 -0
  17. capcomposer/cap/locale/ar/LC_MESSAGES/django.mo +0 -0
  18. capcomposer/cap/locale/ar/LC_MESSAGES/django.po +633 -0
  19. capcomposer/cap/locale/en/LC_MESSAGES/django.mo +0 -0
  20. capcomposer/cap/locale/en/LC_MESSAGES/django.po +631 -0
  21. capcomposer/cap/locale/es/LC_MESSAGES/django.mo +0 -0
  22. capcomposer/cap/locale/es/LC_MESSAGES/django.po +648 -0
  23. capcomposer/cap/locale/fr/LC_MESSAGES/django.mo +0 -0
  24. capcomposer/cap/locale/fr/LC_MESSAGES/django.po +647 -0
  25. capcomposer/cap/locale/sw/LC_MESSAGES/django.mo +0 -0
  26. capcomposer/cap/locale/sw/LC_MESSAGES/django.po +644 -0
  27. capcomposer/cap/management/__init__.py +0 -0
  28. capcomposer/cap/management/commands/__init__.py +0 -0
  29. capcomposer/cap/management/commands/create_cap_alerts_multi_media.py +27 -0
  30. capcomposer/cap/migrations/0001_initial.py +46 -0
  31. capcomposer/cap/migrations/0002_alter_capalertpage_info.py +22 -0
  32. capcomposer/cap/migrations/0003_capalertpage_search_image.py +20 -0
  33. capcomposer/cap/migrations/0004_alter_capalertpage_identifier.py +19 -0
  34. capcomposer/cap/migrations/0005_capalertlistpage.py +30 -0
  35. capcomposer/cap/migrations/0006_remove_capalertlistpage_description_and_more.py +22 -0
  36. capcomposer/cap/migrations/0007_alter_capalertpage_info.py +22 -0
  37. capcomposer/cap/migrations/0008_alter_capalertpage_info.py +22 -0
  38. capcomposer/cap/migrations/0009_merge_20231114_0803.py +13 -0
  39. capcomposer/cap/migrations/0010_alter_capalertpage_options.py +17 -0
  40. capcomposer/cap/migrations/0011_alter_capalertpage_info.py +23 -0
  41. capcomposer/cap/migrations/0012_alter_capalertpage_info_and_more.py +24 -0
  42. capcomposer/cap/migrations/0013_capalertpage_alert_pdf_preview.py +20 -0
  43. capcomposer/cap/migrations/0014_capalertpage_alert_area_map_image.py +20 -0
  44. capcomposer/cap/migrations/0015_alter_capalertpage_info.py +23 -0
  45. capcomposer/cap/migrations/0016_auto_20240530_1637.py +18 -0
  46. capcomposer/cap/migrations/0017_capalertpage_expires.py +40 -0
  47. capcomposer/cap/migrations/0018_capalertwebhook_capalertwebhookevent.py +50 -0
  48. capcomposer/cap/migrations/0019_alter_capalertpage_options_alter_capalertpage_guid_and_more.py +43 -0
  49. capcomposer/cap/migrations/0020_othercapsettings.py +27 -0
  50. capcomposer/cap/migrations/0021_capalertmqttbroker_capalertmqttbrokerevent.py +55 -0
  51. capcomposer/cap/migrations/0022_externalalertfeed_and_more.py +75 -0
  52. capcomposer/cap/migrations/0023_alter_capalertpage_sender.py +18 -0
  53. capcomposer/cap/migrations/0024_alter_capalertpage_alert_pdf_preview_and_more.py +21 -0
  54. capcomposer/cap/migrations/0025_capmenupermission.py +23 -0
  55. capcomposer/cap/migrations/0026_alter_capmenupermission_options.py +17 -0
  56. capcomposer/cap/migrations/0027_capalertlistpage_alerts_infos_per_page.py +19 -0
  57. capcomposer/cap/migrations/0028_alter_capalertpage_info.py +20 -0
  58. capcomposer/cap/migrations/0029_capalertpage_imported_alter_capalertpage_info.py +25 -0
  59. capcomposer/cap/migrations/0030_alter_capalertpage_sent.py +19 -0
  60. capcomposer/cap/migrations/0031_capalertpage_newsletter_campaign_and_more.py +30 -0
  61. capcomposer/cap/migrations/0032_capalertmqttbroker_qos.py +18 -0
  62. capcomposer/cap/migrations/0033_capalertwebhook_header_value_and_more.py +23 -0
  63. capcomposer/cap/migrations/__init__.py +0 -0
  64. capcomposer/cap/mixins.py +35 -0
  65. capcomposer/cap/models.py +484 -0
  66. capcomposer/cap/mqtt/__init__.py +0 -0
  67. capcomposer/cap/mqtt/models.py +141 -0
  68. capcomposer/cap/mqtt/publish.py +128 -0
  69. capcomposer/cap/mqtt/utils.py +41 -0
  70. capcomposer/cap/permissions.py +13 -0
  71. capcomposer/cap/serializers.py +8 -0
  72. capcomposer/cap/sign.py +47 -0
  73. capcomposer/cap/static/cap/css/bulma-timeline.min.css +135 -0
  74. capcomposer/cap/static/cap/css/cap_detail_page.css +266 -0
  75. capcomposer/cap/static/cap/css/cap_detail_pdf.css +157 -0
  76. capcomposer/cap/static/cap/css/cap_list_page.css +111 -0
  77. capcomposer/cap/static/cap/css/codehilite.css +75 -0
  78. capcomposer/cap/static/cap/images/cap_symbol.jpeg +0 -0
  79. capcomposer/cap/static/cap/images/caplogo.jpeg +0 -0
  80. capcomposer/cap/static/cap/js/jquery-3.7.1.min.js +2 -0
  81. capcomposer/cap/static/cap/js/mqtt_collapse_panels.js +20 -0
  82. capcomposer/cap/static_map.py +66 -0
  83. capcomposer/cap/tasks.py +115 -0
  84. capcomposer/cap/templates/cap/active_alert.html +109 -0
  85. capcomposer/cap/templates/cap/alert_detail.html +668 -0
  86. capcomposer/cap/templates/cap/alert_detail_email.html +208 -0
  87. capcomposer/cap/templates/cap/alert_detail_pdf.html +306 -0
  88. capcomposer/cap/templates/cap/alert_list.html +198 -0
  89. capcomposer/cap/templates/cap/cap-alert-stylesheet.html +725 -0
  90. capcomposer/cap/templates/cap/cap-feed-stylesheet.html +107 -0
  91. capcomposer/cap/templates/cap/icons/category.svg +3 -0
  92. capcomposer/cap/templates/cap/icons/certainty.svg +3 -0
  93. capcomposer/cap/templates/cap/icons/clock.svg +4 -0
  94. capcomposer/cap/templates/cap/icons/language.svg +3 -0
  95. capcomposer/cap/templates/cap/icons/response.svg +5 -0
  96. capcomposer/cap/templates/cap/icons/warning-outline.svg +7 -0
  97. capcomposer/cap/templates/cap/icons/warning.svg +4 -0
  98. capcomposer/cap/templates/cap/icons/x-twitter.svg +3 -0
  99. capcomposer/cap/templates/cap/include_alert_list_item.html +48 -0
  100. capcomposer/cap/templates/cap/pagination_include.html +40 -0
  101. capcomposer/cap/templates/cap/social_media_share_buttons_include.html +17 -0
  102. capcomposer/cap/templates/cap/third_party_integration.html +46 -0
  103. capcomposer/cap/templates/cap/third_party_integration_md_content.md +192 -0
  104. capcomposer/cap/templates/cap/widgets/nav_left_alert.html +109 -0
  105. capcomposer/cap/templates/cap/widgets/nav_top_alert.html +82 -0
  106. capcomposer/cap/templatetags/__init__.py +0 -0
  107. capcomposer/cap/templatetags/online_share.py +106 -0
  108. capcomposer/cap/tests.py +3 -0
  109. capcomposer/cap/urls.py +23 -0
  110. capcomposer/cap/utils.py +431 -0
  111. capcomposer/cap/views.py +391 -0
  112. capcomposer/cap/wagtail_hooks.py +475 -0
  113. capcomposer/cap/weasyprint_utils.py +69 -0
  114. capcomposer/cap/webhook/__init__.py +0 -0
  115. capcomposer/cap/webhook/http.py +26 -0
  116. capcomposer/cap/webhook/models.py +55 -0
  117. capcomposer/cap/webhook/utils.py +64 -0
  118. capcomposer/capeditor/__init__.py +0 -0
  119. capcomposer/capeditor/admin.py +3 -0
  120. capcomposer/capeditor/apps.py +6 -0
  121. capcomposer/capeditor/blocks.py +735 -0
  122. capcomposer/capeditor/cap_settings.py +202 -0
  123. capcomposer/capeditor/caputils.py +376 -0
  124. capcomposer/capeditor/clear_fuzzy.py +21 -0
  125. capcomposer/capeditor/constants.py +248 -0
  126. capcomposer/capeditor/errors.py +8 -0
  127. capcomposer/capeditor/forms/__init__.py +0 -0
  128. capcomposer/capeditor/forms/capimporter.py +83 -0
  129. capcomposer/capeditor/forms/fields.py +69 -0
  130. capcomposer/capeditor/forms/widgets.py +325 -0
  131. capcomposer/capeditor/locale/am/LC_MESSAGES/django.mo +0 -0
  132. capcomposer/capeditor/locale/am/LC_MESSAGES/django.po +1336 -0
  133. capcomposer/capeditor/locale/ar/LC_MESSAGES/django.mo +0 -0
  134. capcomposer/capeditor/locale/ar/LC_MESSAGES/django.po +1400 -0
  135. capcomposer/capeditor/locale/en/LC_MESSAGES/django.mo +0 -0
  136. capcomposer/capeditor/locale/en/LC_MESSAGES/django.po +1421 -0
  137. capcomposer/capeditor/locale/es/LC_MESSAGES/django.mo +0 -0
  138. capcomposer/capeditor/locale/es/LC_MESSAGES/django.po +1448 -0
  139. capcomposer/capeditor/locale/fr/LC_MESSAGES/django.mo +0 -0
  140. capcomposer/capeditor/locale/fr/LC_MESSAGES/django.po +1445 -0
  141. capcomposer/capeditor/locale/sw/LC_MESSAGES/django.mo +0 -0
  142. capcomposer/capeditor/locale/sw/LC_MESSAGES/django.po +1429 -0
  143. capcomposer/capeditor/migrations/0001_initial.py +34 -0
  144. capcomposer/capeditor/migrations/0002_alter_capsetting_options_and_more.py +38 -0
  145. capcomposer/capeditor/migrations/0003_capsetting_logo.py +20 -0
  146. capcomposer/capeditor/migrations/0004_predefinedalertarea.py +30 -0
  147. capcomposer/capeditor/migrations/0005_alter_capsetting_sender.py +18 -0
  148. capcomposer/capeditor/migrations/0006_capsetting_wmo_oid.py +18 -0
  149. capcomposer/capeditor/migrations/0007_alter_capsetting_wmo_oid_and_more.py +23 -0
  150. capcomposer/capeditor/migrations/0008_remove_capsetting_audience_types.py +17 -0
  151. capcomposer/capeditor/migrations/0009_capsetting_un_country_boundary_geojson.py +18 -0
  152. capcomposer/capeditor/migrations/0010_alter_capsetting_un_country_boundary_geojson.py +18 -0
  153. capcomposer/capeditor/migrations/0011_alertlanguage.py +57 -0
  154. capcomposer/capeditor/migrations/0012_alter_hazardeventtypes_options_and_more.py +26 -0
  155. capcomposer/capeditor/migrations/0013_capsetting_num_of_latest_alerts_in_feed.py +19 -0
  156. capcomposer/capeditor/migrations/0014_alter_capsetting_num_of_latest_alerts_in_feed.py +19 -0
  157. capcomposer/capeditor/migrations/0015_hazardeventtypes_category_and_more.py +23 -0
  158. capcomposer/capeditor/migrations/0016_alter_predefinedalertarea_name.py +18 -0
  159. capcomposer/capeditor/migrations/__init__.py +0 -0
  160. capcomposer/capeditor/models.py +413 -0
  161. capcomposer/capeditor/oet_v1_2.py +235 -0
  162. capcomposer/capeditor/pubsub/__init__.py +0 -0
  163. capcomposer/capeditor/pubsub/base.py +68 -0
  164. capcomposer/capeditor/pubsub/mqtt.py +121 -0
  165. capcomposer/capeditor/pubsub/publish.py +25 -0
  166. capcomposer/capeditor/renderers.py +62 -0
  167. capcomposer/capeditor/serializers.py +194 -0
  168. capcomposer/capeditor/static/capeditor/css/cap_detail_page.css +218 -0
  169. capcomposer/capeditor/static/capeditor/css/import_cap_preview.css +47 -0
  170. capcomposer/capeditor/static/capeditor/css/mapbox-gl-draw.css +88 -0
  171. capcomposer/capeditor/static/capeditor/css/maplibre-gl.css +1 -0
  172. capcomposer/capeditor/static/capeditor/css/widget/boundary-widget.css +72 -0
  173. capcomposer/capeditor/static/capeditor/css/widget/circle-widget.css +99 -0
  174. capcomposer/capeditor/static/capeditor/css/widget/geojson-file-loader-widget.css +36 -0
  175. capcomposer/capeditor/static/capeditor/css/widget/multipolygon-widget.css +73 -0
  176. capcomposer/capeditor/static/capeditor/css/widget/polygon-widget.css +135 -0
  177. capcomposer/capeditor/static/capeditor/fonts/Roboto/LICENSE.txt +202 -0
  178. capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-Black.ttf +0 -0
  179. capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-BlackItalic.ttf +0 -0
  180. capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-Bold.ttf +0 -0
  181. capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-BoldItalic.ttf +0 -0
  182. capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-Italic.ttf +0 -0
  183. capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-Light.ttf +0 -0
  184. capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-LightItalic.ttf +0 -0
  185. capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-Medium.ttf +0 -0
  186. capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-MediumItalic.ttf +0 -0
  187. capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-Regular.ttf +0 -0
  188. capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-Thin.ttf +0 -0
  189. capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-ThinItalic.ttf +0 -0
  190. capcomposer/capeditor/static/capeditor/fonts/mapbox-gl-draw.css +88 -0
  191. capcomposer/capeditor/static/capeditor/images/alert.png +0 -0
  192. capcomposer/capeditor/static/capeditor/images/alert.svg +3 -0
  193. capcomposer/capeditor/static/capeditor/images/area.png +0 -0
  194. capcomposer/capeditor/static/capeditor/images/certainty.png +0 -0
  195. capcomposer/capeditor/static/capeditor/images/extreme.png +0 -0
  196. capcomposer/capeditor/static/capeditor/images/minor.png +0 -0
  197. capcomposer/capeditor/static/capeditor/images/moderate.png +0 -0
  198. capcomposer/capeditor/static/capeditor/images/severe.png +0 -0
  199. capcomposer/capeditor/static/capeditor/images/urgency.png +0 -0
  200. capcomposer/capeditor/static/capeditor/js/cap_accordion.js +58 -0
  201. capcomposer/capeditor/static/capeditor/js/conditional_fields.js +104 -0
  202. capcomposer/capeditor/static/capeditor/js/mapbox-gl-draw.js +2 -0
  203. capcomposer/capeditor/static/capeditor/js/maplibre-gl.js +44 -0
  204. capcomposer/capeditor/static/capeditor/js/turf.min.js +60 -0
  205. capcomposer/capeditor/static/capeditor/js/widget/boundary-polygon-widget-telepath.js +20 -0
  206. capcomposer/capeditor/static/capeditor/js/widget/boundary-polygon-widget.js +440 -0
  207. capcomposer/capeditor/static/capeditor/js/widget/circle-widget-telepath.js +20 -0
  208. capcomposer/capeditor/static/capeditor/js/widget/circle-widget.js +428 -0
  209. capcomposer/capeditor/static/capeditor/js/widget/event-code-widget-controller.js +7 -0
  210. capcomposer/capeditor/static/capeditor/js/widget/event-code-widget.js +61 -0
  211. capcomposer/capeditor/static/capeditor/js/widget/geojson-file-loader-widget.js +238 -0
  212. capcomposer/capeditor/static/capeditor/js/widget/hazard-event-type-widget-controller.js +7 -0
  213. capcomposer/capeditor/static/capeditor/js/widget/hazard-event-type-widget.js +54 -0
  214. capcomposer/capeditor/static/capeditor/js/widget/multipolygon-widget.js +342 -0
  215. capcomposer/capeditor/static/capeditor/js/widget/polygon-widget-telepath.js +20 -0
  216. capcomposer/capeditor/static/capeditor/js/widget/polygon-widget.js +577 -0
  217. capcomposer/capeditor/templates/capeditor/cap_alert_page.html +344 -0
  218. capcomposer/capeditor/templates/capeditor/icons/cap-alert-full.svg +18 -0
  219. capcomposer/capeditor/templates/capeditor/icons/cap-alert.svg +11 -0
  220. capcomposer/capeditor/templates/capeditor/load_cap_alert.html +113 -0
  221. capcomposer/capeditor/templates/capeditor/preview_cap_alert.html +429 -0
  222. capcomposer/capeditor/templates/capeditor/widgets/boundary_polygon_widget.html +9 -0
  223. capcomposer/capeditor/templates/capeditor/widgets/circle_widget.html +55 -0
  224. capcomposer/capeditor/templates/capeditor/widgets/event_code_select_widget.html +6 -0
  225. capcomposer/capeditor/templates/capeditor/widgets/geojson_file_loader_widget.html +22 -0
  226. capcomposer/capeditor/templates/capeditor/widgets/hazard_event_type_widget.html +11 -0
  227. capcomposer/capeditor/templates/capeditor/widgets/multipolygon_widget.html +24 -0
  228. capcomposer/capeditor/templates/capeditor/widgets/polygon_widget.html +11 -0
  229. capcomposer/capeditor/tests.py +3 -0
  230. capcomposer/capeditor/utils.py +108 -0
  231. capcomposer/capeditor/views.py +62 -0
  232. capcomposer/capeditor/wagtail_hooks.py +117 -0
  233. capcomposer/config/__init__.py +0 -0
  234. capcomposer/config/asgi.py +21 -0
  235. capcomposer/config/celery.py +5 -0
  236. capcomposer/config/celery_singleton_backend.py +11 -0
  237. capcomposer/config/db_engine/__init__.py +0 -0
  238. capcomposer/config/db_engine/base.py +15 -0
  239. capcomposer/config/settings/__init__.py +0 -0
  240. capcomposer/config/settings/base.py +364 -0
  241. capcomposer/config/settings/dev.py +20 -0
  242. capcomposer/config/settings/production.py +36 -0
  243. capcomposer/config/static/css/bulma.min.css +3 -0
  244. capcomposer/config/static/css/cap-composer.css +75 -0
  245. capcomposer/config/static/css/maplibre-gl.css +1 -0
  246. capcomposer/config/static/images/capcomposer.png +0 -0
  247. capcomposer/config/static/images/capcomposer_red.png +0 -0
  248. capcomposer/config/static/images/capcomposer_white.png +0 -0
  249. capcomposer/config/static/images/weather-alert.png +0 -0
  250. capcomposer/config/static/js/cap-composer.js +0 -0
  251. capcomposer/config/static/js/maplibre-gl.js +59 -0
  252. capcomposer/config/static/js/turf.min.js +88 -0
  253. capcomposer/config/storage.py +9 -0
  254. capcomposer/config/telemetry/__init__.py +0 -0
  255. capcomposer/config/telemetry/env_overrides_parser.py +131 -0
  256. capcomposer/config/telemetry/middleware.py +20 -0
  257. capcomposer/config/telemetry/provider.py +60 -0
  258. capcomposer/config/telemetry/sampling.py +51 -0
  259. capcomposer/config/telemetry/telemetry.py +141 -0
  260. capcomposer/config/telemetry/utils.py +177 -0
  261. capcomposer/config/templates/404.html +31 -0
  262. capcomposer/config/templates/500.html +28 -0
  263. capcomposer/config/templates/axes/lockout.html +29 -0
  264. capcomposer/config/templates/base.html +69 -0
  265. capcomposer/config/templates/breadcrumbs_include.html +14 -0
  266. capcomposer/config/templates/footer.html +10 -0
  267. capcomposer/config/templates/humans.txt +33 -0
  268. capcomposer/config/templates/navbar.html +26 -0
  269. capcomposer/config/templates/wagtailadmin/admin_base.html +3 -0
  270. capcomposer/config/templates/wagtailadmin/base.html +10 -0
  271. capcomposer/config/templates/wagtailadmin/home.html +11 -0
  272. capcomposer/config/templates/wagtailadmin/login.html +18 -0
  273. capcomposer/config/urls.py +48 -0
  274. capcomposer/config/views.py +12 -0
  275. capcomposer/config/wsgi.py +25 -0
  276. capcomposer/gunicorn.config.py +5 -0
  277. capcomposer/home/__init__.py +0 -0
  278. capcomposer/home/apps.py +6 -0
  279. capcomposer/home/management/commands/get_capcomposer_version.py +12 -0
  280. capcomposer/home/migrations/0001_initial.py +31 -0
  281. capcomposer/home/migrations/0002_create_homepage.py +61 -0
  282. capcomposer/home/migrations/0003_homepage_subtitle.py +18 -0
  283. capcomposer/home/migrations/__init__.py +0 -0
  284. capcomposer/home/models.py +83 -0
  285. capcomposer/home/static/css/homepage.css +120 -0
  286. capcomposer/home/tasks.py +33 -0
  287. capcomposer/home/templates/home/home_page.html +36 -0
  288. capcomposer/home/templatetags/__init__.py +0 -0
  289. capcomposer/home/templatetags/capcomposer_tags.py +19 -0
  290. capcomposer/home/wagtail_hooks.py +6 -0
  291. capcomposer/manage.py +15 -0
  292. capcomposer/utils/__init__.py +26 -0
  293. capcomposer/utils/version.py +110 -0
  294. capcomposer/version.py +16 -0
@@ -0,0 +1,59 @@
1
+ Metadata-Version: 2.4
2
+ Name: cap-composer
3
+ Version: 1.2.0
4
+ Summary: Wagtail based weather warnings composing and dissemination tool, using Common Alerting Protocol (CAP) standard.
5
+ Author-email: Erick Otenyo <otenyo.erick@gmail.com>, Grace Amondi <miswa.grace@gmail.com>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/wmo-raf/cap-composer
8
+ Project-URL: Bug Tracker, https://github.com/wmo-raf/cap-composer/issues
9
+ Platform: Linux
10
+ Classifier: Development Status :: 5 - Production/Stable
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3.8
14
+ Classifier: Programming Language :: Python :: 3.9
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Framework :: Django
17
+ Classifier: Framework :: Wagtail
18
+ Requires-Python: >=3.8
19
+ Description-Content-Type: text/markdown
20
+ Requires-Dist: wagtail>=7.0
21
+ Requires-Dist: djangorestframework-xml
22
+ Requires-Dist: python-magic
23
+ Requires-Dist: shapely
24
+ Requires-Dist: wagtail-icon-chooser>=0.3.1
25
+ Requires-Dist: wagtail-cache==3.0.0
26
+ Requires-Dist: adm-boundary-manager>=0.2.5
27
+ Requires-Dist: wagtail-humanitarian-icons>=2.0.0
28
+ Requires-Dist: wagtail-modelchooser>=4.0.1
29
+ Requires-Dist: paho-mqtt>=2.1.0
30
+ Requires-Dist: xmltodict>=0.14.2
31
+ Requires-Dist: pdf2image>=1.17.0
32
+ Requires-Dist: wagtail-metadata>=5.0.0
33
+ Requires-Dist: lxml>=5.4.0
34
+ Requires-Dist: signxml>=4.0.3
35
+ Requires-Dist: loguru>=0.7.3
36
+ Requires-Dist: weasyprint>=65.1
37
+ Requires-Dist: requests>=2.32.3
38
+ Requires-Dist: pytz>=2025.2
39
+ Requires-Dist: wagtail-lazyimages==0.1.5
40
+ Requires-Dist: wagtail-font-awesome-svg>=1.0.1
41
+ Requires-Dist: capvalidator==0.1.0.dev4
42
+ Requires-Dist: feedparser>=6.0.11
43
+ Requires-Dist: staticmap==0.5.7
44
+ Requires-Dist: wagtail-newsletter==0.2.2
45
+ Requires-Dist: mailchimp-marketing==3.0.80
46
+ Requires-Dist: mrml>=0.2
47
+ Requires-Dist: Pygments
48
+ Requires-Dist: markdown
49
+
50
+ A [Wagtail](https://wagtail.io/)
51
+ based [Common Alerting Protocol](https://docs.oasis-open.org/emergency/cap/v1.2/CAP-v1.2-os.html) (CAP) Warning
52
+ Composer.
53
+
54
+ This is a web-based tool for creating and managing CAP alerts. It is designed to be used by National Meteorological and
55
+ Hydrological Services (NMHSs), disaster management agencies and other organizations that have the authority to publish
56
+ and disseminate CAP alerts.
57
+
58
+ For more details, see [https://github.com/wmo-raf/cap-composer](https://github.com/wmo-raf/capcomposer)
59
+
@@ -0,0 +1,294 @@
1
+ capcomposer/__init__.py,sha256=zCyMoHnjwkHOl7gMVQKbyiEpfSZVzuocxyxzrJaUuGo,266
2
+ capcomposer/gunicorn.config.py,sha256=xViQ9BXbeIuioCE1bWBXy9Nch8pYVj6rpmu78LIWCn4,153
3
+ capcomposer/manage.py,sha256=TQ_QGYXfryHkKJx7__1Nkxwol1b277-iQSm0x6nvQ90,299
4
+ capcomposer/version.py,sha256=z1bvY5tzxCYCAOfcVUIOcsxmU_8OTnh097UdwIyeWMk,429
5
+ capcomposer/cap/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ capcomposer/cap/admin.py,sha256=xbWBHdWAuRte3-FPhS5dmRVFwnRolBDIgPX-mSRcGYQ,121
7
+ capcomposer/cap/apps.py,sha256=IldHTR6MsBj8KpKmpcPPHLsaoqYM5f1jTIz2Is8CV14,1231
8
+ capcomposer/cap/cache.py,sha256=Kai9VwBiWbov1L2UZmz0l8QSL659jJOlzVlzkeu_RJU,158
9
+ capcomposer/cap/exceptions.py,sha256=DEvpWphDBeMcUsE7Y3KjFax6tmY0bGCQEwUdD9VfHRc,47
10
+ capcomposer/cap/mixins.py,sha256=1szFbLl42P75NnKILPQ4aYwmnKdHAcx6AZbbCz1L54Y,1133
11
+ capcomposer/cap/models.py,sha256=LzUhz8fU80EYAHs9CaUv_FpKWVx8LU6zZuXWe-ZkBc4,17661
12
+ capcomposer/cap/permissions.py,sha256=1kdlrmjWXZHb5mc3GYqkrkRSAg74zJcbqfUvHjXb61A,389
13
+ capcomposer/cap/serializers.py,sha256=TPsVGDqxlIGzvc3IfjtQrXHPUX6ngSZ7OAblrHhQmtc,236
14
+ capcomposer/cap/sign.py,sha256=3eHeMA2hXpoK7JX9vgQ1MAUIbD-Fgi0ViUTJ5qOKn20,1583
15
+ capcomposer/cap/static_map.py,sha256=CWtNzvso2V-CCvrPSHMml6SNkA9a233FioKDWNUshdE,2295
16
+ capcomposer/cap/tasks.py,sha256=OLjWyhZMmnw9o07NJFRb0NWLhCroZYeqM5g1-hmbrJs,3560
17
+ capcomposer/cap/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
18
+ capcomposer/cap/urls.py,sha256=8puMxSauUMFtRzLEW6RynkmurCUs8Xx8Udy6xfFbLPY,910
19
+ capcomposer/cap/utils.py,sha256=DWMA_WeJKHmVlHPFRufFOMjHG_dB9rMRSUtc0xh00Ag,16809
20
+ capcomposer/cap/views.py,sha256=5AV02LlSnptEuA1tWpjg5_Vkjkx3xfSi8zJY0Jvvf4Y,12838
21
+ capcomposer/cap/wagtail_hooks.py,sha256=teo3OIK2NfkKnwMBpCzU32uipgw-OH6SoB_9RZP3jBQ,16069
22
+ capcomposer/cap/weasyprint_utils.py,sha256=-pvDIx4LI7txkoeaxoEfuxZf77ll-8kHZm618mf_sV0,3231
23
+ capcomposer/cap/external_feed/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
+ capcomposer/cap/external_feed/models.py,sha256=nw-Ts3hDmFZ1aTUbDIWaWMH4YPh5BGKYiTEp-lstsy8,4382
25
+ capcomposer/cap/external_feed/utils.py,sha256=wyLrs1eEZoIqj98wj6E0ixU4MQWMoy4FWvyAGhTTFf0,3700
26
+ capcomposer/cap/locale/am/LC_MESSAGES/django.mo,sha256=afRiWggBIJ8-pXFVWAOkLQfiEblw12qdZtbG6Bu_KAE,11886
27
+ capcomposer/cap/locale/am/LC_MESSAGES/django.po,sha256=MEZJHK76sbIToLPGFnC_kLuru_4W6L5spQpN5Tl91X0,20012
28
+ capcomposer/cap/locale/ar/LC_MESSAGES/django.mo,sha256=6tVRFh6u5r5j1R09IehyUvfxqldLhibUSRihlBlhhiw,11539
29
+ capcomposer/cap/locale/ar/LC_MESSAGES/django.po,sha256=1M7nUjcNKcDYRKvE9QmJs_7-o9LWf-mUt9XHxKnR5IE,19680
30
+ capcomposer/cap/locale/en/LC_MESSAGES/django.mo,sha256=u9hfC_gH_FrU51TLBQvn9Hcp-EKIvq7R5BPEOrtkXA0,9449
31
+ capcomposer/cap/locale/en/LC_MESSAGES/django.po,sha256=KZXo1kuGPex8FCfQhFZ6RolgEODJ_gT_hC1Doh9YzEQ,17489
32
+ capcomposer/cap/locale/es/LC_MESSAGES/django.mo,sha256=VKMZwi73HiX2vRjBFG7_nXcHyGcMKSpS-FPWg78POyE,10301
33
+ capcomposer/cap/locale/es/LC_MESSAGES/django.po,sha256=wsBj-gA5Uj8GdU-F1BOhy34-2FuSsi8bQwjUT-T6tPw,18481
34
+ capcomposer/cap/locale/fr/LC_MESSAGES/django.mo,sha256=pjO4vzjK2x0nDAAg-WzdN2tsbd5GeDhNVhRHDksqF6Q,10433
35
+ capcomposer/cap/locale/fr/LC_MESSAGES/django.po,sha256=J8Hej_h0dt5f_RJX3YpPRpJRDBS1nQtl8aTdx84h5LI,18601
36
+ capcomposer/cap/locale/sw/LC_MESSAGES/django.mo,sha256=h_LWuK4Ly4esb4yMvgB7-dhNYSQiu49dw5ix3FnZVNs,9908
37
+ capcomposer/cap/locale/sw/LC_MESSAGES/django.po,sha256=qY9LX8EtvwcoXfwYW_lgBUJuFIP3e66_eJUAgAMhpZ0,18125
38
+ capcomposer/cap/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
+ capcomposer/cap/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
+ capcomposer/cap/management/commands/create_cap_alerts_multi_media.py,sha256=vfLSCp-fZaGdkO4mlvOfOWI7smfYkb-kzlPxjtW8hck,1159
41
+ capcomposer/cap/migrations/0001_initial.py,sha256=A1rUiXacKhUkMB1q-hiMwAYwc7w86IHFK2cONKQNCaI,15267
42
+ capcomposer/cap/migrations/0002_alter_capalertpage_info.py,sha256=sprS3uLcaq_8k76h4aHWJUqSJNFVXvdl3DfIzmn2Q10,10587
43
+ capcomposer/cap/migrations/0003_capalertpage_search_image.py,sha256=EFRies0v9l2eOQomTXgJ-3zYTWpElgftmK4-ye1Ull0,631
44
+ capcomposer/cap/migrations/0004_alter_capalertpage_identifier.py,sha256=iCKGaKddApYHaHYVBqnY6g4mACgTfg5Ez335hKfxxFU,524
45
+ capcomposer/cap/migrations/0005_capalertlistpage.py,sha256=ruTVo2Yt1ERuWqpPJR-br8aji5SYIKTZey4HfaC95L0,1305
46
+ capcomposer/cap/migrations/0006_remove_capalertlistpage_description_and_more.py,sha256=ccYJLAUWtWl3iLuncT5lYybpUjxQ0nw7EYvdCrhSjqk,566
47
+ capcomposer/cap/migrations/0007_alter_capalertpage_info.py,sha256=tMDkw64gNt00u8pWPPySRt_WcMO4KDvq8rRgpb9QSTg,10744
48
+ capcomposer/cap/migrations/0008_alter_capalertpage_info.py,sha256=tHaBb_D-t_aqsB7Djmd7swseg1DR7GecQjv-Qsuw80g,10757
49
+ capcomposer/cap/migrations/0009_merge_20231114_0803.py,sha256=FZTDReou6hF0MTebMQ3D0M_o2AGppi9LgZt4clAAgt8,226
50
+ capcomposer/cap/migrations/0010_alter_capalertpage_options.py,sha256=fDeAxTLZ8u0AlhCTUWGjErBGXS_fkcSV4ecirk9pFw8,349
51
+ capcomposer/cap/migrations/0011_alter_capalertpage_info.py,sha256=hJMNxmwKa05mzk-ESH4hJ17LurIZucI4HNxT5NivZwg,11396
52
+ capcomposer/cap/migrations/0012_alter_capalertpage_info_and_more.py,sha256=KMqBQ3QqZUAc83PEvbxP5PYfs1QapErZbLLfx9S2p1c,11416
53
+ capcomposer/cap/migrations/0013_capalertpage_alert_pdf_preview.py,sha256=Q5rAQ-rTdrRA5qgzWazgZ5vMs8-478_y3VfAk2fFEPU,644
54
+ capcomposer/cap/migrations/0014_capalertpage_alert_area_map_image.py,sha256=JhjzkNiaMYeRbJffwqprPum6qTwgqcy80Bxxm8CO-Vg,617
55
+ capcomposer/cap/migrations/0015_alter_capalertpage_info.py,sha256=xTuoIkAQq0FWKe2ZUeyvRjlLXs4GBUq5Y8wFpRaPLvo,11402
56
+ capcomposer/cap/migrations/0016_auto_20240530_1637.py,sha256=UkONOXoGZCqK2B_LHxikdR0TgD1xCr__5jg2bn5hOcM,371
57
+ capcomposer/cap/migrations/0017_capalertpage_expires.py,sha256=Ydg8aa_byWfstVPdXqS-xOmxPRKVWiI0NXX89nf_qZM,1059
58
+ capcomposer/cap/migrations/0018_capalertwebhook_capalertwebhookevent.py,sha256=OO9j08WP5Rb4H1h6kt1PfDTal57KgvmsVQ_s9xgbsCk,2511
59
+ capcomposer/cap/migrations/0019_alter_capalertpage_options_alter_capalertpage_guid_and_more.py,sha256=1X2VC_rl-00FcPclaszR0tjOgpzkDJ_ln-QzL4JtEZ0,14098
60
+ capcomposer/cap/migrations/0020_othercapsettings.py,sha256=_I-8u5KCPCaD2lgw9OrbUYEeAQ7OaPF1cSDnwrb6n-w,1136
61
+ capcomposer/cap/migrations/0021_capalertmqttbroker_capalertmqttbrokerevent.py,sha256=x4dc80g5T6Ouuokz4bNNAAepQ9vYdOmMgWUaEgTtdyw,3623
62
+ capcomposer/cap/migrations/0022_externalalertfeed_and_more.py,sha256=4kvVJUVEpwRe04yRQAFqaMU0F4tuFP9P44l0Er4wj7A,16524
63
+ capcomposer/cap/migrations/0023_alter_capalertpage_sender.py,sha256=FuCq4K7DVOWKqIYAzL-8SqRx8vND3vTUlkigvHMVmq8,523
64
+ capcomposer/cap/migrations/0024_alter_capalertpage_alert_pdf_preview_and_more.py,sha256=Z-Ed7N5RCZxdWOValr5NJnFiQkEBt6NdUjD0dLhEXy8,690
65
+ capcomposer/cap/migrations/0025_capmenupermission.py,sha256=jKSVOHVesMxlsgJ4VNXSFZtk9M8fCdQpKtZgRJKwE5U,660
66
+ capcomposer/cap/migrations/0026_alter_capmenupermission_options.py,sha256=ccoI_uhWQrNg689evTh0PHvu6pqsaNxi7ZIjLfpjwKI,515
67
+ capcomposer/cap/migrations/0027_capalertlistpage_alerts_infos_per_page.py,sha256=2nRefTXWCSLa_1JkWeHLDEThT50nQdQ-P5fznM3zvZA,608
68
+ capcomposer/cap/migrations/0028_alter_capalertpage_info.py,sha256=_m3WNrccHDIJeSUCNPqQgR0PMirR59l1dR0ASAUglWY,9516
69
+ capcomposer/cap/migrations/0029_capalertpage_imported_alter_capalertpage_info.py,sha256=Ck8XaP1sxxvg1gytta7hZP0gGDuTHDo0WLH-U3G18q4,9714
70
+ capcomposer/cap/migrations/0030_alter_capalertpage_sent.py,sha256=PdJJcqSKF8ZS4Ndcvm9qFXeDHPqcIBhMpIZJjorXPhY,600
71
+ capcomposer/cap/migrations/0031_capalertpage_newsletter_campaign_and_more.py,sha256=xakaMVLnOigD0f7CkdYoR8JoMhrs-0HdIbr05D8LFBU,1030
72
+ capcomposer/cap/migrations/0032_capalertmqttbroker_qos.py,sha256=rJYJMPRNBz8HjPEKwmThLuk0fhlAuIyy4TU9el4gWas,576
73
+ capcomposer/cap/migrations/0033_capalertwebhook_header_value_and_more.py,sha256=0QrQivEABQL8JlZJs_ZQNh-I2oNNlRoHGBgVnvaosEQ,678
74
+ capcomposer/cap/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
+ capcomposer/cap/mqtt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
+ capcomposer/cap/mqtt/models.py,sha256=2qeTNztUlCNBYE9LLuHQ5ALuZh9AHargHWzgKb-V02k,6214
77
+ capcomposer/cap/mqtt/publish.py,sha256=6eEXDjrIGqW-yqKuPlnCfxtF4Oe9lx6UC3zUb-Q2vSQ,4169
78
+ capcomposer/cap/mqtt/utils.py,sha256=Puidxzh1ZPxMYByhbbiN0LCOvZEE5dpHjtam26CBr9E,1267
79
+ capcomposer/cap/static/cap/css/bulma-timeline.min.css,sha256=79rpunOWn0oA4xSBkXAOFSRwNOqcI_Q6U15J_n-LnPY,2667
80
+ capcomposer/cap/static/cap/css/cap_detail_page.css,sha256=sd5xvt6XiAof8NsryI-PS6WCp3kzTU__SH213vFvrew,4269
81
+ capcomposer/cap/static/cap/css/cap_detail_pdf.css,sha256=OMBoCLmrRIUmsnH3QDHNQeC8PffMm5j5V1YgzYmTflE,2330
82
+ capcomposer/cap/static/cap/css/cap_list_page.css,sha256=UBmKVPN-50DlH2lCxAHg1-Wi6FpZqxZLyZyCJwYChn8,1631
83
+ capcomposer/cap/static/cap/css/codehilite.css,sha256=W-UqSNJjDmy2OFlrcHJ3N0OQ1V_ue3k1FZnZSDRekyc,4919
84
+ capcomposer/cap/static/cap/images/cap_symbol.jpeg,sha256=fFcCZfGByTveBoWMHTLHzZ95ZZGfhYTatHF08I9Z_34,54687
85
+ capcomposer/cap/static/cap/images/caplogo.jpeg,sha256=CwDaIyH8FDvzKZW6vAoKR3Cz7FK5FjOy-w2j8T_Vl2Q,7946
86
+ capcomposer/cap/static/cap/js/jquery-3.7.1.min.js,sha256=_JqT3SQfawRcv_BIHPThkBvs0OEvtFFmqPF_lYI_Cxo,87533
87
+ capcomposer/cap/static/cap/js/mqtt_collapse_panels.js,sha256=yD6NONXIqpsEXuMccroOQhlGn5wP8_KaQIiIidRUhmY,827
88
+ capcomposer/cap/templates/cap/active_alert.html,sha256=zT2WjAyfpNRS2y0QVH85pAaA3sEHCJh8ra2LhAGCRfM,3292
89
+ capcomposer/cap/templates/cap/alert_detail.html,sha256=kwX1TqkAYSUETWTF0zDVg23ZqF60T-0e0YSJorwbCxQ,41423
90
+ capcomposer/cap/templates/cap/alert_detail_email.html,sha256=ZteK9vtPiKAy75XQzC8LHEtkw24Upe8M11D4IZrnUao,10671
91
+ capcomposer/cap/templates/cap/alert_detail_pdf.html,sha256=8iSvi44MlgLKfaEr-tCAuYuQBCVwZSpfJmP-CEIhnbY,13018
92
+ capcomposer/cap/templates/cap/alert_list.html,sha256=w8Rxg87mDqUMxG5ANtgpdXE-tRKVrh50lz4hQRxnNNc,9586
93
+ capcomposer/cap/templates/cap/cap-alert-stylesheet.html,sha256=1izCIxXV1BTQwle54nPxl_vrNVbuIPs2_jMnxZc9xfo,34673
94
+ capcomposer/cap/templates/cap/cap-feed-stylesheet.html,sha256=kZMYwMr5W2uO0OrUt085w4wg6RfhwEfciYZUvhIw5dw,3321
95
+ capcomposer/cap/templates/cap/include_alert_list_item.html,sha256=3NV_qVR1RYkA18vWoKG79nsmNnD1i3esZNC9NlCzXvE,2213
96
+ capcomposer/cap/templates/cap/pagination_include.html,sha256=ZqQlU4d3vxEhBv3W6DX6g5z5XpySWSbQ-6kKU2pqIzM,1404
97
+ capcomposer/cap/templates/cap/social_media_share_buttons_include.html,sha256=mZ_iA4flXkadBa5kmNnkJW5-uaekj0gpm7jqQTcHgoM,520
98
+ capcomposer/cap/templates/cap/third_party_integration.html,sha256=P8_fTGDjNw9DCpo3VPFP5CiquwF1M95aGBn6XikSXT4,891
99
+ capcomposer/cap/templates/cap/third_party_integration_md_content.md,sha256=2agOxXfQnQPprARIEQ-CjY_X-cJfVUMXFqOcsuH0PoI,4939
100
+ capcomposer/cap/templates/cap/icons/category.svg,sha256=XDLyVqtWKskYmKqQVnR1LVyIG1VBxxFj6gj_oYKEoak,363
101
+ capcomposer/cap/templates/cap/icons/certainty.svg,sha256=1VZN14kNYSoLlHL2Lq2JFJbwOdntHez8846ieCoL6tc,775
102
+ capcomposer/cap/templates/cap/icons/clock.svg,sha256=43dDbMyNyqc9MjWKH4tWWQZ7IJPow06j28-pOICGxwo,356
103
+ capcomposer/cap/templates/cap/icons/language.svg,sha256=GimjsH0OMXE5GNQvCzC06OG0PnB2yVvDWI3xxkMFHdo,1093
104
+ capcomposer/cap/templates/cap/icons/response.svg,sha256=jXx3W9E2hTmcKrzdP842eial_eS_fV_A-EuyRD0htwc,587
105
+ capcomposer/cap/templates/cap/icons/warning-outline.svg,sha256=VElvu_dWpddesfk0cQa1RDrYEI-lsCsZYih7gNSwcAY,1873
106
+ capcomposer/cap/templates/cap/icons/warning.svg,sha256=oBlyDN6D6umj8bEozxYfMkOFvEuQj31oHyY2FPWC5q8,349
107
+ capcomposer/cap/templates/cap/icons/x-twitter.svg,sha256=Vl7lo8O-xlSJloa-_eQCV6ADxPqRJprV5Im8yGzrOYw,262
108
+ capcomposer/cap/templates/cap/widgets/nav_left_alert.html,sha256=36Rn0gtwKcDJANin7cekwtSTa0liIWh6QjodpAVTGho,3345
109
+ capcomposer/cap/templates/cap/widgets/nav_top_alert.html,sha256=H9iu8lGR56blSRtMIHQA2T8N981r0yy3Gt91w43oJ3U,2210
110
+ capcomposer/cap/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
+ capcomposer/cap/templatetags/online_share.py,sha256=hIEjDxrRkelf-6UiJS47N7F7aQw95QepYtBt6ALHtK0,2978
112
+ capcomposer/cap/webhook/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
+ capcomposer/cap/webhook/http.py,sha256=egf0TAT-iliHRStQ_wBJGu2kN-0haITCLJ_v6BukWLY,614
114
+ capcomposer/cap/webhook/models.py,sha256=tcGwV6RJe8L7WF_p8u2eEbw81j0lrtxgHuz1wRpD4vw,2264
115
+ capcomposer/cap/webhook/utils.py,sha256=ClMXZK4uUywzf7WyH8fB0maNJTXw6cQrbMNDiOGbviA,1947
116
+ capcomposer/capeditor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
+ capcomposer/capeditor/admin.py,sha256=suMo4x8I3JBxAFBVIdE-5qnqZ6JAZV0FESABHOSc-vg,63
118
+ capcomposer/capeditor/apps.py,sha256=QAySH8xBMgD3YrIhmmkACnafQILouRD-EE5pprVLXFo,162
119
+ capcomposer/capeditor/blocks.py,sha256=4e9bqvalxkEsxnEbFqufyNDcwYNlXGDtqs9z6On5Fj0,29645
120
+ capcomposer/capeditor/cap_settings.py,sha256=kD2n0B1Rn5ZgwLNTTZ-rOtFUiClAuKLcVrMLqY4ZHNM,8904
121
+ capcomposer/capeditor/caputils.py,sha256=nTnkSOoaVNXd0JAMlTERXhuzil47uv9NwIK9G_UPY6w,11928
122
+ capcomposer/capeditor/clear_fuzzy.py,sha256=S2edS804ZsBZd8KL89fsFX2ufKxDocTqFW-URT3SjFs,759
123
+ capcomposer/capeditor/constants.py,sha256=i31fmi83Rob1fCgU5Ri6OBRpLcXlHm-KqXpSZcdL52g,5668
124
+ capcomposer/capeditor/errors.py,sha256=RsbcvsRWKWTY84LgC__gG95Ealv9Hx4xDFKagjsh0QI,129
125
+ capcomposer/capeditor/models.py,sha256=ep057eUU_tLG8nOtfREc0CKIjhgYIAGGTiORGdF7L-o,18938
126
+ capcomposer/capeditor/oet_v1_2.py,sha256=vny4Bfi9vE9dVApEkGhUw2PJb6vrjnMIGRXF5KDIfuI,17400
127
+ capcomposer/capeditor/renderers.py,sha256=4ZrzWKepAreP9oLkdFTHq_CRu2Ujwptzbf4AVZT7n_g,2102
128
+ capcomposer/capeditor/serializers.py,sha256=ASeKYeQaqauPNlHL9yKPdijq1H7EvOewzeK5wqGf7R8,7049
129
+ capcomposer/capeditor/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
130
+ capcomposer/capeditor/utils.py,sha256=FDfkSiy33tC4tqVmeEkSH-F0Pj2DFikYtJj_yeO_3B4,3255
131
+ capcomposer/capeditor/views.py,sha256=vR3vytfM1mzCjQyJYFsqD3pvXhbvm050sV8Xc0OPbqg,2019
132
+ capcomposer/capeditor/wagtail_hooks.py,sha256=oYlEYhiR1E8p8FMMwuw4KPsAYLy67jBWEVOqid82Uy4,4212
133
+ capcomposer/capeditor/forms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
134
+ capcomposer/capeditor/forms/capimporter.py,sha256=ABcwDGmPEkkMRiPaLH1gEqynC7iz1gu09RFUxFB6_vk,2989
135
+ capcomposer/capeditor/forms/fields.py,sha256=g5fEEzKNXkj9R0hyWQ1_6dYJ_5VUpCcoBjjLrETPk-w,2115
136
+ capcomposer/capeditor/forms/widgets.py,sha256=0Oke4HEc7QY-tIbeQCLGJA9tw2cLh0kxG2FklpJ-r1M,9409
137
+ capcomposer/capeditor/locale/am/LC_MESSAGES/django.mo,sha256=46psMt_m3xQ4pk7ZmGxVWz_K80rH3TZIhRBYM_bFIh4,31645
138
+ capcomposer/capeditor/locale/am/LC_MESSAGES/django.po,sha256=205Hzzg2dTCXjvjtq90pjJMxhVM5YIilezYE3Pk1LQQ,42976
139
+ capcomposer/capeditor/locale/ar/LC_MESSAGES/django.mo,sha256=C4CBWE5-VA-thed_DHLdllVfDtcqwyByFuJUdaTWLYY,30402
140
+ capcomposer/capeditor/locale/ar/LC_MESSAGES/django.po,sha256=agsbhq6cRM8cDjPVAibZq_AgpWlL3vNhv6K6FfAdKf0,43282
141
+ capcomposer/capeditor/locale/en/LC_MESSAGES/django.mo,sha256=joQ3i0ts9VNffOTGGdOQHhQNKhua10rbBGfVtZdTsU8,25031
142
+ capcomposer/capeditor/locale/en/LC_MESSAGES/django.po,sha256=0D-wV_AqQwK7juJCJuxDqPwgGQIefupJ-ZnwsvnPNFw,37718
143
+ capcomposer/capeditor/locale/es/LC_MESSAGES/django.mo,sha256=XqjcTMc5KsNLSsw23VXs85uqE29CaP7TmPRE2x8lFXs,26780
144
+ capcomposer/capeditor/locale/es/LC_MESSAGES/django.po,sha256=MVJ4IV8_j9aWLoSRcSI1Y_NSsZ6KnPXwF7_POCTQi60,39660
145
+ capcomposer/capeditor/locale/fr/LC_MESSAGES/django.mo,sha256=aMVy8m2iUP4JpicbW-6xENM2JXR3sdza-u407HNskjM,26714
146
+ capcomposer/capeditor/locale/fr/LC_MESSAGES/django.po,sha256=R87uCsKdVteQZJdk2JkRj8Sg9adT1_eYEEzELsoLTtE,39566
147
+ capcomposer/capeditor/locale/sw/LC_MESSAGES/django.mo,sha256=T6moDwUTwlALd-4vL011091Gn_A6D26AyeWhEO2sjJY,25892
148
+ capcomposer/capeditor/locale/sw/LC_MESSAGES/django.po,sha256=Bw-A3AIekFD-kQP-6wKjR6S78pNgPjttk-Y8EVrZRRs,38652
149
+ capcomposer/capeditor/migrations/0001_initial.py,sha256=LuhhaExHMl6PZZL9cngExOwchZ1VN0UI6F6LIfIG4gc,2303
150
+ capcomposer/capeditor/migrations/0002_alter_capsetting_options_and_more.py,sha256=-Q2r0dyix0E7H0Va0gjHwy22s4HkzYd5LugsxXuGwpk,1542
151
+ capcomposer/capeditor/migrations/0003_capsetting_logo.py,sha256=lu3pSIb89cajhDNsobpfP4aJCINp6v0yXoMUvCjnO3M,657
152
+ capcomposer/capeditor/migrations/0004_predefinedalertarea.py,sha256=gIeN6f7UnSiCDz8jkXX17Ln0WatR6hVhsr8ubIGdVCE,1179
153
+ capcomposer/capeditor/migrations/0005_alter_capsetting_sender.py,sha256=NhNioCUeJ9jpV_uve7Tymjn-xSo4WDdaF-gZ75QY5Nw,497
154
+ capcomposer/capeditor/migrations/0006_capsetting_wmo_oid.py,sha256=GkEU3wfiX7h91m6qWNzy69UQo6crb_SkqgAYeGMlJ54,478
155
+ capcomposer/capeditor/migrations/0007_alter_capsetting_wmo_oid_and_more.py,sha256=KbsyLy0XsRkO9B8xLFCWty29QrB9apcmTYKbYQx8r9E,858
156
+ capcomposer/capeditor/migrations/0008_remove_capsetting_audience_types.py,sha256=OQ5iDeiGBuWQPfHgkFxT-1ToJKI27PCPm7Sd9v9HS1E,357
157
+ capcomposer/capeditor/migrations/0009_capsetting_un_country_boundary_geojson.py,sha256=himddcJj6QULaxJlgkacZ78wlCsrRs4A5hOuSsuBc30,478
158
+ capcomposer/capeditor/migrations/0010_alter_capsetting_un_country_boundary_geojson.py,sha256=L6DhQq57vwr88xImOc3P-P06xCbwRL48F9gS8INDwXE,612
159
+ capcomposer/capeditor/migrations/0011_alertlanguage.py,sha256=WV1vCxDs4gqAMxhIGvyWL3lzSj8wA7ntogDhcc2lUpI,1948
160
+ capcomposer/capeditor/migrations/0012_alter_hazardeventtypes_options_and_more.py,sha256=7T1cyfZpGdvahdlNLMFZT8x1wXoWjJzf87udtG7LlwY,806
161
+ capcomposer/capeditor/migrations/0013_capsetting_num_of_latest_alerts_in_feed.py,sha256=dBX0Rj2IxZOc8AMNfSk4wke5E4JXZsDpKADC_2sA304,699
162
+ capcomposer/capeditor/migrations/0014_alter_capsetting_num_of_latest_alerts_in_feed.py,sha256=mBkMlNHxzniCcUt-3TJlxC4THvWhQvfJntglPuJfZBI,717
163
+ capcomposer/capeditor/migrations/0015_hazardeventtypes_category_and_more.py,sha256=W8Qgn0HmRoaTvdsfWE0xct-LSM6wNbHMSPcAIpJiXqk,1323
164
+ capcomposer/capeditor/migrations/0016_alter_predefinedalertarea_name.py,sha256=qIz2GioTb7ZHuwsVDuqpzirVv1RUno1dmuAmFELVIpQ,437
165
+ capcomposer/capeditor/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
166
+ capcomposer/capeditor/pubsub/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
167
+ capcomposer/capeditor/pubsub/base.py,sha256=hJxFrnOMb4bYqfTc1QgYO08YVCL8RsE5ksdaev-mq2A,1928
168
+ capcomposer/capeditor/pubsub/mqtt.py,sha256=DxYujwxa8PxsK4liIpGrRbsAP_L0hlSoXtjq11MK8z0,3862
169
+ capcomposer/capeditor/pubsub/publish.py,sha256=_7norUisccWgCwQaExyc5msLWaa7CgJrRKR-GJzK7Q0,767
170
+ capcomposer/capeditor/static/capeditor/css/cap_detail_page.css,sha256=2iY7wVEcHge0SAgETCPr3_XF2doUdD9iW20szb-T93M,3269
171
+ capcomposer/capeditor/static/capeditor/css/import_cap_preview.css,sha256=1Y4OcIA1nePSXT023ymNMz4tbaDQIRwsV2bDVMqMB9I,546
172
+ capcomposer/capeditor/static/capeditor/css/mapbox-gl-draw.css,sha256=17tTeM3yuBswUqyCE0vegMfNFyPAQk2mLxjdOYNFv7U,4492
173
+ capcomposer/capeditor/static/capeditor/css/maplibre-gl.css,sha256=YTtiyHv5-NUcpQr9OvIjdSlENdVVccpHVEVoAcHA8zw,70882
174
+ capcomposer/capeditor/static/capeditor/css/widget/boundary-widget.css,sha256=PSxLbeO6alcvKjXAUxEhlk8xcn8iopEXpctBOZ56TKw,1449
175
+ capcomposer/capeditor/static/capeditor/css/widget/circle-widget.css,sha256=gSEwKt7jeBg94JsS-cRHXkD2xwi0Gpg2ChHxeiSyVms,1987
176
+ capcomposer/capeditor/static/capeditor/css/widget/geojson-file-loader-widget.css,sha256=Ptgnd4Aj-SgqStvPxNge-FthBa6jzhUI32tDzu3-JTs,2688
177
+ capcomposer/capeditor/static/capeditor/css/widget/multipolygon-widget.css,sha256=YOsYoDKfrvV6oVW2GHNY-IQZCo_qh_IkbO-j1kB-L1c,1515
178
+ capcomposer/capeditor/static/capeditor/css/widget/polygon-widget.css,sha256=z7VpuMscUYPRyEp71QsTTHIjukiaocreKjdk9ZjJ63w,2585
179
+ capcomposer/capeditor/static/capeditor/fonts/mapbox-gl-draw.css,sha256=17tTeM3yuBswUqyCE0vegMfNFyPAQk2mLxjdOYNFv7U,4492
180
+ capcomposer/capeditor/static/capeditor/fonts/Roboto/LICENSE.txt,sha256=Pd-b5cKP4n2tFDpdx27qJSIq0d1ok0oEcGTlbtL6QMU,11560
181
+ capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-Black.ttf,sha256=Ws4NCDOrg_8Y6pTkp3RfkZxFiuTqvCmCGCJt9CdczU0,168060
182
+ capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-BlackItalic.ttf,sha256=iy-H-wj_S11i51PHUP4ykYE1hlAfoU3SWLGtC_ulM64,174108
183
+ capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-Bold.ttf,sha256=7GhaRhBSlv5GyHRNpKEc-BGLpsEScZQXZvelRt9qp8c,167336
184
+ capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-BoldItalic.ttf,sha256=Yd9Zf3PJHyOMvoj-PFNnAtEg0Ei3myX6D094GP0SOm8,171508
185
+ capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-Italic.ttf,sha256=meSoUGETbpngUpKe0NheNjhPulw0t3MTmo9kM5xgmUM,170504
186
+ capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-Light.ttf,sha256=xXbFBkInG82__-0E-S3I1qmB2vMAkU0KIMilpaVwFcc,167000
187
+ capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-LightItalic.ttf,sha256=pIQGImhU00_plkKlJKQ7L9Jqfb7KgC1RAKipjSDhtz0,173172
188
+ capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-Medium.ttf,sha256=nQ1VowO_0Tt5qHch9lGF6T8jXi13_jmLLcpnrFGZFfU,168644
189
+ capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-MediumItalic.ttf,sha256=0_MXyX9AA4ksuWm8_OjePcnWf7-W_a-miy41lTF7DZQ,173416
190
+ capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-Regular.ttf,sha256=ThR6tkuf322J0B9rjDygs83cWdYIqOIhj5olBLXJjhQ,168260
191
+ capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-Thin.ttf,sha256=ZySPfoxu2zzn73Ow8ApTSn9CwRFs72POIbIDW16XmgY,168488
192
+ capcomposer/capeditor/static/capeditor/fonts/Roboto/Roboto-ThinItalic.ttf,sha256=KM4lGpnNV9AKmCJaj8tmtgtp2vELCUfH7E7VA8Iq_-8,172860
193
+ capcomposer/capeditor/static/capeditor/images/alert.png,sha256=NeORgUIXFzSXJ5-E5sIW00u89Fabb-JDmJVnKtVQ8U0,526
194
+ capcomposer/capeditor/static/capeditor/images/alert.svg,sha256=8aPtloy5h-lcALHj9YmWN-x-ZcSxGlNInnEJFEcmvBg,1408
195
+ capcomposer/capeditor/static/capeditor/images/area.png,sha256=AMULGxfXV9n1nyBaQXulThz9UDNwTRjN-lg8nkeYpcc,517
196
+ capcomposer/capeditor/static/capeditor/images/certainty.png,sha256=0DTPdcgeDfxVgAiqQn5kJgaRwCUiCPtZmPNEYMnXddA,1128
197
+ capcomposer/capeditor/static/capeditor/images/extreme.png,sha256=ylwfqFDV1KNEyIypsUzcm5BCCK6cZefJGuAaL4AABhQ,997
198
+ capcomposer/capeditor/static/capeditor/images/minor.png,sha256=XLQdc4bfOH7Xb3EcrUAKBU-tbmDYknnHsd_poBn2HUw,1034
199
+ capcomposer/capeditor/static/capeditor/images/moderate.png,sha256=__iOfdTNExHK6LMZF4lfUFOKAsJfK_2GDKdRyKXM_v8,1016
200
+ capcomposer/capeditor/static/capeditor/images/severe.png,sha256=crc4QK1twTbNDMXgICsgFODMiOyd4NfSszhcvSY_cuw,903
201
+ capcomposer/capeditor/static/capeditor/images/urgency.png,sha256=xJWzJo-ooPlT1m_CDx4-hNzIkG1UG81K5mj4Nw6f_jM,509
202
+ capcomposer/capeditor/static/capeditor/js/cap_accordion.js,sha256=TyDZf4dNhqMQ9GPL8n-7lPHuriXZ8H8oGhdEYB4efkU,1852
203
+ capcomposer/capeditor/static/capeditor/js/conditional_fields.js,sha256=biH4wEbiDe9BDvmNoWdzIKdppWBU17LxVCtaADuacZU,2912
204
+ capcomposer/capeditor/static/capeditor/js/mapbox-gl-draw.js,sha256=UWF6nLvOer04k3HjVu1US1dyOdOOxLhBgOW4g2CyW-A,79103
205
+ capcomposer/capeditor/static/capeditor/js/maplibre-gl.js,sha256=18Ei5GU6SIPaEJhunxZVp9QX8iOUcr9ehOczgkK7elE,704176
206
+ capcomposer/capeditor/static/capeditor/js/turf.min.js,sha256=LGm6kbmxK5sQ67far03lYp6nye7OYOsDSdXB6cas7xs,633913
207
+ capcomposer/capeditor/static/capeditor/js/widget/boundary-polygon-widget-telepath.js,sha256=JlDec3BIx0WeC-PuKbiJb6_hBBHPGSmFFgImBz5OvC8,591
208
+ capcomposer/capeditor/static/capeditor/js/widget/boundary-polygon-widget.js,sha256=wyzD_KHBpcW2JGPVNQtpDEzQOfcYYw9ftPLapS0TxIM,14146
209
+ capcomposer/capeditor/static/capeditor/js/widget/circle-widget-telepath.js,sha256=SFNO51rlQpHi0cjMAKa2b56Xm3IUw7DyqC9AiyYBrZU,546
210
+ capcomposer/capeditor/static/capeditor/js/widget/circle-widget.js,sha256=zYXrltL_LTle_csPfPa0JpFaTzMnuigLP5GtZI8JyVA,12834
211
+ capcomposer/capeditor/static/capeditor/js/widget/event-code-widget-controller.js,sha256=K_kz7wKpd69brO7WnGHVyQX8Ew5Sm-vuke-Tj9SedVY,243
212
+ capcomposer/capeditor/static/capeditor/js/widget/event-code-widget.js,sha256=0MePGErMZ0XVzjTLOOYD-XPtdshIqpHa7jv_WUqly0g,1418
213
+ capcomposer/capeditor/static/capeditor/js/widget/geojson-file-loader-widget.js,sha256=w6OhFTURxw7mO7XXESr41c7jEWv-HI5Vp_IcQIbpVJ8,7416
214
+ capcomposer/capeditor/static/capeditor/js/widget/hazard-event-type-widget-controller.js,sha256=iqtigjoksRMJKmp-fhepT4PVbfLCc1FVdGTM2y6q5P0,267
215
+ capcomposer/capeditor/static/capeditor/js/widget/hazard-event-type-widget.js,sha256=jvdM2wABuX8v3EMXsQazAN2huXNv4jzMnrvKT8qDmRY,1303
216
+ capcomposer/capeditor/static/capeditor/js/widget/multipolygon-widget.js,sha256=Ufq40m5XH6OVejZ48ridEbtbks5obq3v1TAob9WiCxY,11035
217
+ capcomposer/capeditor/static/capeditor/js/widget/polygon-widget-telepath.js,sha256=TyE9iA2XizESmxPL2QF8ATSXuLfuvvDW1EAcSryWm5I,551
218
+ capcomposer/capeditor/static/capeditor/js/widget/polygon-widget.js,sha256=UwuWvSkEQO03pkhR5qTrpEbEpVGTkzklA8jCBfE9zrw,17618
219
+ capcomposer/capeditor/templates/capeditor/cap_alert_page.html,sha256=-pyxpuGmqymgSf8MdGZQBynuZqKjon3i5m6JGUt-B3Y,17275
220
+ capcomposer/capeditor/templates/capeditor/load_cap_alert.html,sha256=MIONfQJA5yvpTSbTkdTiVOVJhZov1GGPkQv1tkud6-k,3560
221
+ capcomposer/capeditor/templates/capeditor/preview_cap_alert.html,sha256=aIqZqVBE5jPHPvXyCpzfi8FcNZbzYHPfKs1V8bTbamg,20406
222
+ capcomposer/capeditor/templates/capeditor/icons/cap-alert-full.svg,sha256=z1JRugQ9On0Y3geGAlIUr5UhLL9Y-Dy2FR0iI1jYgWY,4092
223
+ capcomposer/capeditor/templates/capeditor/icons/cap-alert.svg,sha256=MLO3wpTlRu_MOpfK-43ldxnyg8ObiPXDG0R3GReSDCA,1753
224
+ capcomposer/capeditor/templates/capeditor/widgets/boundary_polygon_widget.html,sha256=39ckMRpgZSidIei9bN5adgZt2HwhLKWxyZ43k4TUINA,386
225
+ capcomposer/capeditor/templates/capeditor/widgets/circle_widget.html,sha256=ExdBztZ97nHNDHa7Ezj-icuJz_woAkJX9WOevyawKvw,2856
226
+ capcomposer/capeditor/templates/capeditor/widgets/event_code_select_widget.html,sha256=X3nhTiEtL66P--RsxjEDcWRoMfVhkVIut47oAyn9Yd0,280
227
+ capcomposer/capeditor/templates/capeditor/widgets/geojson_file_loader_widget.html,sha256=a2AlDajKCC43v38B3R20NKYqFQ8wBuYFD9s01hHUFH4,855
228
+ capcomposer/capeditor/templates/capeditor/widgets/hazard_event_type_widget.html,sha256=ETJ9ROY34FBWlVNyADPN7EoRmv1WiR7XeUzB2XU56RI,569
229
+ capcomposer/capeditor/templates/capeditor/widgets/multipolygon_widget.html,sha256=PkAX7Sg7SeMea_pnlb1HmIaaSkBtI4uFFmvQFwhlpKQ,861
230
+ capcomposer/capeditor/templates/capeditor/widgets/polygon_widget.html,sha256=njOdGG3xGmmRPWFheVDx3YFN7NXoN0Dy6DQkDi2bSgI,429
231
+ capcomposer/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
232
+ capcomposer/config/asgi.py,sha256=oFzjge8kdHxVp3DGYjurmL9ps2fjAhGozA1lYdVZWqU,712
233
+ capcomposer/config/celery.py,sha256=RUWeYoEAkM8yspy5cpxxe8qr-cjIDiJNP35t6YX0Sew,147
234
+ capcomposer/config/celery_singleton_backend.py,sha256=iB-dzBakzVRMfkSfTExDdr1dKa-xVBlH8Tlnggwq8ts,345
235
+ capcomposer/config/storage.py,sha256=ylEqmw5wIBTA8BBivK1CKrazwrMEuGvPfGabYwXaqYU,357
236
+ capcomposer/config/urls.py,sha256=rCy0htYRGMfpgyo-4YWdv23BYN7mljZCsEo4eJxEIEo,1820
237
+ capcomposer/config/views.py,sha256=qhbeQ3ppax4R-4KKjZKTvVUgt_J0kvEeLMKaiYKqNjk,311
238
+ capcomposer/config/wsgi.py,sha256=gsfiRrl3AIgMGWjv4ouifmmvLovKpBOwpVHfVW82qyc,818
239
+ capcomposer/config/db_engine/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
240
+ capcomposer/config/db_engine/base.py,sha256=LhWI0MYY95Au323MZqc1yt2e_qgRSjoYaRatpFCbZKc,630
241
+ capcomposer/config/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
242
+ capcomposer/config/settings/base.py,sha256=hj5Bg124PrWlPlYM0uQ5pU1Hks6WFPEbE-w16vOp-FQ,11978
243
+ capcomposer/config/settings/dev.py,sha256=o-X9lDXEx6someHekEZ3hR-hiSYaGO9UsdQ2ghjqPa8,570
244
+ capcomposer/config/settings/production.py,sha256=XfV1HuVj1Pobm0OTNzZZsCzTOYYHqypSvT8af_ePsME,1118
245
+ capcomposer/config/static/css/bulma.min.css,sha256=efrxyTTvKJ2Q1_BD8p9dZFtTEcil-cMzxZeL_7hdO2g,677242
246
+ capcomposer/config/static/css/cap-composer.css,sha256=8-g3VFrbzg4-HEnvz89cKXyBt2IUjIg5vE44CZ-7gJ0,1096
247
+ capcomposer/config/static/css/maplibre-gl.css,sha256=2O5Q3ujU9bBBT9Jnuc6Lu9m0bZVKMRW9xE164V9gqZQ,65369
248
+ capcomposer/config/static/images/capcomposer.png,sha256=J-T6frDbrYrxjMmc3O6ePDTNDZ81sNlYzJj3ty3-9UQ,14667
249
+ capcomposer/config/static/images/capcomposer_red.png,sha256=6A-HSSa-biHJ2_FhWslX8TEEYENqTaKaEwoKwbomaUU,9732
250
+ capcomposer/config/static/images/capcomposer_white.png,sha256=44HYNiu4hupaL-QIWozcK_73sbtUoNtTiHsNBFZ2-k4,10056
251
+ capcomposer/config/static/images/weather-alert.png,sha256=AjEHIVrqxlOJgazPcbCYA1FLaccUWI2CS_e2uyTwwQQ,19724
252
+ capcomposer/config/static/js/cap-composer.js,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
253
+ capcomposer/config/static/js/maplibre-gl.js,sha256=4Kr0Cs8Fyxod6iSMiZnDfCJ0_zNu0zsgSWrcw3FGJo4,774871
254
+ capcomposer/config/static/js/turf.min.js,sha256=0A8-j_io-cED2tYcL9S7WBQ-FASq398J4pttsaLeCj8,604610
255
+ capcomposer/config/telemetry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
256
+ capcomposer/config/telemetry/env_overrides_parser.py,sha256=Vb31ExeGKPlbGMwoaZwshiH9a8Y_zYz1msKRANSDHMI,4214
257
+ capcomposer/config/telemetry/middleware.py,sha256=IHoC0vo9R56bVO0CfO2fVMhfGP0C_UbSB2wFSvAlsgQ,724
258
+ capcomposer/config/telemetry/provider.py,sha256=MkBikKrTo5EAUkmDJ-PORYuDORVISRxv6-xXCdZWGL4,2265
259
+ capcomposer/config/telemetry/sampling.py,sha256=yFFSYSeSnaqG1EuI6Md0fHefhjIMDc9JcpYCVvcnIn8,1853
260
+ capcomposer/config/telemetry/telemetry.py,sha256=qrmVQxneqthamtGhTwcfLR2GeXtDx8_DIEl0qtXhpA4,5781
261
+ capcomposer/config/telemetry/utils.py,sha256=oxAqlVbe960N7BfTJOOpr_yMrZntKWQ1l7poOdw4Zaw,6041
262
+ capcomposer/config/templates/404.html,sha256=xx3d9eDZPgQUDi9f05-hIhBq5zIq0aAVHrydynSR1iI,904
263
+ capcomposer/config/templates/500.html,sha256=VhcQM2yR1Ggm7jgL_41-Bym4ebDFPcUl6EFTK-mim7M,911
264
+ capcomposer/config/templates/base.html,sha256=-UUncN7pXRBuiDAOpRw5Lw1wOnwoj0hNmLeBmRnbgCY,2099
265
+ capcomposer/config/templates/breadcrumbs_include.html,sha256=h42XxIQRehtp5fHEn_pcZSy3rhdC-myhLIs5NrpFYjA,556
266
+ capcomposer/config/templates/footer.html,sha256=0gwUD15K6DZKJn0XvOCyAsHkuQBsC3YMcGg0l-mrNIY,470
267
+ capcomposer/config/templates/humans.txt,sha256=J_MTAP86FSFRruM-01xZI7e6jvfL4aQ-79xuni2WM7w,1110
268
+ capcomposer/config/templates/navbar.html,sha256=VrSGMueK8yFHa78z8jwgnSU2kOl8DmaM2X38S8bHpoI,996
269
+ capcomposer/config/templates/axes/lockout.html,sha256=Xk0dPl4bqrLfLMO32Wnl3mWWtxdGqK3H2HRS9RIB4Ow,1338
270
+ capcomposer/config/templates/wagtailadmin/admin_base.html,sha256=fdoDARYcOyAnZOeRg4a86iyxDP4BN1z0KgsSQm60Xcg,97
271
+ capcomposer/config/templates/wagtailadmin/base.html,sha256=DlnjBXryrLwoSHeLNuImvfYxflC3rHzQMkW_LAZ8-ko,347
272
+ capcomposer/config/templates/wagtailadmin/home.html,sha256=dTz4ZU95dWydIuwU1CpuNK9QGS8iMUMc4QbHZ6IU9No,330
273
+ capcomposer/config/templates/wagtailadmin/login.html,sha256=myQ-a49LeiAcgFMylEPoZnzBhZVCPW1yV8PwJN_zOLc,626
274
+ capcomposer/home/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
275
+ capcomposer/home/apps.py,sha256=UH1vZM_O0HdrXFRJVN67g682xcf6s3YYSM4cS_nVmoc,152
276
+ capcomposer/home/models.py,sha256=xtzfWM2JZO2gNSfW4_8hNZ2Hg7HF4pRSfnZ2DHu7nKY,2407
277
+ capcomposer/home/tasks.py,sha256=XmLVKC3v87V-kosDUq_bq0pMgeVJoNBWd00LDCQ9GZs,759
278
+ capcomposer/home/wagtail_hooks.py,sha256=CVmZpImQrnubDAvnwjYDi73ou0RcR__fKlHyk4zA1Tk,198
279
+ capcomposer/home/management/commands/get_capcomposer_version.py,sha256=mg1rT_kBS6UDyCYKEtKK_nmU6OfR0YO0OUWHnY8pK7g,384
280
+ capcomposer/home/migrations/0001_initial.py,sha256=DGwitdslkhnz-h4wrmI2TW2tjZY9cbxZuC2lcyeVDrs,806
281
+ capcomposer/home/migrations/0002_create_homepage.py,sha256=NrYtb1AtH7TqNYkkItbxT5FutCsD-CcumTQ5vYaMh50,1717
282
+ capcomposer/home/migrations/0003_homepage_subtitle.py,sha256=RjeMVhwl7VRL0YEQaYUmQ0HevTaqn69OB42gtpXYvE4,432
283
+ capcomposer/home/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
284
+ capcomposer/home/static/css/homepage.css,sha256=GAjAE6Ld7IWpK5jcdnQknYE_PrdvCLV-MBSnSru0gOU,1725
285
+ capcomposer/home/templates/home/home_page.html,sha256=4Q2v7cIou8IcBSGnTAVM7YJv2SFL0wisfIdfDXJbRdo,1459
286
+ capcomposer/home/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
287
+ capcomposer/home/templatetags/capcomposer_tags.py,sha256=l97uZjlm1nbUxpOtxZWXGKzYOJJnRVE0_0vPpikW0zE,371
288
+ capcomposer/utils/__init__.py,sha256=9UILDD8z5HKWJNCQPkDKdLgy6TD2pKm7t4jeGuPJHmA,690
289
+ capcomposer/utils/version.py,sha256=hhnj5OWGp_xBfUJE17w9M8WDuMJfQNtf0CgTvJ8icD0,3467
290
+ cap_composer-1.2.0.dist-info/METADATA,sha256=2gLwJljSK2xp9H4DK_Fe7E4a08Y5cj_zorbnFdick6o,2390
291
+ cap_composer-1.2.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
292
+ cap_composer-1.2.0.dist-info/entry_points.txt,sha256=Xlfrv40p7n0eXlS66MlPcGn-FkYNmemUXn_2LwNxWvc,56
293
+ cap_composer-1.2.0.dist-info/top_level.txt,sha256=FePkN_aCOvpldFiCCAyGseeJ9GvVigarBsDuzVOXnPs,12
294
+ cap_composer-1.2.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ capcomposer = capcomposer.manage:main
@@ -0,0 +1 @@
1
+ capcomposer
@@ -0,0 +1,9 @@
1
+ from .config.celery import app as celery_app
2
+ from .utils.version import get_version, get_semver_version
3
+ from .version import VERSION
4
+
5
+ __version__ = get_version(VERSION)
6
+
7
+ __semver__ = get_semver_version(VERSION)
8
+
9
+ __all__ = ["celery_app", "__version__", "__semver__"]
File without changes
@@ -0,0 +1,4 @@
1
+ from django.contrib import admin
2
+ from .models import ExternalAlertFeedEntry
3
+
4
+ admin.site.register(ExternalAlertFeedEntry)
@@ -0,0 +1,30 @@
1
+ import base64
2
+
3
+ from django.apps import AppConfig
4
+ from django.conf import settings
5
+ from django.core.exceptions import ImproperlyConfigured
6
+ from signxml import SignatureMethod
7
+
8
+ CAP_SIGNATURE_METHOD = getattr(settings, "CAP_SIGNATURE_METHOD", SignatureMethod.RSA_SHA256)
9
+ CAP_MQTT_SECRET_KEY = getattr(settings, "CAP_MQTT_SECRET_KEY", None)
10
+
11
+
12
+ class CapConfig(AppConfig):
13
+ default_auto_field = 'django.db.models.BigAutoField'
14
+ name = 'capcomposer.cap'
15
+
16
+ def ready(self):
17
+ if CAP_SIGNATURE_METHOD and not hasattr(SignatureMethod, CAP_SIGNATURE_METHOD):
18
+ message = f"Invalid 'CAP_SIGNATURE_METHOD' setting '{CAP_SIGNATURE_METHOD}'. " \
19
+ f"Must be one of " \
20
+ f"{list(SignatureMethod.__members__.keys())}"
21
+ raise ImproperlyConfigured(message)
22
+
23
+ if CAP_MQTT_SECRET_KEY:
24
+ try:
25
+ base64.urlsafe_b64decode(CAP_MQTT_SECRET_KEY)
26
+ except Exception as e:
27
+ raise ImproperlyConfigured(f"CAP_MQTT_SECRET_KEY must be a base64 encoded string. {e}")
28
+
29
+ if len(CAP_MQTT_SECRET_KEY) != 44:
30
+ raise ImproperlyConfigured("CAP_MQTT_SECRET_KEY must be 44 characters long")
@@ -0,0 +1,5 @@
1
+ from django.core.cache import caches
2
+
3
+ from wagtailcache.settings import wagtailcache_settings
4
+
5
+ wagcache = caches[wagtailcache_settings.WAGTAIL_CACHE_BACKEND]
@@ -0,0 +1,2 @@
1
+ class CAPAlertImportError(Exception):
2
+ pass
File without changes
@@ -0,0 +1,81 @@
1
+ from django.core.validators import MinValueValidator, MaxValueValidator
2
+ from django.db import models
3
+ from django.db.models.signals import post_save, post_delete
4
+ from django.dispatch import receiver
5
+ from django.utils.translation import gettext_lazy as _
6
+ from django_celery_beat.models import PeriodicTask
7
+ from wagtail.admin.panels import FieldPanel
8
+
9
+
10
+ class ExternalAlertFeed(models.Model):
11
+ FEED_TYPES = (
12
+ ('rss', 'RSS'),
13
+ ('atom', 'Atom'),
14
+ )
15
+ name = models.CharField(max_length=255, unique=True, verbose_name=_("Feed name"),
16
+ help_text=_("Provide a name to identify the feed"), )
17
+ feed_type = models.CharField(max_length=4, choices=FEED_TYPES, blank=True, null=True, verbose_name=_("Feed Type"),
18
+ help_text=_("Select the type of feed"))
19
+ url = models.URLField(unique=True, verbose_name=_("Feed URL"), help_text=_("Enter the URL of the feed"), )
20
+ active = models.BooleanField(default=True, verbose_name=_("Active"),
21
+ help_text=_("Automatically fetch data from this feed. Uncheck to disable."))
22
+ check_interval = models.PositiveIntegerField(default=5, verbose_name=_("Feed check interval in minutes"),
23
+ validators=[
24
+ MinValueValidator(1),
25
+ MaxValueValidator(10)
26
+ ],
27
+ help_text=_("How often to check for new alerts in minutes. "
28
+ "Min: 1, Max: 10"))
29
+ validate_xml_signature = models.BooleanField(default=False, verbose_name=_("Validate CAP XML Signature"),
30
+ help_text=_("Check to only import alerts with a valid XML signature."))
31
+ last_checked = models.DateTimeField(blank=True, null=True)
32
+ periodic_task = models.ForeignKey(PeriodicTask, null=True, on_delete=models.SET_NULL)
33
+ submit_for_moderation = models.BooleanField(default=True, verbose_name=_("Submit imported alerts"
34
+ " for moderation"),
35
+ help_text=_("Check to automatically submit imported alerts "
36
+ "for moderation. Otherwise, alerts will be saved as drafts."))
37
+
38
+ panels = [
39
+ FieldPanel('name'),
40
+ FieldPanel('url'),
41
+ FieldPanel('active'),
42
+ FieldPanel('check_interval'),
43
+ FieldPanel('validate_xml_signature'),
44
+ FieldPanel('submit_for_moderation'),
45
+ ]
46
+
47
+ class Meta:
48
+ verbose_name = _("External Alert Feed")
49
+ verbose_name_plural = _("External Alert Feeds")
50
+
51
+ def __str__(self):
52
+ return f"{self.name} - {self.url}"
53
+
54
+
55
+ class ExternalAlertFeedEntry(models.Model):
56
+ feed = models.ForeignKey(ExternalAlertFeed, on_delete=models.CASCADE, related_name='alerts')
57
+ url = models.URLField(unique=True, verbose_name=_("Alert URL"), help_text=_("The URL of the alert XML"))
58
+ remote_alert_id = models.CharField(max_length=255, verbose_name=_("Remote Alert ID"),
59
+ help_text=_("The unique identifier of the alert in the remote feed"))
60
+ imported_alert = models.OneToOneField("cap.CapAlertPage", null=True, on_delete=models.CASCADE,
61
+ related_name='external_feed_entry',
62
+ help_text=_("The imported alert from this entry"))
63
+
64
+ class Meta:
65
+ verbose_name = _("External Alert Feed Entry")
66
+ verbose_name_plural = _("External Alert Feed Entries")
67
+
68
+ def __str__(self):
69
+ return self.remote_alert_id
70
+
71
+
72
+ @receiver(post_save, sender=ExternalAlertFeed)
73
+ def update_external_feed_periodic_task(sender, instance, **kwargs):
74
+ from capcomposer.cap.tasks import create_or_update_alert_feed_periodic_tasks
75
+ create_or_update_alert_feed_periodic_tasks(instance)
76
+
77
+
78
+ @receiver(post_delete, sender=ExternalAlertFeed)
79
+ def update_external_feed_periodic_task(sender, instance, **kwargs):
80
+ from capcomposer.cap.tasks import create_or_update_alert_feed_periodic_tasks
81
+ create_or_update_alert_feed_periodic_tasks(instance, delete=True)
@@ -0,0 +1,87 @@
1
+ import logging
2
+
3
+ import feedparser
4
+ import requests
5
+ from capvalidator import validate_cap_message
6
+
7
+ from capcomposer.cap.utils import create_draft_alert_from_alert_data
8
+ from capcomposer.capeditor.caputils import cap_xml_to_alert_data
9
+ from .models import ExternalAlertFeed, ExternalAlertFeedEntry
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ def fetch_and_process_feed(feed_id):
15
+ # get feed by id
16
+ external_feed = ExternalAlertFeed.objects.get(id=feed_id)
17
+ url = external_feed.url
18
+ submit_for_moderation = external_feed.submit_for_moderation
19
+
20
+ # get remote feed content
21
+ feed = feedparser.parse(url)
22
+
23
+ entries = feed.entries
24
+
25
+ # extract alert entries
26
+ for entry in entries:
27
+ entry_id = entry.id
28
+ entry_link = entry.link
29
+
30
+ if not entry_id or not entry_link:
31
+ logger.error(f"[EXTERNAL FEED] Entry with missing ID or Link. Skipping...")
32
+ continue
33
+
34
+ # check if entry link is a .xml link
35
+ if not entry_link.endswith('.xml'):
36
+ logger.info(f"[EXTERNAL FEED] Link: {entry_link} does not seem to be a CAP alert XML "
37
+ f"file since it does not end with .xml. Skipping...")
38
+ continue
39
+
40
+ logger.info(f"[EXTERNAL FEED] Processing feed entry with ID: {entry_id}, Link: {entry_link}")
41
+ # check if alert with this entry_id has already been imported.
42
+ # Quick check to avoid fetching the CAP alert XML, assuming that the entry_link will always be unique
43
+ exists = ExternalAlertFeedEntry.objects.filter(url=entry_link).exists()
44
+ if exists:
45
+ logger.info(f"[EXTERNAL FEED] Alert from {entry_link} was already imported. Skipping...")
46
+ continue
47
+
48
+ logger.info(f"[EXTERNAL FEED] Fetching CAP alert XML from {entry_link}")
49
+ # fetch CAP alert XML
50
+ r = requests.get(entry_link)
51
+ r.raise_for_status()
52
+ xml_bytes = r.content
53
+
54
+ logger.info(f"[EXTERNAL FEED] Validating CAP alert XML from {entry_link}. "
55
+ f"Signature check enabled: {external_feed.validate_xml_signature} ")
56
+
57
+ # validate CAP alert XML
58
+ result = validate_cap_message(xml_bytes, strict=external_feed.validate_xml_signature)
59
+ if not result.passed:
60
+ logger.error(f"[EXTERNAL FEED] CAP validation failed for {entry_link}: {result.message}")
61
+ continue
62
+
63
+ logger.info(f"[EXTERNAL FEED] CAP validation passed for {entry_link}")
64
+
65
+ logger.info(f"[EXTERNAL FEED] Parsing CAP alert XML from {entry_link}")
66
+ alert_data = cap_xml_to_alert_data(xml_bytes, validate=False)
67
+
68
+ alert_identifier = alert_data.get('identifier')
69
+
70
+ # check if alert with this identifier has already been imported
71
+ exists = ExternalAlertFeedEntry.objects.filter(remote_alert_id=alert_identifier).exists()
72
+ if exists:
73
+ logger.info(f"[EXTERNAL FEED] Alert with identifier {alert_identifier} was already imported. Skipping...")
74
+ continue
75
+
76
+ logger.info(f"[EXTERNAL FEED] Creating draft alert from CAP alert data for {entry_link}")
77
+ # create draft alert page from alert data
78
+ imported_alert = create_draft_alert_from_alert_data(alert_data, submit_for_moderation=submit_for_moderation)
79
+
80
+ logger.info(f"[EXTERNAL FEED] Creating ExternalAlertFeedEntry for {entry_link}")
81
+ if imported_alert:
82
+ ExternalAlertFeedEntry.objects.create(
83
+ feed=external_feed,
84
+ remote_alert_id=alert_identifier,
85
+ url=entry_link,
86
+ imported_alert=imported_alert
87
+ )