igs-slm 0.1.0b0__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 (447) hide show
  1. igs_slm-0.1.0b0.dist-info/LICENSE +21 -0
  2. igs_slm-0.1.0b0.dist-info/METADATA +151 -0
  3. igs_slm-0.1.0b0.dist-info/RECORD +447 -0
  4. igs_slm-0.1.0b0.dist-info/WHEEL +4 -0
  5. igs_slm-0.1.0b0.dist-info/entry_points.txt +3 -0
  6. igs_tools/__init__.py +0 -0
  7. igs_tools/connection.py +88 -0
  8. igs_tools/defines/__init__.py +8 -0
  9. igs_tools/defines/constellation.py +21 -0
  10. igs_tools/defines/data_center.py +75 -0
  11. igs_tools/defines/rinex.py +49 -0
  12. igs_tools/directory.py +247 -0
  13. igs_tools/utils.py +66 -0
  14. slm/__init__.py +21 -0
  15. slm/admin.py +674 -0
  16. slm/api/edit/__init__.py +0 -0
  17. slm/api/edit/serializers.py +316 -0
  18. slm/api/edit/views.py +1632 -0
  19. slm/api/fields.py +89 -0
  20. slm/api/filter.py +504 -0
  21. slm/api/pagination.py +55 -0
  22. slm/api/permissions.py +65 -0
  23. slm/api/public/__init__.py +0 -0
  24. slm/api/public/serializers.py +249 -0
  25. slm/api/public/views.py +606 -0
  26. slm/api/serializers.py +132 -0
  27. slm/api/views.py +148 -0
  28. slm/apps.py +323 -0
  29. slm/authentication.py +198 -0
  30. slm/bin/__init__.py +0 -0
  31. slm/bin/startproject.py +262 -0
  32. slm/bin/templates/{{ project_dir }}/pyproject.toml +35 -0
  33. slm/bin/templates/{{ project_dir }}/sites/__init__.py +0 -0
  34. slm/bin/templates/{{ project_dir }}/sites/{{ site }}/__init__.py +0 -0
  35. slm/bin/templates/{{ project_dir }}/sites/{{ site }}/base.py +15 -0
  36. slm/bin/templates/{{ project_dir }}/sites/{{ site }}/develop/__init__.py +56 -0
  37. slm/bin/templates/{{ project_dir }}/sites/{{ site }}/develop/local.py +4 -0
  38. slm/bin/templates/{{ project_dir }}/sites/{{ site }}/develop/wsgi.py +16 -0
  39. slm/bin/templates/{{ project_dir }}/sites/{{ site }}/manage.py +34 -0
  40. slm/bin/templates/{{ project_dir }}/sites/{{ site }}/production/__init__.py +61 -0
  41. slm/bin/templates/{{ project_dir }}/sites/{{ site }}/production/wsgi.py +16 -0
  42. slm/bin/templates/{{ project_dir }}/sites/{{ site }}/urls.py +7 -0
  43. slm/bin/templates/{{ project_dir }}/sites/{{ site }}/validation.py +11 -0
  44. slm/bin/templates/{{ project_dir }}/{{ extension_app }}/__init__.py +0 -0
  45. slm/bin/templates/{{ project_dir }}/{{ extension_app }}/admin.py +5 -0
  46. slm/bin/templates/{{ project_dir }}/{{ extension_app }}/apps.py +14 -0
  47. slm/bin/templates/{{ project_dir }}/{{ extension_app }}/management/__init__.py +0 -0
  48. slm/bin/templates/{{ project_dir }}/{{ extension_app }}/management/commands/__init__.py +0 -0
  49. slm/bin/templates/{{ project_dir }}/{{ extension_app }}/management/commands/import_archive.py +64 -0
  50. slm/bin/templates/{{ project_dir }}/{{ extension_app }}/migrations/__init__.py +0 -0
  51. slm/bin/templates/{{ project_dir }}/{{ extension_app }}/models.py +6 -0
  52. slm/bin/templates/{{ project_dir }}/{{ extension_app }}/templates/slm/base.html +8 -0
  53. slm/bin/templates/{{ project_dir }}/{{ extension_app }}/urls.py +10 -0
  54. slm/bin/templates/{{ project_dir }}/{{ extension_app }}/views.py +5 -0
  55. slm/defines/AlertLevel.py +24 -0
  56. slm/defines/AntennaCalibration.py +25 -0
  57. slm/defines/AntennaFeatures.py +27 -0
  58. slm/defines/AntennaReferencePoint.py +22 -0
  59. slm/defines/Aspiration.py +13 -0
  60. slm/defines/CardinalDirection.py +19 -0
  61. slm/defines/CollocationStatus.py +12 -0
  62. slm/defines/EquipmentState.py +22 -0
  63. slm/defines/FlagSeverity.py +14 -0
  64. slm/defines/FractureSpacing.py +15 -0
  65. slm/defines/FrequencyStandardType.py +15 -0
  66. slm/defines/GeodesyMLVersion.py +48 -0
  67. slm/defines/ISOCountry.py +1194 -0
  68. slm/defines/Instrumentation.py +19 -0
  69. slm/defines/LogEntryType.py +30 -0
  70. slm/defines/SLMFileType.py +18 -0
  71. slm/defines/SiteFileUploadStatus.py +61 -0
  72. slm/defines/SiteLogFormat.py +49 -0
  73. slm/defines/SiteLogStatus.py +78 -0
  74. slm/defines/TectonicPlates.py +28 -0
  75. slm/defines/__init__.py +46 -0
  76. slm/forms.py +1126 -0
  77. slm/jinja2/slm/sitelog/ascii_9char.log +346 -0
  78. slm/jinja2/slm/sitelog/legacy.log +346 -0
  79. slm/jinja2/slm/sitelog/xsd/0.4/collocationInformation.xml +12 -0
  80. slm/jinja2/slm/sitelog/xsd/0.4/condition.xml +12 -0
  81. slm/jinja2/slm/sitelog/xsd/0.4/contact.xml +52 -0
  82. slm/jinja2/slm/sitelog/xsd/0.4/formInformation.xml +5 -0
  83. slm/jinja2/slm/sitelog/xsd/0.4/frequencyStandard.xml +12 -0
  84. slm/jinja2/slm/sitelog/xsd/0.4/gnssAntenna.xml +16 -0
  85. slm/jinja2/slm/sitelog/xsd/0.4/gnssReceiver.xml +11 -0
  86. slm/jinja2/slm/sitelog/xsd/0.4/humiditySensor.xml +13 -0
  87. slm/jinja2/slm/sitelog/xsd/0.4/localEpisodicEffect.xml +10 -0
  88. slm/jinja2/slm/sitelog/xsd/0.4/moreInformation.xml +22 -0
  89. slm/jinja2/slm/sitelog/xsd/0.4/multipathSource.xml +10 -0
  90. slm/jinja2/slm/sitelog/xsd/0.4/otherInstrumentation.xml +5 -0
  91. slm/jinja2/slm/sitelog/xsd/0.4/pressureSensor.xml +12 -0
  92. slm/jinja2/slm/sitelog/xsd/0.4/radioInterference.xml +11 -0
  93. slm/jinja2/slm/sitelog/xsd/0.4/sensor.xml +16 -0
  94. slm/jinja2/slm/sitelog/xsd/0.4/signalObstruction.xml +10 -0
  95. slm/jinja2/slm/sitelog/xsd/0.4/siteIdentification.xml +22 -0
  96. slm/jinja2/slm/sitelog/xsd/0.4/siteLocation.xml +21 -0
  97. slm/jinja2/slm/sitelog/xsd/0.4/surveyedLocalTie.xml +20 -0
  98. slm/jinja2/slm/sitelog/xsd/0.4/temperatureSensor.xml +13 -0
  99. slm/jinja2/slm/sitelog/xsd/0.4/waterVaporSensor.xml +11 -0
  100. slm/jinja2/slm/sitelog/xsd/0.5/document.xml +10 -0
  101. slm/jinja2/slm/sitelog/xsd/geodesyml_0.4.xml +99 -0
  102. slm/jinja2/slm/sitelog/xsd/geodesyml_0.5.xml +112 -0
  103. slm/management/__init__.py +0 -0
  104. slm/management/commands/__init__.py +53 -0
  105. slm/management/commands/build_index.py +96 -0
  106. slm/management/commands/generate_sinex.py +675 -0
  107. slm/management/commands/head_from_index.py +541 -0
  108. slm/management/commands/import_archive.py +908 -0
  109. slm/management/commands/import_equipment.py +351 -0
  110. slm/management/commands/set_site.py +56 -0
  111. slm/management/commands/sitelog.py +144 -0
  112. slm/management/commands/synchronize.py +60 -0
  113. slm/management/commands/update_data_availability.py +167 -0
  114. slm/management/commands/validate_db.py +186 -0
  115. slm/management/commands/validate_gml.py +73 -0
  116. slm/map/__init__.py +1 -0
  117. slm/map/admin.py +5 -0
  118. slm/map/api/__init__.py +0 -0
  119. slm/map/api/edit/__init__.py +0 -0
  120. slm/map/api/edit/serializers.py +28 -0
  121. slm/map/api/edit/views.py +46 -0
  122. slm/map/api/public/__init__.py +0 -0
  123. slm/map/api/public/serializers.py +29 -0
  124. slm/map/api/public/views.py +64 -0
  125. slm/map/apps.py +7 -0
  126. slm/map/defines.py +53 -0
  127. slm/map/migrations/0001_initial.py +115 -0
  128. slm/map/migrations/__init__.py +0 -0
  129. slm/map/models.py +63 -0
  130. slm/map/static/slm/css/map.css +86 -0
  131. slm/map/static/slm/js/map.js +159 -0
  132. slm/map/templates/slm/map.html +374 -0
  133. slm/map/templates/slm/station/base.html +11 -0
  134. slm/map/templates/slm/station/edit.html +10 -0
  135. slm/map/templates/slm/top_nav.html +17 -0
  136. slm/map/templatetags/__init__.py +0 -0
  137. slm/map/templatetags/slm_map.py +18 -0
  138. slm/map/urls.py +25 -0
  139. slm/map/views.py +36 -0
  140. slm/middleware.py +29 -0
  141. slm/migrations/0001_alter_siteantenna_marker_enu_alter_sitelocation_llh_and_more.py +47 -0
  142. slm/migrations/0001_initial.py +4826 -0
  143. slm/migrations/0002_alter_dataavailability_site.py +22 -0
  144. slm/migrations/0003_remove_logentry_slm_logentr_site_lo_7a2af7_idx_and_more.py +80 -0
  145. slm/migrations/0004_alter_logentry_timestamp_and_more.py +25 -0
  146. slm/migrations/0005_alter_logentry_options_alter_logentry_section_and_more.py +46 -0
  147. slm/migrations/0006_alter_logentry_options_alter_logentry_index_together.py +24 -0
  148. slm/migrations/0007_alter_dataavailability_rate.py +23 -0
  149. slm/migrations/0008_alter_archiveindex_options_and_more.py +64 -0
  150. slm/migrations/0009_alter_archiveindex_end.py +21 -0
  151. slm/migrations/0010_alter_dataavailability_rinex_version_and_more.py +844 -0
  152. slm/migrations/0011_alter_siteidentification_fracture_spacing.py +33 -0
  153. slm/migrations/0012_alter_logentry_type.py +36 -0
  154. slm/migrations/0013_unpublishedfilesalert.py +48 -0
  155. slm/migrations/0014_sitelogpublished.py +48 -0
  156. slm/migrations/0015_alter_siteantenna_options_and_more.py +181 -0
  157. slm/migrations/0016_alter_antenna_description_alter_radome_description_and_more.py +42 -0
  158. slm/migrations/0017_alter_logentry_unique_together_and_more.py +54 -0
  159. slm/migrations/0018_afix_deleted.py +34 -0
  160. slm/migrations/0018_alter_siteantenna_options_and_more.py +244 -0
  161. slm/migrations/0019_remove_siteantenna_marker_enu_siteantenna_marker_une_and_more.py +101 -0
  162. slm/migrations/0020_alter_manufacturer_options.py +16 -0
  163. slm/migrations/0021_alter_siteform_report_type.py +23 -0
  164. slm/migrations/0022_rename_antcal_antenna_radome_slm_antcal_antenna_20827a_idx_and_more.py +297 -0
  165. slm/migrations/0023_archivedsitelog_gml_version_and_more.py +55 -0
  166. slm/migrations/0024_alter_agency_name_alter_agency_shortname.py +24 -0
  167. slm/migrations/0025_alter_archivedsitelog_log_format_and_more.py +61 -0
  168. slm/migrations/0026_alter_archivedsitelog_log_format_and_more.py +61 -0
  169. slm/migrations/0027_importalert_file_contents_importalert_findings_and_more.py +41 -0
  170. slm/migrations/0028_antenna_replaced_manufacturer_url_radome_replaced_and_more.py +46 -0
  171. slm/migrations/0029_manufacturer_full_name.py +17 -0
  172. slm/migrations/0030_alter_antenna_state_alter_radome_state_and_more.py +43 -0
  173. slm/migrations/__init__.py +0 -0
  174. slm/migrations/load_satellitesystems.py +27 -0
  175. slm/models/__init__.py +118 -0
  176. slm/models/about.py +14 -0
  177. slm/models/alerts.py +1204 -0
  178. slm/models/data.py +58 -0
  179. slm/models/equipment.py +229 -0
  180. slm/models/help.py +14 -0
  181. slm/models/index.py +428 -0
  182. slm/models/sitelog.py +4279 -0
  183. slm/models/system.py +723 -0
  184. slm/models/user.py +304 -0
  185. slm/parsing/__init__.py +786 -0
  186. slm/parsing/legacy/__init__.py +4 -0
  187. slm/parsing/legacy/binding.py +817 -0
  188. slm/parsing/legacy/parser.py +377 -0
  189. slm/parsing/xsd/__init__.py +34 -0
  190. slm/parsing/xsd/binding.py +86 -0
  191. slm/parsing/xsd/geodesyml/0.4/commonTypes.xsd +133 -0
  192. slm/parsing/xsd/geodesyml/0.4/contact.xsd +29 -0
  193. slm/parsing/xsd/geodesyml/0.4/dataStreams.xsd +129 -0
  194. slm/parsing/xsd/geodesyml/0.4/document.xsd +64 -0
  195. slm/parsing/xsd/geodesyml/0.4/equipment.xsd +427 -0
  196. slm/parsing/xsd/geodesyml/0.4/fieldMeasurement.xsd +170 -0
  197. slm/parsing/xsd/geodesyml/0.4/geodesyML.xsd +71 -0
  198. slm/parsing/xsd/geodesyml/0.4/geodeticEquipment.xsd +343 -0
  199. slm/parsing/xsd/geodesyml/0.4/geodeticMonument.xsd +147 -0
  200. slm/parsing/xsd/geodesyml/0.4/lineage.xsd +614 -0
  201. slm/parsing/xsd/geodesyml/0.4/localInterferences.xsd +131 -0
  202. slm/parsing/xsd/geodesyml/0.4/measurement.xsd +473 -0
  203. slm/parsing/xsd/geodesyml/0.4/monumentInfo.xsd +251 -0
  204. slm/parsing/xsd/geodesyml/0.4/observationSystem.xsd +429 -0
  205. slm/parsing/xsd/geodesyml/0.4/project.xsd +38 -0
  206. slm/parsing/xsd/geodesyml/0.4/quality.xsd +176 -0
  207. slm/parsing/xsd/geodesyml/0.4/referenceFrame.xsd +194 -0
  208. slm/parsing/xsd/geodesyml/0.4/siteLog.xsd +71 -0
  209. slm/parsing/xsd/geodesyml/0.5/commonTypes.xsd +133 -0
  210. slm/parsing/xsd/geodesyml/0.5/contact.xsd +29 -0
  211. slm/parsing/xsd/geodesyml/0.5/dataStreams.xsd +129 -0
  212. slm/parsing/xsd/geodesyml/0.5/document.xsd +64 -0
  213. slm/parsing/xsd/geodesyml/0.5/equipment.xsd +427 -0
  214. slm/parsing/xsd/geodesyml/0.5/fieldMeasurement.xsd +170 -0
  215. slm/parsing/xsd/geodesyml/0.5/geodesyML.xsd +71 -0
  216. slm/parsing/xsd/geodesyml/0.5/geodeticEquipment.xsd +343 -0
  217. slm/parsing/xsd/geodesyml/0.5/geodeticMonument.xsd +147 -0
  218. slm/parsing/xsd/geodesyml/0.5/lineage.xsd +614 -0
  219. slm/parsing/xsd/geodesyml/0.5/localInterferences.xsd +131 -0
  220. slm/parsing/xsd/geodesyml/0.5/measurement.xsd +473 -0
  221. slm/parsing/xsd/geodesyml/0.5/monumentInfo.xsd +306 -0
  222. slm/parsing/xsd/geodesyml/0.5/observationSystem.xsd +429 -0
  223. slm/parsing/xsd/geodesyml/0.5/project.xsd +38 -0
  224. slm/parsing/xsd/geodesyml/0.5/quality.xsd +176 -0
  225. slm/parsing/xsd/geodesyml/0.5/referenceFrame.xsd +194 -0
  226. slm/parsing/xsd/geodesyml/0.5/siteLog.xsd +73 -0
  227. slm/parsing/xsd/parser.py +116 -0
  228. slm/parsing/xsd/resolver.py +28 -0
  229. slm/receivers/__init__.py +11 -0
  230. slm/receivers/alerts.py +87 -0
  231. slm/receivers/cleanup.py +41 -0
  232. slm/receivers/event_loggers.py +175 -0
  233. slm/receivers/index.py +67 -0
  234. slm/settings/__init__.py +55 -0
  235. slm/settings/auth.py +15 -0
  236. slm/settings/ckeditor.py +14 -0
  237. slm/settings/debug.py +47 -0
  238. slm/settings/internationalization.py +12 -0
  239. slm/settings/logging.py +113 -0
  240. slm/settings/platform/__init__.py +0 -0
  241. slm/settings/platform/darwin.py +10 -0
  242. slm/settings/rest.py +21 -0
  243. slm/settings/root.py +152 -0
  244. slm/settings/routines.py +43 -0
  245. slm/settings/secrets.py +37 -0
  246. slm/settings/security.py +5 -0
  247. slm/settings/slm.py +188 -0
  248. slm/settings/static_templates.py +53 -0
  249. slm/settings/templates.py +29 -0
  250. slm/settings/uploads.py +8 -0
  251. slm/settings/urls.py +126 -0
  252. slm/settings/validation.py +196 -0
  253. slm/signals.py +250 -0
  254. slm/singleton.py +49 -0
  255. slm/static/rest_framework/css/bootstrap-tweaks.css +204 -0
  256. slm/static/rest_framework/css/bootstrap.min.css +7 -0
  257. slm/static/rest_framework/css/bootstrap.min.css.map +1 -0
  258. slm/static/rest_framework/css/default.css +82 -0
  259. slm/static/rest_framework/css/prettify.css +30 -0
  260. slm/static/rest_framework/docs/css/base.css +344 -0
  261. slm/static/rest_framework/docs/css/highlight.css +125 -0
  262. slm/static/rest_framework/docs/css/jquery.json-view.min.css +11 -0
  263. slm/static/rest_framework/docs/img/favicon.ico +0 -0
  264. slm/static/rest_framework/docs/img/grid.png +0 -0
  265. slm/static/rest_framework/docs/js/api.js +321 -0
  266. slm/static/rest_framework/docs/js/highlight.pack.js +2 -0
  267. slm/static/rest_framework/docs/js/jquery.json-view.min.js +7 -0
  268. slm/static/rest_framework/img/grid.png +0 -0
  269. slm/static/rest_framework/js/ajax-form.js +127 -0
  270. slm/static/rest_framework/js/bootstrap.bundle.min.js +7 -0
  271. slm/static/rest_framework/js/bootstrap.bundle.min.js.map +1 -0
  272. slm/static/rest_framework/js/bootstrap.min.js.map +1 -0
  273. slm/static/rest_framework/js/coreapi-0.1.1.js +2043 -0
  274. slm/static/rest_framework/js/csrf.js +52 -0
  275. slm/static/rest_framework/js/default.js +47 -0
  276. slm/static/rest_framework/js/jquery-3.5.1.min.js +2 -0
  277. slm/static/rest_framework/js/prettify-min.js +28 -0
  278. slm/static/slm/css/admin.css +3 -0
  279. slm/static/slm/css/defines.css +82 -0
  280. slm/static/slm/css/forms.css +1 -0
  281. slm/static/slm/css/style.css +1004 -0
  282. slm/static/slm/img/email-branding.png +0 -0
  283. slm/static/slm/img/favicon.ico +0 -0
  284. slm/static/slm/img/login-bg.jpg +0 -0
  285. slm/static/slm/img/slm-logo.svg +4 -0
  286. slm/static/slm/js/autocomplete.js +341 -0
  287. slm/static/slm/js/enums.js +322 -0
  288. slm/static/slm/js/fileIcons.js +30 -0
  289. slm/static/slm/js/form.js +404 -0
  290. slm/static/slm/js/formWidget.js +23 -0
  291. slm/static/slm/js/persistable.js +33 -0
  292. slm/static/slm/js/slm.js +1028 -0
  293. slm/static/slm/js/time24.js +212 -0
  294. slm/static_templates/slm/css/defines.css +26 -0
  295. slm/static_templates/slm/js/enums.js +28 -0
  296. slm/static_templates/slm/js/fileIcons.js +16 -0
  297. slm/static_templates/slm/js/urls.js +5 -0
  298. slm/templates/account/base.html +20 -0
  299. slm/templates/account/email/base.html +43 -0
  300. slm/templates/account/email/base_message.txt +7 -0
  301. slm/templates/account/email/email_confirmation_message.html +16 -0
  302. slm/templates/account/email/email_confirmation_message.txt +7 -0
  303. slm/templates/account/email/email_confirmation_signup_message.html +1 -0
  304. slm/templates/account/email/email_confirmation_signup_message.txt +1 -0
  305. slm/templates/account/email/email_confirmation_signup_subject.txt +1 -0
  306. slm/templates/account/email/email_confirmation_subject.txt +4 -0
  307. slm/templates/account/email/password_reset_key_message.html +28 -0
  308. slm/templates/account/email/password_reset_key_message.txt +9 -0
  309. slm/templates/account/email/password_reset_key_subject.txt +4 -0
  310. slm/templates/account/email/unknown_account_message.html +25 -0
  311. slm/templates/account/email/unknown_account_message.txt +12 -0
  312. slm/templates/account/email/unknown_account_subject.txt +4 -0
  313. slm/templates/account/login.html +67 -0
  314. slm/templates/account/logout.html +38 -0
  315. slm/templates/account/password_change.html +48 -0
  316. slm/templates/account/password_reset.html +51 -0
  317. slm/templates/account/password_reset_done.html +20 -0
  318. slm/templates/account/password_reset_from_key.html +52 -0
  319. slm/templates/account/password_reset_from_key_done.html +17 -0
  320. slm/templates/admin/base.html +7 -0
  321. slm/templates/messages.html +8 -0
  322. slm/templates/rest_framework/README +16 -0
  323. slm/templates/rest_framework/admin/detail.html +10 -0
  324. slm/templates/rest_framework/admin/dict_value.html +11 -0
  325. slm/templates/rest_framework/admin/list.html +32 -0
  326. slm/templates/rest_framework/admin/list_value.html +11 -0
  327. slm/templates/rest_framework/admin/simple_list_value.html +2 -0
  328. slm/templates/rest_framework/admin.html +282 -0
  329. slm/templates/rest_framework/api.html +3 -0
  330. slm/templates/rest_framework/base.html +334 -0
  331. slm/templates/rest_framework/docs/auth/basic.html +42 -0
  332. slm/templates/rest_framework/docs/auth/session.html +40 -0
  333. slm/templates/rest_framework/docs/auth/token.html +41 -0
  334. slm/templates/rest_framework/docs/document.html +37 -0
  335. slm/templates/rest_framework/docs/error.html +71 -0
  336. slm/templates/rest_framework/docs/index.html +55 -0
  337. slm/templates/rest_framework/docs/interact.html +57 -0
  338. slm/templates/rest_framework/docs/langs/javascript-intro.html +5 -0
  339. slm/templates/rest_framework/docs/langs/javascript.html +15 -0
  340. slm/templates/rest_framework/docs/langs/python-intro.html +3 -0
  341. slm/templates/rest_framework/docs/langs/python.html +13 -0
  342. slm/templates/rest_framework/docs/langs/shell-intro.html +3 -0
  343. slm/templates/rest_framework/docs/langs/shell.html +6 -0
  344. slm/templates/rest_framework/docs/link.html +113 -0
  345. slm/templates/rest_framework/docs/sidebar.html +78 -0
  346. slm/templates/rest_framework/filters/base.html +16 -0
  347. slm/templates/rest_framework/filters/ordering.html +17 -0
  348. slm/templates/rest_framework/filters/search.html +13 -0
  349. slm/templates/rest_framework/horizontal/checkbox.html +23 -0
  350. slm/templates/rest_framework/horizontal/checkbox_multiple.html +32 -0
  351. slm/templates/rest_framework/horizontal/dict_field.html +11 -0
  352. slm/templates/rest_framework/horizontal/fieldset.html +16 -0
  353. slm/templates/rest_framework/horizontal/form.html +6 -0
  354. slm/templates/rest_framework/horizontal/input.html +21 -0
  355. slm/templates/rest_framework/horizontal/list_field.html +11 -0
  356. slm/templates/rest_framework/horizontal/list_fieldset.html +13 -0
  357. slm/templates/rest_framework/horizontal/radio.html +42 -0
  358. slm/templates/rest_framework/horizontal/select.html +36 -0
  359. slm/templates/rest_framework/horizontal/select_multiple.html +38 -0
  360. slm/templates/rest_framework/horizontal/textarea.html +21 -0
  361. slm/templates/rest_framework/inline/checkbox.html +8 -0
  362. slm/templates/rest_framework/inline/checkbox_multiple.html +14 -0
  363. slm/templates/rest_framework/inline/dict_field.html +9 -0
  364. slm/templates/rest_framework/inline/fieldset.html +6 -0
  365. slm/templates/rest_framework/inline/form.html +8 -0
  366. slm/templates/rest_framework/inline/input.html +9 -0
  367. slm/templates/rest_framework/inline/list_field.html +9 -0
  368. slm/templates/rest_framework/inline/list_fieldset.html +3 -0
  369. slm/templates/rest_framework/inline/radio.html +25 -0
  370. slm/templates/rest_framework/inline/select.html +24 -0
  371. slm/templates/rest_framework/inline/select_multiple.html +25 -0
  372. slm/templates/rest_framework/inline/textarea.html +9 -0
  373. slm/templates/rest_framework/login.html +3 -0
  374. slm/templates/rest_framework/login_base.html +65 -0
  375. slm/templates/rest_framework/pagination/numbers.html +47 -0
  376. slm/templates/rest_framework/pagination/previous_and_next.html +21 -0
  377. slm/templates/rest_framework/raw_data_form.html +11 -0
  378. slm/templates/rest_framework/schema.js +3 -0
  379. slm/templates/rest_framework/vertical/checkbox.html +16 -0
  380. slm/templates/rest_framework/vertical/checkbox_multiple.html +30 -0
  381. slm/templates/rest_framework/vertical/dict_field.html +7 -0
  382. slm/templates/rest_framework/vertical/fieldset.html +13 -0
  383. slm/templates/rest_framework/vertical/form.html +6 -0
  384. slm/templates/rest_framework/vertical/input.html +17 -0
  385. slm/templates/rest_framework/vertical/list_field.html +7 -0
  386. slm/templates/rest_framework/vertical/list_fieldset.html +7 -0
  387. slm/templates/rest_framework/vertical/radio.html +40 -0
  388. slm/templates/rest_framework/vertical/select.html +34 -0
  389. slm/templates/rest_framework/vertical/select_multiple.html +31 -0
  390. slm/templates/rest_framework/vertical/textarea.html +17 -0
  391. slm/templates/slm/about.html +21 -0
  392. slm/templates/slm/alerts/alert.html +15 -0
  393. slm/templates/slm/alerts/geodesymlinvalid.html +8 -0
  394. slm/templates/slm/alerts/importalert.html +10 -0
  395. slm/templates/slm/alerts.html +18 -0
  396. slm/templates/slm/auth_menu.html +41 -0
  397. slm/templates/slm/base.html +195 -0
  398. slm/templates/slm/emails/alert_issued.html +31 -0
  399. slm/templates/slm/emails/alert_issued.txt +9 -0
  400. slm/templates/slm/emails/base.html +6 -0
  401. slm/templates/slm/emails/changes_rejected.txt +7 -0
  402. slm/templates/slm/emails/review_requested.txt +7 -0
  403. slm/templates/slm/forms/widgets/auto_complete.html +21 -0
  404. slm/templates/slm/forms/widgets/auto_complete_multiple.html +18 -0
  405. slm/templates/slm/forms/widgets/checkbox_multiple.html +6 -0
  406. slm/templates/slm/forms/widgets/inline_multi.html +1 -0
  407. slm/templates/slm/forms/widgets/splitdatetime.html +14 -0
  408. slm/templates/slm/forms/widgets/time24.html +37 -0
  409. slm/templates/slm/help.html +54 -0
  410. slm/templates/slm/messages.html +13 -0
  411. slm/templates/slm/new_site.html +88 -0
  412. slm/templates/slm/profile.html +57 -0
  413. slm/templates/slm/register.html +40 -0
  414. slm/templates/slm/reports/file_log.html +43 -0
  415. slm/templates/slm/reports/head_log.html +23 -0
  416. slm/templates/slm/reports/head_report.html +55 -0
  417. slm/templates/slm/reports/index_log.html +23 -0
  418. slm/templates/slm/reports/index_report.html +71 -0
  419. slm/templates/slm/station/alert.html +8 -0
  420. slm/templates/slm/station/alerts.html +19 -0
  421. slm/templates/slm/station/base.html +104 -0
  422. slm/templates/slm/station/download.html +87 -0
  423. slm/templates/slm/station/edit.html +283 -0
  424. slm/templates/slm/station/form.html +110 -0
  425. slm/templates/slm/station/log.html +18 -0
  426. slm/templates/slm/station/review.html +461 -0
  427. slm/templates/slm/station/upload.html +295 -0
  428. slm/templates/slm/station/uploads/attachment.html +20 -0
  429. slm/templates/slm/station/uploads/geodesyml.html +1 -0
  430. slm/templates/slm/station/uploads/image.html +27 -0
  431. slm/templates/slm/station/uploads/json.html +0 -0
  432. slm/templates/slm/station/uploads/legacy.html +77 -0
  433. slm/templates/slm/top_nav.html +14 -0
  434. slm/templates/slm/user_activity.html +16 -0
  435. slm/templates/slm/widgets/alert_scroll.html +135 -0
  436. slm/templates/slm/widgets/filelist.html +258 -0
  437. slm/templates/slm/widgets/legend.html +12 -0
  438. slm/templates/slm/widgets/log_scroll.html +88 -0
  439. slm/templates/slm/widgets/stationlist.html +233 -0
  440. slm/templatetags/__init__.py +0 -0
  441. slm/templatetags/jinja2.py +9 -0
  442. slm/templatetags/slm.py +459 -0
  443. slm/urls.py +148 -0
  444. slm/utils.py +299 -0
  445. slm/validators.py +297 -0
  446. slm/views.py +654 -0
  447. slm/widgets.py +134 -0
@@ -0,0 +1,43 @@
1
+ from django.utils.translation import gettext_lazy as _
2
+ from django_routines import command, routine
3
+
4
+
5
+ routine(
6
+ "deploy",
7
+ _(
8
+ "Run collection of commands that likely need to be run whenever code is updated."
9
+ ),
10
+ switch_helps={
11
+ "initial": _(
12
+ "Run collection of commands that should only be run on the first deployment."
13
+ ),
14
+ "validate": _("Run validation routines on the entire database."),
15
+ },
16
+ )
17
+
18
+ routine(
19
+ "import",
20
+ _("Import equipment from the IGS and site log data from your own archive."),
21
+ )
22
+
23
+ routine(
24
+ "install",
25
+ _("Install a fresh deployment of the SLM and import data from external sources."),
26
+ )
27
+
28
+ command("deploy", "check", "--deploy")
29
+ command("deploy", "shellcompletion", "install", switches=["initial"])
30
+ command("deploy", "migrate", priority=11)
31
+ command("deploy", "renderstatic", priority=20)
32
+ command("deploy", "collectstatic", "--no-input", priority=21)
33
+ command("deploy", "set_site", priority=22)
34
+ command("deploy", "validate_db", "--schema", priority=30, switches=["re-validate"])
35
+ command("deploy", "synchronize", priority=32, switches=["re-validate"])
36
+
37
+ command("import", "import_equipment", "antennas", "radomes", "receivers", priority=10)
38
+ command("import", "import_archive", priority=20)
39
+ command("import", "validate_db", "--schema", priority=30)
40
+
41
+ command("install", "routine", "deploy", "--initial", priority=0)
42
+ command("install", "createsuperuser", priority=10)
43
+ command("install", "routine", "import", priority=20)
@@ -0,0 +1,37 @@
1
+ import os
2
+ from pathlib import Path
3
+
4
+ from slm.settings import get_setting
5
+
6
+ SLM_SECRETS_DIR = get_setting(
7
+ "SLM_SECRETS_DIR", Path(get_setting("SITE_DIR")) / "secrets"
8
+ )
9
+
10
+
11
+ def generate_secret_key(filename):
12
+ from django.core.management.utils import get_random_secret_key
13
+
14
+ with open(filename, "w") as f:
15
+ f.write("%s\n" % get_random_secret_key())
16
+ os.chmod(filename, 0o640)
17
+
18
+
19
+ def get_secret_key(filename):
20
+ with open(filename, "r") as f:
21
+ return f.readlines()[0]
22
+
23
+
24
+ if not os.path.exists(SLM_SECRETS_DIR):
25
+ os.makedirs(SLM_SECRETS_DIR)
26
+
27
+
28
+ sk_file = os.path.join(SLM_SECRETS_DIR, "secret_key")
29
+
30
+ if not os.path.exists(sk_file):
31
+ generate_secret_key(sk_file)
32
+
33
+ SECRET_KEY = get_secret_key(sk_file)
34
+
35
+ if len(SECRET_KEY) == 0:
36
+ generate_secret_key(sk_file)
37
+ SECRET_KEY = get_secret_key(sk_file)
@@ -0,0 +1,5 @@
1
+ SECURE_SSL_REDIRECT = True
2
+ CSRF_COOKIE_SECURE = True
3
+ SESSION_COOKIE_SECURE = True
4
+ SECURE_REFERRER_POLICY = "origin"
5
+ X_FRAME_OPTIONS = "DENY"
slm/settings/slm.py ADDED
@@ -0,0 +1,188 @@
1
+ """
2
+ SLM Specific Configuration parameters go here.
3
+ """
4
+
5
+ import os
6
+
7
+ from slm.defines import (
8
+ AlertLevel,
9
+ GeodesyMLVersion,
10
+ SiteFileUploadStatus,
11
+ SiteLogStatus,
12
+ )
13
+ from slm.settings import get_setting, set_default
14
+
15
+ # manage.py will set this to true if django has been loaded to run a
16
+ # management command
17
+ SLM_MANAGEMENT_MODE = os.environ.get("SLM_MANAGEMENT_FLAG", False) == "ON"
18
+
19
+ set_default(
20
+ "SLM_ALERT_COLORS",
21
+ {
22
+ AlertLevel.NOTICE: "#12CAF0",
23
+ AlertLevel.WARNING: "#E3AA00",
24
+ AlertLevel.ERROR: "#DD3444",
25
+ },
26
+ )
27
+
28
+ set_default(
29
+ "SLM_STATUS_COLORS",
30
+ {
31
+ SiteLogStatus.FORMER: "#3D4543",
32
+ SiteLogStatus.SUSPENDED: "#E0041A",
33
+ SiteLogStatus.PROPOSED: "#913D88",
34
+ SiteLogStatus.UPDATED: "#0079AD",
35
+ SiteLogStatus.PUBLISHED: "#0D820D",
36
+ SiteLogStatus.EMPTY: "#D3D3D3",
37
+ },
38
+ )
39
+
40
+ set_default(
41
+ "SLM_FILE_COLORS",
42
+ {
43
+ SiteFileUploadStatus.UNPUBLISHED: "#0079AD",
44
+ SiteFileUploadStatus.PUBLISHED: "#0D820D",
45
+ SiteFileUploadStatus.INVALID: "#8b0000",
46
+ SiteFileUploadStatus.WARNINGS: "#E3AA00",
47
+ SiteFileUploadStatus.VALID: "#0D820D",
48
+ },
49
+ )
50
+
51
+ # if True, for subsections and missing sections, placeholder structures will
52
+ # be added to the logs
53
+ set_default("SLM_LEGACY_PLACEHOLDERS", True)
54
+
55
+ # the maximum file upload size in Mega Bytes
56
+ set_default("SLM_MAX_UPLOAD_SIZE_MB", 100)
57
+
58
+ # a map of file icons (css) from mimetype subtypes
59
+ set_default(
60
+ "SLM_FILE_ICONS",
61
+ {
62
+ "zip": "bi bi-file-zip",
63
+ "x-tar": "bi bi-file-zip",
64
+ "plain": "bi bi-filetype-txt",
65
+ "jpeg": "bi bi-filetype-jpg",
66
+ "svg+xml": "bi bi-filetype-svg",
67
+ "xml": "bi bi-filetype-xml",
68
+ "json": "bi bi-filetype-json",
69
+ "png": "bi bi-filetype-png",
70
+ "tiff": "bi bi-filetype-tiff",
71
+ "pdf": "bi bi-filetype-pdf",
72
+ "gif": "bi bi-filetype-gif",
73
+ "csv": "bi bi-filetype-csv",
74
+ "bmp": "bi bi-filetype-bmp",
75
+ "vnd.openxmlformats-officedocument.wordprocessingml.document": "bi bi-filetype-doc",
76
+ "msword": "bi bi-filetype-doc",
77
+ },
78
+ )
79
+
80
+ # generated image thumbnail size in pixels - this is a tuple of maximum width
81
+ # and height - the aspect ratio will be preserved
82
+ set_default("SLM_THUMBNAIL_SIZE", 250)
83
+
84
+ # during deploy the current Site will be set to SLM_SITE_NAME, SLM_ORG_NAME
85
+ # The name of the organization used in communications
86
+ set_default("SLM_ORG_NAME", "SLM")
87
+
88
+ set_default("SLM_SITE_NAME", (get_setting("ALLOWED_HOSTS", []) or ["localhost"])[0])
89
+
90
+ # set this to either http or https, this will be used to determine the protocol
91
+ # of absolute uri links where a request object is not present
92
+ set_default("SLM_HTTP_PROTOCOL", None)
93
+
94
+ # this should point to a cached property that holds the set of Django
95
+ # permissions relevant to the SLM - if you extend the permission set override
96
+ # this property
97
+ set_default("SLM_PERMISSIONS", "slm.authentication.default_permissions")
98
+
99
+ # These default permission groups will be created on migration
100
+ set_default(
101
+ "SLM_DEFAULT_PERMISSION_GROUPS",
102
+ {"Agency Manager": ["propose_sites", "moderate_sites"]},
103
+ )
104
+
105
+ # the xsd schemas that should be preloaded on start - if a schema is used
106
+ # that is not preloaded it will be lazily loaded which can take some time and
107
+ # will prolong the request. It can be useful to disable this during testing to
108
+ # reduce load times. It is recommended to leave this set to the default setting
109
+ # in production
110
+ set_default("SLM_PRELOAD_SCHEMAS", [geo for geo in GeodesyMLVersion])
111
+
112
+ # By default the SLM will not send moderation related emails to user accounts
113
+ # who have never logged in, set this to False to disable this behavior
114
+ # This does not apply to account related emails like password reset requests
115
+ set_default("SLM_EMAILS_REQUIRE_LOGIN", True)
116
+
117
+ # Automated alert configuration
118
+ #
119
+ set_default(
120
+ "SLM_AUTOMATED_ALERTS",
121
+ {
122
+ "slm.GeodesyMLInvalid": {
123
+ "issue": [
124
+ "slm.signals.site_published",
125
+ "slm.signals.site_file_published",
126
+ "slm.signals.site_file_unpublished",
127
+ ],
128
+ "level": AlertLevel.ERROR,
129
+ "send_email": False,
130
+ },
131
+ "slm.ReviewRequested": {
132
+ "issue": ["slm.signals.review_requested"],
133
+ "rescind": [
134
+ "slm.signals.updates_rejected",
135
+ "slm.signals.site_published",
136
+ "slm.signals.section_added",
137
+ "slm.signals.section_edited",
138
+ "slm.signals.section_deleted",
139
+ ],
140
+ "level": AlertLevel.NOTICE,
141
+ "send_email": True,
142
+ },
143
+ "slm.UpdatesRejected": {
144
+ "issue": ["slm.signals.updates_rejected"],
145
+ "rescind": [
146
+ "slm.signals.review_requested",
147
+ "slm.signals.site_published",
148
+ "slm.signals.section_added",
149
+ "slm.signals.section_edited",
150
+ "slm.signals.section_deleted",
151
+ ],
152
+ "level": AlertLevel.ERROR,
153
+ "send_email": True,
154
+ },
155
+ "slm.SiteLogPublished": {
156
+ "issue": {"slm.signals.site_published"},
157
+ "level": AlertLevel.NOTICE,
158
+ "send_email": True,
159
+ },
160
+ "slm.UnpublishedFilesAlert": {
161
+ "issue": {
162
+ "slm.signals.site_file_uploaded",
163
+ "slm.signals.site_file_unpublished",
164
+ },
165
+ "rescind": [
166
+ "slm.signals.site_file_published",
167
+ "slm.signals.site_file_deleted",
168
+ ],
169
+ "level": AlertLevel.NOTICE,
170
+ "send_email": True,
171
+ },
172
+ },
173
+ )
174
+
175
+ # slm provides an implementation of urls.py that will load this list into
176
+ # url patterns. This should be a list of 2-tuples where the first tuple is the
177
+ # path stem mount point for the included apps' URLs and the second element is
178
+ # the string that will be passed to django.urls.include
179
+ SLM_URL_MOUNTS = []
180
+
181
+
182
+ # control the domain used to generate absolute links to the SLM log document
183
+ # attachments including images and files. Any standalone artifacts produced by
184
+ # the slm that include links to files served by the SLM will use this domain
185
+ # as the stem. If empty the default site domain will be used. You probably
186
+ # do not need to set this field unless you are serving files off a different
187
+ # instance than the instance that generates serialized artifacts
188
+ SLM_FILE_DOMAIN = None
@@ -0,0 +1,53 @@
1
+ from slm.settings import get_setting
2
+
3
+
4
+ def get_enum_context():
5
+ # this needs to be wrapped in a function call because these enums use the
6
+ # translation infrastructure which cannot be invoked before settings have
7
+ # been fully realized.
8
+ from slm.defines import (
9
+ AlertLevel,
10
+ LogEntryType,
11
+ SiteFileUploadStatus,
12
+ SiteLogFormat,
13
+ SiteLogStatus,
14
+ SLMFileType,
15
+ )
16
+
17
+ return {
18
+ "enums": [
19
+ LogEntryType,
20
+ SiteLogStatus,
21
+ AlertLevel,
22
+ SiteFileUploadStatus,
23
+ SiteLogFormat,
24
+ SLMFileType,
25
+ ]
26
+ }
27
+
28
+
29
+ def get_defines_context():
30
+ from slm.defines import AlertLevel, SiteLogStatus
31
+
32
+ return {"AlertLevel": AlertLevel, "SiteLogStatus": SiteLogStatus}
33
+
34
+
35
+ def get_icon_context():
36
+ from django.conf import settings
37
+
38
+ from slm.templatetags.slm import file_icon
39
+
40
+ return {
41
+ "ICON_MAP": getattr(settings, "SLM_FILE_ICONS", {}),
42
+ "DEFAULT_ICON": file_icon(""),
43
+ }
44
+
45
+
46
+ STATIC_TEMPLATES = {
47
+ "templates": [
48
+ ("slm/js/urls.js", {"dest": get_setting("STATIC_ROOT") / "urls.js"}),
49
+ ("slm/js/enums.js", {"context": get_enum_context}),
50
+ ("slm/js/fileIcons.js", {"context": get_icon_context}),
51
+ ("slm/css/defines.css", {"context": get_defines_context}),
52
+ ]
53
+ }
@@ -0,0 +1,29 @@
1
+ from jinja2 import select_autoescape
2
+
3
+ TEMPLATES = [
4
+ {
5
+ "BACKEND": "django.template.backends.django.DjangoTemplates",
6
+ "APP_DIRS": True,
7
+ "OPTIONS": {
8
+ "context_processors": [
9
+ "django.template.context_processors.debug",
10
+ "django.template.context_processors.request",
11
+ "django.contrib.auth.context_processors.auth",
12
+ "django.contrib.messages.context_processors.messages",
13
+ ],
14
+ "builtins": ["slm.templatetags.slm"],
15
+ },
16
+ },
17
+ {
18
+ "BACKEND": "django.template.backends.jinja2.Jinja2",
19
+ "APP_DIRS": True,
20
+ "OPTIONS": {
21
+ "autoescape": select_autoescape(
22
+ disabled_extensions=("log",),
23
+ default_for_string=True,
24
+ default=True,
25
+ ),
26
+ "environment": "slm.templatetags.jinja2.compat",
27
+ },
28
+ },
29
+ ]
@@ -0,0 +1,8 @@
1
+ from slm.settings import get_setting, set_default
2
+
3
+ MEDIA_URL = "/media/"
4
+ set_default("MEDIA_ROOT", get_setting("SITE_DIR") / "media")
5
+
6
+ # set RWX for Owner and Group for any uploaded files
7
+ FILE_UPLOAD_PERMISSIONS = 0o770
8
+ FILE_UPLOAD_DIRECTORY_PERMISSIONS = 0o770
slm/settings/urls.py ADDED
@@ -0,0 +1,126 @@
1
+ """
2
+ SLM URL Configuration
3
+
4
+ The `urlpatterns` list routes URLs to views. For more information please see:
5
+ https://docs.djangoproject.com/en/stable/topics/http/urls/
6
+
7
+ Instead of having to define your own urls.py for a deployment of SLM we try to
8
+ do most of the work for you in this default file. If you develop an app and you
9
+ want it to be automatically included in your SLM urls you should add the flag
10
+ SLM_INCLUDE = True to your apps urls.py file. If you do so the urls in your
11
+ app will be included into your deployment at the / mount point. If you wish to
12
+ extend the APIs by providing your own endpoints you may do so by supplying an
13
+ APIS dictionary. For example the slm.map app extends the public API like so:
14
+
15
+ .. code-block: python
16
+
17
+ from django.urls import path
18
+ from slm.map.api.edit import views as edit_views
19
+ from slm.map.api.public import views as public_views
20
+ from slm.map.views import MapView
21
+
22
+ SLM_INCLUDE = True
23
+
24
+ APIS = {
25
+ 'edit': {
26
+ 'serializer_module': 'slm.map.api.edit.serializers',
27
+ 'endpoints': [
28
+ ('stations', edit_views.StationListViewSet),
29
+ ('map', edit_views.StationMapViewSet),
30
+ ]
31
+ },
32
+ 'public': {
33
+ 'serializer_module': 'slm.map.api.public.serializers',
34
+ 'endpoints': [
35
+ ('stations', public_views.StationListViewSet),
36
+ ('map', public_views.StationMapViewSet),
37
+ ]
38
+ }
39
+ }
40
+
41
+ Other third party apps may be included at customizable mount points by
42
+ providing a settings.SLM_URL_MOUNTS list. For example to include your app at
43
+ the myapp path you might do this:
44
+
45
+ .. code-block: python
46
+
47
+ SLM_URL_MOUNTS = [
48
+ ('myapp/', 'myapp.urls')
49
+ ]
50
+
51
+ """
52
+
53
+ from importlib import import_module
54
+
55
+ from django.conf import settings
56
+ from django.contrib import admin
57
+ from django.contrib.staticfiles.urls import staticfiles_urlpatterns
58
+ from django.urls import include, path
59
+ from rest_framework.routers import DefaultRouter
60
+
61
+ APIS = {}
62
+
63
+
64
+ class ReregisterableRouter(DefaultRouter):
65
+ def register(self, prefix, viewset, base_name=None):
66
+ if base_name is None:
67
+ base_name = self.get_default_base_name(viewset)
68
+ idx = 0
69
+ for api in self.registry:
70
+ if prefix == api[0] and base_name == api[2]:
71
+ self.registry[idx] = (prefix, viewset, base_name)
72
+ idx += 1
73
+ return
74
+ idx += 1
75
+ self.registry.append((prefix, viewset, base_name))
76
+
77
+
78
+ def bring_in_urls(urlpatterns):
79
+ routers = {}
80
+
81
+ for app in reversed(settings.INSTALLED_APPS):
82
+ try:
83
+ url_module = import_module(f"{app}.urls")
84
+ api = getattr(url_module, "APIS", None)
85
+ if api:
86
+ for api, endpoints in api.items():
87
+ if api not in routers:
88
+ routers[api] = ReregisterableRouter()
89
+ router = routers[api]
90
+ for endpoint in endpoints:
91
+ router.register(
92
+ endpoint[0],
93
+ endpoint[1],
94
+ base_name=(
95
+ endpoint[0] if len(endpoint) < 3 else endpoint[2]
96
+ ),
97
+ )
98
+
99
+ except ImportError:
100
+ if app in {"slm", "slm.map", "network_map", "igs_ext"}:
101
+ raise
102
+ pass
103
+
104
+ for api, router in routers.items():
105
+ # todo how to nest under slm?
106
+ pattern = path(
107
+ f"api/{api}/", include((router.urls, "slm"), namespace=f"slm_{api}_api")
108
+ )
109
+ urlpatterns.append(pattern)
110
+ APIS.setdefault(f"{api}_api", []).append(pattern)
111
+
112
+
113
+ urlpatterns = [
114
+ path("admin/", admin.site.urls),
115
+ path("accounts/", include("allauth.urls")),
116
+ path("ckeditor/", include("ckeditor_uploader.urls")),
117
+ path("", include("slm.urls")),
118
+ ]
119
+
120
+ if getattr(settings, "DJANGO_DEBUG_TOOLBAR", False):
121
+ urlpatterns.append(path("__debug__/", include("debug_toolbar.urls")))
122
+
123
+ # allows us to use static files like images
124
+ urlpatterns += staticfiles_urlpatterns()
125
+
126
+ bring_in_urls(urlpatterns)
@@ -0,0 +1,196 @@
1
+ """
2
+ This file contains the default validation configuration configuration
3
+ for site log fields. Amend or override SLM_DATA_VALIDATORS to use
4
+ different routines.
5
+
6
+ The format of SLM_DATA_VALIDATORS is
7
+ {
8
+ <app_label>.<ModelCalss>: {
9
+ '<field_name>': [Validator1(), Validator2(), ...]
10
+ }
11
+ }
12
+ """
13
+
14
+ from slm.validators import (
15
+ ActiveEquipmentValidator,
16
+ ARPValidator,
17
+ EnumValidator,
18
+ FieldRequired,
19
+ NonEmptyValidator,
20
+ TimeRangeBookendValidator,
21
+ TimeRangeValidator,
22
+ VerifiedEquipmentValidator,
23
+ )
24
+
25
+ # toggling this off will prevent any validation configured to block edit saves
26
+ # from doing so - instead flags will be issued.
27
+ SLM_VALIDATION_BYPASS_BLOCK = False
28
+
29
+ # do not allow a log to be published without these sections
30
+ SLM_REQUIRED_SECTIONS_TO_PUBLISH = [
31
+ "siteform",
32
+ "siteidentification",
33
+ "sitelocation",
34
+ "sitereceiver",
35
+ "siteantenna",
36
+ # 'sitesurveyedlocalties',
37
+ # 'sitefrequencystandard',
38
+ # 'sitecollocation',
39
+ # 'sitehumiditysensor',
40
+ # 'sitepressuresensor',
41
+ # 'sitetemperaturesensor',
42
+ # 'sitewatervaporradiometer',
43
+ # 'siteotherinstrumentation',
44
+ # 'siteradiointerferences',
45
+ # 'sitemultipathsources',
46
+ # 'sitesignalobstructions',
47
+ # 'sitelocalepisodiceffects',
48
+ "siteoperationalcontact",
49
+ # 'siteresponsibleagency',
50
+ # 'sitemoreinformation'
51
+ ]
52
+
53
+ # the model field to validator map
54
+ SLM_DATA_VALIDATORS = {
55
+ "slm.SiteIdentification": {
56
+ "site_name": [FieldRequired()],
57
+ "fracture_spacing": [FieldRequired(desired=True), EnumValidator()],
58
+ "iers_domes_number": [FieldRequired()],
59
+ "date_installed": [FieldRequired()],
60
+ },
61
+ "slm.SiteLocation": {
62
+ "city": [FieldRequired()],
63
+ "country": [FieldRequired(), EnumValidator()],
64
+ "tectonic": [EnumValidator()],
65
+ "xyz": [FieldRequired()],
66
+ "llh": [FieldRequired()],
67
+ },
68
+ "slm.SiteReceiver": {
69
+ "receiver_type": [VerifiedEquipmentValidator(), ActiveEquipmentValidator()],
70
+ "satellite_system": [NonEmptyValidator()],
71
+ "serial_number": [FieldRequired()],
72
+ "firmware": [FieldRequired()],
73
+ "installed": [FieldRequired(), TimeRangeValidator(end_field="removed")],
74
+ "removed": [
75
+ TimeRangeValidator(start_field="installed"),
76
+ TimeRangeBookendValidator(),
77
+ ],
78
+ },
79
+ "slm.SiteAntenna": {
80
+ "antenna_type": [VerifiedEquipmentValidator(), ActiveEquipmentValidator()],
81
+ "radome_type": [VerifiedEquipmentValidator(), ActiveEquipmentValidator()],
82
+ "serial_number": [FieldRequired()],
83
+ "reference_point": [FieldRequired(), ARPValidator(), EnumValidator()],
84
+ "installed": [FieldRequired(), TimeRangeValidator(end_field="removed")],
85
+ "removed": [
86
+ TimeRangeValidator(start_field="installed"),
87
+ TimeRangeBookendValidator(),
88
+ ],
89
+ "marker_une": [FieldRequired(allow_legacy_nulls=True)],
90
+ "alignment": [FieldRequired(allow_legacy_nulls=True)],
91
+ },
92
+ "slm.SiteSurveyedLocalTies": {
93
+ "name": [FieldRequired()],
94
+ "measured": [FieldRequired(allow_legacy_nulls=True)],
95
+ "diff_xyz": [FieldRequired(allow_legacy_nulls=True)],
96
+ },
97
+ "slm.SiteFrequencyStandard": {
98
+ "standard_type": [FieldRequired(), EnumValidator()],
99
+ "effective_start": [
100
+ FieldRequired(),
101
+ TimeRangeValidator(end_field="effective_end"),
102
+ ],
103
+ "effective_end": [TimeRangeValidator(start_field="effective_start")],
104
+ },
105
+ "slm.SiteCollocation": {
106
+ "instrument_type": [FieldRequired()],
107
+ "status": [FieldRequired(allow_legacy_nulls=True), EnumValidator()],
108
+ "effective_start": [
109
+ FieldRequired(),
110
+ TimeRangeValidator(end_field="effective_end"),
111
+ ],
112
+ "effective_end": [TimeRangeValidator(start_field="effective_start")],
113
+ },
114
+ "slm.SiteHumiditySensor": {
115
+ "model": [FieldRequired()],
116
+ "manufacturer": [FieldRequired()],
117
+ "height_diff": [FieldRequired(allow_legacy_nulls=True)],
118
+ "effective_start": [TimeRangeValidator(end_field="effective_end")],
119
+ "effective_end": [TimeRangeValidator(start_field="effective_start")],
120
+ "aspiration": [FieldRequired(allow_legacy_nulls=True), EnumValidator()],
121
+ },
122
+ "slm.SitePressureSensor": {
123
+ "model": [FieldRequired()],
124
+ "manufacturer": [FieldRequired()],
125
+ "height_diff": [FieldRequired(allow_legacy_nulls=True)],
126
+ "effective_start": [TimeRangeValidator(end_field="effective_end")],
127
+ "effective_end": [TimeRangeValidator(start_field="effective_start")],
128
+ },
129
+ "slm.SiteTemperatureSensor": {
130
+ "model": [FieldRequired()],
131
+ "manufacturer": [FieldRequired()],
132
+ "height_diff": [FieldRequired(allow_legacy_nulls=True)],
133
+ "effective_start": [TimeRangeValidator(end_field="effective_end")],
134
+ "effective_end": [TimeRangeValidator(start_field="effective_start")],
135
+ "aspiration": [FieldRequired(allow_legacy_nulls=True), EnumValidator()],
136
+ },
137
+ "slm.SiteWaterVaporRadiometer": {
138
+ "model": [FieldRequired()],
139
+ "manufacturer": [FieldRequired()],
140
+ "distance_to_antenna": [FieldRequired(allow_legacy_nulls=True)],
141
+ "height_diff": [FieldRequired(allow_legacy_nulls=True)],
142
+ "effective_start": [TimeRangeValidator(end_field="effective_end")],
143
+ "effective_end": [TimeRangeValidator(start_field="effective_start")],
144
+ },
145
+ "slm.SiteOtherInstrumentation": {"instrumentation": [FieldRequired()]},
146
+ "slm.SiteRadioInterferences": {
147
+ "interferences": [FieldRequired(allow_legacy_nulls=True)],
148
+ "effective_start": [
149
+ FieldRequired(),
150
+ TimeRangeValidator(end_field="effective_end"),
151
+ ],
152
+ "effective_end": [TimeRangeValidator(start_field="effective_start")],
153
+ },
154
+ "slm.SiteMultiPathSources": {
155
+ "sources": [FieldRequired(allow_legacy_nulls=True)],
156
+ "effective_start": [
157
+ FieldRequired(),
158
+ TimeRangeValidator(end_field="effective_end"),
159
+ ],
160
+ "effective_end": [TimeRangeValidator(start_field="effective_start")],
161
+ },
162
+ "slm.SiteSignalObstructions": {
163
+ "obstructions": [FieldRequired(allow_legacy_nulls=True)],
164
+ "effective_start": [
165
+ FieldRequired(),
166
+ TimeRangeValidator(end_field="effective_end"),
167
+ ],
168
+ "effective_end": [TimeRangeValidator(start_field="effective_start")],
169
+ },
170
+ "slm.SiteLocalEpisodicEffects": {
171
+ "event": [FieldRequired(allow_legacy_nulls=True)],
172
+ "effective_start": [
173
+ FieldRequired(),
174
+ TimeRangeValidator(end_field="effective_end"),
175
+ ],
176
+ "effective_end": [TimeRangeValidator(start_field="effective_start")],
177
+ },
178
+ "slm.SiteOperationalContact": {
179
+ "agency": [FieldRequired()],
180
+ "preferred_abbreviation": [FieldRequired()],
181
+ "primary_name": [FieldRequired()],
182
+ "primary_phone1": [FieldRequired(desired=True)],
183
+ "primary_email": [FieldRequired(allow_legacy_nulls=True)],
184
+ },
185
+ "slm.SiteResponsibleAgency": {
186
+ "agency": [FieldRequired()],
187
+ "preferred_abbreviation": [FieldRequired()],
188
+ "primary_name": [FieldRequired()],
189
+ "primary_phone1": [FieldRequired(desired=True)],
190
+ "primary_email": [FieldRequired(allow_legacy_nulls=True)],
191
+ },
192
+ "slm.SiteMoreInformation": {
193
+ "primary": [FieldRequired()],
194
+ "secondary": [FieldRequired()],
195
+ },
196
+ }