Beispiel #1
0
def get_episodes_for_project(project_id, only_assigned=False):
    """
    Retrieve all episodes related to given project.
    """
    if only_assigned:
        Sequence = aliased(Entity, name="sequence")
        Shot = aliased(Entity, name="shot")
        Asset = aliased(Entity, name="asset")
        query = (
            Entity.query.join(Sequence, Entity.id == Sequence.parent_id)
            .join(Shot, Sequence.id == Shot.parent_id)
            .join(Task, Shot.id == Task.entity_id)
            .filter(Entity.project_id == project_id)
            .filter(user_service.build_assignee_filter())
        )
        shot_episodes = fields.serialize_models(query.all())
        shot_episode_ids = {episode["id"]: True for episode in shot_episodes}
        query = (
            Entity.query.join(Asset, Entity.id == Asset.source_id)
            .join(Task, Asset.id == Task.entity_id)
            .filter(Entity.project_id == project_id)
            .filter(user_service.build_assignee_filter())
        )
        asset_episodes = fields.serialize_models(query.all())
        result = shot_episodes
        for episode in asset_episodes:
            if episode["id"] not in shot_episode_ids:
                result.append(episode)
        return result
    else:
        return entities_service.get_entities_for_project(
            project_id, get_episode_type()["id"], "Episode"
        )
Beispiel #2
0
def _get_episode_counts(project_id, only_assigned=False):
    Sequence = aliased(Entity, name="sequence")
    Episode = aliased(Entity, name="episode")
    query = (Task.query.with_entities(
        Task.project_id,
        Episode.id,
        Task.task_type_id,
        Task.task_status_id,
        TaskStatus.short_name,
        TaskStatus.color,
    ).filter(Task.project_id == project_id).join(
        Project, Project.id == Task.project_id).join(
            TaskStatus, TaskStatus.id == Task.task_status_id).join(
                Entity, Entity.id == Task.entity_id).join(
                    Sequence, Sequence.id == Entity.parent_id).join(
                        Episode, Episode.id == Sequence.parent_id).group_by(
                            Task.project_id,
                            Episode.id,
                            Task.task_type_id,
                            Task.task_status_id,
                            TaskStatus.short_name,
                            TaskStatus.color,
                        ).add_columns(func.count(Task.id)).add_columns(
                            func.sum(Entity.nb_frames)))

    if only_assigned:
        query = query.filter(user_service.build_assignee_filter())

    return query.all()
Beispiel #3
0
def get_full_assets(criterions={}):
    """
    Get all assets for given criterions with additional informations: project
    name and asset type name.
    """
    assigned_to = False
    if "assigned_to" in criterions:
        assigned_to = True
        del criterions["assigned_to"]

    query = (Entity.query.filter_by(**criterions).filter(
        build_asset_type_filter()).join(Project, EntityType).add_columns(
            Project.name,
            EntityType.name).order_by(Project.name, EntityType.name,
                                      Entity.name))
    if assigned_to:
        query = query.outerjoin(Task)
        query = query.filter(user_service.build_assignee_filter())
    data = query.all()
    assets = []
    for (asset_model, project_name, asset_type_name) in data:
        asset = asset_model.serialize(obj_type="Asset")
        asset["project_name"] = project_name
        asset["asset_type_name"] = asset_type_name
        assets.append(asset)
    return assets
Beispiel #4
0
def get_edits(criterions={}):
    """
    Get all edits for given criterions.
    """
    edit_type = get_edit_type()
    criterions["entity_type_id"] = edit_type["id"]
    is_only_assignation = "assigned_to" in criterions
    if is_only_assignation:
        del criterions["assigned_to"]

    query = Entity.query
    query = query_utils.apply_criterions_to_db_query(Entity, query, criterions)
    query = query.join(Project).add_columns(Project.name).order_by(Entity.name)

    if is_only_assignation:
        query = query.outerjoin(Task, Task.entity_id == Entity.id)
        query = query.filter(user_service.build_assignee_filter())

    try:
        data = query.all()
    except StatementError:  # Occurs when an id is not properly formatted
        raise WrongIdFormatException

    edits = []
    for (edit_model, project_name) in data:
        edit = edit_model.serialize(obj_type="Edit")
        edit["project_name"] = project_name
        edits.append(edit)

    return edits
Beispiel #5
0
def get_scenes(criterions={}):
    """
    Get all scenes for given criterions.
    """
    scene_type = get_scene_type()
    criterions["entity_type_id"] = scene_type["id"]
    Sequence = aliased(Entity, name="sequence")

    if "assigned_to" in criterions:
        query = query.outerjoin(Task)
        query = query.filter(user_service.build_assignee_filter())
        del criterions["assigned_to"]

    query = Entity.query
    query = query_utils.apply_criterions_to_db_query(Entity, query, criterions)
    query = (
        query.join(Project)
        .join(Sequence, Sequence.id == Entity.parent_id)
        .add_columns(Project.name)
        .add_columns(Sequence.name)
    )
    try:
        data = query.all()
    except StatementError:  # Occurs when an id is not properly formatted
        raise WrongIdFormatException

    scenes = []
    for (scene_model, project_name, sequence_name) in data:
        scene = scene_model.serialize(obj_type="Scene")
        scene["project_name"] = project_name
        scene["sequence_name"] = sequence_name
        scenes.append(scene)

    return scenes
Beispiel #6
0
 def add_project_permission_filter(self, query):
     if permissions.has_vendor_permissions():
         query = query.filter(user_service.build_assignee_filter())
     elif not permissions.has_admin_permissions():
         query = query.join(Project) \
             .filter(user_service.build_related_projects_filter())
     return query
Beispiel #7
0
def get_sequences_for_episode(episode_id, only_assigned=False):
    """
    Retrieve all sequences related to given episode.
    """
    if only_assigned:
        Shot = aliased(Entity, name="shot")
        query = (Entity.query.join(Shot, Entity.id == Shot.parent_id).join(
            Task, Shot.id == Task.entity_id).filter(
                Entity.parent_id == episode_id).filter(
                    user_service.build_assignee_filter()))
        return fields.serialize_models(query.all())
    else:
        return get_episodes({"parent_id": episode_id})
Beispiel #8
0
def get_assets(criterions={}):
    """
    Get all assets for given criterions.
    """
    query = Entity.query.filter(build_asset_type_filter())
    assigned_to = False
    if "assigned_to" in criterions:
        assigned_to = True
        del criterions["assigned_to"]
    query = query_utils.apply_criterions_to_db_query(Entity, query, criterions)
    if assigned_to:
        query = query.outerjoin(Task)
        query = query.filter(user_service.build_assignee_filter())
    result = query.all()
    return EntityType.serialize_list(result, obj_type="Asset")
Beispiel #9
0
def get_sequences_for_project(project_id, only_assigned=False):
    """
    Retrieve all sequences related to given project.
    """
    if only_assigned:
        Shot = aliased(Entity, name="shot")
        query = (Entity.query.join(Shot, Entity.id == Shot.parent_id).join(
            Task, Shot.id == Task.entity_id).filter(
                Entity.project_id == project_id).filter(
                    user_service.build_assignee_filter()))
        return fields.serialize_models(query.all())
    else:
        return entities_service.get_entities_for_project(
            project_id,
            get_sequence_type()["id"], "Sequence")
Beispiel #10
0
def get_entities_for_project(project_id,
                             entity_type_id,
                             obj_type="Entity",
                             only_assigned=False):
    """
    Retrieve all entities related to given project of which entity is entity
    type.
    """
    from zou.app.services import user_service
    query = (Entity.query.filter(
        Entity.entity_type_id == entity_type_id).filter(
            Entity.project_id == project_id).order_by(Entity.name))
    if only_assigned:
        query = query \
            .outerjoin(Task) \
            .filter(user_service.build_assignee_filter())
    result = query.all()
    return Entity.serialize_list(result, obj_type=obj_type)
Beispiel #11
0
def _get_retake_stats_query(project_id, only_assigned):
    Sequence = aliased(Entity, name="sequence")
    Episode = aliased(Entity, name="episode")
    query = (Task.query.with_entities(
        Episode.id,
        Entity.nb_frames,
        Task.task_type_id,
        Task.retake_count,
        TaskStatus.is_done,
        TaskStatus.is_retake,
    ).join(Project, Project.id == Task.project_id).join(
        Entity, Entity.id == Task.entity_id).join(
            Sequence, Sequence.id == Entity.parent_id).join(
                Episode, Episode.id == Sequence.parent_id).join(
                    TaskStatus, TaskStatus.id == Task.task_status_id).filter(
                        Project.id == project_id))
    if only_assigned:
        query = query.filter(user_service.build_assignee_filter())
    return query
Beispiel #12
0
def get_episode_stats_for_project(project_id, only_assigned=False):
    """
    Retrieve number of tasks by status, task_types and episodes
    for given project.
    """
    Sequence = aliased(Entity, name="sequence")
    Episode = aliased(Entity, name="episode")
    query = (
        Task.query.with_entities(
            Task.project_id,
            Episode.id,
            Task.task_type_id,
            Task.task_status_id,
            TaskStatus.short_name,
            TaskStatus.color,
        )
        .filter(Task.project_id == project_id)
        .join(Project, Project.id == Task.project_id)
        .join(TaskStatus, TaskStatus.id == Task.task_status_id)
        .join(Entity, Entity.id == Task.entity_id)
        .join(Sequence, Sequence.id == Entity.parent_id)
        .join(Episode, Episode.id == Sequence.parent_id)
        .group_by(
            Task.project_id,
            Episode.id,
            Task.task_type_id,
            Task.task_status_id,
            TaskStatus.short_name,
            TaskStatus.color,
        )
        .add_columns(func.count(Task.id))
        .add_columns(func.sum(Entity.nb_frames))
    )

    if only_assigned:
        query = query.filter(user_service.build_assignee_filter())

    results = {}
    for data in query.all():
        add_entry_to_stats(results, *data)
        add_entry_to_all_stats(results, *data)
    return results
Beispiel #13
0
def get_assets(criterions={}):
    """
    Get all assets for given criterions.
    """
    query = Entity.query.filter(build_asset_type_filter())
    assigned_to = False
    episode_id = None
    if "assigned_to" in criterions:
        assigned_to = True
        del criterions["assigned_to"]
    if "episode_id" in criterions:
        episode_id = criterions["episode_id"]
        del criterions["episode_id"]
    query = query_utils.apply_criterions_to_db_query(Entity, query, criterions)
    if assigned_to:
        query = query.outerjoin(Task)
        query = query.filter(user_service.build_assignee_filter())

    if episode_id is not None:
        # Filter based on main episode.
        query = query.filter(Entity.source_id == episode_id)
        result = query.all()
        # Filter based on episode casting.
        query = (
            Entity.query.join(
                EntityLink, EntityLink.entity_out_id == Entity.id
            )
            .filter(EntityLink.entity_in_id == episode_id)
            .filter(build_asset_type_filter())
        )
        query = query_utils.apply_criterions_to_db_query(
            Entity, query, criterions
        )
        # Add non duplicated assets to the list.
        result += [a for a in query.all() if a.source_id != episode_id]
    else:
        result = query.all()
    return EntityType.serialize_list(result, obj_type="Asset")
Beispiel #14
0
    def all_entries(self, query=None, relations=False):
        """
        If the user has at least manager permissions, return all previews.
        If he's a vendor, return only previews for the tasks he's assigned to.
        If he's an artist, return only previews for projects he's a part of.
        """
        if query is None:
            query = self.model.query

        if permissions.has_admin_permissions():
            pass
        elif permissions.has_vendor_permissions():
            query = (PreviewFile.query.join(Task).filter(
                user_service.build_assignee_filter()).filter(
                    user_service.build_open_project_filter()).filter(
                        Task.id == PreviewFile.task_id))
        else:
            query = (PreviewFile.query.join(Task, Project).filter(
                user_service.build_related_projects_filter()).filter(
                    user_service.build_open_project_filter()))

        previews = query.all()
        return self.model.serialize_list(previews, relations=relations)
Beispiel #15
0
def get_shots_and_tasks(criterions={}):
    """
    Get all shots for given criterions with related tasks for each shot.
    """
    shot_type = get_shot_type()
    shot_map = {}
    task_map = {}

    Sequence = aliased(Entity, name="sequence")
    Episode = aliased(Entity, name="episode")

    query = (
        Entity.query.join(Project)
        .join(Sequence, Sequence.id == Entity.parent_id)
        .outerjoin(Episode, Episode.id == Sequence.parent_id)
        .outerjoin(Task, Task.entity_id == Entity.id)
        .outerjoin(assignees_table)
        .add_columns(
            Episode.name,
            Episode.id,
            Sequence.name,
            Sequence.id,
            Task.id,
            Task.task_type_id,
            Task.task_status_id,
            Task.priority,
            Task.estimation,
            Task.duration,
            Task.retake_count,
            Task.real_start_date,
            Task.end_date,
            Task.start_date,
            Task.due_date,
            Task.last_comment_date,
            assignees_table.columns.person,
            Project.id,
            Project.name,
        )
        .filter(Entity.entity_type_id == shot_type["id"])
    )
    if "id" in criterions:
        query = query.filter(Entity.id == criterions["id"])

    if "project_id" in criterions:
        query = query.filter(Entity.project_id == criterions["project_id"])

    if "episode_id" in criterions:
        query = query.filter(Sequence.parent_id == criterions["episode_id"])

    if "assigned_to" in criterions:
        query = query.filter(user_service.build_assignee_filter())
        del criterions["assigned_to"]

    for (
        shot,
        episode_name,
        episode_id,
        sequence_name,
        sequence_id,
        task_id,
        task_type_id,
        task_status_id,
        task_priority,
        task_estimation,
        task_duration,
        task_retake_count,
        task_real_start_date,
        task_end_date,
        task_start_date,
        task_due_date,
        task_last_comment_date,
        person_id,
        project_id,
        project_name,
    ) in query.all():
        shot_id = str(shot.id)

        shot.data = shot.data or {}

        if shot_id not in shot_map:

            shot_map[shot_id] = fields.serialize_dict(
                {
                    "canceled": shot.canceled,
                    "data": shot.data,
                    "description": shot.description,
                    "entity_type_id": shot.entity_type_id,
                    "episode_id": episode_id,
                    "episode_name": episode_name or "",
                    "fps": shot.data.get("fps", None),
                    "frame_in": shot.data.get("frame_in", None),
                    "frame_out": shot.data.get("frame_out", None),
                    "id": shot.id,
                    "name": shot.name,
                    "nb_frames": shot.nb_frames,
                    "parent_id": shot.parent_id,
                    "preview_file_id": shot.preview_file_id or None,
                    "project_id": project_id,
                    "project_name": project_name,
                    "sequence_id": sequence_id,
                    "sequence_name": sequence_name,
                    "source_id": shot.source_id,
                    "tasks": [],
                    "type": "Shot",
                }
            )

        if task_id is not None:
            if task_id not in task_map:
                task_dict = fields.serialize_dict(
                    {
                        "id": task_id,
                        "entity_id": shot_id,
                        "task_status_id": task_status_id,
                        "task_type_id": task_type_id,
                        "priority": task_priority or 0,
                        "estimation": task_estimation,
                        "duration": task_duration,
                        "retake_count": task_retake_count,
                        "real_start_date": task_real_start_date,
                        "end_date": task_end_date,
                        "start_date": task_start_date,
                        "due_date": task_due_date,
                        "last_comment_date": task_last_comment_date,
                        "assignees": [],
                    }
                )
                task_map[task_id] = task_dict
                shot_dict = shot_map[shot_id]
                shot_dict["tasks"].append(task_dict)

            if person_id:
                task_map[task_id]["assignees"].append(str(person_id))

    return list(shot_map.values())
Beispiel #16
0
def get_assets_and_tasks(criterions={}, page=1):
    """
    Get all assets for given criterions with related tasks for each asset.
    """
    asset_map = {}
    task_map = {}

    query = (Entity.query.filter(build_asset_type_filter()).join(
        EntityType).outerjoin(Task).outerjoin(assignees_table).add_columns(
            EntityType.name,
            Task.id,
            Task.task_type_id,
            Task.task_status_id,
            Task.priority,
            Task.estimation,
            Task.duration,
            Task.retake_count,
            Task.real_start_date,
            Task.end_date,
            Task.start_date,
            Task.due_date,
            Task.last_comment_date,
            assignees_table.columns.person,
        ).order_by(EntityType.name, Entity.name))

    if "id" in criterions:
        query = query.filter(Entity.id == criterions["id"])

    if "project_id" in criterions:
        query = query.filter(Entity.project_id == criterions["project_id"])

    if "episode_id" in criterions:
        if criterions["episode_id"] == "main":
            query = query.filter(Entity.source_id == None)
        elif criterions["episode_id"] != "all":
            query = query.filter(Entity.source_id == criterions["episode_id"])

    if "assigned_to" in criterions:
        query = query.filter(user_service.build_assignee_filter())
        del criterions["assigned_to"]

    for (
            asset,
            entity_type_name,
            task_id,
            task_type_id,
            task_status_id,
            task_priority,
            task_estimation,
            task_duration,
            task_retake_count,
            task_real_start_date,
            task_end_date,
            task_start_date,
            task_due_date,
            task_last_comment_date,
            person_id,
    ) in query.all():

        if asset.source_id is None:
            source_id = ""
        else:
            source_id = str(asset.source_id)

        if asset.id not in asset_map:
            asset_map[asset.id] = {
                "id": str(asset.id),
                "name": asset.name,
                "preview_file_id": str(asset.preview_file_id or ""),
                "description": asset.description,
                "asset_type_name": entity_type_name,
                "asset_type_id": str(asset.entity_type_id),
                "canceled": asset.canceled,
                "episode_id": source_id,
                "data": fields.serialize_value(asset.data),
                "tasks": [],
            }

        if task_id is not None:
            if task_id not in task_map:
                task_dict = {
                    "id":
                    str(task_id),
                    "entity_id":
                    str(asset.id),
                    "task_status_id":
                    str(task_status_id),
                    "task_type_id":
                    str(task_type_id),
                    "priority":
                    task_priority or 0,
                    "estimation":
                    task_estimation,
                    "duration":
                    task_duration,
                    "retake_count":
                    task_retake_count,
                    "real_start_date":
                    fields.serialize_value(task_real_start_date),
                    "end_date":
                    fields.serialize_value(task_end_date),
                    "start_date":
                    fields.serialize_value(task_start_date),
                    "due_date":
                    fields.serialize_value(task_due_date),
                    "last_comment_date":
                    fields.serialize_value(task_last_comment_date),
                    "assignees": [],
                }
                task_map[task_id] = task_dict
                asset_dict = asset_map[asset.id]
                asset_dict["tasks"].append(task_dict)

            if person_id:
                task_map[task_id]["assignees"].append(str(person_id))

    return list(asset_map.values())
Beispiel #17
0
def get_assets_and_tasks(criterions={}, page=1, with_episode_ids=False):
    """
    Get all assets for given criterions with related tasks for each asset.
    """
    asset_map = {}
    task_map = {}

    Episode = aliased(Entity, name="episode")

    query = (
        Entity.query.filter(build_asset_type_filter())
        .join(EntityType, Entity.entity_type_id == EntityType.id)
        .outerjoin(Task)
        .outerjoin(assignees_table)
    )

    tasks_query = query.add_columns(
        EntityType.name,
        Task.id,
        Task.task_type_id,
        Task.task_status_id,
        Task.priority,
        Task.estimation,
        Task.duration,
        Task.retake_count,
        Task.real_start_date,
        Task.end_date,
        Task.start_date,
        Task.due_date,
        Task.last_comment_date,
        assignees_table.columns.person,
    ).order_by(EntityType.name, Entity.name)

    if "id" in criterions:
        tasks_query = tasks_query.filter(Entity.id == criterions["id"])

    if "project_id" in criterions:
        tasks_query = tasks_query.filter(
            Entity.project_id == criterions["project_id"]
        )

    if "episode_id" in criterions:
        episode_id = criterions["episode_id"]
        if episode_id == "main":
            tasks_query = tasks_query.filter(Entity.source_id == None)
        elif episode_id != "all":

            tasks_query = tasks_query.outerjoin(
                EntityLink, EntityLink.entity_out_id == Entity.id
            )
            tasks_query = tasks_query.filter(
                or_(
                    Entity.source_id == episode_id,
                    EntityLink.entity_in_id == episode_id,
                )
            )

    if "assigned_to" in criterions:
        tasks_query = tasks_query.filter(user_service.build_assignee_filter())
        del criterions["assigned_to"]

    cast_in_episode_ids = {}
    if "project_id" in criterions or with_episode_ids:
        episode_links_query = (
            EntityLink.query.join(
                Episode, EntityLink.entity_in_id == Episode.id
            )
            .join(EntityType, EntityType.id == Episode.entity_type_id)
            .filter(EntityType.name == "Episode")
            .order_by(Episode.name)
        )

        if "project_id" in criterions:
            episode_links_query = episode_links_query.filter(
                Episode.project_id == criterions["project_id"]
            )
        for link in episode_links_query.all():
            if str(link.entity_out_id) not in cast_in_episode_ids:
                cast_in_episode_ids[str(link.entity_out_id)] = []
            cast_in_episode_ids[str(link.entity_out_id)].append(
                str(link.entity_in_id)
            )

    for (
        asset,
        entity_type_name,
        task_id,
        task_type_id,
        task_status_id,
        task_priority,
        task_estimation,
        task_duration,
        task_retake_count,
        task_real_start_date,
        task_end_date,
        task_start_date,
        task_due_date,
        task_last_comment_date,
        person_id,
    ) in tasks_query.all():

        if asset.source_id is None:
            source_id = ""
        else:
            source_id = str(asset.source_id)

        asset_id = str(asset.id)

        if asset_id not in asset_map:
            asset_map[asset_id] = {
                "id": asset_id,
                "name": asset.name,
                "preview_file_id": str(asset.preview_file_id or ""),
                "description": asset.description,
                "asset_type_name": entity_type_name,
                "asset_type_id": str(asset.entity_type_id),
                "canceled": asset.canceled,
                "ready_for": str(asset.ready_for),
                "episode_id": source_id,
                "casting_episode_ids": cast_in_episode_ids.get(asset_id, []),
                "is_casting_standby": asset.is_casting_standby,
                "data": fields.serialize_value(asset.data),
                "tasks": [],
            }

        if task_id is not None:
            if task_id not in task_map:
                task_dict = {
                    "id": str(task_id),
                    "entity_id": asset_id,
                    "task_status_id": str(task_status_id),
                    "task_type_id": str(task_type_id),
                    "priority": task_priority or 0,
                    "estimation": task_estimation,
                    "duration": task_duration,
                    "retake_count": task_retake_count,
                    "real_start_date": fields.serialize_value(
                        task_real_start_date
                    ),
                    "end_date": fields.serialize_value(task_end_date),
                    "start_date": fields.serialize_value(task_start_date),
                    "due_date": fields.serialize_value(task_due_date),
                    "last_comment_date": fields.serialize_value(
                        task_last_comment_date
                    ),
                    "assignees": [],
                }
                task_map[task_id] = task_dict
                asset_dict = asset_map[asset_id]
                asset_dict["tasks"].append(task_dict)

            if person_id:
                task_map[task_id]["assignees"].append(str(person_id))

    return list(asset_map.values())