Greetings to all.
I am creating a project to schedule rooms and elements, which can only be available at a specific time.
Models.py
class Agenda(MarcadorTiempo):
usuario = models.ForeignKey(User, null=True, blank=True, verbose_name='User', on_delete=models.PROTECT)
recurso_fisico = models.ForeignKey(RecursoFisico, null=False, blank=False, verbose_name='recurso físico',
on_delete=models.PROTECT)
recurso_tecnologico = models.ManyToManyField(RecursoTecnologico, blank=True,
verbose_name='recurso tecnólogico', related_name='agenda_recurso',
help_text='Mantenga presionado "Control" o "Command" en un Mac, para '
'seleccionar más de una opción.')
fecha_separacion = models.DateField(null=False, blank=False, verbose_name='Fecha de Separación', default=today())
hora_separacion = models.TimeField(null=False, blank=False, verbose_name='Hora de Separación')
hora_devolucion = models.TimeField(null=False, blank=False, verbose_name='Hora de Devolución')
To comply with this I have created the following validation in the form.
forms.py
class AgendaForm(forms.ModelForm):
class Meta:
model = Agenda
exclude = ['usuario']
fields = ['fecha_separacion', 'hora_separacion', 'hora_devolucion', 'recurso_fisico', 'recurso_tecnologico']
def clean_recurso_fisico(self):
recurso_fisico = self.cleaned_data['recurso_fisico']
fecha_separacion = self.cleaned_data['fecha_separacion']
hora_separacion = self.cleaned_data['hora_separacion']
hora_devolucion = self.cleaned_data['hora_devolucion']
# Consulta de los elementos existentes en el mismo horario
agenda_dia = Agenda.objects.filter(fecha_separacion=fecha_separacion)
agenda_dia = agenda_dia.filter(Q(hora_separacion__range=(hora_separacion, hora_devolucion))
| Q(hora_devolucion__range=(hora_separacion, hora_devolucion)))
# Validación de disponibilidad
for agenda in agenda_dia:
if recurso_fisico == agenda.recurso_fisico:
raise ValidationError('El {} ya fue agendado desde las {} hasta las {} por {}'.format(
recurso_fisico,
agenda.hora_separacion.strftime('%I:%M %p'),
agenda.hora_devolucion.strftime('%I:%M %p'),
agenda.usuario))
return recurso_fisico
def clean_recurso_tecnologico(self):
recurso_tecnologico = self.cleaned_data['recurso_tecnologico']
fecha_separacion = self.cleaned_data['fecha_separacion']
hora_separacion = self.cleaned_data['hora_separacion']
hora_devolucion = self.cleaned_data['hora_devolucion']
# Consulta de los elementos existentes en el mismo horario
agenda_dia = Agenda.objects.filter(fecha_separacion=fecha_separacion)
agenda_dia = agenda_dia.filter(Q(hora_separacion__range=(hora_separacion, hora_devolucion))
| Q(hora_devolucion__range=(hora_separacion, hora_devolucion)))
# Validación de disponibilidad
for agenda in agenda_dia:
for recurso in recurso_tecnologico:
if recurso in agenda.recurso_tecnologico.all():
raise ValidationError('El {} ya fue agendado desde las {} hasta las {} por {}'.format(
recurso,
agenda.hora_separacion.strftime('%I:%M %p'),
agenda.hora_devolucion.strftime('%I:%M %p'),
agenda.usuario))
return recurso_tecnologico
This way I have managed to satisfy the requirement, however when I make the edition it executes the validation and tells me that the elements already exist, for which it does not allow me to save the modifications.
I appreciate any suggestion you can give me.
I managed to solve it with the help of a friend, I am as follows.
We add a condition before the traversal
for
to exclude the instance itself from thequeryset