def render_view(self, request): objID = int(request.resource.args[0]) obj = store.get(self.model, objID) return helpers.renderTemplateObj(request, self._getViewTemplate(), crud=self.crudModel(obj))
def getSession(self, uid): session = store.get(DBSession, uid) if session is None: raise KeyError(uid) return session
def render_edit(self, request): objID = int(request.resource.args[0]) obj = store.get(self.model, objID) return helpers.renderTemplateObj(request, self._getCrudTemplate(), obj=self.crudModel(obj), redirect=helpers.url(request.node, 'view', request.resource.args))
def render_edit(self, request): objID = int(request.resource.args[0]) obj = store.get(self.model, objID) crud = self.crudModel(obj) return helpers.renderTemplateObj(request, self._getEditTemplate(), crud=crud, redirect=crud.saveRedirect(request))
def render_image(self, request): try: className, objID, attrName = request.resource.args objID = int(objID) klass = exposedStormClasses[className][0] obj = store.get(klass, objID) except Exception, e: import traceback traceback.print_exc() return NoResource().render(request)
def render_delete(self, request): objID = int(request.resource.args[0]) obj = store.get(self.model, objID) if obj is not None: store.remove(obj) store.commit() request.redirect(helpers.url(request.node)) return "Redirecting..."
def save(self, val, request): try: val = int(val) except ValueError: return u"Invalid value" refClass = self.obj.__class__.__dict__[self.col]._relation.remote_cls obj = store.get(refClass, val) if obj is None: return u"No such object (id %s)" % val setattr(self.obj, self.col, obj)
def render_image(self, request): try: className, objID, attrName = request.resource.args objID = int(objID) klass = exposedStormClasses[className] obj = store.get(klass, objID) except: return NoResource().render(request) val = getattr(obj, attrName) if val is None: return NoResource().render(request) else: return static.Data(val, "image/jpeg").render(request)
def render_edit(self, request): # Make sure it's loaded getattr(self.obj, self.col) reference = self.obj.__class__.__dict__[self.col] idCol = reference._local_key[0].name noEdit = getattr(self.obj, "noEdit", []) # We get the _id field here rather than the reference value # itself, because the reference works only on objects that # have been added to the store, and we want to avoid that # when creating things (since they may not satisfy constraints, # and will get added when the database gets flushed on e.g. a find()) objID = getattr(self.obj, idCol) refClass = reference._relation.remote_cls crudClass = getCrudClass(refClass) if self.col in noEdit or idCol in noEdit: obj = store.get(refClass, objID) return '<input type="hidden" name="warpform-%s" value="%s" />%s' % ( self.fieldName(), objID, crudClass(obj).name(request), ) allObjs = [(crudClass(o).name(request), o) for o in store.find(refClass, *self.conditions)] allObjs.sort() if objID is None: sel = lambda o: "" else: sel = lambda o: ' selected="selected"' if o.id == objID else "" options = [] if self.allowNone: options.append('<option value="">[None]</option>') options.extend('<option value="%s"%s>%s</option>' % (o.id, sel(o), name) for (name, o) in allObjs) return '<select name="warpform-%s">\n%s\n</select>' % (self.fieldName(), "\n".join(options))
def save(self, val, request): try: if self.allowNone and val == "": val = None else: val = int(val) except ValueError: return u"Invalid value" refClass = self.obj.__class__.__dict__[self.col]._relation.remote_cls if val is not None: obj = store.get(refClass, val) if obj is None: return u"No such object (id %s)" % val val = obj.id # As in render_edit, set the _id col rather than the reference # itself, since the latter works only if this object is # already in the store reference = self.obj.__class__.__dict__[self.col] idCol = reference._local_key[0].name setattr(self.obj, idCol, val)
def applyForm(objects, request): errors = [] actions = [] results = { 'created': [], 'updated': [], 'deleted': [], } for jsobj in objects: if not all(jsobj.get(k) for k in ('action', 'model')): raise ValueError("Invalid object: %s" % jsobj) try: model, crudClass = exposedStormClasses[jsobj['model']] except KeyError: errors.append((None, u"Unknown or unexposed model: %s" % jsobj['model'])) continue if jsobj['action'] == 'create': obj = model() obj.fakeID = 'n' + jsobj['id'] results['created'].append(obj) # We haven't added the object to the store, because it may not # satisfy constraints yet. Down below, when we know things are # okay, we go back and add it. else: try: objID = int(jsobj['id']) except ValueError: errors.append((None, u"Invalid id: %s" % jsobj['id'])) continue obj = store.get(model, objID) if obj is None: errors.append((None, u"Missing ID '%s' for model '%s'" % (jsobj['id'], jsobj['model']))) continue results['updated'].append(obj) for (key, val) in jsobj['fields'].iteritems(): try: attr = str(key) except UnicodeEncodeError: errors.append((None, u"Invalid field name '%s'" % attr)) continue # XXX TODO -- Access check goes here (or, uh, somewhere) # ... crud = crudClass(obj) actions.append( (crud, attr, val) ) if errors: return (False, errors) for (crud, attr, val) in actions: error = crud.save(attr, val, request) if error is not None: key = crud.getProxy(attr, request).fieldName() errors.append((key, error)) if errors: return (False, errors) for obj in results['created']: store.add(obj) return (True, results)
def applyForm(objects, request): errors = [] actions = [] results = { 'created': [], 'updated': [], 'deleted': [], } for jsobj in objects: if not all(jsobj.get(k) for k in ('action', 'model')): raise ValueError("Invalid object: %s" % jsobj) try: model = exposedStormClasses[jsobj['model']] except KeyError: errors.append((None, u"Unknown model: %s" % jsobj['model'])) continue try: model.__warp_crud__ except AttributeError: errors.append((None, u"Model %s has no crud class" % jsobj['model'])) continue if jsobj['action'] == 'create': obj = model() store.add(obj) obj.fakeID = '*' + jsobj['id'] results['created'].append(obj) else: try: objID = int(jsobj['id']) except ValueError: errors.append((None, u"Invalid id: %s" % jsobj['id'])) continue obj = store.get(model, objID) if obj is None: errors.append((None, u"Missing ID '%s' for model '%s'" % (jsobj['id'], jsobj['model']))) continue results['updated'].append(obj) for (key, val) in jsobj['fields'].iteritems(): try: attr = str(key) except UnicodeEncodeError: errors.append((None, u"Invalid field name '%s'" % attr)) continue # XXX TODO -- Access check goes here (or, uh, somewhere) # ... crud = model.__warp_crud__(obj) actions.append( (crud, attr, val) ) if errors: return (False, errors) for (crud, attr, val) in actions: error = crud.save(attr, val, request) if error is not None: key = crud.getProxy(attr, request).fieldName() errors.append((key, error)) if errors: return (False, errors) return (True, results)
def search(term, language='english'): for modelName, doc_id in store.execute(SEARCH_SQL, (language, term.encode("utf-8"))): model = searchModels[modelName] yield store.get(model, doc_id)