コード例 #1
0
 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
コード例 #2
0
ファイル: search.py プロジェクト: nyuhuhuu/trachacks
    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
コード例 #3
0
ファイル: roadmap.py プロジェクト: nyuhuhuu/trachacks
    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
コード例 #4
0
ファイル: transform.py プロジェクト: alon/polinax
 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)
コード例 #5
0
 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)
コード例 #6
0
ファイル: timeline.py プロジェクト: nyuhuhuu/trachacks
    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
コード例 #7
0
ファイル: web_ui.py プロジェクト: lkraav/trachacks
    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
コード例 #8
0
ファイル: ticket.py プロジェクト: nyuhuhuu/trachacks
    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
コード例 #9
0
ファイル: web_ui.py プロジェクト: nyuhuhuu/trachacks
    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
コード例 #10
0
    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
コード例 #11
0
ファイル: version.py プロジェクト: nyuhuhuu/trachacks
    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
コード例 #12
0
ファイル: ticket.py プロジェクト: nyuhuhuu/trachacks
    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
コード例 #13
0
ファイル: web_ui.py プロジェクト: nyuhuhuu/trachacks
 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
コード例 #14
0
ファイル: milestone.py プロジェクト: nyuhuhuu/trachacks
    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
コード例 #15
0
ファイル: web_ui.py プロジェクト: nyuhuhuu/trachacks
 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
コード例 #16
0
ファイル: wiki.py プロジェクト: nyuhuhuu/trachacks
 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
コード例 #17
0
 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)
コード例 #18
0
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
コード例 #19
0
ファイル: svnmultiurls.py プロジェクト: pombredanne/trachacks
 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
コード例 #20
0
ファイル: web_ui.py プロジェクト: nyuhuhuu/trachacks
 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
コード例 #21
0
    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
コード例 #22
0
ファイル: web_ui.py プロジェクト: pombredanne/trachacks
    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
コード例 #23
0
ファイル: hider.py プロジェクト: romenl/evaluation-workflow
 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
コード例 #24
0
    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
コード例 #25
0
ファイル: svnurls.py プロジェクト: pombredanne/trachacks
    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
コード例 #26
0
    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
コード例 #27
0
    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)
        ]
コード例 #28
0
    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
コード例 #29
0
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))
コード例 #30
0
 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)
コード例 #31
0
 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
コード例 #32
0
ファイル: __init__.py プロジェクト: pombredanne/trachacks
    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
コード例 #33
0
    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)
コード例 #34
0
ファイル: filter.py プロジェクト: pombredanne/trachacks
 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
コード例 #35
0
    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
コード例 #36
0
ファイル: theme.py プロジェクト: mohsadki/dargest
    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
コード例 #37
0
    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
コード例 #38
0
ファイル: ticket.py プロジェクト: matobaa/assembla
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" }))
コード例 #39
0
    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
コード例 #40
0
ファイル: web_ui.py プロジェクト: lkraav/trachacks
 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
コード例 #41
0
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
コード例 #42
0
 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
コード例 #43
0
 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 []
コード例 #44
0
    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
コード例 #45
0
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)
コード例 #46
0
    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
コード例 #47
0
ファイル: web_ui.py プロジェクト: pombredanne/trachacks
    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
コード例 #48
0
    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)
コード例 #49
0
ファイル: gridflow.py プロジェクト: pombredanne/trachacks
    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
コード例 #50
0
ファイル: milestone.py プロジェクト: nyuhuhuu/trachacks
    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
コード例 #51
0
ファイル: precodebrowser.py プロジェクト: nyuhuhuu/trachacks
	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()
コード例 #52
0
ファイル: admin_component.py プロジェクト: nyuhuhuu/trachacks
    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