app_lisium/main/views.py
2026-05-18 15:02:03 -05:00

258 lines
9.6 KiB
Python

from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
from django.apps import apps
from .models import Character, PackageFeature, Feature, Pin, Package, ObjectTrait
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
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.
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.template.loader import render_to_string
from django.views.decorators.http import require_GET
@require_GET
def feature_select_search(request):
system = request.GET.get('system')
q = request.GET.get('q', '').strip()
page = request.GET.get('page', 1)
per_page = 5
print(q, system, page)
feats = Feature.objects.all()
if system:
feats = feats.filter(feature_system=system)
if q:
feats = feats.filter(
feature_name__icontains=q
)
paginator = Paginator(feats.order_by('feature_name'), per_page)
try:
page_obj = paginator.page(page)
except PageNotAnInteger:
page_obj = paginator.page(1)
except EmptyPage:
page_obj = paginator.page(paginator.num_pages)
data = {
'results': [
{
'id': str(feat.id),
'feature_name': feat.feature_name,
'feature_description': feat.feature_description,
}
for feat in page_obj.object_list
],
'page': page_obj.number,
'num_pages': paginator.num_pages,
'has_previous': page_obj.has_previous(),
'has_next': page_obj.has_next(),
}
return JsonResponse(data)
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, })
return render(request, 'main/character_sheet.html')
def package_detail(request, system, package_uuid):
package = get_object_or_404(Package, id=package_uuid)
if request.method == 'POST':
try:
payload = json.loads(request.POST.get('package_payload'))
package.package_name = payload.get('package_name')
package.package_description = payload.get('package_description')
package.package_requirements = payload.get('package_requirements')
package.package_doc_md = payload.get('package_doc_md')
package.package_operations = payload.get('package_operations')
package.package_type = payload.get('package_type')
trait_ids = [trait['id'] for trait in payload.get('package_traits', [])]
print(trait_ids)
if trait_ids is not None:
package.package_traits.set(trait_ids)
feat_ids = [feat['id'] for feat in payload.get('features', [])]
print(feat_ids)
if trait_ids is not None:
package.features.set(feat_ids)
package.save()
return HttpResponse('''
<script>
UIkit.notification({message: "Feature Updated Successfully!", status: "success", pos: "top-center"})
</script>
''')
except Exception as e:
return HttpResponse('''
<script>
UIkit.notification({message: "Feature Update Unsuccessful, there appears to have been an error!", status: "danger", pos: "top-center"})
</script>
''')
elif request.method == 'GET':
traits = package.package_traits.all()
traits = [trait.to_json() for trait in traits]
features = package.features.all()
features = [feat.to_json() for feat in features]
return render(request, 'main/test_package.html', {'system': system, 'package': package, 'traits': traits, 'features':features })
def package_new(request, system):
if request.method == 'GET':
return render(request, 'main/test_package.html', {'system': system})
elif request.method == 'POST':
payload_json = request.POST.get('package_payload')
try:
payload = json.loads(payload_json)
print('---PAYLOAD---')
print(json.dumps(payload, indent=2))
feature = Feature.objects.create(
feature_name=payload.get('feature_name'),
feature_description=payload.get('feature_description'),
feature_system=str(system),
feature_requirements=payload.get('feature_requirements'),
feature_data=payload.get('feature_data')
)
trait_ids = [trait['id'] for trait in payload.get('feature_traits', [])]
if trait_ids is not None:
feature.feature_traits.set(trait_ids)
response = HttpResponse(status=204)
response['HX-Redirect'] = f'/{system}/feature/{feature.id}'
return response
except Exception as e:
print('Failed to parse payload:', str(e))
payload = None
return HttpResponse('<div class="uk-alert-success">Payload printed to server log.</div>', content_type="text/html")
def packages_list(request, system):
packages = Package.objects.filter(package_system=system)
return render(request, "main/packages_list.html", {
"packages": packages,
"system": system
})
def feature_detail(request, system, feature_uuid):
feature = get_object_or_404(Feature, id=feature_uuid)
if request.method == 'POST':
try:
payload = json.loads(request.POST.get('feature_payload'))
feature.feature_name = payload.get('feature_name')
feature.feature_description = payload.get('feature_description')
feature.feature_requirements = payload.get('feature_requirements')
feature.feature_data = payload.get('feature_data')
feature.save()
trait_ids = [trait['id'] for trait in payload.get('feature_traits', [])]
print(trait_ids)
if trait_ids is not None:
feature.feature_traits.set(trait_ids)
return HttpResponse('''
<script>
UIkit.notification({message: "Feature Updated Successfully!", status: "success", pos: "top-center"})
</script>
''')
except Exception as e:
return HttpResponse('''
<script>
UIkit.notification({message: "Feature Update Unsuccessful, there appears to have been an error!", status: "danger", pos: "top-center"})
</script>
''')
elif request.method == 'GET':
traits = feature.feature_traits.all()
traits = [trait.to_json() for trait in traits]
return render(request, 'main/test_feature.html', {'system': system, 'feature': feature, 'traits': traits })
def feature_new(request, system):
if request.method == 'GET':
return render(request, 'main/test_feature.html', {'system': system})
elif request.method == 'POST':
payload_json = request.POST.get('feature_payload')
try:
payload = json.loads(payload_json)
print('---PAYLOAD---')
print(json.dumps(payload, indent=2))
feature = Feature.objects.create(
feature_name=payload.get('feature_name'),
feature_description=payload.get('feature_description'),
feature_system=str(system),
feature_requirements=payload.get('feature_requirements'),
feature_data=payload.get('feature_data')
)
trait_ids = [trait['id'] for trait in payload.get('feature_traits', [])]
if trait_ids is not None:
feature.feature_traits.set(trait_ids)
response = HttpResponse(status=204)
response['HX-Redirect'] = f'/{system}/feature/{feature.id}'
return response
except Exception as e:
print('Failed to parse payload:', str(e))
payload = None
return HttpResponse('<div class="uk-alert-success">Payload printed to server log.</div>', content_type="text/html")
def features_list(request, system):
features = Feature.objects.filter(feature_system=system)
return render(request, "main/features_list.html", {
"features": features,
"system": system
})
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)
def trait_search(request):
query = request.GET.get('q', '')
system = request.GET.get('system', '')
traits = ObjectTrait.objects.filter(trait_system=system, trait_name__icontains=query).values('id', 'trait_name')[:20]
return JsonResponse(list(traits), safe=False)