forms.py 2 KB
import re

from django import forms
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _

from .models import Evento


class EventoForms(forms.ModelForm):
    class Meta:
        model = Evento
        fields = (
            'titulo',
            'categoria',
            'fecha_inicio',
            'hora_inicio',
            'fecha_final',
            'hora_fin',
            'fechas',
            'descripcion',
            'direccion',
            'url',
            'organismo',
            'dependencia',
            'imagen',
        )

    def clean_direccion(self):
        clean = super().clean()
        direccion = clean.get('direccion')

        maps_regex = re.compile(
            r'^(https?://)?(www\.)?(google\.com/maps|goo\.gl|maps\.app\.goo\.gl)/\S+$',
            re.IGNORECASE
        )
        if direccion:
            if not maps_regex.match(direccion):
                raise ValidationError(
                    _('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