mirror of https://github.com/interlegis/sigi.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
5.7 KiB
156 lines
5.7 KiB
# -*- coding: utf-8 -*-
|
|
from django.db import models
|
|
from django.conf import settings
|
|
from django.utils.translation import ugettext as _
|
|
from django.core.exceptions import ValidationError
|
|
from django.utils.safestring import mark_safe
|
|
|
|
|
|
class Categoria(models.Model):
|
|
nome = models.CharField(_(u"Categoria"), max_length=50)
|
|
descricao = models.TextField(_(u'descrição'), blank=True, null=True)
|
|
setor_responsavel = models.ForeignKey(
|
|
'servidores.Servico',
|
|
on_delete=models.PROTECT,
|
|
verbose_name=_(u"Setor responsável")
|
|
)
|
|
|
|
class Meta:
|
|
verbose_name, verbose_name_plural = _(u'Categoria'), _(u'Categorias')
|
|
ordering = ('nome',)
|
|
|
|
def __unicode__(self):
|
|
return self.nome
|
|
|
|
|
|
class TipoContato(models.Model):
|
|
descricao = models.CharField(_(u"Descrição"), max_length=50)
|
|
|
|
class Meta:
|
|
verbose_name, verbose_name_plural = _(u"Tipo de contato"), _(u"Tipos de contato")
|
|
|
|
def __unicode__(self):
|
|
return self.descricao
|
|
|
|
|
|
class Ocorrencia(models.Model):
|
|
STATUS_ABERTO = 1
|
|
STATUS_REABERTO = 2
|
|
STATUS_RESOLVIDO = 3
|
|
STATUS_FECHADO = 4
|
|
STATUS_DUPLICADO = 5
|
|
|
|
STATUS_CHOICES = (
|
|
(STATUS_ABERTO , _(u'Aberto')),
|
|
(STATUS_REABERTO , _(u'Reaberto')),
|
|
(STATUS_RESOLVIDO, _(u'Resolvido')),
|
|
(STATUS_FECHADO , _(u'Fechado')),
|
|
(STATUS_DUPLICADO, _(u'Duplicado')),
|
|
)
|
|
|
|
PRIORITY_CHOICES = (
|
|
(1, _(u'Altíssimo')),
|
|
(2, _(u'Alto')),
|
|
(3, _(u'Normal')),
|
|
(4, _(u'Baixo')),
|
|
(5, _(u'Baixíssimo')),
|
|
)
|
|
|
|
casa_legislativa = models.ForeignKey(
|
|
'casas.Orgao',
|
|
on_delete=models.CASCADE,
|
|
verbose_name=_(u'Casa Legislativa')
|
|
)
|
|
data_criacao = models.DateField(_(u'Data de criação'), null=True, blank=True, auto_now_add=True)
|
|
data_modificacao = models.DateField(_(u'Data de modificação'), null=True, blank=True, auto_now=True)
|
|
categoria = models.ForeignKey(
|
|
Categoria,
|
|
on_delete=models.PROTECT,
|
|
verbose_name=_(u'Categoria')
|
|
)
|
|
tipo_contato = models.ForeignKey(
|
|
TipoContato,
|
|
on_delete=models.PROTECT,
|
|
verbose_name=_(u"Tipo de contato")
|
|
)
|
|
assunto = models.CharField(_(u'Assunto'), max_length=200)
|
|
status = models.IntegerField(_(u'Status'), choices=STATUS_CHOICES, default=1,)
|
|
prioridade = models.IntegerField(_(u'Prioridade'), choices=PRIORITY_CHOICES, default=3, )
|
|
descricao = models.TextField(_(u'descrição'), blank=True,)
|
|
resolucao = models.TextField(_(u'resolução'), blank=True,)
|
|
servidor_registro = models.ForeignKey(
|
|
'servidores.Servidor',
|
|
on_delete=models.PROTECT,
|
|
verbose_name=_(u"Servidor que registrou a ocorrência")
|
|
)
|
|
setor_responsavel = models.ForeignKey(
|
|
'servidores.Servico',
|
|
on_delete=models.PROTECT,
|
|
verbose_name=_(u"Setor responsável")
|
|
)
|
|
ticket = models.PositiveIntegerField(_(u'Número do ticket'), blank=True, null=True, help_text=_(u"Número do ticket no osTicket"))
|
|
|
|
class Meta:
|
|
verbose_name, verbose_name_plural = _(u'ocorrência'), _(u'ocorrências')
|
|
ordering = ['prioridade', 'data_modificacao', 'data_criacao', ]
|
|
|
|
def __unicode__(self):
|
|
return u"%(casa_legislativa)s: %(assunto)s" % {'assunto': self.assunto, 'casa_legislativa': self.casa_legislativa}
|
|
|
|
def clean(self):
|
|
if self.ticket is not None and Ocorrencia.objects.exclude(pk=self.pk).filter(ticket=self.ticket).exists():
|
|
raise ValidationError({'ticket': _(u"Já existe ocorrência registrada para este ticket")})
|
|
return super(Ocorrencia, self).clean()
|
|
|
|
def get_ticket_url(self):
|
|
return mark_safe(settings.OSTICKET_URL % self.ticket)
|
|
|
|
class Comentario(models.Model):
|
|
ocorrencia = models.ForeignKey(
|
|
Ocorrencia,
|
|
on_delete=models.CASCADE,
|
|
verbose_name=_(u'Ocorrência'),
|
|
related_name='comentarios'
|
|
)
|
|
data_criacao = models.DateTimeField(_(u'Data de criação'), null=True, blank=True, auto_now_add=True)
|
|
descricao = models.TextField(_(u'Descrição'), blank=True, null=True)
|
|
usuario = models.ForeignKey(
|
|
'servidores.Servidor',
|
|
on_delete=models.PROTECT,
|
|
verbose_name=_(u'Usuário')
|
|
)
|
|
novo_status = models.IntegerField(_(u'Novo status'), choices=Ocorrencia.STATUS_CHOICES, blank=True, null=True)
|
|
encaminhar_setor = models.ForeignKey(
|
|
'servidores.Servico',
|
|
on_delete=models.PROTECT,
|
|
verbose_name=_(u'Encaminhar para setor'),
|
|
blank=True,
|
|
null=True
|
|
)
|
|
|
|
def save(self, *args, **kwargs):
|
|
if self.encaminhar_setor and (self.encaminhar_setor != self.ocorrencia.setor_responsavel):
|
|
self.ocorrencia.setor_responsavel = self.encaminhar_setor
|
|
self.ocorrencia.save()
|
|
if self.novo_status and (self.novo_status != self.ocorrencia.status):
|
|
self.ocorrencia.status = self.novo_status
|
|
self.ocorrencia.save()
|
|
super(Comentario, self).save(*args, **kwargs)
|
|
|
|
|
|
class Anexo(models.Model):
|
|
ocorrencia = models.ForeignKey(
|
|
Ocorrencia,
|
|
on_delete=models.CASCADE,
|
|
verbose_name=_(u'ocorrência')
|
|
)
|
|
arquivo = models.FileField(_(u'Arquivo anexado'), upload_to='apps/ocorrencia/anexo/arquivo', max_length=500)
|
|
descricao = models.CharField(_(u'descrição do anexo'), max_length='70')
|
|
data_pub = models.DateTimeField(_(u'data da publicação do anexo'), null=True, blank=True, auto_now_add=True)
|
|
|
|
class Meta:
|
|
ordering = ('-data_pub',)
|
|
verbose_name, verbose_name_plural = _(u'Anexo'), _(u'Anexos')
|
|
|
|
def __unicode__(self):
|
|
return u"%(arquivo_name)s: %(descricao)s" % {'arquivo_name': self.arquivo.name, 'descricao': self.descricao}
|
|
|