base.py
93 lines
| 3.6 KiB
| text/x-python
|
PythonLexer
r547 | """The base Controller API | |||
Provides the BaseController class for subclassing. | ||||
""" | ||||
r1373 | import logging | |||
r1601 | import time | |||
r1373 | from pylons import config, tmpl_context as c, request, session, url | |||
r547 | from pylons.controllers import WSGIController | |||
r1373 | from pylons.controllers.util import redirect | |||
r547 | from pylons.templating import render_mako as render | |||
r1304 | ||||
r547 | from rhodecode import __version__ | |||
r1629 | from rhodecode.lib import str2bool | |||
Liad Shani
|
r1617 | from rhodecode.lib.auth import AuthUser, get_container_username | ||
r547 | from rhodecode.lib.utils import get_repo_slug | |||
from rhodecode.model import meta | ||||
r691 | from rhodecode.model.scm import ScmModel | |||
r710 | from rhodecode import BACKENDS | |||
r1366 | from rhodecode.model.db import Repository | |||
r1702 | from rhodecode.model.notification import NotificationModel | |||
r665 | ||||
r1373 | log = logging.getLogger(__name__) | |||
r1307 | ||||
r547 | class BaseController(WSGIController): | |||
r659 | ||||
r547 | def __before__(self): | |||
r548 | c.rhodecode_version = __version__ | |||
r890 | c.rhodecode_name = config.get('rhodecode_title') | |||
r1629 | c.use_gravatar = str2bool(config.get('use_gravatar')) | |||
r891 | c.ga_code = config.get('rhodecode_ga_code') | |||
r547 | c.repo_name = get_repo_slug(request) | |||
r659 | c.backends = BACKENDS.keys() | |||
r1702 | c.unread_notifications = NotificationModel()\ | |||
.get_unread_cnt_for_user(c.rhodecode_user.user_id) | ||||
r890 | self.cut_off_limit = int(config.get('cut_off_limit')) | |||
r1036 | ||||
r784 | self.sa = meta.Session() | |||
r1045 | self.scm_model = ScmModel(self.sa) | |||
r1366 | ||||
r547 | def __call__(self, environ, start_response): | |||
"""Invoke the Controller""" | ||||
# WSGIController.__call__ dispatches to the Controller method | ||||
# the request is routed to. This routing information is | ||||
# available in environ['pylons.routes_dict'] | ||||
r1601 | start = time.time() | |||
r547 | try: | |||
r1628 | # make sure that we update permissions each time we call controller | |||
r1117 | api_key = request.GET.get('api_key') | |||
user_id = getattr(session.get('rhodecode_user'), 'user_id', None) | ||||
Liad Shani
|
r1630 | username = get_container_username(environ, config) | ||
r1628 | auth_user = AuthUser(user_id, api_key, username) | |||
self.rhodecode_user = c.rhodecode_user = auth_user | ||||
Liad Shani
|
r1618 | if not self.rhodecode_user.is_authenticated and \ | ||
self.rhodecode_user.user_id is not None: | ||||
Liad Shani
|
r1613 | self.rhodecode_user.set_authenticated( | ||
r1117 | getattr(session.get('rhodecode_user'), | |||
'is_authenticated', False)) | ||||
session['rhodecode_user'] = self.rhodecode_user | ||||
session.save() | ||||
r547 | return WSGIController.__call__(self, environ, start_response) | |||
finally: | ||||
r1601 | log.debug('Request time: %.3fs' % (time.time()-start)) | |||
r547 | meta.Session.remove() | |||
r1045 | ||||
class BaseRepoController(BaseController): | ||||
""" | ||||
r1628 | Base class for controllers responsible for loading all needed data for | |||
repository loaded items are | ||||
r1203 | ||||
r1628 | c.rhodecode_repo: instance of scm repository | |||
c.rhodecode_db_repo: instance of db | ||||
c.repository_followers: number of followers | ||||
c.repository_forks: number of forks | ||||
r1045 | """ | |||
def __before__(self): | ||||
super(BaseRepoController, self).__before__() | ||||
if c.repo_name: | ||||
r1530 | c.rhodecode_db_repo = Repository.get_by_repo_name(c.repo_name) | |||
r1373 | c.rhodecode_repo = c.rhodecode_db_repo.scm_instance | |||
if c.rhodecode_repo is None: | ||||
log.error('%s this repository is present in database but it ' | ||||
'cannot be created as an scm instance', c.repo_name) | ||||
r1282 | ||||
r1373 | redirect(url('home')) | |||
r1304 | ||||
r1628 | c.repository_followers = self.scm_model.get_followers(c.repo_name) | |||
r1373 | c.repository_forks = self.scm_model.get_forks(c.repo_name) | |||