Example #1
0
def get_or_create_episode(project_id, name):
    episode_type = get_episode_type()
    episode = Entity.get_by(entity_type_id=episode_type["id"],
                            project_id=project_id,
                            name=name)
    if episode is None:
        episode = Entity(entity_type_id=episode_type["id"],
                         project_id=project_id,
                         name=name)
        episode.save()
    return episode.serialize()
Example #2
0
 def test_get_project_and_type_assets(self):
     entity_type = EntityType(name="VFX")
     entity_type.save()
     entity = Entity(name="Smoke",
                     entity_type_id=entity_type.id,
                     project_id=self.project.id)
     entity.save()
     path_ids = (self.project.id, self.entity_type.id)
     path = "data/projects/%s/asset_types/%s/assets" % path_ids
     assets = self.get(path)
     self.assertEquals(len(assets), 1)
     self.assertDictEqual(assets[0], self.entity_dict)
Example #3
0
def get_or_create_sequence(project_id, episode_id, name):
    sequence_type = get_sequence_type()
    sequence = Entity.get_by(entity_type_id=sequence_type["id"],
                             parent_id=episode_id,
                             project_id=project_id,
                             name=name)
    if sequence is None:
        sequence = Entity(entity_type_id=sequence_type["id"],
                          parent_id=episode_id,
                          project_id=project_id,
                          name=name)
        sequence.save()
    return sequence.serialize()
Example #4
0
def create_asset(project, asset_type, name, description):
    name = name.capitalize()
    asset = Entity(project_id=project.id,
                   entity_type_id=asset_type.id,
                   name=name,
                   description=description)
    asset.save()
    events.emit(
        "asset:new", {
            "asset": asset.serialize(),
            "asset_type": asset_type.serialize(),
            "project": project.serialize()
        })
    return asset
Example #5
0
def get_or_create_episode(project_id, name):
    """
    Retrieve episode matching given project and name or create it.
    """
    episode_type = get_episode_type()
    episode = Entity.get_by(
        entity_type_id=episode_type["id"], project_id=project_id, name=name
    )
    if episode is None:
        episode = Entity(
            entity_type_id=episode_type["id"], project_id=project_id, name=name
        )
        episode.save()
    return episode.serialize()
Example #6
0
 def save_entity(self, data):
     entity = None
     try:
         entity = assets_service.get_raw_asset_by_shotgun_id(
             data["shotgun_id"])
         entity.update(data)
         current_app.logger.info("Entity updated: %s" % entity)
     except AssetNotFoundException:
         if data.get("entity_type_id", None) is not None:
             entity = Entity(**data)
             entity.save()
             current_app.logger.info("Entity created: %s" % entity)
         else:
             current_app.logger.info("Entity ignored: %s" % data["name"])
     return entity
Example #7
0
    def import_entry(self, data):
        episode = Entity.get_by(shotgun_id=data["shotgun_id"],
                                entity_type_id=self.episode_type["id"])

        if episode is None:
            episode = Entity(**data)
            episode.save()
            current_app.logger.info("Episode created: %s" % episode)

        else:
            episode.update(data)
            episode.save()
            current_app.logger.info("Episode updated: %s" % episode)

        return episode
Example #8
0
    def import_entry(self, data):
        sequence = Entity.get_by(shotgun_id=data["shotgun_id"],
                                 entity_type_id=self.sequence_type["id"])

        if sequence is None:
            sequence = Entity(**data)
            sequence.save()
            current_app.logger.info("Sequence created: %s" % sequence)

        else:
            sequence.update(data)
            sequence.save()
            current_app.logger.info("Sequence updated: %s" % sequence)

        return sequence
Example #9
0
    def save_entity(self, data):
        entity = None
        entities = asset_info.get_assets({"shotgun_id": data["shotgun_id"]})
        if len(entities) > 0:
            entity = entities[0]

        if entity is None:
            entity = Entity(**data)
            entity.save()
            current_app.logger.info("Entity created: %s" % entity)
        else:
            entity.update(data)
            current_app.logger.info("Entity updated: %s" % entity)

        return entity
Example #10
0
    def import_entry(self, data):
        scene = Entity.get_by(
            shotgun_id=data["shotgun_id"],
            entity_type_id=shots_service.get_scene_type()["id"])

        if scene is None:
            scene = Entity(**data)
            scene.save()
            current_app.logger.info("Scene created: %s" % scene)

        else:
            scene.update(data)
            scene.save()
            current_app.logger.info("Scene updated: %s" % scene)

        return scene
Example #11
0
def get_or_create_sequence(project_id, episode_id, name):
    """
    Retrieve sequence matching given project, episode and name or create it.
    """
    sequence_type = get_sequence_type()
    sequence = Entity.get_by(entity_type_id=sequence_type["id"],
                             parent_id=episode_id,
                             project_id=project_id,
                             name=name)
    if sequence is None:
        sequence = Entity(entity_type_id=sequence_type["id"],
                          parent_id=episode_id,
                          project_id=project_id,
                          name=name)
        sequence.save()
    return sequence.serialize()
Example #12
0
def create_asset(project_id, asset_type_id, name, description, data):
    project = projects_service.get_project_raw(project_id)
    asset_type = get_asset_type_raw(asset_type_id)

    asset = Entity(project_id=project_id,
                   entity_type_id=asset_type_id,
                   name=name,
                   description=description,
                   data=data)
    asset.save()
    asset_dict = asset.serialize(obj_type="Asset")
    events.emit(
        "asset:new", {
            "asset": asset_dict,
            "asset_type": asset_type.serialize(obj_type="AssetType"),
            "project": project.serialize()
        })
    return asset_dict
Example #13
0
    def import_entry(self, data):
        shot = Entity.get_by(shotgun_id=data["shotgun_id"],
                             entity_type_id=shot_info.get_shot_type().id)

        if shot is None:
            shot = Entity(**data)
            shot.save()
            current_app.logger.info("Shot created: %s" % shot)

        else:
            if shot.data is None:
                shot.data = {}
            shot.update(data)
            shot.data.update(data["data"])
            shot.save()

            current_app.logger.info("Shot updated: %s" % shot)

        return shot
Example #14
0
    def import_entry(self, data):
        sequence = Entity.get_by(
            shotgun_id=data["shotgun_id"],
            entity_type_id=self.sequence_type["id"],
        )

        similar_sequence = Entity.get_by(
            name=data["name"],
            parent_id=data["parent_id"],
            project_id=data["project_id"],
            entity_type_id=self.sequence_type["id"],
        )

        if sequence is None and similar_sequence is None:
            sequence = Entity(**data)
            sequence.save()
            current_app.logger.info("Sequence created: %s" % sequence)

        elif sequence is not None:
            if similar_sequence is None:
                sequence.update(data)
                sequence.save()
            else:
                sequence.update(
                    {
                        "description": data["description"],
                        "shotgun_id": data["shotgun_id"],
                    }
                )
                sequence.save()
            current_app.logger.info("Sequence updated: %s" % sequence)

        return sequence
Example #15
0
    def import_entry(self, data):
        sequence = Entity.get_by(shotgun_id=data["shotgun_id"],
                                 entity_type_id=self.sequence_type["id"])

        if sequence is None:
            sequence = Entity(**data)
            sequence.save()
            current_app.logger.info("Sequence created: %s" % sequence)

        else:
            # Little hack to avoid integrity errors due to
            # duplicated data.
            similar_sequence = Entity.get_by(
                name=data["name"],
                parent_id=data["parent_id"],
                project_id=data["project_id"],
                entity_type_id=self.sequence_type["id"])

            if similar_sequence is None:
                sequence.update(data)
                sequence.save()
            else:
                sequence.update({
                    "description": data["description"],
                    "shotgun_id": data["shotgun_id"]
                })
                sequence.save()
            current_app.logger.info("Sequence updated: %s" % sequence)

        return sequence
Example #16
0
class FileTreeTestCase(ApiDBTestCase):
    def setUp(self):
        super(FileTreeTestCase, self).setUp()
        self.generate_fixture_project_status()
        self.generate_fixture_project()
        self.generate_fixture_project_standard()
        self.generate_fixture_entity_type()
        self.generate_fixture_entity()
        self.generate_fixture_sequence()
        self.generate_fixture_shot()
        self.generate_fixture_sequence_standard()
        self.generate_fixture_shot_standard()
        self.generate_fixture_person()
        self.generate_fixture_department()
        self.generate_fixture_task_type()
        self.generate_fixture_task_status()
        self.generate_fixture_assigner()
        self.generate_fixture_task()
        self.generate_fixture_shot_task()
        self.generate_fixture_shot_task_standard()
        self.entity_standard = Entity(name='Car',
                                      project_id=self.project_standard.id,
                                      entity_type_id=self.entity_type.id)
        self.entity_standard.save()
        self.sequence_standard = Entity(name='Seq1',
                                        project_id=self.project.id,
                                        entity_type_id=self.sequence_type.id)
        self.sequence_standard.save()
        self.shot_standard = Entity(name='P001',
                                    project_id=self.project_standard.id,
                                    entity_type_id=self.shot_type.id,
                                    parent_id=self.sequence_standard.id)
        self.shot_standard.save()

    def test_get_tree_from_file(self):
        simple_tree = file_tree.get_tree_from_file("simple")
        self.assertIsNotNone(simple_tree["working"])

    def test_get_tree_from_project(self):
        simple_tree = file_tree.get_tree_from_project(self.project)
        self.assertIsNotNone(simple_tree["working"])

    def test_join_path(self):
        self.assertEqual(file_tree.join_path("", "PROD"), "PROD")
        self.assertEqual(file_tree.join_path("ROOT", "PROD"), "ROOT/PROD")
        self.assertEqual(file_tree.join_path("ROOT", "PROD", "\\"),
                         "ROOT\\PROD")

    def test_get_root_path(self):
        tree = file_tree.get_tree_from_file("simple")
        path = file_tree.get_root_path(tree, "working", "/")
        self.assertEqual(path, "/simple/productions/")

    def test_get_file_name_root_standard(self):
        tree = file_tree.get_tree_from_file("standard")
        file_name = file_tree.get_file_name_root(tree, "working", self.shot,
                                                 self.shot_task)
        self.assertEqual(file_name, "cosmos_landromat_s01_p01_animation")

    def test_add_version_suffix_to_file_name(self):
        file_name = "COSMOS_LANDROMAT_S01_P01"
        file_name = file_tree.add_version_suffix_to_file_name(file_name, 3)
        self.assertEqual(file_name, "COSMOS_LANDROMAT_S01_P01_v003")

    def test_add_comment_suffix_to_file_name(self):
        file_name = "COSMOS_LANDROMAT_S01_P01"
        file_name = file_tree.add_comment_suffix_to_file_name(
            file_name, "comment")
        self.assertEqual(file_name, "COSMOS_LANDROMAT_S01_P01_comment")

    def test_get_project(self):
        project = file_tree.get_project(self.entity)
        self.assertEqual(project, self.project)

    def test_get_file_name_template(self):
        tree = file_tree.get_tree_from_file("standard")
        template = file_tree.get_file_name_template(tree, "working", self.shot)
        self.assertEqual(template, tree["working"]["file_name"]["shot"])
        template = file_tree.get_file_name_template(tree, "working",
                                                    self.entity)
        self.assertEqual(template, tree["working"]["file_name"]["asset"])

    def test_get_folder_path_template(self):
        tree = file_tree.get_tree_from_file("simple")
        template = file_tree.get_folder_path_template(tree, "working",
                                                      self.shot)
        self.assertEqual(template, tree["working"]["folder_path"]["shot"])
        template = file_tree.get_folder_path_template(tree, "working",
                                                      self.entity)
        self.assertEqual(template, tree["working"]["folder_path"]["asset"])

    def test_get_folder_from_datatype_project(self):
        path = file_tree.get_folder_from_datatype("Project", self.shot,
                                                  self.shot_task)
        self.assertEquals(path, self.project.name)

    def test_get_folder_from_datatype_shot(self):
        path = file_tree.get_folder_from_datatype("Shot", self.shot,
                                                  self.shot_task)
        self.assertEquals(path, self.shot.name)

    def test_get_folder_from_datatype_sequence(self):
        path = file_tree.get_folder_from_datatype("Sequence", self.shot,
                                                  self.shot_task)
        self.assertEquals(path, self.sequence.name)

    def test_get_folder_from_datatype_asset(self):
        path = file_tree.get_folder_from_datatype("Asset", self.entity,
                                                  self.task)
        self.assertEquals(path, self.entity.name)

    def test_get_folder_from_datatype_asset_type(self):
        path = file_tree.get_folder_from_datatype("AssetType", self.entity,
                                                  self.task)
        self.assertEquals(path, self.entity_type.name)

    def test_get_folder_from_datatype_department(self):
        path = file_tree.get_folder_from_datatype("Department", self.entity,
                                                  self.task)
        self.assertEquals(path, self.department.name)

    def test_get_folder_from_datatype_task(self):
        path = file_tree.get_folder_from_datatype("Task", self.entity,
                                                  self.task)
        self.assertEquals(path, self.task.name)

    def test_get_folder_from_datatype_task_type(self):
        path = file_tree.get_folder_from_datatype("TaskType", self.entity,
                                                  self.task)
        self.assertEquals(path, self.task_type.name)

    def test_get_folder_raise_exception(self):
        self.assertRaises(MalformedFileTreeException,
                          file_tree.get_folder_from_datatype, "Unknown",
                          self.entity, self.task)

    def test_get_folder_path_shot(self):
        path = file_tree.get_folder_path(self.shot_task, mode="working")
        self.assertEquals(
            path,
            "/simple/productions/cosmos_landromat/shots/s01/p01/animation")

    def test_get_folder_path_with_separator(self):
        path = file_tree.get_folder_path(self.shot_task,
                                         mode="working",
                                         sep="/")
        self.assertEquals(
            path,
            "/simple/productions/cosmos_landromat/shots/s01/p01/animation")

    def test_get_folder_path_asset(self):
        path = file_tree.get_folder_path(self.task, mode="working")
        self.assertEquals(
            path,
            "/simple/productions/cosmos_landromat/assets/props/tree/shaders")

    def test_get_file_name_asset(self):
        file_name = file_tree.get_file_name(self.task,
                                            mode="working",
                                            version=3)
        self.assertEquals(file_name,
                          "cosmos_landromat_props_tree_shaders_v003")

    def test_get_file_name_shot(self):
        file_name = file_tree.get_file_name(self.shot_task,
                                            mode="working",
                                            version=3)
        self.assertEquals(file_name, "cosmos_landromat_s01_p01_animation_v003")

    def test_get_file_path_asset(self):
        file_name = file_tree.get_file_path(self.task, version=3)
        self.assertEquals(
            file_name,
            "/simple/productions/cosmos_landromat/assets/props/tree/shaders/"
            "cosmos_landromat_props_tree_shaders_v003")

    def test_get_file_name_comment(self):
        file_name = file_tree.get_file_name(self.task,
                                            mode="working",
                                            version=3,
                                            comment="My comment")
        self.assertEquals(
            file_name, "cosmos_landromat_props_tree_shaders_v003_my_comment")

    def test_change_folder_path_separators(self):
        result = file_tree.change_folder_path_separators(
            "/simple/big_buck_bunny/props", "\\")
        self.assertEqual(result, "\\simple\\big_buck_bunny\\props")

    def test_update_variable(self):
        name = file_tree.update_variable("<AssetType>_<Asset>", self.entity,
                                         self.task)
        self.assertEquals(name, "props_tree")

    def test_apply_style(self):
        file_name = "Shaders"
        result = file_tree.apply_style(file_name, "uppercase")
        self.assertEqual(result, "SHADERS")
        result = file_tree.apply_style(file_name, "lowercase")
        self.assertEqual(result, "shaders")
Example #17
0
class ApiDBTestCase(ApiTestCase):
    def setUp(self):
        """
        Reset database before each test.
        """
        super(ApiDBTestCase, self).setUp()

        from zou.app.utils import dbhelpers
        dbhelpers.drop_all()
        dbhelpers.create_all()
        self.log_in()

    def log_in(self):
        self.generate_fixture_user()
        self.post("auth/login", {
            "email": self.user.email,
            "password": "******"
        }, 200)

    def tearDown(self):
        """
        Delete database after each test.
        """
        from zou.app.utils import dbhelpers
        dbhelpers.drop_all()

    def generate_data(self, cls, number, **kwargs):
        """
        Generate random data for a given data model.
        """
        mixer.init_app(self.flask_app)
        return mixer.cycle(number).blend(cls, id=fields.gen_uuid, **kwargs)

    def generate_fixture_project_status(self):
        self.open_status = ProjectStatus(name="open", color="#FFFFFF")
        self.open_status.save()

    def generate_fixture_project_closed_status(self):
        self.closed_status = ProjectStatus(name="closed", color="#FFFFFF")
        self.closed_status.save()

    def generate_fixture_project(self):
        self.project = Project(name="Cosmos Landromat",
                               project_status_id=self.open_status.id)
        self.project.save()
        self.project.update(
            {"file_tree": file_tree.get_tree_from_file("simple")})

    def generate_fixture_project_closed(self):
        self.project_closed = Project(name="Old Project",
                                      project_status_id=self.closed_status.id)
        self.project_closed.save()

    def generate_fixture_project_standard(self):
        self.project_standard = Project(name="Big Buck Bunny",
                                        project_status_id=self.open_status.id)
        self.project_standard.save()
        self.project_standard.update(
            {"file_tree": file_tree.get_tree_from_file("standard")})

    def generate_fixture_entity(self):
        self.entity = Entity(name="Tree",
                             description="Description Tree",
                             project_id=self.project.id,
                             entity_type_id=self.entity_type.id)
        self.entity.save()

    def generate_fixture_entity_standard(self):
        self.entity_standard = Entity(name="Car",
                                      project_id=self.project_standard.id,
                                      entity_type_id=self.entity_type.id)
        self.entity_standard.save()

    def generate_fixture_sequence(self):
        if hasattr(self, "episode"):
            episode_id = self.episode.id
        else:
            episode_id = None

        self.sequence = Entity(name="S01",
                               project_id=self.project.id,
                               entity_type_id=self.sequence_type.id,
                               parent_id=episode_id)
        self.sequence.save()

    def generate_fixture_sequence_standard(self):
        self.sequence_standard = Entity(name="S01",
                                        project_id=self.project_standard.id,
                                        entity_type_id=self.sequence_type.id)
        self.sequence_standard.save()

    def generate_fixture_episode(self):
        self.episode = Entity(name="E01",
                              project_id=self.project.id,
                              entity_type_id=self.episode_type.id)
        self.episode.save()

    def generate_fixture_shot(self):
        self.shot = Entity(name="P01",
                           description="Description Shot 01",
                           data={
                               "fps": 25,
                               "frame_in": 0,
                               "frame_out": 100
                           },
                           project_id=self.project.id,
                           entity_type_id=self.shot_type.id,
                           parent_id=self.sequence.id)
        self.shot.save()
        self.shot_noseq = Entity(name="P01NOSEQ",
                                 project_id=self.project.id,
                                 entity_type_id=self.shot_type.id)
        self.shot_noseq.save()

    def generate_fixture_shot_standard(self):
        self.shot_standard = Entity(name="P01",
                                    description="Description Shot 01",
                                    data={
                                        "fps": 25,
                                        "frame_in": 0,
                                        "frame_out": 100
                                    },
                                    project_id=self.project_standard.id,
                                    entity_type_id=self.shot_type.id,
                                    parent_id=self.sequence_standard.id)
        self.shot_standard.save()

    def generate_fixture_user(self):
        self.user = Person(first_name="John",
                           last_name="Did",
                           email=u"*****@*****.**",
                           password=auth.encrypt_password("mypassword"))
        self.user.save()

    def generate_fixture_person(self):
        self.person = Person(first_name="John",
                             last_name="Doe",
                             email=u"*****@*****.**",
                             password=auth.encrypt_password("mypassword"))
        self.person.save()

    def generate_fixture_entity_type(self):
        self.entity_type = EntityType(name="Props")
        self.entity_type.save()
        self.shot_type = EntityType(name="Shot")
        self.shot_type.save()
        self.sequence_type = EntityType(name="Sequence")
        self.sequence_type.save()
        self.episode_type = EntityType(name="Episode")
        self.episode_type.save()

    def generate_fixture_department(self):
        self.department = Department(name="Modeling", color="#FFFFFF")
        self.department.save()
        self.department_animation = Department(name="Animation",
                                               color="#FFFFFF")
        self.department_animation.save()

    def generate_fixture_task_type(self):
        self.task_type = TaskType(name="Shaders",
                                  color="#FFFFFF",
                                  department_id=self.department.id)
        self.task_type.save()
        self.task_type_animation = TaskType(
            name="Animation",
            color="#FFFFFF",
            department_id=self.department_animation.id)
        self.task_type_animation.save()

    def generate_fixture_task_status(self):
        self.task_status = TaskStatus(name="Open",
                                      short_name="opn",
                                      color="#FFFFFF")
        self.task_status.save()

    def generate_fixture_task_status_wip(self):
        self.task_status_wip = TaskStatus(name="WIP",
                                          short_name="wip",
                                          color="#FFFFFF")
        self.task_status_wip.save()

    def generate_fixture_task_status_to_review(self):
        self.task_status_to_review = TaskStatus(name="To review",
                                                short_name="pndng",
                                                color="#FFFFFF")
        self.task_status_to_review.save()

    def generate_fixture_assigner(self):
        self.assigner = Person(first_name="Ema", last_name="Peel")
        self.assigner.save()

    def generate_fixture_task(self):
        start_date = fields.get_date_object("2017-02-20")
        due_date = fields.get_date_object("2017-02-28")
        real_start_date = fields.get_date_object("2017-02-22")
        self.task = Task(name="Super modeling",
                         project_id=self.project.id,
                         task_type_id=self.task_type.id,
                         task_status_id=self.task_status.id,
                         entity_id=self.entity.id,
                         assignees=[self.person],
                         assigner_id=self.assigner.id,
                         duration=50,
                         estimation=40,
                         start_date=start_date,
                         due_date=due_date,
                         real_start_date=real_start_date)
        self.task.save()

    def generate_fixture_task_standard(self):
        start_date = fields.get_date_object("2017-02-20")
        due_date = fields.get_date_object("2017-02-28")
        real_start_date = fields.get_date_object("2017-02-22")
        self.task_standard = Task(name="Super modeling",
                                  project_id=self.project_standard.id,
                                  task_type_id=self.task_type.id,
                                  task_status_id=self.task_status.id,
                                  entity_id=self.entity_standard.id,
                                  assignees=[self.person],
                                  assigner_id=self.assigner.id,
                                  duration=50,
                                  estimation=40,
                                  start_date=start_date,
                                  due_date=due_date,
                                  real_start_date=real_start_date)
        self.task_standard.save()

    def generate_fixture_shot_task(self):
        self.shot_task = Task(
            name="Super animation",
            project_id=self.project.id,
            task_type_id=self.task_type_animation.id,
            task_status_id=self.task_status.id,
            entity_id=self.shot.id,
            assignees=[self.person],
            assigner_id=self.assigner.id,
        )
        self.shot_task.save()

    def generate_fixture_shot_task_standard(self):
        self.shot_task_standard = Task(
            name="Super animation",
            project_id=self.project_standard.id,
            task_type_id=self.task_type_animation.id,
            task_status_id=self.task_status.id,
            entity_id=self.shot_standard.id,
            assignees=[self.person],
            assigner_id=self.assigner.id)
        self.shot_task_standard.save()

    def generate_fixture_file_status(self):
        self.file_status = FileStatus(name="To review", color="#FFFFFF")
        self.file_status.save()

    def generate_fixture_working_file(self):
        self.working_file = WorkingFile(name="S01_P01_modeling",
                                        comment="",
                                        revision=1,
                                        task_id=self.task.id,
                                        entity_id=self.entity.id,
                                        person_id=self.person.id)
        self.working_file.save()

    def generate_fixture_shot_working_file(self):
        self.working_file = WorkingFile(name="S01_P01_animation",
                                        comment="",
                                        revision=1,
                                        task_id=self.task.id,
                                        entity_id=self.shot.id,
                                        person_id=self.person.id)
        self.working_file.save()

    def generate_fixture_output_file(self):
        self.output_file = OutputFile(comment="",
                                      revision=1,
                                      task_id=self.task.id,
                                      entity_id=self.entity.id,
                                      person_id=self.person.id,
                                      file_status_id=self.file_status.id)
        self.output_file.save()

    def get_fixture_file_path(self, relative_path):
        current_path = os.getcwd()
        file_path_fixture = os.path.join(current_path, "test", "fixtures",
                                         relative_path)
        return file_path_fixture
Example #18
0
class FileTreeTestCase(ApiDBTestCase):
    def setUp(self):
        super(FileTreeTestCase, self).setUp()
        self.generate_fixture_project_status()
        self.generate_fixture_project()
        self.generate_fixture_project_standard()
        self.generate_fixture_entity_type()
        self.generate_fixture_entity()
        self.generate_fixture_entity_standard()
        self.generate_fixture_episode()
        self.generate_fixture_sequence()
        self.generate_fixture_shot()
        self.generate_fixture_sequence_standard()
        self.generate_fixture_shot_standard()
        self.generate_fixture_person()
        self.generate_fixture_department()
        self.generate_fixture_task_type()
        self.generate_fixture_task_status()
        self.generate_fixture_assigner()
        self.generate_fixture_task()
        self.generate_fixture_task_standard()
        self.generate_fixture_shot_task()
        self.generate_fixture_shot_task_standard()
        self.sequence_standard = Entity(name='Seq1',
                                        project_id=self.project.id,
                                        entity_type_id=self.sequence_type.id)
        self.sequence_standard.save()
        self.shot_standard = Entity(name='P001',
                                    project_id=self.project_standard.id,
                                    entity_type_id=self.shot_type.id,
                                    parent_id=self.sequence_standard.id)
        self.shot_standard.save()

    def test_get_shot_path_template(self):
        tree = file_tree.get_tree_from_project(self.project)
        path = file_tree.get_shot_path_template(tree)
        self.assertEqual(path, "<Project>/shots/<Sequence>/<Shot>/<TaskType>")

    def test_get_shot_template_folders(self):
        folders = file_tree.get_shot_template_folders(self.project)
        self.assertEqual(
            folders,
            [u"<Project>", u"shots", u"<Sequence>", u"<Shot>", u"<TaskType>"])

    def test_get_path_folders(self):
        folders = file_tree.get_path_folders(
            self.project,
            "/simple/productions/the_crew/shots/s01/p01/animation")
        self.assertEqual(folders,
                         ["the_crew", "shots", "s01", "p01", "animation"])

    def test_guess_shot(self):
        shot = file_tree.guess_shot(self.project, "E01", "S01", "P01")
        self.assertEqual(shot.id, self.shot.id)

    def test_guess_asset(self):
        asset = file_tree.guess_asset(self.project, "Props", "Tree")
        self.assertEqual(asset.id, self.entity.id)

    def test_guess_task_type(self):
        task_type = file_tree.guess_task_type("Modeling", "Shaders")
        self.assertEqual(task_type.id, self.task_type.id)

    def test_guess_task(self):
        task = file_tree.guess_task(self.entity, self.task_type,
                                    "Super modeling")
        self.assertEqual(task.id, self.task.id)

    def test_get_task_from_shot_path(self):
        file_path = file_tree.get_folder_path(self.shot_task_standard)
        task = file_tree.get_shot_task_from_path(file_path,
                                                 self.project_standard)

        self.assertTrue(task.id, self.shot_task_standard.id)

    def test_get_task_from_asset_path(self):
        file_path = file_tree.get_folder_path(self.task_standard)
        task = file_tree.get_asset_task_from_path(file_path,
                                                  self.project_standard)

        self.assertTrue(task.id, self.shot_task_standard.id)
class FileTreeTestCase(ApiDBTestCase):

    def setUp(self):
        super(FileTreeTestCase, self).setUp()
        self.generate_fixture_project_status()
        self.generate_fixture_project()
        self.generate_fixture_project_standard()
        self.generate_fixture_asset_type()
        self.generate_fixture_asset()
        self.generate_fixture_episode()
        self.generate_fixture_sequence()
        self.generate_fixture_shot()
        self.generate_fixture_scene()
        self.generate_fixture_sequence_standard()
        self.generate_fixture_shot_standard()
        self.generate_fixture_person()
        self.generate_fixture_department()
        self.generate_fixture_task_type()
        self.generate_fixture_task_status()
        self.generate_fixture_assigner()
        self.generate_fixture_task()
        self.generate_fixture_shot_task()
        self.generate_fixture_shot_task_standard()
        self.generate_fixture_software()
        self.asset_standard = Entity(
            name='Car',
            project_id=self.project_standard.id,
            entity_type_id=self.asset_type.id
        )
        self.asset_standard.save()
        self.sequence_standard = Entity(
            name='Seq1',
            project_id=self.project.id,
            entity_type_id=self.sequence_type.id
        )
        self.sequence_standard.save()
        self.shot_standard = Entity(
            name='P001',
            project_id=self.project_standard.id,
            entity_type_id=self.shot_type.id,
            parent_id=self.sequence_standard.id
        )
        self.shot_standard.save()
        self.output_type_materials = files_service.get_or_create_output_type(
            "Materials")
        self.output_type_cache = files_service.get_or_create_output_type(
            "Cache")
        self.output_type_image = files_service.get_or_create_output_type(
            "Images")

    def test_get_tree_from_file(self):
        simple_tree = file_tree_service.get_tree_from_file("simple")
        self.assertIsNotNone(simple_tree["working"])

    def test_get_tree_from_project(self):
        simple_tree = file_tree_service.get_tree_from_project(
            self.project.serialize()
        )
        self.assertIsNotNone(simple_tree["working"])

    def test_join_path(self):
        self.assertEqual(file_tree_service.join_path("", "PROD"), "PROD")
        self.assertEqual(
            file_tree_service.join_path("ROOT", "PROD"), "ROOT/PROD")
        self.assertEqual(
            file_tree_service.join_path("ROOT", "PROD", "\\"), "ROOT\\PROD")

    def test_get_root_path(self):
        tree = file_tree_service.get_tree_from_file("simple")
        path = file_tree_service.get_root_path(tree, "working", "/")
        self.assertEqual(path, "/simple/productions/")

    def test_get_project(self):
        project = file_tree_service.get_project(self.asset.serialize())
        self.assertEqual(project["name"], self.project.name)

    def test_get_file_name_template(self):
        tree = file_tree_service.get_tree_from_file("default")
        template = file_tree_service.get_file_name_template(
            tree,
            "working",
            self.shot.serialize()
        )
        self.assertEqual(template, tree["working"]["file_name"]["shot"])
        template = file_tree_service.get_file_name_template(
            tree,
            "working",
            self.asset.serialize()
        )
        self.assertEqual(template, tree["working"]["file_name"]["asset"])
        template = file_tree_service.get_file_name_template(
            tree,
            "working",
            self.sequence.serialize()
        )
        self.assertEqual(template, tree["working"]["file_name"]["sequence"])

    def test_get_folder_path_template(self):
        tree = file_tree_service.get_tree_from_file("simple")
        template = file_tree_service.get_folder_path_template(
            tree,
            "working",
            self.shot.serialize()
        )
        self.assertEqual(template, tree["working"]["folder_path"]["shot"])
        template = file_tree_service.get_folder_path_template(
            tree,
            "working",
            self.asset.serialize()
        )
        self.assertEqual(template, tree["working"]["folder_path"]["asset"])
        template = file_tree_service.get_folder_path_template(
            tree,
            "working",
            self.sequence.serialize()
        )
        self.assertEqual(template, tree["working"]["folder_path"]["sequence"])

    def test_get_folder_from_datatype_project(self):
        path = file_tree_service.get_folder_from_datatype(
            "Project",
            self.shot.serialize(),
            self.shot_task.serialize()
        )
        self.assertEquals(path, self.project.name)

    def test_get_folder_from_datatype_shot(self):
        path = file_tree_service.get_folder_from_datatype(
            "Shot",
            self.shot.serialize(),
            self.shot_task.serialize()
        )
        self.assertEquals(path, self.shot.name)

    def test_get_folder_from_datatype_sequence_shot(self):
        path = file_tree_service.get_folder_from_datatype(
            "Sequence",
            self.shot.serialize(),
            self.shot_task.serialize()
        )
        self.assertEquals(path, self.sequence.name)

    def test_get_folder_from_datatype_sequence_sequence(self):
        path = file_tree_service.get_folder_from_datatype(
            "Sequence",
            self.sequence.serialize(),
            self.shot_task.serialize()
        )
        self.assertEquals(path, self.sequence.name)

    def test_get_folder_from_datatype_episode(self):
        path = file_tree_service.get_folder_from_datatype(
            "Episode",
            self.shot.serialize(),
            self.task.serialize()
        )
        self.assertEquals(path, "E01")
        path = file_tree_service.get_folder_from_datatype(
            "Episode",
            self.sequence.serialize(),
            self.task.serialize()
        )
        self.assertEquals(path, "E01")

    def test_get_folder_from_datatype_entity(self):
        path = file_tree_service.get_folder_from_datatype(
            "Asset",
            self.asset.serialize(),
            self.task.serialize()
        )
        self.assertEquals(path, self.asset.name)

    def test_get_folder_from_datatype_entity_type(self):
        path = file_tree_service.get_folder_from_datatype(
            "AssetType",
            self.asset.serialize(),
            self.task.serialize()
        )
        self.assertEquals(path, self.asset_type.name)

    def test_get_folder_from_datatype_department(self):
        path = file_tree_service.get_folder_from_datatype(
            "Department",
            self.asset.serialize(),
            self.task.serialize()
        )
        self.assertEquals(path, self.department.name)

    def test_get_folder_from_datatype_task(self):
        path = file_tree_service.get_folder_from_datatype(
            "Task",
            self.asset.serialize(),
            self.task.serialize()
        )
        self.assertEquals(path, self.task.name)

    def test_get_folder_from_datatype_task_type(self):
        path = file_tree_service.get_folder_from_datatype(
            "TaskType",
            self.asset.serialize(),
            task=self.task.serialize()
        )
        self.assertEquals(path, self.task_type.name)
        path = file_tree_service.get_folder_from_datatype(
            "TaskType",
            self.asset.serialize(),
            task_type=self.task_type.serialize()
        )
        self.assertEquals(path, self.task_type.name)

    def test_get_folder_from_datatype_software(self):
        path = file_tree_service.get_folder_from_datatype(
            "Software",
            self.asset.serialize(),
            self.task.serialize(),
            software=self.software.serialize()
        )
        self.assertEquals(path, "Blender")

    def test_get_folder_from_datatype_output_type(self):
        path = file_tree_service.get_folder_from_datatype(
            "OutputType",
            self.asset.serialize(),
            self.task.serialize(),
            output_type=self.output_type_cache
        )
        self.assertEquals(path, "cache")

    def test_get_folder_raise_exception(self):
        self.assertRaises(
            MalformedFileTreeException,
            file_tree_service.get_folder_from_datatype,
            "Unknown",
            self.asset.serialize(),
            self.task.serialize()
        )

    def test_get_working_folder_path_shot(self):
        path = file_tree_service.get_working_folder_path(
            self.shot_task.serialize(),
            software=self.software_max.serialize()
        )
        self.assertEquals(
            path,
            "/simple/productions/cosmos_landromat/shots/s01/p01/animation/"
            "3dsmax"
        )

    def test_get_working_folder_path_with_separator(self):
        path = file_tree_service.get_working_folder_path(
            self.shot_task.serialize(),
            software=self.software_max.serialize(),
            sep="\\"
        )
        self.assertEquals(
            path,
            "/simple\\productions\\cosmos_landromat\\shots\\s01\\p01\\"
            "animation\\3dsmax"
        )

    def test_get_output_folder_path(self):
        path = file_tree_service.get_output_folder_path(
            self.shot.serialize(),
            output_type=self.output_type_cache,
            task_type=self.task_type_animation.serialize(),
            sep="/"
        )
        self.assertEquals(
            path,
            "/simple/productions/export/cosmos_landromat/shots/s01/p01/"
            "animation/cache"
        )

    def test_get_working_folder_path_with_software(self):
        path = file_tree_service.get_working_folder_path(
            self.task.serialize(),
            software=self.software.serialize()
        )
        self.assertEquals(
            path,
            "/simple/productions/cosmos_landromat/assets/props/tree/shaders/"
            "blender"
        )

    def test_get_working_file_name_asset(self):
        file_name = file_tree_service.get_working_file_name(
            self.task.serialize(),
            revision=3
        )
        self.assertEquals(file_name, "cosmos_landromat_props_tree_shaders_v003")

    def test_get_output_file_name_asset(self):
        file_name = file_tree_service.get_output_file_name(
            self.asset.serialize(),
            name="main",
            revision=3
        )
        self.assertEquals(
            file_name,
            "cosmos_landromat_props_tree_geometry_main_v003"
        )

    def test_get_output_file_name_shot_image_sequence(self):
        file_name = file_tree_service.get_output_file_name(
            self.shot.serialize(),
            name="main",
            revision=3,
            output_type=self.output_type_image,
            nb_elements=50
        )
        self.assertEquals(
            file_name,
            "cosmos_landromat_s01_p01_images_main_v003_[1-50]"
        )

    def test_get_working_file_name_shot(self):
        file_name = file_tree_service.get_working_file_name(
            self.shot_task.serialize(),
            revision=3
        )
        self.assertEquals(file_name, "cosmos_landromat_s01_p01_animation_v003")

    def test_get_working_file_path_asset(self):
        file_name = file_tree_service.get_working_file_path(
            self.task.serialize(),
            software=self.software.serialize(),
            revision=3
        )
        self.assertEquals(
            file_name,
            "/simple/productions/cosmos_landromat/assets/props/tree/shaders/"
            "blender/"
            "cosmos_landromat_props_tree_shaders_v003"
        )

    def test_get_file_path_scene(self):
        scene_task = self.generate_fixture_scene_task()
        file_name = file_tree_service.get_working_file_path(
            scene_task.serialize(),
            software=self.software_max.serialize(),
            revision=3
        )
        self.assertEquals(
            file_name,
            "/simple/productions/cosmos_landromat/scenes/s01/sc01/animation/"
            "3dsmax/"
            "cosmos_landromat_sc01_animation_v003"
        )

    def test_get_folder_path_shot_asset_instance(self):
        self.generate_fixture_scene_asset_instance()
        self.generate_fixture_shot_asset_instance(
            self.shot,
            self.asset_instance
        )
        path = file_tree_service.get_instance_folder_path(
            self.asset_instance.serialize(),
            self.shot.serialize(),
            output_type=self.output_type_cache,
            task_type=self.task_type_animation.serialize(),
            representation="abc"
        )
        self.assertEquals(
            path,
            "/simple/productions/export/cosmos_landromat/shot/s01/p01/"
            "animation/cache/props/tree/instance_0001/abc"
        )

    def test_get_file_name_shot_asset_instance(self):
        self.generate_fixture_scene_asset_instance()
        self.generate_fixture_shot_asset_instance(
            self.shot,
            self.asset_instance
        )
        file_name = file_tree_service.get_instance_file_name(
            self.asset_instance.serialize(),
            self.shot.serialize(),
            output_type=self.output_type_cache,
            task_type=self.task_type_animation.serialize(),
            name="main",
            revision=3
        )
        self.assertEquals(
            file_name,
            "cosmos_landromat_s01_p01_animation_cache_main" +
            "_tree_0001_v003"
        )

    def test_get_folder_path_scene_asset_instance(self):
        self.generate_fixture_scene_asset_instance()
        path = file_tree_service.get_instance_folder_path(
            self.asset_instance.serialize(),
            self.scene.serialize(),
            task_type=self.task_type_animation.serialize(),
            output_type=self.output_type_cache,
            representation="abc"
        )
        self.assertEquals(
            path,
            "/simple/productions/export/cosmos_landromat/scene/s01/sc01/"
            "animation/cache/props/tree/instance_0001/abc"
        )

    def test_get_file_name_scene_asset_instance(self):
        self.generate_fixture_scene_asset_instance()
        file_name = file_tree_service.get_instance_file_name(
            self.asset_instance.serialize(),
            self.scene.serialize(),
            output_type=self.output_type_cache,
            task_type=self.task_type_animation.serialize(),
            name="main",
            revision=3
        )

        self.assertEquals(
            file_name,
            "cosmos_landromat_s01_sc01_animation_cache_main_"
            "tree_0001_v003"
        )

    def test_get_folder_path_asset_asset_instance(self):
        self.generate_fixture_asset_types()
        self.generate_fixture_asset_character()
        self.generate_fixture_asset_asset_instance()
        path = file_tree_service.get_instance_folder_path(
            self.asset_instance.serialize(),
            self.asset.serialize(),
            task_type=self.task_type.serialize(),
            output_type=self.output_type_materials,
            representation="ml"
        )
        self.assertEquals(
            path,
            "/simple/productions/export/cosmos_landromat/assets/props/tree/"
            "shaders/materials/character/rabbit/instance_0001/ml"
        )

    def test_get_file_name_asset_asset_instance(self):
        self.generate_fixture_asset_types()
        self.generate_fixture_asset_character()
        self.generate_fixture_asset_asset_instance()
        file_name = file_tree_service.get_instance_file_name(
            self.asset_instance.serialize(),
            self.asset.serialize(),
            output_type=self.output_type_materials,
            task_type=self.task_type.serialize(),
            name="main",
            revision=3
        )

        self.assertEquals(
            file_name,
            "cosmos_landromat_props_tree_shaders_materials_main_"
            "rabbit_0001_v003"
        )

    def test_get_folder_path_representation(self):
        self.generate_fixture_scene_asset_instance()
        path = file_tree_service.get_instance_folder_path(
            self.asset_instance.serialize(),
            self.scene.serialize(),
            task_type=self.task_type_animation.serialize(),
            output_type=self.output_type_cache,
            representation="abc"
        )
        self.assertEquals(
            path,
            "/simple/productions/export/cosmos_landromat/scene/s01/sc01/"
            "animation/cache/props/tree/instance_0001/abc"
        )

    def test_change_folder_path_separators(self):
        result = file_tree_service.change_folder_path_separators(
            "/simple/big_buck_bunny/props", "\\")
        self.assertEqual(result, "\\simple\\big_buck_bunny\\props")

    def test_update_variable(self):
        name = file_tree_service.update_variable(
            "<AssetType>_<Asset>",
            asset=self.asset.serialize(),
            task=self.task.serialize()
        )
        self.assertEquals(name, "props_tree")

    def test_apply_style(self):
        file_name = "Shaders"
        result = file_tree_service.apply_style(file_name, "uppercase")
        self.assertEqual(result, "SHADERS")
        result = file_tree_service.apply_style(file_name, "lowercase")
        self.assertEqual(result, "shaders")

    def test_update_variable_short_name(self):
        name = file_tree_service.update_variable(
            "<TaskType.short_name>",
            asset=self.asset.serialize(),
            task=self.task.serialize()
        )
        self.assertEquals(name, "shd")
Example #20
0
class ApiDBTestCase(ApiTestCase):
    def setUp(self):
        """
        Reset database before each test.
        """
        super(ApiDBTestCase, self).setUp()

        from zou.app.utils import dbhelpers
        dbhelpers.drop_all()
        dbhelpers.create_all()
        self.generate_fixture_user()
        self.log_in_admin()

    def tearDown(self):
        """
        Delete database after each test.
        """
        from zou.app.utils import dbhelpers
        dbhelpers.drop_all()

    def generate_data(self, cls, number, **kwargs):
        """
        Generate random data for a given data model.
        """
        mixer.init_app(self.flask_app)
        return mixer.cycle(number).blend(cls, id=fields.gen_uuid, **kwargs)

    def generate_fixture_project_status(self):
        self.open_status = ProjectStatus(name="open", color="#FFFFFF")
        self.open_status.save()

    def generate_fixture_project_closed_status(self):
        self.closed_status = ProjectStatus(name="closed", color="#FFFFFF")
        self.closed_status.save()

    def generate_fixture_project(self):
        self.project = Project(name="Cosmos Landromat",
                               project_status_id=self.open_status.id)
        self.project.save()
        self.project.update(
            {"file_tree": file_tree_service.get_tree_from_file("simple")})

    def generate_fixture_project_closed(self):
        self.project_closed = Project(name="Old Project",
                                      project_status_id=self.closed_status.id)
        self.project_closed.save()

    def generate_fixture_project_standard(self):
        self.project_standard = Project(name="Big Buck Bunny",
                                        project_status_id=self.open_status.id)
        self.project_standard.save()
        self.project_standard.update(
            {"file_tree": file_tree_service.get_tree_from_file("standard")})

    def generate_fixture_project_no_preview_tree(self):
        self.project_no_preview_tree = Project(
            name="Agent 327", project_status_id=self.open_status.id)
        self.project_no_preview_tree.save()
        self.project_no_preview_tree.update(
            {"file_tree": file_tree_service.get_tree_from_file("no_preview")})

    def generate_fixture_entity(self):
        self.entity = Entity(name="Tree",
                             description="Description Tree",
                             project_id=self.project.id,
                             entity_type_id=self.entity_type.id)
        self.entity.save()

    def generate_fixture_entity_character(self):
        self.entity_character = Entity(
            name="Rabbit",
            description="Main character",
            project_id=self.project.id,
            entity_type_id=self.entity_type_character.id)
        self.entity_character.save()

    def generate_fixture_entity_camera(self):
        self.entity_camera = Entity(name="Main camera",
                                    description="Description Camera",
                                    project_id=self.project.id,
                                    entity_type_id=self.entity_type_camera.id)
        self.entity_camera.save()

    def generate_fixture_entity_standard(self):
        self.entity_standard = Entity(name="Car",
                                      project_id=self.project_standard.id,
                                      entity_type_id=self.entity_type.id)
        self.entity_standard.save()

    def generate_fixture_sequence(self, name="S01"):
        if hasattr(self, "episode"):
            episode_id = self.episode.id
        else:
            episode_id = None

        self.sequence = Entity(name=name,
                               project_id=self.project.id,
                               entity_type_id=self.sequence_type.id,
                               parent_id=episode_id)
        self.sequence.save()

    def generate_fixture_sequence_standard(self):
        self.sequence_standard = Entity(name="S01",
                                        project_id=self.project_standard.id,
                                        entity_type_id=self.sequence_type.id)
        self.sequence_standard.save()

    def generate_fixture_episode(self, name="E01"):
        self.episode = Entity(name=name,
                              project_id=self.project.id,
                              entity_type_id=self.episode_type.id)
        self.episode.save()

    def generate_fixture_shot(self, name="P01"):
        self.shot = Entity(name=name,
                           description="Description Shot 01",
                           data={
                               "fps": 25,
                               "frame_in": 0,
                               "frame_out": 100
                           },
                           project_id=self.project.id,
                           entity_type_id=self.shot_type.id,
                           parent_id=self.sequence.id)
        self.shot.save()
        self.shot_noseq = Entity(name="P01NOSEQ",
                                 project_id=self.project.id,
                                 entity_type_id=self.shot_type.id)
        self.shot_noseq.save()

    def generate_fixture_scene(self,
                               name="SC01",
                               project_id=None,
                               sequence_id=None):
        if project_id is None:
            project_id = self.project.id

        if sequence_id is None:
            sequence_id = self.sequence.id

        self.scene = Entity(name=name,
                            description="Description Scene 01",
                            data={},
                            project_id=project_id,
                            entity_type_id=self.scene_type.id,
                            parent_id=self.sequence.id)
        self.scene.save()

    def generate_fixture_shot_standard(self):
        self.shot_standard = Entity(name="P01",
                                    description="Description Shot 01",
                                    data={
                                        "fps": 25,
                                        "frame_in": 0,
                                        "frame_out": 100
                                    },
                                    project_id=self.project_standard.id,
                                    entity_type_id=self.shot_type.id,
                                    parent_id=self.sequence_standard.id)
        self.shot_standard.save()

    def generate_fixture_shot_asset_instance(self,
                                             asset=None,
                                             shot=None,
                                             number=1):
        if asset is None:
            asset = self.entity
        if shot is None:
            shot = self.shot
        self.asset_instance = AssetInstance.create(
            asset_id=asset.id,
            entity_id=shot.id,
            entity_type_id=self.shot_type.id,
            number=number,
            description="Asset instance description")

    def generate_fixture_scene_asset_instance(self,
                                              asset=None,
                                              scene=None,
                                              number=1):
        if asset is None:
            asset = self.entity
        if scene is None:
            scene = self.scene
        self.asset_instance = AssetInstance.create(
            asset_id=asset.id,
            entity_id=scene.id,
            entity_type_id=self.scene_type.id,
            number=number,
            description="Asset instance description")

    def generate_fixture_user(self):
        self.user = Person.create(first_name="John",
                                  last_name="Did",
                                  role="admin",
                                  email=u"*****@*****.**",
                                  password=auth.encrypt_password("mypassword"))
        return self.user

    def generate_fixture_user_manager(self):
        self.user_manager = Person.create(
            first_name="John",
            last_name="Did2",
            role="manager",
            email=u"*****@*****.**",
            password=auth.encrypt_password("mypassword"))
        return self.user_manager

    def generate_fixture_user_cg_artist(self):
        self.user_cg_artist = Person.create(
            first_name="John",
            last_name="Did3",
            email=u"*****@*****.**",
            role="user",
            password=auth.encrypt_password("mypassword"))
        return self.user_cg_artist

    def generate_fixture_person(self):
        self.person = Person(first_name="John",
                             last_name="Doe",
                             desktop_login="******",
                             email=u"*****@*****.**",
                             password=auth.encrypt_password("mypassword"))
        self.person.save()

    def generate_fixture_entity_type(self):
        self.entity_type = EntityType.create(name="Props")
        self.shot_type = EntityType.create(name="Shot")
        self.sequence_type = EntityType.create(name="Sequence")
        self.episode_type = EntityType.create(name="Episode")
        self.scene_type = EntityType.create(name="Scene")

    def generate_fixture_asset_types(self):
        self.entity_type_character = EntityType.create(name="Character")
        self.entity_type_environment = EntityType.create(name="Environment")
        self.entity_type_camera = EntityType.create(name="Camera")

    def generate_fixture_department(self):
        self.department = Department(name="Modeling", color="#FFFFFF")
        self.department.save()
        self.department_animation = Department(name="Animation",
                                               color="#FFFFFF")
        self.department_animation.save()

    def generate_fixture_task_type(self):
        self.task_type = TaskType(name="Shaders",
                                  color="#FFFFFF",
                                  department_id=self.department.id)
        self.task_type.save()
        self.task_type_animation = TaskType(
            name="Animation",
            color="#FFFFFF",
            department_id=self.department_animation.id)
        self.task_type_animation.save()

    def generate_fixture_task_status(self):
        self.task_status = TaskStatus(name="Open",
                                      short_name="opn",
                                      color="#FFFFFF")
        self.task_status.save()

    def generate_fixture_task_status_wip(self):
        self.task_status_wip = TaskStatus(name="WIP",
                                          short_name="wip",
                                          color="#FFFFFF")
        self.task_status_wip.save()

    def generate_fixture_task_status_to_review(self):
        self.task_status_to_review = TaskStatus(name="To review",
                                                short_name="pndng",
                                                color="#FFFFFF")
        self.task_status_to_review.save()

    def generate_fixture_assigner(self):
        self.assigner = Person(first_name="Ema", last_name="Peel")
        self.assigner.save()

    def generate_fixture_task(self, name="Master", entity_id=None):
        if entity_id is None:
            entity_id = self.entity.id

        start_date = fields.get_date_object("2017-02-20")
        due_date = fields.get_date_object("2017-02-28")
        real_start_date = fields.get_date_object("2017-02-22")
        self.task = Task(name=name,
                         project_id=self.project.id,
                         task_type_id=self.task_type.id,
                         task_status_id=self.task_status.id,
                         entity_id=entity_id,
                         assignees=[self.person],
                         assigner_id=self.assigner.id,
                         duration=50,
                         estimation=40,
                         start_date=start_date,
                         due_date=due_date,
                         real_start_date=real_start_date)
        self.task.save()

    def generate_fixture_task_standard(self):
        start_date = fields.get_date_object("2017-02-20")
        due_date = fields.get_date_object("2017-02-28")
        real_start_date = fields.get_date_object("2017-02-22")
        self.task_standard = Task(name="Super modeling",
                                  project_id=self.project_standard.id,
                                  task_type_id=self.task_type.id,
                                  task_status_id=self.task_status.id,
                                  entity_id=self.entity_standard.id,
                                  assignees=[self.person],
                                  assigner_id=self.assigner.id,
                                  duration=50,
                                  estimation=40,
                                  start_date=start_date,
                                  due_date=due_date,
                                  real_start_date=real_start_date)
        self.task_standard.save()

    def generate_fixture_shot_task(self, name="Master"):
        self.shot_task = Task(
            name=name,
            project_id=self.project.id,
            task_type_id=self.task_type_animation.id,
            task_status_id=self.task_status.id,
            entity_id=self.shot.id,
            assignees=[self.person],
            assigner_id=self.assigner.id,
        )
        return self.shot_task.save()

    def generate_fixture_scene_task(self, name="Master"):
        self.scene_task = Task.create(
            name=name,
            project_id=self.project.id,
            task_type_id=self.task_type_animation.id,
            task_status_id=self.task_status.id,
            entity_id=self.scene.id,
            assignees=[self.person],
            assigner_id=self.assigner.id,
        )
        return self.scene_task

    def generate_fixture_sequence_task(self, name="Master"):
        self.sequence_task = Task(
            name=name,
            project_id=self.project.id,
            task_type_id=self.task_type_animation.id,
            task_status_id=self.task_status.id,
            entity_id=self.sequence.id,
            assignees=[self.person],
            assigner_id=self.assigner.id,
        )
        self.sequence_task.save()

    def generate_fixture_shot_task_standard(self):
        self.shot_task_standard = Task(
            name="Super animation",
            project_id=self.project_standard.id,
            task_type_id=self.task_type_animation.id,
            task_status_id=self.task_status.id,
            entity_id=self.shot_standard.id,
            assignees=[self.person],
            assigner_id=self.assigner.id)
        self.shot_task_standard.save()

    def generate_fixture_file_status(self):
        self.file_status = FileStatus(name="To review", color="#FFFFFF")
        self.file_status.save()

    def generate_fixture_working_file(self, name="main", revision=1):
        self.working_file = WorkingFile(name=name,
                                        comment="",
                                        revision=revision,
                                        task_id=self.task.id,
                                        entity_id=self.entity.id,
                                        person_id=self.person.id,
                                        software_id=self.software.id)
        self.working_file.save()
        return self.working_file

    def generate_fixture_shot_working_file(self):
        self.working_file = WorkingFile(name="main",
                                        comment="",
                                        revision=1,
                                        task_id=self.shot_task.id,
                                        entity_id=self.shot.id,
                                        person_id=self.person.id,
                                        software_id=self.software.id)
        self.working_file.save()

    def generate_fixture_output_file(self,
                                     output_type=None,
                                     revision=1,
                                     name="main",
                                     task=None):
        if output_type is None:
            output_type = self.output_type

        if task is None:
            task_type_id = self.task_type.id
            entity_id = self.entity.id
        else:
            task_type_id = task.task_type_id
            entity_id = task.entity_id

        self.output_file = OutputFile.create(
            comment="",
            revision=revision,
            task_type_id=task_type_id,
            entity_id=entity_id,
            person_id=self.person.id,
            file_status_id=self.file_status.id,
            output_type_id=output_type.id,
            name=name)
        return self.output_file

    def generate_fixture_output_type(self, name="Geometry", short_name="Geo"):
        self.output_type = OutputType.create(name=name, short_name=short_name)
        return self.output_type

    def generate_fixture_software(self):
        self.software = Software.create(name="Blender",
                                        short_name="bdr",
                                        file_extension=".blender")
        self.software_max = Software.create(name="3dsMax",
                                            short_name="max",
                                            file_extension=".max")

    def generate_fixture_preview_file(self, revision=1):
        self.preview_file = PreviewFile.create(name="main",
                                               revision=revision,
                                               description="test description",
                                               source="pytest",
                                               task_id=self.task.id,
                                               person_id=self.person.id)
        return self.preview_file

    def get_fixture_file_path(self, relative_path):
        current_path = os.getcwd()
        file_path_fixture = os.path.join(current_path, "tests", "fixtures",
                                         relative_path)
        return file_path_fixture

    def generate_assigned_task(self):
        self.generate_fixture_entity()
        self.generate_fixture_department()
        self.generate_fixture_task_type()
        self.generate_fixture_task_status()
        self.generate_fixture_person()
        self.generate_fixture_assigner()
        self.generate_fixture_task()

    def generate_shot_suite(self):
        self.generate_fixture_entity_type()
        self.generate_fixture_project_status()
        self.generate_fixture_project()
        self.generate_fixture_episode()
        self.generate_fixture_sequence()
        self.generate_fixture_shot()
        self.generate_fixture_scene()