From 23ec2bc298961100f5ad911b659437304665b23e Mon Sep 17 00:00:00 2001 From: Mono Mono Date: Sat, 24 Aug 2024 10:30:58 -0500 Subject: [PATCH 1/4] refactor: move Products list logic to model. --- tienda_ilusion/don_confiao/models.py | 14 ++++++++++++++ tienda_ilusion/don_confiao/views.py | 13 +------------ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/tienda_ilusion/don_confiao/models.py b/tienda_ilusion/don_confiao/models.py index 71772d1..eb7d0a9 100644 --- a/tienda_ilusion/don_confiao/models.py +++ b/tienda_ilusion/don_confiao/models.py @@ -37,6 +37,20 @@ class Product(models.Model): def __str__(self): return self.name + @classmethod + def to_list(cls): + products_list = [] + all_products = cls.objects.all() + for product in all_products: + rproduct = { + "name": product.name, + "price_list": product.price, + "uom": product.measuring_unit, + "categories": [c.name for c in product.categories.all()] + } + products_list.append(rproduct) + return products_list + class Sale(models.Model): customer = models.ForeignKey(Customer, on_delete=models.PROTECT) diff --git a/tienda_ilusion/don_confiao/views.py b/tienda_ilusion/don_confiao/views.py index 63169c4..962c605 100644 --- a/tienda_ilusion/don_confiao/views.py +++ b/tienda_ilusion/don_confiao/views.py @@ -60,18 +60,7 @@ def purchases(request): 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) + return JsonResponse(Product.to_list(), safe=False) def import_products(request): From f1d96467d6ecd145031536597b65da0dda3929b0 Mon Sep 17 00:00:00 2001 From: Mono Mono Date: Sat, 31 Aug 2024 09:46:03 -0500 Subject: [PATCH 2/4] feat(buy): send products list to buy view. --- .../templates/don_confiao/purchase.html | 5 ++++- .../don_confiao/tests/test_buy_form.py | 22 +++++++++++++++++++ tienda_ilusion/don_confiao/views.py | 9 ++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 tienda_ilusion/don_confiao/tests/test_buy_form.py diff --git a/tienda_ilusion/don_confiao/templates/don_confiao/purchase.html b/tienda_ilusion/don_confiao/templates/don_confiao/purchase.html index 4386551..0a23b0e 100644 --- a/tienda_ilusion/don_confiao/templates/don_confiao/purchase.html +++ b/tienda_ilusion/don_confiao/templates/don_confiao/purchase.html @@ -1,6 +1,9 @@ {% extends 'don_confiao/base.html' %} {% block content %} {% load static %} +
@@ -15,7 +18,6 @@
{% endfor %}
-
@@ -26,6 +28,7 @@ {{ summary_form }} + diff --git a/tienda_ilusion/don_confiao/tests/test_buy_form.py b/tienda_ilusion/don_confiao/tests/test_buy_form.py new file mode 100644 index 0000000..5a61817 --- /dev/null +++ b/tienda_ilusion/don_confiao/tests/test_buy_form.py @@ -0,0 +1,22 @@ +from django.test import Client, TestCase +from ..models import Product + + +class TestBuyForm(TestCase): + def setUp(self): + self.client = Client() + self.product = Product() + self.product.name = "Arroz" + self.product.price = 5000 + self.product.save() + + def test_buy_contains_products_list(self): + response = self.client.get('/don_confiao/comprar') + self.assertIn( + self.product.name, + response.context['list_products'] + ) + content = response.content.decode('utf-8') + self.assertIn('5000', content) + self.assertIn('Arroz', content) + self.assertIn(str(self.product.id), content) diff --git a/tienda_ilusion/don_confiao/views.py b/tienda_ilusion/don_confiao/views.py index 962c605..35b0e0d 100644 --- a/tienda_ilusion/don_confiao/views.py +++ b/tienda_ilusion/don_confiao/views.py @@ -8,8 +8,16 @@ from .forms import ImportProductsForm, PurchaseForm, SaleLineFormSet, Reconcilia import csv import io +import json +from decimal import Decimal +class DecimalEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, Decimal): + return float(obj) + return json.JSONEncoder.default(self, obj) + def index(request): return render(request, 'don_confiao/index.html') @@ -47,6 +55,7 @@ def buy(request): 'sale_form': sale_form, 'linea_formset': line_formset, 'summary_form': sale_summary_form, + 'list_products': json.dumps(Product.to_list(), cls=DecimalEncoder), } ) From 1b1a504bf50ca17546e96c5e111ef75ea3efbe87 Mon Sep 17 00:00:00 2001 From: Mono Mono Date: Sat, 31 Aug 2024 12:04:01 -0500 Subject: [PATCH 3/4] feat(view): set price based on product select on first line from purchase. --- tienda_ilusion/don_confiao/models.py | 1 + .../don_confiao/static/js/buy_general.js | 25 +++++++++++++++++++ .../templates/don_confiao/purchase.html | 1 + 3 files changed, 27 insertions(+) create mode 100644 tienda_ilusion/don_confiao/static/js/buy_general.js diff --git a/tienda_ilusion/don_confiao/models.py b/tienda_ilusion/don_confiao/models.py index eb7d0a9..1c50852 100644 --- a/tienda_ilusion/don_confiao/models.py +++ b/tienda_ilusion/don_confiao/models.py @@ -43,6 +43,7 @@ class Product(models.Model): all_products = cls.objects.all() for product in all_products: rproduct = { + "id": product.id, "name": product.name, "price_list": product.price, "uom": product.measuring_unit, diff --git a/tienda_ilusion/don_confiao/static/js/buy_general.js b/tienda_ilusion/don_confiao/static/js/buy_general.js new file mode 100644 index 0000000..b910945 --- /dev/null +++ b/tienda_ilusion/don_confiao/static/js/buy_general.js @@ -0,0 +1,25 @@ +setPriceListeners(); + +function setPriceListeners() { + document.querySelectorAll('select[id^="id_saleline_set-"][id$="-product"]').forEach((input) => { + console.log('setPriceListenersForeach'); + console.log(input.id); + input.addEventListener('change', (e) => setLinePrice(e)); + }); +} + +function setLinePrice(e) { + console.log('setLinePrice'); + let input = e.target; + const idLine = input.id.split('-')[1]; + const productId = input.value; + const priceInput = document.getElementById(`id_saleline_set-${idLine}-unit_price`); + + const product = listProducts.find((product) => product.id == productId); + if (product) { + priceInput.value = product.price_list; + } else { + priceInput.value = ''; + } +} + diff --git a/tienda_ilusion/don_confiao/templates/don_confiao/purchase.html b/tienda_ilusion/don_confiao/templates/don_confiao/purchase.html index 0a23b0e..8fa028d 100644 --- a/tienda_ilusion/don_confiao/templates/don_confiao/purchase.html +++ b/tienda_ilusion/don_confiao/templates/don_confiao/purchase.html @@ -32,6 +32,7 @@ + From 99ae098c1d0c3773e04e18dadec70465bceb7822 Mon Sep 17 00:00:00 2001 From: Mono Mono Date: Sat, 31 Aug 2024 12:38:17 -0500 Subject: [PATCH 4/4] fix(Purchase): set price based on product in all lines. --- tienda_ilusion/don_confiao/static/js/add_line.js | 1 + tienda_ilusion/don_confiao/static/js/buy_general.js | 3 --- tienda_ilusion/don_confiao/templates/don_confiao/purchase.html | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/tienda_ilusion/don_confiao/static/js/add_line.js b/tienda_ilusion/don_confiao/static/js/add_line.js index 4f6bc25..ab448ff 100644 --- a/tienda_ilusion/don_confiao/static/js/add_line.js +++ b/tienda_ilusion/don_confiao/static/js/add_line.js @@ -25,5 +25,6 @@ document.addEventListener('DOMContentLoaded', function(){ formContainer.appendChild(newForm); totalForms.value = formCount + 1; + setPriceListeners(); }); }); diff --git a/tienda_ilusion/don_confiao/static/js/buy_general.js b/tienda_ilusion/don_confiao/static/js/buy_general.js index b910945..db2a719 100644 --- a/tienda_ilusion/don_confiao/static/js/buy_general.js +++ b/tienda_ilusion/don_confiao/static/js/buy_general.js @@ -2,14 +2,11 @@ setPriceListeners(); function setPriceListeners() { document.querySelectorAll('select[id^="id_saleline_set-"][id$="-product"]').forEach((input) => { - console.log('setPriceListenersForeach'); - console.log(input.id); input.addEventListener('change', (e) => setLinePrice(e)); }); } function setLinePrice(e) { - console.log('setLinePrice'); let input = e.target; const idLine = input.id.split('-')[1]; const productId = input.value; diff --git a/tienda_ilusion/don_confiao/templates/don_confiao/purchase.html b/tienda_ilusion/don_confiao/templates/don_confiao/purchase.html index 8fa028d..359ae76 100644 --- a/tienda_ilusion/don_confiao/templates/don_confiao/purchase.html +++ b/tienda_ilusion/don_confiao/templates/don_confiao/purchase.html @@ -19,7 +19,7 @@ {% endfor %}
- +