mirror of https://github.com/interlegis/sapl.git
Marcio Mazza
9 years ago
36 changed files with 778 additions and 936 deletions
@ -0,0 +1,26 @@ |
|||
|
|||
CargoComissao: |
|||
Período de composição de Comissão: |
|||
- nome:10 unico |
|||
|
|||
Periodo: |
|||
Cargo de Comissão: |
|||
- data_inicio data_fim |
|||
|
|||
TipoComissao: |
|||
Tipo Comissão: |
|||
- nome:9 sigla |
|||
- dispositivo_regimental:9 natureza |
|||
|
|||
Comissao: |
|||
Dados Básicos: |
|||
- nome:9 sigla |
|||
- tipo data_criacao unidade_deliberativa data_extincao |
|||
Dados Complementares: |
|||
- local_reuniao agenda_reuniao telefone_reuniao |
|||
- endereco_secretaria telefone_secretaria fax_secretaria |
|||
- secretario:4 email |
|||
- finalidade |
|||
Temporária: |
|||
- apelido_temp:8 data_instalacao_temp |
|||
- data_final_prevista_temp data_prorrogada_temp data_fim_comissao |
@ -0,0 +1,39 @@ |
|||
|
|||
TipoNota: |
|||
Tipo da Nota: |
|||
- sigla:2 nome |
|||
- modelo |
|||
|
|||
TipoVide: |
|||
Tipo de Vide: |
|||
- sigla:2 nome |
|||
|
|||
TipoPublicacao: |
|||
Tipo de Publicação: |
|||
- sigla:2 nome |
|||
|
|||
VeiculoPublicacao: |
|||
Veículo de Publicação: |
|||
- sigla:2 nome |
|||
|
|||
PerfilEstruturalTextoArticulado: |
|||
Perfil Estrutural de Textos Articulados: |
|||
- sigla:2 nome |
|||
|
|||
TipoDispositivo: |
|||
Dados Básicos: |
|||
- nome:8 class_css |
|||
Configurações para Edição do Rótulo: |
|||
- rotulo_prefixo_texto rotulo_sufixo_texto rotulo_ordinal contagem_continua |
|||
Configurações para Renderização de Rótulo e Texto: |
|||
- rotulo_prefixo_html rotulo_sufixo_html |
|||
- texto_prefixo_html dispositivo_de_articulacao texto_sufixo_html |
|||
Configurações para Nota Automática: |
|||
- nota_automatica_prefixo_html nota_automatica_sufixo_html |
|||
Configurações para Variações Numéricas: |
|||
- formato_variacao0 |
|||
- rotulo_separador_variacao01:5 formato_variacao1 |
|||
- rotulo_separador_variacao12:5 formato_variacao2 |
|||
- rotulo_separador_variacao23:5 formato_variacao3 |
|||
- rotulo_separador_variacao34:5 formato_variacao4 |
|||
- rotulo_separador_variacao45:5 formato_variacao5 |
@ -0,0 +1,138 @@ |
|||
from math import ceil |
|||
from os.path import dirname, join |
|||
|
|||
import rtyaml |
|||
from crispy_forms.bootstrap import FormActions |
|||
from crispy_forms.helper import FormHelper |
|||
from crispy_forms.layout import HTML, Div, Fieldset, Layout, Submit |
|||
from django.utils.translation import ugettext as _ |
|||
|
|||
|
|||
def to_column(name_span): |
|||
fieldname, span = name_span |
|||
return Div(fieldname, css_class='col-md-%d' % span) |
|||
|
|||
|
|||
def to_row(names_spans): |
|||
return Div(*map(to_column, names_spans), css_class='row-fluid') |
|||
|
|||
|
|||
def to_fieldsets(fields): |
|||
for field in fields: |
|||
if isinstance(field, list): |
|||
legend, *row_specs = field |
|||
rows = [to_row(name_span_list) for name_span_list in row_specs] |
|||
yield Fieldset(legend, *rows) |
|||
else: |
|||
yield field |
|||
|
|||
|
|||
def form_actions(more=[], save_label=_('Salvar')): |
|||
return FormActions( |
|||
Submit('salvar', save_label, css_class='pull-right'), *more) |
|||
|
|||
|
|||
class SaplFormLayout(Layout): |
|||
|
|||
def __init__(self, *fields): |
|||
buttons = form_actions(more=[ |
|||
HTML('<a href="{{ view.cancel_url }}"' |
|||
' class="btn btn-inverse">%s</a>' % _('Cancelar'))]) |
|||
_fields = list(to_fieldsets(fields)) + [to_row([(buttons, 12)])] |
|||
super(SaplFormLayout, self).__init__(*_fields) |
|||
|
|||
|
|||
def get_field_display(obj, fieldname): |
|||
field = obj._meta.get_field(fieldname) |
|||
verbose_name = str(field.verbose_name) |
|||
if field.choices: |
|||
value = getattr(obj, 'get_%s_display' % fieldname)() |
|||
else: |
|||
value = getattr(obj, fieldname) |
|||
if value is None: |
|||
display = '' |
|||
elif 'date' in str(type(value)): |
|||
display = value.strftime("%d/%m/%Y") # TODO: localize |
|||
elif 'bool' in str(type(value)): |
|||
display = 'Sim' if value else 'Não' |
|||
else: |
|||
display = str(value) |
|||
return verbose_name, display |
|||
|
|||
|
|||
class CrispyLayoutFormMixin(object): |
|||
|
|||
def get_layout(self): |
|||
filename = join( |
|||
dirname(self.model._meta.app_config.models_module.__file__), |
|||
'layouts.yaml') |
|||
return read_layout_from_yaml(filename, self.model.__name__) |
|||
|
|||
@property |
|||
def fields(self): |
|||
'''Returns all fields in the layout''' |
|||
return [fieldname for legend_rows in self.get_layout() |
|||
for row in legend_rows[1:] |
|||
for fieldname, span in row] |
|||
|
|||
def get_form(self, form_class=None): |
|||
form = super(CrispyLayoutFormMixin, self).get_form(form_class) |
|||
form.helper = FormHelper() |
|||
form.helper.layout = SaplFormLayout(*self.get_layout()) |
|||
return form |
|||
|
|||
@property |
|||
def list_field_names(self): |
|||
'''The list of field names to display on table |
|||
|
|||
This base implementation returns the field names |
|||
in the first fieldset of the layout. |
|||
''' |
|||
rows = self.get_layout()[0][1:] |
|||
return [fieldname for row in rows for fieldname, __ in row] |
|||
|
|||
def get_column(self, fieldname, span): |
|||
obj = self.get_object() |
|||
verbose_name, text = get_field_display(obj, fieldname) |
|||
return { |
|||
'id': fieldname, |
|||
'span': span, |
|||
'verbose_name': verbose_name, |
|||
'text': text, |
|||
} |
|||
|
|||
@property |
|||
def layout_display(self): |
|||
return [ |
|||
{'legend': legend, |
|||
'rows': [[self.get_column(fieldname, span) |
|||
for fieldname, span in row] |
|||
for row in rows] |
|||
} for legend, *rows in self.get_layout()] |
|||
|
|||
|
|||
def read_yaml_from_file(filename): |
|||
# TODO cache this at application level |
|||
with open(filename, 'r') as yamlfile: |
|||
return rtyaml.load(yamlfile) |
|||
|
|||
|
|||
def read_layout_from_yaml(filename, key): |
|||
# TODO cache this at application level |
|||
yaml = read_yaml_from_file(filename) |
|||
base = yaml[key] |
|||
|
|||
def line_to_namespans(line): |
|||
split = [cell.split(':') for cell in line.split()] |
|||
namespans = [[s[0], int(s[1]) if len(s) > 1 else 0] for s in split] |
|||
remaining = 12 - sum(s for n, s in namespans) |
|||
nondefined = [ns for ns in namespans if not ns[1]] |
|||
while nondefined: |
|||
span = ceil(remaining / len(nondefined)) |
|||
namespan = nondefined.pop(0) |
|||
namespan[1] = span |
|||
remaining = remaining - span |
|||
return list(map(tuple, namespans)) |
|||
|
|||
return [[legend] + [line_to_namespans(l) for l in lines] |
|||
for legend, lines in base.items()] |
@ -0,0 +1,7 @@ |
|||
|
|||
Country: |
|||
Basic Data: |
|||
- name:9 continent |
|||
- population is_cold |
|||
More Details: |
|||
- description |
@ -0,0 +1,11 @@ |
|||
|
|||
LexmlProvedor: |
|||
Provedor Lexml: |
|||
- id_provedor:2 nome |
|||
- id_responsavel:2 nome_responsavel email_responsavel |
|||
- xml |
|||
|
|||
LexmlPublicador: |
|||
Publicador Lexml: |
|||
- id_publicador:2 nome sigla |
|||
- id_responsavel:2 nome_responsavel email_responsavel |
@ -0,0 +1,111 @@ |
|||
|
|||
Origem: |
|||
Origem: |
|||
- nome:8 sigla |
|||
|
|||
TipoMateriaLegislativa: |
|||
Tipo Matéria Legislativa: |
|||
- sigla:4 descricao |
|||
|
|||
RegimeTramitacao: |
|||
Tipo de Documento: |
|||
- descricao |
|||
|
|||
TipoDocumento: |
|||
Regime Tramitação: |
|||
- descricao |
|||
|
|||
TipoFimRelatoria: |
|||
Tipo Fim de Relatoria: |
|||
- descricao |
|||
|
|||
MateriaLegislativa: |
|||
Identificação Básica: |
|||
- tipo numero ano |
|||
- data_apresentacao numero_protocolo tipo_apresentacao |
|||
- texto_original |
|||
Outras Informações: |
|||
- apelido dias_prazo polemica |
|||
- objeto regime_tramitacao em_tramitacao |
|||
- data_fim_prazo data_publicacao complementar |
|||
Origem Externa: |
|||
- tipo_origem_externa numero_origem_externa ano_origem_externa |
|||
- local_origem_externa data_origem_externa |
|||
Dados Textuais: |
|||
- ementa |
|||
- indexacao |
|||
- observacao |
|||
|
|||
Anexada: |
|||
Matéria Legislativa: |
|||
- tip_id_basica_FIXME num_ident_basica_FIXME ano_ident_basica_FIXME |
|||
- data_anexacao data_desanexacao |
|||
Matéria Anexada: |
|||
- tip_id_basica_FIXME num_ident_basica_FIXME ano_ident_basica_FIXME |
|||
- data_anexacao data_desanexacao |
|||
|
|||
TipoAutor: |
|||
Tipo Autor: |
|||
- descricao |
|||
|
|||
Autor: |
|||
Autor: |
|||
- tipo:3 nome |
|||
- username |
|||
|
|||
Autoria: |
|||
Autoria: |
|||
- tip_autor_FIXME nom_autor_FIXME primeiro_autor |
|||
|
|||
DocumentoAcessorio: |
|||
Documento Acessório: |
|||
- tipo nome |
|||
- data autor |
|||
- nom_arquivo_FIXME |
|||
- ementa |
|||
- txt_observacao_FIXME |
|||
|
|||
Numeracao: |
|||
Numeração: |
|||
- tipo_materia numero_materia |
|||
- ano_materia data_materia |
|||
|
|||
Orgao: |
|||
Órgão: |
|||
- nome:4 sigla telefone endereco unidade_deliberativa |
|||
|
|||
Relatoria: |
|||
Relatoria: |
|||
- data_designacao_relator |
|||
- dados_FIXME |
|||
- data_destituicao_relator tipo_fim_relatoria |
|||
|
|||
TipoProposicao: |
|||
Tipo Proposição: |
|||
- descricao |
|||
- materia_ou_documento tipo_documento |
|||
- modelo |
|||
|
|||
Proposicao: |
|||
Proposição: |
|||
- tipo dat_criacao_FIXME data_recebimento |
|||
- descricao_FIXME |
|||
- tip_id_basica_FIXME num_ident_basica_FIXME ano_ident_basica_FIXME |
|||
- nom_arquivo_FIXME modelo_FIXME |
|||
|
|||
StatusTramitacao: |
|||
Status Tramitação: |
|||
- indicador:3 sigla:2 descricao |
|||
|
|||
UnidadeTramitacao: |
|||
Unidade Tramitação: |
|||
- orgao |
|||
- comissao |
|||
- parlamentar |
|||
|
|||
Tramitacao: |
|||
Tramitação: |
|||
- cod_ult_tram_dest_FIXME unidade_tramitacao_local |
|||
- status turno urgente |
|||
- unidade_tramitacao_destino data_encaminhamento data_fim_prazo |
|||
- texto |
@ -0,0 +1,31 @@ |
|||
|
|||
AssuntoNorma: |
|||
Assunto Norma Jurídica: |
|||
- assunto descricao |
|||
|
|||
TipoNormaJuridica: |
|||
Tipo Norma Jurídica: |
|||
- descricao sigla equivalente_lexml |
|||
|
|||
NormaJuridica: |
|||
Identificação Básica: |
|||
- tipo numero ano |
|||
- data esfera_federacao complemento |
|||
- tip_id_basica_FIXME num_ident_basica_FIXME ano_ident_basica_FIXME |
|||
- data_publicacao veiculo_publicacao pagina_inicio_publicacao pagina_fim_publicacao |
|||
- file_FIXME tip_situacao_norma_FIXME |
|||
- ementa |
|||
- indexacao |
|||
- observacao |
|||
|
|||
NormaJuridica: |
|||
Identificação Básica: |
|||
- tipo:5 numero:2 ano:2 data |
|||
- ementa |
|||
|
|||
LegislacaoCitada: |
|||
Legislação Citada: |
|||
- tip_norma_FIXME num_norma_FIXME ano_norma_FIXME |
|||
- disposicoes parte livro titulo |
|||
- capitulo secao subsecao artigo |
|||
- paragrafo inciso alinea item |
@ -0,0 +1,4 @@ |
|||
|
|||
Cronometro: |
|||
Cronometro: |
|||
- status:3 data_cronometro:6 tipo |
@ -0,0 +1,69 @@ |
|||
|
|||
CargoMesa: |
|||
Cargo na Mesa: |
|||
- descricao:10 unico |
|||
|
|||
Legislatura: |
|||
Legislatura: |
|||
- data_inicio data_fim data_eleicao |
|||
|
|||
Coligacao: |
|||
Coligação: |
|||
- nome:5 legislatura:5 numero_votos |
|||
|
|||
Partido: |
|||
Partido Político: |
|||
- nome:6 sigla data_criacao data_extincao |
|||
|
|||
Dependente: |
|||
Dependentes: |
|||
- nome |
|||
- tipo sexo data_nascimento |
|||
- cpf rg titulo_eleitor |
|||
|
|||
SessaoLegislativa: |
|||
Sessão Legislativa: |
|||
- numero:4 tipo:4 legislatura:4 data_inicio data_fim data_inicio_intervalo data_fim_intervalo |
|||
|
|||
Parlamentar: |
|||
Cadastro do Parlamentar: |
|||
- nome_parlamentar:8 ativo |
|||
- nome_completo |
|||
- nivel_instrucao sexo data_nascimento |
|||
- cpf rg titulo_eleitor |
|||
- situacao_militar profissao |
|||
- endereco_web |
|||
- email |
|||
- numero_gab_parlamentar telefone fax |
|||
- endereco_residencia cep_residencia |
|||
- municipio_residencia |
|||
- telefone_residencia fax_residencia |
|||
- locais_atuacao |
|||
- fotografia |
|||
- biografia |
|||
|
|||
Filiacao: |
|||
'Filiações Partidárias ': |
|||
- partido data data_desfiliacao |
|||
|
|||
Mandato: |
|||
Mandato: |
|||
- legislatura coligacao votos_recebidos |
|||
- ind_titular_FIXME dat_inicio_mandato_FIXME data_fim_mandato data_expedicao_diploma |
|||
- observacao |
|||
|
|||
TipoDependente: |
|||
Tipo de Dependente: |
|||
- descricao |
|||
|
|||
NivelInstrucao: |
|||
Nível Instrução: |
|||
- descricao |
|||
|
|||
TipoAfastamento: |
|||
Tipo de Afastamento: |
|||
- descricao:5 dispositivo:5 afastamento |
|||
|
|||
SituacaoMilitar: |
|||
Tipo Situação Militar: |
|||
- descricao |
@ -0,0 +1,48 @@ |
|||
|
|||
TipoDocumentoAdministrativo: |
|||
Tipo Documento Administrativo: |
|||
- sigla:4 descricao |
|||
|
|||
DocumentoAdministrativo: |
|||
Indentificação Básica: |
|||
- tipo numero ano |
|||
- data numero_protocolo |
|||
- assunto |
|||
- interessado tramitacao |
|||
- texto_integral |
|||
Outras Informações: |
|||
- dias_prazo data_fim_prazo |
|||
- observacao |
|||
|
|||
DocumentoAcessorioAdministrativo: |
|||
Documento Acessório: |
|||
- tipo nome data |
|||
- autor |
|||
- arquivo |
|||
- assunto |
|||
|
|||
StatusTramitacaoAdministrativo: |
|||
Status Tramitação Administrativo: |
|||
- indicador:3 sigla:2 descricao |
|||
|
|||
TramitacaoAdministrativo: |
|||
Tramitação: |
|||
- data_tramitacao:4 unidade_tramitacao_local |
|||
- status:4 unidade_tramitacao_destino |
|||
- data_encaminhamento data_fim_prazo |
|||
- texto |
|||
|
|||
Protocolo: |
|||
Indentificação Documento: |
|||
- tipo_protocolo |
|||
- tipo_documento numero_paginas |
|||
- assunto_ementa |
|||
- interessado |
|||
- observacao |
|||
|
|||
Protocolo: |
|||
Indentificação da Matéria: |
|||
- tipo_materia numero_paginas |
|||
- assunto_ementa |
|||
- autor |
|||
- observacao |
@ -1,37 +0,0 @@ |
|||
from crispy_forms.bootstrap import FormActions |
|||
from crispy_forms.layout import HTML, Div, Fieldset, Layout, Submit |
|||
from django.utils.translation import ugettext as _ |
|||
|
|||
|
|||
def to_column(name_span): |
|||
fieldname, span = name_span |
|||
return Div(fieldname, css_class='col-md-%d' % span) |
|||
|
|||
|
|||
def to_row(names_spans): |
|||
return Div(*map(to_column, names_spans), css_class='row-fluid') |
|||
|
|||
|
|||
def to_fieldsets(fields): |
|||
for field in fields: |
|||
if isinstance(field, list): |
|||
legend, *row_specs = field |
|||
rows = [to_row(name_span_list) for name_span_list in row_specs] |
|||
yield Fieldset(legend, *rows) |
|||
else: |
|||
yield field |
|||
|
|||
|
|||
def form_actions(more=[], save_label=_('Salvar')): |
|||
return FormActions( |
|||
Submit('salvar', save_label, css_class='pull-right'), *more) |
|||
|
|||
|
|||
class SaplFormLayout(Layout): |
|||
|
|||
def __init__(self, *fields): |
|||
buttons = form_actions(more=[ |
|||
HTML('<a href="{{ view.cancel_url }}"' |
|||
' class="btn btn-inverse">%s</a>' % _('Cancelar'))]) |
|||
_fields = list(to_fieldsets(fields)) + [to_row([(buttons, 12)])] |
|||
super(SaplFormLayout, self).__init__(*_fields) |
@ -0,0 +1,41 @@ |
|||
|
|||
TipoSessaoPlenaria: |
|||
Tipo de Sessão Plenária: |
|||
- nome quorum_minimo |
|||
|
|||
SessaoPlenaria: |
|||
Dados Básicos: |
|||
- numero:1 tipo:3 legislatura sessao_legislativa |
|||
- data_inicio:5 hora_inicio:5 iniciada |
|||
- data_fim:5 hora_fim:5 finalizada |
|||
- upload_pauta upload_ata |
|||
- url_audio url_video |
|||
|
|||
ExpedienteMateria: |
|||
Cadastro de Matérias do Expediente: |
|||
- data_ordem tip_sessao_FIXME numero_ordem |
|||
- tip_id_basica_FIXME num_ident_basica_FIXME ano_ident_basica_FIXME |
|||
- tipo_votacao |
|||
- observacao |
|||
|
|||
OrdemDia: |
|||
Cadastro de Matérias da Ordem do Dia: |
|||
- data_ordem tip_sessao_FIXME numero_ordem |
|||
- tip_id_basica_FIXME num_ident_basica_FIXME ano_ident_basica_FIXME |
|||
- tipo_votacao |
|||
- observacao |
|||
|
|||
TipoResultadoVotacao: |
|||
Tipo de Resultado da Votação: |
|||
- nome |
|||
|
|||
TipoExpediente: |
|||
Tipo de Expediente: |
|||
- nome |
|||
|
|||
RegistroVotacao: |
|||
Votação Simbólica: |
|||
- numero_votos_sim numero_votos_nao numero_abstencoes nao_votou_FIXME |
|||
- votacao_branco_FIXME ind_votacao_presidente_FIXME |
|||
- tipo_resultado_votacao |
|||
- observacao |
@ -0,0 +1,29 @@ |
|||
from crispy_layout_mixin import read_layout_from_yaml |
|||
|
|||
|
|||
def test_read_layout_from_yaml(tmpdir): |
|||
|
|||
contents = ''' |
|||
ModelName: |
|||
Cool Legend: |
|||
- name:9 place tiny |
|||
- field nature:2 |
|||
- kind:1 date unit:5 status |
|||
More data: |
|||
- equalA equalB equalC |
|||
- highlander ''' |
|||
file = tmpdir.join('zzz.yaml') |
|||
file.write(contents) |
|||
|
|||
expected = [ |
|||
['Cool Legend', |
|||
[('name', 9), ('place', 2), ('tiny', 1)], |
|||
[('field', 10), ('nature', 2)], |
|||
[('kind', 1), ('date', 3), ('unit', 5), ('status', 3)], |
|||
], |
|||
['More data', |
|||
[('equalA', 4), ('equalB', 4), ('equalC', 4)], |
|||
[('highlander', 12)], |
|||
], |
|||
] |
|||
assert read_layout_from_yaml(file.strpath, 'ModelName') == expected |
Loading…
Reference in new issue