Browse Source

Melhorias no sistema de registro de ocorrências - Envolve mudanças no banco de dados

stable/1.0
Sesostris Vieira 12 years ago
parent
commit
a24beba99f
  1. 66
      sigi/admin/filterspecs.py
  2. 11
      sigi/apps/casas/admin.py
  3. 113
      sigi/apps/ocorrencias/admin.py
  4. 90
      sigi/apps/ocorrencias/models.py

66
sigi/admin/filterspecs.py

@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
from django.contrib.admin.filterspecs import FilterSpec, ChoicesFilterSpec, BooleanFieldFilterSpec from django.contrib.admin.filterspecs import FilterSpec, ChoicesFilterSpec, BooleanFieldFilterSpec
from django.utils.encoding import smart_unicode from django.utils.encoding import smart_unicode
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
@ -345,3 +346,68 @@ class CasaProjetoFilterSpec(ChoicesFilterSpec):
# registering the filter # registering the filter
FilterSpec.filter_specs.insert(0, (lambda f: getattr(f, 'projeto_filter', False), FilterSpec.filter_specs.insert(0, (lambda f: getattr(f, 'projeto_filter', False),
CasaProjetoFilterSpec)) CasaProjetoFilterSpec))
# Filterspec para ocorrencias
class OcorrenciaFilterspec(ChoicesFilterSpec):
def __init__(self, f, request, params, model, model_admin):
super(OcorrenciaFilterspec, self).__init__(f, request, params, model, model_admin)
self.lookup_kwarg = 'grupo'
self.lookup_val = request.GET.get(self.lookup_kwarg, None)
self.lookup_choices = (('S', u'Atribuídos ao meu setor'), ('M', u'Registrados por mim'),)
def choices(self, cl):
yield {'selected': self.lookup_val is None,
'query_string': cl.get_query_string({}, [self.lookup_kwarg]),
'display': _('All')}
for value, label in self.lookup_choices:
yield {'selected': smart_unicode(value) == self.lookup_val,
'query_string': cl.get_query_string({self.lookup_kwarg: value}),
'display': label}
def title(self):
return u"grupos de ocorrência"
# registering the filter
FilterSpec.filter_specs.insert(0, (lambda f: getattr(f, 'grupo_filter', False),
OcorrenciaFilterspec))
# Multichoices filterspec
class MultichoicesFilterSpec(ChoicesFilterSpec):
"""
my_model_field.multichoices_filter = True
"""
def __init__(self, f, request, params, model, model_admin):
super(MultichoicesFilterSpec, self).__init__(f, request, params, model,
model_admin)
self.lookup_kwarg = '%s__in' % f.name
self.lookup_val = request.GET.get(self.lookup_kwarg, None)
def choices(self, cl):
lookup_values = map(int, self.lookup_val.split(',')) if self.lookup_val is not None else []
is_all = (self.lookup_val is None) or (lookup_values == [k for k,v in self.field.flatchoices])
if is_all:
lookup_values = []
yield {'selected': is_all,
'query_string': cl.get_query_string({}, [self.lookup_kwarg]),
'display': _('All')}
for k, v in self.field.flatchoices:
selected = k in lookup_values
new_values = list(lookup_values)
if selected:
new_values.remove(k)
else:
new_values.append(k)
new_values.sort()
yield {'selected': selected,
'query_string': cl.get_query_string({self.lookup_kwarg: u",".join(map(str, new_values))}),
'display': v}
def title(self):
return _('%(field_name)s in') % \
{'field_name': self.field.verbose_name}
# registering the filter
FilterSpec.filter_specs.insert(0, (lambda f: getattr(f, 'multichoice_filter', False),
MultichoicesFilterSpec))

11
sigi/apps/casas/admin.py

@ -17,6 +17,7 @@ from sigi.apps.diagnosticos.models import Diagnostico
from sigi.apps.inventario.models import Bem from sigi.apps.inventario.models import Bem
from sigi.apps.servicos.models import Servico from sigi.apps.servicos.models import Servico
from sigi.apps.metas.models import PlanoDiretor from sigi.apps.metas.models import PlanoDiretor
from sigi.apps.ocorrencias.models import Ocorrencia
class TelefonesInline(generic.GenericTabularInline): class TelefonesInline(generic.GenericTabularInline):
model = Telefone model = Telefone
@ -136,6 +137,14 @@ class ServicoInline(admin.TabularInline):
class PlanoDiretorInline(admin.TabularInline): class PlanoDiretorInline(admin.TabularInline):
model = PlanoDiretor model = PlanoDiretor
class OcorrenciaInline(admin.TabularInline):
model = Ocorrencia
fields = ('data_criacao', 'assunto', 'prioridade', 'status', 'data_modificacao', 'setor_responsavel',)
readonly_fields = ('data_criacao', 'assunto', 'prioridade', 'status', 'data_modificacao', 'setor_responsavel',)
extra = 0
max_num = 0
can_delete = False
class CasaLegislativaAdmin(admin.ModelAdmin): class CasaLegislativaAdmin(admin.ModelAdmin):
form = CasaLegislativaForm form = CasaLegislativaForm
@ -143,7 +152,7 @@ class CasaLegislativaAdmin(admin.ModelAdmin):
change_list_template = 'casas/change_list.html' change_list_template = 'casas/change_list.html'
actions = ['adicionar_casas',] actions = ['adicionar_casas',]
inlines = (TelefonesInline, PresidenteInline, FuncionariosInline, ConveniosInline, LegislaturaInline, inlines = (TelefonesInline, PresidenteInline, FuncionariosInline, ConveniosInline, LegislaturaInline,
DiagnosticoInline, BemInline, ServicoInline, PlanoDiretorInline) DiagnosticoInline, BemInline, ServicoInline, PlanoDiretorInline, OcorrenciaInline, )
list_display = ('nome','municipio','logradouro', 'ult_alt_endereco', 'get_convenios') list_display = ('nome','municipio','logradouro', 'ult_alt_endereco', 'get_convenios')
list_display_links = ('nome',) list_display_links = ('nome',)
list_filter = ('tipo', 'municipio', 'search_text') list_filter = ('tipo', 'municipio', 'search_text')

113
sigi/apps/ocorrencias/admin.py

@ -1,29 +1,114 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from django.contrib import admin from django.contrib import admin
from django.contrib.admin.views.main import ChangeList
from eav.admin import BaseEntityAdmin, BaseSchemaAdmin from eav.admin import BaseEntityAdmin, BaseSchemaAdmin
from sigi.apps.servidores.models import Servidor
from sigi.apps.ocorrencias.models import Ocorrencia, Comentario, Anexo, Categoria from sigi.apps.ocorrencias.models import Ocorrencia, Comentario, Anexo, Categoria
class ComentarioViewInline(admin.TabularInline):
model = Comentario
extra = 0
max_num=0
can_delete = False
verbose_name, verbose_name_plural = u"Comentário anterior", u"Comentários anteriores"
fields = ('usuario', 'data_criacao', 'novo_status', 'encaminhar_setor', 'descricao', )
readonly_fields = ('novo_status', 'encaminhar_setor', 'descricao', 'data_criacao', 'usuario',)
class ComentarioInline(admin.TabularInline): class ComentarioInline(admin.StackedInline):
model = Comentario model = Comentario
extra = 1 extra = 3
verbose_name, verbose_name_plural = u"Comentário novo", u"Comentários novos"
fieldsets = ((None, {'fields': (('novo_status', 'encaminhar_setor',), 'descricao', )}),)
def queryset(self, request):
return self.model.objects.get_empty_query_set()
class AnexosInline(admin.TabularInline): class AnexosInline(admin.TabularInline):
model = Anexo model = Anexo
extra = 2 extra = 2
exclude = ['data_pub',] readonly_fields = ['data_pub',]
class OcorrenciaChangeList(ChangeList):
request = None
def __init__(self, request, model, list_display, list_display_links, list_filter, date_hierarchy, search_fields,
list_select_related, list_per_page, list_editable, model_admin):
self.request = request
super(OcorrenciaChangeList, self).__init__(request, model, list_display, list_display_links, list_filter,
date_hierarchy, search_fields, list_select_related, list_per_page,
list_editable, model_admin)
def get_query_set(self):
tmp_params = self.params.copy()
grupo = None
if 'grupo' in self.params:
grupo = self.params['grupo']
del self.params['grupo']
qs = super(OcorrenciaChangeList, self).get_query_set()
self.params = tmp_params.copy()
if grupo:
servidor = Servidor.objects.get(user=self.request.user)
if grupo == 'S': # Apenas do meu setor
qs = qs.filter(setor_responsavel=servidor.servico)
elif grupo == 'M': # Apenas criados por mim
qs = qs.filter(servidor_registro=servidor)
return qs
class AnexoAdmin(admin.ModelAdmin): class OcorrenciaAdmin(admin.ModelAdmin):
date_hierarchy = 'data_pub' list_display = ('data_criacao', 'casa_legislativa', 'assunto', 'prioridade', 'status', 'data_modificacao', 'setor_responsavel',)
exclude = ['data_pub',] list_filter = ('assunto', 'status', 'prioridade', 'categoria', 'setor_responsavel', )
list_display = ('arquivo', 'descricao', 'data_pub', 'ocorrencia') search_fields = ('casa_legislativa__search_text', 'assunto', 'servidor_registro__nome', )
raw_id_fields = ('ocorrencia',) date_hierarchy = 'data_criacao'
search_fields = ('descricao', 'ocorrencia__id', 'arquivo', fields = ('casa_legislativa', 'categoria', 'assunto', 'status', 'prioridade', 'descricao', 'servidor_registro',
'ocorrencia__casa_legislativa__nome') 'setor_responsavel', 'resolucao', )
readonly_fields = ('servidor_registro', 'setor_responsavel', )
inlines = (ComentarioViewInline, ComentarioInline, AnexosInline, )
raw_id_fields = ('casa_legislativa', )
def get_changelist(self, request, **kwargs):
return OcorrenciaChangeList
def get_readonly_fields(self, request, obj=None):
fields = list(self.readonly_fields)
if obj is not None:
fields.extend(['casa_legislativa', 'categoria', 'assunto', 'status', 'descricao', ])
if obj.status in [3, 4, 5]: #Fechados
fields.append('prioridade')
return fields
def get_fieldsets(self, request, obj=None):
if obj is None:
self.fields = ('casa_legislativa', 'categoria', 'assunto', 'prioridade', 'descricao', 'resolucao', )
return super(OcorrenciaAdmin, self).get_fieldsets(request, obj)
def changelist_view(self, request, *args, **kwargs):
try:
if len(request.GET) == 0:
url = reverse('admin:%s_%s_changelist' % (self.opts.app_label, self.opts.module_name))
return HttpResponseRedirect("%s?grupo=S&status__in=1,2" % url)
except:
pass
return super(OcorrenciaAdmin, self).changelist_view(request, *args, **kwargs)
class OcorrenciaAdmin(BaseEntityAdmin): def save_model(self, request, obj, form, change):
inlines = (ComentarioInline, AnexosInline) if not change:
raw_id_fields = ('casa_legislativa',) obj.servidor_registro = Servidor.objects.get(user=request.user)
obj.setor_responsavel = obj.categoria.setor_responsavel
obj.save()
def save_formset(self, request, form, formset, change):
servidor = Servidor.objects.get(user=request.user)
instances = formset.save(commit=False)
for instance in instances:
instance.usuario = servidor
instance.save()
if instance.encaminhar_setor and (instance.encaminhar_setor != instance.ocorrencia.setor_responsavel):
instance.ocorrencia.setor_responsavel = instance.encaminhar_setor
instance.ocorrencia.save()
if instance.novo_status and (instance.novo_status != instance.ocorrencia.status):
instance.ocorrencia.status = instance.novo_status
instance.ocorrencia.save()
formset.save_m2m()
admin.site.register(Ocorrencia, OcorrenciaAdmin) admin.site.register(Ocorrencia, OcorrenciaAdmin)
admin.site.register(Anexo, AnexoAdmin)
admin.site.register(Categoria) admin.site.register(Categoria)

90
sigi/apps/ocorrencias/models.py

@ -3,81 +3,77 @@ from django.db import models
from datetime import datetime from datetime import datetime
from django.db import models from django.db import models
from sigi.apps.utils import SearchField from sigi.apps.utils import SearchField
from eav.models import BaseChoice, BaseEntity, BaseSchema, BaseAttribute #from eav.models import BaseChoice, BaseEntity, BaseSchema, BaseAttribute
class Categoria(models.Model): class Categoria(models.Model):
nome= models.CharField(max_length=50) nome= models.CharField(max_length=50)
descricao = models.TextField('descrição', blank=True, null=True) descricao = models.TextField('descrição', blank=True, null=True)
setor_responsavel = models.ForeignKey('servidores.Servico', verbose_name=u"Setor responsável")
class Meta:
verbose_name, verbose_name_plural = u'Categoria', u'Categorias'
def __unicode__(self): def __unicode__(self):
return str(self.nome) return str(self.nome)
class Ocorrencia(models.Model): class Ocorrencia(models.Model):
casa_legislativa = models.ForeignKey(
'casas.CasaLegislativa',
verbose_name='Casa Legislativa'
)
search_text = SearchField(field_names=['casa_legislativa'])
casa_legislativa.convenio_uf_filter = True
casa_legislativa.convenio_cl_tipo_filter = True
data_criacao = models.DateField(
'data de criacao',
null=True,
blank=True,
)
data_modificacao = models.DateField(
u'data de modificação',
null=True,
blank=True,
)
STATUS_CHOICES = ( STATUS_CHOICES = (
(1, 'Aberto'), (1, u'Aberto'),
(2, 'Reaberto'), (2, u'Reaberto'),
(3, 'Resolvido'), (3, u'Resolvido'),
(4, 'Fechado'), (4, u'Fechado'),
(5, 'Duplicado'), (5, u'Duplicado'),
) )
PRIORITY_CHOICES = ( PRIORITY_CHOICES = (
(1, u'Altíssimo'), (1, u'Altíssimo'),
(2, 'Alto'), (2, u'Alto'),
(3, 'Normal'), (3, u'Normal'),
(4, 'Baixo'), (4, u'Baixo'),
(5, u'Baixíssimo'), (5, u'Baixíssimo'),
) )
categoria = models.ForeignKey(Categoria) casa_legislativa = models.ForeignKey('casas.CasaLegislativa', verbose_name=u'Casa Legislativa')
assunto = models.CharField(max_length=200) casa_legislativa.convenio_uf_filter = True
status = models.IntegerField(choices=STATUS_CHOICES, default=1, blank=1) casa_legislativa.convenio_cl_tipo_filter = True
prioridade = models.IntegerField(choices=PRIORITY_CHOICES, default=3, blank=3) data_criacao = models.DateField(u'Data de criação', null=True, blank=True, auto_now_add=True)
descricao = models.TextField(u'descirção', blank=True, null=True) data_modificacao = models.DateField(u'Data de modificação', null=True, blank=True, auto_now=True)
resolucao = models.TextField(u'resolução', blank=True, null=True) categoria = models.ForeignKey(Categoria, verbose_name=u'Categoria')
responsavel = models.ForeignKey('servidores.Servidor', blank=True, null=True, verbose_name=u'responsável') assunto = models.CharField(u'Assunto', max_length=200)
assunto.grupo_filter = True
status = models.IntegerField(u'Status', choices=STATUS_CHOICES, default=1,)
status.multichoice_filter = True
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', verbose_name=u"Servidor que registrou a ocorrência")
setor_responsavel = models.ForeignKey('servidores.Servico', verbose_name=u"Setor responsável")
class Meta: class Meta:
verbose_name, verbose_name_plural = u'ocorrência', u'ocorrências' 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': str(self.casa_legislativa)}
class Comentario(models.Model): class Comentario(models.Model):
ocorrencia = models.ForeignKey(Ocorrencia, verbose_name=u'ocorrência') ocorrencia = models.ForeignKey(Ocorrencia, verbose_name=u'Ocorrência')
data_criacao = models.DateTimeField(u'data de criação', default = datetime.now()) data_criacao = models.DateTimeField(u'Data de criação', null=True, blank=True, auto_now_add=True)
descricao = models.TextField(u'descirção', blank=True, null=True) descricao = models.TextField(u'Descrição', blank=True, null=True)
usuario = models.ForeignKey('servidores.Servidor', blank=True, null=True, verbose_name=u'usuário') usuario = models.ForeignKey('servidores.Servidor', 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', verbose_name=u'Encaminhar para setor', blank=True, null=True)
class Anexo(models.Model): class Anexo(models.Model):
ocorrencia = models.ForeignKey(Ocorrencia, verbose_name=u'ocorrência') ocorrencia = models.ForeignKey(Ocorrencia, verbose_name=u'ocorrência')
arquivo = models.FileField(upload_to='apps/ocorrencia/anexo/arquivo',) arquivo = models.FileField(u'Arquivo anexado', upload_to='apps/ocorrencia/anexo/arquivo',)
descricao = models.CharField('descrição', max_length='70') descricao = models.CharField(u'descrição do anexo', max_length='70')
data_pub = models.DateTimeField( data_pub = models.DateTimeField( u'data da publicação do anexo', null=True, blank=True, auto_now_add=True)
'data da publicação do anexo',
default=datetime.now
)
class Meta: class Meta:
ordering = ('-data_pub',) ordering = ('-data_pub',)
verbose_name, verbose_name_plural = u'Anexo', u'Anexos'
def __unicode__(self): def __unicode__(self):
return unicode(self.arquivo.name) return u"%(arquivo_name)s: %(descricao)s" % {'arquivo_name': self.arquivo.name, 'descricao': self.descricao}

Loading…
Cancel
Save