Files
marbas/api/views.py

101 lines
3.6 KiB
Python

from django.shortcuts import render
from django.http import JsonResponse
from django.db.models import Q
from django.contrib.auth import models as auth_models
from django.core.cache import cache
from rest_framework import viewsets, permissions, settings
from rest_framework.decorators import api_view
from rest_framework.response import Response
from api import serializers, models
from sde import serializers as sde_serializers, models as sde_models
class UserViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = auth_models.User.objects.all().order_by('-date_joined')
serializer_class = serializers.UserSerializer
permission_classes = [permissions.IsAuthenticated]
class GroupViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows groups to be viewed or edited.
"""
queryset = auth_models.Group.objects.all()
serializer_class = serializers.GroupSerializer
permission_classes = [permissions.IsAuthenticated]
class AcquisitionViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows acquisitions to be viewed or edited.
"""
queryset = models.Acquisition.objects.all().order_by('-date')
serializer_class = serializers.AcquisitionSerializer
permission_classes = [permissions.IsAuthenticated]
@api_view(['POST'])
def custom_types_search(request):
cache_key = f"custom_types_search_{request.data}"
items = cache.get(cache_key, [])
if not items:
for q in request.data:
conditions = Q()
for k in q.keys():
value = q[k]
token = k.split('___')
key, mods = token[0], token[1:]
cond = Q(**{key: value})
if "not" in mods:
cond = ~cond
conditions = conditions & cond
items.extend(sde_models.SDEType.objects.filter(conditions))
cache.set(cache_key, items, 60 * 60)
paginator = settings.api_settings.DEFAULT_PAGINATION_CLASS()
result_page = paginator.paginate_queryset(items, request)
serializer = sde_serializers.SDETypeSerializer(result_page, many=True)
return paginator.get_paginated_response(serializer.data)
@api_view(['POST'])
def reprocess_eval(request):
ep_mat = request.data.get("ep_mat")
ep_items = request.data.get("ep_items")
efficiency = request.data.get("efficiency", 0.55)
matprices = {item["typeID"]: {'sell': item["prices"]["sell"]["min"], 'buy': item["prices"]["buy"]["max"]} for item in ep_mat['items']}
item_reprocess = []
for rawitem in ep_items["items"]:
item = sde_models.SDEType.objects.get(id=rawitem["typeID"])
buy_reprocess = sell_reprocess = 0.0
for mat in item.typematerials.all():
try:
buy_reprocess += matprices[mat.material_type_id]['buy'] * mat.quantity/item.portionSize * efficiency
sell_reprocess += matprices[mat.material_type_id]['sell'] * mat.quantity/item.portionSize * efficiency
except KeyError as e:
JsonResponse({"error": f"No price for material {e}"})
item_reprocess.append({
"typeID": item.id,
"name": item.name,
"buy": rawitem["prices"]['buy']["max"],
"sell": rawitem["prices"]['sell']["min"],
"buy_reprocess": buy_reprocess,
"sell_reprocess": sell_reprocess,
})
paginator = settings.api_settings.DEFAULT_PAGINATION_CLASS()
result_page = paginator.paginate_queryset(item_reprocess, request)
return paginator.get_paginated_response(result_page)