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
def patch(self, vals): """Replace values """ obj = self.get() for key, val in vals.items(): setattr(obj, key, val) Session.flush() return obj
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
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) } }
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
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) } }
def remove(self): """Remove record from table """ obj = self.get() Session.delete(obj)
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)