import string from datetime import date import django.forms as forms from django.forms import ModelForm from django.forms.models import modelformset_factory from django.contrib.admin.widgets import AdminDateWidget #from tinymce.widgets import TinyMCE from troggle.core.models.troggle import Person, PersonExpedition, Expedition from troggle.core.models.caves import Cave, LogbookEntry, QM, Entrance, CaveAndEntrance from troggle.core.views.editor_helpers import HTMLarea '''These are all the class-based Forms used by troggle. There are other, simpler, upload forms in view/uploads.py Some are not used and need renovating or destroying. ''' todo = ''' ''' class CaveForm(ModelForm): '''Only those fields for which we want to override defaults are listed here the other fields are present on the form, but use the default presentation style ''' official_name = forms.CharField(required = False, widget=forms.TextInput(attrs={'size': '45'})) underground_description = forms.CharField(required = False, widget=HTMLarea( attrs={"height":"80%", "rows":20, 'placeholder': "Enter page content (using HTML)"})) explorers = forms.CharField(required = False, widget=HTMLarea( attrs={"height":"80%", "rows":20, 'placeholder': "Enter page content (using HTML)"})) equipment = forms.CharField(required = False, widget=HTMLarea( attrs={"height":"80%", "rows":20, 'placeholder': "Enter page content (using HTML)"})) survey = forms.CharField(required = False, widget=HTMLarea( attrs={"height":"80%", "rows":20, 'placeholder': "Enter page content (using HTML)"})) #survey = forms.CharField(required = False, widget=TinyMCE(attrs={'cols': 80, 'rows': 10})) kataster_status = forms.CharField(required = False) underground_centre_line = forms.CharField(required = False, widget=HTMLarea( attrs={"height":"80%", "rows":20, 'placeholder': "Enter page content (using HTML)"})) notes = forms.CharField(required = False, widget=HTMLarea( attrs={"height":"80%", "rows":20, 'placeholder': "Enter page content (using HTML)"})) references = forms.CharField(required = False, widget=HTMLarea( attrs={"height":"80%", "rows":20, 'placeholder': "Enter page content (using HTML)"})) description_file = forms.CharField(required = False, widget=forms.TextInput(attrs={'size': '45'})) survex_file = forms.CharField(required = False, label="Survex file [caves-1623/000/000.svx]", widget=forms.TextInput(attrs={'size': '45'})) url = forms.CharField(required = True, label="URL [1623/000/000]", widget=forms.TextInput(attrs={'size': '45'})) length = forms.CharField(required = False, label="Length (m)") depth = forms.CharField(required = False, label="Depth (m)") extent = forms.CharField(required = False, label="Extent (m)") class Meta: model = Cave exclude = ("filename",) def clean(self): if self.cleaned_data.get("kataster_number") == "" and self.cleaned_data.get("unofficial_number") == "": self._errors["unofficial_number"] = self.error_class(["Either the kataster or unoffical number is required."]) # if self.cleaned_data.get("kataster_number") != "" and self.cleaned_data.get("official_name") == "": # self._errors["official_name"] = self.error_class(["This field is required when there is a kataster number."]) if self.cleaned_data.get("area") == []: self._errors["area"] = self.error_class(["This field is required."]) if self.cleaned_data.get("url") and self.cleaned_data.get("url").startswith("/"): self._errors["url"] = self.error_class(["This field cannot start with a /."]) return self.cleaned_data class EntranceForm(ModelForm): '''Only those fields for which we want to override defaults are listed here the other fields are present on the form, but use the default presentaiton style ''' name = forms.CharField(required = False, widget=forms.TextInput(attrs={'size': '45'})) entrance_description = forms.CharField(required = False, widget=HTMLarea( attrs={"height":"80%", "rows":20, 'placeholder': "Enter page content (using HTML)"})) explorers = forms.CharField(required = False, widget=forms.TextInput(attrs={'size': '45'})) #explorers = forms.CharField(required = False, widget=TinyMCE(attrs={'cols': 80, 'rows': 10})) map_description = forms.CharField(required = False, widget=HTMLarea( attrs={"height":"80%", "rows":20, 'placeholder': "Enter page content (using HTML)"})) location_description = forms.CharField(required = False, widget=HTMLarea( attrs={"height":"80%", "rows":20, 'placeholder': "Enter page content (using HTML)"})) approach = forms.CharField(required = False, widget=HTMLarea( attrs={"height":"80%", "rows":20, 'placeholder': "Enter page content (using HTML)"})) underground_description = forms.CharField(required = False, widget=HTMLarea( attrs={"height":"80%", "rows":20, 'placeholder': "Enter page content (using HTML)"})) photo = forms.CharField(required = False, widget=HTMLarea( attrs={"height":"80%", "rows":20, 'placeholder': "Enter page content (using HTML)"})) marking_comment = forms.CharField(required = False, widget=HTMLarea( attrs={"height":"80%", "rows":20, 'placeholder': "Enter page content (using HTML)"})) findability_description = forms.CharField(required = False, widget=HTMLarea( attrs={"height":"80%", "rows":20, 'placeholder': "Enter page content (using HTML)"})) other_description = forms.CharField(required = False, widget=HTMLarea( attrs={"height":"80%", "rows":20, 'placeholder': "Enter page content (using HTML)"})) bearings = forms.CharField(required = False, widget=HTMLarea( attrs={"height":"80%", "rows":20, 'placeholder': "Enter page content (using HTML)"})) other_station = forms.CharField(required=False) tag_station = forms.CharField(required=False) exact_station = forms.CharField(required=False) northing = forms.CharField(required=False) easting = forms.CharField(required=False) lat_wgs84 = forms.CharField(required=False, widget=forms.TextInput(attrs={'size': '10'}), label="Latitude (WSG84)") long_wgs84 = forms.CharField(required=False, widget=forms.TextInput(attrs={'size': '10'}), label="Longitude (WSG84)") alt = forms.CharField(required=False, label="Altitude (m)") url = forms.CharField(required = False, label="URL [usually blank]", widget=forms.TextInput(attrs={'size': '45'})) class Meta: model = Entrance exclude = ("cached_primary_slug", "filename",) def clean(self): if self.cleaned_data.get("url").startswith("/"): self._errors["url"] = self.error_class(["This field cannot start with a /."]) return self.cleaned_data # This next line is called from the templates/edit_cave2.html template. # This is sufficient to create an entire entry for for the cave fields automatically # http://localhost:8000/cave/new/ # using django built-in Deep Magic. https://docs.djangoproject.com/en/3.2/topics/forms/modelforms/ # for forms which map directly onto a Django Model CaveAndEntranceFormSet = modelformset_factory(CaveAndEntrance, exclude=('cave',)) class EntranceLetterForm(ModelForm): '''Form to link entrances to caves, along with an entrance number. Nb. The relationship between caves and entrances has historically been a many to many relationship. With entrances gaining new caves and letters when caves are joined. ''' class Meta: model = CaveAndEntrance exclude = ('cave', 'entrance') def full_clean(self): super(EntranceLetterForm, self).full_clean() try: self.instance.validate_unique() except forms.ValidationError as e: self._update_errors(e)