mirror of
https://expo.survex.com/repositories/troggle/.git
synced 2024-11-22 15:21:52 +00:00
[svn] Julian playing with the logbooks and expoyears
Copied from http://cucc@cucc.survex.com/svn/trunk/expoweb/troggle/, rev. 8180 by julian @ 1/18/2009 3:59 PM
This commit is contained in:
parent
b950ee70f7
commit
f229ff35f9
@ -18,7 +18,10 @@ user.is_superuser = True
|
|||||||
user.save()
|
user.save()
|
||||||
|
|
||||||
import parsers.cavetab
|
import parsers.cavetab
|
||||||
|
import parsers.people
|
||||||
|
parsers.people.LoadPersonsExpos()
|
||||||
import parsers.logbooks
|
import parsers.logbooks
|
||||||
|
parsers.logbooks.LoadLogbooks()
|
||||||
import parsers.QMs
|
import parsers.QMs
|
||||||
import parsers.survex
|
import parsers.survex
|
||||||
import parsers.surveys
|
import parsers.surveys
|
@ -12,8 +12,8 @@ from models_survex import *
|
|||||||
class Expedition(models.Model):
|
class Expedition(models.Model):
|
||||||
year = models.CharField(max_length=20, unique=True)
|
year = models.CharField(max_length=20, unique=True)
|
||||||
name = models.CharField(max_length=100)
|
name = models.CharField(max_length=100)
|
||||||
start_date = models.DateField(blank=True,null=True)
|
date_from = models.DateField(blank=True,null=True)
|
||||||
end_date = models.DateField(blank=True,null=True)
|
date_to = models.DateField(blank=True,null=True)
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return self.year
|
return self.year
|
||||||
@ -47,14 +47,24 @@ class Person(models.Model):
|
|||||||
blurb = models.TextField(blank=True,null=True)
|
blurb = models.TextField(blank=True,null=True)
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name_plural = "People"
|
verbose_name_plural = "People"
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
|
if self.last_name:
|
||||||
return "%s %s" % (self.first_name, self.last_name)
|
return "%s %s" % (self.first_name, self.last_name)
|
||||||
|
return self.first_name
|
||||||
|
|
||||||
|
# this should be a member entry
|
||||||
|
def href(self):
|
||||||
|
if self.last_name:
|
||||||
|
return "%s_%s" % (self.first_name.lower(), self.last_name.lower())
|
||||||
|
return self.first_name.lower()
|
||||||
|
|
||||||
|
|
||||||
class PersonExpedition(models.Model):
|
class PersonExpedition(models.Model):
|
||||||
expedition = models.ForeignKey(Expedition)
|
expedition = models.ForeignKey(Expedition)
|
||||||
person = models.ForeignKey(Person)
|
person = models.ForeignKey(Person)
|
||||||
from_date = models.DateField(blank=True,null=True)
|
date_from = models.DateField(blank=True,null=True)
|
||||||
to_date = models.DateField(blank=True,null=True)
|
date_to = models.DateField(blank=True,null=True)
|
||||||
is_guest = models.BooleanField(default=False)
|
is_guest = models.BooleanField(default=False)
|
||||||
nickname = models.CharField(max_length=100,blank=True,null=True)
|
nickname = models.CharField(max_length=100,blank=True,null=True)
|
||||||
|
|
||||||
@ -87,7 +97,12 @@ class PersonExpedition(models.Model):
|
|||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return "%s: (%s)" % (self.person, self.expedition)
|
return "%s: (%s)" % (self.person, self.expedition)
|
||||||
|
|
||||||
|
def name(self):
|
||||||
|
if self.nickname:
|
||||||
|
return "%s (%s) %s" % (self.person.first_name, self.nickname, self.person.last_name)
|
||||||
|
if self.person.last_name:
|
||||||
|
return "%s %s" % (self.person.first_name, self.person.last_name)
|
||||||
|
return self.person.first_name
|
||||||
|
|
||||||
|
|
||||||
#class LogbookSentanceRating(models.Model):
|
#class LogbookSentanceRating(models.Model):
|
||||||
@ -187,11 +202,16 @@ class Cave(models.Model):
|
|||||||
|
|
||||||
class LogbookEntry(models.Model):
|
class LogbookEntry(models.Model):
|
||||||
date = models.DateField()
|
date = models.DateField()
|
||||||
|
expedition = models.ForeignKey(Expedition,blank=True,null=True) # yes this is double-
|
||||||
author = models.ForeignKey(PersonExpedition,blank=True,null=True) # the person who writes it up doesn't have to have been on the trip
|
author = models.ForeignKey(PersonExpedition,blank=True,null=True) # the person who writes it up doesn't have to have been on the trip
|
||||||
title = models.CharField(max_length=200)
|
title = models.CharField(max_length=200)
|
||||||
cave = models.ForeignKey(Cave,blank=True,null=True)
|
cave = models.ForeignKey(Cave,blank=True,null=True)
|
||||||
place = models.CharField(max_length=100,blank=True,null=True)
|
place = models.CharField(max_length=100,blank=True,null=True)
|
||||||
text = models.TextField()
|
text = models.TextField()
|
||||||
|
|
||||||
|
logbookentry_next = models.ForeignKey('LogbookEntry', related_name='pnext', blank=True,null=True)
|
||||||
|
logbookentry_prev = models.ForeignKey('LogbookEntry', related_name='pprev', blank=True,null=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name_plural = "Logbook Entries"
|
verbose_name_plural = "Logbook Entries"
|
||||||
# several PersonTrips point in to this object
|
# several PersonTrips point in to this object
|
||||||
@ -206,10 +226,13 @@ class PersonTrip(models.Model):
|
|||||||
# possibly a trip has a plurality of triplets pointing into it
|
# possibly a trip has a plurality of triplets pointing into it
|
||||||
place = models.CharField(max_length=100)
|
place = models.CharField(max_length=100)
|
||||||
date = models.DateField()
|
date = models.DateField()
|
||||||
time_underground = models.CharField(max_length=100)
|
time_underground = models.FloatField()
|
||||||
logbook_entry = models.ForeignKey(LogbookEntry)
|
logbook_entry = models.ForeignKey(LogbookEntry)
|
||||||
is_logbook_entry_author = models.BooleanField()
|
is_logbook_entry_author = models.BooleanField()
|
||||||
|
|
||||||
|
persontrip_next = models.ForeignKey('PersonTrip', related_name='pnext', blank=True,null=True)
|
||||||
|
persontrip_prev = models.ForeignKey('PersonTrip', related_name='pprev', blank=True,null=True)
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return "%s %s (%s)" % (self.person_expedition, self.place, self.date)
|
return "%s %s (%s)" % (self.person_expedition, self.place, self.date)
|
||||||
|
|
||||||
|
@ -15,6 +15,8 @@ def weighted_choice(lst):
|
|||||||
def randomLogbookSentence():
|
def randomLogbookSentence():
|
||||||
randSent={}
|
randSent={}
|
||||||
|
|
||||||
|
# needs to handle empty logbooks without crashing
|
||||||
|
|
||||||
#Choose a random logbook entry
|
#Choose a random logbook entry
|
||||||
randSent['entry']=LogbookEntry.objects.order_by('?')[0]
|
randSent['entry']=LogbookEntry.objects.order_by('?')[0]
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
from django.shortcuts import render_to_response
|
from django.shortcuts import render_to_response
|
||||||
from troggle.expo.models import Expedition, Person, PersonExpedition, PersonTrip, LogbookEntry
|
from troggle.expo.models import Expedition, Person, PersonExpedition, PersonTrip, LogbookEntry
|
||||||
import troggle.settings as settings
|
import troggle.settings as settings
|
||||||
|
from troggle.parsers.logbooks import LoadLogbookForExpedition
|
||||||
import search
|
import search
|
||||||
import re
|
import re
|
||||||
|
|
||||||
@ -8,17 +9,33 @@ def personindex(request):
|
|||||||
persons = Person.objects.all()
|
persons = Person.objects.all()
|
||||||
return render_to_response('personindex.html', {'persons': persons, 'settings': settings})
|
return render_to_response('personindex.html', {'persons': persons, 'settings': settings})
|
||||||
|
|
||||||
def person(request, person_id, first_name, last_name):
|
def expedition(request, expeditionname):
|
||||||
if first_name == '' or last_name == '':
|
year = int(expeditionname)
|
||||||
person = Person.objects.filter(id = person_id)[0]
|
expedition = Expedition.objects.get(year=year)
|
||||||
else:
|
expedition_next = Expedition.objects.filter(year=year+1) and Expedition.objects.get(year=year+1) or None
|
||||||
person = Person.objects.filter(first_name = first_name, last_name = last_name)[0]
|
expedition_prev = Expedition.objects.filter(year=year-1) and Expedition.objects.get(year=year-1) or None
|
||||||
|
message = "No message"
|
||||||
|
if "reload" in request.GET:
|
||||||
|
message = LoadLogbookForExpedition(expedition)
|
||||||
|
|
||||||
|
logbookentries = expedition.logbookentry_set.order_by('date')
|
||||||
|
return render_to_response('expedition.html', {'expedition': expedition, 'expedition_next':expedition_next, 'expedition_prev':expedition_prev, 'logbookentries':logbookentries, 'message':message, 'settings': settings})
|
||||||
|
|
||||||
|
def person(request, name):
|
||||||
|
persons = Person.objects.all()
|
||||||
|
for person in persons:
|
||||||
|
if person.href() == name:
|
||||||
|
break
|
||||||
|
person = None
|
||||||
return render_to_response('person.html', {'person': person, 'settings': settings})
|
return render_to_response('person.html', {'person': person, 'settings': settings})
|
||||||
|
|
||||||
def logbookentry(request, logbookentry_id):
|
def logbookentry(request, logbookentry_id):
|
||||||
logbookentry = LogbookEntry.objects.filter(id = logbookentry_id)[0]
|
logbookentry = LogbookEntry.objects.filter(id = logbookentry_id)[0]
|
||||||
|
|
||||||
|
|
||||||
return render_to_response('logbookentry.html', {'logbookentry': logbookentry, 'settings': settings})
|
return render_to_response('logbookentry.html', {'logbookentry': logbookentry, 'settings': settings})
|
||||||
|
|
||||||
|
|
||||||
def logbookSearch(request, extra):
|
def logbookSearch(request, extra):
|
||||||
query_string = ''
|
query_string = ''
|
||||||
found_entries = None
|
found_entries = None
|
||||||
|
@ -3,9 +3,12 @@ from troggle.expo.models import Cave, Expedition, Person, LogbookEntry, PersonEx
|
|||||||
import troggle.settings as settings
|
import troggle.settings as settings
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
|
from troggle.parsers.people import LoadPersonsExpos
|
||||||
import re
|
import re
|
||||||
import randSent
|
import randSent
|
||||||
|
|
||||||
|
from django.core.urlresolvers import reverse
|
||||||
|
|
||||||
def stats(request):
|
def stats(request):
|
||||||
statsDict={}
|
statsDict={}
|
||||||
statsDict['expoCount'] = int(Expedition.objects.count())
|
statsDict['expoCount'] = int(Expedition.objects.count())
|
||||||
@ -15,8 +18,13 @@ def stats(request):
|
|||||||
return render_to_response('statistics.html', statsDict)
|
return render_to_response('statistics.html', statsDict)
|
||||||
|
|
||||||
def frontPage(request):
|
def frontPage(request):
|
||||||
|
message = "no test message" #reverse('personn', kwargs={"name":"hkjhjh"})
|
||||||
return render_to_response('index.html', {'randSent':randSent.randomLogbookSentence(),'settings':settings})
|
if "reload" in request.GET:
|
||||||
|
message = LoadPersonsExpos()
|
||||||
|
message = "Reloaded personexpos"
|
||||||
|
#'randSent':randSent.randomLogbookSentence(),
|
||||||
|
expeditions = Expedition.objects.all()
|
||||||
|
return render_to_response('index.html', {'expeditions':expeditions, 'settings':settings, "message":message})
|
||||||
|
|
||||||
def calendar(request,year):
|
def calendar(request,year):
|
||||||
week=['S','S','M','T','W','T','F']
|
week=['S','S','M','T','W','T','F']
|
||||||
@ -27,4 +35,3 @@ def calendar(request,year):
|
|||||||
dictToPass=locals()
|
dictToPass=locals()
|
||||||
dictToPass.update({'settings':settings})
|
dictToPass.update({'settings':settings})
|
||||||
return render_to_response('calendar.html', dictToPass)
|
return render_to_response('calendar.html', dictToPass)
|
||||||
|
|
@ -1,22 +1,42 @@
|
|||||||
|
html, body, div, span, applet, object, iframe,
|
||||||
|
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||||
|
a, abbr, acronym, address, big, cite, code,
|
||||||
|
del, dfn, em, font, img, ins, kbd, q, s, samp,
|
||||||
|
small, strike, strong, sub, sup, tt, var,
|
||||||
|
dl, dt, dd, ol, ul, li,
|
||||||
|
fieldset, form, label, legend,
|
||||||
|
table, caption, tbody, tfoot, thead, tr, th, td
|
||||||
|
{
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
outline: 0;
|
||||||
|
font-weight: inherit;
|
||||||
|
font-style: inherit;
|
||||||
|
font-size: 100%;
|
||||||
|
font-family: inherit;
|
||||||
|
vertical-align: baseline;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.caption { font-size: 8pt; margin-bottom: 0pt; }
|
.caption { font-size: 8pt; margin-bottom: 0pt; }
|
||||||
.centre { text-align: center; }
|
.centre { text-align: center; }
|
||||||
.plus2pt { font-size: 160%; }
|
.plus2pt { font-size: 160%; }
|
||||||
|
|
||||||
body, td, center, ul, p, input
|
ul
|
||||||
{
|
{
|
||||||
color: rgb(0, 0, 0);
|
list-style: none;
|
||||||
font-family: sans-serif;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
body
|
body
|
||||||
{
|
{
|
||||||
background-color: #FFFFFF;
|
background-color: white;
|
||||||
|
color: black;
|
||||||
font: 100% Verdana, Arial, Helvetica, sans-serif;
|
font: 100% Verdana, Arial, Helvetica, sans-serif;
|
||||||
Zbackground: #666666;
|
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
text-align: center;
|
margin-left: auto;
|
||||||
color: #000000;
|
margin-right: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
div#content
|
div#content
|
||||||
@ -27,6 +47,7 @@ div#content
|
|||||||
|
|
||||||
div#footer
|
div#footer
|
||||||
{
|
{
|
||||||
|
clear:both;
|
||||||
background-color:black;
|
background-color:black;
|
||||||
color:white;
|
color:white;
|
||||||
text-align:center;
|
text-align:center;
|
||||||
@ -34,6 +55,76 @@ div#footer
|
|||||||
margin-right:auto;
|
margin-right:auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div.logbookentry
|
||||||
|
{
|
||||||
|
text-align:left;
|
||||||
|
}
|
||||||
|
div.logbookentry ul.cavers
|
||||||
|
{
|
||||||
|
float:left;
|
||||||
|
padding-left:20px;
|
||||||
|
padding-right:10px;
|
||||||
|
margin-top:0px;
|
||||||
|
}
|
||||||
|
td.author
|
||||||
|
{
|
||||||
|
background-color:yellow;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.logbookentry p
|
||||||
|
{
|
||||||
|
margin:10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div#content div#col2
|
||||||
|
{
|
||||||
|
float:right;
|
||||||
|
width:33%;
|
||||||
|
background-color:#feeeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
div#content h2
|
||||||
|
{
|
||||||
|
text-align:center;
|
||||||
|
font-size:200%;
|
||||||
|
padding-bottom:30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
table.prevnextexpeditions
|
||||||
|
{
|
||||||
|
width:100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.prevnextexpeditions td
|
||||||
|
{
|
||||||
|
padding: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.expeditionpersonlist
|
||||||
|
{
|
||||||
|
width:100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.expeditionpersonlist td
|
||||||
|
{
|
||||||
|
padding: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div#content div#col1
|
||||||
|
{
|
||||||
|
width:66%;
|
||||||
|
}
|
||||||
|
table.expeditionlogbooks td
|
||||||
|
{
|
||||||
|
padding: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul#expeditionlist
|
||||||
|
{
|
||||||
|
width: 300px
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#expoHeader {
|
#expoHeader {
|
||||||
width:100%;
|
width:100%;
|
||||||
|
@ -7,120 +7,11 @@ import re
|
|||||||
import datetime
|
import datetime
|
||||||
import os
|
import os
|
||||||
|
|
||||||
persontab = open(os.path.join(settings.EXPOWEB, "noinfo", "folk.csv"))
|
|
||||||
personreader = csv.reader(persontab)
|
|
||||||
headers = personreader.next()
|
|
||||||
header = dict(zip(headers, range(len(headers))))
|
|
||||||
|
|
||||||
def LoadExpos():
|
|
||||||
models.Expedition.objects.all().delete()
|
|
||||||
years = headers[5:]
|
|
||||||
years.append("2008")
|
|
||||||
for year in years:
|
|
||||||
y = models.Expedition(year = year, name = "CUCC expo%s" % year)
|
|
||||||
y.save()
|
|
||||||
print "lll", years
|
|
||||||
|
|
||||||
def LoadPersons():
|
|
||||||
models.Person.objects.all().delete()
|
|
||||||
models.PersonExpedition.objects.all().delete()
|
|
||||||
expoers2008 = """Edvin Deadman,Kathryn Hopkins,Djuke Veldhuis,Becka Lawson,Julian Todd,Natalie Uomini,Aaron Curtis,Tony Rooke,Ollie Stevens,Frank Tully,Martin Jahnke,Mark Shinwell,Jess Stirrups,Nial Peters,Serena Povia,Olly Madge,Steve Jones,Pete Harley,Eeva Makiranta,Keith Curtis""".split(",")
|
|
||||||
expomissing = set(expoers2008)
|
|
||||||
|
|
||||||
for person in personreader:
|
|
||||||
name = person[header["Name"]]
|
|
||||||
name = re.sub("<.*?>", "", name)
|
|
||||||
mname = re.match("(\w+)(?:\s((?:van |ten )?\w+))?(?:\s\(([^)]*)\))?", name)
|
|
||||||
|
|
||||||
if mname.group(3):
|
|
||||||
nickname = mname.group(3)
|
|
||||||
else:
|
|
||||||
nickname = ""
|
|
||||||
|
|
||||||
firstname, lastname = mname.group(1), mname.group(2) or ""
|
|
||||||
|
|
||||||
print firstname, lastname, "NNN", nickname
|
|
||||||
#assert lastname == person[header[""]], person
|
|
||||||
|
|
||||||
pObject = models.Person(first_name = firstname,
|
|
||||||
last_name = lastname,
|
|
||||||
is_vfho = person[header["VfHO member"]],
|
|
||||||
)
|
|
||||||
|
|
||||||
is_guest = person[header["Guest"]] == "1" # this is really a per-expo catagory; not a permanent state
|
|
||||||
pObject.save()
|
|
||||||
parseMugShotAndBlurb(firstname, lastname, person, header, pObject)
|
|
||||||
|
|
||||||
for year, attended in zip(headers, person)[5:]:
|
|
||||||
yo = models.Expedition.objects.filter(year = year)[0]
|
|
||||||
if attended == "1" or attended == "-1":
|
|
||||||
pyo = models.PersonExpedition(person = pObject, expedition = yo, nickname=nickname, is_guest=is_guest)
|
|
||||||
pyo.save()
|
|
||||||
|
|
||||||
# error
|
|
||||||
elif (firstname, lastname) == ("Mike", "Richardson") and year == "2001":
|
|
||||||
print "Mike Richardson(2001) error"
|
|
||||||
pyo = models.PersonExpedition(person = pObject, expedition = yo, nickname=nickname, is_guest=is_guest)
|
|
||||||
pyo.save()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# this fills in those peopl for whom 2008 was their first expo
|
|
||||||
for name in expomissing:
|
|
||||||
firstname, lastname = name.split()
|
|
||||||
is_guest = name in ["Eeva Makiranta", "Keith Curtis"]
|
|
||||||
print "2008:", name
|
|
||||||
pObject = models.Person(first_name = firstname,
|
|
||||||
last_name = lastname,
|
|
||||||
is_vfho = False,
|
|
||||||
mug_shot = "")
|
|
||||||
pObject.save()
|
|
||||||
yo = models.Expedition.objects.filter(year = "2008")[0]
|
|
||||||
pyo = models.PersonExpedition(person = pObject, expedition = yo, nickname="", is_guest=is_guest)
|
|
||||||
pyo.save()
|
|
||||||
|
|
||||||
# Julian: the below code was causing errors and it seems like a duplication of the above. Hope I haven't broken anything by commenting it. -Aaron
|
|
||||||
#
|
|
||||||
# if name in expoers2008:
|
|
||||||
# print "2008:", name
|
|
||||||
# expomissing.discard(name) # I got an error which I think was caused by this -- python complained that a set changed size during iteration.
|
|
||||||
# yo = models.Expedition.objects.filter(year = "2008")[0]
|
|
||||||
# pyo = models.PersonExpedition(person = pObject, expedition = yo, is_guest=is_guest)
|
|
||||||
# pyo.save()
|
|
||||||
|
|
||||||
def parseMugShotAndBlurb(firstname, lastname, person, header, pObject):
|
|
||||||
#create mugshot Photo instance
|
|
||||||
mugShotPath = os.path.join(settings.EXPOWEB, "folk", person[header["Mugshot"]])
|
|
||||||
if mugShotPath[-3:]=='jpg': #if person just has an image, add it
|
|
||||||
mugShotObj = models.Photo(
|
|
||||||
caption="Mugshot for "+firstname+" "+lastname,
|
|
||||||
is_mugshot=True,
|
|
||||||
file=mugShotPath,
|
|
||||||
)
|
|
||||||
mugShotObj.save()
|
|
||||||
mugShotObj.contains_person.add(pObject)
|
|
||||||
mugShotObj.save()
|
|
||||||
elif mugShotPath[-3:]=='htm': #if person has an html page, find the image(s) and add it. Also, add the text from the html page to the "blurb" field in his model instance.
|
|
||||||
personPageOld=open(mugShotPath,'r').read()
|
|
||||||
pObject.blurb=re.search('<body>.*<hr',personPageOld,re.DOTALL).group() #this needs to be refined, take care of the HTML and make sure it doesn't match beyond the blurb
|
|
||||||
for photoFilename in re.findall('i/.*?jpg',personPageOld,re.DOTALL):
|
|
||||||
mugShotPath=settings.EXPOWEB+"folk/"+photoFilename
|
|
||||||
mugShotObj = models.Photo(
|
|
||||||
caption="Mugshot for "+firstname+" "+lastname,
|
|
||||||
is_mugshot=True,
|
|
||||||
file=mugShotPath,
|
|
||||||
)
|
|
||||||
mugShotObj.save()
|
|
||||||
mugShotObj.contains_person.add(pObject)
|
|
||||||
mugShotObj.save()
|
|
||||||
pObject.save()
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# the logbook loading section
|
# the logbook loading section
|
||||||
#
|
#
|
||||||
def GetTripPersons(trippeople, expedition):
|
def GetTripPersons(trippeople, expedition, logtime_underground):
|
||||||
res = [ ]
|
res = [ ]
|
||||||
author = None
|
author = None
|
||||||
for tripperson in re.split(",|\+|&|&(?!\w+;)| and ", trippeople):
|
for tripperson in re.split(",|\+|&|&(?!\w+;)| and ", trippeople):
|
||||||
@ -133,11 +24,11 @@ def GetTripPersons(trippeople, expedition):
|
|||||||
personyear = expedition.GetPersonExpedition(tripperson)
|
personyear = expedition.GetPersonExpedition(tripperson)
|
||||||
if not personyear:
|
if not personyear:
|
||||||
print "NoMatchFor: '%s'" % tripperson
|
print "NoMatchFor: '%s'" % tripperson
|
||||||
res.append(personyear)
|
res.append((personyear, logtime_underground))
|
||||||
if mul:
|
if mul:
|
||||||
author = personyear
|
author = personyear
|
||||||
if not author:
|
if not author:
|
||||||
author = res[-1]
|
author = res[-1][0]
|
||||||
return res, author
|
return res, author
|
||||||
|
|
||||||
def GetTripCave(place): #need to be fuzzier about matching here. Already a very slow function...
|
def GetTripCave(place): #need to be fuzzier about matching here. Already a very slow function...
|
||||||
@ -167,20 +58,22 @@ def GetTripCave(place): #need to be fuzzier about matching h
|
|||||||
print "No cave found for place " , place
|
print "No cave found for place " , place
|
||||||
return
|
return
|
||||||
|
|
||||||
def EnterLogIntoDbase(date, place, title, text, trippeople, expedition, tu):
|
|
||||||
trippersons, author = GetTripPersons(trippeople, expedition)
|
def EnterLogIntoDbase(date, place, title, text, trippeople, expedition, logtime_underground):
|
||||||
|
trippersons, author = GetTripPersons(trippeople, expedition, logtime_underground)
|
||||||
tripCave = GetTripCave(place)
|
tripCave = GetTripCave(place)
|
||||||
|
|
||||||
lbo = models.LogbookEntry(date=date, place=place, title=title[:50], text=text, author=author)
|
lbo = models.LogbookEntry(date=date, place=place, title=title[:50], text=text, author=author, expedition=expedition)
|
||||||
if tripCave:
|
if tripCave:
|
||||||
lbo.cave=tripCave
|
lbo.cave=tripCave
|
||||||
lbo.save()
|
lbo.save()
|
||||||
print "ttt", date, place
|
print "ttt", date, place
|
||||||
for tripperson in trippersons:
|
for tripperson, time_underground in trippersons:
|
||||||
pto = models.PersonTrip(person_expedition = tripperson, place=place, date=date, time_underground=(tu or ""),
|
pto = models.PersonTrip(person_expedition = tripperson, place=place, date=date, time_underground=time_underground,
|
||||||
logbook_entry=lbo, is_logbook_entry_author=(tripperson == author))
|
logbook_entry=lbo, is_logbook_entry_author=(tripperson == author))
|
||||||
pto.save()
|
pto.save()
|
||||||
|
|
||||||
|
|
||||||
def ParseDate(tripdate, year):
|
def ParseDate(tripdate, year):
|
||||||
mdatestandard = re.match("(\d\d\d\d)-(\d\d)-(\d\d)", tripdate)
|
mdatestandard = re.match("(\d\d\d\d)-(\d\d)-(\d\d)", tripdate)
|
||||||
mdategoof = re.match("(\d\d?)/0?(\d)/(20|19)?(\d\d)", tripdate)
|
mdategoof = re.match("(\d\d?)/0?(\d)/(20|19)?(\d\d)", tripdate)
|
||||||
@ -216,7 +109,7 @@ def Parselogwikitxt(year, expedition, txt):
|
|||||||
|
|
||||||
ldate = ParseDate(tripdate.strip(), year)
|
ldate = ParseDate(tripdate.strip(), year)
|
||||||
#print "\n", tripcave, "--- ppp", trippeople, len(triptext)
|
#print "\n", tripcave, "--- ppp", trippeople, len(triptext)
|
||||||
EnterLogIntoDbase(date = ldate, place = tripcave, title = tripplace, text = triptext, trippeople=trippeople, expedition=expedition, tu=tu)
|
EnterLogIntoDbase(date = ldate, place = tripcave, title = tripplace, text = triptext, trippeople=trippeople, expedition=expedition, logtime_underground=0)
|
||||||
|
|
||||||
# 2002, 2004, 2005
|
# 2002, 2004, 2005
|
||||||
def Parseloghtmltxt(year, expedition, txt):
|
def Parseloghtmltxt(year, expedition, txt):
|
||||||
@ -246,7 +139,7 @@ def Parseloghtmltxt(year, expedition, txt):
|
|||||||
ltriptext = re.sub("</p>", "", triptext)
|
ltriptext = re.sub("</p>", "", triptext)
|
||||||
ltriptext = re.sub("\s*?\n\s*", " ", ltriptext)
|
ltriptext = re.sub("\s*?\n\s*", " ", ltriptext)
|
||||||
ltriptext = re.sub("<p>", "\n\n", ltriptext).strip()
|
ltriptext = re.sub("<p>", "\n\n", ltriptext).strip()
|
||||||
EnterLogIntoDbase(date = ldate, place = tripcave, title = triptitle, text = ltriptext, trippeople=trippeople, expedition=expedition, tu=tu)
|
EnterLogIntoDbase(date = ldate, place = tripcave, title = triptitle, text = ltriptext, trippeople=trippeople, expedition=expedition, logtime_underground=0)
|
||||||
|
|
||||||
|
|
||||||
# main parser for pre-2001. simpler because the data has been hacked so much to fit it
|
# main parser for pre-2001. simpler because the data has been hacked so much to fit it
|
||||||
@ -283,7 +176,8 @@ def Parseloghtml01(year, expedition, txt):
|
|||||||
|
|
||||||
#print ldate, trippeople.strip()
|
#print ldate, trippeople.strip()
|
||||||
# could includ the tripid (url link for cross referencing)
|
# could includ the tripid (url link for cross referencing)
|
||||||
EnterLogIntoDbase(date = ldate, place = tripcave, title = triptitle, text = ltriptext, trippeople=trippeople, expedition=expedition, tu=tu)
|
EnterLogIntoDbase(date = ldate, place = tripcave, title = triptitle, text = ltriptext, trippeople=trippeople, expedition=expedition, logtime_underground=0)
|
||||||
|
|
||||||
|
|
||||||
def Parseloghtml03(year, expedition, txt):
|
def Parseloghtml03(year, expedition, txt):
|
||||||
tripparas = re.findall("<hr\s*/>([\s\S]*?)(?=<hr)", txt)
|
tripparas = re.findall("<hr\s*/>([\s\S]*?)(?=<hr)", txt)
|
||||||
@ -312,11 +206,8 @@ def Parseloghtml03(year, expedition, txt):
|
|||||||
ltriptext = re.sub("\s*?\n\s*", " ", ltriptext)
|
ltriptext = re.sub("\s*?\n\s*", " ", ltriptext)
|
||||||
ltriptext = re.sub("<p>", "\n\n", ltriptext).strip()
|
ltriptext = re.sub("<p>", "\n\n", ltriptext).strip()
|
||||||
ltriptext = re.sub("[^\s0-9a-zA-Z\-.,:;'!&()\[\]<>?=+*%]", "_NONASCII_", ltriptext)
|
ltriptext = re.sub("[^\s0-9a-zA-Z\-.,:;'!&()\[\]<>?=+*%]", "_NONASCII_", ltriptext)
|
||||||
EnterLogIntoDbase(date = ldate, place = tripcave, title = triptitle, text = ltriptext, trippeople=trippeople, expedition=expedition, tu=tu)
|
EnterLogIntoDbase(date = ldate, place = tripcave, title = triptitle, text = ltriptext, trippeople=trippeople, expedition=expedition, logtime_underground=0)
|
||||||
|
|
||||||
def LoadLogbooks():
|
|
||||||
models.LogbookEntry.objects.all().delete()
|
|
||||||
expowebbase = os.path.join(settings.EXPOWEB, "years")
|
|
||||||
yearlinks = [
|
yearlinks = [
|
||||||
("2008", "2008/2008logbook.txt", Parselogwikitxt),
|
("2008", "2008/2008logbook.txt", Parselogwikitxt),
|
||||||
("2007", "2007/2007logbook.txt", Parselogwikitxt),
|
("2007", "2007/2007logbook.txt", Parselogwikitxt),
|
||||||
@ -330,7 +221,52 @@ def LoadLogbooks():
|
|||||||
("1999", "1999/log.htm", Parseloghtml01),
|
("1999", "1999/log.htm", Parseloghtml01),
|
||||||
("1998", "1998/log.htm", Parseloghtml01),
|
("1998", "1998/log.htm", Parseloghtml01),
|
||||||
("1997", "1997/log.htm", Parseloghtml01),
|
("1997", "1997/log.htm", Parseloghtml01),
|
||||||
|
#("1996", "1996/log.htm", Parseloghtml01),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
def SetDatesFromLogbookEntries(expedition):
|
||||||
|
for personexpedition in expedition.personexpedition_set.all():
|
||||||
|
persontrips = personexpedition.persontrip_set.order_by('date')
|
||||||
|
personexpedition.date_from = min([persontrip.date for persontrip in persontrips] or [None])
|
||||||
|
personexpedition.date_to = max([persontrip.date for persontrip in persontrips] or [None])
|
||||||
|
personexpedition.save()
|
||||||
|
|
||||||
|
lprevpersontrip = None
|
||||||
|
for persontrip in persontrips:
|
||||||
|
persontrip.persontrip_prev = lprevpersontrip
|
||||||
|
if lprevpersontrip:
|
||||||
|
lprevpersontrip.persontrip_next = persontrip
|
||||||
|
lprevpersontrip.save()
|
||||||
|
persontrip.persontrip_next = None
|
||||||
|
lprevpersontrip = persontrip
|
||||||
|
persontrip.save()
|
||||||
|
|
||||||
|
# from trips rather than logbook entries, which may include events outside the expedition
|
||||||
|
expedition.date_from = min([personexpedition.date_from for personexpedition in expedition.personexpedition_set.all() if personexpedition.date_from] or [None])
|
||||||
|
expedition.date_to = max([personexpedition.date_to for personexpedition in expedition.personexpedition_set.all() if personexpedition.date_to] or [None])
|
||||||
|
expedition.save()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def LoadLogbookForExpedition(expedition):
|
||||||
|
expedition.logbookentry_set.all().delete()
|
||||||
|
models.PersonTrip.objects.filter(person_expedition__expedition=expedition).delete()
|
||||||
|
expowebbase = os.path.join(settings.EXPOWEB, "years")
|
||||||
|
year = str(expedition.year)
|
||||||
|
for lyear, lloc, parsefunc in yearlinks:
|
||||||
|
if lyear == year:
|
||||||
|
break
|
||||||
|
fin = open(os.path.join(expowebbase, lloc))
|
||||||
|
txt = fin.read()
|
||||||
|
fin.close()
|
||||||
|
parsefunc(year, expedition, txt)
|
||||||
|
SetDatesFromLogbookEntries(expedition)
|
||||||
|
return "TOLOAD: " + year + " " + str(expedition.personexpedition_set.all()[1].logbookentry_set.count()) + " " + str(models.PersonTrip.objects.filter(person_expedition__expedition=expedition).count())
|
||||||
|
|
||||||
|
|
||||||
|
def LoadLogbooks():
|
||||||
|
models.LogbookEntry.objects.all().delete()
|
||||||
|
expowebbase = os.path.join(settings.EXPOWEB, "years")
|
||||||
#yearlinks = [ ("2001", "2001/log.htm", Parseloghtml01), ] #overwrite
|
#yearlinks = [ ("2001", "2001/log.htm", Parseloghtml01), ] #overwrite
|
||||||
|
|
||||||
for year, lloc, parsefunc in yearlinks:
|
for year, lloc, parsefunc in yearlinks:
|
||||||
@ -339,11 +275,6 @@ def LoadLogbooks():
|
|||||||
txt = fin.read()
|
txt = fin.read()
|
||||||
fin.close()
|
fin.close()
|
||||||
parsefunc(year, expedition, txt)
|
parsefunc(year, expedition, txt)
|
||||||
|
SetDatesFromLogbookEntries(expedition)
|
||||||
|
|
||||||
|
|
||||||
# command line run through the loading stages
|
|
||||||
# you can comment out these in turn to control what gets reloaded
|
|
||||||
LoadExpos()
|
|
||||||
LoadPersons()
|
|
||||||
LoadLogbooks()
|
|
||||||
|
|
||||||
|
119
parsers/people.py
Normal file
119
parsers/people.py
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
#.-*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import settings
|
||||||
|
import expo.models as models
|
||||||
|
import csv
|
||||||
|
import re
|
||||||
|
import datetime
|
||||||
|
import os
|
||||||
|
|
||||||
|
# Julian: the below code was causing errors and it seems like a duplication of the above. Hope I haven't broken anything by commenting it. -Aaron
|
||||||
|
#
|
||||||
|
# if name in expoers2008:
|
||||||
|
# print "2008:", name
|
||||||
|
# expomissing.discard(name) # I got an error which I think was caused by this -- python complained that a set changed size during iteration.
|
||||||
|
# yo = models.Expedition.objects.filter(year = "2008")[0]
|
||||||
|
# pyo = models.PersonExpedition(person = pObject, expedition = yo, is_guest=is_guest)
|
||||||
|
# pyo.save()
|
||||||
|
|
||||||
|
def parseMugShotAndBlurb(firstname, lastname, person, header, pObject):
|
||||||
|
#create mugshot Photo instance
|
||||||
|
mugShotPath = os.path.join(settings.EXPOWEB, "folk", person[header["Mugshot"]])
|
||||||
|
if mugShotPath[-3:]=='jpg': #if person just has an image, add it
|
||||||
|
mugShotObj = models.Photo(
|
||||||
|
caption="Mugshot for "+firstname+" "+lastname,
|
||||||
|
is_mugshot=True,
|
||||||
|
file=mugShotPath,
|
||||||
|
)
|
||||||
|
mugShotObj.save()
|
||||||
|
mugShotObj.contains_person.add(pObject)
|
||||||
|
mugShotObj.save()
|
||||||
|
elif mugShotPath[-3:]=='htm': #if person has an html page, find the image(s) and add it. Also, add the text from the html page to the "blurb" field in his model instance.
|
||||||
|
personPageOld=open(mugShotPath,'r').read()
|
||||||
|
pObject.blurb=re.search('<body>.*<hr',personPageOld,re.DOTALL).group() #this needs to be refined, take care of the HTML and make sure it doesn't match beyond the blurb
|
||||||
|
for photoFilename in re.findall('i/.*?jpg',personPageOld,re.DOTALL):
|
||||||
|
mugShotPath=settings.EXPOWEB+"folk/"+photoFilename
|
||||||
|
mugShotObj = models.Photo(
|
||||||
|
caption="Mugshot for "+firstname+" "+lastname,
|
||||||
|
is_mugshot=True,
|
||||||
|
file=mugShotPath,
|
||||||
|
)
|
||||||
|
mugShotObj.save()
|
||||||
|
mugShotObj.contains_person.add(pObject)
|
||||||
|
mugShotObj.save()
|
||||||
|
pObject.save()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def LoadPersonsExpos():
|
||||||
|
|
||||||
|
persontab = open(os.path.join(settings.EXPOWEB, "noinfo", "folk.csv"))
|
||||||
|
personreader = csv.reader(persontab)
|
||||||
|
headers = personreader.next()
|
||||||
|
header = dict(zip(headers, range(len(headers))))
|
||||||
|
|
||||||
|
models.Expedition.objects.all().delete()
|
||||||
|
years = headers[5:]
|
||||||
|
years.append("2008")
|
||||||
|
for year in years:
|
||||||
|
y = models.Expedition(year = year, name = "CUCC expo%s" % year)
|
||||||
|
y.save()
|
||||||
|
print "lll", years
|
||||||
|
|
||||||
|
|
||||||
|
models.Person.objects.all().delete()
|
||||||
|
models.PersonExpedition.objects.all().delete()
|
||||||
|
expoers2008 = """Edvin Deadman,Kathryn Hopkins,Djuke Veldhuis,Becka Lawson,Julian Todd,Natalie Uomini,Aaron Curtis,Tony Rooke,Ollie Stevens,Frank Tully,Martin Jahnke,Mark Shinwell,Jess Stirrups,Nial Peters,Serena Povia,Olly Madge,Steve Jones,Pete Harley,Eeva Makiranta,Keith Curtis""".split(",")
|
||||||
|
expomissing = set(expoers2008)
|
||||||
|
|
||||||
|
for person in personreader:
|
||||||
|
name = person[header["Name"]]
|
||||||
|
name = re.sub("<.*?>", "", name)
|
||||||
|
mname = re.match("(\w+)(?:\s((?:van |ten )?\w+))?(?:\s\(([^)]*)\))?", name)
|
||||||
|
|
||||||
|
if mname.group(3):
|
||||||
|
nickname = mname.group(3)
|
||||||
|
else:
|
||||||
|
nickname = ""
|
||||||
|
|
||||||
|
firstname, lastname = mname.group(1), mname.group(2) or ""
|
||||||
|
|
||||||
|
print firstname, lastname, "NNN", nickname
|
||||||
|
#assert lastname == person[header[""]], person
|
||||||
|
|
||||||
|
pObject = models.Person(first_name = firstname,
|
||||||
|
last_name = lastname,
|
||||||
|
is_vfho = person[header["VfHO member"]],
|
||||||
|
)
|
||||||
|
|
||||||
|
is_guest = person[header["Guest"]] == "1" # this is really a per-expo catagory; not a permanent state
|
||||||
|
pObject.save()
|
||||||
|
parseMugShotAndBlurb(firstname, lastname, person, header, pObject)
|
||||||
|
|
||||||
|
for year, attended in zip(headers, person)[5:]:
|
||||||
|
yo = models.Expedition.objects.filter(year = year)[0]
|
||||||
|
if attended == "1" or attended == "-1":
|
||||||
|
pyo = models.PersonExpedition(person = pObject, expedition = yo, nickname=nickname, is_guest=is_guest)
|
||||||
|
pyo.save()
|
||||||
|
|
||||||
|
# error
|
||||||
|
elif (firstname, lastname) == ("Mike", "Richardson") and year == "2001":
|
||||||
|
print "Mike Richardson(2001) error"
|
||||||
|
pyo = models.PersonExpedition(person = pObject, expedition = yo, nickname=nickname, is_guest=is_guest)
|
||||||
|
pyo.save()
|
||||||
|
|
||||||
|
|
||||||
|
# this fills in those people for whom 2008 was their first expo
|
||||||
|
for name in expomissing:
|
||||||
|
firstname, lastname = name.split()
|
||||||
|
is_guest = name in ["Eeva Makiranta", "Keith Curtis"]
|
||||||
|
print "2008:", name
|
||||||
|
pObject = models.Person(first_name = firstname,
|
||||||
|
last_name = lastname,
|
||||||
|
is_vfho = False,
|
||||||
|
mug_shot = "")
|
||||||
|
pObject.save()
|
||||||
|
yo = models.Expedition.objects.filter(year = "2008")[0]
|
||||||
|
pyo = models.PersonExpedition(person = pObject, expedition = yo, nickname="", is_guest=is_guest)
|
||||||
|
pyo.save()
|
||||||
|
|
47
templates/expedition.html
Normal file
47
templates/expedition.html
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
{% load wiki_markup %}
|
||||||
|
|
||||||
|
{% block title %}Expedition {{expedition.name}}{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h2>{{expedition.name}}: {{expedition.date_from}} - {{expedition.date_to}}</h2>
|
||||||
|
|
||||||
|
<div id="col2">
|
||||||
|
<table class="prevnextexpeditions">
|
||||||
|
<tr>
|
||||||
|
<td>{% if expedition_prev %}< < <a href="{% url expedition expedition_prev.year %}">{{expedition_prev.year}}</a>{% endif %}</td>
|
||||||
|
<td>{% if expedition_next %}> > <a href="{% url expedition expedition_next.year %}">{{expedition_next.year}}</a>{% endif %}</td>
|
||||||
|
</tr>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<table class="expeditionpersonlist">
|
||||||
|
<tr><th>Caver</th><th>From</th><th>To</th></tr>
|
||||||
|
{% for personexpedition in expedition.personexpedition_set.all %}
|
||||||
|
<tr>
|
||||||
|
<td><a href="{% url person personexpedition.person.href%}">{{personexpedition.person}}</a></td>
|
||||||
|
<td>{{personexpedition.date_from}}</td>
|
||||||
|
<td>{{personexpedition.date_to}}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="col1">
|
||||||
|
<h3>Logbook entries</h3>
|
||||||
|
<form action="" method="GET"><input type="submit" name="reload" value="Reload"></form>
|
||||||
|
<p>debug message: {{message}}</p>
|
||||||
|
|
||||||
|
<table class="expeditionlogbooks">
|
||||||
|
<tr><th>Date</th><th>Title</th><th>Author</th><th>Place</th></tr>
|
||||||
|
{% for logbookentry in logbookentries %}
|
||||||
|
<tr>
|
||||||
|
<td>{{logbookentry.date}}</td>
|
||||||
|
<td><a href="{% url logbookentry logbookentry.id %}">{{logbookentry.title|safe}}</td>
|
||||||
|
<td><a href="{% url person logbookentry.author.person.href%}">{{logbookentry.author.name}}</a></td>
|
||||||
|
<td>{{logbookentry.place}}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
@ -8,9 +8,21 @@
|
|||||||
<h2>The unfinished front page</h2>
|
<h2>The unfinished front page</h2>
|
||||||
<p>Some handy links into the less incomplete parts of this webpage</p>
|
<p>Some handy links into the less incomplete parts of this webpage</p>
|
||||||
|
|
||||||
|
<h3>{{message}}</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="{% url personindex %}">List osf people</a></li>
|
<li><a href="{% url personindex %}">List osf people</a></li>
|
||||||
<li><a href="/statistics">Statistics of what's loaded in the database</a></li>
|
<li><a href="/statistics">Statistics of what's loaded in the database</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<form action="" method="GET"><input type="submit" name="reload" value="Reload"></form>
|
||||||
|
|
||||||
|
<ul id="expeditionlist">
|
||||||
|
<li>
|
||||||
|
{% for expedition in expeditions %}
|
||||||
|
<a href="{% url expedition expedition.year %}">{{expedition.name}}</a>
|
||||||
|
{% endfor %}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -2,25 +2,52 @@
|
|||||||
{% load wiki_markup %}
|
{% load wiki_markup %}
|
||||||
|
|
||||||
{% block title %}Logbook {{logbookentry.id}}{% endblock %}
|
{% block title %}Logbook {{logbookentry.id}}{% endblock %}
|
||||||
{% block editLink %}<a href="{{settings.URL_ROOT}}admin/expo/logbookentry/{{logbookentry.id}}">edit </a>{% endblock %}
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="logbookblock">
|
<h2>{{logbookentry.title|safe}}</h2>
|
||||||
<h2>{{logbookentry.title}} - {{logbookentry.date}}</h2>
|
|
||||||
<h3>place (to be a link to cave shaped object): <u>{{logbookentry.place}}</u></h3>
|
<div id="col2">
|
||||||
<ul>
|
<p><a href="{% url expedition logbookentry.expedition.year %}">{{logbookentry.expedition.name}}</a></p>
|
||||||
|
<p>place: {{logbookentry.place}}</p>
|
||||||
|
|
||||||
|
<table class="cavers">
|
||||||
|
<tr><th>Caver</th><th>T/U</th><th>Prev</th><th>Next</th></tr>
|
||||||
{% for persontrip in logbookentry.persontrip_set.all %}
|
{% for persontrip in logbookentry.persontrip_set.all %}
|
||||||
<li>
|
<tr>
|
||||||
<a href="/person/{{persontrip.personexpedition.person.id}}">{{persontrip.personexpedition}}</a>
|
{% ifequal persontrip.person_expedition logbookentry.author %}
|
||||||
<a href="{{settings.URL_ROOT}}admin/expo/logbookentry/{{logbookentry.id}}">edit </a>
|
<td class="author">
|
||||||
{% ifequal persontrip.personexpedition logbookentry.author %}
|
{% else %}
|
||||||
(author)
|
<td>
|
||||||
{% endifequal %}
|
{% endifequal %}
|
||||||
|
<a href="{% url person persontrip.person_expedition.person.href %}">{{persontrip.person_expedition.person}}</a>
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td>
|
||||||
{% if persontrip.timeunderground %}
|
{% if persontrip.timeunderground %}
|
||||||
- T/U {{persontrip.timeunderground}}</p>
|
- T/U {{persontrip.timeunderground}}</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</li>
|
</td>
|
||||||
|
|
||||||
|
<td>
|
||||||
|
{% if persontrip.persontrip_prev %}
|
||||||
|
<a href="{% url logbookentry persontrip.persontrip_prev.logbook_entry.id %}">{{persontrip.persontrip_prev.date}}</a>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{% if persontrip.persontrip_next %}
|
||||||
|
<a href="{% url logbookentry persontrip.persontrip_next.logbook_entry.id %}">{{persontrip.persontrip_next.date}}</a>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</table>
|
||||||
<div>{{logbookentry.text|wiki_to_html}}</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div id="col1">
|
||||||
|
<div class="logbookentry">
|
||||||
|
<b>{{logbookentry.date}}</b>
|
||||||
|
{{logbookentry.text|wiki_to_html}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
{% block title %}Person {{person|wiki_to_html_short}}{% endblock %}
|
{% block title %}Person {{person|wiki_to_html_short}}{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="personblock"><a href="/person/{{person.id}}">{{person|wiki_to_html_short}}</a>
|
<div class="personblock"><a href="{% url person person.href%}">{{person|wiki_to_html_short}}</a>
|
||||||
<ul>
|
<ul>
|
||||||
{% for personexpedition in person.personexpedition_set.all %}
|
{% for personexpedition in person.personexpedition_set.all %}
|
||||||
<li>
|
<li>
|
||||||
@ -14,7 +14,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<ul>
|
<ul>
|
||||||
{% for persontrip in personexpedition.persontrip_set.all %}
|
{% for persontrip in personexpedition.persontrip_set.all %}
|
||||||
<li><a href="/logbookentry/{{persontrip.logbookentry.id}}">{{persontrip.date}}</a>
|
<li><a href="{% url logbookentry persontrip.logbook_entry.id %}">{{persontrip.date}}</a> {{persontrip.logbookentry}}
|
||||||
({{persontrip.logbookentry.place|wiki_to_html_short}}) -
|
({{persontrip.logbookentry.place|wiki_to_html_short}}) -
|
||||||
{{persontrip.logbookentry.title|wiki_to_html_short}}</li>
|
{{persontrip.logbookentry.title|wiki_to_html_short}}</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@ -4,23 +4,29 @@
|
|||||||
{% block title %}Person Index{% endblock %}
|
{% block title %}Person Index{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
{% for person in persons %}
|
{% for person in persons %}
|
||||||
<div class="personblock"><a href="/person/{{person.id}}">{{person|wiki_to_html_short}}</a>
|
<div class="personblock"><a href="{% url person person.href%}">{{person|wiki_to_html_short}}</a>
|
||||||
<ul>
|
<ul>
|
||||||
{% for personexpedition in person.personexpedition_set.all %}
|
{% for personexpedition in person.personexpedition_set.all %}
|
||||||
<li>
|
<li>
|
||||||
|
|
||||||
<table><tr><td>
|
<table><tr><td>
|
||||||
{{personexpedition.expedition}}
|
{{personexpedition.expedition}}
|
||||||
</td><td>
|
</td><td>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
{% for persontrip in personexpedition.persontrip_set.all %}
|
{% for persontrip in personexpedition.persontrip_set.all %}
|
||||||
<a href="/logbookentry/{{persontrip.logbookentry.id}}">{{persontrip.date}}</a>
|
<a href="{% url logbookentry persontrip.logbook_entry.id %}">{{persontrip.date}}</a>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</td></tr></table>
|
</td></tr></table>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
6
urls.py
6
urls.py
@ -21,11 +21,13 @@ urlpatterns = patterns('',
|
|||||||
(r'^survex/(?P<survex_file>.*)\.err$', err),
|
(r'^survex/(?P<survex_file>.*)\.err$', err),
|
||||||
|
|
||||||
url(r'^personindex$', personindex, name="personindex"),
|
url(r'^personindex$', personindex, name="personindex"),
|
||||||
(r'^person/(?P<person_id>\d*)(?P<first_name>[a-zA-Z]*)[-_/\.\s(\%20)]*(?P<last_name>[a-zA-Z]*)/?$', person),
|
url(r'^person/(.+)$', person, name="person"),
|
||||||
|
|
||||||
(r'^logbookentry/(.*)/?$', logbookentry),
|
url(r'^logbookentry/(\d+)$', logbookentry, name="logbookentry"),
|
||||||
url(r'^logbooksearch/(.*)/?$', logbookSearch),
|
url(r'^logbooksearch/(.*)/?$', logbookSearch),
|
||||||
|
|
||||||
|
url(r'^expedition/(\d+)$', expedition, name="expedition"),
|
||||||
|
|
||||||
url(r'^statistics/?$', stats, name="stats"),
|
url(r'^statistics/?$', stats, name="stats"),
|
||||||
|
|
||||||
(r'^survey/?$', surveyindex),
|
(r'^survey/?$', surveyindex),
|
||||||
|
Loading…
Reference in New Issue
Block a user