From bda399e45dd965480598685a7ae14734bb70e4d1 Mon Sep 17 00:00:00 2001 From: erickson Date: Wed, 26 Dec 2007 21:49:32 +0000 Subject: [PATCH] added ability to store and retrieve context objects as cookies in addition to url params. added AuthException objects when no valid authtoken (user + workstation) is found git-svn-id: svn://svn.open-ils.org/ILS/branches/acq-experiment@8279 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- Open-ILS/web/oilsweb/oilsweb/controllers/acq.py | 11 +++---- .../web/oilsweb/oilsweb/controllers/acq_admin.py | 2 +- Open-ILS/web/oilsweb/oilsweb/lib/__init__.py | 21 ++++++++++-- Open-ILS/web/oilsweb/oilsweb/lib/context.py | 37 ++++++++++++++++++---- .../public/oils/media/css/skin/acq_default.css | 6 +++- 5 files changed, 60 insertions(+), 17 deletions(-) diff --git a/Open-ILS/web/oilsweb/oilsweb/controllers/acq.py b/Open-ILS/web/oilsweb/oilsweb/controllers/acq.py index b6ef26e12a..8ba2a40bfa 100644 --- a/Open-ILS/web/oilsweb/oilsweb/controllers/acq.py +++ b/Open-ILS/web/oilsweb/oilsweb/controllers/acq.py @@ -1,7 +1,6 @@ from oilsweb.lib.base import * import logging -import pylons import oilsweb.lib.context import oilsweb.lib.util import oilsweb.lib.acq.search @@ -29,11 +28,11 @@ Context.applySubContext('acq', AcqContext) class AcqController(BaseController): def index(self): - c.oils = oilsweb.lib.context.Context.init(request) + c.oils = oilsweb.lib.context.Context.init(request, response) return render('oils/%s/acq/index.html' % c.oils.core.skin) def search(self): - c.oils = Context.init(request) + c.oils = Context.init(request, response) c.oils_z39_sources = oilsweb.lib.acq.search.fetch_z39_sources(c.oils) sc = {} @@ -49,7 +48,7 @@ class AcqController(BaseController): def pl_builder(self): - ctx = oilsweb.lib.context.Context.init(request) + ctx = oilsweb.lib.context.Context.init(request, response) # add logic to see where we are fetching bib data from if ctx.acq.search_source: @@ -81,7 +80,7 @@ class AcqController(BaseController): return oilsweb.lib.acq.search.multi_search(ctx, search) def rdetails(self): - c.oils = oilsweb.lib.context.Context.init(request) + c.oils = oilsweb.lib.context.Context.init(request, response) rec_id = c.oils.acq.record_id cache_key = c.oils.acq.search_cache_key @@ -95,7 +94,7 @@ class AcqController(BaseController): def create_picklist(self): - ctx = oilsweb.lib.context.Context.init(request) + ctx = oilsweb.lib.context.Context.init(request, response) if not isinstance(ctx.acq.picklist_item, list): ctx.acq.picklist_item = [ctx.acq.picklist_item] diff --git a/Open-ILS/web/oilsweb/oilsweb/controllers/acq_admin.py b/Open-ILS/web/oilsweb/oilsweb/controllers/acq_admin.py index 13add6cd16..5d6de81f6f 100644 --- a/Open-ILS/web/oilsweb/oilsweb/controllers/acq_admin.py +++ b/Open-ILS/web/oilsweb/oilsweb/controllers/acq_admin.py @@ -31,7 +31,7 @@ class AcqAdminController(BaseController): import pprint # Parse IDL and render as links for viewing the objects, perhaps? - c.oils = oilsweb.lib.context.Context.init(request) + c.oils = oilsweb.lib.context.Context.init(request, response) c.request = request oilsConnect('/openils/conf/opensrf_core.xml', 'config.opensrf') c.idl = oils.utils.idl.oilsGetIDLParser() diff --git a/Open-ILS/web/oilsweb/oilsweb/lib/__init__.py b/Open-ILS/web/oilsweb/oilsweb/lib/__init__.py index 440936e605..8b6eca6a30 100644 --- a/Open-ILS/web/oilsweb/oilsweb/lib/__init__.py +++ b/Open-ILS/web/oilsweb/oilsweb/lib/__init__.py @@ -1,14 +1,23 @@ from oilsweb.lib.context import Context, SubContext, ContextItem import osrf.ses, oils.utils.csedit, pylons.config +from gettext import gettext as _ + +class AuthException(Exception): + def __init__(self, info=''): + self.info = info + def __str__(self): + return "%s: %s" % (self.__class__.__name__, unicode(self.info)) + + class CoreContext(SubContext): def __init__(self): - self.prefix = ContextItem() # web prefi + self.prefix = ContextItem() # web prefix self.media_prefix = ContextItem() # media prefix self.ac_prefix = ContextItem() # added content prefix self.skin = ContextItem() # web skin self.theme = ContextItem() # web theme - self.authtoken = ContextItem(cgi_name='ses') # authtoken string + self.authtoken = ContextItem(cgi_name='ses', cookie=True) # authtoken string self.user = ContextItem() # logged in user object self.workstation = ContextItem() # workstation object @@ -36,8 +45,14 @@ class CoreContext(SubContext): self.user = osrf.ses.AtomicRequest( 'open-ils.auth', 'open-ils.auth.session.retrieve', self.authtoken) + + if not self.user: + raise AuthException(_('No user found with authtoken %(self.authtoken)s')) self.workstation = oils.utils.csedit.CSEditor().retrieve_actor_workstation(self.user.wsid()) + if not self.workstation: + raise AuthException(_('No workstation found')) + # cache the auth data and destroy any old auth data CoreContext._auth_cache = { self.authtoken : { @@ -45,6 +60,8 @@ class CoreContext(SubContext): 'workstation' : self.workstation } } + else: + raise AuthException(_('No authentication token provided')) Context.applySubContext('core', CoreContext) diff --git a/Open-ILS/web/oilsweb/oilsweb/lib/context.py b/Open-ILS/web/oilsweb/oilsweb/lib/context.py index 9294e27697..5d06154906 100644 --- a/Open-ILS/web/oilsweb/oilsweb/lib/context.py +++ b/Open-ILS/web/oilsweb/oilsweb/lib/context.py @@ -13,6 +13,7 @@ class ContextItem(object): self.default_value = kwargs.get('default_value') self.qname = None self.multi = kwargs.get('multi') + self.cookie = kwargs.get('cookie') class SubContext(object): ''' A SubContext is a class-specific context object that lives inside the global context object ''' @@ -30,6 +31,8 @@ class Context(object): def __init__(self): self._fields = [] + self._req = None + self._resp = None def make_query_string(self): ''' Compiles a CGI query string from the collection of values @@ -37,7 +40,7 @@ class Context(object): q = '' for f in self._fields: - if f.cgi_name: + if f.cgi_name and not f.cookie: val = getattr(getattr(self, f.app), f.name) if val != f.default_value: if isinstance(val, list): @@ -53,6 +56,14 @@ class Context(object): return q + def apply_cookies(self): + for f in self._fields: + if f.cgi_name and f.cookie: + val = getattr(getattr(self, f.app), f.name) + if isinstance(val, str) or isinstance(val, unicode): + self._resp.set_cookie(f.cgi_name, val) # config var for timeout? + + @staticmethod def applySubContext(app, ctx): global _subContexts @@ -64,25 +75,37 @@ class Context(object): return _context @staticmethod - def init(req): + def init(req, resp): global _context, _subContexts c = _context = Context() + c._req = req + c._resp = resp childInit() for app, ctx in _subContexts.iteritems(): ctx = ctx() setattr(c, app, ctx) for name in ctx._fields(): + item = getattr(ctx, name) item.app = app item.name = name c._fields.append(item) - if item.cgi_name and item.cgi_name in req.params: - if item.multi: - setattr(getattr(c, app), name, req.params.getall(item.cgi_name)) + + set = False + if item.cgi_name: + if item.cgi_name in req.params: + if item.multi: + setattr(getattr(c, app), name, req.params.getall(item.cgi_name)) + else: + setattr(getattr(c, app), name, req.params[item.cgi_name]) + set = True else: - setattr(getattr(c, app), name, req.params[item.cgi_name]) - else: + if item.cookie and item.cgi_name in req.cookies: + setattr(getattr(c, app), name, req.cookies[item.cgi_name]) + set = True + + if not set: setattr(getattr(c, app), name, item.default_value) # store the metatdata at _ diff --git a/Open-ILS/web/oilsweb/oilsweb/public/oils/media/css/skin/acq_default.css b/Open-ILS/web/oilsweb/oilsweb/public/oils/media/css/skin/acq_default.css index 0a5dc70f7b..05734e8471 100644 --- a/Open-ILS/web/oilsweb/oilsweb/public/oils/media/css/skin/acq_default.css +++ b/Open-ILS/web/oilsweb/oilsweb/public/oils/media/css/skin/acq_default.css @@ -1,5 +1,7 @@ #oils-acq-index-block { font-weight:bold; } + +/* bib search */ #oils-acq-search-container { width:100%; } #oils-acq-search-sources-block { width:32%; vertical-align: top; float: left; margin-right: 10px;} #oils-acq-search-form-block { width:63%; vertical-align: top; float:right; } @@ -8,7 +10,6 @@ .oils-acq-search-form-row { width: 100%; } .oils-acq-search-form-label {} .oils-acq-search-form-input {} - #oils-acq-search-sources-list { padding: 1px; } #oils-acq-search-sources-list li { list-style-type: none; padding-left: 0px; } .oils-acq-search-sources-sublist { padding: 1px; list-style-type: none;} @@ -18,6 +19,7 @@ #oils-acq-search-fields-label { margin-bottom: 10px; } #oils-acq-search-fields-submit-block { margin: 5px; text-align: center;} +/* bib search results / picklist builder interface */ #oils-acq-pl_builder-table { width: 100%; } .oils-acq-record_list-records-jacket { width: 42px; height: 54px; padding-left: 10px; } .oils-acq-record_list-records-title-row {} @@ -28,3 +30,5 @@ #oils-acq-picklist-table { width: 100%; } + + -- 2.11.0