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,377 @@
1
+ """
2
+ This file contains parsing logic for the legacy Site Log format, such as one
3
+ exists. It makes no assumptions about what sections/parameters should be
4
+ present - it simply parses out sections, parameters and parameter values.
5
+
6
+ The next phase of site log interpretation is referred to as "binding" - this
7
+ is where the expected values are found and validated. Binding significantly
8
+ depends on the rest of the SLM code base and for that reason, is done
9
+ externally to this file - which should remain a data-naive process focused
10
+ only on syntax.
11
+
12
+ ..note::
13
+ Please do not import any SLM specific code into this parser. The goal is to
14
+ keep this parser as a standalone legacy site log format parser that can
15
+ be pulled out of the SLM source tree and used in other contexts.
16
+ """
17
+
18
+ import re
19
+ from typing import List, Optional, Union
20
+
21
+ from slm.parsing import (
22
+ BaseParameter,
23
+ BaseParser,
24
+ BaseSection,
25
+ Error,
26
+ Ignored,
27
+ Warn,
28
+ normalize,
29
+ )
30
+
31
+
32
+ class SubHeading:
33
+ name = ""
34
+ active = False
35
+
36
+ def __init__(self, name=name, active=active):
37
+ self.name = name
38
+ self.active = active
39
+
40
+
41
+ class ParsedParameter(BaseParameter):
42
+ REGEX = re.compile(r"\s*([\w\s/().,_<>+%-]+)\s*:\s*(.*)?")
43
+ REGEX_MULTI = re.compile(r"\s+:\s+(.*)?")
44
+
45
+ REGEX_PLACEHOLDER = re.compile(r"\([^()]+\)")
46
+
47
+ @property
48
+ def is_placeholder(self):
49
+ return bool(self.REGEX_PLACEHOLDER.fullmatch(self.value.replace("\n", "")))
50
+
51
+ def __init__(self, line_no, match, parser, section, sub_heading=""):
52
+ super().__init__(
53
+ line_no=line_no,
54
+ name=(
55
+ f'{sub_heading if sub_heading else ""}'
56
+ f'{"::" if sub_heading else ""}'
57
+ f"{match.group(1).strip()}"
58
+ ),
59
+ values=[match.group(2).strip()],
60
+ parser=parser,
61
+ section=section,
62
+ )
63
+ if self.is_placeholder:
64
+ self.parser.add_finding(
65
+ Ignored(self.line_no, self.parser, "Placeholder text", match.group(0))
66
+ )
67
+
68
+
69
+ class ParsedSection(BaseSection):
70
+ REGEX = re.compile(
71
+ r"([0-9]+)[.](?:([0-9xX]+)[.]?)?(?:([0-9xX]+)[.]?)?\s*([\w\s().,-]+)?"
72
+ )
73
+
74
+ line_no = None
75
+ line_end = None
76
+ section_number = None
77
+ subsection_number = None
78
+ order = None
79
+ header = ""
80
+
81
+ """{
82
+ str(normalized name): str(value)
83
+ }
84
+ """
85
+ parameters = None
86
+ example = False
87
+
88
+ @property
89
+ def ordering_id(self):
90
+ if self.order:
91
+ return self.order
92
+ if self.subsection_number:
93
+ return self.subsection_number
94
+ return None
95
+
96
+ def __init__(self, line_no, match, parser):
97
+ super().__init__(
98
+ line_no=line_no,
99
+ section_number=int(match.group(1)),
100
+ subsection_number=match.group(2),
101
+ order=match.group(3),
102
+ parser=parser,
103
+ )
104
+ self.lines = [match.group(0)]
105
+ self.example = (
106
+ not isinstance(self.subsection_number, int) and match.group(2)
107
+ ) or (not isinstance(self.order, int) and match.group(3))
108
+
109
+ @property
110
+ def index_tuple(self):
111
+ return self.section_number, self.subsection_number, self.order
112
+
113
+ @property
114
+ def heading_index(self):
115
+ if self.order is not None:
116
+ return self.section_number, self.subsection_number
117
+ return self.section_number
118
+
119
+ def add_parameter(self, parameter):
120
+ if parameter.normalized_name in self.parameters:
121
+ self.parser.add_finding(
122
+ Error(
123
+ parameter.line_no,
124
+ self.parser,
125
+ f"Duplicate parameter: {parameter.name}",
126
+ section=self,
127
+ )
128
+ )
129
+ else:
130
+ self.parameters[parameter.normalized_name] = parameter
131
+ if self.line_end < parameter.line_end:
132
+ self.line_end = parameter.line_end
133
+
134
+
135
+ class SiteLogParser(BaseParser):
136
+ """
137
+ This is a VERY lenient parser. SLM will never publish a submitted site log
138
+ without reformatting it, so the main goal here is to make a best-effort
139
+ parsing of the log and provide some deep introspective output on what the
140
+ parsing recorded.
141
+ """
142
+
143
+ # all non-parameter, section header or graphic lines we expect to see
144
+ # in site log files - we ignore these. If not in this set and it's not
145
+ # one of the above a warning will be logged
146
+ IGNORED_LINES = {
147
+ normalize("If Update:"),
148
+ normalize("Approximate Position"),
149
+ normalize("Approximate Position (ITRF)"),
150
+ normalize(
151
+ "Differential Components from GNSS Marker to the tied monument (ITRS)"
152
+ ),
153
+ normalize("Hardcopy on File"),
154
+ normalize("Antenna Graphics with Dimensions"),
155
+ normalize("(insert text graphic from file antenna.gra)"),
156
+ }
157
+
158
+ SUB_HEADINGS = {normalize("Primary Contact"), normalize("Secondary Contact")}
159
+
160
+ SECTION_BREAKERS = [normalize("Additional Information"), normalize("Notes")]
161
+
162
+ graphic: str = None
163
+
164
+ # used to figure out where antenna graphic begins
165
+ _graphic_start_: int
166
+
167
+ _last_indent_: Optional[int] = None
168
+
169
+ # last subheading observed and true if activated
170
+ _sub_heading_: SubHeading = SubHeading("", False)
171
+
172
+ def __init__(self, site_log: Union[str, List[str]], site_name: str = None) -> None:
173
+ """
174
+ Parse the ASCII Site Log format into data structures.
175
+
176
+ :param site_log: The entire site log contents as a string or as a list
177
+ of lines
178
+ :param site_name: The expected 9-character site name of this site or
179
+ None (default) if name is unknown
180
+ """
181
+ super().__init__(site_log=site_log, site_name=site_name)
182
+
183
+ idx = 0
184
+ while idx < len(self.lines):
185
+ idx = self.visit_line(idx, self.lines[idx].strip())
186
+
187
+ # throw an error if we didnt match the expected name
188
+ if self.name_matched is False and self.site_name:
189
+ self.add_finding(Error(0, self, f"Expected site name: {self.site_name}"))
190
+
191
+ # the only way to be sure where the graphic is, is to rewind from the
192
+ # end to the last encountered - removing any warnings/errors
193
+ for finding in reversed(sorted(self.findings.keys())):
194
+ if finding >= self._graphic_start_:
195
+ self.remove_finding(finding)
196
+
197
+ if self._graphic_start_ < len(self.lines):
198
+ self.graphic = self.lines[self._graphic_start_ :]
199
+
200
+ # chop beginning and ending empty lines off
201
+ begin = None
202
+ end = None
203
+ for indexes in [
204
+ range(0, len(self.graphic) - 1),
205
+ reversed(range(0, len(self.graphic) - 1)),
206
+ ]:
207
+ for idx in indexes:
208
+ if self.graphic[idx].strip():
209
+ if begin is None:
210
+ begin = idx
211
+ elif end is None:
212
+ end = idx + 1
213
+ break
214
+ # self.add_finding(
215
+ # Ignored(
216
+ # self._graphic_start_+idx,
217
+ # self,
218
+ # 'Empty line',
219
+ # line=self.graphic[idx]
220
+ # )
221
+ # )
222
+
223
+ self.graphic = "\n".join(self.graphic[begin:end])
224
+
225
+ def visit_line(self, idx, line):
226
+ if not line.strip(): # skip empty lines
227
+ # self.add_finding(Ignored(idx, self, 'Empty line', line=line))
228
+ return idx + 1
229
+
230
+ match = ParsedSection.REGEX.match(line) # is this a section header?
231
+ if match:
232
+ section = ParsedSection(idx, match, self)
233
+ lineno = self.visit_section(idx + 1, self.lines[idx], section)
234
+ self.add_section(section)
235
+ if section.example:
236
+ for ex_ln in range(section.line_no, section.line_end):
237
+ self.add_finding(
238
+ Ignored(ex_ln, self, "Placeholder text", self.lines[ex_ln])
239
+ )
240
+ self._sub_heading_ = SubHeading(name="", active=False)
241
+ self._last_indent_ = None
242
+ return lineno
243
+ elif (
244
+ len(self.sections) > 0 # ignore lines before the first section
245
+ and normalize(line) not in self.IGNORED_LINES
246
+ ):
247
+ self.add_finding(Warn(idx, self, "Unrecognized line", line=line))
248
+ else:
249
+ # look for the site name in the header somewhere before the first
250
+ # section.
251
+ self._graphic_start_ = idx + 1
252
+ if self.name_matched is None:
253
+ if self.site_name is not None and (
254
+ self.site_name.upper() in line.upper()
255
+ or f"{self.site_name[0:4].upper()} " in line.upper()
256
+ ):
257
+ self.name_matched = True
258
+ header_site_name = line.split()[0].upper()
259
+ if self.site_name.upper() in header_site_name:
260
+ self.site_name = header_site_name
261
+ return idx + 1
262
+ elif (
263
+ "site" in line.lower()
264
+ and "info" in line.lower()
265
+ and 4 <= len(line.split()[0]) <= 9
266
+ ):
267
+ self.name_matched = False if self.site_name else None
268
+ if self.name_matched is False:
269
+ self.add_finding(
270
+ Error(idx, self, f"Incorrect site name: {line.split()[0]}")
271
+ )
272
+ self.site_name = line.split()[0].upper()
273
+ return idx + 1
274
+
275
+ # self.add_finding(Ignored(idx, self, 'Non-data line', line=line))
276
+ return idx + 1
277
+
278
+ def visit_section(self, idx, line, section):
279
+ # first line is a special case - could have data and could
280
+ # be multi line!
281
+ idx += (
282
+ self.visit_section_line(
283
+ idx - 1,
284
+ f"{line.strip().lstrip(section.index_string)} ",
285
+ section,
286
+ header_line=True,
287
+ )
288
+ - 1
289
+ )
290
+ while idx < len(self.lines) and not ParsedSection.REGEX.match(
291
+ self.lines[idx].strip()
292
+ ):
293
+ for section_breaker in self.SECTION_BREAKERS:
294
+ # TODO - shouldn't break section if not an *expected* param - see MOIN00CRI
295
+ if section_breaker in section.parameters:
296
+ return idx
297
+
298
+ line = self.lines[idx]
299
+ section.lines.append(line)
300
+ lines_parsed = self.visit_section_line(idx, line, section)
301
+ idx += lines_parsed
302
+
303
+ return idx
304
+
305
+ def visit_section_line(self, idx, line, section, header_line=False):
306
+ line_no = 1
307
+ if not line.strip(): # ignore empty lines
308
+ # self.add_finding(Ignored(idx, self, 'Empty line', line=line))
309
+ return line_no
310
+
311
+ if not header_line:
312
+ indent = self.count_indent(line)
313
+ if self._last_indent_ is not None:
314
+ if indent > self._last_indent_:
315
+ self._sub_heading_.active = True
316
+ elif indent < self._last_indent_:
317
+ self._sub_heading_.name = ""
318
+ self._sub_heading_.active = False
319
+ elif not self._sub_heading_.active:
320
+ self._sub_heading_.name = ""
321
+
322
+ self._last_indent_ = indent
323
+
324
+ match = ParsedParameter.REGEX.fullmatch(line)
325
+ if match:
326
+ parameter = ParsedParameter(
327
+ idx,
328
+ match,
329
+ self,
330
+ section,
331
+ sub_heading=(
332
+ self._sub_heading_.name if self._sub_heading_.active else ""
333
+ ),
334
+ )
335
+ self._graphic_start_ = idx + 1
336
+ while idx + line_no < len(self.lines):
337
+ if self.lines[idx + line_no].strip():
338
+ match = ParsedParameter.REGEX_MULTI.match(self.lines[idx + line_no])
339
+ if not match:
340
+ break
341
+ parameter.append(idx + line_no, match)
342
+ self._graphic_start_ = idx + line_no + 1
343
+ else:
344
+ pass
345
+ # self.add_finding(
346
+ # Ignored(
347
+ # idx+line_no,
348
+ # self,
349
+ # 'Empty line',
350
+ # line=line
351
+ # )
352
+ # )
353
+ line_no += 1
354
+ section.add_parameter(parameter)
355
+ elif not header_line:
356
+ if normalize(line) in self.IGNORED_LINES:
357
+ pass
358
+ # self.add_finding(
359
+ # Ignored(idx, self, 'Non-data line', line=line)
360
+ # )
361
+ elif normalize(line) in self.SUB_HEADINGS:
362
+ self._sub_heading_.name = normalize(line)
363
+ else:
364
+ self.add_finding(Warn(idx, self, "Unrecognized line", line=line))
365
+
366
+ return line_no
367
+
368
+ def count_indent(self, line):
369
+ count = 0
370
+ for char in line:
371
+ if char == " ":
372
+ count += 1
373
+ elif char == "\t":
374
+ count += 4
375
+ else:
376
+ break
377
+ return count
@@ -0,0 +1,34 @@
1
+ import sys
2
+ import typing as t
3
+
4
+ from lxml.etree import XMLSchema
5
+
6
+ from slm.defines import GeodesyMLVersion
7
+ from slm.parsing.xsd.binding import SiteLogBinder
8
+ from slm.parsing.xsd.parser import SiteLogParser
9
+
10
+ __all__ = [SiteLogBinder, SiteLogParser]
11
+
12
+
13
+ def load_schemas(
14
+ xsd_versions: t.List[GeodesyMLVersion] = list(GeodesyMLVersion),
15
+ ) -> t.List[XMLSchema]:
16
+ if sys.stdout.isatty():
17
+ from tqdm import tqdm
18
+
19
+ schemas = []
20
+ with tqdm(
21
+ total=len(xsd_versions),
22
+ desc="Loading",
23
+ unit="schema",
24
+ postfix={"xsd": None},
25
+ disable=not sys.stdout.isatty(),
26
+ ) as p_bar:
27
+ for geo_version in xsd_versions:
28
+ p_bar.set_postfix({"xsd": str(geo_version)})
29
+ getattr(geo_version, "schema")
30
+ schemas.append(geo_version.schema)
31
+ p_bar.update(n=1)
32
+ return schemas
33
+ else:
34
+ return [gml.schema for gml in xsd_versions]
@@ -0,0 +1,86 @@
1
+ from typing import Callable, Dict, List, Tuple, Union
2
+
3
+ from slm.defines import (
4
+ GeodesyMLVersion,
5
+ )
6
+ from slm.parsing import (
7
+ BaseBinder,
8
+ Error,
9
+ to_date,
10
+ to_str,
11
+ )
12
+ from slm.parsing.xsd.parser import Parameter, Section, SiteLogParser
13
+
14
+
15
+ class SiteLogBinder(BaseBinder):
16
+ """ """
17
+
18
+ parsed: SiteLogParser
19
+
20
+ TRANSLATION_TABLE: Dict[
21
+ GeodesyMLVersion,
22
+ Dict[
23
+ Tuple[Tuple[Union[int, None]], str],
24
+ List[Tuple[str, Union[Tuple[str, Callable], List[Tuple[str, Callable]]]]],
25
+ ],
26
+ ] = {
27
+ GeodesyMLVersion.v0_4: {
28
+ ((0,), "/geo:GeodesyML/geo:siteLog/geo:formInformation"): [
29
+ ("geo:preparedBy", ("prepared_by", to_str)),
30
+ ("geo:datePrepared", ("date_prepared", to_date)),
31
+ ("geo:reportType", ("report_type", to_str)),
32
+ ]
33
+ }
34
+ }
35
+
36
+ TRANSLATION_TABLE[GeodesyMLVersion.v0_5] = {
37
+ (
38
+ (0,),
39
+ "/geo:GeodesyML/geo:siteLog/geo:formInformation/" "geo:FormInformation",
40
+ ): TRANSLATION_TABLE[GeodesyMLVersion.v0_4][
41
+ ((0,), "/geo:GeodesyML/geo:siteLog/geo:formInformation")
42
+ ],
43
+ }
44
+
45
+ def __init__(self, parsed: SiteLogParser):
46
+ super().__init__(parsed)
47
+ binding_map = self.TRANSLATION_TABLE.get(parsed.xsd, None)
48
+ if binding_map is None:
49
+ parsed.add_finding(
50
+ Error(
51
+ parsed.doc.sourceline - 1,
52
+ parsed,
53
+ f"Unsupported schema for data binding: "
54
+ f"{parsed.doc.nsmap.get(parsed.doc.prefix)}",
55
+ )
56
+ )
57
+
58
+ namespaces = {"geo": self.parsed.xsd.xmlns}
59
+ for (index, path), bindings in binding_map.items():
60
+ trees = self.parsed.doc.xpath(path, namespaces=namespaces)
61
+
62
+ # if the last element in the index is None it means we expect to
63
+ # to find more than one
64
+ order = 0 if index[-1] is None else None
65
+ if trees:
66
+ for tree in trees:
67
+ section = parsed.add_section(
68
+ Section(
69
+ tree,
70
+ self.parsed,
71
+ *([*index, order] if order is not None else index),
72
+ )
73
+ )
74
+ for path, binding in bindings:
75
+ elements = tree.xpath(path, namespaces=namespaces)
76
+ if elements:
77
+ parameter = section.add_parameter(
78
+ Parameter(elements, parsed, section)
79
+ )
80
+ for param, bind in (
81
+ [binding] if isinstance(binding, tuple) else binding
82
+ ):
83
+ parameter.bind(param, bind(parameter.value))
84
+
85
+ if order is not None:
86
+ order += 1
@@ -0,0 +1,133 @@
1
+ <?xml version="1.0"?>
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 elementFormDefault="qualified" targetNamespace="urn:xml-gov-au:icsm:egeodesy:0.4" version="0.4" xmlns:geo="urn:xml-gov-au:icsm:egeodesy:0.4" xml:lang="en" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:gco="http://www.isotc211.org/2005/gco" >
7
+ <annotation>
8
+ <documentation></documentation>
9
+ </annotation>
10
+ <import namespace="http://www.opengis.net/gml/3.2" schemaLocation="http://schemas.opengis.net/gml/3.2.1/gml.xsd"/>
11
+ <import namespace="http://www.isotc211.org/2005/gco" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
12
+ <include schemaLocation="document.xsd"/>
13
+ <!-- -->
14
+ <group name="RemarksGroup">
15
+ <annotation>
16
+ <documentation>A convenience group. This allows an application schema developer to include remarks and associated documents in a standard fashion.</documentation>
17
+ </annotation>
18
+ <sequence>
19
+ <element minOccurs="0" name="notes" type="string"/>
20
+ <element maxOccurs="unbounded" minOccurs="0" name="associatedDocument" type="geo:DocumentPropertyType"/>
21
+ <element minOccurs="0" name="extension" type="anyType"/>
22
+ </sequence>
23
+ </group>
24
+ <!-- Change tracking group -->
25
+ <group name="ChangeTracking">
26
+ <annotation>
27
+ <documentation>A convenience group to log changes made to each meta-data block.</documentation>
28
+ </annotation>
29
+ <sequence>
30
+ <sequence>
31
+ <element name="dateInserted" type="gml:TimePositionType"/>
32
+ <element minOccurs="0" name="dateDeleted" type="gml:TimePositionType"/>
33
+ <element minOccurs="0" name="deletedReason" type="string"/>
34
+ </sequence>
35
+ </sequence>
36
+ </group>
37
+ <!-- -->
38
+ <attributeGroup name="RequiredSRSReferenceGroup">
39
+ <annotation>
40
+ <documentation>The attribute group SRSReferenceGroup is a required reference to the CRS used by this geometry, with optional additional information to simplify the processing of the coordinates when a more complete definition of the CRS is not needed.
41
+ In general the attribute srsName points to a CRS instance of gml:AbstractCoordinateReferenceSystem. For well-known references it is not required that the CRS description exists at the location the URI points to.
42
+ If no srsName attribute is given, the CRS shall be specified as part of the larger context this geometry element is part of.</documentation>
43
+ </annotation>
44
+ <attribute name="srsName" type="anyURI" use="required"/>
45
+ <attribute name="srsDimension" type="positiveInteger"/>
46
+ <attributeGroup ref="gml:SRSInformationGroup"/>
47
+ </attributeGroup>
48
+ <!-- -->
49
+ <group name="TimeSliceProperties">
50
+ <annotation>
51
+ <documentation/>
52
+ </annotation>
53
+ <sequence>
54
+ <element ref="gml:validTime"/>
55
+ <element minOccurs="0" ref="gml:dataSource"/>
56
+ </sequence>
57
+ </group>
58
+ <!-- -->
59
+ <complexType name="DynamicFeatureType">
60
+ <complexContent>
61
+ <restriction base="gml:DynamicFeatureType">
62
+ <sequence>
63
+ <sequence>
64
+ <group ref="gml:StandardObjectProperties"/>
65
+ </sequence>
66
+ <sequence>
67
+ <element minOccurs="0" ref="gml:boundedBy"/>
68
+ <element minOccurs="0" ref="gml:location"/>
69
+ </sequence>
70
+ <sequence>
71
+ <element minOccurs="0" ref="gml:validTime"/>
72
+ <element minOccurs="0" ref="gml:dataSource"/>
73
+ <element minOccurs="0" ref="gml:dataSourceReference"/>
74
+ </sequence>
75
+ </sequence>
76
+ </restriction>
77
+ </complexContent>
78
+ </complexType>
79
+ <!-- -->
80
+ <element abstract="true" name="DynamicFeature" substitutionGroup="gml:AbstractFeature" type="geo:DynamicFeatureType">
81
+ <annotation>
82
+ <documentation>Restriction of the gml:DynamicFeatureType. Removes gml:history and relies upon the extending type to implement a history element that restricts child types to those allowed by the class model.</documentation>
83
+ </annotation>
84
+ </element>
85
+ <!-- -->
86
+ <complexType name="InstrumentPropertyType">
87
+ <sequence minOccurs="0">
88
+ <element ref="geo:Instrument"/>
89
+ </sequence>
90
+ <attributeGroup ref="gml:AssociationAttributeGroup"/>
91
+ </complexType>
92
+ <!-- -->
93
+ <element abstract="true" name="AbstractTimeSlice" substitutionGroup="gml:AbstractFeature" type="geo:AbstractTimeSliceType">
94
+ <annotation>
95
+ <documentation>Mimics the gml:AbstractTimeSlice element but extends gml:AbstractFeatureType instead of gml:AbstractGMLType. The purpose of making this distinction is to ensure better access to a wider variety of WFS solutions that use the gml:AbstractFeature/gml:Location element for visualisation.
96
+ </documentation>
97
+ </annotation>
98
+ </element>
99
+ <!-- -->
100
+ <complexType abstract="true" name="AbstractTimeSliceType">
101
+ <complexContent>
102
+ <extension base="gml:AbstractFeatureType">
103
+ <sequence>
104
+ <group ref="geo:TimeSliceProperties"/>
105
+ </sequence>
106
+ </extension>
107
+ </complexContent>
108
+ </complexType>
109
+ <!-- -->
110
+ <element name="Instrument" substitutionGroup="gml:AbstractGML" type="geo:InstrumentType"/>
111
+ <!-- -->
112
+ <complexType name="InstrumentType">
113
+ <complexContent>
114
+ <extension base="gml:AbstractGMLType">
115
+ <sequence>
116
+ <element minOccurs="0" name="type" type="gml:CodeType"/>
117
+ <group ref="geo:RemarksGroup"/>
118
+ </sequence>
119
+ </extension>
120
+ </complexContent>
121
+ </complexType>
122
+ <!-- -->
123
+ <complexType final="#all" name="countryCodeType">
124
+ <annotation>
125
+ <documentation xml:lang="en">
126
+ Three-letter country code (ISO ISO 3166-1 alpha-3, https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3)
127
+ </documentation>
128
+ </annotation>
129
+ <complexContent>
130
+ <extension base="gco:CodeListValue_Type"/>
131
+ </complexContent>
132
+ </complexType>
133
+ </schema>
@@ -0,0 +1,29 @@
1
+ <?xml version="1.0"?>
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 elementFormDefault="qualified" targetNamespace="urn:xml-gov-au:icsm:egeodesy:0.4" version="0.4" xmlns:geo="urn:xml-gov-au:icsm:egeodesy:0.4" xml:lang="en" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gml="http://www.opengis.net/gml/3.2">
7
+ <import namespace="http://www.opengis.net/gml/3.2" schemaLocation="http://schemas.opengis.net/gml/3.2.1/gml.xsd"/>
8
+ <import namespace="http://www.isotc211.org/2005/gmd" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd"/>
9
+ <import namespace="http://www.isotc211.org/2005/gco" schemaLocation="http://schemas.opengis.net/iso/19139/20070417/gco/gco.xsd"/>
10
+ <annotation>
11
+ <documentation>
12
+ </documentation>
13
+ </annotation>
14
+ <complexType name="agencyPropertyType">
15
+ <annotation>
16
+ <documentation>
17
+ </documentation>
18
+ </annotation>
19
+ <complexContent>
20
+ <extension base="gml:AbstractGMLType">
21
+ <sequence>
22
+ <element minOccurs="0" ref="gmd:MD_SecurityConstraints"/>
23
+ <element ref="gmd:CI_ResponsibleParty"/>
24
+ </sequence>
25
+ <attributeGroup ref="gml:AssociationAttributeGroup"/>
26
+ </extension>
27
+ </complexContent>
28
+ </complexType>
29
+ </schema>