K356/k356/items/views/base.py
2024-09-28 17:37:29 +02:00

66 lines
1.5 KiB
Python

from django.db import models
from django.db.models.fields.related import RelatedField
from django.http.response import JsonResponse
import json
def generic_edit(model, request, id=None):
"""Create/edit generic object view."""
if id:
item = model.objects.filter(id=id, author=request.user.setting).first()
else:
item = model(author=request.user.setting)
if not item:
return JsonResponse({}, status=404)
if request.method == "DELETE":
try:
item.delete()
except Exception:
return JsonResponse({"error": "INVALID_DELETE"}, status=401)
return JsonResponse({})
if request.method != "POST":
return JsonResponse({}, status=405)
try:
data = json.loads(request.body)
except Exception:
return JsonResponse({"error": "INVALID_DATA"}, status=401)
for field in item._meta.fields:
if field.name in item.Serialization.excluded_fields_edit:
continue
if isinstance(field, RelatedField):
# For now, disregard related field (fk, m2m, 1-1)
if isinstance(field, models.ForeignKey):
setattr(item, f"{field.name}_id", data[field.name])
continue
if field.name not in data:
continue
setattr(item, field.name, data[field.name])
try:
item.save()
except Exception:
return JsonResponse({"error": "DATA_INVALID"}, status=401)
return JsonResponse(
{
"object": item.serialize(),
}
)