Changeset 12
- Timestamp:
- 11/18/08 12:57:04 (7 weeks ago)
- Location:
- gnrpy/gnr/web
- Files:
-
- 5 added
- 5 modified
-
apache/gnrwebpage_apache.py (modified) (1 diff)
-
apache/gnrwebreqresp_apache.py (added)
-
_gnrbasewebpage.py (modified) (21 diffs)
-
_gnrbasewebreqresp.py (added)
-
gnrwebapphandler.py (modified) (1 diff)
-
gnrwebpage.py (modified) (1 diff)
-
gnrwebreqresp.py (added)
-
gnrwebsite.py (added)
-
wsgi/gnrwebpage_wsgi.py (modified) (2 diffs)
-
wsgi/gnrwebreqresp_wsgi.py (added)
Legend:
- Unmodified
- Added
- Removed
-
gnrpy/gnr/web/apache/gnrwebpage_apache.py
r8 r12 28 28 Copyright (c) 2007 Softwell. All rights reserved. 29 29 """ 30 import os 31 import urllib 30 32 31 33 from mod_python import apache, Session, Cookie 32 34 33 35 from gnr.web._gnrbasewebpage import GnrBaseWebPage 36 from gnr.web.apache.gnrwebreqresp_apache import GnrWebRequest,GnrWebResponse 34 37 35 cookie_types = {'marshal': Cookie.MarshalCookie}36 38 37 39 class GnrWebPage(GnrBaseWebPage): 38 40 39 40 41 def newMarshalCookie(self, name, value, secret=None, **kw): 42 return Cookie.MarshalCookie(name,value,secret=secret,**kw) 41 def __init__(self, request, customclass, filepath, response=None, **kwargs): 42 self._request = request 43 if not response: response = request 44 self._response = response 45 self.request = GnrWebRequest(request) 46 self.response = GnrWebResponse(response) 47 self._initialize(customclass, filepath, **kwargs) 43 48 44 49 def raiseUnauthorized(self): 45 50 raise apache.SERVER_RETURN, apache.HTTP_UNAUTHORIZED 46 51 47 def get_cookie(self, cookieName, cookieType, secret = None): 48 cookieType = cookie_types[cookieType] 49 cookie=Cookie.get_cookie(self.request, cookieName, cookieType, secret = secret) 50 if type(cookie) is not cookieType: cookie=None 51 return cookie 52 53 def add_cookie(self,cookie): 54 Cookie.add_cookie(self.request,cookie) 55 56 def get_session(self, **kwargs): 57 return Session.Session(self.request,**kwargs) 52 def add_response_header(self,header,value): 53 self.response.headers[header] = value 54 55 def externalUrl(self, path, **kwargs): 56 params = urllib.urlencode(kwargs) 57 path = os.path.join(self.homeUrl(), path) 58 if params: 59 path = '%s?%s' % (path, params) 60 return self.request.construct_url(path) 58 61 -
gnrpy/gnr/web/_gnrbasewebpage.py
r8 r12 29 29 """ 30 30 import md5 31 import os, sys 32 import re 31 import os 32 #import sys 33 #import re 33 34 import time 34 35 import datetime … … 40 41 import zipfile 41 42 import StringIO 42 from decimal import Decimal43 #from decimal import Decimal 43 44 44 45 from gnr.core.gnrlog import gnrlogging … … 49 50 50 51 #from mod_python import apache, Session, Cookie 51 from mako.template import Template52 #from mako.template import Template 52 53 53 54 import simplejson as json … … 55 56 from mako.lookup import TemplateLookup 56 57 57 from gnr.core.gnrbag import Bag, DirectoryResolver, TraceBackResolver , TxtDocResolver, UrlResolver, XmlDocResolver, BagFormula58 from gnr.core.gnrbag import Bag, DirectoryResolver, TraceBackResolver 58 59 59 60 from gnr.core.gnrlang import GnrObject 60 from gnr.core import gnrlist 61 62 from gnr.core.gnrlang import getUuid 63 from gnr.core.gnrstring import templateReplace, splitAndStrip, countOf, toText, toJson, concat 61 62 from gnr.core.gnrlang import getUuid, NotImplementedException, deprecated 63 from gnr.core.gnrstring import templateReplace, splitAndStrip, toText, toJson 64 64 from gnr.core import gnrdate 65 65 … … 67 67 68 68 from gnr.web.gnrwebstruct import GnrDomSrc_dojo_12, GnrDomSrc_dojo_11, GnrGridStruct 69 from gnr.web.gnrwebapp import GnrWebApp 70 71 from gnr.sql.gnrsqldata import SqlRelatedSelectionResolver, SqlRelatedRecordResolver 72 73 from gnr.web.gnrwebapphandler import GnrProcessHandler,GnrWebAppHandler,BatchExecutor 69 70 from gnr.web.gnrwebreqresp import GnrWebRequest, GnrWebResponse 71 from gnr.web.gnrwebapphandler import GnrProcessHandler,GnrWebAppHandler 74 72 75 73 CONNECTION_TIMEOUT = 3600 … … 79 77 AUTH_FORBIDDEN=-1 80 78 79 import threading 80 pagelocals = threading.local() 81 81 82 class GrowlStub(object): 82 83 def notify(self, *args, **kwargs): … … 89 90 pass 90 91 91 92 92 93 class GnrBaseWebPage(GnrObject): 93 94 def newMarshalCookie(self):94 95 def _init_request_response(self,request,response): 95 96 raise NotImplementedException() 97 98 #def newMarshalCookie(self): 99 # raise NotImplementedException() 100 101 def newMarshalCookie(self, name, value, secret=None, **kw): 102 return self.request.newMarshalCookie(name,value,secret=secret,**kw) 96 103 97 104 def raiseUnauthorized(self): 98 105 raise NotImplementedException() 99 106 100 def get_cookie(self, request, cookieName, cookieType, secret = None): 107 #def get_cookie(self, request, cookieName, cookieType, secret = None): 108 # raise NotImplementedException() 109 # 110 #def add_cookie(self,cookie): 111 # raise NotImplementedException() 112 # 113 #def get_session(self, **kwargs): 114 # raise NotImplementedException() 115 116 def add_response_header(self,header,value): 101 117 raise NotImplementedException() 102 118 119 def get_request_header(self,header): 120 raise NotImplementedException() 121 122 def get_cookie(self, cookieName, cookieType, secret = None): 123 return self.request.get_cookie(cookieName, cookieType, secret = secret) 124 103 125 def add_cookie(self,cookie): 126 self.request.add_cookie(cookie) 127 128 def get_session(self, **kwargs): 129 return self.request.get_session(**kwargs) 130 131 def __init__(self, request, customclass, filepath, response=None, **kwargs): 104 132 raise NotImplementedException() 105 133 106 def get_session(self, **kwargs): 107 raise NotImplementedException() 108 109 def __init__(self, req, customclass, filepath, page_id=None, 110 _rpc_resultPath=None, _dk_=None, xxcnt=None, _user_login=None, **kwargs): 134 def _initialize(self, customclass, filepath, page_id=None, 135 _rpc_resultPath=None,xxcnt=None, _user_login=None, **kwargs): 111 136 self._rpc_resultPath=_rpc_resultPath 112 self.request = req 113 req.headers_out["Pragma"] = "no-cache" 114 137 self.response.add_header('Pragma','no-cache') 115 138 self.page_id = page_id or getUuid() 116 self._dk=_dk_117 139 self.filepath = filepath # TOGLIERE ???? 118 140 self._user_login = _user_login … … 120 142 self._htmlHeaders=[] 121 143 self._ctxData = Bag() 122 self.folders= {'pages':req.hlist.directory, 123 'site':os.path.dirname(req.hlist.directory), 124 'current':os.path.dirname(req.filename), 125 'document_root': self.request.document_root().rstrip('/') # the path may end with / or not depending to httpd.config 144 self.filename = self.request.filename 145 self.folders= {'pages':self.request.hlist.directory, 146 'site':os.path.dirname(self.request.hlist.directory), 147 'current':os.path.dirname(self.filename), 148 'document_root': self.request.document_root.rstrip('/') # the path may end with / or not depending to httpd.config 126 149 } 127 self.filename = req.filename128 150 self.pagename = os.path.splitext(os.path.basename(self.filename))[0] 129 151 self.pagepath = self.filename.replace(self.folders['pages'], '') 130 131 152 self.theme = getattr(customclass, 'theme', None) or self.config['dojo?theme'] or 'tundra' 132 153 self.dojoversion = getattr(customclass, 'dojoversion', None) or self.config['dojo?version'] or '11' … … 297 318 raise str("No template %s found in %s" % (tpl, str(tpldirectories))) 298 319 299 300 320 arg_dict = {} 301 321 self.htmlHeaders() 302 322 arg_dict['customHeaders']=self._htmlHeaders 303 arg_dict['charset'] = 'utf-8'323 arg_dict['charset'] = charset 304 324 arg_dict['filename'] = self.pagename 305 325 arg_dict['startArgs'] = toJson(startArgs) … … 423 443 424 444 def requestWrite(self, txt, encoding='utf-8'): 425 self.request.write(txt.encode(encoding)) 445 self.responseWrite(txt,encoding=encoding) 446 447 def responseWrite(self, txt, encoding='utf-8'): 448 self.response.write(txt.encode(encoding)) 426 449 427 450 def gnotify(self, title, description, always=False): … … 524 547 if self.session.pagedata['page_id']!=self.page_id : 525 548 self.raiseUnauthorized() 526 if self._dk:527 cl= ['%s_%s'%(k,v) for k,v in kwargs.items()]528 cl.append('method_%s'%method)529 cl.sort()530 if md5.md5('%s%s%s'%(self.page_id,'_'.join(cl),self.page_id)).hexdigest()!=self._dk:531 self.raiseUnauthorized()532 549 parameters = dict(kwargs) 533 550 for k,v in kwargs.items(): … … 653 670 def _get_locale(self): # TODO IMPLEMENT DEFAULT FROM APP OR AVATAR 654 671 if not hasattr(self, '_locale'): 655 self._locale = self.connection.locale or self.request.headers _in.get('Accept-Language', 'en').split(',')[0] or 'en'672 self._locale = self.connection.locale or self.request.headers.get('Accept-Language', 'en').split(',')[0] or 'en' 656 673 return self._locale 657 674 locale = property(_get_locale, _set_locale) … … 734 751 735 752 def externalUrl(self, path, **kwargs): 736 params = urllib.urlencode(kwargs) 737 path = os.path.join(self.homeUrl(), path) 738 if params: 739 path = '%s?%s' % (path, params) 740 return self.request.construct_url(path) 753 raise NotImplementedException() 741 754 742 755 def externalUrl_OLD(self,path, **kwargs): 743 756 params = urllib.urlencode(kwargs) 744 referer = self.request.headers _in.get('Referer')757 referer = self.request.headers.get('Referer') 745 758 if not referer: return '' 746 759 referer = referer.split('?')[0] … … 850 863 workdate = property(_get_workdate) 851 864 852 853 865 def _get_logfile(self): 854 866 if not hasattr(self, '_logfile'): … … 859 871 return self._logfile 860 872 logfile = property(_get_logfile) 861 873 862 874 def _get_siteHandler(self): 863 875 if not hasattr(self, '_siteHandler'): 864 global GNR_PROCESS_HANDLER876 #global GNR_PROCESS_HANDLER 865 877 try: 866 GNR_PROCESS_HANDLER # fare come thread.local867 except NameError :878 pagelocals.GNR_PROCESS_HANDLER # fare come thread.local 879 except AttributeError : 868 880 self.newprocess = True 869 GNR_PROCESS_HANDLER = GnrProcessHandler()870 self._siteHandler = GNR_PROCESS_HANDLER.getSiteHandler(self)881 pagelocals.GNR_PROCESS_HANDLER = GnrProcessHandler() 882 self._siteHandler = pagelocals.GNR_PROCESS_HANDLER.getSiteHandler(self) 871 883 return self._siteHandler 872 884 siteHandler = property(_get_siteHandler) 885 873 886 874 887 def _findInheritedResource(self, moduleName,ext='py',uri=False): … … 1124 1137 kwargs[k] = v 1125 1138 kwargs.update(auxkwargs) 1126 self.re quest.content_type = "text/xml"1139 self.response.content_type = "text/xml" 1127 1140 resolverclass=str(resolverclass) 1128 1141 if resolverclass in globals(): … … 1151 1164 output_encoding='utf-8', encoding_errors='replace') 1152 1165 template = lookup.get_template(os.path.basename(path)) 1153 self.re quest.content_type = 'text/html'1166 self.response.content_type = 'text/html' 1154 1167 css_dojo = getattr(self, '_css_dojo_d%s' % self.dojoversion)() 1155 1168 gnrlibpath='gnr_d%s' % self.dojoversion … … 1342 1355 envelope.setItem('dataChanges', dataChanges) 1343 1356 1344 page.re quest.content_type = "text/xml"1357 page.response.content_type = "text/xml" 1345 1358 xmlresult= envelope.toXml(unresolved=True, jsonmode=True, jsonkey=page.page_id, 1346 1359 translate_cb=page.translateText, omitUnknownTypes=True, catalog=page.catalog) … … 1365 1378 1366 1379 def _call_html(self, page, method, kwargs, result, error): 1367 page.re quest.content_type = "text/html"1380 page.response.content_type = "text/html" 1368 1381 return result or error 1369 1382 … … 1416 1429 # self.page.gnotify('write cookie', self.page.siteUri, always=False) 1417 1430 self.cookie.value['timestamp'] = time.time() 1418 self.data['ip'] = self.page.request. get_remote_host()1431 self.data['ip'] = self.page.request.remote_addr 1419 1432 self.data['pages'] = Bag(self.page.session.getActivePages(self.connection_id)) 1420 1433 self.write() … … 1578 1591 def loadSessionData(self, locking=True): 1579 1592 if locking and (not(self.locked)): 1593 self.session.load() 1580 1594 self.session.lock() 1581 self.session.load()1582 1595 self.locked = True 1583 1596 self.pagedata = self.getSessionData(self.page_id) -
gnrpy/gnr/web/gnrwebapphandler.py
r8 r12 70 70 71 71 from gnr.sql.gnrsqldata import SqlRelatedSelectionResolver, SqlRelatedRecordResolver 72 73 72 74 73 -
gnrpy/gnr/web/gnrwebpage.py
r8 r12 1 try:2 from mod_python import apache3 fromapache.gnrwebpage_apache import *4 except ImportError:5 fromwsgi.gnrwebpage_wsgi import *1 #try: 2 from mod_python import apache 3 from gnr.web.apache.gnrwebpage_apache import * 4 #except ImportError: 5 # from gnr.web.wsgi.gnrwebpage_wsgi import * 6 6 7 7 from gnr.core.gnrbag import Bag, DirectoryResolver, TraceBackResolver, TxtDocResolver, UrlResolver, XmlDocResolver, BagFormula -
gnrpy/gnr/web/wsgi/gnrwebpage_wsgi.py
r8 r12 28 28 Copyright (c) 2007 Softwell. All rights reserved. 29 29 """ 30 import md531 import os, sys32 import re33 import time34 import datetime35 import traceback36 import weakref37 import random38 import itertools39 import urllib40 import zipfile41 import StringIO42 from decimal import Decimal43 44 from gnr.core.gnrlog import gnrlogging45 from gnr.core.gnrlang import optArgs46 from gnr.core.gnrlang import gnrImport47 48 gnrlogger = gnrlogging.getLogger('gnr.web.gnrwebcore')49 50 #from mod_python import apache, Session, Cookie51 from mako.template import Template52 import cookie_wsgi as Cookie53 import simplejson as json54 55 from mako.lookup import TemplateLookup56 57 from gnr.core.gnrbag import Bag, DirectoryResolver, TraceBackResolver, TxtDocResolver, UrlResolver, XmlDocResolver, BagFormula58 59 from gnr.core.gnrlang import GnrObject60 from gnr.core import gnrlist61 62 from gnr.core.gnrlang import getUuid63 from gnr.core.gnrstring import templateReplace, splitAndStrip, countOf, toText, toJson, concat64 from gnr.core import gnrdate65 66 from gnr.web.jsmin import jsmin67 68 from gnr.web.gnrwebstruct import GnrDomSrc_dojo_12, GnrDomSrc_dojo_11, GnrGridStruct69 from gnr.web.gnrwebapp import GnrWebApp70 71 from gnr.sql.gnrsqldata import SqlRelatedSelectionResolver, SqlRelatedRecordResolver72 73 import threading74 pagelocals = threading.local()75 76 77 CONNECTION_TIMEOUT = 360078 CONNECTION_REFRESH = 2079 AUTH_OK=080 AUTH_NOT_LOGGED=181 AUTH_FORBIDDEN=-182 30 83 31 from webob import Request … … 85 33 from webob import exc 86 34 from webob.exc import HTTPFound, HTTPNotFound, HTTPUnauthorized 35 import gnr.web.wsgi.cookie_wsgi as Cookie 36 from gnr.web._gnrbasewebpage import GnrBaseWebPage 37 from gnr.web.apache.gnrwebreqresp_wsgi import GnrWebRequest,GnrWebResponse 38 cookie_types = {'marshal': Cookie.MarshalCookie} 39 40 class GnrWebPage(GnrBaseWebPage): 41 42 def __init__(self, request, customclass, filepath, response=None, **kwargs): 43 self._request = request 44 if not response: response = Response() 45 self._response = response 46 self.request = GnrWebRequest(request) 47 self.response = GnrWebResponse(response) 48 self._initialize(customclass, filepath, **kwargs) 49 50 def newMarshalCookie(self, name, value, secret=None, **kw): 51 return Cookie.MarshalCookie(name,value,secret=secret,**kw) 52 53 def raiseUnauthorized(self): 54 raise HTTPUnauthorized 55 56 def get_cookie(self, cookieName, cookieType, secret = None): 57 cookieType = cookie_types[cookieType] 58 cookie=Cookie.get_cookie(self.request, cookieName, cookieType, secret = secret) 59 if type(cookie) is not cookieType: cookie=None 60 return cookie 61 62 def add_cookie(self,cookie): 63 Cookie.add_cookie(self.request,cookie) 64 65 def get_session(self, **kwargs): 66 return self._request.environ['beaker.session'] 67 68 def add_response_header(self,header,value): 69 self.response.headers.add(header, value) 87 70 88 var_regex = re.compile(r''' 89 \{ # The exact character "{" 90 (\w+) # The variable name (restricted to a-z, 0-9, _) 91 (?::([^}]+))? # The optional :regex part 92 \} # The exact character "}" 93 ''', re.VERBOSE) 94 95 def template_to_regex(template): 96 regex = '' 97 last_pos = 0 98 for match in var_regex.finditer(template): 99 regex += re.escape(template[last_pos:match.start()]) 100 var_name = match.group(1) 101 expr = match.group(2) or '[^/]+' 102 expr = '(?P<%s>%s)' % (var_name, expr) 103 regex += expr 104 last_pos = match.end() 105 regex += re.escape(template[last_pos:]) 106 regex = '^%s$' % regex 107 return regex 108 109 class Router(object): 110 def __init__(self): 111 self.routes = [] 112 113 def add_route(self, template, controller, **vars): 114 if isinstance(controller, basestring): 115 controller = load_controller(controller) 116 self.routes.append((re.compile(template_to_regex(template)), 117 controller, 118 vars)) 119 120 def __call__(self, environ, start_response): 121 req = Request(environ) 122 123 for regex, controller, vars in self.routes: 124 match = regex.match(req.path_info) 125 if match: 126 req.urlvars = match.groupdict() 127 req.urlvars.update(vars) 128 return controller(environ, start_response) 129 return exc.HTTPNotFound()(environ, start_response) 130 131 def controller(func): 132 def replacement(environ, start_response): 133 req = Request(environ) 134 try: 135 resp = func(req, **req.urlvars) 136 except exc.HTTPException, e: 137 resp = e 138 if isinstance(resp, basestring): 139 resp = Response(body=resp) 140 return resp(environ, start_response) 141 return replacement 142 143 class GrowlStub(object): 144 def notify(self, *args, **kwargs): 145 pass 146 147 class GnrWebClientError(Exception): 148 pass 149 150 class GnrWebServerError(Exception): 151 pass 152 153 class GnrWebPage(GnrObject): 154 def __init__(self, req, customclass, filepath, page_id=None, response=None, 155 _rpc_resultPath=None, _dk_=None, xxcnt=None, _user_login=None, sitepath=None, **kwargs): 156 self._rpc_resultPath=_rpc_resultPath 157 self.request = req 158 if response: 159 self.response=response 160 else: 161 self.response=Response() 162 self.response.headers.add("Pragma", "no-cache") 163 # req.headers_out["Pragma"] = "no-cache" 164 165 self.page_id = page_id or getUuid() 166 self._dk=_dk_ 167 self.filepath = filepath # TOGLIERE ???? 168 self._user_login = _user_login 169 self.kwargs = kwargs 170 self._htmlHeaders=[] 171 self._ctxData = Bag() 172 if sitepath: 173 self.sitepath=sitepath 174 else: 175 self.sitepath=os.path.dirname(os.path.dirname(self.filepath)) 176 self.folders= {'pages':os.path.join(self.sitepath,'pages'), 177 'site':self.sitepath, 178 'current':os.path.dirname(self.filepath), 179 'document_root': os.path.dirname(self.filepath).rstrip('/') 180 } 181 self.filename = os.path.basename(self.filepath) 182 self.pagename = os.path.splitext(os.path.basename(self.filename))[0] 183 self.pagepath = self.filename.replace(self.folders['pages'], '') 184 185 self.theme = getattr(customclass, 'theme', None) or self.config['dojo?theme'] or 'tundra' 186 self.dojoversion = getattr(customclass, 'dojoversion', None) or self.config['dojo?version'] or '11' 187 self.pagetemplate = getattr(customclass, 'pagetemplate', None) or self.config['dojo?pagetemplate'] 188 self.maintable = getattr(customclass, 'maintable', None) 189 self.js_requires = splitAndStrip( getattr(customclass, 'js_requires', ''),',') 190 self.css_requires = splitAndStrip(getattr(customclass, 'css_requires', ''),',') 191 py_requires = splitAndStrip(getattr(customclass, 'py_requires', '') ,',') 192 self.eagers = getattr(customclass, 'eagers', {}) 193 self._baseMixins() 194 self._pyrequiresMixin(py_requires) 195 self.mixin(customclass) 196 self._customPageMixins() 197 self.css_requires.reverse() 198 199 def getUuid(self): 200 return getUuid() 201 202 def _baseMixins(self): 203 pkgId = self.packageId 204 pkg=None 205 if pkgId: 206 pkg = self.application.packages[pkgId] 207 if pkg: 208 self.mixin(pkg.webPageMixin) # first the package standard 209 self.mixin(self.application.webPageCustom) # then the application custom 210 if pkg: 211 self.mixin(pkg.webPageMixinCustom) # finally the package custom 212 213 def _customPageMixins(self): 214 """Look in the instance custom folder for a file named as the current webpage""" 215 if self.packageId: 216 filepath = self.pagepath.split('/',1) 217 if len(filepath) == 2: #the page is into a package, not root level 218 filepath = filepath[1] 219 customPagePath=os.path.join(self.application.customFolder, self.packageId, 'webpages', filepath) 220 if os.path.isfile(customPagePath): 221 raise self.filename 222 self.mixin('%s:%s' % (customPagePath,'WebPage')) 223 224 def _pyrequiresMixin(self, py_requires): 225 for mix in py_requires: 226 if mix: 227 modName, clsName = mix.split(':') 228 modPathList = self.getResourceList(modName, 'py') or [] 229 if modPathList: 230 modPathList.reverse() 231 for modPath in modPathList: 232 self.mixin('%s:%s' % (modPath, clsName)) 233 else: 234 raise GnrWebServerError('Cannot import component %s' % modName) 235 236 237 def indexo(self ,**kwargs): 238 self.kwargs.update(kwargs) 239 self.onInit() 240 if self._user_login: 241 user=self.user # if we have an embedded login we get the user right now 242 243 try: 244 if 'mako' in self.kwargs: 245 result = self.makoTemplate(path=self.kwargs['mako'], **self.kwargs) 246 elif 'method' in self.kwargs: 247 result = self._rpcDispatcher(**self.kwargs) 248 else: 249 result = self.indexPage() 250 self.session.loadSessionData() 251 self.session.pagedata['pageArgs'] = self.kwargs 252 self.session.pagedata['page_id'] = self.page_id 253 self.session.pagedata['connection_id'] = self.connection.connection_id 254 self.session.pagedata['pagepath'] = self.pagepath 255 self.session.saveSessionData() 256 except: 257 self._onEnd() 258 raise 259 self._onEnd() 260 return result 261 262 def reqargs(self,req): 263 return dict(getattr(req,req.method)) 264 265 def index(self ,**kwargs): 266 #req = Request(environ) 267 #kwargs = self.reqargs(req) 268 self.kwargs.update(kwargs) 269 self.onInit() 270 if self._user_login: 271 user=self.user # if we have an embedded login we get the user right now 272 273 try: 274 &
