def attach(self, req): path = req.path_info.split("/") realm, obj_id = path[3:] obj_resource = Resource(realm, id=obj_id) attachment = Attachment(self.env, obj_resource.child("attachment")) req.perm(attachment.resource).require("ATTACHMENT_CREATE") if req.method == "POST": self._save_attachement(req, attachment) pass return "itteco_attach_popup.html", {"resource": obj_resource}, "text/html"
def attach(self, req): path = req.path_info.split('/') realm, obj_id = path[3:] obj_resource = Resource(realm, id=obj_id) attachment = Attachment(self.env, obj_resource.child('attachment')) req.perm(attachment.resource).require('ATTACHMENT_CREATE') if req.method == 'POST': self._save_attachement(req, attachment) pass return 'itteco_attach_popup.html', { 'resource': obj_resource }, 'text/html'
class Repository(object): """Base class for a repository provided by a version control system.""" has_linear_changesets = False scope = '/' def __init__(self, name, params, log): """Initialize a repository. :param name: a unique name identifying the repository, usually a type-specific prefix followed by the path to the repository. :param params: a `dict` of parameters for the repository. Contains the name of the repository under the key "name" and the surrogate key that identifies the repository in the database under the key "id". :param log: a logger instance. """ self.name = name self.params = params self.reponame = params['name'] self.id = params['id'] self.log = log self.resource = Resource('repository', self.reponame) def close(self): """Close the connection to the repository.""" raise NotImplementedError def get_base(self): """Return the name of the base repository for this repository. This function returns the name of the base repository to which scoped repositories belong. For non-scoped repositories, it returns the repository name. """ return self.name def clear(self, youngest_rev=None): """Clear any data that may have been cached in instance properties. `youngest_rev` can be specified as a way to force the value of the `youngest_rev` property (''will change in 0.12''). """ pass def sync(self, rev_callback=None, clean=False): """Perform a sync of the repository cache, if relevant. If given, `rev_callback` must be a callable taking a `rev` parameter. The backend will call this function for each `rev` it decided to synchronize, once the synchronization changes are committed to the cache. When `clean` is `True`, the cache is cleaned first. """ pass def sync_changeset(self, rev): """Resync the repository cache for the given `rev`, if relevant. Returns a "metadata-only" changeset containing the metadata prior to the resync, or `None` if the old values cannot be retrieved (typically when the repository is not cached). """ return None def get_quickjump_entries(self, rev): """Generate a list of interesting places in the repository. `rev` might be used to restrict the list of available locations, but in general it's best to produce all known locations. The generated results must be of the form (category, name, path, rev). """ return [] def get_path_url(self, path, rev): """Return the repository URL for the given path and revision. The returned URL can be `None`, meaning that no URL has been specified for the repository, an absolute URL, or a scheme-relative URL starting with `//`, in which case the scheme of the request should be prepended. """ return None def get_changeset(self, rev): """Retrieve a Changeset corresponding to the given revision `rev`.""" raise NotImplementedError def get_changeset_uid(self, rev): """Return a globally unique identifier for the ''rev'' changeset. Two changesets from different repositories can sometimes refer to the ''very same'' changeset (e.g. the repositories are clones). """ def get_changesets(self, start, stop): """Generate Changeset belonging to the given time period (start, stop). """ rev = self.youngest_rev while rev: chgset = self.get_changeset(rev) if chgset.date < start: return if chgset.date < stop: yield chgset rev = self.previous_rev(rev) def has_node(self, path, rev=None): """Tell if there's a node at the specified (path,rev) combination. When `rev` is `None`, the latest revision is implied. """ try: self.get_node(path, rev) return True except TracError: return False def get_node(self, path, rev=None): """Retrieve a Node from the repository at the given path. A Node represents a directory or a file at a given revision in the repository. If the `rev` parameter is specified, the Node corresponding to that revision is returned, otherwise the Node corresponding to the youngest revision is returned. """ raise NotImplementedError def get_oldest_rev(self): """Return the oldest revision stored in the repository.""" raise NotImplementedError oldest_rev = property(lambda self: self.get_oldest_rev()) def get_youngest_rev(self): """Return the youngest revision in the repository.""" raise NotImplementedError youngest_rev = property(lambda self: self.get_youngest_rev()) def previous_rev(self, rev, path=''): """Return the revision immediately preceding the specified revision. If `path` is given, filter out ancestor revisions having no changes below `path`. In presence of multiple parents, this follows the first parent. """ raise NotImplementedError def next_rev(self, rev, path=''): """Return the revision immediately following the specified revision. If `path` is given, filter out descendant revisions having no changes below `path`. In presence of multiple children, this follows the first child. """ raise NotImplementedError def parent_revs(self, rev): """Return a list of parents of the specified revision.""" parent = self.previous_rev(rev) return [parent] if parent is not None else [] def rev_older_than(self, rev1, rev2): """Provides a total order over revisions. Return `True` if `rev1` is an ancestor of `rev2`. """ raise NotImplementedError def get_path_history(self, path, rev=None, limit=None): """Retrieve all the revisions containing this path. If given, `rev` is used as a starting point (i.e. no revision ''newer'' than `rev` should be returned). The result format should be the same as the one of Node.get_history() """ raise NotImplementedError def normalize_path(self, path): """Return a canonical representation of path in the repos.""" raise NotImplementedError def normalize_rev(self, rev): """Return a (unique) canonical representation of a revision. It's up to the backend to decide which string values of `rev` (usually provided by the user) should be accepted, and how they should be normalized. Some backends may for instance want to match against known tags or branch names. In addition, if `rev` is `None` or '', the youngest revision should be returned. """ raise NotImplementedError def short_rev(self, rev): """Return a compact representation of a revision in the repos.""" return self.normalize_rev(rev) def display_rev(self, rev): """Return a representation of a revision in the repos for displaying to the user. This can be a shortened revision string, e.g. for repositories using long hashes. """ return self.normalize_rev(rev) def get_changes(self, old_path, old_rev, new_path, new_rev, ignore_ancestry=1): """Generates changes corresponding to generalized diffs. Generator that yields change tuples (old_node, new_node, kind, change) for each node change between the two arbitrary (path,rev) pairs. The old_node is assumed to be None when the change is an ADD, the new_node is assumed to be None when the change is a DELETE. """ raise NotImplementedError def is_viewable(self, perm): """Return True if view permission is granted on the repository.""" return 'BROWSER_VIEW' in perm(self.resource.child('source', '/')) can_view = is_viewable # 0.12 compatibility
def test_resource_doesnt_exist(self): """Non-existent resource returns False from resource_exists.""" parent = Resource('parent_realm', 'parent_id') self.assertTrue(resource_exists(self.env, parent)) r = parent.child('attachment', 'file.txt') self.assertFalse(resource_exists(self.env, r))