def update_product(product_dataclass: ProductBase,
                       product_model: ProductModel) -> ProductModel:
        """Should be called in database session.
        :raise ReleaseInfosConflictError: Unable to sync the release_infos
        """
        release_info_solution = ReleaseInfosSolution()

        status = ReleaseInfoHelper.compare_infos(
            product_dataclass.release_infos, product_model.release_infos)
        while status is not ReleaseInfosStatus.SAME and status is not ReleaseInfosStatus.CONFLICT:
            release_info_solution.set_situation(status).execute(
                product_dataclass=product_dataclass,
                product_model=product_model)
            status = ReleaseInfoHelper.compare_infos(
                product_dataclass.release_infos, product_model.release_infos)

        if status is ReleaseInfosStatus.CONFLICT:
            raise ReleaseInfosConflictError(product_dataclass.url)

        # unique attribute
        series = Series.as_unique(name=product_dataclass.series)
        manufacturer = Company.as_unique(name=product_dataclass.manufacturer)
        category = Category.as_unique(name=product_dataclass.category)
        releaser = Company.as_unique(name=product_dataclass.releaser)
        distributer = Company.as_unique(name=product_dataclass.distributer)

        # unique in list attribute
        paintworks = Paintwork.multiple_as_unique(product_dataclass.paintworks)
        sculptors = Sculptor.multiple_as_unique(product_dataclass.sculptors)

        product_model.update(
            url=product_dataclass.url,
            name=product_dataclass.name,
            size=product_dataclass.size,
            scale=product_dataclass.scale,
            rerelease=product_model.rerelease or product_dataclass.rerelease,
            adult=product_dataclass.adult,
            copyright=product_dataclass.copyright,
            series=series,
            manufacturer=manufacturer,
            releaser=releaser,
            distributer=distributer,
            category=category,
            id_by_official=product_dataclass.maker_id,
            checksum=product_dataclass.checksum,
            order_period_start=product_dataclass.order_period.start,
            order_period_end=product_dataclass.order_period.end,
            thumbnail=product_dataclass.thumbnail,
            og_image=product_dataclass.og_image,
            jan=product_dataclass.jan,
            # relationship
            sculptors=sculptors,
            paintworks=paintworks,
        )

        return product_model
Beispiel #2
0
    def test_change_solution(self, product: Product):
        solution = ReleaseInfosSolution()

        product.release_infos = HistoricalReleases([
            Release(date(2020, 1, 2), Price(12000)),
            Release(date(2023, 2, 2), Price(12000)),
            Release(date(2028, 1, 2), Price(12000)),
        ])
        product.release_infos.sort()

        p_m = ProductModel.create(
            name="foo",
            release_infos=[
                ProductReleaseInfo(initial_release_date=date(2020, 1, 2),
                                   price=12000),
                ProductReleaseInfo(initial_release_date=date(2023, 2, 2),
                                   price=12000),
                ProductReleaseInfo(initial_release_date=date(2028, 2, 2),
                                   price=12000),
            ])

        solution.set_situation(ReleaseInfosStatus.CHANGE).execute(
            product_dataclass=product, product_model=p_m)

        assert ReleaseInfoHelper.compare_infos(
            product.release_infos,
            p_m.release_infos) is ReleaseInfosStatus.SAME
Beispiel #3
0
    def test_delay(self):
        release_infos = HistoricalReleases(
            [Release(date(2020, 2, 2), Price(12000))])

        p_m = ProductModel.create(
            name="foo",
            release_infos=[
                ProductReleaseInfo(initial_release_date=date(2020, 1, 2),
                                   price=12000)
            ])
        assert ReleaseInfoHelper.compare_infos(
            release_infos, p_m.release_infos) == ReleaseInfosStatus.CHANGE
Beispiel #4
0
    def test_last_release_date_was_brought_forward(self):
        release_infos = HistoricalReleases([
            Release(date(2020, 1, 2), Price(12000)),
            Release(date(2023, 2, 2), Price(12000)),
            Release(date(2028, 1, 2), Price(12000)),
        ])

        p_m = ProductModel.create(
            name="foo",
            release_infos=[
                ProductReleaseInfo(initial_release_date=date(2020, 1, 2),
                                   price=12000),
                ProductReleaseInfo(initial_release_date=date(2023, 2, 2),
                                   price=12000),
                ProductReleaseInfo(initial_release_date=date(2028, 2, 2),
                                   price=12000),
            ])

        assert ReleaseInfoHelper.compare_infos(
            release_infos, p_m.release_infos) == ReleaseInfosStatus.CHANGE
Beispiel #5
0
    def test_delay_has_been_confirmed(self):
        release_infos = HistoricalReleases([
            Release(date(2019, 1, 2), Price(12000)),
            Release(date(2020, 5, 2), Price(12000)),
            Release(date(2023, 2, 2), Price(12000)),
        ])

        p_m = ProductModel.create(
            name="foo",
            release_infos=[
                ProductReleaseInfo(initial_release_date=date(2019, 1, 2),
                                   price=12000),
                ProductReleaseInfo(initial_release_date=date(2020, 2, 2),
                                   adjusted_release_date=date(2020, 5, 2),
                                   price=12000),
                ProductReleaseInfo(initial_release_date=date(2023, 2, 2),
                                   price=12000),
            ])

        assert ReleaseInfoHelper.compare_infos(
            release_infos, p_m.release_infos) == ReleaseInfosStatus.SAME