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.
- igs_slm-0.1.0b0.dist-info/LICENSE +21 -0
- igs_slm-0.1.0b0.dist-info/METADATA +151 -0
- igs_slm-0.1.0b0.dist-info/RECORD +447 -0
- igs_slm-0.1.0b0.dist-info/WHEEL +4 -0
- igs_slm-0.1.0b0.dist-info/entry_points.txt +3 -0
- igs_tools/__init__.py +0 -0
- igs_tools/connection.py +88 -0
- igs_tools/defines/__init__.py +8 -0
- igs_tools/defines/constellation.py +21 -0
- igs_tools/defines/data_center.py +75 -0
- igs_tools/defines/rinex.py +49 -0
- igs_tools/directory.py +247 -0
- igs_tools/utils.py +66 -0
- slm/__init__.py +21 -0
- slm/admin.py +674 -0
- slm/api/edit/__init__.py +0 -0
- slm/api/edit/serializers.py +316 -0
- slm/api/edit/views.py +1632 -0
- slm/api/fields.py +89 -0
- slm/api/filter.py +504 -0
- slm/api/pagination.py +55 -0
- slm/api/permissions.py +65 -0
- slm/api/public/__init__.py +0 -0
- slm/api/public/serializers.py +249 -0
- slm/api/public/views.py +606 -0
- slm/api/serializers.py +132 -0
- slm/api/views.py +148 -0
- slm/apps.py +323 -0
- slm/authentication.py +198 -0
- slm/bin/__init__.py +0 -0
- slm/bin/startproject.py +262 -0
- slm/bin/templates/{{ project_dir }}/pyproject.toml +35 -0
- slm/bin/templates/{{ project_dir }}/sites/__init__.py +0 -0
- slm/bin/templates/{{ project_dir }}/sites/{{ site }}/__init__.py +0 -0
- slm/bin/templates/{{ project_dir }}/sites/{{ site }}/base.py +15 -0
- slm/bin/templates/{{ project_dir }}/sites/{{ site }}/develop/__init__.py +56 -0
- slm/bin/templates/{{ project_dir }}/sites/{{ site }}/develop/local.py +4 -0
- slm/bin/templates/{{ project_dir }}/sites/{{ site }}/develop/wsgi.py +16 -0
- slm/bin/templates/{{ project_dir }}/sites/{{ site }}/manage.py +34 -0
- slm/bin/templates/{{ project_dir }}/sites/{{ site }}/production/__init__.py +61 -0
- slm/bin/templates/{{ project_dir }}/sites/{{ site }}/production/wsgi.py +16 -0
- slm/bin/templates/{{ project_dir }}/sites/{{ site }}/urls.py +7 -0
- slm/bin/templates/{{ project_dir }}/sites/{{ site }}/validation.py +11 -0
- slm/bin/templates/{{ project_dir }}/{{ extension_app }}/__init__.py +0 -0
- slm/bin/templates/{{ project_dir }}/{{ extension_app }}/admin.py +5 -0
- slm/bin/templates/{{ project_dir }}/{{ extension_app }}/apps.py +14 -0
- slm/bin/templates/{{ project_dir }}/{{ extension_app }}/management/__init__.py +0 -0
- slm/bin/templates/{{ project_dir }}/{{ extension_app }}/management/commands/__init__.py +0 -0
- slm/bin/templates/{{ project_dir }}/{{ extension_app }}/management/commands/import_archive.py +64 -0
- slm/bin/templates/{{ project_dir }}/{{ extension_app }}/migrations/__init__.py +0 -0
- slm/bin/templates/{{ project_dir }}/{{ extension_app }}/models.py +6 -0
- slm/bin/templates/{{ project_dir }}/{{ extension_app }}/templates/slm/base.html +8 -0
- slm/bin/templates/{{ project_dir }}/{{ extension_app }}/urls.py +10 -0
- slm/bin/templates/{{ project_dir }}/{{ extension_app }}/views.py +5 -0
- slm/defines/AlertLevel.py +24 -0
- slm/defines/AntennaCalibration.py +25 -0
- slm/defines/AntennaFeatures.py +27 -0
- slm/defines/AntennaReferencePoint.py +22 -0
- slm/defines/Aspiration.py +13 -0
- slm/defines/CardinalDirection.py +19 -0
- slm/defines/CollocationStatus.py +12 -0
- slm/defines/EquipmentState.py +22 -0
- slm/defines/FlagSeverity.py +14 -0
- slm/defines/FractureSpacing.py +15 -0
- slm/defines/FrequencyStandardType.py +15 -0
- slm/defines/GeodesyMLVersion.py +48 -0
- slm/defines/ISOCountry.py +1194 -0
- slm/defines/Instrumentation.py +19 -0
- slm/defines/LogEntryType.py +30 -0
- slm/defines/SLMFileType.py +18 -0
- slm/defines/SiteFileUploadStatus.py +61 -0
- slm/defines/SiteLogFormat.py +49 -0
- slm/defines/SiteLogStatus.py +78 -0
- slm/defines/TectonicPlates.py +28 -0
- slm/defines/__init__.py +46 -0
- slm/forms.py +1126 -0
- slm/jinja2/slm/sitelog/ascii_9char.log +346 -0
- slm/jinja2/slm/sitelog/legacy.log +346 -0
- slm/jinja2/slm/sitelog/xsd/0.4/collocationInformation.xml +12 -0
- slm/jinja2/slm/sitelog/xsd/0.4/condition.xml +12 -0
- slm/jinja2/slm/sitelog/xsd/0.4/contact.xml +52 -0
- slm/jinja2/slm/sitelog/xsd/0.4/formInformation.xml +5 -0
- slm/jinja2/slm/sitelog/xsd/0.4/frequencyStandard.xml +12 -0
- slm/jinja2/slm/sitelog/xsd/0.4/gnssAntenna.xml +16 -0
- slm/jinja2/slm/sitelog/xsd/0.4/gnssReceiver.xml +11 -0
- slm/jinja2/slm/sitelog/xsd/0.4/humiditySensor.xml +13 -0
- slm/jinja2/slm/sitelog/xsd/0.4/localEpisodicEffect.xml +10 -0
- slm/jinja2/slm/sitelog/xsd/0.4/moreInformation.xml +22 -0
- slm/jinja2/slm/sitelog/xsd/0.4/multipathSource.xml +10 -0
- slm/jinja2/slm/sitelog/xsd/0.4/otherInstrumentation.xml +5 -0
- slm/jinja2/slm/sitelog/xsd/0.4/pressureSensor.xml +12 -0
- slm/jinja2/slm/sitelog/xsd/0.4/radioInterference.xml +11 -0
- slm/jinja2/slm/sitelog/xsd/0.4/sensor.xml +16 -0
- slm/jinja2/slm/sitelog/xsd/0.4/signalObstruction.xml +10 -0
- slm/jinja2/slm/sitelog/xsd/0.4/siteIdentification.xml +22 -0
- slm/jinja2/slm/sitelog/xsd/0.4/siteLocation.xml +21 -0
- slm/jinja2/slm/sitelog/xsd/0.4/surveyedLocalTie.xml +20 -0
- slm/jinja2/slm/sitelog/xsd/0.4/temperatureSensor.xml +13 -0
- slm/jinja2/slm/sitelog/xsd/0.4/waterVaporSensor.xml +11 -0
- slm/jinja2/slm/sitelog/xsd/0.5/document.xml +10 -0
- slm/jinja2/slm/sitelog/xsd/geodesyml_0.4.xml +99 -0
- slm/jinja2/slm/sitelog/xsd/geodesyml_0.5.xml +112 -0
- slm/management/__init__.py +0 -0
- slm/management/commands/__init__.py +53 -0
- slm/management/commands/build_index.py +96 -0
- slm/management/commands/generate_sinex.py +675 -0
- slm/management/commands/head_from_index.py +541 -0
- slm/management/commands/import_archive.py +908 -0
- slm/management/commands/import_equipment.py +351 -0
- slm/management/commands/set_site.py +56 -0
- slm/management/commands/sitelog.py +144 -0
- slm/management/commands/synchronize.py +60 -0
- slm/management/commands/update_data_availability.py +167 -0
- slm/management/commands/validate_db.py +186 -0
- slm/management/commands/validate_gml.py +73 -0
- slm/map/__init__.py +1 -0
- slm/map/admin.py +5 -0
- slm/map/api/__init__.py +0 -0
- slm/map/api/edit/__init__.py +0 -0
- slm/map/api/edit/serializers.py +28 -0
- slm/map/api/edit/views.py +46 -0
- slm/map/api/public/__init__.py +0 -0
- slm/map/api/public/serializers.py +29 -0
- slm/map/api/public/views.py +64 -0
- slm/map/apps.py +7 -0
- slm/map/defines.py +53 -0
- slm/map/migrations/0001_initial.py +115 -0
- slm/map/migrations/__init__.py +0 -0
- slm/map/models.py +63 -0
- slm/map/static/slm/css/map.css +86 -0
- slm/map/static/slm/js/map.js +159 -0
- slm/map/templates/slm/map.html +374 -0
- slm/map/templates/slm/station/base.html +11 -0
- slm/map/templates/slm/station/edit.html +10 -0
- slm/map/templates/slm/top_nav.html +17 -0
- slm/map/templatetags/__init__.py +0 -0
- slm/map/templatetags/slm_map.py +18 -0
- slm/map/urls.py +25 -0
- slm/map/views.py +36 -0
- slm/middleware.py +29 -0
- slm/migrations/0001_alter_siteantenna_marker_enu_alter_sitelocation_llh_and_more.py +47 -0
- slm/migrations/0001_initial.py +4826 -0
- slm/migrations/0002_alter_dataavailability_site.py +22 -0
- slm/migrations/0003_remove_logentry_slm_logentr_site_lo_7a2af7_idx_and_more.py +80 -0
- slm/migrations/0004_alter_logentry_timestamp_and_more.py +25 -0
- slm/migrations/0005_alter_logentry_options_alter_logentry_section_and_more.py +46 -0
- slm/migrations/0006_alter_logentry_options_alter_logentry_index_together.py +24 -0
- slm/migrations/0007_alter_dataavailability_rate.py +23 -0
- slm/migrations/0008_alter_archiveindex_options_and_more.py +64 -0
- slm/migrations/0009_alter_archiveindex_end.py +21 -0
- slm/migrations/0010_alter_dataavailability_rinex_version_and_more.py +844 -0
- slm/migrations/0011_alter_siteidentification_fracture_spacing.py +33 -0
- slm/migrations/0012_alter_logentry_type.py +36 -0
- slm/migrations/0013_unpublishedfilesalert.py +48 -0
- slm/migrations/0014_sitelogpublished.py +48 -0
- slm/migrations/0015_alter_siteantenna_options_and_more.py +181 -0
- slm/migrations/0016_alter_antenna_description_alter_radome_description_and_more.py +42 -0
- slm/migrations/0017_alter_logentry_unique_together_and_more.py +54 -0
- slm/migrations/0018_afix_deleted.py +34 -0
- slm/migrations/0018_alter_siteantenna_options_and_more.py +244 -0
- slm/migrations/0019_remove_siteantenna_marker_enu_siteantenna_marker_une_and_more.py +101 -0
- slm/migrations/0020_alter_manufacturer_options.py +16 -0
- slm/migrations/0021_alter_siteform_report_type.py +23 -0
- slm/migrations/0022_rename_antcal_antenna_radome_slm_antcal_antenna_20827a_idx_and_more.py +297 -0
- slm/migrations/0023_archivedsitelog_gml_version_and_more.py +55 -0
- slm/migrations/0024_alter_agency_name_alter_agency_shortname.py +24 -0
- slm/migrations/0025_alter_archivedsitelog_log_format_and_more.py +61 -0
- slm/migrations/0026_alter_archivedsitelog_log_format_and_more.py +61 -0
- slm/migrations/0027_importalert_file_contents_importalert_findings_and_more.py +41 -0
- slm/migrations/0028_antenna_replaced_manufacturer_url_radome_replaced_and_more.py +46 -0
- slm/migrations/0029_manufacturer_full_name.py +17 -0
- slm/migrations/0030_alter_antenna_state_alter_radome_state_and_more.py +43 -0
- slm/migrations/__init__.py +0 -0
- slm/migrations/load_satellitesystems.py +27 -0
- slm/models/__init__.py +118 -0
- slm/models/about.py +14 -0
- slm/models/alerts.py +1204 -0
- slm/models/data.py +58 -0
- slm/models/equipment.py +229 -0
- slm/models/help.py +14 -0
- slm/models/index.py +428 -0
- slm/models/sitelog.py +4279 -0
- slm/models/system.py +723 -0
- slm/models/user.py +304 -0
- slm/parsing/__init__.py +786 -0
- slm/parsing/legacy/__init__.py +4 -0
- slm/parsing/legacy/binding.py +817 -0
- slm/parsing/legacy/parser.py +377 -0
- slm/parsing/xsd/__init__.py +34 -0
- slm/parsing/xsd/binding.py +86 -0
- slm/parsing/xsd/geodesyml/0.4/commonTypes.xsd +133 -0
- slm/parsing/xsd/geodesyml/0.4/contact.xsd +29 -0
- slm/parsing/xsd/geodesyml/0.4/dataStreams.xsd +129 -0
- slm/parsing/xsd/geodesyml/0.4/document.xsd +64 -0
- slm/parsing/xsd/geodesyml/0.4/equipment.xsd +427 -0
- slm/parsing/xsd/geodesyml/0.4/fieldMeasurement.xsd +170 -0
- slm/parsing/xsd/geodesyml/0.4/geodesyML.xsd +71 -0
- slm/parsing/xsd/geodesyml/0.4/geodeticEquipment.xsd +343 -0
- slm/parsing/xsd/geodesyml/0.4/geodeticMonument.xsd +147 -0
- slm/parsing/xsd/geodesyml/0.4/lineage.xsd +614 -0
- slm/parsing/xsd/geodesyml/0.4/localInterferences.xsd +131 -0
- slm/parsing/xsd/geodesyml/0.4/measurement.xsd +473 -0
- slm/parsing/xsd/geodesyml/0.4/monumentInfo.xsd +251 -0
- slm/parsing/xsd/geodesyml/0.4/observationSystem.xsd +429 -0
- slm/parsing/xsd/geodesyml/0.4/project.xsd +38 -0
- slm/parsing/xsd/geodesyml/0.4/quality.xsd +176 -0
- slm/parsing/xsd/geodesyml/0.4/referenceFrame.xsd +194 -0
- slm/parsing/xsd/geodesyml/0.4/siteLog.xsd +71 -0
- slm/parsing/xsd/geodesyml/0.5/commonTypes.xsd +133 -0
- slm/parsing/xsd/geodesyml/0.5/contact.xsd +29 -0
- slm/parsing/xsd/geodesyml/0.5/dataStreams.xsd +129 -0
- slm/parsing/xsd/geodesyml/0.5/document.xsd +64 -0
- slm/parsing/xsd/geodesyml/0.5/equipment.xsd +427 -0
- slm/parsing/xsd/geodesyml/0.5/fieldMeasurement.xsd +170 -0
- slm/parsing/xsd/geodesyml/0.5/geodesyML.xsd +71 -0
- slm/parsing/xsd/geodesyml/0.5/geodeticEquipment.xsd +343 -0
- slm/parsing/xsd/geodesyml/0.5/geodeticMonument.xsd +147 -0
- slm/parsing/xsd/geodesyml/0.5/lineage.xsd +614 -0
- slm/parsing/xsd/geodesyml/0.5/localInterferences.xsd +131 -0
- slm/parsing/xsd/geodesyml/0.5/measurement.xsd +473 -0
- slm/parsing/xsd/geodesyml/0.5/monumentInfo.xsd +306 -0
- slm/parsing/xsd/geodesyml/0.5/observationSystem.xsd +429 -0
- slm/parsing/xsd/geodesyml/0.5/project.xsd +38 -0
- slm/parsing/xsd/geodesyml/0.5/quality.xsd +176 -0
- slm/parsing/xsd/geodesyml/0.5/referenceFrame.xsd +194 -0
- slm/parsing/xsd/geodesyml/0.5/siteLog.xsd +73 -0
- slm/parsing/xsd/parser.py +116 -0
- slm/parsing/xsd/resolver.py +28 -0
- slm/receivers/__init__.py +11 -0
- slm/receivers/alerts.py +87 -0
- slm/receivers/cleanup.py +41 -0
- slm/receivers/event_loggers.py +175 -0
- slm/receivers/index.py +67 -0
- slm/settings/__init__.py +55 -0
- slm/settings/auth.py +15 -0
- slm/settings/ckeditor.py +14 -0
- slm/settings/debug.py +47 -0
- slm/settings/internationalization.py +12 -0
- slm/settings/logging.py +113 -0
- slm/settings/platform/__init__.py +0 -0
- slm/settings/platform/darwin.py +10 -0
- slm/settings/rest.py +21 -0
- slm/settings/root.py +152 -0
- slm/settings/routines.py +43 -0
- slm/settings/secrets.py +37 -0
- slm/settings/security.py +5 -0
- slm/settings/slm.py +188 -0
- slm/settings/static_templates.py +53 -0
- slm/settings/templates.py +29 -0
- slm/settings/uploads.py +8 -0
- slm/settings/urls.py +126 -0
- slm/settings/validation.py +196 -0
- slm/signals.py +250 -0
- slm/singleton.py +49 -0
- slm/static/rest_framework/css/bootstrap-tweaks.css +204 -0
- slm/static/rest_framework/css/bootstrap.min.css +7 -0
- slm/static/rest_framework/css/bootstrap.min.css.map +1 -0
- slm/static/rest_framework/css/default.css +82 -0
- slm/static/rest_framework/css/prettify.css +30 -0
- slm/static/rest_framework/docs/css/base.css +344 -0
- slm/static/rest_framework/docs/css/highlight.css +125 -0
- slm/static/rest_framework/docs/css/jquery.json-view.min.css +11 -0
- slm/static/rest_framework/docs/img/favicon.ico +0 -0
- slm/static/rest_framework/docs/img/grid.png +0 -0
- slm/static/rest_framework/docs/js/api.js +321 -0
- slm/static/rest_framework/docs/js/highlight.pack.js +2 -0
- slm/static/rest_framework/docs/js/jquery.json-view.min.js +7 -0
- slm/static/rest_framework/img/grid.png +0 -0
- slm/static/rest_framework/js/ajax-form.js +127 -0
- slm/static/rest_framework/js/bootstrap.bundle.min.js +7 -0
- slm/static/rest_framework/js/bootstrap.bundle.min.js.map +1 -0
- slm/static/rest_framework/js/bootstrap.min.js.map +1 -0
- slm/static/rest_framework/js/coreapi-0.1.1.js +2043 -0
- slm/static/rest_framework/js/csrf.js +52 -0
- slm/static/rest_framework/js/default.js +47 -0
- slm/static/rest_framework/js/jquery-3.5.1.min.js +2 -0
- slm/static/rest_framework/js/prettify-min.js +28 -0
- slm/static/slm/css/admin.css +3 -0
- slm/static/slm/css/defines.css +82 -0
- slm/static/slm/css/forms.css +1 -0
- slm/static/slm/css/style.css +1004 -0
- slm/static/slm/img/email-branding.png +0 -0
- slm/static/slm/img/favicon.ico +0 -0
- slm/static/slm/img/login-bg.jpg +0 -0
- slm/static/slm/img/slm-logo.svg +4 -0
- slm/static/slm/js/autocomplete.js +341 -0
- slm/static/slm/js/enums.js +322 -0
- slm/static/slm/js/fileIcons.js +30 -0
- slm/static/slm/js/form.js +404 -0
- slm/static/slm/js/formWidget.js +23 -0
- slm/static/slm/js/persistable.js +33 -0
- slm/static/slm/js/slm.js +1028 -0
- slm/static/slm/js/time24.js +212 -0
- slm/static_templates/slm/css/defines.css +26 -0
- slm/static_templates/slm/js/enums.js +28 -0
- slm/static_templates/slm/js/fileIcons.js +16 -0
- slm/static_templates/slm/js/urls.js +5 -0
- slm/templates/account/base.html +20 -0
- slm/templates/account/email/base.html +43 -0
- slm/templates/account/email/base_message.txt +7 -0
- slm/templates/account/email/email_confirmation_message.html +16 -0
- slm/templates/account/email/email_confirmation_message.txt +7 -0
- slm/templates/account/email/email_confirmation_signup_message.html +1 -0
- slm/templates/account/email/email_confirmation_signup_message.txt +1 -0
- slm/templates/account/email/email_confirmation_signup_subject.txt +1 -0
- slm/templates/account/email/email_confirmation_subject.txt +4 -0
- slm/templates/account/email/password_reset_key_message.html +28 -0
- slm/templates/account/email/password_reset_key_message.txt +9 -0
- slm/templates/account/email/password_reset_key_subject.txt +4 -0
- slm/templates/account/email/unknown_account_message.html +25 -0
- slm/templates/account/email/unknown_account_message.txt +12 -0
- slm/templates/account/email/unknown_account_subject.txt +4 -0
- slm/templates/account/login.html +67 -0
- slm/templates/account/logout.html +38 -0
- slm/templates/account/password_change.html +48 -0
- slm/templates/account/password_reset.html +51 -0
- slm/templates/account/password_reset_done.html +20 -0
- slm/templates/account/password_reset_from_key.html +52 -0
- slm/templates/account/password_reset_from_key_done.html +17 -0
- slm/templates/admin/base.html +7 -0
- slm/templates/messages.html +8 -0
- slm/templates/rest_framework/README +16 -0
- slm/templates/rest_framework/admin/detail.html +10 -0
- slm/templates/rest_framework/admin/dict_value.html +11 -0
- slm/templates/rest_framework/admin/list.html +32 -0
- slm/templates/rest_framework/admin/list_value.html +11 -0
- slm/templates/rest_framework/admin/simple_list_value.html +2 -0
- slm/templates/rest_framework/admin.html +282 -0
- slm/templates/rest_framework/api.html +3 -0
- slm/templates/rest_framework/base.html +334 -0
- slm/templates/rest_framework/docs/auth/basic.html +42 -0
- slm/templates/rest_framework/docs/auth/session.html +40 -0
- slm/templates/rest_framework/docs/auth/token.html +41 -0
- slm/templates/rest_framework/docs/document.html +37 -0
- slm/templates/rest_framework/docs/error.html +71 -0
- slm/templates/rest_framework/docs/index.html +55 -0
- slm/templates/rest_framework/docs/interact.html +57 -0
- slm/templates/rest_framework/docs/langs/javascript-intro.html +5 -0
- slm/templates/rest_framework/docs/langs/javascript.html +15 -0
- slm/templates/rest_framework/docs/langs/python-intro.html +3 -0
- slm/templates/rest_framework/docs/langs/python.html +13 -0
- slm/templates/rest_framework/docs/langs/shell-intro.html +3 -0
- slm/templates/rest_framework/docs/langs/shell.html +6 -0
- slm/templates/rest_framework/docs/link.html +113 -0
- slm/templates/rest_framework/docs/sidebar.html +78 -0
- slm/templates/rest_framework/filters/base.html +16 -0
- slm/templates/rest_framework/filters/ordering.html +17 -0
- slm/templates/rest_framework/filters/search.html +13 -0
- slm/templates/rest_framework/horizontal/checkbox.html +23 -0
- slm/templates/rest_framework/horizontal/checkbox_multiple.html +32 -0
- slm/templates/rest_framework/horizontal/dict_field.html +11 -0
- slm/templates/rest_framework/horizontal/fieldset.html +16 -0
- slm/templates/rest_framework/horizontal/form.html +6 -0
- slm/templates/rest_framework/horizontal/input.html +21 -0
- slm/templates/rest_framework/horizontal/list_field.html +11 -0
- slm/templates/rest_framework/horizontal/list_fieldset.html +13 -0
- slm/templates/rest_framework/horizontal/radio.html +42 -0
- slm/templates/rest_framework/horizontal/select.html +36 -0
- slm/templates/rest_framework/horizontal/select_multiple.html +38 -0
- slm/templates/rest_framework/horizontal/textarea.html +21 -0
- slm/templates/rest_framework/inline/checkbox.html +8 -0
- slm/templates/rest_framework/inline/checkbox_multiple.html +14 -0
- slm/templates/rest_framework/inline/dict_field.html +9 -0
- slm/templates/rest_framework/inline/fieldset.html +6 -0
- slm/templates/rest_framework/inline/form.html +8 -0
- slm/templates/rest_framework/inline/input.html +9 -0
- slm/templates/rest_framework/inline/list_field.html +9 -0
- slm/templates/rest_framework/inline/list_fieldset.html +3 -0
- slm/templates/rest_framework/inline/radio.html +25 -0
- slm/templates/rest_framework/inline/select.html +24 -0
- slm/templates/rest_framework/inline/select_multiple.html +25 -0
- slm/templates/rest_framework/inline/textarea.html +9 -0
- slm/templates/rest_framework/login.html +3 -0
- slm/templates/rest_framework/login_base.html +65 -0
- slm/templates/rest_framework/pagination/numbers.html +47 -0
- slm/templates/rest_framework/pagination/previous_and_next.html +21 -0
- slm/templates/rest_framework/raw_data_form.html +11 -0
- slm/templates/rest_framework/schema.js +3 -0
- slm/templates/rest_framework/vertical/checkbox.html +16 -0
- slm/templates/rest_framework/vertical/checkbox_multiple.html +30 -0
- slm/templates/rest_framework/vertical/dict_field.html +7 -0
- slm/templates/rest_framework/vertical/fieldset.html +13 -0
- slm/templates/rest_framework/vertical/form.html +6 -0
- slm/templates/rest_framework/vertical/input.html +17 -0
- slm/templates/rest_framework/vertical/list_field.html +7 -0
- slm/templates/rest_framework/vertical/list_fieldset.html +7 -0
- slm/templates/rest_framework/vertical/radio.html +40 -0
- slm/templates/rest_framework/vertical/select.html +34 -0
- slm/templates/rest_framework/vertical/select_multiple.html +31 -0
- slm/templates/rest_framework/vertical/textarea.html +17 -0
- slm/templates/slm/about.html +21 -0
- slm/templates/slm/alerts/alert.html +15 -0
- slm/templates/slm/alerts/geodesymlinvalid.html +8 -0
- slm/templates/slm/alerts/importalert.html +10 -0
- slm/templates/slm/alerts.html +18 -0
- slm/templates/slm/auth_menu.html +41 -0
- slm/templates/slm/base.html +195 -0
- slm/templates/slm/emails/alert_issued.html +31 -0
- slm/templates/slm/emails/alert_issued.txt +9 -0
- slm/templates/slm/emails/base.html +6 -0
- slm/templates/slm/emails/changes_rejected.txt +7 -0
- slm/templates/slm/emails/review_requested.txt +7 -0
- slm/templates/slm/forms/widgets/auto_complete.html +21 -0
- slm/templates/slm/forms/widgets/auto_complete_multiple.html +18 -0
- slm/templates/slm/forms/widgets/checkbox_multiple.html +6 -0
- slm/templates/slm/forms/widgets/inline_multi.html +1 -0
- slm/templates/slm/forms/widgets/splitdatetime.html +14 -0
- slm/templates/slm/forms/widgets/time24.html +37 -0
- slm/templates/slm/help.html +54 -0
- slm/templates/slm/messages.html +13 -0
- slm/templates/slm/new_site.html +88 -0
- slm/templates/slm/profile.html +57 -0
- slm/templates/slm/register.html +40 -0
- slm/templates/slm/reports/file_log.html +43 -0
- slm/templates/slm/reports/head_log.html +23 -0
- slm/templates/slm/reports/head_report.html +55 -0
- slm/templates/slm/reports/index_log.html +23 -0
- slm/templates/slm/reports/index_report.html +71 -0
- slm/templates/slm/station/alert.html +8 -0
- slm/templates/slm/station/alerts.html +19 -0
- slm/templates/slm/station/base.html +104 -0
- slm/templates/slm/station/download.html +87 -0
- slm/templates/slm/station/edit.html +283 -0
- slm/templates/slm/station/form.html +110 -0
- slm/templates/slm/station/log.html +18 -0
- slm/templates/slm/station/review.html +461 -0
- slm/templates/slm/station/upload.html +295 -0
- slm/templates/slm/station/uploads/attachment.html +20 -0
- slm/templates/slm/station/uploads/geodesyml.html +1 -0
- slm/templates/slm/station/uploads/image.html +27 -0
- slm/templates/slm/station/uploads/json.html +0 -0
- slm/templates/slm/station/uploads/legacy.html +77 -0
- slm/templates/slm/top_nav.html +14 -0
- slm/templates/slm/user_activity.html +16 -0
- slm/templates/slm/widgets/alert_scroll.html +135 -0
- slm/templates/slm/widgets/filelist.html +258 -0
- slm/templates/slm/widgets/legend.html +12 -0
- slm/templates/slm/widgets/log_scroll.html +88 -0
- slm/templates/slm/widgets/stationlist.html +233 -0
- slm/templatetags/__init__.py +0 -0
- slm/templatetags/jinja2.py +9 -0
- slm/templatetags/slm.py +459 -0
- slm/urls.py +148 -0
- slm/utils.py +299 -0
- slm/validators.py +297 -0
- slm/views.py +654 -0
- 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>
|