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
slm/settings/routines.py
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from django.utils.translation import gettext_lazy as _
|
|
2
|
+
from django_routines import command, routine
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
routine(
|
|
6
|
+
"deploy",
|
|
7
|
+
_(
|
|
8
|
+
"Run collection of commands that likely need to be run whenever code is updated."
|
|
9
|
+
),
|
|
10
|
+
switch_helps={
|
|
11
|
+
"initial": _(
|
|
12
|
+
"Run collection of commands that should only be run on the first deployment."
|
|
13
|
+
),
|
|
14
|
+
"validate": _("Run validation routines on the entire database."),
|
|
15
|
+
},
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
routine(
|
|
19
|
+
"import",
|
|
20
|
+
_("Import equipment from the IGS and site log data from your own archive."),
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
routine(
|
|
24
|
+
"install",
|
|
25
|
+
_("Install a fresh deployment of the SLM and import data from external sources."),
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
command("deploy", "check", "--deploy")
|
|
29
|
+
command("deploy", "shellcompletion", "install", switches=["initial"])
|
|
30
|
+
command("deploy", "migrate", priority=11)
|
|
31
|
+
command("deploy", "renderstatic", priority=20)
|
|
32
|
+
command("deploy", "collectstatic", "--no-input", priority=21)
|
|
33
|
+
command("deploy", "set_site", priority=22)
|
|
34
|
+
command("deploy", "validate_db", "--schema", priority=30, switches=["re-validate"])
|
|
35
|
+
command("deploy", "synchronize", priority=32, switches=["re-validate"])
|
|
36
|
+
|
|
37
|
+
command("import", "import_equipment", "antennas", "radomes", "receivers", priority=10)
|
|
38
|
+
command("import", "import_archive", priority=20)
|
|
39
|
+
command("import", "validate_db", "--schema", priority=30)
|
|
40
|
+
|
|
41
|
+
command("install", "routine", "deploy", "--initial", priority=0)
|
|
42
|
+
command("install", "createsuperuser", priority=10)
|
|
43
|
+
command("install", "routine", "import", priority=20)
|
slm/settings/secrets.py
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
from slm.settings import get_setting
|
|
5
|
+
|
|
6
|
+
SLM_SECRETS_DIR = get_setting(
|
|
7
|
+
"SLM_SECRETS_DIR", Path(get_setting("SITE_DIR")) / "secrets"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def generate_secret_key(filename):
|
|
12
|
+
from django.core.management.utils import get_random_secret_key
|
|
13
|
+
|
|
14
|
+
with open(filename, "w") as f:
|
|
15
|
+
f.write("%s\n" % get_random_secret_key())
|
|
16
|
+
os.chmod(filename, 0o640)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def get_secret_key(filename):
|
|
20
|
+
with open(filename, "r") as f:
|
|
21
|
+
return f.readlines()[0]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
if not os.path.exists(SLM_SECRETS_DIR):
|
|
25
|
+
os.makedirs(SLM_SECRETS_DIR)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
sk_file = os.path.join(SLM_SECRETS_DIR, "secret_key")
|
|
29
|
+
|
|
30
|
+
if not os.path.exists(sk_file):
|
|
31
|
+
generate_secret_key(sk_file)
|
|
32
|
+
|
|
33
|
+
SECRET_KEY = get_secret_key(sk_file)
|
|
34
|
+
|
|
35
|
+
if len(SECRET_KEY) == 0:
|
|
36
|
+
generate_secret_key(sk_file)
|
|
37
|
+
SECRET_KEY = get_secret_key(sk_file)
|
slm/settings/security.py
ADDED
slm/settings/slm.py
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"""
|
|
2
|
+
SLM Specific Configuration parameters go here.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
|
|
7
|
+
from slm.defines import (
|
|
8
|
+
AlertLevel,
|
|
9
|
+
GeodesyMLVersion,
|
|
10
|
+
SiteFileUploadStatus,
|
|
11
|
+
SiteLogStatus,
|
|
12
|
+
)
|
|
13
|
+
from slm.settings import get_setting, set_default
|
|
14
|
+
|
|
15
|
+
# manage.py will set this to true if django has been loaded to run a
|
|
16
|
+
# management command
|
|
17
|
+
SLM_MANAGEMENT_MODE = os.environ.get("SLM_MANAGEMENT_FLAG", False) == "ON"
|
|
18
|
+
|
|
19
|
+
set_default(
|
|
20
|
+
"SLM_ALERT_COLORS",
|
|
21
|
+
{
|
|
22
|
+
AlertLevel.NOTICE: "#12CAF0",
|
|
23
|
+
AlertLevel.WARNING: "#E3AA00",
|
|
24
|
+
AlertLevel.ERROR: "#DD3444",
|
|
25
|
+
},
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
set_default(
|
|
29
|
+
"SLM_STATUS_COLORS",
|
|
30
|
+
{
|
|
31
|
+
SiteLogStatus.FORMER: "#3D4543",
|
|
32
|
+
SiteLogStatus.SUSPENDED: "#E0041A",
|
|
33
|
+
SiteLogStatus.PROPOSED: "#913D88",
|
|
34
|
+
SiteLogStatus.UPDATED: "#0079AD",
|
|
35
|
+
SiteLogStatus.PUBLISHED: "#0D820D",
|
|
36
|
+
SiteLogStatus.EMPTY: "#D3D3D3",
|
|
37
|
+
},
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
set_default(
|
|
41
|
+
"SLM_FILE_COLORS",
|
|
42
|
+
{
|
|
43
|
+
SiteFileUploadStatus.UNPUBLISHED: "#0079AD",
|
|
44
|
+
SiteFileUploadStatus.PUBLISHED: "#0D820D",
|
|
45
|
+
SiteFileUploadStatus.INVALID: "#8b0000",
|
|
46
|
+
SiteFileUploadStatus.WARNINGS: "#E3AA00",
|
|
47
|
+
SiteFileUploadStatus.VALID: "#0D820D",
|
|
48
|
+
},
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
# if True, for subsections and missing sections, placeholder structures will
|
|
52
|
+
# be added to the logs
|
|
53
|
+
set_default("SLM_LEGACY_PLACEHOLDERS", True)
|
|
54
|
+
|
|
55
|
+
# the maximum file upload size in Mega Bytes
|
|
56
|
+
set_default("SLM_MAX_UPLOAD_SIZE_MB", 100)
|
|
57
|
+
|
|
58
|
+
# a map of file icons (css) from mimetype subtypes
|
|
59
|
+
set_default(
|
|
60
|
+
"SLM_FILE_ICONS",
|
|
61
|
+
{
|
|
62
|
+
"zip": "bi bi-file-zip",
|
|
63
|
+
"x-tar": "bi bi-file-zip",
|
|
64
|
+
"plain": "bi bi-filetype-txt",
|
|
65
|
+
"jpeg": "bi bi-filetype-jpg",
|
|
66
|
+
"svg+xml": "bi bi-filetype-svg",
|
|
67
|
+
"xml": "bi bi-filetype-xml",
|
|
68
|
+
"json": "bi bi-filetype-json",
|
|
69
|
+
"png": "bi bi-filetype-png",
|
|
70
|
+
"tiff": "bi bi-filetype-tiff",
|
|
71
|
+
"pdf": "bi bi-filetype-pdf",
|
|
72
|
+
"gif": "bi bi-filetype-gif",
|
|
73
|
+
"csv": "bi bi-filetype-csv",
|
|
74
|
+
"bmp": "bi bi-filetype-bmp",
|
|
75
|
+
"vnd.openxmlformats-officedocument.wordprocessingml.document": "bi bi-filetype-doc",
|
|
76
|
+
"msword": "bi bi-filetype-doc",
|
|
77
|
+
},
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
# generated image thumbnail size in pixels - this is a tuple of maximum width
|
|
81
|
+
# and height - the aspect ratio will be preserved
|
|
82
|
+
set_default("SLM_THUMBNAIL_SIZE", 250)
|
|
83
|
+
|
|
84
|
+
# during deploy the current Site will be set to SLM_SITE_NAME, SLM_ORG_NAME
|
|
85
|
+
# The name of the organization used in communications
|
|
86
|
+
set_default("SLM_ORG_NAME", "SLM")
|
|
87
|
+
|
|
88
|
+
set_default("SLM_SITE_NAME", (get_setting("ALLOWED_HOSTS", []) or ["localhost"])[0])
|
|
89
|
+
|
|
90
|
+
# set this to either http or https, this will be used to determine the protocol
|
|
91
|
+
# of absolute uri links where a request object is not present
|
|
92
|
+
set_default("SLM_HTTP_PROTOCOL", None)
|
|
93
|
+
|
|
94
|
+
# this should point to a cached property that holds the set of Django
|
|
95
|
+
# permissions relevant to the SLM - if you extend the permission set override
|
|
96
|
+
# this property
|
|
97
|
+
set_default("SLM_PERMISSIONS", "slm.authentication.default_permissions")
|
|
98
|
+
|
|
99
|
+
# These default permission groups will be created on migration
|
|
100
|
+
set_default(
|
|
101
|
+
"SLM_DEFAULT_PERMISSION_GROUPS",
|
|
102
|
+
{"Agency Manager": ["propose_sites", "moderate_sites"]},
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
# the xsd schemas that should be preloaded on start - if a schema is used
|
|
106
|
+
# that is not preloaded it will be lazily loaded which can take some time and
|
|
107
|
+
# will prolong the request. It can be useful to disable this during testing to
|
|
108
|
+
# reduce load times. It is recommended to leave this set to the default setting
|
|
109
|
+
# in production
|
|
110
|
+
set_default("SLM_PRELOAD_SCHEMAS", [geo for geo in GeodesyMLVersion])
|
|
111
|
+
|
|
112
|
+
# By default the SLM will not send moderation related emails to user accounts
|
|
113
|
+
# who have never logged in, set this to False to disable this behavior
|
|
114
|
+
# This does not apply to account related emails like password reset requests
|
|
115
|
+
set_default("SLM_EMAILS_REQUIRE_LOGIN", True)
|
|
116
|
+
|
|
117
|
+
# Automated alert configuration
|
|
118
|
+
#
|
|
119
|
+
set_default(
|
|
120
|
+
"SLM_AUTOMATED_ALERTS",
|
|
121
|
+
{
|
|
122
|
+
"slm.GeodesyMLInvalid": {
|
|
123
|
+
"issue": [
|
|
124
|
+
"slm.signals.site_published",
|
|
125
|
+
"slm.signals.site_file_published",
|
|
126
|
+
"slm.signals.site_file_unpublished",
|
|
127
|
+
],
|
|
128
|
+
"level": AlertLevel.ERROR,
|
|
129
|
+
"send_email": False,
|
|
130
|
+
},
|
|
131
|
+
"slm.ReviewRequested": {
|
|
132
|
+
"issue": ["slm.signals.review_requested"],
|
|
133
|
+
"rescind": [
|
|
134
|
+
"slm.signals.updates_rejected",
|
|
135
|
+
"slm.signals.site_published",
|
|
136
|
+
"slm.signals.section_added",
|
|
137
|
+
"slm.signals.section_edited",
|
|
138
|
+
"slm.signals.section_deleted",
|
|
139
|
+
],
|
|
140
|
+
"level": AlertLevel.NOTICE,
|
|
141
|
+
"send_email": True,
|
|
142
|
+
},
|
|
143
|
+
"slm.UpdatesRejected": {
|
|
144
|
+
"issue": ["slm.signals.updates_rejected"],
|
|
145
|
+
"rescind": [
|
|
146
|
+
"slm.signals.review_requested",
|
|
147
|
+
"slm.signals.site_published",
|
|
148
|
+
"slm.signals.section_added",
|
|
149
|
+
"slm.signals.section_edited",
|
|
150
|
+
"slm.signals.section_deleted",
|
|
151
|
+
],
|
|
152
|
+
"level": AlertLevel.ERROR,
|
|
153
|
+
"send_email": True,
|
|
154
|
+
},
|
|
155
|
+
"slm.SiteLogPublished": {
|
|
156
|
+
"issue": {"slm.signals.site_published"},
|
|
157
|
+
"level": AlertLevel.NOTICE,
|
|
158
|
+
"send_email": True,
|
|
159
|
+
},
|
|
160
|
+
"slm.UnpublishedFilesAlert": {
|
|
161
|
+
"issue": {
|
|
162
|
+
"slm.signals.site_file_uploaded",
|
|
163
|
+
"slm.signals.site_file_unpublished",
|
|
164
|
+
},
|
|
165
|
+
"rescind": [
|
|
166
|
+
"slm.signals.site_file_published",
|
|
167
|
+
"slm.signals.site_file_deleted",
|
|
168
|
+
],
|
|
169
|
+
"level": AlertLevel.NOTICE,
|
|
170
|
+
"send_email": True,
|
|
171
|
+
},
|
|
172
|
+
},
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
# slm provides an implementation of urls.py that will load this list into
|
|
176
|
+
# url patterns. This should be a list of 2-tuples where the first tuple is the
|
|
177
|
+
# path stem mount point for the included apps' URLs and the second element is
|
|
178
|
+
# the string that will be passed to django.urls.include
|
|
179
|
+
SLM_URL_MOUNTS = []
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
# control the domain used to generate absolute links to the SLM log document
|
|
183
|
+
# attachments including images and files. Any standalone artifacts produced by
|
|
184
|
+
# the slm that include links to files served by the SLM will use this domain
|
|
185
|
+
# as the stem. If empty the default site domain will be used. You probably
|
|
186
|
+
# do not need to set this field unless you are serving files off a different
|
|
187
|
+
# instance than the instance that generates serialized artifacts
|
|
188
|
+
SLM_FILE_DOMAIN = None
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
from slm.settings import get_setting
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def get_enum_context():
|
|
5
|
+
# this needs to be wrapped in a function call because these enums use the
|
|
6
|
+
# translation infrastructure which cannot be invoked before settings have
|
|
7
|
+
# been fully realized.
|
|
8
|
+
from slm.defines import (
|
|
9
|
+
AlertLevel,
|
|
10
|
+
LogEntryType,
|
|
11
|
+
SiteFileUploadStatus,
|
|
12
|
+
SiteLogFormat,
|
|
13
|
+
SiteLogStatus,
|
|
14
|
+
SLMFileType,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
return {
|
|
18
|
+
"enums": [
|
|
19
|
+
LogEntryType,
|
|
20
|
+
SiteLogStatus,
|
|
21
|
+
AlertLevel,
|
|
22
|
+
SiteFileUploadStatus,
|
|
23
|
+
SiteLogFormat,
|
|
24
|
+
SLMFileType,
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def get_defines_context():
|
|
30
|
+
from slm.defines import AlertLevel, SiteLogStatus
|
|
31
|
+
|
|
32
|
+
return {"AlertLevel": AlertLevel, "SiteLogStatus": SiteLogStatus}
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def get_icon_context():
|
|
36
|
+
from django.conf import settings
|
|
37
|
+
|
|
38
|
+
from slm.templatetags.slm import file_icon
|
|
39
|
+
|
|
40
|
+
return {
|
|
41
|
+
"ICON_MAP": getattr(settings, "SLM_FILE_ICONS", {}),
|
|
42
|
+
"DEFAULT_ICON": file_icon(""),
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
STATIC_TEMPLATES = {
|
|
47
|
+
"templates": [
|
|
48
|
+
("slm/js/urls.js", {"dest": get_setting("STATIC_ROOT") / "urls.js"}),
|
|
49
|
+
("slm/js/enums.js", {"context": get_enum_context}),
|
|
50
|
+
("slm/js/fileIcons.js", {"context": get_icon_context}),
|
|
51
|
+
("slm/css/defines.css", {"context": get_defines_context}),
|
|
52
|
+
]
|
|
53
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from jinja2 import select_autoescape
|
|
2
|
+
|
|
3
|
+
TEMPLATES = [
|
|
4
|
+
{
|
|
5
|
+
"BACKEND": "django.template.backends.django.DjangoTemplates",
|
|
6
|
+
"APP_DIRS": True,
|
|
7
|
+
"OPTIONS": {
|
|
8
|
+
"context_processors": [
|
|
9
|
+
"django.template.context_processors.debug",
|
|
10
|
+
"django.template.context_processors.request",
|
|
11
|
+
"django.contrib.auth.context_processors.auth",
|
|
12
|
+
"django.contrib.messages.context_processors.messages",
|
|
13
|
+
],
|
|
14
|
+
"builtins": ["slm.templatetags.slm"],
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"BACKEND": "django.template.backends.jinja2.Jinja2",
|
|
19
|
+
"APP_DIRS": True,
|
|
20
|
+
"OPTIONS": {
|
|
21
|
+
"autoescape": select_autoescape(
|
|
22
|
+
disabled_extensions=("log",),
|
|
23
|
+
default_for_string=True,
|
|
24
|
+
default=True,
|
|
25
|
+
),
|
|
26
|
+
"environment": "slm.templatetags.jinja2.compat",
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
]
|
slm/settings/uploads.py
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
from slm.settings import get_setting, set_default
|
|
2
|
+
|
|
3
|
+
MEDIA_URL = "/media/"
|
|
4
|
+
set_default("MEDIA_ROOT", get_setting("SITE_DIR") / "media")
|
|
5
|
+
|
|
6
|
+
# set RWX for Owner and Group for any uploaded files
|
|
7
|
+
FILE_UPLOAD_PERMISSIONS = 0o770
|
|
8
|
+
FILE_UPLOAD_DIRECTORY_PERMISSIONS = 0o770
|
slm/settings/urls.py
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"""
|
|
2
|
+
SLM URL Configuration
|
|
3
|
+
|
|
4
|
+
The `urlpatterns` list routes URLs to views. For more information please see:
|
|
5
|
+
https://docs.djangoproject.com/en/stable/topics/http/urls/
|
|
6
|
+
|
|
7
|
+
Instead of having to define your own urls.py for a deployment of SLM we try to
|
|
8
|
+
do most of the work for you in this default file. If you develop an app and you
|
|
9
|
+
want it to be automatically included in your SLM urls you should add the flag
|
|
10
|
+
SLM_INCLUDE = True to your apps urls.py file. If you do so the urls in your
|
|
11
|
+
app will be included into your deployment at the / mount point. If you wish to
|
|
12
|
+
extend the APIs by providing your own endpoints you may do so by supplying an
|
|
13
|
+
APIS dictionary. For example the slm.map app extends the public API like so:
|
|
14
|
+
|
|
15
|
+
.. code-block: python
|
|
16
|
+
|
|
17
|
+
from django.urls import path
|
|
18
|
+
from slm.map.api.edit import views as edit_views
|
|
19
|
+
from slm.map.api.public import views as public_views
|
|
20
|
+
from slm.map.views import MapView
|
|
21
|
+
|
|
22
|
+
SLM_INCLUDE = True
|
|
23
|
+
|
|
24
|
+
APIS = {
|
|
25
|
+
'edit': {
|
|
26
|
+
'serializer_module': 'slm.map.api.edit.serializers',
|
|
27
|
+
'endpoints': [
|
|
28
|
+
('stations', edit_views.StationListViewSet),
|
|
29
|
+
('map', edit_views.StationMapViewSet),
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
'public': {
|
|
33
|
+
'serializer_module': 'slm.map.api.public.serializers',
|
|
34
|
+
'endpoints': [
|
|
35
|
+
('stations', public_views.StationListViewSet),
|
|
36
|
+
('map', public_views.StationMapViewSet),
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
Other third party apps may be included at customizable mount points by
|
|
42
|
+
providing a settings.SLM_URL_MOUNTS list. For example to include your app at
|
|
43
|
+
the myapp path you might do this:
|
|
44
|
+
|
|
45
|
+
.. code-block: python
|
|
46
|
+
|
|
47
|
+
SLM_URL_MOUNTS = [
|
|
48
|
+
('myapp/', 'myapp.urls')
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
from importlib import import_module
|
|
54
|
+
|
|
55
|
+
from django.conf import settings
|
|
56
|
+
from django.contrib import admin
|
|
57
|
+
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
|
|
58
|
+
from django.urls import include, path
|
|
59
|
+
from rest_framework.routers import DefaultRouter
|
|
60
|
+
|
|
61
|
+
APIS = {}
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class ReregisterableRouter(DefaultRouter):
|
|
65
|
+
def register(self, prefix, viewset, base_name=None):
|
|
66
|
+
if base_name is None:
|
|
67
|
+
base_name = self.get_default_base_name(viewset)
|
|
68
|
+
idx = 0
|
|
69
|
+
for api in self.registry:
|
|
70
|
+
if prefix == api[0] and base_name == api[2]:
|
|
71
|
+
self.registry[idx] = (prefix, viewset, base_name)
|
|
72
|
+
idx += 1
|
|
73
|
+
return
|
|
74
|
+
idx += 1
|
|
75
|
+
self.registry.append((prefix, viewset, base_name))
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def bring_in_urls(urlpatterns):
|
|
79
|
+
routers = {}
|
|
80
|
+
|
|
81
|
+
for app in reversed(settings.INSTALLED_APPS):
|
|
82
|
+
try:
|
|
83
|
+
url_module = import_module(f"{app}.urls")
|
|
84
|
+
api = getattr(url_module, "APIS", None)
|
|
85
|
+
if api:
|
|
86
|
+
for api, endpoints in api.items():
|
|
87
|
+
if api not in routers:
|
|
88
|
+
routers[api] = ReregisterableRouter()
|
|
89
|
+
router = routers[api]
|
|
90
|
+
for endpoint in endpoints:
|
|
91
|
+
router.register(
|
|
92
|
+
endpoint[0],
|
|
93
|
+
endpoint[1],
|
|
94
|
+
base_name=(
|
|
95
|
+
endpoint[0] if len(endpoint) < 3 else endpoint[2]
|
|
96
|
+
),
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
except ImportError:
|
|
100
|
+
if app in {"slm", "slm.map", "network_map", "igs_ext"}:
|
|
101
|
+
raise
|
|
102
|
+
pass
|
|
103
|
+
|
|
104
|
+
for api, router in routers.items():
|
|
105
|
+
# todo how to nest under slm?
|
|
106
|
+
pattern = path(
|
|
107
|
+
f"api/{api}/", include((router.urls, "slm"), namespace=f"slm_{api}_api")
|
|
108
|
+
)
|
|
109
|
+
urlpatterns.append(pattern)
|
|
110
|
+
APIS.setdefault(f"{api}_api", []).append(pattern)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
urlpatterns = [
|
|
114
|
+
path("admin/", admin.site.urls),
|
|
115
|
+
path("accounts/", include("allauth.urls")),
|
|
116
|
+
path("ckeditor/", include("ckeditor_uploader.urls")),
|
|
117
|
+
path("", include("slm.urls")),
|
|
118
|
+
]
|
|
119
|
+
|
|
120
|
+
if getattr(settings, "DJANGO_DEBUG_TOOLBAR", False):
|
|
121
|
+
urlpatterns.append(path("__debug__/", include("debug_toolbar.urls")))
|
|
122
|
+
|
|
123
|
+
# allows us to use static files like images
|
|
124
|
+
urlpatterns += staticfiles_urlpatterns()
|
|
125
|
+
|
|
126
|
+
bring_in_urls(urlpatterns)
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This file contains the default validation configuration configuration
|
|
3
|
+
for site log fields. Amend or override SLM_DATA_VALIDATORS to use
|
|
4
|
+
different routines.
|
|
5
|
+
|
|
6
|
+
The format of SLM_DATA_VALIDATORS is
|
|
7
|
+
{
|
|
8
|
+
<app_label>.<ModelCalss>: {
|
|
9
|
+
'<field_name>': [Validator1(), Validator2(), ...]
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from slm.validators import (
|
|
15
|
+
ActiveEquipmentValidator,
|
|
16
|
+
ARPValidator,
|
|
17
|
+
EnumValidator,
|
|
18
|
+
FieldRequired,
|
|
19
|
+
NonEmptyValidator,
|
|
20
|
+
TimeRangeBookendValidator,
|
|
21
|
+
TimeRangeValidator,
|
|
22
|
+
VerifiedEquipmentValidator,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
# toggling this off will prevent any validation configured to block edit saves
|
|
26
|
+
# from doing so - instead flags will be issued.
|
|
27
|
+
SLM_VALIDATION_BYPASS_BLOCK = False
|
|
28
|
+
|
|
29
|
+
# do not allow a log to be published without these sections
|
|
30
|
+
SLM_REQUIRED_SECTIONS_TO_PUBLISH = [
|
|
31
|
+
"siteform",
|
|
32
|
+
"siteidentification",
|
|
33
|
+
"sitelocation",
|
|
34
|
+
"sitereceiver",
|
|
35
|
+
"siteantenna",
|
|
36
|
+
# 'sitesurveyedlocalties',
|
|
37
|
+
# 'sitefrequencystandard',
|
|
38
|
+
# 'sitecollocation',
|
|
39
|
+
# 'sitehumiditysensor',
|
|
40
|
+
# 'sitepressuresensor',
|
|
41
|
+
# 'sitetemperaturesensor',
|
|
42
|
+
# 'sitewatervaporradiometer',
|
|
43
|
+
# 'siteotherinstrumentation',
|
|
44
|
+
# 'siteradiointerferences',
|
|
45
|
+
# 'sitemultipathsources',
|
|
46
|
+
# 'sitesignalobstructions',
|
|
47
|
+
# 'sitelocalepisodiceffects',
|
|
48
|
+
"siteoperationalcontact",
|
|
49
|
+
# 'siteresponsibleagency',
|
|
50
|
+
# 'sitemoreinformation'
|
|
51
|
+
]
|
|
52
|
+
|
|
53
|
+
# the model field to validator map
|
|
54
|
+
SLM_DATA_VALIDATORS = {
|
|
55
|
+
"slm.SiteIdentification": {
|
|
56
|
+
"site_name": [FieldRequired()],
|
|
57
|
+
"fracture_spacing": [FieldRequired(desired=True), EnumValidator()],
|
|
58
|
+
"iers_domes_number": [FieldRequired()],
|
|
59
|
+
"date_installed": [FieldRequired()],
|
|
60
|
+
},
|
|
61
|
+
"slm.SiteLocation": {
|
|
62
|
+
"city": [FieldRequired()],
|
|
63
|
+
"country": [FieldRequired(), EnumValidator()],
|
|
64
|
+
"tectonic": [EnumValidator()],
|
|
65
|
+
"xyz": [FieldRequired()],
|
|
66
|
+
"llh": [FieldRequired()],
|
|
67
|
+
},
|
|
68
|
+
"slm.SiteReceiver": {
|
|
69
|
+
"receiver_type": [VerifiedEquipmentValidator(), ActiveEquipmentValidator()],
|
|
70
|
+
"satellite_system": [NonEmptyValidator()],
|
|
71
|
+
"serial_number": [FieldRequired()],
|
|
72
|
+
"firmware": [FieldRequired()],
|
|
73
|
+
"installed": [FieldRequired(), TimeRangeValidator(end_field="removed")],
|
|
74
|
+
"removed": [
|
|
75
|
+
TimeRangeValidator(start_field="installed"),
|
|
76
|
+
TimeRangeBookendValidator(),
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
"slm.SiteAntenna": {
|
|
80
|
+
"antenna_type": [VerifiedEquipmentValidator(), ActiveEquipmentValidator()],
|
|
81
|
+
"radome_type": [VerifiedEquipmentValidator(), ActiveEquipmentValidator()],
|
|
82
|
+
"serial_number": [FieldRequired()],
|
|
83
|
+
"reference_point": [FieldRequired(), ARPValidator(), EnumValidator()],
|
|
84
|
+
"installed": [FieldRequired(), TimeRangeValidator(end_field="removed")],
|
|
85
|
+
"removed": [
|
|
86
|
+
TimeRangeValidator(start_field="installed"),
|
|
87
|
+
TimeRangeBookendValidator(),
|
|
88
|
+
],
|
|
89
|
+
"marker_une": [FieldRequired(allow_legacy_nulls=True)],
|
|
90
|
+
"alignment": [FieldRequired(allow_legacy_nulls=True)],
|
|
91
|
+
},
|
|
92
|
+
"slm.SiteSurveyedLocalTies": {
|
|
93
|
+
"name": [FieldRequired()],
|
|
94
|
+
"measured": [FieldRequired(allow_legacy_nulls=True)],
|
|
95
|
+
"diff_xyz": [FieldRequired(allow_legacy_nulls=True)],
|
|
96
|
+
},
|
|
97
|
+
"slm.SiteFrequencyStandard": {
|
|
98
|
+
"standard_type": [FieldRequired(), EnumValidator()],
|
|
99
|
+
"effective_start": [
|
|
100
|
+
FieldRequired(),
|
|
101
|
+
TimeRangeValidator(end_field="effective_end"),
|
|
102
|
+
],
|
|
103
|
+
"effective_end": [TimeRangeValidator(start_field="effective_start")],
|
|
104
|
+
},
|
|
105
|
+
"slm.SiteCollocation": {
|
|
106
|
+
"instrument_type": [FieldRequired()],
|
|
107
|
+
"status": [FieldRequired(allow_legacy_nulls=True), EnumValidator()],
|
|
108
|
+
"effective_start": [
|
|
109
|
+
FieldRequired(),
|
|
110
|
+
TimeRangeValidator(end_field="effective_end"),
|
|
111
|
+
],
|
|
112
|
+
"effective_end": [TimeRangeValidator(start_field="effective_start")],
|
|
113
|
+
},
|
|
114
|
+
"slm.SiteHumiditySensor": {
|
|
115
|
+
"model": [FieldRequired()],
|
|
116
|
+
"manufacturer": [FieldRequired()],
|
|
117
|
+
"height_diff": [FieldRequired(allow_legacy_nulls=True)],
|
|
118
|
+
"effective_start": [TimeRangeValidator(end_field="effective_end")],
|
|
119
|
+
"effective_end": [TimeRangeValidator(start_field="effective_start")],
|
|
120
|
+
"aspiration": [FieldRequired(allow_legacy_nulls=True), EnumValidator()],
|
|
121
|
+
},
|
|
122
|
+
"slm.SitePressureSensor": {
|
|
123
|
+
"model": [FieldRequired()],
|
|
124
|
+
"manufacturer": [FieldRequired()],
|
|
125
|
+
"height_diff": [FieldRequired(allow_legacy_nulls=True)],
|
|
126
|
+
"effective_start": [TimeRangeValidator(end_field="effective_end")],
|
|
127
|
+
"effective_end": [TimeRangeValidator(start_field="effective_start")],
|
|
128
|
+
},
|
|
129
|
+
"slm.SiteTemperatureSensor": {
|
|
130
|
+
"model": [FieldRequired()],
|
|
131
|
+
"manufacturer": [FieldRequired()],
|
|
132
|
+
"height_diff": [FieldRequired(allow_legacy_nulls=True)],
|
|
133
|
+
"effective_start": [TimeRangeValidator(end_field="effective_end")],
|
|
134
|
+
"effective_end": [TimeRangeValidator(start_field="effective_start")],
|
|
135
|
+
"aspiration": [FieldRequired(allow_legacy_nulls=True), EnumValidator()],
|
|
136
|
+
},
|
|
137
|
+
"slm.SiteWaterVaporRadiometer": {
|
|
138
|
+
"model": [FieldRequired()],
|
|
139
|
+
"manufacturer": [FieldRequired()],
|
|
140
|
+
"distance_to_antenna": [FieldRequired(allow_legacy_nulls=True)],
|
|
141
|
+
"height_diff": [FieldRequired(allow_legacy_nulls=True)],
|
|
142
|
+
"effective_start": [TimeRangeValidator(end_field="effective_end")],
|
|
143
|
+
"effective_end": [TimeRangeValidator(start_field="effective_start")],
|
|
144
|
+
},
|
|
145
|
+
"slm.SiteOtherInstrumentation": {"instrumentation": [FieldRequired()]},
|
|
146
|
+
"slm.SiteRadioInterferences": {
|
|
147
|
+
"interferences": [FieldRequired(allow_legacy_nulls=True)],
|
|
148
|
+
"effective_start": [
|
|
149
|
+
FieldRequired(),
|
|
150
|
+
TimeRangeValidator(end_field="effective_end"),
|
|
151
|
+
],
|
|
152
|
+
"effective_end": [TimeRangeValidator(start_field="effective_start")],
|
|
153
|
+
},
|
|
154
|
+
"slm.SiteMultiPathSources": {
|
|
155
|
+
"sources": [FieldRequired(allow_legacy_nulls=True)],
|
|
156
|
+
"effective_start": [
|
|
157
|
+
FieldRequired(),
|
|
158
|
+
TimeRangeValidator(end_field="effective_end"),
|
|
159
|
+
],
|
|
160
|
+
"effective_end": [TimeRangeValidator(start_field="effective_start")],
|
|
161
|
+
},
|
|
162
|
+
"slm.SiteSignalObstructions": {
|
|
163
|
+
"obstructions": [FieldRequired(allow_legacy_nulls=True)],
|
|
164
|
+
"effective_start": [
|
|
165
|
+
FieldRequired(),
|
|
166
|
+
TimeRangeValidator(end_field="effective_end"),
|
|
167
|
+
],
|
|
168
|
+
"effective_end": [TimeRangeValidator(start_field="effective_start")],
|
|
169
|
+
},
|
|
170
|
+
"slm.SiteLocalEpisodicEffects": {
|
|
171
|
+
"event": [FieldRequired(allow_legacy_nulls=True)],
|
|
172
|
+
"effective_start": [
|
|
173
|
+
FieldRequired(),
|
|
174
|
+
TimeRangeValidator(end_field="effective_end"),
|
|
175
|
+
],
|
|
176
|
+
"effective_end": [TimeRangeValidator(start_field="effective_start")],
|
|
177
|
+
},
|
|
178
|
+
"slm.SiteOperationalContact": {
|
|
179
|
+
"agency": [FieldRequired()],
|
|
180
|
+
"preferred_abbreviation": [FieldRequired()],
|
|
181
|
+
"primary_name": [FieldRequired()],
|
|
182
|
+
"primary_phone1": [FieldRequired(desired=True)],
|
|
183
|
+
"primary_email": [FieldRequired(allow_legacy_nulls=True)],
|
|
184
|
+
},
|
|
185
|
+
"slm.SiteResponsibleAgency": {
|
|
186
|
+
"agency": [FieldRequired()],
|
|
187
|
+
"preferred_abbreviation": [FieldRequired()],
|
|
188
|
+
"primary_name": [FieldRequired()],
|
|
189
|
+
"primary_phone1": [FieldRequired(desired=True)],
|
|
190
|
+
"primary_email": [FieldRequired(allow_legacy_nulls=True)],
|
|
191
|
+
},
|
|
192
|
+
"slm.SiteMoreInformation": {
|
|
193
|
+
"primary": [FieldRequired()],
|
|
194
|
+
"secondary": [FieldRequired()],
|
|
195
|
+
},
|
|
196
|
+
}
|