Пример #1
0
def platform(session):
    platform = Platform(name="foo",
                        slug="fixture-platform",
                        type=PlatformType.INFO)
    session.add(platform)
    yield platform
    session.delete(platform)
Пример #2
0
    def get(self):
        """List all platforms"""
        query = self.query(Platform)

        search_args = search_arguments.parse_args()
        if search_args["q"]:
            query = query.filter(Platform.search_filter(search_args["q"]))

        return query
Пример #3
0
    def post(self):
        """Create a new platform

        :raises IntegrityError: Raised when the slug is not unique
        """
        args = platform_arguments.parse_args()

        platform = Platform(**args)
        self.session.add(platform)
        self.session.commit()

        return platform
Пример #4
0
    def dispatch_request(self):
        form = PlatformListFilter(request.args)
        form.country.query = (self.query(Platform.country).group_by(
            Platform.country).order_by(Platform.country))
        form.group.query = self.query(PlatformGroup).order_by(
            PlatformGroup.name)
        form.provider.query = self.query(Provider).order_by(Provider.name)
        query = self.query(Platform).options(undefer(Platform.links_count),
                                             joinedload(Platform.group))

        ordering = parse_ordering(request.args.get("ordering", None, str))
        ordering_key, ordering_direction = (ordering if ordering !=
                                            (None, None) else ("name", "asc"))
        query = apply_ordering(
            {
                "name": Platform.name,
                "slug": Platform.slug,
                "country": Platform.country,
                "links": Platform.links_count,
                None: Platform.id,
            },
            query,
            key=ordering_key,
            direction=ordering_direction,
        )

        if form.validate():
            if form.search.data:
                query = query.filter(Platform.search_filter(form.search.data))

            if form.type.data:
                query = query.filter(Platform.type.in_(form.type.data))

            if form.country.data:
                query = query.filter(Platform.country.in_(form.country.data))

            if form.group.data:
                query = query.filter(
                    Platform.group_id.in_(group.id
                                          for group in form.group.data))

            if form.provider.data:
                query = query.join(Platform.providers).filter(
                    Provider.id.in_(p.id for p in form.provider.data))

        ctx = {}
        ctx["ordering"] = request.args.get("ordering", None, str)
        ctx["filter_form"] = form
        ctx["page"] = query.paginate()

        return render_template("platforms/list.html", **ctx)
Пример #5
0
    def test_source_merging(self, session):
        platform1 = Platform(name="Platform 1",
                             slug="platform-1",
                             base_score=200)
        platform2 = Platform(name="Platform 2",
                             slug="platform-2",
                             base_score=300)
        session.add_all([platform1, platform2])

        object1 = ExternalObject(type=ExternalObjectType.MOVIE)
        object2 = ExternalObject(type=ExternalObjectType.MOVIE)
        session.add_all([object1, object2])

        value1 = Value(
            external_object=object1,
            type=ValueType.TITLE,
            text="Foo",
            sources=[ValueSource(platform=platform1, score_factor=200)],
        )
        value2 = Value(
            external_object=object2,
            type=ValueType.TITLE,
            text="Foo",
            sources=[ValueSource(platform=platform2, score_factor=300)],
        )
        session.add_all([value1, value2])

        session.commit()

        object2.merge_and_delete(object1, session)
        session.expire_all()

        assert len(object1.values) == 1
        assert value1.external_object == object1
        assert value1.score == (200 * 200 + 300 * 300)
        assert len(value1.sources) == 2

        assert session.query(ExternalObject).count() == 1
Пример #6
0
def test_put(client, session):
    platform = Platform(name="foo",
                        slug="bar",
                        type=PlatformType.INFO,
                        country="US")
    session.add(platform)
    session.commit()

    response = client.put("/api/platforms/{}".format(platform.id),
                          data={"name": "baz"})
    assert response.json["name"] == "baz"

    session.refresh(platform)
    assert platform.name == "baz"
Пример #7
0
def test_delete(client, session):
    platform = Platform(name="foo",
                        slug="bar",
                        type=PlatformType.INFO,
                        country="US")
    session.add(platform)
    session.commit()

    platform_id = platform.id
    session.expire(platform)

    response = client.delete("/api/platforms/{}".format(platform.id))
    assert response.json == "ok"

    assert session.query(PlatformGroup).get(platform_id) is None
Пример #8
0
def test_list(client, session):
    response = client.get("/api/platforms/")
    assert response.json["items"] == []

    platform = Platform(name="foo",
                        slug="bar",
                        type=PlatformType.INFO,
                        country="US")
    session.add(platform)
    session.commit()
    response = client.get("/api/platforms/")
    assert response.json["items"] == [{
        "id": platform.id,
        "type": "info",
        "slug": platform.slug,
        "name": platform.name,
        "country": platform.country,
        "group": None,
    }]
Пример #9
0
def process_row(
    file_id: int,
    external_object_ids: List[int],
    attributes: List[Tuple[str, List[str]]],
    links: List[Tuple[str, List[str]]],
):
    file = db.session.query(ImportFile).get(file_id)
    assert file

    attributes = [(ValueType.from_name(k), v) for (k, v) in attributes]
    links = [
        (Platform.lookup(db.session, key.replace("_", "-")), ids) for key, ids in links
    ]
    logger.debug(
        "Processing row ids=%r attrs=%r links=%r",
        external_object_ids,
        attributes,
        links,
    )
    file.process_row(external_object_ids, attributes, links)
Пример #10
0
    def post(self):
        """Create a new scrap

        :raises InvalidTransition:
        """
        args = scrap_arguments.parse_args()

        platform = Platform.lookup(self.session, args["platform"])

        if platform is None:
            abort(404, "Platform not found")

        scrap = Scrap(platform=platform, status=ScrapStatus.SCHEDULED)

        if args["status"]:
            scrap.to_status(args["status"])

        self.session.add(scrap)
        self.session.commit()

        return scrap
Пример #11
0
def test_get(client, session):
    group = PlatformGroup(name="foo")
    session.add(group)
    session.commit()

    response = client.get("/api/groups/{}".format(group.id))
    assert response.json == {
        "id": group.id,
        "name": group.name,
        "platforms": []
    }

    platform = Platform(name="bar",
                        slug="bar",
                        type=PlatformType.INFO,
                        country="US",
                        group=group)
    session.add(group)
    session.commit()

    response = client.get("/api/groups/{}".format(group.id))
    assert response.json == {
        "id":
        group.id,
        "name":
        group.name,
        "platforms": [{
            "id": platform.id,
            "type": "info",
            "slug": platform.slug,
            "name": platform.name,
            "country": platform.country,
        }],
    }

    session.delete(group)
    session.commit()

    response = client.get("/api/groups/{}".format(group.id))
    assert response.status_code == 404
Пример #12
0
def test_get(client, session):
    platform = Platform(name="foo",
                        slug="bar",
                        type=PlatformType.INFO,
                        country="US")
    session.add(platform)
    session.commit()

    response = client.get("/api/platforms/{}".format(platform.id))
    assert response.json == {
        "id": platform.id,
        "type": "info",
        "slug": platform.slug,
        "name": platform.name,
        "country": platform.country,
        "group": None,
    }

    group = PlatformGroup(name="baz", platforms=[platform])
    session.add(group)
    session.commit()

    response = client.get("/api/platforms/{}".format(platform.id))
    assert response.json["group"] == {"id": group.id, "name": group.name}
Пример #13
0
    def test_list(self, client, app, session):
        platform = Platform(name="Platform")
        provider = Provider(name="Provider", slug="provider")
        session.add(platform, provider)
        session.add(ProviderPlatform(platform=platform, provider=provider))
        session.commit()

        with captured_templates(app) as templates:
            rv = client.get("/providers/")
            assert rv.status_code == 200
            assert len(templates) == 1
            template, context = templates[0]

            assert template.name == "providers/list.html"
            assert "page" in context
            assert "filter_form" in context
            assert "ordering" in context

            assert len(context["page"].items) == 1
            assert context["page"].items[0] == provider
            assert len(context["page"].items[0].platforms) == 1
            assert context["page"].items[0].platforms[0] == platform

            assert context["ordering"] is None
Пример #14
0
    def test_value_moving(self, session):
        # This tests for moving a lot of values at once. There was an issue of
        # value disappearing, hence this test.
        platform1 = Platform(name="Platform 1",
                             slug="platform-1",
                             base_score=200)
        platform2 = Platform(name="Platform 2",
                             slug="platform-2",
                             base_score=300)
        session.add_all([platform1, platform2])

        object1 = ExternalObject(type=ExternalObjectType.MOVIE)
        object2 = ExternalObject(type=ExternalObjectType.MOVIE)
        session.add_all([object1, object2])

        # The first 5 values are on both platforms, while the 5 others are only
        # on the second one. With this, the first 5 should only have their
        # sources moved, while the 5 others should have the whole value moved
        values1 = [
            Value(
                external_object=object1,
                type=ValueType.TITLE,
                text="{}".format(i),
                sources=[
                    ValueSource(platform=platform1, score_factor=100 * i)
                ],
            ) for i in range(5)
        ]
        values2 = [
            Value(
                external_object=object2,
                type=ValueType.TITLE,
                text="{}".format(i),
                sources=[
                    ValueSource(platform=platform2, score_factor=100 * i)
                ],
            ) for i in range(10)
        ]
        session.add_all(values1 + values2)

        session.commit()

        object2.merge_and_delete(object1, session)
        session.expire_all()

        seen_indexes = set()
        for value in object1.values:
            # Retrieve the `i` from the value text
            index = int(value.text)
            seen_indexes.add(index)

            if index < 5:  # those should have two sources
                assert len(value.sources) == 2
                assert value.score == index * 100 * (200 + 300)
                assert value.sources[0].score_factor == index * 100
                assert value.sources[1].score_factor == index * 100
            else:
                assert len(value.sources) == 1
                assert value.score == index * 100 * 300
                assert value.sources[0].platform == platform2
                assert value.sources[0].score_factor == index * 100

        assert len(seen_indexes) == 10  # all indexes should have been unique
        assert len(object1.values) == 10

        assert session.query(ExternalObject).count() == 1
        assert session.query(Value).count() == 10
        assert session.query(ValueSource).count() == 15