Parent: [b6daea] (diff)

Download this file

link_main.py    105 lines (86 with data), 3.2 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
#-*- python -*-
import logging
# Non-stdlib imports
import pkg_resources
from tg import expose, validate, redirect, response, flash
from pylons import g, c, request
# Pyforge-specific imports
from allura.app import Application, ConfigOption, SitemapEntry, DefaultAdminController
from allura.lib import helpers as h
from allura.lib.security import require_access
from allura.lib.utils import permanent_redirect
from allura import model as M
from allura.controllers import BaseController
# Local imports
from forgelink import version
log = logging.getLogger(__name__)
class ForgeLinkApp(Application):
'''This is the Link app for PyForge'''
__version__ = version.__version__
permissions = [ 'configure', 'read' ]
config_options = Application.config_options + [
ConfigOption('url', str, None)
]
searchable=True
tool_label='External Link'
default_mount_label='Link name'
default_mount_point='link'
ordinal=1
icons={
24:'images/ext_24.png',
32:'images/ext_32.png',
48:'images/ext_48.png'
}
def __init__(self, project, config):
Application.__init__(self, project, config)
self.root = RootController()
self.admin = LinkAdminController(self)
@property
@h.exceptionless([], log)
def sitemap(self):
menu_id = self.config.options.mount_label
return [SitemapEntry(menu_id, '.')[self.sidebar_menu()] ]
def sidebar_menu(self):
return []
def admin_menu(self):
return super(ForgeLinkApp, self).admin_menu()
def install(self, project):
'Set up any default permissions and roles here'
self.config.options['project_name'] = project.name
super(ForgeLinkApp, self).install(project)
# Setup permissions
role_admin = M.ProjectRole.by_name('Admin')._id
role_anon = M.ProjectRole.anonymous()._id
self.config.acl = [
M.ACE.allow(role_anon, 'read'),
M.ACE.allow(role_admin, 'configure'),
]
def uninstall(self, project):
"Remove all the tool's artifacts from the database"
super(ForgeLinkApp, self).uninstall(project)
class RootController(BaseController):
def _check_security(self):
require_access(c.app, 'read')
@expose('jinja:forgelink:templates/link/index.html')
def index(self, **kw):
url = c.app.config.options.get('url')
if url:
permanent_redirect(url)
return dict()
@expose()
def _lookup(self, *remainder):
path = "/".join(remainder)
# HACK: The TG request extension machinery will strip off the end of
# a dotted wiki page name if it matches a known file extension. Here,
# we reassemble the original page name.
if request.response_ext:
path += request.response_ext
url = c.app.config.options.get('url')
if url:
permanent_redirect(url + h.really_unicode(path).encode('utf-8'))
return dict()
class LinkAdminController(DefaultAdminController):
@expose()
def index(self, **kw):
flash('External link URL updated.')
redirect(c.project.url()+'admin/tools')