from django.db import models #encoding:utf-8 from django.contrib.auth.models import User # Create your models here. from django.core.exceptions import ValidationError from datetime import * from django.core.validators import * tipoSexo = ( ('M', 'MASCULINO'), ('F', 'FEMENINO'), ) class dependencia ( models.Model ): clave = models.CharField('clave', max_length=3, help_text = 'Escriba la clave de la dependencia', blank = True, ) nombre = models.CharField('nombre', max_length=150, help_text = 'Escriba el nombre de la dependencia', ) ejercicio = models.IntegerField(help_text = 'ejercicio fiscal al que pertenece', blank = False, null = False, default = date.today().year, validators=[ MaxValueValidator(2018), MinValueValidator(2012) ]) fecha_registro = models.DateTimeField(auto_now_add=True) fecha_ultimo_cambio = models.DateTimeField(null=True) usuarios = models.ManyToManyField( User, null=True, blank=True ) def __unicode__(self): return u'%s' % self.nombre class Meta: ordering = ['nombre'] verbose_name = 'dependencia' verbose_name_plural = 'dependencias' unique_together = ['nombre'] def save(self, force_insert = False, force_update = False): self.clave = self.clave.upper() self.nombre = self.nombre.upper() super(dependencia, self).save(force_insert, force_update) class estatus ( models.Model ): clave = models.CharField('clave', max_length=3, help_text = 'Escriba la clave del estatus', blank = True, ) nombre = models.CharField('nombre', max_length=50, help_text = 'Escriba el nombre del estatus', ) fecha_registro = models.DateTimeField(auto_now_add=True) fecha_ultimo_cambio = models.DateTimeField(null=True) def __unicode__(self): return u'%s' % self.nombre class Meta: ordering = ['nombre'] verbose_name = 'estatus' verbose_name_plural = 'estatus' unique_together = ['nombre'] class lugar (models.Model): padre = models.ForeignKey('self', null = True, blank = True, verbose_name = 'pertenece a', help_text = 'Lugar al que pertenece') nombre = models.CharField('nombre', max_length=50, help_text = 'Escriba el nombre de la localidad', # validators=[ RegexValidator( # r'^[a-zA-Z ]+$', # 'Solo se permiten letras y espacios', # 'Nombre no valido' # ) # ], ) fecha_registro = models.DateTimeField(auto_now_add=True) fecha_ultimo_cambio = models.DateTimeField(null=True) ip = models.IPAddressField() def __unicode__(self): if self.padre == None: r = self.nombre else: r = u'%s - %s' % (self.padre, self.nombre) return u'%s' % r class Meta: ordering = ['-fecha_registro', 'nombre'] verbose_name = 'lugar' verbose_name_plural = 'lugares' unique_together = ['padre', 'nombre'] def save(self, force_insert=False, force_update=False): self.nombre = u'%s' % (self.nombre[0:1].upper() + self.nombre[1:].lower()) super(lugar, self).save(force_insert, force_update) class persona ( models.Model ): nombre = models.CharField('nombre', max_length=50) apellido_paterno = models.CharField('apellido paterno', max_length=50, ) apellido_materno = models.CharField('apellido materno', max_length=50, ) sexo = models.CharField( choices=tipoSexo, max_length=1, help_text= 'Seleccione el género al que pertenece') fecha_nacimiento = models.DateField('fecha de nacimiento', blank = True, null = True, ) curp = models.CharField('CURP', max_length=18, blank = False, null = False, validators=[ # RegexValidator( # r'(^\d{13}$)|(^\w{9}$)', #cadena de 13 digitos para IFE y de 9 digitos para licencia # 'la CURP consta de 18 dígitos', # 'CURP no valida' # ), MinLengthValidator(18), MaxLengthValidator(18), ], ) localidad = models.ForeignKey( lugar, help_text = 'Seleccione la localidad a la que pertenece' ) direccion = models.TextField('dirección', max_length=400, null = True, blank=True , help_text='calle, número, colonia o fraccionamiento') codigo_postal = models.IntegerField( 'Código postal', max_length=5, blank = True, null = True, validators=[ MaxValueValidator(99999), MinValueValidator(1), RegexValidator( r'^([0-9]{5})+$', 'Solo se permiten 5 digitos', 'Código Postal no valido' ) ] ) identificacion = models.CharField('IFE / Licencia', max_length=13, validators=[ RegexValidator( r'(^\d{13}$)|(^\w{9}$)', #cadena de 13 digitos para IFE y de 9 digitos para licencia 'IFE: 13 dígitos o Licencia: 9 dígitos', 'Identificacion no valida' ), MinLengthValidator(9), MaxLengthValidator(13), ], ) correo_electronico = models.EmailField('correo electrónico', max_length=100, blank = True, null = True, ) telefono = models.CharField('teléfono', max_length=40, blank = True, null = True ) celular = models.CharField('teléfono celular', max_length=10, blank = True, null = True ) mostrar = models.BooleanField( default = False ) def __unicode__(self): return u'%s %s %s' % (self.nombre, self.apellido_paterno, self.apellido_materno) def nombre_x_apellidos(self): return u'%s %s, %s' % (self.apellido_paterno, self.apellido_materno, self.nombre ) nombre_x_apellidos.short_description = 'nombre' def nombre_completo(self): return u'%s %s %s' % (self.nombre, self.apellido_paterno, self.apellido_materno ) nombre_completo.short_description = 'nombre_completo' class Meta: ordering = ['apellido_paterno', 'apellido_materno', 'nombre'] verbose_name = 'Persona' verbose_name_plural = 'Personas' unique_together = ['curp', 'nombre', 'apellido_paterno', 'apellido_materno'] class solicitud ( models.Model ): solicitante = models.ForeignKey(persona, null = True, blank = True ) nombre = models.CharField('nombre', max_length=50) apellido_paterno = models.CharField('apellido paterno', max_length=50, ) apellido_materno = models.CharField('apellido materno', max_length=50, ) sexo = models.CharField( choices=tipoSexo, max_length=1, help_text= 'Seleccione el género al que pertenece') fecha_nacimiento = models.DateField('fecha de nacimiento', blank = True, null = True, ) curp = models.CharField('CURP', max_length=18, blank = False, null = False, validators=[ # RegexValidator( # r'(^\d{13}$)|(^\w{9}$)', #cadena de 13 digitos para IFE y de 9 digitos para licencia # 'la CURP consta de 18 dígitos', # 'CURP no valida' # ), MinLengthValidator(18), MaxLengthValidator(18), ], ) localidad = models.ForeignKey( lugar, help_text = 'Seleccione la localidad a la que pertenece' ) direccion = models.TextField('dirección', max_length=400, null = True, blank=True , help_text='calle, número, colonia o fraccionamiento') codigo_postal = models.IntegerField( 'Código postal', max_length=5, blank = True, null = True, validators=[ MaxValueValidator(99999), MinValueValidator(1), RegexValidator( r'^([0-9]{5})+$', 'Solo se permiten 5 digitos', 'Código Postal no valido' ) ] ) identificacion = models.CharField('IFE / Licencia', max_length=13, validators=[ RegexValidator( r'(^\d{13}$)|(^\w{9}$)', #cadena de 13 digitos para IFE y de 9 digitos para licencia 'IFE: 13 dígitos o Licencia: 9 dígitos', 'Identificacion no valida' ), MinLengthValidator(9), MaxLengthValidator(13), ], ) correo_electronico = models.EmailField('correo electrónico', max_length=100, blank = True, null = True, ) telefono = models.CharField('teléfono', max_length=40, blank = True, null = True ) celular = models.CharField('teléfono celular', max_length=10, blank = True, null = True ) solicitud = models.TextField('solicitud', max_length=400, help_text = 'Escriba la descripción de lo que solicita', ) dependencia = models.ForeignKey(dependencia, help_text='Seleccione la dependencia a la que va dirigida la solicitud', ) foto = models.ImageField('foto', upload_to='imagenes' , blank = True, null = True, help_text = 'Agregue una imagen significativa que se relacione con su solicitud') estatus = models.ForeignKey(estatus, default = 1, help_text = 'Seleccione el estatus de la solicitud') # leido = models.BooleanField( default=False , help_text = 'Marque si la solicitud ha sido leida' ) asigna = models.ForeignKey(User, null=True, blank=True, help_text = 'Seleccione el usuario que asigna la solicitud') fecha_registro = models.DateTimeField(auto_now_add=True) fecha_ultimo_cambio = models.DateTimeField(null=True) # resuelto = models.BooleanField( default=False , help_text = 'Marque si la solicitud ha sido resuelta' ) nota = models.TextField('Observaciones', max_length=4000, help_text = 'Escriba las observaciones') bandera = models.BooleanField('Urgente', default=False , help_text = 'Marque si la solicitud es urgente', ) def __unicode__(self): solicitud_corta = str(self.id) + ': ' + self.solicitud[:30] if len(self.solicitud) > 30: solicitud_corta += '...' return '%s' % solicitud_corta def solicitud_corta(self): solicitud_corta = self.solicitud[:20] if len(self.solicitud) > 20: solicitud_corta += '...' return u'%s' % solicitud_corta solicitud_corta.short_description = 'solicitud' def nombre_completo(self): return u'%s %s %s' % (self.nombre, self.apellido_paterno, self.apellido_materno) class Meta: ordering = ['nombre'] verbose_name = 'solicitud' verbose_name_plural = 'solicitudes' def save(self, force_insert=False, force_update=False): """ incluir si esta Asignada y se modifica dependencia cambiar estatus a Devuelto """ # if self.estatus.nombre == 'Asignado - Leido' and self.leido: # if solicitud.objects.get(pk = self.id).dependencia != self.dependencia: # self.estatus = estatus.objects.get(nombre = 'Devuelto') # self.leido = not self.leido # elif self.estatus.nombre == 'Asignado': # if self.leido: # self.estatus = estatus.objects.get(nombre = 'Asignado - Leido') # elif (self.estatus.nombre == 'Capturado' or self.estatus.nombre == 'Devuelto') and self.leido: # self.estatus = estatus.objects.get(nombre='Leido') # self.leido = not self.leido # elif (self.estatus.nombre == 'Leido' and self.leido): # self.estatus = estatus.objects.get(nombre='Asignado') # elif self.estatus.nombre == 'Resuelto - Satisfactoriamente' or self.estatus.nombre == 'Resuelto - Insatisfactoriamente': # self.resuelto = True # else: # self.resuelto = False self.nombre = self.nombre.upper() self.apellido_paterno = self.apellido_paterno.upper() self.apellido_materno = self.apellido_materno.upper() self.curp = self.curp.upper() self.direccion = self.direccion.upper() self.identificacion = self.identificacion.upper() self.correo_electronico = self.correo_electronico.lower() self.solicitud = self.solicitud.lower() self.fecha_ultimo_cambio = datetime.now() super(solicitud, self).save(force_insert, force_update) existe = bitacora.objects.filter(solicitud = self, estatus = self.estatus, recibio = self.asigna, dependencia = self.dependencia, nota = self.nota) if existe.count() == 0: bitacora(solicitud=self, estatus = self.estatus , recibio = self.asigna, dependencia = self.dependencia, nota = self.nota).save() class asignaciones ( models.Model ): solicitud = models.ForeignKey( solicitud, verbose_name = 'Folio', help_text = 'Seleccione la solicitud por asignar') dependencia = models.ForeignKey( dependencia, help_text = 'Seleccione la dependencia a la que va dirigida la solicitud') nota = models.TextField('Observaciones', max_length=4000, help_text = 'Escriba las observaciones de la asignación', ) asigna = models.ForeignKey(User, help_text = 'Seleccione el usuario que asigna la solicitud') fecha_registro = models.DateTimeField(auto_now_add=True) fecha_ultimo_cambio = models.DateTimeField(null=True) def __unicode__(self): return u'%s' % self.id class Meta: verbose_name = 'asignacion' verbose_name_plural = 'asignaciones' def save(self, force_insert = False, force_update = False): s = solicitud.objects.get(pk = self.solicitud.id) if s.estatus.nombre == 'Leido': e = estatus.objects.get(nombre='Asignado') s.estatus = e s.leido = False s.nota = self.nota s.save() # else: # raise ValidationError('La solicitud no ha sido leida, por lo que no es posible asignarla') super(asignaciones, self).save(force_insert, force_update) class bitacora ( models.Model ): fecha = models.DateTimeField('fecha de registro', help_text = 'Escriba la fecha de registro', auto_now_add = True, ) solicitud = models.ForeignKey(solicitud, help_text = 'Seleccione la solicitud' ) estatus = models.ForeignKey(estatus, help_text = 'Seleccione el estatus de la solicitud') recibio = models.ForeignKey(User, help_text = 'Seleccione el usuario que recibe la solicitud', null = True, blank = True) fecha_registro = models.DateTimeField(auto_now_add=True) fecha_ultimo_cambio = models.DateTimeField(null=True) dependencia = models.ForeignKey( dependencia, help_text = 'Seleccione la dependencia a la que va dirigida la solicitud', null=True, blank = True) nota = models.TextField('Observaciones', max_length=4000, help_text = 'Escriba las observaciones', null = True) def __unicode__(self): return u'%s' % self.id class Meta: ordering = ['fecha'] verbose_name = 'bitacora' verbose_name_plural = 'bitacoras' unique_together = ['solicitud', 'estatus', 'recibio', 'dependencia', 'nota'] def save(self, force_insert = False, force_update = False): self.fecha_ultimo_cambio = datetime.now() super(bitacora, self).save(force_insert, force_update)