Skip to content

Commit

Permalink
DRF validation on uploads (ZcashFoundation#54)
Browse files Browse the repository at this point in the history
  • Loading branch information
skyl authored Jan 4, 2023
1 parent 7db44b1 commit 90e1355
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 46 deletions.
12 changes: 12 additions & 0 deletions py/dj/apps/uploads/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,18 @@
from .models import GenericFile


from rest_framework import serializers


class GenericFileSerializer(serializers.ModelSerializer):
class Meta:
model = GenericFile
fields = [
'title', 'description', 'file', 'owner', 'access', 'mime_type',
]
read_only_fields = ['owner', 'mime_type']


class GenericFileSerializer(serializers.ModelSerializer):

url = serializers.SerializerMethodField('get_url')
Expand Down
44 changes: 19 additions & 25 deletions py/dj/apps/uploads/views.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import json
from django.http import HttpResponse, JsonResponse
from django.shortcuts import get_object_or_404
from django.views.decorators.http import require_POST
from django.contrib.auth.decorators import login_required


from rest_framework import viewsets, pagination, filters

Expand Down Expand Up @@ -42,42 +45,33 @@ def uploads_auth(request):
return HttpResponse("", status=401)


@login_required
@require_POST
def uploads_handle(request):
# print(request)
# print(request.FILES)
# print(request.POST)

# <MultiValueDict: {'files': [<InMemoryUploadedFile: saul.png (image/png)>, <InMemoryUploadedFile: arizona.jpeg (image/jpeg)>, <InMemoryUploadedFile: 2Z-alpha.png (image/png)>]}>
# <QueryDict: {'body': ['[{"access":"private","title":"foobar","name":"saul.png"},{"access":"members","title":"arizona.jpeg","name":"arizona.jpeg"},{"access":"public","title":"2Z-alpha.png","name":"2Z-alpha.png"}]']}>
try:
metadata_list = json.loads(request.POST.get('body'))
except Exception as e:
# print(e)
return HttpResponse("Bad Request", status=400)

serializer = GenericFileSerializer(
data=metadata_list,
many=True,
context={'request': request}
)
if not serializer.is_valid():
return HttpResponse("Bad Request", status=400)

files = request.FILES.getlist('files')
# print(files)
# print(metadata_list)
if len(metadata_list) != len(files):
# print("LENGHT NOT EQUAL", len(metadata_list), len(files))
if len(serializer.validated_data) != len(files):
return HttpResponse("Bad Request", status=400)

resp = []
for i, md in enumerate(metadata_list):
for i, data in enumerate(serializer.validated_data):
f = files[i]
data['file'] = f
data['mime_type'] = f.content_type
serializer.save(owner=request.user, **data)

gf = GenericFile.objects.create(
owner=request.user,
title=md['title'],
access=md['access'],
file=f,
# https://stackoverflow.com/a/4855340/177293
# https://stackoverflow.com/a/43588/177293
mime_type=f.content_type,
)
resp.append(gf.get_url())

return JsonResponse(resp, safe=False)
return HttpResponse(status=201)


class TenPagination(pagination.PageNumberPagination):
Expand Down
7 changes: 6 additions & 1 deletion ts/react/free2z/src/components/DragDropFiles.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ export default function DragDropFile() {
setSnack({
open: true,
severity: "error",
message: JSON.stringify(res),
message: JSON.stringify(res.data),
duration: undefined,
})
setLoads(loads + 1)
Expand Down Expand Up @@ -297,6 +297,11 @@ export default function DragDropFile() {
<Button
variant="outlined"
onClick={uploadClick}
disabled={
metadata.some(
file => file.name.length > 64 || file.title.length > 64
)
}
>Upload</Button>
</Stack>
}
Expand Down
30 changes: 10 additions & 20 deletions ts/react/free2z/src/components/FileUploadForm.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { AccountCircle, ClosedCaption, HighlightOff, Remove } from "@mui/icons-material";
import { Box, FormControl, IconButton, InputAdornment, InputLabel, MenuItem, Paper, Select, Stack, TextField, Typography } from "@mui/material";
import { useState } from "react";
import { ClosedCaption, HighlightOff } from "@mui/icons-material";
import { FormControl, IconButton, InputAdornment, MenuItem, Select, TextField } from "@mui/material";
import { FileMetadata } from "./DragDropFiles";

type FileUploadFormProps = {
Expand All @@ -15,33 +14,29 @@ type FileUploadFormProps = {

export default function FileUploadForm(props: FileUploadFormProps) {
const { list, setList, metadata, setMetadata, index } = props
// const [title, setTitle] = useState("")
// const [access, setAccess] = useState("private" as "private" | "members" | "public")
// console.log("LIST", list)
// const [datum, setDatum] = useState({} as FileMetadata)
// const [datum, setDatum] = useState(metadata[index])

if (!metadata[index]) {
return null
}
console.log("LEGNTH", metadata.length)

const { title, name } = metadata[index];
const hasError = title.length > 64 || name.length > 64;



return (
// <Stack>
<FormControl
style={{
// width: "100%",
sx={{
margin: "1em",
padding: "1em",
borderWidth: "2px",
borderRadius: "1rem",
borderStyle: "dashed",
borderColor: "#cbd5e1",
borderColor: hasError ? "error.main" : "#cbd5e1",
alignContent: "center",
justifyContent: "center",
alignItems: "center",
// minHeight: "200px",
// backgroundColor: "#f8fafc",
}}
>
{/* <InputLabel id="select-label">Access</InputLabel> */}
Expand Down Expand Up @@ -79,6 +74,7 @@ export default function FileUploadForm(props: FileUploadFormProps) {
fullWidth
variant="standard"
value={metadata[index].title}
error={metadata[index].title.length > 64}
// helperText={}
// TODO: keyboard access?
// onKeyDown={(v) => {
Expand All @@ -95,7 +91,6 @@ export default function FileUploadForm(props: FileUploadFormProps) {
const newarr = [...metadata]
newarr[index] = newd
setMetadata(newarr)
// setDatum(newd)
}}
InputProps={{
endAdornment: (
Expand All @@ -111,7 +106,6 @@ export default function FileUploadForm(props: FileUploadFormProps) {
maxWidth: "50px",
}}
onClick={() => {
// console.log("HERE", file)
setList([
...list.filter((item, i) => {
return i !== index
Expand All @@ -126,10 +120,6 @@ export default function FileUploadForm(props: FileUploadFormProps) {
>
<HighlightOff />
</IconButton>

{/* <Typography>{props.file.name}</Typography> */}
{/* <Typography>{props.file.size}</Typography> */}
</FormControl>
// </Stack>
)
}

0 comments on commit 90e1355

Please sign in to comment.