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,194 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ License: CC By 4.0 (http://creativecommons.org/licenses/by/4.0/legalcode)
4
+ Copyright: Commonwealth Government (Geoscience Australia) 2016
5
+ -->
6
+ <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:xml-gov-au:icsm:egeodesy:0.5" version="0.5" xmlns:geo="urn:xml-gov-au:icsm:egeodesy:0.5" xmlns:gml="http://www.opengis.net/gml/3.2" elementFormDefault="qualified" xml:lang="en">
7
+ <annotation>
8
+ <documentation></documentation>
9
+ </annotation>
10
+ <!-- -->
11
+ <import namespace="http://www.opengis.net/gml/3.2" schemaLocation="http://schemas.opengis.net/gml/3.2.1/gml.xsd"/>
12
+ <include schemaLocation="lineage.xsd"/>
13
+ <!-- -->
14
+ <complexType name="TerrestrialReferenceFramePropertyType">
15
+ <sequence minOccurs="0">
16
+ <element ref="geo:TerrestrialReferenceFrame"/>
17
+ </sequence>
18
+ <attributeGroup ref="gml:AssociationAttributeGroup"/>
19
+ </complexType>
20
+ <!-- -->
21
+ <element name="TerrestrialReferenceFrame" type="geo:TerrestrialReferenceFrameType" substitutionGroup="gml:GeodeticDatum">
22
+ <annotation>
23
+ <documentation>A terrestrial reference frame is a geodetic reference frame (or geodetic datum in previous GML parlance) in which the coordinates of reference or definition monuments are allowed to move. In essence, a terrestrial reference frame is continuously "realised" with the regular addition of new observations on a weekly or daily time scale. To use a terrestrial reference frame, up-to-date transformation products must be available to propagate coordinates and their uncertanties between epochs and between frames.
24
+
25
+ To derive a static reference frame (a GML datum) from a terrestrial reference frame and a dynamic transformation, the source and target epochs of the dynamic transformation are required to compute coordinates in the realisation epoch of the static reference frame.</documentation>
26
+ </annotation>
27
+ </element>
28
+ <!-- -->
29
+ <complexType name="TerrestrialReferenceFrameType">
30
+ <complexContent>
31
+ <restriction base="gml:GeodeticDatumType">
32
+ <sequence>
33
+ <sequence>
34
+ <element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
35
+ <element ref="gml:description" minOccurs="0"/>
36
+ <element ref="gml:descriptionReference" minOccurs="0"/>
37
+ <element ref="gml:identifier"/>
38
+ <element ref="gml:name" minOccurs="0" maxOccurs="unbounded"/>
39
+ </sequence>
40
+ <sequence>
41
+ <element ref="gml:remarks" minOccurs="0"/>
42
+ </sequence>
43
+ <sequence>
44
+ <element ref="gml:domainOfValidity" minOccurs="0"/>
45
+ <element ref="gml:scope" maxOccurs="unbounded"/>
46
+ <element ref="gml:anchorDefinition" minOccurs="0"/>
47
+ <element ref="gml:realizationEpoch">
48
+ <annotation>
49
+ <documentation>The realisation epoch is equivalent to the reference epoch for the reference frame. A dynamic terrestrial reference frame must contain a reference epoch.</documentation>
50
+ </annotation>
51
+ </element>
52
+ </sequence>
53
+ <sequence>
54
+ <element ref="gml:primeMeridian"/>
55
+ <element ref="gml:ellipsoid"/>
56
+ </sequence>
57
+ </sequence>
58
+ <attribute ref="gml:id" use="required"/>
59
+ </restriction>
60
+ </complexContent>
61
+ </complexType>
62
+ <!-- -->
63
+ <element name="DynamicTransformation" type="geo:DynamicTransformationType" substitutionGroup="gml:AbstractGeneralTransformation">
64
+ <annotation>
65
+ <documentation>A dynamic transformation is a coordinate transformation between reference frames where at least one of which is a dynamic or terrestrial reference frame. To derive a static reference frame (a GML datum) from a terrestrial reference frame and a dynamic transformation, either the source and target epochs OR the source epoch and a relative time quantity parameter of the dynamic transformation are required to compute coordinates in the realisation epoch of the static reference frame.
66
+
67
+ A transformation between reference frames in the static sense requires no temporal parameters. That is, a static reference frame (SRF) such as GDA94 can be transformed to another SRF like AGD66 with seven spatial parameters and no temporal parameters. In contrast, a dynamic reference frame (DRF) such as ITRF2008 (or the upcoming ITRF2014) requires temporal parameters to be transformed to a SRF and vice versa, and this results in the 14-parameter transformation comprised of 7 spatial and 7 temporal-spatial parameters. A fundamental requirement of the 14-parameter transformation is the provision of a time vector relative to the realisation epoch of the dynamic frame. See Dawson &amp; Woods (2010).</documentation>
68
+ </annotation>
69
+ </element>
70
+ <!-- -->
71
+ <complexType name="DynamicTransformationType">
72
+ <complexContent>
73
+ <extension base="gml:AbstractGeneralTransformationType">
74
+ <sequence>
75
+ <element name="sourceEpoch" type="gml:TimePositionType"/>
76
+ <element name="targetEpoch" type="gml:TimePositionType" minOccurs="0">
77
+ <annotation>
78
+ <documentation>The absence of a targetEpoch element implies that this transformation has time-dependent parameters. This is the standard configuration of a 14-parameter transformation whereby the latter 7 parameters are coefficients to a time parameter. A residual velocity map would also implicitly have time-dependent parameters. An example of a dynamic transformation that requires a targetEpoch is a 7-parameter transformation (implying no time-dependent parameters) between two dynamic frames, e.g. ITRF2014 to ITRF2008 at epochs 2014-01-01 and 2008-01-01 respectively.</documentation>
79
+ </annotation>
80
+ </element>
81
+ <element name="usesMethod" type="gml:OperationMethodType"/>
82
+ <element ref="gml:parameterValue" minOccurs="0" maxOccurs="unbounded"/>
83
+ <element name="source" type="geo:AbstractDefinitionSourcePropertyType" minOccurs="0" maxOccurs="unbounded">
84
+ <annotation>
85
+ <documentation>An unbounded list of references to the source of each parameter.</documentation>
86
+ </annotation>
87
+ </element>
88
+ </sequence>
89
+ </extension>
90
+ </complexContent>
91
+ </complexType>
92
+ <!-- -->
93
+ <element name="GridTransformation" type="geo:GridTransformationType" substitutionGroup="geo:DynamicTransformation">
94
+ <annotation>
95
+ <documentation>A gridded transformation can be either (1) an absolute deformation model between two defined epochs, or (2) a time-relative transformation such as a velocity map or residual velocity map transformation. A residual linear velocity map is often defined in conjunction with an optional Euler-pole 3-parameter transformation. The application of velocity map transformations require propagation of the initial coordinates to the sourceEpoch of the transformation to derive the appropriate linear velocity vector and uncertainty for that point to be propagated to the target epoch. The target epoch is not specified in a velocity map definition, instead the derived velocity is a time-dependent parameter which can be used to propagate the point to any desired epoch.</documentation>
96
+ </annotation>
97
+ </element>
98
+ <!-- -->
99
+ <complexType name="GridTransformationType">
100
+ <complexContent>
101
+ <extension base="geo:DynamicTransformationType">
102
+ <sequence>
103
+ <element ref="gml:RectifiedGridCoverage"/>
104
+ </sequence>
105
+ </extension>
106
+ </complexContent>
107
+ </complexType>
108
+ <!-- -->
109
+ <element name="DeformationGridTransformation" type="geo:DeformationGridTransformationType" substitutionGroup="geo:GridTransformation">
110
+ <annotation>
111
+ <documentation>A deformation grid transformation is an in-frame transformation i.e. sourceCRS and targetCRS are the same. The targetEpoch element is required. Deformation defines an absolute transformation, that is, one that does not have time-dependent parameters. It is often called a patch-model when used in scenarios where deformation has occurred due to an earthquake.</documentation>
112
+ </annotation>
113
+ </element>
114
+ <!-- -->
115
+ <complexType name="DeformationGridTransformationType">
116
+ <complexContent>
117
+ <restriction base="geo:GridTransformationType">
118
+ <sequence>
119
+ <sequence>
120
+ <element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
121
+ <element ref="gml:description" minOccurs="0"/>
122
+ <element ref="gml:descriptionReference" minOccurs="0"/>
123
+ <element ref="gml:identifier"/>
124
+ <element ref="gml:name" minOccurs="0" maxOccurs="unbounded"/>
125
+ <element ref="gml:remarks" minOccurs="0"/>
126
+ <element ref="gml:domainOfValidity" minOccurs="0"/>
127
+ <element ref="gml:scope" maxOccurs="unbounded"/>
128
+ <element ref="gml:operationVersion"/>
129
+ <element ref="gml:coordinateOperationAccuracy" minOccurs="0" maxOccurs="unbounded"/>
130
+ <element ref="gml:sourceCRS"/>
131
+ <element ref="gml:targetCRS"/>
132
+ </sequence>
133
+ <sequence>
134
+ <element name="sourceEpoch" type="gml:TimePositionType"/>
135
+ <element name="targetEpoch" type="gml:TimePositionType"/>
136
+ <element name="usesMethod" type="gml:OperationMethodType"/>
137
+ <element ref="gml:parameterValue" minOccurs="0" maxOccurs="unbounded"/>
138
+ <element name="source" type="geo:AbstractDefinitionSourcePropertyType" minOccurs="0" maxOccurs="unbounded">
139
+ <annotation>
140
+ <documentation>An unbounded list of references to the source of each parameter.</documentation>
141
+ </annotation>
142
+ </element>
143
+ </sequence>
144
+ <sequence>
145
+ <element ref="gml:RectifiedGridCoverage"/>
146
+ </sequence>
147
+ </sequence>
148
+ </restriction>
149
+ </complexContent>
150
+ </complexType>
151
+ <!-- -->
152
+ <element name="InterpolatedSingleValue" type="geo:InterpolatedSingleValueType" substitutionGroup="geo:AbstractTimeSlice">
153
+ <annotation>
154
+ <documentation>The result of an interpolation operation on a gridded transformation or geoid.</documentation>
155
+ </annotation>
156
+ </element>
157
+ <!-- -->
158
+ <complexType name="InterpolatedSingleValueType">
159
+ <complexContent>
160
+ <extension base="geo:AbstractTimeSliceType">
161
+ <sequence>
162
+ <element ref="geo:Status" minOccurs="0"/>
163
+ <element ref="geo:Value"/>
164
+ <element name="source" type="geo:InterpolatedValueSourcePropertyType" minOccurs="0"/>
165
+ </sequence>
166
+ </extension>
167
+ </complexContent>
168
+ </complexType>
169
+ <!-- -->
170
+ <element name="InterpolatedDynamicValue" type="geo:InterpolatedDynamicValueType" substitutionGroup="gml:AbstractFeature">
171
+ <annotation>
172
+ <documentation>The time-series result of interpolation operations on a gridded transformation or geoid over a time period.</documentation>
173
+ </annotation>
174
+ </element>
175
+ <!-- -->
176
+ <complexType name="InterpolatedDynamicValueType">
177
+ <complexContent>
178
+ <extension base="geo:DynamicFeatureType">
179
+ <sequence>
180
+ <element ref="geo:Status" minOccurs="0"/>
181
+ <element name="source" type="geo:InterpolatedValueSourcePropertyType" minOccurs="0"/>
182
+ <element name="history">
183
+ <complexType>
184
+ <sequence>
185
+ <element ref="geo:InterpolatedSingleValue" maxOccurs="unbounded"/>
186
+ </sequence>
187
+ </complexType>
188
+ </element>
189
+ </sequence>
190
+ </extension>
191
+ </complexContent>
192
+ </complexType>
193
+ <!-- -->
194
+ </schema>
@@ -0,0 +1,73 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!--
3
+ License: CC By 4.0 (http://creativecommons.org/licenses/by/4.0/legalcode)
4
+ Copyright: Scripps Orbit and Permanent Array Center (SOPAC), Commonwealth Government (Geoscience Australia) 2016
5
+ -->
6
+ <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:xml-gov-au:icsm:egeodesy:0.5" version="0.5" xmlns:geo="urn:xml-gov-au:icsm:egeodesy:0.5" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:gmd="http://www.isotc211.org/2005/gmd"
7
+ elementFormDefault="qualified" attributeFormDefault="unqualified"
8
+ xml:lang="en">
9
+ <annotation>
10
+ <documentation>
11
+ <p>Derived from SOPAC IGS Site Log XML Schema 2011 (http://sopac.ucsd.edu/ns/geodesy/doc/igsSiteLog/2011/igsSiteLog.xsd)</p>
12
+ <p>Modifications from original</p>
13
+ <ul>
14
+ <li>Made part of eGeodesy namespace</li>
15
+ <li>Changed SiteLogType to extend geo:AbstractSiteLogType, which extends gml:AbstractFeatureType</li>
16
+ <li>Adopted GML property-by-reference convention</li>
17
+ <li>Removed contactAgency and responsibleAgence and added siteOwner, siteContact, siteMetadataCustodian, siteDataCenter, and siteDataSource</li>
18
+ </ul>
19
+ </documentation>
20
+ </annotation>
21
+ <import namespace="http://www.opengis.net/gml/3.2" schemaLocation="http://schemas.opengis.net/gml/3.2.1/gml.xsd"/>
22
+ <import namespace="http://www.isotc211.org/2005/gmd" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd"/>
23
+ <include schemaLocation="monumentInfo.xsd">
24
+ <annotation>
25
+ <documentation></documentation>
26
+ </annotation>
27
+ </include>
28
+ <include schemaLocation="equipment.xsd"/>
29
+ <include schemaLocation="localInterferences.xsd"/>
30
+ <include schemaLocation="contact.xsd"/>
31
+ <include schemaLocation="dataStreams.xsd"/>
32
+ <include schemaLocation="observationSystem.xsd"/>
33
+ <include schemaLocation="commonTypes.xsd"/>
34
+ <complexType name="SiteLogType">
35
+ <annotation>
36
+ <documentation>
37
+ This derived complexType combines all relevant site metadata schemas to build a complete igs site log schema.
38
+ </documentation>
39
+ </annotation>
40
+ <complexContent>
41
+ <extension base="geo:AbstractSiteLogType">
42
+ <sequence>
43
+ <element name="formInformation" type="geo:FormInformationPropertyType"/>
44
+ <element name="siteIdentification" type="geo:SiteIdentificationPropertyType"/>
45
+ <element name="siteLocation" type="geo:SiteLocationPropertyType"/>
46
+ <element name="gnssReceiver" type="geo:gnssReceiverPropertyType" minOccurs="0" maxOccurs="unbounded"/>
47
+ <element name="gnssAntenna" type="geo:gnssAntennaPropertyType" minOccurs="0" maxOccurs="unbounded"/>
48
+ <element name="surveyedLocalTie" type="geo:surveyedLocalTiePropertyType" minOccurs="0" maxOccurs="unbounded"/>
49
+ <element name="frequencyStandard" type="geo:frequencyStandardPropertyType" minOccurs="0" maxOccurs="unbounded"/>
50
+ <element name="collocationInformation" type="geo:collocationInformationPropertyType" minOccurs="0" maxOccurs="unbounded"/>
51
+ <element name="humiditySensor" type="geo:humiditySensorPropertyType" minOccurs="0" maxOccurs="unbounded"/>
52
+ <element name="pressureSensor" type="geo:pressureSensorPropertyType" minOccurs="0" maxOccurs="unbounded"/>
53
+ <element name="temperatureSensor" type="geo:temperatureSensorPropertyType" minOccurs="0" maxOccurs="unbounded"/>
54
+ <element name="waterVaporSensor" type="geo:waterVaporSensorPropertyType" minOccurs="0" maxOccurs="unbounded"/>
55
+ <element name="otherInstrumentation" type="geo:otherInstrumentationPropertyType" minOccurs="0" maxOccurs="unbounded"/>
56
+ <element name="radioInterference" type="geo:radioInterferencePropertyType" minOccurs="0" maxOccurs="unbounded"/>
57
+ <element name="multipathSource" type="geo:multipathSourcePropertyType" minOccurs="0" maxOccurs="unbounded"/>
58
+ <element name="signalObstruction" type="geo:signalObstructionPropertyType" minOccurs="0" maxOccurs="unbounded"/>
59
+ <element name="localEpisodicEffect" type="geo:localEpisodicEffectPropertyType" minOccurs="0" maxOccurs="unbounded"/>
60
+ <element name="siteOwner" type="geo:agencyPropertyType" minOccurs="0" maxOccurs="1"/>
61
+ <element name="siteContact" type="geo:agencyPropertyType" minOccurs="0" maxOccurs="unbounded"/>
62
+ <element name="siteMetadataCustodian" type="geo:agencyPropertyType" minOccurs="1" maxOccurs="1"/>
63
+ <element name="siteDataCenter" type="geo:agencyPropertyType" minOccurs="0" maxOccurs="unbounded"/>
64
+ <element name="siteDataSource" type="geo:agencyPropertyType" minOccurs="0" maxOccurs="1"/>
65
+ <element name="moreInformation" type="geo:MoreInformationPropertyType" minOccurs="0"/>
66
+ <element name="dataStream" type="geo:dataStreamPropertyType" minOccurs="0"/>
67
+ <group ref="geo:RemarksGroup"/>
68
+ </sequence>
69
+ </extension>
70
+ </complexContent>
71
+ </complexType>
72
+ <element name="siteLog" type="geo:SiteLogType" substitutionGroup="geo:AbstractSiteLog"/>
73
+ </schema>
@@ -0,0 +1,116 @@
1
+ from threading import Lock
2
+ from typing import Dict, List, Union
3
+
4
+ from lxml import etree
5
+
6
+ from slm.defines import GeodesyMLVersion
7
+ from slm.parsing import BaseParameter, BaseParser, BaseSection, Error
8
+
9
+
10
+ class Section(BaseSection):
11
+ tree: etree.XML
12
+
13
+ def __init__(
14
+ self, tree, parser, section_number, subsection_number=None, order=None
15
+ ):
16
+ self.tree = tree
17
+ super().__init__(
18
+ line_no=tree.sourceline - 1,
19
+ section_number=section_number,
20
+ subsection_number=subsection_number,
21
+ order=order,
22
+ parser=parser,
23
+ )
24
+
25
+
26
+ class Parameter(BaseParameter):
27
+ elements: etree.XML
28
+
29
+ def __init__(self, elements, parser, section):
30
+ self.elements = elements
31
+ super().__init__(
32
+ line_no=elements[0].sourceline - 1,
33
+ name=elements[0].tag,
34
+ values=[elem.text for elem in elements],
35
+ parser=parser,
36
+ section=section,
37
+ )
38
+ self.line_end = elements[-1].sourceline - 1
39
+
40
+
41
+ class SiteLogParser(BaseParser):
42
+ """
43
+ Parsing and validation routines for GeodesyML Documents.
44
+ """
45
+
46
+ lock = Lock()
47
+
48
+ xsd: GeodesyMLVersion
49
+
50
+ # these are resolved on parse - pass to xpath queries
51
+ namespaces: Dict[str, str] = {"gco": None, "geo": None, "gmd": None, "gml": None}
52
+ doc: etree.XML
53
+
54
+ def __init__(self, site_log: Union[str, List[str]], site_name: str = None) -> None:
55
+ """
56
+
57
+ :param site_log:
58
+ :param site_name:
59
+ """
60
+ super().__init__(site_log=site_log, site_name=site_name)
61
+ try:
62
+ self.doc = etree.fromstring("\n".join(self.lines).encode())
63
+
64
+ try:
65
+ self.xsd = GeodesyMLVersion(
66
+ self.doc.nsmap.get(self.doc.prefix, GeodesyMLVersion.latest())
67
+ )
68
+ self.namespaces["geo"] = self.xsd.xmlns
69
+ for slug, xlmns in list(self.namespaces.items()):
70
+ if xlmns is None:
71
+ if slug in self.doc.nsmap:
72
+ self.namespaces[slug] = self.doc.nsmap[slug]
73
+ else:
74
+ for mapped_xmlns in self.doc.nsmap.values():
75
+ if (
76
+ slug in ["gco", "gmd"]
77
+ and "isotc211" in mapped_xmlns
78
+ and mapped_xmlns.endswith(slug)
79
+ ):
80
+ self.namespaces[slug] = mapped_xmlns
81
+ elif (
82
+ slug == "gml"
83
+ and "opengis" in mapped_xmlns
84
+ and "gml" in mapped_xmlns
85
+ ):
86
+ self.namespaces[slug] = mapped_xmlns
87
+
88
+ # Unclear if schema.validate is thread safe. Serialize access
89
+ # to it to be safe.
90
+ with self.lock:
91
+ result = self.xsd.schema.validate(self.doc)
92
+
93
+ if not result:
94
+ for error in self.xsd.schema.error_log:
95
+ self.add_finding(Error(error.line - 1, self, error.message))
96
+
97
+ except ValueError:
98
+ self.add_finding(
99
+ Error(
100
+ self.doc.sourceline - 1,
101
+ self,
102
+ f"Unsupported schema: "
103
+ f"{self.doc.nsmap.get(self.doc.prefix)}",
104
+ )
105
+ )
106
+
107
+ site_name = self.doc.xpath(
108
+ '/*[local-name()="GeodesyML"]/*[local-name()="siteLog"]/@gml:id',
109
+ namespaces=self.namespaces,
110
+ )[0]
111
+ if self.site_name:
112
+ self.name_matched = self.site_name.lower() == site_name.lower()
113
+ self.site_name = site_name
114
+
115
+ except etree.ParseError as pe:
116
+ self.add_finding(Error(pe.position[0] - 1, self, str(pe)))
@@ -0,0 +1,28 @@
1
+ from os import makedirs
2
+ from os.path import exists
3
+ from pathlib import Path
4
+ from urllib.parse import urlparse
5
+
6
+ import requests
7
+ from django.conf import settings
8
+ from lxml.etree import Resolver
9
+
10
+
11
+ class CachedResolver(Resolver):
12
+ CACHE_DIR = Path(getattr(settings, "MEDIA_ROOT")) / "cache" / "xsd"
13
+
14
+ def resolve(self, system_url, public_id, context):
15
+ parsed = urlparse(system_url)
16
+ if parsed.scheme:
17
+ xsd_path = self.CACHE_DIR / parsed.netloc / parsed.path.lstrip("/")
18
+ makedirs(xsd_path.parent, exist_ok=True)
19
+ if not exists(str(xsd_path)):
20
+ response = requests.get(system_url)
21
+ if response.status_code < 300:
22
+ system_url = xsd_path
23
+ with open(system_url, "wb") as f:
24
+ f.write(response.content)
25
+ else:
26
+ system_url = xsd_path
27
+
28
+ return super().resolve(system_url, public_id, context)
@@ -0,0 +1,11 @@
1
+ _registered = False
2
+
3
+
4
+ def register():
5
+ global _registered
6
+ if not _registered:
7
+ # the order of these imports is important, index receivers must happen
8
+ # before alert receivers
9
+ from slm.receivers import alerts, cleanup, event_loggers, index
10
+
11
+ _registered = event_loggers and cleanup and index and alerts
@@ -0,0 +1,87 @@
1
+ import logging
2
+ from functools import partial
3
+
4
+ from django.apps import apps
5
+ from django.conf import settings
6
+ from django.dispatch import Signal, receiver
7
+ from django.utils.module_loading import import_string
8
+
9
+ from slm import signals as slm_signals
10
+ from slm.models import Site
11
+
12
+ logger = logging.getLogger(f"{__name__}")
13
+
14
+ # signal receivers are stored as weak references, so we need to make sure
15
+ # they don't get garbage collected
16
+ receivers = []
17
+
18
+
19
+ def issue_alert(alert_class, **kwargs):
20
+ alert = alert_class.objects.issue_from_signal(**kwargs)
21
+ if alert:
22
+ logger.debug(
23
+ "Alert (%s) issued from signal: %s", alert, kwargs.get("signal", None)
24
+ )
25
+
26
+
27
+ def rescind_alert(alert_class, **kwargs):
28
+ rescinded = alert_class.objects.rescind_from_signal(**kwargs)
29
+ if rescinded:
30
+ logger.debug(
31
+ "%d alerts rescinded from signal: %s",
32
+ rescinded[0],
33
+ kwargs.get("signal", None),
34
+ )
35
+
36
+
37
+ def valid_signals(signals):
38
+ signal_set = set()
39
+ for sig in signals:
40
+ if isinstance(sig, str):
41
+ try:
42
+ sig = import_string(sig)
43
+ except ImportError:
44
+ pass
45
+ if isinstance(sig, Signal):
46
+ signal_set.add(sig)
47
+ return signal_set
48
+
49
+
50
+ for alert, config in getattr(settings, "SLM_AUTOMATED_ALERTS", {}).items():
51
+ try:
52
+ alert = apps.get_model(*alert.split(".", 1))
53
+ except LookupError:
54
+ continue
55
+ if alert.automated:
56
+
57
+ def do_connect(signal_type, connection):
58
+ for signal in valid_signals(config.get(signal_type, [])).intersection(
59
+ valid_signals(
60
+ getattr(alert.objects, "SUPPORTED_SIGNALS", {}).get(signal_type, [])
61
+ )
62
+ ):
63
+ signal.connect(connection)
64
+
65
+ # signal receivers are stored as weak references, so we need to make
66
+ # sure they don't get garbage collected
67
+ issue = partial(issue_alert, alert_class=alert)
68
+ rescind = partial(rescind_alert, alert_class=alert)
69
+ receivers.append(issue)
70
+ receivers.append(rescind)
71
+ do_connect("issue", issue)
72
+ do_connect("rescind", rescind)
73
+
74
+
75
+ @receiver(slm_signals.alert_issued)
76
+ def send_alert_emails(sender, alert, **kwargs):
77
+ if alert.send_email:
78
+ alert.send(request=kwargs.get("request", None))
79
+
80
+ if hasattr(alert, "site") and isinstance(alert.site, Site):
81
+ Site.objects.filter(pk=alert.site.pk).update_alert_levels()
82
+
83
+
84
+ @receiver(slm_signals.alert_cleared)
85
+ def handle_alert_cleared(sender, alert, **kwargs):
86
+ if hasattr(alert, "site") and isinstance(alert.site, Site):
87
+ Site.objects.filter(pk=alert.site.pk).update_alert_levels()
@@ -0,0 +1,41 @@
1
+ """Signal handlers that cleanup filesystem artifacts"""
2
+
3
+ import os
4
+ from pathlib import Path
5
+
6
+ from django.conf import settings
7
+ from django.db import transaction
8
+ from django.db.models.signals import pre_delete
9
+ from django.dispatch import receiver
10
+
11
+ from slm.models import ArchivedSiteLog, GeodesyMLInvalid, SiteFile, SiteFileUpload
12
+
13
+
14
+ def cleanup(file_path):
15
+ """
16
+ Delete the given file and recursively walk up directories deleting
17
+ directories, stopping at the first non-empty directory or MEDIA_ROOT
18
+ """
19
+ media_root = Path(settings.MEDIA_ROOT)
20
+ file_path = Path(file_path)
21
+ while file_path != media_root:
22
+ if file_path.is_file():
23
+ file_path.unlink()
24
+ elif file_path.is_dir():
25
+ if not os.listdir(str(file_path)):
26
+ file_path.rmdir()
27
+ else:
28
+ break
29
+ file_path = file_path.parent
30
+
31
+
32
+ @receiver(pre_delete, sender=ArchivedSiteLog)
33
+ @receiver(pre_delete, sender=SiteFileUpload)
34
+ @receiver(pre_delete, sender=SiteFile)
35
+ @receiver(pre_delete, sender=GeodesyMLInvalid)
36
+ def file_deleted(sender, instance, using, **kwargs):
37
+ if os.path.exists(instance.file.path):
38
+ transaction.on_commit(lambda: cleanup(instance.file.path))
39
+ if hasattr(instance, "thumbnail") and instance.thumbnail:
40
+ if os.path.exists(instance.thumbnail.path):
41
+ transaction.on_commit(lambda: cleanup(instance.thumbnail.path))