source: tmcsimulator/branches/LCSv1/controllers/default.py @ 597

Revision 597, 14.6 KB checked in by liquan, 6 years ago (diff)

Added comment in "controllers/default.py" in web2py application of LCSv1 in order to test for correctly update file.

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