diff --git a/rhodecode/lib/base.py b/rhodecode/lib/base.py --- a/rhodecode/lib/base.py +++ b/rhodecode/lib/base.py @@ -2,42 +2,37 @@ Provides the BaseController class for subclassing. """ -from pylons import config, tmpl_context as c, request, session +import logging + +from pylons import config, tmpl_context as c, request, session, url from pylons.controllers import WSGIController +from pylons.controllers.util import redirect from pylons.templating import render_mako as render + from rhodecode import __version__ -from rhodecode.lib import auth +from rhodecode.lib.auth import AuthUser from rhodecode.lib.utils import get_repo_slug from rhodecode.model import meta from rhodecode.model.scm import ScmModel from rhodecode import BACKENDS +from rhodecode.model.db import Repository + +log = logging.getLogger(__name__) class BaseController(WSGIController): def __before__(self): c.rhodecode_version = __version__ - c.rhodecode_name = config['rhodecode_title'] + c.rhodecode_name = config.get('rhodecode_title') + c.ga_code = config.get('rhodecode_ga_code') c.repo_name = get_repo_slug(request) - c.cached_repo_list = ScmModel().get_repos() c.backends = BACKENDS.keys() - self.cut_off_limit = int(config['cut_off_limit']) - self.sa = meta.Session() - scm_model = ScmModel(self.sa) - #c.unread_journal = scm_model.get_unread_journal() + self.cut_off_limit = int(config.get('cut_off_limit')) - if c.repo_name: - cached_repo = scm_model.get(c.repo_name) - if cached_repo: - c.repository_tags = cached_repo.tags - c.repository_branches = cached_repo.branches - c.repository_followers = scm_model.get_followers(cached_repo.dbrepo.repo_id) - c.repository_forks = scm_model.get_forks(cached_repo.dbrepo.repo_id) - else: - c.repository_tags = {} - c.repository_branches = {} - c.repository_followers = 0 - c.repository_forks = 0 + self.sa = meta.Session() + self.scm_model = ScmModel(self.sa) + #c.unread_journal = scm_model.get_unread_journal() def __call__(self, environ, start_response): """Invoke the Controller""" @@ -45,8 +40,43 @@ class BaseController(WSGIController): # the request is routed to. This routing information is # available in environ['pylons.routes_dict'] try: - #putting this here makes sure that we update permissions every time - self.rhodecode_user = c.rhodecode_user = auth.get_user(session) + # putting this here makes sure that we update permissions each time + api_key = request.GET.get('api_key') + user_id = getattr(session.get('rhodecode_user'), 'user_id', None) + self.rhodecode_user = c.rhodecode_user = AuthUser(user_id, api_key) + self.rhodecode_user.set_authenticated( + getattr(session.get('rhodecode_user'), + 'is_authenticated', False)) + session['rhodecode_user'] = self.rhodecode_user + session.save() return WSGIController.__call__(self, environ, start_response) finally: meta.Session.remove() + + +class BaseRepoController(BaseController): + """ + Base class for controllers responsible for loading all needed data + for those controllers, loaded items are + + c.rhodecode_repo: instance of scm repository (taken from cache) + + """ + + def __before__(self): + super(BaseRepoController, self).__before__() + if c.repo_name: + + c.rhodecode_db_repo = Repository.by_repo_name(c.repo_name) + 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) + + redirect(url('home')) + + c.repository_followers = \ + self.scm_model.get_followers(c.repo_name) + c.repository_forks = self.scm_model.get_forks(c.repo_name) +