2008-10-26 21:04:06 +00:00
#.-*- coding: utf-8 -*-
2009-01-07 04:50:55 +00:00
2009-01-18 17:12:41 +00:00
import troggle . settings as settings
2009-01-18 17:18:34 +00:00
import troggle . expo . models as models
2009-01-19 00:22:54 +00:00
from troggle . parsers . people import GetPersonExpeditionNameLookup
2009-01-24 14:01:59 +00:00
from troggle . parsers . cavetab import GetCaveLookup
2009-01-19 00:22:54 +00:00
2008-10-26 21:04:06 +00:00
import csv
import re
import datetime
2009-01-15 06:22:54 +00:00
import os
2008-10-26 21:04:06 +00:00
2009-01-29 23:40:56 +00:00
#
# When we edit logbook entries, allow a "?" after any piece of data to say we've frigged it and
# it can be checked up later from the hard-copy if necessary; or it's not possible to determin (name, trip place, etc)
#
2008-10-26 21:04:06 +00:00
#
# the logbook loading section
#
2009-02-17 01:09:11 +00:00
def GetTripPersons ( trippeople , expedition , logtime_underground ) :
2008-10-26 21:04:06 +00:00
res = [ ]
author = None
2008-11-06 21:29:46 +00:00
for tripperson in re . split ( " ,| \ +|&|&(?! \ w+;)| and " , trippeople ) :
2008-10-26 21:04:06 +00:00
tripperson = tripperson . strip ( )
2008-11-06 21:29:46 +00:00
mul = re . match ( " <u>(.*?)</u>$(?i) " , tripperson )
2008-10-26 21:04:06 +00:00
if mul :
2008-10-27 02:03:52 +00:00
tripperson = mul . group ( 1 ) . strip ( )
2008-10-26 21:04:06 +00:00
if tripperson and tripperson [ 0 ] != ' * ' :
#assert tripperson in personyearmap, "'%s' << %s\n\n %s" % (tripperson, trippeople, personyearmap)
2009-01-19 00:22:54 +00:00
personyear = GetPersonExpeditionNameLookup ( expedition ) . get ( tripperson . lower ( ) )
2008-11-08 18:24:03 +00:00
if not personyear :
print " NoMatchFor: ' %s ' " % tripperson
2009-01-18 15:59:37 +00:00
res . append ( ( personyear , logtime_underground ) )
2008-10-26 21:04:06 +00:00
if mul :
author = personyear
if not author :
2009-01-18 15:59:37 +00:00
author = res [ - 1 ] [ 0 ]
2008-10-26 21:04:06 +00:00
return res , author
2009-01-04 14:06:01 +00:00
def GetTripCave ( place ) : #need to be fuzzier about matching here. Already a very slow function...
# print "Getting cave for " , place
try :
katastNumRes = [ ]
katastNumRes = list ( models . Cave . objects . filter ( kataster_number = int ( place ) ) )
except ValueError :
pass
officialNameRes = list ( models . Cave . objects . filter ( official_name = place ) )
tripCaveRes = officialNameRes + katastNumRes
if len ( tripCaveRes ) == 1 :
# print "Place " , place , "entered as" , tripCaveRes[0]
return tripCaveRes [ 0 ]
elif models . OtherCaveName . objects . filter ( name = place ) :
tripCaveRes = models . OtherCaveName . objects . filter ( name__icontains = place ) [ 0 ] . cave
# print "Place " , place , "entered as" , tripCaveRes
return tripCaveRes
elif len ( tripCaveRes ) > 1 :
print " Ambiguous place " + str ( place ) + " entered. Choose from " + str ( tripCaveRes )
correctIndex = input ( " type list index of correct cave " )
return tripCaveRes [ correctIndex ]
else :
print " No cave found for place " , place
return
2009-01-18 15:59:37 +00:00
2009-01-24 23:59:45 +00:00
noncaveplaces = [ " Journey " , " Loser Plateau " ]
2009-01-18 15:59:37 +00:00
def EnterLogIntoDbase ( date , place , title , text , trippeople , expedition , logtime_underground ) :
trippersons , author = GetTripPersons ( trippeople , expedition , logtime_underground )
2009-01-24 14:01:59 +00:00
# tripCave = GetTripCave(place)
2009-01-04 14:06:01 +00:00
2009-01-18 15:59:37 +00:00
lbo = models . LogbookEntry ( date = date , place = place , title = title [ : 50 ] , text = text , author = author , expedition = expedition )
2009-01-24 23:59:45 +00:00
lplace = place . lower ( )
if lplace not in noncaveplaces :
lbo . cave = GetCaveLookup ( ) . get ( lplace )
2009-01-29 23:40:56 +00:00
#print "pppp %s |%s|" % (lplace, str(lbo.cave))
2009-01-24 14:01:59 +00:00
2008-11-08 18:24:03 +00:00
lbo . save ( )
2009-01-24 14:01:59 +00:00
#print "ttt", date, place
2009-01-18 15:59:37 +00:00
for tripperson , time_underground in trippersons :
pto = models . PersonTrip ( person_expedition = tripperson , place = place , date = date , time_underground = time_underground ,
2008-11-08 18:24:03 +00:00
logbook_entry = lbo , is_logbook_entry_author = ( tripperson == author ) )
2008-11-06 21:29:46 +00:00
pto . save ( )
2008-11-08 18:24:03 +00:00
2009-01-18 15:59:37 +00:00
2008-11-08 18:24:03 +00:00
def ParseDate ( tripdate , year ) :
2008-11-07 02:08:47 +00:00
mdatestandard = re . match ( " ( \ d \ d \ d \ d)-( \ d \ d)-( \ d \ d) " , tripdate )
mdategoof = re . match ( " ( \ d \ d?)/0?( \ d)/(20|19)?( \ d \ d) " , tripdate )
if mdatestandard :
2008-11-08 18:24:03 +00:00
assert mdatestandard . group ( 1 ) == year , ( tripdate , year )
2008-11-07 02:08:47 +00:00
year , month , day = int ( mdatestandard . group ( 1 ) ) , int ( mdatestandard . group ( 2 ) ) , int ( mdatestandard . group ( 3 ) )
2008-11-08 18:24:03 +00:00
elif mdategoof :
assert not mdategoof . group ( 3 ) or mdategoof . group ( 3 ) == year [ : 2 ]
2008-11-07 02:08:47 +00:00
yadd = int ( year [ : 2 ] ) * 100
day , month , year = int ( mdategoof . group ( 1 ) ) , int ( mdategoof . group ( 2 ) ) , int ( mdategoof . group ( 4 ) ) + yadd
else :
2008-11-08 18:24:03 +00:00
assert False , tripdate
2008-11-07 02:08:47 +00:00
return datetime . date ( year , month , day )
2008-11-08 18:24:03 +00:00
# 2007, 2008, 2006
2008-10-27 02:03:52 +00:00
def Parselogwikitxt ( year , expedition , txt ) :
2008-10-26 21:04:06 +00:00
trippara = re . findall ( " ===(.*?)===([ \ s \ S]*?)(?====) " , txt )
for triphead , triptext in trippara :
tripheadp = triphead . split ( " | " )
2008-10-31 14:43:57 +00:00
assert len ( tripheadp ) == 3 , ( tripheadp , triptext )
2008-10-26 21:04:06 +00:00
tripdate , tripplace , trippeople = tripheadp
tripsplace = tripplace . split ( " - " )
2008-11-07 02:08:47 +00:00
tripcave = tripsplace [ 0 ] . strip ( )
2008-10-26 21:04:06 +00:00
tul = re . findall ( " T/?U:? \ s*( \ d+(?: \ . \ d*)?|unknown) \ s*(hrs|hours)? " , triptext )
if tul :
#assert len(tul) <= 1, (triphead, triptext)
#assert tul[0][1] in ["hrs", "hours"], (triphead, triptext)
2008-11-06 21:29:46 +00:00
tu = tul [ 0 ] [ 0 ]
2008-10-26 21:04:06 +00:00
else :
2008-11-06 21:29:46 +00:00
tu = " "
2008-10-26 21:04:06 +00:00
#assert tripcave == "Journey", (triphead, triptext)
2008-11-08 18:24:03 +00:00
ldate = ParseDate ( tripdate . strip ( ) , year )
2008-11-06 21:29:46 +00:00
#print "\n", tripcave, "--- ppp", trippeople, len(triptext)
2009-01-18 15:59:37 +00:00
EnterLogIntoDbase ( date = ldate , place = tripcave , title = tripplace , text = triptext , trippeople = trippeople , expedition = expedition , logtime_underground = 0 )
2008-10-26 21:04:06 +00:00
2008-11-08 18:24:03 +00:00
# 2002, 2004, 2005
2008-10-26 21:04:06 +00:00
def Parseloghtmltxt ( year , expedition , txt ) :
tripparas = re . findall ( " <hr \ s*/>([ \ s \ S]*?)(?=<hr) " , txt )
for trippara in tripparas :
s = re . match ( ''' (?x) \ s*(?:<a \ s+id= " (.*?) " \ s*/>)?
\s * < div \s + class = " tripdate " \s * ( ? : id = " (.*?) " ) ? > ( . * ? ) < / div >
2008-11-06 21:29:46 +00:00
\s * < div \s + class = " trippeople " > \s * ( . * ? ) < / div >
\s * < div \s + class = " triptitle " > \s * ( . * ? ) < / div >
2008-10-26 21:04:06 +00:00
( [ \s \S ] * ? )
2008-11-06 21:29:46 +00:00
\s * ( ? : < div \s + class = " timeug " > \s * ( . * ? ) < / div > ) ?
2008-10-26 21:04:06 +00:00
\s * $
''' , trippara)
assert s , trippara
2008-11-06 21:29:46 +00:00
tripid , tripid1 , tripdate , trippeople , triptitle , triptext , tu = s . groups ( )
2008-11-08 18:24:03 +00:00
ldate = ParseDate ( tripdate . strip ( ) , year )
#assert tripid[:-1] == "t" + tripdate, (tripid, tripdate)
trippeople = re . sub ( " Ol(?!l) " , " Olly " , trippeople )
trippeople = re . sub ( " Wook(?!e) " , " Wookey " , trippeople )
triptitles = triptitle . split ( " - " )
if len ( triptitles ) > = 2 :
tripcave = triptitles [ 0 ]
else :
2008-10-31 14:43:57 +00:00
tripcave = " UNKNOWN "
2008-11-06 21:29:46 +00:00
#print "\n", tripcave, "--- ppp", trippeople, len(triptext)
2008-10-30 13:13:35 +00:00
ltriptext = re . sub ( " </p> " , " " , triptext )
ltriptext = re . sub ( " \ s*? \n \ s* " , " " , ltriptext )
2008-11-08 18:24:03 +00:00
ltriptext = re . sub ( " <p> " , " \n \n " , ltriptext ) . strip ( )
2009-01-18 15:59:37 +00:00
EnterLogIntoDbase ( date = ldate , place = tripcave , title = triptitle , text = ltriptext , trippeople = trippeople , expedition = expedition , logtime_underground = 0 )
2008-11-08 18:24:03 +00:00
2008-10-26 21:04:06 +00:00
2008-11-08 18:24:03 +00:00
# main parser for pre-2001. simpler because the data has been hacked so much to fit it
2008-11-06 21:29:46 +00:00
def Parseloghtml01 ( year , expedition , txt ) :
tripparas = re . findall ( " <hr[ \ s/]*>([ \ s \ S]*?)(?=<hr) " , txt )
for trippara in tripparas :
s = re . match ( u " (?s) \ s*(?:<p>)?(.*?)</?p>(.*)$(?i) " , trippara )
2008-11-08 18:24:03 +00:00
assert s , trippara [ : 100 ]
2008-11-06 21:29:46 +00:00
tripheader , triptext = s . group ( 1 ) , s . group ( 2 )
2008-11-08 18:24:03 +00:00
mtripid = re . search ( ' <a id= " (.*?) " ' , tripheader )
tripid = mtripid and mtripid . group ( 1 ) or " "
tripheader = re . sub ( " </?(?:[ab]|span)[^>]*> " , " " , tripheader )
2009-01-24 23:59:45 +00:00
#print [tripheader]
2008-11-08 18:24:03 +00:00
#continue
2008-11-06 21:29:46 +00:00
tripdate , triptitle , trippeople = tripheader . split ( " | " )
2008-11-08 18:24:03 +00:00
ldate = ParseDate ( tripdate . strip ( ) , year )
mtu = re . search ( ' <p[^>]*>(T/?U.*) ' , triptext )
if mtu :
tu = mtu . group ( 1 )
triptext = triptext [ : mtu . start ( 0 ) ] + triptext [ mtu . end ( ) : ]
else :
tu = " "
triptitles = triptitle . split ( " - " )
tripcave = triptitles [ 0 ] . strip ( )
2009-01-18 19:50:30 +00:00
ltriptext = triptext
mtail = re . search ( ' (?:<a href= " [^ " ]* " >[^<]*</a>| \ s|/|-|&|</?p>| \ ((?:same day| \ d+) \ ))*$ ' , ltriptext )
if mtail :
#print mtail.group(0)
ltriptext = ltriptext [ : mtail . start ( 0 ) ]
ltriptext = re . sub ( " </p> " , " " , ltriptext )
2008-11-06 21:29:46 +00:00
ltriptext = re . sub ( " \ s*? \n \ s* " , " " , ltriptext )
2009-01-18 19:50:30 +00:00
ltriptext = re . sub ( " <p>|<br> " , " \n \n " , ltriptext ) . strip ( )
2008-11-08 18:24:03 +00:00
#ltriptext = re.sub("[^\s0-9a-zA-Z\-.,:;'!]", "NONASCII", ltriptext)
2009-01-18 19:50:30 +00:00
ltriptext = re . sub ( " </?u> " , " _ " , ltriptext )
ltriptext = re . sub ( " </?i> " , " ' ' " , ltriptext )
ltriptext = re . sub ( " </?b> " , " ' ' ' " , ltriptext )
2008-11-08 18:24:03 +00:00
#print ldate, trippeople.strip()
2009-03-14 08:38:55 +00:00
# could includ the tripid (url link for cross referencing)
2009-01-18 15:59:37 +00:00
EnterLogIntoDbase ( date = ldate , place = tripcave , title = triptitle , text = ltriptext , trippeople = trippeople , expedition = expedition , logtime_underground = 0 )
2008-11-08 18:24:03 +00:00
2008-10-31 14:43:57 +00:00
def Parseloghtml03 ( year , expedition , txt ) :
tripparas = re . findall ( " <hr \ s*/>([ \ s \ S]*?)(?=<hr) " , txt )
for trippara in tripparas :
s = re . match ( u " (?s) \ s*<p>(.*?)</p>(.*)$ " , trippara )
2008-11-08 18:24:03 +00:00
assert s , trippara
2008-10-31 14:43:57 +00:00
tripheader , triptext = s . group ( 1 ) , s . group ( 2 )
2008-11-08 18:24:03 +00:00
tripheader = re . sub ( " " , " " , tripheader )
tripheader = re . sub ( " \ s+ " , " " , tripheader ) . strip ( )
sheader = tripheader . split ( " -- " )
tu = " "
if re . match ( " T/U|Time underwater " , sheader [ - 1 ] ) :
tu = sheader . pop ( )
if len ( sheader ) != 3 :
print sheader
# continue
tripdate , triptitle , trippeople = sheader
ldate = ParseDate ( tripdate . strip ( ) , year )
triptitles = triptitle . split ( " , " )
if len ( triptitles ) > = 2 :
tripcave = triptitles [ 0 ]
else :
2008-10-31 14:43:57 +00:00
tripcave = " UNKNOWN "
2008-11-06 21:29:46 +00:00
#print tripcave, "--- ppp", triptitle, trippeople, len(triptext)
2008-10-31 14:43:57 +00:00
ltriptext = re . sub ( " </p> " , " " , triptext )
ltriptext = re . sub ( " \ s*? \n \ s* " , " " , ltriptext )
2008-11-08 18:24:03 +00:00
ltriptext = re . sub ( " <p> " , " \n \n " , ltriptext ) . strip ( )
ltriptext = re . sub ( " [^ \ s0-9a-zA-Z \ -.,:; ' !&() \ [ \ ]<>?=+* % ] " , " _NONASCII_ " , ltriptext )
2009-01-18 15:59:37 +00:00
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 ) ,
2009-03-14 08:38:55 +00:00
( " 1996 " , " 1996/log.htm " , Parseloghtml01 ) ,
2009-03-11 10:44:15 +00:00
( " 1995 " , " 1995/log.htm " , Parseloghtml01 ) ,
( " 1994 " , " 1994/log.htm " , Parseloghtml01 ) ,
2009-03-14 08:38:55 +00:00
( " 1993 " , " 1993/log.htm " , Parseloghtml01 ) ,
2009-01-18 15:59:37 +00:00
]
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 ( )
2009-02-17 01:09:11 +00:00
# The below is all unnecessary, just use the built in get_previous_by_date and get_next_by_date
2009-03-14 08:38:55 +00:00
# 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()
2009-01-18 15:59:37 +00:00
2009-03-14 08:38:55 +00:00
# from trips rather than logbook entries, which may include events outside the expedition
2009-01-18 15:59:37 +00:00
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 ( )
2009-02-17 01:09:11 +00:00
# The below has been replaced with the methods get_next_by_id and get_previous_by_id
# # order by appearance in the logbook (done by id)
# lprevlogbookentry = None
# for logbookentry in expedition.logbookentry_set.order_by('id'):
# logbookentry.logbookentry_prev = lprevlogbookentry
# if lprevlogbookentry:
# lprevlogbookentry.logbookentry_next = logbookentry
# lprevlogbookentry.save()
# logbookentry.logbookentry_next = None
# logbookentry.save()
# lprevlogbookentry = logbookentry
2009-01-18 19:50:30 +00:00
2009-03-14 08:38:55 +00:00
# This combined date / number key is a weird way of doing things. Use the primary key instead. If we are going to use the date for looking up entries, we should set it up to allow multiple results.
2009-02-17 01:09:11 +00:00
# # order by date for setting the references
# lprevlogbookentry = None
# for logbookentry in expedition.logbookentry_set.order_by('date'):
# if lprevlogbookentry and lprevlogbookentry.date == logbookentry.date:
# mcount = re.search("_(\d+)$", lprevlogbookentry.href)
# mc = mcount and (int(mcount.group(1)) + 1) or 1
# logbookentry.href = "%s_%d" % (logbookentry.date, mc)
# else:
# logbookentry.href = "%s" % logbookentry.date
# logbookentry.save()
# lprevlogbookentry = logbookentry
2009-01-18 15:59:37 +00:00
def LoadLogbookForExpedition ( expedition ) :
2009-01-29 23:40:56 +00:00
print " deleting logbooks for " , expedition
2009-01-18 15:59:37 +00:00
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 ( ) )
2008-10-26 21:04:06 +00:00
def LoadLogbooks ( ) :
models . LogbookEntry . objects . all ( ) . delete ( )
2008-10-27 00:36:06 +00:00
expowebbase = os . path . join ( settings . EXPOWEB , " years " )
2008-11-07 02:30:53 +00:00
#yearlinks = [ ("2001", "2001/log.htm", Parseloghtml01), ] #overwrite
2009-03-14 08:38:55 +00:00
#yearlinks = [ ("1996", "1996/log.htm", Parseloghtml01),] # overwrite
2008-10-26 21:04:06 +00:00
2008-11-06 21:29:46 +00:00
for year , lloc , parsefunc in yearlinks :
2008-10-26 21:04:06 +00:00
expedition = models . Expedition . objects . filter ( year = year ) [ 0 ]
fin = open ( os . path . join ( expowebbase , lloc ) )
txt = fin . read ( )
2008-11-08 18:24:03 +00:00
fin . close ( )
parsefunc ( year , expedition , txt )
2009-01-18 15:59:37 +00:00
SetDatesFromLogbookEntries ( expedition )
2008-10-26 23:27:31 +00:00
2009-03-14 08:38:55 +00:00