Warning: Can't use blame annotator:
svn blame failed on branches/LCSv1/controllers/default.py.bak: ("Can't find a temporary directory: Internal error", 20014)

source: tmcsimulator/branches/LCSv1/controllers/default.py.bak @ 593

Revision 593, 14.6 KB checked in by jdalbey, 6 years ago (diff)

Add branch LCSv1

RevLine 
1# Constants
2hwys = ['','1','5', '22', '55', '57', '73', '74', '91', '133', '142', '241', '261', '405', '605']
3hwyDirections = ['','NB', 'SB', 'NB/SB','EB','WB','EB/WB']
4# Show the login page
5def index():
6    form = FORM(LABEL('Username:',_for='username', _class="label"),
7                INPUT(_name='username',_size='10'),BR(),
8                INPUT(_type='submit', _class="submit-button btn btn-primary"))
9    if form.process().accepted:
10        # Put the username entry into the session variable
11        session.username = form.vars.username
12        redirect(URL('home'))
13    return dict(form=form)
14def home():
15    return dict(name=session.username)
16def help():
17    return dict()
18# List all the current records in the database - remove in final application
19def list():
20    highways = db().select(db.closures.ALL, orderby=db.closures.lognum)
21    return dict(highways = highways)
22# Show details of a single record - remove in final application
23def show():
24    # Retrieve the requested log entry from the database
25    # Assumes the requested entry exists in the db (no error handling yet)
26    hwy = db(db.closures.lognum == request.args(0)).select().first()
27    return dict(hwy=hwy)
28# Display a search form
29def search():
30    form = FORM(LABEL('ClosureID/Log:',_for='closureid', _class="label"), INPUT(_name='closureid',_size='7'),INPUT(_name='lognum',_size='3'),XML('   '), LABEL('Route: ',_for='route', _class="label"), SELECT(hwys,_name='route'), XML('   '), LABEL('Direction: ',_for='direction', _class="label"), SELECT(hwyDirections,_name='direction'), BR(),BR(),LABEL('Dates:',_for='startdate', _class="label") ,INPUT(_name='startdate',_class='date'), XML('   '), LABEL('  to:',_for='enddate', _class="label"), INPUT(_name='enddate'),'(MMDDYYYY)',BR(),BR(),INPUT(_type='submit', _class="submit-button btn btn-primary"))
31    if form.process().accepted:
32        # Put the form fields into the session variables
33        session.closureid = form.vars.closureid
34        session.lognum = form.vars.lognum
35        session.startdate = form.vars.startdate
36        session.enddate = form.vars.enddate
37        session.route = form.vars.route
38        session.direction = form.vars.direction
39        redirect(URL('results'))
40    return dict(form=form)
41# Show the item that was found in the search
42def results():
43    if (len(session.closureid) != 0):
44        hwy = db(db.closures.closureid == session.closureid).select()
45        msg = "Closure ID = " + session.closureid
46    elif (len(session.route) != 0):
47        hwy = db(db.closures.route == session.route).select()
48        msg = "route = " + session.route
49    elif (len(session.startdate) == 10):
50        hwy = db(db.closures.startdate >= session.startdate).select()
51        msg = "Start Date >= " + session.startdate
52    else:
53        hwy = db().select(db.closures.ALL)
54        msg = "ALL"
55    count = len(hwy)
56    # Show the results in table format.  Get the radio call number from supervisor name lookup
57    header = THEAD(TR(TH(''), TH('DTM',BR(),'Area'), TH('Closure ID/',BR(),'Log No.'),TH('Route & Dir/',BR(),'Type of Closure'),TH('Start Date/',BR(),'End Date/',BR(),'Est. Delay'),TH('Facility'),TH('Limits'),TH('Work'), TH('TMP:',BR(),'Cozeep/',BR(),'Detour'),TH('Requestor/',BR(),'Radio Call No.')))
58    multiform = []
59    for row in hwy:
60        statusfields = row.closureid +','+ row.lognum + ',1097,' + str(row.s1097user) +','+ str(row.startdate) + ',' + formatTime(row.starttime) +','+str(row.s1097date)+','+ formatTime(row.s1097time) + ',1098,' + str(row.s1098user) +','+ str(row.s1098date)+','+ formatTime(row.s1098time)+ ',1022,' + str(row.s1022user) +','+ str(row.s1022date)+','+ formatTime(row.s1022time)
61        # Each row contains a form with two buttons and columns with fields from database
62        multiform.append(TR(TD(
63                    XML("<button onclick=showPopup(\'"),statusfields,XML("\')>View History</button>"),BR(),
64                    FORM(
65                          INPUT(_type='submit',_name='btn2',_value='Show Status Form'),
66                          INPUT(_type='hidden',_name='row',_value=row.closureid))),
67                          TD(row.closureid[0]),TD(row.closureid,HR(),row.lognum), TD(row.route,' ',row.direction,HR(),row.closuretype), TD(row.startdate,' ',formatTime(row.starttime),HR(),row.enddate,' ',formatTime(row.endtime),HR(),row.estdelay), TD(row.facility),TD(row.startlocation,HR(),row.endlocation), TD(row.worktype), TD(row.tmpcozeep,BR(),row.tmpdetour), TD(row.supervisor,HR(),db(db.supervisors.name == row.supervisor).select().first().radiocallnum) ))
68
69    session.chosenid = request.vars.row #Pass the hidden field containing the closure ID
70    if request.vars.btn2:
71        redirect(URL('statuslist'))
72
73    return dict(msg=msg, count=count, highways=hwy, table=header, multiform=multiform)
74
75# Show the status box next to each search result
76def statuslist():
77    closedItems = []
78    if (session.chosenid):
79        if (type(session.chosenid) is str):
80            retrieved = db(db.closures.closureid == session.chosenid).select().first()
81            closedItems.append(retrieved)
82        else:
83            # This logic is available to show multiple results, for possible future use.
84            for item in session.chosenid:
85                retrieved = db(db.closures.closureid == item).select().first()
86                closedItems.append(retrieved)
87
88        form = FORM(BR(),
89                TABLE(THEAD(TR(TH('Closure ID/',BR(),'Log No.'),TH('Route & Dir',BR(),'Type of Closure'),TH('Start Date/',BR(),'End Date/',BR(),'Est. Delay'),TH('Requestor/',BR(),'Radio Call No.'),TH('Status'))),
90                    [TR(TD(row.closureid,HR(),row.lognum),TD(row.route,' ',row.direction,HR(),row.closuretype),TD(row.startdate,HR(),row.enddate,HR(),row.estdelay),TD(row.supervisor,BR(),db(db.supervisors.name == row.supervisor).select().first().radiocallnum),TD(LABEL('1097'), INPUT(_type='checkbox', _name='statustype', _value='1097'+row.closureid),LABEL('1098'), INPUT(_type='checkbox', _name='statustype', _value='1098'+row.closureid),LABEL('1022'), INPUT(_type='checkbox', _name='statustype', _value='1022'+row.closureid),BR(), LABEL('Statuser:'),INPUT(_name='statuser',_size='9'))) for row in closedItems],
91                    _border='1', _cellpadding='5'),INPUT(_type='submit',_value="submit status form"),)
92       
93    else:
94        msg = "No items were selected.  Use the checkbox in the lefthand column."
95        form = ""
96        return dict(msg=msg,form=form)
97   
98    if form.process().accepted:
99        #session.flash = 'Status submit acknowledgement appears here.'
100        session.statustype = form.vars.statustype
101        session.statuser = form.vars.statuser
102        redirect(URL('statusAck'))
103    return dict(form=form)
104
105# show status update acknowledgement - and update database
106def statusAck():
107    if (session.statustype):
108        if (type(session.statustype) is str):
109            msg = "You submitted a status update for " + session.statustype[4:] + ": " + session.statustype[0:4]
110#           Perform the update on the database
111            # Construct the name of the field to update
112            fieldname = "s"+session.statustype[0:4]+"user"
113            db(db.closures.closureid == session.statustype[4:]).update(**{fieldname:session.statuser})
114            import datetime
115            now = datetime.datetime.today()
116            fieldname = "s"+session.statustype[0:4]+"date"
117            db(db.closures.closureid == session.statustype[4:]).update(**{fieldname:now.strftime("%Y%m%d")})
118            fieldname = "s"+session.statustype[0:4]+"time"
119            db(db.closures.closureid == session.statustype[4:]).update(**{fieldname:now.strftime("%H%M")})
120        else:
121            msg = "error because only checking one box is allowed."
122    else:
123        msg = "Error no statustype checkbox was checked"
124       
125    return dict(msg=msg)
126# Utility functions for formatting
127def formatDate(msg):
128    if (msg):
129        return msg[4:6]+"/"+msg[6:8]+"/"+msg[0:4]
130    else:
131        return ""
132def formatTime(msg):
133    if (msg):
134        return msg[0:2]+':'+msg[2:4]
135    else:
136        return ""
137# Create a new record
138def submit():
139    # Don't name this function 'request' because it creates a name conflict with http.request
140    hournames = ['','00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23']
141    closuretypes = ['', 'Lane', 'Full', 'Moving', 'One-Way Traffic', 'Alternating Lanes', 'Traffic Break']
142    facilities = ['', 'Connector', 'Conventional_Hwy', 'Mainline', 'Off Ramp', 'On Ramp', 'Rest Area', 'Surface Street']
143    worktypes = ['','AC Paving', 'Accident Investigation', 'Attenuator Repair', 'Blasting', 'Bridge Inspection', 'Bridge Work', 'Brush Fire', 'Chip Seal Operation', 'Concrete Pour', 'Core Drilling', 'Crack Seal Operation', 'Curb/Gutter/Sidewalk Work', 'Drainage Cleaning', 'Drainage Inspection', 'Drainage Work', 'Electrical Work', 'Emergency Work', 'Falsework Installation', 'Falsework Removal', 'Fence Work', 'Filming Activity', 'Fog Seal Operation', 'Graffiti Removal', 'Grinding and Paving', 'Grinding Operation', 'Guardrail Repair', 'Guardrail Work', 'Highway Construction', 'K-rail Installation', 'K-rail Removal', 'Landscape Work', 'Litter Removal', 'Maintenance Operation', 'Median Barrier Work', 'Miscellaneous Work', 'Pavement Marker Replacement', 'Pavement Repair', 'Pavement Work', 'Paving Operation', 'Pile Driving', 'Police Investigation', 'Roadway Excavation', 'Roadway Flooding', 'Sewer Work', 'Shoulder Work', 'Sign Work', 'Slab Replacement', 'Slide Removal', 'Slope Clearing', 'Soundwall Work', 'Special Event', 'Spray Operation', 'Striping Operation', 'Survey Work', 'Sweeping Operation', 'Traffic Signal Work', 'Tree Work', 'Utility Work', 'Vegetation Spraying']
144    supervisors = ['']  # List of names for the dropdown box
145    # Obtain all the supervisor names from the database
146    for row in db().select(db.supervisors.ALL):
147        supervisors.append(row.name)
148    # Build the list of street locations and a hidden cross street lookup table
149    streets = ['']
150    streetlookup = []
151    for row in db().select(db.streets.ALL, orderby=db.streets.street):
152        streets.append(row.street)
153        streetlookup.append(row.route + ',' + row.street)
154
155    form = FORM(
156                LABEL('*Route',_for='route'), SELECT(hwys,_name='route', _id='routecombo', _onchange='routechanged()', requires=IS_LENGTH(minsize=1,error_message='route cannot be empty')), XML('&nbsp;&nbsp;&nbsp;'),
157           LABEL('*Direction',_for='direction'), SELECT(hwyDirections,_name='direction', requires=IS_LENGTH(minsize=1,error_message='direction cannot be empty')), XML('&nbsp;&nbsp;&nbsp;'),
158           LABEL('*Facility',_for='facility'), SELECT(facilities,_name='facility', requires=IS_LENGTH(minsize=1,error_message='facility cannot be empty')), BR(),BR(),
159           TABLE(TR(TD(),TD('*County'),TD('*Location')),TR(TD('BEGIN='),TD(SELECT('ORA',_name='startcounty')),TD(SELECT(streets,_name='startlocation',_id='startlocation')),
160           TR(TD('END='),TD(SELECT('ORA',_name='endcounty')),TD(SELECT(streets,_name='endlocation',_id='endlocation'))))),BR(),
161           'Date Range:',BR(),
162           LABEL('From',_for='startdate'),INPUT(_name='startdate',_size='8',_class='date'), XML('&nbsp;&nbsp;&nbsp;'),
163           LABEL('to:',_for='enddate'), INPUT(_name='enddate',_size='8',_class='date'),'(MMDDYYYY)',XML('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'),
164           LABEL('Times',_for='starttime'),SELECT(hournames,_name='starttime'),
165           LABEL(':',_for='starttimemin'),SELECT('','00','15','30','45','59',_name='starttimemin'), XML('&nbsp;&nbsp;'),
166           LABEL('to:',_for='endtime'),SELECT(hournames,_name='endtime'),
167           LABEL(':',_for='endtimemin'),SELECT('','00','15','30','45','59',_name='endtimemin'), BR(),BR(),
168           TABLE(TR(TD('*Type of Closure'),TD('*Type of Work'),TD('Estimated Delay'),TD('TMP Details')),
169                 TR(TD(SELECT(closuretypes,_name='closuretype',requires=IS_LENGTH(minsize=1,error_message='type of closure cannot be empty'))),
170                    TD(SELECT(worktypes,_name='worktype', requires=IS_LENGTH(minsize=1,error_message='type of work cannot be empty'))),
171                    TD(INPUT(_name='estdelay',_size='4'),'minutes'),
172                    TD(INPUT(_type='checkbox',_name='cozeep'),'CoZeep MaZeep/CHP',BR(),
173                       INPUT(_type='checkbox', _name='detour'),'Detour Available')),
174                 _width='100%' ),
175    TABLE(TR(TD('*Supervisor'),TD('Field Rep')),
176                  TR(TD(SELECT(supervisors,_name='supervisor', requires=IS_LENGTH(minsize=1,error_message='supervisor cannot be empty'))),
177                     TD(SELECT(supervisors,_name='fieldrep')))),
178    TABLE(TR(TD('Meeting Place/CHP Contact'),TD('Reason for Closure'),TD('Additional Remarks / Detour ')),
179                  TR(TD(INPUT(_name='meeting')),TD(INPUT(_name='reason')),TD(INPUT(_name='remarks',_size='40'))) ), BR(),
180            INPUT(_type='submit',_value='Submit Closure'),XML('\n'),SELECT(streetlookup,_name='stlookup', _id='stlookup', _class='hideme'))
181    if form.process().accepted:
182        newID = calcNextClosure(form.vars.route)
183        # Insert the record into the database
184        newrec = db.closures.insert(closureid=newID, lognum='1', route=form.vars.route, direction=form.vars.direction, facility=form.vars.facility, startcounty=form.vars.startcounty, endcounty=form.vars.endcounty, startlocation=form.vars.startlocation, endlocation=form.vars.endlocation, startdate=form.vars.startdate, enddate=form.vars.enddate, starttime=form.vars.starttime+form.vars.starttimemin, endtime=form.vars.endtime+form.vars.endtimemin, closuretype=form.vars.closuretype, worktype=form.vars.worktype, estdelay=form.vars.estdelay, tmpcozeep=getCheckbox(form.vars.cozeep), tmpdetour=getCheckbox(form.vars.detour), supervisor=form.vars.supervisor, fieldrep=form.vars.fieldrep,  )
185        session.flash = 'New lane closure added: ' + newID
186        redirect(URL('index.html'))
187    return dict(form=form)
188
189# Calculate the closure id to assign to the new closure
190def calcNextClosure(routeNum):
191    # Retrieve any existing closures on this route
192    item = db(db.closures.closureid.startswith('T'+routeNum)).select().last() # Might need to sort these
193    if (item != None):
194        currID = item.closureid
195        lastchar = currID[-1:]  # Get last character of ID
196        lastchar = chr(ord(lastchar) + 1) # increment it to next character (need bounds check)
197        newID = currID[:-1] + lastchar  # append char to ID
198        return newID
199    else:
200        return 'T'+routeNum+'AA'  # For a non-existing route
201
202# Convert checkbox value to YES/NO
203def getCheckbox(ckBox):
204    if (ckBox == "on"):
205        return "YES"
206    else:
207        return "NO"
Note: See TracBrowser for help on using the repository browser.