don_confiao_backend/tienda_ilusion/don_confiao/views.py

128 lines
3.7 KiB
Python

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
#from django.template import loader
from django.core.exceptions import ValidationError
from .models import Sale, Product, ProductCategory, Payment
from .forms import ImportProductsForm, PurchaseForm, LineaFormSet, ReconciliationJarForm
import csv
import io
def index(request):
return render(request, 'don_confiao/index.html')
def buy(request):
if request.method == "POST":
sale_form = PurchaseForm(request.POST)
sale_linea_form = LineaFormSet(request.POST)
if sale_form.is_valid() and sale_linea_form.is_valid():
sale = sale_form.save()
lines = sale_linea_form.save(commit=False)
for line in lines:
line.sale = sale
line.save()
return HttpResponseRedirect("compras")
else:
sale_form = PurchaseForm()
sale_linea_form = LineaFormSet()
return render(
request,
'don_confiao/purchase.html',
{
'sale_form': sale_form,
'linea_formset': sale_linea_form
}
)
def purchases(request):
purchases = Sale.objects.all()
context = {
"purchases": purchases,
}
return render(request, 'don_confiao/purchases.html', context)
def products(request):
rproducts = []
products = Product.objects.all()
for product in products:
rproduct = {
"name": product.name,
"price_list": product.price,
"uom": product.measuring_unit,
"categories": [c.name for c in product.categories.all()]
}
rproducts.append(rproduct)
return JsonResponse(rproducts, safe=False)
def import_products(request):
if request.method == "POST":
form = ImportProductsForm(request.POST, request.FILES)
if form.is_valid():
handle_import_products_file(request.FILES["csv_file"])
return HttpResponseRedirect("productos")
else:
form = ImportProductsForm()
return render(
request,
"don_confiao/import_products.html",
{'form': form}
)
def reconciliate_jar(request):
summary = Payment.get_reconciliation_jar_summary()
if request.method == 'POST':
form = ReconciliationJarForm(request.POST)
if form.is_valid():
reconciliation = form.save()
reconciliation.add_payments(summary.payments)
reconciliation.clean()
reconciliation.save()
return HttpResponseRedirect('cuadres')
else:
form = ReconciliationJarForm()
return render(
request,
"don_confiao/reconciliate_jar.html",
{'summary': summary, 'form': form}
)
def reconciliations(request):
return HttpResponse('<h1>Reconciliaciones</h1>')
def _categories_from_csv_string(categories_string, separator="&"):
categories = categories_string.split(separator)
clean_categories = [c.strip() for c in categories]
return [_category_from_name(category) for category in clean_categories]
def _category_from_name(name):
return ProductCategory.objects.get_or_create(name=name)[0]
def handle_import_products_file(csv_file):
data = io.StringIO(csv_file.read().decode('utf-8'))
reader = csv.DictReader(data, quotechar='"')
for row in reader:
product, created = Product.objects.update_or_create(
name=row['producto'],
defaults={
'price': row['precio'],
'measuring_unit': row['unidad']
}
)
categories = _categories_from_csv_string(row["categorias"])
product.categories.clear()
for category in categories:
product.categories.add(category)