From f886ec0c57f5672babe637bcb4896dfb340d315d Mon Sep 17 00:00:00 2001 From: Celia Date: Tue, 11 Nov 2025 19:26:01 +0100 Subject: [PATCH 1/2] =?UTF-8?q?Dejar=20de=20rastrear=20db.sqlite3=20(a?= =?UTF-8?q?=C3=B1adido=C2=A0a=C2=A0.gitignore)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- essenza/db.sqlite3 | Bin 176128 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 essenza/db.sqlite3 diff --git a/essenza/db.sqlite3 b/essenza/db.sqlite3 deleted file mode 100644 index 836a999a694fb44e7f735d79c350ef632636facc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176128 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 XkCH&^8a`}Yue)1$qLuevuK)iZz@i^9 From b39908c5dcf135eed2f928ba9dc29437011fc986 Mon Sep 17 00:00:00 2001 From: Celia Date: Tue, 11 Nov 2025 21:03:14 +0100 Subject: [PATCH 2/2] Arreglos de dashboard y desplegable con botones --- essenza/essenza/urls.py | 99 +-------- essenza/product/views.py | 4 +- essenza/templates/info/info.html | 2 +- essenza/templates/product/dashboard.html | 250 ++++++++++++++++++++++ essenza/templates/product/escaparate.html | 130 ----------- essenza/templates/user/register.html | 9 +- essenza/user/forms.py | 11 +- essenza/user/tests.py | 43 ++-- essenza/user/urls.py | 4 +- essenza/user/views.py | 15 +- 10 files changed, 296 insertions(+), 271 deletions(-) create mode 100644 essenza/templates/product/dashboard.html delete mode 100644 essenza/templates/product/escaparate.html diff --git a/essenza/essenza/urls.py b/essenza/essenza/urls.py index e08e7df..8ee6270 100644 --- a/essenza/essenza/urls.py +++ b/essenza/essenza/urls.py @@ -1,106 +1,11 @@ from django.contrib import admin from django.urls import path, include -from django.http import HttpResponse from info.views import info_view -from product.views import EscaparateView -import user - -def home(request): - html = """ - - - Essenza - - - - i -

Bienvenidos a Essenza

-

Tu espacio online de cosmética natural, belleza y cuidado personal.

-

Explora nuestros productos, descubre nuevas fragancias y disfruta de la experiencia Essenza 🌸

- - - - - """ - return HttpResponse(html) +from product.views import DashboardView urlpatterns = [ - path('', home, name='home'), path('info/', info_view, name='info-home'), path("user/", include("user.urls")), path('admin/', admin.site.urls), - path('escaparate/', EscaparateView.as_view(), name='escaparate') + path('', DashboardView.as_view(), name='dashboard') ] \ No newline at end of file diff --git a/essenza/product/views.py b/essenza/product/views.py index a99ceba..181bf31 100644 --- a/essenza/product/views.py +++ b/essenza/product/views.py @@ -1,6 +1,6 @@ from django.shortcuts import render from django.views import View -class EscaparateView(View): +class DashboardView(View): def get(self, request): - return render(request, 'product/escaparate.html') + return render(request, 'product/dashboard.html') diff --git a/essenza/templates/info/info.html b/essenza/templates/info/info.html index f398659..2581f6f 100644 --- a/essenza/templates/info/info.html +++ b/essenza/templates/info/info.html @@ -67,7 +67,7 @@ - Volver + Volver

Información Legal y Condiciones de Venta de Essenza

diff --git a/essenza/templates/product/dashboard.html b/essenza/templates/product/dashboard.html new file mode 100644 index 0000000..9022f47 --- /dev/null +++ b/essenza/templates/product/dashboard.html @@ -0,0 +1,250 @@ +{% load static %} + + + + + Escaparate · Essenza + + + + + + + +
+ i +
ESSENZA
+ + + +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/essenza/templates/product/escaparate.html b/essenza/templates/product/escaparate.html deleted file mode 100644 index 5fbbd77..0000000 --- a/essenza/templates/product/escaparate.html +++ /dev/null @@ -1,130 +0,0 @@ -{% load static %} - - - - - Escaparate · Essenza - - - - - -
-
ESSENZA
- - - - {% if user.is_authenticated %} - -
- {% csrf_token %} - -
- - {% else %} - - - Log in - - - {% endif %} -
- \ No newline at end of file diff --git a/essenza/templates/user/register.html b/essenza/templates/user/register.html index 1ff83b2..0c9d5a5 100644 --- a/essenza/templates/user/register.html +++ b/essenza/templates/user/register.html @@ -135,10 +135,7 @@

ESSENZA

{{ form.last_name }} - - - {{ form.username }} - + {{ form.email }} @@ -148,8 +145,8 @@

ESSENZA

{{ form.password2 }} - - {{ form.foto }} + + {{ form.photo }} {% if form.errors %}
diff --git a/essenza/user/forms.py b/essenza/user/forms.py index 70b77fa..66c8d85 100644 --- a/essenza/user/forms.py +++ b/essenza/user/forms.py @@ -26,7 +26,7 @@ class RegisterForm(UserCreationForm): label="Correo electrónico", required=True ) - foto = forms.ImageField( + photo = forms.ImageField( label="Foto (Opcional)", required=False ) @@ -35,4 +35,11 @@ class Meta(UserCreationForm.Meta): model = Usuario - fields = UserCreationForm.Meta.fields + ('first_name', 'last_name', 'email', 'foto') + fields = ('first_name', 'last_name', 'email', 'photo') + + def save(self, commit=True): + user = super().save(commit=False) + user.username = self.cleaned_data["email"] + if commit: + user.save() + return user diff --git a/essenza/user/tests.py b/essenza/user/tests.py index a65bb48..7948294 100644 --- a/essenza/user/tests.py +++ b/essenza/user/tests.py @@ -22,8 +22,7 @@ def setUp(self): password=self.password ) self.login_url = reverse("login") - self.home_url = reverse("home") - self.escaparate_url = reverse("escaparate") + self.dashboard_url = reverse("dashboard") #1. comprueba que la pagina de login carga correctamente def test_get_login_page_returns_200(self): @@ -32,12 +31,12 @@ def test_get_login_page_returns_200(self): self.assertContains(resp, "Iniciar sesión") self.assertContains(resp, "ESSENZA") - #2. si email y contraseña validas redirige al escaparate - def test_login_with_valid_email_redirects_escaparate(self): + #2. si email y contraseña validas redirige al dashboard + def test_login_with_valid_email_redirects_dashboard(self): data = {"email": self.email, "password": self.password} resp = self.client.post(self.login_url, data, follow=False) self.assertEqual(resp.status_code, 302, resp.content) - self.assertEqual(resp["Location"], self.escaparate_url) + self.assertEqual(resp["Location"], self.dashboard_url) #3. si email y contraseña no validas muestra error def test_login_with_invalid_passwordAndEmail_shows_error(self): @@ -64,7 +63,7 @@ def test_login_with_invalid_password_shows_error(self): class RegisterViewTests(TestCase): def setUp(self): self.register_url = reverse("register") - self.escaparate_url = reverse("escaparate") + self.dashboard_url = reverse("dashboard") self.initial_user_count = User.objects.count() # Datos para un nuevo usuario de prueba @@ -84,13 +83,13 @@ def test_get_register_page_returns_200(self): self.assertContains(resp, "Crear cuenta") self.assertContains(resp, "ESSENZA") - #2. Registro con datos válidos y redirige al escaparate (302) + #2. Registro con datos válidos y redirige al dashboard (302) def test_successful_registration_redirects_and_creates_user(self): data = self.valid_data.copy() resp = self.client.post(self.register_url, data, follow=False) self.assertEqual(resp.status_code, 302) - self.assertEqual(resp["Location"], self.escaparate_url) + self.assertEqual(resp["Location"], self.dashboard_url) self.assertEqual(User.objects.count(), self.initial_user_count + 1) new_user = User.objects.get(email=data['email']) @@ -146,30 +145,30 @@ def test_registration_with_valid_photo(self): ) data = self.valid_data.copy() - data['foto'] = photo + data['photo'] = photo resp = self.client.post(self.register_url, data, follow=False) self.assertEqual(resp.status_code, 302) new_user = User.objects.get(email=data['email']) - self.assertTrue(new_user.foto.name.startswith('images/test_photo')) + self.assertTrue(new_user.photo.name.startswith('images/test_photo')) # Elimina la foto creada - if new_user.foto: - if os.path.exists(new_user.foto.path): - os.remove(new_user.foto.path) + if new_user.photo: + if os.path.exists(new_user.photo.path): + os.remove(new_user.photo.path) #7. Registro sin campo 'foto' (opcional) es exitoso def test_registration_without_photo_is_successful(self): data = self.valid_data.copy() - if 'foto' in data: - del data['foto'] + if 'photo' in data: + del data['photo'] resp = self.client.post(self.register_url, data, follow=False) self.assertEqual(resp.status_code, 302) new_user = User.objects.get(email=data['email']) - self.assertFalse(new_user.foto) + self.assertFalse(new_user.photo) class LogoutViewTests(TestCase): def setUp(self): @@ -181,10 +180,10 @@ def setUp(self): ) self.login_url = reverse('login') self.logout_url = reverse('logout') - self.home_url = reverse('home') + self.dashboard_url = reverse('dashboard') # 1. Comprobar que un usuario logueado se desloguea y redirige correctamente - def test_logout_redirects_to_home_and_clears_session(self): + def test_logout_redirects_to_dashboard_and_clears_session(self): # Iniciar sesión self.client.login(username='logout@example.com', password='testlogout123') @@ -194,8 +193,8 @@ def test_logout_redirects_to_home_and_clears_session(self): # Hacer logout response = self.client.get(self.logout_url) - # Verificar redirección al home - self.assertRedirects(response, self.home_url) + # Verificar redirección al dashboard + self.assertRedirects(response, self.dashboard_url) # Verificar que se ha cerrado la sesión self.assertNotIn('_auth_user_id', self.client.session) @@ -210,9 +209,9 @@ def test_logout_deletes_session_cookie(self): self.assertIn('sessionid', response.cookies) cookie = response.cookies['sessionid'] self.assertTrue(cookie.value == '' or cookie['max-age'] == 0 or cookie['expires']) - self.assertRedirects(response, self.home_url) + self.assertRedirects(response, self.dashboard_url) # 3. Comprobar que un usuario no autenticado también redirige correctamente def test_logout_redirects_even_if_not_authenticated(self): response = self.client.get(self.logout_url) - self.assertRedirects(response, self.home_url) + self.assertRedirects(response, self.dashboard_url) diff --git a/essenza/user/urls.py b/essenza/user/urls.py index 26825a4..6c353e8 100644 --- a/essenza/user/urls.py +++ b/essenza/user/urls.py @@ -1,6 +1,4 @@ -from django.contrib import admin -from django.urls import include, path -from django.http import HttpResponse +from django.urls import path import user.views as views diff --git a/essenza/user/views.py b/essenza/user/views.py index 25774b6..9e4765e 100644 --- a/essenza/user/views.py +++ b/essenza/user/views.py @@ -2,17 +2,16 @@ from django.views import View from django.contrib.auth import authenticate, login, logout from .forms import LoginForm, RegisterForm -from .models import Usuario class LoginView(View): form_class = LoginForm template_name = 'user/login.html' def get(self, request, *args, **kwargs): - # Si el usuario ya está autenticado, lo mandamos a escaparate + # Si el usuario ya está autenticado, lo mandamos a dashboard logout(request) if request.user.is_authenticated: - return redirect('escaparate') + return redirect('dashboard') # Si no está autenticado, renderiza el formulario de login return render(request, self.template_name, {'form': self.form_class()}) @@ -27,8 +26,7 @@ def post(self, request, *args, **kwargs): if user is not None: login(request, user) - # Redirige al escaparate después del login - return redirect('escaparate') + return redirect('dashboard') else: # Si falla el login, muestra error en el formulario form.add_error(None, "Usuario o contraseña incorrectos") @@ -38,13 +36,13 @@ def post(self, request, *args, **kwargs): class LogoutView(View): def get(self, request): logout(request) - response = redirect('home') + response = redirect('dashboard') response.delete_cookie('sessionid') return response def post(self, request): logout(request) - response = redirect('home') + response = redirect('dashboard') response.delete_cookie('sessionid') return response @@ -61,6 +59,7 @@ def post(self, request, *args, **kwargs): if form.is_valid(): user = form.save() - return redirect('escaparate') + login(request, user) + return redirect('dashboard') return render(request, self.template_name, {'form': form}) \ No newline at end of file