Enzo Yair

Merge branch 'feature/cambios_fechas' into 'develop'

se eliminan campo fechas y es reemplazado por fecha relacion many to many

Feature:
-Se modifica serializers EventoSerializer
-Se modifica Form
Test resultado:
======================================================================================================== 3 passed in 2.33s ========================================================================================================


See merge request !5
@@ -13,10 +13,6 @@ class EventoForms(forms.ModelForm): @@ -13,10 +13,6 @@ class EventoForms(forms.ModelForm):
13 fields = ( 13 fields = (
14 'titulo', 14 'titulo',
15 'categoria', 15 'categoria',
16 - 'fecha_inicio',  
17 - 'hora_inicio',  
18 - 'fecha_final',  
19 - 'hora_fin',  
20 'fechas', 16 'fechas',
21 'descripcion', 17 'descripcion',
22 'direccion', 18 'direccion',
@@ -40,33 +36,3 @@ class EventoForms(forms.ModelForm): @@ -40,33 +36,3 @@ class EventoForms(forms.ModelForm):
40 _('La dirección no es un enlace válido de Google Maps.') 36 _('La dirección no es un enlace válido de Google Maps.')
41 ) 37 )
42 return direccion 38 return direccion
43 -  
44 - def clean_fecha_final(self):  
45 - fecha_inicio = self.cleaned_data.get('fecha_inicio')  
46 - fecha_final = self.cleaned_data.get('fecha_final')  
47 -  
48 - if fecha_inicio and fecha_final:  
49 - if fecha_final < fecha_inicio:  
50 - raise ValidationError(  
51 - _('La fecha final no puede ser anterior a la fecha de inicio.'  
52 - )  
53 - )  
54 -  
55 - return fecha_final  
56 -  
57 - def clean_hora_fin(self):  
58 - clean = super().clean()  
59 -  
60 - fecha_inicio = clean.get('fecha_inicio')  
61 - hora_inicio = clean.get('hora_inicio')  
62 - fecha_final = clean.get('fecha_final')  
63 - hora_fin = clean.get('hora_fin')  
64 -  
65 - if fecha_final == fecha_inicio:  
66 - if hora_fin <= hora_inicio:  
67 - raise ValidationError(  
68 - _('La hora de finalización debe ser posterior a la hora de inicio.'  
69 - )  
70 - )  
71 -  
72 - return hora_fin  
  1 +# Generated by Django 4.2.9 on 2024-10-02 11:46
  2 +
  3 +from django.db import migrations, models
  4 +
  5 +
  6 +class Migration(migrations.Migration):
  7 +
  8 + dependencies = [
  9 + ('evento', '0001_initial'),
  10 + ]
  11 +
  12 + operations = [
  13 + migrations.RemoveField(
  14 + model_name='evento',
  15 + name='fecha_final',
  16 + ),
  17 + migrations.RemoveField(
  18 + model_name='evento',
  19 + name='fecha_inicio',
  20 + ),
  21 + migrations.RemoveField(
  22 + model_name='evento',
  23 + name='hora_fin',
  24 + ),
  25 + migrations.RemoveField(
  26 + model_name='evento',
  27 + name='hora_inicio',
  28 + ),
  29 + migrations.AlterField(
  30 + model_name='evento',
  31 + name='fechas',
  32 + field=models.ManyToManyField(help_text='Por favor, indique los días disponibles para el evento', related_name='evento_fechas', to='evento.fechaevento', verbose_name='Días disponibles'),
  33 + ),
  34 + migrations.AlterField(
  35 + model_name='fechaevento',
  36 + name='dia_evento',
  37 + field=models.DateTimeField(verbose_name='Días del evento'),
  38 + ),
  39 + ]
@@ -23,14 +23,10 @@ class Evento(models.Model): @@ -23,14 +23,10 @@ class Evento(models.Model):
23 related_name='evento_dependencia', 23 related_name='evento_dependencia',
24 blank=True 24 blank=True
25 ) 25 )
26 - fecha_inicio = models.DateField(verbose_name='Fecha de inicio del evento')  
27 - hora_inicio = models.TimeField(blank=False, verbose_name='Hora de apertura')  
28 - fecha_final = models.DateField(verbose_name='Fecha de cierre del evento')  
29 - hora_fin = models.TimeField(blank=False, verbose_name='Hora de cierre')  
30 fechas = models.ManyToManyField( 26 fechas = models.ManyToManyField(
31 'FechaEvento', 27 'FechaEvento',
32 related_name='evento_fechas', 28 related_name='evento_fechas',
33 - blank=True, 29 + blank=False,
34 verbose_name='Días disponibles', 30 verbose_name='Días disponibles',
35 help_text='Por favor, indique los días disponibles para el evento' 31 help_text='Por favor, indique los días disponibles para el evento'
36 ) 32 )
@@ -63,7 +59,7 @@ class FechaEvento(models.Model): @@ -63,7 +59,7 @@ class FechaEvento(models.Model):
63 verbose_name = 'Fecha del Eventos' 59 verbose_name = 'Fecha del Eventos'
64 verbose_name_plural = 'Fechas del Eventos' 60 verbose_name_plural = 'Fechas del Eventos'
65 61
66 - dia_evento = models.DateField(verbose_name='Días del evento') 62 + dia_evento = models.DateTimeField(verbose_name='Días del evento')
67 63
68 def __str__(self): 64 def __str__(self):
69 return f'{self.dia_evento}' 65 return f'{self.dia_evento}'
@@ -20,15 +20,11 @@ class EventoSerializer(serializers.ModelSerializer): @@ -20,15 +20,11 @@ class EventoSerializer(serializers.ModelSerializer):
20 fields = ( 20 fields = (
21 'titulo', 21 'titulo',
22 'categoria', 22 'categoria',
23 - 'fecha_inicio',  
24 - 'hora_inicio',  
25 - 'fecha_final',  
26 - 'hora_fin',  
27 - 'fechas',  
28 'descripcion', 23 'descripcion',
29 'direccion', 24 'direccion',
30 'url', 25 'url',
  26 + 'imagen',
  27 + 'fechas',
31 'organismo', 28 'organismo',
32 'dependencia', 29 'dependencia',
33 - 'imagen',  
34 ) 30 )
1 -from factory import faker, django  
2 -from datetime import date  
3 -from evento.models import Evento 1 +from factory import faker, django, Faker, post_generation
  2 +from django.utils import timezone
  3 +
  4 +from evento.models import Evento, FechaEvento
  5 +
  6 +
  7 +class FechaEventoFactory(django.DjangoModelFactory):
  8 + class Meta:
  9 + model = FechaEvento
  10 +
  11 + dia_evento = Faker('date_time_this_year', tzinfo=timezone.get_current_timezone())
4 12
5 13
6 class EventoFactory(django.DjangoModelFactory): 14 class EventoFactory(django.DjangoModelFactory):
7 class Meta: 15 class Meta:
8 model = Evento 16 model = Evento
  17 + skip_postgeneration_save = True
9 18
10 titulo = faker.Faker(provider='sentence', nb_words=50) 19 titulo = faker.Faker(provider='sentence', nb_words=50)
11 categoria = faker.Faker(provider='sentence', nb_words=30) 20 categoria = faker.Faker(provider='sentence', nb_words=30)
12 direccion = 'https://maps.app.goo.gl/CNwbHBx5zq1VDje57' 21 direccion = 'https://maps.app.goo.gl/CNwbHBx5zq1VDje57'
13 descripcion = faker.Faker(provider='sentence', nb_words=30) 22 descripcion = faker.Faker(provider='sentence', nb_words=30)
14 - fecha_inicio = date(2024, 1, 1)  
15 - hora_inicio = '10:00:00'  
16 - fecha_final = date(2024, 1, 2)  
17 - hora_fin = '11:20:47'  
  23 +
  24 + @post_generation
  25 + def add_fechas(self, create, extracted, **kwargs):
  26 + if not create:
  27 + return
  28 +
  29 + if extracted:
  30 + for fecha in extracted:
  31 + self.fechas.add(fecha)
@@ -4,7 +4,8 @@ from django.contrib.auth.models import User @@ -4,7 +4,8 @@ from django.contrib.auth.models import User
4 from django.urls import reverse 4 from django.urls import reverse
5 from rest_framework.test import APIClient 5 from rest_framework.test import APIClient
6 6
7 -from evento.tests.factories import EventoFactory 7 +from evento.tests.factories import EventoFactory, FechaEventoFactory
  8 +from evento.models import Evento
8 9
9 10
10 @pytest.mark.django_db 11 @pytest.mark.django_db
@@ -13,9 +14,13 @@ def test_evento_list(): @@ -13,9 +14,13 @@ def test_evento_list():
13 user = User.objects.create_user(username='admin', email='admin@example.com', password='password123') 14 user = User.objects.create_user(username='admin', email='admin@example.com', password='password123')
14 cliente.force_authenticate(user=user) 15 cliente.force_authenticate(user=user)
15 16
16 - EventoFactory.create_batch(size=4) 17 + for _ in range(4):
  18 + evento = EventoFactory.create()
  19 + fechas = FechaEventoFactory.create_batch(size=2)
  20 + evento.fechas.set(fechas)
17 21
18 endpoint = reverse('evento-list') 22 endpoint = reverse('evento-list')
19 response = cliente.get(path=endpoint) 23 response = cliente.get(path=endpoint)
20 24
21 assert response.status_code == status.HTTP_200_OK 25 assert response.status_code == status.HTTP_200_OK
  26 + assert len(response.data['results']) == 4
@@ -86,7 +86,7 @@ ROOT_URLCONF = 'project.urls' @@ -86,7 +86,7 @@ ROOT_URLCONF = 'project.urls'
86 WSGI_APPLICATION = 'project.wsgi.application' 86 WSGI_APPLICATION = 'project.wsgi.application'
87 87
88 LANGUAGE_CODE = 'es-AR' 88 LANGUAGE_CODE = 'es-AR'
89 -TIME_ZONE = 'America/Argentina/Catamarca' 89 +TIME_ZONE = 'America/Argentina/Buenos_Aires'
90 USE_I18N = True 90 USE_I18N = True
91 USE_TZ = True 91 USE_TZ = True
92 92