Show More
@@ -381,15 +381,6 b' def includeme(config, auth_resources=Non' | |||||
381 | config.add_subscriber(write_js_routes_if_enabled, |
|
381 | config.add_subscriber(write_js_routes_if_enabled, | |
382 | pyramid.events.ApplicationCreated) |
|
382 | pyramid.events.ApplicationCreated) | |
383 |
|
383 | |||
384 | # request custom methods |
|
|||
385 | config.add_request_method( |
|
|||
386 | 'rhodecode.lib.partial_renderer.get_partial_renderer', |
|
|||
387 | 'get_partial_renderer') |
|
|||
388 |
|
||||
389 | config.add_request_method( |
|
|||
390 | 'rhodecode.lib.request_counter.get_request_counter', |
|
|||
391 | 'request_count') |
|
|||
392 |
|
||||
393 | # Set the authorization policy. |
|
384 | # Set the authorization policy. | |
394 | authz_policy = ACLAuthorizationPolicy() |
|
385 | authz_policy = ACLAuthorizationPolicy() | |
395 | config.set_authorization_policy(authz_policy) |
|
386 | config.set_authorization_policy(authz_policy) |
@@ -35,7 +35,6 b' from paste.httpexceptions import HTTPUna' | |||||
35 | from paste.httpheaders import WWW_AUTHENTICATE, AUTHORIZATION |
|
35 | from paste.httpheaders import WWW_AUTHENTICATE, AUTHORIZATION | |
36 |
|
36 | |||
37 | import rhodecode |
|
37 | import rhodecode | |
38 | from rhodecode.apps._base import TemplateArgs |
|
|||
39 | from rhodecode.authentication.base import VCS_TYPE |
|
38 | from rhodecode.authentication.base import VCS_TYPE | |
40 | from rhodecode.lib import auth, utils2 |
|
39 | from rhodecode.lib import auth, utils2 | |
41 | from rhodecode.lib import helpers as h |
|
40 | from rhodecode.lib import helpers as h | |
@@ -460,12 +459,7 b' def attach_context_attributes(context, r' | |||||
460 | context.rhodecode_user = request.rpc_user |
|
459 | context.rhodecode_user = request.rpc_user | |
461 |
|
460 | |||
462 | # attach the whole call context to the request |
|
461 | # attach the whole call context to the request | |
463 | # use set_call_context method if request has it |
|
462 | request.set_call_context(context) | |
464 | # sometimes in Celery context requests is "different" |
|
|||
465 | if hasattr(request, 'set_call_context'): |
|
|||
466 | request.set_call_context(context) |
|
|||
467 | else: |
|
|||
468 | request.call_context = context |
|
|||
469 |
|
463 | |||
470 |
|
464 | |||
471 | def get_auth_user(request): |
|
465 | def get_auth_user(request): | |
@@ -577,9 +571,9 b' def add_events_routes(config):' | |||||
577 | pattern='/_hovercard/commit/{repo_name}/{commit_id}') |
|
571 | pattern='/_hovercard/commit/{repo_name}/{commit_id}') | |
578 |
|
572 | |||
579 |
|
573 | |||
580 | def bootstrap_config(request): |
|
574 | def bootstrap_config(request, registry_name='RcTestRegistry'): | |
581 | import pyramid.testing |
|
575 | import pyramid.testing | |
582 |
registry = pyramid.testing.Registry( |
|
576 | registry = pyramid.testing.Registry(registry_name) | |
583 |
|
577 | |||
584 | config = pyramid.testing.setUp(registry=registry, request=request) |
|
578 | config = pyramid.testing.setUp(registry=registry, request=request) | |
585 |
|
579 | |||
@@ -594,42 +588,24 b' def bootstrap_config(request):' | |||||
594 |
|
588 | |||
595 |
|
589 | |||
596 | def bootstrap_request(**kwargs): |
|
590 | def bootstrap_request(**kwargs): | |
597 | import pyramid.testing |
|
591 | """ | |
|
592 | Returns a thin version of Request Object that is used in non-web context like testing/celery | |||
|
593 | """ | |||
598 |
|
594 | |||
599 | class TestRequest(pyramid.testing.DummyRequest): |
|
595 | import pyramid.testing | |
|
596 | from rhodecode.lib.request import ThinRequest as _ThinRequest | |||
|
597 | ||||
|
598 | class ThinRequest(_ThinRequest): | |||
600 | application_url = kwargs.pop('application_url', 'http://example.com') |
|
599 | application_url = kwargs.pop('application_url', 'http://example.com') | |
601 | host = kwargs.pop('host', 'example.com:80') |
|
600 | host = kwargs.pop('host', 'example.com:80') | |
602 | domain = kwargs.pop('domain', 'example.com') |
|
601 | domain = kwargs.pop('domain', 'example.com') | |
603 |
|
602 | |||
604 | def translate(self, msg): |
|
603 | class ThinSession(pyramid.testing.DummySession): | |
605 | return msg |
|
|||
606 |
|
||||
607 | def plularize(self, singular, plural, n): |
|
|||
608 | return singular |
|
|||
609 |
|
||||
610 | def get_partial_renderer(self, tmpl_name): |
|
|||
611 |
|
||||
612 | from rhodecode.lib.partial_renderer import get_partial_renderer |
|
|||
613 | return get_partial_renderer(request=self, tmpl_name=tmpl_name) |
|
|||
614 |
|
||||
615 | _call_context = TemplateArgs() |
|
|||
616 | _call_context.visual = TemplateArgs() |
|
|||
617 | _call_context.visual.show_sha_length = 12 |
|
|||
618 | _call_context.visual.show_revision_number = True |
|
|||
619 |
|
||||
620 | @property |
|
|||
621 | def call_context(self): |
|
|||
622 | return self._call_context |
|
|||
623 |
|
||||
624 | def set_call_context(self, new_context): |
|
|||
625 | self._call_context = new_context |
|
|||
626 |
|
||||
627 | class TestDummySession(pyramid.testing.DummySession): |
|
|||
628 | def save(*arg, **kw): |
|
604 | def save(*arg, **kw): | |
629 | pass |
|
605 | pass | |
630 |
|
606 | |||
631 |
request = T |
|
607 | request = ThinRequest(**kwargs) | |
632 |
request.session = T |
|
608 | request.session = ThinSession() | |
633 |
|
609 | |||
634 | return request |
|
610 | return request | |
635 |
|
611 |
@@ -45,7 +45,7 b' import rhodecode' | |||||
45 | from rhodecode.lib.auth import AuthUser |
|
45 | from rhodecode.lib.auth import AuthUser | |
46 | from rhodecode.lib.celerylib.utils import parse_ini_vars, ping_db |
|
46 | from rhodecode.lib.celerylib.utils import parse_ini_vars, ping_db | |
47 | from rhodecode.lib.ext_json import json |
|
47 | from rhodecode.lib.ext_json import json | |
48 |
from rhodecode.lib.pyramid_utils import bootstrap, setup_logging |
|
48 | from rhodecode.lib.pyramid_utils import bootstrap, setup_logging | |
49 | from rhodecode.lib.utils2 import str2bool |
|
49 | from rhodecode.lib.utils2 import str2bool | |
50 | from rhodecode.model import meta |
|
50 | from rhodecode.model import meta | |
51 |
|
51 | |||
@@ -271,10 +271,20 b' class RequestContextTask(Task):' | |||||
271 | link=None, link_error=None, shadow=None, **options): |
|
271 | link=None, link_error=None, shadow=None, **options): | |
272 | """ queue the job to run (we are in web request context here) """ |
|
272 | """ queue the job to run (we are in web request context here) """ | |
273 |
|
273 | |||
274 | req = get_current_request() |
|
274 | req = self.app.conf['PYRAMID_REQUEST'] or get_current_request() | |
|
275 | ||||
275 | log.debug('Running Task with class: %s. Request Class: %s', |
|
276 | log.debug('Running Task with class: %s. Request Class: %s', | |
276 | self.__class__, req.__class__) |
|
277 | self.__class__, req.__class__) | |
277 |
|
278 | |||
|
279 | proxy_data = getattr(self.request, 'rhodecode_proxy_data', None) | |||
|
280 | log.debug('celery proxy data:%r', proxy_data) | |||
|
281 | ||||
|
282 | user_id = None | |||
|
283 | ip_addr = None | |||
|
284 | if proxy_data: | |||
|
285 | user_id = proxy_data['auth_user']['user_id'] | |||
|
286 | ip_addr = proxy_data['auth_user']['ip_addr'] | |||
|
287 | ||||
278 | # web case |
|
288 | # web case | |
279 | if hasattr(req, 'user'): |
|
289 | if hasattr(req, 'user'): | |
280 | ip_addr = req.user.ip_addr |
|
290 | ip_addr = req.user.ip_addr | |
@@ -285,14 +295,18 b' class RequestContextTask(Task):' | |||||
285 | ip_addr = req.rpc_user.ip_addr |
|
295 | ip_addr = req.rpc_user.ip_addr | |
286 | user_id = req.rpc_user.user_id |
|
296 | user_id = req.rpc_user.user_id | |
287 | else: |
|
297 | else: | |
288 | raise Exception( |
|
298 | if user_id and ip_addr: | |
289 | 'Unable to fetch required data from request: {}. \n' |
|
299 | log.debug('Using data from celery proxy user') | |
290 | 'This task is required to be executed from context of ' |
|
300 | ||
291 | 'request in a webapp. Task: {}'.format( |
|
301 | else: | |
292 |
|
|
302 | raise Exception( | |
293 | self |
|
303 | 'Unable to fetch required data from request: {}. \n' | |
|
304 | 'This task is required to be executed from context of ' | |||
|
305 | 'request in a webapp. Task: {}'.format( | |||
|
306 | repr(req), | |||
|
307 | self.__class__ | |||
|
308 | ) | |||
294 | ) |
|
309 | ) | |
295 | ) |
|
|||
296 |
|
310 | |||
297 | if req: |
|
311 | if req: | |
298 | # we hook into kwargs since it is the only way to pass our data to |
|
312 | # we hook into kwargs since it is the only way to pass our data to | |
@@ -311,19 +325,3 b' class RequestContextTask(Task):' | |||||
311 |
|
325 | |||
312 | return super(RequestContextTask, self).apply_async( |
|
326 | return super(RequestContextTask, self).apply_async( | |
313 | args, kwargs, task_id, producer, link, link_error, shadow, **options) |
|
327 | args, kwargs, task_id, producer, link, link_error, shadow, **options) | |
314 |
|
||||
315 | def __call__(self, *args, **kwargs): |
|
|||
316 | """ rebuild the context and then run task on celery worker """ |
|
|||
317 |
|
||||
318 | proxy_data = getattr(self.request, 'rhodecode_proxy_data', None) |
|
|||
319 | if not proxy_data: |
|
|||
320 | return super(RequestContextTask, self).__call__(*args, **kwargs) |
|
|||
321 |
|
||||
322 | log.debug('using celery proxy data to run task: %r', proxy_data) |
|
|||
323 | # re-inject and register threadlocals for proper routing support |
|
|||
324 | request = prepare_request(proxy_data['environ']) |
|
|||
325 | request.user = AuthUser(user_id=proxy_data['auth_user']['user_id'], |
|
|||
326 | ip_addr=proxy_data['auth_user']['ip_addr']) |
|
|||
327 |
|
||||
328 | return super(RequestContextTask, self).__call__(*args, **kwargs) |
|
|||
329 |
|
@@ -37,24 +37,7 b' def get_app_config(ini_path):' | |||||
37 | return appconfig('config:{}'.format(ini_path), relative_to=os.getcwd()) |
|
37 | return appconfig('config:{}'.format(ini_path), relative_to=os.getcwd()) | |
38 |
|
38 | |||
39 |
|
39 | |||
40 | class BootstrappedRequest(Request): |
|
40 | def bootstrap(config_uri, options=None, env=None): | |
41 | """ |
|
|||
42 | Special version of Request Which has some available methods like in pyramid. |
|
|||
43 | Some code (used for template rendering) requires this, and we unsure it's present. |
|
|||
44 | """ |
|
|||
45 |
|
||||
46 | def translate(self, msg): |
|
|||
47 | return msg |
|
|||
48 |
|
||||
49 | def plularize(self, singular, plural, n): |
|
|||
50 | return singular |
|
|||
51 |
|
||||
52 | def get_partial_renderer(self, tmpl_name): |
|
|||
53 | from rhodecode.lib.partial_renderer import get_partial_renderer |
|
|||
54 | return get_partial_renderer(request=self, tmpl_name=tmpl_name) |
|
|||
55 |
|
||||
56 |
|
||||
57 | def bootstrap(config_uri, request=None, options=None, env=None): |
|
|||
58 | if env: |
|
41 | if env: | |
59 | os.environ.update(env) |
|
42 | os.environ.update(env) | |
60 |
|
43 | |||
@@ -65,12 +48,7 b' def bootstrap(config_uri, request=None, ' | |||||
65 | except (configparser.NoSectionError, configparser.NoOptionError): |
|
48 | except (configparser.NoSectionError, configparser.NoOptionError): | |
66 | pass |
|
49 | pass | |
67 |
|
50 | |||
68 |
request = |
|
51 | request = Request.blank('/', base_url=base_url) | |
69 |
|
52 | |||
70 | return pyramid_bootstrap(config_uri, request=request, options=options) |
|
53 | return pyramid_bootstrap(config_uri, request=request, options=options) | |
71 |
|
54 | |||
72 |
|
||||
73 | def prepare_request(environ): |
|
|||
74 | request = Request.blank('/', environ=environ) |
|
|||
75 | prepare(request) # set pyramid threadlocal request |
|
|||
76 | return request |
|
@@ -19,13 +19,24 b'' | |||||
19 | # and proprietary license terms, please see https://rhodecode.com/licenses/ |
|
19 | # and proprietary license terms, please see https://rhodecode.com/licenses/ | |
20 |
|
20 | |||
21 | from uuid import uuid4 |
|
21 | from uuid import uuid4 | |
|
22 | import pyramid.testing | |||
22 | from pyramid.decorator import reify |
|
23 | from pyramid.decorator import reify | |
23 | from pyramid.request import Request as _Request |
|
24 | from pyramid.request import Request as _Request | |
24 | from rhodecode.translation import _ as tsf |
|
25 | from rhodecode.translation import _ as tsf | |
|
26 | from rhodecode.lib.utils2 import StrictAttributeDict | |||
|
27 | ||||
|
28 | ||||
|
29 | class TemplateArgs(StrictAttributeDict): | |||
|
30 | pass | |||
25 |
|
31 | |||
26 |
|
32 | |||
27 | class Request(_Request): |
|
33 | # Base Class with DummyMethods, testing / CLI scripts | |
|
34 | class RequestBase(object): | |||
28 | _req_id_bucket = list() |
|
35 | _req_id_bucket = list() | |
|
36 | _call_context = TemplateArgs() | |||
|
37 | _call_context.visual = TemplateArgs() | |||
|
38 | _call_context.visual.show_sha_length = 12 | |||
|
39 | _call_context.visual.show_revision_number = True | |||
29 |
|
40 | |||
30 | @reify |
|
41 | @reify | |
31 | def req_id(self): |
|
42 | def req_id(self): | |
@@ -38,6 +49,47 b' class Request(_Request):' | |||||
38 | def req_id_records_init(self): |
|
49 | def req_id_records_init(self): | |
39 | self._req_id_bucket = list() |
|
50 | self._req_id_bucket = list() | |
40 |
|
51 | |||
|
52 | def translate(self, *args, **kwargs): | |||
|
53 | raise NotImplementedError() | |||
|
54 | ||||
|
55 | def plularize(self, *args, **kwargs): | |||
|
56 | raise NotImplementedError() | |||
|
57 | ||||
|
58 | def get_partial_renderer(self, tmpl_name): | |||
|
59 | raise NotImplementedError() | |||
|
60 | ||||
|
61 | @property | |||
|
62 | def call_context(self): | |||
|
63 | return self._call_context | |||
|
64 | ||||
|
65 | def set_call_context(self, new_context): | |||
|
66 | self._call_context = new_context | |||
|
67 | ||||
|
68 | ||||
|
69 | # for thin non-web/cli etc | |||
|
70 | class ThinRequest(RequestBase, pyramid.testing.DummyRequest): | |||
|
71 | ||||
|
72 | def translate(self, msg): | |||
|
73 | return msg | |||
|
74 | ||||
|
75 | def plularize(self, singular, plural, n): | |||
|
76 | return singular | |||
|
77 | ||||
|
78 | def get_partial_renderer(self, tmpl_name): | |||
|
79 | from rhodecode.lib.partial_renderer import get_partial_renderer | |||
|
80 | return get_partial_renderer(request=self, tmpl_name=tmpl_name) | |||
|
81 | ||||
|
82 | ||||
|
83 | # for real-web-based | |||
|
84 | class RealRequest(RequestBase, _Request): | |||
|
85 | def get_partial_renderer(self, tmpl_name): | |||
|
86 | from rhodecode.lib.partial_renderer import get_partial_renderer | |||
|
87 | return get_partial_renderer(request=self, tmpl_name=tmpl_name) | |||
|
88 | ||||
|
89 | def request_count(self): | |||
|
90 | from rhodecode.lib.request_counter import get_request_counter | |||
|
91 | return get_request_counter() | |||
|
92 | ||||
41 | def plularize(self, *args, **kwargs): |
|
93 | def plularize(self, *args, **kwargs): | |
42 | return self.localizer.pluralize(*args, **kwargs) |
|
94 | return self.localizer.pluralize(*args, **kwargs) | |
43 |
|
95 | |||
@@ -48,3 +100,10 b' class Request(_Request):' | |||||
48 | return localizer.translate(tsf(*_args, **_kwargs)) |
|
100 | return localizer.translate(tsf(*_args, **_kwargs)) | |
49 |
|
101 | |||
50 | return auto_translate(*args, **kwargs) |
|
102 | return auto_translate(*args, **kwargs) | |
|
103 | ||||
|
104 | ||||
|
105 | class Request(RealRequest): | |||
|
106 | """ | |||
|
107 | This is the main request object used in web-context | |||
|
108 | """ | |||
|
109 | pass |
General Comments 0
You need to be logged in to leave comments.
Login now