def platform(session): platform = Platform(name="foo", slug="fixture-platform", type=PlatformType.INFO) session.add(platform) yield platform session.delete(platform)
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
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
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)
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
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"
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
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, }]
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)
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
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
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}
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
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