75 lines
2.1 KiB
Python
75 lines
2.1 KiB
Python
from django.http import HttpRequest
|
|
from django.core.files.base import ContentFile
|
|
from ninja import Router, File
|
|
from ninja.files import UploadedFile
|
|
|
|
from noita.schemas import ObjectivOut
|
|
|
|
from .models import LogfileSubmission, Objectiv
|
|
from .schemas import NoitaSubmissionOut
|
|
|
|
|
|
router = Router()
|
|
|
|
|
|
@router.get("objectives", response=list[ObjectivOut])
|
|
def get_my_objectives(request: HttpRequest):
|
|
return Objectiv.objects.order_by("-count").filter(user=request.user)
|
|
|
|
|
|
@router.post("submit", response=NoitaSubmissionOut)
|
|
def submit_log_file(request: HttpRequest, file: UploadedFile = File(...)):
|
|
"""
|
|
Submit a Noita run file (log file, screenshot, or video).
|
|
|
|
Accepts:
|
|
- Text files (.txt) for polylan_mod_log.txt
|
|
- Images (.png, .jpg, .gif)
|
|
- Videos (.mp4, .webm)
|
|
|
|
Max file size: 256 MB
|
|
"""
|
|
# Validate file type
|
|
allowed_types = [
|
|
"text/plain",
|
|
"image/jpeg",
|
|
"image/jpg",
|
|
"image/png",
|
|
"image/gif",
|
|
"video/mp4",
|
|
"video/webm",
|
|
]
|
|
|
|
if file.content_type not in allowed_types:
|
|
return 400, {
|
|
"detail": f"Invalid file type: {file.content_type}. Allowed types: {', '.join(allowed_types)}"
|
|
}
|
|
|
|
# Validate file size (256MB limit)
|
|
if file.size > 256 * 1024 * 1024:
|
|
return 400, {"detail": "File too large (max 256MB)"}
|
|
|
|
try:
|
|
# Create submission
|
|
submission = LogfileSubmission.objects.create(
|
|
user=request.user if request.user.is_authenticated else None,
|
|
content_type=file.content_type,
|
|
file_size=file.size,
|
|
)
|
|
|
|
# Save the file
|
|
submission.file.save(file.name, ContentFile(file.read()), save=True)
|
|
|
|
return {
|
|
"id": str(submission.id),
|
|
"user_id": submission.user_id,
|
|
"username": submission.user.username if submission.user else None,
|
|
"file_size": submission.file_size,
|
|
"content_type": submission.content_type,
|
|
"created_at": submission.created_at,
|
|
"processed": submission.processed,
|
|
}
|
|
|
|
except Exception as e:
|
|
return 500, {"detail": f"Error creating submission: {str(e)}"}
|