Example #1
0
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)
Example #2
0
    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'), )
Example #3
0
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)
Example #4
0
 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'),
   )