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

Revision 598, 14.9 KB checked in by liquan, 6 years ago (diff)

Styled index.html (login page), home.html and search.html of LCSv1

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