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

Revision 609, 15.9 KB checked in by liquan, 6 years ago (diff)

Complete searching filter for search page with different combination of search requirement (ticket #246)

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