Esempio n. 1
0
    def process_request(self, req):
        req.perm.require('BROWSER_VIEW')

        presel = req.args.get('preselected')
        if presel and (presel + '/').startswith(req.href.browser() + '/'):
            req.redirect(presel)

        path = req.args.get('path', '/')
        rev = req.args.get('rev', '')
        if rev.lower() in ('', 'head'):
            rev = None
        format = req.args.get('format')
        order = req.args.get('order', 'name').lower()
        desc = req.args.has_key('desc')
        xhr = req.get_header('X-Requested-With') == 'XMLHttpRequest'

        rm = RepositoryManager(self.env)
        all_repositories = rm.get_all_repositories()
        reponame, repos, path = rm.get_repository_by_path(path)

        # Repository index
        show_index = not reponame and path == '/'
        if show_index:
            if repos and (as_bool(all_repositories[''].get('hidden'))
                          or not repos.is_viewable(req.perm)):
                repos = None

        if not repos and reponame:
            raise ResourceNotFound(_("Repository '%(repo)s' not found",
                                     repo=reponame))

        if reponame and reponame != repos.reponame: # Redirect alias
            qs = req.query_string
            req.redirect(req.href.browser(repos.reponame or None, path)
                         + ('?' + qs if qs else ''))
        reponame = repos.reponame if repos else None

        # Find node for the requested path/rev
        context = web_context(req)
        node = None
        display_rev = lambda rev: rev
        if repos:
            try:
                if rev:
                    rev = repos.normalize_rev(rev)
                # If `rev` is `None`, we'll try to reuse `None` consistently,
                # as a special shortcut to the latest revision.
                rev_or_latest = rev or repos.youngest_rev
                node = get_existing_node(req, repos, path, rev_or_latest)
            except NoSuchChangeset, e:
                raise ResourceNotFound(e.message,
                                       _('Invalid changeset number'))

            context = context.child(repos.resource.child('source', path,
                                                   version=rev_or_latest))
            display_rev = repos.display_rev
Esempio n. 2
0
 def _get_remote_trac(self, rintertrac):
     try:
         intertrac = self._intertracs[rintertrac]
     except KeyError:
         raise ResourceNotFound("Remote Trac '%s' is unknown." % rintertrac,
                                "Invalid InterTrac alias")
     try:
         intertrac['url']
     except KeyError:
         raise ResourceNotFound(
             "Remote Trac '%s' has no address configured." % rintertrac,
             "Invalid InterTrac alias")
     return intertrac
Esempio n. 3
0
 def id_is_valid(num):
     try:
         return 0 < int(num) <= 1L << 31
     except ValueError:
         raise ResourceNotFound(
             _("TracForm %(form_id)s does not exist.", form_id=num),
             _("Invalid form number"))
Esempio n. 4
0
 def load_manager(self, neighborhood):
     """Load global environment or product environment given its prefix
     """
     if neighborhood._realm == 'global':
         # FIXME: ResourceNotFound if neighborhood ID != None ?
         prefix = GLOBAL_PRODUCT
     elif neighborhood._realm == 'product':
         prefix = neighborhood._id
     else:
         raise ResourceNotFound(_(u'Unsupported neighborhood %(realm)s',
                                  realm=neighborhood._realm))
     try:
         return lookup_product_env(self.env, prefix)
     except LookupError:
         raise ResourceNotFound(_(u'Unknown product prefix %(prefix)s',
                                  prefix=prefix))
Esempio n. 5
0
    def process_request(self, req):
        page_name = req.args.get('page_name', '')
        if page_name == '':
            page_name = 'index'

        # Add breadcrumb
        package_name, filename = self._get_package_and_filename(page_name)
        index_file = filename[:-len('.txt')] + '/index.txt'

        if not self._resource_exists(package_name, filename):
            # check if it is a folder, then match with index
            if self._resource_exists(package_name, index_file):
                filename = index_file
            else:
                error_msg = _('Page %(page_name)s not found',
                              page_name=page_name)
                raise ResourceNotFound(error_msg)

        utf8_string = resource_string(package_name, filename)
        help_contents = utf8_string.decode('UTF-8')
        # add navigation bar
        self._set_prev_next(req)

        data = dict(context=Context.from_request(req),
                    contents=help_contents,
                    page_name=page_name)
        return ('agilo_help.html', data, 'text/html')
Esempio n. 6
0
 def __init__(self, env, name=None, db=None):
     self.env = env
     if name:
         if not db:
             db = self.env.get_db_cnx()
         cursor = db.cursor()
         cursor.execute("SELECT time,description,summery,header,body,argnum FROM blogpart "
                        "WHERE name=%s", (name,))
         row = cursor.fetchone()
         if not row:
             raise ResourceNotFound(_('BlogPart %(name)s does not exist.',
                               name=name))
         self.name = self._old_name = name
         self.time = row[0] and datetime.fromtimestamp(int(row[0]), utc) or None
         self.description = row[1] or ''
         self.summery = row[2] or ''
         self.header = row[3] or ''
         self.body = row[4] or ''
         self.argnum = row[5] or 0
     else:
         self.name = self._old_name = None
         self.time = None
         self.description = None
         self.summery = None
         self.header = None
         self.body = None
         self.argnum = None
Esempio n. 7
0
    def _fetch_ticket(self, tkt_id):
        row = None
        if self.id_is_valid(tkt_id):
            # Fetch the standard ticket fields
            for row in self.env.db_query(
                    "SELECT %s FROM ticket WHERE id=%%s" %
                    ','.join(self.std_fields), (tkt_id, )):
                break
        if not row:
            raise ResourceNotFound(
                _("Ticket %(id)s does not exist.", id=tkt_id),
                _("Invalid ticket number"))

        self.id = tkt_id
        for i, field in enumerate(self.std_fields):
            value = row[i]
            if field in self.time_fields:
                self.values[field] = from_utimestamp(value)
            elif value is None:
                self.values[field] = empty
            else:
                self.values[field] = value

        # Fetch custom fields if available
        for name, value in self.env.db_query(
                """
                SELECT name, value FROM ticket_custom WHERE ticket=%s
                """, (tkt_id, )):
            if name in self.custom_fields:
                if name in self.time_fields:
                    self.values[name] = _db_str_to_datetime(value)
                elif value is None:
                    self.values[name] = empty
                else:
                    self.values[name] = value
Esempio n. 8
0
    def __init__(self,
                 env,
                 id=None,
                 title=u'',
                 author=u'',
                 mimetype='text/plain',
                 data=u'',
                 time=None):
        self.env = env
        self.id = None
        self.title = title
        self.author = author
        self.mimetype = mimetype
        self.data = data
        self.time = time
        self.resource = Resource('pastebin', self.id)

        if id is not None and self.id_is_valid(id):
            row = None
            db = env.get_db_cnx()
            cursor = db.cursor()
            cursor.execute(
                'SELECT title, author, mimetype, data, time '
                'FROM pastes WHERE id = %s', (id, ))
            row = cursor.fetchone()
            if row:
                self.id = id
                self.title, self.author, self.mimetype, self.data, time = row
                self.time = datetime.fromtimestamp(time, utc)
            else:
                raise ResourceNotFound(_('Paste %s does not exist.' % id),
                                       _('Invalid Paste Number'))
Esempio n. 9
0
 def _get_tags(self, req, resource):
     if not resource_exists(self.env, resource):
         raise ResourceNotFound('Resource "%r" does not exists' % resource)
     # Workaround for ServiceException when calling TagSystem.get_tags().
     provider = [p for p in self.tag_system.tag_providers
                 if p.get_taggable_realm() == resource.realm][0]
     # Type conversion needed for content transfer of Python set objects.
     return list(provider.get_resource_tags(req, resource))
Esempio n. 10
0
 def deleteAttachment(self, req, ticket, filename):
     """ Delete an attachment. """
     if not model.Ticket(self.env, ticket).exists:
         raise ResourceNotFound('Ticket "%s" does not exists' % ticket)
     attachment = Attachment(self.env, 'ticket', ticket, filename)
     req.perm(attachment.resource).require('ATTACHMENT_DELETE')
     attachment.delete()
     return True
Esempio n. 11
0
 def comment(self, req):
     realm = req.args.get('obj_id')
     object_id = req.path_info.split('/')[-1]
     if realm == 'ticket':
         return self._comment_ticket(req, object_id)
     elif realm == 'milestone':
         return self._comment_milestone(req, object_id)
     raise ResourceNotFound('Unsupported realm %s.' % realm,
                            'Invalid Realm')
Esempio n. 12
0
 def _fetch(self, name, db=None):
     for row in self.env.db_query("""
             SELECT name, due, completed, description 
             FROM milestone WHERE name=%s
             """, (name,)):
         self._from_database(row)
         break
     else:
         raise ResourceNotFound(_("Milestone %(name)s does not exist.",
                                  name=name), _("Invalid milestone name"))
Esempio n. 13
0
 def _fetch_page(self, req, pagename, version=None):
     # Helper for getting the WikiPage that performs basic checks
     page = WikiPage(self.env, pagename, version)
     req.perm(page.resource).require('WIKI_VIEW')
     if page.exists:
         return page
     else:
         msg = 'Wiki page "%s" does not exist' % pagename
         if version is not None:
             msg += ' at version %s' % version
         raise ResourceNotFound(msg)
Esempio n. 14
0
 def _comment_ticket(self, req, tkt_id):
     tkt = Ticket(self.env, tkt_id)
     if not tkt.exists:
         raise ResourceNotFound('Ticket %s does not exist.' % tkt_id,
                                'Invalid Ticket Id')
         req.perm.require('TICKET_MODIFY', Resource('ticket', tkt.resource))
     changes = TicketModule(self.env).rendered_changelog_entries(req, tkt)
     return 'itteco_ticket_comment.html', {
         'ticket': tkt,
         'changes': changes
     }, 'text/html'
Esempio n. 15
0
    def process_request(self, req):
        """Override for TicketModule process_request"""
        ticketid = req.args.get('id')
        productid = req.args.get('productid', '')

        if not ticketid:
            # if /newticket is executed in global scope (from QCT), redirect
            # the request to /products/<first_product_in_DB>/newticket
            if not productid and \
                    not isinstance(self.env, ProductEnvironment):
                default_product = self.env.config.get('ticket',
                                                      'default_product')
                products = Product.select(self.env, {'fields': ['prefix']})
                prefixes = [prod.prefix for prod in products]
                if not default_product or default_product not in prefixes:
                    default_product = products[0].prefix
                req.redirect(req.href.products(default_product, 'newticket'))

            return self._process_newticket_request(req)

        if req.path_info in ('/newticket', '/products'):
            raise TracError(_("id can't be set for a new ticket request."))

        if isinstance(self.env, ProductEnvironment):
            ticket = Ticket(self.env, ticketid)
            if productid and ticket['product'] != productid:
                msg = "Ticket %(id)s in product '%(prod)s' does not exist."
                raise ResourceNotFound(_(msg, id=ticketid, prod=productid),
                                       _("Invalid ticket number"))
            return self._process_ticket_request(req)

        # executed in global scope -> assume ticketid=UID, redirect to product
        with self.env.db_direct_query as db:
            rows = db("""SELECT id,product FROM ticket WHERE uid=%s""",
                      (ticketid, ))
            if not rows:
                msg = "Ticket with uid %(uid)s does not exist."
                raise ResourceNotFound(_(msg, uid=ticketid),
                                       _("Invalid ticket number"))
            tid, prefix = rows[0]
            req.redirect(req.href.products(prefix, 'ticket', tid))
Esempio n. 16
0
 def _get_rtcc(self, status):
     try:
         rtcc = self._rtccs[status]
     except KeyError:
         raise ResourceNotFound("status '%s' is unknown." % status)
     if not isinstance(rtcc, unicode):
         try:
             rtcc['component']
         except KeyError:
             raise ResourceNotFound("%s.component is unknown." % status)
         try:
             rtcc['local_cfield']
         except KeyError:
             raise ResourceNotFound("%s.local_cfield is unknown." % status)
         try:
             rtcc['remote_cfield']
         except KeyError:
             raise ResourceNotFound("%s.remote_cfield is unknown." % status)
         try:
             rtcc['remote_intertrac']
         except KeyError:
             raise ResourceNotFound("%s.remote_intertrac is unknown." %
                                    status)
         try:
             rtcc['type']
         except KeyError:
             raise ResourceNotFound("%s.type is unknown." % status)
         return rtcc
Esempio n. 17
0
File: util.py Progetto: ohanar/trac
def get_existing_node(req, repos, path, rev):
    try:
        return repos.get_node(path, rev)
    except NoSuchNode, e:
        # TRANSLATOR: You can 'search' in the repository history... (link)
        search_a = tag.a(_("search"),
                         href=req.href.log(repos.reponame or None, path,
                                           rev=rev, mode='path_history'))
        raise ResourceNotFound(tag(
            tag.p(e.message, class_="message"),
            tag.p(tag_("You can %(search)s in the repository history to see "
                       "if that path existed but was later removed",
                       search=search_a))))
Esempio n. 18
0
    def _comment_milestone(self, req, mil_id):
        milestone = StructuredMilestone(self.env, mil_id)
        if not milestone.exists:
            raise ResourceNotFound('Milestone %s does not exist.' % mil_id,
                                   'Invalid Milestone Name')

        req.perm.require('MILESTONE_MODIFY', milestone.resource)
        changes = TicketModule(self.env).rendered_changelog_entries(
            req, milestone.ticket)
        return 'itteco_milestone_comment.html', {
            'milestone': milestone,
            'changes': changes
        }, 'text/html'
Esempio n. 19
0
 def _render_view(self, req, id):
     """Retrieve the report results and pre-process them for rendering."""
     for title, sql, description in self.env.db_query("""
             SELECT title, query, description from report WHERE id=%s
             """, (id,)):
         break
     else:
         raise ResourceNotFound(_("Report {%(num)s} does not exist.",
                                  num=id), _("Invalid Report Number"))
     try:
         args = self.get_var_args(req)
     except ValueError, e:
         raise TracError(_("Report failed: %(error)s", error=e))
Esempio n. 20
0
    def get_report(self, id):
        try:
            number = int(id)
        except (ValueError, TypeError):
            pass
        else:
            for title, description, sql in self.env.db_query("""
                    SELECT title, description, query from report WHERE id=%s
                    """, (number,)):
                return title, description, sql

        raise ResourceNotFound(_("Report {%(num)s} does not exist.", num=id),
                               _("Invalid Report Number"))
Esempio n. 21
0
 def __init__(self, env, name=None, db=None):
     self.env = env
     self.name = self._old_name = self.time = self.description = None
     if name:
         for time, description in self.env.db_query("""
                 SELECT time, description FROM version WHERE name=%s
                 """, (name,)):
             self.name = self._old_name = name
             self.time = from_utimestamp(time) if time else None
             self.description = description or ''
             break
         else:
             raise ResourceNotFound(_("Version %(name)s does not exist.",
                                      name=name))
Esempio n. 22
0
    def _fetch_crash_by_id(self, id, must_exist=True):
        row = None
        if self.id_is_valid(id):
            # Fetch the standard crashdump fields
            for row in self.env.db_query(
                    "SELECT id,%s FROM crashdump WHERE id=%%s" %
                    ','.join(self.std_fields), (id, )):
                break
        if not row and must_exist:
            raise ResourceNotFound(_("Crash %(id)s does not exist.", id=id),
                                   _("Invalid crash identifier"))

        if row:
            self.id = id
            self._load_from_record(row)
Esempio n. 23
0
 def __init__(self, env, name=None):
     self.env = env
     self.name = self._old_name = self.owner = self.description = None
     if name:
         for owner, description in self.env.db_query(
                 """
                 SELECT owner, description FROM component WHERE name=%s
                 """, (name, )):
             self.name = self._old_name = name
             self.owner = owner or None
             self.description = description or ''
             break
         else:
             raise ResourceNotFound(
                 _("Component %(name)s does not exist.", name=name))
Esempio n. 24
0
    def __init__(self, env, name=None, db=None):
        """Create an undefined milestone or fetch one from the database,
        if `name` is given.

        In the latter case however, raise `~trac.resource.ResourceNotFound`
        if a milestone of that name doesn't exist yet.
        """
        self.env = env
        if name:
            if not self.cache.fetchone(name, self):
                raise ResourceNotFound(
                    _("Milestone %(name)s does not exist.", name=name),
                    _("Invalid milestone name"))
        else:
            self.cache.factory((None, None, None, ''), self)
Esempio n. 25
0
    def process_request(self, req):
        """Override for TicketModule process_request"""
        ticketid = req.args.get('id')
        productid = req.args.get('productid', '')

        if ticketid:
            if req.path_info in ('/newticket', '/products'):
                raise TracError(_("id can't be set for a new ticket request."))
            ticket = Ticket(self.env, ticketid)
            if productid and ticket['product'] != productid:
                msg = "Ticket %(id)s in product '%(prod)' does not exist."
                raise ResourceNotFound(_(msg, id=ticketid, prod=productid),
                                       _("Invalid ticket number"))
            return self._process_ticket_request(req)
        return self._process_newticket_request(req)
Esempio n. 26
0
    def _refresh_ticket(self):
        rts = RemoteTicketSystem(self.env)
        remote_trac = rts.get_remote_trac(self.remote_name)['url']
        xmlrpc_addr = Href(remote_trac).rpc()
        server = xmlrpclib.ServerProxy(xmlrpc_addr)

        try:
            tkt_vals = server.ticket.get(self.id)
        except xmlrpclib.ProtocolError, e:
            msg = ("Could not contact remote Trac '%s' at %s. "
                   "Received error %s, %s")
            log = ("XML-RPC ProtocolError contacting Trac %s at %s, "
                   "errcode=%s, errmsg='%s'")
            args = (self.remote_name, xmlrpc_addr, e.errcode, e.errmsg)
            self.env.log.warn(log, *args)
            raise ResourceNotFound(msg % args, "Uncontactable server")
    def _resolve_object_and_action(self, dbp):
        self.action = self.req.args.get('action', None)
        if not self.action in ['view', 'edit', 'list', 'new', 'delete', None]:
            raise ValueError("Unknown action '%s'" % (self.action, ))

        if self.resource_type is None:
            self.obj = None
            self.action = 'index'
        elif self.resource_type == 'search':
            if not self.resource_id in [
                    'no_spec', 'by_filter', 'artifact', 'spec', 'relatedpages',
                    'specdetails'
            ]:
                raise Exception("Unknown search '%s'" % (self.resource_id, ))
            self.obj = self.resource_id
            self.action = 'list'
        elif self.resource_type == 'pages':
            self.obj = None
            self.action = 'list'
        elif self.resource_type == 'tracking':
            self.obj = self.resource_id  # start || end
            self.action = 'new'
        elif self.resource_type in ['spec', 'artifact']:
            if self.resource_id is None:
                if self.resource_type == 'spec':
                    self.obj = Entity
                elif self.resource_type == 'artifact':
                    self.obj = Instance
            else:
                if not dbp:
                    raise ValueError(
                        "Cannot load the resource. No database pool provided.")
                dbp.load_item(self.resource_id)
                self.obj = dbp.pool.get_item(self.resource_id)
                if self.obj is None:
                    raise ResourceNotFound(
                        "No resource found with identifier '%s'" %
                        (self.resource_id, ))

        if self.action is None:  # default action depends on the instance's meta-level
            if self.obj is Entity:
                self.action = 'index'
            elif isinstance(self.obj, type):
                self.action = 'list'
            else:
                self.action = 'view'
Esempio n. 28
0
    def process_request(self, req):
        if not self.repository:                             # pragma: no cover
            return super(GitHubBrowser, self).process_request(req)

        rev = req.args.get('rev')
        path = req.args.get('path')

        rm = RepositoryManager(self.env)
        reponame, repos, path = rm.get_repository_by_path(path)

        key = 'repository' if is_default(reponame) else '%s.repository' % reponame
        gh_repo = self.config.get('github', key)

        try:
            rev = repos.normalize_rev(rev)
        except NoSuchChangeset, e:
            raise ResourceNotFound(e.message, _('Invalid Changeset Number'))
Esempio n. 29
0
 def __init__(self, env, name=None, db=None):
     if not self.ticket_col:
         self.ticket_col = self.type
     self.env = env
     if name:
         for value, in self.env.db_query("""
                 SELECT value FROM enum WHERE type=%s AND name=%s
                 """, (self.type, name)):
             self.value = self._old_value = value
             self.name = self._old_name = name
             break
         else:
             raise ResourceNotFound(_("%(type)s %(name)s does not exist.",
                                      type=self.type, name=name))
     else:
         self.value = self._old_value = None
         self.name = self._old_name = None
Esempio n. 30
0
    def pre_process_request(self, req, handler):
        """pre process request filter"""
        pid = None
        match = PRODUCT_RE.match(req.path_info)
        if match:
            dispatcher = self.env[RequestDispatcher]
            if dispatcher is None:
                raise TracError('Unable to load RequestDispatcher.')
            pid = match.group('pid')

        if pid:
            products = Product.select(self.env, where={'prefix': pid})
            if pid and len(products) == 1:
                req.args['productid'] = pid
                req.args['product'] = products[0].name
                if handler is self and match.group('pathinfo') not in ('',
                                                                       '/'):
                    # select a new handler
                    environ = req.environ.copy()
                    pathinfo = environ['PATH_INFO'].split('/')
                    pathinfo = '/'.join(pathinfo[:1] + pathinfo[3:])
                    environ['PATH_INFO'] = pathinfo
                    newreq = Request(environ, lambda *args, **kwds: None)

                    new_handler = None
                    for hndlr in dispatcher.handlers:
                        if hndlr is not self and hndlr.match_request(newreq):
                            new_handler = hndlr
                            req.args.update(newreq.args)
                            break
                    if new_handler is None:
                        if req.path_info.endswith('/'):
                            target = req.path_info.rstrip('/').encode('utf-8')
                            if req.query_string:
                                target += '?' + req.query_string
                            req.redirect(req.href + target, permanent=True)
                        raise HTTPNotFound('No handler matched request to %s',
                                           req.path_info)
                    handler = new_handler
            else:
                raise ResourceNotFound(
                    _("Product %(id)s does not exist.", id=pid),
                    _("Invalid product id"))

        return handler