From b6b6fbc7d19d9382de38a8da16e21e004aa65429 Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Mon, 3 Jun 2024 15:38:56 -0300 Subject: [PATCH 01/84] Agrego COM812 a .ruff.toml --- .ruff.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ruff.toml b/.ruff.toml index a981d446..fc8ac59c 100644 --- a/.ruff.toml +++ b/.ruff.toml @@ -38,7 +38,7 @@ target-version = "py38" [lint] # Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default. -select = ["E4", "E7", "E9", "F"] +select = ["E4", "E7", "E9", "F", "COM812"] ignore = [] # Allow fix for all enabled rules (when `--fix`) is provided. From a67ba915f24336954e68a3caedc55ace705a8c97 Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Mon, 3 Jun 2024 15:41:44 -0300 Subject: [PATCH 02/84] Agrego las correcciones de COM812 --- manage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manage.py b/manage.py index ff2785ce..aec8a286 100644 --- a/manage.py +++ b/manage.py @@ -14,7 +14,7 @@ def main(): raise ImportError( "Couldn't import Django. Are you sure it's installed and " "available on your PYTHONPATH environment variable? Did you " - "forget to activate a virtual environment?" + "forget to activate a virtual environment?", ) from exc execute_from_command_line(sys.argv) From 4855558c64234ac3ae279716df07af5374b1d963 Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Mon, 3 Jun 2024 15:42:40 -0300 Subject: [PATCH 03/84] Agrego las correcciones de COM812 en test de integracion --- app/tests_integration.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/tests_integration.py b/app/tests_integration.py index a15ce08b..a464b04c 100644 --- a/app/tests_integration.py +++ b/app/tests_integration.py @@ -220,7 +220,7 @@ def test_create_pet_with_valid_weight(self): "name": "Frida", "breed": "negrita", "birthday": "2017-01-01", - "weight": "4" # Peso válido + "weight": "4", # Peso válido }, ) From a41a634fdd86b338e3b7276fb374489fac719b21 Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Mon, 3 Jun 2024 15:43:49 -0300 Subject: [PATCH 04/84] Agrego las correcciones de COM812 en test de unidad --- app/tests_unit.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/app/tests_unit.py b/app/tests_unit.py index f234b594..ac0c7bb8 100644 --- a/app/tests_unit.py +++ b/app/tests_unit.py @@ -1,4 +1,3 @@ -from django.forms import ValidationError from django.test import TestCase from app.models import Client,Pet,validate_pet,Provider, Product,Medicine from django.utils import timezone @@ -11,7 +10,7 @@ def test_can_create_and_get_client(self): "phone": "221555232", "address": "13 y 44", "email": "brujita75@hotmail.com", - } + }, ) clients = Client.objects.all() self.assertEqual(len(clients), 1) @@ -28,7 +27,7 @@ def test_can_update_client(self): "phone": "221555232", "address": "13 y 44", "email": "brujita75@hotmail.com", - } + }, ) client = Client.objects.get(pk=1) @@ -47,7 +46,7 @@ def test_update_client_with_error(self): "phone": "221555232", "address": "13 y 44", "email": "brujita75@hotmail.com", - } + }, ) client = Client.objects.get(pk=1) @@ -67,7 +66,7 @@ def test_can_create_medicine_with_valid_dose(self): "name": "Ibuprofeno", "description": "Medicamento antiinflamatorio", "dose": 1, - } + }, ) self.assertTrue(success) @@ -80,7 +79,7 @@ def test_cannot_create_medicine_with_invalid_dose(self): "name": "Ibuprofeno", "description": "Medicamento antiinflamatorio", "dose": 11, - } + }, ) self.assertFalse(success) self.assertIn("dose", errors) @@ -94,7 +93,7 @@ def test_update_medicine_with_invalid_dose(self): "name": "Paracetamol", "description": "Medicamento para el dolor", "dose": 5, - } + }, ) medicine = Medicine.objects.get(pk=1) @@ -115,7 +114,7 @@ def test_can_create_and_get_provider(self): "name": "Juan Roman Riquelme", "email": "senor10@gmail.com", "address": "13 y 44", - } + }, ) providers = Provider.objects.all() self.assertEqual(len(providers), 1) @@ -132,7 +131,7 @@ def test_provider_address(self): "name": "Juan Roman Riquelme", "email": "senor10@gmail.com", "address": addres, #guardo proveedor con direccion especifica - } + }, ) provider = Provider.objects.get(address=addres) #recupero proveedor segun la direccion (supongo que no van a haber dos proveedores con esa direccion) self.assertEqual(provider.address, addres) #verifica que la direccion recuperada coincida con la especifica @@ -166,7 +165,7 @@ def test_create_pet_with_valid_weight(self): "name": "Frida", "breed": "negrita", "birthday": "2017-01-01", - "weight": "4" # Peso válido + "weight": "4", # Peso válido }) self.assertTrue(success) @@ -177,7 +176,7 @@ def test_create_pet_with_invalid_weight_negative(self): "name": "Frida", "breed": "negrita", "birthday": "2017-01-01", - "weight": "-1" # Peso inválido + "weight": "-1", # Peso inválido }) self.assertFalse(success) @@ -189,7 +188,7 @@ def test_create_product_with_valid_price(self): success, message_or_errors = Product.save_product({ "name": "Test Product", "product_type": "Test Type", - "price": "100" + "price": "100", }) self.assertTrue(success) @@ -199,7 +198,7 @@ def test_create_product_with_invalid_price_zero(self): success, message_or_errors = Product.save_product({ "name": "Test Product", "product_type": "Test Type", - "price": "0" + "price": "0", }) self.assertFalse(success) @@ -210,7 +209,7 @@ def test_create_product_with_invalid_price_negative(self): success, message_or_errors = Product.save_product({ "name": "Test Product", "product_type": "Test Type", - "price": "-10" + "price": "-10", }) self.assertFalse(success) From e77e7e8905c4ab5e89a68b0b96e3eb373a1f84df Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Mon, 3 Jun 2024 15:44:34 -0300 Subject: [PATCH 05/84] Agrego las correcciones de COM812 en views --- app/views.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/views.py b/app/views.py index 1e70d420..fddcde53 100644 --- a/app/views.py +++ b/app/views.py @@ -26,7 +26,7 @@ def clients_form(request, id=None): return redirect(reverse("clients_repo")) return render( - request, "clients/form.html", {"errors": errors, "client": request.POST} + request, "clients/form.html", {"errors": errors, "client": request.POST}, ) client = None @@ -65,7 +65,7 @@ def provider_form(request, id=None): return redirect(reverse("provider_repo")) return render( - request, "providers/form.html", {"errors": errors, "provider": request.POST} + request, "providers/form.html", {"errors": errors, "provider": request.POST}, ) provider = None @@ -105,7 +105,7 @@ def product_form(request, id=None): return redirect(reverse("product_repo")) return render( - request, "products/form.html", {"errors": errors, "product": request.POST} + request, "products/form.html", {"errors": errors, "product": request.POST}, ) product = None @@ -146,7 +146,7 @@ def pet_form(request, id=None): return redirect(reverse("pet_repo")) return render( - request, "pets/form.html", {"errors": errors, "pet": request.POST} + request, "pets/form.html", {"errors": errors, "pet": request.POST}, ) pet = None @@ -186,7 +186,7 @@ def veterinary_form(request, id=None): return redirect(reverse("veterinary_repo")) return render( - request, "veterinaries/form.html", {"errors": errors, "veterinary": request.POST} + request, "veterinaries/form.html", {"errors": errors, "veterinary": request.POST}, ) veterinary = None @@ -225,7 +225,7 @@ def medicine_form(request, id=None): return redirect(reverse("medicine_repo")) return render( - request, "medicines/form.html", {"errors": errors, "medicine": request.POST} + request, "medicines/form.html", {"errors": errors, "medicine": request.POST}, ) medicine = None From 5957da9cf00ee111e6e0f0ab864eb6983912dc37 Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Mon, 3 Jun 2024 15:44:56 -0300 Subject: [PATCH 06/84] Agrego las correcciones de COM812 en test e2e --- functional_tests/tests.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/functional_tests/tests.py b/functional_tests/tests.py index eafacebc..a9d559b5 100644 --- a/functional_tests/tests.py +++ b/functional_tests/tests.py @@ -20,7 +20,7 @@ class PlaywrightTestCase(StaticLiveServerTestCase): def setUpClass(cls): super().setUpClass() cls.browser: Browser = playwright.chromium.launch( - headless=headless, slow_mo=int(slow_mo) + headless=headless, slow_mo=int(slow_mo), ) @classmethod @@ -104,7 +104,7 @@ def test_should_show_add_client_action(self): self.page.goto(f"{self.live_server_url}{reverse('clients_repo')}") add_client_action = self.page.get_by_role( - "link", name="Nuevo cliente", exact=False + "link", name="Nuevo cliente", exact=False, ) expect(add_client_action).to_have_attribute("href", reverse("clients_form")) @@ -120,7 +120,7 @@ def test_should_show_client_edit_action(self): edit_action = self.page.get_by_role("link", name="Editar") expect(edit_action).to_have_attribute( - "href", reverse("clients_edit", kwargs={"id": client.id}) + "href", reverse("clients_edit", kwargs={"id": client.id}), ) def test_should_show_client_delete_action(self): @@ -134,7 +134,7 @@ def test_should_show_client_delete_action(self): self.page.goto(f"{self.live_server_url}{reverse('clients_repo')}") edit_form = self.page.get_by_role( - "form", name="Formulario de eliminación de cliente" + "form", name="Formulario de eliminación de cliente", ) client_id_input = edit_form.locator("input[name=client_id]") @@ -207,11 +207,11 @@ def test_should_view_errors_if_form_is_invalid(self): expect(self.page.get_by_text("Por favor ingrese un nombre")).not_to_be_visible() expect( - self.page.get_by_text("Por favor ingrese un teléfono") + self.page.get_by_text("Por favor ingrese un teléfono"), ).not_to_be_visible() expect( - self.page.get_by_text("Por favor ingrese un email valido") + self.page.get_by_text("Por favor ingrese un email valido"), ).to_be_visible() def test_should_be_able_to_edit_a_client(self): @@ -244,7 +244,7 @@ def test_should_be_able_to_edit_a_client(self): edit_action = self.page.get_by_role("link", name="Editar") expect(edit_action).to_have_attribute( - "href", reverse("clients_edit", kwargs={"id": client.id}) + "href", reverse("clients_edit", kwargs={"id": client.id}), ) @@ -292,7 +292,7 @@ def test_should_show_add_provider_action(self): self.page.goto(f"{self.live_server_url}{reverse('provider_repo')}") add_provider_action = self.page.get_by_role( - "link", name="Nuevo Proveedor", exact=False + "link", name="Nuevo Proveedor", exact=False, ) expect(add_provider_action).to_have_attribute("href", reverse("provider_form")) @@ -317,11 +317,11 @@ def test_should_view_errors_if_form_is_invalid(self): expect(self.page.get_by_text("Por favor ingrese un nombre")).not_to_be_visible() expect( - self.page.get_by_text("Por favor ingrese un email valido") + self.page.get_by_text("Por favor ingrese un email valido"), ).not_to_be_visible() expect( - self.page.get_by_text("Por favor, ingrese una direccion") + self.page.get_by_text("Por favor, ingrese una direccion"), ).to_be_visible() def test_should_be_able_to_edit_a_provider(self): @@ -351,7 +351,7 @@ def test_should_be_able_to_edit_a_provider(self): edit_action = self.page.get_by_role("link", name="Editar") expect(edit_action).to_have_attribute( - "href", reverse("provider_edit", kwargs={"id": provider.id}) + "href", reverse("provider_edit", kwargs={"id": provider.id}), ) @@ -440,7 +440,7 @@ def test_should_view_errors_if_form_is_invalid_with_weight_less_than_zero(self): # Verificar que el mensaje de error "El peso debe ser mayor que cero" sea visible expect( - self.page.get_by_text("El peso debe ser mayor a cero") + self.page.get_by_text("El peso debe ser mayor a cero"), ).to_be_visible() # Pruebas de unidad para verificar la creación exitosa de un nuevo producto @@ -486,10 +486,10 @@ def test_should_view_errors_if_form_is_invalid_with_price_less_than_zero(self): # Verificar que los mensajes de error para ingresar el nombre y el tipo no sean visibles expect(self.page.get_by_text("Por favor ingrese su nombre")).not_to_be_visible() expect( - self.page.get_by_text("Por favor ingrese un tipo") + self.page.get_by_text("Por favor ingrese un tipo"), ).not_to_be_visible() # Verificar que el mensaje de error "El precio debe ser mayor que cero" sea visible expect( - self.page.get_by_text("El precio debe ser mayor que cero") + self.page.get_by_text("El precio debe ser mayor que cero"), ).to_be_visible() \ No newline at end of file From bc4c8dc3367aefe7751332907ad02205948cecaf Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Mon, 3 Jun 2024 15:49:44 -0300 Subject: [PATCH 07/84] Agrego las correcciones de COM812 en settings --- vetsoft/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vetsoft/settings.py b/vetsoft/settings.py index 973267a1..2384b9e7 100644 --- a/vetsoft/settings.py +++ b/vetsoft/settings.py @@ -79,7 +79,7 @@ "default": { "ENGINE": "django.db.backends.sqlite3", "NAME": BASE_DIR / "db.sqlite3", - } + }, } From f2ff3d1b77776dd66127cf4699b33c167dd904b6 Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Mon, 3 Jun 2024 15:59:05 -0300 Subject: [PATCH 08/84] Agrego migracion necesaria. --- app/migrations/0015_merge_20240603_1125.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 app/migrations/0015_merge_20240603_1125.py diff --git a/app/migrations/0015_merge_20240603_1125.py b/app/migrations/0015_merge_20240603_1125.py new file mode 100644 index 00000000..11684f4c --- /dev/null +++ b/app/migrations/0015_merge_20240603_1125.py @@ -0,0 +1,14 @@ +# Generated by Django 5.0.4 on 2024-06-03 14:25 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0012_alter_product_price'), + ('app', '0014_merge_20240603_0914'), + ] + + operations = [ + ] From e658ff3a1d6efd2c498f716a4a13e886b0397bac Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Mon, 3 Jun 2024 19:20:33 -0300 Subject: [PATCH 09/84] Modifico settings para que corra localmente. --- vetsoft/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vetsoft/settings.py b/vetsoft/settings.py index 12eb93e2..fb2b8784 100644 --- a/vetsoft/settings.py +++ b/vetsoft/settings.py @@ -25,7 +25,7 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = ['vet-soft-1-4.onrender.com','100.20.92.101','44.225.181.72','44.227.217.144'] +ALLOWED_HOSTS = ['vet-soft-1-4.onrender.com','100.20.92.101','44.225.181.72','44.227.217.144','127.0.0.1'] CSRF_TRUSTED_ORIGINGS = ['https://vet-soft-1-4.onrender.com'] # Application definition From b8069f6fb392a2fdb8108a7d3d9242f55828223d Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Mon, 3 Jun 2024 19:21:04 -0300 Subject: [PATCH 10/84] Modifico models, falta corregir valdate client --- app/models.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/app/models.py b/app/models.py index 93df7b06..fadd0f66 100644 --- a/app/models.py +++ b/app/models.py @@ -1,5 +1,7 @@ from django.db import models from datetime import datetime +import re +from django.core.exceptions import ValidationError @@ -18,8 +20,11 @@ def validate_client(data): if email == "": errors["email"] = "Por favor ingrese un email" - elif email.count("@") == 0: - errors["email"] = "Por favor ingrese un email valido" + elif not email.endswith("@vetsoft.com"): + errors["email"] = "El email debe ser de la forma 'usuario@vetsoft.com'" + + + return errors @@ -50,12 +55,21 @@ def save_client(cls, client_data): return True, None def update_client(self, client_data): + errors = validate_client(client_data) + + if len(errors) > 0: + return False, errors + self.name = client_data.get("name", "") or self.name self.email = client_data.get("email", "") or self.email self.phone = client_data.get("phone", "") or self.phone self.address = client_data.get("address", "") or self.address - self.save() + try: + self.save() + return True, None + except: + return False, errors def validate_provider(data): errors = {} From fec945d0967c6cdaaf2712aa93a4552f24b27d3b Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Mon, 3 Jun 2024 19:21:15 -0300 Subject: [PATCH 11/84] Agrego migracion --- app/migrations/0015_merge_20240603_1806.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 app/migrations/0015_merge_20240603_1806.py diff --git a/app/migrations/0015_merge_20240603_1806.py b/app/migrations/0015_merge_20240603_1806.py new file mode 100644 index 00000000..d563ad14 --- /dev/null +++ b/app/migrations/0015_merge_20240603_1806.py @@ -0,0 +1,14 @@ +# Generated by Django 5.0.4 on 2024-06-03 21:06 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0012_alter_product_price'), + ('app', '0014_merge_20240603_0914'), + ] + + operations = [ + ] From d9a60e59a81257c4a88745d20cdb6b5e2be04c39 Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Mon, 3 Jun 2024 19:21:56 -0300 Subject: [PATCH 12/84] Modifico el form --- app/templates/clients/form.html | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/app/templates/clients/form.html b/app/templates/clients/form.html index 875cb79f..e97da69c 100644 --- a/app/templates/clients/form.html +++ b/app/templates/clients/form.html @@ -11,7 +11,7 @@

Nuevo Cliente

@@ -37,7 +37,7 @@

Nuevo Cliente

- Nuevo Cliente {{ errors.phone }}
{% endif %} -
{% if errors.email %} @@ -66,16 +65,19 @@

Nuevo Cliente

{% endif %}
- + + class="form-control {% if errors.address %}is-invalid{% endif %}" + value="{{ provider.address }}" + /> -
- La dirrección es opcional -
+ {% if errors.address %} +
+ {{ errors.address }} +
+ {% endif %}
@@ -83,4 +85,4 @@

Nuevo Cliente

-{% endblock %} +{% endblock %} \ No newline at end of file From 7160212da027d9475cfe7cace95bed0afe8c0e67 Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Mon, 3 Jun 2024 21:02:27 -0300 Subject: [PATCH 13/84] Agrego secrets. --- .github/workflows/cd.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 92606b12..7df7a953 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -23,6 +23,7 @@ jobs: uses: docker/setup-buildx-action@v3 - name: Get the date + id: get_date run: echo "date=$(date '+%Y%m%d%H%M%S')" >> $GITHUB_ENV - name: Build and push @@ -31,7 +32,7 @@ jobs: context: . file: ./Dockerfile push: true - tags: ${{ secrets.DOCKERHUB_USERNAME }}/vetsoft:latest,${{ secrets.DOCKERHUB_USERNAME }}/vetsoft:${{ env.date }} + tags: ${{ secrets.DOCKERHUB_USERNAME }}/vetsoft:latest,${{ secrets.DOCKERHUB_USERNAME }}/vetsoft:${{ steps.get_date.outputs.date }} - name: Deploy - run: curl ${{ secrets.RENDER_HOOK }} + run: curl -X POST ${{ secrets.RENDER_HOOK }} From 1c506f52b4f42bc37c1b7a68b86d73f43e1eb4f7 Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Mon, 3 Jun 2024 21:03:31 -0300 Subject: [PATCH 14/84] =?UTF-8?q?Correcci=C3=B3n=20de=20palabra=20mal=20es?= =?UTF-8?q?crita.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 20f9f128..4a342cf3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,7 @@ name: ci on: pull_request: - branch: [main] + branches: [main] jobs: tests: From abdc348a407218a39f1c8d007a16b93be6657abf Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Mon, 3 Jun 2024 23:05:15 -0300 Subject: [PATCH 15/84] Modifico models para corregir errores --- app/models.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/app/models.py b/app/models.py index fadd0f66..f95afd69 100644 --- a/app/models.py +++ b/app/models.py @@ -20,11 +20,8 @@ def validate_client(data): if email == "": errors["email"] = "Por favor ingrese un email" - elif not email.endswith("@vetsoft.com"): - errors["email"] = "El email debe ser de la forma 'usuario@vetsoft.com'" - - - + elif "@vetsoft.com" not in email: + errors["email"] = "El email debe ser de la forma '@vetsoft.com'" return errors From 4d29583a3b6473485b7b4962ef7fc1c893a404e1 Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Mon, 3 Jun 2024 23:05:46 -0300 Subject: [PATCH 16/84] Modifico vistas para corregir los errores de validacion --- app/views.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/views.py b/app/views.py index 1e70d420..84174c4f 100644 --- a/app/views.py +++ b/app/views.py @@ -9,18 +9,21 @@ def clients_repository(request): clients = Client.objects.all() return render(request, "clients/repository.html", {"clients": clients}) - def clients_form(request, id=None): if request.method == "POST": client_id = request.POST.get("id", "") errors = {} - saved = True + saved = False if client_id == "": saved, errors = Client.save_client(request.POST) else: client = get_object_or_404(Client, pk=client_id) - client.update_client(request.POST) + update_result = client.update_client(request.POST) + if update_result is not None: + saved, errors = update_result + else: + saved = True if saved: return redirect(reverse("clients_repo")) From 365a354be6df627061bccb539474e8ea244626ad Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Mon, 3 Jun 2024 23:06:31 -0300 Subject: [PATCH 17/84] Modifico form para validar correctamente el email --- app/templates/clients/form.html | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/templates/clients/form.html b/app/templates/clients/form.html index e97da69c..be4abb44 100644 --- a/app/templates/clients/form.html +++ b/app/templates/clients/form.html @@ -54,6 +54,7 @@

Nuevo Cliente

@@ -70,8 +71,8 @@

Nuevo Cliente

id="address" name="address" class="form-control {% if errors.address %}is-invalid{% endif %}" - value="{{ provider.address }}" - /> + value="{{ client.address }}" + required/> {% if errors.address %}
From fbbedb593126f3569d35c7304f39c9544eeb527b Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Mon, 3 Jun 2024 23:06:45 -0300 Subject: [PATCH 18/84] =?UTF-8?q?Agrego=20migraci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/migrations/0016_delete_veterinario.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 app/migrations/0016_delete_veterinario.py diff --git a/app/migrations/0016_delete_veterinario.py b/app/migrations/0016_delete_veterinario.py new file mode 100644 index 00000000..f610f552 --- /dev/null +++ b/app/migrations/0016_delete_veterinario.py @@ -0,0 +1,16 @@ +# Generated by Django 5.0.4 on 2024-06-03 23:34 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0015_merge_20240603_1806'), + ] + + operations = [ + migrations.DeleteModel( + name='Veterinario', + ), + ] From 8a4875dcca9b8eb00dd11181a1ce9efdff004e28 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 00:59:26 -0300 Subject: [PATCH 19/84] Arreglo requerimientos --- .github/workflows/ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4a342cf3..1eadef76 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,10 +18,11 @@ jobs: with: python-version: '3.10' cache: 'pip' - - run: pip install -r requirements-dev.txt + - run: pip install -r requirements.txt - name: Install playwright - run: python -m playwright install --with-deps firefox + run: playwright install + - name: Run static test run: ruff check From e15c5d3d5dc90c331e54941370226b25c3ad7923 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 01:00:52 -0300 Subject: [PATCH 20/84] Agrego secrets --- .github/workflows/cd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 7df7a953..e18ebf35 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -32,7 +32,7 @@ jobs: context: . file: ./Dockerfile push: true - tags: ${{ secrets.DOCKERHUB_USERNAME }}/vetsoft:latest,${{ secrets.DOCKERHUB_USERNAME }}/vetsoft:${{ steps.get_date.outputs.date }} + tags: ${{ secrets.DOCKERHUB_USERNAME }}/vet-soft:latest,${{ secrets.DOCKERHUB_USERNAME }}/vet-soft:latest${{ steps.get_date.outputs.date }} - name: Deploy run: curl -X POST ${{ secrets.RENDER_HOOK }} From 9bd8d13df194e134efd65252a1cdaa700dc69dec Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 01:12:04 -0300 Subject: [PATCH 21/84] Arreglo imports para pasar el ruff check --- functional_tests/tests.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/functional_tests/tests.py b/functional_tests/tests.py index eafacebc..4dbce8ad 100644 --- a/functional_tests/tests.py +++ b/functional_tests/tests.py @@ -6,7 +6,7 @@ from django.utils import timezone from django.urls import reverse -from app.models import Client, Provider, Medicine, Pet +from app.models import Client, Provider os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true" @@ -393,8 +393,6 @@ def test_should_show_error_for_present_birth_date(self): # Verifica si se muestra el mensaje de error esperado expect(self.page.get_by_text("La fecha de nacimiento debe ser menor a la fecha actual")).to_be_visible() - def test_should_be_able_to_create_a_new_pet(self): - self.page.goto(f"{self.live_server_url}{reverse('pet_form')}") # Pruebas para peso de la mascota def test_should_be_able_to_create_a_new_pet(self): From 143f5eb3f45de349863e86ca68f06cea43b4b7ae Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 01:13:20 -0300 Subject: [PATCH 22/84] arreglo returns con except para pasar el ruff check --- app/models.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/app/models.py b/app/models.py index 93df7b06..6877fdd3 100644 --- a/app/models.py +++ b/app/models.py @@ -111,11 +111,8 @@ def update_provider(self, provider_data): self.email = provider_data.get("email", "") or self.email self.address = provider_data.get("address", "") or self.address - try: - self.save() - return True, None - except: - return False, errors + self.save() + return True, None @@ -375,9 +372,6 @@ def update_medicine(self, medicine_data): self.description = medicine_data.get("description", "") or self.description self.dose = medicine_data.get("dose", "") or self.dose - try: - self.save() - return True, None - except: - return False, errors + self.save() + return True, None \ No newline at end of file From 388359112bca33357b06dcfb4a34434ae313ca3d Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 01:13:56 -0300 Subject: [PATCH 23/84] elimino import para pasar el ruff check --- app/tests_unit.py | 1 - 1 file changed, 1 deletion(-) diff --git a/app/tests_unit.py b/app/tests_unit.py index f234b594..b8a32327 100644 --- a/app/tests_unit.py +++ b/app/tests_unit.py @@ -1,4 +1,3 @@ -from django.forms import ValidationError from django.test import TestCase from app.models import Client,Pet,validate_pet,Provider, Product,Medicine from django.utils import timezone From 12b4f15d748eea34c7007a0a65a3199d76993231 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 01:58:00 -0300 Subject: [PATCH 24/84] agrego regla I001 --- .ruff.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ruff.toml b/.ruff.toml index a981d446..f6974c41 100644 --- a/.ruff.toml +++ b/.ruff.toml @@ -38,7 +38,7 @@ target-version = "py38" [lint] # Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default. -select = ["E4", "E7", "E9", "F"] +select = ["E4", "E7", "E9", "F","I001"] ignore = [] # Allow fix for all enabled rules (when `--fix`) is provided. From 868e46a36e67327a475da4c476a15913ad8f0ba5 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 02:04:15 -0300 Subject: [PATCH 25/84] Arreglo imports de test e2e --- functional_tests/tests.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/functional_tests/tests.py b/functional_tests/tests.py index 4dbce8ad..da06dc41 100644 --- a/functional_tests/tests.py +++ b/functional_tests/tests.py @@ -1,14 +1,13 @@ import os +from datetime import datetime from django.contrib.staticfiles.testing import StaticLiveServerTestCase -from playwright.sync_api import sync_playwright, expect, Browser -from datetime import datetime -from django.utils import timezone from django.urls import reverse +from django.utils import timezone +from playwright.sync_api import Browser, expect, sync_playwright from app.models import Client, Provider - os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true" playwright = sync_playwright().start() headless = os.environ.get("HEADLESS", 1) == 1 From 241ffc49a0a17ba3dbe8e67af99b139705a0ef34 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 02:04:29 -0300 Subject: [PATCH 26/84] Arreglo imports de test unitario --- app/tests_unit.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/tests_unit.py b/app/tests_unit.py index b8a32327..4cc705d0 100644 --- a/app/tests_unit.py +++ b/app/tests_unit.py @@ -1,7 +1,9 @@ from django.test import TestCase -from app.models import Client,Pet,validate_pet,Provider, Product,Medicine from django.utils import timezone +from app.models import Client, Medicine, Pet, Product, Provider, validate_pet + + class ClientModelTest(TestCase): def test_can_create_and_get_client(self): Client.save_client( From 59ae9c7e629a667b247d7ca8ab2316da59bf93ea Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 02:05:37 -0300 Subject: [PATCH 27/84] Arreglo imports de las vistas --- app/views.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/views.py b/app/views.py index 1e70d420..bf30482c 100644 --- a/app/views.py +++ b/app/views.py @@ -1,5 +1,7 @@ -from django.shortcuts import render, redirect, reverse, get_object_or_404 -from .models import Client, Provider, Product, Pet, Medicine, Veterinary +from django.shortcuts import get_object_or_404, redirect, render, reverse + +from .models import Client, Medicine, Pet, Product, Provider, Veterinary + def home(request): return render(request, "home.html") From cf7422886a53de0f2ec66417da68ea2069b4e482 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 02:05:51 -0300 Subject: [PATCH 28/84] Arreglo imports de los models --- app/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models.py b/app/models.py index 6877fdd3..e867166f 100644 --- a/app/models.py +++ b/app/models.py @@ -1,6 +1,6 @@ -from django.db import models from datetime import datetime +from django.db import models def validate_client(data): From e62c3f7e34f06e68a3a16d3c54c3419564af1723 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 02:06:13 -0300 Subject: [PATCH 29/84] Arreglo imports del test de integracion --- app/tests_integration.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/tests_integration.py b/app/tests_integration.py index a15ce08b..367580bb 100644 --- a/app/tests_integration.py +++ b/app/tests_integration.py @@ -1,10 +1,10 @@ -from django.test import TestCase -from django.shortcuts import reverse -from app.models import Client,Pet,Provider,Medicine from datetime import datetime -from django.utils import timezone -from app.models import Product +from django.shortcuts import reverse +from django.test import TestCase +from django.utils import timezone + +from app.models import Client, Medicine, Pet, Product, Provider class HomePageTest(TestCase): From fb6e51200b72d95dd7a84e3f0a083986a4697c47 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 02:06:28 -0300 Subject: [PATCH 30/84] Arreglo imports de las urls --- app/urls.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app/urls.py b/app/urls.py index 6156ca96..3b242b56 100644 --- a/app/urls.py +++ b/app/urls.py @@ -1,4 +1,5 @@ from django.urls import path + from . import views urlpatterns = [ From 8a5c0e5fc04b411a382c91663117aa885301fa6f Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 03:06:26 -0300 Subject: [PATCH 31/84] agrego localhost en allowedHosts para poder ejecutarlo localmente --- vetsoft/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vetsoft/settings.py b/vetsoft/settings.py index 12eb93e2..fb2b8784 100644 --- a/vetsoft/settings.py +++ b/vetsoft/settings.py @@ -25,7 +25,7 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = ['vet-soft-1-4.onrender.com','100.20.92.101','44.225.181.72','44.227.217.144'] +ALLOWED_HOSTS = ['vet-soft-1-4.onrender.com','100.20.92.101','44.225.181.72','44.227.217.144','127.0.0.1'] CSRF_TRUSTED_ORIGINGS = ['https://vet-soft-1-4.onrender.com'] # Application definition From 530f596eadb71828371a382d04fb5051d4a38af2 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 03:07:07 -0300 Subject: [PATCH 32/84] cambio address por ciudad --- app/models.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models.py b/app/models.py index 6877fdd3..829a8fdd 100644 --- a/app/models.py +++ b/app/models.py @@ -28,7 +28,7 @@ class Client(models.Model): name = models.CharField(max_length=100) phone = models.CharField(max_length=15) email = models.EmailField() - address = models.CharField(max_length=100, blank=True) + ciudad = models.CharField(max_length=100, blank=True) def __str__(self): return self.name @@ -44,7 +44,7 @@ def save_client(cls, client_data): name=client_data.get("name"), phone=client_data.get("phone"), email=client_data.get("email"), - address=client_data.get("address"), + ciudad=client_data.get("ciudad"), ) return True, None @@ -53,7 +53,7 @@ def update_client(self, client_data): self.name = client_data.get("name", "") or self.name self.email = client_data.get("email", "") or self.email self.phone = client_data.get("phone", "") or self.phone - self.address = client_data.get("address", "") or self.address + self.ciudad = client_data.get("ciudad", "") or self.ciudad self.save() From 794e2f024975e873569316bb21567700f6b88581 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 03:07:35 -0300 Subject: [PATCH 33/84] cambio address por ciudad --- app/templates/clients/form.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/templates/clients/form.html b/app/templates/clients/form.html index 875cb79f..63580576 100644 --- a/app/templates/clients/form.html +++ b/app/templates/clients/form.html @@ -66,11 +66,11 @@

Nuevo Cliente

{% endif %}
- +
From 4bb1e315f1b8ad126615020e19312b61bd8d1f5e Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 03:08:09 -0300 Subject: [PATCH 34/84] cambio address por ciudad --- app/templates/clients/repository.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/templates/clients/repository.html b/app/templates/clients/repository.html index c07f81d3..bad0725d 100644 --- a/app/templates/clients/repository.html +++ b/app/templates/clients/repository.html @@ -17,7 +17,7 @@

Clientes

Nombre Teléfono Email - Dirección + Ciudad @@ -28,7 +28,7 @@

Clientes

{{client.name}} {{client.phone}} {{client.email}} - {{client.address}} + {{client.ciudad}} Date: Tue, 4 Jun 2024 03:20:48 -0300 Subject: [PATCH 35/84] Cambio nombre ciudad por city --- app/models.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models.py b/app/models.py index 829a8fdd..773be6f2 100644 --- a/app/models.py +++ b/app/models.py @@ -28,7 +28,7 @@ class Client(models.Model): name = models.CharField(max_length=100) phone = models.CharField(max_length=15) email = models.EmailField() - ciudad = models.CharField(max_length=100, blank=True) + city = models.CharField(max_length=100, blank=True) def __str__(self): return self.name @@ -44,7 +44,7 @@ def save_client(cls, client_data): name=client_data.get("name"), phone=client_data.get("phone"), email=client_data.get("email"), - ciudad=client_data.get("ciudad"), + city=client_data.get("city"), ) return True, None @@ -53,7 +53,7 @@ def update_client(self, client_data): self.name = client_data.get("name", "") or self.name self.email = client_data.get("email", "") or self.email self.phone = client_data.get("phone", "") or self.phone - self.ciudad = client_data.get("ciudad", "") or self.ciudad + self.city = client_data.get("city", "") or self.city self.save() From 99c0c3fbc85ef89aec501a33cd19e0cc47426ec9 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 03:21:02 -0300 Subject: [PATCH 36/84] Cambio nombre ciudad por city --- app/tests_integration.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/tests_integration.py b/app/tests_integration.py index a15ce08b..d5f83982 100644 --- a/app/tests_integration.py +++ b/app/tests_integration.py @@ -32,7 +32,7 @@ def test_can_create_client(self): data={ "name": "Juan Sebastian Veron", "phone": "221555232", - "address": "13 y 44", + "city": "13 y 44", "email": "brujita75@hotmail.com", }, ) @@ -41,7 +41,7 @@ def test_can_create_client(self): self.assertEqual(clients[0].name, "Juan Sebastian Veron") self.assertEqual(clients[0].phone, "221555232") - self.assertEqual(clients[0].address, "13 y 44") + self.assertEqual(clients[0].city, "13 y 44") self.assertEqual(clients[0].email, "brujita75@hotmail.com") self.assertRedirects(response, reverse("clients_repo")) @@ -66,7 +66,7 @@ def test_validation_invalid_email(self): data={ "name": "Juan Sebastian Veron", "phone": "221555232", - "address": "13 y 44", + "city": "13 y 44", "email": "brujita75", }, ) @@ -76,7 +76,7 @@ def test_validation_invalid_email(self): def test_edit_user_with_valid_data(self): client = Client.objects.create( name="Juan Sebastián Veron", - address="13 y 44", + city="13 y 44", phone="221555232", email="brujita75@hotmail.com", ) @@ -95,7 +95,7 @@ def test_edit_user_with_valid_data(self): editedClient = Client.objects.get(pk=client.id) self.assertEqual(editedClient.name, "Guido Carrillo") self.assertEqual(editedClient.phone, client.phone) - self.assertEqual(editedClient.address, client.address) + self.assertEqual(editedClient.city, client.city) self.assertEqual(editedClient.email, client.email) class MedicineIntegrationTest(TestCase): From 7f7fcad84f718624a95840f188d61347982e01a6 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 03:26:00 -0300 Subject: [PATCH 37/84] Cambio nombre ciudad por city --- app/templates/clients/repository.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/templates/clients/repository.html b/app/templates/clients/repository.html index bad0725d..1960bad9 100644 --- a/app/templates/clients/repository.html +++ b/app/templates/clients/repository.html @@ -28,7 +28,7 @@

Clientes

{{client.name}} {{client.phone}} {{client.email}} - {{client.ciudad}} + {{client.city}}
Date: Tue, 4 Jun 2024 03:26:06 -0300 Subject: [PATCH 38/84] Cambio nombre ciudad por city --- app/templates/clients/form.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/templates/clients/form.html b/app/templates/clients/form.html index 63580576..4de18eed 100644 --- a/app/templates/clients/form.html +++ b/app/templates/clients/form.html @@ -66,11 +66,11 @@

Nuevo Cliente

{% endif %}
- +
From d9d988fb001e27562060c639344d1dd70d3d3d73 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 03:26:23 -0300 Subject: [PATCH 39/84] Cambio nombre ciudad por city --- functional_tests/tests.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/functional_tests/tests.py b/functional_tests/tests.py index 4dbce8ad..a5968595 100644 --- a/functional_tests/tests.py +++ b/functional_tests/tests.py @@ -74,14 +74,14 @@ def test_should_show_message_if_table_is_empty(self): def test_should_show_clients_data(self): Client.objects.create( name="Juan Sebastián Veron", - address="13 y 44", + city="13 y 44", phone="221555232", email="brujita75@hotmail.com", ) Client.objects.create( name="Guido Carrillo", - address="1 y 57", + city="1 y 57", phone="221232555", email="goleador@gmail.com", ) @@ -111,7 +111,7 @@ def test_should_show_add_client_action(self): def test_should_show_client_edit_action(self): client = Client.objects.create( name="Juan Sebastián Veron", - address="13 y 44", + city="13 y 44", phone="221555232", email="brujita75@hotmail.com", ) @@ -126,7 +126,7 @@ def test_should_show_client_edit_action(self): def test_should_show_client_delete_action(self): client = Client.objects.create( name="Juan Sebastián Veron", - address="13 y 44", + city="13 y 44", phone="221555232", email="brujita75@hotmail.com", ) @@ -147,7 +147,7 @@ def test_should_show_client_delete_action(self): def test_should_can_be_able_to_delete_a_client(self): Client.objects.create( name="Juan Sebastián Veron", - address="13 y 44", + city="13 y 44", phone="221555232", email="brujita75@hotmail.com", ) @@ -178,7 +178,7 @@ def test_should_be_able_to_create_a_new_client(self): self.page.get_by_label("Nombre").fill("Juan Sebastián Veron") self.page.get_by_label("Teléfono").fill("221555232") self.page.get_by_label("Email").fill("brujita75@hotmail.com") - self.page.get_by_label("Dirección").fill("13 y 44") + self.page.get_by_label("Ciudad").fill("13 y 44") self.page.get_by_role("button", name="Guardar").click() @@ -201,7 +201,7 @@ def test_should_view_errors_if_form_is_invalid(self): self.page.get_by_label("Nombre").fill("Juan Sebastián Veron") self.page.get_by_label("Teléfono").fill("221555232") self.page.get_by_label("Email").fill("brujita75") - self.page.get_by_label("Dirección").fill("13 y 44") + self.page.get_by_label("Ciudad").fill("13 y 44") self.page.get_by_role("button", name="Guardar").click() @@ -217,7 +217,7 @@ def test_should_view_errors_if_form_is_invalid(self): def test_should_be_able_to_edit_a_client(self): client = Client.objects.create( name="Juan Sebastián Veron", - address="13 y 44", + city="13 y 44", phone="221555232", email="brujita75@hotmail.com", ) @@ -228,7 +228,7 @@ def test_should_be_able_to_edit_a_client(self): self.page.get_by_label("Nombre").fill("Guido Carrillo") self.page.get_by_label("Teléfono").fill("221232555") self.page.get_by_label("Email").fill("goleador@gmail.com") - self.page.get_by_label("Dirección").fill("1 y 57") + self.page.get_by_label("Ciudad").fill("1 y 57") self.page.get_by_role("button", name="Guardar").click() From 5759797240c20955d65c7f4732dcaa40cd40c2ae Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 03:28:58 -0300 Subject: [PATCH 40/84] Cambio nombre ciudad por city --- app/tests_unit.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/tests_unit.py b/app/tests_unit.py index b8a32327..878f8b4a 100644 --- a/app/tests_unit.py +++ b/app/tests_unit.py @@ -8,7 +8,7 @@ def test_can_create_and_get_client(self): { "name": "Juan Sebastian Veron", "phone": "221555232", - "address": "13 y 44", + "city": "13 y 44", "email": "brujita75@hotmail.com", } ) @@ -17,7 +17,7 @@ def test_can_create_and_get_client(self): self.assertEqual(clients[0].name, "Juan Sebastian Veron") self.assertEqual(clients[0].phone, "221555232") - self.assertEqual(clients[0].address, "13 y 44") + self.assertEqual(clients[0].city, "13 y 44") self.assertEqual(clients[0].email, "brujita75@hotmail.com") def test_can_update_client(self): @@ -25,7 +25,7 @@ def test_can_update_client(self): { "name": "Juan Sebastian Veron", "phone": "221555232", - "address": "13 y 44", + "city": "13 y 44", "email": "brujita75@hotmail.com", } ) @@ -44,7 +44,7 @@ def test_update_client_with_error(self): { "name": "Juan Sebastian Veron", "phone": "221555232", - "address": "13 y 44", + "city": "13 y 44", "email": "brujita75@hotmail.com", } ) From 555f09db94e80bc5a55078658c5eb0244aab90e3 Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Tue, 4 Jun 2024 12:13:23 -0300 Subject: [PATCH 41/84] Agrego D102 a .ruff.toml --- .ruff.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ruff.toml b/.ruff.toml index a981d446..0904166e 100644 --- a/.ruff.toml +++ b/.ruff.toml @@ -38,7 +38,7 @@ target-version = "py38" [lint] # Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default. -select = ["E4", "E7", "E9", "F"] +select = ["E4", "E7", "E9", "F", "D102"] ignore = [] # Allow fix for all enabled rules (when `--fix`) is provided. From 047bb0201e44126f4afed9b76ea2db6143dffcb0 Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Tue, 4 Jun 2024 17:28:54 -0300 Subject: [PATCH 42/84] =?UTF-8?q?Documente=20los=20metodos=20p=C3=BAblicos?= =?UTF-8?q?=20de=20models.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models.py | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/app/models.py b/app/models.py index 6877fdd3..533c3003 100644 --- a/app/models.py +++ b/app/models.py @@ -4,6 +4,9 @@ def validate_client(data): + """ + Esta función valida los datos del cliente. + """ errors = {} name = data.get("name", "") @@ -31,10 +34,16 @@ class Client(models.Model): address = models.CharField(max_length=100, blank=True) def __str__(self): + """ + Devuelve la representación de cadena de cliente. + """ return self.name @classmethod def save_client(cls, client_data): + """ + Esta función guarda el cliente. + """ errors = validate_client(client_data) if len(errors.keys()) > 0: @@ -50,6 +59,9 @@ def save_client(cls, client_data): return True, None def update_client(self, client_data): + """ + Esta función actualiza el cliente. + """ self.name = client_data.get("name", "") or self.name self.email = client_data.get("email", "") or self.email self.phone = client_data.get("phone", "") or self.phone @@ -58,6 +70,9 @@ def update_client(self, client_data): self.save() def validate_provider(data): + """ + Esta función valida los datos del proovedor. + """ errors = {} name = data.get("name", "") @@ -84,10 +99,16 @@ class Provider(models.Model): address = models.CharField(max_length=100) def __str__(self): + """ + Devuelve la representación de cadena de proovedor. + """ return self.name @classmethod def save_provider(cls, provider_data): + """ + Esta función guarda el proveedor en la base de datos. + """ errors = validate_provider(provider_data) if len(errors.keys()) > 0: @@ -102,6 +123,9 @@ def save_provider(cls, provider_data): return True, None def update_provider(self, provider_data): + """ + Esta función actualiza el proveedor. + """ errors = validate_provider(provider_data) if len(errors) > 0: @@ -117,6 +141,9 @@ def update_provider(self, provider_data): def validate_product(data): + """ + Esta función valida los datos del producto. + """ errors = {} name = data.get("name", "") @@ -149,10 +176,16 @@ class Product(models.Model): price = models.DecimalField(max_digits=10, decimal_places=2) def __str__(self): + """ + Devuelve la representación de cadena de producto. + """ return self.name @classmethod def save_product(cls, product_data): + """ + Esta función guarda el producto en la base de datos. + """ errors = validate_product(product_data) if len(errors.keys()) > 0: @@ -168,6 +201,9 @@ def save_product(cls, product_data): def update_product(self, product_data): + """ + Esta función actualiza el producto. + """ errors = validate_product(product_data) @@ -182,6 +218,9 @@ def update_product(self, product_data): return True, None def validate_pet(data): + """ + Esta función valida los datos de mascota. + """ errors = {} name = data.get("name", "") @@ -225,10 +264,16 @@ class Pet(models.Model): weight = models.FloatField() def __str__(self): + """ + Devuelve la representación de cadena de mascota. + """ return self.name @classmethod def save_pet(cls, pet_data): + """ + Esta función guarda la mascota en la base de datos. + """ errors = validate_pet(pet_data) if len(errors.keys()) > 0: @@ -244,6 +289,9 @@ def save_pet(cls, pet_data): return True, None def update_pet(self, pet_data): + """ + Esta función actualiza los datos de mascota. + """ errors = validate_pet(pet_data) if len(errors.keys()) > 0: print("Retorno false") @@ -263,6 +311,9 @@ def update_pet(self, pet_data): return True, None def validate_veterinary(data): + """ + Esta función valida los datos del veterinario. + """ errors = {} name = data.get("name", "") @@ -291,10 +342,16 @@ class Veterinary(models.Model): def __str__(self): + """ + Devuelve la representación de cadena de veterinario. + """ return self.name @classmethod def save_veterinary(cls, veterinary_data): + """ + Esta función guarda los datos de veterinario. + """ errors = validate_veterinary(veterinary_data) if len(errors.keys()) > 0: @@ -310,6 +367,9 @@ def save_veterinary(cls, veterinary_data): return True, None def update_veterinary(self, veterinary_data): + """ + Esta función actualiza los datos de veterinario. + """ self.name = veterinary_data.get("name", "") or self.name self.email = veterinary_data.get("email", "") or self.email self.phone = veterinary_data.get("phone", "") or self.phone @@ -318,6 +378,9 @@ def update_veterinary(self, veterinary_data): def validate_medicine(data): + """ + Esta función valida los datos de medicina. + """ errors = {} name = data.get("name", "") @@ -346,10 +409,16 @@ class Medicine(models.Model): dose = models.IntegerField() def __str__(self): + """ + Devuelve la representación de cadena de medicina. + """ return self.name @classmethod def save_medicine(cls, medicine_data): + """ + Esta función guarda los datos de medicina. + """ errors = validate_medicine(medicine_data) if len(errors.keys()) > 0: @@ -363,6 +432,9 @@ def save_medicine(cls, medicine_data): return True, None def update_medicine(self, medicine_data): + """ + Esta función actualiza los datos de medicina. + """ errors = validate_medicine(medicine_data) if len(errors) > 0: From 399915fdcf8cd1f5cba57c5791b837b5b9347c94 Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Tue, 4 Jun 2024 17:29:32 -0300 Subject: [PATCH 43/84] =?UTF-8?q?Documente=20los=20metodos=20p=C3=BAblicos?= =?UTF-8?q?=20del=20test=20de=20integraci=C3=B3n.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/tests_integration.py | 82 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/app/tests_integration.py b/app/tests_integration.py index a15ce08b..b5acc761 100644 --- a/app/tests_integration.py +++ b/app/tests_integration.py @@ -9,24 +9,44 @@ class HomePageTest(TestCase): def test_use_home_template(self): + """ + Esta funcion testea que el template del home funcione. + """ response = self.client.get(reverse("home")) self.assertTemplateUsed(response, "home.html") - + """ + Esta función compara que el response y el home sean iguales. + """ class ClientsTest(TestCase): def test_repo_use_repo_template(self): + """ + Esta función testea que el template del repo funcione. + """ response = self.client.get(reverse("clients_repo")) self.assertTemplateUsed(response, "clients/repository.html") + """ + Esta función compara que el response y el repo sean iguales. + """ def test_repo_display_all_clients(self): + """ + Esta función muestra todos los clientes del repo. + """ response = self.client.get(reverse("clients_repo")) self.assertTemplateUsed(response, "clients/repository.html") def test_form_use_form_template(self): + """ + Esta función testea el formulario que utiliza una plantilla específica. + """ response = self.client.get(reverse("clients_form")) self.assertTemplateUsed(response, "clients/form.html") def test_can_create_client(self): + """ + Esta función verifica si se puede crear un cliente correctamente. + """ response = self.client.post( reverse("clients_form"), data={ @@ -47,6 +67,9 @@ def test_can_create_client(self): self.assertRedirects(response, reverse("clients_repo")) def test_validation_errors_create_client(self): + """ + Esta función testea la validacion de errores creados en cliente. + """ response = self.client.post( reverse("clients_form"), data={}, @@ -57,10 +80,16 @@ def test_validation_errors_create_client(self): self.assertContains(response, "Por favor ingrese un email") def test_should_response_with_404_status_if_client_doesnt_exists(self): + """ + Esta función testea que si el cliente no existe, se genera un error 404. + """ response = self.client.get(reverse("clients_edit", kwargs={"id": 100})) self.assertEqual(response.status_code, 404) def test_validation_invalid_email(self): + """ + Esta función testea la validación de emails invalidos. + """ response = self.client.post( reverse("clients_form"), data={ @@ -74,6 +103,9 @@ def test_validation_invalid_email(self): self.assertContains(response, "Por favor ingrese un email valido") def test_edit_user_with_valid_data(self): + """ + Esta función testea que se pueda editar el usuario datos validos. + """ client = Client.objects.create( name="Juan Sebastián Veron", address="13 y 44", @@ -100,6 +132,9 @@ def test_edit_user_with_valid_data(self): class MedicineIntegrationTest(TestCase): def test_can_create_medicine(self): + """ + Esta función testea si pudo crear una medicina. + """ response = self.client.post( reverse("medicine_form"), data={ @@ -118,6 +153,9 @@ def test_can_create_medicine(self): self.assertRedirects(response, reverse("medicine_repo")) def test_validation_errors_create_medicine(self): + """ + Esta función testea la validacion de errores de medicinas creadas. + """ response = self.client.post( reverse("medicine_form"), data={}, @@ -128,6 +166,9 @@ def test_validation_errors_create_medicine(self): self.assertContains(response, "Por favor ingrese una dosis") def test_validation_valid_dose(self): + """ + Esta función testea la validación de dosis validas. + """ response = self.client.post( reverse("medicine_form"), data={ @@ -139,6 +180,9 @@ def test_validation_valid_dose(self): self.assertEqual(response.status_code, 302) # verificamos medicina creada tras la redireccion def test_validation_invalid_dose_is_greater_than_10(self): + """ + Esta función testea la validación de una dosis que debe ser menor o igual a 10. + """ response = self.client.post( reverse("medicine_form"), data={ @@ -150,6 +194,9 @@ def test_validation_invalid_dose_is_greater_than_10(self): self.assertContains(response, "La dosis debe estar en un rango de 1 a 10") def test_validation_invalid_dose_is_less_than_1(self): + """ + Esta función testea la validación de una dosis que debe ser mayor o igual a 1. + """ response = self.client.post( reverse("medicine_form"), data={ @@ -161,10 +208,16 @@ def test_validation_invalid_dose_is_less_than_1(self): self.assertContains(response, "La dosis debe estar en un rango de 1 a 10") class ProviderTest(TestCase): def test_repo_use_repo_template(self): + """ + Esta función verifica que un repositorio está utilizando una plantilla de repositorio específica. + """ response = self.client.get(reverse("provider_repo")) self.assertTemplateUsed(response, "providers/repository.html") def test_can_create_provider(self): + """ + Esta función prueba la creación de un proveedor en una aplicación. + """ response = self.client.post( reverse("provider_form"), data={ @@ -183,6 +236,9 @@ def test_can_create_provider(self): self.assertRedirects(response, reverse("provider_repo")) def test_validation_invalid_email(self): #Agrego una función ajena a la funcionalidad agregada para mayor calidad. + """ + Esta función verifica que el sistema maneje adecuadamente la validación de correos electrónicos inválidos. + """ response = self.client.post( reverse("provider_form"), data={ @@ -196,6 +252,9 @@ def test_validation_invalid_email(self): #Agrego una función ajena a la funcion def test_validation_address_null(self): #Agrego una función especifica del issue #La modificacion es que la direccion es obligatoria. Comprueba que al poner una direccion vacia devuelva el mensaje de error + """ + Esta función verifica que el sistema maneje adecuadamente la validación de direcciones nulas. + """ response = self.client.post( reverse("provider_form"), data={ @@ -213,6 +272,9 @@ def test_validation_address_null(self): #Agrego una función especifica del issu class PetsTest(TestCase): def test_create_pet_with_valid_weight(self): + """ + Esta función verifica que un sistema permita la creación de una mascota con un peso válido. + """ # Crear un mascota con peso válido response = self.client.post( reverse("pet_form"), @@ -239,6 +301,9 @@ def test_create_pet_with_valid_weight(self): def test_create_product_with_invalid_weight(self): # Intentar crear una mascota con precio negativo + """ + Esta función testea la creación de una mascota con un precio invalido. + """ response = self.client.post( reverse("pet_form"), data={ @@ -259,6 +324,9 @@ def test_create_product_with_invalid_weight(self): def test_create_pet_with_valid_birthday(self): # Crear una mascota con fecha de nacimiento válida + """ + Esta función testea la creación de una mascota con una fecha de nacimiento valido. + """ response = self.client.post( reverse("pet_form"), data={ @@ -284,6 +352,9 @@ def test_create_pet_with_valid_birthday(self): def test_create_pet_with_invalid_birthday(self): # Intentar crear una mascota con fecha de nacimiento en el futuro + """ + Esta función testea la creación de una mascota con una fecha de nacimiento invalida. + """ future_date = datetime.now().date() + timezone.timedelta(days=1) response = self.client.post( reverse("pet_form"), @@ -306,6 +377,9 @@ def test_create_pet_with_invalid_birthday(self): class ProductsTest(TestCase): def test_create_product_with_valid_price(self): # Crear un producto con precio válido + """ + Esta función verifica la creación de un producto con un precio valido. + """ response = self.client.post( reverse("product_form"), data={ @@ -329,6 +403,9 @@ def test_create_product_with_valid_price(self): def test_create_product_with_invalid_price(self): # Intentar crear un producto con precio negativo + """ + Esta función verifica la creación de un producto con un precio invalido + """ response = self.client.post( reverse("product_form"), data={ @@ -347,6 +424,9 @@ def test_create_product_with_invalid_price(self): def test_create_product_with_non_numeric_price(self): # Intentar crear un producto con precio no numérico + """ + Esta función testea la creación de un producto con precio no numérico. + """ response = self.client.post( reverse("product_form"), data={ From 62a03ae3e3040b6414d14fca155e4af65abf2428 Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Tue, 4 Jun 2024 17:29:57 -0300 Subject: [PATCH 44/84] =?UTF-8?q?Documente=20los=20metodos=20p=C3=BAblicos?= =?UTF-8?q?=20del=20test=20unitario.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/tests_unit.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/app/tests_unit.py b/app/tests_unit.py index b8a32327..d3c0a2de 100644 --- a/app/tests_unit.py +++ b/app/tests_unit.py @@ -4,6 +4,9 @@ class ClientModelTest(TestCase): def test_can_create_and_get_client(self): + """ + Esta función verifica que el sistema permita la creación de un cliente y que se pueda recuperar correctamente desde la base de datos. + """ Client.save_client( { "name": "Juan Sebastian Veron", @@ -21,6 +24,9 @@ def test_can_create_and_get_client(self): self.assertEqual(clients[0].email, "brujita75@hotmail.com") def test_can_update_client(self): + """ + Esta función testea si se puede actualizar el cliente. + """ Client.save_client( { "name": "Juan Sebastian Veron", @@ -40,6 +46,9 @@ def test_can_update_client(self): self.assertEqual(client_updated.phone, "221555233") def test_update_client_with_error(self): + """ + Esta función testea que el sistema maneje adecuadamente los errores al intentar actualizar un cliente. + """ Client.save_client( { "name": "Juan Sebastian Veron", @@ -61,6 +70,9 @@ def test_update_client_with_error(self): class MedicineModelTest(TestCase): def test_can_create_medicine_with_valid_dose(self): + """ + Esta función testea que el sistema permita la creación de un medicamento con una dosis válida. + """ success, errors = Medicine.save_medicine( { "name": "Ibuprofeno", @@ -74,6 +86,9 @@ def test_can_create_medicine_with_valid_dose(self): self.assertEqual(len(medicines), 1) def test_cannot_create_medicine_with_invalid_dose(self): + """ + Esta función verifica que el sistema no permita la creación de un medicamento con una dosis inválida. + """ success, errors = Medicine.save_medicine( { "name": "Ibuprofeno", @@ -88,6 +103,9 @@ def test_cannot_create_medicine_with_invalid_dose(self): self.assertEqual(len(medicines), 0) def test_update_medicine_with_invalid_dose(self): + """ + Esta función verifica que el sistema maneje adecuadamente los intentos de actualización de un medicamento con una dosis inválida. + """ Medicine.save_medicine( { "name": "Paracetamol", @@ -109,6 +127,9 @@ def test_update_medicine_with_invalid_dose(self): class ProviderModelTest(TestCase): def test_can_create_and_get_provider(self): + """ + Esta función asegura de que se pueda crear un proveedor con datos válidos y luego recuperarlo correctamente de la base de datos. + """ Provider.save_provider( { "name": "Juan Roman Riquelme", @@ -125,6 +146,10 @@ def test_can_create_and_get_provider(self): #Agrego test unitario especifico de la issue de provider def test_provider_address(self): + """ + Esta función verifica que el sistema maneje correctamente tanto los proveedores con dirección como los que no tienen dirección. + Garantizando que los datos se almacenen y recuperen correctamente de la base de datos. + """ addres = "calle 13 y 44" Provider.save_provider( { @@ -139,6 +164,9 @@ def test_provider_address(self): class PetModelTest(TestCase): def test_validate_pet_birthday(self): # Probamos la validación de fecha de nacimiento para una mascota + """ + Esta función testea la validación de fecha de nacimiento para una mascota. + """ valid_data = { "name": "Frida", "breed": "negrita", @@ -161,6 +189,9 @@ def test_validate_pet_birthday(self): # Validacion de peso mascota def test_create_pet_with_valid_weight(self): + """ + Esta función valida la creación de una mascota con peso valido. + """ success, message_or_errors = Pet.save_pet({ "name": "Frida", "breed": "negrita", @@ -172,6 +203,9 @@ def test_create_pet_with_valid_weight(self): self.assertEqual(message_or_errors, None) def test_create_pet_with_invalid_weight_negative(self): + """ + Esta función verifica el comportamiento del sistema al intentar crear una mascota con un peso negativo. + """ success, message_or_errors = Pet.save_pet({ "name": "Frida", "breed": "negrita", @@ -185,6 +219,9 @@ def test_create_pet_with_invalid_weight_negative(self): class ProductModelTest(TestCase): def test_create_product_with_valid_price(self): + """ + Esta función verifica que el sistema permita la creación de un producto con un precio válido. + """ success, message_or_errors = Product.save_product({ "name": "Test Product", "product_type": "Test Type", @@ -195,6 +232,9 @@ def test_create_product_with_valid_price(self): self.assertEqual(message_or_errors, "Producto creado exitosamente") def test_create_product_with_invalid_price_zero(self): + """ + Esta función verifica cómo el sistema maneja la creación de un producto con un precio igual a cero. + """ success, message_or_errors = Product.save_product({ "name": "Test Product", "product_type": "Test Type", @@ -206,6 +246,9 @@ def test_create_product_with_invalid_price_zero(self): self.assertEqual(message_or_errors["price"], "El precio debe ser mayor que cero") def test_create_product_with_invalid_price_negative(self): + """ + Esta función verifica cómo el sistema maneja la creación de un producto con un precio negativo. + """ success, message_or_errors = Product.save_product({ "name": "Test Product", "product_type": "Test Type", From c828c23662b9ed0f173c8727e6eb877a946e9148 Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Tue, 4 Jun 2024 17:30:57 -0300 Subject: [PATCH 45/84] =?UTF-8?q?Documente=20los=20metodos=20p=C3=BAblicos?= =?UTF-8?q?=20del=20test=20e2e.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- functional_tests/tests.py | 98 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/functional_tests/tests.py b/functional_tests/tests.py index 4dbce8ad..4f6e4021 100644 --- a/functional_tests/tests.py +++ b/functional_tests/tests.py @@ -18,6 +18,9 @@ class PlaywrightTestCase(StaticLiveServerTestCase): @classmethod def setUpClass(cls): + """ + Esta función prepara el entorno necesario para la ejecución de un conjunto de pruebas dentro de una clase de pruebas. + """ super().setUpClass() cls.browser: Browser = playwright.chromium.launch( headless=headless, slow_mo=int(slow_mo) @@ -25,20 +28,32 @@ def setUpClass(cls): @classmethod def tearDownClass(cls): + """ + Esta función limpia y libera los recursos compartidos después de que todas las pruebas en la clase hayan sido ejecutadas. + """ super().tearDownClass() cls.browser.close() def setUp(self): + """ + Esta función prepara el entorno necesario antes de ejecutar cada prueba individual. + """ super().setUp() self.page = self.browser.new_page() def tearDown(self): + """ + Esta función limpia y libera los recursos después de que cada prueba individual haya sido ejecutada. + """ super().tearDown() self.page.close() class HomeTestCase(PlaywrightTestCase): def test_should_have_navbar_with_links(self): + """ + Esta función verifica que una página web tenga una barra de navegación (navbar) con enlaces (links) a otras páginas o secciones del sitio. + """ self.page.goto(self.live_server_url) navbar_home_link = self.page.get_by_test_id("navbar-Inicio") @@ -56,6 +71,9 @@ def test_should_have_navbar_with_links(self): expect(navbar_clients_link).to_have_attribute("href", reverse("clients_repo")) def test_should_have_home_cards_with_links(self): + """ + Esta función verifica que una página de inicio tenga tarjetas (cards) con enlaces (links) a otras partes del sitio. + """ self.page.goto(self.live_server_url) home_clients_link = self.page.get_by_test_id("home-Clientes") @@ -67,11 +85,17 @@ def test_should_have_home_cards_with_links(self): class ClientsRepoTestCase(PlaywrightTestCase): def test_should_show_message_if_table_is_empty(self): + """ + Esta función verifica que un mensaje se muestre correctamente cuando una tabla está vacía en una aplicación web. + """ self.page.goto(f"{self.live_server_url}{reverse('clients_repo')}") expect(self.page.get_by_text("No existen clientes")).to_be_visible() def test_should_show_clients_data(self): + """ + Esta función verifica que los datos de los clientes se muestren correctamente en una determinada página de la aplicación web. + """ Client.objects.create( name="Juan Sebastián Veron", address="13 y 44", @@ -101,6 +125,9 @@ def test_should_show_clients_data(self): expect(self.page.get_by_text("goleador@gmail.com")).to_be_visible() def test_should_show_add_client_action(self): + """ + Esta función verifica que la página de la lista de clientes incluya una acción para agregar un nuevo cliente. + """ self.page.goto(f"{self.live_server_url}{reverse('clients_repo')}") add_client_action = self.page.get_by_role( @@ -109,6 +136,9 @@ def test_should_show_add_client_action(self): expect(add_client_action).to_have_attribute("href", reverse("clients_form")) def test_should_show_client_edit_action(self): + """ + Esta función verifica que la página de detalle de cliente incluya una acción para editar el cliente. + """ client = Client.objects.create( name="Juan Sebastián Veron", address="13 y 44", @@ -124,6 +154,9 @@ def test_should_show_client_edit_action(self): ) def test_should_show_client_delete_action(self): + """ + Esta función verifica que la página de detalle de cliente incluya una acción para eliminar el cliente. + """ client = Client.objects.create( name="Juan Sebastián Veron", address="13 y 44", @@ -145,6 +178,9 @@ def test_should_show_client_delete_action(self): expect(edit_form.get_by_role("button", name="Eliminar")).to_be_visible() def test_should_can_be_able_to_delete_a_client(self): + """ + Esta función verifica que un cliente pueda ser eliminado correctamente a través de una solicitud POST al servidor. + """ Client.objects.create( name="Juan Sebastián Veron", address="13 y 44", @@ -157,6 +193,9 @@ def test_should_can_be_able_to_delete_a_client(self): expect(self.page.get_by_text("Juan Sebastián Veron")).to_be_visible() def is_delete_response(response): + """ + Esta función verifica si una respuesta HTTP es una respuesta de eliminación (código de estado 204 No Content). + """ return response.url.find(reverse("clients_delete")) # verificamos que el envio del formulario fue exitoso @@ -171,6 +210,9 @@ def is_delete_response(response): class ClientCreateEditTestCase(PlaywrightTestCase): def test_should_be_able_to_create_a_new_client(self): + """ + Esta función verifica que se pueda crear un nuevo cliente correctamente a través de una solicitud POST al servidor. + """ self.page.goto(f"{self.live_server_url}{reverse('clients_form')}") expect(self.page.get_by_role("form")).to_be_visible() @@ -188,6 +230,10 @@ def test_should_be_able_to_create_a_new_client(self): expect(self.page.get_by_text("13 y 44")).to_be_visible() def test_should_view_errors_if_form_is_invalid(self): + """ + Esta función verifica que se muestren los errores de validación en el + formulario si se envían datos inválidos al intentar crear un nuevo cliente. + """ self.page.goto(f"{self.live_server_url}{reverse('clients_form')}") expect(self.page.get_by_role("form")).to_be_visible() @@ -215,6 +261,9 @@ def test_should_view_errors_if_form_is_invalid(self): ).to_be_visible() def test_should_be_able_to_edit_a_client(self): + """ + Esta función verifica que se pueda editar un cliente existente correctamente a través de una solicitud POST al servidor. + """ client = Client.objects.create( name="Juan Sebastián Veron", address="13 y 44", @@ -250,6 +299,10 @@ def test_should_be_able_to_edit_a_client(self): class MedicineCreateEditTestCase(PlaywrightTestCase): def test_should_show_error_for_dose_greater_than_10(self): + """ + Esta función verifica que se muestre un mensaje de error cuando se intenta + crear o editar un medicamento con una dosis mayor que 10. + """ self.page.goto(f"{self.live_server_url}{reverse('medicine_form')}") expect(self.page.get_by_role("form")).to_be_visible() @@ -263,6 +316,10 @@ def test_should_show_error_for_dose_greater_than_10(self): expect(self.page.get_by_text("La dosis debe estar en un rango de 1 a 10")).to_be_visible() def test_should_show_error_for_dose_less_than_1(self): + """ + Esta función verifica que se muestre un mensaje de error cuando se intenta crear o + editar un medicamento con una dosis menor que 1. + """ self.page.goto(f"{self.live_server_url}{reverse('medicine_form')}") expect(self.page.get_by_role("form")).to_be_visible() @@ -277,11 +334,17 @@ def test_should_show_error_for_dose_less_than_1(self): class ProvidersRepoTestCase(PlaywrightTestCase): def test_should_show_message_if_table_is_empty(self): + """ + Esta función verifica que se muestre un mensaje adecuado si una tabla en la interfaz de usuario está vacía. + """ self.page.goto(f"{self.live_server_url}{reverse('provider_repo')}") expect(self.page.get_by_text("No existen proveedores")).to_be_visible() def test_should_show_providers_data(self): + """ + Esta función verifica que se muestren los datos de los proveedores en la interfaz de usuario. + """ Provider.objects.create( name="Juan Roman Riquelme", email="senor10@hotmail.com", @@ -289,6 +352,9 @@ def test_should_show_providers_data(self): ) def test_should_show_add_provider_action(self): + """ + Esta función verifica que en la interfaz de usuario se muestre una acción para agregar un nuevo proveedor. + """ self.page.goto(f"{self.live_server_url}{reverse('provider_repo')}") add_provider_action = self.page.get_by_role( @@ -298,6 +364,10 @@ def test_should_show_add_provider_action(self): #Agrego e2e que utilicen el atributo address def test_should_view_errors_if_form_is_invalid(self): + """ + Esta función verifica que se muestren los errores de validación en un + formulario si se envían datos inválidos al servidor. + """ self.page.goto(f"{self.live_server_url}{reverse('provider_form')}") expect(self.page.get_by_role("form")).to_be_visible() @@ -325,6 +395,10 @@ def test_should_view_errors_if_form_is_invalid(self): ).to_be_visible() def test_should_be_able_to_edit_a_provider(self): + """ + Esta función verifica que se pueda editar un proveedor existente correctamente + a través de una solicitud POST al servidor. + """ provider = Provider.objects.create( name="Juan Roman Riquelme", email="senor10@hotmail.com", @@ -357,6 +431,10 @@ def test_should_be_able_to_edit_a_provider(self): class PetFormCreateValidationTestCase(PlaywrightTestCase): def test_should_show_error_for_future_birth_date(self): + """ + Esta función verifica que se muestre un mensaje de error cuando se intenta + ingresar una fecha de nacimiento en el futuro al crear o editar un cliente. + """ self.page.goto(f"{self.live_server_url}{reverse('pet_form')}") expect(self.page.get_by_role("form")).to_be_visible() @@ -375,6 +453,10 @@ def test_should_show_error_for_future_birth_date(self): expect(self.page.get_by_text("La fecha de nacimiento debe ser menor a la fecha actual")).to_be_visible() def test_should_show_error_for_present_birth_date(self): + """ + Esta función verifica que se muestre un mensaje de error cuando se intenta ingresar una fecha de nacimiento + que corresponde al día actual (o una fecha anterior al día actual) al crear o editar un cliente. + """ self.page.goto(f"{self.live_server_url}{reverse('pet_form')}") expect(self.page.get_by_role("form")).to_be_visible() @@ -396,6 +478,10 @@ def test_should_show_error_for_present_birth_date(self): # Pruebas para peso de la mascota def test_should_be_able_to_create_a_new_pet(self): + """ + Esta función verifica que se pueda crear una nueva mascota correctamente + a través de una solicitud POST al servidor. + """ self.page.goto(f"{self.live_server_url}{reverse('pet_form')}") expect(self.page.get_by_role("form")).to_be_visible() @@ -416,6 +502,10 @@ def test_should_be_able_to_create_a_new_pet(self): # Prueba para verificar si se muestran errores cuando el formulario es inválido con un peso menor que cero def test_should_view_errors_if_form_is_invalid_with_weight_less_than_zero(self): + """ + Esta función verifica que se muestren errores cuando se intenta + enviar un formulario con un peso de mascota menor que cero. + """ self.page.goto(f"{self.live_server_url}{reverse('pet_form')}") expect(self.page.get_by_role("form")).to_be_visible() @@ -445,6 +535,10 @@ def test_should_view_errors_if_form_is_invalid_with_weight_less_than_zero(self): class ProductCreatePriceGreaterThanZeroTestCase(PlaywrightTestCase): def test_should_be_able_to_create_a_new_product(self): + """ + Esta función verifica que se pueda crear un nuevo producto correctamente + a través de una solicitud POST al servidor. + """ self.page.goto(f"{self.live_server_url}{reverse('product_form')}") expect(self.page.get_by_role("form")).to_be_visible() @@ -463,6 +557,10 @@ def test_should_be_able_to_create_a_new_product(self): # Prueba para verificar si se muestran errores cuando el formulario es inválido con un precio menor que cero def test_should_view_errors_if_form_is_invalid_with_price_less_than_zero(self): + """ + Esta función verifica que se muestren errores cuando se intenta enviar + un formulario con un precio de producto menor que cero. + """ self.page.goto(f"{self.live_server_url}{reverse('product_form')}") expect(self.page.get_by_role("form")).to_be_visible() From 485ea7f0ff5002b5d13ca119b8afcce7c1c89b8d Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Tue, 4 Jun 2024 19:58:15 -0300 Subject: [PATCH 46/84] Modificacion en los models para que corran los tests --- app/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models.py b/app/models.py index f95afd69..5a8dc019 100644 --- a/app/models.py +++ b/app/models.py @@ -21,7 +21,7 @@ def validate_client(data): if email == "": errors["email"] = "Por favor ingrese un email" elif "@vetsoft.com" not in email: - errors["email"] = "El email debe ser de la forma '@vetsoft.com'" + errors["email"] = "El email debe ser de la forma @vetsoft.com" return errors From 44a18fd80d823ab9d5a45f4bbf1f157b1a98c94e Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Tue, 4 Jun 2024 19:58:43 -0300 Subject: [PATCH 47/84] Modifico los tests donde utilizamos email --- app/tests_integration.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/app/tests_integration.py b/app/tests_integration.py index a15ce08b..a652c91f 100644 --- a/app/tests_integration.py +++ b/app/tests_integration.py @@ -33,7 +33,7 @@ def test_can_create_client(self): "name": "Juan Sebastian Veron", "phone": "221555232", "address": "13 y 44", - "email": "brujita75@hotmail.com", + "email": "brujita75@vetsoft.com", }, ) clients = Client.objects.all() @@ -42,7 +42,7 @@ def test_can_create_client(self): self.assertEqual(clients[0].name, "Juan Sebastian Veron") self.assertEqual(clients[0].phone, "221555232") self.assertEqual(clients[0].address, "13 y 44") - self.assertEqual(clients[0].email, "brujita75@hotmail.com") + self.assertEqual(clients[0].email, "brujita75@vetsoft.com") self.assertRedirects(response, reverse("clients_repo")) @@ -66,19 +66,18 @@ def test_validation_invalid_email(self): data={ "name": "Juan Sebastian Veron", "phone": "221555232", + "email": "brujita75@gmail.com", "address": "13 y 44", - "email": "brujita75", }, ) - - self.assertContains(response, "Por favor ingrese un email valido") + self.assertContains(response, "El email debe ser de la forma @vetsoft.com") def test_edit_user_with_valid_data(self): client = Client.objects.create( name="Juan Sebastián Veron", address="13 y 44", phone="221555232", - email="brujita75@hotmail.com", + email="brujita75@vetsoft.com", ) response = self.client.post( @@ -86,6 +85,9 @@ def test_edit_user_with_valid_data(self): data={ "id": client.id, "name": "Guido Carrillo", + "address": "13 y 44", + "phone":"221555232", + "email": "brujita75@vetsoft.com" }, ) From e692bd86b476a65ba9bef4c8c3bb054255a33f15 Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Tue, 4 Jun 2024 19:59:06 -0300 Subject: [PATCH 48/84] Modifico tests de unidad y Agrego uno en cuanto al mail --- app/tests_unit.py | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/app/tests_unit.py b/app/tests_unit.py index f234b594..1b8f0b1a 100644 --- a/app/tests_unit.py +++ b/app/tests_unit.py @@ -10,7 +10,7 @@ def test_can_create_and_get_client(self): "name": "Juan Sebastian Veron", "phone": "221555232", "address": "13 y 44", - "email": "brujita75@hotmail.com", + "email": "brujita75@vetsoft.com", } ) clients = Client.objects.all() @@ -19,7 +19,7 @@ def test_can_create_and_get_client(self): self.assertEqual(clients[0].name, "Juan Sebastian Veron") self.assertEqual(clients[0].phone, "221555232") self.assertEqual(clients[0].address, "13 y 44") - self.assertEqual(clients[0].email, "brujita75@hotmail.com") + self.assertEqual(clients[0].email, "brujita75@vetsoft.com") def test_can_update_client(self): Client.save_client( @@ -27,14 +27,18 @@ def test_can_update_client(self): "name": "Juan Sebastian Veron", "phone": "221555232", "address": "13 y 44", - "email": "brujita75@hotmail.com", + "email": "brujita75@vetsoft.com", } ) client = Client.objects.get(pk=1) self.assertEqual(client.phone, "221555232") - client.update_client({"phone": "221555233"}) + client.update_client( + {"name": "Juan Sebastian Veron", + "phone": "221555233", + "address": "13 y 44", + "email": "brujita75@vetsoft.com"}) client_updated = Client.objects.get(pk=1) @@ -46,7 +50,7 @@ def test_update_client_with_error(self): "name": "Juan Sebastian Veron", "phone": "221555232", "address": "13 y 44", - "email": "brujita75@hotmail.com", + "email": "brujita75@vetsoft.com", } ) client = Client.objects.get(pk=1) @@ -59,6 +63,24 @@ def test_update_client_with_error(self): self.assertEqual(client_updated.phone, "221555232") + def test_update_client_with_email_null(self): #nuevo test verificando que no pueda hacer update con email nulo + Client.save_client( + { + "name": "Juan Sebastian Veron", + "phone": "221555232", + "address": "13 y 44", + "email": "brujita75@vetsoft.com", + } + ) + client = Client.objects.get(pk=1) + + self.assertEqual(client.phone, "221555232") + + client.update_client({"email": ""}) + + client_updated = Client.objects.get(pk=1) + + self.assertEqual(client_updated.email, "brujita75@vetsoft.com") class MedicineModelTest(TestCase): def test_can_create_medicine_with_valid_dose(self): From 55e8105c7e92edf364c5c71b9cac4a069ccf9562 Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Tue, 4 Jun 2024 19:59:18 -0300 Subject: [PATCH 49/84] Modifico form --- app/templates/clients/form.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/templates/clients/form.html b/app/templates/clients/form.html index be4abb44..6508b057 100644 --- a/app/templates/clients/form.html +++ b/app/templates/clients/form.html @@ -37,7 +37,7 @@

Nuevo Cliente

- Date: Tue, 4 Jun 2024 19:58:22 -0300 Subject: [PATCH 50/84] =?UTF-8?q?agrego=20configuraci=C3=B3n=20de=20Ruff?= =?UTF-8?q?=20para=20incluir=20la=20regla=20D103?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .ruff.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ruff.toml b/.ruff.toml index 0904166e..00227fb6 100644 --- a/.ruff.toml +++ b/.ruff.toml @@ -38,7 +38,7 @@ target-version = "py38" [lint] # Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default. -select = ["E4", "E7", "E9", "F", "D102"] +select = ["E4", "E7", "E9", "F", "D103"] ignore = [] # Allow fix for all enabled rules (when `--fix`) is provided. From 020f0815e0d6c923710f069e98e163071334fd80 Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Tue, 4 Jun 2024 20:14:55 -0300 Subject: [PATCH 51/84] Modifico test e2e --- functional_tests/tests.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/functional_tests/tests.py b/functional_tests/tests.py index eafacebc..bfc7aa9e 100644 --- a/functional_tests/tests.py +++ b/functional_tests/tests.py @@ -177,14 +177,14 @@ def test_should_be_able_to_create_a_new_client(self): self.page.get_by_label("Nombre").fill("Juan Sebastián Veron") self.page.get_by_label("Teléfono").fill("221555232") - self.page.get_by_label("Email").fill("brujita75@hotmail.com") - self.page.get_by_label("Dirección").fill("13 y 44") + self.page.get_by_label("Email").fill("brujita75@vetsoft.com") + self.page.get_by_label("Direccion").fill("13 y 44") self.page.get_by_role("button", name="Guardar").click() expect(self.page.get_by_text("Juan Sebastián Veron")).to_be_visible() expect(self.page.get_by_text("221555232")).to_be_visible() - expect(self.page.get_by_text("brujita75@hotmail.com")).to_be_visible() + expect(self.page.get_by_text("brujita75@vetsoft.com")).to_be_visible() expect(self.page.get_by_text("13 y 44")).to_be_visible() def test_should_view_errors_if_form_is_invalid(self): @@ -201,7 +201,7 @@ def test_should_view_errors_if_form_is_invalid(self): self.page.get_by_label("Nombre").fill("Juan Sebastián Veron") self.page.get_by_label("Teléfono").fill("221555232") self.page.get_by_label("Email").fill("brujita75") - self.page.get_by_label("Dirección").fill("13 y 44") + self.page.get_by_label("Direccion").fill("13 y 44") self.page.get_by_role("button", name="Guardar").click() @@ -211,7 +211,7 @@ def test_should_view_errors_if_form_is_invalid(self): ).not_to_be_visible() expect( - self.page.get_by_text("Por favor ingrese un email valido") + self.page.get_by_text("El email debe ser de la forma @vetsoft.com") ).to_be_visible() def test_should_be_able_to_edit_a_client(self): @@ -219,7 +219,7 @@ def test_should_be_able_to_edit_a_client(self): name="Juan Sebastián Veron", address="13 y 44", phone="221555232", - email="brujita75@hotmail.com", + email="brujita75@vetsoft.com", ) path = reverse("clients_edit", kwargs={"id": client.id}) @@ -227,20 +227,20 @@ def test_should_be_able_to_edit_a_client(self): self.page.get_by_label("Nombre").fill("Guido Carrillo") self.page.get_by_label("Teléfono").fill("221232555") - self.page.get_by_label("Email").fill("goleador@gmail.com") - self.page.get_by_label("Dirección").fill("1 y 57") + self.page.get_by_label("Email").fill("goleador@vetsoft.com") + self.page.get_by_label("Direccion").fill("1 y 57") self.page.get_by_role("button", name="Guardar").click() expect(self.page.get_by_text("Juan Sebastián Veron")).not_to_be_visible() expect(self.page.get_by_text("13 y 44")).not_to_be_visible() expect(self.page.get_by_text("221555232")).not_to_be_visible() - expect(self.page.get_by_text("brujita75@hotmail.com")).not_to_be_visible() + expect(self.page.get_by_text("brujita75@vetsoft.com")).not_to_be_visible() expect(self.page.get_by_text("Guido Carrillo")).to_be_visible() expect(self.page.get_by_text("1 y 57")).to_be_visible() expect(self.page.get_by_text("221232555")).to_be_visible() - expect(self.page.get_by_text("goleador@gmail.com")).to_be_visible() + expect(self.page.get_by_text("goleador@vetsoft.com")).to_be_visible() edit_action = self.page.get_by_role("link", name="Editar") expect(edit_action).to_have_attribute( From 7ef7fc46855b8a939c1a1fa8bef44454155ed1f8 Mon Sep 17 00:00:00 2001 From: Feliciano Date: Tue, 4 Jun 2024 20:18:03 -0300 Subject: [PATCH 52/84] =?UTF-8?q?agrego=20docstrings=20en=20app/context=5F?= =?UTF-8?q?processors.py=20seg=C3=BAn=20la=20regla=20D103?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/context_processors.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/app/context_processors.py b/app/context_processors.py index 83782590..d5753e96 100644 --- a/app/context_processors.py +++ b/app/context_processors.py @@ -1,5 +1,6 @@ from django.urls import reverse +# Lista de enlaces de navegación con etiquetas, hrefs e íconos links = [ {"label": "Inicio", "href": reverse("home"), "icon": "bi bi-house-door"}, {"label": "Clientes", "href": reverse("clients_repo"), "icon": "bi bi-people"}, @@ -10,9 +11,26 @@ {"label": "Veterinarios", "href": reverse("veterinary_repo"), "icon": "bi bi-people"}, ] - def navbar(request): + """ + Genera el contexto del navegador con enlaces activos basados en la URL actual. + + Args: + request (HttpRequest): La solicitud HTTP actual. + + Returns: + dict: Un diccionario con los enlaces de navegación, marcando el enlace activo. + """ def add_active(link): + """ + Añade la clave 'active' a un enlace si la URL coincide con la ruta actual. + + Args: + link (dict): Un diccionario que representa un enlace de navegación. + + Returns: + dict: Una copia del enlace con la clave 'active' añadida. + """ copy = link.copy() if copy["href"] == "/": @@ -22,4 +40,4 @@ def add_active(link): return copy - return {"links": map(add_active, links)} \ No newline at end of file + return {"links": map(add_active, links)} From a4b400d42b19f5d8b31df4c0f9cb749fbf735f50 Mon Sep 17 00:00:00 2001 From: Feliciano Date: Tue, 4 Jun 2024 20:22:53 -0300 Subject: [PATCH 53/84] =?UTF-8?q?agrego=20docstrings=20en=20models.py=20se?= =?UTF-8?q?g=C3=BAn=20la=20regla=20D103?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models.py | 173 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 153 insertions(+), 20 deletions(-) diff --git a/app/models.py b/app/models.py index 6877fdd3..0c0e0014 100644 --- a/app/models.py +++ b/app/models.py @@ -1,9 +1,16 @@ from django.db import models from datetime import datetime +def validate_client(data): + """ + Valida los datos del cliente. + Args: + data (dict): Datos del cliente. -def validate_client(data): + Returns: + dict: Diccionario de errores encontrados. + """ errors = {} name = data.get("name", "") @@ -23,7 +30,6 @@ def validate_client(data): return errors - class Client(models.Model): name = models.CharField(max_length=100) phone = models.CharField(max_length=15) @@ -35,6 +41,15 @@ def __str__(self): @classmethod def save_client(cls, client_data): + """ + Guarda un cliente en la base de datos. + + Args: + client_data (dict): Datos del cliente. + + Returns: + tuple: (bool, dict or None) Éxito de la operación y errores encontrados, si los hay. + """ errors = validate_client(client_data) if len(errors.keys()) > 0: @@ -50,6 +65,12 @@ def save_client(cls, client_data): return True, None def update_client(self, client_data): + """ + Actualiza los datos de un cliente existente. + + Args: + client_data (dict): Datos actualizados del cliente. + """ self.name = client_data.get("name", "") or self.name self.email = client_data.get("email", "") or self.email self.phone = client_data.get("phone", "") or self.phone @@ -58,6 +79,15 @@ def update_client(self, client_data): self.save() def validate_provider(data): + """ + Valida los datos del proveedor. + + Args: + data (dict): Datos del proveedor. + + Returns: + dict: Diccionario de errores encontrados. + """ errors = {} name = data.get("name", "") @@ -77,7 +107,6 @@ def validate_provider(data): return errors - class Provider(models.Model): name = models.CharField(max_length=100) email = models.EmailField() @@ -88,6 +117,15 @@ def __str__(self): @classmethod def save_provider(cls, provider_data): + """ + Guarda un proveedor en la base de datos. + + Args: + provider_data (dict): Datos del proveedor. + + Returns: + tuple: (bool, dict or None) Éxito de la operación y errores encontrados, si los hay. + """ errors = validate_provider(provider_data) if len(errors.keys()) > 0: @@ -102,6 +140,15 @@ def save_provider(cls, provider_data): return True, None def update_provider(self, provider_data): + """ + Actualiza los datos de un proveedor existente. + + Args: + provider_data (dict): Datos actualizados del proveedor. + + Returns: + tuple: (bool, dict or None) Éxito de la operación y errores encontrados, si los hay. + """ errors = validate_provider(provider_data) if len(errors) > 0: @@ -114,9 +161,16 @@ def update_provider(self, provider_data): self.save() return True, None +def validate_product(data): + """ + Valida los datos del producto. + Args: + data (dict): Datos del producto. -def validate_product(data): + Returns: + dict: Diccionario de errores encontrados. + """ errors = {} name = data.get("name", "") @@ -141,8 +195,6 @@ def validate_product(data): return errors - - class Product(models.Model): name = models.CharField(max_length=100) product_type = models.CharField(max_length=15) @@ -153,6 +205,15 @@ def __str__(self): @classmethod def save_product(cls, product_data): + """ + Guarda un producto en la base de datos. + + Args: + product_data (dict): Datos del producto. + + Returns: + tuple: (bool, dict or None) Éxito de la operación y errores encontrados, si los hay. + """ errors = validate_product(product_data) if len(errors.keys()) > 0: @@ -166,10 +227,16 @@ def save_product(cls, product_data): return True, "Producto creado exitosamente" - def update_product(self, product_data): + """ + Actualiza los datos de un producto existente. + Args: + product_data (dict): Datos actualizados del producto. + Returns: + tuple: (bool, dict or None) Éxito de la operación y errores encontrados, si los hay. + """ errors = validate_product(product_data) if len(errors.keys()) > 0: return False, errors @@ -182,6 +249,15 @@ def update_product(self, product_data): return True, None def validate_pet(data): + """ + Valida los datos de la mascota. + + Args: + data (dict): Datos de la mascota. + + Returns: + dict: Diccionario de errores encontrados. + """ errors = {} name = data.get("name", "") @@ -217,7 +293,6 @@ def validate_pet(data): return errors - class Pet(models.Model): name = models.CharField(max_length=40) breed = models.CharField(max_length=40) @@ -229,6 +304,15 @@ def __str__(self): @classmethod def save_pet(cls, pet_data): + """ + Guarda una mascota en la base de datos. + + Args: + pet_data (dict): Datos de la mascota. + + Returns: + tuple: (bool, dict or None) Éxito de la operación y errores encontrados, si los hay. + """ errors = validate_pet(pet_data) if len(errors.keys()) > 0: @@ -244,9 +328,17 @@ def save_pet(cls, pet_data): return True, None def update_pet(self, pet_data): + """ + Actualiza los datos de una mascota existente. + + Args: + pet_data (dict): Datos actualizados de la mascota. + + Returns: + tuple: (bool, dict or None) Éxito de la operación y errores encontrados, si los hay. + """ errors = validate_pet(pet_data) if len(errors.keys()) > 0: - print("Retorno false") return False, errors self.name = pet_data.get("name", "") or self.name @@ -254,22 +346,25 @@ def update_pet(self, pet_data): self.birthday = pet_data.get("birthday", "") or self.birthday self.weight = pet_data.get("weight", "") or self.weight - errors = validate_pet(pet_data) - - if len(errors.keys()) > 0: - return False, errors - self.save() return True, None def validate_veterinary(data): + """ + Valida los datos del veterinario. + + Args: + data (dict): Datos del veterinario. + + Returns: + dict: Diccionario de errores encontrados. + """ errors = {} name = data.get("name", "") email = data.get("email", "") phone = data.get("phone", "") - if name == "": errors["name"] = "Por favor ingrese un nombre" @@ -283,24 +378,30 @@ def validate_veterinary(data): return errors - class Veterinary(models.Model): name = models.CharField(max_length=100) email = models.EmailField() phone = models.CharField(max_length=15) - def __str__(self): return self.name @classmethod def save_veterinary(cls, veterinary_data): + """ + Guarda un veterinario en la base de datos. + + Args: + veterinary_data (dict): Datos del veterinario. + + Returns: + tuple: (bool, dict or None) Éxito de la operación y errores encontrados, si los hay. + """ errors = validate_veterinary(veterinary_data) if len(errors.keys()) > 0: return False, errors - Veterinary.objects.create( name=veterinary_data.get("name"), email=veterinary_data.get("email"), @@ -310,14 +411,28 @@ def save_veterinary(cls, veterinary_data): return True, None def update_veterinary(self, veterinary_data): + """ + Actualiza los datos de un veterinario existente. + + Args: + veterinary_data (dict): Datos actualizados del veterinario. + """ self.name = veterinary_data.get("name", "") or self.name self.email = veterinary_data.get("email", "") or self.email self.phone = veterinary_data.get("phone", "") or self.phone self.save() - def validate_medicine(data): + """ + Valida los datos del medicamento. + + Args: + data (dict): Datos del medicamento. + + Returns: + dict: Diccionario de errores encontrados. + """ errors = {} name = data.get("name", "") @@ -350,6 +465,15 @@ def __str__(self): @classmethod def save_medicine(cls, medicine_data): + """ + Guarda un medicamento en la base de datos. + + Args: + medicine_data (dict): Datos del medicamento. + + Returns: + tuple: (bool, dict or None) Éxito de la operación y errores encontrados, si los hay. + """ errors = validate_medicine(medicine_data) if len(errors.keys()) > 0: @@ -362,7 +486,17 @@ def save_medicine(cls, medicine_data): ) return True, None + def update_medicine(self, medicine_data): + """ + Actualiza los datos de un medicamento existente. + + Args: + medicine_data (dict): Datos actualizados del medicamento. + + Returns: + tuple: (bool, dict or None) Éxito de la operación y errores encontrados, si los hay. + """ errors = validate_medicine(medicine_data) if len(errors) > 0: @@ -374,4 +508,3 @@ def update_medicine(self, medicine_data): self.save() return True, None - \ No newline at end of file From dbf93ae7a55234db70a12884b02c063d54cc8d8b Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Tue, 4 Jun 2024 20:26:05 -0300 Subject: [PATCH 54/84] Solucion ruff en models --- app/models.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/app/models.py b/app/models.py index 5a8dc019..3fceeb6e 100644 --- a/app/models.py +++ b/app/models.py @@ -1,6 +1,6 @@ from django.db import models from datetime import datetime -import re +from django.db import IntegrityError from django.core.exceptions import ValidationError @@ -65,8 +65,8 @@ def update_client(self, client_data): try: self.save() return True, None - except: - return False, errors + except (IntegrityError, ValidationError) as e: + return False, {"error": str(e)} def validate_provider(data): errors = {} @@ -125,9 +125,8 @@ def update_provider(self, provider_data): try: self.save() return True, None - except: - return False, errors - + except (IntegrityError, ValidationError) as e: + return False, {"error": str(e)} def validate_product(data): @@ -389,6 +388,6 @@ def update_medicine(self, medicine_data): try: self.save() return True, None - except: - return False, errors + except (IntegrityError, ValidationError) as e: + return False, {"error": str(e)} \ No newline at end of file From ba210ded5be9350c833e7648a4aa6403ccdd9a3b Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Tue, 4 Jun 2024 20:26:14 -0300 Subject: [PATCH 55/84] Solucion ruff en unit test --- app/tests_unit.py | 1 - 1 file changed, 1 deletion(-) diff --git a/app/tests_unit.py b/app/tests_unit.py index 1b8f0b1a..c8ee7325 100644 --- a/app/tests_unit.py +++ b/app/tests_unit.py @@ -1,4 +1,3 @@ -from django.forms import ValidationError from django.test import TestCase from app.models import Client,Pet,validate_pet,Provider, Product,Medicine from django.utils import timezone From e42fe81a951fac58f0e959dcb8260c24b4ac726b Mon Sep 17 00:00:00 2001 From: GonzaloEBaez Date: Tue, 4 Jun 2024 20:26:25 -0300 Subject: [PATCH 56/84] Solucion ruff en test e2e --- functional_tests/tests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/functional_tests/tests.py b/functional_tests/tests.py index bfc7aa9e..12ec67ab 100644 --- a/functional_tests/tests.py +++ b/functional_tests/tests.py @@ -6,7 +6,7 @@ from django.utils import timezone from django.urls import reverse -from app.models import Client, Provider, Medicine, Pet +from app.models import Client, Provider os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true" @@ -393,7 +393,7 @@ def test_should_show_error_for_present_birth_date(self): # Verifica si se muestra el mensaje de error esperado expect(self.page.get_by_text("La fecha de nacimiento debe ser menor a la fecha actual")).to_be_visible() - def test_should_be_able_to_create_a_new_pet(self): + def test_should_be_able_to_create_a_new_pet_goto(self): self.page.goto(f"{self.live_server_url}{reverse('pet_form')}") # Pruebas para peso de la mascota From 3873654092624d6c8bd22d37a381c324c3eac5a3 Mon Sep 17 00:00:00 2001 From: Feliciano Date: Tue, 4 Jun 2024 20:37:23 -0300 Subject: [PATCH 57/84] =?UTF-8?q?agrego=20docstrings=20en=20tests=5Funit.p?= =?UTF-8?q?y=20seg=C3=BAn=20la=20regla=20D103?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/tests_unit.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/app/tests_unit.py b/app/tests_unit.py index b8a32327..3f737ca3 100644 --- a/app/tests_unit.py +++ b/app/tests_unit.py @@ -4,6 +4,9 @@ class ClientModelTest(TestCase): def test_can_create_and_get_client(self): + """ + Prueba la creación y recuperación de un cliente. + """ Client.save_client( { "name": "Juan Sebastian Veron", @@ -21,6 +24,9 @@ def test_can_create_and_get_client(self): self.assertEqual(clients[0].email, "brujita75@hotmail.com") def test_can_update_client(self): + """ + Prueba la actualización de un cliente. + """ Client.save_client( { "name": "Juan Sebastian Veron", @@ -40,6 +46,9 @@ def test_can_update_client(self): self.assertEqual(client_updated.phone, "221555233") def test_update_client_with_error(self): + """ + Prueba la actualización de un cliente con un error. + """ Client.save_client( { "name": "Juan Sebastian Veron", @@ -61,6 +70,9 @@ def test_update_client_with_error(self): class MedicineModelTest(TestCase): def test_can_create_medicine_with_valid_dose(self): + """ + Prueba la creación de un medicamento con una dosis válida. + """ success, errors = Medicine.save_medicine( { "name": "Ibuprofeno", @@ -74,6 +86,9 @@ def test_can_create_medicine_with_valid_dose(self): self.assertEqual(len(medicines), 1) def test_cannot_create_medicine_with_invalid_dose(self): + """ + Prueba la creación de un medicamento con una dosis inválida. + """ success, errors = Medicine.save_medicine( { "name": "Ibuprofeno", @@ -88,6 +103,9 @@ def test_cannot_create_medicine_with_invalid_dose(self): self.assertEqual(len(medicines), 0) def test_update_medicine_with_invalid_dose(self): + """ + Prueba la actualización de un medicamento con una dosis inválida. + """ Medicine.save_medicine( { "name": "Paracetamol", @@ -109,6 +127,9 @@ def test_update_medicine_with_invalid_dose(self): class ProviderModelTest(TestCase): def test_can_create_and_get_provider(self): + """ + Prueba la creación y recuperación de un proveedor. + """ Provider.save_provider( { "name": "Juan Roman Riquelme", @@ -125,6 +146,9 @@ def test_can_create_and_get_provider(self): #Agrego test unitario especifico de la issue de provider def test_provider_address(self): + """ + Prueba la recuperación de un proveedor por dirección específica. + """ addres = "calle 13 y 44" Provider.save_provider( { @@ -138,6 +162,9 @@ def test_provider_address(self): class PetModelTest(TestCase): def test_validate_pet_birthday(self): + """ + Prueba la validación de la fecha de nacimiento de una mascota. + """ # Probamos la validación de fecha de nacimiento para una mascota valid_data = { "name": "Frida", @@ -161,6 +188,9 @@ def test_validate_pet_birthday(self): # Validacion de peso mascota def test_create_pet_with_valid_weight(self): + """ + Prueba la creación de una mascota con un peso válido. + """ success, message_or_errors = Pet.save_pet({ "name": "Frida", "breed": "negrita", @@ -172,6 +202,9 @@ def test_create_pet_with_valid_weight(self): self.assertEqual(message_or_errors, None) def test_create_pet_with_invalid_weight_negative(self): + """ + Prueba la creación de una mascota con un peso negativo. + """ success, message_or_errors = Pet.save_pet({ "name": "Frida", "breed": "negrita", @@ -185,6 +218,9 @@ def test_create_pet_with_invalid_weight_negative(self): class ProductModelTest(TestCase): def test_create_product_with_valid_price(self): + """ + Prueba la creación de un producto con un precio válido. + """ success, message_or_errors = Product.save_product({ "name": "Test Product", "product_type": "Test Type", @@ -195,6 +231,9 @@ def test_create_product_with_valid_price(self): self.assertEqual(message_or_errors, "Producto creado exitosamente") def test_create_product_with_invalid_price_zero(self): + """ + Prueba la creación de un producto con un precio de cero. + """ success, message_or_errors = Product.save_product({ "name": "Test Product", "product_type": "Test Type", @@ -206,6 +245,9 @@ def test_create_product_with_invalid_price_zero(self): self.assertEqual(message_or_errors["price"], "El precio debe ser mayor que cero") def test_create_product_with_invalid_price_negative(self): + """ + Prueba la creación de un producto con un precio negativo. + """ success, message_or_errors = Product.save_product({ "name": "Test Product", "product_type": "Test Type", From ffa32009b962453416c0adf2d5d9c3fe6dae1d06 Mon Sep 17 00:00:00 2001 From: Feliciano Date: Tue, 4 Jun 2024 20:47:14 -0300 Subject: [PATCH 58/84] =?UTF-8?q?agrego=20docstrings=20en=20views.py=20seg?= =?UTF-8?q?=C3=BAn=20la=20regla=20D103?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views.py | 68 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/app/views.py b/app/views.py index 1e70d420..a63450e1 100644 --- a/app/views.py +++ b/app/views.py @@ -2,15 +2,24 @@ from .models import Client, Provider, Product, Pet, Medicine, Veterinary def home(request): + """ + Renderiza la página de inicio. + """ return render(request, "home.html") def clients_repository(request): + """ + Renderiza la lista de clientes. + """ clients = Client.objects.all() return render(request, "clients/repository.html", {"clients": clients}) def clients_form(request, id=None): + """ + Renderiza el formulario de clientes y maneja la creación o actualización de clientes. + """ if request.method == "POST": client_id = request.POST.get("id", "") errors = {} @@ -37,6 +46,9 @@ def clients_form(request, id=None): def clients_delete(request): + """ + Elimina un cliente. + """ client_id = request.POST.get("client_id") client = get_object_or_404(Client, pk=int(client_id)) client.delete() @@ -45,11 +57,17 @@ def clients_delete(request): # Proveedor def provider_repository(request): + """ + Renderiza la lista de proveedores. + """ providers = Provider.objects.all() return render(request, "providers/repository.html", {"providers": providers}) def provider_form(request, id=None): + """ + Renderiza el formulario de proveedores y maneja la creación o actualización de proveedores. + """ if request.method == "POST": provider_id = request.POST.get("id", "") errors = {} @@ -76,6 +94,9 @@ def provider_form(request, id=None): def provider_delete(request): + """ + Elimina un proveedor. + """ provider_id = request.POST.get("provider_id") provider = get_object_or_404(Provider, pk=int(provider_id)) provider.delete() @@ -85,11 +106,17 @@ def provider_delete(request): # Producto def product_repository(request): + """ + Renderiza la lista de productos. + """ products = Product.objects.all() return render(request, "products/repository.html", {"products": products}) def product_form(request, id=None): + """ + Renderiza el formulario de productos y maneja la creación o actualización de productos. + """ if request.method == "POST": product_id = request.POST.get("id", "") errors = {} @@ -99,8 +126,8 @@ def product_form(request, id=None): saved, errors = Product.save_product(request.POST) else: product = get_object_or_404(Product, pk=product_id) - saved,errors = product.update_product(request.POST) - + saved, errors = product.update_product(request.POST) + if saved: return redirect(reverse("product_repo")) @@ -116,17 +143,27 @@ def product_form(request, id=None): def product_delete(request): + """ + Elimina un producto. + """ product_id = request.POST.get("product_id") product = get_object_or_404(Product, pk=int(product_id)) product.delete() return redirect(reverse("product_repo")) -#Mascota + +# Mascota def pet_repository(request): + """ + Renderiza la lista de mascotas. + """ pets = Pet.objects.all() return render(request, "pets/repository.html", {"pets": pets}) def pet_form(request, id=None): + """ + Renderiza el formulario de mascotas y maneja la creación o actualización de mascotas. + """ if request.method == "POST": pet_id = request.POST.get("id", "") errors = {} @@ -157,20 +194,29 @@ def pet_form(request, id=None): def pet_delete(request): + """ + Elimina una mascota. + """ pet_id = request.POST.get("pet_id") pet = get_object_or_404(Pet, pk=int(pet_id)) pet.delete() return redirect(reverse("pet_repo")) -#Veterinario +# Veterinario def veterinary_repository(request): + """ + Renderiza la lista de veterinarios. + """ veterinaries = Veterinary.objects.all() return render(request, "veterinaries/repository.html", {"veterinaries": veterinaries}) def veterinary_form(request, id=None): + """ + Renderiza el formulario de veterinarios y maneja la creación o actualización de veterinarios. + """ if request.method == "POST": veterinary_id = request.POST.get("id", "") errors = {} @@ -197,6 +243,9 @@ def veterinary_form(request, id=None): def veterinary_delete(request): + """ + Elimina un veterinario. + """ veterinary_id = request.POST.get("veterinary_id") veterinary = get_object_or_404(Veterinary, pk=int(veterinary_id)) veterinary.delete() @@ -205,10 +254,16 @@ def veterinary_delete(request): # Funciones para Medicamentos def medicine_repository(request): + """ + Renderiza la lista de medicamentos. + """ medicines = Medicine.objects.all() return render(request, "medicines/repository.html", {"medicines": medicines}) def medicine_form(request, id=None): + """ + Renderiza el formulario de medicamentos y maneja la creación o actualización de medicamentos. + """ medicine = None # Asignar un valor predeterminado a la variable medicine if request.method == "POST": medicine_id = request.POST.get("id", "") @@ -219,7 +274,7 @@ def medicine_form(request, id=None): saved, errors = Medicine.save_medicine(request.POST) else: medicine = get_object_or_404(Medicine, pk=medicine_id) - saved,errors = medicine.update_medicine(request.POST) + saved, errors = medicine.update_medicine(request.POST) if saved: return redirect(reverse("medicine_repo")) @@ -235,6 +290,9 @@ def medicine_form(request, id=None): return render(request, "medicines/form.html", {"medicine": medicine}) def medicine_delete(request): + """ + Elimina un medicamento. + """ medicine_id = request.POST.get("medicine_id") medicine = get_object_or_404(Medicine, pk=int(medicine_id)) medicine.delete() From 51e9f44e3f909297b7296d58e15c71c5c162fec6 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 21:25:47 -0300 Subject: [PATCH 59/84] Elimino regla que no debio haberse subido directamente a main --- .ruff.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ruff.toml b/.ruff.toml index 0904166e..a981d446 100644 --- a/.ruff.toml +++ b/.ruff.toml @@ -38,7 +38,7 @@ target-version = "py38" [lint] # Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default. -select = ["E4", "E7", "E9", "F", "D102"] +select = ["E4", "E7", "E9", "F"] ignore = [] # Allow fix for all enabled rules (when `--fix`) is provided. From 45045661e4f987530bde8810998b4e20ca4d697d Mon Sep 17 00:00:00 2001 From: Gonzalo Baez Date: Tue, 4 Jun 2024 22:09:33 -0300 Subject: [PATCH 60/84] Modifico models para que pase ruff --- app/models.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/models.py b/app/models.py index 93df7b06..1975f3f4 100644 --- a/app/models.py +++ b/app/models.py @@ -1,5 +1,7 @@ from django.db import models from datetime import datetime +from django.db import IntegrityError +from django.core.exceptions import ValidationError @@ -114,8 +116,8 @@ def update_provider(self, provider_data): try: self.save() return True, None - except: - return False, errors + except (IntegrityError, ValidationError) as e: + return False, {"error": str(e)} @@ -378,6 +380,5 @@ def update_medicine(self, medicine_data): try: self.save() return True, None - except: - return False, errors - \ No newline at end of file + except (IntegrityError, ValidationError) as e: + return False, {"error": str(e)} From c4b1327646196422866c0cec6a9b6c545190d23f Mon Sep 17 00:00:00 2001 From: Gonzalo Baez Date: Tue, 4 Jun 2024 22:10:08 -0300 Subject: [PATCH 61/84] Modifico tests e2e para correrigir errores de ruff --- functional_tests/tests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/functional_tests/tests.py b/functional_tests/tests.py index a9d559b5..bfbb581f 100644 --- a/functional_tests/tests.py +++ b/functional_tests/tests.py @@ -6,7 +6,7 @@ from django.utils import timezone from django.urls import reverse -from app.models import Client, Provider, Medicine, Pet +from app.models import Client, Provider os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true" @@ -393,7 +393,7 @@ def test_should_show_error_for_present_birth_date(self): # Verifica si se muestra el mensaje de error esperado expect(self.page.get_by_text("La fecha de nacimiento debe ser menor a la fecha actual")).to_be_visible() - def test_should_be_able_to_create_a_new_pet(self): + def test_should_be_able_to_create_a_new_pet_goto(self): self.page.goto(f"{self.live_server_url}{reverse('pet_form')}") # Pruebas para peso de la mascota From 51c55e166707f32c34d1c7549f6e25068288df8c Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 23:01:31 -0300 Subject: [PATCH 62/84] Agrego deplegable de Ciudad --- app/templates/clients/form.html | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/app/templates/clients/form.html b/app/templates/clients/form.html index 4de18eed..df0dc3e0 100644 --- a/app/templates/clients/form.html +++ b/app/templates/clients/form.html @@ -67,17 +67,20 @@

Nuevo Cliente

- - -
- La dirrección es opcional -
+ + {% if errors.city %} +
{{ errors.city }}
+ {% endif %}
+
From 50c79dc80936f513a0c5c5c318e5bb0b553a41ea Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 23:02:58 -0300 Subject: [PATCH 63/84] Agrego validacion de ciudad --- app/models.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/app/models.py b/app/models.py index 773be6f2..61b8f5dd 100644 --- a/app/models.py +++ b/app/models.py @@ -1,7 +1,10 @@ from django.db import models from datetime import datetime - +class CityEnum(models.TextChoices): + LA_PLATA = 'La Plata', + BERISSO = 'Berisso', + ENSENADA = 'Ensenada', def validate_client(data): errors = {} @@ -9,6 +12,7 @@ def validate_client(data): name = data.get("name", "") phone = data.get("phone", "") email = data.get("email", "") + city = data.get("city", "") if name == "": errors["name"] = "Por favor ingrese un nombre" @@ -21,6 +25,11 @@ def validate_client(data): elif email.count("@") == 0: errors["email"] = "Por favor ingrese un email valido" + if city == "" or city is None: + errors["city"] = "Por favor ingrese una ciudad" + elif city not in dict(CityEnum.choices): + errors["city"] = "Por favor ingrese una ciudad valida" + return errors @@ -28,7 +37,7 @@ class Client(models.Model): name = models.CharField(max_length=100) phone = models.CharField(max_length=15) email = models.EmailField() - city = models.CharField(max_length=100, blank=True) + city = models.CharField(max_length=35, choices=CityEnum.choices) def __str__(self): return self.name @@ -50,6 +59,11 @@ def save_client(cls, client_data): return True, None def update_client(self, client_data): + errors = validate_client(client_data) + + if len(errors.keys()) > 0: + return False, errors + self.name = client_data.get("name", "") or self.name self.email = client_data.get("email", "") or self.email self.phone = client_data.get("phone", "") or self.phone @@ -57,6 +71,8 @@ def update_client(self, client_data): self.save() + return True, None + def validate_provider(data): errors = {} From 421c35a7ba173f57673549809f51ca5c68fd8fa3 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 23:03:13 -0300 Subject: [PATCH 64/84] Corrijo test unitario --- app/tests_unit.py | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/app/tests_unit.py b/app/tests_unit.py index 878f8b4a..15aeea46 100644 --- a/app/tests_unit.py +++ b/app/tests_unit.py @@ -8,8 +8,8 @@ def test_can_create_and_get_client(self): { "name": "Juan Sebastian Veron", "phone": "221555232", - "city": "13 y 44", - "email": "brujita75@hotmail.com", + "city": "La Plata", + "email": "brujita75@vetsoft.com", } ) clients = Client.objects.all() @@ -17,35 +17,41 @@ def test_can_create_and_get_client(self): self.assertEqual(clients[0].name, "Juan Sebastian Veron") self.assertEqual(clients[0].phone, "221555232") - self.assertEqual(clients[0].city, "13 y 44") - self.assertEqual(clients[0].email, "brujita75@hotmail.com") + self.assertEqual(clients[0].city, "La Plata") + self.assertEqual(clients[0].email, "brujita75@vetsoft.com") def test_can_update_client(self): + Client.save_client( { "name": "Juan Sebastian Veron", "phone": "221555232", - "city": "13 y 44", - "email": "brujita75@hotmail.com", - } + "email": "brujita75@vetsoft.com", + "city": "La Plata", + }, ) client = Client.objects.get(pk=1) - self.assertEqual(client.phone, "221555232") - - client.update_client({"phone": "221555233"}) + client.update_client( { + "name": "Juan Sebastian Veron", + "phone": "221555232", + "email": "guido@vetsoft.com", + "city": "Berisso", + },) client_updated = Client.objects.get(pk=1) - self.assertEqual(client_updated.phone, "221555233") + self.assertEqual(client_updated.phone, "221555232") + self.assertEqual(client_updated.email, "guido@vetsoft.com") + self.assertEqual(client_updated.city, "Berisso") def test_update_client_with_error(self): Client.save_client( { "name": "Juan Sebastian Veron", "phone": "221555232", - "city": "13 y 44", - "email": "brujita75@hotmail.com", + "city": "La Plata", + "email": "brujita75@vetsoft.com", } ) client = Client.objects.get(pk=1) @@ -112,7 +118,7 @@ def test_can_create_and_get_provider(self): Provider.save_provider( { "name": "Juan Roman Riquelme", - "email": "senor10@gmail.com", + "email": "senor10@vetsoft.com", "address": "13 y 44", } ) @@ -121,7 +127,7 @@ def test_can_create_and_get_provider(self): self.assertEqual(providers[0].name, "Juan Roman Riquelme") self.assertEqual(providers[0].address, "13 y 44") - self.assertEqual(providers[0].email, "senor10@gmail.com") + self.assertEqual(providers[0].email, "senor10@vetsoft.com") #Agrego test unitario especifico de la issue de provider def test_provider_address(self): @@ -129,7 +135,7 @@ def test_provider_address(self): Provider.save_provider( { "name": "Juan Roman Riquelme", - "email": "senor10@gmail.com", + "email": "senor10@vetsoft.com", "address": addres, #guardo proveedor con direccion especifica } ) From 666e90574698a65715f42405dbb71ec856592146 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 23:03:27 -0300 Subject: [PATCH 65/84] Corrijo test de integracion --- app/tests_integration.py | 70 +++++++++++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 19 deletions(-) diff --git a/app/tests_integration.py b/app/tests_integration.py index d5f83982..e06dc5a2 100644 --- a/app/tests_integration.py +++ b/app/tests_integration.py @@ -27,22 +27,22 @@ def test_form_use_form_template(self): self.assertTemplateUsed(response, "clients/form.html") def test_can_create_client(self): + response = self.client.post( reverse("clients_form"), data={ "name": "Juan Sebastian Veron", - "phone": "221555232", - "city": "13 y 44", - "email": "brujita75@hotmail.com", + "phone": "54221555232", + "email": "brujita75@vetsoft.com", + "city": "La Plata", }, ) clients = Client.objects.all() self.assertEqual(len(clients), 1) - self.assertEqual(clients[0].name, "Juan Sebastian Veron") - self.assertEqual(clients[0].phone, "221555232") - self.assertEqual(clients[0].city, "13 y 44") - self.assertEqual(clients[0].email, "brujita75@hotmail.com") + self.assertEqual(clients[0].phone, "54221555232") + self.assertEqual(clients[0].email, "brujita75@vetsoft.com") + self.assertEqual(clients[0].city, "La Plata") self.assertRedirects(response, reverse("clients_repo")) @@ -55,6 +55,7 @@ def test_validation_errors_create_client(self): self.assertContains(response, "Por favor ingrese un nombre") self.assertContains(response, "Por favor ingrese un teléfono") self.assertContains(response, "Por favor ingrese un email") + self.assertContains(response, "Por favor ingrese una ciudad") def test_should_response_with_404_status_if_client_doesnt_exists(self): response = self.client.get(reverse("clients_edit", kwargs={"id": 100})) @@ -66,26 +67,32 @@ def test_validation_invalid_email(self): data={ "name": "Juan Sebastian Veron", "phone": "221555232", - "city": "13 y 44", + "city": "La Plata", "email": "brujita75", }, ) self.assertContains(response, "Por favor ingrese un email valido") - def test_edit_user_with_valid_data(self): + def test_edit_user_with_valid_data_test(self): + """" + test para editar un cliente con datos validos. + """ client = Client.objects.create( - name="Juan Sebastián Veron", - city="13 y 44", - phone="221555232", - email="brujita75@hotmail.com", + name="Guido Carrillo", + city="La Plata", + phone="54221555232", + email="guido@vetsoft.com", ) response = self.client.post( reverse("clients_form"), - data={ + data={ "id": client.id, - "name": "Guido Carrillo", + "name": "Juan Sebastian Veron", + "phone": "221456789", + "email": "brujita71@vetsoft.com", + "city": "Berisso", }, ) @@ -93,10 +100,35 @@ def test_edit_user_with_valid_data(self): self.assertEqual(response.status_code, 302) editedClient = Client.objects.get(pk=client.id) - self.assertEqual(editedClient.name, "Guido Carrillo") - self.assertEqual(editedClient.phone, client.phone) - self.assertEqual(editedClient.city, client.city) - self.assertEqual(editedClient.email, client.email) + self.assertEqual(editedClient.name, "Juan Sebastian Veron") + self.assertEqual(editedClient.email, "brujita71@vetsoft.com") + self.assertEqual(editedClient.phone, "221456789") + self.assertEqual(editedClient.city, "Berisso") + + def test_edit_user_with_invalid_data_test_city(self): + + client = Client.objects.create( + name="Guido Carrillo", + city="La Plata", + phone="221456789", + email="brujita75@vetsoft.com", + ) + + + self.client.post( + reverse("clients_form"), + data={ + "id": client.id, + "name": "Juan Sebastian Veron", + "phone": "221456789", + "city": "Rosario", + "email": "brujita75@vetsoft.com", + }, + ) + + # redirect after post + editedClient = Client.objects.get(pk=client.id) + self.assertEqual(editedClient.city, "La Plata") class MedicineIntegrationTest(TestCase): def test_can_create_medicine(self): From 96de2dbabb9450dc534a105e38c894d35fa20ce3 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 23:04:04 -0300 Subject: [PATCH 66/84] Arreglo update de Cliente --- app/views.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/views.py b/app/views.py index 1e70d420..45c2302d 100644 --- a/app/views.py +++ b/app/views.py @@ -1,5 +1,5 @@ from django.shortcuts import render, redirect, reverse, get_object_or_404 -from .models import Client, Provider, Product, Pet, Medicine, Veterinary +from .models import Client, CityEnum, Provider, Product, Pet, Medicine, Veterinary def home(request): return render(request, "home.html") @@ -11,6 +11,7 @@ def clients_repository(request): def clients_form(request, id=None): + ciudades = CityEnum.choices if request.method == "POST": client_id = request.POST.get("id", "") errors = {} @@ -20,20 +21,20 @@ def clients_form(request, id=None): saved, errors = Client.save_client(request.POST) else: client = get_object_or_404(Client, pk=client_id) - client.update_client(request.POST) + saved,errors = client.update_client(request.POST) if saved: return redirect(reverse("clients_repo")) return render( - request, "clients/form.html", {"errors": errors, "client": request.POST} + request, "clients/form.html", {"errors": errors, "client": request.POST, "ciudades": ciudades}, ) client = None if id is not None: client = get_object_or_404(Client, pk=id) - return render(request, "clients/form.html", {"client": client}) + return render(request, "clients/form.html", {"client": client, "ciudades": ciudades}) def clients_delete(request): From 2f15d1229737d413be0cc3e78f411eaf48f4c439 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Tue, 4 Jun 2024 23:04:24 -0300 Subject: [PATCH 67/84] Arreglo test e2e --- functional_tests/tests.py | 93 ++++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 46 deletions(-) diff --git a/functional_tests/tests.py b/functional_tests/tests.py index a5968595..e23586eb 100644 --- a/functional_tests/tests.py +++ b/functional_tests/tests.py @@ -74,16 +74,16 @@ def test_should_show_message_if_table_is_empty(self): def test_should_show_clients_data(self): Client.objects.create( name="Juan Sebastián Veron", - city="13 y 44", + city="La Plata", phone="221555232", - email="brujita75@hotmail.com", + email="brujita75@vetsoft.com", ) Client.objects.create( name="Guido Carrillo", - city="1 y 57", + city="Berisso", phone="221232555", - email="goleador@gmail.com", + email="goleador@vetsoft.com", ) self.page.goto(f"{self.live_server_url}{reverse('clients_repo')}") @@ -91,14 +91,14 @@ def test_should_show_clients_data(self): expect(self.page.get_by_text("No existen clientes")).not_to_be_visible() expect(self.page.get_by_text("Juan Sebastián Veron")).to_be_visible() - expect(self.page.get_by_text("13 y 44")).to_be_visible() + expect(self.page.get_by_text("La Plata")).to_be_visible() expect(self.page.get_by_text("221555232")).to_be_visible() - expect(self.page.get_by_text("brujita75@hotmail.com")).to_be_visible() + expect(self.page.get_by_text("brujita75@vetsoft.com")).to_be_visible() expect(self.page.get_by_text("Guido Carrillo")).to_be_visible() - expect(self.page.get_by_text("1 y 57")).to_be_visible() + expect(self.page.get_by_text("Berisso")).to_be_visible() expect(self.page.get_by_text("221232555")).to_be_visible() - expect(self.page.get_by_text("goleador@gmail.com")).to_be_visible() + expect(self.page.get_by_text("goleador@vetsoft.com")).to_be_visible() def test_should_show_add_client_action(self): self.page.goto(f"{self.live_server_url}{reverse('clients_repo')}") @@ -113,7 +113,7 @@ def test_should_show_client_edit_action(self): name="Juan Sebastián Veron", city="13 y 44", phone="221555232", - email="brujita75@hotmail.com", + email="brujita75@vetsoft.com", ) self.page.goto(f"{self.live_server_url}{reverse('clients_repo')}") @@ -128,7 +128,7 @@ def test_should_show_client_delete_action(self): name="Juan Sebastián Veron", city="13 y 44", phone="221555232", - email="brujita75@hotmail.com", + email="brujita75@vetsoft.com", ) self.page.goto(f"{self.live_server_url}{reverse('clients_repo')}") @@ -149,7 +149,7 @@ def test_should_can_be_able_to_delete_a_client(self): name="Juan Sebastián Veron", city="13 y 44", phone="221555232", - email="brujita75@hotmail.com", + email="brujita75@vetsoft.com", ) self.page.goto(f"{self.live_server_url}{reverse('clients_repo')}") @@ -177,15 +177,15 @@ def test_should_be_able_to_create_a_new_client(self): self.page.get_by_label("Nombre").fill("Juan Sebastián Veron") self.page.get_by_label("Teléfono").fill("221555232") - self.page.get_by_label("Email").fill("brujita75@hotmail.com") - self.page.get_by_label("Ciudad").fill("13 y 44") + self.page.get_by_label("Email").fill("brujita75@vetsoft.com") + self.page.get_by_label("Ciudad").select_option("La Plata") self.page.get_by_role("button", name="Guardar").click() expect(self.page.get_by_text("Juan Sebastián Veron")).to_be_visible() expect(self.page.get_by_text("221555232")).to_be_visible() - expect(self.page.get_by_text("brujita75@hotmail.com")).to_be_visible() - expect(self.page.get_by_text("13 y 44")).to_be_visible() + expect(self.page.get_by_text("brujita75@vetsoft.com")).to_be_visible() + expect(self.page.get_by_text("La Plata")).to_be_visible() def test_should_view_errors_if_form_is_invalid(self): self.page.goto(f"{self.live_server_url}{reverse('clients_form')}") @@ -201,7 +201,7 @@ def test_should_view_errors_if_form_is_invalid(self): self.page.get_by_label("Nombre").fill("Juan Sebastián Veron") self.page.get_by_label("Teléfono").fill("221555232") self.page.get_by_label("Email").fill("brujita75") - self.page.get_by_label("Ciudad").fill("13 y 44") + self.page.get_by_label("Ciudad").select_option("La Plata") self.page.get_by_role("button", name="Guardar").click() @@ -215,37 +215,38 @@ def test_should_view_errors_if_form_is_invalid(self): ).to_be_visible() def test_should_be_able_to_edit_a_client(self): - client = Client.objects.create( - name="Juan Sebastián Veron", - city="13 y 44", - phone="221555232", - email="brujita75@hotmail.com", - ) - - path = reverse("clients_edit", kwargs={"id": client.id}) - self.page.goto(f"{self.live_server_url}{path}") - - self.page.get_by_label("Nombre").fill("Guido Carrillo") - self.page.get_by_label("Teléfono").fill("221232555") - self.page.get_by_label("Email").fill("goleador@gmail.com") - self.page.get_by_label("Ciudad").fill("1 y 57") - - self.page.get_by_role("button", name="Guardar").click() - expect(self.page.get_by_text("Juan Sebastián Veron")).not_to_be_visible() - expect(self.page.get_by_text("13 y 44")).not_to_be_visible() - expect(self.page.get_by_text("221555232")).not_to_be_visible() - expect(self.page.get_by_text("brujita75@hotmail.com")).not_to_be_visible() - - expect(self.page.get_by_text("Guido Carrillo")).to_be_visible() - expect(self.page.get_by_text("1 y 57")).to_be_visible() - expect(self.page.get_by_text("221232555")).to_be_visible() - expect(self.page.get_by_text("goleador@gmail.com")).to_be_visible() - - edit_action = self.page.get_by_role("link", name="Editar") - expect(edit_action).to_have_attribute( - "href", reverse("clients_edit", kwargs={"id": client.id}) - ) + client = Client.objects.create( + name="Juan Sebastián Veron", + city="La Plata", + phone="54221555232", + email="brujita75@vetsoft.com", + ) + + path = reverse("clients_edit", kwargs={"id": client.id}) + self.page.goto(f"{self.live_server_url}{path}") + + self.page.get_by_label("Nombre").fill("Guido Carrillo") + self.page.get_by_label("Teléfono").fill("54221232555") + self.page.get_by_label("Email").fill("goleador@vetsoft.com") + self.page.get_by_label("Ciudad").select_option("Berisso") + + self.page.get_by_role("button", name="Guardar").click() + + expect(self.page.get_by_text("Juan Sebastián Veron")).not_to_be_visible() + expect(self.page.get_by_text("La Plata")).not_to_be_visible() + expect(self.page.get_by_text("54221555232")).not_to_be_visible() + expect(self.page.get_by_text("brujita75@vetsoft.com")).not_to_be_visible() + + expect(self.page.get_by_text("Guido Carrillo")).to_be_visible() + expect(self.page.get_by_text("Berisso")).to_be_visible() + expect(self.page.get_by_text("54221232555")).to_be_visible() + expect(self.page.get_by_text("goleador@vetsoft.com")).to_be_visible() + + edit_action = self.page.get_by_role("link", name="Editar") + expect(edit_action).to_have_attribute( + "href", reverse("clients_edit", kwargs={"id": client.id}), + ) class MedicineCreateEditTestCase(PlaywrightTestCase): From 2ed11e349e983ec0a80df9adc0959a79fd521ba0 Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Tue, 4 Jun 2024 23:46:49 -0300 Subject: [PATCH 68/84] Corrijo el ruff. --- .ruff.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ruff.toml b/.ruff.toml index fc8ac59c..0904166e 100644 --- a/.ruff.toml +++ b/.ruff.toml @@ -38,7 +38,7 @@ target-version = "py38" [lint] # Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default. -select = ["E4", "E7", "E9", "F", "COM812"] +select = ["E4", "E7", "E9", "F", "D102"] ignore = [] # Allow fix for all enabled rules (when `--fix`) is provided. From 24af5cfe2a443a04d9572cf99cb7ccba9e9387bb Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Tue, 4 Jun 2024 23:58:28 -0300 Subject: [PATCH 69/84] Arregle el test unitario --- app/tests_unit.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/tests_unit.py b/app/tests_unit.py index 46e2a2cc..64789070 100644 --- a/app/tests_unit.py +++ b/app/tests_unit.py @@ -73,13 +73,16 @@ def test_update_client_with_error(self): self.assertEqual(client_updated.phone, "221555232") def test_update_client_with_email_null(self): #nuevo test verificando que no pueda hacer update con email nulo + """ + Esta funcion testea el cliente acutalizado con un email nulo + """ Client.save_client( { "name": "Juan Sebastian Veron", "phone": "221555232", "address": "13 y 44", "email": "brujita75@vetsoft.com", - } + }, ) client = Client.objects.get(pk=1) From cb2deb8f7eca02915e1e6553dc81fd32dee90e68 Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Tue, 4 Jun 2024 23:59:30 -0300 Subject: [PATCH 70/84] Arregle el test e2e. --- functional_tests/tests.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/functional_tests/tests.py b/functional_tests/tests.py index 3aeec08a..257e9171 100644 --- a/functional_tests/tests.py +++ b/functional_tests/tests.py @@ -476,6 +476,9 @@ def test_should_show_error_for_present_birth_date(self): expect(self.page.get_by_text("La fecha de nacimiento debe ser menor a la fecha actual")).to_be_visible() def test_should_be_able_to_create_a_new_pet_goto(self): + """ + Verifica si el test me permite crear una nueva masota. + """ self.page.goto(f"{self.live_server_url}{reverse('pet_form')}") From 8b82868229bbc0d564f6e0518333bf1785942f13 Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Wed, 5 Jun 2024 00:00:10 -0300 Subject: [PATCH 71/84] Agregue la migracion necesaria. --- app/migrations/0017_merge_20240604_2359.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 app/migrations/0017_merge_20240604_2359.py diff --git a/app/migrations/0017_merge_20240604_2359.py b/app/migrations/0017_merge_20240604_2359.py new file mode 100644 index 00000000..88bf4e9c --- /dev/null +++ b/app/migrations/0017_merge_20240604_2359.py @@ -0,0 +1,14 @@ +# Generated by Django 5.0.4 on 2024-06-05 02:59 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0015_merge_20240603_1125'), + ('app', '0016_delete_veterinario'), + ] + + operations = [ + ] From 506e036b0d4791051c4afb8c2fc0b952d61d4815 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Wed, 5 Jun 2024 01:43:03 -0300 Subject: [PATCH 72/84] corrijo espacios entre imports --- app/models.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/models.py b/app/models.py index 2efbdfb5..9d9c6a30 100644 --- a/app/models.py +++ b/app/models.py @@ -1,6 +1,7 @@ from datetime import datetime -from django.db import IntegrityError, models + from django.core.exceptions import ValidationError +from django.db import IntegrityError, models def validate_client(data): From 465b20b0f4ed92f1f25bb446a48277e69af90a3f Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Wed, 5 Jun 2024 01:43:12 -0300 Subject: [PATCH 73/84] corrijo coma --- app/tests_unit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/tests_unit.py b/app/tests_unit.py index 1ce94b4a..00f7f595 100644 --- a/app/tests_unit.py +++ b/app/tests_unit.py @@ -84,7 +84,7 @@ def test_update_client_with_email_null(self): #nuevo test verificando que no pue "phone": "221555232", "address": "13 y 44", "email": "brujita75@vetsoft.com", - } + }, ) client = Client.objects.get(pk=1) From f00bd4e027238c1337fde5b9c5f3125854fcfbff Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Wed, 5 Jun 2024 01:43:17 -0300 Subject: [PATCH 74/84] corrijo coma --- app/tests_integration.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/tests_integration.py b/app/tests_integration.py index b767c917..b731cd30 100644 --- a/app/tests_integration.py +++ b/app/tests_integration.py @@ -119,7 +119,7 @@ def test_edit_user_with_valid_data(self): "name": "Guido Carrillo", "address": "13 y 44", "phone":"221555232", - "email": "brujita75@vetsoft.com" + "email": "brujita75@vetsoft.com", }, ) From 4a10e2f99285785aefdc6ddf2bf81d3d2315bcb2 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Wed, 5 Jun 2024 01:59:39 -0300 Subject: [PATCH 75/84] fixes --- app/models.py | 23 ++----------------- app/templates/clients/form.html | 15 ------------- app/tests_integration.py | 40 --------------------------------- app/views.py | 2 +- 4 files changed, 3 insertions(+), 77 deletions(-) diff --git a/app/models.py b/app/models.py index be4c39de..f5aac2c0 100644 --- a/app/models.py +++ b/app/models.py @@ -3,23 +3,12 @@ from django.db import IntegrityError from django.core.exceptions import ValidationError -<<<<<<< refactor/Cliente-cambiar-campo-address class CityEnum(models.TextChoices): LA_PLATA = 'La Plata', BERISSO = 'Berisso', ENSENADA = 'Ensenada', -======= -def validate_client(data): - """ - Valida los datos del cliente. - - Args: - data (dict): Datos del cliente. ->>>>>>> main - Returns: - dict: Diccionario de errores encontrados. - """ + def validate_client(data): """ Esta función valida los datos del cliente. @@ -89,12 +78,6 @@ def save_client(cls, client_data): return True, None def update_client(self, client_data): -<<<<<<< refactor/Cliente-cambiar-campo-address - errors = validate_client(client_data) - - if len(errors.keys()) > 0: -======= - """ Actualiza los datos de un cliente existente. @@ -104,9 +87,8 @@ def update_client(self, client_data): Esta función actualiza el cliente. """ errors = validate_client(client_data) - + if len(errors) > 0: ->>>>>>> main return False, errors self.name = client_data.get("name", "") or self.name @@ -120,7 +102,6 @@ def update_client(self, client_data): except (IntegrityError, ValidationError) as e: return False, {"error": str(e)} - return True, None def validate_provider(data): """ diff --git a/app/templates/clients/form.html b/app/templates/clients/form.html index f4c60f88..726056c6 100644 --- a/app/templates/clients/form.html +++ b/app/templates/clients/form.html @@ -66,7 +66,6 @@

Nuevo Cliente

{% endif %}
-<<<<<<< refactor/Cliente-cambiar-campo-address {% if errors.city %}
{{ errors.city }}
-======= - - - - {% if errors.address %} -
- {{ errors.address }} -
->>>>>>> main {% endif %}
diff --git a/app/tests_integration.py b/app/tests_integration.py index 26214040..99f7e6f2 100644 --- a/app/tests_integration.py +++ b/app/tests_integration.py @@ -44,40 +44,24 @@ def test_form_use_form_template(self): self.assertTemplateUsed(response, "clients/form.html") def test_can_create_client(self): -<<<<<<< refactor/Cliente-cambiar-campo-address - -======= """ Esta función verifica si se puede crear un cliente correctamente. """ ->>>>>>> main response = self.client.post( reverse("clients_form"), data={ "name": "Juan Sebastian Veron", -<<<<<<< refactor/Cliente-cambiar-campo-address "phone": "54221555232", "email": "brujita75@vetsoft.com", "city": "La Plata", -======= - "phone": "221555232", - "address": "13 y 44", - "email": "brujita75@vetsoft.com", ->>>>>>> main }, ) clients = Client.objects.all() self.assertEqual(len(clients), 1) self.assertEqual(clients[0].name, "Juan Sebastian Veron") -<<<<<<< refactor/Cliente-cambiar-campo-address self.assertEqual(clients[0].phone, "54221555232") self.assertEqual(clients[0].email, "brujita75@vetsoft.com") self.assertEqual(clients[0].city, "La Plata") -======= - self.assertEqual(clients[0].phone, "221555232") - self.assertEqual(clients[0].address, "13 y 44") - self.assertEqual(clients[0].email, "brujita75@vetsoft.com") ->>>>>>> main self.assertRedirects(response, reverse("clients_repo")) @@ -111,18 +95,12 @@ def test_validation_invalid_email(self): data={ "name": "Juan Sebastian Veron", "phone": "221555232", -<<<<<<< refactor/Cliente-cambiar-campo-address "city": "La Plata", "email": "brujita75", -======= - "email": "brujita75@gmail.com", - "address": "13 y 44", ->>>>>>> main }, ) self.assertContains(response, "El email debe ser de la forma @vetsoft.com") -<<<<<<< refactor/Cliente-cambiar-campo-address def test_edit_user_with_valid_data_test(self): """" test para editar un cliente con datos validos. @@ -132,34 +110,16 @@ def test_edit_user_with_valid_data_test(self): city="La Plata", phone="54221555232", email="guido@vetsoft.com", -======= - def test_edit_user_with_valid_data(self): - """ - Esta función testea que se pueda editar el usuario datos validos. - """ - client = Client.objects.create( - name="Juan Sebastián Veron", - address="13 y 44", - phone="221555232", - email="brujita75@vetsoft.com", ->>>>>>> main ) response = self.client.post( reverse("clients_form"), data={ "id": client.id, -<<<<<<< refactor/Cliente-cambiar-campo-address "name": "Juan Sebastian Veron", "phone": "221456789", "email": "brujita71@vetsoft.com", "city": "Berisso", -======= - "name": "Guido Carrillo", - "address": "13 y 44", - "phone":"221555232", - "email": "brujita75@vetsoft.com" ->>>>>>> main }, ) diff --git a/app/views.py b/app/views.py index 04b8edba..57b7fe2d 100644 --- a/app/views.py +++ b/app/views.py @@ -39,7 +39,7 @@ def clients_form(request, id=None): return redirect(reverse("clients_repo")) return render( - request, "clients/form.html", {"errors": errors, "client": request.POST, "ciudades": ciudades}, + request, "clients/form.html", {"errors": errors, "client": request.POST, "ciudades": ciudades},) client = None if id is not None: From 6559d75d2f69fa79c1c9ccff9e4d88208dd19012 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Wed, 5 Jun 2024 02:02:29 -0300 Subject: [PATCH 76/84] fix --- app/tests_unit.py | 41 +---------------------------------------- 1 file changed, 1 insertion(+), 40 deletions(-) diff --git a/app/tests_unit.py b/app/tests_unit.py index 8d1fc9ca..f6c42204 100644 --- a/app/tests_unit.py +++ b/app/tests_unit.py @@ -12,69 +12,36 @@ def test_can_create_and_get_client(self): { "name": "Juan Sebastian Veron", "phone": "221555232", -<<<<<<< refactor/Cliente-cambiar-campo-address "city": "La Plata", "email": "brujita75@vetsoft.com", - } -======= - "address": "13 y 44", - "email": "brujita75@vetsoft.com", }, - ->>>>>>> main ) clients = Client.objects.all() self.assertEqual(len(clients), 1) self.assertEqual(clients[0].name, "Juan Sebastian Veron") self.assertEqual(clients[0].phone, "221555232") -<<<<<<< refactor/Cliente-cambiar-campo-address self.assertEqual(clients[0].city, "La Plata") self.assertEqual(clients[0].email, "brujita75@vetsoft.com") def test_can_update_client(self): -======= - self.assertEqual(clients[0].address, "13 y 44") - self.assertEqual(clients[0].email, "brujita75@vetsoft.com") - - def test_can_update_client(self): - """ - Prueba la actualización de un cliente. - Esta función testea si se puede actualizar el cliente. - """ ->>>>>>> main Client.save_client( { "name": "Juan Sebastian Veron", "phone": "221555232", -<<<<<<< refactor/Cliente-cambiar-campo-address "email": "brujita75@vetsoft.com", "city": "La Plata", -======= - "address": "13 y 44", - "email": "brujita75@vetsoft.com", ->>>>>>> main }, ) client = Client.objects.get(pk=1) -<<<<<<< refactor/Cliente-cambiar-campo-address client.update_client( { "name": "Juan Sebastian Veron", "phone": "221555232", "email": "guido@vetsoft.com", "city": "Berisso", },) -======= - self.assertEqual(client.phone, "221555232") - - client.update_client( - {"name": "Juan Sebastian Veron", - "phone": "221555233", - "address": "13 y 44", - "email": "brujita75@vetsoft.com"}) ->>>>>>> main client_updated = Client.objects.get(pk=1) @@ -91,15 +58,9 @@ def test_update_client_with_error(self): { "name": "Juan Sebastian Veron", "phone": "221555232", -<<<<<<< refactor/Cliente-cambiar-campo-address "city": "La Plata", "email": "brujita75@vetsoft.com", - } -======= - "address": "13 y 44", - "email": "brujita75@vetsoft.com", }, ->>>>>>> main ) client = Client.objects.get(pk=1) @@ -118,7 +79,7 @@ def test_update_client_with_email_null(self): #nuevo test verificando que no pue "phone": "221555232", "address": "13 y 44", "email": "brujita75@vetsoft.com", - } + }, ) client = Client.objects.get(pk=1) From 9169aace67760a0303123df7026d157460a8cbeb Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Wed, 5 Jun 2024 02:07:07 -0300 Subject: [PATCH 77/84] fix ruff --- app/models.py | 5 +++-- app/views.py | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/models.py b/app/models.py index 6b107366..8e0e9384 100644 --- a/app/models.py +++ b/app/models.py @@ -1,7 +1,8 @@ -from django.db import models from datetime import datetime -from django.db import IntegrityError + from django.core.exceptions import ValidationError +from django.db import IntegrityError, models + class CityEnum(models.TextChoices): LA_PLATA = 'La Plata', diff --git a/app/views.py b/app/views.py index 57b7fe2d..ea690171 100644 --- a/app/views.py +++ b/app/views.py @@ -1,5 +1,7 @@ -from django.shortcuts import render, redirect, reverse, get_object_or_404 -from .models import Client, CityEnum, Provider, Product, Pet, Medicine, Veterinary +from django.shortcuts import get_object_or_404, redirect, render, reverse + +from .models import CityEnum, Client, Medicine, Pet, Product, Provider, Veterinary + def home(request): """ From 1ae557932bd95e8ef6e05e8a410f1a2324e74232 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Wed, 5 Jun 2024 02:09:00 -0300 Subject: [PATCH 78/84] fix migracion --- app/migrations/0017_merge_20240605_0208.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 app/migrations/0017_merge_20240605_0208.py diff --git a/app/migrations/0017_merge_20240605_0208.py b/app/migrations/0017_merge_20240605_0208.py new file mode 100644 index 00000000..1b6b7294 --- /dev/null +++ b/app/migrations/0017_merge_20240605_0208.py @@ -0,0 +1,15 @@ +# Generated by Django 5.0.4 on 2024-06-05 05:08 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0002_alter_client_city'), + ('app', '0015_merge_20240603_1125'), + ('app', '0016_delete_veterinario'), + ] + + operations = [ + ] From 2eace85c2e0ed15db8b64cdd7622c16e4de02fe8 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Wed, 5 Jun 2024 02:19:00 -0300 Subject: [PATCH 79/84] fix migration --- app/migrations/0017_merge_20240605_0217.py | 14 +++++++++++ .../0018_remove_client_address_client_city.py | 23 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 app/migrations/0017_merge_20240605_0217.py create mode 100644 app/migrations/0018_remove_client_address_client_city.py diff --git a/app/migrations/0017_merge_20240605_0217.py b/app/migrations/0017_merge_20240605_0217.py new file mode 100644 index 00000000..f76899de --- /dev/null +++ b/app/migrations/0017_merge_20240605_0217.py @@ -0,0 +1,14 @@ +# Generated by Django 5.0.4 on 2024-06-05 05:17 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0015_merge_20240603_1125'), + ('app', '0016_delete_veterinario'), + ] + + operations = [ + ] diff --git a/app/migrations/0018_remove_client_address_client_city.py b/app/migrations/0018_remove_client_address_client_city.py new file mode 100644 index 00000000..495f6a49 --- /dev/null +++ b/app/migrations/0018_remove_client_address_client_city.py @@ -0,0 +1,23 @@ +# Generated by Django 5.0.4 on 2024-06-05 05:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0017_merge_20240605_0217'), + ] + + operations = [ + migrations.RemoveField( + model_name='client', + name='address', + ), + migrations.AddField( + model_name='client', + name='city', + field=models.CharField(choices=[('La Plata', 'La Plata'), ('Berisso', 'Berisso'), ('Ensenada', 'Ensenada')], default=1, max_length=35), + preserve_default=False, + ), + ] From 1e09241173a3b122e559f348ca0176db87b18fbf Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Wed, 5 Jun 2024 02:21:24 -0300 Subject: [PATCH 80/84] fix migration --- app/migrations/0017_merge_20240605_0208.py | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 app/migrations/0017_merge_20240605_0208.py diff --git a/app/migrations/0017_merge_20240605_0208.py b/app/migrations/0017_merge_20240605_0208.py deleted file mode 100644 index 1b6b7294..00000000 --- a/app/migrations/0017_merge_20240605_0208.py +++ /dev/null @@ -1,15 +0,0 @@ -# Generated by Django 5.0.4 on 2024-06-05 05:08 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('app', '0002_alter_client_city'), - ('app', '0015_merge_20240603_1125'), - ('app', '0016_delete_veterinario'), - ] - - operations = [ - ] From 16615006a78494dab190ef24ba984bc366b53e81 Mon Sep 17 00:00:00 2001 From: Manuel Morullo Date: Wed, 5 Jun 2024 02:29:28 -0300 Subject: [PATCH 81/84] fix test unitario --- app/tests_unit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/tests_unit.py b/app/tests_unit.py index fff7c7e6..9615ae18 100644 --- a/app/tests_unit.py +++ b/app/tests_unit.py @@ -79,7 +79,7 @@ def test_update_client_with_email_null(self): #nuevo test verificando que no pue { "name": "Juan Sebastian Veron", "phone": "221555232", - "address": "13 y 44", + "city": "La Plata", "email": "brujita75@vetsoft.com", }, ) From fd6c3dedfb7ad53b4dfdea35217df00ecdb6faa3 Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Wed, 5 Jun 2024 09:40:25 -0300 Subject: [PATCH 82/84] Arreglo documentacion del test de integracion. --- app/tests_integration.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/tests_integration.py b/app/tests_integration.py index 454bec43..e3543989 100644 --- a/app/tests_integration.py +++ b/app/tests_integration.py @@ -134,6 +134,9 @@ def test_edit_user_with_valid_data_test(self): self.assertEqual(editedClient.city, "Berisso") def test_edit_user_with_invalid_data_test_city(self): + """ + Se testea la función editar con datos de ciudad invalido. + """ client = Client.objects.create( name="Guido Carrillo", From aad21a977213623ec1399cf033f0a4195646007e Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Wed, 5 Jun 2024 09:40:55 -0300 Subject: [PATCH 83/84] =?UTF-8?q?Arreglo=20de=20documentaci=C3=B3n=20del?= =?UTF-8?q?=20test=20unitario.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/tests_unit.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/tests_unit.py b/app/tests_unit.py index 6e5acf8d..8de10055 100644 --- a/app/tests_unit.py +++ b/app/tests_unit.py @@ -27,6 +27,9 @@ def test_can_create_and_get_client(self): self.assertEqual(clients[0].email, "brujita75@vetsoft.com") def test_can_update_client(self): + """ + Se testea si se puede actualizar los datos del cliente. + """ Client.save_client( { From 60d489e650750b35bbabe7da3ef6e7337efa41b0 Mon Sep 17 00:00:00 2001 From: Juan Manuel Date: Wed, 5 Jun 2024 09:42:56 -0300 Subject: [PATCH 84/84] =?UTF-8?q?Agrego=20migraci=C3=B3n=20necesaria.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/migrations/0019_merge_20240605_0942.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 app/migrations/0019_merge_20240605_0942.py diff --git a/app/migrations/0019_merge_20240605_0942.py b/app/migrations/0019_merge_20240605_0942.py new file mode 100644 index 00000000..ae7f9605 --- /dev/null +++ b/app/migrations/0019_merge_20240605_0942.py @@ -0,0 +1,14 @@ +# Generated by Django 5.0.4 on 2024-06-05 12:42 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0017_merge_20240604_2359'), + ('app', '0018_remove_client_address_client_city'), + ] + + operations = [ + ]