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

Revision 602, 15.3 KB checked in by liquan, 6 years ago (diff)

Styled status and request page for ticket #245.

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'), 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(LABEL('*County')),TD(LABEL('*Location'))),
170                TR(TD(LABEL('BEGIN=')),TD(SELECT('ORA',_name='startcounty')),
171                TD(SELECT(streets,_name='startlocation',_id='startlocation')),
172           TR(TD(LABEL('END=')),TD(SELECT('ORA',_name='endcounty')),TD(SELECT(streets,_name='endlocation',_id='endlocation'))))),BR(),
173           LABEL('Date Range:'),BR(),
174           LABEL('From',_for='startdate'),INPUT(_name='startdate',_size='8',_class='date'), XML('&nbsp;&nbsp;&nbsp;'), 
175           LABEL('to:',_for='enddate'), INPUT(_name='enddate',_size='8',_class='date'),XML('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'), 
176           LABEL('Times',_for='starttime'),SELECT(hournames,_name='starttime'), 
177           LABEL(':',_for='starttimemin'),SELECT('','00','15','30','45','59',_name='starttimemin'), XML('&nbsp;&nbsp;'), 
178           LABEL('to:',_for='endtime'),SELECT(hournames,_name='endtime'), 
179           LABEL(':',_for='endtimemin'),SELECT('','00','15','30','45','59',_name='endtimemin'), BR(),BR(), 
180           TABLE(TR(TD(LABEL('*Type of Closure') ),
181                    TD(LABEL('*Type of Work')),
182                    TD(LABEL('Estimated Delay')),
183                    TD(LABEL('TMP Details'))), 
184                 TR(TD(SELECT(closuretypes,_name='closuretype',requires=IS_LENGTH(minsize=1,error_message='type of closure cannot be empty'))), 
185                    TD(SELECT(worktypes,_name='worktype', requires=IS_LENGTH(minsize=1,error_message='type of work cannot be empty'))), 
186                    TD(INPUT(_name='estdelay',_size='4'),'minutes'), 
187                    TD(INPUT(_type='checkbox',_name='cozeep'),'CoZeep MaZeep/CHP',BR(), 
188                       INPUT(_type='checkbox', _name='detour'),'Detour Available')), 
189                 _width='100%' ),
190    TABLE(TR(TD(LABEL('*Supervisor'), _style="margin-right: 5%;"),
191            TD(LABEL('Field Rep'))), 
192                  TR(TD(SELECT(supervisors,_name='supervisor', requires=IS_LENGTH(minsize=1,error_message='supervisor cannot be empty'))),
193                     TD(SELECT(supervisors,_name='fieldrep')))),
194    TABLE(TR(TD( LABEL('Meeting Place/CHP Contact')),
195            TD(LABEL('Reason for Closure')),
196            TD(LABEL('Additional Remarks / Detour '))), 
197                  TR(TD(INPUT(_name='meeting', _size='30')),TD(INPUT(_name='reason',_size='40')),TD(INPUT(_name='remarks',_size='40'))) ), BR(), 
198            INPUT(_type='submit',_value='Submit Closure', _class="btn btn-primary btn-default", _style="margin:  7% 45% 2% 40%;"),
199            XML('\n'),SELECT(streetlookup,_name='stlookup', _id='stlookup', _class='hideme')) 
200
201    if form.process().accepted:
202        newID = calcNextClosure(form.vars.route)
203        # Insert the record into the database
204        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,  )
205        session.flash = 'New lane closure added: ' + newID
206        redirect(URL('index.html'))
207    return dict(form=form)
208
209# Calculate the closure id to assign to the new closure
210def calcNextClosure(routeNum):
211    # Retrieve any existing closures on this route
212    item = db(db.closures.closureid.startswith('T'+routeNum)).select().last() # Might need to sort these
213    if (item != None):
214        currID = item.closureid
215        lastchar = currID[-1:]  # Get last character of ID
216        lastchar = chr(ord(lastchar) + 1) # increment it to next character (need bounds check)
217        newID = currID[:-1] + lastchar  # append char to ID
218        return newID
219    else:
220        return 'T'+routeNum+'AA'  # For a non-existing route
221
222# Convert checkbox value to YES/NO
223def getCheckbox(ckBox):
224    if (ckBox == "on"):
225        return "YES"
226    else:
227        return "NO"
Note: See TracBrowser for help on using the repository browser.