From a26310767ba885bcb403e08f8060f045e4716e08 Mon Sep 17 00:00:00 2001 From: Martin Green Date: Sun, 1 May 2011 19:32:41 +0100 Subject: edit logbooks, new logbook format, increased database normalisation --- core/views_logbooks.py | 96 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 90 insertions(+), 6 deletions(-) (limited to 'core/views_logbooks.py') diff --git a/core/views_logbooks.py b/core/views_logbooks.py index 1cdffff..cb7de3a 100644 --- a/core/views_logbooks.py +++ b/core/views_logbooks.py @@ -1,14 +1,18 @@ from django.shortcuts import render_to_response -from troggle.core.models import Expedition, Person, PersonExpedition, PersonTrip, LogbookEntry +from troggle.core.models import Expedition, Person, PersonExpedition, PersonTrip, LogbookEntry, SurvexBlock import troggle.core.models as models import troggle.settings as settings import django.db.models from troggle.parsers.logbooks import LoadLogbookForExpedition from troggle.parsers.people import GetPersonExpeditionNameLookup -from troggle.core.forms import PersonForm +from troggle.core.forms import PersonForm, getTripForm from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect, HttpResponse +from django.template import Context, loader from utils import render_with_context +import os.path +import troggle.parsers.logbooks as logbookparsers +from django.template.defaultfilters import slugify # Django uses Context, not RequestContext when you call render_to_response. We always want to use RequestContext, so that django adds the context from settings.TEMPLATE_CONTEXT_PROCESSORS. This way we automatically get necessary settings variables passed to each template. So we use a custom method, render_response instead of render_to_response. Hopefully future Django releases will make this unnecessary. @@ -47,18 +51,23 @@ def expedition(request, expeditionname): expedition = Expedition.objects.get(year=int(expeditionname)) expeditions = Expedition.objects.all() personexpeditiondays = [ ] + dateditems = list(expedition.logbookentry_set.all()) + list(expedition.survexblock_set.all()) + dates = list(set([item.date for item in dateditems])) + dates.sort() for personexpedition in expedition.personexpedition_set.all(): prow = [ ] - for expeditionday in expedition.expeditionday_set.all(): - pcell = { "persontrips":expeditionday.persontrip_set.filter(personexpedition=personexpedition) } - pcell["survexblocks"] = set([survexpersonrole.survexblock for survexpersonrole in expeditionday.survexpersonrole_set.filter(personexpedition=personexpedition)]) + for date in dates: + pcell = { "persontrips": PersonTrip.objects.filter(personexpedition=personexpedition, + logbook_entry__date=date) } + pcell["survexblocks"] = set(SurvexBlock.objects.filter(survexpersonrole__personexpedition=personexpedition, + date = date)) prow.append(pcell) personexpeditiondays.append({"personexpedition":personexpedition, "personrow":prow}) message = "" if "reload" in request.GET: message = LoadLogbookForExpedition(expedition) - return render_with_context(request,'expedition.html', {'expedition': expedition, 'expeditions':expeditions, 'personexpeditiondays':personexpeditiondays, 'message':message, 'settings':settings }) + return render_with_context(request,'expedition.html', {'expedition': expedition, 'expeditions':expeditions, 'personexpeditiondays':personexpeditiondays, 'message':message, 'settings':settings, 'dateditems': dateditems }) def get_absolute_url(self): return ('expedition', (expedition.year)) @@ -154,3 +163,78 @@ def experimental(request): totalsurvexlength = sum([survexleg.tape for survexleg in survexlegs]) return render_with_context(request, 'experimental.html', { "nsurvexlegs":len(survexlegs), "totalsurvexlength":totalsurvexlength, "legsbyexpo":legsbyexpo }) +def newLogbookEntry(request, expeditionyear, pdate = None, pslug = None): + expedition = Expedition.objects.get(year=expeditionyear) + PersonTripFormSet, TripForm = getTripForm(expedition) + if pslug and pdate: + previousdate = datetime.date(*[int(x) for x in pdate.split("-")]) + previouslbe = LogbookEntry.objects.get(slug = pslug, date = previousdate, expedition__year = year) + assert previouslbe.filename + if request.method == 'POST': # If the form has been submitted... + tripForm = TripForm(request.POST) # A form bound to the POST data + personTripFormSet = PersonTripFormSet(request.POST) + dateStr = tripForm.cleaned_data["date"].strftime("%Y-%m-%d") + directory = os.path.join(settings.EXPOWEB, + "years", + expedition.year, + "autologbook") + filename = os.path.join(directory, + dateStr + "." + slugify(tripForm.cleaned_data["title"])[:50] + ".html") + if tripForm.is_valid() and personTripFormSet.is_valid(): # All validation rules pass + if not os.path.isdir(directory): + os.mkdir(directory) + if pslug and pdate: + delLogbookEntry(previouslbe) + f = open(filename, "w") + template = loader.get_template('dataformat/logbookentry.html') + context = Context({'trip': tripForm.cleaned_data, + 'persons': personTripFormSet.cleaned_data, + 'date': dateStr, + 'expeditionyear': expeditionyear}) + f.write(template.render(context)) + f.close() + print logbookparsers.parseAutoLogBookEntry(filename) + return HttpResponseRedirect(reverse('expedition', args=[expedition.year])) # Redirect after POST + else: + if slug and date: + if lbe.cave: + tripForm = TripForm(date = previousdate, + title = previouslbe.title, + cave = previouslbe.cave.reference(), + location = None, + caveOrLocation = "cave", + html = previouslbe.text) + else: + tripForm = TripForm(date = previousdate, + title = previouslbe.title, + cave = None, + location = previouslbe.location, + caveOrLocation = "location", + html = previouslbe.text) + personTripFormSet = PersonTripFormSet(initial=[{"name": py.personexpedition.name(), + "TU": py.time_underground, + "author": py.is_logbook_entry_author} + for py in previouslbe.persontrip_set.all()]) + else: + tripForm = TripForm() # An unbound form + personTripFormSet = PersonTripFormSet() + + return render_with_context(request, 'newlogbookentry.html', { + 'tripForm': tripForm, + 'personTripFormSet': personTripFormSet, + + }) + +def deleteLogbookEntry(request, expeditionyear, date = None, slug = None): + expedition = Expedition.objects.get(year=expeditionyear) + previousdate = datetime.date(*[int(x) for x in pdate.split("-")]) + previouslbe = LogbookEntry.objects.get(slug = pslug, date = previousdate, expedition__year = year) + delLogbookEntry(previouslbe) + return HttpResponseRedirect(reverse('expedition', args=[expedition.year])) # Redirect after POST + +def delLogbookEntry(lbe): + for pt in lbe.persontrip_set.all(): + pt.delete() + lbe.delete() + os.delete(lbe.filename) + -- cgit v1.2.3