##// END OF EJS Templates
code garden, pep8
marcink -
r1978:164199e4 beta
parent child Browse files
Show More
@@ -1,177 +1,180 b''
1 """The base Controller API
1 """The base Controller API
2
2
3 Provides the BaseController class for subclassing.
3 Provides the BaseController class for subclassing.
4 """
4 """
5 import logging
5 import logging
6 import time
6 import time
7 import traceback
7 import traceback
8
8
9 from paste.auth.basic import AuthBasicAuthenticator
9 from paste.auth.basic import AuthBasicAuthenticator
10
10
11 from pylons import config, tmpl_context as c, request, session, url
11 from pylons import config, tmpl_context as c, request, session, url
12 from pylons.controllers import WSGIController
12 from pylons.controllers import WSGIController
13 from pylons.controllers.util import redirect
13 from pylons.controllers.util import redirect
14 from pylons.templating import render_mako as render
14 from pylons.templating import render_mako as render
15
15
16 from rhodecode import __version__, BACKENDS
16 from rhodecode import __version__, BACKENDS
17
17
18 from rhodecode.lib import str2bool
18 from rhodecode.lib import str2bool
19 from rhodecode.lib.auth import AuthUser, get_container_username, authfunc,\
19 from rhodecode.lib.auth import AuthUser, get_container_username, authfunc,\
20 HasPermissionAnyMiddleware
20 HasPermissionAnyMiddleware
21 from rhodecode.lib.utils import get_repo_slug, invalidate_cache
21 from rhodecode.lib.utils import get_repo_slug, invalidate_cache
22 from rhodecode.model import meta
22 from rhodecode.model import meta
23
23
24 from rhodecode.model.db import Repository
24 from rhodecode.model.db import Repository
25 from rhodecode.model.notification import NotificationModel
25 from rhodecode.model.notification import NotificationModel
26 from rhodecode.model.scm import ScmModel
26 from rhodecode.model.scm import ScmModel
27
27
28 log = logging.getLogger(__name__)
28 log = logging.getLogger(__name__)
29
29
30
30
31 class BaseVCSController(object):
31 class BaseVCSController(object):
32
32
33 def __init__(self, application, config):
33 def __init__(self, application, config):
34 self.application = application
34 self.application = application
35 self.config = config
35 self.config = config
36 # base path of repo locations
36 # base path of repo locations
37 self.basepath = self.config['base_path']
37 self.basepath = self.config['base_path']
38 #authenticate this mercurial request using authfunc
38 #authenticate this mercurial request using authfunc
39 self.authenticate = AuthBasicAuthenticator('', authfunc)
39 self.authenticate = AuthBasicAuthenticator('', authfunc)
40 self.ipaddr = '0.0.0.0'
40 self.ipaddr = '0.0.0.0'
41
41
42 def _handle_request(self, environ, start_response):
43 raise NotImplementedError()
44
42 def _get_by_id(self, repo_name):
45 def _get_by_id(self, repo_name):
43 """
46 """
44 Get's a special pattern _<ID> from clone url and tries to replace it
47 Get's a special pattern _<ID> from clone url and tries to replace it
45 with a repository_name for support of _<ID> non changable urls
48 with a repository_name for support of _<ID> non changable urls
46
49
47 :param repo_name:
50 :param repo_name:
48 """
51 """
49 try:
52 try:
50 data = repo_name.split('/')
53 data = repo_name.split('/')
51 if len(data) >= 2:
54 if len(data) >= 2:
52 by_id = data[1].split('_')
55 by_id = data[1].split('_')
53 if len(by_id) == 2 and by_id[1].isdigit():
56 if len(by_id) == 2 and by_id[1].isdigit():
54 _repo_name = Repository.get(by_id[1]).repo_name
57 _repo_name = Repository.get(by_id[1]).repo_name
55 data[1] = _repo_name
58 data[1] = _repo_name
56 except:
59 except:
57 log.debug('Failed to extract repo_name from id %s' % (
60 log.debug('Failed to extract repo_name from id %s' % (
58 traceback.format_exc()
61 traceback.format_exc()
59 )
62 )
60 )
63 )
61
64
62 return '/'.join(data)
65 return '/'.join(data)
63
66
64 def _invalidate_cache(self, repo_name):
67 def _invalidate_cache(self, repo_name):
65 """
68 """
66 Set's cache for this repository for invalidation on next access
69 Set's cache for this repository for invalidation on next access
67
70
68 :param repo_name: full repo name, also a cache key
71 :param repo_name: full repo name, also a cache key
69 """
72 """
70 invalidate_cache('get_repo_cached_%s' % repo_name)
73 invalidate_cache('get_repo_cached_%s' % repo_name)
71
74
72 def _check_permission(self, action, user, repo_name):
75 def _check_permission(self, action, user, repo_name):
73 """
76 """
74 Checks permissions using action (push/pull) user and repository
77 Checks permissions using action (push/pull) user and repository
75 name
78 name
76
79
77 :param action: push or pull action
80 :param action: push or pull action
78 :param user: user instance
81 :param user: user instance
79 :param repo_name: repository name
82 :param repo_name: repository name
80 """
83 """
81 if action == 'push':
84 if action == 'push':
82 if not HasPermissionAnyMiddleware('repository.write',
85 if not HasPermissionAnyMiddleware('repository.write',
83 'repository.admin')(user,
86 'repository.admin')(user,
84 repo_name):
87 repo_name):
85 return False
88 return False
86
89
87 else:
90 else:
88 #any other action need at least read permission
91 #any other action need at least read permission
89 if not HasPermissionAnyMiddleware('repository.read',
92 if not HasPermissionAnyMiddleware('repository.read',
90 'repository.write',
93 'repository.write',
91 'repository.admin')(user,
94 'repository.admin')(user,
92 repo_name):
95 repo_name):
93 return False
96 return False
94
97
95 return True
98 return True
96
99
97 def __call__(self, environ, start_response):
100 def __call__(self, environ, start_response):
98 start = time.time()
101 start = time.time()
99 try:
102 try:
100 return self._handle_request(environ, start_response)
103 return self._handle_request(environ, start_response)
101 finally:
104 finally:
102 log = logging.getLogger('rhodecode.' + self.__class__.__name__)
105 log = logging.getLogger('rhodecode.' + self.__class__.__name__)
103 log.debug('Request time: %.3fs' % (time.time() - start))
106 log.debug('Request time: %.3fs' % (time.time() - start))
104 meta.Session.remove()
107 meta.Session.remove()
105
108
106
109
107 class BaseController(WSGIController):
110 class BaseController(WSGIController):
108
111
109 def __before__(self):
112 def __before__(self):
110 c.rhodecode_version = __version__
113 c.rhodecode_version = __version__
111 c.rhodecode_name = config.get('rhodecode_title')
114 c.rhodecode_name = config.get('rhodecode_title')
112 c.use_gravatar = str2bool(config.get('use_gravatar'))
115 c.use_gravatar = str2bool(config.get('use_gravatar'))
113 c.ga_code = config.get('rhodecode_ga_code')
116 c.ga_code = config.get('rhodecode_ga_code')
114 c.repo_name = get_repo_slug(request)
117 c.repo_name = get_repo_slug(request)
115 c.backends = BACKENDS.keys()
118 c.backends = BACKENDS.keys()
116 c.unread_notifications = NotificationModel()\
119 c.unread_notifications = NotificationModel()\
117 .get_unread_cnt_for_user(c.rhodecode_user.user_id)
120 .get_unread_cnt_for_user(c.rhodecode_user.user_id)
118 self.cut_off_limit = int(config.get('cut_off_limit'))
121 self.cut_off_limit = int(config.get('cut_off_limit'))
119
122
120 self.sa = meta.Session
123 self.sa = meta.Session
121 self.scm_model = ScmModel(self.sa)
124 self.scm_model = ScmModel(self.sa)
122
125
123 def __call__(self, environ, start_response):
126 def __call__(self, environ, start_response):
124 """Invoke the Controller"""
127 """Invoke the Controller"""
125 # WSGIController.__call__ dispatches to the Controller method
128 # WSGIController.__call__ dispatches to the Controller method
126 # the request is routed to. This routing information is
129 # the request is routed to. This routing information is
127 # available in environ['pylons.routes_dict']
130 # available in environ['pylons.routes_dict']
128 start = time.time()
131 start = time.time()
129 try:
132 try:
130 # make sure that we update permissions each time we call controller
133 # make sure that we update permissions each time we call controller
131 api_key = request.GET.get('api_key')
134 api_key = request.GET.get('api_key')
132 cookie_store = session.get('rhodecode_user') or {}
135 cookie_store = session.get('rhodecode_user') or {}
133 user_id = cookie_store.get('user_id', None)
136 user_id = cookie_store.get('user_id', None)
134 username = get_container_username(environ, config)
137 username = get_container_username(environ, config)
135
138
136 auth_user = AuthUser(user_id, api_key, username)
139 auth_user = AuthUser(user_id, api_key, username)
137 request.user = auth_user
140 request.user = auth_user
138 self.rhodecode_user = c.rhodecode_user = auth_user
141 self.rhodecode_user = c.rhodecode_user = auth_user
139 if not self.rhodecode_user.is_authenticated and \
142 if not self.rhodecode_user.is_authenticated and \
140 self.rhodecode_user.user_id is not None:
143 self.rhodecode_user.user_id is not None:
141 self.rhodecode_user\
144 self.rhodecode_user\
142 .set_authenticated(cookie_store.get('is_authenticated'))
145 .set_authenticated(cookie_store.get('is_authenticated'))
143
146
144 session['rhodecode_user'] = self.rhodecode_user.get_cookie_store()
147 session['rhodecode_user'] = self.rhodecode_user.get_cookie_store()
145 session.save()
148 session.save()
146 return WSGIController.__call__(self, environ, start_response)
149 return WSGIController.__call__(self, environ, start_response)
147 finally:
150 finally:
148 log.debug('Request time: %.3fs' % (time.time() - start))
151 log.debug('Request time: %.3fs' % (time.time() - start))
149 meta.Session.remove()
152 meta.Session.remove()
150
153
151
154
152 class BaseRepoController(BaseController):
155 class BaseRepoController(BaseController):
153 """
156 """
154 Base class for controllers responsible for loading all needed data for
157 Base class for controllers responsible for loading all needed data for
155 repository loaded items are
158 repository loaded items are
156
159
157 c.rhodecode_repo: instance of scm repository
160 c.rhodecode_repo: instance of scm repository
158 c.rhodecode_db_repo: instance of db
161 c.rhodecode_db_repo: instance of db
159 c.repository_followers: number of followers
162 c.repository_followers: number of followers
160 c.repository_forks: number of forks
163 c.repository_forks: number of forks
161 """
164 """
162
165
163 def __before__(self):
166 def __before__(self):
164 super(BaseRepoController, self).__before__()
167 super(BaseRepoController, self).__before__()
165 if c.repo_name:
168 if c.repo_name:
166
169
167 c.rhodecode_db_repo = Repository.get_by_repo_name(c.repo_name)
170 c.rhodecode_db_repo = Repository.get_by_repo_name(c.repo_name)
168 c.rhodecode_repo = c.rhodecode_db_repo.scm_instance
171 c.rhodecode_repo = c.rhodecode_db_repo.scm_instance
169
172
170 if c.rhodecode_repo is None:
173 if c.rhodecode_repo is None:
171 log.error('%s this repository is present in database but it '
174 log.error('%s this repository is present in database but it '
172 'cannot be created as an scm instance', c.repo_name)
175 'cannot be created as an scm instance', c.repo_name)
173
176
174 redirect(url('home'))
177 redirect(url('home'))
175
178
176 c.repository_followers = self.scm_model.get_followers(c.repo_name)
179 c.repository_followers = self.scm_model.get_followers(c.repo_name)
177 c.repository_forks = self.scm_model.get_forks(c.repo_name)
180 c.repository_forks = self.scm_model.get_forks(c.repo_name)
General Comments 0
You need to be logged in to leave comments. Login now