Skip to content

Commit 4add888

Browse files
committed
feat: Screenshot upload and map details
- Fix serializer crash when context not provided - Fix base map serializer.
1 parent 1adcdf7 commit 4add888

File tree

4 files changed

+42
-15
lines changed

4 files changed

+42
-15
lines changed

kirovy/constants/api_codes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class UploadApiCodes(enum.StrEnum):
99
EMPTY_UPLOAD = "where-file"
1010
DUPLICATE_MAP = "duplicate-map"
1111
FILE_EXTENSION_NOT_SUPPORTED = "file-extension-not-supported"
12+
INVALID = "invalid-data-upload"
1213

1314

1415
class LegacyUploadApiCodes(enum.StrEnum):

kirovy/serializers/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def get_fields(self):
3030
"""
3131
fields = super().get_fields()
3232
request: t.Optional[KirovyRequest] = self.context.get("request")
33-
if not all([request, request.user.is_authenticated, request.user.is_staff]):
33+
if not (request and request.user.is_authenticated and request.user.is_staff):
3434
fields.pop("last_modified_by_id", None)
3535
return fields
3636

kirovy/serializers/cnc_map_serializers.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class Meta:
8181
hash_sha512 = serializers.CharField(required=True, allow_blank=False)
8282
hash_sha1 = serializers.CharField(required=True, allow_blank=False)
8383

84-
def create(self, validated_data: t) -> cnc_map.CncMapFile:
84+
def create(self, validated_data: t.DictStrAny) -> cnc_map.CncMapFile:
8585
map_file = cnc_map.CncMapFile(**validated_data)
8686
map_file.save()
8787
return map_file
@@ -106,7 +106,7 @@ class CncMapBaseSerializer(CncNetUserOwnedModelSerializer):
106106
description = serializers.CharField(
107107
required=True,
108108
allow_null=False,
109-
allow_blank=False,
109+
allow_blank=True,
110110
trim_whitespace=True,
111111
min_length=10,
112112
)
@@ -117,11 +117,9 @@ class CncMapBaseSerializer(CncNetUserOwnedModelSerializer):
117117
)
118118
category_ids = serializers.PrimaryKeyRelatedField(
119119
source="categories",
120-
queryset=cnc_map.MapCategory.objects.all(),
121120
pk_field=serializers.UUIDField(),
122121
many=True,
123-
allow_null=False,
124-
allow_empty=False,
122+
read_only=True, # Set it manually.
125123
)
126124
is_published = serializers.BooleanField(
127125
default=False,
@@ -139,9 +137,27 @@ class CncMapBaseSerializer(CncNetUserOwnedModelSerializer):
139137
legacy_upload_date = serializers.DateTimeField(
140138
read_only=True,
141139
)
140+
incomplete_upload = serializers.BooleanField(
141+
default=False,
142+
)
143+
144+
parent_id = serializers.PrimaryKeyRelatedField(
145+
source="parent",
146+
queryset=cnc_map.CncMap.objects.all(),
147+
pk_field=serializers.UUIDField(),
148+
many=False,
149+
allow_null=True,
150+
allow_empty=False,
151+
default=None,
152+
)
142153

143154
class Meta:
144155
model = cnc_map.CncMap
145156
# We return the ID instead of the whole object.
146-
exclude = ["cnc_game", "categories"]
157+
exclude = ["cnc_game", "categories", "parent"]
147158
fields = "__all__"
159+
160+
def create(self, validated_data: t.DictStrAny) -> cnc_map.CncMap:
161+
cnc_map_instance = cnc_map.CncMap(**validated_data)
162+
cnc_map_instance.save()
163+
return cnc_map_instance

kirovy/views/map_upload_views.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from kirovy.request import KirovyRequest
2222
from kirovy.response import KirovyResponse
2323
from kirovy.serializers import cnc_map_serializers
24+
from kirovy.serializers.cnc_map_serializers import CncMapBaseSerializer
2425
from kirovy.services import legacy_upload
2526
from kirovy.services.cnc_gen_2_services import CncGen2MapParser, CncGen2MapSections
2627
from kirovy.utils import file_utils
@@ -67,15 +68,24 @@ def post(self, request: KirovyRequest, format=None) -> KirovyResponse:
6768
parent_map = self.get_map_parent(map_parser)
6869

6970
# Make the map that we will attach the map file too.
70-
new_map = cnc_map.CncMap(
71-
map_name=map_parser.ini.map_name,
72-
cnc_game_id=game.id,
73-
is_published=False,
74-
incomplete_upload=True,
75-
cnc_user=request.user,
76-
parent=parent_map,
71+
map_serializer = CncMapBaseSerializer(
72+
data=dict(
73+
map_name=map_parser.ini.map_name,
74+
description="",
75+
cnc_game_id=game.id,
76+
is_published=False,
77+
incomplete_upload=True,
78+
cnc_user_id=request.user.id,
79+
parent_id=parent_map.id if parent_map else None,
80+
),
81+
context={"request": self.request},
7782
)
78-
new_map.save()
83+
if not map_serializer.is_valid():
84+
raise KirovyValidationError(
85+
"Map failed validation", code=UploadApiCodes.INVALID, additional=map_serializer.errors
86+
)
87+
88+
new_map = map_serializer.save()
7989

8090
# Set the cncnet map ID in the map file ini.
8191
cnc_net_ini = {constants.CNCNET_INI_MAP_ID_KEY: str(new_map.id)}

0 commit comments

Comments
 (0)