summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/forms.py26
-rw-r--r--core/models.py96
-rw-r--r--core/models_survex.py18
-rw-r--r--core/views_caves.py82
4 files changed, 161 insertions, 61 deletions
diff --git a/core/forms.py b/core/forms.py
index c38a699..939f64f 100644
--- a/core/forms.py
+++ b/core/forms.py
@@ -1,8 +1,7 @@
from django.forms import ModelForm
from models import Cave, Person, PersonExpedition, LogbookEntry, QM, Expedition, Entrance, CaveAndEntrance
import django.forms as forms
-from django.forms.formsets import formset_factory
-from django.forms.models import formset_factory
+from django.forms.models import modelformset_factory
from django.contrib.admin.widgets import AdminDateWidget
import string
from datetime import date
@@ -20,16 +19,23 @@ class CaveForm(ModelForm):
class Meta:
model = Cave
-class CaveAndEntranceForm(forms.Form):
- entrance = forms.ChoiceField(choices=[("", "-----")] +
- [(x.slug, x.slug)
- for x
- in Entrance.objects.all()])
- entrance_letter = forms.CharField(max_length=20)
- non_public = forms.BooleanField()
+class VersionControlCommentForm(forms.Form):
+ description_of_change = forms.CharField(required = True, widget=forms.Textarea())
-CaveAndEntranceFormSet = formset_factory(CaveAndEntranceForm)
+class EntranceForm(ModelForm):
+ #underground_description = forms.CharField(required = False, widget=TinyMCE(attrs={'cols': 80, 'rows': 30}))
+ #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}))
+ class Meta:
+ model = Entrance
+
+CaveAndEntranceFormSet = modelformset_factory(CaveAndEntrance, exclude=('cave'))
class EntranceForm(ModelForm):
class Meta:
diff --git a/core/models.py b/core/models.py
index c82f448..7b301f5 100644
--- a/core/models.py
+++ b/core/models.py
@@ -10,6 +10,8 @@ from django.conf import settings
from decimal import Decimal, getcontext
from django.core.urlresolvers import reverse
from imagekit.models import ImageModel
+from django.template import Context, loader
+import settings
getcontext().prec=2 #use 2 significant figures for decimal calculations
from models_survex import *
@@ -339,16 +341,21 @@ class Area(TroggleModel):
elif self.parent:
return self.parent.kat_area()
-class CaveAndEntrance(TroggleModel):
+class CaveAndEntrance(models.Model):
cave = models.ForeignKey('Cave')
entrance = models.ForeignKey('Entrance')
entrance_letter = models.CharField(max_length=20,blank=True,null=True)
def __unicode__(self):
return unicode(self.cave) + unicode(self.entrance_letter)
+class CaveSlug(models.Model):
+ cave = models.ForeignKey('Cave')
+ slug = models.SlugField(max_length=50, unique = True)
+ primary = models.BooleanField()
+
+
class Cave(TroggleModel):
- # too much here perhaps
- slug = models.SlugField(max_length=50, unique = True)
+ # too much here perhaps,
official_name = models.CharField(max_length=160)
area = models.ManyToManyField(Area, blank=True, null=True)
kataster_code = models.CharField(max_length=20,blank=True,null=True)
@@ -369,6 +376,7 @@ class Cave(TroggleModel):
survex_file = models.CharField(max_length=100,blank=True,null=True)
description_file = models.CharField(max_length=200,blank=True,null=True)
url = models.CharField(max_length=200,blank=True,null=True)
+ filename = models.CharField(max_length=200)
#class Meta:
# unique_together = (("area", "kataster_number"), ("area", "unofficial_number"))
@@ -377,6 +385,15 @@ class Cave(TroggleModel):
#href = models.CharField(max_length=100)
+ def slug(self):
+ primarySlugs = self.caveslug_set.filter(primary = True)
+ if primarySlugs:
+ return primarySlugs[0].slug
+ else:
+ slugs = self.caveslug_set.filter()
+ if slugs:
+ return slugs[0].slug
+
def reference(self):
if self.kataster_number:
return "%s-%s" % (self.kat_area(), self.kataster_number)
@@ -393,17 +410,8 @@ class Cave(TroggleModel):
#return settings.URL_ROOT + '/cave/' + href + '/'
return urlparse.urljoin(settings.URL_ROOT, reverse('cave',kwargs={'cave_id':href,}))
- def __unicode__(self):
- if self.kataster_number:
- if self.kat_area():
- return self.kat_area() + u": " + self.kataster_number
- else:
- return unicode("l") + u": " + self.kataster_number
- else:
- if self.kat_area():
- return self.kat_area() + u": " + self.unofficial_number
- else:
- return self.unofficial_number
+ def __unicode__(self, sep = u": "):
+ return unicode(self.slug())
def get_QMs(self):
return QM.objects.filter(found_by__cave=self)
@@ -451,6 +459,17 @@ class Cave(TroggleModel):
else:
res += "–" + prevR
return res
+
+ def writeDataFile(self):
+ f = open(os.path.join(settings.CAVEDESCRIPTIONS, self.filename), "w")
+ t = loader.get_template('dataformat/cave.xml')
+ c = Context({'cave': self})
+ u = t.render(c)
+ u8 = u.encode("utf-8")
+ f.write(u8)
+ f.close()
+
+
def getCaveByReference(reference):
areaname, code = reference.split("-", 1)
@@ -467,10 +486,13 @@ class OtherCaveName(TroggleModel):
cave = models.ForeignKey(Cave)
def __unicode__(self):
return unicode(self.name)
-
+
+class EntranceSlug(models.Model):
+ entrance = models.ForeignKey('Entrance')
+ slug = models.SlugField(max_length=50, unique = True)
+ primary = models.BooleanField()
class Entrance(TroggleModel):
- slug = models.SlugField(max_length=50, unique = True)
name = models.CharField(max_length=100, blank=True,null=True)
entrance_description = models.TextField(blank=True,null=True)
explorers = models.TextField(blank=True,null=True)
@@ -501,19 +523,17 @@ class Entrance(TroggleModel):
alt = models.TextField(blank=True, null=True)
northing = models.TextField(blank=True, null=True)
easting = models.TextField(blank=True, null=True)
- tag_station = models.TextField()
- exact_station = models.TextField()
- other_station = models.TextField()
+ tag_station = models.TextField(blank=True, null=True)
+ exact_station = models.TextField(blank=True, null=True)
+ other_station = models.TextField(blank=True, null=True)
other_description = models.TextField(blank=True,null=True)
bearings = models.TextField(blank=True,null=True)
+ url = models.CharField(max_length=200,blank=True,null=True)
+ filename = models.CharField(max_length=200)
+ cached_primary_slug = models.CharField(max_length=200,blank=True,null=True)
+
def __unicode__(self):
- a = CaveAndEntrance.objects.filter(entrance = self)
- name = u''
- if self.name:
- name = unicode(self.name) + u' '
- if len(a) == 1:
- return name + unicode(a[0])
- return name + unicode(a)
+ return unicode(self.slug())
def marking_val(self):
for m in self.MARKING_CHOICES:
if m[0] == self.marking:
@@ -523,6 +543,8 @@ class Entrance(TroggleModel):
if f[0] == self.findability:
return f[1]
+ def tag(self):
+ return SurvexStation.objects.lookup(self.tag_station)
def get_absolute_url(self):
@@ -535,6 +557,28 @@ class Entrance(TroggleModel):
return res
+ def slug(self):
+ if not self.cached_primary_slug:
+ primarySlugs = self.entranceslug_set.filter(primary = True)
+ if primarySlugs:
+ self.cached_primary_slug = primarySlugs[0].slug
+ self.save()
+ else:
+ slugs = self.entranceslug_set.filter()
+ if slugs:
+ self.cached_primary_slug = slugs[0].slug
+ self.save()
+ return self.cached_primary_slug
+
+ def writeDataFile(self):
+ f = open(os.path.join(settings.ENTRANCEDESCRIPTIONS, self.filename), "w")
+ t = loader.get_template('dataformat/entrance.xml')
+ c = Context({'entrance': self})
+ u = t.render(c)
+ u8 = u.encode("utf-8")
+ f.write(u8)
+ f.close()
+
class CaveDescription(TroggleModel):
short_name = models.CharField(max_length=50, unique = True)
long_name = models.CharField(max_length=200, blank=True, null=True)
diff --git a/core/models_survex.py b/core/models_survex.py
index 1bf75ef..b726d59 100644
--- a/core/models_survex.py
+++ b/core/models_survex.py
@@ -56,16 +56,27 @@ class SurvexStationLookUpManager(models.Manager):
def lookup(self, name):
blocknames, sep, stationname = name.rpartition(".")
return self.get(block = SurvexBlock.objects.lookup(blocknames),
- name = stationname)
+ name__iexact = stationname)
class SurvexStation(models.Model):
- name = models.CharField(max_length=20)
+ name = models.CharField(max_length=100)
block = models.ForeignKey('SurvexBlock')
equate = models.ForeignKey('SurvexEquate', blank=True, null=True)
objects = SurvexStationLookUpManager()
x = models.FloatField(blank=True, null=True)
y = models.FloatField(blank=True, null=True)
z = models.FloatField(blank=True, null=True)
+
+ def path(self):
+ r = self.name
+ b = self.block
+ while True:
+ if b.name:
+ r = b.name + "." + r
+ if b.parent:
+ b = b.parent
+ else:
+ return r
class SurvexLeg(models.Model):
block = models.ForeignKey('SurvexBlock')
@@ -85,7 +96,7 @@ class SurvexBlockLookUpManager(models.Manager):
blocknames = name.split(".")
block = SurvexBlock.objects.get(parent=None, survexfile__path="all")
for blockname in blocknames:
- block = SurvexBlock.objects.get(parent=block, name=blockname)
+ block = SurvexBlock.objects.get(parent=block, name__iexact=blockname)
return block
class SurvexBlock(models.Model):
@@ -131,6 +142,7 @@ class SurvexBlock(models.Model):
if ssl:
assert len(ssl) == 1
return ssl[0]
+ #print name
ss = SurvexStation(name=name, block=self)
ss.save()
return ss
diff --git a/core/views_caves.py b/core/views_caves.py
index 8dc2ebe..d8ced23 100644
--- a/core/views_caves.py
+++ b/core/views_caves.py
@@ -1,10 +1,10 @@
from troggle.core.models import Cave, CaveAndEntrance, Survey, Expedition, QM, CaveDescription, Entrance
-from troggle.core.forms import CaveForm, CaveAndEntranceFormSet
+from troggle.core.forms import CaveForm, CaveAndEntranceFormSet, VersionControlCommentForm, EntranceForm
import troggle.core.models as models
import troggle.settings as settings
from troggle.helper import login_required_if_public
-from django.forms.models import formset_factory
+from django.forms.models import modelformset_factory
from django import forms
from django.core.urlresolvers import reverse
from utils import render_with_context # see views_logbooks for explanation on this.
@@ -21,12 +21,23 @@ def getCave(cave_id):
cave = Cave.objects.get(unofficial_number=cave_id)
return cave
+def caveCmp(x, y):
+ if x.kataster_number:
+ if y.kataster_number:
+ return cmp(x.kataster_number, y.kataster_number)
+ else:
+ return -1
+ else:
+ return 1
+
def caveindex(request):
caves = Cave.objects.all()
notablecavehrefs = [ "161", "204", "258", "76" ] # could detect notability by trips and notability of people who have been down them
notablecaves = [Cave.objects.get(kataster_number=kataster_number) for kataster_number in notablecavehrefs ]
- caves1623 = Cave.objects.filter(area__short_name = "1623")
- caves1626 = Cave.objects.filter(area__short_name = "1626")
+ caves1623 = list(Cave.objects.filter(area__short_name = "1623"))
+ caves1626 = list(Cave.objects.filter(area__short_name = "1626"))
+ caves1623.sort(caveCmp)
+ caves1626.sort(caveCmp)
return render_with_context(request,'caveindex.html', {'caves1623': caves1623, 'caves1626': caves1626, 'notablecaves':notablecaves, 'cavepage': True})
def cave(request, cave_id='', offical_name=''):
@@ -37,33 +48,33 @@ def cave(request, cave_id='', offical_name=''):
return render_with_context(request,'cave.html', {'cave': cave, 'cavepage': True})
def caveEntrance(request, slug):
- cave = Cave.objects.get(slug = slug)
+ cave = Cave.objects.get(caveslug__slug = slug)
if cave.non_public and settings.PUBLIC_SITE and not request.user.is_authenticated():
return render_with_context(request,'nonpublic.html', {'instance': cave})
else:
return render_with_context(request,'cave_entrances.html', {'cave': cave})
def caveDescription(request, slug):
- cave = Cave.objects.get(slug = slug)
+ cave = Cave.objects.get(caveslug__slug = slug)
if cave.non_public and settings.PUBLIC_SITE and not request.user.is_authenticated():
return render_with_context(request,'nonpublic.html', {'instance': cave})
else:
return render_with_context(request,'cave_uground_description.html', {'cave': cave})
def caveQMs(request, slug):
- cave = Cave.objects.get(slug = slug)
+ cave = Cave.objects.get(caveslug__slug = slug)
if cave.non_public and settings.PUBLIC_SITE and not request.user.is_authenticated():
return render_with_context(request,'nonpublic.html', {'instance': cave})
else:
return render_with_context(request,'cave_qms.html', {'cave': cave})
def caveLogbook(request, slug):
- cave = Cave.objects.get(slug = slug)
+ cave = Cave.objects.get(caveslug__slug = slug)
if cave.non_public and settings.PUBLIC_SITE and not request.user.is_authenticated():
return render_with_context(request,'nonpublic.html', {'instance': cave})
else:
return render_with_context(request,'cave_logbook.html', {'cave': cave})
def caveSlug(request, slug):
- cave = Cave.objects.get(slug = slug)
+ cave = Cave.objects.get(caveslug__slug = slug)
if cave.non_public and settings.PUBLIC_SITE and not request.user.is_authenticated():
return render_with_context(request,'nonpublic.html', {'instance': cave, 'cave_editable': slug})
else:
@@ -71,22 +82,49 @@ def caveSlug(request, slug):
@login_required_if_public
def edit_cave(request, slug=None):
- cave = Cave.objects.get(slug = slug)
+ cave = Cave.objects.get(caveslug__slug = slug)
if request.POST:
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():
+ cave = form.save()
+ ceinsts = ceFormSet.save(commit=False)
+ for ceinst in ceinsts:
+ ceinst.cave = cave
+ ceinst.save()
+ cave.writeDataFile()
+ return HttpResponseRedirect("/" + cave.url)
else:
form = CaveForm(instance=cave)
- i = [{"entrance": x.entrance.slug,
- "entrance_letter": x.entrance_letter,
- "non_public": x.non_public}
- for x
- in cave.caveandentrance_set.all()]
- ceFormSet = CaveAndEntranceFormSet(initial=i)
+ ceFormSet = CaveAndEntranceFormSet(queryset=cave.caveandentrance_set.all())
+ versionControlForm = VersionControlCommentForm()
+
return render_with_context(request,
'editcave2.html',
{'form': form,
- 'caveAndEntranceFormSet': ceFormSet
+ 'caveAndEntranceFormSet': ceFormSet,
+ 'versionControlForm': versionControlForm
+ })
+
+@login_required_if_public
+def editEntrance(request, slug=None):
+ entrance = Entrance.objects.get(entranceslug__slug = slug)
+ if request.POST:
+ form = EntranceForm(request.POST, instance = entrance)
+ versionControlForm = VersionControlCommentForm(request.POST)
+ if form.is_valid() and versionControlForm.is_valid():
+ entrance = form.save()
+ entrance.writeDataFile()
+ return HttpResponseRedirect("/" + entrance.url)
+ else:
+ form = EntranceForm(instance = entrance)
+ versionControlForm = VersionControlCommentForm()
+
+ return render_with_context(request,
+ 'editentrance.html',
+ {'form': form,
+ 'versionControlForm': versionControlForm
})
def qm(request,cave_id,qm_id,year,grade=None):
@@ -111,7 +149,7 @@ def ent(request, cave_id, ent_letter):
'letter': cave_and_ent.entrance_letter,})
def entranceSlug(request, slug):
- entrance = Entrance.objects.get(slug = slug)
+ entrance = Entrance.objects.get(entranceslug__slug = slug)
if entrance.non_public and not request.user.is_authenticated():
return render_with_context(request,'nonpublic.html', {'instance': entrance})
else:
@@ -148,9 +186,9 @@ def cave_description(request, cavedescription_name):
return render_with_context(request,'cave_description.html', locals())
def get_entrances(request, caveslug):
- cave = Cave.objects.get(slug = caveslug)
- return render_with_context(request,'options.html', {"items": [(e.entrance.slug, e.entrance.slug) for e in cave.entrances()]})
+ cave = Cave.objects.get(caveslug__slug = caveslug)
+ return render_with_context(request,'options.html', {"items": [(e.entrance.slug(), e.entrance.slug()) for e in cave.entrances()]})
def get_qms(request, caveslug):
- cave = Cave.objects.get(slug = caveslug)
- return render_with_context(request,'options.html', {"items": [(e.entrance.slug, e.entrance.slug) for e in cave.entrances()]})
+ cave = Cave.objects.get(caveslug__slug = caveslug)
+ return render_with_context(request,'options.html', {"items": [(e.entrance.slug(), e.entrance.slug()) for e in cave.entrances()]})