Exemple #1
0
    def _process_filter_request(self, req):
        '''
        Process filter request.

        This method is invoked when RevTree update is done by user.

        :param req: Trac request object
        '''
        session_ctx = SessionContext(req)

        # Reset clause
        if req.args.get("reset"):
            session_ctx.clear()

            dump = json.dumps(dict())

            # Send response
            req.send_response(200)
            req.send_header('Content-Type', "application/json")
            req.send_header('Content-Length', len(dump))
            req.write(dump);
            return

        for key in ['query_options', 'query_filters']:
            if key not in req.args:
                continue
            return self._process_query_filters_options(req,
                                                       key,
                                                       req.args[key])

        # Repository object
        repos = Repository(self.env)

        if self.abstime:
            timebase = int(time.time())
        else:
            youngest = repos.get_youngest_rev()
            timebase = to_timestamp(repos.get_changeset(youngest).date)

        # Style options
        style = req.args.get('style', 'compact')

        try:
            # Generate query
            query = QueryFilter(self.env,
                                repos,
                                req.args)

            # Update session context information
            session_ctx['query'] = query.export()
            session_ctx['style'] = style

            svgbranches, revisions, filtered_revisions = \
                self._process_query(repos,
                                    query,
                                    timebase)
            if (not svgbranches) or (not revisions):
                raise EmptyRangeError('')

            repos = Repository(self.env)

            # MANDATORY: revisions must be sorted in reversed order
            revisions.sort(reverse=True, key=lambda t: t[0])

            # SVG revision tree object
            svgrevtree = self.rt.get_revtree(repos, req)
            svgrevtree.create(req,
                              svgbranches,
                              revisions,
                              filtered_revisions,
                              style)

            svgrevtree.build()
        except EmptyRangeError as excpt:
            msg = _('Selected filters cannot '
                    'render a revision tree. %s' % excpt.message.encode('utf8'))
            msg = msg.encode('UTF-8')
            req.send_response(404)
            req.send_header('Content-Type', "text/html; charset=utf-8'")
            req.send_header('Content-Length', len(msg))
            req.write(msg)
        else:
            data = dict(revisions=self._get_ui_revisions(),
                        authors=self._get_ui_authors(),
                        # branches=self._get_ui_branches(reverse=False),
                        fontsize=self.env.config.get('revtree',
                                                     'fontsize',
                                                     '14pt'),
                        fontfamily=self.env.config.get('revtree',
                                                       'fontname',
                                                       'arial'),
                        tree=dict(brc=svgrevtree.export(),
                                  max_rev=svgrevtree.max_rev),
                        url=req.href(),
                        style=style)
            dump = json.dumps(data)

            # Send response
            req.send_response(200)
            req.send_header('Content-Type', "application/json")
            req.send_header('Content-Length', len(dump))
            req.write(dump)