Sistema de Apoio ao Processo Legislativo
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.

523 lines
18 KiB

from datetime import date
from crispy_forms.helper import FormHelper
from crispy_forms.layout import HTML, Button, Field, Fieldset, Layout, Submit
from django import forms
from django.core.exceptions import ObjectDoesNotExist
from django.forms import ModelForm
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _
import crispy_layout_mixin
import sapl
from crispy_layout_mixin import form_actions
9 years ago
from materia.models import Autor, TipoMateriaLegislativa
from sapl.utils import RANGE_ANOS
9 years ago
from .models import (DocumentoAcessorioAdministrativo, DocumentoAdministrativo,
Protocolo, TipoDocumentoAdministrativo,
TramitacaoAdministrativo)
TIPOS_PROTOCOLO = [('0', 'Enviado'), ('1', 'Recebido')]
NATUREZA_PROCESSO = [('0', 'Administrativo'),
('1', 'Legislativo'),
('', 'Ambos')]
def get_range_anos():
return [('', 'Selecione')] \
+ [(year, year) for year in range(date.today().year, 1960, -1)]
class HorizontalRadioRenderer(forms.RadioSelect.renderer):
def render(self):
return mark_safe(u' '.join([u'%s ' % w for w in self]))
class ProtocoloForm(forms.Form):
YEARS = get_range_anos()
tipo_protocolo = forms.ChoiceField(required=False,
label='Tipo de Protocolo',
choices=TIPOS_PROTOCOLO,
widget=forms.Select(
attrs={'class': 'selector'}))
numero_protocolo = forms.CharField(
label='Número de Protocolo', required=False)
ano = forms.ChoiceField(required=False,
label='Ano',
choices=YEARS,
widget=forms.Select(
attrs={'class': 'selector'}))
inicial = forms.DateField(label='Data Inicial',
required=False,
widget=forms.TextInput(
attrs={'class': 'dateinput'}))
final = forms.DateField(label='Data Final', required=False,
widget=forms.TextInput(
attrs={'class': 'dateinput'}))
natureza_processo = forms.ChoiceField(required=False,
label='Natureza Processo',
choices=[
('0', 'Administrativo'),
('1', 'Legislativo'),
('', 'Ambos')])
tipo_documento = forms.ModelChoiceField(
label='Tipo de Documento',
required=False,
queryset=TipoDocumentoAdministrativo.objects.all(),
empty_label='Selecione',
)
interessado = forms.CharField(label='Interessado', required=False)
tipo_materia = forms.ModelChoiceField(
label='Tipo de Matéria',
required=False,
queryset=TipoMateriaLegislativa.objects.all(),
empty_label='Selecione',
)
autor = forms.CharField(widget=forms.HiddenInput(), required=False)
assunto = forms.CharField(label='Assunto', required=False)
def __init__(self, *args, **kwargs):
row1 = crispy_layout_mixin.to_row(
[('numero_protocolo', 6),
('ano', 6)])
row2 = crispy_layout_mixin.to_row(
[('inicial', 6),
('final', 6)])
row3 = crispy_layout_mixin.to_row(
[('tipo_documento', 4),
('tipo_protocolo', 4),
('tipo_materia', 4)])
row4 = crispy_layout_mixin.to_row(
[('interessado', 6),
('assunto', 6)])
row5 = crispy_layout_mixin.to_row(
[('autor', 0),
(Button('pesquisar',
'Pesquisar Autor',
css_class='btn btn-primary btn-sm'), 2),
(Button('limpar',
'Limpar Autor',
css_class='btn btn-primary btn-sm'), 10)])
row6 = crispy_layout_mixin.to_row(
[('natureza_processo', 12)])
self.helper = FormHelper()
self.helper.layout = Layout(Fieldset(_('Pesquisar Protocolo'),
row1, row2,
row3, row4,
HTML(sapl.utils.autor_label),
HTML(sapl.utils.autor_modal),
row5,
row6,
form_actions(save_label='Pesquisar')))
super(ProtocoloForm, self).__init__(
*args, **kwargs)
class AnularProcoloAdmForm(ModelForm):
numero = forms.CharField(required=True,
label=Protocolo._meta.
get_field('numero').verbose_name
)
ano = forms.ChoiceField(required=True,
label=Protocolo._meta.
get_field('ano').verbose_name,
choices=RANGE_ANOS,
widget=forms.Select(attrs={'class': 'selector'}))
9 years ago
justificativa_anulacao = forms.CharField(
required=True,
label=Protocolo._meta.get_field('justificativa_anulacao').verbose_name,
widget=forms.Textarea)
def clean(self):
cleaned_data = super(AnularProcoloAdmForm, self).clean()
numero = cleaned_data.get("numero")
ano = cleaned_data.get("ano")
# se não inserido numero ou ano não prosseguir
# (e ele vai falhar pq numero e ano são obrigatórios)
if not numero or not ano:
return
try:
protocolo = Protocolo.objects.get(numero=numero, ano=ano)
if protocolo.anulado:
raise forms.ValidationError(
_("Protocolo %s/%s já encontra-se anulado")
% (numero, ano))
except ObjectDoesNotExist:
raise forms.ValidationError(
9 years ago
_("Protocolo %s/%s não existe" % (numero, ano)))
class Meta:
model = Protocolo
fields = ['numero',
'ano',
'justificativa_anulacao',
'anulado',
'user_anulacao',
'ip_anulacao',
]
widgets = {'anulado': forms.HiddenInput(),
'user_anulacao': forms.HiddenInput(),
'ip_anulacao': forms.HiddenInput(),
}
def __init__(self, *args, **kwargs):
row1 = crispy_layout_mixin.to_row(
[('numero', 6),
('ano', 6)])
row2 = crispy_layout_mixin.to_row(
[('justificativa_anulacao', 12)])
self.helper = FormHelper()
self.helper.layout = Layout(
Fieldset(_('Identificação do Protocolo'),
row1,
row2,
HTML(" "),
form_actions(save_label='Anular')
)
)
super(AnularProcoloAdmForm, self).__init__(
*args, **kwargs)
class ProtocoloDocumentForm(ModelForm):
NUMERACAO_CHOICES = [('1', _('Sequencial por Ano')),
('2', _('Sequencial Único'))]
numeracao = forms.ChoiceField(required=True,
choices=NUMERACAO_CHOICES,
widget=forms.RadioSelect(
renderer=HorizontalRadioRenderer),
label='')
tipo_protocolo = forms.ChoiceField(required=True,
label=_('Tipo de Protocolo'),
choices=TIPOS_PROTOCOLO,
widget=forms.RadioSelect(
renderer=HorizontalRadioRenderer))
tipo_documento = forms.ModelChoiceField(
label=_('Tipo de Documento'),
required=False,
queryset=TipoDocumentoAdministrativo.objects.all(),
empty_label='Selecione',
)
num_paginas = forms.CharField(label=_('Núm. Páginas'), required=True)
assunto = forms.CharField(
widget=forms.Textarea, label='Assunto', required=True)
interessado = forms.CharField(required=True,
label='Interessado')
observacao = forms.CharField(required=True,
widget=forms.Textarea, label='Observação')
class Meta:
model = Protocolo
fields = ['numeracao',
'tipo_protocolo',
'tipo_documento',
'num_paginas',
'assunto',
'interessado',
'observacao',
]
def __init__(self, *args, **kwargs):
row1 = crispy_layout_mixin.to_row(
[('numeracao', 12)])
row2 = crispy_layout_mixin.to_row(
[('tipo_protocolo', 12)])
row3 = crispy_layout_mixin.to_row(
[('tipo_documento', 6),
('num_paginas', 6)])
row4 = crispy_layout_mixin.to_row(
[('assunto', 12)])
row5 = crispy_layout_mixin.to_row(
[('interessado', 12)])
row6 = crispy_layout_mixin.to_row(
[('observacao', 12)])
self.helper = FormHelper()
self.helper.layout = Layout(
Fieldset(_('Protocolo - Opção de Numeração'), row1),
Fieldset(_('Identificação de Documento'),
row2,
row3,
row4,
row5,
row6,
HTML(" "),
form_actions(save_label=_('Protocolar Documento'))
)
)
super(ProtocoloDocumentForm, self).__init__(
*args, **kwargs)
class ProtocoloMateriaForm(ModelForm):
NUMERACAO_CHOICES = [('1', 'Sequencial por Ano'),
('2', 'Sequencial Único')]
numeracao = forms.ChoiceField(required=True,
choices=NUMERACAO_CHOICES,
widget=forms.RadioSelect(
renderer=HorizontalRadioRenderer),
label='')
tipo_protocolo = forms.ChoiceField(required=True,
label='Tipo de Protocolo',
choices=TIPOS_PROTOCOLO,
widget=forms.RadioSelect(
renderer=HorizontalRadioRenderer))
autor = forms.IntegerField(widget=forms.HiddenInput(), required=False)
def clean_autor(self):
autor_field = self.cleaned_data['autor']
try:
autor = Autor.objects.get(id=autor_field)
except ObjectDoesNotExist:
autor_field = None
else:
autor_field = autor
return autor_field
class Meta:
model = Protocolo
fields = ['numeracao',
'tipo_protocolo',
'tipo_materia',
'numero_paginas',
'autor',
'observacao']
def __init__(self, *args, **kwargs):
row1 = crispy_layout_mixin.to_row(
[('numeracao', 12)])
row2 = crispy_layout_mixin.to_row(
[('tipo_materia', 4),
('tipo_protocolo', 4),
('numero_paginas', 4)])
row3 = crispy_layout_mixin.to_row(
[('autor', 0),
(Button('pesquisar',
'Pesquisar Autor',
css_class='btn btn-primary btn-sm'), 2),
(Button('limpar',
'limpar Autor',
css_class='btn btn-primary btn-sm'), 10)])
row4 = crispy_layout_mixin.to_row(
[('observacao', 12)])
self.helper = FormHelper()
self.helper.layout = Layout(
Fieldset(_('Protocolo - Opção de Numeração'), row1),
Fieldset(_('Identificação da Matéria'),
row2,
HTML(sapl.utils.autor_label),
HTML(sapl.utils.autor_modal),
row3,
row4,
form_actions(save_label='Protocolar Matéria')
)
)
super(ProtocoloMateriaForm, self).__init__(
*args, **kwargs)
class ProposicaoSimpleForm(forms.Form):
tipo = forms.CharField(label='Tipo',
widget=forms.TextInput(
attrs={'readonly': 'readonly'}))
materia = forms.CharField(label='Matéria',
widget=forms.TextInput(
attrs={'readonly': 'readonly'}))
data_envio = forms.DateField(label=_('Data Envio'),
widget=forms.DateInput(
format='%d/%m/%Y',
attrs={'readonly': 'readonly'}))
data_recebimento = forms.DateField(label=_('Data Recebimento'),
widget=forms.DateInput(
format='%d/%m/%Y',
attrs={'readonly': 'readonly'}))
descricao = forms.CharField(label='Descrição',
widget=forms.TextInput(
attrs={'readonly': 'readonly'}))
numero_proposicao = forms.CharField(label='Número',
widget=forms.TextInput(
attrs={'readonly': 'readonly'}))
# ano = forms.CharField(label='Ano',
# widget = forms.TextInput(
# attrs={'readonly':'readonly'}))
class DocumentoAcessorioAdministrativoForm(ModelForm):
class Meta:
model = DocumentoAcessorioAdministrativo
fields = ['tipo',
'nome',
'data',
'autor',
'arquivo',
'assunto']
widgets = {
'data': forms.DateInput(format='%d/%m/%Y')
}
def __init__(self, excluir=False, *args, **kwargs):
row1 = crispy_layout_mixin.to_row(
[('tipo', 4),
('nome', 4),
('data', 4)])
row2 = crispy_layout_mixin.to_row(
[('autor', 12)])
row3 = crispy_layout_mixin.to_row(
[('arquivo', 12)])
row4 = crispy_layout_mixin.to_row(
[('assunto', 12)])
more = []
if excluir:
more = [Submit('Excluir', 'Excluir')]
self.helper = FormHelper()
self.helper.layout = Layout(
Fieldset(
_('Incluir Documento Acessório'),
row1, row2, row3, row4,
form_actions(more=more)
)
)
super(DocumentoAcessorioAdministrativoForm, self).__init__(
*args, **kwargs)
class TramitacaoAdmForm(ModelForm):
class Meta:
model = TramitacaoAdministrativo
fields = ['data_tramitacao',
'unidade_tramitacao_local',
'status',
'unidade_tramitacao_destino',
'data_encaminhamento',
'data_fim_prazo',
'texto',
'documento',
]
widgets = {
'data_tramitacao': forms.DateInput(format='%d/%m/%Y'),
'data_encaminhamento': forms.DateInput(format='%d/%m/%Y'),
'data_fim_prazo': forms.DateInput(format='%d/%m/%Y'),
}
def __init__(self, *args, **kwargs):
self.helper = FormHelper()
self.helper.layout = Layout(
Fieldset(_('Incluir Tramitação'),
'data_tramitacao',
'unidade_tramitacao_local',
'status',
'unidade_tramitacao_destino',
'data_encaminhamento',
'data_fim_prazo',
'texto'),
Field('documento', type="hidden"),
form_actions()
)
super(TramitacaoAdmForm, self).__init__(
*args, **kwargs)
class DocumentoAdministrativoForm(ModelForm):
class Meta:
model = DocumentoAdministrativo
fields = ['tipo',
'numero',
'ano',
'data',
'numero_protocolo',
'assunto',
'interessado',
'tramitacao',
'dias_prazo',
'data_fim_prazo',
'observacao',
'texto_integral',
]
def __init__(self, *args, **kwargs):
row1 = crispy_layout_mixin.to_row(
[('tipo', 4), ('numero', 4), ('ano', 4)])
row2 = crispy_layout_mixin.to_row(
[('data', 6), ('numero_protocolo', 6)])
row3 = crispy_layout_mixin.to_row(
[('assunto', 12)])
row4 = crispy_layout_mixin.to_row(
[('interessado', 9), ('tramitacao', 3)])
row5 = crispy_layout_mixin.to_row(
[('texto_integral', 12)])
row6 = crispy_layout_mixin.to_row(
[('dias_prazo', 6), ('data_fim_prazo', 6)])
row7 = crispy_layout_mixin.to_row(
[('observacao', 12)])
self.helper = FormHelper()
self.helper.layout = Layout(
Fieldset(_('Identificação Básica'),
row1, row2, row3, row4, row5),
Fieldset(_('Outras Informações'),
row6, row7),
form_actions(more=[Submit('Excluir', 'Excluir')]),
)
super(DocumentoAdministrativoForm, self).__init__(
*args, **kwargs)