#encoding:utf-8 #test from datetime import datetime from django.core.exceptions import ValidationError from django.core.urlresolvers import reverse from django.db import models # Create your models here. PRIORIDAD = ( (0, 'Normal'), (1, 'Media'), (2, 'Alta'), ) ESTATUS = ( (0, 'Recibido'), (1, 'Asignado'), (2, 'Reasignado'), (3, 'Atendido'), (4, 'Copia'), (5, 'Atendido Fuera de Tiempo') ) def asigna_icono(extension): r = None if extension != '': r = extension if r == 'BMP' or r == 'GIF': r = '%s icol-image-1' % (extension) elif r == 'JPG' or r == 'JPEG': r = '%s icol-images' % (extension) elif r == 'PDF': r = '%s icol-doc-pdf' % (extension) elif r == 'XLS' or r == 'DOC' or r == 'XLSX' or r == 'DOCX': r = '%s icol-doc-offlice' % (extension) elif r == 'ZIP' or r == 'RAR': r = '%s icol-compress' % (extension) elif r == 'TXT': r = '%s icol-doc-text-image' % (extension) else: r = '%s icol-stop' % (extension) return r class Etiqueta(models.Model): """docstring for Etiqueta""" nombre = models.CharField(max_length=100, unique=True) def __unicode__(self): return '%s' % self.nombre class Meta: ordering = ['nombre', ] class Oficio(models.Model): dedicado = models.CharField('Dedicado a',max_length=255, null=True, blank=True) folio = models.IntegerField('Folio del Oficio') no_oficio = models.CharField('No. de Oficio', max_length=100, unique=True) asunto = models.CharField(max_length=255) descripcion = models.TextField('Observación',null=True, blank=True) archivo = models.FileField('Oficio Escaneado', upload_to='oficios') #remitente = models.CharField(max_length=255) #destinatario = models.CharField(max_length=255) fecha_oficio = models.DateField('fecha de oficio', default=datetime.now()) propietario = models.ForeignKey('auth.User') fecha_registro = models.DateTimeField(auto_now_add=True) ultima_modificacion = models.DateTimeField(auto_now=True) prioridad = models.PositiveSmallIntegerField(choices=PRIORIDAD, default=0) requiere_atencion = models.BooleanField(default=False) deadline = models.DateField('Fecha límite de resolución', null=True, blank=True) anexo = models.FileField(upload_to='anexos', null=True, blank=True, help_text='Documento Anexo al oficio.') es_respuesta = models.BooleanField(help_text='Marque si el oficio es respuesta de otro y acontinuación escoja el oficio que se responde.', default=False) oficio_responde = models.ForeignKey('self', null=True, blank=True, verbose_name='oficio al que responde') observaciones = models.TextField(null=True, blank=True) etiquetas = models.ManyToManyField(Etiqueta, null=True, blank=True, editable=False) cancelado = models.BooleanField(default=False, editable=False) fecha_cancelado = models.DateTimeField(null=True, blank=True, editable=False) persona_registro = models.IntegerField(null=True,blank=True) def get_absolute_url(self): return reverse('oficios:oficio-detail', kwargs={'pk': self.pk}) class Meta: ordering = ['-folio', ] # unique_together = ('folio', 'propietario') def clean(self): if self.es_respuesta: if not self.oficio_responde: raise ValidationError('Debe especificar el oficio al que se responde') if self.requiere_atencion: if not self.deadline: raise ValidationError(u'Debe especificar la fecha limite de resolucion') def __unicode__(self): return self.no_oficio def archivo_tipo(self): r = None if self.archivo != '': r = u'%s' % (self.archivo) r = r.split('.')[1].upper() r = asigna_icono(r) return u'%s' % (r) def anexo_tipo(self): r = "" if self.anexo: r = u'%s' % (self.anexo) r = r.split('.')[1].upper() r = asigna_icono(r) return u'%s' % (r) def get_prioridad_color(self): if self.prioridad == 0: return u'#779625' elif self.prioridad == 1: return u'#FFF200' elif self.prioridad == 2: return u'#DF0101' else: return u'white' class Envio(models.Model): usuario_envia = models.ForeignKey('auth.User', related_name="id_usuario_envia", verbose_name='de') usuarios_reciben = models.ManyToManyField('auth.User', related_name="id_usuarios_reciben", verbose_name='para', through='Recepcion') oficio = models.ForeignKey(Oficio, verbose_name="Oficio") fecha_envio = models.DateTimeField(auto_now_add=True) usuarios_copia = models.ManyToManyField('auth.User', related_name="id_usuarios_copia", verbose_name='CCP', through='RecepcionCopia') # asunto = models.CharField(max_length=255, null=True, blank=True) # cuerpo = models.TextField('mensaje', null=True, blank=True) def get_absolute_url(self): return reverse('oficios:oficios-recibidos') def __unicode__(self): return u'%s' % self.oficio class Meta: ordering = ['-fecha_envio'] class Recepcion(models.Model): envio = models.ForeignKey(Envio) usuario_recibe = models.ForeignKey('auth.User') leido = models.BooleanField(default=False) fecha_leido = models.DateTimeField(null=True, blank=True) fecha_recepcion = models.DateField('Fecha de recepcion', default=datetime.now(), null=True, blank=True) estatus = models.PositiveSmallIntegerField(choices=ESTATUS, default=0) fecha_atendido = models.DateTimeField(null=True, blank=True) observaciones = models.TextField(null=True, blank=False) class RecepcionCopia(models.Model): envio = models.ForeignKey(Envio) usuario_recibe = models.ForeignKey('auth.User') leido = models.BooleanField(default=False) fecha_leido = models.DateTimeField(null=True, blank=True) fecha_recepcion = models.DateField('Fecha de recepcion', default=datetime.now(), null=True, blank=True) estatus = models.PositiveSmallIntegerField(choices=ESTATUS, default=4) class Asignacion(models.Model): usuario_asigna = models.ForeignKey('auth.User', related_name="id_usuario_asigna") usuarios_asignados = models.ManyToManyField('auth.User', related_name="id_usuarios_asignados", verbose_name='asignar a', through='RecepcionAsignacion') oficio = models.ForeignKey(Oficio, verbose_name="Oficio") fecha_asignacion = models.DateTimeField(auto_now_add=True) observaciones = models.TextField(null=True, blank=False) usuarios_copia = models.ManyToManyField('auth.User', related_name="id_usuarios_asignados_copia", verbose_name='CCP', through='RecepcionAsignacionCopia') # asunto = models.CharField(max_length=255, null=True, blank=True) # cuerpo = models.TextField('mensaje', null=True, blank=True) def get_absolute_url(self): return reverse('oficios:oficios-asignados') # def clean(self): # if self.oficio.terminado: # raise ValidationError('No puede asignar un oficio que ya está resuelto.') def __unicode__(self): return u'%s' % self.oficio class Meta: ordering = ['-fecha_asignacion'] class RecepcionAsignacion(models.Model): """docstring for OficioAsignado""" asignacion = models.ForeignKey(Asignacion) usuario_asignado = models.ForeignKey('auth.User') revisado = models.BooleanField(default=False) fecha_revisado = models.DateTimeField(null=True, blank=True) estatus = models.PositiveSmallIntegerField(choices=ESTATUS, default=1) fecha_atendido = models.DateTimeField(null=True, blank=True) observaciones = models.TextField(null=True, blank=False) class RecepcionAsignacionCopia(models.Model): asignacion = models.ForeignKey(Asignacion) revisado = models.BooleanField(default=False) usuario_asignado = models.ForeignKey('auth.User') fecha_revisado = models.DateTimeField(null=True, blank=True) estatus = models.PositiveSmallIntegerField(choices=ESTATUS, default=4) class MesaAyuda(models.Model): numero = models.CharField("Numero de Mesa de Ayuda", max_length=25) descripcion = models.TextField("Descripción") es_respuesta = models.BooleanField(help_text='Marque si la mesa de ayuda es respuesta de oficio y a continuación escoja el oficio que se responde.') oficio_responde = models.ForeignKey('Oficio', null=True, blank=True, verbose_name='oficio al que responde')