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
Showing
7 changed files
with
72 additions
and
56 deletions
@@ -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 |
project/apps/evento/migrations/0002_remove_evento_fecha_final_remove_evento_fecha_inicio_and_more.py
0 → 100644
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 |
-
Please register or login to post a comment