72 lines
1.8 KiB
Python
72 lines
1.8 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):
|
|
if isinstance(field, models.ForeignKey):
|
|
|
|
# Also allow for nested object (giving the full object instead of the id only)
|
|
if isinstance(data[field.name], dict):
|
|
setattr(item, f"{field.name}_id", data[field.name]["id"])
|
|
|
|
else:
|
|
setattr(item, f"{field.name}_id", data[field.name])
|
|
|
|
# For now, disregard m2m fields
|
|
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(),
|
|
}
|
|
)
|