class Departamento(models.Model): cod_facultad = models.CharField(max_length=2) cod_departamento = models.CharField(max_length=2) nombre = models.CharField(max_length=120) activo = models.BooleanField(default=True) facultad = models.ForeignKey(Facultad, limit_choices_to=Q(tipo='FA'), blank=True, null=True, on_delete=models.SET_NULL) fecha_creacion = models.DateField(auto_now_add=True) fecha_actualizacion = models.DateField(auto_now=True) history = AuditlogHistoryField() class Meta: unique_together = ('cod_facultad', 'cod_departamento') verbose_name_plural = 'Departamentos' def __str__(self): return '{} - {}'.format(self.cod_facultad, self.cod_departamento) def save(self, *args, **kwargs): try: self.facultad = Facultad.objects.get( cod_facultad=self.cod_facultad) except ObjectDoesNotExist: pass return super(Departamento, self).save()
class ClassificationAnswer(models.Model): """ Model to store the user's selected answer (True, False) and the selected strength for each \ ClassificationQuestion in a Classification. """ STRENGTH_CHOICES = (('PV', 'PATH_VERY_STRONG'), ('PS', 'PATH_STRONG'), ('PM', 'PATH_MODERATE'), ( 'PP', 'PATH_SUPPORTING', ), ('BA', 'BENIGN_STAND_ALONE'), ('BS', 'BENIGN_STRONG'), ('BP', 'BENIGN_SUPPORTING')) history = AuditlogHistoryField() classification = models.ForeignKey(Classification, on_delete=models.CASCADE) classification_question = models.ForeignKey(ClassificationQuestion, on_delete=models.CASCADE) selected_first = models.BooleanField() strength_first = models.CharField(max_length=2, choices=STRENGTH_CHOICES) selected_second = models.BooleanField() strength_second = models.CharField(max_length=2, choices=STRENGTH_CHOICES) comment = models.TextField() def __str__(self): return f'{self.id}'
class Sede(models.Model): CAMPUS = 'CU' CENTRO_REGIONAL = 'CR' EXTENSION = 'EX' PROYECTO_ANEXO = 'PA' TIPOS = ( (CAMPUS, 'Campus'), (CENTRO_REGIONAL, 'Centro Regional'), (EXTENSION, 'Extension'), (PROYECTO_ANEXO, 'Proyecto Anexo'), ) objects = SedeManager() cod_sede = models.CharField(max_length=2, unique=True) nombre = models.CharField(max_length=120, unique=True) tipo = models.CharField(max_length=2, choices=TIPOS, default='PA') activo = models.BooleanField(default=True) fecha_creacion = models.DateField(auto_now_add=True) fecha_actualizacion = models.DateField(auto_now=True) history = AuditlogHistoryField() class Meta: verbose_name_plural = 'Sedes' def __str__(self): return '{} - {}'.format(self.cod_sede, self.nombre) def get_absolute_url(self): return reverse('ubicacion:sede', kwargs={'cod_sede': self.cod_sede})
class Usuario(AbstractUser): """ Se crea la clase Usuario que hereda del modelo User de django, para agregarle mas atributos. cedula = numero de cedula del usuario. direccion = direccion del usuario. """ cedula = models.PositiveIntegerField(default=0) direccion = models.TextField(max_length=50, blank=True, null=False) # Configuraciones de usuario hora_notificaciones = models.TimeField(null=True, default="00:00:00") formato = (('htm', 'HTML'), ('txt', 'Texto Plano')) formato_notificaciones = models.CharField(max_length=3, choices=formato, default='htm', help_text='Formato') noti_creacion_proyecto = models.BooleanField(default=False) noti_creacion_usuario = models.BooleanField(default=False) noti_creacion_equipos = models.BooleanField(default=False) noti_cambio_estado_actividades = models.BooleanField(default=False) noti_us_asignado = models.BooleanField(default=False) noti_cambio_actividades = models.BooleanField(default=False) history = AuditlogHistoryField() def __unicode__(self): return self.username
class EmployeeAppraisalMeasure(models.Model): employee_appraisal = models.ForeignKey(EmployeeAppraisal, related_name='measures', blank=True) measure = models.ForeignKey(AppraisalMeasure, related_name='reviews', blank=True) rating = models.IntegerField(null=True) comment = models.TextField(blank=True) reviewer = models.ForeignKey(EmployeeProfile, null=True, blank=True) created_at = models.DateTimeField(auto_now_add=True) def get_self_appraisal(self): return self.employee_appraisal.measures.filter( employee_appraisal=self.employee_appraisal, measure=self.measure).order_by('id')[0] def get_supervisor_appraisal(self): measures = self.employee_appraisal.measures.filter( employee_appraisal=self.employee_appraisal, measure=self.measure) if measures.count() > 1: return measures.order_by('-id')[0] return None history = AuditlogHistoryField()
class ModeloCarga(ModeloBase): history = AuditlogHistoryField() tipo_carga = models.CharField( 'tipo de carga', max_length=35, choices=CARGA_CHOICES, default=CARGA_ASSOCIACOES, unique=True, ) arquivo = models.FileField(blank=True, null=True) class Meta: verbose_name = "modelo de carga" verbose_name_plural = "02.1) Modelos de carga" def __str__(self): return CARGA_NOMES[self.tipo_carga] if self.tipo_carga else "" @classmethod def tipos_cargas_to_json(cls): return [{ 'id': choice[0], 'nome': choice[1] } for choice in CARGA_CHOICES]
class CargaHorária(utils.CalculadoraTempoMixin, TimeStampedModel): """Carga horária contendo os meses de trabalho anuais.""" ponto = models.ForeignKey(Ponto, related_name='carga_horária') ano = models.IntegerField() histórico = AuditlogHistoryField() class Meta: """Meta opções do modelo.""" ordering = ['ano'] @property def horas_trabalhadas(self): """Horas trabalhadas totais dessa carga horária.""" total = datetime.timedelta() for mês in self.meses.all(): total += mês.horas_trabalhadas return total def __str__(self): """toString.""" return f'Carga horária referente ao ano {self.ano} do servidor siape nº {self.ponto.siape}' __repr__ = __str__
class ContratoUnidade(ModeloBase): historico = AuditlogHistoryField() contrato = models.ForeignKey(Contrato, on_delete=models.CASCADE, related_name="unidades") unidade = models.ForeignKey(Unidade, on_delete=models.PROTECT, related_name="contratos", to_field="codigo_eol") valor_mensal = models.DecimalField(max_digits=9, decimal_places=2, default=0.00) valor_total = models.DecimalField(max_digits=9, decimal_places=2, default=0.00) lote = models.CharField(max_length=20, blank=True, default='') def __str__(self): return f'TC:{self.contrato.termo_contrato} - Unidade: {self.unidade.nome}' @property def numero_lote(self): return f'Lote {self.lote}' @property def fiscais(self): return self.fiscais class Meta: verbose_name = 'Unidade de Contrato' verbose_name_plural = 'Unidades de Contratos'
class Sprint(models.Model): """ Clase Sprint que hereda de models.Model nombre = Nombre del Sprint. duracion = Duracion calculada del Sprint en dias. proyecto = Proyecto al que pertenece el Sprint. """ nombre = models.TextField(default='') duracion = models.IntegerField(default=0) proyecto = models.ForeignKey(Proyecto, null=True, related_name='sprints') options_estado_sprint = ( ('PEN', 'Pendiente'), ('INI', 'Iniciado'), ('FIN', 'Finalizado') ) estado_sprint = models.CharField(max_length=3, choices=options_estado_sprint, default='PEN') fecha_inicio = models.DateField() fecha_fin = models.DateField(null=True) history = AuditlogHistoryField() class Meta: permissions = ( ("view_sprint", "Puede ver Sprint"), ("asignar_us", "Puede asignar US al Sprint"), ("iniciar_sprint", "Puede iniciar el Sprint"), ) def __unicode__(self): return self.nombre
class FiscaisUnidade(ModeloBase): # Tipos de Fiscal FISCAL_TITULAR = 'TITULAR' FISCAL_SUPLENTE = 'SUPLENTE' FISCAL_NOMES = { FISCAL_TITULAR: 'Titular', FISCAL_SUPLENTE: 'Suplente', } FISCAL_CHOICES = ( (FISCAL_TITULAR, FISCAL_NOMES[FISCAL_TITULAR]), (FISCAL_SUPLENTE, FISCAL_NOMES[FISCAL_SUPLENTE]), ) historico = AuditlogHistoryField() contrato_unidade = models.ForeignKey(ContratoUnidade, on_delete=models.CASCADE, related_name="fiscais", blank=True, null=True) fiscal = models.ForeignKey(User, on_delete=models.PROTECT, related_name='contratos_fiscalizados') tipo_fiscal = models.CharField(max_length=15, choices=FISCAL_CHOICES, default=FISCAL_SUPLENTE) def __str__(self): contrato = '' unidade = '' fiscal = f'Fiscal ({self.tipo_fiscal}): {self.fiscal.nome}' if self.contrato_unidade: contrato = f'TC:{self.contrato_unidade.contrato.termo_contrato}' unidade = f'unidade: {self.contrato_unidade.unidade.nome}' return f'{fiscal} do {contrato} na {unidade}' class Meta: verbose_name = 'Fiscal da Unidade de Contrato' verbose_name_plural = 'Fiscais das Unidades de Contratos'
class ModelBase(models.Model): created = models.DateTimeField('Criado em', auto_now_add=True) modified = models.DateTimeField('Modificado em', auto_now=True) history = AuditlogHistoryField() class Meta: abstract = True
class Facultad(models.Model): ''' Define la informacion de una facultad, estas pueden ser Facultades, vicerrectorias, institutos, asociaciones o coordinaciones. Para este sistema solo se utilizara Facultades y Coordinaciones. ''' FACULTAD = 'FA' VICERRECTORIA = 'VI' TIPOS = ( (FACULTAD, 'Facultad'), (VICERRECTORIA, 'Vicerrectoria'), ) objects = UnidadManager() cod_facultad = models.CharField(max_length=2, unique=True) nombre = models.CharField(max_length=120, unique=True) tipo = models.CharField(max_length=2, choices=TIPOS, default=FACULTAD) activo = models.BooleanField(default=True) fecha_creacion = models.DateField(auto_now_add=True) fecha_actualizacion = models.DateField(auto_now=True) history = AuditlogHistoryField() class Meta: verbose_name_plural = 'Facultades' def __str__(self): return '{} - {}'.format(self.cod_facultad, self.nombre) def get_absolute_url(self): pass
class CoadAssessor(ModeloBase): historico = AuditlogHistoryField() coad = models.ForeignKey(Coad, on_delete=models.CASCADE, related_name='assessores') assessor = models.OneToOneField(User, on_delete=models.PROTECT, related_name='assessor_coad') def __str__(self): return f"{self.assessor.nome}" @classmethod def limpa_assessores(cls): cls.objects.all().delete() @classmethod def append_assessores(cls, assessores): coad = Coad.objects.get(id=1) for assessor in assessores: usuario = User.objects.get( username=assessor["assessor"]["username"]) cls.objects.create(coad=coad, assessor=usuario) class Meta: verbose_name = "Assessor COAD" verbose_name_plural = "Assessores COAD"
class Tesis(models.Model): history = AuditlogHistoryField() especialidad_doctorado = models.OneToOneField(EspecialidadDoctorado, on_delete=models.CASCADE, null=True, blank=True, default='') titulo_tesis = models.CharField(max_length=255, null=False, blank=False, unique=True) archivo = models.FileField(upload_to="tesis/", null=True, blank=True) created_at = models.DateTimeField("Fecha de Creado", auto_now_add=True) updated_at = models.DateTimeField("Fecha de actualización", auto_now=True, auto_now_add=False) class Meta: db_table = 'tesis' verbose_name = 'Tesis' verbose_name_plural = 'Tesis' ordering = ['-titulo_tesis'] def __str__(self): return self.titulo_tesis
class AbstractBaseModel(models.Model): class Meta: abstract = True history = AuditlogHistoryField() uuid = models.UUIDField(verbose_name='UUID', default=uuid4, editable=False, unique=True) created_at = models.DateTimeField(verbose_name=_('Created at'), auto_now_add=True) updated_at = models.DateTimeField(verbose_name=_('Updated at'), auto_now=True) deleted_at = models.DateTimeField(verbose_name=_('Deleted at'), null=True, blank=True) objects = Manager() objects_all = models.Manager() def delete(self): self.deleted_at = timezone.now() self.save() post_soft_delete.send(sender=type(self), instance=self, using=self._state.db) def __str__(self): if hasattr(self, 'name'): return self.name if hasattr(self, 'title'): return self.title return str(self.pk)
class FiscalLote(ModeloBase): # Tipos de Fiscal FISCAL_TITULAR = 'TITULAR' FISCAL_SUPLENTE = 'SUPLENTE' FISCAL_NOMES = { FISCAL_TITULAR: 'Titular', FISCAL_SUPLENTE: 'Suplente', } FISCAL_CHOICES = ( (FISCAL_TITULAR, FISCAL_NOMES[FISCAL_TITULAR]), (FISCAL_SUPLENTE, FISCAL_NOMES[FISCAL_SUPLENTE]), ) historico = AuditlogHistoryField() lote = models.ForeignKey(Lote, on_delete=models.CASCADE, related_name="fiscais_lote", blank=True, null=True) fiscal = models.ForeignKey(User, on_delete=models.PROTECT, related_name='fiscais') tipo_fiscal = models.CharField(max_length=15, choices=FISCAL_CHOICES, default=FISCAL_SUPLENTE) def __str__(self): return f'{self.fiscal.nome} do {self.lote.nome}' class Meta: verbose_name = 'Fiscal do Lote de Contrato' verbose_name_plural = 'Fiscais dos Lotes de Contratos'
class Solicitud(models.Model): usuario = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) titulo = models.CharField(max_length=120) fecha_creacion = models.DateField(blank=True, null=True, auto_now_add=True) fecha_actualizacion = models.DateTimeField(blank=True, null=True, auto_now=True) resumen = models.TextField(max_length=500, blank=True) resuelto = models.BooleanField(default=False) history = AuditlogHistoryField() class Meta: verbose_name_plural = 'Solicitudes' def __str__(self): return self.titulo def save(self, *args, **kwargs): return super(Solicitud, self).save() def get_absolute_url(self): return reverse('solicitud:detalle', kwargs={'pk': self.pk}) def resolver(self): self.resuelto = True self.save()
class Objection(models.Model): complaint_id = models.CharField(max_length=10) complaint_language = models.ForeignKey(to=ComplaintLanguage, on_delete=models.SET_NULL, null=True, blank=True) service_provider = models.ForeignKey(to=ServiceProvider, on_delete=models.SET_NULL, null=True, blank=True) agent = models.ForeignKey(to=Agent, on_delete=models.SET_NULL, null=True, blank=True) date_submitted = models.DateTimeField() date_processing_start = models.DateTimeField(null=True, blank=True) due_date = models.DateTimeField(null=True, blank=True) date_processing_end = models.DateTimeField(null=True, blank=True) status_note = models.ForeignKey(to=StatusNote, on_delete=models.SET_NULL, null=True, blank=True) psp_objection_referenced_code_section = models.ForeignKey( to=ReferencedCodeSection, on_delete=models.SET_NULL, null=True, blank=True, related_name='ReferencedCodeSectionPSP') ccts_determination_referenced_code_section = models.ForeignKey( to=ReferencedCodeSection, on_delete=models.SET_NULL, null=True, blank=True, related_name='ReferencedCodeSectionCCTS') objection_status = models.ForeignKey(to=ObjectionStatus, on_delete=models.SET_NULL, null=True, blank=True) ccts_assessment = models.ForeignKey(to=ObjectionAssessment, on_delete=models.SET_NULL, null=True, blank=True) closing_level = models.ForeignKey(to=ClosingLevel, on_delete=models.SET_NULL, null=True, blank=True) ccts_assistance_required = models.ForeignKey(to=CCTSAssistanceRequired, on_delete=models.SET_NULL, null=True, blank=True) customer_assistance_required = models.ForeignKey( to=CustomerAssistanceRequired, on_delete=models.SET_NULL, null=True, blank=True) history = AuditlogHistoryField() def __str__(self): return self.complaint_id
class RelatedModel(models.Model): """ A model with a foreign key. """ related = models.ForeignKey(to='self', on_delete=models.CASCADE) history = AuditlogHistoryField()
class RelatedModel(models.Model): """ A model with a foreign key. """ related = models.ForeignKey('self') history = AuditlogHistoryField()
class BaseModel(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) created = models.DateTimeField(auto_now_add=True) modified = models.DateTimeField(auto_now=True) history = AuditlogHistoryField(pk_indexable=False) class Meta: abstract = True
class ManyRelatedModel(models.Model): """ A model with a many to many relation. """ related = models.ManyToManyField('self') history = AuditlogHistoryField()
class Proyecto(models.Model): """ Se crea la clase Proyecto, que hereda de Model de django, con los siguientes atributos: nombre : El nombre del proyecto. fechaCreacion : La fecha en la cual se creo el proyecto. fechaInicio : La fecha en la cual se inicia el proyecto. fechaFin : La fecha en la cual se termino el proyecto. liderProyecto : Usuario lider del proyecto. descripcion : breve descripcion del proyecto. estado : Estado actual del proyecto, puede ser Pendiente, Anulado, Activo o Finalizado. Obvservaciones : Ciertas observaciones del proyecto. cliente : Cliente que solicito el proyecto. activo : variable que determina un estado de "eliminado" para el Proyecto. Metodos: hacerLider : Establece un Usuario como lider del proyecto. """ opciones_estado = ( ('PEN', 'Pendiente'), ('ANU', 'Anulado'), ('ACT', 'Activo'), ('FIN', 'Finalizado'), ) nombre = models.CharField(max_length=50, null=False) fecha_creacion = models.DateField(auto_now=True) fecha_inicio = models.DateField() fecha_fin = models.DateField() lider_proyecto = models.ForeignKey(Usuario, related_name='lider') descripcion = models.TextField( max_length=140, help_text='Introduzca una breve reseña del proyecto', null=True) estado = models.CharField(max_length=3, choices=opciones_estado, default='PEN', help_text='Estado del proyecto') observaciones = models.TextField(max_length=140, null=True, default='No hay observaciones') cliente = models.ForeignKey(Cliente, on_delete=models.DO_NOTHING) activo = models.BooleanField(default=True) history = AuditlogHistoryField() class Meta: permissions = ( ("view_proyecto", "Puede ver proyecto"), ("change_estado", "Puede cambiar el estado del proyecto"), ("view_log", "Puede cambiar el estado del proyecto"), ) def hacerLider(self, lider): self.lider_proyecto = lider self.save() def __unicode__(self): return self.nombre
class FacultadInstancia(models.Model): sede = models.ForeignKey(Sede, on_delete=models.CASCADE, related_name='facultades', blank=True, null=True) facultad = models.ForeignKey(Facultad, on_delete=models.CASCADE, related_name='instancias', blank=True, null=True) activo = models.BooleanField(default=True) cod_sede = models.CharField(max_length=2) cod_facultad = models.CharField(max_length=2) decano = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) fecha_creacion = models.DateField(auto_now_add=True) fecha_actualizacion = models.DateField(auto_now=True) history = AuditlogHistoryField() objects = UnidadInstanciaManager() class Meta: permissions = ( ('ver_facultad', 'Ver Facultad'), ('ver_profesores_facultad', 'Ver Profesores'), ('ver_estudiantes_facultad', 'Ver Estudiantes'), ('ver_actividades_facultad', 'Ver Actividades'), ('ver_trabajos_facultad', 'Ver Trabajos'), ) unique_together = ('cod_sede', 'cod_facultad') verbose_name_plural = 'Instancias Facultades' def __str__(self): return '{}-{}'.format(self.cod_sede, self.cod_facultad) def save(self, *args, **kwargs): try: self.sede = Sede.objects.get(cod_sede=self.cod_sede) except ObjectDoesNotExist: pass try: self.facultad = Facultad.objects.get( cod_facultad=self.cod_facultad) except ObjectDoesNotExist: pass return super(FacultadInstancia, self).save() def get_absolute_url(self): return reverse('ubicacion:facultad', kwargs={ 'cod_sede': self.cod_sede, 'cod_facultad': self.cod_facultad })
class DateTimeFieldModel(models.Model): """ A model with a DateTimeField, used to test DateTimeField changes are detected properly. """ label = models.CharField(max_length=100) timestamp = models.DateTimeField() history = AuditlogHistoryField()
class FirstManyRelatedModel(models.Model): """ A model with a many to many relation to another model similar. """ related = models.ManyToManyField('OtherManyRelatedModel', related_name='related') history = AuditlogHistoryField()
class OtherManyRelatedModel(models.Model): """ A model that 'receives' the other side of the many to many relation from 'FirstManyRelatedModel'. """ history = AuditlogHistoryField() def __str__(self): return f'{self.id}'
class EmployeeAppraisal(models.Model): class Meta: ordering = ('-id', ) STATUS_CHOICES = (('0', 'Complete'), ('1', 'Pending'), ('2', 'Canceled'), ('3', 'In progress')) appraisal = models.ForeignKey(Appraisal, related_name='employee_appraisals', on_delete=models.CASCADE) employee_profile = models.ForeignKey(EmployeeProfile, related_name='appraisals') status = models.CharField(max_length=1, choices=STATUS_CHOICES, default=STATUS_CHOICES[1][0], blank=True) on_open_remarks = models.TextField(null=True, blank=True) on_close_remarks = models.TextField(null=True, blank=True) closed_on = models.DateTimeField(null=True, blank=True) objects = models.Manager() pending_appraisals = EmployeePendingAppraisalManager() history = AuditlogHistoryField() @property def is_complete(self): if self.status in ['0', '2']: return True return False def get_has_appraisal(self): if self.is_complete: return None return self.flows.order_by('-id')[0].to_reviewer def get_total_answered(self, **kwargs): return self.measures.filter(rating__isnull=False, comment__isnull=False, reviewer=kwargs.get('reviewer')).count() def get_average_rating(self, reviewer=None): sum_ratios = 0 count = 0 q = models.Q() if reviewer is not None: q = models.Q(reviewer=reviewer) measures = self.measures.filter(q) for measure in measures: if measure.rating is not None: sum_ratios += float( measure.rating) / measure.measure.max_rating count += 1 avg_rating = sum_ratios / count * 100 return round(avg_rating)
class Notificacion(models.Model): history = AuditlogHistoryField() usuario = models.ForeignKey(User, on_delete=models.CASCADE) titulo = models.CharField(blank=True, max_length=120) texto = models.CharField(max_length=120) url = models.URLField(blank=True) def __str__(self): return '{}-{}'.format(self.usuario.username, self.titulo)
class SimpleExcludeModel(models.Model): """ A simple model used for register's exclude_fields kwarg """ label = models.CharField(max_length=100) text = models.TextField(blank=True) history = AuditlogHistoryField()