diff --git a/essenza/product/forms.py b/essenza/product/forms.py index c9369a9..6d54eab 100644 --- a/essenza/product/forms.py +++ b/essenza/product/forms.py @@ -4,6 +4,18 @@ class ProductForm(forms.ModelForm): + photo = forms.ImageField( + label="Foto (Opcional)", required=False, widget=forms.FileInput + ) + remove_photo = forms.BooleanField(required=False, label="Eliminar foto actual") + stock = forms.IntegerField(label="Cantidad en stock", min_value=0, required=False) + is_active = forms.BooleanField( + required=False, label="Producto activo", initial=True + ) + description = forms.CharField( + label="Descripción", widget=forms.Textarea(attrs={"rows": 4}) + ) + class Meta: model = Product fields = [ diff --git a/essenza/product/models.py b/essenza/product/models.py index cb526a4..fe62df7 100644 --- a/essenza/product/models.py +++ b/essenza/product/models.py @@ -16,7 +16,7 @@ class Product(models.Model): brand = models.CharField(max_length=255) price = models.DecimalField(max_digits=10, decimal_places=2) photo = models.ImageField(upload_to="products/", null=True, blank=True) - stock = models.IntegerField() + stock = models.IntegerField(default=0) is_active = models.BooleanField(default=False) def __str__(self): diff --git a/essenza/product/sample/sample.json b/essenza/product/sample/sample.json index 260c486..9237432 100644 --- a/essenza/product/sample/sample.json +++ b/essenza/product/sample/sample.json @@ -1,282 +1,282 @@ [ - { - "model": "product.product", - "pk": 1, - "fields": { - "name": "Maquillaje Base", - "description": "Base líquida para rostro, de acabado mate, 30ml.", - "category": "maquillaje", - "brand": "L'Oréal", - "price": 19.99, - "photo": "products/maquillaje_base.jpg", - "stock": 50, - "is_active": true - } - }, - { - "model": "product.product", - "pk": 2, - "fields": { - "name": "Shampoo Reconstructivo", - "description": "Shampoo nutritivo para cabellos dañados, 500ml.", - "category": "tratamiento", - "brand": "Pantene", - "price": 6.99, - "photo": "products/shampoo_reconstructivo.jpg", - "stock": 100, - "is_active": true - } - }, - { - "model": "product.product", - "pk": 3, - "fields": { - "name": "Secador de Pelo", - "description": "Secador de pelo con 3 niveles de temperatura, 2000W.", - "category": "cabello", - "brand": "Braun", - "price": 45.99, - "photo": "products/secador_pelo.jpg", - "stock": 30, - "is_active": true - } - }, - { - "model": "product.product", - "pk": 4, - "fields": { - "name": "Perfume Floral", - "description": "Perfume con notas de jazmín y rosa, 100ml.", - "category": "perfume", - "brand": "Chanel", - "price": 79.99, - "photo": "products/perfume_floral.jpg", - "stock": 20, - "is_active": true - } - }, - { - "model": "product.product", - "pk": 5, - "fields": { - "name": "Crema Hidratante", - "description": "Crema hidratante para piel seca, 50ml.", - "category": "tratamiento", - "brand": "Nivea", - "price": 12.99, - "photo": "products/crema_hidratante.jpg", - "stock": 150, - "is_active": true - } - }, - { - "model": "product.product", - "pk": 6, - "fields": { - "name": "Rizador de Pelo", - "description": "Rizador de pelo con control de temperatura, 25mm.", - "category": "cabello", - "brand": "Remington", - "price": 29.99, - "photo": "products/rizador_pelo.jpg", - "stock": 40, - "is_active": true - } - }, - { - "model": "product.product", - "pk": 7, - "fields": { - "name": "Gel Antibacterial", - "description": "Gel antibacterial para manos, 250ml.", - "category": "tratamiento", - "brand": "Dettol", - "price": 4.99, - "photo": "products/gel_antibacterial.jpg", - "stock": 200, - "is_active": true - } - }, - { - "model": "product.product", - "pk": 8, - "fields": { - "name": "Shampoo Anticaspa", - "description": "Shampoo anticaspa para cuero cabelludo sensible, 400ml.", - "category": "tratamiento", - "brand": "Head & Shoulders", - "price": 7.99, - "photo": "products/shampoo_anticaspa.jpg", - "stock": 90, - "is_active": true - } - }, - { - "model": "product.product", - "pk": 9, - "fields": { - "name": "Aceite Capilar", - "description": "Aceite nutritivo para el cabello, 150ml.", - "category": "tratamiento", - "brand": "Argan Oil", - "price": 15.99, - "photo": "products/aceite_capilar.jpg", - "stock": 60, - "is_active": true - } - }, - { - "model": "product.product", - "pk": 10, - "fields": { - "name": "Tinte de Cabello", - "description": "Tinte permanente para cabello, color castaño claro.", - "category": "cabello", - "brand": "Garnier", - "price": 8.99, - "photo": "products/tinte_cabello.jpg", - "stock": 110, - "is_active": true - } - }, - { - "model": "product.product", - "pk": 11, - "fields": { - "name": "Mascarilla Facial", - "description": "Mascarilla hidratante para todo tipo de piel, 100ml.", - "category": "tratamiento", - "brand": "L'Oréal", - "price": 18.99, - "photo": "products/mascarilla_facial.jpg", - "stock": 80, - "is_active": true - } - }, - { - "model": "product.product", - "pk": 12, - "fields": { - "name": "Shampoo Voluminizador", - "description": "Shampoo voluminizador para cabellos finos, 300ml.", - "category": "tratamiento", - "brand": "TRESemmé", - "price": 5.99, - "photo": "products/shampoo_voluminizador.jpg", - "stock": 120, - "is_active": true - } - }, - { - "model": "product.product", - "pk": 13, - "fields": { - "name": "Laca de Pelo", - "description": "Laca fijadora para todo el día, 400ml.", - "category": "cabello", - "brand": "Schwarzkopf", - "price": 10.99, - "photo": "products/laca_pelo.jpg", - "stock": 70, - "is_active": true - } - }, - { - "model": "product.product", - "pk": 14, - "fields": { - "name": "Crema Solar", - "description": "Protección solar SPF 50+, 200ml.", - "category": "tratamiento", - "brand": "Hawaiian Tropic", - "price": 14.99, - "photo": "products/crema_solar.jpg", - "stock": 40, - "is_active": true - } - }, - { - "model": "product.product", - "pk": 15, - "fields": { - "name": "Crema Antiedad", - "description": "Crema antiarrugas para el rostro, 50ml.", - "category": "tratamiento", - "brand": "Olay", - "price": 25.99, - "photo": "products/crema_antiedad.jpg", - "stock": 30, - "is_active": true - } - }, - { - "model": "product.product", - "pk": 16, - "fields": { - "name": "Desodorante", - "description": "Desodorante en barra, 75g.", - "category": "tratamiento", - "brand": "Dove", - "price": 3.99, - "photo": "products/desodorante.jpg", - "stock": 150, - "is_active": true - } - }, - { - "model": "product.product", - "pk": 17, - "fields": { - "name": "Toallitas Desmaquillantes", - "description": "Toallitas para desmaquillar, 25 unidades.", - "category": "tratamiento", - "brand": "Neutrogena", - "price": 4.49, - "photo": "products/toallitas_desmaquillantes.jpg", - "stock": 90, - "is_active": true - } - }, - { - "model": "product.product", - "pk": 18, - "fields": { - "name": "Pincel de Maquillaje", - "description": "Pincel para base líquida, cerdas suaves.", - "category": "maquillaje", - "brand": "Real Techniques", - "price": 12.99, - "photo": "products/pincel_maquillaje.jpg", - "stock": 110, - "is_active": true - } - }, - { - "model": "product.product", - "pk": 19, - "fields": { - "name": "Crema para Pies", - "description": "Crema reparadora para pies agrietados, 100ml.", - "category": "tratamiento", - "brand": "Eucerin", - "price": 9.99, - "photo": "products/crema_pies.jpg", - "stock": 80, - "is_active": true - } - }, - { - "model": "product.product", - "pk": 20, - "fields": { - "name": "Limpieza Facial", - "description": "Gel limpiador facial suave, 200ml.", - "category": "tratamiento", - "brand": "Neutrogena", - "price": 7.49, - "photo": "products/limpieza_facial.jpg", - "stock": 130, - "is_active": true - } + { + "model": "product.product", + "pk": 1, + "fields": { + "name": "Maquillaje Base", + "description": "Base líquida para rostro, de acabado mate, 30ml.", + "category": "maquillaje", + "brand": "L'Oréal", + "price": 19.99, + "photo": "products/maquillaje_base.jpg", + "stock": 50, + "is_active": true } + }, + { + "model": "product.product", + "pk": 2, + "fields": { + "name": "Champú Reconstructivo", + "description": "Champú nutritivo para cabellos dañados, 500ml.", + "category": "tratamiento", + "brand": "Pantene", + "price": 6.99, + "photo": "products/shampoo_reconstructivo.jpg", + "stock": 100, + "is_active": true + } + }, + { + "model": "product.product", + "pk": 3, + "fields": { + "name": "Secador de Pelo", + "description": "Secador de pelo con 3 niveles de temperatura, 2000W.", + "category": "cabello", + "brand": "Braun", + "price": 45.99, + "photo": "products/secador_pelo.jpg", + "stock": 30, + "is_active": true + } + }, + { + "model": "product.product", + "pk": 4, + "fields": { + "name": "Perfume Floral", + "description": "Perfume con notas de jazmín y rosa, 100ml.", + "category": "perfume", + "brand": "Chanel", + "price": 79.99, + "photo": "products/perfume_floral.jpg", + "stock": 20, + "is_active": true + } + }, + { + "model": "product.product", + "pk": 5, + "fields": { + "name": "Crema Hidratante", + "description": "Crema hidratante para piel seca, 50ml.", + "category": "tratamiento", + "brand": "Nivea", + "price": 12.99, + "photo": "products/crema_hidratante.jpg", + "stock": 150, + "is_active": true + } + }, + { + "model": "product.product", + "pk": 6, + "fields": { + "name": "Rizador de Pelo", + "description": "Rizador de pelo con control de temperatura, 25mm.", + "category": "cabello", + "brand": "Remington", + "price": 29.99, + "photo": "products/rizador_pelo.jpg", + "stock": 40, + "is_active": true + } + }, + { + "model": "product.product", + "pk": 7, + "fields": { + "name": "Gel Antibacterial", + "description": "Gel antibacterial para manos, 250ml.", + "category": "tratamiento", + "brand": "Dettol", + "price": 4.99, + "photo": "products/gel_antibacterial.jpg", + "stock": 200, + "is_active": true + } + }, + { + "model": "product.product", + "pk": 8, + "fields": { + "name": "Champú Anticaspa", + "description": "Champú anticaspa para cuero cabelludo sensible, 400ml.", + "category": "tratamiento", + "brand": "Head & Shoulders", + "price": 7.99, + "photo": "products/shampoo_anticaspa.jpg", + "stock": 90, + "is_active": true + } + }, + { + "model": "product.product", + "pk": 9, + "fields": { + "name": "Aceite Capilar", + "description": "Aceite nutritivo para el cabello, 150ml.", + "category": "tratamiento", + "brand": "Argan Oil", + "price": 15.99, + "photo": "products/aceite_capilar.jpg", + "stock": 60, + "is_active": true + } + }, + { + "model": "product.product", + "pk": 10, + "fields": { + "name": "Tinte de Pelo", + "description": "Tinte permanente para pelo, color castaño claro.", + "category": "cabello", + "brand": "Garnier", + "price": 8.99, + "photo": "products/tinte_cabello.jpg", + "stock": 110, + "is_active": true + } + }, + { + "model": "product.product", + "pk": 11, + "fields": { + "name": "Mascarilla Facial", + "description": "Mascarilla hidratante para todo tipo de piel, 100ml.", + "category": "tratamiento", + "brand": "L'Oréal", + "price": 18.99, + "photo": "products/mascarilla_facial.jpg", + "stock": 80, + "is_active": true + } + }, + { + "model": "product.product", + "pk": 12, + "fields": { + "name": "Champú Voluminizador", + "description": "Champú voluminizador para cabellos finos, 300ml.", + "category": "tratamiento", + "brand": "TRESemmé", + "price": 5.99, + "photo": "products/shampoo_voluminizador.jpg", + "stock": 120, + "is_active": true + } + }, + { + "model": "product.product", + "pk": 13, + "fields": { + "name": "Laca de Pelo", + "description": "Laca fijadora para todo el día, 400ml.", + "category": "cabello", + "brand": "Schwarzkopf", + "price": 10.99, + "photo": "products/laca_pelo.jpg", + "stock": 70, + "is_active": true + } + }, + { + "model": "product.product", + "pk": 14, + "fields": { + "name": "Crema Solar", + "description": "Protección solar SPF 50+, 200ml.", + "category": "tratamiento", + "brand": "Hawaiian Tropic", + "price": 14.99, + "photo": "products/crema_solar.jpg", + "stock": 40, + "is_active": true + } + }, + { + "model": "product.product", + "pk": 15, + "fields": { + "name": "Crema Antiedad", + "description": "Crema antiarrugas para el rostro, 50ml.", + "category": "tratamiento", + "brand": "Olay", + "price": 25.99, + "photo": "products/crema_antiedad.jpg", + "stock": 30, + "is_active": true + } + }, + { + "model": "product.product", + "pk": 16, + "fields": { + "name": "Desodorante", + "description": "Desodorante en barra, 75g.", + "category": "tratamiento", + "brand": "Dove", + "price": 3.99, + "photo": "products/desodorante.jpg", + "stock": 150, + "is_active": true + } + }, + { + "model": "product.product", + "pk": 17, + "fields": { + "name": "Toallitas Desmaquillantes", + "description": "Toallitas para desmaquillar, 25 unidades.", + "category": "tratamiento", + "brand": "Neutrogena", + "price": 4.49, + "photo": "products/toallitas_desmaquillantes.jpg", + "stock": 90, + "is_active": true + } + }, + { + "model": "product.product", + "pk": 18, + "fields": { + "name": "Pincel de Maquillaje", + "description": "Pincel para base líquida, cerdas suaves.", + "category": "maquillaje", + "brand": "Real Techniques", + "price": 12.99, + "photo": "products/pincel_maquillaje.jpg", + "stock": 110, + "is_active": true + } + }, + { + "model": "product.product", + "pk": 19, + "fields": { + "name": "Crema para Pies", + "description": "Crema reparadora para pies agrietados, 100ml.", + "category": "tratamiento", + "brand": "Eucerin", + "price": 9.99, + "photo": "products/crema_pies.jpg", + "stock": 80, + "is_active": true + } + }, + { + "model": "product.product", + "pk": 20, + "fields": { + "name": "Limpieza Facial", + "description": "Gel limpiador facial suave, 200ml.", + "category": "tratamiento", + "brand": "Neutrogena", + "price": 7.49, + "photo": "products/limpieza_facial.jpg", + "stock": 130, + "is_active": true + } + } ] diff --git a/essenza/product/views.py b/essenza/product/views.py index 783a03f..bb824ea 100644 --- a/essenza/product/views.py +++ b/essenza/product/views.py @@ -118,7 +118,7 @@ def get(self, request, pk): class ProductCreateView(LoginRequiredMixin, UserPassesTestMixin, View): - template_name = "product/form.html" + template_name = "product/create_product.html" form_class = ProductForm def test_func(self): @@ -137,7 +137,7 @@ def post(self, request): class ProductUpdateView(LoginRequiredMixin, UserPassesTestMixin, View): - template_name = "product/form.html" + template_name = "product/update_product.html" form_class = ProductForm def test_func(self): diff --git a/essenza/templates/base.html b/essenza/templates/base.html index 81e3c78..5e04e96 100644 --- a/essenza/templates/base.html +++ b/essenza/templates/base.html @@ -1,313 +1,363 @@ {% load static %} - + - - - {% block title %}Essenza{% endblock %} - - - + .info-button { + display: inline-flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + margin-right: 25px; /* 🔹 más separación del perfil */ + background: linear-gradient(145deg, #c06b3e, #d77b46); + border: 1.5px solid #b35f35; + border-radius: 50%; + color: #fff; + font-family: "Georgia", "Times New Roman", serif; + font-style: italic; + font-weight: bold; + font-size: 16px; + text-decoration: none; + cursor: pointer; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25), + inset 0 1px 1px rgba(255, 255, 255, 0.25); + transition: all 0.25s ease; + } - {% block extra_head %}{% endblock %} - - + .info-button:hover { + background: linear-gradient(145deg, #a35a34, #c06b3e); + transform: scale(1.08); + box-shadow: 0 3px 8px rgba(192, 107, 62, 0.35), + inset 0 1px 2px rgba(255, 255, 255, 0.25); + } -
- - - -
- - {% block content %}{% endblock %} - - - - {% block extra_js %}{% endblock %} - + + + {% block content %}{% endblock %} + + + + {% block extra_js %}{% endblock %} + diff --git a/essenza/templates/product/confirm_delete.html b/essenza/templates/product/confirm_delete.html index eba4f9e..b9ff04b 100644 --- a/essenza/templates/product/confirm_delete.html +++ b/essenza/templates/product/confirm_delete.html @@ -1,151 +1,201 @@ +{% load static %} - - - + + + Confirmar Borrado - Essenza - - + +
- ⚠️ -

¿Está seguro de que desea borrar este producto?

+ ⚠️ +

¿Está seguro de que desea borrar este producto?

+
+ Producto: +
{{ product.name }}
+
-
- Producto: -
{{ product.name }}
-
- +
+ {% csrf_token %} +
+ -

- Esta acción es irreversible y no se puede deshacer. -

- - - - {% csrf_token %} -
- - ← No, cancelar -
- - - -
- 💡 Si borras este producto, se eliminará toda la información asociada. +
+ + +
+ 💡 Si borras este producto, se eliminará toda la información asociada. +
- + - - diff --git a/essenza/templates/product/create_product.html b/essenza/templates/product/create_product.html new file mode 100644 index 0000000..077f1ce --- /dev/null +++ b/essenza/templates/product/create_product.html @@ -0,0 +1,278 @@ +{% load static %} + + + + + Crear Producto · Essenza + + + + +
+

ESSENZA

+
+
+ {% csrf_token %} + + + {{ form.name }} + + + {{ form.description }} + + + {{ form.category }} + + + {{ form.brand }} + + + {{ form.price }} + + + {{ form.photo }} + +
+
+ {{ form.is_active }} + +
+
+ + {% if form.errors %} +
+

+ ¡El formulario tiene errores! +

+ {% for field in form %} {% if field.errors %} +
+ {{ field.label }}: +
    + {% for error in field.errors %} +
  • {{ error }}
  • + {% endfor %} +
+
+ {% endif %} {% endfor %} {% for error in form.non_field_errors %} +
+ Error general: {{ error }} +
+ {% endfor %} +
+ {% endif %} + + + + +
+
+
+ + + + diff --git a/essenza/templates/product/dashboard.html b/essenza/templates/product/dashboard.html index d265d26..ecbc655 100644 --- a/essenza/templates/product/dashboard.html +++ b/essenza/templates/product/dashboard.html @@ -2,7 +2,7 @@ {% load static %} {% load humanize %} -{% block title %}Dashboard · Essenza{% endblock %} +{% block title %}Escaparate · Essenza{% endblock %} {% block content %} @@ -188,8 +197,9 @@

Top Bestsellers

{{ p.name }}
-
{{ p.price|floatformat:2 }} €
{{ p.description }}
+
{{ p.price|floatformat:2 }} €
+ {{ p.get_category_display }}
{% endfor %} {% else %} diff --git a/essenza/templates/product/detail.html b/essenza/templates/product/detail.html index 5b05ce9..d63c4eb 100644 --- a/essenza/templates/product/detail.html +++ b/essenza/templates/product/detail.html @@ -1,180 +1,200 @@ -{% extends "base.html" %} - -{% load static %} - - -{% block title %}{{ product.name }} - Essenza{% endblock %} - -{% block content %} - -
-
-
-
-
- {% if product.photo %} - {{ product.name }} - {% else %} - Foto de producto por defecto - {% endif %} -
-
-

{{ product.name }}

-
{{ product.brand }}
-
€ {{ product.price }}
- {% if product.get_categoria_display %} - {{ product.get_categoria_display }} - {% endif %} -
- Stock: {{ product.stock }} unidades -
-
-
- -
- Descripción: -

{{ product.description }}

+{% extends "base.html" %} {% load static %} {% block title %}{{ product.name }} +- Essenza{% endblock %} {% block content %} + +
+
+
+
+
+ {% if product.photo %} + {{ product.name }} + {% else %} + Foto de producto por defecto + {% endif %}
- -
-
-
Estado
-
- {% if product.is_active %} - ✓ Activo - {% else %} - ✗ Inactivo - {% endif %} -
+
+

{{ product.name }}

+
{{ product.brand }}
+
{{ product.category }}
+
€ {{ product.price }}
+ {% if product.stock == 0 %} + ¡Producto agotado! + {% endif %} {% if product.stock < 10 and product.stock > 0%} + ¡Últimas unidades! + {% endif %} +
+ Descripción: +

{{ product.description }}

-
-
ID Producto
-
#{{ product.id }}
-
-
- -
+
+
-{% endblock %} \ No newline at end of file +
+ {% endblock %} +
diff --git a/essenza/templates/product/detail_user.html b/essenza/templates/product/detail_user.html index 1f7b6f2..c038e20 100644 --- a/essenza/templates/product/detail_user.html +++ b/essenza/templates/product/detail_user.html @@ -1,118 +1,285 @@ -{% extends "base.html" %} -{% load static %} - -{% block title %}{{ product.name }} - Essenza{% endblock %} - -{% block extra_head %} - -{% endblock %} - -{% block content %} -
-
-
- -
-
- {% if product.photo %} - {{ product.name }} - {% else %} - {{ product.name }} - {% endif %} -
- -
-

{{ product.name }}

-
{{ product.brand }}
-
€ {{ product.price }}
- - {% if product.get_categoria_display %} - {{ product.get_categoria_display }} - {% endif %} - -
Stock: {{ product.stock }} unidades
-
-
- - -
- Descripción: -

{{ product.description }}

+{% extends "base.html" %} {% load static %} {% block title %}{{ product.name }} +- Essenza{% endblock %} {% block extra_head %} + +{% endblock %} {% block content %} +
+
+ - -{% endblock %} \ No newline at end of file + +{% endblock %} diff --git a/essenza/templates/product/form.html b/essenza/templates/product/form.html deleted file mode 100644 index f59cd89..0000000 --- a/essenza/templates/product/form.html +++ /dev/null @@ -1,309 +0,0 @@ - - - - - - {% if form.instance.pk %}Editar{% else %}Crear{% endif %} Producto - Essenza - - - -
-
-

{% if form.instance.pk %}Editar producto{% else %} Crear nuevo producto{% endif %}

- - - {% if form.non_field_errors %} -
- Errores: -
    - {% for error in form.non_field_errors %} -
  • {{ error }}
  • - {% endfor %} -
-
- {% endif %} - - -
- {% csrf_token %} - - - {% for field in form %} - {% if field.name == "is_active" %} -
- - {% if field.errors %} -
- {% for error in field.errors %} -
{{ error }}
- {% endfor %} -
- {% endif %} -
- {% elif field.name == "photo" %} -
- - - {% if form.instance.pk and field.value %} -
- - -
- {% endif %} - - - {{ field }} - - {% if field.help_text %} - {{ field.help_text|safe }} - {% endif %} - {% if field.errors %} -
- {% for error in field.errors %} -
{{ error }}
- {% endfor %} -
- {% endif %} -
- {% else %} -
- {{ field.label_tag }} - {{ field }} - {% if field.help_text %} - {{ field.help_text|safe }} - {% endif %} - {% if field.errors %} -
- {% for error in field.errors %} -
{{ error }}
- {% endfor %} -
- {% endif %} -
- {% endif %} - {% endfor %} - - -
- - ← Cancelar -
-
-
-
- - \ No newline at end of file diff --git a/essenza/templates/product/list.html b/essenza/templates/product/list.html index ff3d14b..761e9a3 100644 --- a/essenza/templates/product/list.html +++ b/essenza/templates/product/list.html @@ -1,227 +1,229 @@ -{% extends "base.html" %} +{% extends "base.html" %} {% block title %}Lista de Productos · Essenza +{%endblock %} {% block content %} {% load static %} + -
-
-

🌸 Productos Essenza

- + +
+
+

Productos Essenza

+ - {% if products %} -
- {% for product in products %} -
-
- {% if product.photo %} - {{ product.name }} - {% else %} - Sin imagen - {% endif %} -
-
-
{{ product.name }}
-
{{ product.brand }}
-
€ {{ product.price }}
-
Stock: {{ product.stock }}
-
- Ver - Editar - Borrar -
-
+ {% if products %} +
+ {% for product in products %} +
+
+ {% if product.photo %} + {{ product.name }} + {% else %} + Sin imagen + {% endif %}
- {% endfor %} -
- {% else %} -
-

- No hay productos disponibles. - ¡Crea uno! -

-
- {% endif %} - + {% endfor %} +
+ {% else %} +
+

+ No hay productos disponibles. + ¡Crea uno! +

+
+ {% endif %} + -{% endblock %} \ No newline at end of file +
+
+{% endblock %} diff --git a/essenza/templates/product/update_product.html b/essenza/templates/product/update_product.html new file mode 100644 index 0000000..ca0747f --- /dev/null +++ b/essenza/templates/product/update_product.html @@ -0,0 +1,285 @@ +{% load static %} + + + + + Editar Producto · Essenza + + + + +
+

ESSENZA

+
+
+ {% csrf_token %} + + + {{ form.name }} + + + {{ form.description }} + + + {{ form.category }} + + + {{ form.brand }} + + + {{ form.price }} + + + {{ form.photo }} + +
+
+ {{ form.remove_photo }} + +
+ +
+ + {{ form.is_active }} +
+
+ + {% if form.errors %} +
+

+ ¡El formulario tiene errores! +

+ {% for field in form %} {% if field.errors %} +
+ {{ field.label }}: +
    + {% for error in field.errors %} +
  • {{ error }}
  • + {% endfor %} +
+
+ {% endif %} {% endfor %} {% for error in form.non_field_errors %} +
+ Error general: {{ error }} +
+ {% endfor %} +
+ {% endif %} + + + + +
+
+
+ + + + diff --git a/essenza/templates/user/edit_profile.html b/essenza/templates/user/edit_profile.html index 9eee2cc..b77587e 100644 --- a/essenza/templates/user/edit_profile.html +++ b/essenza/templates/user/edit_profile.html @@ -174,14 +174,6 @@

ESSENZA

>
{% endif %} {% if form.errors %} -
- {% for field in form %} {% for error in field.errors %} -

{{ error }}

- {% endfor %} {% endfor %} {% for error in form.non_field_errors %} -

{{ error }}

- {% endfor %} -
- {% endif %} {% if form.errors %}
+ /* Scoped styles for the profile page to avoid overriding base styles */ + :root { + --color-principal: #c06b3e; + --color-principal-hover: #a35a34; + --color-error: #b00020; + } + .profile-page { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 2rem; + } + .profile-brand { + color: var(--color-principal); + font-size: 48px; + margin-bottom: 10px; + text-align: center; + } + .form-card { + width: min(420px, 88vw); + background: #fff; + border: 2px solid var(--color-principal); + border-radius: 16px; + box-shadow: 0 12px 28px rgba(0, 0, 0, 0.06); + padding: 22px 24px; + box-sizing: border-box; + } + .btn-primary { + display: block; + width: 100%; + max-width: 260px; + margin: 14px auto 0; + padding: 10px 12px; + border-radius: 10px; + background: var(--color-principal); + color: #fff; + border: none; + cursor: pointer; + transition: background-color 0.3s; + text-decoration: none; + text-align: center; + } + .btn-primary:hover { + background-color: var(--color-principal-hover); + } + .login-link { + margin-top: 15px; + text-align: center; + font-size: 13px; + } + .login-link a { + color: var(--color-principal); + text-decoration: underline; + } + .profile-pic { + width: 150px; + height: 150px; + border-radius: 50%; + object-fit: cover; + display: block; + margin: 10px auto; + border: 2px solid var(--color-principal); + } + .profile-data p { + font-size: 16px; + color: #333; + border-bottom: 1px solid #eee; + padding: 10px 0; + } + .profile-data strong { + color: var(--color-principal); + } + @media (max-width: 600px) { + .profile-brand { + font-size: 34px; + } + .form-card { + padding: 18px; + } + } + -{% block content %} +
+

ESSENZA

- +
+ {% if user.photo %} + Foto de perfil + {% else %} + Foto de perfil por defecto + {% endif %} -
-

ESSENZA

- -
- {% if user.photo %} - Foto de perfil - {% else %} - Foto de perfil por defecto - {% endif %} - -
-

Nombre: {{ user.first_name }}

-

Apellidos: {{ user.last_name }}

-

Email: {{ user.email }}

-
- - Editar mis datos - +
+

Nombre: {{ user.first_name }}

+

Apellidos: {{ user.last_name }}

+

Email: {{ user.email }}

+ + Editar mis datos +
+
-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/essenza/user/sample/sample.json b/essenza/user/sample/sample.json index 643cffc..abcbead 100644 --- a/essenza/user/sample/sample.json +++ b/essenza/user/sample/sample.json @@ -48,7 +48,6 @@ "last_name": "admin", "is_superuser": true, "is_staff": true, - "is_active": true, "photo": "profile_pics/admin.jpg", "role": "admin", "password": "pbkdf2_sha256$1000000$sazfnRvfJ4niYZE6ixBVKR$pboaUb8AWvEXwuJZkWoh3xwfYq++7nik9p2e0TxNPws="