Edgewall Software

Changes between Initial Version and Version 1 of TracDev/PluginDevelopment/ExtensionPoints/trac.versioncontrol.web_ui.browser.IPropertyRenderer


Ignore:
Timestamp:
Jan 15, 2012, 3:31:54 PM (12 years ago)
Author:
Peter Suter
Comment:

Legend:

Unmodified
Added
Removed
Modified
  • TracDev/PluginDevelopment/ExtensionPoints/trac.versioncontrol.web_ui.browser.IPropertyRenderer

    v1 v1  
     1== Extension Point : ''IPropertyRenderer'' ==
     2
     3||'''Interface'''||''IPropertyRenderer''||'''Since'''||[wiki:TracDev/ApiChanges/0.11#IPropertyRenderer 0.11]||
     4||'''Module'''||''trac.versioncontrol.web_ui''||'''Source'''||[source:trunk/trac/versioncontrol/web_ui/browser.py browser.py]||
     5
     6The ''IPropertyRenderer'' allows rendering node and changeset properties in TracBrowser and TracChangeset views.
     7
     8== Purpose ==
     9
     10Trac provides advanced source control integration with the ability to browse source code and view changesets etc. In such views it is often useful to visualize additional metadata. Trac allows arbitrary visualizations of any such data provided by the version control backend as properties.
     11
     12Plugins can add additional ways to render such properties by implementing !IPropertyRenderer. To render ''differences'' between properties, use [[trac.versioncontrol.web_ui.changeset.IPropertyDiffRenderer]].
     13
     14== Usage ==
     15
     16Implementing the interface follows the standard guidelines found in [wiki:TracDev/ComponentArchitecture] and of course [wiki:TracDev/PluginDevelopment].
     17
     18A class implementing !IPropertyRenderer directly can advertise variable levels of support for rendering any property in `match_property`, by matching on property `name` or `mode`.
     19
     20`name`: Different version control backends make different properties available, exposing metadata specific to that system. This is controlled by the [[trac.versioncontrol.api.IRepositoryConnector]] and its `Node` and `Changeset` subclasses.
     21
     22`mode`: By default the following values can occur, but other identifiers might be used by plugins.
     23 - 'browser' rendered in the browser view
     24 - 'changeset' rendered in the changeset view as a node property
     25 - 'revprop' rendered in the changeset view as a revision property
     26 
     27The `render_property` method is then called each time a matched property is rendered (if no other renderer matched with a higher level of support). That method should render the property, by returning:
     28 - `None`: the property will be skipped
     29 - an `unicode` value: the property will be displayed as text
     30 - a `RenderedProperty` instance: the property will only be displayed using the instance's `content` attribute, and the other attributes will also be used in some display contexts (like `revprop`)
     31 - `Markup` or other Genshi content: the property will be displayed normally, using that content as a block-level markup
     32
     33For rendering properties on a new kind of page call the appropriate implementation via `trac.versioncontrol.web_ui.BrowserModule(env).render_property()` or `render_properties()`.
     34Usually the properties to be rendered are obtained from the `get_properties()` methods of `trac.versioncontrol.api.Changeset` or `Node` subclasses.
     35
     36== Examples ==
     37
     38The following example property renderer can be configured using a new TracIni option. All listed property names are treated as usernames, obfuscating email addresses when appropriate.
     39{{{#!python
     40from genshi.builder import tag
     41from trac.core import *
     42from trac.config import ListOption
     43from trac.web.chrome import Chrome
     44from trac.versioncontrol.web_ui.browser import IPropertyRenderer
     45
     46class UsernamePropertyRenderer(Component):
     47    """Username version control property renderer."""
     48
     49    implements(IPropertyRenderer)
     50
     51    username_properties = ListOption('browser', 'username_properties',
     52                                 'reviewer',
     53        doc="""Comma-separated list of version control properties to render
     54        as usernames (with obfuscated email address if appropriate) in the
     55        repository browser.""")
     56
     57    def match_property(self, name, mode):
     58        return 4 if name in self.username_properties
     59
     60    def render_property(self, name, mode, context, props):
     61        username = props[name]
     62        safe_username = Chrome(self.env).format_author(context.req, username)
     63        return unicode(safe_username)
     64}}}
     65
     66== Available Implementations ==
     67
     68In Trac:
     69 * [source:trunk/trac/versioncontrol/web_ui/browser.py trac.versioncontrol.web_ui.browser.DefaultPropertyRenderer][[BR]]
     70   Fallback for rendering as text any property that's not rendered by a more specific renderer.
     71 * [source:trunk/trac/versioncontrol/web_ui/browser.py trac.versioncontrol.web_ui.browser.WikiPropertyRenderer][[BR]]
     72   Renders [TracIni#browser-section oneliner_properties and wiki_properties] as wiki text.
     73 * [source:trunk/trac/versioncontrol/svn_prop.py trac.versioncontrol.svn_prop.SubversionPropertyRenderer][[BR]]
     74   Renders `svn:externals` links (translated the mapping in the[TracIni#svn:externals-section TracIni svn:externals] section.[[BR]]
     75   Renders `svn:needs-lock` as a [[Image(chrome/common/lock-locked.png)]] lock icon.[[BR]]
     76   Renders `svn:mergeinfo`, `svnmerge-blocked` and `svnmerge-integrated` in a simple table of merged revisions.
     77 * [source:trunk/trac/versioncontrol/svn_prop.py trac.versioncontrol.svn_prop.SubversionMergePropertyRenderer][[BR]]
     78   Renders `svn:mergeinfo`, `svnmerge-blocked` and `svnmerge-integrated` in a table of merged revisions, converting branch names to links and providing links to the revision log for merged and eligible revisions. (Overrides the simpler table of !SubversionPropertyRenderer.)
     79
     80In TracMercurial:
     81 * `tracext.hg.backend.HgDefaultPropertyRenderer`[[BR]]
     82   Fallback for rendering `hg-` properties that are not rendered by a more specific renderer as text.
     83 * `tracext.hg.backend.CsetPropertyRenderer`[[BR]]
     84   Renders `hg-Parents`, `hg-Children`, `hg-Tags` and `hg-Branch` changeset links.
     85 * `tracext.hg.backend.HgExtPropertyRenderer`[[BR]]
     86   Renders `hg-transplant_source` links (hg extra `transplant_source` added by the ''Transplant extension'')[[BR]]
     87   Renders `hg-convert_revision` links (hg extra `convert_revision` added by the ''Convert extension'')
     88
     89In [th:GitPlugin]:
     90 * `tracext.git.git_fs.CsetPropertyRenderer`[[BR]]
     91   Renders `Parents`, `Children` and `Branches` changeset links.[[BR]]
     92   Renders `git-committer` and `git-author` usernames.
     93
     94In [th:PerforcePlugin]:
     95 * `p4trac.api.PerforcePropertyRenderer`[[BR]]
     96   Renders `Tickets` links.
     97   
     98In [https://launchpad.net/trac-bzr Trac Bazaar Plugin]:
     99 * `tracbzr.backend.BzrPropertyRenderer`[[BR]]
     100   Renders `parents` changeset links and `bugs` ticket links.
     101
     102== Additional Information and References ==
     103
     104 * [http://www.edgewall.org/docs/trac-trunk/epydoc/trac.versioncontrol.web_ui.browser.IPropertyRenderer-class.html epydoc]
     105 * [http://www.edgewall.org/docs/trac-trunk/html/api/trac_versioncontrol_web_ui_browser.html#trac.versioncontrol.web_ui.browser.IWikiMacroProvider API Reference]
     106 * Related to the [[trac.versioncontrol.web_ui.changeset.IPropertyDiffRenderer]]
     107 * Related tickets:
     108  * #1601 Initial implementation
     109  * [query:keywords~=property&keywords~=properties property or properties keyword]
     110  * [query:keywords=~mergeinfo mergeinfo keyword] (A set of properties used by Subversion to track merged changesets.)