--- /dev/null
+import inspect
+import importlib
+import os.path
+from urlparse import urlunsplit
+
+# FIXME: better way to handle this?
+_app = None
+def setup(app):
+ global _app
+ _app = app
+ app.add_config_value('github_user', None, 'env')
+ app.add_config_value('github_project', None, 'env')
+
+def linkcode_resolve(domain, info):
+ # TODO: js?
+ if domain != 'py':
+ return None
+
+ module, fullname = info['module'], info['fullname']
+ # TODO: attributes/properties don't have modules, maybe try to look them
+ # up based on their cached host object?
+ if not module:
+ return None
+
+ obj = importlib.import_module(module)
+ for item in fullname.split('.'):
+ obj = getattr(obj, item, None)
+
+ if obj is None:
+ return None
+
+ # get original from decorated methods
+ try: obj = getattr(obj, '_orig')
+ except AttributeError: pass
+
+ try:
+ obj_source_path = inspect.getsourcefile(obj)
+ _, line = inspect.getsourcelines(obj)
+ except (TypeError, IOError):
+ # obj doesn't have a module, or something
+ return None
+
+ import openerp
+ project_root = os.path.join(os.path.dirname(openerp.__file__), '..')
+ return make_github_link(
+ os.path.relpath(obj_source_path, project_root),
+ line)
+
+def make_github_link(path, line=None, mode="blob"):
+ config = _app.config
+ if not (config.github_user and config.github_project):
+ return None
+
+ urlpath = "/{user}/{project}/{mode}/{branch}/{path}".format(
+ user=config.github_user,
+ project=config.github_project,
+ branch=config.version or 'master',
+ path=path,
+ mode=mode,
+ )
+ return urlunsplit((
+ 'https',
+ 'github.com',
+ urlpath,
+ '',
+ '' if line is None else 'L%d' % line
+ ))
+
+def github_doc_link(pagename, mode='blob'):
+ return make_github_link(
+ 'doc/%s%s' % (pagename, _app.config.source_suffix), mode=mode)
.sphinxsidebarwrapper > .nav li.current > .nav {
display: block;
}
+.sphinxsidebarwrapper > p {
+ margin: 5px 10px 10px;
+}
+.sphinxsidebarwrapper > p a {
+ font-size: 13px;
+}
+.sphinxsidebarwrapper > p a:hover {
+ text-decoration: none;
+}
+.sphinxsidebarwrapper > p a.github {
+ padding-left: 15px;
+ position: relative;
+}
+.sphinxsidebarwrapper > p a.github:before {
+ left: 0;
+ top: 1px;
+ content: '';
+ position: absolute;
+ width: 13px;
+ height: 13px;
+ background: url(github-link.png) left bottom / 13px no-repeat;
+}
+.sphinxsidebarwrapper > p a.github:hover:before {
+ background-position: left top;
+}
/* Side navigation graphical styling */
.sphinxsidebarwrapper {
width: 100%;
.headerlink {
display: none;
}
+.viewcode-link {
+ font-weight: normal;
+ float: right;
+ display: none;
+}
+dt:hover > a > .viewcode-link {
+ display: inline;
+}
div.section > h1 {
padding-bottom: 9px;
margin: 40px 0 20px;
'sphinx.ext.todo',
'sphinx.ext.autodoc',
'sphinx.ext.intersphinx',
+ 'sphinx.ext.linkcode',
'odoodoc',
'patchqueue'
]
'python': ('https://docs.python.org/2/', None),
'werkzeug': ('http://werkzeug.pocoo.org/docs/0.9/', None),
}
+
+from odoodoc.github import linkcode_resolve, github_doc_link
+github_user = 'odoo'
+github_project = 'odoo'
+
+html_context = {
+ 'github': github_doc_link
+}