# -*-encoding:utf-8-*- from django.db import models from django.core.urlresolvers import reverse from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ValidationError from datetime import date, datetime # Create your models here. class Evento(models.Model): """ Evento Al marcar el campo booleano "publico", el evento será visible al público en general. Al marcar el campo booleano "publicado" el evento se volverá "oficial", mientras tanto, se considera que el evento solo está "apartado". """ nombre = models.CharField(max_length=255) descripcion = models.TextField('descripción', null=True, blank=True) observaciones = models.TextField(null=True, blank=True) all_day = models.BooleanField('todo el día', default=True) inicio = models.DateTimeField('fecha de inicio', default=datetime.now()) fin = models.DateTimeField('fecha de término', blank=True, null=True) sede = models.ForeignKey('sedes.Sede') publico = models.BooleanField(default=False, help_text='Marque si el evento será visible para el público en general.') publicado = models.BooleanField(default=True, help_text='Desmarque para "apartar" la fecha en la sede.') solicitante = models.ForeignKey('Solicitante', blank=True, null=True) importe = models.FloatField(blank=True, null=True) cancelado = models.BooleanField(editable=False, blank=True, default=False) fecha_cancelado = models.DateTimeField(editable=False, blank=True, null=True) def cancelar(self): if self.cancelado == True: return False self.cancelado = True self.fecha_cancelado = datetime.now() self.save() return True def __unicode__(self): return u'%s @ %s' % (self.nombre, self.sede) def get_absolute_url(self): return reverse('evento-detail', kwargs = {'pk' : self.pk}) def clean(self): ERROR_TRASLAPE = 'El evento se traslapa con uno existente. Favor de cambiar de fecha o de sede.' # Si el evento es para todo el dia, no se requiere hora de inicio ni fecha ni hora de término. if self.all_day: self.fin = None self.inicio = self.inicio.date() ## Verificar si no hay un evento en ese dia, en esa sede try: e = Evento.objects.get(cancelado=False, sede=self.sede, inicio__startswith=self.inicio) if not e == self: raise ValidationError(ERROR_TRASLAPE) except ObjectDoesNotExist, e: pass else: if self.inicio > self.fin: raise ValidationError('La fecha de término debe ser mayor a la fecha de inicio.') e = Evento.objects.filter(cancelado=False, sede=self.sede, inicio__gte=self.inicio, fin__lte=self.inicio).exclude(pk=self.id) if e.exists(): raise ValidationError(ERROR_TRASLAPE) if not self.fin: raise ValidationError('Si el evento no durará todo el día, debe especificar la fecha de término del mismo.') class Meta: ordering = ['nombre'] permissions = ( ('cancelar_evento', 'Puede cancelar evento'), ) class Solicitante(models.Model): """docstring for Solicitante""" nombre = models.CharField(max_length=255, unique=True) def __unicode__(self): return u'%s' % self.nombre def get_absolute_url(self): return reverse('solicitante-detail', kwargs = {'pk' : self.pk}) class Telefono(models.Model): """docstring for Telefono""" numero = models.CharField(max_length=13) propietario = models.ForeignKey('Solicitante') def __unicode__(self): return '%s' % self.numero