154 lines
6.3 KiB
Python
154 lines
6.3 KiB
Python
from django.shortcuts import render
|
|
from rest_framework.response import Response
|
|
from rest_framework import generics, status
|
|
from django.http import JsonResponse
|
|
import json
|
|
import requests
|
|
from django.db.models import Count
|
|
from rest_framework.permissions import IsAuthenticated
|
|
from .models import Product, Rekomendasi
|
|
from recipes.models import Information, Ingredient, Unit, RawIngredient, Tag
|
|
from profiles.models import Pantry
|
|
from django.db.models import Q, Subquery, OuterRef, Func, F, Count
|
|
from .serializers import ProductSerializer
|
|
|
|
# Create your views here.
|
|
|
|
|
|
class ProductView(generics.GenericAPIView):
|
|
def post(self, request):
|
|
Product.objects.all().delete()
|
|
panenpanen_data = requests.get(
|
|
'http://127.0.0.1:8080/api/v1/easycook/products')
|
|
json_data = panenpanen_data.json()
|
|
products = json_data.get('data', [])
|
|
for product in products:
|
|
id_product = product.get('id')
|
|
nama_bahan = product.get('nama_bahan')
|
|
harga = product.get('harga')
|
|
berat = product.get('berat')
|
|
satuan = product.get('satuan')
|
|
nama_supplier = product.get('nama_supplier')
|
|
alamat = product.get('alamat-supplier')
|
|
data = Product(id_product=id_product, nama_bahan=nama_bahan, harga=harga,
|
|
berat=berat, satuan=satuan, nama_supplier=nama_supplier, alamat=alamat)
|
|
# data.save()
|
|
|
|
response_data = {
|
|
'data': 'Data berhasil disimpan',
|
|
'status': 'success',
|
|
}
|
|
return JsonResponse(response_data)
|
|
|
|
|
|
class RekomendasiView(generics.GenericAPIView):
|
|
serializer_class = ProductSerializer
|
|
|
|
def get_queryset(self):
|
|
return Information.objects.filter(pk=self.kwargs['id']).prefetch_related('ingredient_set')
|
|
|
|
def get(self, request, id):
|
|
user = request.user
|
|
Rekomendasi.objects.filter(user_id=user.id).delete()
|
|
# Product.objects.all().delete()
|
|
recipe = Information.objects.filter(pk=self.kwargs['id'])
|
|
recipe_id = recipe.get().id
|
|
|
|
# panenpanen_data = requests.get(
|
|
# 'http://152.69.206.130:80/api/v1/easycook/products')
|
|
# json_data = panenpanen_data.json()
|
|
# products = json_data.get('data', [])
|
|
# for product in products:
|
|
# id_product = product.get('id')
|
|
# nama_bahan = product.get('nama_bahan')
|
|
# harga = product.get('harga')
|
|
# berat = product.get('berat')
|
|
# satuan = product.get('satuan')
|
|
# nama_supplier = product.get('nama_supplier')
|
|
# alamat = product.get('alamat-supplier')
|
|
# data = Product(id_product=id_product, nama_bahan=nama_bahan, harga=harga,
|
|
# berat=berat, satuan=satuan, nama_supplier=nama_supplier, alamat=alamat)
|
|
# data.save()
|
|
|
|
owned_raw_materials = Pantry.objects.filter(
|
|
user=request.user).values_list('raw_ingredient', flat=True)
|
|
|
|
owned_raw_ingredient_ids = Pantry.objects.filter(
|
|
user=user).values_list('raw_ingredient_id', flat=True)
|
|
not_owned_ingredients = Ingredient.objects.filter(
|
|
recipe_id=recipe_id).exclude(raw_ingredient__in=owned_raw_ingredient_ids)
|
|
|
|
for bahan in not_owned_ingredients:
|
|
nama_bahan = bahan.name
|
|
products = Product.objects.filter(
|
|
nama_bahan__icontains=nama_bahan)
|
|
for product in products:
|
|
rekomendasi = Rekomendasi(
|
|
product_id=product.id, user_id=user.id, supplier=product.nama_supplier)
|
|
rekomendasi.save()
|
|
|
|
rangking = Rekomendasi.objects.values('supplier').annotate(
|
|
count=Count('supplier')).order_by('-count')
|
|
data = Rekomendasi.objects.filter(user_id=user.id)
|
|
datas = list(data.values())
|
|
|
|
supplier_data = {}
|
|
rekomendasi_bahan = []
|
|
for data in datas:
|
|
product = Product.objects.get(id=data['product_id'])
|
|
supplier = data['supplier']
|
|
if supplier not in supplier_data:
|
|
supplier_data[supplier] = []
|
|
supplier_data[supplier].append({
|
|
'nama_bahan': product.nama_bahan,
|
|
'harga': product.harga,
|
|
'satuan': product.satuan,
|
|
'alamat': product.alamat,
|
|
'berat': product.berat,
|
|
'id_product': product.id_product,
|
|
'nama_supplier': product.nama_supplier,
|
|
|
|
})
|
|
|
|
rangking_list = []
|
|
for rank in rangking:
|
|
supplier = rank['supplier']
|
|
count = rank['count']
|
|
products = supplier_data.get(supplier, [])
|
|
rangking_list.append({
|
|
'nama_supplier': supplier,
|
|
'jumlah_kesesuaian_bahan': count,
|
|
'produk': products
|
|
})
|
|
|
|
return JsonResponse(rangking_list, safe=False)
|
|
|
|
|
|
class RecipeRecomendationView(generics.GenericAPIView):
|
|
def get_owned_ingredients(self, user):
|
|
pantry_items = Pantry.objects.filter(
|
|
user=user).values_list('raw_material_id', flat=True)
|
|
owned_ingredients = IngredientTag.objects.filter(
|
|
raw_material_id__in=pantry_items).values_list('ingredient_id', flat=True).distinct()
|
|
return list(owned_ingredients)
|
|
|
|
def get_recipes_with_completeness_percentage(self, request):
|
|
user_count_subquery = IngredientTag.objects.filter(ingredient__recipe_id=OuterRef(
|
|
'pk'), raw_material__pantry__user_id=request.user.id).annotate(count=Func(F("raw_material__pantry__id"), function="Count")).values("count")
|
|
recipes = Information.objects.annotate(completeness_percentage=Subquery(
|
|
user_count_subquery) / Count('ingredient') * 100,)
|
|
return recipes
|
|
|
|
def get(self, request):
|
|
user = request.user
|
|
raw_meterials = RawMaterial.objects.all()
|
|
pantry_raw_materials = Pantry.objects.filter(
|
|
user=user).values_list('raw_material_id', flat=True)
|
|
owned_ingredients = self.get_owned_ingredients(user)
|
|
recipes = self.get_recipes_with_completeness_percentage(request).filter(
|
|
ingredient__pk__in=owned_ingredients).order_by('-completeness_percentage').distinct()
|
|
|
|
recipe_data = list(recipes.values())
|
|
|
|
return JsonResponse({"Rekomendasi resep": recipe_data}, safe=False)
|