Пример #1
0
class ItemResourceWorldListViewSet(NestedViewSetMixin, BoundlexxListViewSet):
    serializer_class = URLSimpleWorldSerializer

    def get_queryset(self):
        item_id = self.kwargs.get("item__game_id")

        if item_id not in settings.BOUNDLESS_WORLD_POLL_RESOURCE_MAPPING:
            raise Http404

        queryset = World.objects.all()
        if not self.request.user.has_perm("boundless.can_view_private"):
            queryset = queryset.filter(is_public=True)

        if item_id is not None:
            queryset = queryset.filter(
                worldpoll__resourcecount__item__game_id=item_id).distinct("id")

        return queryset

    def list(self, request, *args, **kwargs):  # noqa A003
        """
        Retrieves the list of worlds that has this resource on item
        timeseries lookup
        """

        return super().list(request, *args, **kwargs)  # pylint: disable=no-member

    list.example = {
        "list": {
            "value": get_list_example(ITEM_RESOURCES_WORLD_LIST_EXAMPLE)
        }
    }  # type: ignore # noqa E501
    list.operation_id = "listItemResourceWorlds"  # type: ignore # noqa E501
Пример #2
0
class EmojiViewSet(BoundlexxReadOnlyViewSet):
    queryset = Emoji.objects.filter(
        active=True).prefetch_related("emojialtname_set")
    serializer_class = URLEmojiSerializer
    lookup_field = "name"
    filter_backends = [
        DjangoFilterBackend,
        RankedFuzzySearchFilter,
        filters.OrderingFilter,
        DedupedFilter,
    ]
    filterset_class = EmojiFilterSet
    search_fields = ["name", "emojialtname__name"]
    ordering = ["-rank", "name"]
    ordering_fields: list[str] = []

    def get_object(self):
        queryset = self.filter_queryset(self.get_queryset())
        lookup_name = self.kwargs[self.lookup_field]
        obj = get_object_or_404(
            queryset,
            Q(name=lookup_name) | Q(emojialtname__name=lookup_name))

        # May raise a permission denied
        self.check_object_permissions(self.request, obj)

        return obj

    def list(self, request, *args, **kwargs):  # noqa A003
        """
        Retrieves the list of emojis from the game Boundless.
        """

        return super().list(request, *args, **kwargs)  # pylint: disable=no-member

    list.example = {
        "list": {
            "value": get_list_example(EMOJI_EXAMPLE)
        }
    }  # type: ignore # noqa E501

    def retrieve(
        self,
        request,
        *args,
        **kwargs,
    ):  # pylint: disable=arguments-differ
        """
        Retrieves an emojis from the game Boundless.
        """
        return super().retrieve(request, *args, **kwargs)  # pylint: disable=no-member

    retrieve.example = {
        "retrieve": {
            "value": EMOJI_EXAMPLE
        }
    }  # type: ignore # noqa E501
Пример #3
0
class ItemResourceTimeseriesViewSet(TimeseriesMixin, NestedViewSetMixin,
                                    BoundlexxReadOnlyViewSet):
    schema = DescriptiveAutoSchema(tags=["items", "timeseries"])
    queryset = ResourceCount.objects.filter(
        world_poll__world__active=True,
        world_poll__world__is_creative=False,
    ).select_related("world_poll", "world_poll__world", "item",
                     "item__resource_data")
    serializer_class = URLItemResourceCountTimeSeriesSerializer
    time_bucket_serializer_class = ItemResourceCountTimeSeriesTBSerializer
    number_fields = ["count"]
    lookup_field = "id"

    def get_queryset(self):
        item_id = self.kwargs.get("id")

        if item_id not in settings.BOUNDLESS_WORLD_POLL_RESOURCE_MAPPING:
            raise Http404

        queryset = super().get_queryset()

        if not self.request.user.has_perm("boundless.can_view_private"):
            queryset = queryset.filter(world_poll__world__is_public=True)

        return queryset

    def list(self, request, *args, **kwargs):  # noqa A003
        """
        Retrieves the list resource counts for a give item/world combination
        """

        return super().list(request, *args, **kwargs)  # pylint: disable=no-member

    list.example = {
        "list": {
            "value": get_list_example(ITEM_RESOURCE_TIMESERIES_EXAMPLE)
        }
    }  # type: ignore # noqa E501
    list.operation_id = "listItemResourceTimeseries"  # type: ignore # noqa E501

    def retrieve(
        self,
        request,
        *args,
        **kwargs,
    ):  # pylint: disable=arguments-differ
        """
        Retrieves a specific resource counts for a give item/world combination
        """
        return super().retrieve(request, *args, **kwargs)  # pylint: disable=no-member

    retrieve.example = {
        "retrieve": {
            "value": ITEM_RESOURCE_TIMESERIES_EXAMPLE
        }
    }  # type: ignore # noqa E501
    retrieve.operation_id = "retrieveItemResourceTimeseries"  # type: ignore # noqa E501
Пример #4
0
class SkillViewSet(BoundlexxReadOnlyViewSet):
    queryset = (Skill.objects.all().select_related(
        "group", "description",
        "display_name").prefetch_related("description__strings",
                                         "display_name__strings"))
    serializer_class = URLSkillSerializer
    lookup_field = "id"
    filter_backends = [
        DjangoFilterBackend,
        RankedFuzzySearchFilter,
        filters.OrderingFilter,
        DedupedFilter,
    ]
    filterset_class = SkillFilterSet
    ordering = ["-rank", "id"]
    ordering_fields: list[str] = []
    search_fields = [
        "name",
        "description__strings__text",
        "display_name__strings__text",
    ]

    def list(self, request, *args, **kwargs):  # noqa A003
        """
        Retrieves the list of skills avaiable in Boundless
        """

        return super().list(request, *args, **kwargs)  # pylint: disable=no-member

    list.example = {
        "list": {
            "value": get_list_example(SKILL_EXAMPLE)
        }
    }  # type: ignore # noqa E501

    def retrieve(
        self,
        request,
        *args,
        **kwargs,
    ):  # pylint: disable=arguments-differ
        """
        Retrieves a skill with a given id
        """
        return super().retrieve(request, *args, **kwargs)  # pylint: disable=no-member

    retrieve.example = {
        "retrieve": {
            "value": SKILL_EXAMPLE
        }
    }  # type: ignore # noqa E501
Пример #5
0
class RecipeViewSet(BoundlexxReadOnlyViewSet):
    queryset = (Recipe.objects.all().select_related("output").prefetch_related(
        "requirements",
        "tints",
        "levels",
        "levels__inputs",
        "levels__inputs__group",
        "levels__inputs__item",
        "requirements__skill",
    ))
    serializer_class = URLRecipeSerializer
    lookup_field = "id"
    filter_backends = [
        DjangoFilterBackend,
    ]
    filterset_class = RecipeFilterSet

    def list(self, request, *args, **kwargs):  # noqa A003
        """
        Retrieves the list of recipes avaiable in Boundless
        """

        return super().list(request, *args, **kwargs)  # pylint: disable=no-member

    list.example = {
        "list": {
            "value": get_list_example(RECIPE_EXAMPLE)
        }
    }  # type: ignore # noqa E501

    def retrieve(
        self,
        request,
        *args,
        **kwargs,
    ):  # pylint: disable=arguments-differ
        """
        Retrieves a recipe with a given id
        """
        return super().retrieve(request, *args, **kwargs)  # pylint: disable=no-member

    retrieve.example = {
        "retrieve": {
            "value": RECIPE_EXAMPLE
        }
    }  # type: ignore # noqa E501
Пример #6
0
class MetalViewSet(BoundlexxReadOnlyViewSet):
    queryset = Metal.objects.filter(
        active=True).prefetch_related("localizedname_set")
    serializer_class = URLMetalSerializer
    lookup_field = "game_id"
    filter_backends = [
        DjangoFilterBackend,
        RankedFuzzySearchFilter,
        filters.OrderingFilter,
        DedupedFilter,
    ]
    filterset_class = LocalizationFilterSet
    search_fields = ["localizedname__name", "game_id"]
    ordering = ["-rank", "game_id"]
    ordering_fields: list[str] = []

    def list(self, request, *args, **kwargs):  # noqa A003
        """
        Retrieves the list of metals avaiable in Boundless
        """

        return super().list(request, *args, **kwargs)  # pylint: disable=no-member

    list.example = {
        "list": {
            "value": get_list_example(METAL_EXAMPLE)
        }
    }  # type: ignore # noqa E501

    def retrieve(
        self,
        request,
        *args,
        **kwargs,
    ):  # pylint: disable=arguments-differ
        """
        Retrieves a metal with a given ID
        """
        return super().retrieve(request, *args, **kwargs)  # pylint: disable=no-member

    retrieve.example = {
        "retrieve": {
            "value": METAL_EXAMPLE
        }
    }  # type: ignore # noqa E501
Пример #7
0
class RecipeGroupViewSet(BoundlexxReadOnlyViewSet):
    schema = DescriptiveAutoSchema(tags=["recipes"])
    queryset = (RecipeGroup.objects.all().select_related(
        "display_name").prefetch_related("members", "display_name__strings"))
    serializer_class = URLRecipeGroupSerializer
    lookup_field = "id"
    filter_backends = [
        DjangoFilterBackend,
    ]
    filterset_class = LocalizationFilterSet

    def list(self, request, *args, **kwargs):  # noqa A003
        """
        Retrieves the list of skill groups avaiable in Boundless
        """

        return super().list(request, *args, **kwargs)  # pylint: disable=no-member

    list.example = {
        "list": {
            "value": get_list_example(RECIPE_GROUP_EXAMPLE)
        }
    }  # type: ignore # noqa E501

    def retrieve(
        self,
        request,
        *args,
        **kwargs,
    ):  # pylint: disable=arguments-differ
        """
        Retrieves a skill group with a given id
        """
        return super().retrieve(request, *args, **kwargs)  # pylint: disable=no-member

    retrieve.example = {
        "retrieve": {
            "value": RECIPE_GROUP_EXAMPLE
        }
    }  # type: ignore # noqa E501
Пример #8
0
class WorldViewSet(BoundlexxReadOnlyViewSet):
    queryset = World.objects.all()
    serializer_class = KindOfSimpleWorldSerializer
    detail_serializer_class = URLWorldSerializer
    lookup_field = "id"
    filter_backends = [
        DjangoFilterBackend,
        RankedFuzzySearchFilter,
        filters.OrderingFilter,
        DedupedFilter,
    ]
    filterset_class = WorldFilterSet
    ordering = ["-rank", "id"]
    ordering_fields: list[str] = ["sort_name", "start", "end"]
    search_fields = [
        "name",
        "id",
        "text_name",
    ]

    def get_queryset(self):
        queryset = super().get_queryset()

        if not self.request.user.has_perm("boundless.can_view_private"):
            queryset = queryset.filter(is_public=True)

        # only get all relations on detail view
        if self.detail:
            queryset = queryset.select_related("assignment").prefetch_related(
                "worldblockcolor_set",
                "worldblockcolor_set__item",
                "worldblockcolor_set__color",
                "worldblockcolor_set__first_world",
                "worldblockcolor_set__last_exo",
                "worldblockcolor_set__transform_first_world",
                "worldblockcolor_set__transform_last_exo",
                "itembuyrank_set",
                "itemsellrank_set",
            )

        return queryset

    def list(self, request, *args, **kwargs):  # noqa A003
        """
        Retrieves the list of worlds avaiable in Boundless.
        """

        return super().list(request, *args, **kwargs)  # pylint: disable=no-member

    list.example = {
        "list": {
            "value": get_list_example(examples.WORLD_EXAMPLE)
        }
    }  # type: ignore # noqa E501

    def retrieve(
        self,
        request,
        *args,
        **kwargs,
    ):  # pylint: disable=arguments-differ
        """
        Retrieves a worlds with a given id
        """
        return super().retrieve(request, *args, **kwargs)  # pylint: disable=no-member

    retrieve.example = {
        "retrieve": {
            "value": examples.WORLD_EXAMPLE
        }
    }  # type: ignore # noqa E501

    @action(
        detail=False,
        methods=["get"],
        serializer_class=KindOfSimpleWorldSerializer,
        url_path="simple",
    )
    def simple(self, request, *args, **kwargs):
        """
        Migration/simplication of endpoint has been completeled.

        This endpoint is deprecated as it is a copy of `/api/v1/worlds/`.

        The functionality of this endpoint will be replaced with that one in the
        on 1 May 2020.
        """

        return self.list(request, *args, **kwargs)

    simple.operation_id = "listWorldsSimple"
    simple.deprecated = True

    @action(
        detail=True,
        methods=["get"],
        serializer_class=WorldBlockColorsViewSerializer,
        url_path="block-colors",
    )
    def block_colors(
            self,
            request,
            id=None,  # pylint: disable=redefined-builtin # noqa A002
    ):
        """
        Retrieves the block colors for a given world
        """

        world = self.get_object()

        show_inactive_colors = request.query_params.get(
            "show_inactive_colors", False)
        is_default = request.query_params.get("is_default", None)

        all_block_colors = list(world.worldblockcolor_set.all())

        block_colors = []
        for bc in all_block_colors:
            if is_default is not None:
                if is_default and not bc.is_default:
                    continue
                if not is_default and bc.is_default:
                    continue

            if show_inactive_colors or bc.active:
                block_colors.append(bc)

        response = BlockColorResponse(world.id, block_colors)

        serializer = self.get_serializer_class()(response,
                                                 context={
                                                     "request": request
                                                 })

        return Response(serializer.data)

    block_colors.example = {
        "block_colors": {
            "value": examples.WORLD_COLORS_EXAMPLE
        }
    }
    block_colors.operation_id = "listWorldBlockColors"

    @action(
        detail=True,
        methods=["get"],
        serializer_class=URLWorldShopStandPriceSerializer,
        url_path="shop-stands",
    )
    def shop_stands(
            self,
            request,
            id=None,  # pylint: disable=redefined-builtin # noqa A002
    ):
        """
        Gets current Shop Stands for given world
        """

        world = self.get_object()

        queryset = (ItemShopStandPrice.objects.filter(
            world=world,
            active=True).select_related("item").order_by("item_id", "price"))

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)

        return Response(serializer.data)

    shop_stands.example = {
        "shop_stands": {
            "value": get_list_example(examples.WORLD_SHOP_STANDS_EXAMPLE)
        }
    }
    shop_stands.operation_id = "listWorldShopStands"

    @action(
        detail=True,
        methods=["get"],
        serializer_class=URLWorldRequestBasketPriceSerializer,
        url_path="request-baskets",
    )
    def request_baskets(
            self,
            request,
            id=None,  # pylint: disable=redefined-builtin # noqa A002
    ):
        """
        Gets current Request Baskets for given world
        """

        world = self.get_object()

        queryset = (ItemRequestBasketPrice.objects.filter(
            world=world,
            active=True).select_related("item").order_by("item_id", "-price"))

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)

        return Response(serializer.data)

    request_baskets.example = {
        "request_baskets": {
            "value": get_list_example(examples.WORLD_REQUEST_BASKETS_EXAMPLE)
        }
    }
    request_baskets.operation_id = "listWorldRequestBaskets"

    @action(
        detail=True,
        methods=["get"],
        serializer_class=BeaconSerializer,
        url_path="beacons",
    )
    def beacons(
            self,
            request,
            id=None,  # pylint: disable=redefined-builtin # noqa A002
    ):
        """
        Gets current Beacons for given world
        """

        world = self.get_object()

        queryset = (Beacon.objects.filter(world=world,
                                          active=True).prefetch_related(
                                              "beaconscan_set",
                                              "beaconplotcolumn_set").order_by(
                                                  "location_x", "location_y",
                                                  "location_z"))

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)

        return Response(serializer.data)

    beacons.operation_id = "listWorldBeacons"

    @action(
        detail=True,
        methods=["get"],
        serializer_class=SettlementSerializer,
        url_path="settlements",
    )
    def settlements(
            self,
            request,
            id=None,  # pylint: disable=redefined-builtin # noqa A002
    ):
        """
        Gets current Settlements for given world
        """

        world = self.get_object()

        queryset = Settlement.objects.filter(world=world).order_by(
            "-prestige", "location_x", "location_z")

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)

        return Response(serializer.data)

    settlements.operation_id = "listWorldSettlements"
Пример #9
0
class WorldDistanceViewSet(NestedViewSetMixin, BoundlexxReadOnlyViewSet):
    queryset = (WorldDistance.objects.filter(
        world_source__active=True, world_dest__active=True).select_related(
            "world_source", "world_dest").order_by("distance"))
    serializer_class = URLWorldDistanceSerializer
    lookup_field = "world_id"

    def get_object(self):
        queryset = self.filter_queryset(self.get_queryset())

        lookup_field = self.lookup_url_kwarg or self.lookup_field
        world_id = self.kwargs[lookup_field]
        source_world_id = self.kwargs.get("world_source__id", None)

        if world_id == source_world_id:
            queryset = queryset.filter(world_source__id=world_id,
                                       world_dest__id=world_id)
        else:
            queryset = queryset.filter(
                Q(world_source__id=world_id) | Q(world_dest__id=world_id))

        if queryset.count() > 1:
            logger.warning(
                "Duplicate World Distance calculations! %s %s",
                world_id,
                source_world_id,
            )

        obj = queryset.first()

        if obj is None:
            raise Http404

        # May raise a permission denied
        self.check_object_permissions(self.request, obj)

        return obj

    def filter_queryset_by_parents_lookups(self, queryset):
        parents_query_dict = self.get_parents_query_dict()

        world_id = parents_query_dict.pop("world_source__id", None)
        if world_id:
            try:
                return queryset.filter(
                    Q(world_source__id=world_id) | Q(world_dest__id=world_id))
            except ValueError as ex:
                raise Http404 from ex
        else:
            return queryset

    def list(self, request, *args, **kwargs):  # noqa A003
        """
        Retrieves the list of distances to know worlds
        """

        return super().list(request, *args, **kwargs)  # pylint: disable=no-member

    list.example = {
        "list": {
            "value": get_list_example(examples.WORLD_DISTANCES_EXAMPLE)
        }
    }  # type: ignore # noqa E501

    def retrieve(
        self,
        request,
        *args,
        **kwargs,
    ):  # pylint: disable=arguments-differ
        """
        Retrieves the distance to a specific world
        """
        return super().retrieve(request, *args, **kwargs)  # pylint: disable=no-member

    retrieve.example = {
        "retrieve": {
            "value": examples.WORLD_DISTANCES_EXAMPLE
        }
    }  # type: ignore # noqa E501
Пример #10
0
class ColorViewSet(BoundlexxReadOnlyViewSet):
    queryset = Color.objects.filter(active=True).prefetch_related(
        "localizedname_set", "colorvalue_set"
    )
    serializer_class = URLColorSerializer
    lookup_field = "game_id"
    filter_backends = [
        DjangoFilterBackend,
        RankedFuzzySearchFilter,
        filters.OrderingFilter,
        DedupedFilter,
    ]
    filterset_class = ColorFilterSet
    search_fields = ["localizedname__name", "game_id"]
    ordering = ["-rank", "game_id"]
    ordering_fields: list[str] = []

    def list(self, request, *args, **kwargs):  # noqa A003
        """
        Retrieves the list of colors avaiable in Boundless
        """

        return super().list(request, *args, **kwargs)  # pylint: disable=no-member

    list.example = {"list": {"value": get_list_example(COLOR_EXAMPLE)}}  # type: ignore # noqa E501

    def retrieve(
        self,
        request,
        *args,
        **kwargs,
    ):  # pylint: disable=arguments-differ
        """
        Retrieves a color with a given ID
        """
        return super().retrieve(request, *args, **kwargs)  # pylint: disable=no-member

    retrieve.example = {"retrieve": {"value": COLOR_EXAMPLE}}  # type: ignore # noqa E501

    @action(
        detail=True,
        methods=["get"],
        serializer_class=PossibleItemSerializer,
        url_path="sovereign-blocks",
    )
    def sovereign_blocks(
        self,
        request,
        game_id=None,
    ):
        """
        Gets current Possible Sovereign Blocks choices for given color
        """

        color = self.get_object()

        queryset = (
            WorldBlockColor.objects.filter(color=color, is_default=True)
            .filter(
                Q(world__isnull=True)
                | Q(world__end__isnull=True, world__is_creative=False)
                | Q(world__owner__isnull=False, world__is_creative=False)
            )
            .select_related("item")
            .order_by("item__game_id")
            .distinct("item__game_id")
        )

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)

        return Response(serializer.data)

    sovereign_blocks.operation_id = "listColorSovereignBlocks"  # noqa E501
Пример #11
0
class BlockColorViewSet(
    NestedViewSetMixin,
    BoundlexxReadOnlyViewSet,
):
    schema = DescriptiveAutoSchema()
    queryset = (
        WorldBlockColor.objects.filter(world__is_creative=False)
        .select_related(
            "item",
            "world",
            "item__item_subtitle",
        )
        .prefetch_related(
            "item__localizedname_set",
            "item__item_subtitle__localizedname_set",
        )
    )

    serializer_class = URLBlockColorSerializer
    lookup_field = "item__game_id"
    filter_backends = [
        DjangoFilterBackend,
        RankedFuzzySearchFilter,
        filters.OrderingFilter,
        DedupedFilter,
    ]
    filterset_class = WorldBlockColorFilterSet
    search_fields = [
        "item__string_id",
        "item__item_subtitle__localizedname__name",
        "item__localizedname__name",
        "world__name",
        "world__display_name",
    ]
    ordering = ["-rank", "item__game_id", "color__game_id"]
    ordering_fields: list[str] = []

    def get_queryset(self):
        queryset = super().get_queryset()

        if not self.request.user.has_perm("boundless.can_view_private"):
            queryset = queryset.filter(world__is_public=True)

        return queryset

    def list(self, request, *args, **kwargs):  # noqa A003
        """
        Retrieves the list of the items for a given color
        """

        return super().list(request, *args, **kwargs)  # pylint: disable=no-member

    list.example = {"list": {"value": get_list_example(COLOR_BLOCKS_EXAMPLE)}}  # type: ignore # noqa E501
    list.operation_id = "listColorBlocks"  # type: ignore # noqa E501

    def retrieve(
        self,
        request,
        *args,
        **kwargs,
    ):  # pylint: disable=arguments-differ
        """
        Retrieves the counts worlds for a given color/item combination
        """
        return super().list(request, *args, **kwargs)  # pylint: disable=no-member

    retrieve.example = {"list": {"value": get_list_example(COLOR_BLOCKS_EXAMPLE)}}  # type: ignore # noqa E501
    retrieve.operation_id = "retrieveColorBlock"  # type: ignore # noqa E501
Пример #12
0
class ItemColorsViewSet(
        NestedViewSetMixin,
        BoundlexxReadOnlyViewSet,
):
    queryset = (WorldBlockColor.objects.filter(
        world__is_creative=False, ).select_related(
            "color",
            "world",
            "item",
        ).prefetch_related("color__localizedname_set"))
    lookup_field = "color__game_id"
    filter_backends = [
        DjangoFilterBackend,
        RankedFuzzySearchFilter,
        filters.OrderingFilter,
        DedupedFilter,
    ]
    filterset_class = ItemColorFilterSet
    search_fields = [
        "color__localizedname__name",
    ]
    ordering = ["-rank", "color__game_id", "world_id"]
    ordering_fields: list[str] = []

    serializer_class = URLItemColorSerializer
    detail_serializer_class = URLWorldColorSerializer

    def get_queryset(self):
        queryset = super().get_queryset()

        if not self.request.user.has_perm("boundless.can_view_private"):
            queryset = queryset.filter(world__is_public=True)

        if self.action == "list":
            queryset = queryset.distinct("rank", "color__game_id")

        return queryset

    def list(self, request, *args, **kwargs):  # noqa A003
        """
        Retrieves the list of colors for a given item
        """

        return super().list(request, *args, **kwargs)  # pylint: disable=no-member

    list.example = {
        "list": {
            "value": get_list_example(ITEM_COLORS_EXAMPLE)
        }
    }  # type: ignore # noqa E501
    list.operation_id = "listItemColors"  # type: ignore # noqa E501

    def retrieve(
        self,
        request,
        *args,
        **kwargs,
    ):  # pylint: disable=arguments-differ
        """
        Retrieves the list worlds for specific color/item combination
        """
        return super().list(request, *args, **kwargs)  # pylint: disable=no-member

    retrieve.example = {
        "list": {
            "value": get_list_example(ITEM_COLORS_EXAMPLE)
        }
    }  # type: ignore # noqa E501
    retrieve.operation_id = "retrieveItemColors"  # type: ignore # noqa E501
Пример #13
0
class ItemResourceCountViewSet(
        NestedViewSetMixin,
        BoundlexxReadOnlyViewSet,
):
    queryset = ResourceCount.objects.filter(
        world_poll__active=True,
        world_poll__world__active=True,
        world_poll__world__is_creative=False,
    ).select_related("world_poll", "world_poll__world", "item",
                     "item__resource_data")

    serializer_class = URLItemResourceCountSerializer
    lookup_field = "world_id"
    filter_backends = [
        DjangoFilterBackend,
        RankedFuzzySearchFilter,
        filters.OrderingFilter,
        DedupedFilter,
    ]
    filterset_class = ItemResourceCountFilterSet
    search_fields = [
        "world_poll__world__display_name",
        "world_poll__world__name",
    ]
    ordering = ["-rank", "world_poll__world_id", "-count"]
    ordering_fields: list[str] = [
        "count",
        "average_per_chunk",
        "percentage",
    ]

    def get_queryset(self):
        queryset = super().get_queryset()

        if not self.request.user.has_perm("boundless.can_view_private"):
            queryset = queryset.filter(world_poll__world__is_public=True)

        return queryset

    def list(self, request, *args, **kwargs):  # noqa A003
        """
        Retrieves the list of the counts of the resource by world.

        This endpoint will only exist if the given item is a "resource"
        """

        return super().list(request, *args, **kwargs)  # pylint: disable=no-member

    list.example = {
        "list": {
            "value": get_list_example(ITEM_RESOURCE_COUNT_EXAMPLE)
        }
    }  # type: ignore # noqa E501
    list.operation_id = "listItemResourceCounts"  # type: ignore # noqa E501

    def retrieve(
        self,
        request,
        *args,
        **kwargs,
    ):  # pylint: disable=arguments-differ
        """
        Retrieves the counts of the resource on a given world.
        """
        return super().retrieve(request, *args, **kwargs)  # pylint: disable=no-member

    retrieve.example = {
        "retrieve": {
            "value": ITEM_RESOURCE_COUNT_EXAMPLE
        }
    }  # type: ignore # noqa E501
    retrieve.operation_id = "retrieveItemResourceCount"  # type: ignore # noqa E501

    def get_object(self):
        queryset = self.filter_queryset(self.get_queryset())
        obj = get_object_or_404(
            queryset, world_poll__world_id=self.kwargs[self.lookup_field])

        # May raise a permission denied
        self.check_object_permissions(self.request, obj)

        return obj

    def get_parents_query_dict(self):
        kwargs = super().get_parents_query_dict()
        kwargs.pop(self.lookup_field, None)

        if "item__game_id" in kwargs:
            try:
                game_id = int(kwargs["item__game_id"])
            except ValueError:
                pass
            else:
                if game_id not in settings.BOUNDLESS_WORLD_POLL_RESOURCE_MAPPING:
                    raise Http404()

        return kwargs
Пример #14
0
class ItemViewSet(
        BoundlexxReadOnlyViewSet, ):
    queryset = (Item.objects.filter(active=True).select_related(
        "item_subtitle", "list_type", "description").prefetch_related(
            "localizedname_set",
            "item_subtitle__localizedname_set",
            "worldblockcolor_set",
            "itembuyrank_set",
            "itemsellrank_set",
            "list_type__strings",
            "description__strings",
        ))
    serializer_class = URLItemSerializer
    lookup_field = "game_id"
    filter_backends = [
        DjangoFilterBackend,
        RankedFuzzySearchFilter,
        filters.OrderingFilter,
        DedupedFilter,
    ]
    filterset_class = ItemFilterSet
    search_fields = ["string_id", "localizedname__name", "game_id"]
    ordering = ["-rank", "game_id"]
    ordering_fields: list[str] = []

    def list(self, request, *args, **kwargs):  # noqa A003
        """
        Retrieves the list of items avaiable in Boundless
        """

        return super().list(request, *args, **kwargs)  # pylint: disable=no-member

    list.example = {
        "list": {
            "value": get_list_example(ITEM_EXAMPLE)
        }
    }  # type: ignore # noqa E501

    def retrieve(
        self,
        request,
        *args,
        **kwargs,
    ):  # pylint: disable=arguments-differ
        """
        Retrieves a items with a given ID.

        If a `resource_counts_url` is provided, it means this item is
        a "resource" in Boundless. `resource_counts_url` provide most
        resource counts of the item on all Boundless worlds.

        If `has_color` for an image is true and there is an `image_url`, you can
        replace the file name from `{item.game_id}.png` to
        `{item.game_id}_{color.game_id}.png` to get an image for a specific color.
        The color for the default image is based on the `default_color` property.

        `has_metal_variants` is the same thing, but for the 5 different types of
        metals.
        """
        return super().retrieve(request, *args, **kwargs)  # pylint: disable=no-member

    retrieve.example = {
        "retrieve": {
            "value": ITEM_EXAMPLE
        }
    }  # type: ignore # noqa E501

    @action(
        detail=True,
        methods=["get"],
        serializer_class=URLItemShopStandPriceSerializer,
        url_path="shop-stands",
    )
    def shop_stands(
        self,
        request,
        game_id=None,
    ):
        """
        Gets current Shop Stands for given item
        """

        item = self.get_object()

        queryset = (ItemShopStandPrice.objects.filter(
            item=item, active=True).select_related("world").order_by("price"))

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)

        return Response(serializer.data)

    shop_stands.example = {
        "shop_stands": {
            "value": get_list_example(ITEM_SHOP_STAND_EXAMPLE)
        }
    }
    shop_stands.operation_id = "listItemShopStands"  # noqa E501

    @action(
        detail=True,
        methods=["get"],
        serializer_class=URLItemRequestBasketPriceSerializer,
        url_path="request-baskets",
    )
    def request_baskets(
        self,
        request,
        game_id=None,
    ):
        """
        Gets current Request Baskets for given item
        """

        item = self.get_object()

        queryset = (ItemRequestBasketPrice.objects.filter(
            item=item, active=True).select_related("world").order_by("-price"))

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)

        return Response(serializer.data)

    request_baskets.example = {
        "request_baskets": {
            "value": get_list_example(ITEM_REQUEST_BASKETS_EXAMPLE)
        }
    }
    request_baskets.operation_id = "listItemRequestBaskets"  # noqa E501

    @action(
        detail=True,
        methods=["get"],
        serializer_class=PossibleColorSerializer,
        url_path="sovereign-colors",
    )
    def sovereign_colors(
        self,
        request,
        game_id=None,
    ):
        """
        Gets current Possible Sovereign Color choices for given item
        """

        item = self.get_object()

        queryset = (WorldBlockColor.objects.filter(
            item=item, is_default=True).filter(
                Q(world__isnull=True)
                | Q(world__end__isnull=True, world__is_creative=False)
                | Q(world__owner__isnull=False, world__is_creative=False)
            ).select_related("color").order_by("color__game_id").distinct(
                "color__game_id"))

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)

        return Response(serializer.data)

    sovereign_colors.example = {
        "sovereign_colors": {
            "value": get_list_example(ITEM_SOVEREIGN_COLORS_EXAMPLE)
        }
    }
    sovereign_colors.operation_id = "listItemSovereignColors"  # noqa E501
Пример #15
0
class WorldPollViewSet(TimeseriesMixin, NestedViewSetMixin,
                       BoundlexxReadOnlyViewSet):
    schema = DescriptiveAutoSchema(tags=["worlds", "timeseries"])
    queryset = (
        WorldPoll.objects.all().select_related("world").prefetch_related(
            "worldpollresult_set",
            "leaderboardrecord_set",
            "resourcecount_set",
            "resourcecount_set__item",
        ))
    serializer_class = URLWorldPollSerializer
    time_bucket_serializer_class = WorldPollTBSerializer
    number_fields = [
        "worldpollresult__player_count",
        "worldpollresult__beacon_count",
        "worldpollresult__plot_count",
        "worldpollresult__total_prestige",
    ]
    lookup_field = "id"

    def list(self, request, *args, **kwargs):  # noqa A003
        """
        Retrieves the list polls avaiable for give World
        """

        return super().list(request, *args, **kwargs)  # pylint: disable=no-member

    list.example = {
        "list": {
            "value": get_list_example(wexamples.WORLD_POLL_EXAMPLE)
        }
    }  # type: ignore # noqa E501

    def retrieve(
        self,
        request,
        *args,
        **kwargs,
    ):  # pylint: disable=arguments-differ
        """
        Retrieves a specific poll for a given world

        Can pass `latest` or `initial` in place of `id` to retrieve the
        newest or first one
        """
        return super().retrieve(request, *args, **kwargs)  # pylint: disable=no-member

    retrieve.example = {
        "retrieve": {
            "value": wexamples.WORLD_POLL_EXAMPLE
        }
    }  # type: ignore # noqa E501

    @action(
        detail=True,
        methods=["get"],
        serializer_class=URLWorldPollLeaderboardSerializer,
    )
    def leaderboard(
            self,
            request,
            world_id=None,
            id=None,  # pylint: disable=redefined-builtin # noqa A002
    ):
        """
        Retrieves the leaderboard for a given world poll result
        """

        world_poll = self.get_object()

        serializer = self.get_serializer_class()(world_poll,
                                                 context={
                                                     "request": request
                                                 })

        return Response(serializer.data)

    leaderboard.example = {
        "leaderboard": {
            "value": wexamples.WORLD_POLL_LEADERBOARD_EXAMPLE
        }
    }
    leaderboard.operation_id = "listWorldPollLeaderboards"

    @action(
        detail=True,
        methods=["get"],
        serializer_class=URLWorldPollResourcesSerializer,
    )
    def resources(
            self,
            request,
            world_id=None,
            id=None,  # pylint: disable=redefined-builtin # noqa A002
    ):
        """
        Retrieves the count of resources for a given world poll result
        """
        world_poll = self.get_object()

        serializer = self.get_serializer_class()(world_poll,
                                                 context={
                                                     "request": request
                                                 })

        return Response(serializer.data)

    resources.example = {
        "resources": {
            "value": wexamples.WORLD_POLL_RESOURCES_EXAMPLE
        }
    }
    resources.operation_id = "listWorldPollResources"