def filter_stream(self, req, method, filename, stream, data):
     if filename == 'ticket.html':
         ticket = data.get('ticket')
         if ticket and ticket.exists and \
                req.session.get(self.session_field, 'True') == 'True':
             filter_ = Transformer(
                 '//script[contains(@src, "jquery.js")]')
             return stream | filter_.after(
                 tag.script(
                     type="text/javascript",
                     src=self.env.href('chrome', 'ac', 'js', 'jquery.form.js'))) \
                     | filter_.after(
                 tag.script(
                     type="text/javascript",
                     src=self.env.href('chrome', 'ac', 'js', 'comments.js')))
     return stream
Exemple #2
0
    def filter_stream(self, req, method, filename, stream, data):
        """Return a filtered Genshi event stream, or the original unfiltered
        stream if no match.
        """

        if filename == "ticket.html" and \
                ('TICKET_REMINDER_VIEW' in req.perm or
                 'TICKET_REMINDER_MODIFY' in req.perm or
                 'TICKET_ADMIN' in req.perm):
            tags = self._reminder_tags(req, data)
            if tags:
                ticket_resource = data['ticket'].resource
                context = Context.from_request(req, ticket_resource)
                attachments_data = AttachmentModule(
                    self.env).attachment_data(context)

                add_stylesheet(req, 'ticketreminder/css/ticketreminder.css')

                # Will attachments section be displayed?
                attachments_or_ticket = Transformer(
                    '//div[@id="attachments"]'
                ) if attachments_data['can_create'] or attachments_data[
                    'attachments'] else Transformer('//div[@id="ticket"]')
                trac_nav = Transformer(
                    '//form[@id="propertyform"]/div[@class="trac-nav"]')

                return stream | attachments_or_ticket.after(
                    tags) | trac_nav.append(self._reminder_trac_nav(req, data))

        return stream
Exemple #3
0
    def filter_stream(self, req, method, filename, stream, data):
        # Add delete buttons to the ticket form
        ticket = data.get('ticket')
        if filename == 'ticket.html' and 'TICKET_ADMIN' in req.perm(ticket.resource):

            # Add Delete button to ticket description
            if data['ticket'].values['description']:
                # Reply button and associated elements are present
                filter = Transformer("//div[@class='description']//div[@class='inlinebuttons']")
                stream |= filter.append(tag.input(type='submit', name='delete',
                                                  title="Delete this ticket", value='Delete'))
            else:
                # Reply button and associated elements not present
                filter = Transformer("//div[@class='description']/h3")
                stream |= filter.after( \
                    tag.form(tag.div(tag.input(type='submit', name='delete',
                                               title="Delete this ticket", value='Delete'),
                                     class_='inlinebuttons'
                                     ),
                             name='addreply', method='get', action='#comment')
                             )

            # Add Delete buttons to ticket comments
            stream |= Transformer("//div[@id='changelog']//div[@class='inlinebuttons']") \
                          .append(tag.input(type='submit', name='delete',
                                            title="Delete this comment", value='Delete'))

        return stream
Exemple #4
0
 def filter_stream(self, req, method, filename, stream, data):
     if filename == "ticket.html":
         ticket = data.get("ticket")
         if ticket and ticket.exists and "TICKET_ADMIN" in req.perm(ticket.resource):
             filter = Transformer('//h3[@id="comment:description"]')
             stream |= filter.after(self._clone_form(req, ticket, data))
     return stream
Exemple #5
0
    def filter_stream(self, req, method, filename, stream, data):
        # Add delete buttons to the ticket form
        ticket = data.get("ticket")
        if filename == "ticket.html" and "TICKET_ADMIN" in req.perm(ticket.resource):

            # Add Delete button to ticket description
            if data["ticket"].values["description"]:
                # Reply button and associated elements are present
                filter = Transformer("//div[@class='description']//div[@class='inlinebuttons']")
                stream |= filter.append(
                    tag.input(type="submit", name="delete", title="Delete this ticket", value="Delete")
                )
            else:
                # Reply button and associated elements not present
                filter = Transformer("//div[@class='description']/h3")
                stream |= filter.after(
                    tag.form(
                        tag.div(
                            tag.input(type="submit", name="delete", title="Delete this ticket", value="Delete"),
                            class_="inlinebuttons",
                        ),
                        name="addreply",
                        method="get",
                        action="#comment",
                    )
                )

            # Add Delete buttons to ticket comments
            stream |= Transformer("//div[@id='changelog']//div[@class='inlinebuttons']").append(
                tag.input(type="submit", name="delete", title="Delete this comment", value="Delete")
            )

        return stream
Exemple #6
0
 def filter_stream(self, req, method, filename, stream, data):
     if filename == 'ticket.html':
         ticket = data.get('ticket')
         if ticket and ticket.exists and \
                 'TICKET_ADMIN' in req.perm(ticket.resource):
             filter = Transformer('//h3[@id="comment:description"]')
             stream |= filter.after(self._clone_form(req, ticket, data))
     return stream
 def filter_stream(self, req, method, filename, stream, data):
     if filename == 'ticket.html':
         ticket = data.get('ticket')
         if ticket and ticket.exists and \
                 self.ticket_clone_permission in req.perm(ticket.resource):
             filter = Transformer('//h3[@id="comment:description"]')
             stream |= filter.after(self._clone_form(req, ticket, data))
     return stream
Exemple #8
0
    def filter_stream(self, req, method, filename, stream, data):
        if filename == 'ticket.html':
            ticket = data.get('ticket')
            if ticket and ticket.exists and \
                    'TICKET_CREATE' in req.perm(ticket.resource):
#                filter = Transformer('//h3[@id="comment:description"]')
                filter = Transformer( self.config.get('trac', 'clone_xpath') )
                return stream | filter.after(self._clone_form(req, ticket, data))
        return stream
Exemple #9
0
 def filter_stream(self, req, method, filename, stream, data):
     if filename == 'query.html':
         filter_script = Transformer('//script[contains(@src, "jquery.js")]')
         filter_query = Transformer('table[@class="listing tickets"]/.')
         return stream | filter_script.after(
             tag.script(
                 type="text/javascript",
                 src=self.env.href('chrome', 'aq', 'js', 'query.js'))) \
                 | filter_query.prepend('<!-- Hello -->')
     return stream
Exemple #10
0
 def filter_stream(self, req, method, filename, stream, data):
     if filename == 'query.html':
         filter_script = Transformer(
             '//script[contains(@src, "jquery.js")]')
         filter_query = Transformer('table[@class="listing tickets"]/.')
         return stream | filter_script.after(
             tag.script(
                 type="text/javascript",
                 src=self.env.href('chrome', 'aq', 'js', 'query.js'))) \
                 | filter_query.prepend('<!-- Hello -->')
     return stream
Exemple #11
0
 def filter_stream(self, req, method, filename, stream, data):
     if filename == 'ticket.html':
         ticket = data.get('ticket')
         if ticket and ticket.exists:
             context = Context.from_request(req, ticket.resource)
             self.changesets = TicketChangesetsFormatter(self.env, context,
                                                         ticket.id)
             exists = self.changesets.exists()
             if exists or not self.hide_when_none:
                 filter = Transformer('//div[@id="attachments"]')
                 return stream | filter.after(self._render(req, ticket,
                                                           exists))
     return stream
Exemple #12
0
    def _add_custom_field_tables(self, stream, ticket):
        ticket_body = Transformer('//div[@id="ticket"]')

        for table_info in self._get_table_fields(ticket):
            headers = table_info["headers"]
            columns = table_info["columns"]
            tickets = table_info["tickets"]

            table = tag.div(
                tag.h3(table_info["title"]),
                tag.table(
                    tag.thead(self._get_header(headers)),
                    tag.tbody(self._get_body(tickets, columns)),
                    class_="listing tickets",
                ),
            )
            stream = stream | ticket_body.after(table)

        return stream
Exemple #13
0
    def filter_stream(self, req, method, filename, stream, data):
        if 'TICKET_ADMIN' in req.perm and \
                req.path_info.startswith('/admin/ticket/components'):
            if data.get('component'):
                cc = DefaultCC(self.env, data.get('component').name)
                filter = Transformer('//form[@id="modcomp"]/fieldset'
                                     '/div[@class="field"][2]')
                filter = filter.after(tag.div("Default CC:",
                                              tag.br(),
                                              tag.input(type='text',
                                                        name='defaultcc',
                                                        value=cc.cc),
                                              class_='field')) \
                               .before(tag.input(type='hidden',
                                                 name='old_name',
                                                 value=cc.name))
                return stream | filter
            else:
                filter = Transformer('//form[@id="addcomponent"]'
                                     '/fieldset/div[@class="buttons"]')
                stream |= filter.before(tag.div("Default CC:",
                                                tag.br(),
                                                tag.input(type='text',
                                                          name='defaultcc'),
                                                class_='field'))

                default_ccs = DefaultCC.select(self.env)

                stream |= Transformer('//table[@id="complist"]/thead/tr') \
                          .append(tag.th('Default CC'))

                for i, comp in enumerate(data.get('components')):
                    if comp.name in default_ccs:
                        default_cc = default_ccs[comp.name]
                    else:
                        default_cc = ''
                    filter = Transformer('//table[@id="complist"]'
                                         '/tbody/tr[%d]' % (i + 1))
                    stream |= filter.append(tag.td(default_cc,
                                                   class_='defaultcc'))
                return stream

        return stream
Exemple #14
0
    def filter_stream(self, req, method, filename, stream, data):
        if 'TICKET_ADMIN' in req.perm and \
                req.path_info.startswith('/admin/ticket/components'):
            if data.get('component'):
                cc = DefaultCC(self.env, data.get('component').name)
                filter = Transformer('//form[@class="mod"]/fieldset'
                                     '/div[@class="field"][2]')
                filter = filter.after(tag.div("Default CC:",
                                              tag.br(),
                                              tag.input(type='text',
                                                        name='defaultcc',
                                                        value=cc.cc),
                                              class_='field')) \
                               .before(tag.input(type='hidden',
                                                 name='old_name',
                                                 value=cc.name))
                return stream | filter
            else:
                filter = Transformer('//form[@id="addcomponent"]'
                                     '/fieldset/div[@class="buttons"]')
                stream |= filter.before(
                    tag.div("Default CC:",
                            tag.br(),
                            tag.input(type='text', name='defaultcc'),
                            class_='field'))

                default_ccs = DefaultCC.select(self.env)

                stream |= Transformer('//table[@id="complist"]/thead'
                                      '/tr/th[3]') \
                          .after(tag.th('Default CC'))

                components = data.get('components')
                if components:
                    func = self._inject_default_cc_cols(
                        default_ccs, components)
                    stream |= Transformer('//table[@id="complist"]'
                                          '/tbody/tr').apply(func)
                return stream

        return stream
Exemple #15
0
    def filter_stream(self, req, method, filename, stream, data):
        """Adds button to ticket page."""
        if filename != 'ticket.html':
            return stream
        ticket = data.get('ticket')
        permission = self.config.get(CONFIG_SECTION, 'permission')
        if not ticket or not ticket.exists or permission not in req.perm(ticket.resource):
            return stream

        url = self.config.get(CONFIG_SECTION, 'kanban_base_url')
        service = LeanKitService(url, self.env)
        team_field = self.config.get(CONFIG_SECTION, 'trac_team_field')
        board = service.get_board(ticket[team_field])
        if not board:
            return stream

        if ticket['status'] == 'closed':
            return stream

        html = Transformer('//div[@class="description"]')
        return stream | html.after(self._kanban_form(board, ticket))
Exemple #16
0
    def _customize_View(self, stream):

        filter = Transformer('.//div [@id="banner"]')
        stream = stream | filter.wrap(self.css_banner_top2)

        buffer = StreamBuffer()
        stream = stream | Transformer('.//div [@id="banner"]').copy(buffer) \
              .end().select('.//div [@id="top2"]') \
              .after(tag.div(id_='top1')(buffer))

        filter = Transformer('.//div [@id="mainnav"]')
        stream = stream | filter.wrap(self.css_banner_top4)

        buffer = StreamBuffer()
        stream = stream | Transformer('.//div [@id="mainnav"]').copy(buffer) \
              .end().select('.//div [@id="top4"]') \
              .after(tag.div(id_='top3')(buffer))

        filter = Transformer('.//div [@id="top3"]')
        stream = stream | filter.after(tag.div(id_='right')(tag.p()))

        filter = Transformer('.//div [@id="right"]')
        stream = stream | filter. \
            append(tag.div(class_='wiki-toc')(tag.h4(_('Table of Contents'))))

        # just for the menu / TOC
        filter = Transformer('.//div [@class="wiki-toc"]')

        if self.anchors and self.keylist:
            for key in self.keylist:
                stream = stream | filter.append(
                    tag.a(key,
                          href='#' + self.anchors.get(key),
                          onclick="scrollup();") + tag.br())
        filter = Transformer('.//div [@id="main"]')
        stream = stream | filter.wrap(self.css_left)

        return stream
    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.
        """

        if filename != 'ticket.html':
            return stream

        ticket = data['ticket']
        for provider in self.providers: # TODO : sorting
            if provider.enabled(req, ticket):
                add_stylesheet(req, 'common/css/ticket-sidebar.css')
                filter = Transformer('//div[@id="content"]')
                stream |= filter.after(tag.div(provider.content(req, ticket),
                                               **{'class': "sidebar" }))
        return stream
Exemple #18
0
    def _customize_View(self, stream):

        filter = Transformer('.//div [@id="banner"]')
        stream = stream | filter.wrap(self.css_banner_top2)

        buffer = StreamBuffer()
        stream = stream | Transformer('.//div [@id="banner"]').copy(buffer).end().select('.//div [@id="top2"]').after(
            tag.div(id_="top1")(buffer)
        )

        filter = Transformer('.//div [@id="mainnav"]')
        stream = stream | filter.wrap(self.css_banner_top4)

        buffer = StreamBuffer()
        stream = stream | Transformer('.//div [@id="mainnav"]').copy(buffer).end().select('.//div [@id="top4"]').after(
            tag.div(id_="top3")(buffer)
        )

        filter = Transformer('.//div [@id="top3"]')
        stream = stream | filter.after(tag.div(id_="right")(tag.p()))

        filter = Transformer('.//div [@id="right"]')
        stream = stream | filter.append(tag.div(class_="wiki-toc")(tag.h4(_("Table of Contents"))))

        # just for the menu / TOC
        filter = Transformer('.//div [@class="wiki-toc"]')

        if self.anchors and self.keylist:
            for key in self.keylist:
                stream = stream | filter.append(
                    tag.a(key, href="#" + self.anchors.get(key), onclick="scrollup();") + tag.br()
                )
        filter = Transformer('.//div [@id="main"]')
        stream = stream | filter.wrap(self.css_left)

        return stream
Exemple #19
0
    def filter_stream(self, req, method, filename, stream, data):
        """Return a filtered Genshi event stream, or the original unfiltered
        stream if no match.
        """

        if filename == "ticket.html" and \
                ('TICKET_REMINDER_VIEW' in req.perm or
                 'TICKET_REMINDER_MODIFY' in req.perm or
                 'TICKET_ADMIN' in req.perm):
            tags = self._reminder_tags(req, data)
            if tags:
                ticket_resource = data['ticket'].resource
                context = Context.from_request(req, ticket_resource)
                attachments_data = AttachmentModule(self.env).attachment_data(context)

                add_stylesheet(req, 'ticketreminder/css/ticketreminder.css')

                # Will attachments section be displayed?
                attachments_or_ticket = Transformer('//div[@id="attachments"]') if attachments_data['can_create'] or attachments_data['attachments'] else Transformer('//div[@id="ticket"]')
                trac_nav = Transformer('//form[@id="propertyform"]/div[@class="trac-nav"]')

                return stream | attachments_or_ticket.after(tags) | trac_nav.append(self._reminder_trac_nav(req, data))

        return stream
    def filter_stream(self, req, method, filename, stream, data):

        # this is shamelessly stollen from MasterTickets
        if data and filename in ["report_view.html", "query_results.html", "ticket.html", "query.html"]:
            self._link_parent(req, filename, data)

        # Tickets will be modified to show the child tickets as a list under the 'Description' section.
        if filename == 'ticket.html':

            # Add our own styles for the ticket lists.
            add_stylesheet(req, 'ct/css/childtickets.css')
            add_stylesheet(req, 'common/css/report.css')
            add_stylesheet(req, 'common/css/roadmap.css')
            add_script(req, 'ct/js/childtickets.js')

            # Get the ticket info.
            ticket = data.get('ticket')

            # Modify ticket.html with sub-ticket table, create button, etc...
            # As follows:
            # - If ticket has no child tickets and child tickets are NOT allowed then skip.
            # - If ticket has child tickets and child tickets are NOT allowed (ie. rules changed or ticket type changed after children were assigned),
            #   print list of tickets but do not allow any tickets to be created.
            # - If child tickets are allowed then print list of child tickets or 'No Child Tickets' if non are currently assigned.
            # 
            if ticket and ticket.exists:

                # The additional section on the ticket is built up of (potentially) three parts: header, ticket table, buttons. These
                # are all 'wrapped up' in a 'div' with the 'attachments' id (we'll just pinch this to make look and feel consistent with any
                # future changes!)
                filter = Transformer('//div[@id="ticket"]')
                snippet = tag.div()

                priorities = dict([(p.name, int(p.value)) for p in Priority.select(self.env)])
                # Are there any child tickets to display?
                childtickets = self._get_childtickets(ticket, priorities)

                # Are child tickets allowed?
                childtickets_allowed = self.config.getbool('childtickets', 'parent.%s.allow_child_tickets' % ticket['type'])

                # If there are no childtickets and the ticket should not have any child tickets, we can simply drop out here.
                if not childtickets_allowed and not childtickets:
                    return stream

                # Our 'main' display consists of two divs.
                buttondiv = tag.div()
                tablediv = tag.div()
                progresshtml = tag.div()

                # Test if the ticket has children: If so, then list in pretty table.
                if childtickets:
                    progresshtml = self._construct_progress(req, ticket)
                    tablediv = self._contruct_tickets_table(req, ticket, childtickets, priorities)

                # trac.ini : child tickets are allowed - Set up 'create new ticket' buttons.
                if childtickets_allowed and 'TICKET_CREATE' in req.perm(ticket.resource):
                    buttondiv = self._contruct_buttons(req, ticket)
            
                snippet.append(tag.h2("Child Tickets",class_="foldable"))
                snippet.append(tag.div(progresshtml, tablediv, buttondiv, id="childtickets"))

                return stream | filter.after(snippet)

        return stream
Exemple #21
0
 def filter_stream(self, req, method, filename, stream, data):
     if filename == 'changeset.html':
             changeset = data.get('changeset')
             filter = Transformer('//dd[@class="message searchable"]')
             return stream | filter.after(self._review_attrs(req,changeset))
     return stream
Exemple #22
0
    def filter_stream(self, req, method, filename, stream, data):

        # Tickets will be modified to show the child tickets as a list under the 'Description' section.
        if filename == 'ticket.html':

            # Add our own styles for the ticket lists.
            add_stylesheet(req, 'ct/css/childtickets.css')

            # Get the ticket info.
            ticket = data.get('ticket')

            # Modify ticket.html with sub-ticket table, create button, etc...
            # As follows:
            # - If ticket has no child tickets and child tickets are NOT allowed then skip.
            # - If ticket has child tickets and child tickets are NOT allowed (ie. rules changed or ticket type changed after children were assigned),
            #   print list of tickets but do not allow any tickets to be created.
            # - If child tickets are allowed then print list of child tickets or 'No Child Tickets' if non are currently assigned.
            # 
            if ticket and ticket.exists:

                # The additional section on the ticket is built up of (potentially) three parts: header, ticket table, buttons. These
                # are all 'wrapped up' in a 'div' with the 'attachments' id (we'll just pinch this to make look and feel consistent with any
                # future changes!)
                filter = Transformer('//div[@id="ticket"]')
                snippet = tag.div()

                # Are there any child tickets to display?
                childtickets = [ Ticket(self.env,n) for n in self.childtickets.get(ticket.id,[]) ]

                # (tempish) fix for #8612 : force sorting by ticket id
                childtickets = sorted(childtickets, key=lambda t: t.id)

                # Are child tickets allowed?
                childtickets_allowed = self.config.getbool('childtickets', 'parent.%s.allow_child_tickets' % ticket['type'])

                # If there are no childtickets and the ticket should not have any child tickets, we can simply drop out here.
                if not childtickets_allowed and not childtickets:
                    return stream

                # Our 'main' display consists of two divs.
                buttondiv = tag.div()
                tablediv = tag.div()

                # Test if the ticket has children: If so, then list in pretty table.
                if childtickets:

                    # trac.ini : Which columns to display in child ticket listing?
                    columns = self.config.getlist('childtickets', 'parent.%s.table_headers' % ticket['type'], default=['summary','owner'])

                    tablediv = tag.div(
                                tag.table(
                                    tag.thead(
                                        tag.tr(
                                            tag.th("Ticket",class_="id"),
                                            [ tag.th(s.title(),class_=s) for s in columns ])
                                        ),
                                    tag.tbody([ self._table_row(req,tkt,columns) for tkt in childtickets ]),
                                    class_="listing tickets",
                                    ),
                                tag.br(),
                                )

                # trac.ini : child tickets are allowed - Set up 'create new ticket' buttons.
                if childtickets_allowed:

                    # Can user create a new ticket? If not, just display title (ie. no 'create' button).
                    if 'TICKET_CREATE' in req.perm(ticket.resource):

                        # Always pass these fields
                        default_child_fields = (
                                tag.input(type="hidden", name="parent", value='#'+str(ticket.id)),
                                )

                        #Pass extra fields defined in inherit parameter of parent
                        inherited_child_fields = [
                                tag.input(type="hidden",name="%s"%field,value=ticket[field]) for field in self.config.getlist('childtickets','parent.%s.inherit' % ticket['type'])
                                ]

                        # If child types are restricted then create a set of buttons for the allowed types (This will override 'default_child_type).
                        restrict_child_types = self.config.getlist('childtickets','parent.%s.restrict_child_type' % ticket['type'],default=[])

                        if not restrict_child_types:
                            # trac.ini : Default 'type' of child tickets?
                            default_child_type = self.config.get('childtickets', 'parent.%s.default_child_type' % ticket['type'], default=self.config.get('ticket','default_type'))

                            # ... create a default submit button
                            if ticket['status'] == 'closed':
                                submit_button_fields = (
                                        tag.input(type="submit",disabled="disabled",name="childticket",value="New Child Ticket",title="Create a child ticket"),
                                        tag.input(type="hidden", name="type", value=default_child_type),
                                        )
                            else:
                                submit_button_fields = (
                                        tag.input(type="submit",name="childticket",value="New Child Ticket",title="Create a child ticket"),
                                        tag.input(type="hidden",name="type",value=default_child_type),
                                        )
                        else:
                            if ticket['status'] == 'closed':
                                submit_button_fields = [ tag.input(type="submit",disabled="disabled",name="type",value="%s" % ticket_type,title="Create a %s child ticket" % ticket_type) for ticket_type in restrict_child_types ]
                            else:
                                submit_button_fields = [ tag.input(type="submit",name="type",value="%s" % ticket_type,title="Create a %s child ticket" % ticket_type) for ticket_type in restrict_child_types ]
                        buttondiv = tag.form(
                                    tag.div( default_child_fields, inherited_child_fields, submit_button_fields),
                                    method="get", action=req.href.newticket(),
                                    )

                snippet.append(tag.h2("Child Tickets",class_="foldable"))
                snippet.append(tag.div(tablediv, buttondiv, id="childtickets"))

                return stream | filter.after(snippet)

        return stream