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,75 @@
1
+ from enum_properties import EnumProperties, p, s
2
+ from pathlib import Path
3
+ from .rinex import DataRate
4
+ from igs_tools.utils import day_of_year
5
+
6
+
7
+ class DataCenter(
8
+ EnumProperties,
9
+ p('protocol'), s('domain'), p('port'), s('full_name')
10
+ ):
11
+
12
+ IGN = 'IGN', 'ftp', 'igs.ign.fr', 21, "Institut National de l'Information Géographique et Forestière"
13
+ SIO = 'SIO', 'ftp', 'garner.ucsd.edu', 21, 'Scripps Institution of Oceanography'
14
+ KASI = 'KASI', 'ftp', 'nfs.kasi.re.kr', 21, 'Korea Astronomy and Space Science Institute'
15
+ CDDIS = 'CDDIS', 'https', 'https://cddis.nasa.gov', 443, 'NASA Center for Data and Information Services'
16
+
17
+ @property
18
+ def label(self):
19
+ return self.name
20
+
21
+ def __str__(self):
22
+ return str(self.label)
23
+
24
+ def directory(self, rinex_version, data_rate, date, hours=None):
25
+ """
26
+ todo this interface should be changed to return a list of paths and
27
+ honor the hours parameter
28
+ :param rinex_version:
29
+ :param data_rate:
30
+ :param date:
31
+ :param hours:
32
+ :return:
33
+ """
34
+ if self == self.IGN:
35
+ path = Path('/pub/igs/data')
36
+ if data_rate == DataRate.HOURLY:
37
+ path /= 'hourly'
38
+ elif data_rate == DataRate.HIGH_RATE:
39
+ path /= 'highrate'
40
+ path /= str(date.year)
41
+ path /= f'{day_of_year(date):03d}'
42
+ return str(path)
43
+ if self == self.SIO:
44
+ path = Path('/pub/rinex')
45
+ if data_rate == DataRate.HOURLY:
46
+ return None
47
+ elif data_rate == DataRate.HIGH_RATE:
48
+ path /= 'rinex_highrate'
49
+ path /= str(date.year)
50
+ path /= f'{day_of_year(date):03d}'
51
+ return str(path)
52
+ if self == self.KASI:
53
+ path = Path('/gps/data') # todo add constellation to list
54
+ if data_rate == DataRate.HOURLY or data_rate == DataRate.HIGH_RATE:
55
+ return None
56
+ elif data_rate == DataRate.DAILY:
57
+ path /= 'daily'
58
+ path /= str(date.year)
59
+ path /= f'{day_of_year(date):03d}'
60
+ path /= f'{str(date.year)[2:]}d'
61
+ return str(path)
62
+ if self == self.CDDIS:
63
+ path = Path('/archive/gnss/data')
64
+ if data_rate in [DataRate.HOURLY, DataRate.HIGH_RATE]:
65
+ path /= 'hourly'
66
+ elif data_rate == DataRate.DAILY:
67
+ path /= 'daily'
68
+ path /= str(date.year)
69
+ path /= f'{day_of_year(date):03d}'
70
+ if data_rate in [DataRate.DAILY, DataRate.HIGH_RATE]:
71
+ path /= f'{str(date.year)[2:]}d'
72
+ if data_rate in [DataRate.HOURLY, DataRate.HIGH_RATE]:
73
+ path /= '01'
74
+ return path
75
+ raise NotImplementedError(f'{self} must implement directory()')
@@ -0,0 +1,49 @@
1
+ from datetime import date
2
+ from enum_properties import IntEnumProperties, IntFlagProperties, p, s
3
+
4
+
5
+ class RinexVersion(
6
+ IntEnumProperties,
7
+ s('label'), s('major'), s('slug'), p('published')
8
+ ):
9
+
10
+ # Minor version not known
11
+
12
+ # Name Label Major Text Published
13
+ v2 = 2, 'RINEX 2', 2, '2', date(year=1993, month=4, day=1)
14
+ v3 = 3, 'RINEX 3', 3, '3', date(year=2007, month=11, day=28)
15
+ v4 = 4, 'RINEX 4', 4, '4', date(year=2021, month=12, day=1)
16
+ ###############################################################
17
+
18
+ v2_11 = 211, 'RINEX 2.11', 2, '2.11', date(year=2012, month=6, day=26)
19
+ v3_00 = 300, 'RINEX 3.00', 3, '3.00', date(year=2007, month=11, day=28)
20
+ v3_01 = 301, 'RINEX 3.01', 3, '3.01', date(year=2009, month=6, day=22)
21
+ v3_02 = 302, 'RINEX 3.02', 3, '3.02', date(year=2013, month=4, day=13)
22
+ v3_03 = 303, 'RINEX 3.03', 3, '3.03', date(year=2017, month=1, day=25)
23
+ v3_04 = 304, 'RINEX 3.04', 3, '3.04', date(year=2018, month=11, day=23)
24
+ v3_05 = 305, 'RINEX 3.05', 3, '3.05', date(year=2020, month=12, day=1)
25
+ v4_00 = 400, 'RINEX 4.00', 4, '4.00', date(year=2021, month=12, day=1)
26
+
27
+ def major_q(self, field_name='rinex_version'):
28
+ from django.db.models import Q
29
+ return Q(**{
30
+ f'{field_name}__in': [
31
+ rv.value for rv in RinexVersion if rv.major == self.major
32
+ ]})
33
+
34
+ @classmethod
35
+ def major_versions(cls):
36
+ return [cls.v2, cls.v3, cls.v4]
37
+
38
+ def __str__(self):
39
+ return str(self.label)
40
+
41
+
42
+ class DataRate(IntFlagProperties, s('label'), s('slug', case_fold=True)):
43
+
44
+ DAILY = 2**1, 'Daily', 'daily'
45
+ HOURLY = 2**2, 'Hourly', 'hourly'
46
+ HIGH_RATE = 2**3, 'High Rate', 'high'
47
+
48
+ def __str__(self):
49
+ return str(self.label)
igs_tools/directory.py ADDED
@@ -0,0 +1,247 @@
1
+ import argparse
2
+ from dateutil import parser as date_parser
3
+ from datetime import datetime, timedelta, date
4
+ from igs_tools.defines import RinexVersion, DataCenter, DataRate
5
+ from igs_tools.utils import classproperty
6
+ from typing import Optional, Generator, Union
7
+ from pathlib import Path
8
+ from igs_tools.connection import Connection
9
+ from igs_tools.utils import get_file_properties
10
+
11
+
12
+ class Listing:
13
+
14
+ station: str
15
+ protocol: str
16
+ domain: str
17
+ port: int
18
+ filename: str
19
+ directory: str
20
+ rinex_version: RinexVersion
21
+ data_rate: DataRate
22
+ date: Union[date, datetime]
23
+ data_center: DataCenter
24
+ size: Optional[int]
25
+ file_type: str
26
+
27
+ def __init__(self, **kwargs):
28
+ for key, value in kwargs.items():
29
+ setattr(self, key, value)
30
+
31
+ @property
32
+ def path(self):
33
+ return Path(self.directory) / self.filename
34
+
35
+
36
+ class DirectoryListing:
37
+
38
+ data_centers = [center for center in DataCenter]
39
+ rinex_versions = [RinexVersion.v3]
40
+ data_rates = [DataRate.DAILY]
41
+
42
+ username = ''
43
+ password = ''
44
+
45
+ @classproperty
46
+ def start(self):
47
+ return datetime.now().date()
48
+
49
+ @classproperty
50
+ def end(self):
51
+ return datetime.now().date()
52
+
53
+ def __init__(
54
+ self,
55
+ stations=None,
56
+ data_centers=None,
57
+ rinex_versions=None,
58
+ data_rates=None,
59
+ start=None,
60
+ end=None,
61
+ dates=None,
62
+ username=username,
63
+ password=password
64
+ ):
65
+ self.stations = set([stn.lower()[0:4] for stn in stations or []])
66
+ self.data_centers = set(data_centers or self.data_centers)
67
+ self.rinex_versions = set(rinex_versions or self.rinex_versions)
68
+ self.data_rates = set(data_rates or self.data_rates)
69
+
70
+ if dates and (start or end):
71
+ raise ValueError('Cannot specify dates and start/end.')
72
+
73
+ self.start = start or self.start
74
+ self.end = end or self.end
75
+ if self.start < self.end:
76
+ # allow any order
77
+ self.start, self.end = self.end, self.start
78
+ self.dates = dates or [
79
+ self.end + timedelta(days=i)
80
+ for i in range((self.start - self.end).days + 1)
81
+ ]
82
+ self.username = username
83
+ self.password = password
84
+
85
+ def __iter__(self) -> Generator[Listing, None, None]:
86
+ visited = set()
87
+ for data_center in self.data_centers:
88
+ connection = Connection(data_center, self.username, self.password)
89
+ print(data_center)
90
+ for rinex_version in self.rinex_versions:
91
+ print(rinex_version)
92
+ for data_rate in self.data_rates:
93
+ print(data_rate)
94
+ for date in self.dates:
95
+ print(date)
96
+ path = data_center.directory(
97
+ rinex_version,
98
+ data_rate,
99
+ date
100
+ )
101
+ print(path)
102
+ if not path or path in visited:
103
+ continue
104
+ visited.add(path)
105
+ for filename in connection.list(path):
106
+ properties = get_file_properties(filename)
107
+ if (
108
+ properties is None or
109
+ properties['rinex_version']
110
+ not in self.rinex_versions or (
111
+ self.stations and
112
+ properties['station'].lower()[0:4]
113
+ not in self.stations
114
+ )
115
+ ):
116
+ continue
117
+ yield Listing(
118
+ station=properties['station'],
119
+ protocol=data_center.protocol,
120
+ domain=data_center.domain,
121
+ port=data_center.port,
122
+ filename=filename,
123
+ directory=path,
124
+ rinex_version=properties['rinex_version'],
125
+ data_rate=data_rate,
126
+ date=date,
127
+ file_type=properties['file_type'],
128
+ size=properties.get('size', None),
129
+ data_center=data_center
130
+ )
131
+
132
+
133
+ if __name__ == '__main__':
134
+
135
+ parser = argparse.ArgumentParser(
136
+ description='Fetch directory information about IGS RINEX files.'
137
+ )
138
+ parser.add_argument(
139
+ 'stations',
140
+ metavar='S',
141
+ type=str,
142
+ nargs='*',
143
+ default=[],
144
+ help='The stations to fetch directory listings for. Default: all'
145
+ )
146
+
147
+ group = parser.add_mutually_exclusive_group()
148
+
149
+ group.add_argument(
150
+ '--date',
151
+ dest='dates',
152
+ action='append',
153
+ default=[],
154
+ type=lambda s: date_parser.parse(s).date(),
155
+ help='The date(s) to fetch directory listings for.'
156
+ )
157
+
158
+ group.add_argument(
159
+ '-s',
160
+ '--start',
161
+ dest='start',
162
+ type=lambda s: date_parser.parse(s).date(),
163
+ default=None,
164
+ help=f'The start date (inclusive) to fetch directory listings for. '
165
+ f'Default: {DirectoryListing.start}'
166
+ )
167
+
168
+ parser.add_argument(
169
+ '-e',
170
+ '--end',
171
+ dest='end',
172
+ type=lambda s: date_parser.parse(s).date(),
173
+ default=None,
174
+ help='The end date (inclusive) to fetch directory listings for. '
175
+ 'Default: {DirectoryListing.start}'
176
+ )
177
+
178
+ parser.add_argument(
179
+ '-d',
180
+ '--data-center',
181
+ dest='data_centers',
182
+ action='append',
183
+ default=[],
184
+ type=DataCenter,
185
+ choices=[center.label for center in DataCenter],
186
+ help=f'The list of data centers to fetch directory listings from.'
187
+ f'Default: {[center.label for center in DataCenter]}'
188
+ )
189
+
190
+ parser.add_argument(
191
+ '-v',
192
+ '--version',
193
+ dest='rinex_versions',
194
+ action='append',
195
+ default=[],
196
+ type=RinexVersion,
197
+ choices=[rinex.slug for rinex in RinexVersion.major_versions()],
198
+ help=f'The rinex version of the files to list. '
199
+ f'Default: {DirectoryListing.rinex_versions}'
200
+ )
201
+
202
+ parser.add_argument(
203
+ '-r',
204
+ '--rate',
205
+ dest='data_rates',
206
+ action='append',
207
+ default=[],
208
+ type=DataRate,
209
+ choices=[rate.slug for rate in DataRate],
210
+ help=f'The data rates of the files to list. '
211
+ f'Default: {DirectoryListing.data_rates}'
212
+ )
213
+
214
+ parser.add_argument(
215
+ '--username',
216
+ dest='username',
217
+ type=str,
218
+ help='The username to use for authentication if necessary.',
219
+ default=''
220
+ )
221
+
222
+ parser.add_argument(
223
+ '--password',
224
+ dest='password',
225
+ type=str,
226
+ help='The password to use for authentication if necessary.',
227
+ default=''
228
+ )
229
+
230
+ args = parser.parse_args()
231
+
232
+ for listing in DirectoryListing(
233
+ stations=args.stations,
234
+ data_centers=args.data_centers,
235
+ rinex_versions=args.rinex_versions,
236
+ data_rates=args.data_rates,
237
+ start=args.start,
238
+ end=args.end or args.start,
239
+ dates=args.dates,
240
+ username=args.username,
241
+ password=args.password
242
+ ):
243
+ print(
244
+ f'{listing.station.upper()} {listing.rinex_version} '
245
+ f'{listing.data_rate} {listing.date} {listing.filename} '
246
+ f'{str(listing.data_center)} {listing.size}'
247
+ )
igs_tools/utils.py ADDED
@@ -0,0 +1,66 @@
1
+ from datetime import date, datetime
2
+ from typing import Union
3
+ import re
4
+
5
+
6
+ class classproperty:
7
+ """
8
+ Equivalent to @property but for classes not instances.
9
+ """
10
+
11
+ def __init__(self, method=None):
12
+ self.fget = method
13
+
14
+ def __get__(self, instance, cls=None):
15
+ return self.fget(cls)
16
+
17
+ def getter(self, method):
18
+ self.fget = method
19
+ return self
20
+
21
+
22
+ def gps_week(date: Union[date, datetime]) -> int:
23
+ pass
24
+
25
+
26
+ def day_of_year(date: Union[date, datetime]) -> int:
27
+ return int(date.strftime('%j'))
28
+
29
+
30
+ def get_file_properties(filename):
31
+ """
32
+ Infer properties of a rinex file from its name.
33
+ :param filename:
34
+ :return:
35
+ """
36
+ from igs_tools.defines import RinexVersion
37
+ regexes = [
38
+ (
39
+ re.compile(
40
+ r'^(?P<station>[a-z0-9]{4})'
41
+ r'(?P<gps_day>\d{3})'
42
+ r'(?P<hour>[0a-z]{1})'
43
+ r'[.](?P<year>\d{2})(?P<file_type>[a-z]{1})'
44
+ r'[.](?P<compression>\w*)$'
45
+ ),
46
+ {'rinex_version': RinexVersion.v2}
47
+ ),
48
+ (
49
+ re.compile(
50
+ r'^(?P<station>[A-Z0-9]{9})_(\w{1})_(?P<year>\d{4})'
51
+ r'(?P<gps_day>\d{3})(\d{4})_(\w{3})_((\w{3})_)?'
52
+ r'(?P<constellation>\w{1})(?P<file_type>\w{1})[.]'
53
+ r'(?P<rinex_Format>(crx)|(rnx))[.](?P<compression>\w*)$'
54
+ ),
55
+ {'rinex_version': RinexVersion.v3}
56
+ )
57
+ ]
58
+
59
+ for regex in regexes:
60
+ match = re.match(regex[0], filename)
61
+ if match:
62
+ return {
63
+ **match.groupdict(),
64
+ **regex[1]
65
+ }
66
+ return None
slm/__init__.py ADDED
@@ -0,0 +1,21 @@
1
+ r"""
2
+ .----------------. .----------------. .----------------.
3
+ | .--------------. || .--------------. || .--------------. |
4
+ | | _______ | || | _____ | || | ____ ____ | |
5
+ | | / ___ | | || | |_ _| | || ||_ \ / _|| |
6
+ | | | (__ \_| | || | | | | || | | \/ | | |
7
+ | | '.___`-. | || | | | _ | || | | |\ /| | | |
8
+ | | |`\____) | | || | _| |__/ | | || | _| |_\/_| |_ | |
9
+ | | |_______.' | || | |________| | || ||_____||_____|| |
10
+ | | | || | | || | | |
11
+ | '--------------' || '--------------' || '--------------' |
12
+ '----------------' '----------------' '----------------'
13
+ """
14
+
15
+ VERSION = (0, 3, 0)
16
+
17
+ __title__ = "IGS/Site Log Manager"
18
+ __version__ = ".".join(str(i) for i in VERSION)
19
+ __author__ = ["Ashley Santiago", "Brian Kohan", "Rachel Pham"]
20
+ __license__ = "MIT"
21
+ __copyright__ = "Copyright 2022-2024 International GNSS Service"