def render_header(self): def render_search(value): CLEAR_LAYOUT = '<span class="clear"><a href="%s"><img src="/static/dz/images/remove_filter.png"></a></span>' SEARCH_FIELDS = '<input type="text" class="text_field" id="search_text" name="q" value="%s">%s<input class="search_button" type=submit value="Search">' SEARCH_BUTTON = '<input class="search_button" type=submit value="Search">' SEARCH_LAYOUT = '<div class="search">%s</div>' if value == None: return '' elif value == '': clear = '<span class="clear"></span>' else: clear = CLEAR_LAYOUT % ('/'.join([''] + route + ['clear'])) return SEARCH_LAYOUT % form_for( SEARCH_FIELDS % (websafe(value), clear), method='GET') def render_actions(items): return as_actions(items) header_required = self.title or self.subtitle or self.search != None or self.actions if not header_required: return '' return unisafe(HEADER_LAYOUT % dict(title=self.title, subtitle=self.subtitle, search=render_search(self.search), actions=as_actions(self.actions)))
def render_header(self): def render_search(value): CLEAR_LAYOUT = '<span class="clear"><a href="%s"><img src="/static/dz/images/remove_filter.png"></a></span>' SEARCH_FIELDS = '<input type="text" class="text_field" id="search_text" name="q" value="%s">%s<input class="search_button" type=submit value="Search">' SEARCH_BUTTON = '<input class="search_button" type=submit value="Search">' SEARCH_LAYOUT = '<div class="search">%s</div>' if value == None: return '' elif value == '': clear = '<span class="clear"></span>' else: clear = CLEAR_LAYOUT % ('/'.join([''] + route + ['clear'])) return SEARCH_LAYOUT % form_for(SEARCH_FIELDS % (websafe(value),clear), method='GET') def render_actions(items): return as_actions(items) header_required = self.title or self.subtitle or self.search!=None or self.actions if not header_required: return '' return unisafe(HEADER_LAYOUT % dict( title=self.title, subtitle=self.subtitle, search=render_search(self.search), actions=as_actions(self.actions)))
def page(content='', template=None, callback=None, css=None, js=None, title=None, search=None, actions=None, items=None, head=''): def render_search(value): if value == None: return '' elif value == '': clear = '<span class="clear"></span>' else: clear = '<span class="clear"><a href="%s"><img src="/static/images/remove_filter.png"></a></span>' % ('/'.join([''] + route + ['clear'])) return '<div class="search">%s</div>' % form_for('<input type="text" class="text_field" id="search_text" name="q" value="%s">%s<input class="search_button" type=submit value="Search">' % (value,clear), method='GET') header_layout = """ <table id="title_bar"><tr> <td id="title_bar_left"> <H1>%(title)s</H1> </td> <td id="title_bar_right"> %(actions)s %(search)s </td> </tr></table> """ if len(route)>1: breadcrumb = link_to(system.app.title,'/'+system.app.name) else: breadcrumb = '' system.result = page = Page() if title or actions: page_header = header_layout % dict(title=title or '', search=render_search(search), actions=as_actions(actions)) else: page_header = '' page.content = unisafe(page_header) + unisafe(render(unisafe(content), items)) page.css = css or '' page.js = js or '' page.callback = callback page.template = template or system.default_template page.head = head return page
elif colnum > 0 or not (on_click or on_remove or on_delete): body.append(wrapping.format(unisafe(item))) if on_delete: body.append(trash_can(key, 'delete', on_delete)) if on_remove: body.append(trash_can(key, 'remove', on_remove)) body.append('</tr>') selector = hasattr(classed, '__iter__') and '.'.join(classed) or classed selector = "{}".format(selector.replace(' ', '.')) classed = hasattr(classed, '__iter__') and ' '.join(classed) or classed actions = actions and '<div class="actions">{}</div>'.format( as_actions(actions)) or '' caption = caption and "<caption>{}</caption>".format(caption) or '' head = head and "<thead><tr>{}</tr></thead>".format(''.join( ["<th>{}</th>".format(h) for h in head])) or '' if footer and hasattr(footer, '__iter__'): foot = '<tfoot><tr>{}</tr></tfoot>'.format(''.join( ["<td>{}</td>".format(f) for f in footer])) elif footer == '': foot = '' else: foot = footer or (len(alist) and "{:,d} items".format(len(alist))) or "None" foot = '<tfoot><tr><td colspan="{}">{}</td></tr></tfoot>'.format( len(labels), foot) body = body and "<tbody>{}</tbody>".format('\n'.join(body)) or ''
def browse(items, labels=None, columns=None, fields=None, footer=None, title=None, actions=None, header=None, on_click=None, on_delete=None, on_remove=None, *args, **keywords): def trash_can(key,kind,action,**args): link = url_for(str(key),action,**args) tpl = '<td width=1px><a href="%(link)s"><img src="/themes/%(theme)s/images/%(kind)s.png" border=0 height=13px width=13px alt="%(kind)s"></a></td>' return tpl % dict(link=link, kind=kind, theme=system.theme) def getcol(item, name): try: return item[name] except: return '' if labels: if not columns: if len(items) and hasattr(items[0], 'get'): columns = [name_for(label).lower() for label in labels] elif len(items) and hasattr(items[0], '__len__') and len(items[0]): columns = range(len(labels)) else: columns = [name_for(label).lower() for label in labels] else: if columns: labels = columns else: if len(items) and hasattr(items[0], 'keys') and callable(getattr(items[0],'keys')): labels = columns = items[0].keys() elif len(items) and hasattr(items[0], '__dict__'): labels = columns = [items[0].__dict__.keys()] elif len(items) and hasattr(items[0], 'keys') and callable(getattr(items[0],'keys')): labels = columns = [items[0].keys()] elif len(items) and hasattr(items[0], '__len__') and len(items[0]): labels = items[0] columns = range(len(items[0])) items = items[1:] else: if len(items): raise Exception('%s' % hasattr(items[0],'__len__')) raise Exception('Unable to infer columns') columns = list(columns) labels = list(labels) if fields: #labels = [] lookup = fields.as_dict() for col in columns[len(labels):]: if col in lookup: label = lookup[col].label else: label = col labels.append(label) alist = [] for item in items: fields.initialize(item) flookup = fields.display_value() row = [flookup.get(col.upper(),getcol(item,col)) for col in columns] alist.append(row) else: alist = [[getcol(item,col) for col in columns] for item in items] if (on_click or on_delete or on_remove) and columns[0] <> '_id': columns = ['_id'] + columns t = [] for i in alist: t.append([i[0]] + i) alist = t odd_rowclass = 'dark' evn_rowclass = 'light' t = [] if labels: t.append( '<thead><tr>' ) colnum = 0 for label in labels: colnum += 1 t.append('<th>%s</th>' % label) if on_delete: t.append('<th colwidth=1px>%s</th>' % '') if on_remove: t.append('<th colwidth=1px>%s</th>' % '') t.append( '</tr></thead>' ) odd_rowclass = 'light' # if there is a header start line shading on 2nd line evn_rowclass = 'dark' t.append( '<tbody>' ) count = 0 for row in alist: count += 1 if count % 2: rowclass = odd_rowclass else: rowclass = evn_rowclass t.append( '<tr id="row-%s" class="%s">' % (count, rowclass) ) colnum = 0 for item in row: #wrapping = len(unicode(item)) < 40 and 'nowrap' or '' wrapping = len(unisafe(item)) < 80 and '<td nowrap>%s</td>' or '<td>%s</td>' if (on_click or on_delete or on_remove) and colnum == 0: key = item if on_click and (colnum == 1 or colnum==0 and len(row)==1): url = '/'.join(route[1:]+[str(key)]) #t.append('<td>%s</td>' % link_to(item, url, *args, **keywords)) t.append(wrapping % link_to(item, url, *args, **keywords)) elif colnum>0 or not (on_click or on_remove or on_delete): #t.append('<td %s>%s</td>' % (wrapping, item)) t.append(wrapping % unisafe(item)) colnum += 1 if on_delete: t.append(trash_can(key,'delete',on_delete)) if on_remove: t.append(trash_can(key,'remove',on_remove)) t.append( '</tr>' ) t.append( '</tbody>' ) if not count: t.append('<tr><td colspan=%s>None</td></tr>' % len(labels)) if not header: if title: header = '<div class="title">%s</div>' % title if actions: header += as_actions(actions) header_body = header and ('<div class="header">%s</div>' % header) or '' footer_body = footer and ('<div class="footer">%s</div>' % footer) or '' result = '\n'.join(['<div class="baselist">'] + [header_body] + ['<table>'] + t + ['</table>'] + [footer_body] + ['</div>']) return result
def render_actions(items): return as_actions(items)
#t.append('<td %s>%s</td>' % (wrapping, item)) t.append(wrapping % unisafe(item)) colnum += 1 if on_delete: t.append(trash_can(key,'delete',on_delete)) if on_remove: t.append(trash_can(key,'remove',on_remove)) t.append( '</tr>' ) t.append( '</tbody>' ) if not count: t.append('<tr><td colspan=%s>None</td></tr>' % len(labels)) if not header: if title: header = '<div class="title">%s</div>' % title if actions: header += as_actions(actions) header_body = header and ('<div class="header">%s</div>' % header) or '' footer_body = footer and ('<div class="footer">%s</div>' % footer) or '' result = '\n'.join(['<div class="baselist">'] + [header_body] + ['<table>'] + t + ['</table>'] + [footer_body] + ['</div>']) return result
body.append(wrapping.format(link_to(item, url, *args, **keywords))) elif colnum>0 or not (on_click or on_remove or on_delete): body.append(wrapping.format(unisafe(item))) if on_delete: body.append(trash_can(key,'delete',on_delete)) if on_remove: body.append(trash_can(key,'remove',on_remove)) body.append( '</tr>' ) selector = hasattr(classed, '__iter__') and '.'.join(classed) or classed selector = "{}".format(selector.replace(' ', '.')) classed = hasattr(classed, '__iter__') and ' '.join(classed) or classed actions = actions and '<div class="actions">{}</div>'.format(as_actions(actions)) or '' caption = caption and "<caption>{}</caption>".format(caption) or '' head = head and "<thead><tr>{}</tr></thead>".format(''.join(["<th>{}</th>".format(h) for h in head])) or '' if footer and hasattr(footer, '__iter__'): foot = '<tfoot><tr>{}</tr></tfoot>'.format(''.join(["<td>{}</td>".format(f) for f in footer])) elif footer=='': foot = '' else: foot = footer or (len(alist) and "{:,d} items".format(len(alist))) or "None" foot = '<tfoot><tr><td colspan="{}">{}</td></tr></tfoot>'.format(len(labels),foot) body = body and "<tbody>{}</tbody>".format('\n'.join(body)) or '' if sortable: system.libs.add("/static/dz/tablesorter/jquery.tablesorter.js") system.styles.add("/static/dz/tablesorter/default/style.css") system.tail.add("""
#t.append('<td %s>%s</td>' % (wrapping, item)) t.append(wrapping % unisafe(item)) colnum += 1 if on_delete: t.append(trash_can(key, 'delete', on_delete)) if on_remove: t.append(trash_can(key, 'remove', on_remove)) t.append('</tr>') t.append('</tbody>') if not count: t.append('<tr><td colspan=%s>None</td></tr>' % len(labels)) if not header: if title: header = '<div class="title">%s</div>' % title if actions: header += as_actions(actions) header_body = header and ('<div class="header">%s</div>' % header) or '' footer_body = footer and ('<div class="footer">%s</div>' % footer) or '' result = '\n'.join(['<div class="baselist">'] + [header_body] + ['<table>'] + t + ['</table>'] + [footer_body] + ['</div>']) return result