chaloBEST/chaloBEST/imports/data_mapper.py
Johnson Chetty ea2de8d494 gtfs v 1
2012-02-15 14:46:24 +01:00

380 lines
10 KiB
Python

from mumbai.models import *
import csv
from settings import PROJECT_ROOT
from os.path import join
import json
import datetime
import sys
from django.contrib.gis.geos import Point
from imports.import_atlas import getFromToStopsForRoute, importUniqueRoutes
from imports import postload_cleanup as postclean
globalerr = []
def RouteType_save(entry):
obj = RouteType(code=entry[0], rtype=entry[1], faretype=entry[2])
obj.save()
#print obj.__dict__
def Route_save(entry):
"""
try:
f_stop = Stop.objects.filter(name=str(entry[2]))[0]
except IndexError:
f_stop = None
try:
t_stop = Stop.objects.filter(name=str(entry[3]))[0]
except IndexError:
t_stop = None
"""
from_to = getFromToStopsForRoute(entry[0])
if from_to is None:
globalerr.append({"data" :entry[0], error:["Route not found"]})
#obj = Route(code=entry[0], alias=entry[1], from_stop_txt=entry[2], to_stop_txt=entry[3], from_stop=from_to[0], to_stop=from_to[1], distance=float(entry[4]), stages=int(entry[5]))
obj = Route(
code=str(entry[0]),
alias=str(entry[1]),
from_stop=from_to[0],
from_stop_txt=str(entry[2]),
to_stop_txt=str(entry[3]),
to_stop=from_to[1],
distance=float(entry[4]),
stages=int(entry[5]))
obj.save()
# throw an error if the stops mapped do not exist.
# but load nulls into db anyway
# IndexError implies that nothing was mapped.
# MultipleRows found indicates ambiguity when there should'nt be.
#f_stop = Stop.objects.get(name=str(entry[2]))[0]
#t_stop = Stop.objects.get(name=str(entry[3]))[0]
#print obj.__dict__
def HardCodedRoute_save(entry):
obj = HardCodedRoute(code=str(entry[0]), alias=entry[1], faretype=entry[2])
obj.save()
#print obj.__dict__
def Depot_save(entry):
obj = Depot(
code=str(entry[0]),
name=str(entry[1]),
stop=int(entry[2])
)
obj.save()
#print obj.__dict__
def Holiday_save(entry):
date_format = entry[0].rsplit('.')
theday = int(date_format[0])
themonth = int(date_format[1])
theyear = int('20'+ date_format[2])
obj = Holiday(date=datetime.date(day=theday, month=themonth, year=theyear), name=str(entry[1]))
obj.save()
#print obj.__dict__
def RouteDetail_save(entry):
temp_stop=Stop.objects.get(code=int(entry[2]))
"""try:
temp_route=Route.objects.get(code=str(entry[0]))
except:
temp_route=None
try:
temp_stop=Stop.objects.get(code=int(entry[2]))
except:
temp_stop=None
"""
obj = RouteDetail(
route_code = entry[0],
route = None,
serial=int(entry[1]),
stop= temp_stop,
stage=(lambda:entry[3].startswith('1'), lambda:None)[ entry[3] == '' ](),
km=(lambda:None,lambda:float(entry[4]))[ entry[4] != '' ]())
obj.save()
#print obj.__dict__
def Road_save(entry):
obj = Road(code=int(entry[0]), name=str(entry[1]))
obj.save()
#print obj.__dict__
def Fare_save(entry):
obj = Fare(
slab=float(entry[0]),
ordinary=int(entry[1]),
limited=int(entry[2]),
express=int(entry[3]),
ac=int(entry[4]),
ac_express=int(entry[5])
)
obj.save()
#print obj.__dict__
def Area_save(entry):
obj = Area(code=int(entry[0]), name= str(entry[1]))
obj.save()
#print obj.__dict__
def Stop_save(entry):
_road = Road.objects.get(code=int(entry[4]))
_area = Area.objects.get(code=int(entry[5]))
try:
_depot = Depot.objects.filter(code=str(entry[6]))[0]
except IndexError:
_depot = None
obj = Stop(
code=int(entry[0]),
name=str(entry[1]),
dbdirection=str(entry[2]),
chowki=(entry[3]).startswith('TRUE'),
road=_road,
area=_area,
depot=_depot
)
obj.save()
#print obj.__dict__
# There is no model as StopMarathi/AreaMarathi, but this is done to separate errors arising from different files, and also that the Marathi names should be done after the Stop and Area entities have been fully loaded cuz thats how we get them from BEST.
def StopMarathi_save(entry):
obj = Stop.objects.get(code=int(entry[0]))
obj.name_mr = unicode(entry[1], 'utf-8')
obj.save()
#print obj.__dict__
def AreaMarathi_save(entry):
obj = Area.objects.get(code=int(entry[0]))
obj.name_mr = unicode(entry[1], 'utf-8')
obj.save()
#print obj.__dict__
def StopLocation_save(entry):
this_stop = Stop.objects.get(code=int(entry[4]))
if entry[0] and entry[1]:
loc1 = StopLocation(stop=this_stop, point=Point(float(entry[1]), float(entry[0])),direction='U' )
loc1.save()
if entry[2] and entry[3]:
loc2 = StopLocation(stop=this_stop, point=Point(float(entry[3]), float(entry[2])),direction='D' )
loc2.save()
saveorder = ["Fare","Holiday","Area","Road","Depot","Stop", "StopMarathi","AreaMarathi","RouteDetail", "Route","RouteType","HardCodedRoute","StopLocation" ]
mappingtosave = {
"Fare":Fare_save,
"Holiday":Holiday_save,
"Area":Area_save,
"Road":Road_save,
"Stop":Stop_save,
"Depot":Depot_save,
"RouteDetail":RouteDetail_save,
"Route":Route_save,
"RouteType":RouteType_save,
"HardCodedRoute":HardCodedRoute_save,
"StopMarathi":StopMarathi_save,
"AreaMarathi":AreaMarathi_save,
"StopLocation":StopLocation_save
# There is no model as StopMarathi/AreaMarathi, but this is done to separate errors arising from different input files.
}
def loadFKinRouteDetail():
err=[]
good_saves = 0
print "\nLoading foreign keys into Route Details ... "
for rd in RouteDetail.objects.all():
try:
rd.route=Route.objects.get(code=rd.route_code)
rd.save()
good_saves+=1
except:
rd.route=None
err.append({"data":rd.route_code, "error":["Route Not Found in Route"]})
#errors = open(join(PROJECT_ROOT, "../errors/RouteNotFoundErrors.json"), "w")
size = len(err)
print "No. of Routes in RouteDetail mapped to Route: " , str(good_saves)
print "No. of Routes in RouteDetail not mapped to Route: " , str(size)
if (size != 0) :
print "See /errors/RouteNotFoundErrors.json for details"
#errors.write(json.dumps(err, indent=2))
#errors.close()
return err
def CsvLoader(thismodel):
try:
CsvFile = csv.reader(open(join(PROJECT_ROOT, "../db_csv_files/"+thismodel+ ".csv"), "r"), delimiter="\t")
except:
print "Error opening file. Please check if ", thismodel," file exists and you have read/write permissions. Input files should be tab delimited, not comma delimited."
exit()
globalerr =[]
#f.write("Data" + '\t' + "Error thrown" + '\n')
header = CsvFile.next()
print "\nLoading " + thismodel + "s..."
print "Fields: ", header
if ( header[0].find(',') != -1 ):
print thismodel + "input file should be tab delimited, not comma delimited!"
return
errcount=0
for entry in CsvFile:
try:
#get the function for this model
object_save = mappingtosave[thismodel]
object_save(entry)
except:
globalerr.append({"data":str(entry), "error":str(sys.exc_info())})
errcount+=1;
#print "Error:", str(entry) + '\t' + str(sys.exc_info()[0]) + '\n'
errors = open(join(PROJECT_ROOT, "../errors/"+ thismodel + "Errors.json"), 'w')
errors.write(json.dumps(globalerr, indent=2))
errors.close()
DataLinesInFile = CsvFile.line_num -1
stats = str(DataLinesInFile - errcount ) + " " + thismodel + "s loaded without errors. Number of Errors encountered: " + str(errcount) + ". "
if errcount > 0 :
stats+="See " + thismodel + "Errors.json file for details."
print stats
return
def fire_up():
for model in saveorder:
CsvLoader(model)
loadFKinRouteDetail()
# also
importUniqueRoutes()
print "loading UniqueRoute..."
postclean.copydefaultStopLocations()
postclean.copynames2display_name()
#----------------------------------------------------------
"""
RouteTypes
data changed
5 Rind Limited LTD
to
5 Ring Limited LTD
9 A/C Exp Ext ACEXP
to
9 AC Exp Ext ACEXP
test = CsvFile.next()
print test
CsvFile = csv.reader(open("/home/johnson/Desktop/chaloBEST/db_csv_files/AreaMaster.csv", "r"))
CsvFile.next()
for entry in CsvFile:
obj = AreaMaster(int(entry[0]), entry[1])
obj.save()
for line in f.readlines():
if str(line) not in slist:
slist.append(str(line))
Different Shedule entries in atlas:
['MS', 'HOL', 'SUN', 'MF&HOL', ' ', 'SAT', '', 'MF', 'SH', 'AD', 'SAT&SUN', 'MS&HOL', 'FW', 'SAT/SH', 'FH', 'SAT&HOL', 'SAT&SH', 'SAT/SUND&HOL', 'S/H', 'SAT,SUN&HOL', '2nd &4th']
DAYS = {
1: 'Monday',
2: 'Tuesday',
3: 'Wednesday',
4: 'Thursday',
5: 'Friday',
6: 'Saturday',
7: 'Sunday',
8: 'Holiday'
}
SCHED =
{'MS':[1,2,3,4,5,6],
'HOL':[8],
'SUN':[7],
'MF&HOL':[1,2,3,4,5,8],
'SAT':[6],
'MF':[1,2,3,4,5],
'SH':[7,8],
'AD':[1,2,3,4,5,6,7,8],
'SAT&SUN':[6,7],
'MS&HOL':[1,2,3,4,5,6,8],
'FW':[1,2,3,4,5,6,7],
'SAT/SH':[6,7,8],
'FH':['???'],
'SAT&HOL':[6,8],
'SAT&SH':[6,7,8],
'SAT/SUND&HOL':[6,7,8],
'S/H':[7,8],
'SAT,SUN&HOL':[6,7,8],
'2nd &4th':['???']
}
}
In Atlas:
SPL-1 8 6 7 DD CD Chh.Shivaji Terminus 8.15 18.53 N.C.P.A. 8.30 19.05 5.8 25 27 32 -- 3 6 4 --- Chh.Shivaji Terminus 20 2nd &4th
StopMaster
2312 OM NGR.(WARE HOUSE) 0 0 3 MLD
changed to
2312 OM NGR.(WARE HOUSE) 0 29 3 MLD
3899 DAVA BAZAR(KALBADEVI) 0 641 0 CD
changed to
3899 DAVA BAZAR(KALBADEVI) 0 641 150 CD
4379 CRISIL HOUSE U 0 229 0 VKD
changed to
4379 CRISIL HOUSE U 0 229 118 VKD
4551 SAFED POOL U 0 374 0 KLD
changed to
4551 SAFED POOL U 0 374 170 KLD
AreaCsv = csv.reader(open("/home/johnson/Desktop/chaloBEST/db_csv_files/AreaMaster.csv", "r"))
AreaCsv = csv.reader(open("/home/johnson/Desktop/chaloBEST/db_csv_files/AreaMaster.csv", "r"))
AreaCsv = csv.reader(open("/home/johnson/Desktop/chaloBEST/db_csv_files/AreaMaster.csv", "r"))
AreaCsv = csv.reader(open("/home/johnson/Desktop/chaloBEST/db_csv_files/AreaMaster.csv", "r"))
AreaCsv = csv.reader(open("/home/johnson/Desktop/chaloBEST/db_csv_files/AreaMaster.csv", "r"))
"""