Esempio n. 1
0
    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)
Esempio n. 2
0
    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))
Esempio n. 3
0
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
Esempio n. 4
0
File: auth.py Progetto: rjweir/warp
    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)
Esempio n. 5
0
    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))
Esempio n. 6
0
    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)