mirror of
https://expo.survex.com/repositories/troggle/.git
synced 2024-11-25 08:41:51 +00:00
Cave and Entrance forms tuned to user needs
This commit is contained in:
parent
54d98f58f3
commit
d8b1d59b12
@ -16,20 +16,29 @@ Some are not used and need renovating or destroying.
|
||||
'''
|
||||
|
||||
class CaveForm(ModelForm):
|
||||
underground_description = forms.CharField(required = False, widget=forms.Textarea())
|
||||
explorers = forms.CharField(required = False, widget=forms.Textarea())
|
||||
equipment = forms.CharField(required = False, widget=forms.Textarea())
|
||||
survey = forms.CharField(required = False, widget=forms.Textarea())
|
||||
kataster_status = forms.CharField(required = False, widget=forms.Textarea())
|
||||
underground_centre_line = forms.CharField(required = False, widget=forms.Textarea())
|
||||
notes = forms.CharField(required = False, widget=forms.Textarea())
|
||||
references = forms.CharField(required = False, widget=forms.Textarea())
|
||||
url = forms.CharField(required = True)
|
||||
'''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
|
||||
'''
|
||||
official_name = forms.CharField(required = False, widget=forms.TextInput(attrs={'size': '45'}))
|
||||
underground_description = forms.CharField(required = False, widget=forms.Textarea(attrs={'rows':9}))
|
||||
explorers = forms.CharField(required = False, widget=forms.Textarea(attrs={'rows':2}))
|
||||
equipment = forms.CharField(required = False, widget=forms.Textarea(attrs={'rows':2}))
|
||||
survey = forms.CharField(required = False, widget=forms.Textarea(attrs={'rows':2}))
|
||||
#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=forms.Textarea(attrs={'rows':2}))
|
||||
notes = forms.CharField(required = False, widget=forms.Textarea(attrs={'rows':2}))
|
||||
references = forms.CharField(required = False, widget=forms.Textarea(attrs={'rows':1}))
|
||||
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."])
|
||||
@ -38,44 +47,57 @@ class CaveForm(ModelForm):
|
||||
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 can not start with a /."])
|
||||
self._errors["url"] = self.error_class(["This field cannot start with a /."])
|
||||
return self.cleaned_data
|
||||
|
||||
class VersionControlCommentForm(forms.Form):
|
||||
description_of_change = forms.CharField(required = True, widget=forms.Textarea())
|
||||
'''Was appended to all forms. Not used currently
|
||||
'''
|
||||
description_of_change = forms.CharField(required = True, widget=forms.Textarea(attrs={'rows':2}))
|
||||
|
||||
|
||||
class EntranceForm(ModelForm):
|
||||
#underground_description = forms.CharField(required = False, widget=TinyMCE(attrs={'cols': 80, 'rows': 30}))
|
||||
'''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=forms.Textarea(attrs={'rows':9}))
|
||||
explorers = forms.CharField(required = False, widget=forms.TextInput(attrs={'size': '45'}))
|
||||
#explorers = forms.CharField(required = False, widget=TinyMCE(attrs={'cols': 80, 'rows': 10}))
|
||||
#equipment = forms.CharField(required = False, widget=TinyMCE(attrs={'cols': 80, 'rows': 10}))
|
||||
#survey = forms.CharField(required = False, widget=TinyMCE(attrs={'cols': 80, 'rows': 10}))
|
||||
#kataster_status = forms.CharField(required = False, widget=TinyMCE(attrs={'cols': 80, 'rows': 10}))
|
||||
#underground_centre_line = forms.CharField(required = False, widget=TinyMCE(attrs={'cols': 80, 'rows': 10}))
|
||||
#notes = forms.CharField(required = False, widget=TinyMCE(attrs={'cols': 80, 'rows': 10}))
|
||||
#references = forms.CharField(required = False, widget=TinyMCE(attrs={'cols': 80, 'rows': 10}))
|
||||
other_station = forms.CharField(required=False) # Trying to change this to a single line entry
|
||||
tag_station = forms.CharField(required=False) # Trying to change this to a single line entry
|
||||
exact_station = forms.CharField(required=False) # Trying to change this to a single line entry
|
||||
northing = forms.CharField(required=False) # Trying to change this to a single line entry
|
||||
easting = forms.CharField(required=False) # Trying to change this to a single line entry
|
||||
alt = forms.CharField(required=False) # Trying to change this to a single line entry
|
||||
map_description = forms.CharField(required = False, widget=forms.Textarea(attrs={'rows':3}))
|
||||
location_description = forms.CharField(required = False, widget=forms.Textarea(attrs={'rows':3}))
|
||||
approach = forms.CharField(required = False, widget=forms.Textarea(attrs={'rows':3}))
|
||||
underground_description = forms.CharField(required = False, widget=forms.Textarea(attrs={'rows':3}))
|
||||
photo = forms.CharField(required = False, widget=forms.Textarea(attrs={'rows':2}))
|
||||
marking_comment = forms.CharField(required = False, widget=forms.Textarea(attrs={'rows':2}))
|
||||
findability_description = forms.CharField(required = False, widget=forms.Textarea(attrs={'rows':2}))
|
||||
other_description = forms.CharField(required = False, widget=forms.Textarea(attrs={'rows':2}))
|
||||
bearings = forms.CharField(required = False, widget=forms.Textarea(attrs={'rows':2}))
|
||||
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)
|
||||
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 can not start with a /."])
|
||||
self._errors["url"] = self.error_class(["This field cannot start with a /."])
|
||||
return self.cleaned_data
|
||||
|
||||
|
||||
# This next is called from the templates/edit_cave2.html template.
|
||||
# This is sufficeint to create an entire entry for for the cave fields automatically
|
||||
# http://localhost:8000/cave/new/
|
||||
# using django built-in stuff:
|
||||
# using django built-in Deep magic. https://docs.djangoproject.com/en/2.2/topics/forms/modelforms/
|
||||
CaveAndEntranceFormSet = modelformset_factory(CaveAndEntrance, exclude=('cave',))
|
||||
|
||||
class EntranceLetterForm(ModelForm):
|
||||
'''Can't see what this does at all
|
||||
'''
|
||||
class Meta:
|
||||
model = CaveAndEntrance
|
||||
exclude = ('cave', 'entrance')
|
||||
@ -120,7 +142,7 @@ def get_name(pe):
|
||||
return pe.person.first_name
|
||||
|
||||
class UploadFileForm(forms.Form):
|
||||
"""Only called by views.others.newFile() whhich seems to be only about logbook files.
|
||||
"""Only called by views.others.newFile() which seems to be only about logbook files.
|
||||
"""
|
||||
# Because this has EXECUTABLE statements in its signature (the fields) they get
|
||||
# executed when this module is LOADED. Which barfs horribly.
|
||||
|
@ -182,16 +182,17 @@ class Cave(TroggleModel):
|
||||
|
||||
def writeDataFile(self):
|
||||
try:
|
||||
f = open(os.path.join(settings.CAVEDESCRIPTIONS, self.filename), "wb")
|
||||
f = open(os.path.join(settings.CAVEDESCRIPTIONS, self.filename), "w")
|
||||
except:
|
||||
subprocess.call(settings.FIX_PERMISSIONS)
|
||||
f = open(os.path.join(settings.CAVEDESCRIPTIONS, self.filename), "wb")
|
||||
f = open(os.path.join(settings.CAVEDESCRIPTIONS, self.filename), "w")
|
||||
t = loader.get_template('dataformat/cave.xml')
|
||||
#c = Context({'cave': self})
|
||||
c = dict({'cave': self})
|
||||
u = t.render(c)
|
||||
u8 = u.encode("utf-8")
|
||||
f.write(u8)
|
||||
# u8 = u.encode("utf-8")
|
||||
# f.write(u8)
|
||||
f.write(u)
|
||||
f.close()
|
||||
|
||||
def getArea(self):
|
||||
@ -350,10 +351,11 @@ class Entrance(TroggleModel):
|
||||
subprocess.call(settings.FIX_PERMISSIONS)
|
||||
f = open(os.path.join(settings.ENTRANCEDESCRIPTIONS, self.filename), "w")
|
||||
t = loader.get_template('dataformat/entrance.xml')
|
||||
c = Context({'entrance': self})
|
||||
c = dict({'entrance': self})
|
||||
u = t.render(c)
|
||||
u8 = u.encode("utf-8")
|
||||
f.write(u8)
|
||||
# u8 = u.encode("utf-8")
|
||||
# f.write(u8)
|
||||
f.write(u)
|
||||
f.close()
|
||||
|
||||
class LogbookEntry(TroggleModel):
|
||||
@ -641,10 +643,10 @@ def GetCaveLookup():
|
||||
Gcavelookup["2015-mf-06"] = Gcavelookup["288"]
|
||||
Gcavelookup["2016-jb-01"] = Gcavelookup["289"]
|
||||
Gcavelookup["2017-pw-01"] = Gcavelookup["277"]
|
||||
Gcavelookup["2018-dm-07"] = Gcavelookup["359"]
|
||||
Gcavelookup["2017_cucc_24"] = Gcavelookup["291"] # note _ not - here
|
||||
Gcavelookup["2017_cucc_23"] = Gcavelookup["295"]
|
||||
Gcavelookup["2017_cucc_28"] = Gcavelookup["290"]
|
||||
Gcavelookup["2018-dm-07"] = Gcavelookup["359"] # NB this is 1626
|
||||
Gcavelookup["2017_cucc_24"] = Gcavelookup["291"] # note _ not -
|
||||
Gcavelookup["2017_cucc_23"] = Gcavelookup["295"] # note _ not -
|
||||
Gcavelookup["2017_cucc_28"] = Gcavelookup["290"] # note _ not -
|
||||
Gcavelookup["bs17"] = Gcavelookup["283"]
|
||||
|
||||
Gcavelookup["1976/b11"] = Gcavelookup["198"]
|
||||
@ -679,12 +681,14 @@ def GetCaveLookup():
|
||||
Gcavelookup["gsh"] = Gcavelookup["291"]
|
||||
|
||||
Gcavelookup["homecoming"] = Gcavelookup["2018-dm-07"]
|
||||
Gcavelookup["heimkommen"] = Gcavelookup["2018-dm-07"]
|
||||
Gcavelookup["99ob02"] = Gcavelookup["1999-ob-02"]
|
||||
|
||||
addmore = {}
|
||||
for id in Gcavelookup:
|
||||
addmore[id.replace("-","_")] = Gcavelookup[id]
|
||||
addmore[id.replace("_","-")] = Gcavelookup[id]
|
||||
addmore[id.upper()] = Gcavelookup[id]
|
||||
Gcavelookup = {**addmore, **Gcavelookup}
|
||||
|
||||
addmore ={}
|
||||
|
@ -152,7 +152,7 @@ def cave3d(request, cave_id=''):
|
||||
try:
|
||||
cave = getCave(cave_id)
|
||||
except ObjectDoesNotExist:
|
||||
return None
|
||||
return HttpResponseNotFound
|
||||
except Cave.MultipleObjectsReturned:
|
||||
# But only one might have survex data? So scan and return the first that works.
|
||||
caves = getCaves(cave_id)
|
||||
@ -337,7 +337,10 @@ def caveLogbook(request, slug):
|
||||
def edit_cave(request, slug=None):
|
||||
'''This is the form that edits all the cave data and writes out an XML file in the :expoweb: repo folder
|
||||
The format for the file being saved is in templates/dataformat/cave.xml
|
||||
|
||||
It does save the data into into the database directly, not by parsing the file.
|
||||
'''
|
||||
message = ""
|
||||
if slug is not None:
|
||||
cave = Cave.objects.get(caveslug__slug = slug)
|
||||
else:
|
||||
@ -346,7 +349,8 @@ def edit_cave(request, slug=None):
|
||||
form = CaveForm(request.POST, instance=cave)
|
||||
ceFormSet = CaveAndEntranceFormSet(request.POST)
|
||||
versionControlForm = VersionControlCommentForm(request.POST)
|
||||
if form.is_valid() and ceFormSet.is_valid() and versionControlForm.is_valid():
|
||||
if form.is_valid() and ceFormSet.is_valid():
|
||||
#print(f'! POST is valid. {cave}')
|
||||
cave = form.save(commit = False)
|
||||
if slug is None:
|
||||
for a in form.cleaned_data["area"]:
|
||||
@ -370,20 +374,30 @@ def edit_cave(request, slug=None):
|
||||
ceinst.save()
|
||||
cave.writeDataFile()
|
||||
return HttpResponseRedirect("/" + cave.url)
|
||||
else:
|
||||
message = f'! POST data is INVALID {cave}'
|
||||
print(message)
|
||||
else:
|
||||
form = CaveForm(instance=cave)
|
||||
ceFormSet = CaveAndEntranceFormSet(queryset=cave.caveandentrance_set.all())
|
||||
versionControlForm = VersionControlCommentForm()
|
||||
#versionControlForm = VersionControlCommentForm()
|
||||
|
||||
return render(request,
|
||||
'editcave2.html',
|
||||
{'form': form,
|
||||
{'form': form, 'cave': cave, 'message': message,
|
||||
'caveAndEntranceFormSet': ceFormSet,
|
||||
'versionControlForm': versionControlForm
|
||||
#'versionControlForm': versionControlForm
|
||||
})
|
||||
|
||||
@login_required_if_public
|
||||
def editEntrance(request, caveslug, slug=None):
|
||||
'''This is the form that edits the entrance data for a single entrance and writes out
|
||||
an XML file in the :expoweb: repo folder
|
||||
The format for the file being saved is in templates/dataformat/entrance.xml
|
||||
|
||||
It does save the data into into the database directly, not by parsing the file.
|
||||
'''
|
||||
message = ""
|
||||
cave = Cave.objects.get(caveslug__slug = caveslug)
|
||||
if slug is not None:
|
||||
entrance = Entrance.objects.get(entranceslug__slug = slug)
|
||||
@ -391,12 +405,12 @@ def editEntrance(request, caveslug, slug=None):
|
||||
entrance = Entrance()
|
||||
if request.POST:
|
||||
form = EntranceForm(request.POST, instance = entrance)
|
||||
versionControlForm = VersionControlCommentForm(request.POST)
|
||||
#versionControlForm = VersionControlCommentForm(request.POST)
|
||||
if slug is None:
|
||||
entletter = EntranceLetterForm(request.POST)
|
||||
else:
|
||||
entletter = None
|
||||
if form.is_valid() and versionControlForm.is_valid() and (slug is not None or entletter.is_valid()):
|
||||
if form.is_valid() and (slug is not None or entletter.is_valid()):
|
||||
entrance = form.save(commit = False)
|
||||
if slug is None:
|
||||
slugname = cave.slug() + entletter.cleaned_data["entrance_letter"]
|
||||
@ -412,17 +426,20 @@ def editEntrance(request, caveslug, slug=None):
|
||||
el.save()
|
||||
entrance.writeDataFile()
|
||||
return HttpResponseRedirect("/" + cave.url)
|
||||
else:
|
||||
message = f'! POST data is INVALID {cave}'
|
||||
print(message)
|
||||
else:
|
||||
form = EntranceForm(instance = entrance)
|
||||
versionControlForm = VersionControlCommentForm()
|
||||
#versionControlForm = VersionControlCommentForm()
|
||||
if slug is None:
|
||||
entletter = EntranceLetterForm(request.POST)
|
||||
else:
|
||||
entletter = None
|
||||
return render(request,
|
||||
'editentrance.html',
|
||||
{'form': form,
|
||||
'versionControlForm': versionControlForm,
|
||||
{'form': form, 'cave': cave, 'message': message,
|
||||
#'versionControlForm': versionControlForm,
|
||||
'entletter': entletter
|
||||
})
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
{% extends "cavebase.html" %}
|
||||
{% load csrffaker %}
|
||||
{% block title %}Edit Cave{% endblock %}
|
||||
{% block title %}Edit Cave - {{cave.official_name|safe}} - {{cave.kataster_number}}{% endblock %}
|
||||
{% block extraheaders %}
|
||||
|
||||
<link rel="stylesheet" href="{{ settings.JSLIB_URL }}jquery-ui/css/lightness/jquery-ui.css" type="text/css" media="all" />
|
||||
@ -9,7 +8,8 @@
|
||||
<!--<script src="{{ settings.TINY_MCE_MEDIA_URL }}tiny_mce.js" type="text/javascript"></script>-->
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<h1>Edit Cave</h1>
|
||||
<h1>Edit Cave - {{cave.official_name|safe}} - {{cave.kataster_number}}</h1>
|
||||
<h2>{{message}}</h2>
|
||||
<form action="" method="post">{% csrf_token %}
|
||||
<table>{{ form }}{{caveAndEntranceFormSet}}</table>
|
||||
{{ versionControlForm }}
|
||||
|
@ -1,15 +1,18 @@
|
||||
{% extends "cavebase.html" %}
|
||||
{% load csrffaker %}
|
||||
|
||||
{% block title %}Edit Entrance{% endblock %}
|
||||
{% block extraheaders %}
|
||||
|
||||
<link rel="stylesheet" href="{{ settings.JSLIB_URL }}jquery-ui/css/lightness/jquery-ui.css" type="text/css" media="all" />
|
||||
<script src="{{ settings.JSLIB_URL }}jquery-ui/jquery-ui.min.js" type="text/javascript"></script>
|
||||
!--<script src="{{ settings.TINY_MCE_MEDIA_URL }}tiny_mce.js" type="text/javascript"></script>-->
|
||||
<!--<script src="{{ settings.TINY_MCE_MEDIA_URL }}tiny_mce.js" type="text/javascript"></script>-->
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<h1>Edit Entrance - at cave {{cave.official_name|safe}} - {{cave.kataster_number}}</h1>
|
||||
<h2>{{message}}</h2>
|
||||
<p>{{entletter}}
|
||||
<form action="" method="post">{% csrf_token %}
|
||||
<table>{{entletter}}{{ form }}</table>
|
||||
<table>{{ form }}</table>
|
||||
{{ versionControlForm }}
|
||||
<p><input type="submit" value="Submit" /></p>
|
||||
</form>
|
||||
|
Loading…
Reference in New Issue
Block a user