def done_tasks_notify(tasks): """Notification handling for tasks that moved in done state. It will - delete all notifications for done tasks - create notification for related cycle if all tasks in done state """ if not tasks: return pusher.get_notification_query(*tasks).delete(synchronize_session="fetch") cycle_tasks_dict = collections.defaultdict(list) cycles_dict = {} task_ids = [] for obj in tasks: cycle_tasks_dict[obj.cycle].append(obj) cycles_dict[obj.cycle.id] = obj.cycle task_ids.append(obj.id) task_query = all_models.CycleTaskGroupObjectTask.query.filter( all_models.CycleTaskGroupObjectTask.cycle_id.in_(cycles_dict.keys()), all_models.CycleTaskGroupObjectTask.id.notin_(task_ids), ).options( db.Load(all_models.CycleTaskGroupObjectTask).undefer_group( "CycleTaskGroupObjectTask_complete")).all() for task in task_query: cycle_tasks_dict[cycles_dict[task.cycle_id]].append(task) done_cycles = [ cycle for cycle, cycle_tasks in cycle_tasks_dict.iteritems() if all(task.is_done for task in cycle_tasks) ] pusher.create_notifications_for_objects("all_cycle_tasks_completed", datetime.date.today(), *done_cycles)
def eager_query(cls, **kwargs): # pylint: disable=unused-argument """Sub-query for eager loading.""" mapper_class = cls._sa_class_manager.mapper.base_mapper.class_ return db.session.query(cls).options( db.Load(mapper_class).undefer_group(mapper_class.__name__ + '_complete'), )
def done_tasks_notify(tasks, day): """Notification handling for tasks that moved in done state. It will - delete all notifications for done tasks - create notification for related cycle if all tasks in done state """ if not tasks: return pusher.get_notification_query(*tasks).delete( synchronize_session=False ) cycle_tasks_dict = collections.defaultdict(list) cycles_dict = {} task_ids = [] for obj in tasks: cycle_tasks_dict[obj.cycle].append(obj) cycles_dict[obj.cycle.id] = obj.cycle task_ids.append(obj.id) task_query = all_models.CycleTaskGroupObjectTask.query.filter( all_models.CycleTaskGroupObjectTask.cycle_id.in_(cycles_dict.keys()), all_models.CycleTaskGroupObjectTask.id.notin_(task_ids), ).options( db.Load( all_models.CycleTaskGroupObjectTask ).undefer_group( "CycleTaskGroupObjectTask_complete" ) ).all() for task in task_query: cycle_tasks_dict[cycles_dict[task.cycle_id]].append(task) done_cycles = [cycle for cycle, cycle_tasks in cycle_tasks_dict.iteritems() if all(task.is_done for task in cycle_tasks)] # this filtration is required for correct work of # '/admin/generate_wf_tasks_notifications' endpoint existing_notifications = pusher.get_notification_query( *done_cycles, **{"notification_names": ["all_cycle_tasks_completed"]} ).all() cycles_with_notifications_ids = [notif.object_id for notif in existing_notifications] done_cycles_without_notifs = [cycle for cycle in done_cycles if cycle.id not in cycles_with_notifications_ids] pusher.create_notifications_for_objects("all_cycle_tasks_completed", datetime.date.today(), *done_cycles_without_notifs, day=day)
def eager_query(cls): mapper_class = cls._sa_class_manager.mapper.base_mapper.class_ return db.session.query(cls).options( db.Load(mapper_class).undefer_group( mapper_class.__name__ + '_complete'), )