diff options
author | Martin Green <martin.speleo@gmail.com> | 2012-06-10 14:59:21 +0100 |
---|---|---|
committer | Martin Green <martin.speleo@gmail.com> | 2012-06-10 14:59:21 +0100 |
commit | 711fefb0da7b4a744c71f3d1648d3398c401f4fc (patch) | |
tree | d3fbeeb25593d70bb276f0173807490f7ba91d1d /core | |
parent | fd12e70f7818f42f7f569576369dec287fec7ccc (diff) | |
download | troggle-711fefb0da7b4a744c71f3d1648d3398c401f4fc.tar.gz troggle-711fefb0da7b4a744c71f3d1648d3398c401f4fc.tar.bz2 troggle-711fefb0da7b4a744c71f3d1648d3398c401f4fc.zip |
Start to change dataformat for caves, along with there editing. Start to change survex reader to cope better with equates/tags.
Diffstat (limited to 'core')
-rw-r--r-- | core/forms.py | 26 | ||||
-rw-r--r-- | core/models.py | 96 | ||||
-rw-r--r-- | core/models_survex.py | 18 | ||||
-rw-r--r-- | core/views_caves.py | 82 |
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()]}) |