diff --git a/tienda_ilusion/don_confiao/example_products.csv b/tienda_ilusion/don_confiao/example_products.csv new file mode 100644 index 0000000..092a32f --- /dev/null +++ b/tienda_ilusion/don_confiao/example_products.csv @@ -0,0 +1,4 @@ +"producto","unidad","precio","categorias" +"Aceite de Coco Artesanal 500ml","Unidad", 50000,"Aceites&Alimentos" +"Café 500ml","Unidad", 14000,"Cafes&Alimentos" +"Café 250ml","Unidad", 7000,"Cafes&Alimentos" diff --git a/tienda_ilusion/don_confiao/forms.py b/tienda_ilusion/don_confiao/forms.py new file mode 100644 index 0000000..a9ef913 --- /dev/null +++ b/tienda_ilusion/don_confiao/forms.py @@ -0,0 +1,4 @@ +from django import forms + +class ImportProductsForm(forms.Form): + csv_file = forms.FileField() diff --git a/tienda_ilusion/don_confiao/migrations/0009_productcategory_product.py b/tienda_ilusion/don_confiao/migrations/0009_productcategory_product.py new file mode 100644 index 0000000..6c7e15f --- /dev/null +++ b/tienda_ilusion/don_confiao/migrations/0009_productcategory_product.py @@ -0,0 +1,30 @@ +# Generated by Django 5.0.6 on 2024-06-29 18:55 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('don_confiao', '0008_alter_sale_phone_alter_saleline_description'), + ] + + operations = [ + migrations.CreateModel( + name='ProductCategory', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ], + ), + migrations.CreateModel( + name='Product', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('price', models.DecimalField(decimal_places=2, max_digits=9)), + ('measuring_unit', models.CharField(choices=[('UNIT', 'Unit')], default='UNIT', max_length=20)), + ('categories', models.ManyToManyField(to='don_confiao.productcategory')), + ], + ), + ] diff --git a/tienda_ilusion/don_confiao/models.py b/tienda_ilusion/don_confiao/models.py index afe69e5..cdd9bc7 100644 --- a/tienda_ilusion/don_confiao/models.py +++ b/tienda_ilusion/don_confiao/models.py @@ -1,5 +1,5 @@ from django.db import models - +from django.utils.translation import gettext_lazy as _ class Sale(models.Model): @@ -16,3 +16,25 @@ class SaleLine(models.Model): quantity = models.IntegerField(null=True) unit_price = models.DecimalField(max_digits=9, decimal_places=2) description = models.CharField(max_length=255, null=True, blank=True) + +class MeasuringUnits(models.TextChoices): + UNIT = 'UNIT', _('Unit') + +class ProductCategory(models.Model): + name = models.CharField(max_length=100) + + def __str__(self): + return self.name + +class Product(models.Model): + name = models.CharField(max_length=100) + price = models.DecimalField(max_digits=9, decimal_places=2) + measuring_unit = models.CharField( + max_length=20, + choices=MeasuringUnits.choices, + default=MeasuringUnits.UNIT + ) + categories = models.ManyToManyField(ProductCategory) + + def __str__(self): + return self.name diff --git a/tienda_ilusion/don_confiao/templates/don_confiao/import_products.html b/tienda_ilusion/don_confiao/templates/don_confiao/import_products.html new file mode 100644 index 0000000..376952d --- /dev/null +++ b/tienda_ilusion/don_confiao/templates/don_confiao/import_products.html @@ -0,0 +1,10 @@ +{% if form.is_multipart %} +
diff --git a/tienda_ilusion/don_confiao/templates/don_confiao/index.html b/tienda_ilusion/don_confiao/templates/don_confiao/index.html index 2fbf6b4..7d22ce5 100644 --- a/tienda_ilusion/don_confiao/templates/don_confiao/index.html +++ b/tienda_ilusion/don_confiao/templates/don_confiao/index.html @@ -3,4 +3,5 @@ diff --git a/tienda_ilusion/don_confiao/templates/don_confiao/products_index.html b/tienda_ilusion/don_confiao/templates/don_confiao/products_index.html new file mode 100644 index 0000000..794e290 --- /dev/null +++ b/tienda_ilusion/don_confiao/templates/don_confiao/products_index.html @@ -0,0 +1,12 @@ + diff --git a/tienda_ilusion/don_confiao/test_products.py b/tienda_ilusion/don_confiao/test_products.py new file mode 100644 index 0000000..3713a38 --- /dev/null +++ b/tienda_ilusion/don_confiao/test_products.py @@ -0,0 +1,29 @@ +from django.test import Client, TestCase +from django.contrib.auth.models import AnonymousUser, User +from django.conf import settings + +from .views import import_products, products + +import os +import json + +class TestProducts(TestCase): + def setUp(self): + self.client = Client() + + def test_import_products(self): + app_name = "don_confiao" + app_dir = os.path.join(settings.BASE_DIR, app_name) + example_csv = os.path.join(app_dir, 'example_products.csv') + products_in_example = 3 + with open(example_csv, 'rb') as csv: + response = self.client.post( + "/don_confiao/importar_productos", + {"csv_file": csv} + ) + products_response = self.client.get("/don_confiao/productos") + products = json.loads(products_response.content.decode('utf-8')) + self.assertEqual( + len(products), + products_in_example + ) diff --git a/tienda_ilusion/don_confiao/urls.py b/tienda_ilusion/don_confiao/urls.py index bb2e394..17dc62b 100644 --- a/tienda_ilusion/don_confiao/urls.py +++ b/tienda_ilusion/don_confiao/urls.py @@ -2,9 +2,12 @@ from django.urls import path from . import views +app_name = 'don_confiao' urlpatterns = [ path("", views.index, name="wellcome"), path("comprar", views.buy, name="buy"), path("compras", views.purchases, name="purchases"), path("productos", views.products, name="products"), + path("productos_index", views.products_index, name="products_index"), + path("importar_productos", views.import_products, name="import_products") ] diff --git a/tienda_ilusion/don_confiao/views.py b/tienda_ilusion/don_confiao/views.py index 8a8af33..253eb70 100644 --- a/tienda_ilusion/don_confiao/views.py +++ b/tienda_ilusion/don_confiao/views.py @@ -1,9 +1,12 @@ from django.shortcuts import render -from django.http import HttpResponse, JsonResponse +from django.http import HttpResponse, HttpResponseRedirect, JsonResponse from django.template import loader -from .models import Sale +from .models import Sale, Product +from .forms import ImportProductsForm +import csv +import io def index(request): return render(request, 'don_confiao/index.html') @@ -22,18 +25,42 @@ def purchases(request): def products(request): - products = [ - { - "name": "Aceite de Coco Artesanal 500ml", - "price_list": 50000, - "uom": "Unit", - "category": "Aceites" - }, - { - "name": "Cafe 500ml", - "price_list": 14000, - "uom": "Unit", - "category": "Cafes" - }, - ] - return JsonResponse(products, safe=False) \ No newline at end of file + rproducts = [] + products = Product.objects.all() + for product in products: + rproduct = { + "name": product.name, + "price_list": product.price, + "uom": product.measuring_unit, + "category": ""#.join('&', [c for c in product.categories]) + } + rproducts.append(rproduct) + + return JsonResponse(rproducts, safe=False) + +def products_index(request): + return render(request, 'don_confiao/products_index.html') + +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_index") + else: + form = ImportProductsForm() + return render( + request, + "don_confiao/import_products.html", + {'form': form} + ) + +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 = Product() + product.name = row['producto'] + product.price = row['precio'] + product.measuring_unit = row['unidad'] + product.save()