2009-05-13 05:24:37 +01:00
import csv
2020-05-28 02:20:50 +01:00
import os
import re
2009-05-13 05:24:37 +01:00
from datetime import *
2020-05-28 02:20:50 +01:00
from django . conf import settings
2020-06-19 16:39:05 +01:00
from troggle . core . models import DataIssue
2020-05-28 04:54:53 +01:00
from troggle . core . models_caves import QM , Cave , LogbookEntry
2009-07-03 05:31:49 +01:00
from utils import save_carefully
2020-05-28 02:20:50 +01:00
2009-05-13 05:24:37 +01:00
2009-05-13 06:15:48 +01:00
def deleteQMs ( ) :
QM . objects . all ( ) . delete ( )
2009-05-13 05:24:37 +01:00
2009-05-13 06:15:48 +01:00
def parseCaveQMs ( cave , inputFile ) :
""" Runs through the CSV file at inputFile (which is a relative path from expoweb) and saves each QM as a QM instance. """
2009-05-13 05:24:37 +01:00
2020-06-19 16:39:05 +01:00
if cave == ' 204-steinBH ' :
2009-05-13 05:25:17 +01:00
try :
2009-05-13 06:15:48 +01:00
steinBr = Cave . objects . get ( official_name = " Steinbrückenhöhle " )
2009-05-13 05:25:17 +01:00
except Cave . DoesNotExist :
2020-05-28 02:20:50 +01:00
print ( " Steinbruckenhoehle is not in the database. Please run parsers. " )
2009-05-13 05:25:17 +01:00
return
2020-06-19 16:39:05 +01:00
elif cave == ' 234-Hauch ' :
2009-05-13 05:25:17 +01:00
try :
2009-05-13 06:15:48 +01:00
hauchHl = Cave . objects . get ( official_name = " Hauchhöhle " )
except Cave . DoesNotExist :
2020-06-19 16:39:05 +01:00
print ( " Hauchhoehle is not in the database. Please run parsers. " )
2009-05-13 06:15:48 +01:00
return
2020-06-19 16:39:05 +01:00
elif cave == ' 161-KH ' :
2009-05-13 06:15:48 +01:00
try :
kh = Cave . objects . get ( official_name = " Kaninchenhöhle " )
2009-05-13 05:25:17 +01:00
except Cave . DoesNotExist :
2020-05-28 02:20:50 +01:00
print ( " KH is not in the database. Please run parsers. " )
2009-05-17 04:31:23 +01:00
parse_KH_QMs ( kh , inputFile = inputFile )
2009-05-13 06:15:48 +01:00
return
qmPath = settings . EXPOWEB + inputFile
2009-05-19 06:32:42 +01:00
qmCSVContents = open ( qmPath , ' rU ' )
2009-05-13 05:25:17 +01:00
dialect = csv . Sniffer ( ) . sniff ( qmCSVContents . read ( ) )
qmCSVContents . seek ( 0 , 0 )
qmReader = csv . reader ( qmCSVContents , dialect = dialect )
2020-05-24 01:57:06 +01:00
next ( qmReader ) # Skip header row
2009-05-13 05:24:37 +01:00
for line in qmReader :
2009-05-13 05:25:17 +01:00
try :
year = int ( line [ 0 ] [ 1 : 5 ] )
#check if placeholder exists for given year, create it if not
2020-06-19 16:39:05 +01:00
message = " ! - " + str ( year ) + " logbook: placeholder entry for ' " + cave + " ' created. Should be re-attached to the actual trip. "
if cave == ' 204-steinBH ' :
placeholder , hadToCreate = LogbookEntry . objects . get_or_create ( date__year = year , place = " 204 " , title = " placeholder for QMs in 204 " , text = message , defaults = { " date " : date ( year , 1 , 1 ) , " cave_slug " : str ( steinBr ) } )
elif cave == ' 234-Hauch ' :
placeholder , hadToCreate = LogbookEntry . objects . get_or_create ( date__year = year , place = " 234 " , title = " placeholder for QMs in 234 " , text = message , defaults = { " date " : date ( year , 1 , 1 ) , " cave_slug " : str ( hauchHl ) } )
2009-05-13 05:25:17 +01:00
if hadToCreate :
2020-06-19 16:39:05 +01:00
print ( message )
DataIssue . objects . create ( parser = ' QMs ' , message = message )
2009-05-13 05:25:17 +01:00
QMnum = re . match ( r " .*?- \ d*?-X?(?P<numb> \ d*) " , line [ 0 ] ) . group ( " numb " )
newQM = QM ( )
newQM . found_by = placeholder
newQM . number = QMnum
if line [ 1 ] == " Dig " :
newQM . grade = " D "
else :
newQM . grade = line [ 1 ]
newQM . area = line [ 2 ]
newQM . location_description = line [ 3 ]
2009-05-13 05:59:40 +01:00
newQM . completion_description = line [ 4 ]
newQM . nearest_station_description = line [ 5 ]
if newQM . completion_description : # Troggle checks if QMs are completed by checking if they have a ticked_off_by trip. In the table, completion is indicated by the presence of a completion discription.
newQM . ticked_off_by = placeholder
2009-05-13 05:25:17 +01:00
newQM . comment = line [ 6 ]
2009-05-13 06:15:48 +01:00
try :
preexistingQM = QM . objects . get ( number = QMnum , found_by__date__year = year ) #if we don't have this one in the DB, save it
if preexistingQM . new_since_parsing == False : #if the pre-existing QM has not been modified, overwrite it
preexistingQM . delete ( )
newQM . save ( )
2020-05-31 19:21:54 +01:00
#print((" - overwriting " + str(preexistingQM) +"\r"))
2009-05-13 06:15:48 +01:00
else : # otherwise, print that it was ignored
2020-05-31 19:21:54 +01:00
print ( ( " - preserving " + str ( preexistingQM ) + " , which was edited in admin \r " ) )
2009-05-13 06:15:48 +01:00
except QM . DoesNotExist : #if there is no pre-existing QM, save the new one
newQM . save ( )
2020-04-28 18:26:08 +01:00
# print("QM "+str(newQM) + ' added to database\r')
2009-05-13 06:15:48 +01:00
except KeyError : #check on this one
2009-05-13 05:25:17 +01:00
continue
2009-07-02 04:10:51 +01:00
except IndexError :
2020-05-24 01:57:06 +01:00
print ( ( " Index error in " + str ( line ) ) )
2009-07-02 04:10:51 +01:00
continue
2009-05-13 05:24:37 +01:00
2009-05-13 06:15:48 +01:00
def parse_KH_QMs ( kh , inputFile ) :
2018-04-15 16:28:13 +01:00
""" import QMs from the 1623-161 (Kaninchenh<6E> hle) html pages
2009-05-13 06:15:48 +01:00
"""
khQMs = open ( settings . EXPOWEB + inputFile , ' r ' )
khQMs = khQMs . readlines ( )
for line in khQMs :
res = re . search ( ' name= \" [CB](?P<year> \ d*)-(?P<cave> \ d*)-(?P<number> \ d*).*</a> (?P<grade>[ABDCV])<dd>(?P<description>.*) \ [(?P<nearest_station>.*) \ ] ' , line )
if res :
res = res . groupdict ( )
year = int ( res [ ' year ' ] )
2020-06-19 16:39:05 +01:00
#check if placeholder exists for given year, create it if not
message = " ! - " + str ( year ) + " logbook: placeholder entry for ' 161 KH ' created. Should be re-attached to the actual trip. "
placeholder , hadToCreate = LogbookEntry . objects . get_or_create ( date__year = year , place = " 161 " , title = " placeholder for QMs in 161 " , text = message , defaults = { " date " : date ( ( year ) , 1 , 1 ) , " cave_slug " : str ( kh ) } )
if hadToCreate :
print ( message )
DataIssue . objects . create ( parser = ' QMs ' , message = message )
2009-05-13 06:15:48 +01:00
lookupArgs = {
' found_by ' : placeholder ,
' number ' : res [ ' number ' ]
}
nonLookupArgs = {
' grade ' : res [ ' grade ' ] ,
2019-03-31 15:39:53 +01:00
' nearest_station_name ' : res [ ' nearest_station ' ] ,
2009-05-13 06:15:48 +01:00
' location_description ' : res [ ' description ' ]
}
2009-05-17 04:31:23 +01:00
2009-05-13 06:15:48 +01:00
save_carefully ( QM , lookupArgs , nonLookupArgs )
2020-06-06 22:51:55 +01:00
def Load_QMs ( ) :
2020-06-19 16:39:05 +01:00
parseCaveQMs ( cave = ' 204-steinBH ' , inputFile = r " 1623/204/qm.csv " )
parseCaveQMs ( cave = ' 234-Hauch ' , inputFile = r " 1623/234/qm.csv " )
parseCaveQMs ( cave = ' 161-KH ' , inputFile = " 1623/161/qmtodo.htm " )
2020-06-06 22:51:55 +01:00
#parseCaveQMs(cave='balkonhoehle',inputFile=r"1623/264/qm.csv")