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

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

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