From 9af9a59d2c13ec4ecc5a07a03935b71625f093cc Mon Sep 17 00:00:00 2001 From: Irwan Fathurrahman Date: Wed, 1 May 2024 07:32:30 +0700 Subject: [PATCH] Add country to data provider/organisation (#128) * Add country to data provider/organisation * Change terms * Change download file to ods * Update uploader file to use ods * Fix link --- admin/well_management.py | 13 +++++- forms/organisation.py | 4 +- forms/uploader/csv_well_form.py | 14 ++++-- migrations/0083_organisation_country.py | 19 ++++++++ models/upload_session.py | 8 +++- models/well.py | 10 +++- models/well_management/organisation.py | 13 ++++++ .../drilling_and_construction.ods | Bin 0 -> 12458 bytes .../drilling_and_construction.xlsx | Bin 10189 -> 10169 bytes static/download_template/monitoring_data.ods | Bin 0 -> 12262 bytes static/download_template/wells.ods | Bin 0 -> 15077 bytes tasks/data_file_cache/base_cache.py | 43 ++++++++++-------- tasks/data_file_cache/wells_cache.py | 11 +++-- tasks/uploader/base.py | 9 ++-- tasks/uploader/drilling_and_construction.py | 3 +- tasks/uploader/structures.py | 3 +- tasks/uploader/uploader.py | 9 +--- .../drilling_and_construction.html | 2 +- templates/upload_session/form.html | 6 +-- terms.py | 3 ++ utilities.py | 23 ++++++++++ 21 files changed, 146 insertions(+), 47 deletions(-) create mode 100644 migrations/0083_organisation_country.py create mode 100644 static/download_template/drilling_and_construction.ods create mode 100644 static/download_template/monitoring_data.ods create mode 100644 static/download_template/wells.ods create mode 100644 terms.py diff --git a/admin/well_management.py b/admin/well_management.py index 0bcb8856..c22f2dfe 100644 --- a/admin/well_management.py +++ b/admin/well_management.py @@ -24,12 +24,21 @@ def rerun_cache(modeladmin, request, queryset): generate_data_organisation_cache(organisation_id=org.id) +def reassign_wells_country(modeladmin, request, queryset): + for org in queryset.filter(country__isnull=False): + org.well_set.all().update(country=org.country) + + class OrganisationAdmin(admin.ModelAdmin): - list_display = ('name', 'active') + list_display = ('name', 'active', 'country', 'well_number') list_editable = ('active',) - actions = (rerun_cache,) + list_filter = ('country',) + actions = (rerun_cache, reassign_wells_country) form = OrganisationFormAdmin + def well_number(self, org: Organisation): + return org.well_set.all().count() + def fetch(modeladmin, request, queryset): for user in User.objects.exclude( diff --git a/forms/organisation.py b/forms/organisation.py index 60fd5adf..86c056b0 100644 --- a/forms/organisation.py +++ b/forms/organisation.py @@ -23,7 +23,9 @@ class OrganisationFormAdmin(forms.ModelForm): class Meta: model = Organisation - fields = ('name', 'description', 'admin_users', 'editor_users') + fields = ( + 'name', 'country', 'description', 'admin_users', 'editor_users' + ) def __init__(self, *args, **kwargs): forms.ModelForm.__init__(self, *args, **kwargs) diff --git a/forms/uploader/csv_well_form.py b/forms/uploader/csv_well_form.py index 5911ec77..98101088 100644 --- a/forms/uploader/csv_well_form.py +++ b/forms/uploader/csv_well_form.py @@ -17,19 +17,25 @@ class CsvWellForm(forms.Form): gw_well_file = forms.FileField( label=_("General information"), - widget=forms.FileInput(attrs={'class': 'form-control'}), - required=False + widget=forms.FileInput( + attrs={'class': 'form-control', 'accept': '.ods'} + ), + required=False, ) gw_well_monitoring_file = forms.FileField( label=_("Monitoring data"), - widget=forms.FileInput(attrs={'class': 'form-control'}), + widget=forms.FileInput( + attrs={'class': 'form-control', 'accept': '.ods'} + ), required=False ) gw_well_drilling_and_construction_file = forms.FileField( label=_("Drilling and donstruction data"), - widget=forms.FileInput(attrs={'class': 'form-control'}), + widget=forms.FileInput( + attrs={'class': 'form-control', 'accept': '.ods'} + ), required=False ) diff --git a/migrations/0083_organisation_country.py b/migrations/0083_organisation_country.py new file mode 100644 index 00000000..27b43e63 --- /dev/null +++ b/migrations/0083_organisation_country.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.20 on 2024-04-17 08:48 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('gwml2', '0082_views'), + ] + + operations = [ + migrations.AddField( + model_name='organisation', + name='country', + field=models.ForeignKey(blank=True, help_text="Identify the country of the organisation. It is being used to assign well's country under this organisation. If this is empty, all well under this organisation will be assigned based on geometry of country.", null=True, on_delete=django.db.models.deletion.SET_NULL, to='gwml2.country'), + ), + ] diff --git a/models/upload_session.py b/models/upload_session.py index 0193a752..55fe6283 100644 --- a/models/upload_session.py +++ b/models/upload_session.py @@ -18,6 +18,7 @@ from gwml2.models.metadata.license_metadata import LicenseMetadata from gwml2.models.well import Well from gwml2.models.well_management.organisation import Organisation +from gwml2.utilities import ods_to_xlsx, xlsx_to_ods UPLOAD_SESSION_CATEGORY_WELL_UPLOAD = 'well_upload' UPLOAD_SESSION_CATEGORY_MONITORING_UPLOAD = 'well_monitoring_upload' @@ -283,7 +284,7 @@ def run(self, restart: bool = False): def create_report_excel(self): """Created excel that will contain reports.""" - _file = self.upload_file.path + _file = ods_to_xlsx(self.upload_file.path) _report_file = _file.replace('.xls', '.report.xls') if os.path.exists(_report_file): os.remove(_report_file) @@ -308,6 +309,11 @@ def create_report_excel(self): row_status.update_sheet(worksheet, status_column_idx) workbook.save(_report_file) os.chmod(_report_file, 0o0777) + xlsx_to_ods(_report_file) + + # Delete files + os.remove(_file) + os.remove(_report_file) RowStatus = [ diff --git a/models/well.py b/models/well.py index 783db8d9..cb5ee142 100644 --- a/models/well.py +++ b/models/well.py @@ -125,7 +125,15 @@ class Meta: def assign_country(self, force=False): """Assign country to the well.""" from gwml2.models.general_information import Country - if not self.country or force: + # Autoassign with organisation country + if ( + self.organisation and self.organisation.country and + self.organisation.country != self.country + ): + self.country = self.organisation.country + self.save() + # Check country from the geometry + elif not self.country or force: country = Country.objects.filter( geometry__contains=self.location ).first() diff --git a/models/well_management/organisation.py b/models/well_management/organisation.py index 53acf5c1..95902b1c 100644 --- a/models/well_management/organisation.py +++ b/models/well_management/organisation.py @@ -1,6 +1,8 @@ from django.contrib.gis.db import models from django.contrib.postgres.fields import ArrayField +from gwml2.models.general import Country + class Organisation(models.Model): """ Organisation @@ -25,6 +27,17 @@ class Organisation(models.Model): editors = ArrayField( models.IntegerField(), default=list, null=True) + country = models.ForeignKey( + Country, null=True, blank=True, on_delete=models.SET_NULL, + help_text=( + 'Identify the country of the organisation. ' + "It is being used to assign well's country under " + "this organisation. " + 'If this is empty, all well under this organisation ' + 'will be assigned based on geometry of country.' + ) + ) + class Meta: db_table = 'organisation' ordering = ['name'] diff --git a/static/download_template/drilling_and_construction.ods b/static/download_template/drilling_and_construction.ods new file mode 100644 index 0000000000000000000000000000000000000000..82d26bef7994c2074fb651fd8cb1dd5345fd1398 GIT binary patch literal 12458 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 QFrHr{&+}R@)33Y#1%uA(X8-^I literal 0 HcmV?d00001 diff --git a/static/download_template/drilling_and_construction.xlsx b/static/download_template/drilling_and_construction.xlsx index 8bc9ba503e7cc8eabfd3cc73e4f3641034126ed7..55ecfe0e15ee3c03c79b35500d7f0531ad90a941 100644 GIT binary patch delta 3588 zcmZu!c{r497oWi}n6Vp!5;J4p8GFfC%9>^DyX^a#C1vso$!=unwMAr0G{{nfhF1v5 zlCn$ot?b(;UDsQE-*^A>JkRx<-?`6y&iS4DoF3hJU8tTGDH#(03oT*9ar-R(6K)v##GIwm?hHPZfy>Q^owMS8DEaETsCAX?`uK>!-`o%y=T_mq_Y^E zw>BC2NW}n-?Xfg@0!lU9aRiZEsyF183N}(O!I@CG6j1}PelqJXt1Jw7)FZ^OClOrV zvI;9x79Nq=vC)CD*c_fw8@oQw_!`%yg-uc^TVxbY4pa@%{7e*F5q+!S(s0>O{7N+H zi6tq_{GWlZv+R$_1@p5Qc?-x7OJqD$j_)LqBgLU??rqc&_~Vsl&tMzY0^3$pDtkOe zDY$P*@EdhbD)~``Cz~E_k8)h|EoMTxRC#o{T3}Z4U-6f`%$%q^CWFOTYimPo8(Z%> zOzVi_o&xFZ&@md3jl4?DUW z-%QIJ1mPH8x5_Ydl5MhmzhaI1OnW8bKJWZnQsb<)+KC9k6PhtTVbDo8-BBEE28lJV z;R_5IHg`bXRuNoOV7b zmcMT4j%8d+DXE`0#m>pfmq({Bf{CX;>_QgrKt%WFKZv;8-@A6=LX{VmTeA95s;nQK znCIFJy4;3A_@;E;s31OmaOVmT7(9e-#1V4ptM62lwnzGIzLSWVCt(tps~M(ps72X@ z7SK88(oN8VwQClAr^Y1Zi%lc6`vf_!ccHqi_8z#17dDaS$ZSu#Qb#qdZBJ=;XDpA) zQ@7rxkwubfx17uN=-D7Wy*bEP$~T7de4pT_s$d2$(-Gb8N7hJdXLk-Na7Tn zE&WuLrabtmY`h8c7RnBVmxSr2q_SC*MPWil`__CVX;SJ|bE>bNu4eWSxEjg(OQRr`veE!%aoBY*S>%@10v z(kivuoKnIT`imBzv${)Yg2epdg%|y=4?G7HgSUa9fk1pJjNd-0L^e8t zmojFZIkA@2>1_&FJNd75M@>Jo=daqGH;5!FT!Ruh=J!kj3#X~cg`473|I*4SwthoE zR0pOpdi$j~!?GDoquz8$p8(#-pDDbJiYBQBrn3E< zayeW-PtVfQekQuQN$!16>Alt)bf!TgSNzXI7ReijlTR{J=82^a4;vIk$_Nr2l%-ZK zK>0(?Dow8EcHZY8BIHLKl?GH){;@U7mFKo6hng`MO)V~&7Y3In&llnD$j}dZPPRDB zXOmTCgqOcR93;V}c9}y9o*G^hLt`ehc8Hj#AvIN#wnk&ehNOnR5T_sHdeFDC{=v=ot_VkcsjJ~oW*Fz{DrP&NhK z6^^0&7-dVV{6IQxKTMDbM=h+I6Wbg@5*~^8O9=V5)jAmHj98j3_in{l1BGdQx=GGWqR@bbh5tIhARGQYJKn=&hG7 zKEfn~S#8Nba#Dq%J%QM#uE!dEuUQ(e~0u!&T{%diOtrDRJmUL$;d+3R

l<| zXi?C1z1({h1tb`oSnqn6#k5c9GL&%CF*g#57VaZ8a!#S%Y|m5N53@kzBDC11Cd7}v$OqPN7KDlSwM@N-0NaD2NIdQCj^uFzB|C5gsE z*v-{BOTKV08tHyNKV1uUq8?MauS&r-XRZsw2&Y{fcvbho-ild)eoKINzi=nfjYF8e zH>M(izud^tk<90M3Mx+)D~OowH*yS%n^_v$*fQ-7KKCh%;hMT9M5W86XRvM+QZ#s3 zA~yF2`OE%c%W^#>Kjb&^|Kxr#o6uR)MHpt!B00Mp137qbtzt~KcT9wCPmIQgk5tkV zZM9M2B>lU_ja|iFRs(6zaNaT_hlr-J(02>#crUAlO1);^sJWWB^erg2WH?s+YK4H6 z#F9a_J#iOD(FMGE7ve*i=GZM^$-ZCeugcpM7nJ5!5Zlf<1E=D{m`Aj6zOgZEr?N^3%fW^-F092ITSbrlEYnJyJ_hhWK&O0%m}sw~rs zbSKozX}PP^pH}A?5>sfZu|g!=yJ>;a5`!AhYK_er&fa(Yoo3nzees9e>tWX6>BM|f z*q{fpM|R6bXKXm}#4bl5!dujMU=OQbBujhfN;Y9x*!;sa zTD_{Uw|f8p;Nhu%{%q>px%7V~a5Lih&+#DuB@I0tBTWBo1o1CWVrQwnh+@B(NeTc2 zdx-i6gm^gmiv)Xm=xG5-m;nDyA*R1yl_9x;jEDaWaZU#L((1H*Z3hERjrx7H;vexK zaX+;F$`k;A{&x|89R~p5;BBwx=k4P!YVYmm`2S9L>dk+hN%sewk@GjWosZA|qR-<^ vZ=Id*Y*WLcI delta 3527 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ℜ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 {% include "groundwater_form/well_chart.html" %} {% include "groundwater_form/_many-to-many.html" with id='water_strike' title=_('Water Strike') theform=water_strike help_text='' delete='yes' %} {% include "groundwater_form/_many-to-many.html" with id='stratigraphic_log' title=_('Stratigraphic Log') theform=stratigraphic_log help_text='' delete='yes' %} - {% include "groundwater_form/_many-to-many.html" with id='structure' title=_('Design') theform=structure thedata=structures help_text='' delete='yes' %} + {% include "groundwater_form/_many-to-many.html" with id='structure' title=_('Construction') theform=structure thedata=structures help_text='' delete='yes' %}

diff --git a/templates/upload_session/form.html b/templates/upload_session/form.html index 113e04e5..772573e1 100644 --- a/templates/upload_session/form.html +++ b/templates/upload_session/form.html @@ -46,7 +46,7 @@ {% trans "This batch upload file contains three sheets: General Information, Hydrogeology and Management. Use a different row for each well (or other data point). Use the fields below to assign a license and additional restrictions. These will apply to all the wells contained in the upload file." %}

- + {% trans "Download the batch upload file template." %}
@@ -77,7 +77,7 @@ {% trans "This batch upload file contains three sheets: Groundwater Level, Groundwater Quality and Abstraction-Discharge. Use a different row for each measurement." %}

- + {% trans "Download the batch upload file template." %}
@@ -94,7 +94,7 @@ {% trans "This batch upload file contains four sheets: Drilling, Water Strike, Stratigraphic Log and Construction. In the first sheet Drilling, use a different row for each well (or other data point). The other sheets accept multiple rows per well: multiple water strikes, multiple stratigraphic layers, and multiple construction parts." %}

- + {% trans "Download the batch upload file template." %} diff --git a/terms.py b/terms.py new file mode 100644 index 00000000..61d17708 --- /dev/null +++ b/terms.py @@ -0,0 +1,3 @@ +class SheetName: + drilling_and_construction = 'Drilling' + structure = 'Construction' diff --git a/utilities.py b/utilities.py index ba139d17..bcaf635b 100644 --- a/utilities.py +++ b/utilities.py @@ -1,4 +1,6 @@ import math +import os +import subprocess import typing from typing import List @@ -136,3 +138,24 @@ def make_aware_local(time): return make_aware(time) except (ValueError, AttributeError): return time + + +def xlsx_to_ods(filename): + """Convert xlsx to ods.""" + subprocess.call( + [ + 'soffice', '--headless', '--invisible', '--convert-to', 'ods', + filename, '--outdir', os.path.dirname(filename) + ] + ) + + +def ods_to_xlsx(filename): + """Convert xlsx to ods.""" + subprocess.call( + [ + 'soffice', '--headless', '--invisible', '--convert-to', 'xlsx', + filename, '--outdir', os.path.dirname(filename) + ] + ) + return filename.replace('.ods', '.xlsx')