def get_stats(project): """ the changes to create a chart with """ total = DBSession.query(func.sum(ST_Area(Task.geometry))) \ .filter( Task.cur_state.has(TaskState.state != TaskState.state_removed), Task.project_id == project.id ) \ .scalar() subquery = DBSession.query( TaskState.state, TaskState.date, ST_Area(Task.geometry).label('area'), func.lag(TaskState.state).over( partition_by=( TaskState.task_id, TaskState.project_id ), order_by=TaskState.date ).label('prev_state') ).join(Task).filter( TaskState.project_id == project.id, TaskState.state != TaskState.state_ready) \ .order_by(TaskState.date) tasks = subquery.all() log.debug('Number of tiles: %s', len(tasks)) stats = [[project.created.isoformat(), 0, 0]] done = 0 validated = 0 # for every day count number of changes and aggregate changed tiles for task in tasks: if task.state == TaskState.state_done: done += task.area if task.state == TaskState.state_invalidated: if task.prev_state == TaskState.state_done: done -= task.area elif task.prev_state == TaskState.state_validated: validated -= task.area if task.state == TaskState.state_validated: validated += task.area done -= task.area # append a day to the stats and add total number of 'done' tiles and a # copy of a current tile_changes list stats.append([task.date.isoformat(), done, validated]) return {"total": total, "stats": stats}
def get_validated(self): total = DBSession.query(func.sum(ST_Area(Task.geometry))) \ .filter(Task.project_id == self.id) \ .filter(Task.state != Task.state_removed) \ .scalar() validated = DBSession.query(func.sum(ST_Area(Task.geometry))) \ .filter(and_(Task.project_id == self.id, Task.state == Task.state_validated)) \ .scalar() if not validated: validated = 0 return round(validated * 100 / total) if total != 0 else 0
def get_done(self): total = DBSession.query(func.sum(ST_Area(Task.geometry))) \ .filter(Task.project_id == self.id) \ .filter(Task.state != Task.state_removed) \ .scalar() done = DBSession.query(func.sum(ST_Area(Task.geometry))) \ .filter(and_(Task.project_id == self.id, Task.state == Task.state_done)) \ .scalar() if not done: done = 0 return round(done * 100 / total) if total != 0 else 0
def get_done(self): total = DBSession.query(func.sum(ST_Area(Task.geometry))) \ .filter( Task.project_id == self.id, Task.cur_state.has(TaskState.state != TaskState.state_removed) ) \ .scalar() done = DBSession.query(func.sum(ST_Area(Task.geometry))) \ .filter( Task.project_id == self.id, Task.cur_state.has(TaskState.state == TaskState.state_done) ) \ .scalar() if not done: done = 0 return math.floor(done * 100 / total) if total != 0 else 0