def navbar(self, query=Framework.Query(()), next=None, previous=None, pageno=None): """ Returns the HTML for the navigation bar. """ if not query.has_key('family'): query['family'] = '' if next: #Make a link q = query.clone() q.FillQueryTarget(next) next = '<a href="f?%s"><img src="images/forward.png" border="0"></a>' % ( str(q)) else: next = '<img src="images/g_forward.png" border="0">' if previous < 0: previous = '<img src="images/g_back.png" border="0">' else: q = query.clone() q.FillQueryTarget(previous) previous = '<a href="f?%s"><img src="images/back.png" border="0"></a>' % ( str(q)) bar = { 'family': propegate(query, Framework.Query()), 'back': previous, 'case': query.get('case', ''), 'pageno': pageno, 'next': next, 'reset': str(query) + '&reset=1', 'stop': str(query) + '&stop=1' } toolbar = '''<table><tr> <td valign="bottom"><a href="f?family=%(family)s"><img src="images/home.png" border="0"></a></td><td valign="bottom">%(back)s</td>%(case)s - page %(pageno)s<td valign="bottom">%(next)s</td> <td valign="bottom"> <td valign="bottom"><a href="flag?%(reset)s"><img src="images/reset.png" border="0"></a></td> <td valign="bottom"><a href=flag?%(stop)s><img src="images/stop.png" border="0"></a></td></tr></table>''' % bar return toolbar
def menu(self, query, result): """ Draws the menu for the current family. @arg flag: A Flag object containing the appropriate dispatcher @arg query: The user query """ family = query['family'] family_block = flag.ui() family_block.start_table() module_list = Registry.REPORTS.get_families() order_families(module_list) for m in module_list: link = flag.ui() link.link(m, family=m) family_block.row(link) report_block = flag.ui() if family and family != 'None': report_block.start_table() report_list = Registry.REPORTS.family[family] for r in report_list: if r.hidden: continue link = flag.ui() link.link(r.name, target=propegate(query, Framework.Query()), report=r.name, tooltip=r.__doc__) report_block.row(link, colspan=2) report_block.row(" ", r.description) result = flag.ui() result.heading("Flag Main Menu") result.start_table() result.row(family_block, report_block, valign="top") return result
def render(self, query=Framework.Query(()), meta='', data='', next=None, previous=None, pageno=None, ui=None): toolbar = self.navbar(query=query, next=next, previous=previous, pageno=pageno) try: toolbar_str = ui.toolbar_ui.__str__() except: toolbar_str = '' return " ".join(( self.header, self.banner, meta, "<td align=left>%s</td><td align=center>" % toolbar_str, toolbar, '''</td><td width=10><center><img src="images/logo.png"><br><font size="+1"><a href="http://www.gnu.org/copyleft/gpl.html"> ©GPL</a></font></center></td></tr></tbody></table> </tr></table>\n''', data, "<table width=100%%><tr><td></td></tr><tr><td align=center>%s</td></tr></table>" % (toolbar), self.footer))
def parse_query(self): """ Parses the query and prepares a query object. Returns query object prepared from the request """ # check for authentication and pull out auth fields to add to # query type user = passwd = None try: import base64 authtype, authtoken = self.headers['Authorization'].split() user, passwd = base64.decodestring(authtoken).split(':') except KeyError: # if authentication is required, the reports will # throw an exception later, dont worry about it here. pass ## Use the cgi module to parse out the request. This allows us ## to use POST, upload files etc: i = self.path.rfind('?') if i >= 0: rest, query_str = self.path[:i], self.path[i + 1:] elif '=' in self.path: rest, query_str = '', self.path[1:] else: rest, query_str = self.path, '' env = {} env['GATEWAY_INTERFACE'] = 'CGI/1.1' env['SERVER_PROTOCOL'] = self.protocol_version env['REQUEST_METHOD'] = self.command if self.headers.typeheader is None: env['CONTENT_TYPE'] = self.headers.type else: env['CONTENT_TYPE'] = self.headers.typeheader length = self.headers.getheader('content-length') if length: env['CONTENT_LENGTH'] = length if query_str: env['QUERY_STRING'] = query_str ## FieldStorage does not seem to include GET parameters in POSTs: if self.command == "POST": query_list = cgi.parse_qsl(query_str) else: query_list = () form = cgi.FieldStorage(fp=self.rfile, headers=None, environ=env) query = Framework.Query(query_list, base=rest, user=user, passwd=passwd) try: for key in form.keys(): ## See if key has a filename, if so we store it ala php: try: if form[key].filename: query["%s_filename" % key] = form[key].filename except AttributeError: pass try: value = form[key].value ## We only accept non-empty args if len(value) > 0 and value != 'None': query[key] = value except AttributeError: for value in form[key]: query[key] = value.value except TypeError: query['_value'] = form.value ## This handles the case where the entire query is submitted ## in a single parameter called pseudo_post_query. This is ## done for stupid browsers like IE which refuse to handle ## long queries using get - so we post the entire query ## through javascript: try: qsl = query['pseudo_post_query'] if '?' in qsl: qsl = qsl[qsl.find('?') + 1:] query = Framework.Query(cgi.parse_qsl(qsl), user=user, passwd=passwd) pyflaglog.log(pyflaglog.DEBUG, "pseudo posted query is %s", query) except KeyError: if self.command == 'POST': pyflaglog.log(pyflaglog.DEBUG, "posted query is %s", query) for k, v in query.q: if v == 'None': del query[k] self.query = query return query