forked from expo/troggle
8f66837f6f
Fix the expeditions list Improvements to make it compatiable with django 1.8 Bump the years to add 2018 Update the .hgignore file to ignore junk
271 lines
12 KiB
Python
271 lines
12 KiB
Python
from django.shortcuts import render_to_response
|
|
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 getTripForm#, get_name, PersonForm
|
|
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
|
|
from troggle.helper import login_required_if_public
|
|
import datetime
|
|
|
|
from django.views.generic.list import ListView
|
|
from django.utils import timezone
|
|
|
|
|
|
# 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.
|
|
# from troggle.alwaysUseRequestContext import render_response
|
|
|
|
import re
|
|
|
|
@django.db.models.permalink #this allows the nice get_absolute_url syntax we are using
|
|
|
|
def getNotablePersons():
|
|
notablepersons = []
|
|
for person in Person.objects.all():
|
|
if person.bisnotable():
|
|
notablepersons.append(person)
|
|
return notablepersons
|
|
|
|
|
|
def personindex(request):
|
|
persons = Person.objects.all()
|
|
# From what I can tell, "persons" seems to be the table rows, while "personss" is the table columns. - AC 16 Feb 09
|
|
personss = [ ]
|
|
ncols = 4
|
|
nc = (len(persons) + ncols - 1) / ncols
|
|
for i in range(ncols):
|
|
personss.append(persons[i * nc: (i + 1) * nc])
|
|
|
|
notablepersons = []
|
|
for person in Person.objects.all():
|
|
if person.bisnotable():
|
|
notablepersons.append(person)
|
|
|
|
return render_with_context(request,'personindex.html', {'persons': persons, 'personss':personss, 'notablepersons':notablepersons, })
|
|
|
|
|
|
def expedition(request, expeditionname):
|
|
this_expedition = Expedition.objects.get(year=int(expeditionname))
|
|
expeditions = Expedition.objects.all()
|
|
personexpeditiondays = [ ]
|
|
dateditems = list(this_expedition.logbookentry_set.all()) + list(this_expedition.survexblock_set.all())
|
|
dates = list(set([item.date for item in dateditems]))
|
|
dates.sort()
|
|
for personexpedition in this_expedition.personexpedition_set.all():
|
|
prow = [ ]
|
|
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, 'dateditems': dateditems })
|
|
|
|
class ExpeditionListView(ListView):
|
|
|
|
model = Expedition
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(ExpeditionListView, self).get_context_data(**kwargs)
|
|
context['now'] = timezone.now()
|
|
return context
|
|
|
|
def get_absolute_url(self):
|
|
return ('expedition', (expedition.year))
|
|
|
|
|
|
def person(request, first_name='', last_name='', ):
|
|
this_person = Person.objects.get(first_name = first_name, last_name = last_name)
|
|
|
|
# This is for removing the reference to the user's profile, in case they set it to the wrong person
|
|
if request.method == 'GET':
|
|
if request.GET.get('clear_profile')=='True':
|
|
this_person.user=None
|
|
this_person.save()
|
|
return HttpResponseRedirect(reverse('profiles_select_profile'))
|
|
|
|
return render_with_context(request,'person.html', {'person': this_person, })
|
|
|
|
|
|
def GetPersonChronology(personexpedition):
|
|
res = { }
|
|
for persontrip in personexpedition.persontrip_set.all():
|
|
a = res.setdefault(persontrip.date, { })
|
|
a.setdefault("persontrips", [ ]).append(persontrip)
|
|
|
|
for personrole in personexpedition.survexpersonrole_set.all():
|
|
a = res.setdefault(personrole.survexblock.date, { })
|
|
a.setdefault("personroles", [ ]).append(personrole.survexblock)
|
|
|
|
# build up the tables
|
|
rdates = res.keys()
|
|
rdates.sort()
|
|
|
|
|
|
res2 = [ ]
|
|
for rdate in rdates:
|
|
persontrips = res[rdate].get("persontrips", [])
|
|
personroles = res[rdate].get("personroles", [])
|
|
for n in range(max(len(persontrips), len(personroles))):
|
|
res2.append(((n == 0 and rdate or "--"), (n < len(persontrips) and persontrips[n]), (n < len(personroles) and personroles[n])))
|
|
|
|
return res2
|
|
|
|
|
|
def personexpedition(request, first_name='', last_name='', year=''):
|
|
person = Person.objects.get(first_name = first_name, last_name = last_name)
|
|
this_expedition = Expedition.objects.get(year=year)
|
|
personexpedition = person.personexpedition_set.get(expedition=this_expedition)
|
|
personchronology = GetPersonChronology(personexpedition)
|
|
return render_with_context(request,'personexpedition.html', {'personexpedition': personexpedition, 'personchronology':personchronology})
|
|
|
|
|
|
def logbookentry(request, date, slug):
|
|
this_logbookentry = LogbookEntry.objects.filter(date=date, slug=slug)
|
|
|
|
if len(this_logbookentry)>1:
|
|
return render_with_context(request, 'object_list.html',{'object_list':this_logbookentry})
|
|
else:
|
|
this_logbookentry=this_logbookentry[0]
|
|
return render_with_context(request, 'logbookentry.html', {'logbookentry': this_logbookentry})
|
|
|
|
|
|
def logbookSearch(request, extra):
|
|
query_string = ''
|
|
found_entries = None
|
|
if ('q' in request.GET) and request.GET['q'].strip():
|
|
query_string = request.GET['q']
|
|
entry_query = search.get_query(query_string, ['text','title',])
|
|
found_entries = LogbookEntry.objects.filter(entry_query)
|
|
|
|
return render_with_context(request,'logbooksearch.html',
|
|
{ 'query_string': query_string, 'found_entries': found_entries, })
|
|
#context_instance=RequestContext(request))
|
|
|
|
def personForm(request,pk):
|
|
person=Person.objects.get(pk=pk)
|
|
form=PersonForm(instance=person)
|
|
return render_with_context(request,'personform.html', {'form':form,})
|
|
|
|
|
|
def experimental(request):
|
|
legsbyexpo = [ ]
|
|
for expedition in Expedition.objects.all():
|
|
survexblocks = expedition.survexblock_set.all()
|
|
survexlegs = [ ]
|
|
survexleglength = 0.0
|
|
for survexblock in survexblocks:
|
|
survexlegs.extend(survexblock.survexleg_set.all())
|
|
survexleglength += survexblock.totalleglength
|
|
legsbyexpo.append((expedition, {"nsurvexlegs":len(survexlegs), "survexleglength":survexleglength}))
|
|
legsbyexpo.reverse()
|
|
|
|
survexlegs = models.SurvexLeg.objects.all()
|
|
totalsurvexlength = sum([survexleg.tape for survexleg in survexlegs])
|
|
return render_with_context(request, 'experimental.html', { "nsurvexlegs":len(survexlegs), "totalsurvexlength":totalsurvexlength, "legsbyexpo":legsbyexpo })
|
|
|
|
@login_required_if_public
|
|
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 = expedition)
|
|
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)
|
|
if tripForm.is_valid() and personTripFormSet.is_valid(): # All validation rules pass
|
|
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 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 pslug and pdate:
|
|
if previouslbe.cave:
|
|
tripForm = TripForm(initial={"date": previousdate,
|
|
"title": previouslbe.title,
|
|
"cave": previouslbe.cave.reference(),
|
|
"location": None,
|
|
"caveOrLocation": "cave",
|
|
"html": previouslbe.text})
|
|
else:
|
|
tripForm = TripForm(initial={"date": previousdate,
|
|
"title": previouslbe.title,
|
|
"cave": None,
|
|
"location": previouslbe.place,
|
|
"caveOrLocation": "location",
|
|
"html": previouslbe.text})
|
|
personTripFormSet = PersonTripFormSet(initial=[{"name": get_name(py.personexpedition),
|
|
"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,
|
|
|
|
})
|
|
|
|
@login_required_if_public
|
|
def deleteLogbookEntry(request, expeditionyear, date = None, slug = None):
|
|
expedition = Expedition.objects.get(year=expeditionyear)
|
|
previousdate = datetime.date(*[int(x) for x in date.split("-")])
|
|
previouslbe = LogbookEntry.objects.get(slug = slug, date = previousdate, expedition = expedition)
|
|
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.remove(lbe.filename)
|
|
|
|
def get_people(request, expeditionslug):
|
|
exp = Expedition.objects.get(year = expeditionslug)
|
|
return render_with_context(request,'options.html', {"items": [(pe.slug, pe.name) for pe in exp.personexpedition_set.all()]})
|
|
|
|
def get_logbook_entries(request, expeditionslug):
|
|
exp = Expedition.objects.get(year = expeditionslug)
|
|
return render_with_context(request,'options.html', {"items": [(le.slug, "%s - %s" % (le.date, le.title)) for le in exp.logbookentry_set.all()]})
|
|
|