import json from app.utils.api.api_list import header_for_table from django.contrib.auth.decorators import login_required from django.db import models from django.db.models.fields.related import RelatedField from django.http import JsonResponse from items.models import Item, ItemType @login_required def item_list(request): items = Item.objects.filter(author=request.user.setting) types = ItemType.objects.filter(author=request.user.setting) return JsonResponse( { "result": { "items": list(items.serialize()), "items_headers": header_for_table(Item), "types": list(types.serialize()), "types_headers": header_for_table(ItemType), }, "count": items.count(), } ) @login_required def item_edit(request, id=None): """Create/edit item view.""" if id: item = Item.objects.filter(id=id, author=request.user.setting).first() else: item = Item(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.objects.filter(id=item.id).serialize().first(), } )