Coverage for shps/forms.py: 75%

80 statements  

« prev     ^ index     » next       coverage.py v7.6.0, created at 2024-07-27 11:19 +0000

1import glob 

2import os 

3 

4from django import forms 

5from django.conf import settings 

6from django.core.exceptions import ValidationError 

7 

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 

12 

13from leaflet.forms.widgets import LeafletWidget 

14 

15from .models import TempSpatial, Source 

16from .process_upload import import_shapes, unzip_shapes 

17 

18 

19class WhereWasForm(forms.Form): 

20 lat = forms.FloatField(required=True) 

21 lng = forms.FloatField(required=True) 

22 when = forms.DateField(required=False) 

23 

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 ) 

34 

35 

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 ) 

43 

44 class Meta: 

45 model = Source 

46 fields = "__all__" 

47 

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 ) 

58 

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) 

75 

76 # remove unzipped files 

77 [os.remove(f) for f in glob.glob(os.path.join(settings.TEMP_DIR, "*.*"))] 

78 

79 return instance 

80 

81 

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 ) 

100 

101 

102class TempSpatialForm(forms.ModelForm): 

103 class Meta: 

104 model = TempSpatial 

105 fields = "__all__" 

106 widgets = { 

107 "geom": LeafletWidget(), 

108 } 

109 

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 ) 

120 

121 

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 )