106 lines
4.0 KiB
Python
106 lines
4.0 KiB
Python
from django.shortcuts import render
|
|
from django.http import HttpResponse
|
|
from django.apps import apps
|
|
from .models import Character, PackageFeature, Feature, Pin
|
|
|
|
from rest_framework.decorators import api_view
|
|
from rest_framework.response import Response
|
|
from rest_framework import status
|
|
from .models import Pin
|
|
from .serializers import PinSerializer
|
|
|
|
import json
|
|
|
|
# Create your views here.
|
|
def home(request):
|
|
with open('test_character.json', 'r+') as file:
|
|
character = json.load(file)
|
|
|
|
character = Character.objects.get(name="Gerom")
|
|
class_feature_links = (
|
|
PackageFeature.objects
|
|
.filter(package=character.char_class)
|
|
.select_related('feature')
|
|
.order_by('priority')
|
|
)
|
|
character.char_class.display_features = class_feature_links
|
|
return render(request, 'main/character_sheet.html', {'character': character, })
|
|
|
|
|
|
def feature_add_view(request):
|
|
if request.method == 'GET':
|
|
return render(request, 'main/feature.html')
|
|
elif request.method == 'POST':
|
|
# Parse basic fields
|
|
name = request.POST.get('feature_name')
|
|
description = request.POST.get('feature_description')
|
|
|
|
# Parse Requirements
|
|
requirements = []
|
|
req_keys = [k for k in request.POST.keys() if k.startswith('requirement_')]
|
|
idxs = set()
|
|
for k in req_keys:
|
|
try:
|
|
idxs.add(int(k.split('_')[-1]))
|
|
except:
|
|
continue
|
|
for idx in sorted(list(idxs)):
|
|
prop = request.POST.get(f'requirement_property_{idx}', '').strip()
|
|
cond = request.POST.get(f'requirement_condition_{idx}', '').strip()
|
|
val = request.POST.get(f'requirement_value_{idx}', '').strip()
|
|
if prop and cond and val:
|
|
requirements.append({'property': prop, 'condition': cond, 'value': val})
|
|
|
|
# Parse Operations (with extra subparts)
|
|
operations = []
|
|
op_keys = [k for k in request.POST.keys() if k.startswith('operation_attr_')]
|
|
op_idxs = [int(k.replace('operation_attr_', '')) for k in op_keys]
|
|
for op_idx in op_idxs:
|
|
attr = request.POST.get(f'operation_attr_{op_idx}', '').strip()
|
|
op = request.POST.get(f'operation_operation_{op_idx}', '').strip()
|
|
value = request.POST.get(f'operation_value_{op_idx}', '').strip()
|
|
|
|
# Subparts/limits
|
|
subparts = []
|
|
sub_idx = 0
|
|
while True:
|
|
kfield = f'operation_{op_idx}_limitkey_{sub_idx}'
|
|
vfield = f'operation_{op_idx}_limitval_{sub_idx}'
|
|
if kfield in request.POST and vfield in request.POST:
|
|
k = request.POST.get(kfield, '').strip()
|
|
v = request.POST.get(vfield, '').strip()
|
|
if k and v:
|
|
subparts.append({'key': k, 'value': v})
|
|
sub_idx += 1
|
|
else:
|
|
break
|
|
operation = {'attr': attr, 'operation': op, 'value': value}
|
|
for part in subparts:
|
|
operation[part['key']] = part['value']
|
|
operations.append(operation)
|
|
|
|
feat = Feature.objects.create(
|
|
feature_name=name,
|
|
feature_description=description,
|
|
feature_requirements=requirements,
|
|
feature_data={'operations': operations}
|
|
)
|
|
return render(request, 'main/feature_add.html', {
|
|
'msg': f'Feature "{feat.feature_name}" added successfully!',
|
|
})
|
|
|
|
def map_page(request):
|
|
return render(request, "main/map.html")
|
|
|
|
@api_view(['GET', 'POST'])
|
|
def pin_list(request):
|
|
if request.method == 'GET':
|
|
pins = Pin.objects.all()
|
|
serializer = PinSerializer(pins, many=True)
|
|
return Response(serializer.data)
|
|
if request.method == 'POST':
|
|
serializer = PinSerializer(data=request.data)
|
|
if serializer.is_valid():
|
|
serializer.save()
|
|
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |