"""The base Controller APIProvides the BaseController class for subclassing."""importloggingimporttimefrompylonsimportconfig,tmpl_contextasc,request,session,urlfrompylons.controllersimportWSGIControllerfrompylons.controllers.utilimportredirectfrompylons.templatingimportrender_makoasrenderfromrhodecodeimport__version__fromrhodecode.libimportstr2boolfromrhodecode.lib.authimportAuthUser,get_container_usernamefromrhodecode.lib.utilsimportget_repo_slugfromrhodecode.modelimportmetafromrhodecode.model.scmimportScmModelfromrhodecodeimportBACKENDSfromrhodecode.model.dbimportRepositorylog=logging.getLogger(__name__)classBaseController(WSGIController):def__before__(self):c.rhodecode_version=__version__c.rhodecode_name=config.get('rhodecode_title')c.use_gravatar=str2bool(config.get('use_gravatar'))c.ga_code=config.get('rhodecode_ga_code')c.repo_name=get_repo_slug(request)c.backends=BACKENDS.keys()self.cut_off_limit=int(config.get('cut_off_limit'))self.sa=meta.Session()self.scm_model=ScmModel(self.sa)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']start=time.time()try:# make sure that we update permissions each time we call controllerapi_key=request.GET.get('api_key')user_id=getattr(session.get('rhodecode_user'),'user_id',None)username=get_container_username(environ,config)auth_user=AuthUser(user_id,api_key,username)self.rhodecode_user=c.rhodecode_user=auth_userifnotself.rhodecode_user.is_authenticatedand \
self.rhodecode_user.user_idisnotNone:self.rhodecode_user.set_authenticated(getattr(session.get('rhodecode_user'),'is_authenticated',False))session['rhodecode_user']=self.rhodecode_usersession.save()returnWSGIController.__call__(self,environ,start_response)finally:log.debug('Request time: %.3fs'%(time.time()-start))meta.Session.remove()classBaseRepoController(BaseController):""" Base class for controllers responsible for loading all needed data for repository loaded items are 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 """def__before__(self):super(BaseRepoController,self).__before__()ifc.repo_name:c.rhodecode_db_repo=Repository.get_by_repo_name(c.repo_name)c.rhodecode_repo=c.rhodecode_db_repo.scm_instanceifc.rhodecode_repoisNone: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)