diff --git a/databaseReset.py b/databaseReset.py index 815ee02..68f2e6a 100644 --- a/databaseReset.py +++ b/databaseReset.py @@ -18,7 +18,10 @@ user.is_superuser = True user.save() import parsers.cavetab +import parsers.people +parsers.people.LoadPersonsExpos() import parsers.logbooks +parsers.logbooks.LoadLogbooks() import parsers.QMs import parsers.survex import parsers.surveys \ No newline at end of file diff --git a/expo/models.py b/expo/models.py index 26f6f91..3cc0492 100644 --- a/expo/models.py +++ b/expo/models.py @@ -12,8 +12,8 @@ from models_survex import * class Expedition(models.Model): year = models.CharField(max_length=20, unique=True) name = models.CharField(max_length=100) - start_date = models.DateField(blank=True,null=True) - end_date = models.DateField(blank=True,null=True) + date_from = models.DateField(blank=True,null=True) + date_to = models.DateField(blank=True,null=True) def __unicode__(self): return self.year @@ -47,14 +47,24 @@ class Person(models.Model): blurb = models.TextField(blank=True,null=True) class Meta: verbose_name_plural = "People" + def __unicode__(self): - return "%s %s" % (self.first_name, self.last_name) + if 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): expedition = models.ForeignKey(Expedition) person = models.ForeignKey(Person) - from_date = models.DateField(blank=True,null=True) - to_date = models.DateField(blank=True,null=True) + date_from = models.DateField(blank=True,null=True) + date_to = models.DateField(blank=True,null=True) is_guest = models.BooleanField(default=False) nickname = models.CharField(max_length=100,blank=True,null=True) @@ -86,8 +96,13 @@ class PersonExpedition(models.Model): def __unicode__(self): 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): @@ -187,13 +202,18 @@ class Cave(models.Model): class LogbookEntry(models.Model): 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 title = models.CharField(max_length=200) cave = models.ForeignKey(Cave,blank=True,null=True) place = models.CharField(max_length=100,blank=True,null=True) 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: - verbose_name_plural = "Logbook Entries" + verbose_name_plural = "Logbook Entries" # several PersonTrips point in to this object def __unicode__(self): @@ -206,9 +226,12 @@ class PersonTrip(models.Model): # possibly a trip has a plurality of triplets pointing into it place = models.CharField(max_length=100) date = models.DateField() - time_underground = models.CharField(max_length=100) + time_underground = models.FloatField() logbook_entry = models.ForeignKey(LogbookEntry) 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): return "%s %s (%s)" % (self.person_expedition, self.place, self.date) diff --git a/expo/randSent.py b/expo/randSent.py index 71be068..a99b974 100644 --- a/expo/randSent.py +++ b/expo/randSent.py @@ -15,6 +15,8 @@ def weighted_choice(lst): def randomLogbookSentence(): randSent={} + # needs to handle empty logbooks without crashing + #Choose a random logbook entry randSent['entry']=LogbookEntry.objects.order_by('?')[0] diff --git a/expo/views_logbooks.py b/expo/views_logbooks.py index ac1954a..1f3de23 100644 --- a/expo/views_logbooks.py +++ b/expo/views_logbooks.py @@ -1,6 +1,7 @@ from django.shortcuts import render_to_response from troggle.expo.models import Expedition, Person, PersonExpedition, PersonTrip, LogbookEntry import troggle.settings as settings +from troggle.parsers.logbooks import LoadLogbookForExpedition import search import re @@ -8,17 +9,33 @@ def personindex(request): persons = Person.objects.all() return render_to_response('personindex.html', {'persons': persons, 'settings': settings}) -def person(request, person_id, first_name, last_name): - if first_name == '' or last_name == '': - person = Person.objects.filter(id = person_id)[0] - else: - person = Person.objects.filter(first_name = first_name, last_name = last_name)[0] +def expedition(request, expeditionname): + year = int(expeditionname) + expedition = Expedition.objects.get(year=year) + expedition_next = Expedition.objects.filter(year=year+1) and Expedition.objects.get(year=year+1) or None + 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}) def logbookentry(request, logbookentry_id): logbookentry = LogbookEntry.objects.filter(id = logbookentry_id)[0] + + return render_to_response('logbookentry.html', {'logbookentry': logbookentry, 'settings': settings}) + def logbookSearch(request, extra): query_string = '' found_entries = None diff --git a/expo/views_other.py b/expo/views_other.py index 771816a..43cdbca 100644 --- a/expo/views_other.py +++ b/expo/views_other.py @@ -3,9 +3,12 @@ from troggle.expo.models import Cave, Expedition, Person, LogbookEntry, PersonEx import troggle.settings as settings from django import forms from django.db.models import Q +from troggle.parsers.people import LoadPersonsExpos import re import randSent +from django.core.urlresolvers import reverse + def stats(request): statsDict={} statsDict['expoCount'] = int(Expedition.objects.count()) @@ -15,8 +18,13 @@ def stats(request): return render_to_response('statistics.html', statsDict) def frontPage(request): - - return render_to_response('index.html', {'randSent':randSent.randomLogbookSentence(),'settings':settings}) + message = "no test message" #reverse('personn', kwargs={"name":"hkjhjh"}) + 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): week=['S','S','M','T','W','T','F'] @@ -27,4 +35,3 @@ def calendar(request,year): dictToPass=locals() dictToPass.update({'settings':settings}) return render_to_response('calendar.html', dictToPass) - \ No newline at end of file diff --git a/media/css/main2.css b/media/css/main2.css index d54baa1..d1b8139 100644 --- a/media/css/main2.css +++ b/media/css/main2.css @@ -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; } .centre { text-align: center; } .plus2pt { font-size: 160%; } -body, td, center, ul, p, input +ul { - color: rgb(0, 0, 0); - font-family: sans-serif; + list-style: none; } body { - background-color: #FFFFFF; + background-color: white; + color: black; font: 100% Verdana, Arial, Helvetica, sans-serif; - Zbackground: #666666; margin: 0; padding: 0; - text-align: center; - color: #000000; + margin-left: auto; + margin-right: auto; } div#content @@ -27,6 +47,7 @@ div#content div#footer { + clear:both; background-color:black; color:white; text-align:center; @@ -34,6 +55,76 @@ div#footer 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 { width:100%; diff --git a/parsers/logbooks.py b/parsers/logbooks.py index 6976469..85b5f13 100644 --- a/parsers/logbooks.py +++ b/parsers/logbooks.py @@ -7,120 +7,11 @@ import re import datetime 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 # -def GetTripPersons(trippeople, expedition): +def GetTripPersons(trippeople, expedition, logtime_underground): res = [ ] author = None for tripperson in re.split(",|\+|&|&(?!\w+;)| and ", trippeople): @@ -133,11 +24,11 @@ def GetTripPersons(trippeople, expedition): personyear = expedition.GetPersonExpedition(tripperson) if not personyear: print "NoMatchFor: '%s'" % tripperson - res.append(personyear) + res.append((personyear, logtime_underground)) if mul: author = personyear if not author: - author = res[-1] + author = res[-1][0] return res, author 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 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) - 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: lbo.cave=tripCave lbo.save() print "ttt", date, place - for tripperson in trippersons: - pto = models.PersonTrip(person_expedition = tripperson, place=place, date=date, time_underground=(tu or ""), + for tripperson, time_underground in trippersons: + pto = models.PersonTrip(person_expedition = tripperson, place=place, date=date, time_underground=time_underground, logbook_entry=lbo, is_logbook_entry_author=(tripperson == author)) pto.save() + def ParseDate(tripdate, year): mdatestandard = re.match("(\d\d\d\d)-(\d\d)-(\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) #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 def Parseloghtmltxt(year, expedition, txt): @@ -246,7 +139,7 @@ def Parseloghtmltxt(year, expedition, txt): ltriptext = re.sub("</p>", "", triptext) ltriptext = re.sub("\s*?\n\s*", " ", ltriptext) 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 @@ -283,7 +176,8 @@ def Parseloghtml01(year, expedition, txt): #print ldate, trippeople.strip() # 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): tripparas = re.findall("<hr\s*/>([\s\S]*?)(?=<hr)", txt) @@ -312,25 +206,67 @@ def Parseloghtml03(year, expedition, txt): ltriptext = re.sub("\s*?\n\s*", " ", ltriptext) ltriptext = re.sub("<p>", "\n\n", ltriptext).strip() 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) + +yearlinks = [ + ("2008", "2008/2008logbook.txt", Parselogwikitxt), + ("2007", "2007/2007logbook.txt", Parselogwikitxt), + ("2006", "2006/logbook/logbook_06.txt", Parselogwikitxt), + ("2005", "2005/logbook.html", Parseloghtmltxt), + ("2004", "2004/logbook.html", Parseloghtmltxt), + ("2003", "2003/logbook.html", Parseloghtml03), + ("2002", "2002/logbook.html", Parseloghtmltxt), + ("2001", "2001/log.htm", Parseloghtml01), + ("2000", "2000/log.htm", Parseloghtml01), + ("1999", "1999/log.htm", Parseloghtml01), + ("1998", "1998/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 = [ - ("2008", "2008/2008logbook.txt", Parselogwikitxt), - ("2007", "2007/2007logbook.txt", Parselogwikitxt), - ("2006", "2006/logbook/logbook_06.txt", Parselogwikitxt), - ("2005", "2005/logbook.html", Parseloghtmltxt), - ("2004", "2004/logbook.html", Parseloghtmltxt), - ("2003", "2003/logbook.html", Parseloghtml03), - ("2002", "2002/logbook.html", Parseloghtmltxt), - ("2001", "2001/log.htm", Parseloghtml01), - ("2000", "2000/log.htm", Parseloghtml01), - ("1999", "1999/log.htm", Parseloghtml01), - ("1998", "1998/log.htm", Parseloghtml01), - ("1997", "1997/log.htm", Parseloghtml01), - ] #yearlinks = [ ("2001", "2001/log.htm", Parseloghtml01), ] #overwrite for year, lloc, parsefunc in yearlinks: @@ -339,11 +275,6 @@ def LoadLogbooks(): txt = fin.read() fin.close() 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() diff --git a/parsers/people.py b/parsers/people.py new file mode 100644 index 0000000..c0e512b --- /dev/null +++ b/parsers/people.py @@ -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() + diff --git a/templates/expedition.html b/templates/expedition.html new file mode 100644 index 0000000..72fec15 --- /dev/null +++ b/templates/expedition.html @@ -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 %} diff --git a/templates/index.html b/templates/index.html index 0a19187..667fa28 100644 --- a/templates/index.html +++ b/templates/index.html @@ -8,9 +8,21 @@ <h2>The unfinished front page</h2> <p>Some handy links into the less incomplete parts of this webpage</p> +<h3>{{message}}</h3> + <ul> <li><a href="{% url personindex %}">List osf people</a></li> <li><a href="/statistics">Statistics of what's loaded in the database</a></li> </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 %} diff --git a/templates/logbookentry.html b/templates/logbookentry.html index 2e34ba3..4a0dd61 100644 --- a/templates/logbookentry.html +++ b/templates/logbookentry.html @@ -2,25 +2,52 @@ {% load wiki_markup %} {% block title %}Logbook {{logbookentry.id}}{% endblock %} -{% block editLink %}<a href="{{settings.URL_ROOT}}admin/expo/logbookentry/{{logbookentry.id}}">edit </a>{% endblock %} + {% block content %} - <div class="logbookblock"> - <h2>{{logbookentry.title}} - {{logbookentry.date}}</h2> - <h3>place (to be a link to cave shaped object): <u>{{logbookentry.place}}</u></h3> - <ul> - {% for persontrip in logbookentry.persontrip_set.all %} - <li> - <a href="/person/{{persontrip.personexpedition.person.id}}">{{persontrip.personexpedition}}</a> - <a href="{{settings.URL_ROOT}}admin/expo/logbookentry/{{logbookentry.id}}">edit </a> - {% ifequal persontrip.personexpedition logbookentry.author %} - (author) - {% endifequal %} - {% if persontrip.timeunderground %} - - T/U {{persontrip.timeunderground}}</p> - {% endif %} - </li> - {% endfor %} - </ul> - <div>{{logbookentry.text|wiki_to_html}}</div> - </div> +<h2>{{logbookentry.title|safe}}</h2> + +<div id="col2"> +<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 %} +<tr> + {% ifequal persontrip.person_expedition logbookentry.author %} + <td class="author"> + {% else %} + <td> + {% endifequal %} + <a href="{% url person persontrip.person_expedition.person.href %}">{{persontrip.person_expedition.person}}</a> + </td> + + <td> + {% if persontrip.timeunderground %} + - T/U {{persontrip.timeunderground}}</p> + {% endif %} + </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 %} +</table> +</div> + +<div id="col1"> +<div class="logbookentry"> +<b>{{logbookentry.date}}</b> + {{logbookentry.text|wiki_to_html}}</div> +</div> +</div> + {% endblock %} diff --git a/templates/person.html b/templates/person.html index ff1fe62..04eae1b 100644 --- a/templates/person.html +++ b/templates/person.html @@ -4,25 +4,25 @@ {% block title %}Person {{person|wiki_to_html_short}}{% endblock %} {% 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> +{% for personexpedition in person.personexpedition_set.all %} + <li> + <table><tr><td> + {{personexpedition.expedition}} + </td><td> + <div> <ul> - {% for personexpedition in person.personexpedition_set.all %} - <li> - <table><tr><td> - {{personexpedition.expedition}} - </td><td> - <div> - <ul> - {% for persontrip in personexpedition.persontrip_set.all %} - <li><a href="/logbookentry/{{persontrip.logbookentry.id}}">{{persontrip.date}}</a> - ({{persontrip.logbookentry.place|wiki_to_html_short}}) - - {{persontrip.logbookentry.title|wiki_to_html_short}}</li> - {% endfor %} - <ul> - </div> - </td></tr></table> - </li> + {% for persontrip in personexpedition.persontrip_set.all %} + <li><a href="{% url logbookentry persontrip.logbook_entry.id %}">{{persontrip.date}}</a> {{persontrip.logbookentry}} + ({{persontrip.logbookentry.place|wiki_to_html_short}}) - + {{persontrip.logbookentry.title|wiki_to_html_short}}</li> {% endfor %} - </ul> + <ul> + </div> + </td></tr></table> + </li> +{% endfor %} +</ul> </div> {% endblock %} diff --git a/templates/personindex.html b/templates/personindex.html index 6d39306..ca8b9b5 100644 --- a/templates/personindex.html +++ b/templates/personindex.html @@ -4,23 +4,29 @@ {% block title %}Person Index{% endblock %} {% block content %} + {% for person in persons %} - <div class="personblock"><a href="/person/{{person.id}}">{{person|wiki_to_html_short}}</a> - <ul> - {% for personexpedition in person.personexpedition_set.all %} - <li> - <table><tr><td> - {{personexpedition.expedition}} - </td><td> - <div> - {% for persontrip in personexpedition.persontrip_set.all %} - <a href="/logbookentry/{{persontrip.logbookentry.id}}">{{persontrip.date}}</a> - {% endfor %} - </div> - </td></tr></table> - </li> +<div class="personblock"><a href="{% url person person.href%}">{{person|wiki_to_html_short}}</a> +<ul> +{% for personexpedition in person.personexpedition_set.all %} + <li> + + <table><tr><td> + {{personexpedition.expedition}} + </td><td> + + <div> + {% for persontrip in personexpedition.persontrip_set.all %} + <a href="{% url logbookentry persontrip.logbook_entry.id %}">{{persontrip.date}}</a> {% endfor %} - </ul> + </div> + + </td></tr></table> + + </li> +{% endfor %} +</ul> </div> {% endfor %} + {% endblock %} diff --git a/urls.py b/urls.py index 7ef7bd6..ad64d2b 100644 --- a/urls.py +++ b/urls.py @@ -21,11 +21,13 @@ urlpatterns = patterns('', (r'^survex/(?P<survex_file>.*)\.err$', err), 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'^expedition/(\d+)$', expedition, name="expedition"), + url(r'^statistics/?$', stats, name="stats"), (r'^survey/?$', surveyindex),