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):
fields = (
'titulo',
'categoria',
'fecha_inicio',
'hora_inicio',
'fecha_final',
'hora_fin',
'fechas',
'descripcion',
'direccion',
... ... @@ -40,33 +36,3 @@ class EventoForms(forms.ModelForm):
_('La dirección no es un enlace válido de Google Maps.')
)
return direccion
def clean_fecha_final(self):
fecha_inicio = self.cleaned_data.get('fecha_inicio')
fecha_final = self.cleaned_data.get('fecha_final')
if fecha_inicio and fecha_final:
if fecha_final < fecha_inicio:
raise ValidationError(
_('La fecha final no puede ser anterior a la fecha de inicio.'
)
)
return fecha_final
def clean_hora_fin(self):
clean = super().clean()
fecha_inicio = clean.get('fecha_inicio')
hora_inicio = clean.get('hora_inicio')
fecha_final = clean.get('fecha_final')
hora_fin = clean.get('hora_fin')
if fecha_final == fecha_inicio:
if hora_fin <= hora_inicio:
raise ValidationError(
_('La hora de finalización debe ser posterior a la hora de inicio.'
)
)
return hora_fin
... ...
# Generated by Django 4.2.9 on 2024-10-02 11:46
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('evento', '0001_initial'),
]
operations = [
migrations.RemoveField(
model_name='evento',
name='fecha_final',
),
migrations.RemoveField(
model_name='evento',
name='fecha_inicio',
),
migrations.RemoveField(
model_name='evento',
name='hora_fin',
),
migrations.RemoveField(
model_name='evento',
name='hora_inicio',
),
migrations.AlterField(
model_name='evento',
name='fechas',
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'),
),
migrations.AlterField(
model_name='fechaevento',
name='dia_evento',
field=models.DateTimeField(verbose_name='Días del evento'),
),
]
... ...
... ... @@ -23,14 +23,10 @@ class Evento(models.Model):
related_name='evento_dependencia',
blank=True
)
fecha_inicio = models.DateField(verbose_name='Fecha de inicio del evento')
hora_inicio = models.TimeField(blank=False, verbose_name='Hora de apertura')
fecha_final = models.DateField(verbose_name='Fecha de cierre del evento')
hora_fin = models.TimeField(blank=False, verbose_name='Hora de cierre')
fechas = models.ManyToManyField(
'FechaEvento',
related_name='evento_fechas',
blank=True,
blank=False,
verbose_name='Días disponibles',
help_text='Por favor, indique los días disponibles para el evento'
)
... ... @@ -63,7 +59,7 @@ class FechaEvento(models.Model):
verbose_name = 'Fecha del Eventos'
verbose_name_plural = 'Fechas del Eventos'
dia_evento = models.DateField(verbose_name='Días del evento')
dia_evento = models.DateTimeField(verbose_name='Días del evento')
def __str__(self):
return f'{self.dia_evento}'
\ No newline at end of file
... ...
... ... @@ -20,15 +20,11 @@ class EventoSerializer(serializers.ModelSerializer):
fields = (
'titulo',
'categoria',
'fecha_inicio',
'hora_inicio',
'fecha_final',
'hora_fin',
'fechas',
'descripcion',
'direccion',
'url',
'imagen',
'fechas',
'organismo',
'dependencia',
'imagen',
)
... ...
from factory import faker, django
from datetime import date
from evento.models import Evento
from factory import faker, django, Faker, post_generation
from django.utils import timezone
from evento.models import Evento, FechaEvento
class FechaEventoFactory(django.DjangoModelFactory):
class Meta:
model = FechaEvento
dia_evento = Faker('date_time_this_year', tzinfo=timezone.get_current_timezone())
class EventoFactory(django.DjangoModelFactory):
class Meta:
model = Evento
skip_postgeneration_save = True
titulo = faker.Faker(provider='sentence', nb_words=50)
categoria = faker.Faker(provider='sentence', nb_words=30)
direccion = 'https://maps.app.goo.gl/CNwbHBx5zq1VDje57'
descripcion = faker.Faker(provider='sentence', nb_words=30)
fecha_inicio = date(2024, 1, 1)
hora_inicio = '10:00:00'
fecha_final = date(2024, 1, 2)
hora_fin = '11:20:47'
\ No newline at end of file
@post_generation
def add_fechas(self, create, extracted, **kwargs):
if not create:
return
if extracted:
for fecha in extracted:
self.fechas.add(fecha)
\ No newline at end of file
... ...
... ... @@ -4,7 +4,8 @@ from django.contrib.auth.models import User
from django.urls import reverse
from rest_framework.test import APIClient
from evento.tests.factories import EventoFactory
from evento.tests.factories import EventoFactory, FechaEventoFactory
from evento.models import Evento
@pytest.mark.django_db
... ... @@ -13,9 +14,13 @@ def test_evento_list():
user = User.objects.create_user(username='admin', email='admin@example.com', password='password123')
cliente.force_authenticate(user=user)
EventoFactory.create_batch(size=4)
for _ in range(4):
evento = EventoFactory.create()
fechas = FechaEventoFactory.create_batch(size=2)
evento.fechas.set(fechas)
endpoint = reverse('evento-list')
response = cliente.get(path=endpoint)
assert response.status_code == status.HTTP_200_OK
assert len(response.data['results']) == 4
... ...
... ... @@ -86,7 +86,7 @@ ROOT_URLCONF = 'project.urls'
WSGI_APPLICATION = 'project.wsgi.application'
LANGUAGE_CODE = 'es-AR'
TIME_ZONE = 'America/Argentina/Catamarca'
TIME_ZONE = 'America/Argentina/Buenos_Aires'
USE_I18N = True
USE_TZ = True
... ...