Conjunto de mudanças 5885 no repositório publico


Ignorar:
Timestamp:
13/12/2011 12:09:45 (9 anos atrás)
Autor:
felipevieira
Mensagem:

Realease com funcionalidades de diagnosticos e recursos humanos. Merge do branch diagnosticos.

Localização:
SIGI/trunk
Arquivos:
54 adicionados
16 editados

Legenda:

Não Modificado
Adicionado
Removido
  • SIGI/trunk/sigi/admin/filterspecs.py

    r4539 r5885  
    1 from django.contrib.admin.filterspecs import FilterSpec, ChoicesFilterSpec
     1from django.contrib.admin.filterspecs import FilterSpec, ChoicesFilterSpec, BooleanFieldFilterSpec
    22from django.utils.encoding import smart_unicode
    33from django.utils.safestring import mark_safe
     
    55from sigi.apps.contatos.models import UnidadeFederativa
    66from abc import ABCMeta
     7
     8class IsActiveFilterSpec(BooleanFieldFilterSpec):
     9    """
     10    Adds filtering by user is_active attr in the admin filter sidebar
     11    my_model_user_field.is_active__filter = True
     12    """
     13
     14    def __init__(self, f, request, params, model, model_admin):
     15        super(IsActiveFilterSpec, self).__init__(f, request, params, model,
     16                                                   model_admin)
     17        self.lookup_kwarg = '%s__is_active__exact' % f.name
     18        self.lookup_kwarg2 = '%s__is_active__isnull' % f.name
     19        self.lookup_val = request.GET.get(self.lookup_kwarg, None)
     20        self.lookup_val2 = request.GET.get(self.lookup_kwarg2, None)
     21
     22    def title(self):
     23        return _('active')
     24
     25# registering the filter
     26FilterSpec.filter_specs.insert(0, (lambda f: getattr(f, 'is_active__filter', False),
     27                                   IsActiveFilterSpec))
    728
    829class AlphabeticFilterSpec(ChoicesFilterSpec):
  • SIGI/trunk/sigi/apps/casas/admin.py

    r5012 r5885  
    33from django.contrib.contenttypes import generic
    44from sigi.apps.casas.forms import CasaLegislativaForm
    5 from sigi.apps.casas.models import CasaLegislativa
    6 from sigi.apps.contatos.models import Contato, Telefone
     5from sigi.apps.casas.models import CasaLegislativa, Presidente, Funcionario
     6from sigi.apps.contatos.models import Telefone
    77from sigi.apps.convenios.models import Projeto, Convenio, EquipamentoPrevisto, Anexo
    88from django.http import HttpResponse, HttpResponseRedirect
     
    1414from sigi.apps.utils import queryset_ascii
    1515
    16 class ContatosInline(generic.GenericTabularInline):
    17     model = Contato
    18     extra = 2
    19     raw_id_fields = ('municipio',)
    20 
    2116class TelefonesInline(generic.GenericTabularInline):
    2217    model = Telefone
    23     extra = 2
     18    extra = 1
     19
     20class PresidenteInline(admin.StackedInline):
     21    model = Presidente
     22    exclude = ['cargo','funcao']
     23    extra = 1
     24    max_num = 1
     25    inlines = (TelefonesInline)
     26
     27class FuncionariosInline(admin.StackedInline):
     28    model = Funcionario
     29    extra = 1
     30    inlines = (TelefonesInline)
     31    def queryset(self, request):
     32        return self.model.objects.exclude(cargo="Presidente")
    2433
    2534class ConveniosInline(admin.TabularInline):
     
    3342    change_list_template = 'casas/change_list.html'
    3443    actions = ['adicionar_casas',]
    35     inlines = (TelefonesInline, ContatosInline, ConveniosInline)
    36     list_display = ('nome','municipio','presidente','logradouro')
     44    inlines = (TelefonesInline, PresidenteInline, FuncionariosInline, ConveniosInline)
     45    list_display = ('nome','municipio','logradouro')
    3746    list_display_links = ('nome',)
    3847    list_filter = ('tipo', 'municipio')
     
    4150    fieldsets = (
    4251        (None, {
    43             'fields': ('tipo', 'nome', 'telefone', 'cnpj',
    44                        'presidente'),
     52            'fields': ('tipo', 'nome', 'cnpj',)
    4553        }),
    4654        ('Endereço', {
  • SIGI/trunk/sigi/apps/casas/forms.py

    r5358 r5885  
    11# -*- coding: utf-8 -*-
    22from django import forms
    3 from django.contrib.localflavor.br.forms import BRCNPJField, BRZipCodeField
     3from django.contrib.localflavor.br.forms import BRZipCodeField
    44from sigi.apps.casas.models import CasaLegislativa
     5
    56
    67class CasaLegislativaForm(forms.ModelForm):
     
    1516    class Meta:
    1617        model = CasaLegislativa
     18
     19    def clean(self):
     20        print self.cleaned_data['bairro']
  • SIGI/trunk/sigi/apps/casas/models.py

    r5621 r5885  
    22from django.db import models
    33from django.contrib.contenttypes import generic
    4 from sigi.apps.mesas.models import MesaDiretora, MembroMesaDiretora
    54from sigi.apps.parlamentares.models import Parlamentar
    65from sigi.apps.utils import SearchField
     
    3635    cnpj = models.CharField('CNPJ', max_length=32, blank=True)
    3736    observacoes = models.TextField(u'observações', blank=True)
    38     presidente = models.CharField('Presidente', max_length=150, blank=True)
    3937
    4038    # Informações de contato
     
    5755        verify_exists=False
    5856    )
    59     telefone = models.CharField('Telefone', max_length=100, blank=True)
    6057    telefones = generic.GenericRelation('contatos.Telefone')
    6158
     
    6966    foto_altura = models.SmallIntegerField(editable=False, null=True)
    7067
    71     contatos = generic.GenericRelation('contatos.Contato')
    7268
    7369    class Meta:
     
    7975    def __unicode__(self):
    8076        return self.nome
     77
     78class Funcionario(models.Model):
     79    """ Modelo para registrar contatos vinculados às
     80    Casas Legislativas
     81    """
     82    SETOR_CHOICES = [
     83        ("presidencia","Presidencia"),
     84        ("infraestrutura_fisica","Infraestrutura Física"),
     85        ("estrutura_de_ti","Estrutura de TI"),
     86        ("organizacao_do_processo_legislativo","Organização do Processo Legislativo"),
     87        ("estrutura_de_comunicacao_social","Estrutura de Comunicação Social"),
     88        ("estrutura_de_recursos_humanos","Estrutura de Recursos Humanos"),
     89        ("estrutura_de_recursos_humanos","Estrutura de Recursos Humanos"),
     90        ("estrutura_de_secretaria","Estrutura de Secretaria"),
     91        ("outros","Outros"),
     92        ]
     93    casa_legislativa = models.ForeignKey(CasaLegislativa)
     94    nome = models.CharField('nome completo', max_length=60, blank=True)
     95    nome.alphabetic_filter = True
     96    nota = models.CharField(max_length=70, null=True, blank=True)
     97    email = models.EmailField('e-mail', null=True, blank=True)
     98    telefones = generic.GenericRelation('contatos.Telefone')
     99    endereco = generic.GenericRelation('contatos.Endereco')
     100    cargo = models.CharField(max_length=100, null=True, blank=True)
     101    funcao = models.CharField(u'função', max_length=100, null=True, blank=True)
     102    setor = models.CharField(max_length=100, choices = SETOR_CHOICES, default="outros")
     103    tempo_de_servico = models.CharField(u'tempo de serviço', max_length=50, null=True, blank=True)
     104
     105    class Meta:
     106        ordering = ('nome',)
     107        verbose_name = 'contato Casa Legislativa'
     108        verbose_name_plural = 'contatos Casas Legislativa'
     109
     110    def __unicode__(self):
     111        return self.nome
     112
     113class PresidenteManager(models.Manager):
     114    def get_query_set(self):
     115        qs = super(PresidenteManager, self).get_query_set()
     116        qs = qs.filter(cargo='Presidente')
     117        return qs
     118
     119class Presidente(Funcionario):
     120    class Meta:
     121        proxy = True
     122
     123    objects =  PresidenteManager()
     124
     125    def save(self, *args, **kwargs):
     126        self.cargo = 'Presidente'
     127        self.setor = 'presidencia'
     128        return super(Presidente, self).save(*args, **kwargs)
  • SIGI/trunk/sigi/apps/contatos/admin.py

    r4687 r5885  
    3333
    3434class TelefoneAdmin(admin.ModelAdmin):
    35     list_display = ('codigo_area', 'numero', 'tipo', 'nota')
    36     list_display_links = ('codigo_area', 'numero')
    37     list_filter = ('codigo_area', 'tipo')
     35    list_display = ('numero', 'tipo', 'nota')
     36    list_display_links = ('numero',)
     37    list_filter = ('tipo',)
    3838    radio_fields = {'tipo': admin.VERTICAL}
    39     search_fields = ('codigo_area', 'numero', 'tipo', 'nota')
     39    search_fields = ('numero', 'tipo', 'nota')
    4040
    4141class ContatoAdmin(admin.ModelAdmin):
  • SIGI/trunk/sigi/apps/contatos/models.py

    r5621 r5885  
    117117        ('I', 'Indefinido'),
    118118    )
    119     codigo_area = models.CharField(
    120         'código de área',
    121         max_length=4,
    122         help_text='Exemplo: <em>31</em>.',
    123         blank=True
    124     )
    125119    numero = models.CharField(
    126120        'número',
    127121        max_length=64, # TODO: diminuir tamanho de campo após migração de dados
    128         help_text='Somente números.'
     122        help_text='Exemplo: <em>(31)8851-9898</em>.',
    129123    )
    130124    tipo = models.CharField(
    131125        max_length=1,
    132126        choices=TELEFONE_CHOICES,
    133     )
    134     nota = models.CharField(max_length=70, blank=True)
     127        default= 'I'
     128    )
     129    nota = models.CharField(max_length=70, null=True, blank=True)
    135130
    136131    # guarda o tipo do objeto (classe) vinculado a esse registro
     
    141136
    142137    class Meta:
    143         ordering = ('codigo_area', 'numero')
    144         # desabilitado para facilitar a migração de dados
    145         # TODO: voltar quando estiver em produção
    146         #unique_together = ('codigo_area', 'numero', 'tipo')
    147 
    148     def __unicode__(self):
    149         if self.codigo_area:
    150             return "(%s) %s" % (unicode(self.codigo_area), unicode(self.numero))
    151         else:
    152             return unicode(self.numero)
     138        ordering = ('numero',)
     139        unique_together = ('numero', 'tipo')
     140
     141    def __unicode__(self):
     142        return unicode(self.numero)
    153143
    154144class Contato(models.Model):
     
    273263
    274264    def __unicode__(self):
    275         return self.tipo + ' ' + seld.logradouro + ', ' + self.numero \
     265        return self.tipo + ' ' + self.logradouro + ', ' + self.numero \
    276266               + ' ' + self.complemento + ' - ' + self.bairro
    277267
  • SIGI/trunk/sigi/apps/diagnosticos/admin.py

    r5619 r5885  
    11# -*- coding: utf-8 -*-
     2from datetime import datetime
    23from django.contrib import admin
    34from eav.admin import BaseEntityAdmin, BaseSchemaAdmin
    4 from sigi.apps.diagnosticos.models import Diagnostico, Pergunta, Escolha, Equipe, Anexo
     5from sigi.apps.diagnosticos.models import Diagnostico, Pergunta, Escolha, Equipe, Anexo, Categoria
    56from sigi.apps.diagnosticos.forms import DiagnosticoForm
     7
     8
     9"""
     10Actions do Admin
     11"""
     12def publicar_diagnostico(self, request, queryset):
     13    for registro in queryset:
     14        diagnostico = Diagnostico.objects.get(pk=registro.id)
     15        diagnostico.publicado = True
     16        diagnostico.data_publicacao= datetime.now()
     17        diagnostico.save()
     18
     19        # Enviando o email avisando que o diagnóstico foi publicado
     20        diagnostico.email_diagnostico_publicado(diagnostico.responsavel.email_pessoal, request.get_host())
     21    self.message_user(request, "Diagnóstico(s) publicado(s) com sucesso!")
     22publicar_diagnostico.short_description = u"""
     23    Definir diagnósticos como publicado"""
     24
     25
     26def despublicar_diagnostico(self, request, queryset):
     27    queryset.update(publicado=False)
     28despublicar_diagnostico.short_description = u"""
     29    Definir diagnósticos como não publicado"""
     30
    631
    732class EquipeInline(admin.TabularInline):
    833    model = Equipe
    9     extra = 4
    1034
    1135class AnexosInline(admin.TabularInline):
    1236    model = Anexo
    1337    extra = 2
    14     exclude = ['data_pub',]
     38    exclude = ['data_pub', ]
     39
    1540
    1641class AnexoAdmin(admin.ModelAdmin):
    1742    date_hierarchy = 'data_pub'
    18     exclude = ['data_pub',]
     43    exclude = ['data_pub', ]
    1944    list_display = ('arquivo', 'descricao', 'data_pub', 'diagnostico')
    2045    raw_id_fields = ('diagnostico',)
     
    2247                     'diagnostico__casa_legislativa__nome')
    2348
     49
    2450class DiagnosticoAdmin(BaseEntityAdmin):
    2551    form = DiagnosticoForm
     52    actions = [publicar_diagnostico, despublicar_diagnostico]
    2653    inlines = (EquipeInline, AnexosInline)
     54    search_fields = ('casa_legislativa__nome', 'responsavel',)
     55    list_display = ('casa_legislativa', 'data_visita_inicio', 'data_visita_fim', 'responsavel', 'publicado')
     56    list_filter  = ('publicado', 'data_publicacao', 'data_visita_inicio', 'data_visita_fim')
    2757    raw_id_fields = ('casa_legislativa',)
    2858
     59    eav_fieldsets = [
     60        (u'00. Identificação do Diagnóstico', {'fields': ('responsavel', 'data_visita_inicio', 'data_visita_fim',)}),
     61        (u'01. Identificação da Casa Legislativa', {'fields': ('casa_legislativa',)}),
     62        (u'02. Identificação de Competências da Casa Legislativa', {'fields': ()})
     63      ]
     64
     65    # popula o eav fieldsets ordenando as categorias e as perguntas
     66    # para serem exibidas no admin
     67    for categoria in Categoria.objects.all():
     68        # ordena as perguntas pelo title e utiliza o name no fieldset
     69        perguntas_by_title = [(p.title, p.name) for p in categoria.perguntas.all()]
     70        perguntas = [pergunta[1] for pergunta in sorted(perguntas_by_title)]
     71
     72        eav_fieldsets.append((categoria, {
     73          'fields': tuple(perguntas),
     74          'classes': ['collapse']
     75          }))
     76
     77
     78class PerguntaAdmin (BaseSchemaAdmin):
     79    search_fields = ('title', 'help_text', 'name',)
     80    list_display = ('title', 'categoria', 'datatype', 'help_text', 'required')
     81    list_filter = ('datatype', 'categoria', 'required')
     82
     83
     84class EscolhaAdmin(admin.ModelAdmin):
     85    search_fields = ('title',)
     86    list_display = ('title', 'schema', 'schema_to_open')
     87    raw_id_fields = ('schema', 'schema_to_open')
     88    ordering = ('schema', 'title')
     89
    2990admin.site.register(Diagnostico, DiagnosticoAdmin)
    30 admin.site.register(Pergunta, BaseSchemaAdmin)
    31 admin.site.register(Escolha)
     91admin.site.register(Pergunta, PerguntaAdmin)
     92admin.site.register(Escolha, EscolhaAdmin)
    3293admin.site.register(Anexo, AnexoAdmin)
     94admin.site.register(Categoria)
  • SIGI/trunk/sigi/apps/diagnosticos/forms.py

    r5619 r5885  
    1 from models import Diagnostico
     1# -*- coding: utf8 -*-
     2
     3from copy import deepcopy
     4from django import forms
     5from django.forms.forms import BoundField
     6from django.forms import (BooleanField, CharField, DateField,
     7                          FloatField, ModelChoiceField, Textarea,
     8                          ModelMultipleChoiceField)
     9from django.contrib.contenttypes.generic import generic_inlineformset_factory
     10from sigi.apps.casas.models import CasaLegislativa, Funcionario
     11from sigi.apps.contatos.models import Telefone
     12from sigi.apps.diagnosticos.models import Diagnostico
     13from sigi.apps.diagnosticos.widgets import EavCheckboxSelectMultiple, EavRadioSelect
    214from eav.forms import BaseDynamicEntityForm
     15from eav.fields import RangeField
    316
    417class DiagnosticoForm(BaseDynamicEntityForm):
     18    """Classe responsável por contruir o formulário,
     19    vinculando ao modelo Diagnostico
     20    """
    521    model = Diagnostico
     22
     23
     24class DiagnosticoMobileForm(BaseDynamicEntityForm):
     25    """Classe responsável por construir o formulário
     26    para ser usado no ambiente mobile, a partir do
     27    do modelo Diagnostico, como também organizar sua
     28    estrutura via categorias.
     29    """
     30
     31    FIELD_CLASSES = {
     32        'text': CharField,
     33        'float': FloatField,
     34        'date': DateField,
     35        'bool': BooleanField,
     36        'one': ModelChoiceField,
     37        'many': ModelMultipleChoiceField,
     38        'range': RangeField,
     39    }
     40
     41    FIELD_EXTRA = {
     42        'one': {'widget': EavRadioSelect},
     43        'many': {'widget': EavCheckboxSelectMultiple},
     44    }
     45
     46    FIELD_WIDGET = {
     47        'consideracoes_gerais' : {'widget': Textarea},
     48        'descreva_5_cursos_prioritarios_para_treinamento_de_parlamentares_da_camara_municipal' : {'widget': Textarea},
     49        'descreva_5_cursos_prioritarios_para_treinamento_de_servidores_da_camara_municipal' : {'widget': Textarea},
     50        'sugestoes_para_a_area_de_capacitacao' : {'widget': Textarea},
     51        'sugestoes_para_a_area_de_comunicacao' : {'widget': Textarea},
     52        'sugestoes_para_a_area_de_informacao' : {'widget': Textarea},
     53        'sugestoes_para_a_area_de_ti' : {'widget': Textarea},
     54    }
     55    class Meta:
     56        model = Diagnostico
     57
     58    def __init__(self, data=None, category=None, *args, **kwargs):
     59        super(BaseDynamicEntityForm, self).__init__(data, *args, **kwargs)
     60        self._build_dynamics_fields(category)
     61
     62    def __iter__(self):
     63        # ordena os campos do formulario usando o atributo label
     64        fields_by_label = [(field.label, name, field) for name, field in self.fields.items()]
     65        for label, name, field in sorted(fields_by_label):
     66            yield BoundField(self, field, name)
     67
     68    def _build_dynamics_fields(self, category):
     69        """Método da classe ``BaseDynamicEntityForm`` sobrescrita,
     70        para que as perguntas sejam agrupadas dentro das suas
     71        categorias.
     72            * category = ID da Categoria
     73        """
     74        # Caso seja as duas primeiras categorias, utilize
     75        # os campos do modelo
     76        if int(category) in (0, 1, ):
     77            self.fields = deepcopy(self.base_fields)
     78        else:
     79            self.fields = dict()
     80
     81        # Se determinada pergunta é da categoria pesquisada,
     82        # então, gere o campo no formulário.
     83        for schema in self.instance.get_schemata():
     84
     85            if not schema.categoria_id == int(category):
     86                continue
     87
     88            defaults = {
     89                'label':     schema.title,
     90                'required':  schema.required,
     91                'help_text': schema.help_text,
     92            }
     93
     94            datatype = schema.datatype
     95            if datatype == schema.TYPE_MANY:
     96                choices = getattr(self.instance, schema.name)
     97                defaults.update({'queryset': schema.get_choices(),
     98                                 'initial': [x.pk for x in choices]})
     99            elif datatype == schema.TYPE_ONE:
     100                choice = getattr(self.instance, schema.name)
     101                defaults.update({'queryset': schema.get_choices(),
     102                                 'initial': choice.pk if choice else None,
     103                                 # if schema is required remove --------- from ui
     104                                 'empty_label': None if schema.required else u"---------"})
     105
     106            extra = self.FIELD_EXTRA.get(datatype, {})
     107            extra.update(self.FIELD_WIDGET.get(schema.name, {}))
     108            if hasattr(extra, '__call__'):
     109                extra = extra(schema)
     110            defaults.update(extra)
     111
     112            MappedField = self.FIELD_CLASSES[datatype]
     113            self.fields[schema.name] = MappedField(**defaults)
     114
     115            # fill initial data (if attribute was already defined)
     116            value = getattr(self.instance, schema.name)
     117            if value and not datatype in (schema.TYPE_ONE, schema.TYPE_MANY):    # choices are already done above
     118                self.initial[schema.name] = value
     119
     120
     121class CasaLegislativaMobileForm(forms.ModelForm):
     122    class Meta:
     123        model = CasaLegislativa
     124        fields = ('cnpj', 'logradouro', 'bairro', 'cep', 'email', 'pagina_web')
     125
     126class TelefoneMobileForm(forms.ModelForm):
     127    pass
     128    class Meta:
     129        model = Telefone
     130        fields = ('numero', 'tipo')
     131
     132class FuncionariosMobileForm(forms.ModelForm):
     133    TelefoneFormSet = generic_inlineformset_factory(Telefone, TelefoneMobileForm, extra=1, can_delete=False)
     134
     135    def __init__(self, data=None, prefix=None, instance=None, *args, **kwargs):
     136        super(FuncionariosMobileForm, self).__init__(data, prefix=prefix, instance=instance, *args, **kwargs)
     137        self.telefones = self.TelefoneFormSet(data, prefix=prefix, instance=instance)
     138
     139    def is_valid(self):
     140        return self.telefones.is_valid() and super(FuncionariosMobileForm, self).is_valid()
     141
     142    def save(self, commit=True):
     143        self.telefones.save(commit)
     144        return super(FuncionariosMobileForm, self).save(commit)
     145
     146    class Meta:
     147        model = Funcionario
     148        fields = ('nome', 'email', 'cargo', 'funcao', 'tempo_de_servico')
  • SIGI/trunk/sigi/apps/diagnosticos/models.py

    r5622 r5885  
    22from datetime import datetime
    33from django.db import models
     4
     5from sigi.apps.casas.models import CasaLegislativa
    46from sigi.apps.utils import SearchField
     7from sigi.apps.utils.email import enviar_email
    58from eav.models import BaseChoice, BaseEntity, BaseSchema, BaseAttribute
     9
    610
    711class Diagnostico(BaseEntity):
     
    1115    casa_legislativa = models.ForeignKey(
    1216        'casas.CasaLegislativa',
    13         verbose_name='Casa Legislativa'
    14     )
     17        verbose_name='Casa Legislativa')
     18
    1519    # campo de busca em caixa baixa e sem acento
    1620    search_text = SearchField(field_names=['casa_legislativa'])
    1721    casa_legislativa.convenio_uf_filter = True
    1822    casa_legislativa.convenio_cl_tipo_filter = True
    19     data_visita = models.DateField(
    20         'data da visita',
     23    data_visita_inicio = models.DateField(
     24        u'data inicial da visita',
    2125        null=True,
    2226        blank=True,
    2327    )
    24     data_questionario = models.DateField(
    25         'data do questionario',
     28    data_visita_fim = models.DateField(
     29        u'data final da visita',
    2630        null=True,
    2731        blank=True,
    28         help_text='Convênio firmado.'
    2932    )
    30     data_relatorio_questionario = models.DateField(
    31         'data do relatório do questionario',
    32         null=True,
    33         blank=True
    34     )
    35     data_termo_aceite = models.DateField(
    36         'Equipadas',
     33    publicado = models.BooleanField(default=False)
     34    data_publicacao = models.DateField(
     35        u'data de publicação do diagnóstico',
    3736        null=True,
    3837        blank=True,
    39         help_text='Equipamentos recebidos.'
    4038    )
     39
     40    responsavel = models.ForeignKey('servidores.Servidor',
     41        verbose_name=u'responsável')
     42
    4143    class Meta:
    4244        verbose_name, verbose_name_plural = u'diagnóstico', u'diagnósticos'
     45
     46    @property
     47    def membros(self):
     48        """ Retorna a lista de membros do diagnostico,
     49        isto é responsavel + equipe
     50        """
     51        membros = set([self.responsavel])
     52        for equipe in self.equipe_set.all():
     53            membros.add(equipe.membro)
     54        return list(membros)
     55
     56    @property
     57    def contatos_respondidos(self):
     58        """Retorna uma lista de contatos que foram
     59        respondidos
     60        """
     61        return list(self.casa_legislativa.funcionario_set.all())
     62
     63    @property
     64    def categorias_respondidas(self):
     65        """ Retorna uma listas das categorias dinamicas que tem
     66        ao menos uma resposta
     67        """
     68        # unifica as categorias das perguntas dessas respostas
     69        categoria_com_respostas = set([r.schema.categoria for r in self._get_respostas()])
     70
     71        return list(categoria_com_respostas)
     72
     73    def _get_respostas(self):
     74        # obtem todas as respostas dinamicas desse diagnostico
     75        respostas = Resposta.objects.filter(entity_id=self.id).all()
     76
     77        # remove as respostas nulas ou em branco
     78        return [r for r in respostas if r._get_value()]
     79
     80    def email_diagnostico_publicado(self, from_email, host):
     81        """Enviando email quando o diagnóstico for publicado. Os
     82        argumentos acima são:
     83            * from_email - Email de remetente
     84            * host - O Host do sistema, para ser usado na
     85            construção do endereço do diagnóstico
     86        """
     87        enviar_email(from_email, u"Diagnóstico publicado",
     88            'diagnosticos/email_diagnostico_publicado.txt',
     89            {
     90                'responsavel': self.responsavel.nome_completo,
     91                'casa_legislativa': self.casa_legislativa,
     92                'data_diagnostico': self.data_questionario,
     93                'host': host,
     94                'url_diagnostico': self.get_absolute_url(),
     95                'status': u"Publicado",
     96            })
     97
     98    def email_diagnostico_alterado(self, from_email, host):
     99        """Enviando email quando o status do diagnóstico
     100        for alterado. Os argumentos acima são:
     101            * from_email - Email do destinatário
     102            * host - O Host do sistema, para ser usado na
     103            construção do endereço do diagnóstico
     104        """
     105        enviar_email(from_email, u"Diagnóstico alterado",
     106            'diagnosticos/email_diagnostico_alterado.txt',
     107            {
     108                'servidor': self.responsavel.nome_completo,
     109                'casa_legislativa': self.casa_legislativa,
     110                'data_diagnostico': self.data_questionario,
     111                'host': host,
     112                'url_diagnostico': self.get_absolute_url,
     113                'status': "Alterado",
     114            })
    43115
    44116    @classmethod
     
    47119
    48120    def __unicode__(self):
    49         return str(self.casa_legislativa)
     121        return str(self.casa_legislativa).decode('utf8')
     122
     123    def get_absolute_url(self):
     124        return "/sigi/diagnosticos/diagnostico/%i/" % (self.id, )
     125
    50126
    51127class Categoria(models.Model):
     
    53129    e sua ordem na hora de exibir no formulário
    54130    """
    55     nome= models.CharField(max_length=50)
    56     ordem = models.PositiveSmallIntegerField(blank=True, null=True)
     131    nome = models.CharField(max_length=255)
     132
     133    class Meta:
     134        ordering = ('nome',)
     135
     136    def __unicode__(self):
     137        return self.nome
     138
    57139
    58140class Pergunta(BaseSchema):
     
    62144    Uma pergunta tem o nome e o tipo da resposta
    63145    """
    64     categoria = models.ForeignKey(Categoria,blank=True, null=True)
    65     class Meta:
     146    categoria = models.ForeignKey(Categoria, related_name='perguntas')
     147
     148    class Meta:
     149        ordering = ('title',)
    66150        verbose_name, verbose_name_plural = 'pergunta', 'perguntas'
     151
    67152
    68153class Escolha(BaseChoice):
     
    70155    cadastradas neste modelo
    71156    """
    72     schema = models.ForeignKey(Pergunta, related_name='choices', verbose_name='pergunta')
     157    schema = models.ForeignKey(Pergunta,
     158        related_name='choices', verbose_name='pergunta')
     159    schema_to_open = models.ForeignKey(Pergunta, related_name='',
     160        verbose_name='pergunta para abrir', blank=True, null=True)
     161
    73162    class Meta:
    74163        verbose_name, verbose_name_plural = 'escolha', 'escolhas'
     164
    75165
    76166class Resposta(BaseAttribute):
     
    78168    de um diagnosico
    79169    """
    80     schema = models.ForeignKey(Pergunta, related_name='attrs', verbose_name='pergunta')
    81     choice = models.ForeignKey(Escolha, verbose_name='escolha', blank=True, null=True)
     170    schema = models.ForeignKey(Pergunta, related_name='attrs',
     171        verbose_name='pergunta')
     172    choice = models.ForeignKey(Escolha, verbose_name='escolha',
     173        blank=True, null=True)
     174
    82175    class Meta:
    83176        verbose_name, verbose_name_plural = 'resposta', 'respostas'
     177
    84178
    85179class Equipe(models.Model):
     
    88182    diagnostico = models.ForeignKey(Diagnostico)
    89183    membro = models.ForeignKey('servidores.Servidor')
    90     # verdadeiro se o servidor é repsonsável por chefiar a equipe
    91     is_chefe = models.BooleanField()
    92 
    93     def __unicode__(self):
    94         return str(self.id)
     184
     185    class Meta:
     186        verbose_name, verbose_name_plural = 'equipe', 'equipe'
     187
     188    def __unicode__(self):
     189        return str(self.membro)
     190
    95191
    96192class Anexo(models.Model):
     
    101197    arquivo = models.FileField(upload_to='apps/diagnostico/anexo/arquivo',)
    102198    descricao = models.CharField('descrição', max_length='70')
    103     data_pub = models.DateTimeField(
    104         'data da publicação do anexo',
    105         default=datetime.now
    106     )
     199    data_pub = models.DateTimeField('data da publicação do anexo',
     200        default=datetime.now)
    107201
    108202    class Meta:
     
    111205    def __unicode__(self):
    112206        return unicode(self.arquivo.name)
    113 
  • SIGI/trunk/sigi/apps/servicos/models.py

    r5388 r5885  
    22from django.db import models
    33from django.contrib.contenttypes import generic
    4 from apps.casas.models import CasaLegislativa
     4from sigi.apps.casas.models import CasaLegislativa
    55from datetime import date
    66
  • SIGI/trunk/sigi/apps/servidores/admin.py

    r5621 r5885  
    22from django.contrib import admin
    33from django.contrib.contenttypes import generic
     4
     5from sigi.apps.utils.admin_widgets import AdminImageWidget
    46from sigi.apps.servidores.models import Servidor, Funcao, Licenca, Ferias
    57from sigi.apps.contatos.models import Endereco, Telefone
    6 
    7 class FuncaoInline(admin.TabularInline):
    8     model = Funcao
    9     extra = 1
     8from sigi.apps.servidores.forms import FeriasForm, LicencaForm, FuncaoForm
    109
    1110class FuncaoAdmin(admin.ModelAdmin):
     11    form = FuncaoForm
    1212    list_display = ('servidor', 'funcao', 'cargo','inicio_funcao', 'fim_funcao')
    1313    list_filter  = ('inicio_funcao', 'fim_funcao')
     
    1717                     'servidor__user__last_name', 'servidor__user__username')
    1818
    19 class FeriasInline(admin.TabularInline):
    20     model = Ferias
    21     extra = 1
    22 
    2319class FeriasAdmin(admin.ModelAdmin):
     20    form = FeriasForm
    2421    list_display = ('servidor', 'inicio_ferias', 'fim_ferias')
    25     list_filter  = ('servidor', 'inicio_ferias', 'fim_ferias')
     22    list_filter  = ('inicio_ferias', 'fim_ferias')
    2623    search_fields = ('obs',
    27                      'servidor__nome_completo', 'servidor__obs', 'servidor__apontamentos',
    28                      'servidor__user__email', 'servidor__user__first_name',
    29                      'servidor__user__last_name', 'servidor__user__username')
    30 
    31 class LicencaInline(admin.TabularInline):
    32     model = Licenca
    33     extra = 1
     24                     'servidor__nome_completo', 'servidor__email_pesoal',
     25                     'servidor__user__email', 'servidor__user__username')
    3426
    3527class LicencaAdmin(admin.ModelAdmin):
     28    form = LicencaForm
    3629    list_display = ('servidor', 'inicio_licenca', 'fim_licenca')
    3730    list_filter  = ('servidor', 'inicio_licenca', 'fim_licenca')
    3831    search_fields = ('obs',
    39                      'servidor__nome_completo', 'servidor__obs', 'servidor__apontamentos',
    40                      'servidor__user__email', 'servidor__user__first_name',
    41                      'servidor__user__last_name', 'servidor__user__username')
     32                     'servidor__nome_completo', 'servidor__email_pesoal',
     33                     'servidor__user__email', 'servidor__user__username')
    4234
    43 class EnderecoInline(generic.GenericTabularInline):
     35class EnderecoInline(generic.GenericStackedInline):
    4436    model = Endereco
    45     extra = 1
     37    extra = 0
    4638    raw_id_fields = ('municipio',)
    4739
     
    5143
    5244class ServidorAdmin(admin.ModelAdmin):
    53     list_display = ('nome_completo', 'servico')
    54     list_filter  = ('sexo', 'servico')
     45
     46    def is_active(self, servidor):
     47        return servidor.user.is_active
     48    is_active.admin_order_field = 'is_active'
     49    is_active.boolean = True
     50    is_active.short_description = 'ativo'
     51
     52    def queryset(self, request):
     53        qs = super(ServidorAdmin, self).queryset(request)
     54        qs = qs.extra(select={'is_active': """
     55              SELECT auth_user.is_active
     56              FROM auth_user
     57              WHERE auth_user.id = servidores_servidor.user_id
     58            """})
     59        return qs
     60
     61    list_display = ('nome_completo', 'is_active', 'foto', 'servico')
     62    list_filter  = ('user', 'sexo', 'servico',)
    5563    search_fields = ('nome_completo', 'obs', 'apontamentos',
    5664                     'user__email', 'user__first_name',
     
    6371      }),
    6472      ('Cadastro', {
    65         'fields': ('nome_completo', 'foto', 'email_pessoal', 'rg', 'cpf', 'sexo', 'data_nascimento', 'matricula', 'ramal')
     73        'fields': ('nome_completo', 'foto', 'email_pessoal', 'rg', 'cpf', 'sexo', 'data_nascimento', 'matricula', 'ramal', 'data_nomeacao', 'ato_numero', 'ato_exoneracao')
    6674      }),
    6775      ('Origem', {
    68         'fields': ('turno',),
     76        'fields': ('turno', 'de_fora'),
    6977      }),
    7078      (u'Observações', {
    7179        'fields': ('apontamentos', 'obs'),
    7280      }),
    73       #('Advanced options', {
    74       #  'classes': ('collapse',),
    75       #  'fields': ('enable_comments', 'registration_required', 'template_name')
    76       #}),
    7781    )
     82
     83    def formfield_for_dbfield(self, db_field, **kwargs):
     84        if db_field.name == 'foto':
     85            request = kwargs.pop("request", None)
     86            kwargs['widget'] = AdminImageWidget
     87            return db_field.formfield(**kwargs)
     88        return super(ServidorAdmin,self).formfield_for_dbfield(db_field, **kwargs)
    7889
    7990admin.site.register(Servidor, ServidorAdmin)
  • SIGI/trunk/sigi/apps/servidores/models.py

    r5621 r5885  
    11# -*- coding: utf-8 -*-
    22from django.db import models
     3from django.db.models.signals import post_save
    34from django.contrib.contenttypes import generic
    45from django.contrib.auth.models import User
     
    89    """
    910
    10     nome = models.CharField(max_length=50)
    11     sigla = models.CharField(max_length=10)
     11    nome = models.CharField(max_length=250, null=True)
     12    sigla = models.CharField(max_length=10, null=True)
    1213    # servidor responsavel por dirigir a Subsecretaria
    13     responsavel = models.ForeignKey('servidores.Servidor', related_name='diretor')
     14    responsavel = models.ForeignKey('servidores.Servidor', related_name='diretor', null=True)
    1415
    1516    class Meta:
     
    2324    """
    2425
    25     nome = models.CharField(max_length=50)
    26     sigla = models.CharField(max_length=10)
    27     subsecretaria = models.ForeignKey(Subsecretaria)
     26    nome = models.CharField(max_length=250, null=True)
     27    sigla = models.CharField(max_length=10, null=True)
     28    subsecretaria = models.ForeignKey(Subsecretaria, null=True)
    2829    # servidor responsavel por chefiar o serviço
    29     responsavel = models.ForeignKey('servidores.Servidor', related_name='chefe')
     30    responsavel = models.ForeignKey('servidores.Servidor', related_name='chefe', null=True)
    3031
    3132    class Meta:
     
    5758    # usuario responsavel pela autenticação do servidor no sistema
    5859    user = models.ForeignKey(User, unique=True)
     60    user.is_active__filter = True
    5961    nome_completo = models.CharField(max_length=128)
    6062    nome_completo.alphabetic_filter = True
     
    8890        null=True,
    8991    )
     92    de_fora = models.BooleanField(default=False)
    9093    data_nomeacao = models.DateField(u'data de nomeação', blank=True, null=True)
    9194    ato_exoneracao = models.CharField(u'ato de exoneração',max_length=150, blank=True, null=True)
     95    ato_numero = models.CharField(u'ato de exoneração',max_length=150, blank=True, null=True)
    9296    cpf = models.CharField('CPF', max_length=11, blank=True, null=True)
    9397    rg = models.CharField('RG', max_length=25, blank=True, null=True)
     
    96100
    97101    # Informações de contato
    98     email_pessoal = models.EmailField('e-mail pessoal', blank=True, null=True)
     102    email_pessoal = models.EmailField('email pessoal', blank=True, null=True)
    99103    endereco = generic.GenericRelation('contatos.Endereco')
    100104    telefones = generic.GenericRelation('contatos.Telefone')
    101     ramal = models.IntegerField('ramal', blank=True, null=True)
     105    ramal = models.CharField(max_length=25, blank=True, null=True)
    102106
    103107    class Meta:
     
    105109        verbose_name_plural = 'servidores'
    106110
    107     def is_chefe():
     111    def is_chefe(self):
    108112      """ Verifica se o servidor é chefe ou diretor
    109113      """
    110114      pass
    111115
    112     def data_entrada():
     116    def data_entrada(self):
    113117      """ Verifica a data de entrada da função mais antiga
    114118      """
    115119      pass
    116120
    117     def data_saida():
     121    def data_saida(self):
    118122      """ Verifica a data de saída da função mais recente
    119123      de um servidor desativado
     
    123127      pass
    124128
     129    @property
     130    def diagnosticos(self):
     131        """ Retorna todos os diagnosticos que este servidor
     132        participa, isto é, como responsavel ou parte da equipe
     133        """
     134        diagnosticos = set(self.diagnostico_set.filter(publicado=True).all())
     135
     136        for equipe in self.equipe_set.all():
     137            diagnosticos.add(equipe.diagnostico)
     138
     139        return list(diagnosticos)
     140
    125141    def __unicode__(self):
    126142        return self.nome_completo
     143
     144# Soluçao alternativa para extender o usuário do django
     145# Acessa do servidor de um objeto user criando um profile
     146# baseado nos dados do LDAP
     147User.servidor = property(lambda user: Servidor.objects.get(user=user))
     148
     149# Sinal para ao criar um usuário criar um servidor
     150# baseado no nome contino no LDAP
     151def create_user_profile(sender, instance, created, **kwargs):
     152    if created:
     153        Servidor.objects.create(
     154              user=instance,
     155              nome_completo= "%s %s" % (instance.first_name, instance.last_name)
     156            )
     157
     158post_save.connect(create_user_profile, sender=User)
    127159
    128160class Funcao(models.Model):
     
    131163    """
    132164    servidor = models.ForeignKey(Servidor)
    133     funcao = models.CharField(max_length=50)
    134     cargo = models.CharField(max_length=50, blank=True, null=True)
    135     inicio_funcao = models.DateField(u'início da função')
     165    funcao = models.CharField(max_length=250, null=True)
     166    cargo = models.CharField(max_length=250, null=True)
     167    inicio_funcao = models.DateField(u'início da função', null=True)
    136168    fim_funcao = models.DateField(u'fim da função', blank=True, null=True)
    137169    descricao = models.TextField(u'descrição', blank=True, null=True)
  • SIGI/trunk/sigi/fixtures/treemenus/initial_data.json

    r5754 r5885  
    1 [{"pk": 1, "model": "treemenus.menuitem", "fields": {"parent": null, "level": 0, "url": "", "menu": 1, "rank": 0, "caption": "Root", "named_url": ""}}, {"pk": 26, "model": "treemenus.menuitem", "fields": {"parent": null, "level": 0, "url": "", "menu": 2, "rank": 0, "caption": "Root", "named_url": ""}}, {"pk": 27, "model": "treemenus.menuitem", "fields": {"parent": null, "level": 0, "url": "", "menu": 3, "rank": 0, "caption": "Root", "named_url": ""}}, {"pk": 32, "model": "treemenus.menuitem", "fields": {"parent": 27, "level": 1, "url": "/sites/site/", "menu": 3, "rank": 2, "caption": "Sites", "named_url": ""}}, {"pk": 24, "model": "treemenus.menuitem", "fields": {"parent": 23, "level": 2, "url": "/sigi/contatos/municipio/", "menu": 1, "rank": 0, "caption": "Munic\u00edpios", "named_url": ""}}, {"pk": 25, "model": "treemenus.menuitem", "fields": {"parent": 23, "level": 2, "url": "/sigi/contatos/unidadefederativa/", "menu": 1, "rank": 1, "caption": "Unidades Federativas", "named_url": ""}}, {"pk": 30, "model": "treemenus.menuitem", "fields": {"parent": 27, "level": 1, "url": "/sigi/auth/", "menu": 3, "rank": 0, "caption": "Usu\u00e1rios & Grupos", "named_url": ""}}, {"pk": 28, "model": "treemenus.menuitem", "fields": {"parent": 26, "level": 1, "url": "/sigi/password_change/", "menu": 2, "rank": 0, "caption": "Alterar senha", "named_url": ""}}, {"pk": 29, "model": "treemenus.menuitem", "fields": {"parent": 26, "level": 1, "url": "/sigi/logout/", "menu": 2, "rank": 1, "caption": "Encerrar sess\u00e3o", "named_url": ""}}, {"pk": 31, "model": "treemenus.menuitem", "fields": {"parent": 27, "level": 1, "url": "/sigi/treemenus/menu/", "menu": 3, "rank": 1, "caption": "Menus", "named_url": ""}}, {"pk": 33, "model": "treemenus.menuitem", "fields": {"parent": 3, "level": 2, "url": "/sigi/casas/casalegislativa/", "menu": 1, "rank": 0, "caption": "Todas", "named_url": ""}}, {"pk": 35, "model": "treemenus.menuitem", "fields": {"parent": 3, "level": 2, "url": "/sigi/casas/casalegislativa/?tipo__id__exact=2", "menu": 1, "rank": 2, "caption": "Assembl\u00e9ias Legislativas", "named_url": ""}}, {"pk": 34, "model": "treemenus.menuitem", "fields": {"parent": 3, "level": 2, "url": "/sigi/casas/casalegislativa/?tipo__id__exact=1", "menu": 1, "rank": 1, "caption": "C\u00e2maras Municipais", "named_url": ""}}, {"pk": 37, "model": "treemenus.menuitem", "fields": {"parent": 36, "level": 2, "url": "/sigi/inventario/bem/", "menu": 1, "rank": 0, "caption": "Bens", "named_url": ""}}, {"pk": 38, "model": "treemenus.menuitem", "fields": {"parent": 36, "level": 2, "url": "/sigi/inventario/fornecedor/", "menu": 1, "rank": 1, "caption": "Fornecedores", "named_url": ""}}, {"pk": 39, "model": "treemenus.menuitem", "fields": {"parent": 36, "level": 2, "url": "/sigi/inventario/equipamento/", "menu": 1, "rank": 2, "caption": "Equipamentos", "named_url": ""}}, {"pk": 40, "model": "treemenus.menuitem", "fields": {"parent": 36, "level": 2, "url": "/sigi/inventario/fabricante/", "menu": 1, "rank": 3, "caption": "Fabricantes", "named_url": ""}}, {"pk": 41, "model": "treemenus.menuitem", "fields": {"parent": 36, "level": 2, "url": "/sigi/inventario/tipoequipamento/", "menu": 1, "rank": 4, "caption": "Tipos de equipamentos", "named_url": ""}}, {"pk": 42, "model": "treemenus.menuitem", "fields": {"parent": 36, "level": 2, "url": "/sigi/inventario/modeloequipamento/", "menu": 1, "rank": 5, "caption": "Modelos de equipamentos", "named_url": ""}}, {"pk": 2, "model": "treemenus.menuitem", "fields": {"parent": 1, "level": 1, "url": "/sigi", "menu": 1, "rank": 0, "caption": "Gr\u00e1ficos", "named_url": ""}}, {"pk": 23, "model": "treemenus.menuitem", "fields": {"parent": 1, "level": 1, "url": "/sigi/contatos/municipio/", "menu": 1, "rank": 1, "caption": "Munic\u00edpios", "named_url": ""}}, {"pk": 3, "model": "treemenus.menuitem", "fields": {"parent": 1, "level": 1, "url": "/sigi/casas/casalegislativa/", "menu": 1, "rank": 2, "caption": "Casas Legislativas", "named_url": ""}}, {"pk": 14, "model": "treemenus.menuitem", "fields": {"parent": 1, "level": 1, "url": "/sigi/convenios/convenio/", "menu": 1, "rank": 3, "caption": "Conv\u00eanios", "named_url": ""}}, {"pk": 36, "model": "treemenus.menuitem", "fields": {"parent": 1, "level": 1, "url": "/sigi/inventario/bem/", "menu": 1, "rank": 4, "caption": "Invent\u00e1rio", "named_url": ""}}, {"pk": 1, "model": "treemenus.menu", "fields": {"root_item": 1, "name": "Barra de navega\u00e7\u00e3o"}}, {"pk": 2, "model": "treemenus.menu", "fields": {"root_item": 26, "name": "Usu\u00e1rio"}}, {"pk": 3, "model": "treemenus.menu", "fields": {"root_item": 27, "name": "Administrador"}}]
     1[{"pk": 2, "model": "treemenus.menuitem", "fields": {"parent": 1, "level": 1, "url": "/sigi/", "menu": 1, "rank": 0, "caption": "Gr\u00e1ficos", "named_url": ""}}, {"pk": 55, "model": "treemenus.menuitem", "fields": {"parent": 54, "level": 2, "url": "/sigi/servidores/servidor/", "menu": 1, "rank": 0, "caption": "Pessoal", "named_url": ""}}, {"pk": 58, "model": "treemenus.menuitem", "fields": {"parent": 54, "level": 2, "url": "/sigi/servidores/licenca/", "menu": 1, "rank": 3, "caption": "Licen\u00e7as", "named_url": ""}}, {"pk": 1, "model": "treemenus.menuitem", "fields": {"parent": null, "level": 0, "url": "", "menu": 1, "rank": 0, "caption": "Root", "named_url": ""}}, {"pk": 26, "model": "treemenus.menuitem", "fields": {"parent": null, "level": 0, "url": "", "menu": 2, "rank": 0, "caption": "Root", "named_url": ""}}, {"pk": 27, "model": "treemenus.menuitem", "fields": {"parent": null, "level": 0, "url": "", "menu": 3, "rank": 0, "caption": "Root", "named_url": ""}}, {"pk": 24, "model": "treemenus.menuitem", "fields": {"parent": 23, "level": 2, "url": "/sigi/contatos/municipio/", "menu": 1, "rank": 0, "caption": "Munic\u00edpios", "named_url": ""}}, {"pk": 25, "model": "treemenus.menuitem", "fields": {"parent": 23, "level": 2, "url": "/sigi/contatos/unidadefederativa/", "menu": 1, "rank": 1, "caption": "Unidades Federativas", "named_url": ""}}, {"pk": 30, "model": "treemenus.menuitem", "fields": {"parent": 27, "level": 1, "url": "/sigi/auth/", "menu": 3, "rank": 0, "caption": "Usu\u00e1rios & Grupos", "named_url": ""}}, {"pk": 28, "model": "treemenus.menuitem", "fields": {"parent": 26, "level": 1, "url": "/sigi/password_change/", "menu": 2, "rank": 0, "caption": "Alterar senha", "named_url": ""}}, {"pk": 29, "model": "treemenus.menuitem", "fields": {"parent": 26, "level": 1, "url": "/sigi/logout/", "menu": 2, "rank": 1, "caption": "Encerrar sess\u00e3o", "named_url": ""}}, {"pk": 31, "model": "treemenus.menuitem", "fields": {"parent": 27, "level": 1, "url": "/sigi/treemenus/menu/", "menu": 3, "rank": 1, "caption": "Menus", "named_url": ""}}, {"pk": 33, "model": "treemenus.menuitem", "fields": {"parent": 3, "level": 2, "url": "/sigi/casas/casalegislativa/", "menu": 1, "rank": 0, "caption": "Todas", "named_url": ""}}, {"pk": 35, "model": "treemenus.menuitem", "fields": {"parent": 3, "level": 2, "url": "/sigi/casas/casalegislativa/?tipo__id__exact=2", "menu": 1, "rank": 2, "caption": "Assembl\u00e9ias Legislativas", "named_url": ""}}, {"pk": 34, "model": "treemenus.menuitem", "fields": {"parent": 3, "level": 2, "url": "/sigi/casas/casalegislativa/?tipo__id__exact=1", "menu": 1, "rank": 1, "caption": "C\u00e2maras Municipais", "named_url": ""}}, {"pk": 37, "model": "treemenus.menuitem", "fields": {"parent": 36, "level": 2, "url": "/sigi/inventario/bem/", "menu": 1, "rank": 0, "caption": "Bens", "named_url": ""}}, {"pk": 38, "model": "treemenus.menuitem", "fields": {"parent": 36, "level": 2, "url": "/sigi/inventario/fornecedor/", "menu": 1, "rank": 1, "caption": "Fornecedores", "named_url": ""}}, {"pk": 54, "model": "treemenus.menuitem", "fields": {"parent": 1, "level": 1, "url": "/sigi/servidores/servidor/", "menu": 1, "rank": 6, "caption": "Servidores", "named_url": ""}}, {"pk": 40, "model": "treemenus.menuitem", "fields": {"parent": 36, "level": 2, "url": "/sigi/inventario/fabricante/", "menu": 1, "rank": 3, "caption": "Fabricantes", "named_url": ""}}, {"pk": 41, "model": "treemenus.menuitem", "fields": {"parent": 36, "level": 2, "url": "/sigi/inventario/tipoequipamento/", "menu": 1, "rank": 4, "caption": "Tipos de equipamentos", "named_url": ""}}, {"pk": 42, "model": "treemenus.menuitem", "fields": {"parent": 36, "level": 2, "url": "/sigi/inventario/modeloequipamento/", "menu": 1, "rank": 5, "caption": "Modelos de equipamentos", "named_url": ""}}, {"pk": 39, "model": "treemenus.menuitem", "fields": {"parent": 36, "level": 2, "url": "/sigi/inventario/equipamento/", "menu": 1, "rank": 2, "caption": "Equipamentos", "named_url": ""}}, {"pk": 36, "model": "treemenus.menuitem", "fields": {"parent": 1, "level": 1, "url": "/sigi/inventario/bem/", "menu": 1, "rank": 5, "caption": "Invent\u00e1rio", "named_url": ""}}, {"pk": 14, "model": "treemenus.menuitem", "fields": {"parent": 1, "level": 1, "url": "/sigi/convenios/convenio/", "menu": 1, "rank": 4, "caption": "Conv\u00eanios", "named_url": ""}}, {"pk": 32, "model": "treemenus.menuitem", "fields": {"parent": 27, "level": 1, "url": "/sigi/sites/site/", "menu": 3, "rank": 3, "caption": "Sites", "named_url": ""}}, {"pk": 60, "model": "treemenus.menuitem", "fields": {"parent": 27, "level": 1, "url": "/sigi/diagnosticos/", "menu": 3, "rank": 2, "caption": "Diagn\u00f3sticos", "named_url": ""}}, {"pk": 59, "model": "treemenus.menuitem", "fields": {"parent": 1, "level": 1, "url": "/sigi/diagnosticos/diagnostico/", "menu": 1, "rank": 3, "caption": "Diagn\u00f3sticos", "named_url": ""}}, {"pk": 56, "model": "treemenus.menuitem", "fields": {"parent": 54, "level": 2, "url": "/sigi/servidores/funcao", "menu": 1, "rank": 1, "caption": "Fun\u00e7\u00f5es", "named_url": ""}}, {"pk": 57, "model": "treemenus.menuitem", "fields": {"parent": 54, "level": 2, "url": "/sigi/servidores/ferias/", "menu": 1, "rank": 2, "caption": "F\u00e9rias", "named_url": ""}}, {"pk": 23, "model": "treemenus.menuitem", "fields": {"parent": 1, "level": 1, "url": "/sigi/contatos/municipio/", "menu": 1, "rank": 1, "caption": "Munic\u00edpios", "named_url": ""}}, {"pk": 3, "model": "treemenus.menuitem", "fields": {"parent": 1, "level": 1, "url": "/sigi/casas/casalegislativa/", "menu": 1, "rank": 2, "caption": "Casas Legislativas", "named_url": ""}}, {"pk": 1, "model": "treemenus.menu", "fields": {"root_item": 1, "name": "Barra de navega\u00e7\u00e3o"}}, {"pk": 2, "model": "treemenus.menu", "fields": {"root_item": 26, "name": "Usu\u00e1rio"}}, {"pk": 3, "model": "treemenus.menu", "fields": {"root_item": 27, "name": "Administrador"}}]
  • SIGI/trunk/sigi/settings.py

    r5619 r5885  
    3030INTERNAL_IPS = ('127.0.0.1',)
    3131
     32DEFAULT_FROM_EMAIL = 'sesostris@interlegis.leg.br'
     33EMAIL_SUBJECT_PREFIX = u'[SIGI]'
     34EMAIL_HOST = 'smtp.interlegis.leg.br'
     35EMAIL_PORT = 25
     36EMAIL_HOST_USER = ''
     37EMAIL_HOST_PASSWORD = ''
     38#EMAIL_USE_TLS = True
     39
    3240#DATABASE_ENGINE = 'postgresql_psycopg2'
    3341DATABASE_ENGINE = 'sqlite3'
     
    5462AUTH_LDAP_BIND_DN = u"cn=sigi-ldap,ou=Usuários de Sistema,ou=Usuários,ou=Interlegis,dc=interlegis,dc=gov,dc=br"
    5563AUTH_LDAP_BIND_PASSWORD = "Sigi2609"
    56 AUTH_LDAP_USER_SEARCH = LDAPSearch(u"ou=SINTER,ou=Usuários,ou=Sede,dc=interlegis,dc=gov,dc=br", ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user)s)")
     64AUTH_LDAP_USER = u"ou=SINTER,ou=Usuários,ou=Sede,dc=interlegis,dc=gov,dc=br"
     65AUTH_LDAP_USER_SEARCH = LDAPSearch(AUTH_LDAP_USER, ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user)s)")
    5766
    5867# Set up the basic group parameters.
    59 AUTH_LDAP_GROUP_SEARCH = LDAPSearch("ou=Grupos Organizacionais,ou=Sede,dc=interlegis,dc=gov,dc=br", ldap.SCOPE_SUBTREE, "(objectClass=Group)")
     68AUTH_LDAP_GROUP = "ou=Grupos Organizacionais,ou=Sede,dc=interlegis,dc=gov,dc=br"
     69AUTH_LDAP_GROUP_SEARCH = LDAPSearch(AUTH_LDAP_GROUP, ldap.SCOPE_SUBTREE, "(objectClass=Group)")
    6070AUTH_LDAP_GROUP_TYPE = GroupOfNamesType(name_attr="cn")
    6171
     
    7585
    7686# Populate the Django user_profile from the LDAP directory.
    77 #AUTH_LDAP_PROFILE_ATTR_MAP = {
    78 #  "employee_number": "employeeNumber"
    79 #}
     87AUTH_LDAP_PROFILE_ATTR_MAP = {
     88  "nome_completo": "cn"
     89}
    8090
    8191#AUTH_LDAP_PROFILE_FLAGS_BY_GROUP = {
     
    90100AUTH_LDAP_CACHE_GROUPS = True
    91101AUTH_LDAP_GROUP_CACHE_TIMEOUT = 3600
     102
     103AUTH_PROFILE_MODULE = 'servidores.Servidor'
    92104
    93105# Keep ModelBackend around for per-user permissions and maybe a local superuser.
     
    117129    'django.core.context_processors.i18n',
    118130    'django.core.context_processors.media',
     131    'django.core.context_processors.request',
    119132    'sigi.context_processors.charts_data',
    120133)
  • SIGI/trunk/sigi/sites.py

    r5619 r5885  
    2525                                           ParlamentarAdmin, Mandato, MandatoAdmin)
    2626from sigi.apps.diagnosticos.admin import (Diagnostico, DiagnosticoAdmin, Pergunta,
    27                                           BaseSchemaAdmin, Escolha, Anexo as AnexoDiagnostico,
    28                                           AnexoAdmin as AnexoDiagnosticoAdmin)
     27                                          PerguntaAdmin, Escolha, EscolhaAdmin, Anexo as AnexoDiagnostico,
     28                                          AnexoAdmin as AnexoDiagnosticoAdmin, Categoria as
     29                                          CategoriaDiagnostico)
    2930from sigi.apps.servidores.admin import (Servidor, ServidorAdmin, Funcao, FuncaoAdmin,
    3031                                        Ferias, FeriasAdmin, Licenca, LicencaAdmin)
     
    9495# sigi.apps.diagnosticos
    9596default.register(Diagnostico, DiagnosticoAdmin)
    96 default.register(Pergunta, BaseSchemaAdmin)
    97 default.register(Escolha)
     97default.register(Pergunta, PerguntaAdmin)
     98default.register(Escolha, EscolhaAdmin)
    9899default.register(AnexoDiagnostico, AnexoDiagnosticoAdmin)
     100default.register(CategoriaDiagnostico)
    99101
    100102# sigi.apps.servidores
  • SIGI/trunk/sigi/urls.py

    r5360 r5885  
    11#-*- coding:utf-8 -*-
    22from django.conf import settings
    3 from django.conf.urls.defaults import *
     3from django.conf.urls.defaults import patterns, include, url
     4from django.views.generic.simple import redirect_to
    45import sites
    56
     
    1011    '',
    1112
     13    ('^$', redirect_to, {'url': '/sigi/'}),
     14
     15    # Diagnosticos
     16    (r'^sigi/mobile/diagnosticos/', include('sigi.apps.diagnosticos.urls')),
     17
    1218    # Informacoes de uma casa legislativa
    13     (r'^casas/casalegislativa/(?P<id>\w+)/report_complete/',
     19    (r'^sigi/casas/casalegislativa/(?P<id>\w+)/report_complete/',
    1420     'sigi.apps.casas.views.report_complete'),
    15      (r'^casas/casalegislativa/report_complete/',
     21    (r'^sigi/casas/casalegislativa/report_complete/',
    1622     'sigi.apps.casas.views.report_complete'),
    1723    # reports labels
    18     (r'^casas/casalegislativa/labels/',
     24    (r'^sigi/casas/casalegislativa/labels/',
    1925     'sigi.apps.casas.views.labels_report'),
    20     (r'^casas/casalegislativa/(?P<id>\w+)/labels/',
     26    (r'^sigi/casas/casalegislativa/(?P<id>\w+)/labels/',
    2127     'sigi.apps.casas.views.labels_report'),
    22      # reports labels sem presidente
    23     (r'^casas/casalegislativa/labels_sem_presidente/',
     28    # reports labels sem presidente
     29    (r'^sigi/casas/casalegislativa/labels_sem_presidente/',
    2430     'sigi.apps.casas.views.labels_report_sem_presidente'),
    25     (r'^casas/casalegislativa/(?P<id>\w+)/labels_sem_presidente/',
     31    (r'^sigi/casas/casalegislativa/(?P<id>\w+)/labels_sem_presidente/',
    2632     'sigi.apps.casas.views.labels_report_sem_presidente'),
    2733    # reports casa   
    28     (r'^casas/casalegislativa/reports/',
     34    (r'^sigi/casas/casalegislativa/reports/',
    2935    'sigi.apps.casas.views.report'),   
    30     (r'^casas/casalegislativa/casas_sem_convenio_report/',
     36    (r'^sigi/casas/casalegislativa/casas_sem_convenio_report/',
    3137    'sigi.apps.casas.views.casas_sem_convenio_report'),
    3238    # reports convenios
    33     (r'^convenios/convenio/reports/',
     39    (r'^sigi/convenios/convenio/reports/',
    3440     'sigi.apps.convenios.views.report'),         
    35      #Carrinho Casa
    36      (r'^casas/casalegislativa/carrinho/deleta_itens_carrinho',
     41    #Carrinho Casa
     42    (r'^sigi/casas/casalegislativa/carrinho/deleta_itens_carrinho',
    3743     'sigi.apps.casas.views.deleta_itens_carrinho'),
    38      (r'^casas/casalegislativa/carrinho/excluir_carrinho',
     44    (r'^sigi/casas/casalegislativa/carrinho/excluir_carrinho',
    3945     'sigi.apps.casas.views.excluir_carrinho'),
    40      (r'^casas/casalegislativa/carrinho/',
     46    (r'^sigi/casas/casalegislativa/carrinho/',
    4147     'sigi.apps.casas.views.visualizar_carrinho'),
    42      #Carrinho Convenio
    43      (r'^convenios/convenio/carrinho/deleta_itens_carrinho',
     48    #Carrinho Convenio
     49    (r'^sigi/convenios/convenio/carrinho/deleta_itens_carrinho',
    4450     'sigi.apps.convenios.views.deleta_itens_carrinho'),
    45       (r'^convenios/convenio/carrinho/excluir_carrinho',
     51    (r'^sigi/convenios/convenio/carrinho/excluir_carrinho',
    4652     'sigi.apps.convenios.views.excluir_carrinho'),
    47      (r'^convenios/convenio/carrinho/',
     53    (r'^sigi/convenios/convenio/carrinho/',
    4854     'sigi.apps.convenios.views.visualizar_carrinho'),
    49      #CSV Casa
    50      (r'^casas/casalegislativa/csv/',
    51     'sigi.apps.casas.views.export_csv'),
     55    #CSV Casa
     56    (r'^sigi/casas/casalegislativa/csv/',
     57     'sigi.apps.casas.views.export_csv'),
    5258    #CSV Convenio
    53      (r'^convenios/convenio/csv/',
     59    (r'^sigi/convenios/convenio/csv/',
    5460    'sigi.apps.convenios.views.export_csv'),
    55      # Resumo por região PDF     
    56      (r'^reportsRegiao/(?P<regiao>\w+)',
     61    # Resumo por região PDF     
     62    (r'^sigi/reportsRegiao/(?P<regiao>\w+)',
    5763     'sigi.apps.convenios.views.report_regiao'),
    58      # Submenu com Birt reports
    59      (r'^birt/menu/(?P<folder>\w+)',
     64    # Submenu com Birt reports
     65    (r'^sigi/birt/menu/(?P<folder>\w+)',
    6066     'sigi.apps.birt.views.menu'),
    61      # Execução com Birt reports
    62      (r'^birt/run/(?P<file>.+)',
     67    # Execução com Birt reports
     68    (r'^sigi/birt/run/(?P<file>.+)',
    6369     'sigi.apps.birt.views.run'),
    64      # Mostrar um relatório em formato HTML
    65      (r'^birt/showreport/',
     70    # Mostrar um relatório em formato HTML
     71    (r'^sigi/birt/showreport/',
    6672     'sigi.apps.birt.views.show'),
    67      # Menu com Birt reports
    68      (r'^birt/',
     73    # Menu com Birt reports
     74    (r'^sigi/birt/',
    6975     'sigi.apps.birt.views.menu'),
    70      
     76
    7177    # automatic interface based on admin
    72     (r'^(.*)', sites.default.root),
     78    (r'^sigi/(.*)', sites.default.root),
    7379)
    7480
Note: Veja TracChangeset para ajuda no uso do visualizador de conjunto de mudanças.
 

The contents and data of this website are published under license:
Creative Commons 4.0 Brasil - Atribuir Fonte - Compartilhar Igual.