Пример #1
0
    def query_export(self, request):
        request = request['unigrid']
        entity = request['entities']

        # array of requested fields
        fields = []
        # array of all query entities for simple field search
        entities = []
        # parse UniGridRequest. Get array of fields and array of entities
        for e in entity:
            self._process_entity_attrs(e, fields, entities)

        query = Session().query(*[f['ref'] for f in fields if f['selected']])
        for e in entities:
            if 'join' in e:
                query = query.outerjoin((e['alias'], e['join']))
        # filtration
        where = self._process_where(request.get('where', {}), fields)
        if where is not None:
            query = query.filter(where)
        # sorting
        for order in self._process_order(request.get('order', []), fields):
            query = query.order_by(order)

        class QueryIterable(object):
            def __init__(self, query):
                self.query = query

            def __iter__(self):
                return QueryIterator(self.query)

        class QueryIterator(object):
            offset = 0
            chunk_size = 10000

            def __init__(self, query):
                self.query = query

            def __iter__(self):
                return self

            def next(self):
                chunk = query.offset(self.offset).limit(self.chunk_size).all()
                self.offset += self.chunk_size
                if not chunk:
                    raise StopIteration
                return bytes(
                    '\n'.join([';'.join([str(f) for f in r])
                               for r in chunk]) + '\n', 'utf-8')

            __next__ = next  # py3 compat

        res = Response(content_type='text/csv',
                       headerlist=[('Content-disposition',
                                    'attachment;filename=export.csv')])
        res.app_iter = QueryIterable(query)
        return res
Пример #2
0
    def patch(self, vals):
        """Replace values

        """
        obj = self.get()
        for key, val in vals.items():
            setattr(obj, key, val)
        Session.flush()
        return obj
Пример #3
0
 def get(self):
     if not self.obj:
         cls = orm_classes[self.table_name]
         self.obj = Session.query(cls).get(self.ids)
         if not self.obj:
             raise Exception(
                 'Record with id {id_} from table \'{table}\' doesn\'t exist'
                 .format(id_=self.ids, table=self.table_name))
     return self.obj
Пример #4
0
    def query_summaries(self, request):
        request = request['unigrid']
        entity = request['entities']

        # array of requested fields
        fields = []
        # array of all query entities for simple field search
        entities = []
        # parse UniGridRequest. Get array of fields and array of entities
        for e in entity:
            self._process_entity_attrs(e, fields, entities)

        offset = request.get('offset', 0)
        query = Session().query(*[f['ref'] for f in fields if f['selected']])
        for e in entities:
            if 'join' in e:
                query = query.outerjoin((e['alias'], e['join']))
        # filtration
        where = self._process_where(request.get('where', {}), fields)
        if where is not None:
            query = query.filter(where)

        sum_fields = [(getattr(sql.func, s)(f['ref']), s, f['alias'])
                      for f in fields if f['summaries']
                      for s in f['summaries']]
        data = []
        if sum_fields:
            data = query.from_self(*[f[0] for f in sum_fields]).one()
        count = 1
        return {
            'cols': [str(f[1]) + '_' + str(f[2]) for f in sum_fields],
            'data': [to_json_type(data[i]) for i in range(len(data))],
            'size': {
                'total': count,
                'offset': offset,
                'frame': len(data)
            }
        }
Пример #5
0
    def add(self, vals):
        """Add new row to table

        :param vals: initial values
        :param type: dict
        :return new row object
        """
        cls = orm_classes[self.name]
        obj = cls(**vals)
        session = Session()
        session.add(obj)
        session.flush()
        return obj
Пример #6
0
    def query(self, request):
        request = request['unigrid']
        entity = request['entities']

        # array of requested fields
        fields = []
        # array of all query entities for simple field search
        entities = []
        # parse UniGridRequest. Get array of fields and array of entities
        for e in entity:
            self._process_entity_attrs(e, fields, entities)

        offset = request.get('offset', 0)
        query = Session().query(*[f['ref'] for f in fields if f['selected']])
        for e in entities:
            if 'join' in e:
                query = query.outerjoin((e['alias'], e['join']))
        # filtration
        where = self._process_where(request.get('where', {}), fields)
        if where is not None:
            query = query.filter(where)
        # sorting
        for order in self._process_order(request.get('order', []), fields):
            query = query.order_by(order)
        count = query.count()
        data = query.offset(offset).limit(request.get('limit', 100)).all()
        return {
            'cols': [f['alias'] for f in fields if f['selected']],
            'data':
            [[to_json_type(r[i]) for i in range(len(r))] for r in data],
            'size': {
                'total': count,
                'offset': offset,
                'frame': len(data)
            }
        }
Пример #7
0
    def remove(self):
        """Remove record from table

        """
        obj = self.get()
        Session.delete(obj)
Пример #8
0
 def select(self):
     if self.name not in orm_classes:
         raise Exception(
             'Table {name} doesn\'t exist'.format(name=self.name))
     cls = orm_classes[self.name]
     return Session().query(cls)