def filter_stream(self, req, method, filename, stream, data): if filename == 'ticket.html': filter = Transformer('//label[@for="field-evaluation"]') stream |= filter.remove() filter = Transformer('//select[@id="field-evaluation"]') stream |= filter.remove() return stream
def filter_stream(self, req, method, filename, stream, data): # Get path if filename == 'browser.html': # self.req_han = SupoSERequestHandler() path = data.get('created_path') repo = self.env.get_repository(authname=req.authname) node = get_existing_node(req, repo, path, repo.youngest_rev) file = "" if node: if node.isfile: file = posixpath.basename(path) path = posixpath.dirname(path) #raise Exception( path ) filter = Transformer('//div[@id="jumprev"]') search = tag.div( tag.form( # tag.div( "Repository search" ), tag.input( type = "text", id = "suquery", name = "q", size = 13, value = ""), tag.input( type = "hidden", id = "suquerypath", name = "p", size = 13, value = path), tag.input( type = "hidden", id = "suqueryfile", name = "f", size = 13, value = file), tag.input( type = "submit", value="Repo Search"), action=req.href.reposearch(), method="get", id="reposearch" ) ) return stream | filter.after(search) return stream
def filter_stream(self, req, method, filename, stream, data): if filename.startswith("roadmap"): filter_projects = smp_filter_settings(req, 'roadmap', 'projects') filter = Transformer('//form[@id="prefs"]/fieldset/div[1]') stream = stream | filter.before(tag.label("Filter Projects:")) | filter.before(tag.br()) | filter.before(self._projects_field_input(req, filter_projects)) | filter.before(tag.br()) return stream
def _select(self, select): html = HTML(FOOBAR) if isinstance(select, basestring): select = [select] transformer = Transformer(select[0]) for sel in select[1:]: transformer = transformer.select(sel) return _transform(html, transformer)
def _select(self, select): html = HTML(FOOBAR, encoding='utf-8') if isinstance(select, str): select = [select] transformer = Transformer(select[0]) for sel in select[1:]: transformer = transformer.select(sel) return _transform(html, transformer)
def filter_stream(self, req, method, filename, stream, data): if filename == 'timeline.html': filter_projects = self._filtered_projects(req) filter = Transformer('//form[@id="prefs"]/div[1]') stream = stream | filter.before(tag.label("Filter Projects:")) | filter.before(tag.br()) | filter.before(self._projects_field_input(req, filter_projects)) | filter.before(tag.br()) | filter.before(tag.br()) return stream
def filter_stream(self, req, method, filename, stream, data): action = req.args.get('action', '') if filename == 'browser.html' and action == 'edit': req.perm.require('REPOSITORY_MODIFY') # NB TracBrowserOps already inserts javascript and css we need # So only add css/javascript needed solely by the editor if data['file'] and data['file']['preview']['rendered']: max_edit_size = self.max_edit_size data['max_edit_size'] = max_edit_size # Discard rendered table, replace with textarea of file contents # This means reading the file from the repository again # N.B. If a file is rendered as something other than a table # e.g. due to PreCodeBrowserPlugin this code won't trigger # Retrieve the same node that BrowserModule.process_request() # used to render the preview. # At this point reponame has been removed from data['path'] # and repos has already been determined repos = data['repos'] path = data['path'] rev = data['rev'] node = repos.get_node(path, rev) # If node is too large then don't allow editing, abort if max_edit_size > 0 and node.content_length > max_edit_size: return stream # Open the node and read it node_file = node.get_content() node_data = node_file.read() # Discover the mime type and character encoding of the node # Try in order # - svn:mime-type property # - detect from file name and content (BOM) # - use configured default for Trac mime_view = Mimeview(self.env) mime_type = node.content_type \ or mime_view.get_mimetype(node.name, node_data) \ or 'text/plain' encoding = mime_view.get_charset(node_data, mime_type) # Populate template data content = mime_view.to_unicode(node_data, mime_type, encoding) data['file_content'] = content data['file_encoding'] = encoding # Replace the already rendered preview with a form and textarea bsops_stream = Chrome(self.env).render_template(req, 'file_edit.html', data, fragment=True) transf = Transformer('//div[@id="preview"]' '/table[@class="code"]') stream |= transf.replace( bsops_stream.select('//div[@id="bsop_edit"]')) return stream
def filter_stream(self, req, method, filename, stream, data): if filename == "ticket.html": filter = Transformer('//fieldset[@id="properties"]') field_groups = data.get('field_groups') for group in field_groups: stream = stream | filter.after(self._field_group(req, group)) return stream
def filter_stream(self, req, method, filename, stream, data): if filename == 'ticket.html': ticket = data.get('ticket') if self.keywords and ticket and ticket.exists and \ 'TICKET_CHGPROP' in req.perm(ticket.resource): filter = Transformer('//fieldset[@id="properties"]') stream |= filter.after(self._render_template(req)) elif filename == 'wiki_edit.html' and self.tagsplugin_enabled: filter = Transformer('//fieldset[@id="changeinfo"]') stream |= filter.after(self._render_template(req)) return stream
def filter_stream(self, req, method, filename, stream, data): if filename in ('milestone_view.html', ): buffer = StreamBuffer() t = Transformer('//div[@class="milestone"]/h1/text()[2]') t = t.copy(buffer).end() t = t.select('//div[@class="milestone"]/div[@class="info"]/dl') t = t.append(GenerateMetrixLink(buffer, req.href)) stream |= t return stream
def filter_stream(self, req, method, filename, stream, data): action = req.args.get('action', 'view') if filename == "version_edit.html": if action == 'new': filter = Transformer('//form[@id="edit"]/div[1]') return stream | filter.before(self.__new_project()) elif action == 'edit': filter = Transformer('//form[@id="edit"]/div[1]') return stream | filter.before(self.__edit_project(data)) return stream
def filter_stream(self, req, method, filename, stream, data): if filename == "ticket.html": # replace "project" text input (lineedit) for ticket editing with a selection field filter = Transformer('//input[@id="field-project"]') ticket_data = data['ticket'] script_filter = Transformer('//div[@id="banner"]') stream = stream | filter.replace(self._projects_field_ticket_input(req, ticket_data)) stream = stream | script_filter.before(self._update_milestones_script(req)) return stream
def filter_stream(self, req, method, filename, stream, data): if filename == "ticket.html" and req.get_header("X-Moz") != "prefetch": chrome = Chrome(self.env) # append the ticket fields to the end of the standard trac ticket box filter = Transformer('//div[@id="ticket"]') stream = stream | filter.append(chrome.render_template(req, 'fieldgroups_ticket_box.html', data, fragment=True)) # insert the ticket field groups after the standard trac 'Change Properties' field group filter = Transformer('//fieldset[@id="properties"]') stream = stream | filter.after(chrome.render_template(req, 'fieldgroups_properties.html', data, fragment=True)) #filter = Transformer('//fieldset[@id="action"]') #stream = stream | filter.before(chrome.render_template(req, 'fieldgroups_properties.html', data, fragment=True)) return stream
def filter_stream(self, req, method, filename, stream, data): # Allow setting version for milestone if filename == 'milestone_edit.html': filter = Transformer('//fieldset[1]') return stream | filter.before(self._version_edit(data)) # Display version for milestone elif filename == 'milestone_view.html': milestone = data.get('milestone').name filter = Transformer('//div[@class="info"]/p[@class="date"]') return stream | filter.append(self._version_display(req, milestone)) elif filename == 'roadmap.html': return self._milestone_versions(stream, req) return stream
def filter_stream(self, req, method, filename, stream, data): if 'ticket' in data and 'remote_sites' in data: add_script(req, 'tracremoteticket/js/remoteticket.js') transf = Transformer('//select[@id="linked-end"]') label = tag.label(' in ', for_='remote-site') local = tag.option('this project', value=req.href.newticket(), selected='selected') remotes = [tag.option(rs['title'], value=Href(rs['url']).newticket()) for rs in data['remote_sites']] select = tag.select([local] + remotes, id='remote-site') content = label + select stream |= transf.after(content) return stream
def filter_stream(self, req, method, filename, stream, data): if req.path_info.startswith('/wiki/'): if data and data.has_key('page') and hasattr(data['page'], 'resource'): title = data['title'] filter = Transformer('//div[@id="pagepath"]') filter = filter.empty() filter = filter.append( tag.a( 'wiki:', href = req.href.wiki(), class_ = 'pathentry first' ) ) resource = data['page'].resource relation_system = ResourceRelationSystem(self.env) tree = relation_system.get_cached_tree(req) add_stylesheet(req, 'wikimenu/css/superfish.css') add_script(req, 'wikimenu/js/jquery.bgiframe.min.js') add_script(req, 'wikimenu/js/superfish.js') add_script(req, 'wikimenu/js/popup.js') resources = [] for res in relation_system.get_ancestors(resource, tree=tree): resources.append(res) for res in reversed( resources ): label = get_resource_description(self.env, res) if res.realm=='wiki': if res.id and WikiSystem(self.env).has_page(res.id): menu = tag.ul( ) for res_child in relation_system.get_children(res): child_label = get_resource_description(self.env, res_child) if res_child.realm=='wiki': if res_child.id and WikiSystem(self.env).has_page(res_child.id): anc = tag.a(child_label, href = req.href.wiki(child_label)) menu.append(tag.li( anc )) filter = filter.append( tag.ul( tag.li( tag.a(label, href=req.href.wiki(label) ), menu ), class_= 'wiki_menu' ) ) if title != label: filter = filter.append( tag.span( ' / ', class_ = 'pathentry sep' ) ) remove_tran = '//a[@title="View ' + title + '"]' return stream | filter return stream
def _wiki_edit(self, req, stream): # TRANSLATOR: Label text for link to '/tags'. link = tag.a(_("view all tags"), href=req.href.tags()) # TRANSLATOR: ... (view all tags) insert = tag(Markup(_("Tag under: (%(tags_link)s)", tags_link=link))) insert( tag.br(), tag.input(id='tags', type='text', name='tags', size='50', value=req.args.get('tags', ' '.join(self._page_tags(req)))) ) insert = tag.div(tag.label(insert), class_='field') return stream | Transformer('//div[@id="changeinfo1"]').append(insert)
def remove_changelog(stream, field): """ Removes entries from the visible changelog""" def helper(field_stream): s = Stream(field_stream) f = s.select('//strong/text()').textOf() if field != f: #if we are the field just skip it #identity stream filter for kind, data, pos in s: yield kind, data, pos stream = stream | Transformer('//ul[@class="changes"]/li').filter(helper) return stream
def dir_entries(self, req, stream, data, xpath_prefix=''): #self.log.debug('svnmultiurls: dir_entries filename: "%s"', filename) # add table cells b = StreamBuffer() xpath = "//td[@class='%s']" stream |= Transformer(xpath_prefix + (xpath % 'name') + "/a/@href").copy(b).end().select(xpath_prefix + ( xpath % self.element_class)).after( self.GenerateSVNUrl( b, self.svn_base_url, self.link_text, data['path_links'][0]['href'])) return stream
def filter_stream(self, req, method, filename, stream, data): if req.get_header("X-Moz") == "prefetch": return stream if filename == "ticket.html": if not self.check_permissions(req): return stream chrome = Chrome(self.env) filter = Transformer('//fieldset[@id="properties"]') # add a hidden div to hold the ticket_fields input snippet = tag.div(style="display:none;") snippet = tag.input(type="hidden", id="field-ticket_fields", name="field_ticket_fields", value=','.join(data['ticket_fields'])) stream = stream | filter.after(snippet) if req.path_info != '/newticket': # insert the ticket field groups after the standard trac 'Change Properties' field group stream = stream | filter.after(chrome.render_template(req, 'ticket_fields_datatable.html', data, fragment=True)) elif filename == "admin_enums.html": if not self.check_permissions(req) or not req.args.get('path_info'): return stream for k,v in {'cat_id':'ticket', 'panel_id':'type'}.iteritems(): if k not in req.args or req.args.get(k) != v: return stream if 'ticket_fields' in data: chrome = Chrome(self.env) filter = Transformer('//div[@class="buttons"]') # add a hidden div to hold the ticket_fields input snippet = tag.div(style="display:none;") snippet = tag.input(type="hidden", id="field-ticket_fields", name="field_ticket_fields", value=','.join(data['ticket_fields'])) stream = stream | filter.before(snippet) stream = stream | filter.before(chrome.render_template(req, 'ticket_fields_datatable.html', data, fragment=True)) return stream
def filter_stream(self, req, method, filename, stream, data): if filename == 'browser.html' \ and req.perm.has_permission('REPOSITORY_MODIFY'): self.log.debug('Extending TracBrowser') if self.include_jqueryui: add_stylesheet( req, 'trac_browser_svn_ops/css/smoothness/jquery-ui.css') add_script(req, 'trac_browser_svn_ops/js/jquery-ui.js') add_stylesheet(req, 'trac_browser_svn_ops/css/trac_browser_ops.css') add_script(req, 'trac_browser_svn_ops/js/trac_browser_ops.js') # Insert browser operations elements when directory/file shown if data['dir']: data['max_upload_size'] = self.max_upload_size data['rename_only'] = self.rename_only # Insert upload dialog and move/delete dialog into div#main bsops_stream = Chrome(self.env).render_template( req, 'trac_browser_ops.html', data, fragment=True) bsops_transf = Transformer('//div[@id="main"]') stream |= bsops_transf.append( bsops_stream.select('//div[@class="bsop_dialog"]')) # Insert button bar after file/directory table bsops_stream = Chrome(self.env).render_template( req, 'trac_browser_ops.html', data, fragment=True) bsops_transf = Transformer('//table[@id="dirlist"]') stream |= bsops_transf.after( bsops_stream.select('//div[@id="bsop_buttons"]')) return stream
def filter_stream(self, req, method, filename, stream, data): if req.path_info.startswith('/register') and ( req.method == 'GET' or 'registration_error' in data): question = None if self.question is not None and len(self.question) > 0: question = tag.label( tag(self.question + " "), tag.input(id='question', type='text', name='question')) # First Fieldset of the registration form XPath match xpath_match = '//form[@id="acctmgr_registerform"]/fieldset[1]' if question is None: return stream else: return stream | Transformer(xpath_match). \ append(tag(Markup(question))) # Admin Configuration elif req.path_info.startswith('/admin/accounts/config'): api_html = tag.div( tag.label("Question:", for_="registerquestion_question") + tag.input(class_="textwidget", name="question", value=self.question, size=60) ) + tag.div( tag.label("Answer:", for_="registerquestion_answer") + tag.input(class_="textwidget", name="answer", value=self.answer, size=60) ) + tag.div( tag.label("Hint:", for_="registerquestion_hint") + tag.input( class_="textwidget", name="hint", value=self.hint, size=60) ) + tag.br() # First fieldset of the Account Manager config form xpath_match = '//form[@id="accountsconfig"]/fieldset[1]' return stream | Transformer(xpath_match). \ before(tag.fieldset(tag.legend("Anti-Robot Question For Registration") + api_html)) return stream
def filter_stream(self, req, method, filename, stream, data): if filename == 'ticket.html' \ and req.path_info.startswith('/newticket'): # common js files add_script(req, 'tt/json2.js') stream = stream | Transformer('body').append( tag.script("preview = %s;" % ('true' if 'preview' in req.args else 'false')) + tag.script(type='text/javascript', src=req.href('tt', 'tt_newticket.js'))()) return stream
def svnlog(self, req, stream, data): if not data.has_key('path'): # this probably means that there is an upstream error return stream # provide a link to the svn repository stream |= Transformer("//div[@id='content']/h1").after( tag.a(self.link_text, href=self.url(data['path']), title=self.link_title)) return stream
def filter_stream(self, req, method, filename, stream, data): if not filename in ('report_view.html', 'report_list.html'): return stream reportid = [None] def idhelper(strm): header = strm[0][1] if not reportid[0]: self.log.debug("ReportScreenFilter: helper: %s %s %s" % (strm, header, report_id_from_text(header))) reportid[0] = report_id_from_text(header) for kind, data, pos in strm: yield kind, data, pos def permhelper(strm): id = reportid[0] self.log.debug( "ReportScreenFilter: id:%s, in bill: %s has perm:%s" % (id, id in self.billing_reports, req.perm.has_permission("TIME_VIEW"))) if id and id in self.billing_reports and not req.perm.has_permission( "TIME_VIEW"): self.log.debug( "ReportScreenFilter: No time view, prevent render") msg = "YOU MUST HAVE TIME_VIEW PERMSSIONS TO VIEW THIS REPORT" for kind, data, pos in tag.span(msg).generate(): yield kind, data, pos else: for kind, data, pos in strm: yield kind, data, pos self.log.debug( "ReportScreenFilter: About to begin filtering of billing reports without permissions" ) stream = stream | Transformer('//div[@id="content"]/h1/text()').apply( FilterTransformation(idhelper)) stream = stream | Transformer('//div[@id="content"]').apply( FilterTransformation(permhelper)) return stream
def _page_attachments_filter(self, req, data): def find_change(stream): author = ''.join(stream_part[1] for stream_part in stream if stream_part[0] == 'TEXT').strip() tag = self._generate_avatar(req, author, 'attachment-lineitem', self.attachment_lineitem_size) return itertools.chain([stream[0]], tag, stream[1:]) return [ Transformer( '//div[@id="attachments"]/div/ul/li/em|//div[@id="attachments"]/div[@class="attachments"]/dl[@class="attachments"]/dt/em' ).filter(find_change) ]
def filter_stream(self, req, method, filename, stream, data): """Insert default Bootstrap CSS classes if rendering legacy templates (i.e. determined by template name prefix) and renames wiki guide links. """ tx = Transformer('body') def add_classes(classes): """Return a function ensuring CSS classes will be there for element. """ def attr_modifier(name, event): attrs = event[1][1] class_list = attrs.get(name, '').split() self.log.debug('BH Theme : Element classes ' + str(class_list)) out_classes = ' '.join(set(class_list + classes)) self.log.debug('BH Theme : Inserting class ' + out_classes) return out_classes return attr_modifier # Insert default bootstrap CSS classes if necessary for xpath, classes in self.BOOTSTRAP_CSS_DEFAULTS: tx = tx.end().select(xpath) \ .attr('class', add_classes(classes)) # Rename wiki guide links tx = tx.end() \ .select("body//a[contains(@href,'/wiki/%s')]" % wiki.GUIDE_NAME) \ .map(lambda text: wiki.new_name(text), TEXT) # Rename trac error app_short = self.labels_application_short tx = tx.end() \ .select("body//div[@class='error']/h1") \ .map(lambda text: text.replace("Trac", app_short), TEXT) return stream | tx
def get_list_transformer(namespaces): """this function returns a transformer to find all list elements and recompute their xml:id. Because if we duplicate lists we create invalid XML. Each list must have its own xml:id This is important if you want to be able to reopen the produced document wih an XML parser. LibreOffice will fix those ids itself silently, but lxml.etree.parse will bork on such duplicated lists """ return Transformer('//list[namespace-uri()="%s"]' % namespaces.get('text')).attr( '{0}id'.format(XML_NS), lambda *args: "list{0}".format(uuid4().hex))
def _wiki_edit(self, req, stream): insert = T.div(class_='field')(T.label( 'Tag under: (', T.a('view all tags', href=req.href.tags()), ')', T.br(), T.input(id='tags', type='text', name='tags', size='30', value=req.args.get('tags', ' '.join(self._page_tags(req)))), )) return stream | Transformer('//div[@id="changeinfo1"]').append(insert)
def _filter(self, select, html=FOOBAR): """Returns a list of lists of filtered elements.""" output = [] def filtered(stream): interval = [] output.append(interval) for event in stream: interval.append(event) yield event _transform(html, Transformer(select).filter(filtered)) simplified = [] for sub in output: simplified.append(_simplify([(None, event) for event in sub])) return simplified
def filter_stream(self, req, method, filename, stream, data): if not _is_wysiwyg_enabled(filename, self.templates): return stream options = {} if filename == 'ticket.html': options['escapeNewlines'] = _preserve_newlines(self.env) if options: text = 'var _tracwysiwyg = %s' % _to_json(options) stream |= Transformer('//head').append( tag.script(text, type='text/javascript')) return stream
def _wiki_view(self, req, stream): tags = self._page_tags(req) if not tags: return stream engine = TagEngine(self.env) add_stylesheet(req, 'tags/css/tractags.css') li = [] for tag in tags: href, title = engine.get_tag_link(tag) li.append(T.li(T.a(title=title, href=href)(tag), ' ')) insert = T.ul(class_='tags')(T.lh('Tags'), li) return stream | Transformer('//div[@class="buttons"]').before(insert)
def filter_stream(self, req, method, filename, stream, data): if filename == "customfieldadmin.html": add_script(req, 'datefield/js/customfield-admin.js') add_stylesheet(req, 'datefield/css/customfield-admin.css') stream = stream | Transformer('.//select[@id="type"]').append( tag.option('Date', value='date', id="date_type_option") ) stream = stream | Transformer( './/form[@id="addcf"]/fieldset/div[@class="buttons"]' ).before( tag.div( tag.input( id="date_empty", type="checkbox", name="date_empty" ), tag.label('Allow empty date'), for_="date_empty", class_="field", id="date_empty_option" ) ) return stream
def filter_stream(self, req, method, filename, stream, data): """ Removes Syntax Highlight tab from user preferences view """ # Redirect to basic tab if req.path_info == '/prefs': return req.redirect(req.href('/prefs/basic')) # Remove General (first) tab from user preferences if req.path_info.startswith('/prefs'): trans = Transformer('.//ul[@id="tabs"]/li[1]').remove() return stream | trans return stream
def filter_stream(self, req, method, filename, stream, data): if filename == 'timeline.html': filter_projects = self._filtered_projects(req) filter = Transformer('//form[@id="prefs"]/div[1]') stream = stream | filter.before( tag.label("Filter Projects:")) | filter.before( tag.br()) | filter.before( self._projects_field_input( req, filter_projects)) | filter.before( tag.br()) | filter.before(tag.br()) return stream
class Report(Component): implements(ITemplateProvider, ITemplateStreamFilter) # ITemplateProvider methods def get_templates_dirs(self): return [ResourceManager().resource_filename(__name__, 'templates')] def get_htdocs_dirs(self): return [('common', ResourceManager().resource_filename(__name__, 'htdocs'))] # ITemplateStreamFilter methods def filter_stream(self, req, method, filename, stream, data): if filename != 'ticket.html': return stream if not 'id' in req.args: return stream columns = self.config.getlist('stamprarry', 'statuses', \ default=[u'created', u'assigned', u'accepted', u'closed']) if not data.has_key('ticket'): return stream ticket = data['ticket'] created = ('', 'created', ticket.time_created.strftime('%x'), ticket.values['reporter']) status_changes = {} if data.has_key('changes'): changes = data['changes'] for change in changes: try: key = change['fields']['status']['new'] value = (change['date'].strftime('%x'), change['author']) status_changes[key] = value # if existed, override it except KeyError, AttributeError: continue comfirmer = [] for column in columns: if column == 'created': comfirmer.append(created) elif status_changes.has_key(column): date, author = status_changes[column] comfirmer.append(('', column, date, author)) else: comfirmer.append(('void', column, '-', '-')) data = {'comfirmer': comfirmer} add_stylesheet(req, 'common/css/stamprally.css') template = Chrome(self.env).load_template('stamprally.html') content = template.generate(**data) return stream | Transformer("//div[@id='ticket']") \ .append(tag.div(content, **{'class': "confirmer" }))
def filter(self, stream): routes = request.environ.get('pylons.routes_dict') log.info(routes) if routes.get('controller') == 'package': stream = stream | Transformer( '//ul[@class="nav nav-pills"]').append( HTML('''<li class> <a class href="/silk/%s"> <img src="/images/icons/rdf_flyer.24.png" height="16px" width="16px" alt="None" class="inline-icon "> Silk </a> </li>''' % routes.get('id'))) return stream
def filter_stream(self, req, method, filename, stream, data): if filename == 'browser.html' \ and req.perm.has_permission('REPOSITORY_MODIFY'): self.log.debug('Extending TracBrowser') if self.include_jqueryui: add_stylesheet(req, 'trac_browser_svn_ops/css/smoothness/jquery-ui.css') add_script(req, 'trac_browser_svn_ops/js/jquery-ui.js') add_stylesheet(req, 'trac_browser_svn_ops/css/trac_browser_ops.css') add_script(req, 'trac_browser_svn_ops/js/trac_browser_ops.js') # Insert browser operations elements when directory/file shown if data['dir']: data['max_upload_size'] = self.max_upload_size data['rename_only'] = self.rename_only # Insert upload dialog and move/delete dialog into div#main bsops_stream = Chrome(self.env).render_template(req, 'trac_browser_ops.html', data, fragment=True) bsops_transf = Transformer('//div[@id="main"]') stream |= bsops_transf.append( bsops_stream.select('//div[@class="bsop_dialog"]') ) # Insert button bar after file/directory table bsops_stream = Chrome(self.env).render_template(req, 'trac_browser_ops.html', data, fragment=True) bsops_transf = Transformer('//table[@id="dirlist"]') stream |= bsops_transf.after( bsops_stream.select('//div[@id="bsop_buttons"]') ) return stream
def harvest_filter(stream, pkg): harvest_object_id = pkg.extras.get('harvest_object_id') if harvest_object_id: data = {'id': harvest_object_id} html_code = html.GEMINI_CODE if len(pkg.resources) == 0: # If no resources, the table has only two columns html_code = html_code.replace('<td></td>', '') stream = stream | Transformer('body//div[@class="resources subsection"]/table')\ .append(HTML(html_code % data)) return stream
def filter_stream(self, req, method, filename, stream, data): if filename == 'wiki_edit.html': node = req.args.get('node') ctxt = Context(node=node, _=_) # field for 'title' title_tpl = self.get_loader().load('wiki_edit_title.html') title = title_tpl.generate(ctxt) stream = stream | Transformer('//div[@id="rows"]').before(title) # field for 'parent' parent_tpl = self.get_loader().load('wiki_edit_parent.html') parent = parent_tpl.generate(ctxt) stream = stream | Transformer('//div[@id="changeinfo1"]').before( parent) # field for 'weight' weight_tpl = self.get_loader().load('wiki_edit_weight.html') weight = weight_tpl.generate(ctxt) stream = stream | Transformer('//div[@id="changeinfo2"]').before( weight) # field for 'hidden' hidden_tpl = self.get_loader().load('wiki_edit_hidden.html') hidden = hidden_tpl.generate(ctxt) stream = stream | Transformer('//div[@id="changeinfo2"]').before( hidden) return stream
def _wiki_filter(self, req, data): if "action=diff" in req.query_string: return self._wiki_diff_filter(req, data) elif "action=history" in req.query_string: return self._wiki_history_lineitem_filter(req, data) elif "version" in req.query_string: if 'page' not in data: return [] author = data['page'].author return [ lambda stream: Transformer('//table[@id="info"]//th').prepend( self._generate_avatar(req, author, "wiki-view", self. wiki_view_size))(stream) ] return []
def filter_stream(self, req, method, filename, stream, data): """ Returns changed stream for `admin_users.html` template to change how account deletion is described if SQL table is read-only. `req` is the current request object, `method` is the Genshi render method (xml, xhtml or text), `filename` is the filename of the template to be rendered, `stream` is the event stream and `data` is the data for the current template. """ if self.sql_read_only and filename == 'admin_users.html': stream |= Transformer(".//input[@name='remove']").attr( 'value', 'Remove session and permissions data for selected accounts') return stream
def hide_field(self, stream, field): """ Replaces a field from the form area with an input type=hidden""" def helper(field_stream): type = Stream(field_stream).select('@type').textOf() if type == 'checkbox': if Stream(field_stream).select('@checked').textOf() == "checked": value = 1 else: value = 0 else: value = Stream(field_stream).select('@value').textOf() name = Stream(field_stream).select('@name').textOf() for kind, data, pos in tag.input(value=value, type="hidden", name=name).generate(): yield kind, data, pos def select_helper(stream): s = Stream(stream) name = s.select('@name').textOf() opt = s.select('//option[@selected]') if not opt: s.select('//option[position()=1]') text = opt.select("text()").textOf() value = s.select('@value').textOf() if not value: value = text for kind, data, pos in tag.input(value=value, name=name, type="hidden").generate(): yield kind, data, pos stream = stream | Transformer( '//label[@for="field-%s"]' % field).replace(" ") stream = stream | Transformer( '//input[@id="field-%s"]' % field).filter(helper) stream = stream | Transformer( '//select[@id="field-%s"]' % field).filter(select_helper) return remove_changelog(self, remove_header(stream, field), field)
def filter_stream(self, req, method, filename, stream, data): """Return a filtered Genshi event stream, or the original unfiltered stream if no match. `req` is the current request object, `method` is the Genshi render method (xml, xhtml or text), `filename` is the filename of the template to be rendered, `stream` is the event stream and `data` is the data for the current template. See the Genshi documentation for more information. """ # Insert the hidden field right before the submit buttons stream = stream | Transformer('//div[@class="buttons"]').before(self.get_content(req)) return stream
def filter_stream(self, req, method, filename, stream, data): if filename == 'wiki_edit.html' and 'section' in req.args and 'merge' not in req.args: if 'section_text' in req.args: section_pre, section_text, section_post = req.args.get( 'section_pre'), req.args.get('section_text'), req.args.get( 'section_post') else: section_pre, section_text, section_post = self._split_page_text( data['page'].text, req.args['section']) section_text = ''.join(section_text) section_element = html.input(type='hidden', name='section', id='section', value=req.args.get('section')) pre_element = html.input(type='hidden', name='section_pre', id='section_pre', value=''.join(section_pre)) post_element = html.input(type='hidden', name='section_post', id='section_post', value=''.join(section_post)) section_html = html(section_element, pre_element, post_element) stream = stream | Transformer('//textarea[@name="text"]').empty( ).append(section_text).before(section_html) stream = stream | Transformer('//div[@id="content"]//h1').append( "/%s (section %s)" % (section_text[:section_text.find('\n')].strip(" = \r\n"), req.args['section'])) if not self.preview_whole_page: stream = stream | Transformer( '//div[@class="wikipage"]').empty().append( HTML(wiki_to_html(section_text, self.env, req))) return stream
def filter_stream(self, req, method, filename, stream, data): crumbs = self._get_crumbs(req.session) if not crumbs: return stream add_stylesheet(req, 'breadcrumbs/css/breadcrumbs.css') ul = [] path = req.path_info if path.count('/') >= 2: _, realm, resource = path.split('/', 2) if '&' in resource: resource = resource[0:resource.index('&')] current = '/'.join( (realm, resource) ) else: current = None href = req.href(req.base_path) offset = 0 if crumbs and crumbs[0] == current: offset = 1 for crumb in crumbs[offset:self.max_crumbs + offset]: realm, resource = crumb.split('/', 1) name = resource.replace('_', ' ') if realm == "ticket": name = "#" + resource elif realm != "wiki": name = "%s:%s" % (realm, name) link = req.href(realm, resource) first = ul == [] li = tag.li(tag.a(title=name, href=link)(name)) if first: li(class_="first") ul.append(li) if ul: last = ul.pop() ul.append(last(class_="last")) insert = tag.ul(class_="nav", id="breadcrumbs" )(tag.li(self.label and self.label or \ "Breadcrumbs:"), ul) else: insert = '' return stream | Transformer('//div[@id="metanav"]/ul').after(insert)
def filter_stream(self, req, method, filename, stream, formdata): '''Add workflows to query/report output''' if filename != 'query.html' and filename != 'report_view.html': return stream if not (req.perm.has_permission('TICKET_ADMIN') or req.perm.has_permission('TICKET_GRID_WORKFLOW')): return stream ts = TicketSystem(self.env) add_script(req, 'gridflow/gridflow.js') html = stream.render() js = '' tickets = [] copy = genshi.XML(html) nodes = genshi.path.Path('//td[contains(@class, "ticket")]//a/text()') tickets += [int(a[1][1:]) for a in nodes.select(copy)] copy = genshi.XML(html) nodes = genshi.path.Path('//td[contains(@class, "id")]//a/text()') tickets += [int(a[1][1:]) for a in nodes.select(copy)] copy = genshi.XML(html) tktDict = {} for tno in tickets: tktDict[tno] = {'labels': [], 'widgets': [], 'actions': []} tkt = trac.ticket.Ticket(self.env, tno) actions = ts.get_available_actions(req, tkt) for action in actions: for controller in self._get_action_controllers( req, tkt, action): (label, widget, hint) = controller.render_ticket_action_control( req, tkt, action) tktDict[tno]['actions'].append(action) tktDict[tno]['labels'].append(label) tktDict[tno]['widgets'].append(widget.generate().render()) js += 'tktDict = ' + repr(tktDict).replace(", u'", ", '").replace( "[u'", "['") + ';\n' js += 'baseURL = "%s";\n' % req.base_url script = genshi.builder.tag.script(js, type="text/javascript") xpath = '//head' copy |= Transformer(xpath).append(script) return copy
def filter_stream(self, req, method, filename, stream, data): action = req.args.get('action', 'view') # Allow setting project for milestone if filename == 'milestone_edit.html': if action == 'new': filter = Transformer('//form[@id="edit"]/div[1]') return stream | filter.before(self.__new_project()) elif action == 'edit': filter = Transformer('//form[@id="edit"]/div[1]') return stream | filter.before(self.__edit_project(data)) # Display project for milestone elif filename == 'milestone_view.html': milestone = data.get('milestone').name filter = Transformer('//div[@class="info"]/p[@class="date"]') return stream | filter.before(self.__project_display(req, milestone)) return stream
def filter_stream(self, req, method, filename, stream, data): filter = Transformer('//table[@class = "code"]') return stream | filter.rename('pre') \ .select('//pre[@class = "code"]/thead').remove().end() \ .select('//pre[@class = "code"]/tbody/tr/th').remove().end() \ .select('//pre[@class = "code"]/tbody/tr/td').append('\n').unwrap()
def filter_stream(self, req, method, filename, stream, data): if filename == "smp_admin_components.html" and data.get('component'): filter = Transformer('//form[@id="modcomp"]/fieldset/div[1]') return stream | filter.after(self.__edit_project(data)) return stream