igs-slm 0.1.5b3__py3-none-any.whl → 0.2.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. {igs_slm-0.1.5b3.dist-info → igs_slm-0.2.0b1.dist-info}/METADATA +2 -2
  2. {igs_slm-0.1.5b3.dist-info → igs_slm-0.2.0b1.dist-info}/RECORD +47 -34
  3. slm/__init__.py +1 -1
  4. slm/admin.py +40 -3
  5. slm/api/edit/views.py +37 -2
  6. slm/api/public/serializers.py +1 -1
  7. slm/defines/CoordinateMode.py +9 -0
  8. slm/defines/SiteLogFormat.py +19 -6
  9. slm/defines/__init__.py +24 -22
  10. slm/file_views/apps.py +7 -0
  11. slm/file_views/config.py +253 -0
  12. slm/file_views/settings.py +124 -0
  13. slm/file_views/static/slm/file_views/banner_header.png +0 -0
  14. slm/file_views/static/slm/file_views/css/listing.css +82 -0
  15. slm/file_views/templates/slm/file_views/listing.html +70 -0
  16. slm/file_views/urls.py +47 -0
  17. slm/file_views/views.py +472 -0
  18. slm/forms.py +22 -4
  19. slm/jinja2/slm/sitelog/ascii_9char.log +1 -1
  20. slm/jinja2/slm/sitelog/legacy.log +1 -1
  21. slm/management/commands/check_upgrade.py +25 -19
  22. slm/management/commands/generate_sinex.py +9 -7
  23. slm/map/settings.py +0 -0
  24. slm/migrations/0001_alter_archivedsitelog_size_and_more.py +44 -0
  25. slm/migrations/0032_archiveindex_valid_range_and_more.py +8 -1
  26. slm/migrations/simplify_daily_index_files.py +86 -0
  27. slm/models/index.py +73 -6
  28. slm/models/sitelog.py +6 -0
  29. slm/models/system.py +35 -2
  30. slm/parsing/__init__.py +10 -0
  31. slm/parsing/legacy/binding.py +3 -2
  32. slm/receivers/cache.py +25 -0
  33. slm/settings/root.py +22 -0
  34. slm/settings/routines.py +2 -0
  35. slm/settings/slm.py +58 -0
  36. slm/settings/urls.py +1 -1
  37. slm/settings/validation.py +5 -4
  38. slm/signals.py +3 -4
  39. slm/static/slm/js/enums.js +7 -6
  40. slm/static/slm/js/form.js +25 -14
  41. slm/static/slm/js/slm.js +4 -2
  42. slm/templatetags/slm.py +1 -1
  43. slm/utils.py +161 -36
  44. slm/validators.py +51 -0
  45. {igs_slm-0.1.5b3.dist-info → igs_slm-0.2.0b1.dist-info}/WHEEL +0 -0
  46. {igs_slm-0.1.5b3.dist-info → igs_slm-0.2.0b1.dist-info}/entry_points.txt +0 -0
  47. {igs_slm-0.1.5b3.dist-info → igs_slm-0.2.0b1.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: igs-slm
3
- Version: 0.1.5b3
3
+ Version: 0.2.0b1
4
4
  Summary: IGS Site Log Manager
5
5
  Project-URL: Homepage, https://igs-slm.readthedocs.io
6
6
  Project-URL: Documentation, https://igs-slm.readthedocs.io
@@ -62,7 +62,7 @@ Requires-Dist: polyline<3.0.0,>=2.0.0
62
62
  Requires-Dist: psycopg>=3.1
63
63
  Requires-Dist: python-dateutil<3.0.0,>=2.8.2
64
64
  Requires-Dist: requests<3.0.0,>=2.32.4
65
- Requires-Dist: rich<14.0.0,>=13.7.1
65
+ Requires-Dist: rich<15.0.0,>=13.7.1
66
66
  Requires-Dist: tqdm<5.0.0,>=4.64.1
67
67
  Provides-Extra: debug
68
68
  Requires-Dist: django-debug-toolbar<5.0.0,>=4.1.0; extra == 'debug'
@@ -6,19 +6,19 @@ igs_tools/defines/__init__.py,sha256=iQyg6SLcDT1KMtK6XToUdCUqmSZnPKY1ztjdOcaKEB0
6
6
  igs_tools/defines/constellation.py,sha256=Di0QX83YqACChVrxReKeQcjsQxY5G5bdp1e5iDeefNM,560
7
7
  igs_tools/defines/data_center.py,sha256=gLoUebE90C4OeyvEqCx-1RY2C0Nq9N9rchPc7V--lqk,2895
8
8
  igs_tools/defines/rinex.py,sha256=hHJzuqO5VZbroK6wznTxX0CEGB-WZea4S4F-lpJXKYc,1824
9
- slm/__init__.py,sha256=1OEgEnADtqOVb6ajbORJmrlo12i6V_Hwm7Fgk0nASBQ,995
10
- slm/admin.py,sha256=0sjfsluuf2dCAHodplLw9SlBHiVYEZFU64kBz1b8uM4,19537
9
+ slm/__init__.py,sha256=Rl1CQHbhnoyAjYk1nGbU8emAc92bfhvruCAtoPRglCI,995
10
+ slm/admin.py,sha256=01lyfEJw81hwn-5qmz3VeTc34H2OoGz_1B_3PMWZ9oA,20811
11
11
  slm/apps.py,sha256=Tf3FBaYkjH57bqdh0r0KBFitsKl3aJe_uQE9iZNmOzc,11949
12
12
  slm/authentication.py,sha256=pdckO48ApGTwbaHLJsc2IswSs8qM9W3BLVU8XkSAa4E,7141
13
13
  slm/context.py,sha256=qZ7a9AA3cissQg7nIAa6MbTyEgL0_NCS5_b8bLXe9rs,107
14
- slm/forms.py,sha256=I56ZNv4Cw-rvclYSjGCuZRqK2Jp1fWVPHRwCw0YshT4,37038
14
+ slm/forms.py,sha256=INUcxGT9lzN0BDwxHjVoHEjFm56gYgxPWetDO6iY1PI,37742
15
15
  slm/manage.py,sha256=ITSajblGje31dnhLlPTLHvTvyuBIu9EYFoa5lTg1dxc,678
16
16
  slm/middleware.py,sha256=fctCyOtky4m-1tYY7dTlCOh20tWkXnrFEU4lyR2vEOg,920
17
- slm/signals.py,sha256=_ilOAsO9gIaZJWItgb3N6_Mw-34-jYjsnMbffKxZU0I,8439
17
+ slm/signals.py,sha256=sDrWZugTRKOuO4ZFixJ0jnrHZa6URhZc5QcJI9EQ4rg,8397
18
18
  slm/singleton.py,sha256=FJTory_zsFWHnPFJs8vn5AFq8dE4R6jQmTkATZ56zM4,1172
19
19
  slm/urls.py,sha256=ebuDpFro064poFAfp-IMULgy3AlIo-_UIj76oCBkG1I,5462
20
- slm/utils.py,sha256=JkciytJYKJttYm07iwl947CB7Ru_8E88dA8cML8GH7Y,9042
21
- slm/validators.py,sha256=6j6taZO7rZ7PGkeg5rReBPWq6nGVnBGuSDnDYOuZIJI,10080
20
+ slm/utils.py,sha256=rIzZg5c4xJoFNgj5w5dEkk9cVKERrrRmpbsj2t1wT_g,12730
21
+ slm/validators.py,sha256=5Nnljc2O5VdwTwp542gCYCQ-EUf2Mkqmrec9DgMNvEw,11653
22
22
  slm/views.py,sha256=LaIBjNCTuPEfSGNk4QP6Ok5hApCtr8Dj_pt-6Ad2ivA,24203
23
23
  slm/widgets.py,sha256=X8FA_SiORQlBH0-7ZhSDpNwmraD9baSqtY2mDq3TCms,4470
24
24
  slm/wsgi.py,sha256=hfye2xWZVnIvVioanjD6p-WwhcpG6vKp0kr70l2wrRU,405
@@ -30,9 +30,9 @@ slm/api/serializers.py,sha256=Xe2zA2exq9vTmEPh52JU3XLJGRSyEOZTTiAfnqDDAv4,4236
30
30
  slm/api/views.py,sha256=CdVDqTQzT_f60Cx-ep6HhmNTklKuAUqCYY2ekTjfQMo,6261
31
31
  slm/api/edit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
32
  slm/api/edit/serializers.py,sha256=epxqI-LUNokPwrakanqXpjN5cpRgdDV_hXJSFJ-7ikc,9467
33
- slm/api/edit/views.py,sha256=CUavaUj9Qu2VRwk13ujiAwqwUZEToMYZsM0XNKDtmdQ,65109
33
+ slm/api/edit/views.py,sha256=uP5B2y0T1nP_H7pXyD4uNdrxg571US9z08lSelwS_vM,67066
34
34
  slm/api/public/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
- slm/api/public/serializers.py,sha256=IsYH5ruU-tFBafWtF8HzGhHEeaVyabmqM6n7lsM4Vtg,6679
35
+ slm/api/public/serializers.py,sha256=h_UeorRV1XrNV0V9JNiJnamYWTYH2XzRwWyZSpbqTq4,6685
36
36
  slm/api/public/views.py,sha256=nZpFq1yaAA7yrR4hzCVBeNJ6z7DWpz5NBba-kSzKS9w,18515
37
37
  slm/bin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
38
  slm/bin/startproject.py,sha256=0x2r1argbVjvu7-3dipK6zX1HOVOJn2pKX6x4HqYF3k,10133
@@ -66,6 +66,7 @@ slm/defines/AntennaReferencePoint.py,sha256=L1Dgnml_EFJS3z-NNtuIA0vh8NyTCVj19bSw
66
66
  slm/defines/Aspiration.py,sha256=9sR6yI_t4gExhBtZ6lAx_iB0noDo8OlUUwhD0pGfBbY,366
67
67
  slm/defines/CardinalDirection.py,sha256=zWQx-dcID4G-6l2iA4vokHi8ArGj3qeCqFY3lS-SjUU,591
68
68
  slm/defines/CollocationStatus.py,sha256=ivU9m7LGba-k7PvoDjym6Hv0Vd4gdCcxAcRolNg7S7A,337
69
+ slm/defines/CoordinateMode.py,sha256=zZfyA9jaGFJUTNRQIL_6jnXdWl-WlsgfGhxG9couwlc,526
69
70
  slm/defines/EquipmentState.py,sha256=OfSFbyxKz_KjCmWunBCYAbPOP57zad2rr_Td1xtMyUY,565
70
71
  slm/defines/FlagSeverity.py,sha256=etrHxGxNGm1_gmtl0j8J5DlhfqUHCm4hckVoZUntfgE,418
71
72
  slm/defines/FractureSpacing.py,sha256=dL3RYa67zV7FpOu1ZEP_un51yU1co3abQLnD6-E1Tug,541
@@ -76,12 +77,20 @@ slm/defines/Instrumentation.py,sha256=s0CV-BmZaBOEt_qt2Fsbc62bs1JSp-p_d5sBbj5I_r
76
77
  slm/defines/LogEntryType.py,sha256=5R3kzC6CWnvWUL5yBa6NJ_0n4Mx4CsyT_GLUWqtEmfw,1159
77
78
  slm/defines/SLMFileType.py,sha256=TmWyqoKwgk9C2rcYpvSPQkUTdNb33FpJcbM61Bd0WgE,552
78
79
  slm/defines/SiteFileUploadStatus.py,sha256=3ACFvSOWFcoMF3xCmqk1qLE1kemNayKa7C-0icp3GFw,1506
79
- slm/defines/SiteLogFormat.py,sha256=UL-wsbfUG8oJsWOzU5i_8wlpWOxIKYCvGPdvvgSB1y4,1125
80
+ slm/defines/SiteLogFormat.py,sha256=HDB7XuGGyM_7Wpqv_T65e7wyPpUe0j2YJzfz-wXElow,1442
80
81
  slm/defines/SiteLogStatus.py,sha256=bvpjGi27C2hz8FCw2394KTxkQUwgcRKNmXQbxn4QgXw,1989
81
82
  slm/defines/TectonicPlates.py,sha256=eaIf_LBAAJglZnYK6ec9-Eqj4C5L9oihvbq_j_qs3jE,959
82
- slm/defines/__init__.py,sha256=odbf-zc0IctBphhQW8MK-kgFOyiM_TgqdCQPy0Cg_hs,1634
83
- slm/jinja2/slm/sitelog/ascii_9char.log,sha256=KrRRHDnmEX76ib14zLmT0StCJ3z_-ZD8zsY0-IrviQo,24941
84
- slm/jinja2/slm/sitelog/legacy.log,sha256=73IhCCiyYzBMh1vjvkMr1yvPZFcVXW8hLi3xz53w8Xg,24955
83
+ slm/defines/__init__.py,sha256=uNYhr_fyU9fMJ2C9SA_q5EVERHqGtGwAIR72v4vPNM4,1754
84
+ slm/file_views/apps.py,sha256=ZWN4U598HRNVYLP1iY9w43CTg6yPvcM8sAo56HTT-MM,166
85
+ slm/file_views/config.py,sha256=5g3QPydUWdmDZL-PN6lJzULmURUuZd3Lh_RfKgzJ-8Q,7020
86
+ slm/file_views/settings.py,sha256=B7toRTtZBkPAmMcTJgxhB3IaCvrW4dP_2yrm5DBF2yc,3340
87
+ slm/file_views/urls.py,sha256=B5Dh2xtJvBj7KkVSHwnMvuF9_mpbTfoyrlLy1srT1W8,1290
88
+ slm/file_views/views.py,sha256=Z4aA_44-NsCJTpxuXc3ZQfkXeUfT9by2Sy3JSectKPo,17555
89
+ slm/file_views/static/slm/file_views/banner_header.png,sha256=-whpDEIJSu7RU5HF-fS2SpXNUyP-XyCN3pf-QdiL9LM,77694
90
+ slm/file_views/static/slm/file_views/css/listing.css,sha256=Ep45zjwqD6-TvjDa2LLQ0K9g-SaQKSixmPmQb1Tv4ZY,1111
91
+ slm/file_views/templates/slm/file_views/listing.html,sha256=uwBMQZfTsEjDsAsf7a17kHFHPTRKKtestkRS_AKA_N0,2913
92
+ slm/jinja2/slm/sitelog/ascii_9char.log,sha256=KrcN_zSvke8YlKFzBFDcGaC--S4i4pW7F_Caxrg4I9c,24952
93
+ slm/jinja2/slm/sitelog/legacy.log,sha256=hynYir-5DpWmuaSZsKHIrOaK-ci3lP6tAtsZ0JgaANE,24966
85
94
  slm/jinja2/slm/sitelog/xsd/geodesyml_0.4.xml,sha256=iZSLS7g4bZrQas8NqdxBojm_AJPQEaTb1RIobMeAGNQ,5408
86
95
  slm/jinja2/slm/sitelog/xsd/geodesyml_0.5.xml,sha256=ATBT771QYP8F-lSk5aYypKZRu5z2yvoHRJkyeXGYUks,5872
87
96
  slm/jinja2/slm/sitelog/xsd/0.4/collocationInformation.xml,sha256=MnuwqSoX-CHKkQc-8wzpYQlY9Gro4oisNdi4dkY3C9Y,834
@@ -109,8 +118,8 @@ slm/jinja2/slm/sitelog/xsd/0.5/document.xml,sha256=ocBD0sHIKamOZSz67FB9a6ENWsx-o
109
118
  slm/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
119
  slm/management/commands/__init__.py,sha256=2rXtF09XsScbEG8zepmPga5B4XuytNKOTkNxIIdHRGI,1773
111
120
  slm/management/commands/build_index.py,sha256=Ppl-DNDI8zqr0oiJXhSp8PFVE7_Aeoi5o4ZXAHkl6_0,3358
112
- slm/management/commands/check_upgrade.py,sha256=qqtKaQXOvYPcxOXsK3rAG3RLkOSGLqdRWchUCBoiofQ,5720
113
- slm/management/commands/generate_sinex.py,sha256=JsxAnnxXwwEmr22qh7Wsebr14QVXltOLB_Nqna7wtvs,26397
121
+ slm/management/commands/check_upgrade.py,sha256=cDIchUBvM1Wv3iprTFYSK6qufnFhxdx835EbPUUrBRQ,5917
122
+ slm/management/commands/generate_sinex.py,sha256=IesyiEleRltM2J4B-uK8_kk6R_5Q4ob_rEUeE5sPvGs,26485
114
123
  slm/management/commands/head_from_index.py,sha256=aUlk7YCCodw6tuZz02eOeUGTWZq7_3AnN8ANQw5_e8s,21035
115
124
  slm/management/commands/import_archive.py,sha256=LpkwY40gqtw7sD9iOqTQjLPfHdqCN0YyOlyWgEmiaf8,34730
116
125
  slm/management/commands/import_equipment.py,sha256=toYfvknXIIT1i9ix_CS7wRVnePMhDpHX3uB152a64yk,12831
@@ -125,6 +134,7 @@ slm/map/admin.py,sha256=E6PV8736VIV-L-XwF9M9VFwsoniqFUS3sVRwBViGywo,107
125
134
  slm/map/apps.py,sha256=5LiV3FCizLQGSjIb5x8zbovIUX2C7hdjPSGLpgE7Fjc,150
126
135
  slm/map/defines.py,sha256=P5KKlL0es_VYUMpZH6UkxR9YG-4mIHdVLkqGRF1il-0,2237
127
136
  slm/map/models.py,sha256=I2o7aTCb99t0pV4TP8s9JiyHPRDZSzCF0Nd9oa3HKig,1716
137
+ slm/map/settings.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
128
138
  slm/map/urls.py,sha256=KiVibGz0E9D8aH14t8BVTs9OPViNe0eofYsXJQ0F5KU,597
129
139
  slm/map/views.py,sha256=HUs7VGbbgpwvfOP2hg62VVJUHB3giA6BkeGEuO2Vf1Y,1228
130
140
  slm/map/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -144,6 +154,7 @@ slm/map/templates/slm/station/base.html,sha256=WV412EjtUtV1Ug9jdU0dfuL-Q8UbPu5Kv
144
154
  slm/map/templates/slm/station/edit.html,sha256=SZOPHdhKV_X3Vko336PgzJ3AIszGmZJIhIxwTtFAd4Y,269
145
155
  slm/map/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
146
156
  slm/map/templatetags/slm_map.py,sha256=OwFJD8Uv3R8iW5n_Ikz3VWsB6PZ9eWGNoL_gFI2jT2A,510
157
+ slm/migrations/0001_alter_archivedsitelog_size_and_more.py,sha256=rL0Sg5hf3g6Qk2_HXlDDncT3_B6mTpY7cV4IQy-BiQE,1291
147
158
  slm/migrations/0001_alter_siteantenna_marker_enu_alter_sitelocation_llh_and_more.py,sha256=iSGlNL2oaYnsBcUahnqWJNHbwzXuvUMrmGmUW87IFDc,1816
148
159
  slm/migrations/0001_initial.py,sha256=0P2Jn3iCqiSigdW7nqA_QN_hc_MDD-j4E_FDYEKOS8U,192721
149
160
  slm/migrations/0001_remove_archiveindex_no_overlapping_ranges_per_site_and_more.py,sha256=OhOdf-OyQNHWLelYkYJQIimtVDEeGQQ_TBuopjyRaQk,809
@@ -182,11 +193,12 @@ slm/migrations/0028_antenna_replaced_manufacturer_url_radome_replaced_and_more.p
182
193
  slm/migrations/0029_manufacturer_full_name.py,sha256=zESR9lf_hw0CTLzp4ovG8u8TVli9JyK93YHaoVk538k,454
183
194
  slm/migrations/0030_alter_antenna_state_alter_radome_state_and_more.py,sha256=hDszkwYVDlTWIFoIF-E-1hPkGp42-9MBfuZrYx4ToPg,1514
184
195
  slm/migrations/0031_alter_antenna_features.py,sha256=IqIDNYTTynlKv3SR2aGfxuNO5YjVjlv4tuAan4HuBLE,1744
185
- slm/migrations/0032_archiveindex_valid_range_and_more.py,sha256=SfMnRfQLaSBlZNZntNIRtEyarmftDVVJa8VUjwrMdGA,2884
196
+ slm/migrations/0032_archiveindex_valid_range_and_more.py,sha256=xU3R-aT-1WHt8Hh1XlYtGzbxTBgXSwG7hzJ30MIDUeY,3058
186
197
  slm/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
187
198
  slm/migrations/add_index_order_index.py,sha256=YqVtUd2TfXWo-onrEzDJCbTcMRSv7V8N1pq1LjPcP8M,1740
188
199
  slm/migrations/load_satellitesystems.py,sha256=AyUb9MOE7Fcuuw0exUMu9QNylx23yWz60QekowhI6pE,856
189
200
  slm/migrations/normalize_index.py,sha256=VsNOXieaEwcrDtLhBpwXdRvcMd6NdXzCKg9x6VCY9d4,5429
201
+ slm/migrations/simplify_daily_index_files.py,sha256=Di1Wzo34R43iu8C0ZROuwj-vF7EK7hRIEz40ZJGtpRI,3215
190
202
  slm/migrations/simplify_index.py,sha256=2ultmQ2X5oQbYcpMxdrvJyVXwcCI-ZTJUGGDKMgYjMk,1674
191
203
  slm/migrations/verify_index.py,sha256=Gx9ykLROmbXAXKArRpbyhVrDiUqhIotfEIlEfESsdxg,2005
192
204
  slm/models/__init__.py,sha256=rp3cZXLTjds3bBRKHN8zMEr09oP4Y5nfD_ffu7y_UFk,2534
@@ -196,13 +208,13 @@ slm/models/data.py,sha256=VQx2DBX8sb2qx6Jqv_2unzNToVzf2mBD8M4bwfid2XE,1885
196
208
  slm/models/equipment.py,sha256=oZnZVDBbucNNfqz069tYB3kEqsAFKaY3sjTsE67Qjm4,5922
197
209
  slm/models/fields.py,sha256=k6W4LwqY9TVSVQ4wHi50WgYpbMZNcqmDnP4OnE9y6Ww,1614
198
210
  slm/models/help.py,sha256=Zbut5wa9XcNT9GtLbs0jj0Gj9XIXI-B2GSjbh5Xuy-4,371
199
- slm/models/index.py,sha256=UQYzWCWwceTxaHwqO3pNIIEHr3a7QgYjo7RGShF1uSE,19319
200
- slm/models/sitelog.py,sha256=yu1C1gaVjbOCF9g3Zr02bxg1waAyFLn3P_OLrfscAhA,134257
201
- slm/models/system.py,sha256=rHDW8xht4KJg3wSuZ4DTlbIjXkZlaDJpUsUOVcbsixE,24313
211
+ slm/models/index.py,sha256=JSNUwFvJP_s0A8g_57ZD56gSMp49mDRe-V56jevUtC8,21762
212
+ slm/models/sitelog.py,sha256=5zkvT1_wuXOnHwGAwp0W3GSNfLxkqx6yl7_ZafFR8Lk,134408
213
+ slm/models/system.py,sha256=mavBJcJcl-LYIisvCJNbJgBZt3itV44MB2firnGmn3c,25973
202
214
  slm/models/user.py,sha256=qro6VVSNnqor0ASoyW3C8TWSZntYxHp83xqYZW2pKRo,9497
203
- slm/parsing/__init__.py,sha256=Xd3-vENZg0raCqKMQUBnYxHtAa9wwkfiFKvvi6aZIq8,23681
215
+ slm/parsing/__init__.py,sha256=eBnlQzrxTB6I5qs4u_9ftSOOL1qujFojcfv2Aiw04RQ,23971
204
216
  slm/parsing/legacy/__init__.py,sha256=MkuAjfMldkrTZHfjnBpQP1j4mtv7nDdLUOzYEIBLaUc,147
205
- slm/parsing/legacy/binding.py,sha256=gsVgQ1qoCtOt4LpOynxci1rD9yh4_dn74LtL0-JezBM,33033
217
+ slm/parsing/legacy/binding.py,sha256=NZUoM68nGSqJjgNo8uo-6QsIHmoyNV2DrIfmtgUO0BM,33074
206
218
  slm/parsing/legacy/parser.py,sha256=dy3EmMY_hutflTm8QaDkcE04jV6fI1eNBgHqXeucNsA,13395
207
219
  slm/parsing/xsd/__init__.py,sha256=ZyiLxBFersFCknQ8ysBpYWcdgDPfwdxq-QIZlLIeryM,974
208
220
  slm/parsing/xsd/binding.py,sha256=A6eRq8p0xA1zE-aJluTTiwRVLBQzuYUgSdnur7OrowE,2985
@@ -246,6 +258,7 @@ slm/parsing/xsd/geodesyml/0.5/referenceFrame.xsd,sha256=khr2VnaegDf91zb8zWsKy3Z2
246
258
  slm/parsing/xsd/geodesyml/0.5/siteLog.xsd,sha256=x5PCdbjx-NfammnnqcLMP9l8mgRKNKiFZVFiyBdrzus,5494
247
259
  slm/receivers/__init__.py,sha256=cHuNSRGRVx88ynuSa3lvFyxpH5RQ4gWVx5rV8B5tt0M,364
248
260
  slm/receivers/alerts.py,sha256=G0UrjngKXMK3ZxSR1ok33llFZLMxiONOHKRwO813bmg,2700
261
+ slm/receivers/cache.py,sha256=GTY50nwIB37QInHsMGUjJeqa8pBY6fQw_bIkBmmQFFI,779
249
262
  slm/receivers/cleanup.py,sha256=PYbN9QXU_adTV95ivOPHMt1NqA-pGfeznk1EwKqqZHQ,1411
250
263
  slm/receivers/event_loggers.py,sha256=sPCVMFIuTLUCevMB36nGIeTy3AcnohxvI9dYQPo85CI,5731
251
264
  slm/receivers/index.py,sha256=Fc9Mu-al4j7jB96IUB5CF-Bsy7Uja0G5WGJi2ROBrBg,2668
@@ -259,16 +272,16 @@ slm/settings/emails.py,sha256=gSLlOEwOfYiDb_oTp7QiLYxiSQvWqTNhP_H1AtUSdPo,1447
259
272
  slm/settings/internationalization.py,sha256=OfySI8I21FUY29EfTNspwfZVQeYDtRzbo-RAK6Uipfw,549
260
273
  slm/settings/logging.py,sha256=hGe8K7gCUqxZFNuLnwUlNyfF0F3Sl3rFGg8DGlGp5-Y,4230
261
274
  slm/settings/rest.py,sha256=DFkT8d6yx7TfQteNnCjj7WrCD8XzVMNPm8nxj-Gb2Wo,787
262
- slm/settings/root.py,sha256=jx5S01BM3SGFzRuaV83nEBAY0zCjU2wp-SZCm7_DvZM,6973
263
- slm/settings/routines.py,sha256=5cNDxf_SGNb0h1MgiYRqdy6JbTUVyQMGdW6Mi4zR0FY,1670
275
+ slm/settings/root.py,sha256=_xoJm99hMD4kkT_Z6tuyCz_DJTo5NcZ8OskPJGzgkeg,7634
276
+ slm/settings/routines.py,sha256=dQcYsTHFO9NEqRrlUsxdecP0geUgfPBjvphsocNNfHE,1769
264
277
  slm/settings/secrets.py,sha256=4X5RJyYD0iOuaZ_YMdSvWxwVSGgWoXpzX9lgHldPZ3M,830
265
278
  slm/settings/security.py,sha256=yO8pbNCAAvVdJfT4mbtdA8KVsmWG5FvP6REUhnSm2IE,249
266
- slm/settings/slm.py,sha256=j4226EkPLpgRdRcgJW-eaPP5Cu6xhoixZyXAsLsW0pE,6891
279
+ slm/settings/slm.py,sha256=i1YUB88gZf7smyVVWOdhLrMiWUW40NqkLr06iYTccYE,8365
267
280
  slm/settings/static_templates.py,sha256=99xqZqyGxXT04r_nSoL5eVvt14vIQ7wZQxJzjZsmaZk,1403
268
281
  slm/settings/templates.py,sha256=_uIXxD7Z7p7_n_wafz_rnDiKOcp1ybvkaifE4FsEd5Y,1132
269
282
  slm/settings/uploads.py,sha256=ly-GMoY5_m4Vz9mzvLnGzbwVfk0AaU9l8f6X6xMY6AE,1031
270
- slm/settings/urls.py,sha256=LJcWON6W0rnJN5uPKLCLQMpePqDRqPNXKkjtI8QrRS4,4133
271
- slm/settings/validation.py,sha256=SzRcOriJbV82Rr1gRmy5QmZL43Lc5txQF3We6KiOaNE,7952
283
+ slm/settings/urls.py,sha256=FH9sF3Z8NNhxa__eIRGfUk3J4g6GUAlJwp7gL1vy81M,4151
284
+ slm/settings/validation.py,sha256=HBChO-vCjoLdizJg8XDbGa_gZb3-6ruv9nBZfCysMyU,8051
272
285
  slm/settings/platform/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
273
286
  slm/settings/platform/darwin.py,sha256=aJPOnZZC_kHAspePBegQJ64LrHtwvEqjRDhYsb6WBUU,786
274
287
  slm/static/rest_framework/css/bootstrap-tweaks.css,sha256=be5zEHz29Qd5ogbozYc4AnPxmFEOlfEIuzgGh2KBC1s,3003
@@ -303,13 +316,13 @@ slm/static/slm/img/favicon.ico,sha256=1AN69vIFib1oPYEsyjTbFHABdPEXVXVzrNShCAM_4O
303
316
  slm/static/slm/img/login-bg.jpg,sha256=2sOMYjc4ruCuMzJpP_Yy50yoAlpu4G0gATVjw3D9Glk,684715
304
317
  slm/static/slm/img/slm-logo.svg,sha256=voAYAJ5O6NKaRvwYdGzjsdkNDQOdRRyvZdXDrrmq2OM,1852
305
318
  slm/static/slm/js/autocomplete.js,sha256=PC0SkihqdOBZjp3SxFkZCrjMEnNMDU-w9SnbtobwCyQ,12117
306
- slm/static/slm/js/enums.js,sha256=M6jFvquXd6uKqeQSBQXjlkYjK8QDzGzEOlywfcQGfKI,10531
319
+ slm/static/slm/js/enums.js,sha256=bucGycuV58XQuRsuApiJj2o1DkbV_vhwHFp0AvaVI7Q,10609
307
320
  slm/static/slm/js/fileIcons.js,sha256=bWB1IZKQQdJNrcb5M2pd8ifp6IgNfVDu7_6i1_5bw4c,914
308
321
  slm/static/slm/js/file_modal.js,sha256=t8CDM7CHUm-RICJrYF6EnoCEyr6CMzCLrJsRb2ITKxQ,2398
309
- slm/static/slm/js/form.js,sha256=_vaVCh9W1mji9gwHYbPQO4vaj3_J3tHd_uwMTXD6-IU,13177
322
+ slm/static/slm/js/form.js,sha256=8TsOr7tXtbuI4cnmCN_9rxsC0hnJg_r0tscF7hUSsNI,13893
310
323
  slm/static/slm/js/formWidget.js,sha256=37UcZT0C5YE0gGZRY8IBI8_L-rSiHqTy_vV4U8e9L5A,461
311
324
  slm/static/slm/js/persistable.js,sha256=MqCtfvTbVOLpsJq1CfDJ_WokZFcE2967h2V384sJD1E,847
312
- slm/static/slm/js/slm.js,sha256=XRwMBvofo2mrMT0_Gr0rM12rGdpiDDFobZO_3ATgRZQ,37324
325
+ slm/static/slm/js/slm.js,sha256=yg4coWKYTvzlDuzM6CMyFfBvm_U8AjSD0aUsX26-90Q,37357
313
326
  slm/static/slm/js/time24.js,sha256=LDYnnPOywX-S2cCKgzokjc4a6wQqQnbCmvn3DrReF8A,8837
314
327
  slm/static_templates/slm/css/defines.css,sha256=h1ppaUTxRJOHmYriB6ZYV0KwuS-71Z6NUB__WHApfC8,691
315
328
  slm/static_templates/slm/js/enums.js,sha256=cGnxRfFLKY9yGeYQOwRllNO_Y7AXkixxktZ91Xs_Djg,773
@@ -459,9 +472,9 @@ slm/templates/slm/widgets/log_scroll.html,sha256=4uiXXdppjugwpmpDEz3cXN7xceBAqE4
459
472
  slm/templates/slm/widgets/stationlist.html,sha256=MzbGy2po3TQ6Cx12OEagwaU5dZ5IKYYNDc0gs8eeifY,9171
460
473
  slm/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
461
474
  slm/templatetags/jinja2.py,sha256=ye8Q5EVv1ATBCwkVi3UPrgRWj5a4VAI2s72pJnAftx4,222
462
- slm/templatetags/slm.py,sha256=yZHFBwJ0m1OOsNjjbIXFrtQmn8eJ8aXAxziXPWCFzAs,14234
463
- igs_slm-0.1.5b3.dist-info/METADATA,sha256=NrdWIB8k35xevvTW_KY5_x1V7xjv3TX5rCJdZwFaLG8,7751
464
- igs_slm-0.1.5b3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
465
- igs_slm-0.1.5b3.dist-info/entry_points.txt,sha256=Oq_ZZdzACnQ8vhZJn8q6_8VuYJNLqkfCW5HvqMg6JTs,84
466
- igs_slm-0.1.5b3.dist-info/licenses/LICENSE,sha256=lrSWvh1Y0-xYCepGM5jimWArZ7iqaRvMV1UuPuq5mq8,1092
467
- igs_slm-0.1.5b3.dist-info/RECORD,,
475
+ slm/templatetags/slm.py,sha256=c6BLClHz9-U7Z0xFzSMoRH1BlGsr5X0G9N688DtNCAk,14234
476
+ igs_slm-0.2.0b1.dist-info/METADATA,sha256=hiASDqYVu5_gI5JPQpwPNti9lvX4WVtnzQdmtYoF3Kc,7751
477
+ igs_slm-0.2.0b1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
478
+ igs_slm-0.2.0b1.dist-info/entry_points.txt,sha256=Oq_ZZdzACnQ8vhZJn8q6_8VuYJNLqkfCW5HvqMg6JTs,84
479
+ igs_slm-0.2.0b1.dist-info/licenses/LICENSE,sha256=lrSWvh1Y0-xYCepGM5jimWArZ7iqaRvMV1UuPuq5mq8,1092
480
+ igs_slm-0.2.0b1.dist-info/RECORD,,
slm/__init__.py CHANGED
@@ -15,7 +15,7 @@ r"""
15
15
 
16
16
  """
17
17
 
18
- VERSION = (0, 1, "5b3")
18
+ VERSION = (0, 2, "0b1")
19
19
 
20
20
  __title__ = "IGS/Site Log Manager"
21
21
  __version__ = ".".join(str(i) for i in VERSION)
slm/admin.py CHANGED
@@ -27,6 +27,7 @@ from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
27
27
  from django.contrib.auth.models import Group
28
28
  from django.db.models import BooleanField, Count, Q
29
29
  from django.db.models.expressions import ExpressionWrapper
30
+ from django.urls import reverse
30
31
  from django.utils.html import format_html
31
32
  from django.utils.safestring import mark_safe
32
33
  from django.utils.translation import gettext_lazy as _
@@ -82,6 +83,9 @@ class TideGaugeInline(admin.TabularInline):
82
83
  model = TideGauge.sites.through
83
84
  extra = 0
84
85
 
86
+ def get_queryset(self, request):
87
+ return super().get_queryset(request).select_related("site", "gauge")
88
+
85
89
 
86
90
  class SiteTGInline(admin.TabularInline):
87
91
  model = Site.tide_gauges.through
@@ -263,16 +267,49 @@ class NetworkInline(admin.TabularInline):
263
267
  model = Network.sites.through
264
268
  extra = 0
265
269
 
270
+ def get_queryset(self, request):
271
+ return super().get_queryset(request).select_related("network", "site")
272
+
266
273
 
267
274
  class SiteAgencyInline(admin.TabularInline):
268
275
  model = Agency.sites.through
269
276
  extra = 0
270
277
 
271
278
 
279
+ class SiteIndexInline(admin.TabularInline):
280
+ model = ArchiveIndex
281
+ extra = 0
282
+ readonly_fields = ("time_range_display",)
283
+ fields = ("time_range_display",)
284
+
285
+ def get_queryset(self, request):
286
+ return super().get_queryset(request).select_related("site")
287
+
288
+ def has_add_permission(self, request, obj=None):
289
+ return False
290
+
291
+ def has_change_permission(self, request, obj=None):
292
+ return False
293
+
294
+ def time_range_display(self, obj):
295
+ if obj and obj.pk:
296
+ begin_formatted = obj.begin.strftime("%Y-%m-%d %H:%M:%S")
297
+ end_formatted = obj.end.strftime("%Y-%m-%d %H:%M:%S") if obj.end else ""
298
+ time_range = f"{begin_formatted} - {end_formatted}"
299
+ url = reverse(
300
+ f"admin:{obj._meta.app_label}_{obj._meta.model_name}_change",
301
+ args=[obj.pk],
302
+ )
303
+ return format_html('<a href="{}">{}</a>', url, time_range)
304
+ return "-"
305
+
306
+ time_range_display.short_description = "Time Range"
307
+
308
+
272
309
  @admin.register(Site)
273
310
  class SiteAdmin(admin.ModelAdmin):
274
311
  search_fields = ("name",)
275
- inlines = [SiteAgencyInline, NetworkInline, TideGaugeInline]
312
+ inlines = [SiteAgencyInline, NetworkInline, TideGaugeInline, SiteIndexInline]
276
313
  exclude = ["agencies"]
277
314
 
278
315
 
@@ -345,7 +382,7 @@ class AntennaCalibrationAdmin(admin.ModelAdmin):
345
382
 
346
383
 
347
384
  class LogEntryAdmin(admin.ModelAdmin):
348
- search_fields = ("site__name", "radome__model")
385
+ search_fields = ("site__name",)
349
386
  list_display = ("timestamp", "site", "type", "ip")
350
387
  list_filter = ("type", "section")
351
388
  ordering = ("-timestamp",)
@@ -466,7 +503,7 @@ class ArchiveFileInline(admin.TabularInline):
466
503
  for field in ArchivedSiteLog._meta.get_fields()
467
504
  if field.name not in ["id", "site", "thumbnail", "name", "timestamp"]
468
505
  ] + ["view_file"]
469
- can_delete = False
506
+ can_delete = True
470
507
  exclude = ["site", "file", "thumbnail", "name", "timestamp"]
471
508
 
472
509
  def path(self, obj):
slm/api/edit/views.py CHANGED
@@ -76,6 +76,7 @@ from slm.api.serializers import SiteLogSerializer
76
76
  from slm.api.views import BaseSiteLogDownloadViewSet
77
77
  from slm.defines import (
78
78
  CardinalDirection,
79
+ CoordinateMode,
79
80
  SiteFileUploadStatus,
80
81
  SiteLogFormat,
81
82
  SiteLogStatus,
@@ -113,6 +114,7 @@ from slm.models import (
113
114
  SiteWaterVaporRadiometer,
114
115
  )
115
116
  from slm.parsing.legacy.parser import Error, Warn
117
+ from slm.utils import llh2xyz, xyz2llh
116
118
 
117
119
 
118
120
  class StationFilterForm(BaseStationFilterForm):
@@ -612,6 +614,10 @@ class SectionViewSet(type):
612
614
  do_revert = validated_data.pop("revert", False)
613
615
  update_status = None
614
616
 
617
+ # the upload viewsets tag the context so we can tweak behavior for
618
+ # uploaded files
619
+ is_from_upload = self.context.get("upload", False)
620
+
615
621
  if not is_moderator:
616
622
  # non-moderators are not allowed to publish!
617
623
  if do_publish:
@@ -674,6 +680,25 @@ class SectionViewSet(type):
674
680
  return instance
675
681
 
676
682
  try:
683
+ location_updated = False
684
+ if ModelClass is SiteLocation and not is_from_upload:
685
+ # if XYZ or LLH should be computed from the other we do that here, so it happens
686
+ # before the validators run. We also do it in save().
687
+ llh = validated_data.get("llh", None)
688
+ xyz = validated_data.get("xyz", None)
689
+
690
+ if (
691
+ ModelClass.coordinate_mode == CoordinateMode.ECEF
692
+ and xyz
693
+ ):
694
+ location_updated = True
695
+ validated_data["llh"] = Point(*xyz2llh(xyz))
696
+ elif (
697
+ ModelClass.coordinate_mode == CoordinateMode.LLH and llh
698
+ ):
699
+ location_updated = True
700
+ validated_data["xyz"] = Point(*llh2xyz(llh))
701
+
677
702
  # this is a new section
678
703
  if instance is None:
679
704
  new_section = super().create(validated_data)
@@ -757,8 +782,18 @@ class SectionViewSet(type):
757
782
  else:
758
783
  setattr(instance, field, new_value)
759
784
 
760
- if field in flags:
785
+ # handle special case where llh/xyz are linked and if one is
786
+ # updated we should remove flags for both
787
+ # TODO less hard coded way to handle this -
788
+ # linked fields definitions on the validators?
789
+ if location_updated and field in {"llh", "xyz"}:
790
+ for cfield in ["llh", "xyz"]:
791
+ if cfield in flags:
792
+ del flags[cfield]
793
+
794
+ elif field in flags:
761
795
  del flags[field]
796
+
762
797
  if update:
763
798
  if instance.published:
764
799
  validated_data["_flags"] = flags
@@ -1525,7 +1560,7 @@ class SiteFileUploadViewSet(
1525
1560
  posted_subsections[section.heading_index].add(instance)
1526
1561
 
1527
1562
  serializer = section_view.serializer_class(
1528
- data=data, context={"request": request}
1563
+ data=data, context={"request": request, "upload": True}
1529
1564
  )
1530
1565
  if not serializer.is_valid(raise_exception=False):
1531
1566
  errors[index] = {
@@ -33,7 +33,7 @@ class EquipmentSerializer(serializers.ModelSerializer):
33
33
 
34
34
  class Meta:
35
35
  model = Equipment
36
- fields = ["model", "description", "state", "manufacturer"]
36
+ fields = ["id", "model", "description", "state", "manufacturer"]
37
37
 
38
38
 
39
39
  class ManufacturerSerializer(serializers.ModelSerializer):
@@ -0,0 +1,9 @@
1
+ from enum_properties import StrEnumProperties, p, s
2
+
3
+
4
+ class CoordinateMode(StrEnumProperties, s("label", case_fold=True), p("help")):
5
+ # fmt: off
6
+ INDEPENDENT = "I", "INDEPENDENT", "User specifies station coordinates in ECEF and LLH seperately."
7
+ ECEF = "E", "ECEF", "User specifies station coordinates in ECEF, LLH coordinates are calculated by the system."
8
+ LLH = "L", "LLH", "User specifies station coordinates in LLH, ECEF coordinates are calculated by the system."
9
+ # fmt: on
@@ -9,17 +9,30 @@ class SiteLogFormat(
9
9
  p("icon"),
10
10
  s("ext", case_fold=True),
11
11
  s("alts", case_fold=True),
12
- s("alt_exts", case_fold=True),
12
+ p("supersedes"),
13
13
  ):
14
14
  _symmetric_builtins_ = [s("name", case_fold=True)]
15
15
 
16
16
  # fmt: off
17
- # name value label mimetype icon ext alts alt_exts
18
- LEGACY = 1, _("Legacy (ASCII)"), "text/plain", "bi bi-file-text", "log", ["text", "txt", "legacy"], ["txt", "sitelog"]
19
- GEODESY_ML = 2, _("GeodesyML"), "application/xml", "bi bi-filetype-xml", "xml", ["xml"], ["gml"]
20
- JSON = 3, _("JSON"), "application/json", "bi bi-filetype-json", "json", ["json", "js"], ["js"]
21
- ASCII_9CHAR = 4, _("ASCII (9-Char)"), "text/plain", "bi bi-file-text", "log", ["text", "txt", "9char"], ["txt", "sitelog"]
17
+ # name value label mimetype icon ext alts supersedes
18
+ LEGACY = 1, _("Legacy (ASCII)"), "text/plain", "bi bi-file-text", "log", ["text", "txt", "legacy", "sitelog"], []
19
+ GEODESY_ML = 2, _("GeodesyML"), "application/xml", "bi bi-filetype-xml", "xml", ["xml", "gml"], []
20
+ JSON = 3, _("JSON"), "application/json", "bi bi-filetype-json", "json", ["json", "js"], []
21
+ ASCII_9CHAR = 4, _("ASCII (9-Char)"), "text/plain", "bi bi-file-text", "log", ["text", "txt", "9char", "sitelog"], [LEGACY]
22
22
  # fmt: on
23
23
 
24
24
  def __str__(self):
25
25
  return str(self.label)
26
+
27
+ @property
28
+ def suffix(self):
29
+ """
30
+ Fetch the configured suffix for this file type.
31
+ """
32
+ from django.conf import settings
33
+
34
+ return getattr(
35
+ settings,
36
+ "SLM_FORMAT_EXTENSIONS",
37
+ {fmt: fmt.ext for fmt in SiteLogFormat},
38
+ )[self]
slm/defines/__init__.py CHANGED
@@ -6,6 +6,7 @@ from slm.defines.AntennaReferencePoint import AntennaReferencePoint
6
6
  from slm.defines.Aspiration import Aspiration
7
7
  from slm.defines.CardinalDirection import CardinalDirection
8
8
  from slm.defines.CollocationStatus import CollocationStatus
9
+ from slm.defines.CoordinateMode import CoordinateMode
9
10
  from slm.defines.EquipmentState import EquipmentState
10
11
  from slm.defines.FlagSeverity import FlagSeverity
11
12
  from slm.defines.FractureSpacing import FractureSpacing
@@ -21,26 +22,27 @@ from slm.defines.SLMFileType import SLMFileType
21
22
  from slm.defines.TectonicPlates import TectonicPlates
22
23
 
23
24
  __all__ = [
24
- DataRate,
25
- RinexVersion,
26
- AlertLevel,
27
- AntennaCalibrationMethod,
28
- AntennaFeatures,
29
- AntennaReferencePoint,
30
- Aspiration,
31
- CardinalDirection,
32
- CollocationStatus,
33
- EquipmentState,
34
- FlagSeverity,
35
- FractureSpacing,
36
- FrequencyStandardType,
37
- GeodesyMLVersion,
38
- Instrumentation,
39
- ISOCountry,
40
- LogEntryType,
41
- SiteFileUploadStatus,
42
- SiteLogFormat,
43
- SiteLogStatus,
44
- SLMFileType,
45
- TectonicPlates,
25
+ "DataRate",
26
+ "RinexVersion",
27
+ "AlertLevel",
28
+ "AntennaCalibrationMethod",
29
+ "AntennaFeatures",
30
+ "AntennaReferencePoint",
31
+ "Aspiration",
32
+ "CardinalDirection",
33
+ "CollocationStatus",
34
+ "CoordinateMode",
35
+ "EquipmentState",
36
+ "FlagSeverity",
37
+ "FractureSpacing",
38
+ "FrequencyStandardType",
39
+ "GeodesyMLVersion",
40
+ "Instrumentation",
41
+ "ISOCountry",
42
+ "LogEntryType",
43
+ "SiteFileUploadStatus",
44
+ "SiteLogFormat",
45
+ "SiteLogStatus",
46
+ "SLMFileType",
47
+ "TectonicPlates",
46
48
  ]
slm/file_views/apps.py ADDED
@@ -0,0 +1,7 @@
1
+ from django.apps import AppConfig
2
+
3
+
4
+ class FileViewsConfig(AppConfig):
5
+ name = "slm.file_views"
6
+ label = name.replace(".", "_")
7
+ verbose_name = " File Views"