Coverage for shps/forms.py: 75%
80 statements
« prev ^ index » next coverage.py v7.6.0, created at 2024-07-27 11:19 +0000
« prev ^ index » next coverage.py v7.6.0, created at 2024-07-27 11:19 +0000
1import glob
2import os
4from django import forms
5from django.conf import settings
6from django.core.exceptions import ValidationError
8from crispy_forms.helper import FormHelper
9from crispy_forms.layout import Submit, Layout
10from crispy_bootstrap5.bootstrap5 import BS5Accordion
11from crispy_forms.bootstrap import AccordionGroup
13from leaflet.forms.widgets import LeafletWidget
15from .models import TempSpatial, Source
16from .process_upload import import_shapes, unzip_shapes
19class WhereWasForm(forms.Form):
20 lat = forms.FloatField(required=True)
21 lng = forms.FloatField(required=True)
22 when = forms.DateField(required=False)
24 def __init__(self, *args, **kwargs):
25 super(WhereWasForm, self).__init__(*args, **kwargs)
26 self.helper = FormHelper()
27 self.helper.form_tag = True
28 self.helper.form_class = "form-horizontal"
29 self.helper.label_class = "col-md-3"
30 self.helper.field_class = "col-md-9"
31 self.helper.add_input(
32 Submit("submit", "submit"),
33 )
36class SourceForm(forms.ModelForm):
37 import_shapes = forms.BooleanField(
38 required=False,
39 initial=False,
40 label="Import/Update related shapes?",
41 help_text="Would you like to import or update the realted shapes?",
42 )
44 class Meta:
45 model = Source
46 fields = "__all__"
48 def __init__(self, *args, **kwargs):
49 super(SourceForm, self).__init__(*args, **kwargs)
50 self.helper = FormHelper()
51 self.helper.form_tag = True
52 self.helper.form_class = "form-horizontal"
53 self.helper.label_class = "col-md-3"
54 self.helper.field_class = "col-md-9"
55 self.helper.add_input(
56 Submit("submit", "save"),
57 )
59 def save(self, commit=True):
60 # make sure the temp folder is clean
61 [os.remove(f) for f in glob.glob(os.path.join(settings.TEMP_DIR, "*.*"))]
62 instance = super(SourceForm, self).save(commit=True)
63 if self.cleaned_data["import_shapes"]:
64 uploaded_file = instance.upload
65 temp_dir = settings.TEMP_DIR
66 shapefiles = unzip_shapes(uploaded_file.path, temp_dir)
67 try:
68 import_shapes(shapefiles, instance)
69 except Exception as e:
70 [
71 os.remove(f)
72 for f in glob.glob(os.path.join(settings.TEMP_DIR, "*.*"))
73 ]
74 raise ValidationError(e)
76 # remove unzipped files
77 [os.remove(f) for f in glob.glob(os.path.join(settings.TEMP_DIR, "*.*"))]
79 return instance
82class SourceFilterFormHelper(FormHelper):
83 def __init__(self, *args, **kwargs):
84 super(SourceFilterFormHelper, self).__init__(*args, **kwargs)
85 self.helper = FormHelper()
86 self.form_class = "genericFilterForm"
87 self.form_method = "GET"
88 self.form_tag = False
89 self.layout = Layout(
90 BS5Accordion(
91 AccordionGroup("Basic Search", "name", css_id="basic_search_fields"),
92 AccordionGroup(
93 "Advanced search",
94 "description",
95 css_id="extended",
96 ),
97 always_open=True,
98 ),
99 )
102class TempSpatialForm(forms.ModelForm):
103 class Meta:
104 model = TempSpatial
105 fields = "__all__"
106 widgets = {
107 "geom": LeafletWidget(),
108 }
110 def __init__(self, *args, **kwargs):
111 super(TempSpatialForm, self).__init__(*args, **kwargs)
112 self.helper = FormHelper()
113 self.helper.form_tag = True
114 self.helper.form_class = "form-horizontal"
115 self.helper.label_class = "col-md-3"
116 self.helper.field_class = "col-md-9"
117 self.helper.add_input(
118 Submit("submit", "save"),
119 )
122class TempSpatialFilterFormHelper(FormHelper):
123 def __init__(self, *args, **kwargs):
124 super(TempSpatialFilterFormHelper, self).__init__(*args, **kwargs)
125 self.helper = FormHelper()
126 self.form_class = "genericFilterForm"
127 self.form_method = "GET"
128 self.form_tag = False
129 self.layout = Layout(
130 BS5Accordion(
131 AccordionGroup(
132 "Basic Search",
133 "all_name",
134 "name",
135 "alt_name",
136 css_id="basic_search_fields",
137 ),
138 AccordionGroup(
139 "Advanced search",
140 "start_date",
141 "end_date",
142 "administrative_unit",
143 "source",
144 css_id="extended",
145 ),
146 always_open=True,
147 )
148 )