def render_list_json(self, request): params = dict((k, request.args.get(k, [''])[0]) for k in ('_search', 'page', 'rows', 'sidx', 'sord')) # XXX Todo -- Search sortCol = getattr(self.model, params['sidx']) if isinstance(sortCol, Reference): sortCol = sortCol._local_key[0] if params['sord'] == 'desc': sortCol = Desc(sortCol) rowsPerPage = int(params['rows']) start = (int(params['page']) - 1) * rowsPerPage end = start + rowsPerPage conditions = [] whereJSON = request.args.get('where', [None])[0] if whereJSON is not None: where = json.loads(whereJSON) for (k, v) in where.iteritems(): conditions.append(getattr(self.model, k) == v) totalResults = store.find(self.model, *conditions).count() results = list(store.find(self.model, *conditions).order_by(sortCol)[start:end]) exclude = json.loads(request.args.get('exclude', ['[]'])[0]) makeRow = lambda row: [row.renderListView(colName, request) for colName in row.listColumns if colName not in exclude] rows = [{'id': '.'.join(str(getattr(row, k)) for k in row.__storm_primary__) if hasattr(row, '__storm_primary__') else row.id, 'cell': makeRow(self.crudModel(row))} for row in results] (totalPages, addOne) = divmod(totalResults, rowsPerPage) if addOne: totalPages += 1 obj = { 'total': totalPages, 'page': params['page'], 'records': len(results), 'rows': rows, } return json.dumps(obj)
def render_edit(self, request): obj = getattr(self.obj, self.col) reference = self.obj.__class__.__dict__[self.col] idCol = reference._local_key[0].name noEdit = getattr(self.obj, 'noEdit', []) refClass = reference._relation.remote_cls crudClass = refClass.__warp_crud__ if self.col in noEdit or idCol in noEdit: return '<input type="hidden" name="warpform-%s" value="%s" />%s' % ( self.fieldName(), obj.id, crudClass(obj).name(request)) allObjs = [(crudClass(o).name(request), o) for o in store.find(refClass)] allObjs.sort() if obj is None: sel = lambda o: "" else: sel = lambda o: ' selected="selected"' if o.id == obj.id else '' options = ['<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 reindex(): import storm.database orig = storm.database.DEBUG storm.database.DEBUG = True store.execute("DELETE FROM warp_fulltext") for klass in searchModels.itervalues(): for obj in store.find(klass): obj.__storm_flushed__() storm.database.DEBUG = orig
def doIt(self, request): if request.method != 'POST': return [email] = request.args.get('email', [None]) [password] = request.args.get('password', [None]) if not (email and password): return avatar = store.find(Avatar, Avatar.email == email.decode("utf-8"), Avatar.password == password.decode("utf-8") ).one() if avatar is not None: request.session.setAvatar(avatar)
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 doIt(self, request): if request.method != 'POST': return [email] = request.args.get('email', [None]) [password] = request.args.get('password', [None]) if not (email and password): request.session.addFlashMessage("Login failed: Email or password not given", _domain="_warp:login") return avatar = store.find(Avatar, Avatar.email == email.decode("utf-8"), Avatar.password == password.decode("utf-8") ).one() if avatar is None: request.session.addFlashMessage("Login failed: Email or password incorrect", _domain="_warp:login") return request.session.setAvatar(avatar)