From 48ce972fcd88c19775adf6f5449a11c96925be83 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 9 Oct 2015 17:30:29 -0300 Subject: [PATCH 01/23] Construction and structural editing norms --- compilacao/insert_inicial_TipoDispositivo.sql | 48 +- .../migrations/0005_auto_20150924_1012.py | 77 ++ .../migrations/0006_auto_20150924_1121.py | 54 ++ .../migrations/0007_auto_20150924_1131.py | 19 + .../migrations/0008_auto_20151005_1023.py | 50 ++ compilacao/models.py | 407 +++++++++- compilacao/templatetags/compilacao_filters.py | 63 +- compilacao/urls.py | 40 +- compilacao/views.py | 693 +++++++++++++++++- sapl/utils.py | 30 + static/styles/compilacao.scss | 417 ++++++++++- templates/compilacao/edit.html | 154 ++++ templates/compilacao/edit_bloco.html | 94 +++ ...teracao.html => edit_bloco_alteracao.html} | 2 +- templates/compilacao/index.html | 40 +- ...ate_render_bloco.html => index_bloco.html} | 19 +- .../compilacao/index_bloco_alteracao.html | 10 + templates/sistema.html | 9 + 18 files changed, 2114 insertions(+), 112 deletions(-) create mode 100644 compilacao/migrations/0005_auto_20150924_1012.py create mode 100644 compilacao/migrations/0006_auto_20150924_1121.py create mode 100644 compilacao/migrations/0007_auto_20150924_1131.py create mode 100644 compilacao/migrations/0008_auto_20151005_1023.py create mode 100644 templates/compilacao/edit.html create mode 100644 templates/compilacao/edit_bloco.html rename templates/compilacao/{bloco_alteracao.html => edit_bloco_alteracao.html} (87%) rename templates/compilacao/{template_render_bloco.html => index_bloco.html} (52%) create mode 100644 templates/compilacao/index_bloco_alteracao.html diff --git a/compilacao/insert_inicial_TipoDispositivo.sql b/compilacao/insert_inicial_TipoDispositivo.sql index 987e0c81f..bc4dd8023 100644 --- a/compilacao/insert_inicial_TipoDispositivo.sql +++ b/compilacao/insert_inicial_TipoDispositivo.sql @@ -1,27 +1,27 @@ -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (1, 'Articulação', 'articulacao', '', '', 0, '.....', '', '', '', '', '', '', True, '1', '1', '1', '1', '1', '1'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (2, 'Ementa', 'ementa', '', '', 0, '.....', '', '', '', '', '', '', False, 'N', '1', '1', '1', '1', '1'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (3, 'Bloco Alteração', 'bloco_alteracao', '', '', 0, '.....', '', '', '', '', '', '', True, '1', '1', '1', '1', '1', '1'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (4, 'Omissis', 'omissis', '', '', 0, '.....', '', '', '', '', '', '', False, '1', '1', '1', '1', '1', '1'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (11, 'Anexo', 'anexo', '', 'Anexo', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (12, 'Parte', 'parte', '', 'Parte', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (13, 'Livro', 'livro', '', 'Livro', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (14, 'Título', 'titulo', '', 'Título', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (15, 'Capítulo', 'capitulo', '', 'Capítulo', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (16, 'Seção', 'secao', '', 'Seção', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (17, 'SubSeção', 'subsecao', '', 'SubSeção', 0, '-----', '', '
', '', '
', '', '', False, '1', '1', '1', '1', '1', '1'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (18, 'Item de Seção', 'itemsecao', '', 'Item', 0, '-----', '', '
', '', '
', '', '', False, '1', '1', '1', '1', '1', '1'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (19, 'Artigo', 'artigo', '', 'Art.', 9, '-----', '', ' – ', '', '', '', '', True, '1', '1', '1', '1', '1', '1'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (20, 'Caput', 'caput', '', '', 0, '', '', '', '', '', '', '', False, 'N', 'N', 'N', 'N', 'N', 'N'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (21, 'Parágrafo', 'paragrafo', '', '§;Parágrafo Único', 9, '-----', '', ' – ', '', '', '', '', False, '1', '1', '1', '1', '1', '1'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (22, 'Inciso', 'inciso', '', '', 0, '.....', '', ' – ', '', '', '', '', False, 'I', '1', '1', '1', '1', '1'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (23, 'Alinea', 'alinea', '', '', 0, '.....', '', ' – ', '', '', '', '', False, 'a', '1', '1', '1', '1', '1'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (24, 'Item', 'item', '', '', 0, '.....', '', ' – ', '', '', '', '', False, '1', '1', '1', '1', '1', '1'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (25, 'Disposições Preliminares', 'disp_preliminares', '', 'Disposições Preliminares', 0, '-----', '', '
', '', '
', '', '', False, 'N', '1', '1', '1', '1', '1'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (26, 'Disposições Gerais', 'disp_gerais', '', 'Disposições Gerais', 0, '-----', '', '
', '', '
', '', '', False, 'N', '1', '1', '1', '1', '1'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (27, 'Disposições Transitórias', 'disp_transitorias', '', 'Disposições Transitórias', 0, '-----', '', '
', '', '
', '', '', False, 'N', '1', '1', '1', '1', '1'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (28, 'Disposições Finais', 'disp_finais', '', 'Disposições Finais', 0, '-----', '', '
', '', '
', '', '', False, 'N', '1', '1', '1', '1', '1'); -insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (29, 'Texto Não Estruturado', 'texto_n_estruturado', '', '', 0, '.....', '', '', '', '', '', '',False, '1', '1', '1', '1', '1', '1'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (19, 'Artigo', 'artigo', '', 'Art.', 9, '', ' – ', '', '', '', '', true, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (21, 'Parágrafo', 'paragrafo', '', '§;Parágrafo Único', 9, '', ' – ', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (22, 'Inciso', 'inciso', '', '', 0, '', ' – ', '', '', '', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (23, 'Alinea', 'alinea', '', '', 0, '', ' – ', '', '', '', '', false, 'a', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (24, 'Item', 'item', '', '', 0, '', ' – ', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (25, 'Disposições Preliminares', 'disp_preliminares', '', 'Disposições Preliminares', 0, '', '
', '', '
', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (26, 'Disposições Gerais', 'disp_gerais', '', 'Disposições Gerais', 0, '', '
', '', '
', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (27, 'Disposições Transitórias', 'disp_transitorias', '', 'Disposições Transitórias', 0, '', '
', '', '
', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (28, 'Disposições Finais', 'disp_finais', '', 'Disposições Finais', 0, '', '
', '', '
', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (1, 'Articulação', 'articulacao', '', '', 0, '', '', '', '', '', '', true, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (2, 'Ementa', 'ementa', '', '', 0, '', '', '', '', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (20, 'Caput', 'caput', '', '', 0, '', '', '', '', '', '', false, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (29, 'Texto Não Estruturado', 'texto_n_estruturado', '', '', 0, '', '', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (3, 'Bloco Alteração', 'bloco_alteracao', '', '', 0, '', '', '', '', '', '', true, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (4, 'Omissis', 'omissis', '', '', 0, '', '', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (14, 'Título', 'titulo', '', 'Título', 0, '', '
', '', '
', '
', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (13, 'Livro', 'livro', '', 'Livro', 0, '', '
', '', '
', '
', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (12, 'Parte', 'parte', '', 'Parte', 0, '', '
', '', '
', '
', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (11, 'Anexo', 'anexo', '', 'Anexo', 0, '', '
', '', '
', '
', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (16, 'Seção', 'secao', '', 'Seção', 0, '', '
', '', '
', '
', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (17, 'SubSeção', 'subsecao', '', 'SubSeção', 0, '', '
', '', '
', '
', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (18, 'Item de Seção', 'itemsecao', '', 'Item', 0, '', '
', '', '
', '
', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (15, 'Capítulo', 'capitulo', '', 'Capítulo', -1, '', '
', '', '
', '
', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +SELECT pg_catalog.setval('compilacao_tipodispositivo_id_seq', 28, true); -select setval('compilacao_tipodispositivo_id_seq'::regclass, (select max(id) from compilacao_tipodispositivo)); \ No newline at end of file diff --git a/compilacao/migrations/0005_auto_20150924_1012.py b/compilacao/migrations/0005_auto_20150924_1012.py new file mode 100644 index 000000000..bf712fe02 --- /dev/null +++ b/compilacao/migrations/0005_auto_20150924_1012.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0004_auto_20150914_0842'), + ] + + operations = [ + migrations.AlterModelOptions( + name='tipodispositivo', + options={'verbose_name_plural': 'Tipos de Dispositivo', 'verbose_name': 'Tipo de Dispositivo', 'ordering': ['id']}, + ), + migrations.RemoveField( + model_name='tipodispositivo', + name='rotulo_separadores_variacao', + ), + migrations.AddField( + model_name='tipodispositivo', + name='rotulo_separador_variacao01', + field=models.CharField(max_length=1, default='-', verbose_name='Separadores entre Numeração e Variação 1', blank=True), + ), + migrations.AddField( + model_name='tipodispositivo', + name='rotulo_separador_variacao12', + field=models.CharField(max_length=1, default='-', verbose_name='Separadores entre Variação 1 e Variação 2', blank=True), + ), + migrations.AddField( + model_name='tipodispositivo', + name='rotulo_separador_variacao23', + field=models.CharField(max_length=1, default='-', verbose_name='Separadores entre Variação 2 e Variação 3', blank=True), + ), + migrations.AddField( + model_name='tipodispositivo', + name='rotulo_separador_variacao34', + field=models.CharField(max_length=1, default='-', verbose_name='Separadores entre Variação 3 e Variação 4', blank=True), + ), + migrations.AddField( + model_name='tipodispositivo', + name='rotulo_separador_variacao45', + field=models.CharField(max_length=1, default='-', verbose_name='Separadores entre Variação 4 e Variação 5', blank=True), + ), + migrations.AlterField( + model_name='tipodispositivo', + name='formato_variacao0', + field=models.CharField(max_length=1, default='1', choices=[('1', '1-Numérico'), ('I', 'I-Romano Maiúsculo'), ('i', 'i-Romano Minúsculo'), ('A', 'A-Alfabético Maiúsculo'), ('a', 'a-Alfabético Minúsculo'), ('*', 'Tópico - Sem contagem'), ('N', 'Sem renderização')], verbose_name='Formato da Numeração'), + ), + migrations.AlterField( + model_name='tipodispositivo', + name='formato_variacao1', + field=models.CharField(max_length=1, default='1', choices=[('1', '1-Numérico'), ('I', 'I-Romano Maiúsculo'), ('i', 'i-Romano Minúsculo'), ('A', 'A-Alfabético Maiúsculo'), ('a', 'a-Alfabético Minúsculo'), ('*', 'Tópico - Sem contagem'), ('N', 'Sem renderização')], verbose_name='Formato da Variação 1'), + ), + migrations.AlterField( + model_name='tipodispositivo', + name='formato_variacao2', + field=models.CharField(max_length=1, default='1', choices=[('1', '1-Numérico'), ('I', 'I-Romano Maiúsculo'), ('i', 'i-Romano Minúsculo'), ('A', 'A-Alfabético Maiúsculo'), ('a', 'a-Alfabético Minúsculo'), ('*', 'Tópico - Sem contagem'), ('N', 'Sem renderização')], verbose_name='Formato da Variação 2'), + ), + migrations.AlterField( + model_name='tipodispositivo', + name='formato_variacao3', + field=models.CharField(max_length=1, default='1', choices=[('1', '1-Numérico'), ('I', 'I-Romano Maiúsculo'), ('i', 'i-Romano Minúsculo'), ('A', 'A-Alfabético Maiúsculo'), ('a', 'a-Alfabético Minúsculo'), ('*', 'Tópico - Sem contagem'), ('N', 'Sem renderização')], verbose_name='Formato da Variação 3'), + ), + migrations.AlterField( + model_name='tipodispositivo', + name='formato_variacao4', + field=models.CharField(max_length=1, default='1', choices=[('1', '1-Numérico'), ('I', 'I-Romano Maiúsculo'), ('i', 'i-Romano Minúsculo'), ('A', 'A-Alfabético Maiúsculo'), ('a', 'a-Alfabético Minúsculo'), ('*', 'Tópico - Sem contagem'), ('N', 'Sem renderização')], verbose_name='Formato da Variação 4'), + ), + migrations.AlterField( + model_name='tipodispositivo', + name='formato_variacao5', + field=models.CharField(max_length=1, default='1', choices=[('1', '1-Numérico'), ('I', 'I-Romano Maiúsculo'), ('i', 'i-Romano Minúsculo'), ('A', 'A-Alfabético Maiúsculo'), ('a', 'a-Alfabético Minúsculo'), ('*', 'Tópico - Sem contagem'), ('N', 'Sem renderização')], verbose_name='Formato da Variação 5'), + ), + ] diff --git a/compilacao/migrations/0006_auto_20150924_1121.py b/compilacao/migrations/0006_auto_20150924_1121.py new file mode 100644 index 000000000..df4fe2fd4 --- /dev/null +++ b/compilacao/migrations/0006_auto_20150924_1121.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0005_auto_20150924_1012'), + ] + + operations = [ + migrations.AlterField( + model_name='tipodispositivo', + name='rotulo_ordinal', + field=models.IntegerField(choices=[(-1, 'Numeração Cardinal.'), (0, 'Numeração Ordinal.'), (9, 'Numeração Ordinal até o item nove.')], verbose_name='Tipo de número do rótulo'), + ), + migrations.AlterField( + model_name='tipodispositivo', + name='rotulo_prefixo_texto', + field=models.CharField(blank=True, max_length=30, verbose_name='Prefixo de Edição do rótulo'), + ), + migrations.AlterField( + model_name='tipodispositivo', + name='rotulo_separador_variacao01', + field=models.CharField(blank=True, default='-', max_length=1, verbose_name='Separador entre Numeração e Variação 1'), + ), + migrations.AlterField( + model_name='tipodispositivo', + name='rotulo_separador_variacao12', + field=models.CharField(blank=True, default='-', max_length=1, verbose_name='Separador entre Variação 1 e Variação 2'), + ), + migrations.AlterField( + model_name='tipodispositivo', + name='rotulo_separador_variacao23', + field=models.CharField(blank=True, default='-', max_length=1, verbose_name='Separador entre Variação 2 e Variação 3'), + ), + migrations.AlterField( + model_name='tipodispositivo', + name='rotulo_separador_variacao34', + field=models.CharField(blank=True, default='-', max_length=1, verbose_name='Separador entre Variação 3 e Variação 4'), + ), + migrations.AlterField( + model_name='tipodispositivo', + name='rotulo_separador_variacao45', + field=models.CharField(blank=True, default='-', max_length=1, verbose_name='Separador entre Variação 4 e Variação 5'), + ), + migrations.AlterField( + model_name='tipodispositivo', + name='rotulo_sufixo_texto', + field=models.CharField(blank=True, max_length=30, verbose_name='Sufixo de Edição do rótulo'), + ), + ] diff --git a/compilacao/migrations/0007_auto_20150924_1131.py b/compilacao/migrations/0007_auto_20150924_1131.py new file mode 100644 index 000000000..8866b0d92 --- /dev/null +++ b/compilacao/migrations/0007_auto_20150924_1131.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0006_auto_20150924_1121'), + ] + + operations = [ + migrations.AlterField( + model_name='tipodispositivo', + name='class_css', + field=models.CharField(max_length=20, blank=True, verbose_name='Classe CSS'), + ), + ] diff --git a/compilacao/migrations/0008_auto_20151005_1023.py b/compilacao/migrations/0008_auto_20151005_1023.py new file mode 100644 index 000000000..a701292f2 --- /dev/null +++ b/compilacao/migrations/0008_auto_20151005_1023.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0007_auto_20150924_1131'), + ] + + operations = [ + migrations.AddField( + model_name='tipodispositivo', + name='dispositivo_de_articulacao', + field=models.BooleanField(verbose_name='Dispositivo de Articulação (Sem Texto)', default=False, choices=[ + (True, 'Sim'), (False, 'Não')]), + ), + migrations.AlterField( + model_name='tipodispositivo', + name='rotulo_separador_variacao01', + field=models.CharField( + verbose_name='Separador entre Numeração e Variação 1', default='-', max_length=1), + ), + migrations.AlterField( + model_name='tipodispositivo', + name='rotulo_separador_variacao12', + field=models.CharField( + verbose_name='Separador entre Variação 1 e Variação 2', default='-', max_length=1), + ), + migrations.AlterField( + model_name='tipodispositivo', + name='rotulo_separador_variacao23', + field=models.CharField( + verbose_name='Separador entre Variação 2 e Variação 3', default='-', max_length=1), + ), + migrations.AlterField( + model_name='tipodispositivo', + name='rotulo_separador_variacao34', + field=models.CharField( + verbose_name='Separador entre Variação 3 e Variação 4', default='-', max_length=1), + ), + migrations.AlterField( + model_name='tipodispositivo', + name='rotulo_separador_variacao45', + field=models.CharField( + verbose_name='Separador entre Variação 4 e Variação 5', default='-', max_length=1), + ), + ] diff --git a/compilacao/models.py b/compilacao/models.py index 7688efcb6..17c0f1ae5 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -1,11 +1,50 @@ from django.contrib.auth.models import User from django.db import models +from django.db.models import F +from django.db.models.aggregates import Max from django.utils.translation import ugettext_lazy as _ from norma.models import NormaJuridica +from sapl import utils from sapl.utils import YES_NO_CHOICES +class BaseModel(models.Model): + + class Meta: + abstract = True + + def clean(self): + """ + Check for instances with null values in unique_together fields. + """ + from django.core.exceptions import ValidationError + + super(BaseModel, self).clean() + + for field_tuple in self._meta.unique_together[:]: + unique_filter = {} + unique_fields = [] + null_found = False + for field_name in field_tuple: + field_value = getattr(self, field_name) + if getattr(self, field_name) is None: + unique_filter['%s__isnull' % field_name] = True + null_found = True + else: + unique_filter['%s' % field_name] = field_value + unique_fields.append(field_name) + if null_found: + unique_queryset = self.__class__.objects.filter( + **unique_filter) + if self.pk: + unique_queryset = unique_queryset.exclude(pk=self.pk) + if unique_queryset.exists(): + msg = self.unique_error_message( + self.__class__, tuple(unique_fields)) + raise ValidationError(msg) + + class TipoNota(models.Model): sigla = models.CharField( max_length=10, unique=True, verbose_name=_('Sigla')) @@ -35,6 +74,34 @@ class TipoVide(models.Model): class TipoDispositivo(models.Model): + """ + - ids fazem parte da lógica do desenvolvimento quanto a + simulação de hierarquia + - ids de 1 a 100 são reservados. + - São registros inseridos e usados no desenvolvimento + + + - para class_css articulacao, omissis, ementa, + bloco_alteracao, artigo, caput e paragrafo + são palavras chaves usadas no código e de existência obrigatória. + + - apenas articulacao recebe nivel zero + + - no attributo rotulo_prefixo_texto, caso haja um ';' (ponto e vírgula), e + só pode haver 1 ';', o método [def rotulo_padrao] considerará que o + rótulo do dispositivo deverá ser escrito com o contéudo após o ';' + caso para o pai do dispositivo em processamento exista apenas + o próprio como filho + + - ao o usuário trocar manualmente o rotulo para a opção após o ';' + necessáriamente o numeração do dispositivo deve ser redusida a 0, + podendo manter as variações + + -tipo de dispositivos com contagem continua são continua porém encapsuladas + em articulação... mudando articulação, reinicia-se a contagem + + - revogação de dispositivo_de_articulacao revogam todo o conteúdo + """ FNC1 = '1' FNCI = 'I' FNCi = 'i' @@ -43,18 +110,32 @@ class TipoDispositivo(models.Model): FNC8 = '*' FNCN = 'N' FORMATO_NUMERACAO_CHOICES = ( - (FNC1, _('(1) Numérico')), - (FNCI, _('(I) Romano Maiúsculo')), - (FNCi, _('(i) Romano Minúsculo')), - (FNCA, _('(A) Alfabético Maiúsculo')), - (FNCa, _('(a) Alfabético Minúsculo')), + (FNC1, _('1-Numérico')), + (FNCI, _('I-Romano Maiúsculo')), + (FNCi, _('i-Romano Minúsculo')), + (FNCA, _('A-Alfabético Maiúsculo')), + (FNCa, _('a-Alfabético Minúsculo')), (FNC8, _('Tópico - Sem contagem')), (FNCN, _('Sem renderização')), ) + # Choice básico. Porém pode ser melhorado dando a opção de digitar outro + # valor maior que zero e diferente de nove. A App de edição de rótulo, + # entenderá que deverá colocar ordinal até o valor armazenado ou em tudo + # se for igual -1. + TNRT = -1 + TNRN = 0 + TNR9 = 9 + TIPO_NUMERO_ROTULO = ( + (TNRN, _('Numeração Cardinal.')), + (TNRT, _('Numeração Ordinal.')), + (TNR9, _('Numeração Ordinal até o item nove.')), + ) + nome = models.CharField( max_length=50, unique=True, verbose_name=_('Nome')) class_css = models.CharField( + blank=True, max_length=20, verbose_name=_('Classe CSS')) rotulo_prefixo_html = models.CharField( @@ -64,17 +145,39 @@ class TipoDispositivo(models.Model): rotulo_prefixo_texto = models.CharField( blank=True, max_length=30, - verbose_name=_('Prefixo de construção do rótulo')) + verbose_name=_('Prefixo de Edição do rótulo')) rotulo_ordinal = models.IntegerField( + choices=TIPO_NUMERO_ROTULO, verbose_name=_('Tipo de número do rótulo')) - rotulo_separadores_variacao = models.CharField( - blank=True, - max_length=5, - verbose_name=_('Separadores das Variações')) + rotulo_separador_variacao01 = models.CharField( + blank=False, + max_length=1, + default="-", + verbose_name=_('Separador entre Numeração e Variação 1')) + rotulo_separador_variacao12 = models.CharField( + blank=False, + max_length=1, + default="-", + verbose_name=_('Separador entre Variação 1 e Variação 2')) + rotulo_separador_variacao23 = models.CharField( + blank=False, + max_length=1, + default="-", + verbose_name=_('Separador entre Variação 2 e Variação 3')) + rotulo_separador_variacao34 = models.CharField( + blank=False, + max_length=1, + default="-", + verbose_name=_('Separador entre Variação 3 e Variação 4')) + rotulo_separador_variacao45 = models.CharField( + blank=False, + max_length=1, + default="-", + verbose_name=_('Separador entre Variação 4 e Variação 5')) rotulo_sufixo_texto = models.CharField( blank=True, max_length=30, - verbose_name=_('Sufixo de construção do rótulo')) + verbose_name=_('Sufixo de Edição do rótulo')) rotulo_sufixo_html = models.CharField( blank=True, max_length=100, @@ -97,6 +200,10 @@ class TipoDispositivo(models.Model): verbose_name=_('Sufixo html da nota automática')) contagem_continua = models.BooleanField( choices=YES_NO_CHOICES, verbose_name=_('Contagem contínua')) + dispositivo_de_articulacao = models.BooleanField( + choices=YES_NO_CHOICES, + default=False, + verbose_name=_('Dispositivo de Articulação (Sem Texto)')) formato_variacao0 = models.CharField( max_length=1, choices=FORMATO_NUMERACAO_CHOICES, @@ -131,6 +238,7 @@ class TipoDispositivo(models.Model): class Meta: verbose_name = _('Tipo de Dispositivo') verbose_name_plural = _('Tipos de Dispositivo') + ordering = ['id'] def __str__(self): return self.nome @@ -184,14 +292,17 @@ class Publicacao(models.Model): return '%s: %s' % (self.veiculo_publicacao, self.publicacao) -class Dispositivo(models.Model): +class Dispositivo(BaseModel): TEXTO_PADRAO_DISPOSITIVO_REVOGADO = _('(Revogado)') + INTERVALO_ORDEM = 1000 ordem = models.PositiveIntegerField( default=0, verbose_name=_('Ordem de Renderização')) ordem_bloco_atualizador = models.PositiveIntegerField( default=0, verbose_name=_('Ordem de Renderização no Bloco Atualizador')) + + # apenas articulacao recebe nivel zero nivel = models.PositiveIntegerField( default=0, blank=True, @@ -323,6 +434,7 @@ class Dispositivo(models.Model): 'dispositivo5', 'tipo_dispositivo', 'dispositivo_pai', + 'norma_publicada', 'publicacao',), ) @@ -331,6 +443,277 @@ class Dispositivo(models.Model): 'rotulo': (self.rotulo if self.rotulo else self.tipo_dispositivo), 'norma': self.norma} + def rotulo_padrao(self, for_insertion=False, + d_base_for_insertion=None, + insert_next=False): + r = '' + t = self.tipo_dispositivo + + prefixo = t.rotulo_prefixo_texto.split(';') + + if len(prefixo) > 1: + + if for_insertion and \ + d_base_for_insertion is not None and \ + d_base_for_insertion.pk != self.pk and \ + d_base_for_insertion.tipo_dispositivo.pk <= t.pk: + + count_irmaos_mesmo_tipo = Dispositivo.objects.filter( + tipo_dispositivo=self.tipo_dispositivo, + dispositivo_pai=self).count() + else: + count_irmaos_mesmo_tipo = Dispositivo.objects.filter( + tipo_dispositivo=self.tipo_dispositivo, + dispositivo_pai=self.dispositivo_pai).count() + + if count_irmaos_mesmo_tipo > 1 and self.dispositivo0 != 0: + r += prefixo[0] + r += self.get_nomenclatura_completa() + elif count_irmaos_mesmo_tipo == 1 and for_insertion: + numero = self.get_numero_completo() + + if not insert_next: + self.transform_in_next() + self.transform_in_next() + r += 'Transformar %s em %s%s e criar %s 1%s' % ( + prefixo[1].strip(), + prefixo[0], + self.get_nomenclatura_completa(), + prefixo[0], + 'º' if + self.tipo_dispositivo.rotulo_ordinal >= 0 else '',) + else: + if numero[0] != 0: + self.transform_in_next() + r += 'Transformar %s em %s 1%s e criar %s%s' % ( + prefixo[1].strip(), + prefixo[0], + 'º' if + self.tipo_dispositivo.rotulo_ordinal >= 0 else '', + prefixo[0], + self.get_nomenclatura_completa()) + else: + r += '%s%s' % ( + prefixo[1].strip(), + self.get_nomenclatura_completa()) + + self.set_numero_completo(numero) + else: + r += prefixo[1].strip() + self.get_nomenclatura_completa() + else: + r += prefixo[0] + r += self.get_nomenclatura_completa() + + r += t.rotulo_sufixo_texto + + return r + + def get_profundidade(self): + numero = self.get_numero_completo() + for i in range(len(numero)): + if numero[i] != 0 or i == 0: + continue + return i - 1 + return i + + def transform_in_next(self, direcao_variacao=0): + """ + direcao_variacao é lida da seguinte forma: + -1 = reduza 1 variacao e incremente 1 + 1 = aumente 1 variacao e incremente 1 + -2 = reduza 2 variacoes e incremente 1 + 2 = aumente 2 variacoes e incremente 1 + + """ + numero = self.get_numero_completo() + + flag_variacao = 0 + flag_direcao = False + + if direcao_variacao <= 0: + numero.reverse() + for i in range(len(numero)): + if not flag_direcao and numero[i] == 0 and i < len(numero) - 1: + continue + + if direcao_variacao < 0: + numero[i] = 0 + direcao_variacao += 1 + flag_variacao -= 1 + + if i == len(numero) - 1: + flag_direcao = False + else: + flag_direcao = True + continue + break + numero[i] += 1 + numero.reverse() + + elif direcao_variacao > 0: + for i in range(len(numero)): + if numero[i] != 0 or i == 0: + continue + + if direcao_variacao > 0: + numero[i] = 1 + direcao_variacao -= 1 + flag_variacao += 1 + + flag_direcao = True + if direcao_variacao == 0: + break + continue + if not flag_direcao: + flag_direcao = True + numero[i] += 1 + + self.set_numero_completo(numero) + + return (flag_direcao, flag_variacao) + + def set_numero_completo(self, *numero): + numero = numero[0] + self.dispositivo0 = numero[0] + self.dispositivo1 = numero[1] + self.dispositivo2 = numero[2] + self.dispositivo3 = numero[3] + self.dispositivo4 = numero[4] + self.dispositivo5 = numero[5] + + def get_numero_completo(self): + return [ + self.dispositivo0, + self.dispositivo1, + self.dispositivo2, + self.dispositivo3, + self.dispositivo4, + self.dispositivo5] + + def get_nomenclatura_completa(self): + + numero = self.get_numero_completo() + + formato = [ + self.tipo_dispositivo.formato_variacao0, + self.tipo_dispositivo.formato_variacao1, + self.tipo_dispositivo.formato_variacao2, + self.tipo_dispositivo.formato_variacao3, + self.tipo_dispositivo.formato_variacao4, + self.tipo_dispositivo.formato_variacao5] + + separadores = [ + '', + self.tipo_dispositivo.rotulo_separador_variacao01, + self.tipo_dispositivo.rotulo_separador_variacao12, + self.tipo_dispositivo.rotulo_separador_variacao23, + self.tipo_dispositivo.rotulo_separador_variacao34, + self.tipo_dispositivo.rotulo_separador_variacao45] + + numero.reverse() + formato.reverse() + separadores.reverse() + + result = '' + + flag_obrigatorio = False + for i in range(len(numero)): + if not flag_obrigatorio and numero[i] == 0: + continue + flag_obrigatorio = True + + if i + 1 == len(numero) and numero[i] == 0: + continue + + if i + 1 == len(numero) and \ + (self.tipo_dispositivo.rotulo_ordinal == -1 or + 0 < numero[i] <= self.tipo_dispositivo.rotulo_ordinal): + result = 'º' + result + + if formato[i] == TipoDispositivo.FNC1: + result = separadores[i] + str(numero[i]) + result + elif formato[i] == TipoDispositivo.FNCI: + result = separadores[i] + \ + utils.int_to_roman(numero[i]) + result + elif formato[i] == TipoDispositivo.FNCi: + result = separadores[i] + \ + utils.int_to_roman(numero[i]).lower() + result + elif formato[i] == TipoDispositivo.FNCA: + result = separadores[i] + \ + utils.int_to_letter(numero[i]) + result + elif formato[i] == TipoDispositivo.FNCa: + result = separadores[i] + \ + utils.int_to_letter(numero[i]).lower() + result + elif formato[i] == TipoDispositivo.FNC8: + result = separadores[i] + '*' + result + elif formato[i] == TipoDispositivo.FNCN: + result = separadores[i] + result + + return result + + def criar_espaco_apos(self, espaco_a_criar): + + proximo_bloco = Dispositivo.objects.filter( + ordem__gt=self.ordem, + nivel__lte=self.nivel, + norma_id=self.norma_id)[:1] + + if proximo_bloco.count() != 0: + ordem = proximo_bloco[0].ordem + proximo_bloco = Dispositivo.objects.order_by('-ordem').filter( + ordem__gte=ordem, + norma_id=self.norma_id) + proximo_bloco.update(ordem=F('ordem') + 1) + proximo_bloco.update( + ordem=F('ordem') + ( + Dispositivo.INTERVALO_ORDEM * espaco_a_criar - 1)) + else: + # inserção no fim da norma + ordem_max = Dispositivo.objects.order_by( + 'ordem').filter(norma_id=self.norma_id).aggregate( + Max('ordem')) + if ordem_max['ordem__max'] is None: + raise Exception( + 'Não existem registros base nesta Norma') + ordem = ordem_max['ordem__max'] + Dispositivo.INTERVALO_ORDEM + return ordem + + def organizar_niveis(self): + if self.dispositivo_pai is None: + self.nivel = 0 + else: + self.nivel = self.dispositivo_pai.nivel + 1 + + filhos = Dispositivo.objects.filter( + dispositivo_pai_id=self.pk) + + for filho in filhos: + filho.nivel = self.nivel + 1 + filho.save() + filho.organizar_niveis() + + def get_parents(self): + dp = self + p = [] + while dp.dispositivo_pai is not None: + dp = dp.dispositivo_pai + p.append(dp) + + return p + + def recalcular_ordem(self): + try: + dispositivos = Dispositivo.objects.order_by('-ordem').filter( + norma_id=self.norma_id) + except Exception as e: + a = 1 + a += 1 + ordem = dispositivos.count() * 1000 + for d in dispositivos: + d.ordem = ordem + d.save() + ordem -= 1000 + class Vide(models.Model): data_criacao = models.DateTimeField(verbose_name=_('Data de Criação')) diff --git a/compilacao/templatetags/compilacao_filters.py b/compilacao/templatetags/compilacao_filters.py index 49f50e44e..1a8feb527 100644 --- a/compilacao/templatetags/compilacao_filters.py +++ b/compilacao/templatetags/compilacao_filters.py @@ -2,21 +2,28 @@ from django import template from django.core.signing import Signer from django.db.models import Q -from compilacao.models import Dispositivo +from compilacao.models import Dispositivo, TipoDispositivo register = template.Library() @register.filter -def get_bloco(pk_atualizador): +def get_bloco_atualizador(pk_atualizador): return Dispositivo.objects.order_by('ordem_bloco_atualizador').filter( Q(dispositivo_pai_id=pk_atualizador) | Q(dispositivo_atualizador_id=pk_atualizador)).select_related() @register.filter -def get_field(value, key): - return value[key] +def get_tipos_dispositivo(pk_atual): + + return TipoDispositivo.objects.filter( + id__gte=pk_atual) + + +@register.filter +def get_field(value_dict, key): + return value_dict[key] @register.simple_tag @@ -52,8 +59,8 @@ def set_nivel_old(view, value): @register.simple_tag -def close_div(value_max, value_min): - return '' * (int(value_max) - int(value_min) + 1) +def close_div(value_max, value_min, varr): + return '' * (int(value_max) - int(value_min) + 1 + varr) @register.filter @@ -61,3 +68,47 @@ def get_sign_vigencia(value): string = "%s,%s" % (value.inicio_vigencia, value.fim_vigencia) signer = Signer() return signer.sign(str(string)) + + +@register.filter +def isinst(value, class_str): + classe = value.__class__.__name__ + return classe == class_str + + +@register.filter +def render_actions_head(view, d_atual): + + if view.__class__.__name__ != 'DispositivoEditView': + return False + + # Apenas Menu actions head + if view.pk_add == 0 and d_atual.pk == view.pk_view: + return True + + # Menu e conteudo + if view.pk_view == view.pk_add and d_atual.pk == view.pk_view: + return True + + # conteudo e menu no filho + if view.pk_view != view.pk_add and d_atual.pk == view.pk_add: + return True + + return False + + +@register.simple_tag +def nomenclatura_heranca(d): + result = '' + while d is not None: + if d.rotulo != '': + if d.tipo_dispositivo.rotulo_prefixo_texto != '': + result = d.rotulo + ' ' + result + else: + result = '(' + d.tipo_dispositivo.nome + ' ' + \ + d.rotulo + ')' + ' ' + result + else: + result = '(' + d.tipo_dispositivo.nome + \ + d.rotulo_padrao() + ')' + ' ' + result + d = d.dispositivo_pai + return result diff --git a/compilacao/urls.py b/compilacao/urls.py index fede9a117..540d1adc9 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -1,16 +1,42 @@ -from django.conf.urls import url +from django.conf.urls import url, include +from django.contrib.auth.decorators import permission_required from compilacao import views +from compilacao.views import (tipo_nota_crud, tipo_vide_crud, + tipo_publicacao_crud, veiculo_publicacao_crud, + tipo_dispositivo_crud) -urlpatterns = [ - url(r'^norma/(?P[0-9]+)/compilacao/$', + +urlpatterns_compilacao = [ + url(r'^(?P[0-9]+)/compilacao/$', views.CompilacaoView.as_view(), name='compilacao'), + url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/$', + views.DispositivoView.as_view(), name='dispositivo'), + url(r'^(?P[0-9]+)/compilacao/vigencia/(?P.+)/$', + views.CompilacaoView.as_view(), name='vigencia'), + url(r'^(?P[0-9]+)/compilacao/edit', + views.CompilacaoEditView.as_view(), name='comp_edit'), + url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/refresh', + views.DispositivoEditView.as_view(), name='dispositivo_edit'), - url(r'^norma/(?P[0-9]+)/compilacao/vigencia/(?P.+)/$', - views.CompilacaoView.as_view(), name='vigencia'), + url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/actions', + views.ActionsEditView.as_view(), name='dispositivo_actions'), - url(r'^norma/(?P[0-9]+)/compilacao/(?P[0-9]+)/$', - views.DispositivoView.as_view(), name='dispositivo'), +] + +urlpatterns = [ + url(r'^norma/', include(urlpatterns_compilacao)), + + url(r'^sistema/compilacao/tipo-nota/', + include(tipo_nota_crud.urls)), + url(r'^sistema/compilacao/tipo-vide/', + include(tipo_vide_crud.urls)), + url(r'^sistema/compilacao/tipo-publicacao/', + include(tipo_publicacao_crud.urls)), + url(r'^sistema/compilacao/tipo-dispositivo/', + include(tipo_dispositivo_crud.urls)), + url(r'^sistema/compilacao/veiculo-publicacao/', + include(veiculo_publicacao_crud.urls)), ] diff --git a/compilacao/views.py b/compilacao/views.py index a063f9535..c0444c585 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -1,12 +1,21 @@ from collections import OrderedDict from datetime import timedelta +from os.path import sys from django.core.signing import Signer +from django.db.models import Q +from django.db.models.aggregates import Max +from django.http.response import JsonResponse from django.utils.dateparse import parse_date +from django.utils.translation import ugettext_lazy as _ +from django.views.generic.base import TemplateView from django.views.generic.list import ListView -from compilacao.models import Dispositivo +from compilacao.models import Dispositivo, TipoNota, TipoVide, TipoPublicacao,\ + VeiculoPublicacao, TipoDispositivo from norma.models import NormaJuridica +from sapl.crud import build_crud + DISPOSITIVO_SELECT_RELATED = ( 'tipo_dispositivo', @@ -16,7 +25,83 @@ DISPOSITIVO_SELECT_RELATED = ( 'dispositivo_atualizador__dispositivo_pai', 'dispositivo_atualizador__dispositivo_pai__norma', 'dispositivo_atualizador__dispositivo_pai__norma__tipo', - 'dispositivo_pai') + 'dispositivo_pai', + 'dispositivo_pai__tipo_dispositivo') + +tipo_nota_crud = build_crud( + TipoNota, 'tipo_nota', [ + + [_('Tipo da Nota'), + [('sigla', 2), ('nome', 10)], + [('modelo', 12)]], + ]) + +tipo_vide_crud = build_crud( + TipoVide, 'tipo_vide', [ + + [_('Tipo de Vide'), + [('sigla', 2), ('nome', 10)]], + ]) + +tipo_publicacao_crud = build_crud( + TipoPublicacao, 'tipo_publicacao', [ + + [_('Tipo de Publicação'), + [('sigla', 2), ('nome', 10)]], + ]) + + +veiculo_publicacao_crud = build_crud( + VeiculoPublicacao, 'veiculo_publicacao', [ + + [_('Veículo de Publicação'), + [('sigla', 2), ('nome', 10)]], + ]) + +tipo_dispositivo_crud = build_crud( + TipoDispositivo, 'tipo_dispositivo', [ + + [_('Dados Básicos'), + [('nome', 8), ('class_css', 4)]], + + [_('Configurações para Edição do Rótulo'), + [('rotulo_prefixo_texto', 3), + ('rotulo_sufixo_texto', 3), + ('rotulo_ordinal', 3), + ('contagem_continua', 3)], + + ], + + [_('Configurações para Renderização de Rótulo e Texto'), + + + + [('rotulo_prefixo_html', 6), + ('rotulo_sufixo_html', 6), ], + + [('texto_prefixo_html', 4), + ('dispositivo_de_articulacao', 4), + ('texto_sufixo_html', 4)], + ], + + [_('Configurações para Nota Automática'), + [('nota_automatica_prefixo_html', 6), + ('nota_automatica_sufixo_html', 6), + ], + ], + + [_('Configurações para Variações Numéricas'), + + [('formato_variacao0', 12)], + [('rotulo_separador_variacao01', 5), ('formato_variacao1', 7), ], + [('rotulo_separador_variacao12', 5), ('formato_variacao2', 7), ], + [('rotulo_separador_variacao23', 5), ('formato_variacao3', 7), ], + [('rotulo_separador_variacao34', 5), ('formato_variacao4', 7), ], + [('rotulo_separador_variacao45', 5), ('formato_variacao5', 7), ], + + ], + + ]) class CompilacaoView(ListView): @@ -127,7 +212,7 @@ class CompilacaoView(ListView): class DispositivoView(CompilacaoView): # template_name = 'compilacao/index.html' - template_name = 'compilacao/template_render_bloco.html' + template_name = 'compilacao/index_bloco.html' def get_queryset(self): self.flag_alteradora = -1 @@ -145,20 +230,616 @@ class DispositivoView(CompilacaoView): proximo_bloco = Dispositivo.objects.filter( ordem__gt=bloco.ordem, nivel__lte=bloco.nivel, - norma_publicada=None, norma_id=self.kwargs['norma_id'])[:1] if proximo_bloco.count() == 0: itens = Dispositivo.objects.filter( ordem__gte=bloco.ordem, - norma_publicada=None, norma_id=self.kwargs['norma_id'] ).select_related(*DISPOSITIVO_SELECT_RELATED) else: itens = Dispositivo.objects.filter( ordem__gte=bloco.ordem, ordem__lt=proximo_bloco[0].ordem, - norma_publicada=None, norma_id=self.kwargs['norma_id'] ).select_related(*DISPOSITIVO_SELECT_RELATED) return itens + + +class CompilacaoEditView(CompilacaoView): + template_name = 'compilacao/edit.html' + + flag_alteradora = -1 + + flag_nivel_ini = 0 + flag_nivel_old = -1 + + pk_add = 0 + pk_view = 0 + + def get_queryset(self): + self.pk_add = 0 + self.pk_view = 0 + + self.flag_alteradora = -1 + self.flag_nivel_ini = 0 + self.flag_nivel_old = -1 + + return Dispositivo.objects.filter( + ordem__gt=0, + norma_id=self.kwargs['norma_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + + +class DispositivoEditView(DispositivoView): + template_name = 'compilacao/edit_bloco.html' + + def get_queryset(self): + self.flag_alteradora = -1 + self.flag_nivel_ini = 0 + self.flag_nivel_old = -1 + + try: + self.pk_add = int(self.request.GET['pkadd']) + except: + self.pk_add = 0 + self.pk_view = int(self.kwargs['dispositivo_id']) + + try: + if self.pk_add == self.pk_view: + bloco = Dispositivo.objects.get( + pk=self.kwargs['dispositivo_id']) + else: + bloco = Dispositivo.objects.get( + pk=self.kwargs['dispositivo_id']) + except Dispositivo.DoesNotExist: + return [] + + self.flag_nivel_old = bloco.nivel - 1 + self.flag_nivel_ini = bloco.nivel + + if self.pk_add == self.pk_view: + return [bloco, ] + + proximo_bloco = Dispositivo.objects.filter( + ordem__gt=bloco.ordem, + nivel__lte=bloco.nivel, + norma_id=self.kwargs['norma_id'])[:1] + + if proximo_bloco.count() == 0: + itens = Dispositivo.objects.filter( + ordem__gte=bloco.ordem, + norma_id=self.kwargs['norma_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + else: + itens = Dispositivo.objects.filter( + ordem__gte=bloco.ordem, + ordem__lt=proximo_bloco[0].ordem, + norma_id=self.kwargs['norma_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + return itens + + def select_provaveis_inserts(self): + + # Não salvar d_base + if self.pk_add == 0: + d_base = Dispositivo.objects.get(pk=self.pk_view) + else: + d_base = Dispositivo.objects.get(pk=self.pk_add) + + result = [{'tipo_insert': 'Inserir Depois', + 'action': 'add_next', + 'itens': []}, + {'tipo_insert': 'TODO: Inserir Dentro', + 'action': 'add_in', + 'itens': []}, + {'tipo_insert': 'TODO: Inserir Antes', + 'action': 'add_prior', + 'itens': []} + ] + + disps = Dispositivo.objects.order_by( + '-ordem').filter( + ordem__lte=d_base.ordem, + norma_id=d_base.norma_id) + + nivel = sys.maxsize + for d in disps: + + if d.nivel >= nivel: + continue + + if d.tipo_dispositivo.class_css == 'caput': + continue + + nivel = d.nivel + + r = [] + + if d == d_base: + result[2]['itens'].append({ + 'class_css': d.tipo_dispositivo.class_css, + 'tipo_pk': d.pk, + 'variacao': 0, + 'provavel': '%s (%s)' % ( + d.rotulo_padrao(True, d, False), + d.tipo_dispositivo.nome,), + 'dispositivo_base': d_base.pk}) + + flag_direcao = 1 + flag_variacao = 0 + while True: + # rt resultado da transformacao + rt = d.transform_in_next(flag_direcao) + if not rt[0]: + break + flag_variacao += rt[1] + r.append({'class_css': d.tipo_dispositivo.class_css, + 'tipo_pk': d.tipo_dispositivo.pk, + 'variacao': flag_variacao, + 'provavel': '%s (%s)' % ( + d.rotulo_padrao( + True, d_base, True), + d.tipo_dispositivo.nome,), + 'dispositivo_base': d_base.pk}) + + flag_direcao = -1 + + r.reverse() + + if len(r) > 0 and d.tipo_dispositivo.class_css == 'articulacao': + r = [r[0], ] + + if d.tipo_dispositivo == d_base.tipo_dispositivo: + result[0]['itens'] += r + else: + result[0]['itens'] += r + result[2]['itens'] += r + + if nivel == 0: + break + + # tipo do dispositivo base + tipb = d_base.tipo_dispositivo + + for mudarnivel in [1, 0]: + if mudarnivel: + # Outros Tipos de Dispositivos PARA DENTRO + otds = TipoDispositivo.objects.order_by('-contagem_continua', 'id').filter( + Q(id__gt=100) & Q(id__gt=d_base.tipo_dispositivo_id)) + else: + # Outros Tipos de Dispositivos PARA FORA + classes_ja_inseridas = [] + for c in result[0]['itens']: + if c['class_css'] not in classes_ja_inseridas: + classes_ja_inseridas.append(c['class_css']) + otds = TipoDispositivo.objects.order_by('-contagem_continua', 'id').filter( + id__gt=100, + id__lt=d_base.tipo_dispositivo_id).exclude( + class_css__in=classes_ja_inseridas) + + for td in otds: + + if (tipb.class_css == 'caput' and + td.class_css == 'paragrafo'): + continue + + d_base.tipo_dispositivo = td + + disps = Dispositivo.objects.filter( + tipo_dispositivo_id=td.pk, + dispositivo_pai_id=d_base.pk).aggregate( + Max('dispositivo0'), + Max('dispositivo1'), + Max('dispositivo2'), + Max('dispositivo3'), + Max('dispositivo4'), + Max('dispositivo5')) + + if disps['dispositivo0__max'] is not None: + d_base.set_numero_completo([ + disps['dispositivo0__max'], + disps['dispositivo1__max'], + disps['dispositivo2__max'], + disps['dispositivo3__max'], + disps['dispositivo4__max'], + disps['dispositivo5__max'], + ]) + + d_base.transform_in_next() + else: + if ';' in td.rotulo_prefixo_texto: + d_base.set_numero_completo([0, 0, 0, 0, 0, 0, ]) + else: + d_base.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + + r = [{'class_css': td.class_css, + 'tipo_pk': td.pk, + 'variacao': 0, + 'provavel': '%s (%s)' % ( + d_base.rotulo_padrao(True, None, True), + td.nome,), + 'dispositivo_base': d_base.pk}] + + if mudarnivel == 1: + result[1]['itens'] += r + else: + if td.pk < tipb.pk and td.class_css != 'caput': + result[2]['itens'] += r + result[0]['itens'] += r + + # retira inserir após e inserir antes + if tipb.class_css == 'caput': + result.pop() + result.remove(result[0]) + + if tipb.class_css == 'articulacao': + r = result[0] + result.remove(result[0]) + result.insert(1, r) + + return result + + +class ActionsEditMixin(object): + + def render_to_json_response(self, context, **response_kwargs): + + if context['action'] == 'add_next': + return JsonResponse(self.add_next(context), safe=False) + elif context['action'] == 'add_in': + return JsonResponse(self.add_in(context), safe=False) + elif context['action'] == 'add_prior': + return JsonResponse(self.add_prior(context), safe=False) + else: + return JsonResponse({}, safe=False) + + def add_prior(self, context): + pass + + def add_in(self, context): + pass + + def add_next(self, context): + try: + base = Dispositivo.objects.get(pk=context['dispositivo_id']) + dp = Dispositivo.objects.get(pk=context['dispositivo_id']) + + tipo = TipoDispositivo.objects.get(pk=context['tipo_pk']) + + while dp.dispositivo_pai is not None and \ + dp.tipo_dispositivo_id != tipo.pk: + dp = dp.dispositivo_pai + + # Inserção interna a uma articulação um tipo já existente + # ou de uma articulacao + if dp.dispositivo_pai is not None or \ + tipo.class_css == 'articulacao': + + dp.transform_in_next(int(context['variacao'])) + dp.rotulo = dp.rotulo_padrao() + dp.texto = '' + dp.pk = None + dp.norma_publicada = None + + if dp.tipo_dispositivo.class_css == 'artigo': + ordem = base.criar_espaco_apos(espaco_a_criar=2) + else: + ordem = base.criar_espaco_apos(espaco_a_criar=1) + + dp.ordem = ordem + + # Incrementar irmãos + + if not tipo.contagem_continua: + irmaos = list(Dispositivo.objects.filter( + dispositivo_pai_id=dp.dispositivo_pai_id, + ordem__gt=dp.ordem, + tipo_dispositivo_id=tipo.pk)) + elif tipo.class_css == 'articulacao': + irmaos = list(Dispositivo.objects.filter( + ordem__gt=dp.ordem, + norma_id=dp.norma_id, + tipo_dispositivo_id=tipo.pk)) + else: # contagem continua restrita a articulacao + + proxima_articulacao = Dispositivo.objects.filter( + ordem__gt=dp.ordem, + nivel=0, + norma_id=dp.norma_id)[:1] + + if not proxima_articulacao.exists(): + irmaos = list(Dispositivo.objects.filter( + ordem__gt=dp.ordem, + norma_id=dp.norma_id, + tipo_dispositivo_id=tipo.pk)) + else: + irmaos = list(Dispositivo.objects.filter( + Q(ordem__gt=dp.ordem) & + Q(ordem__lt=proxima_articulacao[0].ordem), + norma_id=dp.norma_id, + tipo_dispositivo_id=tipo.pk)) + + dp_profundidade = dp.get_profundidade() + + irmaos_a_salvar = [] + ultimo_irmao = None + for irmao in irmaos: + irmao_profundidade = irmao.get_profundidade() + if irmao_profundidade < dp_profundidade: + break + + if irmao.get_numero_completo() < dp.get_numero_completo(): + if irmao_profundidade > dp_profundidade: + if ultimo_irmao is None: + irmao.transform_in_next( + dp_profundidade - irmao_profundidade) + irmao.transform_in_next( + irmao_profundidade - dp_profundidade) + else: + irmao.set_numero_completo( + ultimo_irmao.get_numero_completo()) + + irmao.transform_in_next( + irmao_profundidade - + ultimo_irmao.get_profundidade()) + + ultimo_irmao = irmao + else: + irmao.transform_in_next() + irmao.rotulo = irmao.rotulo_padrao() + irmaos_a_salvar.append(irmao) + else: + irmao_numero = irmao.get_numero_completo() + irmao_numero[dp_profundidade] += 1 + irmao.set_numero_completo(irmao_numero) + irmao.rotulo = irmao.rotulo_padrao() + irmaos_a_salvar.append(irmao) + + irmaos_a_salvar.reverse() + for irmao in irmaos_a_salvar: + irmao.clean() + irmao.save() + + dp.clean() + dp.save() + + # Inserção automática do caput para artigos + if dp.tipo_dispositivo.class_css == 'artigo': + tipocaput = TipoDispositivo.objects.filter( + class_css='caput') + dp.dispositivo_pai_id = dp.pk + dp.pk = None + dp.nivel += 1 + dp.tipo_dispositivo = tipocaput[0] + dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + dp.rotulo = dp.rotulo_padrao() + dp.texto = '' + + dp.ordem = ordem + Dispositivo.INTERVALO_ORDEM + dp.clean() + dp.save() + dp = Dispositivo.objects.get(pk=dp.dispositivo_pai_id) + + # Inserção de dispositivo sem precedente de mesmo tipo + else: + dp = Dispositivo.objects.get(pk=context['dispositivo_id']) + + # Encontrar primeiro irmão que contem um pai compativel + while True: + if dp.dispositivo_pai is not None and \ + dp.dispositivo_pai.tipo_dispositivo_id > tipo.pk: + dp = dp.dispositivo_pai + else: + break + + dp.tipo_dispositivo = tipo + + dp.pk = None + dp.norma_publicada = None + + if tipo.contagem_continua: + ultimo_irmao = Dispositivo.objects.order_by('-ordem').filter( + ordem__lte=dp.ordem, + tipo_dispositivo_id=tipo.pk, + norma_id=dp.norma_id)[:1] + + if not ultimo_irmao.exists(): + dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + else: + ultimo_irmao = ultimo_irmao[0] + dp.set_numero_completo( + ultimo_irmao.get_numero_completo()) + dp.transform_in_next() + else: + if ';' in tipo.rotulo_prefixo_texto: + dp.set_numero_completo([0, 0, 0, 0, 0, 0, ]) + else: + dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + dp.rotulo = dp.rotulo_padrao() + dp.texto = '' + dp.ordem = base.criar_espaco_apos(espaco_a_criar=1) + + # Incrementar irmãos + irmaos = Dispositivo.objects.order_by('-ordem').filter( + dispositivo_pai_id=dp.dispositivo_pai_id, + ordem__gt=dp.ordem, + tipo_dispositivo_id=tipo.pk) + + ''' inserção sem precedente é feita sem variação + portanto, não deve ser usado o transform_next() para + incrementar, e sim, apenas somar no atributo dispositivo0 + dada a possibilidade de existir irmãos com viariação''' + for irmao in irmaos: + irmao.dispositivo0 += 1 + irmao.rotulo = irmao.rotulo_padrao() + irmao.clean() + irmao.save() + + dp.clean() + dp.save() + + ''' Reenquadrar todos os dispositivos que possuem pai + antes da inserção atual e que são inferiores a dp, + redirecionando para o novo pai''' + + possiveis_filhos = Dispositivo.objects.filter( + ordem__gt=dp.ordem, + norma_id=dp.norma_id) + + nivel = sys.maxsize + flag_niveis = False + for filho in possiveis_filhos: + + if filho.nivel > nivel: + continue + + if filho.tipo_dispositivo_id <= dp.tipo_dispositivo_id: + break + + if filho.dispositivo_pai.ordem >= dp.ordem: + continue + + nivel = filho.nivel + + filho.dispositivo_pai = dp + filho.clean() + filho.save() + flag_niveis = True + + if flag_niveis: + dp.organizar_niveis() + + numtipos = {} + + ''' Renumerar filhos imediatos que + não possuam contagem continua''' + + if flag_niveis: + filhos = Dispositivo.objects.filter( + dispositivo_pai_id=dp.pk) + + for filho in filhos: + + if filho.tipo_dispositivo.contagem_continua: + continue + + if filho.tipo_dispositivo.class_css in numtipos: + if filho.dispositivo_substituido is None: + numtipos[filho.tipo_dispositivo.class_css] += 1 + else: + t = filho.tipo_dispositivo + prefixo = t.rotulo_prefixo_texto.split(';') + if len(prefixo) > 1: + count_irmaos_m_tipo = Dispositivo.objects.filter( + ~Q(pk=filho.pk), + tipo_dispositivo=t, + dispositivo_pai=filho.dispositivo_pai)[:1] + + if count_irmaos_m_tipo.exists(): + numtipos[filho.tipo_dispositivo.class_css] = 1 + else: + numtipos[filho.tipo_dispositivo.class_css] = 0 + else: + numtipos[filho.tipo_dispositivo.class_css] = 1 + + filho.dispositivo0 = numtipos[ + filho.tipo_dispositivo.class_css] + + filho.rotulo = filho.rotulo_padrao() + filho.clean() + filho.save() + + ''' Renumerar dispositivos de + contagem continua, caso a inserção seja uma articulação''' + + numtipos = {} + if tipo.class_css == 'articulacao': + + proxima_articulacao = Dispositivo.objects.filter( + ordem__gt=dp.ordem, + nivel=0, + norma_id=dp.norma_id)[:1] + + if not proxima_articulacao.exists(): + filhos_continuos = list(Dispositivo.objects.filter( + ordem__gt=dp.ordem, + norma_id=dp.norma_id, + tipo_dispositivo__contagem_continua=True)) + else: + filhos_continuos = list(Dispositivo.objects.filter( + Q(ordem__gt=dp.ordem) & + Q(ordem__lt=proxima_articulacao[0].ordem), + norma_id=dp.norma_id, + tipo_dispositivo__contagem_continua=True)) + + for filho in filhos_continuos: + + if filho.tipo_dispositivo.class_css in numtipos: + if filho.dispositivo_substituido is None: + numtipos[filho.tipo_dispositivo.class_css] += 1 + else: + t = filho.tipo_dispositivo + prefixo = t.rotulo_prefixo_texto.split(';') + if len(prefixo) > 1: + count_irmaos_m_tipo = Dispositivo.objects.filter( + ~Q(pk=filho.pk), + tipo_dispositivo=t, + dispositivo_pai=filho.dispositivo_pai)[:1] + + if count_irmaos_m_tipo.exists(): + numtipos[filho.tipo_dispositivo.class_css] = 1 + else: + numtipos[filho.tipo_dispositivo.class_css] = 0 + else: + numtipos[filho.tipo_dispositivo.class_css] = 1 + + filho.dispositivo0 = numtipos[ + filho.tipo_dispositivo.class_css] + + filho.rotulo = filho.rotulo_padrao() + filho.clean() + filho.save() + + except Exception as e: + print(e) + + # data = serializers.serialize('json', dp) + if tipo.contagem_continua: + # pais a atualizar + + pais = [] + + if dp.dispositivo_pai is None: + data = {'pk': dp.pk, 'pai': [-1, ]} + else: + pkfilho = dp.pk + dp = dp.dispositivo_pai + + parents = Dispositivo.objects.filter( + norma_id=dp.norma_id, + ordem__gte=dp.ordem, + nivel__lte=dp.nivel) + + nivel = sys.maxsize + for p in parents: + + if p.nivel > nivel: + continue + + pais.append(p.pk) + nivel = p.nivel + data = {'pk': pkfilho, 'pai': pais} + else: + data = {'pk': dp.pk, 'pai': [dp.dispositivo_pai.pk, ]} + + return data + + +class ActionsEditView(ActionsEditMixin, TemplateView): + + def render_to_response(self, context, **response_kwargs): + context['action'] = self.request.GET['action'] + context['tipo_pk'] = self.request.GET['tipo_pk'] + context['variacao'] = self.request.GET['variacao'] + return self.render_to_json_response(context, **response_kwargs) diff --git a/sapl/utils.py b/sapl/utils.py index 62a96c0e2..10962a55e 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -1,7 +1,10 @@ +from builtins import TypeError + from django.apps import apps from django.contrib import admin from django.utils.translation import ugettext_lazy as _ + # SAPL business apps # This is a dependency order: each entry depends only on previous ones # The order is important for migration code @@ -37,3 +40,30 @@ def make_choices(*choice_pairs): yield key YES_NO_CHOICES = [(True, _('Sim')), (False, _('Não'))] + + +def int_to_roman(int_value): + # if isinstance(int_value, type(1)): + # raise TypeError("expected integer, got %s" % type(int_value)) + if not 0 < int_value < 4000: + raise ValueError("Argument must be between 1 and 3999") + ints = (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1) + nums = ('M', 'CM', 'D', 'CD', 'C', 'XC', + 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I') + result = "" + for i in range(len(ints)): + count = int(int_value / ints[i]) + result += nums[i] * count + int_value -= ints[i] * count + return result + + +def int_to_letter(int_value): + result = '' + int_value -= 1 + while int_value >= 26: + rest = int_value % 26 + int_value = int(int_value / 26) - 1 + result = chr(rest + 65) + result + result = chr(int_value + 65) + result + return result diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index 972ebad31..eb0e25287 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -1,28 +1,53 @@ -.articulacao div { - background-color: #fff; +#message_block { + + display: none; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + background-color: rgba(220, 220, 220, 0.75); + z-index:99; } +#message_block #msg{ + position: relative; + margin: 25% auto; + padding: 1.2em 2em; + max-width: 600px; + text-align: center; + font-size: 1.5em; + color: #677; -.dispositivo { - background-color: #ddd !important; - transition: all .4s ease-in-out; - display:inline; + border: 1px solid #eee; + background-color: #fff !important; + box-shadow: 0 1px 2px #999; +} + +.dispositivo { + font-size:1em; + transition: all 0.2s ease-in-out; } .dispositivo .ementa { - padding: 4em 0em 3em 50%; + padding: 4em 0em 3em 35%; font-weight: bold; } -.dispositivo .anexo { - font-size: 1.4em; +.dispositivo .anexo, +.dispositivo .disp_preliminares, +.dispositivo .disp_gerais, +.dispositivo .disp_transitorias, +.dispositivo .disp_finais { + font-size: 1.5em; text-align: center; font-weight: bold; margin-top: 3em; + margin-bottom: 1em; } .dispositivo .parte { @@ -30,12 +55,14 @@ text-align: center; font-weight: bold; margin-top: 2em; + margin-bottom: 1em; } .dispositivo .livro { font-size: 1.5em; text-align: center; font-weight: bold; margin-top: 2em; + margin-bottom: 1em; } .dispositivo .titulo { @@ -43,9 +70,11 @@ text-align: center; font-weight: bold; margin-top: 2em; + margin-bottom: 1em; } -.dispositivo .capitulo { +.dispositivo .capitulo { + margin-bottom: 1em; margin-top: 1.5em; font-size: 1.3em; text-align: center; @@ -53,14 +82,16 @@ } .dispositivo .secao { - margin-top: 0.8em; + margin-top: 1.2em; + margin-bottom: 0.7em; font-size: 1.2em; text-align: center; font-weight: bold; } .dispositivo .subsecao, .dispositivo .itemsecao { - margin-top: 0.8em; + margin-top: 1em; + margin-bottom: 0.6em; font-size: 1.2em; text-align: center; font-style: italic; @@ -69,43 +100,45 @@ .dispositivo .artigo { font-size: 1.15em; - float:left; + float:left; } .dispositivo .caput { - font-size: 1.15em; - margin-bottom: 0.5em; + margin-top: 0.3333em; + font-size: 1.15em; display: block; } .dispositivo .paragrafo { - margin-left: 1.5em; + padding-left: 1.5em; font-size: 1.1em; - margin-top: 5px; - margin-bottom: 3px; + margin-top: 0.2222em; } .dispositivo .inciso { font-size: 1.1em; - margin-left: 2.5em; - margin-top: 5px; - margin-bottom: 3px; + padding-left: 2.5em; + margin-top: 0.1667em; } .dispositivo .alinea { font-size: 1.0em; - margin-left: 3.5em; + padding-left: 3.5em; + margin-top: 2px; } .dispositivo .item { font-size: 1.0em; - margin-left: 4.5em; + padding-left: 4.5em; + margin-top: 2px; } -.dispositivo .desativado, .dispositivo .desativado * { +.compilacaoedit .desativado, .compilacaoedit .desativado *, +.compilacao .desativado, .compilacao .desativado * { text-decoration: line-through; color: #777 !important; } -.dispositivo .desativado table, .dispositivo .desativado table td { +.compilacaoedit .desativado table, .compilacaoedit .desativado table td, +.compilacao .desativado table, .compilacao .desativado table td { border: 1px dotted #ccc; text-decoration: line-through; } @@ -115,11 +148,11 @@ } .dispositivo a.link_alterador { color: #2980B9 !important; - font-size: 0.9rem; + font-size: 0.75em; } .dispositivo .bloco_alteracao { - margin-left: 5em; + padding-left: 5em; font-style: italic; } @@ -134,6 +167,7 @@ color: #018 !important; } + .compilacao .top-bar-section li:not(.has-form) a:not(.button), .compilacao .top-bar { line-height: 1.6rem; @@ -167,6 +201,7 @@ margin: 2.5em 0 0 0; transition: all .4s ease-in-out; background: #2980B9; + clear:both; } .compilacao .fixed{ @@ -175,4 +210,332 @@ .displaynone { display: none !important; +} + + +.compilacaoedit { + margin-left: 0.8em; + z-index: 1; +} + + +.compilacaoedit .articulacao{ + + margin-left: -0.8em; + margin-top: 2em; +} + +.compilacaoedit .articulacao::before { + content: "Articulação"; + background-color: #eee; + border-bottom: 1px solid #aaa; + padding: 0.333em; + padding-left: 1em; + display:block; +} + +.compilacaoedit .editclick .articulacao::before { + display: none; +} +.compilacaoedit .editdi { + display: block; + clear: left; +} + +.compilacaoedit .edit { + position: relative; + display:block; + background-color: transparent !important; + border: 0px none #fff; +} +.compilacaoedit .edit .artigo { + float: none; +} + +.compilacaoedit .edit > .actions { + color: #fff; + position: absolute; + padding: 0 0.2em; + left: -2.1em; + opacity: 0; + transition: all 0.4s ease-in-out; +} + +.compilacaoedit .edit > .actions a.btn-action { + background: #3498db; + background-image: -webkit-linear-gradient(top, #3498db, #2980b9); + background-image: -moz-linear-gradient(top, #3498db, #2980b9); + background-image: -ms-linear-gradient(top, #3498db, #2980b9); + background-image: -o-linear-gradient(top, #3498db, #2980b9); + background-image: linear-gradient(to bottom, #3498db, #2980b9); + -webkit-border-radius: 7; + -moz-border-radius: 7; + border-radius: 7px; + color: #ffffff !important; + font-size: 18px; + font-weight: bold; + padding: 2px 6px 2px 7px; + text-decoration: none; +} + +.compilacaoedit .edit > .actions a.btn-action:hover { + background: #3cb0fd; + background-image: -webkit-linear-gradient(top, #3cb0fd, #3498db); + background-image: -moz-linear-gradient(top, #3cb0fd, #3498db); + background-image: -ms-linear-gradient(top, #3cb0fd, #3498db); + background-image: -o-linear-gradient(top, #3cb0fd, #3498db); + background-image: linear-gradient(to bottom, #3cb0fd, #3498db); + text-decoration: none; +} +.compilacaoedit .edit:hover > .actions { + z-index: 9; + opacity: 0.5; + background-color: transparent !important +} + +.compilacaoedit .edit:hover > .actions:hover { + opacity: 1; +} + +.compilacaoedit .edit:hover > .actions:hover::before { + + border-color: transparent transparent transparent #78F9FF; +} + +.compilacaoedit .edit:hover > .actions::before { + border: inset 0.375rem; + content: ""; + display: block; + height: 0; + width: 0; + border-color: transparent transparent transparent #78F9FF; + position: absolute; + top: 0.53rem; + right: -0.51rem; +} + +.compilacaoedit .edit *:hover { + background-color: #eee; +} + +.compilacaoedit .editclick > .label_pai { + position: absolute; + color: #999; + top: -1.7em; + left: 0; + right: 0; + width: auto; + height: auto; +} + +.compilacaoedit .editclick { + border: 2.1em solid #eee; + padding: 1em; + margin: 1em -2em 1em -2.8em; + z-index: 1; + background-color: #fff !important; + box-shadow: 0 1px 2px #aaa; +} + +.compilacaoedit .editclick > .actions { + display: none; +} + + +.compilacaoedit .actions_head { + color: #fff; + position: relative; + opacity: 0; + transition: all 0.4s ease-in-out; + border-bottom: 1px solid #2980b9; + z-index: 9; + margin: -1em -1em 2em -1em; +} + +.compilacaoedit .actions_head ul { + margin-left: 0; + } + +.compilacaoedit .actions_head li { + font-weight: normal !important; + display: inline-block; + position: relative; + white-space:nowrap; + max-width:something; + } +.compilacaoedit .actions_head > li.left { + border-left: 1px solid white; + } + + +.compilacaoedit .actions_head > li.right{ + width: 3em; + text-align: center; + clear:right; +} + + + +.compilacaoedit .actions_head li ul { + display: none; + position:absolute; + top: auto; + } + +.compilacaoedit .actions_head li:hover ul{ + display: block; + } + +.compilacaoedit .actions_head li:hover ul li{ + display: block; + background: #3498db; + background-image: none; +} + + +.compilacaoedit .actions_head a.btn-action { + background: #3498db; + background-image: -webkit-linear-gradient(top, #3498db, #2980b9); + background-image: -moz-linear-gradient(top, #3498db, #2980b9); + background-image: -ms-linear-gradient(top, #3498db, #2980b9); + background-image: -o-linear-gradient(top, #3498db, #2980b9); + background-image: linear-gradient(to bottom, #3498db, #2980b9); + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0px; + color: #ffffff !important; + font-size: 0.8em; + padding: 1px 6px 2px 7px; + text-decoration: none; + display: block; +} + +.compilacaoedit .actions_head a.btn-action:hover { + background: #3cb0fd; + background-image: -webkit-linear-gradient(top, #3cb0fd, #3498db); + background-image: -moz-linear-gradient(top, #3cb0fd, #3498db); + background-image: -ms-linear-gradient(top, #3cb0fd, #3498db); + background-image: -o-linear-gradient(top, #3cb0fd, #3498db); + background-image: linear-gradient(to bottom, #3cb0fd, #3498db); + text-decoration: none; +} + +.compilacaoedit .actions_head > li > a.btn-action { + font-weight: bold; + font-size: 1em; +} + +.compilacaoedit .actions_head { + z-index: 99; + opacity: 0.5; +} + +.compilacaoedit .actions_head:hover { + opacity: 1; +} + +.compilacaoedit .actions_insert { + opacity: 1; + display: block; +} + +.compilacaoedit .actions_insert li { + opacity: 1; + display: block; +} + +.compilacaoedit .actions_insert > li.right{ + opacity: 1; + width: 3em; + text-align: center; + clear:right; +} + +.compilacaoedit .actions_insert > li.left:nth-child(1), +.compilacaoedit .actions_insert > li.left:nth-child(2) { + opacity: 1; + display: block; + min-width: 35%; + max-width: 35%; +} +.compilacaoedit .actions_insert li.left:nth-child(1) ul, +.compilacaoedit .actions_insert li.left:nth-child(2) ul { + + display: block; + position: relative; + +} + +.compilacaoedit .actions_insert li.left:nth-child(3):hover ul { + right: 0; + box-shadow: -3px 3px 1.5em #336; +} + + + + + + + +.compilacaoedit .actions_footer { + color: #fff; + position: absolute; + top: 100%; + left: -2em; + opacity: 0; + transition: all 0.4s ease-in-out; + clip: rect(0,0,0,0); +} + +.compilacaoedit .actions_footer ul { + margin-left: 0; + margin-bottom: 0; +} + +.compilacaoedit .actions_footer li { + display: block; + height: auto !important; +} + +.compilacaoedit .editclick > .actions_footer a.btn-action { + background: #3498db; + + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0px; + color: #ffffff !important; + font-size: 12px; + padding: 1px 6px 1px 7px; + text-decoration: none; + display: block; +} + +.compilacaoedit .editclick > .actions_footer a.btn-action:hover { + background: #3cb0fd; + + text-decoration: none; +} +.compilacaoedit .editclick > .actions_footer { + z-index: 99; + opacity: 0.5; + clip: rect(0,0,0,0); +} + +.compilacaoedit .editclick > .actions_footer:hover { + opacity: 1; + clip: auto +} + +.clear { + clear:both; + height: 0; + width: 0; +} + + + +@media print { + .compilacao .vigencias { + display:none; + } } \ No newline at end of file diff --git a/templates/compilacao/edit.html b/templates/compilacao/edit.html new file mode 100644 index 000000000..54845b8c4 --- /dev/null +++ b/templates/compilacao/edit.html @@ -0,0 +1,154 @@ +{% extends "base.html" %} +{% load i18n %} +{% load compilacao_filters %} + +{% block title%} +

Edição: {{ view.get_norma }}

+{% endblock %} + +{% block base_content %} + + +
Aguarde... Atualizando informações!!!
+
+ {% include 'compilacao/edit_bloco.html'%} +
+{% endblock base_content %} \ No newline at end of file diff --git a/templates/compilacao/edit_bloco.html b/templates/compilacao/edit_bloco.html new file mode 100644 index 000000000..b3b4c555f --- /dev/null +++ b/templates/compilacao/edit_bloco.html @@ -0,0 +1,94 @@ +{% load i18n %} +{% load compilacao_filters %} + +{% for dispositivo in object_list %} + {% if dispositivo.nivel == view.flag_nivel_old %} + + {% elif dispositivo.nivel < view.flag_nivel_old %} + {% close_div view.flag_nivel_old dispositivo.nivel 0 %} + {% endif%} + + {% if forloop.first and view|isinst:'DispositivoEditView' %} + {% else %} +
+ {% endif%} + + {% if view|render_actions_head:dispositivo %} + + + + +
+
Em Edição: {% nomenclatura_heranca dispositivo %}
+
{ordem:{{dispositivo.ordem}}, nivel:{{dispositivo.nivel}}}
+
+ {% endif%} + + + {% if view.pk_view == 0 and view.pk_add == 0 or view.pk_add != view.pk_view%} + +
+ E +
+ + + +
+ + + {% endif%} + + {% set_nivel_old view dispositivo.nivel %} +{% endfor %} + +{% if view|isinst:'DispositivoEditView' %} + {% close_div view.flag_nivel_old view.flag_nivel_ini -1 %} +{% else %} + {% close_div view.flag_nivel_old view.flag_nivel_ini 0 %} +{% endif%} \ No newline at end of file diff --git a/templates/compilacao/bloco_alteracao.html b/templates/compilacao/edit_bloco_alteracao.html similarity index 87% rename from templates/compilacao/bloco_alteracao.html rename to templates/compilacao/edit_bloco_alteracao.html index 1aae4d260..d438e02af 100644 --- a/templates/compilacao/bloco_alteracao.html +++ b/templates/compilacao/edit_bloco_alteracao.html @@ -1,5 +1,5 @@ {% load compilacao_filters %} -{% for ch in dispositivo.pk|get_bloco %} +{% for ch in dispositivo.pk|get_bloco_atualizador %} {% spaceless %}
diff --git a/templates/compilacao/index.html b/templates/compilacao/index.html index 3e7c099a9..d694f657a 100644 --- a/templates/compilacao/index.html +++ b/templates/compilacao/index.html @@ -3,47 +3,51 @@ {% load compilacao_filters %} {% block title%} -

{{ view.get_norma }}

+

{{ view.get_norma }}

{% endblock %} {% block base_content %} -
+ + +
+--- ++++ +
+ {% for key, values in view.get_vigencias.items %} {% if forloop.first %}
@@ -84,7 +88,7 @@ function textoVigente(item, link) {
  • {% trans 'Texto Multivigente'%}
  • {% trans 'Texto Vigente COM Links para Normas Alteradoras'%}
  • {% trans 'Texto Vigente SEM Links para Normas Alteradoras'%}
  • - +
    @@ -96,6 +100,8 @@ function textoVigente(item, link) { {%endif%} -{% include 'compilacao/template_render_bloco.html'%} + + +{% include 'compilacao/index_bloco.html'%}
    {% endblock base_content %} \ No newline at end of file diff --git a/templates/compilacao/template_render_bloco.html b/templates/compilacao/index_bloco.html similarity index 52% rename from templates/compilacao/template_render_bloco.html rename to templates/compilacao/index_bloco.html index accf8086b..0f5297575 100644 --- a/templates/compilacao/template_render_bloco.html +++ b/templates/compilacao/index_bloco.html @@ -1,21 +1,16 @@ {% load i18n %} {% load compilacao_filters %} -{% for dispositivo in view.get_queryset %} +{% for dispositivo in object_list %} {% if dispositivo.nivel == view.flag_nivel_old %}
    {% elif dispositivo.nivel < view.flag_nivel_old %} - {% close_div view.flag_nivel_old dispositivo.nivel %} + {% close_div view.flag_nivel_old dispositivo.nivel 0 %} {% endif%} -
    -
    +
    +
    {% spaceless %} - {{ dispositivo.tipo_dispositivo.rotulo_prefixo_html|safe }} - {{ dispositivo.rotulo }} - {{ dispositivo.tipo_dispositivo.rotulo_sufixo_html|safe }} - {{ dispositivo.tipo_dispositivo.texto_prefixo_html|safe }} - {{ dispositivo.texto|safe }} - + {{ dispositivo.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dispositivo.rotulo }}{{ dispositivo.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dispositivo.tipo_dispositivo.texto_prefixo_html|safe }}{{ dispositivo.texto|safe }} {% if dispositivo.norma_publicada_id != None %} {{ dispositivo.tipo_dispositivo.nota_automatica_prefixo_html|safe }} @@ -25,11 +20,11 @@ {% endif %} {% endspaceless %} {% if view.is_norma_alteradora and dispositivo.tipo_dispositivo.class_css == 'bloco_alteracao'%} - {%with node=dispositivo template_name='compilacao/bloco_alteracao.html' %} + {%with node=dispositivo template_name='compilacao/index_bloco_alteracao.html' %} {%include template_name%} {%endwith%} {% endif%}
    {% set_nivel_old view dispositivo.nivel %} {% endfor %} -{% close_div view.flag_nivel_old view.flag_nivel_ini %} \ No newline at end of file +{% close_div view.flag_nivel_old view.flag_nivel_ini 0 %} \ No newline at end of file diff --git a/templates/compilacao/index_bloco_alteracao.html b/templates/compilacao/index_bloco_alteracao.html new file mode 100644 index 000000000..d438e02af --- /dev/null +++ b/templates/compilacao/index_bloco_alteracao.html @@ -0,0 +1,10 @@ +{% load compilacao_filters %} +{% for ch in dispositivo.pk|get_bloco_atualizador %} +{% spaceless %} +
    +
    + {{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ ch.rotulo }}{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }} +
    +
    +{% endspaceless %} +{% endfor %} \ No newline at end of file diff --git a/templates/sistema.html b/templates/sistema.html index 30b53958e..d86b83cf4 100644 --- a/templates/sistema.html +++ b/templates/sistema.html @@ -78,6 +78,15 @@
  • Assunto de Norma Jurídica
  • +
    Módulo Compilação
    + +
    Módulo Sessão Plenária
    • Tipo de Sessão Plenária
    • From e071c01260b39674301b91f0f841e5e55762406f Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Tue, 13 Oct 2015 10:36:59 -0300 Subject: [PATCH 02/23] Construction and structural editing norms --- .../migrations/0009_auto_20151007_1635.py | 23 +++++++++ compilacao/models.py | 9 ++-- compilacao/templatetags/compilacao_filters.py | 6 +-- compilacao/views.py | 51 ++++++++++++++----- static/styles/compilacao.scss | 18 +++++-- templates/compilacao/edit.html | 16 +++--- templates/compilacao/edit_bloco.html | 6 +-- templates/compilacao/index.html | 26 ++++++++-- 8 files changed, 110 insertions(+), 45 deletions(-) create mode 100644 compilacao/migrations/0009_auto_20151007_1635.py diff --git a/compilacao/migrations/0009_auto_20151007_1635.py b/compilacao/migrations/0009_auto_20151007_1635.py new file mode 100644 index 000000000..9a8618131 --- /dev/null +++ b/compilacao/migrations/0009_auto_20151007_1635.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0008_auto_20151005_1023'), + ] + + operations = [ + migrations.AlterField( + model_name='tipodispositivo', + name='rotulo_ordinal', + field=models.IntegerField(choices=[(0, 'Numeração Cardinal.'), (-1, 'Numeração Ordinal.'), (9, 'Numeração Ordinal até o item nove.')], verbose_name='Tipo de número do rótulo'), + ), + migrations.AlterUniqueTogether( + name='dispositivo', + unique_together=set([('norma', 'ordem'), ('norma', 'dispositivo0', 'dispositivo1', 'dispositivo2', 'dispositivo3', 'dispositivo4', 'dispositivo5', 'tipo_dispositivo', 'dispositivo_pai', 'norma_publicada', 'publicacao')]), + ), + ] diff --git a/compilacao/models.py b/compilacao/models.py index 17c0f1ae5..736d3fa4f 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -453,10 +453,11 @@ class Dispositivo(BaseModel): if len(prefixo) > 1: - if for_insertion and \ - d_base_for_insertion is not None and \ - d_base_for_insertion.pk != self.pk and \ - d_base_for_insertion.tipo_dispositivo.pk <= t.pk: + if (for_insertion and + d_base_for_insertion is not None and + d_base_for_insertion.pk != self.pk and + d_base_for_insertion.tipo_dispositivo.pk <= t.pk) or \ + for_insertion and d_base_for_insertion is None: count_irmaos_mesmo_tipo = Dispositivo.objects.filter( tipo_dispositivo=self.tipo_dispositivo, diff --git a/compilacao/templatetags/compilacao_filters.py b/compilacao/templatetags/compilacao_filters.py index 1a8feb527..6ff84b0e2 100644 --- a/compilacao/templatetags/compilacao_filters.py +++ b/compilacao/templatetags/compilacao_filters.py @@ -82,11 +82,7 @@ def render_actions_head(view, d_atual): if view.__class__.__name__ != 'DispositivoEditView': return False - # Apenas Menu actions head - if view.pk_add == 0 and d_atual.pk == view.pk_view: - return True - - # Menu e conteudo + # Menu if view.pk_view == view.pk_add and d_atual.pk == view.pk_view: return True diff --git a/compilacao/views.py b/compilacao/views.py index c0444c585..12b6df2d7 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -271,7 +271,7 @@ class CompilacaoEditView(CompilacaoView): ).select_related(*DISPOSITIVO_SELECT_RELATED) -class DispositivoEditView(DispositivoView): +class DispositivoEditView(CompilacaoEditView): template_name = 'compilacao/edit_bloco.html' def get_queryset(self): @@ -405,7 +405,8 @@ class DispositivoEditView(DispositivoView): for mudarnivel in [1, 0]: if mudarnivel: # Outros Tipos de Dispositivos PARA DENTRO - otds = TipoDispositivo.objects.order_by('-contagem_continua', 'id').filter( + otds = TipoDispositivo.objects.order_by( + '-contagem_continua', 'id').filter( Q(id__gt=100) & Q(id__gt=d_base.tipo_dispositivo_id)) else: # Outros Tipos de Dispositivos PARA FORA @@ -413,22 +414,36 @@ class DispositivoEditView(DispositivoView): for c in result[0]['itens']: if c['class_css'] not in classes_ja_inseridas: classes_ja_inseridas.append(c['class_css']) - otds = TipoDispositivo.objects.order_by('-contagem_continua', 'id').filter( + otds = TipoDispositivo.objects.order_by( + '-contagem_continua', 'id').filter( id__gt=100, id__lt=d_base.tipo_dispositivo_id).exclude( class_css__in=classes_ja_inseridas) for td in otds: - if (tipb.class_css == 'caput' and - td.class_css == 'paragrafo'): + if td.class_css == 'caput' or (tipb.class_css == 'caput' and + td.class_css == 'paragrafo'): continue d_base.tipo_dispositivo = td - disps = Dispositivo.objects.filter( - tipo_dispositivo_id=td.pk, - dispositivo_pai_id=d_base.pk).aggregate( + if td.contagem_continua: + disps = Dispositivo.objects.filter( + tipo_dispositivo_id=td.pk, + ordem__lte=d_base.ordem, + norma_id=d_base.norma_id).aggregate( + Max('dispositivo0'), + Max('dispositivo1'), + Max('dispositivo2'), + Max('dispositivo3'), + Max('dispositivo4'), + Max('dispositivo5')) + + else: + disps = Dispositivo.objects.filter( + tipo_dispositivo_id=td.pk, + dispositivo_pai_id=d_base.pk).aggregate( Max('dispositivo0'), Max('dispositivo1'), Max('dispositivo2'), @@ -464,14 +479,14 @@ class DispositivoEditView(DispositivoView): if mudarnivel == 1: result[1]['itens'] += r else: - if td.pk < tipb.pk and td.class_css != 'caput': + if td.pk < tipb.pk: result[2]['itens'] += r result[0]['itens'] += r # retira inserir após e inserir antes if tipb.class_css == 'caput': result.pop() - result.remove(result[0]) + # result.remove(result[0]) if tipb.class_css == 'articulacao': r = result[0] @@ -816,10 +831,18 @@ class ActionsEditMixin(object): pkfilho = dp.pk dp = dp.dispositivo_pai - parents = Dispositivo.objects.filter( - norma_id=dp.norma_id, - ordem__gte=dp.ordem, - nivel__lte=dp.nivel) + if proxima_articulacao is not None and \ + proxima_articulacao.exists(): + parents = Dispositivo.objects.filter( + norma_id=dp.norma_id, + ordem__gte=dp.ordem, + ordem__lt=proxima_articulacao[0].ordem, + nivel__lte=dp.nivel) + else: + parents = Dispositivo.objects.filter( + norma_id=dp.norma_id, + ordem__gte=dp.ordem, + nivel__lte=dp.nivel) nivel = sys.maxsize for p in parents: diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index eb0e25287..e649b6bc0 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -2,7 +2,7 @@ #message_block { - display: none; + display: block; position: fixed; top: 0; bottom: 0; @@ -14,7 +14,7 @@ #message_block #msg{ position: relative; - margin: 25% auto; + margin: 20% auto; padding: 1.2em 2em; max-width: 600px; text-align: center; @@ -152,7 +152,7 @@ } .dispositivo .bloco_alteracao { - padding-left: 5em; + padding-left: 10%; font-style: italic; } @@ -330,7 +330,8 @@ .compilacaoedit .editclick { border: 2.1em solid #eee; - padding: 1em; + padding: 1em; + padding-bottom: 0em; margin: 1em -2em 1em -2.8em; z-index: 1; background-color: #fff !important; @@ -532,6 +533,15 @@ width: 0; } +@media only screen and (max-width: 40.0625em) { + + .compilacao .fixed{ + z-index:98; + position: relative; + } + + +} @media print { diff --git a/templates/compilacao/edit.html b/templates/compilacao/edit.html index 54845b8c4..09f8d96ba 100644 --- a/templates/compilacao/edit.html +++ b/templates/compilacao/edit.html @@ -17,7 +17,7 @@ $(document).ready(function() { var flag_add_next_pai = 0 clickEditDispositivo = function(event) { - var _pk = event.target.getAttribute('pk'); + var _pk = event.currentTarget.getAttribute('pk'); if ($('#de'+_pk).hasClass("editclick")) { @@ -38,7 +38,7 @@ $(document).ready(function() { var _tipo_pk = ''; if (event != null) { - _pk = event.target.getAttribute('pk'); + _pk = event.currentTarget.getAttribute('pk'); _action = $(this).attr('action'); _variacao = $(this).attr('variacao'); _tipo_pk = $(this).attr('tipo_pk'); @@ -50,14 +50,12 @@ $(document).ready(function() { var url = '' if (_action == '') return - else if (_action == 'refresh' || typeof _action == 'undefined') + else if (_action == 'refresh' || _action == null) url = _pk+'/refresh?pkadd='+flag_add_next_pk; else { url = _pk+'/actions?action='+_action; url += '&tipo_pk='+_tipo_pk; url += '&variacao='+_variacao; - - if (typeof addeditclick == 'undefined' || addeditclick) { $("#message_block").css("display", "block"); } @@ -69,7 +67,7 @@ $(document).ready(function() { if (addeditclick) clearEditClick(); - if (_action == 'refresh' || typeof _action == 'undefined') { + if (_action == 'refresh' || _action == null) { if (flag_add_next) { @@ -86,7 +84,7 @@ $(document).ready(function() { if (typeof addeditclick == 'undefined' || addeditclick) { $('#de'+flag_add_next_pk).addClass('editclick'); $('html, body').animate({ - scrollTop: $('#de' + flag_add_next_pk ).offset().top - window.innerHeight / 3 + scrollTop: $('#de' + flag_add_next_pk ).offset().top - window.innerHeight / 10 }, 300); flag_add_next_pk = 0; } @@ -112,7 +110,7 @@ $(document).ready(function() { location.reload(true) } else { - alert('TODO: Inserção com renumeração '); + alert('Erro na inserção!'); flag_add_next_pk = 0; flag_add_next = false; } @@ -142,7 +140,7 @@ function reloadFunctionClicks() { } reloadFunctionClicks(); - +$("#message_block").css("display", "none"); }); diff --git a/templates/compilacao/edit_bloco.html b/templates/compilacao/edit_bloco.html index b3b4c555f..d8318baf4 100644 --- a/templates/compilacao/edit_bloco.html +++ b/templates/compilacao/edit_bloco.html @@ -27,9 +27,7 @@ {% endfor %} -
    • A
    • - -
    • >
    • +
    • >
    • <
    • @@ -51,7 +49,7 @@ {% endif%} - {% if view.pk_view == 0 and view.pk_add == 0 or view.pk_add != view.pk_view%} + {% if view.pk_view == 0 and view.pk_add == 0 or view.pk_add != view.pk_view %}
      E diff --git a/templates/compilacao/index.html b/templates/compilacao/index.html index d694f657a..080ec9286 100644 --- a/templates/compilacao/index.html +++ b/templates/compilacao/index.html @@ -19,9 +19,11 @@ $( window ).scroll(function() { $(window).load(function() { setTimeout(function() { - height = $( "section.vigencias" ).height() - window.scrollTo(0, window.pageYOffset - height - 36 ); - }, 1000); + height = $( "section.vigencias" ).height(); + $('html, body').animate({ + scrollTop: window.pageYOffset - height - 36 + }, 300); + }, 100); }); function textoMultiVigente(item) { @@ -38,14 +40,28 @@ function textoVigente(item, link) { if (!link) $(".link_alterador").addClass("displaynone"); } + +$(document).ready(function() { + $("#btn_font_menos").click(function() { + $(".dispositivo").css("font-size", "-=1"); + + }); + $("#btn_font_mais").click(function() { + $(".dispositivo").css("font-size", "+=1"); + + }); + +}); + +
      ---- -+++ +a +A
      {% for key, values in view.get_vigencias.items %} From b13dc29661e7affe1978e01ff73a2dd730b25490 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Tue, 20 Oct 2015 11:22:53 -0200 Subject: [PATCH 03/23] implement basic editing of Dispositivo - text editing with textarea - text editing with Tinymce --- compilacao/insert_inicial_TipoDispositivo.sql | 50 ++-- compilacao/models.py | 8 +- compilacao/urls.py | 1 - compilacao/views.py | 121 +++++++-- norma/models.py | 2 +- sapl/utils.py | 3 - static/styles/compilacao.scss | 155 ++++++----- templates/compilacao/edit.html | 252 ++++++++++-------- templates/compilacao/edit_bloco.html | 62 +++-- 9 files changed, 401 insertions(+), 253 deletions(-) diff --git a/compilacao/insert_inicial_TipoDispositivo.sql b/compilacao/insert_inicial_TipoDispositivo.sql index bc4dd8023..196e8e46d 100644 --- a/compilacao/insert_inicial_TipoDispositivo.sql +++ b/compilacao/insert_inicial_TipoDispositivo.sql @@ -1,27 +1,29 @@ -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (19, 'Artigo', 'artigo', '', 'Art.', 9, '', ' – ', '', '', '', '', true, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (21, 'Parágrafo', 'paragrafo', '', '§;Parágrafo Único', 9, '', ' – ', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (22, 'Inciso', 'inciso', '', '', 0, '', ' – ', '', '', '', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (23, 'Alinea', 'alinea', '', '', 0, '', ' – ', '', '', '', '', false, 'a', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (24, 'Item', 'item', '', '', 0, '', ' – ', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (25, 'Disposições Preliminares', 'disp_preliminares', '', 'Disposições Preliminares', 0, '', '
      ', '', '
      ', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (26, 'Disposições Gerais', 'disp_gerais', '', 'Disposições Gerais', 0, '', '
      ', '', '
      ', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (27, 'Disposições Transitórias', 'disp_transitorias', '', 'Disposições Transitórias', 0, '', '
      ', '', '
      ', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (28, 'Disposições Finais', 'disp_finais', '', 'Disposições Finais', 0, '', '
      ', '', '
      ', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (1, 'Articulação', 'articulacao', '', '', 0, '', '', '', '', '', '', true, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (2, 'Ementa', 'ementa', '', '', 0, '', '', '', '', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (20, 'Caput', 'caput', '', '', 0, '', '', '', '', '', '', false, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (29, 'Texto Não Estruturado', 'texto_n_estruturado', '', '', 0, '', '', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (3, 'Bloco Alteração', 'bloco_alteracao', '', '', 0, '', '', '', '', '', '', true, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (4, 'Omissis', 'omissis', '', '', 0, '', '', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (14, 'Título', 'titulo', '', 'Título', 0, '', '
      ', '', '
      ', '
      ', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (13, 'Livro', 'livro', '', 'Livro', 0, '', '
      ', '', '
      ', '
      ', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (12, 'Parte', 'parte', '', 'Parte', 0, '', '
      ', '', '
      ', '
      ', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (11, 'Anexo', 'anexo', '', 'Anexo', 0, '', '
      ', '', '
      ', '
      ', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (16, 'Seção', 'secao', '', 'Seção', 0, '', '
      ', '', '
      ', '
      ', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (17, 'SubSeção', 'subsecao', '', 'SubSeção', 0, '', '
      ', '', '
      ', '
      ', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (18, 'Item de Seção', 'itemsecao', '', 'Item', 0, '', '
      ', '', '
      ', '
      ', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45) VALUES (15, 'Capítulo', 'capitulo', '', 'Capítulo', -1, '', '
      ', '', '
      ', '
      ', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-'); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (125, 'Texto Não Estruturado', 'texto_n_estruturado', '', '', 0, '', '', '', '', '', '', false, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (2, 'Ementa', 'ementa', '', '', 0, '', '', '', '', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (4, 'Omissis', 'omissis', '', '', 0, '', '', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (102, 'Disposições Gerais', 'disp_gerais', '', 'Disposições Gerais', 0, '', '
      ', '', '
      ', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (103, 'Disposições Transitórias', 'disp_transitorias', '', 'Disposições Transitórias', 0, '', '
      ', '', '
      ', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (104, 'Disposições Finais', 'disp_finais', '', 'Disposições Finais', 0, '', '
      ', '', '
      ', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (122, 'Inciso', 'inciso', '', '', 0, '', ' – ', '', '', '', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (123, 'Alinea', 'alinea', '', '', 0, '', ' – ', '', '', '', '', false, 'a', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (120, 'Caput', 'caput', '', '', 0, '', '', '', '', '', '', false, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (118, 'Item de Seção', 'itemsecao', '', 'Item ', 0, '', '
      ', '', '
      ', '
      ', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (117, 'SubSeção', 'subsecao', '', 'SubSeção ', 0, '', '
      ', '', '
      ', '
      ', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (116, 'Seção', 'secao', '', 'Seção ', 0, '', '
      ', '', '
      ', '
      ', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (114, 'Título', 'titulo', '', 'Título ', 0, '', '
      ', '', '
      ', '
      ', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (113, 'Livro', 'livro', '', 'Livro ', 0, '', '
      ', '', '
      ', '
      ', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (112, 'Parte', 'parte', '', 'Parte ', 0, '', '
      ', '', '
      ', '
      ', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (111, 'Anexo', 'anexo', '', 'Anexo ', 0, '', '
      ', '', '
      ', '
      ', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (115, 'Capítulo', 'capitulo', '', 'Capítulo ', 0, '', '
      ', '', '
      ', '
      ', '', false, 'I', 'A', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (124, 'Item', 'item', '', '', 0, '', ' – ', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '.', '.', '.', '.', '.', false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (121, 'Parágrafo', 'paragrafo', '', '§ ;Parágrafo Único ', 9, '', ' – ', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (101, 'Disposições Preliminares', 'disp_preliminares', '', 'Disposições Preliminares', 0, '', '
      ', '', '
      ', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (119, 'Artigo', 'artigo', '', 'Art. ', 9, '.', ' – ', '', '', '', '', true, '1', 'A', '1', '1', '1', '1', '-', '-', '-', '-', '-', true); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (3, 'Bloco Alteração', 'bloco_alteracao', '', '', 0, '', '', '', '', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', true); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (1, 'Articulação', 'articulacao', '', '', 0, '', '', '', '', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', true); -SELECT pg_catalog.setval('compilacao_tipodispositivo_id_seq', 28, true); + + +SELECT pg_catalog.setval('compilacao_tipodispositivo_id_seq', 125, true); diff --git a/compilacao/models.py b/compilacao/models.py index 736d3fa4f..d208d283b 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -467,7 +467,8 @@ class Dispositivo(BaseModel): tipo_dispositivo=self.tipo_dispositivo, dispositivo_pai=self.dispositivo_pai).count() - if count_irmaos_mesmo_tipo > 1 and self.dispositivo0 != 0: + if count_irmaos_mesmo_tipo > 1 or ( + self.dispositivo0 != 0 and not for_insertion): r += prefixo[0] r += self.get_nomenclatura_completa() elif count_irmaos_mesmo_tipo == 1 and for_insertion: @@ -706,9 +707,8 @@ class Dispositivo(BaseModel): try: dispositivos = Dispositivo.objects.order_by('-ordem').filter( norma_id=self.norma_id) - except Exception as e: - a = 1 - a += 1 + except: + return ordem = dispositivos.count() * 1000 for d in dispositivos: d.ordem = ordem diff --git a/compilacao/urls.py b/compilacao/urls.py index 540d1adc9..a60a623be 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -1,5 +1,4 @@ from django.conf.urls import url, include -from django.contrib.auth.decorators import permission_required from compilacao import views from compilacao.views import (tipo_nota_crud, tipo_vide_crud, diff --git a/compilacao/views.py b/compilacao/views.py index 12b6df2d7..b5bbc090f 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -1,7 +1,8 @@ from collections import OrderedDict -from datetime import timedelta +from datetime import timedelta, datetime from os.path import sys +from django import forms from django.core.signing import Signer from django.db.models import Q from django.db.models.aggregates import Max @@ -9,10 +10,11 @@ from django.http.response import JsonResponse from django.utils.dateparse import parse_date from django.utils.translation import ugettext_lazy as _ from django.views.generic.base import TemplateView +from django.views.generic.edit import FormMixin from django.views.generic.list import ListView -from compilacao.models import Dispositivo, TipoNota, TipoVide, TipoPublicacao,\ - VeiculoPublicacao, TipoDispositivo +from compilacao.models import (Dispositivo, TipoNota, TipoVide, TipoPublicacao, + VeiculoPublicacao, TipoDispositivo) from norma.models import NormaJuridica from sapl.crud import build_crud @@ -265,14 +267,74 @@ class CompilacaoEditView(CompilacaoView): self.flag_nivel_ini = 0 self.flag_nivel_old = -1 - return Dispositivo.objects.filter( - ordem__gt=0, + result = Dispositivo.objects.filter( norma_id=self.kwargs['norma_id'] ).select_related(*DISPOSITIVO_SELECT_RELATED) + if not result.exists(): + + norma = NormaJuridica.objects.get(pk=self.kwargs['norma_id']) + + td = TipoDispositivo.objects.filter(class_css='articulacao')[0] + a = Dispositivo() + a.nivel = 0 + a.ordem = Dispositivo.INTERVALO_ORDEM + a.ordem_bloco_atualizador = 0 + a.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + a.norma = norma + a.tipo_dispositivo = td + a.inicio_vigencia = norma.data_publicacao + a.inicio_eficacia = norma.data_publicacao + a.timestamp = datetime.now() + a.save() + + td = TipoDispositivo.objects.filter(class_css='ementa')[0] + e = Dispositivo() + e.nivel = 1 + e.ordem = a.ordem + Dispositivo.INTERVALO_ORDEM + e.ordem_bloco_atualizador = 0 + e.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + e.norma = norma + e.tipo_dispositivo = td + e.inicio_vigencia = norma.data_publicacao + e.inicio_eficacia = norma.data_publicacao + e.timestamp = datetime.now() + e.texto = norma.ementa + e.save() + + a.pk = None + a.nivel = 0 + a.ordem = e.ordem + Dispositivo.INTERVALO_ORDEM + a.ordem_bloco_atualizador = 0 + a.set_numero_completo([2, 0, 0, 0, 0, 0, ]) + a.timestamp = datetime.now() + a.save() + + result = Dispositivo.objects.filter( + norma_id=self.kwargs['norma_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + + return result + + +class DispositivoSimpleEditForm(forms.Form): + texto = forms.CharField(required=False, widget=forms.Textarea) + -class DispositivoEditView(CompilacaoEditView): +class DispositivoEditView(CompilacaoEditView, FormMixin): template_name = 'compilacao/edit_bloco.html' + form_class = DispositivoSimpleEditForm + + def post(self, request, *args, **kwargs): + + d = Dispositivo.objects.get( + pk=self.kwargs['dispositivo_id']) + + texto = request.POST['texto'] + d.texto = texto + d.save() + + return self.get(request, *args, **kwargs) def get_queryset(self): self.flag_alteradora = -1 @@ -422,8 +484,7 @@ class DispositivoEditView(CompilacaoEditView): for td in otds: - if td.class_css == 'caput' or (tipb.class_css == 'caput' and - td.class_css == 'paragrafo'): + if td.class_css == 'caput': continue d_base.tipo_dispositivo = td @@ -477,17 +538,21 @@ class DispositivoEditView(CompilacaoEditView): 'dispositivo_base': d_base.pk}] if mudarnivel == 1: - result[1]['itens'] += r + if (tipb.class_css == 'caput' and + td.class_css == 'paragrafo'): + result[0]['itens'].insert(0, r[0]) + else: + result[1]['itens'] += r else: if td.pk < tipb.pk: result[2]['itens'] += r result[0]['itens'] += r - # retira inserir após e inserir antes if tipb.class_css == 'caput': result.pop() # result.remove(result[0]) + # retira inserir após e inserir antes if tipb.class_css == 'articulacao': r = result[0] result.remove(result[0]) @@ -513,7 +578,13 @@ class ActionsEditMixin(object): pass def add_in(self, context): - pass + # pai = Dispositivo.objects.get(pk=context['dispositivo_id']) + # dp = Dispositivo.objects.get(pk=context['dispositivo_id']) + + # Tipo Filho + # tf = TipoDispositivo.objects.get(pk=context['tipo_pk']) + + return {} def add_next(self, context): try: @@ -521,17 +592,18 @@ class ActionsEditMixin(object): dp = Dispositivo.objects.get(pk=context['dispositivo_id']) tipo = TipoDispositivo.objects.get(pk=context['tipo_pk']) + variacao = int(context['variacao']) while dp.dispositivo_pai is not None and \ dp.tipo_dispositivo_id != tipo.pk: dp = dp.dispositivo_pai - # Inserção interna a uma articulação um tipo já existente - # ou de uma articulacao + # Inserção interna a uma articulação de um tipo já existente + # ou de uma nova articulacao if dp.dispositivo_pai is not None or \ tipo.class_css == 'articulacao': - dp.transform_in_next(int(context['variacao'])) + dp.transform_in_next(variacao) dp.rotulo = dp.rotulo_padrao() dp.texto = '' dp.pk = None @@ -548,16 +620,17 @@ class ActionsEditMixin(object): if not tipo.contagem_continua: irmaos = list(Dispositivo.objects.filter( + Q(ordem__gt=dp.ordem) | Q(dispositivo0=0), dispositivo_pai_id=dp.dispositivo_pai_id, - ordem__gt=dp.ordem, tipo_dispositivo_id=tipo.pk)) + elif tipo.class_css == 'articulacao': irmaos = list(Dispositivo.objects.filter( ordem__gt=dp.ordem, norma_id=dp.norma_id, tipo_dispositivo_id=tipo.pk)) - else: # contagem continua restrita a articulacao + else: # contagem continua restrita a articulacao proxima_articulacao = Dispositivo.objects.filter( ordem__gt=dp.ordem, nivel=0, @@ -580,6 +653,11 @@ class ActionsEditMixin(object): irmaos_a_salvar = [] ultimo_irmao = None for irmao in irmaos: + + if irmao.ordem <= dp.ordem: + irmaos_a_salvar.append(irmao) + continue + irmao_profundidade = irmao.get_profundidade() if irmao_profundidade < dp_profundidade: break @@ -613,6 +691,12 @@ class ActionsEditMixin(object): irmaos_a_salvar.reverse() for irmao in irmaos_a_salvar: + if irmao.dispositivo0 == 0 and \ + irmao.ordem <= dp.ordem and variacao == 0: + irmao.dispositivo0 = 1 + irmao.rotulo = irmao.rotulo_padrao() + dp.dispositivo0 = 2 + dp.rotulo = dp.rotulo_padrao() irmao.clean() irmao.save() @@ -654,7 +738,8 @@ class ActionsEditMixin(object): dp.norma_publicada = None if tipo.contagem_continua: - ultimo_irmao = Dispositivo.objects.order_by('-ordem').filter( + ultimo_irmao = Dispositivo.objects.order_by( + '-ordem').filter( ordem__lte=dp.ordem, tipo_dispositivo_id=tipo.pk, norma_id=dp.norma_id)[:1] @@ -765,7 +850,7 @@ class ActionsEditMixin(object): filho.clean() filho.save() - ''' Renumerar dispositivos de + ''' Renumerar dispositivos de contagem continua, caso a inserção seja uma articulação''' numtipos = {} diff --git a/norma/models.py b/norma/models.py index a6f24dce7..265ad129d 100644 --- a/norma/models.py +++ b/norma/models.py @@ -97,7 +97,7 @@ class NormaJuridica(models.Model): class Meta: verbose_name = _('Norma Jurídica') verbose_name_plural = _('Normas Jurídicas') - ordering = ['-data'] + ordering = ['-data', '-numero'] def __str__(self): return _('%(tipo)s nº %(numero)s de %(data)s') % { diff --git a/sapl/utils.py b/sapl/utils.py index 10962a55e..139a504c2 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -1,10 +1,7 @@ -from builtins import TypeError - from django.apps import apps from django.contrib import admin from django.utils.translation import ugettext_lazy as _ - # SAPL business apps # This is a dependency order: each entry depends only on previous ones # The order is important for migration code diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index e649b6bc0..a8e7ade94 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -214,33 +214,18 @@ .compilacaoedit { + margin-bottom: 30em; margin-left: 0.8em; z-index: 1; } -.compilacaoedit .articulacao{ - - margin-left: -0.8em; - margin-top: 2em; +.compilacaoedit .semtexto { + font-weight: bold; + color: #8DA6D8; } -.compilacaoedit .articulacao::before { - content: "Articulação"; - background-color: #eee; - border-bottom: 1px solid #aaa; - padding: 0.333em; - padding-left: 1em; - display:block; -} -.compilacaoedit .editclick .articulacao::before { - display: none; -} -.compilacaoedit .editdi { - display: block; - clear: left; -} .compilacaoedit .edit { position: relative; @@ -314,11 +299,47 @@ right: -0.51rem; } -.compilacaoedit .edit *:hover { + +.compilacaoedit .editdi { + display: block; + clear: left; +} + +.compilacaoedit .editdi *:hover { background-color: #eee; } -.compilacaoedit .editclick > .label_pai { + +.compilacaoedit .articulacao{ + + margin-left: -0.8em; + margin-top: 2em; +} + +.compilacaoedit .articulacao::before { + content: "Articulação"; + background-color: #eee; + border-bottom: 1px solid #aaa; + padding: 0.333em; + padding-left: 1em; + display:block; +} + +.compilacaoedit .editselected .articulacao::before { + display: none; +} +.compilacaoedit .editselected > .editdi { + padding: 1em; +} + +.compilacaoedit .editdi_form { + display: block; + clear: both; + padding: 1em; +} + + +.compilacaoedit .editselected > .label_pai { position: absolute; color: #999; top: -1.7em; @@ -328,9 +349,9 @@ height: auto; } -.compilacaoedit .editclick { +.compilacaoedit .editselected { border: 2.1em solid #eee; - padding: 1em; + padding: 0 0 1em 0; padding-bottom: 0em; margin: 1em -2em 1em -2.8em; z-index: 1; @@ -338,7 +359,7 @@ box-shadow: 0 1px 2px #aaa; } -.compilacaoedit .editclick > .actions { +.compilacaoedit .editselected > .actions { display: none; } @@ -348,9 +369,9 @@ position: relative; opacity: 0; transition: all 0.4s ease-in-out; - border-bottom: 1px solid #2980b9; + border-top: 1px solid #2980b9; z-index: 9; - margin: -1em -1em 2em -1em; + margin: 0em; } .compilacaoedit .actions_head ul { @@ -365,13 +386,16 @@ max-width:something; } .compilacaoedit .actions_head > li.left { - border-left: 1px solid white; + border-right: 1px solid white; } -.compilacaoedit .actions_head > li.right{ +.compilacaoedit .actions_head > li.right { width: 3em; - text-align: center; + text-align: center; +} + +.compilacaoedit .actions_head > li.right:nth-child(3n + 1) { clear:right; } @@ -424,6 +448,7 @@ .compilacaoedit .actions_head > li > a.btn-action { font-weight: bold; font-size: 1em; + } .compilacaoedit .actions_head { @@ -448,44 +473,40 @@ .compilacaoedit .actions_insert > li.right{ opacity: 1; width: 3em; - text-align: center; + text-align: center; +} +.compilacaoedit .actions_insert > li.right:nth-child(3n + 1) { clear:right; } + .compilacaoedit .actions_insert > li.left:nth-child(1), .compilacaoedit .actions_insert > li.left:nth-child(2) { opacity: 1; display: block; - min-width: 35%; - max-width: 35%; + min-width: 30%; + max-width: 30%; } .compilacaoedit .actions_insert li.left:nth-child(1) ul, .compilacaoedit .actions_insert li.left:nth-child(2) ul { - display: block; position: relative; - } -.compilacaoedit .actions_insert li.left:nth-child(3):hover ul { - right: 0; +.compilacaoedit .actions_insert li.left:nth-child(n+3):hover ul { + right: 0; box-shadow: -3px 3px 1.5em #336; } - - - - - -.compilacaoedit .actions_footer { - color: #fff; - position: absolute; - top: 100%; - left: -2em; - opacity: 0; - transition: all 0.4s ease-in-out; - clip: rect(0,0,0,0); +.compilacaoedit .actions_footer { + position: absolute; + top: 100%; + left: -1.8em; + right: -1.8em; + color: #999; + transition: all 0.4s ease-in-out; + padding: 0.3em 0; } .compilacaoedit .actions_footer ul { @@ -497,42 +518,18 @@ display: block; height: auto !important; } - -.compilacaoedit .editclick > .actions_footer a.btn-action { - background: #3498db; - - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0px; - color: #ffffff !important; - font-size: 12px; - padding: 1px 6px 1px 7px; - text-decoration: none; - display: block; -} - -.compilacaoedit .editclick > .actions_footer a.btn-action:hover { - background: #3cb0fd; - - text-decoration: none; -} -.compilacaoedit .editclick > .actions_footer { - z-index: 99; - opacity: 0.5; - clip: rect(0,0,0,0); -} - -.compilacaoedit .editclick > .actions_footer:hover { - opacity: 1; - clip: auto -} - + .clear { clear:both; height: 0; width: 0; } +#tinymce .mceContentBody p { + font-family: "Open Sans" "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif !important; +} + + @media only screen and (max-width: 40.0625em) { .compilacao .fixed{ diff --git a/templates/compilacao/edit.html b/templates/compilacao/edit.html index 09f8d96ba..07fbcfbdf 100644 --- a/templates/compilacao/edit.html +++ b/templates/compilacao/edit.html @@ -3,7 +3,7 @@ {% load compilacao_filters %} {% block title%} -

      Edição: {{ view.get_norma }}

      +

      Edição: {{ view.get_norma }} - Texto Multivigente

      {% endblock %} {% block base_content %} @@ -12,77 +12,91 @@ $(document).ready(function() { - var flag_add_next = false - var flag_add_next_pk = 0 - var flag_add_next_pai = 0 - - clickEditDispositivo = function(event) { - var _pk = event.currentTarget.getAttribute('pk'); - - - if ($('#de'+_pk).hasClass("editclick")) { - clearEditClick(); - return; - } - - clearEditClick(); - - clickUpdateDispositivo(event) - } - - clickUpdateDispositivo = function(event, __pk, __action, addeditclick) { - - var _pk = __pk; - var _action = __action; - var _variacao = ''; - var _tipo_pk = ''; - - if (event != null) { - _pk = event.currentTarget.getAttribute('pk'); - _action = $(this).attr('action'); - _variacao = $(this).attr('variacao'); - _tipo_pk = $(this).attr('tipo_pk'); - } - - if (flag_add_next_pk == 0) - flag_add_next_pk = _pk - - var url = '' - if (_action == '') - return - else if (_action == 'refresh' || _action == null) - url = _pk+'/refresh?pkadd='+flag_add_next_pk; - else { - url = _pk+'/actions?action='+_action; - url += '&tipo_pk='+_tipo_pk; - url += '&variacao='+_variacao; - if (typeof addeditclick == 'undefined' || addeditclick) { - $("#message_block").css("display", "block"); - } - } + var flag_add_next = false + var flag_add_next_pk = 0 + var flag_add_next_pai = 0 + + var withTinymce = false + + clickEditDispositivo = function(event) { + var _pk = event.currentTarget.getAttribute('pk'); + if ($('#de'+_pk).hasClass("editselected")) { + clearEditSelected(); + return; + } + clearEditSelected(); + clickUpdateDispositivo(event) + } + + clickUpdateDispositivo = function(event, __pk, __action, addeditselected) { + + var _pk = __pk; + var _action = __action; + var _variacao = ''; + var _tipo_pk = ''; + + if (event != null) { + _pk = event.currentTarget.getAttribute('pk'); + _action = $(this).attr('action'); + _variacao = $(this).attr('variacao'); + _tipo_pk = $(this).attr('tipo_pk'); + } - $.get(url).done(function( data ) { - - if (addeditclick) - clearEditClick(); + if (flag_add_next_pk == 0) + flag_add_next_pk = _pk + + var url = '' + if (_action == '') + return + else if ( _action == null || _action.startsWith('refresh')) { + + if (_action != null && _action.endsWith('tinymce')) + withTinymce = true; + else if (_action != null && _action.endsWith('textarea')) + withTinymce = false; + + url = _pk+'/refresh?pkadd='+flag_add_next_pk+url; + + } + else { + url = _pk+'/actions?action='+_action; + url += '&tipo_pk='+_tipo_pk; + url += '&variacao='+_variacao; + if (addeditselected == null || addeditselected) { + $("#message_block").css("display", "block"); + } + } - if (_action == 'refresh' || _action == null) { + $.get(url).done(function( data ) { + if ( _action == null || _action.startsWith('refresh')) { + + if (addeditselected) + clearEditSelected(); if (flag_add_next) { - $( '#de' + _pk ).html( data); + $( '#de' + _pk ).html( data); flag_add_next = false } else { - clearEditClick(); + clearEditSelected(); $( '#de' + _pk ).prepend( data ); - } - - reloadFunctionClicks(); - - if (typeof addeditclick == 'undefined' || addeditclick) { - $('#de'+flag_add_next_pk).addClass('editclick'); + } + reloadFunctionClicks(); + + if ( withTinymce ) + tinymce.init({ + mode : "textareas", + force_br_newlines : false, + force_p_newlines : false, + forced_root_block : '', + plugins: "table", + tools: "inserttable", + }); + + if (addeditselected == null || addeditselected) { + $('#de'+flag_add_next_pk).addClass('editselected'); $('html, body').animate({ scrollTop: $('#de' + flag_add_next_pk ).offset().top - window.innerHeight / 10 }, 300); @@ -91,62 +105,92 @@ $(document).ready(function() { } else if (_action == 'add_next') { - - clearEditClick(); - - flag_add_next_pk = data.pk; - flag_add_next_pai = data.pai; - - if (flag_add_next_pk != null) - for (var pai = 0; pai < flag_add_next_pai.length; pai++) - if (flag_add_next_pai[pai] != -1) { + + clearEditSelected(); + + flag_add_next_pk = data.pk; + flag_add_next_pai = data.pai; + + if (flag_add_next_pk != null) + for (var pai = 0; pai < flag_add_next_pai.length; pai++) + if (flag_add_next_pai[pai] != -1) { flag_add_next = true; flag_add_next_pk = data.pk; clickUpdateDispositivo(null, flag_add_next_pai[pai], 'refresh', pai == 0); - } - else { - href = location.href.split('#')[0] - location.href = href+'#'+flag_add_next_pk - location.reload(true) - } - else { - alert('Erro na inserção!'); - flag_add_next_pk = 0; - flag_add_next = false; - } - } - }).always(function() { - $("#message_block").css("display", "none"); - }); - - } - - -function clearEditClick() { - $('.editclick').removeClass('editclick'); - $('.editclick .label_pai, .edit .label_pai').remove(); - $('.editclick .actions_head, .edit .actions_head').remove(); - $('.editclick .actions_footer, .edit .actions_footer').remove(); + } + else { + href = location.href.split('#')[0] + location.href = href+'#'+flag_add_next_pk + location.reload(true) + } + else { + alert('Erro na inserção!'); + flag_add_next_pk = 0; + flag_add_next = false; + } + } + }).always(function() { + $("#message_block").css("display", "none"); + }); + } + + +function clearEditSelected() { + tinymce.remove(); + $('.editselected').removeClass('editselected'); + $('.editdi_form').remove(); + $('.editselected .label_pai, .edit .label_pai').remove(); + $('.editselected .actions_head, .edit .actions_head').remove(); + $('.editselected .actions_footer, .edit .actions_footer').remove(); } function reloadFunctionClicks() { - $('.dispositivo .edit .di').off(); - $('.actions .btn-action').off(); - $('.actions_head .btn-action').off(); - - $('.dispositivo .edit .di').on('click', clickEditDispositivo); - $('.actions .btn-action').on('click', clickEditDispositivo); - $('.actions_head .btn-action').on('click', clickUpdateDispositivo); + $('.dispositivo .edit .di').off(); + $('.actions .btn-action').off(); + $('.actions_head .btn-action').off(); + $('.dispositivo .edit .di').on('click', clickEditDispositivo); + $('.actions .btn-action').on('click', clickEditDispositivo); + $('.actions_head .btn-action').on('click', clickUpdateDispositivo); + + $('.editdi_form form').submit(function(event) { + var texto = '' + var editorTiny = tinymce.get('editdi_texto') + + if (editorTiny != null) + texto = editorTiny.getContent(); + else + texto = $('#editdi_texto').val(); + + var formData = { + 'csrfmiddlewaretoken' : $('input[name=csrfmiddlewaretoken]').val(), + 'texto' : texto + }; + var $form = $( this ), + url = $form.attr( "action" ); + $("#message_block").css("display", "block"); + $.post(url,formData) + .done(function(data) { + $('.editselected').html(data); + clearEditSelected(); + reloadFunctionClicks(); + + }).always(function() { + $("#message_block").css("display", "none"); + }); + event.preventDefault(); + }); } reloadFunctionClicks(); $("#message_block").css("display", "none"); + });
      Aguarde... Atualizando informações!!!
      - {% include 'compilacao/edit_bloco.html'%} + {% include 'compilacao/edit_bloco.html'%}
      -{% endblock base_content %} \ No newline at end of file +{% endblock base_content %} + diff --git a/templates/compilacao/edit_bloco.html b/templates/compilacao/edit_bloco.html index d8318baf4..751ecf71d 100644 --- a/templates/compilacao/edit_bloco.html +++ b/templates/compilacao/edit_bloco.html @@ -10,10 +10,30 @@ {% if forloop.first and view|isinst:'DispositivoEditView' %} {% else %} -
      +
      {% endif%} {% if view|render_actions_head:dispositivo %} +
        + + + {% if not dispositivo.tipo_dispositivo.dispositivo_de_articulacao %} +
      • E++
      • +
      • E+
      • +
      • E
      • + {% endif%} + +
      • ↑↑
      • +
      • +
      • >
      • + + +
      • ↓↓
      • +
      • +
      • <
      • + +
      +
        {% for inserts in view.select_provaveis_inserts%} @@ -26,25 +46,16 @@ {% endfor %} - -
      • >
      • -
      • <
      • -
      • -
      • -
      • ↓↓
      • -
      • ↑↑
      • -
      - +
    + +
    Ordem: {{dispositivo.ordem}}, nivel: {{dispositivo.nivel}}
    +
    Número: {{dispositivo.get_numero_completo}}
    +
    Em Edição: {% nomenclatura_heranca dispositivo %}
    -
    {ordem:{{dispositivo.ordem}}, nivel:{{dispositivo.nivel}}}
    +
    {% endif%} @@ -56,11 +67,11 @@
    -
    + -
    + {% else%} + + {% if not dispositivo.tipo_dispositivo.dispositivo_de_articulacao %} +
    +
    + {% csrf_token %} + +
    + +
    +
    +
    + {%endif%} + {% endif%} {% set_nivel_old view dispositivo.nivel %} From d919e1aa247b7530b312b6310e09b1ed8eda0628 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Wed, 21 Oct 2015 20:00:29 -0200 Subject: [PATCH 04/23] Improvements in interface editing of Dispositivo --- compilacao/views.py | 6 +- static/js/compilacao.js | 191 +++++++++++++++++++++++ static/styles/compilacao.scss | 223 ++++++++++++++++++--------- static/styles/compilacao_tinymce.css | 10 ++ templates/compilacao/edit.html | 190 ++--------------------- templates/compilacao/edit_bloco.html | 112 +++++++------- 6 files changed, 414 insertions(+), 318 deletions(-) create mode 100644 static/js/compilacao.js create mode 100644 static/styles/compilacao_tinymce.css diff --git a/compilacao/views.py b/compilacao/views.py index b5bbc090f..49c1423a7 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -389,13 +389,13 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): else: d_base = Dispositivo.objects.get(pk=self.pk_add) - result = [{'tipo_insert': 'Inserir Depois', + result = [{'tipo_insert': '↷  Inserir Depois', 'action': 'add_next', 'itens': []}, - {'tipo_insert': 'TODO: Inserir Dentro', + {'tipo_insert': '⇲  TODO: Inserir Dentro', 'action': 'add_in', 'itens': []}, - {'tipo_insert': 'TODO: Inserir Antes', + {'tipo_insert': '↶  TODO: Inserir Antes', 'action': 'add_prior', 'itens': []} ] diff --git a/static/js/compilacao.js b/static/js/compilacao.js new file mode 100644 index 000000000..1503fbaf1 --- /dev/null +++ b/static/js/compilacao.js @@ -0,0 +1,191 @@ + +$(document).ready(function() { + +var flag_add_next = false +var flag_add_next_pk = 0 +var flag_add_next_pai = 0 + +var withTinymce = false + +var onSubmitEditForm = function(event) { + + var texto = '' + var editorTiny = tinymce.get('editdi_texto') + + if (editorTiny != null) + texto = editorTiny.getContent(); + else + texto = $('#editdi_texto').val(); + + var formData = { + 'csrfmiddlewaretoken' : $('input[name=csrfmiddlewaretoken]').val(), + 'texto' : texto + }; + var url = $('.editdi_form form').attr( "action_ajax" ); + $("#message_block").css("display", "block"); + $.post(url,formData) + .done(function(data) { + $('.editselected').html(data); + clearEditSelected(); + reloadFunctionClicks(); + }).always(function() { + $("#message_block").css("display", "none"); + }); + event.preventDefault(); +} + +var clickEditDispositivo = function(event) { + var _pk = event.currentTarget.getAttribute('pk'); + if ($('#de'+_pk).hasClass("editselected")) { + clearEditSelected(); + return; + } + clearEditSelected(); + clickUpdateDispositivo(event) +} + +var clickUpdateDispositivo = function(event, __pk, __action, addeditselected) { + + var _pk = __pk; + var _action = __action; + var _variacao = ''; + var _tipo_pk = ''; + + if (event != null) { + _pk = event.currentTarget.getAttribute('pk'); + _action = $(this).attr('action'); + _variacao = $(this).attr('variacao'); + _tipo_pk = $(this).attr('tipo_pk'); + } + + if (flag_add_next_pk == 0) + flag_add_next_pk = _pk + + var url = '' + if (_action == '') + return + else if ( _action == null || _action.startsWith('refresh')) { + + if (_action != null && _action.endsWith('tinymce')) + withTinymce = true; + else if (_action != null && _action.endsWith('textarea')) + withTinymce = false; + + url = _pk+'/refresh?pkadd='+flag_add_next_pk+url; + + } + else { + url = _pk+'/actions?action='+_action; + url += '&tipo_pk='+_tipo_pk; + url += '&variacao='+_variacao; + if (addeditselected == null || addeditselected) { + $("#message_block").css("display", "block"); + } + } + + $.get(url).done(function( data ) { + + if ( _action == null || _action.startsWith('refresh')) { + + if (flag_add_next) { + + if (addeditselected) + clearEditSelected(); + + $( '#de' + _pk ).html( data); + flag_add_next = false + } + else { + clearEditSelected(); + $( '#de' + _pk ).prepend( data ); + } + reloadFunctionClicks(); + + if ( withTinymce ) { + initTinymce() + } + else { + $('.editdi_form form').submit(onSubmitEditForm); + } + + if (addeditselected == null || addeditselected) { + $('#de'+flag_add_next_pk).addClass('editselected'); + $('html, body').animate({ + scrollTop: $('#de' + flag_add_next_pk ).offset().top - window.innerHeight / 10 + }, 300); + flag_add_next_pk = 0; + } + } + + else if (_action == 'add_next') { + + clearEditSelected(); + + flag_add_next_pk = data.pk; + flag_add_next_pai = data.pai; + + if (flag_add_next_pk != null) + for (var pai = 0; pai < flag_add_next_pai.length; pai++) + if (flag_add_next_pai[pai] != -1) { + flag_add_next = true; + flag_add_next_pk = data.pk; + clickUpdateDispositivo(null, flag_add_next_pai[pai], 'refresh', pai == 0); + } + else { + href = location.href.split('#')[0] + location.href = href+'#'+flag_add_next_pk + location.reload(true) + } + else { + alert('Erro na inserção!'); + flag_add_next_pk = 0; + flag_add_next = false; + } + } + }).always(function() { + $("#message_block").css("display", "none"); + }); +} + + +function clearEditSelected() { + tinymce.remove(); + $('.editselected').removeClass('editselected'); + $('.editdi_form').remove(); + $('.editselected .label_pai, .edit .label_pai').remove(); + $('.editselected .actions_head, .edit .actions_head').remove(); + $('.editselected .actions_footer, .edit .actions_footer').remove(); +} + +function reloadFunctionClicks() { + $('.dispositivo .edit .di').off(); + $('.actions .btn-action').off(); + $('.actions_head .btn-action').off(); + $('.dispositivo .edit .di').on('click', clickEditDispositivo); + $('.actions .btn-action').on('click', clickEditDispositivo); + $('.actions_head .btn-action').on('click', clickUpdateDispositivo); +} + +function initTinymce() { + + tinymce.init({ + mode : "textareas", + force_br_newlines : false, + force_p_newlines : false, + forced_root_block : '', + plugins: ["table save code"], + menubar: "edit format table tools", + toolbar: "save | undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent", + tools: "inserttable", + save_onsavecallback: onSubmitEditForm, + border_css: "/static/styles/compilacao_tinymce.css", + content_css: "/static/styles/compilacao_tinymce.css" + }); +} + + +reloadFunctionClicks(); +$("#message_block").css("display", "none"); + +}); + diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index a8e7ade94..9c292481f 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -241,12 +241,12 @@ color: #fff; position: absolute; padding: 0 0.2em; - left: -2.1em; + left: -2.2em; opacity: 0; transition: all 0.4s ease-in-out; } -.compilacaoedit .edit > .actions a.btn-action { +.compilacaoedit .edit > .actions a.btn-inserts { background: #3498db; background-image: -webkit-linear-gradient(top, #3498db, #2980b9); background-image: -moz-linear-gradient(top, #3498db, #2980b9); @@ -256,14 +256,13 @@ -webkit-border-radius: 7; -moz-border-radius: 7; border-radius: 7px; - color: #ffffff !important; - font-size: 18px; + color: #ffffff !important; font-weight: bold; padding: 2px 6px 2px 7px; text-decoration: none; } -.compilacaoedit .edit > .actions a.btn-action:hover { +.compilacaoedit .edit > .actions a.btn-inserts:hover { background: #3cb0fd; background-image: -webkit-linear-gradient(top, #3cb0fd, #3498db); background-image: -moz-linear-gradient(top, #3cb0fd, #3498db); @@ -310,9 +309,8 @@ } -.compilacaoedit .articulacao{ - - margin-left: -0.8em; +.compilacaoedit .articulacao{ + margin-left: -0.8em; margin-top: 2em; } @@ -329,16 +327,9 @@ display: none; } .compilacaoedit .editselected > .editdi { - padding: 1em; -} - -.compilacaoedit .editdi_form { - display: block; - clear: both; - padding: 1em; + padding-top: 1em; } - .compilacaoedit .editselected > .label_pai { position: absolute; color: #999; @@ -350,9 +341,8 @@ } .compilacaoedit .editselected { - border: 2.1em solid #eee; - padding: 0 0 1em 0; - padding-bottom: 0em; + border: 2.2em solid #eee; + padding: 1em; margin: 1em -2em 1em -2.8em; z-index: 1; background-color: #fff !important; @@ -364,61 +354,56 @@ } -.compilacaoedit .actions_head { +.compilacaoedit .actions_inserts { color: #fff; - position: relative; - opacity: 0; - transition: all 0.4s ease-in-out; - border-top: 1px solid #2980b9; - z-index: 9; - margin: 0em; + position: relative; + transition: all 0.4s ease-in-out; + margin: 0em; } - -.compilacaoedit .actions_head ul { + + +.compilacaoedit .actions_inserts ul { margin-left: 0; } -.compilacaoedit .actions_head li { +.compilacaoedit .actions_inserts li { font-weight: normal !important; display: inline-block; position: relative; - white-space:nowrap; - max-width:something; + white-space:nowrap; } -.compilacaoedit .actions_head > li.left { +.compilacaoedit .actions_inserts > li.left { border-right: 1px solid white; } -.compilacaoedit .actions_head > li.right { - width: 3em; +.compilacaoedit .actions_inserts > li.right { + min-width: 2em; text-align: center; } - -.compilacaoedit .actions_head > li.right:nth-child(3n + 1) { - clear:right; -} - - - -.compilacaoedit .actions_head li ul { + + +.compilacaoedit .actions_inserts li ul { display: none; position:absolute; top: auto; } -.compilacaoedit .actions_head li:hover ul{ +.compilacaoedit .actions_inserts li:hover ul{ display: block; } -.compilacaoedit .actions_head li:hover ul li{ +.compilacaoedit .actions_inserts li:hover ul li{ display: block; background: #3498db; background-image: none; } - -.compilacaoedit .actions_head a.btn-action { +.compilacaoedit .actions_inserts { + z-index: 99; +} + +.compilacaoedit a.btn-inserts { background: #3498db; background-image: -webkit-linear-gradient(top, #3498db, #2980b9); background-image: -moz-linear-gradient(top, #3498db, #2980b9); @@ -430,12 +415,15 @@ border-radius: 0px; color: #ffffff !important; font-size: 0.8em; - padding: 1px 6px 2px 7px; + padding: 0 6px 0 7px; text-decoration: none; - display: block; + display: block; + line-height: 1.7em; + min-height: 1.7em; + margin: 0; } -.compilacaoedit .actions_head a.btn-action:hover { +.compilacaoedit a.btn-inserts:hover { background: #3cb0fd; background-image: -webkit-linear-gradient(top, #3cb0fd, #3498db); background-image: -moz-linear-gradient(top, #3cb0fd, #3498db); @@ -443,22 +431,114 @@ background-image: -o-linear-gradient(top, #3cb0fd, #3498db); background-image: linear-gradient(to bottom, #3cb0fd, #3498db); text-decoration: none; -} +} -.compilacaoedit .actions_head > li > a.btn-action { - font-weight: bold; +.compilacaoedit .actions_inserts > li >a.btn-inserts { + line-height: 2.2em; + min-height: 2.2em; font-size: 1em; - + padding: 0 1em; + } + + + + + +.compilacaoedit .editdi_form input[type=submit] { + margin: 0; + padding: 0.35em 2em; +} + +.compilacaoedit .editdi_form a.alert { + background-image: none; + background-color: #A70808 !important; + color: #c99 !important; + font-weight: normal !important; + margin: 0; + padding: 0.35em 2em; } -.compilacaoedit .actions_head { - z-index: 99; - opacity: 0.5; +.compilacaoedit .editdi_form a.alert:hover { + background-image: none; + background-color: #c70808 !important; + color: #ecc !important; } -.compilacaoedit .actions_head:hover { - opacity: 1; -} + + + +.compilacaoedit .actions_head { + margin: -2.2em -2.2em 0 0; + position: absolute; + top: 0; + right: 0; + list-style: none; + display: table; + z-index: 98; +} + +.compilacaoedit .actions_head > li{ + float: right; +} + + +.compilacaoedit a.btn-action { + display: table-cell; + font-size: 1em; + background-image: none; + background-color: transparent !important; + color: #615151 !important; + vertical-align: middle; + line-height: 2.2em; + min-width: 2.2em; + text-align: center; + text-shadow: 0 0 10px rgba(0,0,0,0.3); +} +.compilacaoedit a.btn-action:hover { + background-color: rgba(0,0,0,0.1) !important; + text-shadow: 0 0 5px #777; + color: #fff !important; +} + +.compilacaoedit .actions_right { + margin: 0 -2.2em 0 0; + position: absolute; + top: 0; + right: 0; + list-style: none; + display: table; + z-index: 9; +} + + + + + + + + + + + + + + + + + + + +.compilacaoedit .editdi_form { + display: block; + clear: both; + margin: -1em; +} + +.compilacaoedit .editdi_form textarea { + margin: 0; + resize: vertical; + min-height: 12.5em; +} .compilacaoedit .actions_insert { opacity: 1; @@ -471,21 +551,15 @@ } .compilacaoedit .actions_insert > li.right{ - opacity: 1; - width: 3em; - text-align: center; -} -.compilacaoedit .actions_insert > li.right:nth-child(3n + 1) { - clear:right; -} - - + opacity: 1; + text-align: center; +} .compilacaoedit .actions_insert > li.left:nth-child(1), .compilacaoedit .actions_insert > li.left:nth-child(2) { opacity: 1; display: block; - min-width: 30%; - max-width: 30%; + min-width: 33%; + max-width: 33%; } .compilacaoedit .actions_insert li.left:nth-child(1) ul, .compilacaoedit .actions_insert li.left:nth-child(2) ul { @@ -518,18 +592,15 @@ display: block; height: auto !important; } - + .clear { clear:both; - height: 0; - width: 0; } -#tinymce .mceContentBody p { - font-family: "Open Sans" "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif !important; +.mce-container { + border-color: #ccc !important; } - @media only screen and (max-width: 40.0625em) { .compilacao .fixed{ diff --git a/static/styles/compilacao_tinymce.css b/static/styles/compilacao_tinymce.css new file mode 100644 index 000000000..cf39b89ad --- /dev/null +++ b/static/styles/compilacao_tinymce.css @@ -0,0 +1,10 @@ + + +.mce-content-body { + font-family: "Open Sans" "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; + font-style: normal; + font-weight: normal; + line-height: 1.5; + font-size: 1em; + color: #444444; +} \ No newline at end of file diff --git a/templates/compilacao/edit.html b/templates/compilacao/edit.html index 07fbcfbdf..4a366bba5 100644 --- a/templates/compilacao/edit.html +++ b/templates/compilacao/edit.html @@ -1,196 +1,24 @@ {% extends "base.html" %} {% load i18n %} {% load compilacao_filters %} +{% load staticfiles %} +{% load sass_tags %} + +{% block head_content %}{{block.super}} + +{% endblock %} {% block title%} -

    Edição: {{ view.get_norma }} - Texto Multivigente

    +

    Edição: {{ view.get_norma }} - {% trans 'Texto Multivigente' %}

    {% endblock %} {% block base_content %} - -
    Aguarde... Atualizando informações!!!
    {% include 'compilacao/edit_bloco.html'%}
    + {% endblock base_content %} diff --git a/templates/compilacao/edit_bloco.html b/templates/compilacao/edit_bloco.html index 751ecf71d..5a14126c5 100644 --- a/templates/compilacao/edit_bloco.html +++ b/templates/compilacao/edit_bloco.html @@ -13,59 +13,70 @@
    {% endif%} + {% if view|render_actions_head:dispositivo %} -
      +
      +
      + +
        + {% if not dispositivo.tipo_dispositivo.dispositivo_de_articulacao %} +
      • E*
      • +
      • E+
      • +
      • E
      • + {%endif%} +
      + + + + {% if not dispositivo.tipo_dispositivo.dispositivo_de_articulacao %} + {% csrf_token %} + + {%endif%} - {% if not dispositivo.tipo_dispositivo.dispositivo_de_articulacao %} -
    • E++
    • -
    • E+
    • -
    • E
    • - {% endif%} -
    • ↑↑
    • -
    • -
    • >
    • - - -
    • ↓↓
    • -
    • -
    • <
    • - -
    + + +
    + + +
    +
    Em Edição: {% nomenclatura_heranca dispositivo %}
    +
    +
    {% endif%} {% if view.pk_view == 0 and view.pk_add == 0 or view.pk_add != view.pk_view %} -
    - E + E
    -
    {% spaceless %} @@ -88,22 +99,7 @@ {%endwith%} {% endif%}
    - - - {% else%} - - {% if not dispositivo.tipo_dispositivo.dispositivo_de_articulacao %} -
    -
    - {% csrf_token %} - -
    - -
    -
    -
    - {%endif%} - + {% endif%} {% set_nivel_old view dispositivo.nivel %} From a2d0ffdb8fe9742544e23450a29dd1fa1ef1dc30 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Sun, 25 Oct 2015 21:58:25 -0200 Subject: [PATCH 05/23] style sheet refactoring and rewriting in sass --- compilacao/models.py | 31 +- compilacao/templatetags/compilacao_filters.py | 23 +- compilacao/views.py | 24 +- sapl/settings.py | 3 +- static/js/compilacao.js | 117 +- static/styles/compilacao.scss | 1199 +++++++++-------- templates/base.html | 1 - templates/compilacao/edit.html | 9 +- templates/compilacao/edit_bloco.html | 186 +-- .../compilacao/edit_bloco_alteracao.html | 10 +- templates/compilacao/index.html | 46 +- templates/compilacao/index_bloco.html | 46 +- .../compilacao/index_bloco_alteracao.html | 10 +- 13 files changed, 923 insertions(+), 782 deletions(-) diff --git a/compilacao/models.py b/compilacao/models.py index d208d283b..35c1d14d0 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -1,3 +1,5 @@ +from datetime import datetime + from django.contrib.auth.models import User from django.db import models from django.db.models import F @@ -694,15 +696,21 @@ class Dispositivo(BaseModel): filho.save() filho.organizar_niveis() - def get_parents(self): + def get_parents(self, ordem='desc'): dp = self p = [] while dp.dispositivo_pai is not None: dp = dp.dispositivo_pai - p.append(dp) + if ordem == 'desc': + p.append(dp) + else: + p.insert(0, dp) return p + def get_parents_asc(self): + return self.get_parents(ordem='asc') + def recalcular_ordem(self): try: dispositivos = Dispositivo.objects.order_by('-ordem').filter( @@ -715,6 +723,25 @@ class Dispositivo(BaseModel): d.save() ordem -= 1000 + @staticmethod + def init_with_base(dispositivo_base, tipo_base): + dp = Dispositivo() + + dp.tipo_dispositivo = tipo_base + + dp.set_numero_completo( + dispositivo_base.get_numero_completo()) + dp.nivel = dispositivo_base.nivel + dp.texto = '' + dp.norma = dispositivo_base.norma + dp.dispositivo_pai = dispositivo_base.dispositivo_pai + dp.inicio_eficacia = dispositivo_base.inicio_eficacia + dp.inicio_vigencia = dispositivo_base.inicio_vigencia + dp.publicacao = dispositivo_base.publicacao + dp.timestamp = datetime.now() + + return dp + class Vide(models.Model): data_criacao = models.DateTimeField(verbose_name=_('Data de Criação')) diff --git a/compilacao/templatetags/compilacao_filters.py b/compilacao/templatetags/compilacao_filters.py index 6ff84b0e2..ed28d24dc 100644 --- a/compilacao/templatetags/compilacao_filters.py +++ b/compilacao/templatetags/compilacao_filters.py @@ -42,8 +42,7 @@ def dispositivo_desativado(dispositivo, inicio_vigencia, fim_vigencia): @register.simple_tag def nota_automatica(dispositivo): - if dispositivo.norma_publicada is not None and \ - dispositivo.tipo_dispositivo.class_css != 'artigo': + if dispositivo.norma_publicada is not None: d = dispositivo.dispositivo_atualizador.dispositivo_pai if dispositivo.texto == Dispositivo.TEXTO_PADRAO_DISPOSITIVO_REVOGADO: return 'Revogado pelo %s.' % d @@ -92,6 +91,26 @@ def render_actions_head(view, d_atual): return False +@register.filter +def short_string(str, length): + if len(str) > length: + return str[:length]+'...' + else: + return str + +@register.filter +def nomenclatura(d): + result = '' + if d.rotulo != '': + if d.tipo_dispositivo.rotulo_prefixo_texto != '': + result = d.rotulo + else: + result = '(' + d.tipo_dispositivo.nome + ' ' + \ + d.rotulo + ')' + else: + result = '(' + d.tipo_dispositivo.nome + \ + d.rotulo_padrao() + ')' + return result @register.simple_tag def nomenclatura_heranca(d): diff --git a/compilacao/views.py b/compilacao/views.py index 49c1423a7..edc393ab0 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -1,3 +1,5 @@ + + from collections import OrderedDict from datetime import timedelta, datetime from os.path import sys @@ -389,13 +391,16 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): else: d_base = Dispositivo.objects.get(pk=self.pk_add) - result = [{'tipo_insert': '↷  Inserir Depois', + result = [{'tipo_insert': 'Inserir Depois', + 'icone': '↷ ', 'action': 'add_next', 'itens': []}, - {'tipo_insert': '⇲  TODO: Inserir Dentro', + {'tipo_insert': 'Inserir Dentro', + 'icone': '⇲ ', 'action': 'add_in', 'itens': []}, - {'tipo_insert': '↶  TODO: Inserir Antes', + {'tipo_insert': 'Inserir Antes', + 'icone': '↶ ', 'action': 'add_prior', 'itens': []} ] @@ -603,11 +608,10 @@ class ActionsEditMixin(object): if dp.dispositivo_pai is not None or \ tipo.class_css == 'articulacao': + dpbase = dp + dp = Dispositivo.init_with_base(dpbase, tipo) dp.transform_in_next(variacao) dp.rotulo = dp.rotulo_padrao() - dp.texto = '' - dp.pk = None - dp.norma_publicada = None if dp.tipo_dispositivo.class_css == 'artigo': ordem = base.criar_espaco_apos(espaco_a_criar=2) @@ -732,10 +736,8 @@ class ActionsEditMixin(object): else: break - dp.tipo_dispositivo = tipo - - dp.pk = None - dp.norma_publicada = None + dpaux = dp + dp = Dispositivo.init_with_base(dpaux, tipo) if tipo.contagem_continua: ultimo_irmao = Dispositivo.objects.order_by( @@ -767,7 +769,7 @@ class ActionsEditMixin(object): tipo_dispositivo_id=tipo.pk) ''' inserção sem precedente é feita sem variação - portanto, não deve ser usado o transform_next() para + portanto, não é necessário usar transform_next() para incrementar, e sim, apenas somar no atributo dispositivo0 dada a possibilidade de existir irmãos com viariação''' for irmao in irmaos: diff --git a/sapl/settings.py b/sapl/settings.py index 52d0b2b53..0ebf07620 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -60,7 +60,8 @@ INSTALLED_APPS = ( 'sass_processor', ) if DEBUG: - INSTALLED_APPS += ('debug_toolbar',) + #INSTALLED_APPS += ('debug_toolbar',) + pass MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', diff --git a/static/js/compilacao.js b/static/js/compilacao.js index 1503fbaf1..26bde8cfd 100644 --- a/static/js/compilacao.js +++ b/static/js/compilacao.js @@ -1,16 +1,14 @@ -$(document).ready(function() { - -var flag_add_next = false -var flag_add_next_pk = 0 -var flag_add_next_pai = 0 +var flag_add_next = false; +var flag_add_next_pk = 0; +var flag_add_next_pai = 0; -var withTinymce = false +var editortype = "construct"; var onSubmitEditForm = function(event) { - var texto = '' - var editorTiny = tinymce.get('editdi_texto') + var texto = ''; + var editorTiny = tinymce.get('editdi_texto'); if (editorTiny != null) texto = editorTiny.getContent(); @@ -21,27 +19,28 @@ var onSubmitEditForm = function(event) { 'csrfmiddlewaretoken' : $('input[name=csrfmiddlewaretoken]').val(), 'texto' : texto }; - var url = $('.editdi_form form').attr( "action_ajax" ); + var url = $('.csform form').attr( "action_ajax" ); $("#message_block").css("display", "block"); $.post(url,formData) .done(function(data) { - $('.editselected').html(data); + $('.dpt-selected').html(data); clearEditSelected(); reloadFunctionClicks(); }).always(function() { $("#message_block").css("display", "none"); - }); - event.preventDefault(); + }); + if (event != null) + event.preventDefault(); } -var clickEditDispositivo = function(event) { +var clickEditDispositivo = function(event) { var _pk = event.currentTarget.getAttribute('pk'); - if ($('#de'+_pk).hasClass("editselected")) { + if ($('#dpt'+_pk).hasClass("dpt-selected")) { clearEditSelected(); return; } clearEditSelected(); - clickUpdateDispositivo(event) + clickUpdateDispositivo(event); } var clickUpdateDispositivo = function(event, __pk, __action, addeditselected) { @@ -64,15 +63,16 @@ var clickUpdateDispositivo = function(event, __pk, __action, addeditselected) { var url = '' if (_action == '') return - else if ( _action == null || _action.startsWith('refresh')) { + else if ( _action == null) + url = _pk+'/refresh?pkadd='+flag_add_next_pk; + else if (_action.startsWith('refresh')) { - if (_action != null && _action.endsWith('tinymce')) - withTinymce = true; - else if (_action != null && _action.endsWith('textarea')) - withTinymce = false; + var str = _action.split(':'); + if (str.length > 1) { + editortype = str[1]; + } url = _pk+'/refresh?pkadd='+flag_add_next_pk+url; - } else { url = _pk+'/actions?action='+_action; @@ -86,32 +86,41 @@ var clickUpdateDispositivo = function(event, __pk, __action, addeditselected) { $.get(url).done(function( data ) { if ( _action == null || _action.startsWith('refresh')) { - + if (flag_add_next) { - + if (addeditselected) clearEditSelected(); - - $( '#de' + _pk ).html( data); + + $( '#dpt' + _pk ).html( data); flag_add_next = false - } + } else { clearEditSelected(); - $( '#de' + _pk ).prepend( data ); + $( '#dpt' + _pk ).prepend( data ); } reloadFunctionClicks(); - if ( withTinymce ) { - initTinymce() + if ( editortype == 'tinymce' ) { + initTinymce(); + } + else if (editortype == 'textarea') { + $('.csform form').submit(onSubmitEditForm); } - else { - $('.editdi_form form').submit(onSubmitEditForm); + else if (editortype == 'construct') { + $('.csform .btn-salvar, .csform textarea').remove(); + // $('#dpt'+flag_add_next_pk).css('min-height', $('.actions_right').height()*1.35 ); + $('.actions_inserts').addClass('menu_fixo'); } + $(".edt-"+editortype).addClass('selected'); + /*if (_action != null && _action != 'refresh') + $("a.btn-action[pk='"+_pk+"']").css('background-color', '#000000'); +*/ if (addeditselected == null || addeditselected) { - $('#de'+flag_add_next_pk).addClass('editselected'); + $('#dpt'+flag_add_next_pk).addClass('dpt-selected'); $('html, body').animate({ - scrollTop: $('#de' + flag_add_next_pk ).offset().top - window.innerHeight / 10 + scrollTop: $('#dpt' + flag_add_next_pk ).offset().top - window.innerHeight / 10 }, 300); flag_add_next_pk = 0; } @@ -123,7 +132,7 @@ var clickUpdateDispositivo = function(event, __pk, __action, addeditselected) { flag_add_next_pk = data.pk; flag_add_next_pai = data.pai; - + if (flag_add_next_pk != null) for (var pai = 0; pai < flag_add_next_pai.length; pai++) if (flag_add_next_pai[pai] != -1) { @@ -150,33 +159,34 @@ var clickUpdateDispositivo = function(event, __pk, __action, addeditselected) { function clearEditSelected() { tinymce.remove(); - $('.editselected').removeClass('editselected'); - $('.editdi_form').remove(); - $('.editselected .label_pai, .edit .label_pai').remove(); - $('.editselected .actions_head, .edit .actions_head').remove(); - $('.editselected .actions_footer, .edit .actions_footer').remove(); + $('.dpt-selected').removeClass('dpt-selected'); + $('.csform').remove(); } -function reloadFunctionClicks() { - $('.dispositivo .edit .di').off(); - $('.actions .btn-action').off(); - $('.actions_head .btn-action').off(); - $('.dispositivo .edit .di').on('click', clickEditDispositivo); - $('.actions .btn-action').on('click', clickEditDispositivo); - $('.actions_head .btn-action').on('click', clickUpdateDispositivo); +function reloadFunctionClicks() { + $('.dpt .de, .btn-action, .btn-inserts').off(); + + $('.dpt .de, .btn-edit').on( + 'click', clickEditDispositivo); + + $('.btn-action, .btn-inserts').on( + 'click', clickUpdateDispositivo); + + + $('#editdi_texto').focus(); } function initTinymce() { - tinymce.init({ - mode : "textareas", + tinymce.init({ + mode : "textareas", force_br_newlines : false, force_p_newlines : false, forced_root_block : '', plugins: ["table save code"], menubar: "edit format table tools", toolbar: "save | undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent", - tools: "inserttable", + tools: "inserttable", save_onsavecallback: onSubmitEditForm, border_css: "/static/styles/compilacao_tinymce.css", content_css: "/static/styles/compilacao_tinymce.css" @@ -184,8 +194,11 @@ function initTinymce() { } -reloadFunctionClicks(); -$("#message_block").css("display", "none"); +$(document).ready(function() { -}); + reloadFunctionClicks(); + $("#message_block").css("display", "none"); + clickUpdateDispositivo(null, 64941, 'refresh', true); + +}); diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index 9c292481f..6015f2d73 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -1,7 +1,21 @@ - +$color_actions: #16407c; +$color_actions_border: #ddd; +@mixin background-top-down($top, $bottom) { + background: $top; + background-image: -webkit-linear-gradient(top, $top, $bottom); + background-image: -moz-linear-gradient(top, $top, $bottom); + background-image: -ms-linear-gradient(top, $top, $bottom); + background-image: -o-linear-gradient(top, $top, $bottom); + background-image: linear-gradient(to bottom, $top, $bottom); +} +@mixin border-radius($radius) { + -webkit-border-radius: $radius; + -moz-border-radius: $radius; + -ms-border-radius: $radius; + border-radius: $radius; +} #message_block { - display: block; position: fixed; top: 0; @@ -10,610 +24,659 @@ right: 0; background-color: rgba(220, 220, 220, 0.75); z-index:99; -} - -#message_block #msg{ - position: relative; - margin: 20% auto; - padding: 1.2em 2em; - max-width: 600px; - text-align: center; - font-size: 1.5em; - color: #677; - - border: 1px solid #eee; - background-color: #fff !important; - box-shadow: 0 1px 2px #999; -} - -.dispositivo { - font-size:1em; - transition: all 0.2s ease-in-out; -} - - -.dispositivo .ementa { - padding: 4em 0em 3em 35%; - font-weight: bold; - -} - -.dispositivo .anexo, -.dispositivo .disp_preliminares, -.dispositivo .disp_gerais, -.dispositivo .disp_transitorias, -.dispositivo .disp_finais { - font-size: 1.5em; - text-align: center; - font-weight: bold; - margin-top: 3em; - margin-bottom: 1em; -} - -.dispositivo .parte { - font-size: 1.5em; - text-align: center; - font-weight: bold; - margin-top: 2em; - margin-bottom: 1em; -} -.dispositivo .livro { - font-size: 1.5em; - text-align: center; - font-weight: bold; - margin-top: 2em; - margin-bottom: 1em; -} - -.dispositivo .titulo { - font-size: 1.5em; - text-align: center; - font-weight: bold; - margin-top: 2em; - margin-bottom: 1em; -} - -.dispositivo .capitulo { - margin-bottom: 1em; - margin-top: 1.5em; - font-size: 1.3em; - text-align: center; - font-weight: bold; -} - -.dispositivo .secao { - margin-top: 1.2em; - margin-bottom: 0.7em; - font-size: 1.2em; - text-align: center; - font-weight: bold; -} - -.dispositivo .subsecao, .dispositivo .itemsecao { - margin-top: 1em; - margin-bottom: 0.6em; - font-size: 1.2em; - text-align: center; - font-style: italic; - font-weight: bold; -} - -.dispositivo .artigo { - font-size: 1.15em; - float:left; -} -.dispositivo .caput { - margin-top: 0.3333em; - font-size: 1.15em; - display: block; -} - -.dispositivo .paragrafo { - padding-left: 1.5em; - font-size: 1.1em; - margin-top: 0.2222em; -} - -.dispositivo .inciso { - font-size: 1.1em; - padding-left: 2.5em; - margin-top: 0.1667em; -} -.dispositivo .alinea { - font-size: 1.0em; - padding-left: 3.5em; - margin-top: 2px; + #msg{ + position: relative; + margin: 20% auto; + padding: 1.2em 2em; + max-width: 600px; + text-align: center; + font-size: 1.5em; + color: #677; + + border: 1px solid #eee; + background-color: #fff !important; + box-shadow: 0 1px 2px #999; + } } +.page { + background-color: #f0f0f0; +} + +.cp { + .dpt { + font-size:1em; + transition: all 0.2s ease-in-out; + + .ementa { + padding: 4em 0em 3em 35%; + font-weight: bold; + } + + .titulo_generico { + text-align: center; + font-weight: bold; + margin-bottom: 1em; + font-size: 1.5em; + margin-top: 3em; + } + + .anexo, + .disp_preliminares, + .disp_gerais, + .disp_transitorias, + .disp_finais, + .parte, + .livro { + @extend .titulo_generico; + } + + .titulo { + @extend .titulo_generico; + margin-top: 2em; + } + + .capitulo { + @extend .titulo_generico; + margin-top: 1.5em; + font-size: 1.3em; + } + + .secao { + @extend .titulo_generico; + margin-top: 1.2em; + margin-bottom: 0.7em; + font-size: 1.2em; + } + + .subsecao, + .itemsecao { + @extend .titulo_generico; + margin-top: 1em; + margin-bottom: 0.6em; + font-size: 1.2em; + font-style: italic; + } + + .artigo { + font-size: 1.15em; + float:left; + } + + .caput { + margin-top: 0.3333em; + font-size: 1.15em; + } + + .paragrafo { + padding-left: 1.5em; + font-size: 1.1em; + margin-top: 0.2222em; + } + + .inciso { + font-size: 1.1em; + padding-left: 2.5em; + margin-top: 0.1667em; + } + + .alinea { + font-size: 1.0em; + padding-left: 3.5em; + margin-top: 2px; + } + + .item { + font-size: 1.0em; + padding-left: 4.5em; + margin-top: 2px; + } + + a { + color: #444444; + &.link_alterador { + color: #2980B9; + font-size: 0.75em; + } + &.desativado { + @extend .desativado; + } + } + + .bloco_alteracao { + padding-left: 10%; + font-style: italic; + color: #018; + + a { + text-decoration: underline; + } + + a, table, table td { + color: #018 !important; + } + } + } /* and dpt */ + + .desativado, .desativado * { + text-decoration: line-through; + color: #777 !important; + + table, table td { + border: 1px dotted #ccc; + } + } -.dispositivo .item { - font-size: 1.0em; - padding-left: 4.5em; - margin-top: 2px; -} + .top-bar { + line-height: 1.6rem; + height: auto; + background: #2980B9; + z-index:1; + margin: 0 auto; + max-width: 62.5rem; + } -.compilacaoedit .desativado, .compilacaoedit .desativado *, -.compilacao .desativado, .compilacao .desativado * { - text-decoration: line-through; - color: #777 !important; -} -.compilacaoedit .desativado table, .compilacaoedit .desativado table td, -.compilacao .desativado table, .compilacao .desativado table td { - border: 1px dotted #ccc; - text-decoration: line-through; -} + .top-bar-section { + li:not(.has-form) { + a:not(.button) { -.dispositivo a { - color: #444444 !important; -} -.dispositivo a.link_alterador { - color: #2980B9 !important; - font-size: 0.75em; -} - -.dispositivo .bloco_alteracao { - padding-left: 10%; - font-style: italic; -} + @extend .top-bar; + padding: 0 0.43333rem; -.dispositivo .bloco_alteracao:hover a { - text-decoration: underline; -} - -.dispositivo .bloco_alteracao, -.dispositivo .bloco_alteracao a, -.dispositivo .bloco_alteracao table, -.dispositivo .bloco_alteracao table td { - color: #018 !important; -} - - -.compilacao .top-bar-section li:not(.has-form) a:not(.button), -.compilacao .top-bar { - line-height: 1.6rem; - height: auto; - background: #2980B9; - z-index:1; - margin: 0 auto; - max-width: 62.5rem; -} + &.selected, &:hover { + background: #1056A0; + } + } + } + } -.compilacao .top-bar-section li:not(.has-form) a:not(.button).selected, -.compilacao .top-bar-section li:not(.has-form) a:not(.button):hover { - background: #1056A0; -} + ul.nav { + background: #2980B9; + display:block; + width: 100%; + z-index:1; + } -.compilacao .top-bar-section li:not(.has-form) a:not(.button) { - padding: 0 0.43333rem; -} + .tipo-vigencias { + border-top: 1px solid #62B5B5; + } -.compilacao ul.nav { - background: #2980B9; - display:block; - width: 100%; - z-index:1; -} -.compilacao .tipo-vigencias { - border-top: 1px solid #62B5B5; -} - -.compilacao .vigencias { - margin: 2.5em 0 0 0; - transition: all .4s ease-in-out; - background: #2980B9; - clear:both; -} + .vigencias { + margin: 2.5em 0 0 0; + transition: all .4s ease-in-out; + background: #2980B9; + clear:both; + } -.compilacao .fixed{ - z-index:98; -} + .fixed{ + z-index:98; + } +} /* end cp */ -.displaynone { - display: none !important; -} +.cpe { + @extend .cp; -.compilacaoedit { - margin-bottom: 30em; + margin-bottom: 30em; margin-left: 0.8em; - z-index: 1; -} - - -.compilacaoedit .semtexto { - font-weight: bold; - color: #8DA6D8; -} - - - -.compilacaoedit .edit { - position: relative; - display:block; - background-color: transparent !important; - border: 0px none #fff; -} -.compilacaoedit .edit .artigo { - float: none; -} - -.compilacaoedit .edit > .actions { - color: #fff; - position: absolute; - padding: 0 0.2em; - left: -2.2em; - opacity: 0; - transition: all 0.4s ease-in-out; -} - -.compilacaoedit .edit > .actions a.btn-inserts { - background: #3498db; - background-image: -webkit-linear-gradient(top, #3498db, #2980b9); - background-image: -moz-linear-gradient(top, #3498db, #2980b9); - background-image: -ms-linear-gradient(top, #3498db, #2980b9); - background-image: -o-linear-gradient(top, #3498db, #2980b9); - background-image: linear-gradient(to bottom, #3498db, #2980b9); - -webkit-border-radius: 7; - -moz-border-radius: 7; - border-radius: 7px; - color: #ffffff !important; - font-weight: bold; - padding: 2px 6px 2px 7px; - text-decoration: none; -} - -.compilacaoedit .edit > .actions a.btn-inserts:hover { - background: #3cb0fd; - background-image: -webkit-linear-gradient(top, #3cb0fd, #3498db); - background-image: -moz-linear-gradient(top, #3cb0fd, #3498db); - background-image: -ms-linear-gradient(top, #3cb0fd, #3498db); - background-image: -o-linear-gradient(top, #3cb0fd, #3498db); - background-image: linear-gradient(to bottom, #3cb0fd, #3498db); - text-decoration: none; -} -.compilacaoedit .edit:hover > .actions { - z-index: 9; - opacity: 0.5; - background-color: transparent !important -} - -.compilacaoedit .edit:hover > .actions:hover { - opacity: 1; -} - -.compilacaoedit .edit:hover > .actions:hover::before { - - border-color: transparent transparent transparent #78F9FF; -} - -.compilacaoedit .edit:hover > .actions::before { - border: inset 0.375rem; - content: ""; - display: block; - height: 0; - width: 0; - border-color: transparent transparent transparent #78F9FF; - position: absolute; - top: 0.53rem; - right: -0.51rem; -} - - -.compilacaoedit .editdi { - display: block; - clear: left; -} - -.compilacaoedit .editdi *:hover { - background-color: #eee; -} - - -.compilacaoedit .articulacao{ - margin-left: -0.8em; - margin-top: 2em; -} - -.compilacaoedit .articulacao::before { - content: "Articulação"; - background-color: #eee; - border-bottom: 1px solid #aaa; - padding: 0.333em; - padding-left: 1em; - display:block; -} - -.compilacaoedit .editselected .articulacao::before { - display: none; -} -.compilacaoedit .editselected > .editdi { - padding-top: 1em; -} -.compilacaoedit .editselected > .label_pai { - position: absolute; - color: #999; - top: -1.7em; - left: 0; - right: 0; - width: auto; - height: auto; -} - -.compilacaoedit .editselected { - border: 2.2em solid #eee; - padding: 1em; - margin: 1em -2em 1em -2.8em; - z-index: 1; - background-color: #fff !important; - box-shadow: 0 1px 2px #aaa; -} - -.compilacaoedit .editselected > .actions { - display: none; -} - - -.compilacaoedit .actions_inserts { - color: #fff; - position: relative; - transition: all 0.4s ease-in-out; - margin: 0em; -} - - -.compilacaoedit .actions_inserts ul { - margin-left: 0; - } - -.compilacaoedit .actions_inserts li { - font-weight: normal !important; - display: inline-block; - position: relative; - white-space:nowrap; - } -.compilacaoedit .actions_inserts > li.left { - border-right: 1px solid white; + a { + text-decoration: none; } - - -.compilacaoedit .actions_inserts > li.right { - min-width: 2em; - text-align: center; -} - - -.compilacaoedit .actions_inserts li ul { - display: none; - position:absolute; - top: auto; - } - -.compilacaoedit .actions_inserts li:hover ul{ - display: block; - } - -.compilacaoedit .actions_inserts li:hover ul li{ - display: block; - background: #3498db; - background-image: none; -} - -.compilacaoedit .actions_inserts { - z-index: 99; -} - -.compilacaoedit a.btn-inserts { - background: #3498db; - background-image: -webkit-linear-gradient(top, #3498db, #2980b9); - background-image: -moz-linear-gradient(top, #3498db, #2980b9); - background-image: -ms-linear-gradient(top, #3498db, #2980b9); - background-image: -o-linear-gradient(top, #3498db, #2980b9); - background-image: linear-gradient(to bottom, #3498db, #2980b9); - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0px; - color: #ffffff !important; - font-size: 0.8em; - padding: 0 6px 0 7px; - text-decoration: none; - display: block; - line-height: 1.7em; - min-height: 1.7em; - margin: 0; -} -.compilacaoedit a.btn-inserts:hover { - background: #3cb0fd; - background-image: -webkit-linear-gradient(top, #3cb0fd, #3498db); - background-image: -moz-linear-gradient(top, #3cb0fd, #3498db); - background-image: -ms-linear-gradient(top, #3cb0fd, #3498db); - background-image: -o-linear-gradient(top, #3cb0fd, #3498db); - background-image: linear-gradient(to bottom, #3cb0fd, #3498db); - text-decoration: none; -} - -.compilacaoedit .actions_inserts > li >a.btn-inserts { - line-height: 2.2em; - min-height: 2.2em; - font-size: 1em; - padding: 0 1em; + .semtexto { + font-weight: bold; + color: #8DA6D8; } - - - + .selected { + background-color: rgba(0, 0, 0, 0.1); + } -.compilacaoedit .editdi_form input[type=submit] { - margin: 0; - padding: 0.35em 2em; -} - -.compilacaoedit .editdi_form a.alert { - background-image: none; - background-color: #A70808 !important; - color: #c99 !important; - font-weight: normal !important; - margin: 0; - padding: 0.35em 2em; -} + .dpt { + position: relative; + display:block; + .artigo { + float: none; + } + & > .actions_left { + color: #fff; + position: absolute; + left: -2.2em; + opacity: 0; + transition: all 0.4s ease-in-out; + a { + &.btn-edit { + @include background-top-down(#3498DB, #2980C9); + @include border-radius(7px); + color: #ffffff !important; + font-weight: bold; + padding: 2px 6px 2px 7px; + + &:hover { + @include background-top-down(#3cb0fd, #3498DB); + } + } + } + } + + &:hover > .actions_left { + opacity: 0.5; + background-color: transparent !important; + &::before { + content: ""; + border: inset 0.375rem; + border-color: transparent transparent transparent #3cb0fd; + position: absolute; + display: block; + height: 0; + width: 0; + top: 0.4rem; + right: -0.73rem; + } + &:hover { + opacity: 1; + &::before { + border-color: transparent transparent transparent #3cf0ff; + } + } + } + + .bloco { + display: block; + clear: both; + *:hover { + background-color: #eee; + } + + } + .articulacao{ + margin-left: -0.8em; + margin-top: 2em; + &::before { + content: "Articulação"; + background-color: #eee; + border-bottom: 1px solid #aaa; + padding: 0.333em; + padding-left: 1em; + display:block; + } + } + } -.compilacaoedit .editdi_form a.alert:hover { - background-image: none; - background-color: #c70808 !important; - color: #ecc !important; + .dpt-selected { + border: 2.2em solid #eee; + margin: 1em -2em 1em -2.8em; + box-shadow: 0 2px 2px #aaa; + + ul { + list-style: none; + margin: 0; + padding: 0; + } + + .bloco { + opacity: 0.5; + } + & > .bloco { + padding: 1em; + opacity: 1; + } + + & > .dpt { + padding: 0 1em; + } + + .csform { /* compilacao simple form */ + display: block; + clear: both; + z-index: 9; + position: static; + + .btns-action { + position: absolute; + display: table; + transition: all 0.4s ease-in-out; + a { + color: $color_actions; + display: block; + font-size: 1em; + background-image: none; + background-color: transparent; + vertical-align: middle; + line-height: 2.2em; + min-width: 2.2em; + text-align: center; + font-weight: normal; + text-shadow: 0 0 10px rgba(0,0,0,0.3); + } + & > li { + position: relative; + &:hover { + background-color: rgba(0,0,0,0.1); + & > a { + text-shadow: 0 0 5px #777; + color: #ff0; + font-weight: bold; + } + } + } + } + + .actions_parents { + height: 2.2em; + top: -2.2em; + left: -2.2em; + a { + padding: 0.2em 0.4em; + text-shadow: 0 0 5px rgba(0,0,0,0.3); + } + div, li { + font-size: 0.8em; + display: table-cell; + vertical-align: middle; + border-right: 1px solid #ccc; + } + div { + padding: 0 0.4em; + font-stretch: condensed; + } + & > li { + &:hover a{ + color: $color_actions; + text-shadow: 0 0 0px #777; + font-weight: normal; + } + } + } + + .label_status { + position: absolute; + bottom: -2.5em; + right: -1.8em; + color: #889; + padding: 0.3em 0; + font-size: 0.8em; + } + + .actions_top { + top: -2.2em; + right: 0em; + + li { + display: table-cell; + vertical-align: middle; + border-left: 1px solid $color_actions_border; + &:last-child { + border-right: 1px solid $color_actions_border; + } + } + } + + .actions_bottom { + @extend .actions_top; + top: auto; + right: auto; + left: 0em; + bottom: -2.2em; + } + + .actions_right { + top: 0em; + right: -2.2em; + + li { + display: block; + border-bottom: 1px solid $color_actions_border; + &:first-child { + border-top: 1px solid $color_actions_border; + } + } + } + + .actions_left { + @extend .actions_right; + right: auto; + left: -2.2em; + } + + .actions_inserts { + position: relative; + z-index: 9; + display: table; + width: 100%; + + li, li:hover { + background: transparent; + a { + background: #2980C9; + background-image: none; + text-shadow: 0 0 0; + color: #fff; + font-weight: normal; + white-space: nowrap; + + &:hover { + background-color: #196aad; + text-shadow: 0 0 0; + color: #fff; + font-weight: normal; + } + } + } + + & > li { + display: table-cell; + table-layout: auto; + vertical-align: middle; + border-right: 1px solid white; + + &:hover > ul { + display: block; + } + &:last-child { + border-right: 0px; + } + + & > ul { + display: none; + position:absolute; + box-shadow: 0px 6px 18px rgba(0, 0, 0, 0.19), 0px 2px 6px rgba(0, 0, 0, 0.23); + a { + text-align: left; + font-size: 0.8em; + padding: 0 0.5em; + white-space: nowrap; + } + } + + span { + padding: 0.7em; + } + + & > a { + @include background-top-down(#3498DB, #2980C9); + &.btn-excluir { + text-align: left; + background: #A70808; + color: #c99; + padding-left: 1.5em; + &:hover { + background-color: #c70808; + color: #ecc; + } + &::before { + z-index: 10; + position: absolute; + background: url(/static/img/icon_delete_white.png) no-repeat 0 50%; + content:""; + top: 0; + left: 0; + display: block; + color: black; + margin-top: 0.05em; + margin-left: 0.6em; + height: 2em; + width: 2em; + } + } + &.btn-salvar { + @extend .btn-excluir; + + background: #1f8b4d; + color: white; + padding-left: 1.7em; + &:hover { + background: #2d9c5c; + color: white; + } + &::before { + background: url(/static/img/icon_save_white.png) no-repeat 0 50%; + } + } + } + } /* fim li de primeiro nivel*/ + } /* fim actions_inserts*/ + + .menu_fixo { + & > li { + vertical-align: top; + background-color: transparent; + & > ul { + display: block; + position: relative; + box-shadow: 0 0 0; + a { + white-space: normal; + } + } + } /* fim li de primeiro nivel*/ + .add_prior { + display: block; + position: static; + ul { + position: absolute; + display: none; + right: 1em; + box-shadow: 0px 6px 18px rgba(0, 0, 0, 0.19), 0px 2px 6px rgba(0, 0, 0, 0.5); + } + } + } /* fim menu_fixo*/ + + textarea { + margin: 0; + resize: vertical; + min-height: 12.6em; + border: 0px; + border-bottom: 2px #ccc solid; + &::-webkit-input-placeholder { + color: #c70808; + opacity: 0.6; + } + &:-moz-placeholder { /* Firefox 18- */ + color: #c70808; + } + &::-moz-placeholder { /* Firefox 19+ */ + color: #c70808; + } + &:-ms-input-placeholder { + color: #c70808; + opacity: 0.6; + } + } + } /* fim csform*/ + } } - - - -.compilacaoedit .actions_head { - margin: -2.2em -2.2em 0 0; - position: absolute; - top: 0; - right: 0; - list-style: none; - display: table; - z-index: 98; +.clear { + clear:both; } -.compilacaoedit .actions_head > li{ - float: right; -} - - -.compilacaoedit a.btn-action { - display: table-cell; - font-size: 1em; - background-image: none; - background-color: transparent !important; - color: #615151 !important; - vertical-align: middle; - line-height: 2.2em; - min-width: 2.2em; - text-align: center; - text-shadow: 0 0 10px rgba(0,0,0,0.3); +.mce-container { + border-color: #ccc !important; } -.compilacaoedit a.btn-action:hover { +.mce-btn button:hover { background-color: rgba(0,0,0,0.1) !important; - text-shadow: 0 0 5px #777; - color: #fff !important; -} - -.compilacaoedit .actions_right { - margin: 0 -2.2em 0 0; - position: absolute; - top: 0; - right: 0; - list-style: none; - display: table; - z-index: 9; -} - - - - - - - - - - - - - - - - - - - -.compilacaoedit .editdi_form { - display: block; - clear: both; - margin: -1em; -} - -.compilacaoedit .editdi_form textarea { - margin: 0; - resize: vertical; - min-height: 12.5em; + text-shadow: 0 0 5px #fff; + box-shadow: 0 0 5px #777; } -.compilacaoedit .actions_insert { - opacity: 1; - display: block; -} - -.compilacaoedit .actions_insert li { - opacity: 1; - display: block; -} -.compilacaoedit .actions_insert > li.right{ - opacity: 1; - text-align: center; -} -.compilacaoedit .actions_insert > li.left:nth-child(1), -.compilacaoedit .actions_insert > li.left:nth-child(2) { - opacity: 1; - display: block; - min-width: 33%; - max-width: 33%; -} -.compilacaoedit .actions_insert li.left:nth-child(1) ul, -.compilacaoedit .actions_insert li.left:nth-child(2) ul { - display: block; - position: relative; -} - -.compilacaoedit .actions_insert li.left:nth-child(n+3):hover ul { - right: 0; - box-shadow: -3px 3px 1.5em #336; -} - - -.compilacaoedit .actions_footer { - position: absolute; - top: 100%; - left: -1.8em; - right: -1.8em; - color: #999; - transition: all 0.4s ease-in-out; - padding: 0.3em 0; -} - -.compilacaoedit .actions_footer ul { - margin-left: 0; - margin-bottom: 0; -} - -.compilacaoedit .actions_footer li { - display: block; - height: auto !important; +.displaynone { + display: none !important; } -.clear { - clear:both; -} -.mce-container { - border-color: #ccc !important; -} @media only screen and (max-width: 40.0625em) { - .compilacao .fixed{ - z-index:98; - position: relative; - } - + .cp .fixed{ + z-index:98; + position: relative; + } + .cpe { + .dpt-selected { + margin:1em -1em 1em -1.8em; + + .csform { + .actions_parents, .label_status { + font-size: 0.7em; + position:static !important; + display: block !important; + padding-bottom: 1em; + height: auto !important; + div, li { + display: inline-block !important; + } + + } + + .actions_inserts { + a { + &.btn-inserts, &.btn-excluir, &.btn-salvar { + span { + display: none; + } + } + } + & > li { + &.add_in, &.add_next, &.add_prior { + + position: static !important; + + ul { + position: absolute !important; + display: none !important; + box-shadow: 0px 6px 18px rgba(0, 0, 0, 0.19), 0px 2px 6px rgba(0, 0, 0, 0.5) !important; + } + &:hover ul { + display: block !important; + position: absolute !important; + } + } + &.add_in ul { + left: 1em !important; + right: 1em !important; + } + &.add_next ul { + left: 0 !important; + right: 1em !important; + } + &.add_prior ul { + left: 1em !important; + right: 0 !important; + } + } + } + } + } + } } @media print { - .compilacao .vigencias { - display:none; - } -} \ No newline at end of file + .cp .vigencias { + display:none; + } +} diff --git a/templates/base.html b/templates/base.html index 17c56aa95..46a1ed1d8 100644 --- a/templates/base.html +++ b/templates/base.html @@ -19,7 +19,6 @@ - {# Scripts #} {# modernizr must be in head (see http://modernizr.com/docs/#installing) #} diff --git a/templates/compilacao/edit.html b/templates/compilacao/edit.html index 4a366bba5..acc76a8ad 100644 --- a/templates/compilacao/edit.html +++ b/templates/compilacao/edit.html @@ -1,24 +1,25 @@ {% extends "base.html" %} {% load i18n %} {% load compilacao_filters %} -{% load staticfiles %} +{% load staticfiles %} {% load sass_tags %} {% block head_content %}{{block.super}} + {% endblock %} + {% block title%}

    Edição: {{ view.get_norma }} - {% trans 'Texto Multivigente' %}

    {% endblock %} -{% block base_content %} +{% block base_content %}
    {% trans 'Aguarde... Atualizando informações!!!'%}
    -
    +
    {% include 'compilacao/edit_bloco.html'%}
    {% endblock base_content %} - diff --git a/templates/compilacao/edit_bloco.html b/templates/compilacao/edit_bloco.html index 5a14126c5..4c4686015 100644 --- a/templates/compilacao/edit_bloco.html +++ b/templates/compilacao/edit_bloco.html @@ -1,112 +1,120 @@ {% load i18n %} -{% load compilacao_filters %} +{% load compilacao_filters %} -{% for dispositivo in object_list %} - {% if dispositivo.nivel == view.flag_nivel_old %} -
    - {% elif dispositivo.nivel < view.flag_nivel_old %} - {% close_div view.flag_nivel_old dispositivo.nivel 0 %} +{% for dpt in object_list %} + {% if dpt.nivel == view.flag_nivel_old %} +
    + {% elif dpt.nivel < view.flag_nivel_old %} + {% close_div view.flag_nivel_old dpt.nivel 0 %} {% endif%} {% if forloop.first and view|isinst:'DispositivoEditView' %} {% else %} -
    +
    {% endif%} + {% if view|render_actions_head:dpt %} +
    +
    +
      +
    • C
    • + {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao %} +
    • E
    • +
    • E+
    • +
    • E*
    • + {%endif%} +
    + - {% if view|render_actions_head:dispositivo %} -
    - - -
      - - {% if not dispositivo.tipo_dispositivo.dispositivo_de_articulacao %} -
    • E*
    • -
    • E+
    • -
    • E
    • - {%endif%} -
    - - - - {% if not dispositivo.tipo_dispositivo.dispositivo_de_articulacao %} - {% csrf_token %} - - {%endif%} - - -
    - - -
    -
    Em Edição: {% nomenclatura_heranca dispositivo %}
    -
    -
    - {% endif%} - - + {% endif%} + {% if view.pk_view == 0 and view.pk_add == 0 or view.pk_add != view.pk_view %} -
    - E +
    + E
    -
    -{% spaceless %} - - {{ dispositivo.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dispositivo.rotulo }}{{ dispositivo.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dispositivo.tipo_dispositivo.texto_prefixo_html|safe }} - {% if dispositivo.texto == '' and not dispositivo.tipo_dispositivo.dispositivo_de_articulacao %}({{dispositivo.tipo_dispositivo}} sem texto){%else%}{{ dispositivo.texto|safe }}{%endif%} - - - {% if dispositivo.norma_publicada_id != None %} - - {{ dispositivo.tipo_dispositivo.nota_automatica_prefixo_html|safe }} - {% nota_automatica dispositivo %} - {{ dispositivo.tipo_dispositivo.nota_automatica_sufixo_html|safe }} - - {% endif %} -{% endspaceless %} - {% if view.is_norma_alteradora and dispositivo.tipo_dispositivo.class_css == 'bloco_alteracao'%} - {%with node=dispositivo template_name='compilacao/edit_bloco_alteracao.html' %} +
    + {% spaceless %} + + {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }} + {% if dpt.texto == '' and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}({{dpt.tipo_dispositivo}} sem texto){%else%}{{ dpt.texto|safe }}{%endif%} + + + {% if dpt.norma_publicada_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} + + {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} + {% nota_automatica dpt %} + {{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }} + + {% endif %} + {% endspaceless %} + {% if view.is_norma_alteradora and dpt.tipo_dispositivo.class_css == 'bloco_alteracao'%} + {%with node=dpt template_name='compilacao/edit_bloco_alteracao.html' %} {%include template_name%} - {%endwith%} + {%endwith%} {% endif%}
    - {% endif%} - - {% set_nivel_old view dispositivo.nivel %} + + {% set_nivel_old view dpt.nivel %} + {% endfor %} {% if view|isinst:'DispositivoEditView' %} - {% close_div view.flag_nivel_old view.flag_nivel_ini -1 %} + {% close_div view.flag_nivel_old view.flag_nivel_ini -1 %} {% else %} - {% close_div view.flag_nivel_old view.flag_nivel_ini 0 %} -{% endif%} \ No newline at end of file + {% close_div view.flag_nivel_old view.flag_nivel_ini 0 %} +{% endif%} diff --git a/templates/compilacao/edit_bloco_alteracao.html b/templates/compilacao/edit_bloco_alteracao.html index d438e02af..3f7b71744 100644 --- a/templates/compilacao/edit_bloco_alteracao.html +++ b/templates/compilacao/edit_bloco_alteracao.html @@ -1,10 +1,10 @@ {% load compilacao_filters %} -{% for ch in dispositivo.pk|get_bloco_atualizador %} +{% for ch in dpt.pk|get_bloco_atualizador %} {% spaceless %} -
    +
    - {{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ ch.rotulo }}{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }} -
    + {{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ ch.rotulo }}{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }} +
    {% endspaceless %} -{% endfor %} \ No newline at end of file +{% endfor %} diff --git a/templates/compilacao/index.html b/templates/compilacao/index.html index 080ec9286..66379e447 100644 --- a/templates/compilacao/index.html +++ b/templates/compilacao/index.html @@ -1,31 +1,39 @@ {% extends "base.html" %} {% load i18n %} {% load compilacao_filters %} +{% load staticfiles %} +{% load sass_tags %} + +{% block head_content %}{{block.super}} + + +{% endblock %} + {% block title%}

    {{ view.get_norma }}

    {% endblock %} -{% block base_content %} +{% block base_content %} -
    +
    @@ -65,11 +73,11 @@ $(document).ready(function() {
    {% for key, values in view.get_vigencias.items %} - {% if forloop.first %} + {% if forloop.first %}
    @@ -120,4 +128,4 @@ $(document).ready(function() { {% include 'compilacao/index_bloco.html'%}
    -{% endblock base_content %} \ No newline at end of file +{% endblock base_content %} diff --git a/templates/compilacao/index_bloco.html b/templates/compilacao/index_bloco.html index 0f5297575..7066cf042 100644 --- a/templates/compilacao/index_bloco.html +++ b/templates/compilacao/index_bloco.html @@ -1,30 +1,30 @@ {% load i18n %} -{% load compilacao_filters %} +{% load compilacao_filters %} -{% for dispositivo in object_list %} - {% if dispositivo.nivel == view.flag_nivel_old %} -
    - {% elif dispositivo.nivel < view.flag_nivel_old %} - {% close_div view.flag_nivel_old dispositivo.nivel 0 %} +{% for dpt in object_list %} + {% if dpt.nivel == view.flag_nivel_old %} +
    + {% elif dpt.nivel < view.flag_nivel_old %} + {% close_div view.flag_nivel_old dpt.nivel 0 %} {% endif%} -
    -
    -{% spaceless %} - {{ dispositivo.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dispositivo.rotulo }}{{ dispositivo.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dispositivo.tipo_dispositivo.texto_prefixo_html|safe }}{{ dispositivo.texto|safe }} - {% if dispositivo.norma_publicada_id != None %} - - {{ dispositivo.tipo_dispositivo.nota_automatica_prefixo_html|safe }} - {% nota_automatica dispositivo %} - {{ dispositivo.tipo_dispositivo.nota_automatica_sufixo_html|safe }} - - {% endif %} -{% endspaceless %} - {% if view.is_norma_alteradora and dispositivo.tipo_dispositivo.class_css == 'bloco_alteracao'%} - {%with node=dispositivo template_name='compilacao/index_bloco_alteracao.html' %} +
    +
    + {% spaceless %} + {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{{ dpt.texto|safe }} + {% if dpt.norma_publicada_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} + + {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} + {% nota_automatica dpt %} + {{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }} + + {% endif %} + {% endspaceless %} + {% if view.is_norma_alteradora and dpt.tipo_dispositivo.class_css == 'bloco_alteracao'%} + {%with node=dpt template_name='compilacao/index_bloco_alteracao.html' %} {%include template_name%} - {%endwith%} + {%endwith%} {% endif%}
    - {% set_nivel_old view dispositivo.nivel %} + {% set_nivel_old view dpt.nivel %} {% endfor %} -{% close_div view.flag_nivel_old view.flag_nivel_ini 0 %} \ No newline at end of file +{% close_div view.flag_nivel_old view.flag_nivel_ini 0 %} diff --git a/templates/compilacao/index_bloco_alteracao.html b/templates/compilacao/index_bloco_alteracao.html index d438e02af..3f7b71744 100644 --- a/templates/compilacao/index_bloco_alteracao.html +++ b/templates/compilacao/index_bloco_alteracao.html @@ -1,10 +1,10 @@ {% load compilacao_filters %} -{% for ch in dispositivo.pk|get_bloco_atualizador %} +{% for ch in dpt.pk|get_bloco_atualizador %} {% spaceless %} -
    +
    - {{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ ch.rotulo }}{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }} -
    + {{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ ch.rotulo }}{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }} +
    {% endspaceless %} -{% endfor %} \ No newline at end of file +{% endfor %} From e77d34c2c6f2bd6c1a9a636e134bdaf8c3c06c9b Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Sun, 25 Oct 2015 22:25:16 -0200 Subject: [PATCH 06/23] fix qa check --- compilacao/templatetags/compilacao_filters.py | 3 +++ compilacao/urls.py | 9 ++++----- compilacao/views.py | 9 +++------ norma/migrations/0006_auto_20151025_1427.py | 18 ++++++++++++++++++ sapl/settings.py | 3 +-- static/img/icon_delete_white.png | Bin 0 -> 2866 bytes static/img/icon_save_white.png | Bin 0 -> 2921 bytes 7 files changed, 29 insertions(+), 13 deletions(-) create mode 100644 norma/migrations/0006_auto_20151025_1427.py create mode 100644 static/img/icon_delete_white.png create mode 100644 static/img/icon_save_white.png diff --git a/compilacao/templatetags/compilacao_filters.py b/compilacao/templatetags/compilacao_filters.py index ed28d24dc..d1c1f75da 100644 --- a/compilacao/templatetags/compilacao_filters.py +++ b/compilacao/templatetags/compilacao_filters.py @@ -91,6 +91,7 @@ def render_actions_head(view, d_atual): return False + @register.filter def short_string(str, length): if len(str) > length: @@ -98,6 +99,7 @@ def short_string(str, length): else: return str + @register.filter def nomenclatura(d): result = '' @@ -112,6 +114,7 @@ def nomenclatura(d): d.rotulo_padrao() + ')' return result + @register.simple_tag def nomenclatura_heranca(d): result = '' diff --git a/compilacao/urls.py b/compilacao/urls.py index a60a623be..39b7db482 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -1,10 +1,9 @@ -from django.conf.urls import url, include +from django.conf.urls import include, url from compilacao import views -from compilacao.views import (tipo_nota_crud, tipo_vide_crud, - tipo_publicacao_crud, veiculo_publicacao_crud, - tipo_dispositivo_crud) - +from compilacao.views import (tipo_dispositivo_crud, tipo_nota_crud, + tipo_publicacao_crud, tipo_vide_crud, + veiculo_publicacao_crud) urlpatterns_compilacao = [ url(r'^(?P[0-9]+)/compilacao/$', diff --git a/compilacao/views.py b/compilacao/views.py index edc393ab0..ab6bbc201 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -1,7 +1,5 @@ - - from collections import OrderedDict -from datetime import timedelta, datetime +from datetime import datetime, timedelta from os.path import sys from django import forms @@ -15,12 +13,11 @@ from django.views.generic.base import TemplateView from django.views.generic.edit import FormMixin from django.views.generic.list import ListView -from compilacao.models import (Dispositivo, TipoNota, TipoVide, TipoPublicacao, - VeiculoPublicacao, TipoDispositivo) +from compilacao.models import (Dispositivo, TipoDispositivo, TipoNota, + TipoPublicacao, TipoVide, VeiculoPublicacao) from norma.models import NormaJuridica from sapl.crud import build_crud - DISPOSITIVO_SELECT_RELATED = ( 'tipo_dispositivo', 'norma_publicada', diff --git a/norma/migrations/0006_auto_20151025_1427.py b/norma/migrations/0006_auto_20151025_1427.py new file mode 100644 index 000000000..1a5f7c607 --- /dev/null +++ b/norma/migrations/0006_auto_20151025_1427.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0005_auto_20150915_1141'), + ] + + operations = [ + migrations.AlterModelOptions( + name='normajuridica', + options={'ordering': ['-data', '-numero'], 'verbose_name_plural': 'Normas Jurídicas', 'verbose_name': 'Norma Jurídica'}, + ), + ] diff --git a/sapl/settings.py b/sapl/settings.py index 0ebf07620..52d0b2b53 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -60,8 +60,7 @@ INSTALLED_APPS = ( 'sass_processor', ) if DEBUG: - #INSTALLED_APPS += ('debug_toolbar',) - pass + INSTALLED_APPS += ('debug_toolbar',) MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', diff --git a/static/img/icon_delete_white.png b/static/img/icon_delete_white.png new file mode 100644 index 0000000000000000000000000000000000000000..f06892bffd3a1121220a65970e24365fd97002bb GIT binary patch literal 2866 zcmV-23(fS2P)4Tx0C?J+Q)g6D=@vcr-tj1^HV42lZa2jn55j)S9!ipu-pd!uXCy!YnK{> z2n?1;Gf_2w45>mM5#WQz#Kz&|EGkvK~TfD`~gdX7S-06<0ofSs5oQvjd@0AR~wV&ec% zEdXFAf9BHwfSvf6djSAjlpz%XppgI|6J>}*0BAb^tj|`8MF3bZ02F3R#5n-iEdVe{ zS7t~6u(trf&JYW-00;~KFj0twDF6g}0AR=?BX|IWnE(_<@>e|ZE3OddDgXd@nX){& zBsoQaTL>+22Uk}v9w^R97b_GtVFF>AKrX_0nHe&HG!NkO%m4tOkrff(gY*4(&JM25 z&Nhy=4qq+mzXtyzVq)X|<DpKGaQJ>aJVl|9x!Kv}EM4F8AGNmGkLXs)P zCDQ+7;@>R$13uq10I+I40eg`xs9j?N_Dd%aSaiVR_W%I$yKlkNCzL=651DUOSSq$Ed=-((3YAKgCY2j1FI1_jrmEhm z3sv(~%T$l4UQ>OpMpZLYTc&xiMv2YpRx)mRPGut5K^*>%BIv?Wdil zy+ylO`+*KY$4Vz$Cr4+G&IO(4Q`uA9rwXSQO+7mGt}d!;r5mBUM0dY#r|y`ZzFvTy zOmC;&dA;ZQ9DOhSRQ+xGr}ak+SO&8UBnI0I&KNw!HF0k|9WTe*@liuv!$3o&VU=N* z;e?U7(LAHoMvX=fjA_PP<0Rv4#%;!P6gpNq-kQ#w?mvCS^p@!_XIRe=&)75LwiC-K#A%&Vo6|>U7iYP1 zgY$@siA#dZE|)$on;XX6$i3uBboFsv;d;{botv|p!tJQrukJSPY3_&IpUgC$DV|v~ zbI`-cL*P;6(LW2Hl`w1HtbR{JPl0E(=OZs;FOgTR*RZ#xcdGYc?-xGyK60PqKI1$$ z-ZI`wBrnsy*W_HW0Wrec-#cqqYFCLW#$!oKa ztOZ#u3bsO~=u}!L*D43HXJuDrzs-rtIhL!QE6wf9v&!3$H=OUE|LqdO65*1zrG`sa zEge|qy{u|EvOIBl+X~|q1uKSD2CO`|inc0k)laMKSC_7Sy(W51Yk^+D%7VeQ0c-0E zRSM;Wee2xU?Ojh;FInHUVfu!h8$K0@imnvf7nc=(*eKk1(e4|2y!JHg)!SRV_x(P}zS~s+RZZ1q)n)rh`?L2yu8FGY z_?G)^U9C=SaqY(g(gXbmBM!FLxzyDi(mhmCkJc;eM-ImyzW$x>cP$Mz4ONYt#^NJz zM0w=t_X*$k9t}F$c8q(h;Rn+nb{%IOFKR-X@|s4QQ=0o*Vq3aT%s$c9>fU<%N829{ zoHRUHc}nwC$!Xf@g42^{^3RN&m7RTlF8SPG+oHC6=VQ*_Y7cMkx)5~X(nbG^=R3SR z&Rp`ibn>#>OB6F(@)2{oV%K?xm;_x?s~noduI3P8=g1L-SoYA z@fQEq)t)&$-M#aAZ}-Lb_1_lVesU-M&da;mcPH+xyidGe^g!)F*+boj)jwPQ+}Q8j ze`>&Yp!3n(NB0JWgU|kv^^Xrj1&^7J%Z3ex>z+71IXU7#a{cN2r$f(V&nBK1{-XZN zt``^}my^G3e5L*B!0Q>W+s4Ai9=^$VGcjKDR{QP2cieX!@1x%j zPvm?ce<=TG`LXp=(5L&88IzO$1Ou4!{1CdwXaE2J24YJ`L;(K){{a7>y{D4^000Sa zNLh0L01FcU01FcV0GgZ_00007bV*G`2j2=75FP?H7wJ0y003@DL_t(I%e9k14uBvG z1RFm_H2(hzPtaG47Y`ayXjywC-D$dP4ah*UU;zmz2F$<~ft`>YSg#K**sI0^YxefQ zx(9wWx-F;)B0fHZVMqnmgiQ8#Nmi4XE%|;)ASEXvIogr1-Lyafmcf|h1BDb!%^gRe Q!T4Tx0C?J+Q)g6D=@vcr-tj1^HV42lZa2jn55j)S9!ipu-pd!uXCy!YnK{> z2n?1;Gf_2w45>mM5#WQz#Kz&|EGkvK~TfD`~gdX7S-06<0ofSs5oQvjd@0AR~wV&ec% zEdXFAf9BHwfSvf6djSAjlpz%XppgI|6J>}*0BAb^tj|`8MF3bZ02F3R#5n-iEdVe{ zS7t~6u(trf&JYW-00;~KFj0twDF6g}0AR=?BX|IWnE(_<@>e|ZE3OddDgXd@nX){& zBsoQaTL>+22Uk}v9w^R97b_GtVFF>AKrX_0nHe&HG!NkO%m4tOkrff(gY*4(&JM25 z&Nhy=4qq+mzXtyzVq)X|<DpKGaQJ>aJVl|9x!Kv}EM4F8AGNmGkLXs)P zCDQ+7;@>R$13uq10I+I40eg`xs9j?N_Dd%aSaiVR_W%I$yKlkNCzL=651DUOSSq$Ed=-((3YAKgCY2j1FI1_jrmEhm z3sv(~%T$l4UQ>OpMpZLYTc&xiMv2YpRx)mRPGut5K^*>%BIv?Wdil zy+ylO`+*KY$4Vz$Cr4+G&IO(4Q`uA9rwXSQO+7mGt}d!;r5mBUM0dY#r|y`ZzFvTy zOmC;&dA;ZQ9DOhSRQ+xGr}ak+SO&8UBnI0I&KNw!HF0k|9WTe*@liuv!$3o&VU=N* z;e?U7(LAHoMvX=fjA_PP<0Rv4#%;!P6gpNq-kQ#w?mvCS^p@!_XIRe=&)75LwiC-K#A%&Vo6|>U7iYP1 zgY$@siA#dZE|)$on;XX6$i3uBboFsv;d;{botv|p!tJQrukJSPY3_&IpUgC$DV|v~ zbI`-cL*P;6(LW2Hl`w1HtbR{JPl0E(=OZs;FOgTR*RZ#xcdGYc?-xGyK60PqKI1$$ z-ZI`wBrnsy*W_HW0Wrec-#cqqYFCLW#$!oKa ztOZ#u3bsO~=u}!L*D43HXJuDrzs-rtIhL!QE6wf9v&!3$H=OUE|LqdO65*1zrG`sa zEge|qy{u|EvOIBl+X~|q1uKSD2CO`|inc0k)laMKSC_7Sy(W51Yk^+D%7VeQ0c-0E zRSM;Wee2xU?Ojh;FInHUVfu!h8$K0@imnvf7nc=(*eKk1(e4|2y!JHg)!SRV_x(P}zS~s+RZZ1q)n)rh`?L2yu8FGY z_?G)^U9C=SaqY(g(gXbmBM!FLxzyDi(mhmCkJc;eM-ImyzW$x>cP$Mz4ONYt#^NJz zM0w=t_X*$k9t}F$c8q(h;Rn+nb{%IOFKR-X@|s4QQ=0o*Vq3aT%s$c9>fU<%N829{ zoHRUHc}nwC$!Xf@g42^{^3RN&m7RTlF8SPG+oHC6=VQ*_Y7cMkx)5~X(nbG^=R3SR z&Rp`ibn>#>OB6F(@)2{oV%K?xm;_x?s~noduI3P8=g1L-SoYA z@fQEq)t)&$-M#aAZ}-Lb_1_lVesU-M&da;mcPH+xyidGe^g!)F*+boj)jwPQ+}Q8j ze`>&Yp!3n(NB0JWgU|kv^^Xrj1&^7J%Z3ex>z+71IXU7#a{cN2r$f(V&nBK1{-XZN zt``^}my^G3e5L*B!0Q>W+s4Ai9=^$VGcjKDR{QP2cieX!@1x%j zPvm?ce<=TG`LXp=(5L&88IzO$1Ou4!{1CdwXaE2J24YJ`L;(K){{a7>y{D4^000Sa zNLh0L01FcU01FcV0GgZ_00007bV*G`2j2=74H_zQFtp|X005;)L_t(I%k7oH4TCTY zMSrR+!WvZ%-GG6*To2GSs-9qr*9(zCL`rB3C;ri~p1v(R7SI9%^?E4Q1idCPRHzBs z0G}Cr39<$b7USF$?qwwB+#9${dIENiqqhdY92{c)&$8WGP7eIqFd1F8EEx;nqMdXM z80afjy3h8wrr#-Nw^sNP2U}3FsvV|tn@|B0KVQHIAfXaL$Tvp9r# TJ`*L800000NkvXXu0mjfKu>MT literal 0 HcmV?d00001 From 4421d6bc1da206a44d472f2c3aeffd95fd7b413f Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 26 Oct 2015 18:41:42 -0200 Subject: [PATCH 07/23] style sheet refactoring --- compilacao/views.py | 3 - sapl/settings.py | 3 +- static/js/compilacao.js | 16 ++- static/styles/compilacao.scss | 154 +++++++++++++++++---------- templates/compilacao/edit_bloco.html | 10 +- 5 files changed, 113 insertions(+), 73 deletions(-) diff --git a/compilacao/views.py b/compilacao/views.py index ab6bbc201..8e2d7fe19 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -74,9 +74,6 @@ tipo_dispositivo_crud = build_crud( ], [_('Configurações para Renderização de Rótulo e Texto'), - - - [('rotulo_prefixo_html', 6), ('rotulo_sufixo_html', 6), ], diff --git a/sapl/settings.py b/sapl/settings.py index 52d0b2b53..9f57f65d1 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -60,7 +60,8 @@ INSTALLED_APPS = ( 'sass_processor', ) if DEBUG: - INSTALLED_APPS += ('debug_toolbar',) + # INSTALLED_APPS += ('debug_toolbar',) + pass MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', diff --git a/static/js/compilacao.js b/static/js/compilacao.js index 26bde8cfd..1eae0c7d9 100644 --- a/static/js/compilacao.js +++ b/static/js/compilacao.js @@ -3,7 +3,7 @@ var flag_add_next = false; var flag_add_next_pk = 0; var flag_add_next_pai = 0; -var editortype = "construct"; +var editortype = "textarea"; var onSubmitEditForm = function(event) { @@ -108,15 +108,13 @@ var clickUpdateDispositivo = function(event, __pk, __action, addeditselected) { $('.csform form').submit(onSubmitEditForm); } else if (editortype == 'construct') { + $('.csform .btn-salvar').parent().remove(); $('.csform .btn-salvar, .csform textarea').remove(); - // $('#dpt'+flag_add_next_pk).css('min-height', $('.actions_right').height()*1.35 ); + $('#dpt'+flag_add_next_pk).css('min-height', $('.actions_right').height()*2); $('.actions_inserts').addClass('menu_fixo'); } $(".edt-"+editortype).addClass('selected'); - /*if (_action != null && _action != 'refresh') - $("a.btn-action[pk='"+_pk+"']").css('background-color', '#000000'); -*/ if (addeditselected == null || addeditselected) { $('#dpt'+flag_add_next_pk).addClass('dpt-selected'); $('html, body').animate({ @@ -160,14 +158,14 @@ var clickUpdateDispositivo = function(event, __pk, __action, addeditselected) { function clearEditSelected() { tinymce.remove(); $('.dpt-selected').removeClass('dpt-selected'); + $('.dpt').css('min-height', ''); $('.csform').remove(); } function reloadFunctionClicks() { - $('.dpt .de, .btn-action, .btn-inserts').off(); + $('.dpt .de, .btn-action, .btn-inserts, .btn-edit').off(); - $('.dpt .de, .btn-edit').on( - 'click', clickEditDispositivo); + $('.dpt .de, .btn-edit').on('click', clickEditDispositivo); $('.btn-action, .btn-inserts').on( 'click', clickUpdateDispositivo); @@ -199,6 +197,6 @@ $(document).ready(function() { reloadFunctionClicks(); $("#message_block").css("display", "none"); - clickUpdateDispositivo(null, 64941, 'refresh', true); + clickUpdateDispositivo(null, 216879, 'refresh', true); }); diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index 6015f2d73..cce8423e5 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -39,6 +39,7 @@ $color_actions_border: #ddd; box-shadow: 0 1px 2px #999; } } + .page { background-color: #f0f0f0; } @@ -242,7 +243,7 @@ $color_actions_border: #ddd; & > .actions_left { color: #fff; position: absolute; - left: -2.2em; + left: -2em; opacity: 0; transition: all 0.4s ease-in-out; a { @@ -251,7 +252,7 @@ $color_actions_border: #ddd; @include border-radius(7px); color: #ffffff !important; font-weight: bold; - padding: 2px 6px 2px 7px; + padding: 2px 7px 2px 7px; &:hover { @include background-top-down(#3cb0fd, #3498DB); @@ -288,7 +289,6 @@ $color_actions_border: #ddd; *:hover { background-color: #eee; } - } .articulacao{ margin-left: -0.8em; @@ -305,9 +305,12 @@ $color_actions_border: #ddd; } .dpt-selected { - border: 2.2em solid #eee; + font-size: 1em; + border: 1px solid #aabbcc; margin: 1em -2em 1em -2.8em; - box-shadow: 0 2px 2px #aaa; + padding: 2.2em 2.2em 1.6em 2.2em; + background: #eee; + box-shadow: 0px 10px 18px rgba(0, 0, 0, 0.19), 0px 2px 6px rgba(0, 0, 0, 0.23); ul { list-style: none; @@ -317,14 +320,31 @@ $color_actions_border: #ddd; .bloco { opacity: 0.5; + &:hover { + opacity: 1; + } + a:hover { + background: transparent; + } + } + & > .bloco { padding: 1em; opacity: 1; + margin: 0 !important; } & > .dpt { padding: 0 1em; + &:last-child { + padding-bottom: 1em; + border-bottom: 1px solid black; + } + } + + & > .actions_left { + display: none; } .csform { /* compilacao simple form */ @@ -340,18 +360,17 @@ $color_actions_border: #ddd; a { color: $color_actions; display: block; - font-size: 1em; - background-image: none; - background-color: transparent; + background: transparent; vertical-align: middle; - line-height: 2.2em; - min-width: 2.2em; text-align: center; font-weight: normal; text-shadow: 0 0 10px rgba(0,0,0,0.3); + padding: 0.33em 0.4em; } & > li { position: relative; + display: table-cell; + vertical-align: top; &:hover { background-color: rgba(0,0,0,0.1); & > a { @@ -363,16 +382,26 @@ $color_actions_border: #ddd; } } + .label_status { + position: absolute; + bottom: 0; + right: 0; + color: #889; + padding: 0.3em; + font-size: 80%; + text-align: right; + z-index: 5; + } + .actions_parents { - height: 2.2em; - top: -2.2em; - left: -2.2em; + z-index: 1; + top: 0em; + left: 0em; a { - padding: 0.2em 0.4em; - text-shadow: 0 0 5px rgba(0,0,0,0.3); + padding: 0.62em; } div, li { - font-size: 0.8em; + font-size: 80%; display: table-cell; vertical-align: middle; border-right: 1px solid #ccc; @@ -384,48 +413,48 @@ $color_actions_border: #ddd; & > li { &:hover a{ color: $color_actions; - text-shadow: 0 0 0px #777; font-weight: normal; } } } - .label_status { - position: absolute; - bottom: -2.5em; - right: -1.8em; - color: #889; - padding: 0.3em 0; - font-size: 0.8em; - } - .actions_top { - top: -2.2em; + top: 0em; right: 0em; - + a { + padding-right: 1em; + padding-left: 1em; + } li { display: table-cell; vertical-align: middle; border-left: 1px solid $color_actions_border; - &:last-child { - border-right: 1px solid $color_actions_border; - } } } .actions_bottom { @extend .actions_top; top: auto; - right: auto; - left: 0em; - bottom: -2.2em; + left: 0; + bottom: 0; + display: inline-block; + a { + padding: 0 0.4em; + } + li { + border: 0px; + border-right: 1px solid $color_actions_border; + border-top: 1px solid $color_actions_border; + } } .actions_right { - top: 0em; - right: -2.2em; - + top: 2.2em; + right: 0em; + bottom:0; + display: block; li { + width: 2.2em; display: block; border-bottom: 1px solid $color_actions_border; &:first-child { @@ -437,39 +466,39 @@ $color_actions_border: #ddd; .actions_left { @extend .actions_right; right: auto; - left: -2.2em; + left: 0em; } .actions_inserts { + background: transparent; position: relative; z-index: 9; display: table; width: 100%; li, li:hover { - background: transparent; + background: #2980C9; a { - background: #2980C9; - background-image: none; + vertical-align: top; text-shadow: 0 0 0; color: #fff; font-weight: normal; white-space: nowrap; - + min-height: 2.4em; &:hover { - background-color: #196aad; + background: #1770ba; text-shadow: 0 0 0; - color: #fff; + color: #ffd145; font-weight: normal; } } } - & > li { + background: #3385CA; display: table-cell; table-layout: auto; - vertical-align: middle; - border-right: 1px solid white; + vertical-align: top; + border-right: 1px solid #eee; &:hover > ul { display: block; @@ -477,17 +506,25 @@ $color_actions_border: #ddd; &:last-child { border-right: 0px; } + &:only-child { + display: inline-block; + float: right; + } & > ul { + display: none; position:absolute; box-shadow: 0px 6px 18px rgba(0, 0, 0, 0.19), 0px 2px 6px rgba(0, 0, 0, 0.23); a { text-align: left; - font-size: 0.8em; - padding: 0 0.5em; + font-size: 80%; + padding: 0.3em 1em; white-space: nowrap; } + li:nth-child(even) { + background: #3385CA; + } } span { @@ -496,11 +533,12 @@ $color_actions_border: #ddd; & > a { @include background-top-down(#3498DB, #2980C9); + &.btn-excluir { text-align: left; background: #A70808; color: #c99; - padding-left: 1.5em; + padding-left: 1.7em; &:hover { background-color: #c70808; color: #ecc; @@ -508,13 +546,12 @@ $color_actions_border: #ddd; &::before { z-index: 10; position: absolute; - background: url(/static/img/icon_delete_white.png) no-repeat 0 50%; + background: url(/static/img/icon_delete_white.png) no-repeat 50% 50%; content:""; top: 0; left: 0; display: block; color: black; - margin-top: 0.05em; margin-left: 0.6em; height: 2em; width: 2em; @@ -525,7 +562,6 @@ $color_actions_border: #ddd; background: #1f8b4d; color: white; - padding-left: 1.7em; &:hover { background: #2d9c5c; color: white; @@ -536,12 +572,13 @@ $color_actions_border: #ddd; } } } /* fim li de primeiro nivel*/ + } /* fim actions_inserts*/ .menu_fixo { & > li { vertical-align: top; - background-color: transparent; + background: transparent !important; & > ul { display: block; position: relative; @@ -568,7 +605,10 @@ $color_actions_border: #ddd; resize: vertical; min-height: 12.6em; border: 0px; - border-bottom: 2px #ccc solid; + font-size: 120%; + &:focus { + background: #fff; + } &::-webkit-input-placeholder { color: #c70808; opacity: 0.6; @@ -621,10 +661,10 @@ $color_actions_border: #ddd; .csform { .actions_parents, .label_status { - font-size: 0.7em; + font-size: 80%; position:static !important; display: block !important; - padding-bottom: 1em; + padding: 0em; height: auto !important; div, li { display: inline-block !important; diff --git a/templates/compilacao/edit_bloco.html b/templates/compilacao/edit_bloco.html index 4c4686015..90f21e259 100644 --- a/templates/compilacao/edit_bloco.html +++ b/templates/compilacao/edit_bloco.html @@ -13,6 +13,7 @@
    {% endif%} + {% if view|render_actions_head:dpt %}
    @@ -33,12 +34,15 @@
  • - + +
      From 816ad44acd3b19e505ee8d5d0f5ca6f1c0769183 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Wed, 28 Oct 2015 21:07:50 -0200 Subject: [PATCH 08/23] refactoring of Compilacao style sheet to scss --- compilacao/views.py | 2 +- static/js/compilacao.js | 16 +- static/styles/compilacao.scss | 295 ++++++++++++++++----------- templates/base.html | 2 +- templates/compilacao/edit_bloco.html | 6 +- 5 files changed, 194 insertions(+), 127 deletions(-) diff --git a/compilacao/views.py b/compilacao/views.py index 8e2d7fe19..79ae8a048 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -582,7 +582,7 @@ class ActionsEditMixin(object): # Tipo Filho # tf = TipoDispositivo.objects.get(pk=context['tipo_pk']) - + print("aqui") return {} def add_next(self, context): diff --git a/static/js/compilacao.js b/static/js/compilacao.js index 1eae0c7d9..09381ccc9 100644 --- a/static/js/compilacao.js +++ b/static/js/compilacao.js @@ -19,6 +19,7 @@ var onSubmitEditForm = function(event) { 'csrfmiddlewaretoken' : $('input[name=csrfmiddlewaretoken]').val(), 'texto' : texto }; + var url = $('.csform form').attr( "action_ajax" ); $("#message_block").css("display", "block"); $.post(url,formData) @@ -100,7 +101,7 @@ var clickUpdateDispositivo = function(event, __pk, __action, addeditselected) { $( '#dpt' + _pk ).prepend( data ); } reloadFunctionClicks(); - + if ( editortype == 'tinymce' ) { initTinymce(); } @@ -111,15 +112,16 @@ var clickUpdateDispositivo = function(event, __pk, __action, addeditselected) { $('.csform .btn-salvar').parent().remove(); $('.csform .btn-salvar, .csform textarea').remove(); $('#dpt'+flag_add_next_pk).css('min-height', $('.actions_right').height()*2); - $('.actions_inserts').addClass('menu_fixo'); + $('.actions_inserts').removeClass('menu_flutuante'); } $(".edt-"+editortype).addClass('selected'); + //$(".container").addClass('class_color_container'); if (addeditselected == null || addeditselected) { - $('#dpt'+flag_add_next_pk).addClass('dpt-selected'); $('html, body').animate({ scrollTop: $('#dpt' + flag_add_next_pk ).offset().top - window.innerHeight / 10 }, 300); + $('#dpt'+flag_add_next_pk).addClass('dpt-selected'); flag_add_next_pk = 0; } } @@ -149,6 +151,11 @@ var clickUpdateDispositivo = function(event, __pk, __action, addeditselected) { flag_add_next = false; } } + else { + clearEditSelected(); + reloadFunctionClicks(); + flag_add_next_pk = 0; + } }).always(function() { $("#message_block").css("display", "none"); }); @@ -156,6 +163,7 @@ var clickUpdateDispositivo = function(event, __pk, __action, addeditselected) { function clearEditSelected() { + $(".container").removeClass('class_color_container'); tinymce.remove(); $('.dpt-selected').removeClass('dpt-selected'); $('.dpt').css('min-height', ''); @@ -197,6 +205,6 @@ $(document).ready(function() { reloadFunctionClicks(); $("#message_block").css("display", "none"); - clickUpdateDispositivo(null, 216879, 'refresh', true); + clickUpdateDispositivo(null, 60933, 'refresh', true); }); diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index cce8423e5..70804c93d 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -1,5 +1,5 @@ $color_actions: #16407c; -$color_actions_border: #ddd; +$color_actions_border: #CCC; @mixin background-top-down($top, $bottom) { background: $top; background-image: -webkit-linear-gradient(top, $top, $bottom); @@ -15,6 +15,63 @@ $color_actions_border: #ddd; border-radius: $radius; } +@mixin li_flutuante() { + & > ul { + transform: translateY(30px); + transition: transform 0.1s linear, + opacity 0.1s linear, + clip 0s 0.3s; + clip: rect(0, 0, 0, 0); + opacity: 0; + position:absolute; + margin-left: 0.5em; + box-shadow: 0px 6px 18px rgba(0, 0, 0, 0.19), 0px 2px 6px rgba(0, 0, 0, 0.23); + + li { + a { + border-right: 0px !important; + } + } + + &::before { + border-width: 0.375rem; + border-style: inset inset solid; + content: ""; + display: block; + height: 0px; + width: 0px; + border-color: transparent transparent #3385CA; + position: absolute; + top: -0.75rem; + left: 0.9375rem; + } + // This bridges the gap between the top bar and a dropdown. + &::after { + content: ""; + position: absolute; + z-index: -1; + left: 0; + top: rem-calc(-25px); + height: rem-calc(25px); + width: 100%; + // This transition is for hover-on. + transition: all 0.3s cubic-bezier(0.55,0,0.1,1); + } + } + &:hover > ul { + + transform: translateY(7px); + // This transition is actually for when we hover-out of the dropdown. + transition: transform 0.4s linear, + opacity 0.4s linear, + clip 0s 0.2s; + opacity: 1; + clip: rect(-100px, 2000px, 2000px, -100px); + + } + +} + #message_block { display: block; position: fixed; @@ -40,9 +97,6 @@ $color_actions_border: #ddd; } } -.page { - background-color: #f0f0f0; -} .cp { .dpt { @@ -230,10 +284,6 @@ $color_actions_border: #ddd; color: #8DA6D8; } - .selected { - background-color: rgba(0, 0, 0, 0.1); - } - .dpt { position: relative; display:block; @@ -287,7 +337,7 @@ $color_actions_border: #ddd; display: block; clear: both; *:hover { - background-color: #eee; + color: #27AE60; } } .articulacao{ @@ -302,15 +352,20 @@ $color_actions_border: #ddd; display:block; } } - } + .btns-action { + opacity: 0; + } + } /* fim dpt */ .dpt-selected { font-size: 1em; - border: 1px solid #aabbcc; + border: 0px solid $color_actions_border; margin: 1em -2em 1em -2.8em; padding: 2.2em 2.2em 1.6em 2.2em; - background: #eee; - box-shadow: 0px 10px 18px rgba(0, 0, 0, 0.19), 0px 2px 6px rgba(0, 0, 0, 0.23); + box-shadow: -4px 18px 18px rgba(0, 0, 0, 0.19), 0px 6px 6px rgba(0, 0, 0, 0.23); + + @include background-top-down(#eaeaee, #ddd); + ul { list-style: none; @@ -330,16 +385,15 @@ $color_actions_border: #ddd; } & > .bloco { - padding: 1em; + padding: 1em 0; opacity: 1; margin: 0 !important; } & > .dpt { - padding: 0 1em; + padding: 0; &:last-child { padding-bottom: 1em; - border-bottom: 1px solid black; } } @@ -354,9 +408,15 @@ $color_actions_border: #ddd; position: static; .btns-action { + -webkit-animation: fadeIn 1s ease-in-out; + -moz-animation: fadeIn 1s ease-in-out; + -o-animation: fadeIn 1s ease-in-out; + opacity: 1; + position: absolute; display: table; transition: all 0.4s ease-in-out; + a { color: $color_actions; display: block; @@ -367,6 +427,7 @@ $color_actions_border: #ddd; text-shadow: 0 0 10px rgba(0,0,0,0.3); padding: 0.33em 0.4em; } + & > li { position: relative; display: table-cell; @@ -404,7 +465,7 @@ $color_actions_border: #ddd; font-size: 80%; display: table-cell; vertical-align: middle; - border-right: 1px solid #ccc; + border-right: 1px solid $color_actions_border; } div { padding: 0 0.4em; @@ -469,6 +530,11 @@ $color_actions_border: #ddd; left: 0em; } + + + + + .actions_inserts { background: transparent; position: relative; @@ -476,73 +542,35 @@ $color_actions_border: #ddd; display: table; width: 100%; - li, li:hover { - background: #2980C9; - a { - vertical-align: top; - text-shadow: 0 0 0; - color: #fff; - font-weight: normal; - white-space: nowrap; - min-height: 2.4em; - &:hover { - background: #1770ba; - text-shadow: 0 0 0; - color: #ffd145; - font-weight: normal; - } - } - } & > li { - background: #3385CA; display: table-cell; - table-layout: auto; - vertical-align: top; - border-right: 1px solid #eee; - &:hover > ul { - display: block; - } - &:last-child { - border-right: 0px; - } - &:only-child { - display: inline-block; - float: right; - } - - & > ul { - - display: none; - position:absolute; - box-shadow: 0px 6px 18px rgba(0, 0, 0, 0.19), 0px 2px 6px rgba(0, 0, 0, 0.23); - a { - text-align: left; - font-size: 80%; - padding: 0.3em 1em; - white-space: nowrap; - } - li:nth-child(even) { - background: #3385CA; - } + &:hover > a { + @include background-top-down(#1c81c4, #0b6dad); } - - span { - padding: 0.7em; - } - & > a { @include background-top-down(#3498DB, #2980C9); + border-right: 1px solid #fff; + padding: 0.3em; + display: block; + color: white; + text-align: center; + white-space: nowrap; + &.btn-excluir { + text-align: left; background: #A70808; color: #c99; padding-left: 1.7em; + position: relative; + &:hover { background-color: #c70808; color: #ecc; } + &::before { z-index: 10; position: absolute; @@ -552,14 +580,14 @@ $color_actions_border: #ddd; left: 0; display: block; color: black; - margin-left: 0.6em; - height: 2em; + margin-left: 0.4em; + height: 100%; width: 2em; } - } + } /* btn-excluir */ + &.btn-salvar { @extend .btn-excluir; - background: #1f8b4d; color: white; &:hover { @@ -567,38 +595,53 @@ $color_actions_border: #ddd; color: white; } &::before { - background: url(/static/img/icon_save_white.png) no-repeat 0 50%; + background: url(/static/img/icon_save_white.png) no-repeat 50% 50%; } } + span { + padding: 0 0.7em; + } } - } /* fim li de primeiro nivel*/ - } /* fim actions_inserts*/ + &:last-child > a{ + border-right: 0px solid #fff; + } - .menu_fixo { - & > li { - vertical-align: top; - background: transparent !important; & > ul { - display: block; - position: relative; - box-shadow: 0 0 0; - a { - white-space: normal; + li { + &:nth-child(even) a { + background: #3385CA; + } + a { + border-right: 1px solid #fff; + display: block; + color: white; + background: #2980C9; + font-size: 80%; + padding: 0.33em 1em; + &:hover { + background: #0a5ea4; + } + } + } } - } /* fim li de primeiro nivel*/ - .add_prior { - display: block; - position: static; - ul { - position: absolute; - display: none; - right: 1em; - box-shadow: 0px 6px 18px rgba(0, 0, 0, 0.19), 0px 2px 6px rgba(0, 0, 0, 0.5); + &.add_prior { + @include li_flutuante(); + display: block; } } - } /* fim menu_fixo*/ + } /* actions_inserts */ + + + .menu_flutuante { + & > li { + @include li_flutuante(); + } + + } + + textarea { margin: 0; @@ -626,8 +669,21 @@ $color_actions_border: #ddd; } } /* fim csform*/ } -} + .selected { + background-color: rgba(0, 0, 0, 0.1); + a { + &:hover { + color: $color_actions !important; + font-weight: normal !important; + } + } + } + +} +.class_color_container { + background: #ddd !important; +} .clear { clear:both; } @@ -641,13 +697,10 @@ $color_actions_border: #ddd; box-shadow: 0 0 5px #777; } - .displaynone { display: none !important; } - - @media only screen and (max-width: 40.0625em) { .cp .fixed{ @@ -669,43 +722,49 @@ $color_actions_border: #ddd; div, li { display: inline-block !important; } - } .actions_inserts { - a { - &.btn-inserts, &.btn-excluir, &.btn-salvar { + & > li { + @include li_flutuante(); + + & > a { span { display: none; } + &.btn-excluir, &.btn-salvar { + padding-left: 0; + min-width: 1em; + &::before { + width: 100%; + margin: 0; + } + } } - } - & > li { &.add_in, &.add_next, &.add_prior { - - position: static !important; - - ul { - position: absolute !important; - display: none !important; - box-shadow: 0px 6px 18px rgba(0, 0, 0, 0.19), 0px 2px 6px rgba(0, 0, 0, 0.5) !important; - } - &:hover ul { - display: block !important; - position: absolute !important; - } + position: static; } - &.add_in ul { + &.add_in > ul { left: 1em !important; right: 1em !important; + margin-left: 0; + &::before { + left: 37%; + } } - &.add_next ul { + &.add_next > ul { left: 0 !important; right: 1em !important; } - &.add_prior ul { + &.add_prior > ul { left: 1em !important; right: 0 !important; + margin-left: 0; + margin-right: 0.5em; + &::before { + right: 42%; + left: auto; + } } } } diff --git a/templates/base.html b/templates/base.html index 46a1ed1d8..10ee92173 100644 --- a/templates/base.html +++ b/templates/base.html @@ -4,7 +4,7 @@ - + diff --git a/templates/compilacao/edit_bloco.html b/templates/compilacao/edit_bloco.html index 90f21e259..d9d760732 100644 --- a/templates/compilacao/edit_bloco.html +++ b/templates/compilacao/edit_bloco.html @@ -18,12 +18,12 @@
        -
      • C
      • {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao %}
      • E
      • E+
      • E*
      • {%endif%} +
      • C
      • @@ -45,7 +45,7 @@
      • BB
      -
      From 33731f76dc0df9122d576b4067ee78d23f894cf3 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 6 Nov 2015 18:48:04 -0200 Subject: [PATCH 09/23] add internal inclusion options for Dispositivo --- .../migrations/0010_auto_20151105_1532.py | 30 + .../migrations/0011_auto_20151105_1540.py | 27 + .../migrations/0012_auto_20151105_1658.py | 34 ++ .../migrations/0013_auto_20151106_1843.py | 24 + compilacao/models.py | 328 +++++++++-- compilacao/views.py | 524 ++++++++---------- static/js/compilacao.js | 399 +++++++------ static/styles/compilacao.scss | 18 +- templates/compilacao/edit_bloco.html | 19 +- 9 files changed, 876 insertions(+), 527 deletions(-) create mode 100644 compilacao/migrations/0010_auto_20151105_1532.py create mode 100644 compilacao/migrations/0011_auto_20151105_1540.py create mode 100644 compilacao/migrations/0012_auto_20151105_1658.py create mode 100644 compilacao/migrations/0013_auto_20151106_1843.py diff --git a/compilacao/migrations/0010_auto_20151105_1532.py b/compilacao/migrations/0010_auto_20151105_1532.py new file mode 100644 index 000000000..3a84ae475 --- /dev/null +++ b/compilacao/migrations/0010_auto_20151105_1532.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0009_auto_20151007_1635'), + ] + + operations = [ + migrations.CreateModel( + name='TipoDispositivoRelationship', + fields=[ + ('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)), + ('filho_permitido', models.ForeignKey(related_name='filho_permitido', to='compilacao.TipoDispositivo')), + ('pai', models.ForeignKey(related_name='pai', to='compilacao.TipoDispositivo')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='tipodispositivo', + name='relacoes_diretas_pai_filho', + field=models.ManyToManyField(related_name='filhos_permitidos', through='compilacao.TipoDispositivoRelationship', to='compilacao.TipoDispositivo'), + ), + ] diff --git a/compilacao/migrations/0011_auto_20151105_1540.py b/compilacao/migrations/0011_auto_20151105_1540.py new file mode 100644 index 000000000..4c4e0f0f3 --- /dev/null +++ b/compilacao/migrations/0011_auto_20151105_1540.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0010_auto_20151105_1532'), + ] + + operations = [ + migrations.AlterModelOptions( + name='tipodispositivorelationship', + options={'verbose_name': 'Relação Direta Permitida', 'verbose_name_plural': 'Relaçõe Diretas Permitidas', 'ordering': ['pai', 'filho_permitido']}, + ), + migrations.AlterField( + model_name='tipodispositivorelationship', + name='filho_permitido', + field=models.ForeignKey(null=True, to='compilacao.TipoDispositivo', blank=True, default=None, related_name='filho_permitido'), + ), + migrations.AlterUniqueTogether( + name='tipodispositivorelationship', + unique_together=set([('pai', 'filho_permitido')]), + ), + ] diff --git a/compilacao/migrations/0012_auto_20151105_1658.py b/compilacao/migrations/0012_auto_20151105_1658.py new file mode 100644 index 000000000..5ac6c1788 --- /dev/null +++ b/compilacao/migrations/0012_auto_20151105_1658.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0011_auto_20151105_1540'), + ] + + operations = [ + migrations.AddField( + model_name='tipodispositivorelationship', + name='filho_de_insercao_automatica', + field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Filho de Inserção Automática'), + ), + migrations.AlterField( + model_name='tipodispositivo', + name='relacoes_diretas_pai_filho', + field=models.ManyToManyField(to='compilacao.TipoDispositivo', related_name='possiveis_pais', through='compilacao.TipoDispositivoRelationship'), + ), + migrations.AlterField( + model_name='tipodispositivorelationship', + name='filho_permitido', + field=models.ForeignKey(blank=True, default=None, null=True, related_name='pais', to='compilacao.TipoDispositivo'), + ), + migrations.AlterField( + model_name='tipodispositivorelationship', + name='pai', + field=models.ForeignKey(to='compilacao.TipoDispositivo', related_name='filhos_permitidos'), + ), + ] diff --git a/compilacao/migrations/0013_auto_20151106_1843.py b/compilacao/migrations/0013_auto_20151106_1843.py new file mode 100644 index 000000000..5786877e7 --- /dev/null +++ b/compilacao/migrations/0013_auto_20151106_1843.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0012_auto_20151105_1658'), + ] + + operations = [ + migrations.AlterField( + model_name='tipodispositivo', + name='relacoes_diretas_pai_filho', + field=models.ManyToManyField(to='compilacao.TipoDispositivo', related_name='_relacoes_diretas_pai_filho_+', through='compilacao.TipoDispositivoRelationship'), + ), + migrations.AlterField( + model_name='tipodispositivorelationship', + name='filho_permitido', + field=models.ForeignKey(null=True, blank=True, related_name='possiveis_pais', to='compilacao.TipoDispositivo', default=None), + ), + ] diff --git a/compilacao/models.py b/compilacao/models.py index 35c1d14d0..228d2f15d 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -2,7 +2,7 @@ from datetime import datetime from django.contrib.auth.models import User from django.db import models -from django.db.models import F +from django.db.models import F, Q from django.db.models.aggregates import Max from django.utils.translation import ugettext_lazy as _ @@ -75,7 +75,7 @@ class TipoVide(models.Model): return '%s: %s' % (self.sigla, self.nome) -class TipoDispositivo(models.Model): +class TipoDispositivo(BaseModel): """ - ids fazem parte da lógica do desenvolvimento quanto a simulação de hierarquia @@ -237,6 +237,13 @@ class TipoDispositivo(models.Model): default=FNC1, verbose_name=_('Formato da Variação 5')) + relacoes_diretas_pai_filho = models.ManyToManyField( + 'self', + through='TipoDispositivoRelationship', + through_fields=('pai', 'filho_permitido'), + symmetrical=False, + related_name='+') + class Meta: verbose_name = _('Tipo de Dispositivo') verbose_name_plural = _('Tipos de Dispositivo') @@ -245,6 +252,38 @@ class TipoDispositivo(models.Model): def __str__(self): return self.nome + def permitido_inserir_in(self, base, excluir_autos=False): + pp = self.possiveis_pais.filter(pai=base) + if pp.exists(): + if excluir_autos: + if pp[0].filho_de_insercao_automatica: + return False + return True + return False + + +class TipoDispositivoRelationship(BaseModel): + pai = models.ForeignKey(TipoDispositivo, related_name='filhos_permitidos') + filho_permitido = models.ForeignKey( + TipoDispositivo, + blank=True, null=True, default=None, + related_name='possiveis_pais') + filho_de_insercao_automatica = models.BooleanField( + default=False, + choices=YES_NO_CHOICES, verbose_name=_('Filho de Inserção Automática')) + + class Meta: + verbose_name = _('Relação Direta Permitida') + verbose_name_plural = _('Relaçõe Diretas Permitidas') + ordering = ['pai', 'filho_permitido'] + unique_together = ( + ('pai', 'filho_permitido',),) + + def __str__(self): + return '%s - %s' % ( + self.pai.nome, + self.filho_permitido.nome if self.filho_permitido else '') + class TipoPublicacao(models.Model): sigla = models.CharField( @@ -445,65 +484,65 @@ class Dispositivo(BaseModel): 'rotulo': (self.rotulo if self.rotulo else self.tipo_dispositivo), 'norma': self.norma} - def rotulo_padrao(self, for_insertion=False, - d_base_for_insertion=None, - insert_next=False): + def rotulo_padrao(self, local_insert=0, for_insert_in=0): + """ + 0 = Sem inserção - com nomeclatura padrao + 1 = Inserção com transformação de parágrafo único para §1º """ + r = '' t = self.tipo_dispositivo - prefixo = t.rotulo_prefixo_texto.split(';') if len(prefixo) > 1: - if (for_insertion and - d_base_for_insertion is not None and - d_base_for_insertion.pk != self.pk and - d_base_for_insertion.tipo_dispositivo.pk <= t.pk) or \ - for_insertion and d_base_for_insertion is None: - - count_irmaos_mesmo_tipo = Dispositivo.objects.filter( + if for_insert_in: + irmaos_mesmo_tipo = Dispositivo.objects.filter( tipo_dispositivo=self.tipo_dispositivo, - dispositivo_pai=self).count() + dispositivo_pai=self) else: - count_irmaos_mesmo_tipo = Dispositivo.objects.filter( + irmaos_mesmo_tipo = Dispositivo.objects.filter( tipo_dispositivo=self.tipo_dispositivo, - dispositivo_pai=self.dispositivo_pai).count() - - if count_irmaos_mesmo_tipo > 1 or ( - self.dispositivo0 != 0 and not for_insertion): - r += prefixo[0] - r += self.get_nomenclatura_completa() - elif count_irmaos_mesmo_tipo == 1 and for_insertion: - numero = self.get_numero_completo() - - if not insert_next: - self.transform_in_next() - self.transform_in_next() - r += 'Transformar %s em %s%s e criar %s 1%s' % ( - prefixo[1].strip(), - prefixo[0], - self.get_nomenclatura_completa(), - prefixo[0], - 'º' if - self.tipo_dispositivo.rotulo_ordinal >= 0 else '',) + dispositivo_pai=self.dispositivo_pai) + + if not irmaos_mesmo_tipo.exists(): + r += prefixo[1] + else: + if self.dispositivo0 == 0: + if for_insert_in: + if irmaos_mesmo_tipo.count() == 0: + r += prefixo[0] + r += self.get_nomenclatura_completa() + elif irmaos_mesmo_tipo.count() == 1: + self.transform_in_next() + self.transform_in_next() + r += 'Transformar %s em %s%s e criar %s1%s' % ( + prefixo[1].strip(), + prefixo[0], + self.get_nomenclatura_completa(), + prefixo[0], + 'º' if + self.tipo_dispositivo.rotulo_ordinal >= 0 + else '',) + else: + self.dispositivo0 = 1 + r += prefixo[0] + r += self.get_nomenclatura_completa() + + else: + r += prefixo[1].strip() + r += self.get_nomenclatura_completa() else: - if numero[0] != 0: - self.transform_in_next() - r += 'Transformar %s em %s 1%s e criar %s%s' % ( + if local_insert == 1 and irmaos_mesmo_tipo.count() == 1: + r += 'Transformar %s em %s%s e criar %s 2%s' % ( prefixo[1].strip(), prefixo[0], - 'º' if - self.tipo_dispositivo.rotulo_ordinal >= 0 else '', + self.get_nomenclatura_completa(), prefixo[0], - self.get_nomenclatura_completa()) + 'º' if + self.tipo_dispositivo.rotulo_ordinal >= 0 else '',) else: - r += '%s%s' % ( - prefixo[1].strip(), - self.get_nomenclatura_completa()) - - self.set_numero_completo(numero) - else: - r += prefixo[1].strip() + self.get_nomenclatura_completa() + r += prefixo[0] + r += self.get_nomenclatura_completa() else: r += prefixo[0] r += self.get_nomenclatura_completa() @@ -655,18 +694,34 @@ class Dispositivo(BaseModel): return result - def criar_espaco_apos(self, espaco_a_criar): - - proximo_bloco = Dispositivo.objects.filter( - ordem__gt=self.ordem, - nivel__lte=self.nivel, - norma_id=self.norma_id)[:1] + def criar_espaco(self, espaco_a_criar, local): + """ + -1 = Imediatamente antes + 0 = Imediatamente Depois + 1 = Depois - antes do proximo bloco do mesmo tipo""" + + if local == 1: + proximo_bloco = Dispositivo.objects.filter( + ordem__gt=self.ordem, + nivel__lte=self.nivel, + norma_id=self.norma_id)[:1] + elif local == 0: + proximo_bloco = Dispositivo.objects.filter( + ordem__gt=self.ordem, + nivel__lte=self.nivel + 1, + norma_id=self.norma_id).exclude( + tipo_dispositivo__class_css='caput')[:1] + else: + proximo_bloco = Dispositivo.objects.filter( + ordem__gte=self.ordem, + norma_id=self.norma_id)[:1] - if proximo_bloco.count() != 0: + if proximo_bloco.exists(): ordem = proximo_bloco[0].ordem proximo_bloco = Dispositivo.objects.order_by('-ordem').filter( ordem__gte=ordem, norma_id=self.norma_id) + proximo_bloco.update(ordem=F('ordem') + 1) proximo_bloco.update( ordem=F('ordem') + ( @@ -712,7 +767,8 @@ class Dispositivo(BaseModel): return self.get_parents(ordem='asc') def recalcular_ordem(self): - try: + pass + """try: dispositivos = Dispositivo.objects.order_by('-ordem').filter( norma_id=self.norma_id) except: @@ -721,7 +777,131 @@ class Dispositivo(BaseModel): for d in dispositivos: d.ordem = ordem d.save() - ordem -= 1000 + ordem -= 1000""" + + def incrementar_irmaos(self, variacao=0, tipo=[]): + + if not self.tipo_dispositivo.contagem_continua: + irmaos = list(Dispositivo.objects.filter( + Q(ordem__gt=self.ordem) | Q(dispositivo0=0), + dispositivo_pai_id=self.dispositivo_pai_id, + tipo_dispositivo_id=self.tipo_dispositivo.pk)) + + elif self.tipo_dispositivo.class_css == 'articulacao': + irmaos = list(Dispositivo.objects.filter( + ordem__gt=self.ordem, + norma_id=self.norma_id, + tipo_dispositivo_id=self.tipo_dispositivo.pk)) + + else: # contagem continua restrita a articulacao + proxima_articulacao = self.get_proxima_articulacao() + + if proxima_articulacao is None: + irmaos = list(Dispositivo.objects.filter( + ordem__gt=self.ordem, + norma_id=self.norma_id, + tipo_dispositivo_id=self.tipo_dispositivo.pk)) + else: + irmaos = list(Dispositivo.objects.filter( + Q(ordem__gt=self.ordem) & + Q(ordem__lt=proxima_articulacao.ordem), + norma_id=self.norma_id, + tipo_dispositivo_id=self.tipo_dispositivo.pk)) + + dp_profundidade = self.get_profundidade() + + irmaos_a_salvar = [] + ultimo_irmao = None + for irmao in irmaos: + + if irmao.ordem <= self.ordem or irmao.dispositivo0 == 0: + irmaos_a_salvar.append(irmao) + continue + + irmao_profundidade = irmao.get_profundidade() + if irmao_profundidade < dp_profundidade: + break + + if irmao.get_numero_completo() < self.get_numero_completo(): + if irmao_profundidade > dp_profundidade: + if ultimo_irmao is None: + irmao.transform_in_next( + dp_profundidade - irmao_profundidade) + irmao.transform_in_next( + irmao_profundidade - dp_profundidade) + else: + irmao.set_numero_completo( + ultimo_irmao.get_numero_completo()) + + irmao.transform_in_next( + irmao_profundidade - + ultimo_irmao.get_profundidade()) + + ultimo_irmao = irmao + else: + irmao.transform_in_next() + irmao.rotulo = irmao.rotulo_padrao() + irmaos_a_salvar.append(irmao) + else: + if dp_profundidade == irmao_profundidade and \ + dp_profundidade > 0 and \ + self.get_numero_completo()[:dp_profundidade] < \ + irmao.get_numero_completo()[:dp_profundidade]: + break + else: + irmao_numero = irmao.get_numero_completo() + irmao_numero[dp_profundidade] += 1 + irmao.set_numero_completo(irmao_numero) + irmao.rotulo = irmao.rotulo_padrao() + irmaos_a_salvar.append(irmao) + + irmaos_a_salvar.reverse() + for irmao in irmaos_a_salvar: + if (irmao.dispositivo0 == 0 or + irmao.ordem <= self.ordem) and variacao == 0: + + if 'add_in' in tipo: + irmao.dispositivo0 = 2 + irmao.rotulo = irmao.rotulo_padrao() + self.dispositivo0 = 1 + self.rotulo = self.rotulo_padrao() + else: + irmao.dispositivo0 = 1 + irmao.rotulo = irmao.rotulo_padrao() + self.dispositivo0 = 2 + self.rotulo = self.rotulo_padrao() + irmao.clean() + irmao.save() + + def get_proxima_articulacao(self): + proxima_articulacao = Dispositivo.objects.filter( + ordem__gt=self.ordem, + nivel=0, + norma_id=self.norma_id)[:1] + + if not proxima_articulacao.exists(): + return None + + return proxima_articulacao[0] + + def is_relative_auto_insert(self): + if self.dispositivo_pai is not None: + # pp possiveis_pais + pp = self.tipo_dispositivo.possiveis_pais.filter( + pai=self.dispositivo_pai.tipo_dispositivo) + + if pp.exists(): + if pp[0].filho_de_insercao_automatica: + return True + return False + + def get_raiz(self): + raiz = self.get_parents_asc() + if len(raiz) > 0: + raiz = raiz[0] + else: + raiz = self + return raiz @staticmethod def init_with_base(dispositivo_base, tipo_base): @@ -739,9 +919,45 @@ class Dispositivo(BaseModel): dp.inicio_vigencia = dispositivo_base.inicio_vigencia dp.publicacao = dispositivo_base.publicacao dp.timestamp = datetime.now() + dp.ordem = dispositivo_base.ordem return dp + @staticmethod + def set_numero_for_add_in(dispositivo_base, dispositivo, tipo_base): + + if tipo_base.contagem_continua: + raiz = dispositivo_base.get_raiz() + + disps = Dispositivo.objects.order_by('-ordem').filter( + tipo_dispositivo_id=tipo_base.pk, + ordem__lte=dispositivo_base.ordem, + ordem__gt=raiz.ordem, + norma_id=dispositivo_base.norma_id)[:1] + + if disps.exists(): + dispositivo.set_numero_completo( + disps[0].get_numero_completo()) + dispositivo.transform_in_next() + else: + dispositivo.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + else: + if ';' in tipo_base.rotulo_prefixo_texto: + + if dispositivo != dispositivo_base: + irmaos_mesmo_tipo = Dispositivo.objects.filter( + tipo_dispositivo=tipo_base, + dispositivo_pai=dispositivo_base) + + dispositivo.set_numero_completo([ + 1 if irmaos_mesmo_tipo.exists() else 0, + 0, 0, 0, 0, 0, ]) + else: + dispositivo.set_numero_completo([0, 0, 0, 0, 0, 0, ]) + + else: + dispositivo.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + class Vide(models.Model): data_criacao = models.DateTimeField(verbose_name=_('Data de Criação')) diff --git a/compilacao/views.py b/compilacao/views.py index 79ae8a048..d805c1060 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -2,10 +2,8 @@ from collections import OrderedDict from datetime import datetime, timedelta from os.path import sys -from django import forms from django.core.signing import Signer from django.db.models import Q -from django.db.models.aggregates import Max from django.http.response import JsonResponse from django.utils.dateparse import parse_date from django.utils.translation import ugettext_lazy as _ @@ -313,13 +311,8 @@ class CompilacaoEditView(CompilacaoView): return result -class DispositivoSimpleEditForm(forms.Form): - texto = forms.CharField(required=False, widget=forms.Textarea) - - class DispositivoEditView(CompilacaoEditView, FormMixin): template_name = 'compilacao/edit_bloco.html' - form_class = DispositivoSimpleEditForm def post(self, request, *args, **kwargs): @@ -327,10 +320,37 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): pk=self.kwargs['dispositivo_id']) texto = request.POST['texto'] + + if d.texto != '': + d.texto = texto + d.save() + return self.get(request, *args, **kwargs) d.texto = texto d.save() - return self.get(request, *args, **kwargs) + if texto != '': + dnext = Dispositivo.objects.filter( + norma_id=d.norma_id, + ordem__gt=d.ordem, + texto='', + tipo_dispositivo__dispositivo_de_articulacao=False)[:1] + + if not dnext.exists(): + return self.get(request, *args, **kwargs) + + if dnext[0].nivel > d.nivel: + pais = [d.pk, ] + else: + if dnext[0].dispositivo_pai_id == d.dispositivo_pai_id: + pais = [dnext[0].dispositivo_pai_id, ] + else: + pais = [ + dnext[0].dispositivo_pai_id, d.dispositivo_pai_id, ] + data = {'pk': dnext[0].pk, 'pai': pais} + else: + data = {'pk': d.pk, 'pai': [d.pk, ]} + + return JsonResponse(data, safe=False) def get_queryset(self): self.flag_alteradora = -1 @@ -379,183 +399,159 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): def select_provaveis_inserts(self): - # Não salvar d_base - if self.pk_add == 0: - d_base = Dispositivo.objects.get(pk=self.pk_view) - else: - d_base = Dispositivo.objects.get(pk=self.pk_add) - - result = [{'tipo_insert': 'Inserir Depois', - 'icone': '↷ ', - 'action': 'add_next', - 'itens': []}, - {'tipo_insert': 'Inserir Dentro', - 'icone': '⇲ ', - 'action': 'add_in', - 'itens': []}, - {'tipo_insert': 'Inserir Antes', - 'icone': '↶ ', - 'action': 'add_prior', - 'itens': []} - ] - - disps = Dispositivo.objects.order_by( - '-ordem').filter( - ordem__lte=d_base.ordem, - norma_id=d_base.norma_id) - - nivel = sys.maxsize - for d in disps: - - if d.nivel >= nivel: - continue - - if d.tipo_dispositivo.class_css == 'caput': - continue + try: + # Não salvar d_base + if self.pk_add == 0: + base = Dispositivo.objects.get(pk=self.pk_view) + else: + base = Dispositivo.objects.get(pk=self.pk_add) + + result = [{'tipo_insert': 'Inserir Depois', + 'icone': '↷ ', + 'action': 'add_next', + 'itens': []}, + {'tipo_insert': 'Inserir Dentro', + 'icone': '⇲ ', + 'action': 'add_in', + 'itens': []}, + {'tipo_insert': 'Inserir Antes', + 'icone': '↶ ', + 'action': 'add_prior', + 'itens': []} + ] + + # Possíveis inserções sequenciais já existentes + dps = base.get_parents() + dps.insert(0, base) + nivel = sys.maxsize + for dp in dps: - nivel = d.nivel - - r = [] - - if d == d_base: - result[2]['itens'].append({ - 'class_css': d.tipo_dispositivo.class_css, - 'tipo_pk': d.pk, - 'variacao': 0, - 'provavel': '%s (%s)' % ( - d.rotulo_padrao(True, d, False), - d.tipo_dispositivo.nome,), - 'dispositivo_base': d_base.pk}) - - flag_direcao = 1 - flag_variacao = 0 - while True: - # rt resultado da transformacao - rt = d.transform_in_next(flag_direcao) - if not rt[0]: - break - flag_variacao += rt[1] - r.append({'class_css': d.tipo_dispositivo.class_css, - 'tipo_pk': d.tipo_dispositivo.pk, - 'variacao': flag_variacao, - 'provavel': '%s (%s)' % ( - d.rotulo_padrao( - True, d_base, True), - d.tipo_dispositivo.nome,), - 'dispositivo_base': d_base.pk}) + if dp.nivel >= nivel: + continue - flag_direcao = -1 + if dp.is_relative_auto_insert(): + continue - r.reverse() + nivel = dp.nivel + + # um do mesmo para inserção antes + if dp == base: + result[2]['itens'].append({ + 'class_css': dp.tipo_dispositivo.class_css, + 'tipo_pk': dp.tipo_dispositivo.pk, + 'variacao': 0, + 'provavel': '%s (%s)' % ( + dp.rotulo_padrao(), + dp.tipo_dispositivo.nome,), + 'dispositivo_base': base.pk}) + + r = [] + flag_direcao = 1 + flag_variacao = 0 + while True: + if dp.dispositivo0 == 0: + local_insert = 1 + else: + local_insert = 0 - if len(r) > 0 and d.tipo_dispositivo.class_css == 'articulacao': - r = [r[0], ] + rt = dp.transform_in_next(flag_direcao) + if not rt[0]: + break + flag_variacao += rt[1] + r.append({'class_css': dp.tipo_dispositivo.class_css, + 'tipo_pk': dp.tipo_dispositivo.pk, + 'variacao': flag_variacao, + 'provavel': '%s (%s)' % ( + dp.rotulo_padrao(local_insert), + dp.tipo_dispositivo.nome,), + 'dispositivo_base': base.pk}) + + flag_direcao = -1 + r.reverse() + + if len(r) > 0 and dp.tipo_dispositivo.class_css in [ + 'articulacao', 'ementa']: + r = [r[0], ] + + if dp.tipo_dispositivo == base.tipo_dispositivo: + result[0]['itens'] += r + else: + result[0]['itens'] += r + result[2]['itens'] += r - if d.tipo_dispositivo == d_base.tipo_dispositivo: - result[0]['itens'] += r - else: - result[0]['itens'] += r - result[2]['itens'] += r + if nivel == 0: + break - if nivel == 0: - break + # tipo do dispositivo base + tipb = base.tipo_dispositivo + raiz = base.get_raiz() - # tipo do dispositivo base - tipb = d_base.tipo_dispositivo + for paradentro in [1, 0]: + if paradentro: + # Outros Tipos de Dispositivos PARA DENTRO + otds = TipoDispositivo.objects.order_by( + '-contagem_continua', 'id').all() + else: + # Outros Tipos de Dispositivos PARA FORA + classes_ja_inseridas = [] + for c in result[0]['itens']: + if c['class_css'] not in classes_ja_inseridas: + classes_ja_inseridas.append(c['class_css']) + otds = TipoDispositivo.objects.order_by( + '-contagem_continua', 'id').all().exclude( + class_css__in=classes_ja_inseridas) + + for td in otds: + + if paradentro and not td.permitido_inserir_in( + tipb, excluir_autos=True): + continue - for mudarnivel in [1, 0]: - if mudarnivel: - # Outros Tipos de Dispositivos PARA DENTRO - otds = TipoDispositivo.objects.order_by( - '-contagem_continua', 'id').filter( - Q(id__gt=100) & Q(id__gt=d_base.tipo_dispositivo_id)) - else: - # Outros Tipos de Dispositivos PARA FORA - classes_ja_inseridas = [] - for c in result[0]['itens']: - if c['class_css'] not in classes_ja_inseridas: - classes_ja_inseridas.append(c['class_css']) - otds = TipoDispositivo.objects.order_by( - '-contagem_continua', 'id').filter( - id__gt=100, - id__lt=d_base.tipo_dispositivo_id).exclude( - class_css__in=classes_ja_inseridas) - - for td in otds: - - if td.class_css == 'caput': - continue + base.tipo_dispositivo = td - d_base.tipo_dispositivo = td + if not paradentro: + if not td.permitido_inserir_in( + raiz.tipo_dispositivo, excluir_autos=True): + continue - if td.contagem_continua: - disps = Dispositivo.objects.filter( - tipo_dispositivo_id=td.pk, - ordem__lte=d_base.ordem, - norma_id=d_base.norma_id).aggregate( - Max('dispositivo0'), - Max('dispositivo1'), - Max('dispositivo2'), - Max('dispositivo3'), - Max('dispositivo4'), - Max('dispositivo5')) + Dispositivo.set_numero_for_add_in(base, base, td) - else: - disps = Dispositivo.objects.filter( - tipo_dispositivo_id=td.pk, - dispositivo_pai_id=d_base.pk).aggregate( - Max('dispositivo0'), - Max('dispositivo1'), - Max('dispositivo2'), - Max('dispositivo3'), - Max('dispositivo4'), - Max('dispositivo5')) - - if disps['dispositivo0__max'] is not None: - d_base.set_numero_completo([ - disps['dispositivo0__max'], - disps['dispositivo1__max'], - disps['dispositivo2__max'], - disps['dispositivo3__max'], - disps['dispositivo4__max'], - disps['dispositivo5__max'], - ]) - - d_base.transform_in_next() - else: - if ';' in td.rotulo_prefixo_texto: - d_base.set_numero_completo([0, 0, 0, 0, 0, 0, ]) - else: - d_base.set_numero_completo([1, 0, 0, 0, 0, 0, ]) - - r = [{'class_css': td.class_css, - 'tipo_pk': td.pk, - 'variacao': 0, - 'provavel': '%s (%s)' % ( - d_base.rotulo_padrao(True, None, True), - td.nome,), - 'dispositivo_base': d_base.pk}] - - if mudarnivel == 1: - if (tipb.class_css == 'caput' and - td.class_css == 'paragrafo'): - result[0]['itens'].insert(0, r[0]) + r = [{'class_css': td.class_css, + 'tipo_pk': td.pk, + 'variacao': 0, + 'provavel': '%s (%s)' % ( + base.rotulo_padrao(1, paradentro), + td.nome,), + 'dispositivo_base': base.pk}] + + if paradentro == 1: + if (tipb.class_css == 'caput' and + td.class_css == 'paragrafo'): + result[0]['itens'].insert(0, r[0]) + else: + result[1]['itens'] += r else: - result[1]['itens'] += r - else: - if td.pk < tipb.pk: - result[2]['itens'] += r - result[0]['itens'] += r + if td.pk < tipb.pk: + result[2]['itens'] += r + result[0]['itens'] += r - if tipb.class_css == 'caput': - result.pop() - # result.remove(result[0]) + if tipb.class_css == 'caput': + result.pop() - # retira inserir após e inserir antes - if tipb.class_css == 'articulacao': - r = result[0] - result.remove(result[0]) - result.insert(1, r) + # retira inserir após e inserir antes + if tipb.class_css == 'articulacao': + r = result[0] + result.remove(result[0]) + result.insert(1, r) + + # remover temporariamente a opção inserir antes + # confirmar falta de necessidade + + if len(result) > 2: + result.pop() + + except Exception as e: + print(e) return result @@ -577,13 +573,53 @@ class ActionsEditMixin(object): pass def add_in(self, context): - # pai = Dispositivo.objects.get(pk=context['dispositivo_id']) - # dp = Dispositivo.objects.get(pk=context['dispositivo_id']) - # Tipo Filho - # tf = TipoDispositivo.objects.get(pk=context['tipo_pk']) - print("aqui") - return {} + try: + # Tipo do dispositivo a ser inserido + tipo = TipoDispositivo.objects.get(pk=context['tipo_pk']) + + base = Dispositivo.objects.get(pk=context['dispositivo_id']) + + dp = Dispositivo.init_with_base(base, tipo) + + dp.nivel += 1 + dp.dispositivo_pai = base + Dispositivo.set_numero_for_add_in(base, dp, tipo) + dp.rotulo = dp.rotulo_padrao() + + if dp.tipo_dispositivo.class_css == 'artigo': + ordem = base.criar_espaco(espaco_a_criar=2, local=0) + else: + ordem = base.criar_espaco(espaco_a_criar=1, local=0) + + dp.ordem = ordem + + dp.incrementar_irmaos(tipo=['add_in']) + + dp.clean() + dp.save() + + # Inserção automática do caput para artigos + if dp.tipo_dispositivo.class_css == 'artigo': + tipocaput = TipoDispositivo.objects.filter( + class_css='caput') + dp.dispositivo_pai_id = dp.pk + dp.pk = None + dp.nivel += 1 + dp.tipo_dispositivo = tipocaput[0] + dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + dp.rotulo = dp.rotulo_padrao() + dp.texto = '' + + dp.ordem = ordem + Dispositivo.INTERVALO_ORDEM + dp.clean() + dp.save() + dp = Dispositivo.objects.get(pk=dp.dispositivo_pai_id) + except Exception as e: + print(e) + + data = self.get_json_for_refresh(dp) + return data def add_next(self, context): try: @@ -608,95 +644,15 @@ class ActionsEditMixin(object): dp.rotulo = dp.rotulo_padrao() if dp.tipo_dispositivo.class_css == 'artigo': - ordem = base.criar_espaco_apos(espaco_a_criar=2) + ordem = base.criar_espaco(espaco_a_criar=2, local=1) else: - ordem = base.criar_espaco_apos(espaco_a_criar=1) + ordem = base.criar_espaco(espaco_a_criar=1, local=1) dp.ordem = ordem # Incrementar irmãos - if not tipo.contagem_continua: - irmaos = list(Dispositivo.objects.filter( - Q(ordem__gt=dp.ordem) | Q(dispositivo0=0), - dispositivo_pai_id=dp.dispositivo_pai_id, - tipo_dispositivo_id=tipo.pk)) - - elif tipo.class_css == 'articulacao': - irmaos = list(Dispositivo.objects.filter( - ordem__gt=dp.ordem, - norma_id=dp.norma_id, - tipo_dispositivo_id=tipo.pk)) - - else: # contagem continua restrita a articulacao - proxima_articulacao = Dispositivo.objects.filter( - ordem__gt=dp.ordem, - nivel=0, - norma_id=dp.norma_id)[:1] - - if not proxima_articulacao.exists(): - irmaos = list(Dispositivo.objects.filter( - ordem__gt=dp.ordem, - norma_id=dp.norma_id, - tipo_dispositivo_id=tipo.pk)) - else: - irmaos = list(Dispositivo.objects.filter( - Q(ordem__gt=dp.ordem) & - Q(ordem__lt=proxima_articulacao[0].ordem), - norma_id=dp.norma_id, - tipo_dispositivo_id=tipo.pk)) - - dp_profundidade = dp.get_profundidade() - - irmaos_a_salvar = [] - ultimo_irmao = None - for irmao in irmaos: - - if irmao.ordem <= dp.ordem: - irmaos_a_salvar.append(irmao) - continue - - irmao_profundidade = irmao.get_profundidade() - if irmao_profundidade < dp_profundidade: - break - - if irmao.get_numero_completo() < dp.get_numero_completo(): - if irmao_profundidade > dp_profundidade: - if ultimo_irmao is None: - irmao.transform_in_next( - dp_profundidade - irmao_profundidade) - irmao.transform_in_next( - irmao_profundidade - dp_profundidade) - else: - irmao.set_numero_completo( - ultimo_irmao.get_numero_completo()) - - irmao.transform_in_next( - irmao_profundidade - - ultimo_irmao.get_profundidade()) - - ultimo_irmao = irmao - else: - irmao.transform_in_next() - irmao.rotulo = irmao.rotulo_padrao() - irmaos_a_salvar.append(irmao) - else: - irmao_numero = irmao.get_numero_completo() - irmao_numero[dp_profundidade] += 1 - irmao.set_numero_completo(irmao_numero) - irmao.rotulo = irmao.rotulo_padrao() - irmaos_a_salvar.append(irmao) - - irmaos_a_salvar.reverse() - for irmao in irmaos_a_salvar: - if irmao.dispositivo0 == 0 and \ - irmao.ordem <= dp.ordem and variacao == 0: - irmao.dispositivo0 = 1 - irmao.rotulo = irmao.rotulo_padrao() - dp.dispositivo0 = 2 - dp.rotulo = dp.rotulo_padrao() - irmao.clean() - irmao.save() + dp.incrementar_irmaos(variacao) dp.clean() dp.save() @@ -736,9 +692,9 @@ class ActionsEditMixin(object): if tipo.contagem_continua: ultimo_irmao = Dispositivo.objects.order_by( '-ordem').filter( - ordem__lte=dp.ordem, + ordem__lte=base.ordem, tipo_dispositivo_id=tipo.pk, - norma_id=dp.norma_id)[:1] + norma_id=base.norma_id)[:1] if not ultimo_irmao.exists(): dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) @@ -754,7 +710,7 @@ class ActionsEditMixin(object): dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) dp.rotulo = dp.rotulo_padrao() dp.texto = '' - dp.ordem = base.criar_espaco_apos(espaco_a_criar=1) + dp.ordem = base.criar_espaco(espaco_a_criar=1, local=1) # Incrementar irmãos irmaos = Dispositivo.objects.order_by('-ordem').filter( @@ -900,42 +856,44 @@ class ActionsEditMixin(object): except Exception as e: print(e) - # data = serializers.serialize('json', dp) - if tipo.contagem_continua: - # pais a atualizar + data = self.get_json_for_refresh(dp) - pais = [] + return data - if dp.dispositivo_pai is None: - data = {'pk': dp.pk, 'pai': [-1, ]} + def get_json_for_refresh(self, dispositivo): + + if dispositivo.tipo_dispositivo.contagem_continua: + pais = [] + if dispositivo.dispositivo_pai is None: + data = {'pk': dispositivo.pk, 'pai': [-1, ]} else: - pkfilho = dp.pk - dp = dp.dispositivo_pai + pkfilho = dispositivo.pk + dispositivo = dispositivo.dispositivo_pai - if proxima_articulacao is not None and \ - proxima_articulacao.exists(): + proxima_articulacao = dispositivo.get_proxima_articulacao() + + if proxima_articulacao is not None: parents = Dispositivo.objects.filter( - norma_id=dp.norma_id, - ordem__gte=dp.ordem, - ordem__lt=proxima_articulacao[0].ordem, - nivel__lte=dp.nivel) + norma_id=dispositivo.norma_id, + ordem__gte=dispositivo.ordem, + ordem__lt=proxima_articulacao.ordem, + nivel__lte=dispositivo.nivel) else: parents = Dispositivo.objects.filter( - norma_id=dp.norma_id, - ordem__gte=dp.ordem, - nivel__lte=dp.nivel) + norma_id=dispositivo.norma_id, + ordem__gte=dispositivo.ordem, + nivel__lte=dispositivo.nivel) nivel = sys.maxsize for p in parents: - if p.nivel > nivel: continue - pais.append(p.pk) nivel = p.nivel data = {'pk': pkfilho, 'pai': pais} else: - data = {'pk': dp.pk, 'pai': [dp.dispositivo_pai.pk, ]} + data = {'pk': dispositivo.pk, 'pai': [ + dispositivo.dispositivo_pai.pk, ]} return data diff --git a/static/js/compilacao.js b/static/js/compilacao.js index 09381ccc9..28f678986 100644 --- a/static/js/compilacao.js +++ b/static/js/compilacao.js @@ -1,210 +1,261 @@ -var flag_add_next = false; -var flag_add_next_pk = 0; -var flag_add_next_pai = 0; - var editortype = "textarea"; - +var gets = 0; var onSubmitEditForm = function(event) { - var texto = ''; - var editorTiny = tinymce.get('editdi_texto'); - - if (editorTiny != null) - texto = editorTiny.getContent(); - else - texto = $('#editdi_texto').val(); - - var formData = { - 'csrfmiddlewaretoken' : $('input[name=csrfmiddlewaretoken]').val(), - 'texto' : texto - }; - - var url = $('.csform form').attr( "action_ajax" ); - $("#message_block").css("display", "block"); - $.post(url,formData) - .done(function(data) { - $('.dpt-selected').html(data); - clearEditSelected(); - reloadFunctionClicks(); - }).always(function() { - $("#message_block").css("display", "none"); - }); - if (event != null) - event.preventDefault(); + var texto = ''; + var editorTiny = tinymce.get('editdi_texto'); + + if (editorTiny != null) + texto = editorTiny.getContent(); + else + texto = $('#editdi_texto').val(); + + var formData = { + 'csrfmiddlewaretoken' : $('input[name=csrfmiddlewaretoken]').val(), + 'texto' : texto + }; + + var url = $('.csform form').attr( "action_ajax" ); + $("#message_block").css("display", "block"); + + $.post(url, formData) + .done(function(data) { + + if (typeof data == "string") { + $('.dpt-selected').html(data); + clearEditSelected(); + reloadFunctionClicks(); + return; + } + + clearEditSelected(); + + if (data.pk != null) + refreshScreenFocusPk(data); + else { + alert('Erro na inserção!'); + flag_refresh_all = false; + } + + }).always(function() { + $("#message_block").css("display", "none"); + }); + if (event != null) + event.preventDefault(); } + var clickEditDispositivo = function(event) { - var _pk = event.currentTarget.getAttribute('pk'); - if ($('#dpt'+_pk).hasClass("dpt-selected")) { - clearEditSelected(); - return; - } - clearEditSelected(); - clickUpdateDispositivo(event); + var _pk = event.currentTarget.getAttribute('pk'); + if ($('#dpt'+_pk).hasClass("dpt-selected")) { + clearEditSelected(); + return; + } + clearEditSelected(); + clickUpdateDispositivo(event); } -var clickUpdateDispositivo = function(event, __pk, __action, addeditselected) { - - var _pk = __pk; - var _action = __action; - var _variacao = ''; - var _tipo_pk = ''; - - if (event != null) { - _pk = event.currentTarget.getAttribute('pk'); - _action = $(this).attr('action'); - _variacao = $(this).attr('variacao'); - _tipo_pk = $(this).attr('tipo_pk'); - } - - if (flag_add_next_pk == 0) - flag_add_next_pk = _pk - - var url = '' - if (_action == '') - return - else if ( _action == null) - url = _pk+'/refresh?pkadd='+flag_add_next_pk; - else if (_action.startsWith('refresh')) { - - var str = _action.split(':'); - if (str.length > 1) { - editortype = str[1]; - } - - url = _pk+'/refresh?pkadd='+flag_add_next_pk+url; - } - else { - url = _pk+'/actions?action='+_action; - url += '&tipo_pk='+_tipo_pk; - url += '&variacao='+_variacao; - if (addeditselected == null || addeditselected) { - $("#message_block").css("display", "block"); - } - } - - $.get(url).done(function( data ) { - - if ( _action == null || _action.startsWith('refresh')) { - - if (flag_add_next) { - - if (addeditselected) +var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action, flag_actions_vibible, flag_refresh_all) { + + var pk_refresh = __pk_refresh; + var pk_edit = __pk_edit; + var _action = __action; + var _variacao = ''; + var _tipo_pk = ''; + + if (event != null) { + pk_refresh = event.currentTarget.getAttribute('pk'); + _action = $(this).attr('action'); + _variacao = $(this).attr('variacao'); + _tipo_pk = $(this).attr('tipo_pk'); + } + + if (pk_edit == null) + pk_edit = pk_refresh; + + var url = ''; + if (_action == '') + return; + else if ( _action == null) { + url = pk_refresh+'/refresh?pkadd='+pk_edit; + } + else if (_action.startsWith('refresh')) { + + var str = _action.split(':'); + if (str.length > 1) { + editortype = str[1]; + SetCookie("editortype", editortype, 30) + + } + url = pk_refresh+'/refresh?pkadd='+pk_edit+url; + } + else { + + url = pk_refresh+'/actions?action='+_action; + url += '&tipo_pk='+_tipo_pk; + url += '&variacao='+_variacao; + + $("#message_block").css("display", "block"); + + } + + $.get(url).done(function( data ) { + if ( _action == null || _action.startsWith('refresh')) { + + + if (flag_refresh_all) { + if (flag_actions_vibible) clearEditSelected(); - $( '#dpt' + _pk ).html( data); - flag_add_next = false - } - else { - clearEditSelected(); - $( '#dpt' + _pk ).prepend( data ); - } - reloadFunctionClicks(); - - if ( editortype == 'tinymce' ) { - initTinymce(); - } - else if (editortype == 'textarea') { - $('.csform form').submit(onSubmitEditForm); - } - else if (editortype == 'construct') { - $('.csform .btn-salvar').parent().remove(); - $('.csform .btn-salvar, .csform textarea').remove(); - $('#dpt'+flag_add_next_pk).css('min-height', $('.actions_right').height()*2); - $('.actions_inserts').removeClass('menu_flutuante'); - } - $(".edt-"+editortype).addClass('selected'); - //$(".container").addClass('class_color_container'); - - if (addeditselected == null || addeditselected) { - $('html, body').animate({ - scrollTop: $('#dpt' + flag_add_next_pk ).offset().top - window.innerHeight / 10 - }, 300); - $('#dpt'+flag_add_next_pk).addClass('dpt-selected'); - flag_add_next_pk = 0; - } - } - - else if (_action == 'add_next') { - - clearEditSelected(); - - flag_add_next_pk = data.pk; - flag_add_next_pai = data.pai; - - if (flag_add_next_pk != null) - for (var pai = 0; pai < flag_add_next_pai.length; pai++) - if (flag_add_next_pai[pai] != -1) { - flag_add_next = true; - flag_add_next_pk = data.pk; - clickUpdateDispositivo(null, flag_add_next_pai[pai], 'refresh', pai == 0); - } - else { - href = location.href.split('#')[0] - location.href = href+'#'+flag_add_next_pk - location.reload(true) - } - else { - alert('Erro na inserção!'); - flag_add_next_pk = 0; - flag_add_next = false; - } - } - else { - clearEditSelected(); - reloadFunctionClicks(); - flag_add_next_pk = 0; - } - }).always(function() { - $("#message_block").css("display", "none"); - }); + $( '#dpt' + pk_refresh ).html( data); + } + else { + //console.log(pk_refresh + ' - '+pk_edit) + if (flag_actions_vibible == null || flag_actions_vibible) + clearEditSelected(); + + $( '#dpt' + pk_refresh ).prepend( data ); + } + + reloadFunctionClicks(); + + var _editortype = editortype; + if ( $('.edt-'+_editortype).length == 0) { + _editortype = 'construct'; + } + + if ( _editortype == 'tinymce' ) { + initTinymce(); + } + else if (_editortype == 'textarea') { + $('.csform form').submit(onSubmitEditForm); + } + else if (_editortype == 'construct') { + $('.csform .btn-salvar').parent().addClass("displaynone"); + $('.csform .btn-salvar, .csform .fields').addClass("displaynone"); + $('#dpt'+pk_refresh).css('min-height', $('.actions_right').height()*2); + $('.actions_inserts').removeClass('menu_flutuante'); + } + else if (_editortype == 'detail') { + $('.csform .btn-salvar').parent().removeClass("displaynone"); + $('.csform .btn-salvar, .csform .fields').removeClass("displaynone"); + $('#dpt'+pk_refresh).css('min-height', $('.actions_right').height()*2); + $('.actions_inserts').addClass('menu_flutuante'); + } + + $(".edt-"+_editortype).addClass('selected'); + //$(".container").addClass('class_color_container'); + + if (flag_actions_vibible == null || flag_actions_vibible) { + $('html, body').animate({ + scrollTop: $('#dpt' + pk_edit ).offset().top - window.innerHeight / 10 + }, 300); + $('#dpt'+pk_edit).addClass('dpt-selected'); + } + } + + else if (_action == 'add_next' || _action == 'add_in') { + clearEditSelected(); + if (data.pk != null) { + refreshScreenFocusPk(data); + } + else { + alert('Erro na inserção!'); + } + } + else { + clearEditSelected(); + reloadFunctionClicks(); + } + }).always(function() { + $("#message_block").css("display", "none"); + }); } +function refreshScreenFocusPk(data) { + + for (var pai = 0; pai < data.pai.length; pai++) + if (data.pai[pai] != -1) { + clickUpdateDispositivo(null, data.pai[pai], data.pk, 'refresh', pai == 0, true); + } + else { + href = location.href.split('#')[0] + location.href = href+'#'+data.pk + location.reload(true) + } +} function clearEditSelected() { - $(".container").removeClass('class_color_container'); - tinymce.remove(); - $('.dpt-selected').removeClass('dpt-selected'); - $('.dpt').css('min-height', ''); - $('.csform').remove(); + $(".container").removeClass('class_color_container'); + tinymce.remove(); + $('.dpt-selected').removeClass('dpt-selected'); + $('.dpt').css('min-height', ''); + $('.csform').remove(); } function reloadFunctionClicks() { - $('.dpt .de, .btn-action, .btn-inserts, .btn-edit').off(); - - $('.dpt .de, .btn-edit').on('click', clickEditDispositivo); + $('.dpt .de, .btn-action, .btn-inserts, .btn-edit').off(); - $('.btn-action, .btn-inserts').on( - 'click', clickUpdateDispositivo); + $('.dpt .de, .btn-edit').on('click', clickEditDispositivo); + $('.btn-action, .btn-inserts').on('click', clickUpdateDispositivo); - $('#editdi_texto').focus(); + $('#editdi_texto').focus(); } function initTinymce() { tinymce.init({ - mode : "textareas", - force_br_newlines : false, - force_p_newlines : false, - forced_root_block : '', - plugins: ["table save code"], - menubar: "edit format table tools", - toolbar: "save | undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent", - tools: "inserttable", - save_onsavecallback: onSubmitEditForm, - border_css: "/static/styles/compilacao_tinymce.css", - content_css: "/static/styles/compilacao_tinymce.css" - }); + mode : "textareas", + force_br_newlines : false, + force_p_newlines : false, + forced_root_block : '', + plugins: ["table save code"], + menubar: "edit format table tools", + toolbar: "save | undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent", + tools: "inserttable", + save_onsavecallback: onSubmitEditForm, + border_css: "/static/styles/compilacao_tinymce.css", + content_css: "/static/styles/compilacao_tinymce.css" + }); } +//cookies +function SetCookie(cookieName,cookieValue,nDays) { + var today = new Date(); + var expire = new Date(); + if (nDays==null || nDays==0) nDays=1; + expire.setTime(today.getTime() + 3600000*24*nDays); + document.cookie = cookieName+"="+escape(cookieValue) + + ";expires="+expire.toGMTString(); +} + +function ReadCookie(cookieName) { + var theCookie=" "+document.cookie; + var ind=theCookie.indexOf(" "+cookieName+"="); + if (ind==-1) ind=theCookie.indexOf(";"+cookieName+"="); + if (ind==-1 || cookieName=="") return ""; + var ind1=theCookie.indexOf(";",ind+1); + if (ind1==-1) ind1=theCookie.length; + return unescape(theCookie.substring(ind+cookieName.length+2,ind1)); +} $(document).ready(function() { + editortype = ReadCookie("editortype") + + if (editortype == null || editortype == "") { + editortype = "construct" + SetCookie("editortype", editortype, 30) + } + reloadFunctionClicks(); $("#message_block").css("display", "none"); - clickUpdateDispositivo(null, 60933, 'refresh', true); + href = location.href.split('#') + if (href.length == 2) { + clickUpdateDispositivo(null, href[1], href[1], 'refresh', true); + } }); diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index 70804c93d..c3949264d 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -8,6 +8,7 @@ $color_actions_border: #CCC; background-image: -o-linear-gradient(top, $top, $bottom); background-image: linear-gradient(to bottom, $top, $bottom); } + @mixin border-radius($radius) { -webkit-border-radius: $radius; -moz-border-radius: $radius; @@ -16,6 +17,7 @@ $color_actions_border: #CCC; } @mixin li_flutuante() { + & > ul { transform: translateY(30px); transition: transform 0.1s linear, @@ -279,14 +281,15 @@ $color_actions_border: #CCC; text-decoration: none; } - .semtexto { - font-weight: bold; - color: #8DA6D8; - } - .dpt { position: relative; display:block; + + .semtexto { + font-weight: bold; + color: #cedefe; + } + .artigo { float: none; } @@ -373,6 +376,10 @@ $color_actions_border: #CCC; padding: 0; } + .semtexto { + color: #fff; + } + .bloco { opacity: 0.5; &:hover { @@ -655,6 +662,7 @@ $color_actions_border: #CCC; &::-webkit-input-placeholder { color: #c70808; opacity: 0.6; + font-size: 80%; } &:-moz-placeholder { /* Firefox 18- */ color: #c70808; diff --git a/templates/compilacao/edit_bloco.html b/templates/compilacao/edit_bloco.html index d9d760732..28a345093 100644 --- a/templates/compilacao/edit_bloco.html +++ b/templates/compilacao/edit_bloco.html @@ -21,9 +21,9 @@ {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao %}
    • E
    • E+
    • -
    • E*
    • {%endif%} -
    • C
    • +
    • E*
    • +
    • C
    -
    • BL
    • BL
    • @@ -59,16 +58,18 @@ {%endif%}
    •  Excluir
    • - {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao %}
    •  Salvar
    • - {%endif%}
    - {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao %} - {% csrf_token %} - - {%endif%} +
    + {% csrf_token %} + + + {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao %} + + {%endif%} +
    Ordem: {{dpt.ordem}}, Nivel: {{dpt.nivel}}, Número: {{dpt.get_numero_completo}}
    From 254c55fe1fa1ed077d489529fecb9f9484f3acdc Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Sat, 7 Nov 2015 19:51:47 -0200 Subject: [PATCH 10/23] Refactor add_next in Dispositivo editor --- .../migrations/0014_auto_20151107_1836.py | 19 ++ compilacao/models.py | 28 ++- compilacao/urls.py | 2 +- compilacao/views.py | 169 +++++++++--------- norma/urls.py | 10 +- static/styles/compilacao.scss | 6 +- templates/ajuda/impressos.html | 7 +- templates/compilacao/index.html | 8 +- templates/compilacao/index_bloco.html | 2 +- 9 files changed, 132 insertions(+), 119 deletions(-) create mode 100644 compilacao/migrations/0014_auto_20151107_1836.py diff --git a/compilacao/migrations/0014_auto_20151107_1836.py b/compilacao/migrations/0014_auto_20151107_1836.py new file mode 100644 index 000000000..1e1cf3138 --- /dev/null +++ b/compilacao/migrations/0014_auto_20151107_1836.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0013_auto_20151106_1843'), + ] + + operations = [ + migrations.AddField( + model_name='tipodispositivo', + name='quantidade_permitida', + field=models.IntegerField(default=-1, verbose_name='Quantidade permitida dentro de uma Norma'), + ), + ] diff --git a/compilacao/models.py b/compilacao/models.py index 228d2f15d..223702435 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -77,12 +77,6 @@ class TipoVide(models.Model): class TipoDispositivo(BaseModel): """ - - ids fazem parte da lógica do desenvolvimento quanto a - simulação de hierarquia - - ids de 1 a 100 são reservados. - - São registros inseridos e usados no desenvolvimento - - - para class_css articulacao, omissis, ementa, bloco_alteracao, artigo, caput e paragrafo são palavras chaves usadas no código e de existência obrigatória. @@ -244,6 +238,10 @@ class TipoDispositivo(BaseModel): symmetrical=False, related_name='+') + quantidade_permitida = models.IntegerField( + default=-1, + verbose_name=_('Quantidade permitida dentro de uma Norma')) + class Meta: verbose_name = _('Tipo de Dispositivo') verbose_name_plural = _('Tipos de Dispositivo') @@ -779,7 +777,7 @@ class Dispositivo(BaseModel): d.save() ordem -= 1000""" - def incrementar_irmaos(self, variacao=0, tipo=[]): + def incrementar_irmaos(self, variacao=0, tipoadd=[]): if not self.tipo_dispositivo.contagem_continua: irmaos = list(Dispositivo.objects.filter( @@ -787,7 +785,7 @@ class Dispositivo(BaseModel): dispositivo_pai_id=self.dispositivo_pai_id, tipo_dispositivo_id=self.tipo_dispositivo.pk)) - elif self.tipo_dispositivo.class_css == 'articulacao': + elif self.dispositivo_pai is None: irmaos = list(Dispositivo.objects.filter( ordem__gt=self.ordem, norma_id=self.norma_id, @@ -860,7 +858,7 @@ class Dispositivo(BaseModel): if (irmao.dispositivo0 == 0 or irmao.ordem <= self.ordem) and variacao == 0: - if 'add_in' in tipo: + if 'add_in' in tipoadd: irmao.dispositivo0 = 2 irmao.rotulo = irmao.rotulo_padrao() self.dispositivo0 = 1 @@ -896,15 +894,13 @@ class Dispositivo(BaseModel): return False def get_raiz(self): - raiz = self.get_parents_asc() - if len(raiz) > 0: - raiz = raiz[0] - else: - raiz = self - return raiz + dp = self + while dp.dispositivo_pai is not None: + dp = dp.dispositivo_pai + return dp @staticmethod - def init_with_base(dispositivo_base, tipo_base): + def new_instance_based_on(dispositivo_base, tipo_base): dp = Dispositivo() dp.tipo_dispositivo = tipo_base diff --git a/compilacao/urls.py b/compilacao/urls.py index 39b7db482..b3c74e3d1 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -6,7 +6,7 @@ from compilacao.views import (tipo_dispositivo_crud, tipo_nota_crud, veiculo_publicacao_crud) urlpatterns_compilacao = [ - url(r'^(?P[0-9]+)/compilacao/$', + url(r'^(?P[0-9]+)/compilacao$', views.CompilacaoView.as_view(), name='compilacao'), url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/$', views.DispositivoView.as_view(), name='dispositivo'), diff --git a/compilacao/views.py b/compilacao/views.py index d805c1060..2b4f47556 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -97,6 +97,10 @@ tipo_dispositivo_crud = build_crud( ], + [_('Outras Configurações'), + [('quantidade_permitida', 12), + ], + ], ]) @@ -469,8 +473,8 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): flag_direcao = -1 r.reverse() - if len(r) > 0 and dp.tipo_dispositivo.class_css in [ - 'articulacao', 'ementa']: + if len(r) > 0 and dp.tipo_dispositivo.formato_variacao0 == \ + TipoDispositivo.FNCN: r = [r[0], ] if dp.tipo_dispositivo == base.tipo_dispositivo: @@ -525,21 +529,17 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): 'dispositivo_base': base.pk}] if paradentro == 1: - if (tipb.class_css == 'caput' and + """if (tipb.class_css == 'caput' and td.class_css == 'paragrafo'): result[0]['itens'].insert(0, r[0]) - else: - result[1]['itens'] += r + else:""" + result[1]['itens'] += r else: if td.pk < tipb.pk: result[2]['itens'] += r result[0]['itens'] += r - if tipb.class_css == 'caput': - result.pop() - - # retira inserir após e inserir antes - if tipb.class_css == 'articulacao': + if len(result[0]['itens']) < len(result[1]['itens']): r = result[0] result.remove(result[0]) result.insert(1, r) @@ -580,7 +580,7 @@ class ActionsEditMixin(object): base = Dispositivo.objects.get(pk=context['dispositivo_id']) - dp = Dispositivo.init_with_base(base, tipo) + dp = Dispositivo.new_instance_based_on(base, tipo) dp.nivel += 1 dp.dispositivo_pai = base @@ -594,7 +594,7 @@ class ActionsEditMixin(object): dp.ordem = ordem - dp.incrementar_irmaos(tipo=['add_in']) + dp.incrementar_irmaos(tipoadd=['add_in']) dp.clean() dp.save() @@ -624,70 +624,48 @@ class ActionsEditMixin(object): def add_next(self, context): try: base = Dispositivo.objects.get(pk=context['dispositivo_id']) - dp = Dispositivo.objects.get(pk=context['dispositivo_id']) - tipo = TipoDispositivo.objects.get(pk=context['tipo_pk']) variacao = int(context['variacao']) - - while dp.dispositivo_pai is not None and \ - dp.tipo_dispositivo_id != tipo.pk: - dp = dp.dispositivo_pai - - # Inserção interna a uma articulação de um tipo já existente - # ou de uma nova articulacao - if dp.dispositivo_pai is not None or \ - tipo.class_css == 'articulacao': - - dpbase = dp - dp = Dispositivo.init_with_base(dpbase, tipo) - dp.transform_in_next(variacao) - dp.rotulo = dp.rotulo_padrao() - - if dp.tipo_dispositivo.class_css == 'artigo': - ordem = base.criar_espaco(espaco_a_criar=2, local=1) + parents = [base, ] + base.get_parents() + + tipos_dp_auto_insert = tipo.filhos_permitidos.filter( + filho_de_insercao_automatica=True) + + count_auto_insert = 0 + for tipoauto in tipos_dp_auto_insert: + qtdp = tipoauto.filho_permitido.quantidade_permitida + if qtdp >= 0: + qtdp -= Dispositivo.objects.filter( + norma_id=base.norma_id, + tipo_dispositivo_id=tipoauto.filho_permitido.pk + ).count() + if qtdp > 0: + count_auto_insert += 1 else: - ordem = base.criar_espaco(espaco_a_criar=1, local=1) + count_auto_insert += 1 - dp.ordem = ordem + ordem = base.criar_espaco( + espaco_a_criar=1 + count_auto_insert, local=1) - # Incrementar irmãos - - dp.incrementar_irmaos(variacao) - - dp.clean() - dp.save() + dp_irmao = None + dp_pai = None + for dp in parents: + if dp.tipo_dispositivo == tipo: + dp_irmao = dp + break + if tipo.permitido_inserir_in(dp.tipo_dispositivo): + dp_pai = dp + break + dp_pai = dp - # Inserção automática do caput para artigos - if dp.tipo_dispositivo.class_css == 'artigo': - tipocaput = TipoDispositivo.objects.filter( - class_css='caput') - dp.dispositivo_pai_id = dp.pk - dp.pk = None - dp.nivel += 1 - dp.tipo_dispositivo = tipocaput[0] - dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) - dp.rotulo = dp.rotulo_padrao() - dp.texto = '' - - dp.ordem = ordem + Dispositivo.INTERVALO_ORDEM - dp.clean() - dp.save() - dp = Dispositivo.objects.get(pk=dp.dispositivo_pai_id) - - # Inserção de dispositivo sem precedente de mesmo tipo + if dp_irmao is not None: + dp = Dispositivo.new_instance_based_on(dp_irmao, tipo) + dp.transform_in_next(variacao) else: - dp = Dispositivo.objects.get(pk=context['dispositivo_id']) - - # Encontrar primeiro irmão que contem um pai compativel - while True: - if dp.dispositivo_pai is not None and \ - dp.dispositivo_pai.tipo_dispositivo_id > tipo.pk: - dp = dp.dispositivo_pai - else: - break - - dpaux = dp - dp = Dispositivo.init_with_base(dpaux, tipo) + # Inserção sem precedente + dp = Dispositivo.new_instance_based_on(dp_pai, tipo) + dp.dispositivo_pai = dp_pai + dp.nivel += 1 if tipo.contagem_continua: ultimo_irmao = Dispositivo.objects.order_by( @@ -708,28 +686,47 @@ class ActionsEditMixin(object): dp.set_numero_completo([0, 0, 0, 0, 0, 0, ]) else: dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + + dp.rotulo = dp.rotulo_padrao() + dp.ordem = ordem + dp.incrementar_irmaos(variacao) + + ''' inserção sem precedente é feita sem variação + portanto, não é necessário usar transform_next() para + incrementar, e sim, apenas somar no atributo dispositivo0 + dada a possibilidade de existir irmãos com viariação + + # Incrementar irmãos + irmaos = Dispositivo.objects.order_by('-ordem').filter( + dispositivo_pai_id=dp.dispositivo_pai_id, + ordem__gt=dp.ordem, + tipo_dispositivo_id=tipo.pk) + + for irmao in irmaos: + irmao.dispositivo0 += 1 + irmao.rotulo = irmao.rotulo_padrao() + irmao.clean() + irmao.save()''' + + dp.clean() + dp.save() + + # Inserção automática do caput para artigos + if count_auto_insert: + tipocaput = TipoDispositivo.objects.filter( + class_css='caput') + dp.dispositivo_pai_id = dp.pk + dp.pk = None + dp.nivel += 1 + dp.tipo_dispositivo = tipocaput[0] + dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) dp.rotulo = dp.rotulo_padrao() dp.texto = '' - dp.ordem = base.criar_espaco(espaco_a_criar=1, local=1) - - # Incrementar irmãos - irmaos = Dispositivo.objects.order_by('-ordem').filter( - dispositivo_pai_id=dp.dispositivo_pai_id, - ordem__gt=dp.ordem, - tipo_dispositivo_id=tipo.pk) - - ''' inserção sem precedente é feita sem variação - portanto, não é necessário usar transform_next() para - incrementar, e sim, apenas somar no atributo dispositivo0 - dada a possibilidade de existir irmãos com viariação''' - for irmao in irmaos: - irmao.dispositivo0 += 1 - irmao.rotulo = irmao.rotulo_padrao() - irmao.clean() - irmao.save() + dp.ordem = ordem + Dispositivo.INTERVALO_ORDEM dp.clean() dp.save() + dp = Dispositivo.objects.get(pk=dp.dispositivo_pai_id) ''' Reenquadrar todos os dispositivos que possuem pai antes da inserção atual e que são inferiores a dp, diff --git a/norma/urls.py b/norma/urls.py index b4fff7815..a27a6b879 100644 --- a/norma/urls.py +++ b/norma/urls.py @@ -1,14 +1,12 @@ -from django.conf.urls import url +from django.conf.urls import url, include -from norma.views import NormaIncluirView, norma_temporario_para_compilacao_crud - -norma_url_patterns = norma_temporario_para_compilacao_crud.urlpatterns +from norma.views import NormaIncluirView, tipo_norma_crud, assunto_norma_crud urlpatterns = [ # url(r'^norma/', include(norma_url_patterns, # norma_temporario_para_compilacao_crud.namespace, # norma_temporario_para_compilacao_crud.namespace)), - # url(r'^sistema/norma/tipo/', include(tipo_norma_crud.urls)), - # url(r'^sistema/norma/assunto/', include(assunto_norma_crud.urls)), + url(r'^sistema/norma/tipo/', include(tipo_norma_crud.urls)), + url(r'^sistema/norma/assunto/', include(assunto_norma_crud.urls)), url(r'^norma/incluir', NormaIncluirView.as_view(), name='norma-incluir'), ] diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index c3949264d..143265ba7 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -287,7 +287,7 @@ $color_actions_border: #CCC; .semtexto { font-weight: bold; - color: #cedefe; + color: #BFD1F6; } .artigo { @@ -377,9 +377,9 @@ $color_actions_border: #CCC; } .semtexto { - color: #fff; + color: #999; } - + .bloco { opacity: 0.5; &:hover { diff --git a/templates/ajuda/impressos.html b/templates/ajuda/impressos.html index db2756275..30884eb35 100644 --- a/templates/ajuda/impressos.html +++ b/templates/ajuda/impressos.html @@ -10,8 +10,11 @@

    Impressos


    Esta função tem por objetivo a seleção de informações sobre matérias legislativas para a geração de Etiquetas, Fichas ou Guias de Remessa a serem impressas.
    -

    Etiquetas - Selecionar as matérias por faixa de número de processo ou selecionada por Tipo de matéria e intervalo de datas de entrada. Se a opção escolhida for por faixa de número de processo, informar o intervalo desejado: números inicial e final. Se a opção for a "selecionada", significa que deverão ser indicados o Tipo de Matéria por meio de seleção no combo box e o período desejado, preenchendo as datas inicial e final.

    Em seguida, clicar em "gerar" para o sistema proceder à seleção das matérias. O resultado da consulta será a lista de matérias que atendem aos parâmetros informados. Ao lado de cada matéria é apresentado um checkbox, que deve ser assinalado se desejar gerar a etiqueta daquela matéria específica. Uma vez assinaladas as matérias, as quais se deseja gerar as etiquetas, clicar em "gerar" e o sistema irá apresentar as informações das matérias selecionadas já sob o formatado de etiquetas, uma para cada matéria selecionada, que conterá: tipo de matéria, número do processo, data de entrada, autor e o texto da ementa.

    Fichas - Os procedimentos necessários para a seleção de matérias e geração das respectivas fichas é análogo aos indicados para a Etiqueta, excetuando-se o formato da saída que será o de uma ficha. Guias de Remessa - Assinalar se a Guia de Remessa será para Indicação ou Requerimento informando, também, a data e o número da sessão correspondente e clicar em "enviar". +

    Etiquetas - Selecionar as matérias por faixa de número de processo ou selecionada por Tipo de matéria e intervalo de datas de entrada. Se a opção escolhida for por faixa de número de processo, informar o intervalo desejado: números inicial e final. Se a opção for a "selecionada", significa que deverão ser indicados o Tipo de Matéria por meio de seleção no combo box e o período desejado, preenchendo as datas inicial e final.

    +

    Em seguida, clicar em "gerar" para o sistema proceder à seleção das matérias. O resultado da consulta será a lista de matérias que atendem aos parâmetros informados. Ao lado de cada matéria é apresentado um checkbox, que deve ser assinalado se desejar gerar a etiqueta daquela matéria específica. Uma vez assinaladas as matérias, as quais se deseja gerar as etiquetas, clicar em "gerar" e o sistema irá apresentar as informações das matérias selecionadas já sob o formatado de etiquetas, uma para cada matéria selecionada, que conterá: tipo de matéria, número do processo, data de entrada, autor e o texto da ementa.

    +

    Fichas - Os procedimentos necessários para a seleção de matérias e geração das respectivas fichas é análogo aos indicados para a Etiqueta, excetuando-se o formato da saída que será o de uma ficha.

    +

    Guias de Remessa - Assinalar se a Guia de Remessa será para Indicação ou Requerimento informando, também, a data e o número da sessão correspondente e clicar em "enviar".


    -

    Após visualizar a lista contendo o resultado da seleção das matérias, colocar o formulário apropriado na impressora, de acordo com a opção escolhida, e acionar a função de impressão do navegador para imprimir efetivamente. +

    Após visualizar a lista contendo o resultado da seleção das matérias, colocar o formulário apropriado na impressora, de acordo com a opção escolhida, e acionar a função de impressão do navegador para imprimir efetivamente.

    {% endblock base_content %} diff --git a/templates/compilacao/index.html b/templates/compilacao/index.html index 66379e447..d0b436f15 100644 --- a/templates/compilacao/index.html +++ b/templates/compilacao/index.html @@ -35,13 +35,13 @@ $(window).load(function() { }); function textoMultiVigente(item) { - $(".compilacao .tipo-vigencias a").removeClass("selected") + $(".cp .tipo-vigencias a").removeClass("selected") $(item).addClass("selected") $(".desativado").removeClass("displaynone"); $(".link_alterador").removeClass("displaynone"); } function textoVigente(item, link) { - $(".compilacao .tipo-vigencias a").removeClass("selected") + $(".cp .tipo-vigencias a").removeClass("selected") $(item).addClass("selected") $(".desativado").addClass("displaynone"); $(".link_alterador").removeClass("displaynone"); @@ -51,11 +51,11 @@ function textoVigente(item, link) { $(document).ready(function() { $("#btn_font_menos").click(function() { - $(".dispositivo").css("font-size", "-=1"); + $(".dpt").css("font-size", "-=1"); }); $("#btn_font_mais").click(function() { - $(".dispositivo").css("font-size", "+=1"); + $(".dpt").css("font-size", "+=1"); }); diff --git a/templates/compilacao/index_bloco.html b/templates/compilacao/index_bloco.html index 7066cf042..def483898 100644 --- a/templates/compilacao/index_bloco.html +++ b/templates/compilacao/index_bloco.html @@ -10,7 +10,7 @@
    {% spaceless %} - {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{{ dpt.texto|safe }} + {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto%}{{ dpt.texto|safe }}{%else%} {%endif%} {% if dpt.norma_publicada_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} From ced41a513b136cc12dc8aed8bdf343ba531c17c3 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 9 Nov 2015 17:44:22 -0200 Subject: [PATCH 11/23] finish first simp. version of Dispositivo editor --- compilacao/models.py | 95 +++++---- compilacao/views.py | 198 +++++++++--------- static/js/compilacao.js | 5 +- static/styles/compilacao.scss | 73 ++++++- templates/compilacao/edit_bloco.html | 23 +- .../compilacao/edit_bloco_alteracao.html | 2 +- 6 files changed, 234 insertions(+), 162 deletions(-) diff --git a/compilacao/models.py b/compilacao/models.py index 223702435..3a41ae45e 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -527,17 +527,36 @@ class Dispositivo(BaseModel): r += self.get_nomenclatura_completa() else: - r += prefixo[1].strip() - r += self.get_nomenclatura_completa() + if local_insert: + r += prefixo[1].strip() + r += self.get_nomenclatura_completa() + else: + self.dispositivo0 = 1 + r += prefixo[0] + r += self.get_nomenclatura_completa() else: if local_insert == 1 and irmaos_mesmo_tipo.count() == 1: - r += 'Transformar %s em %s%s e criar %s 2%s' % ( - prefixo[1].strip(), - prefixo[0], - self.get_nomenclatura_completa(), - prefixo[0], - 'º' if - self.tipo_dispositivo.rotulo_ordinal >= 0 else '',) + + if Dispositivo.objects.filter( + ordem__gt=self.ordem, + ordem__lt=irmaos_mesmo_tipo[0].ordem).exists(): + self.dispositivo0 = 2 + r += 'Transformar %s em %s%s e criar %s1%s' % ( + prefixo[1].strip(), + prefixo[0], + self.get_nomenclatura_completa(), + prefixo[0], + 'º' if + self.tipo_dispositivo.rotulo_ordinal >= 0 + else '',) + else: + r += 'Transformar %s em %s%s e criar %s 2%s' % ( + prefixo[1].strip(), + prefixo[0], + self.get_nomenclatura_completa(), + prefixo[0], + 'º' if + self.tipo_dispositivo.rotulo_ordinal >= 0 else '',) else: r += prefixo[0] r += self.get_nomenclatura_completa() @@ -693,17 +712,13 @@ class Dispositivo(BaseModel): return result def criar_espaco(self, espaco_a_criar, local): - """ - -1 = Imediatamente antes - 0 = Imediatamente Depois - 1 = Depois - antes do proximo bloco do mesmo tipo""" - if local == 1: + if local == 'add_next': proximo_bloco = Dispositivo.objects.filter( ordem__gt=self.ordem, nivel__lte=self.nivel, norma_id=self.norma_id)[:1] - elif local == 0: + elif local == 'add_in': proximo_bloco = Dispositivo.objects.filter( ordem__gt=self.ordem, nivel__lte=self.nivel + 1, @@ -764,19 +779,6 @@ class Dispositivo(BaseModel): def get_parents_asc(self): return self.get_parents(ordem='asc') - def recalcular_ordem(self): - pass - """try: - dispositivos = Dispositivo.objects.order_by('-ordem').filter( - norma_id=self.norma_id) - except: - return - ordem = dispositivos.count() * 1000 - for d in dispositivos: - d.ordem = ordem - d.save() - ordem -= 1000""" - def incrementar_irmaos(self, variacao=0, tipoadd=[]): if not self.tipo_dispositivo.contagem_continua: @@ -840,13 +842,22 @@ class Dispositivo(BaseModel): irmao.transform_in_next() irmao.rotulo = irmao.rotulo_padrao() irmaos_a_salvar.append(irmao) + + elif irmao.get_numero_completo() == self.get_numero_completo(): + irmao_numero = irmao.get_numero_completo() + irmao_numero[dp_profundidade] += 1 + irmao.set_numero_completo(irmao_numero) + irmao.rotulo = irmao.rotulo_padrao() + irmaos_a_salvar.append(irmao) else: - if dp_profundidade == irmao_profundidade and \ + if dp_profundidade < irmao_profundidade and \ dp_profundidade > 0 and \ - self.get_numero_completo()[:dp_profundidade] < \ - irmao.get_numero_completo()[:dp_profundidade]: + self.get_numero_completo()[:dp_profundidade] >= \ + irmao.get_numero_completo()[:dp_profundidade] and\ + ultimo_irmao is None: break else: + ultimo_irmao = irmao irmao_numero = irmao.get_numero_completo() irmao_numero[dp_profundidade] += 1 irmao.set_numero_completo(irmao_numero) @@ -855,19 +866,19 @@ class Dispositivo(BaseModel): irmaos_a_salvar.reverse() for irmao in irmaos_a_salvar: - if (irmao.dispositivo0 == 0 or + if (irmao.dispositivo0 == 0 and irmao.ordem <= self.ordem) and variacao == 0: + irmao.dispositivo0 = 1 + irmao.rotulo = irmao.rotulo_padrao() + self.dispositivo0 = 2 + self.rotulo = self.rotulo_padrao() + elif (irmao.dispositivo0 == 0 and + irmao.ordem > self.ordem) and variacao == 0: + irmao.dispositivo0 = 2 + irmao.rotulo = irmao.rotulo_padrao() + self.dispositivo0 = 1 + self.rotulo = self.rotulo_padrao() - if 'add_in' in tipoadd: - irmao.dispositivo0 = 2 - irmao.rotulo = irmao.rotulo_padrao() - self.dispositivo0 = 1 - self.rotulo = self.rotulo_padrao() - else: - irmao.dispositivo0 = 1 - irmao.rotulo = irmao.rotulo_padrao() - self.dispositivo0 = 2 - self.rotulo = self.rotulo_padrao() irmao.clean() irmao.save() diff --git a/compilacao/views.py b/compilacao/views.py index 2b4f47556..f052dc23e 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -298,6 +298,7 @@ class CompilacaoEditView(CompilacaoView): e.inicio_eficacia = norma.data_publicacao e.timestamp = datetime.now() e.texto = norma.ementa + e.dispositivo_pai = a e.save() a.pk = None @@ -329,7 +330,7 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): d.texto = texto d.save() return self.get(request, *args, **kwargs) - d.texto = texto + d.texto = texto.strip() d.save() if texto != '': @@ -410,6 +411,16 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): else: base = Dispositivo.objects.get(pk=self.pk_add) + proximo_possivel = Dispositivo.objects.filter( + ordem__gt=base.ordem, + nivel__lte=base.nivel, + norma_id=base.norma_id)[:1] + + if proximo_possivel.exists(): + proximo_possivel = proximo_possivel[0] + else: + proximo_possivel = None + result = [{'tipo_insert': 'Inserir Depois', 'icone': '↷ ', 'action': 'add_next', @@ -425,10 +436,10 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): ] # Possíveis inserções sequenciais já existentes - dps = base.get_parents() - dps.insert(0, base) + parents = base.get_parents() + parents.insert(0, base) nivel = sys.maxsize - for dp in dps: + for dp in parents: if dp.nivel >= nivel: continue @@ -436,6 +447,15 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): if dp.is_relative_auto_insert(): continue + if proximo_possivel and \ + dp.tipo_dispositivo != base.tipo_dispositivo and\ + dp.nivel < proximo_possivel.nivel and\ + not proximo_possivel.tipo_dispositivo.permitido_inserir_in( + dp.tipo_dispositivo): + + if dp.tipo_dispositivo != proximo_possivel.tipo_dispositivo: + continue + nivel = dp.nivel # um do mesmo para inserção antes @@ -445,7 +465,7 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): 'tipo_pk': dp.tipo_dispositivo.pk, 'variacao': 0, 'provavel': '%s (%s)' % ( - dp.rotulo_padrao(), + dp.rotulo_padrao(local_insert=1), dp.tipo_dispositivo.nome,), 'dispositivo_base': base.pk}) @@ -501,6 +521,9 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): for c in result[0]['itens']: if c['class_css'] not in classes_ja_inseridas: classes_ja_inseridas.append(c['class_css']) + for c in result[1]['itens']: + if c['class_css'] not in classes_ja_inseridas: + classes_ja_inseridas.append(c['class_css']) otds = TipoDispositivo.objects.order_by( '-contagem_continua', 'id').all().exclude( class_css__in=classes_ja_inseridas) @@ -514,11 +537,41 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): base.tipo_dispositivo = td if not paradentro: - if not td.permitido_inserir_in( - raiz.tipo_dispositivo, excluir_autos=True): + + flag_insercao = False + for possivelpai in parents: + if td.permitido_inserir_in( + possivelpai.tipo_dispositivo, + excluir_autos=True): + flag_insercao = True + break + + if not flag_insercao: + continue + + if possivelpai.is_relative_auto_insert(): continue - Dispositivo.set_numero_for_add_in(base, base, td) + if proximo_possivel: + if proximo_possivel.nivel == base.nivel: + if proximo_possivel.tipo_dispositivo != td and\ + not proximo_possivel.tipo_dispositivo.\ + permitido_inserir_in(td): + continue + else: + if possivelpai.tipo_dispositivo != \ + proximo_possivel.tipo_dispositivo and\ + not proximo_possivel.tipo_dispositivo.\ + permitido_inserir_in( + possivelpai.tipo_dispositivo) and \ + possivelpai.nivel < \ + proximo_possivel.nivel: + continue + base.dispositivo_pai = possivelpai + Dispositivo.set_numero_for_add_in( + possivelpai, base, td) + else: + Dispositivo.set_numero_for_add_in(base, base, td) r = [{'class_css': td.class_css, 'tipo_pk': td.pk, @@ -535,18 +588,16 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): else:""" result[1]['itens'] += r else: - if td.pk < tipb.pk: - result[2]['itens'] += r - result[0]['itens'] += r + result[2]['itens'] += r + result[0]['itens'] += r - if len(result[0]['itens']) < len(result[1]['itens']): - r = result[0] - result.remove(result[0]) - result.insert(1, r) + # if len(result[0]['itens']) < len(result[1]['itens']): + # r = result[0] + # result.remove(result[0]) + # result.insert(1, r) # remover temporariamente a opção inserir antes # confirmar falta de necessidade - if len(result) > 2: result.pop() @@ -573,55 +624,9 @@ class ActionsEditMixin(object): pass def add_in(self, context): + return self.add_next(context, local_add='add_in') - try: - # Tipo do dispositivo a ser inserido - tipo = TipoDispositivo.objects.get(pk=context['tipo_pk']) - - base = Dispositivo.objects.get(pk=context['dispositivo_id']) - - dp = Dispositivo.new_instance_based_on(base, tipo) - - dp.nivel += 1 - dp.dispositivo_pai = base - Dispositivo.set_numero_for_add_in(base, dp, tipo) - dp.rotulo = dp.rotulo_padrao() - - if dp.tipo_dispositivo.class_css == 'artigo': - ordem = base.criar_espaco(espaco_a_criar=2, local=0) - else: - ordem = base.criar_espaco(espaco_a_criar=1, local=0) - - dp.ordem = ordem - - dp.incrementar_irmaos(tipoadd=['add_in']) - - dp.clean() - dp.save() - - # Inserção automática do caput para artigos - if dp.tipo_dispositivo.class_css == 'artigo': - tipocaput = TipoDispositivo.objects.filter( - class_css='caput') - dp.dispositivo_pai_id = dp.pk - dp.pk = None - dp.nivel += 1 - dp.tipo_dispositivo = tipocaput[0] - dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) - dp.rotulo = dp.rotulo_padrao() - dp.texto = '' - - dp.ordem = ordem + Dispositivo.INTERVALO_ORDEM - dp.clean() - dp.save() - dp = Dispositivo.objects.get(pk=dp.dispositivo_pai_id) - except Exception as e: - print(e) - - data = self.get_json_for_refresh(dp) - return data - - def add_next(self, context): + def add_next(self, context, local_add='add_next'): try: base = Dispositivo.objects.get(pk=context['dispositivo_id']) tipo = TipoDispositivo.objects.get(pk=context['tipo_pk']) @@ -645,7 +650,7 @@ class ActionsEditMixin(object): count_auto_insert += 1 ordem = base.criar_espaco( - espaco_a_criar=1 + count_auto_insert, local=1) + espaco_a_criar=1 + count_auto_insert, local=local_add) dp_irmao = None dp_pai = None @@ -689,44 +694,31 @@ class ActionsEditMixin(object): dp.rotulo = dp.rotulo_padrao() dp.ordem = ordem - dp.incrementar_irmaos(variacao) - - ''' inserção sem precedente é feita sem variação - portanto, não é necessário usar transform_next() para - incrementar, e sim, apenas somar no atributo dispositivo0 - dada a possibilidade de existir irmãos com viariação - - # Incrementar irmãos - irmaos = Dispositivo.objects.order_by('-ordem').filter( - dispositivo_pai_id=dp.dispositivo_pai_id, - ordem__gt=dp.ordem, - tipo_dispositivo_id=tipo.pk) - - for irmao in irmaos: - irmao.dispositivo0 += 1 - irmao.rotulo = irmao.rotulo_padrao() - irmao.clean() - irmao.save()''' + dp.incrementar_irmaos(variacao, [local_add, ]) dp.clean() dp.save() - # Inserção automática do caput para artigos + dp_auto_insert = None + # Inserção automática if count_auto_insert: - tipocaput = TipoDispositivo.objects.filter( - class_css='caput') - dp.dispositivo_pai_id = dp.pk - dp.pk = None + dp_pk = dp.pk dp.nivel += 1 - dp.tipo_dispositivo = tipocaput[0] - dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) - dp.rotulo = dp.rotulo_padrao() - dp.texto = '' - - dp.ordem = ordem + Dispositivo.INTERVALO_ORDEM - dp.clean() - dp.save() - dp = Dispositivo.objects.get(pk=dp.dispositivo_pai_id) + for tipoauto in tipos_dp_auto_insert: + dp.dispositivo_pai_id = dp_pk + dp.pk = None + dp.tipo_dispositivo = tipoauto.filho_permitido + if ';' in dp.tipo_dispositivo.rotulo_prefixo_texto: + dp.set_numero_completo([0, 0, 0, 0, 0, 0, ]) + else: + dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + dp.rotulo = dp.rotulo_padrao() + dp.texto = '' + dp.ordem = dp.ordem + Dispositivo.INTERVALO_ORDEM + dp.clean() + dp.save() + dp_auto_insert = dp + dp = Dispositivo.objects.get(pk=dp_pk) ''' Reenquadrar todos os dispositivos que possuem pai antes da inserção atual e que são inferiores a dp, @@ -743,14 +735,15 @@ class ActionsEditMixin(object): if filho.nivel > nivel: continue - if filho.tipo_dispositivo_id <= dp.tipo_dispositivo_id: - break - if filho.dispositivo_pai.ordem >= dp.ordem: continue nivel = filho.nivel + if not filho.tipo_dispositivo.permitido_inserir_in( + dp.tipo_dispositivo): + continue + filho.dispositivo_pai = dp filho.clean() filho.save() @@ -853,7 +846,10 @@ class ActionsEditMixin(object): except Exception as e: print(e) - data = self.get_json_for_refresh(dp) + if dp_auto_insert is None: + data = self.get_json_for_refresh(dp) + else: + data = self.get_json_for_refresh(dp_auto_insert) return data diff --git a/static/js/compilacao.js b/static/js/compilacao.js index 28f678986..f5ff95468 100644 --- a/static/js/compilacao.js +++ b/static/js/compilacao.js @@ -89,6 +89,7 @@ var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action, } url = pk_refresh+'/refresh?pkadd='+pk_edit+url; + $("#message_block").css("display", "block"); } else { @@ -119,7 +120,7 @@ var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action, } reloadFunctionClicks(); - + var _editortype = editortype; if ( $('.edt-'+_editortype).length == 0) { _editortype = 'construct'; @@ -246,7 +247,7 @@ $(document).ready(function() { editortype = ReadCookie("editortype") if (editortype == null || editortype == "") { - editortype = "construct" + editortype = "textarea" SetCookie("editortype", editortype, 30) } diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index 143265ba7..ddd0c06f6 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -13,6 +13,7 @@ $color_actions_border: #CCC; -webkit-border-radius: $radius; -moz-border-radius: $radius; -ms-border-radius: $radius; + -o-border-radius: $radius; border-radius: $radius; } @@ -274,7 +275,7 @@ $color_actions_border: #CCC; @extend .cp; - margin-bottom: 30em; + margin-bottom: 15em; margin-left: 0.8em; a { @@ -355,6 +356,21 @@ $color_actions_border: #CCC; display:block; } } + .bloco_alteracao { + @extend .articulacao; + margin: 0; + padding-top: 3em; + background: #ddd; + &::before { + content: "Bloco de Alteração"; + position:absolute; + left: 0; + right: 0; + top: 0; + + display: block; + } + } .btns-action { opacity: 0; } @@ -365,7 +381,7 @@ $color_actions_border: #CCC; border: 0px solid $color_actions_border; margin: 1em -2em 1em -2.8em; padding: 2.2em 2.2em 1.6em 2.2em; - box-shadow: -4px 18px 18px rgba(0, 0, 0, 0.19), 0px 6px 6px rgba(0, 0, 0, 0.23); + box-shadow: -4px 15px 15px rgba(0, 0, 0, 0.1), 0px 6px 6px rgba(0, 0, 0, 0.23); @include background-top-down(#eaeaee, #ddd); @@ -391,6 +407,12 @@ $color_actions_border: #CCC; } + .bloco_alteracao { + &::before { + display: none; + } + } + & > .bloco { padding: 1em 0; opacity: 1; @@ -440,7 +462,7 @@ $color_actions_border: #CCC; display: table-cell; vertical-align: top; &:hover { - background-color: rgba(0,0,0,0.1); + background-color: rgba(0,0,0,0.08); & > a { text-shadow: 0 0 5px #777; color: #ff0; @@ -477,6 +499,9 @@ $color_actions_border: #CCC; div { padding: 0 0.4em; font-stretch: condensed; + font-variant: small-caps; + font-weight: bold; + text-shadow: 0 0 10px #fff; } & > li { &:hover a{ @@ -558,7 +583,7 @@ $color_actions_border: #CCC; & > a { @include background-top-down(#3498DB, #2980C9); border-right: 1px solid #fff; - padding: 0.3em; + padding: 0.2em; display: block; color: white; text-align: center; @@ -591,6 +616,7 @@ $color_actions_border: #CCC; height: 100%; width: 2em; } + } /* btn-excluir */ &.btn-salvar { @@ -625,7 +651,7 @@ $color_actions_border: #CCC; color: white; background: #2980C9; font-size: 80%; - padding: 0.33em 1em; + padding: 0.23em 1em; &:hover { background: #0a5ea4; } @@ -637,6 +663,28 @@ $color_actions_border: #CCC; @include li_flutuante(); display: block; } + &.opc_excluir { + @include li_flutuante(); + display: block; + + + & > ul { + li { + a { + background-color: #A70808; + &:hover { + background: #c70808; + } + } + } + + &::before { + border-color: transparent transparent #A70808; + } + } + + } + } } /* actions_inserts */ @@ -695,9 +743,8 @@ $color_actions_border: #CCC; .clear { clear:both; } - -.mce-container { - border-color: #ccc !important; +.mce-panel { + border: 0px solid #ccc !important; } .mce-btn button:hover { background-color: rgba(0,0,0,0.1) !important; @@ -774,6 +821,16 @@ $color_actions_border: #CCC; left: auto; } } + &.opc_excluir > ul { + left: 30% !important; + right: 0 !important; + margin-left: 0; + margin-right: 0.5em; + &::before { + right: 35%; + left: auto; + } + } } } } diff --git a/templates/compilacao/edit_bloco.html b/templates/compilacao/edit_bloco.html index 28a345093..e0aa78341 100644 --- a/templates/compilacao/edit_bloco.html +++ b/templates/compilacao/edit_bloco.html @@ -57,8 +57,19 @@ {% endfor %} {%endif%} -
  •  Excluir
  • -
  •  Salvar
  • +
  •  Excluir + + + + + + +
  • +
  •  Salvar
  • @@ -93,13 +104,9 @@
    {% spaceless %} - - {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }} - {% if dpt.texto == '' and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}({{dpt.tipo_dispositivo}} sem texto){%else%}{{ dpt.texto|safe }}{%endif%} - - + {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{% if dpt.texto == '' and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}({{dpt.tipo_dispositivo}} sem texto){%else%}{{ dpt.texto|safe }}{%endif%} {% if dpt.norma_publicada_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} - + {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} {% nota_automatica dpt %} {{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }} diff --git a/templates/compilacao/edit_bloco_alteracao.html b/templates/compilacao/edit_bloco_alteracao.html index 3f7b71744..39b13058d 100644 --- a/templates/compilacao/edit_bloco_alteracao.html +++ b/templates/compilacao/edit_bloco_alteracao.html @@ -3,7 +3,7 @@ {% spaceless %}
    - {{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ ch.rotulo }}{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }} + {{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ ch.rotulo }}{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }}
    {% endspaceless %} From 01afa85debd08890fa2543cff449257517e9f352 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 9 Nov 2015 17:48:16 -0200 Subject: [PATCH 12/23] qa_check fix --- compilacao/models.py | 3 ++- compilacao/views.py | 31 +++++++++++++++---------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/compilacao/models.py b/compilacao/models.py index 3a41ae45e..529c40718 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -556,7 +556,8 @@ class Dispositivo(BaseModel): self.get_nomenclatura_completa(), prefixo[0], 'º' if - self.tipo_dispositivo.rotulo_ordinal >= 0 else '',) + self.tipo_dispositivo. + rotulo_ordinal >= 0 else '',) else: r += prefixo[0] r += self.get_nomenclatura_completa() diff --git a/compilacao/views.py b/compilacao/views.py index f052dc23e..3075bf275 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -411,15 +411,15 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): else: base = Dispositivo.objects.get(pk=self.pk_add) - proximo_possivel = Dispositivo.objects.filter( + prox_possivel = Dispositivo.objects.filter( ordem__gt=base.ordem, nivel__lte=base.nivel, norma_id=base.norma_id)[:1] - if proximo_possivel.exists(): - proximo_possivel = proximo_possivel[0] + if prox_possivel.exists(): + prox_possivel = prox_possivel[0] else: - proximo_possivel = None + prox_possivel = None result = [{'tipo_insert': 'Inserir Depois', 'icone': '↷ ', @@ -447,13 +447,13 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): if dp.is_relative_auto_insert(): continue - if proximo_possivel and \ + if prox_possivel and \ dp.tipo_dispositivo != base.tipo_dispositivo and\ - dp.nivel < proximo_possivel.nivel and\ - not proximo_possivel.tipo_dispositivo.permitido_inserir_in( + dp.nivel < prox_possivel.nivel and\ + not prox_possivel.tipo_dispositivo.permitido_inserir_in( dp.tipo_dispositivo): - if dp.tipo_dispositivo != proximo_possivel.tipo_dispositivo: + if dp.tipo_dispositivo != prox_possivel.tipo_dispositivo: continue nivel = dp.nivel @@ -508,7 +508,6 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): # tipo do dispositivo base tipb = base.tipo_dispositivo - raiz = base.get_raiz() for paradentro in [1, 0]: if paradentro: @@ -552,20 +551,20 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): if possivelpai.is_relative_auto_insert(): continue - if proximo_possivel: - if proximo_possivel.nivel == base.nivel: - if proximo_possivel.tipo_dispositivo != td and\ - not proximo_possivel.tipo_dispositivo.\ + if prox_possivel: + if prox_possivel.nivel == base.nivel: + if prox_possivel.tipo_dispositivo != td and\ + not prox_possivel.tipo_dispositivo.\ permitido_inserir_in(td): continue else: if possivelpai.tipo_dispositivo != \ - proximo_possivel.tipo_dispositivo and\ - not proximo_possivel.tipo_dispositivo.\ + prox_possivel.tipo_dispositivo and\ + not prox_possivel.tipo_dispositivo.\ permitido_inserir_in( possivelpai.tipo_dispositivo) and \ possivelpai.nivel < \ - proximo_possivel.nivel: + prox_possivel.nivel: continue base.dispositivo_pai = possivelpai Dispositivo.set_numero_for_add_in( From b5b9838913a45f3dd411b96e522e306b75331a1c Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Thu, 19 Nov 2015 17:22:58 -0200 Subject: [PATCH 13/23] Diversas funcionalidades MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - implementação dos botões excluir na edição de dispositivos - implementação de perfis estruturais de textos normativos - refatoração do algoritmo de seleção de provaveis inserções - refatoração do algoritimo de inserção - parte da implementação do parser básico para import de arquivos odf --- compilacao/file2dispositivo.py | 327 ++++++++++++++++++ .../migrations/0015_auto_20151115_2310.py | 24 ++ .../migrations/0016_auto_20151119_0950.py | 48 +++ .../migrations/0017_auto_20151119_1035.py | 28 ++ .../migrations/0018_auto_20151119_1052.py | 23 ++ .../migrations/0019_auto_20151119_1120.py | 20 ++ .../migrations/0020_auto_20151119_1126.py | 20 ++ .../migrations/0021_auto_20151119_1617.py | 23 ++ compilacao/models.py | 98 ++++-- compilacao/templatetags/compilacao_filters.py | 18 +- compilacao/urls.py | 8 +- compilacao/views.py | 274 ++++++++++++--- requirements/requirements.txt | 1 + static/js/compilacao.js | 39 ++- static/styles/compilacao.scss | 118 +++++-- templates/compilacao/edit.html | 31 ++ templates/compilacao/edit_bloco.html | 46 +-- templates/compilacao/index.html | 5 +- templates/sistema.html | 3 +- 19 files changed, 1002 insertions(+), 152 deletions(-) create mode 100644 compilacao/file2dispositivo.py create mode 100644 compilacao/migrations/0015_auto_20151115_2310.py create mode 100644 compilacao/migrations/0016_auto_20151119_0950.py create mode 100644 compilacao/migrations/0017_auto_20151119_1035.py create mode 100644 compilacao/migrations/0018_auto_20151119_1052.py create mode 100644 compilacao/migrations/0019_auto_20151119_1120.py create mode 100644 compilacao/migrations/0020_auto_20151119_1126.py create mode 100644 compilacao/migrations/0021_auto_20151119_1617.py diff --git a/compilacao/file2dispositivo.py b/compilacao/file2dispositivo.py new file mode 100644 index 000000000..e6bbb6ae8 --- /dev/null +++ b/compilacao/file2dispositivo.py @@ -0,0 +1,327 @@ +import re + +from odf.element import Node, Text +from odf.opendocument import load +from odf.table import Table, TableCell, TableRow +from odf.text import (List, ListHeader, ListItem, ListLevelStyleBullet, + ListLevelStyleNumber, ListStyle, Note) + +from sapl import utils + + +class Parser(object): + + parser_list = [] + + def parser(self, _filepath): + + self.filepath = _filepath + + return self.re_parser() + + def re_parser(self): + + self.parser_list = [] + + # odt identificado pela extensão ou teste caso o arquivo sem extensão + if self.filepath.endswith('.odt') or\ + not re.search(r"(\w+)\.(\w+)", self.filepath): + + try: + odtparser = OdtParser() + + self.parser_list = odtparser.parser(self.filepath) + + return self.parser_list + except Exception as e: + print(e) + # TODO: Continue para outros formatos + pass + + # doc identificado pela extensão ou teste caso o arquivo sem extensão + if self.filepath.endswith(('.doc', 'docx')) or\ + not re.search(r"(\w+)\.(\w+)", self.filepath): + + try: + # TODO + return [] + except Exception as e: + # TODO: Continue para outros formatos + pass + + return [] + + def _reduce_terms(self, _nodes=None, level=0): + print(level) + if not _nodes: + nodes = self.parser_list + else: + nodes = _nodes + + fstr = True + i = -1 + for nd in nodes: + i += 1 + # print(nd) + + if not _nodes: + fstr = False + if nd[0] == 'table:table': + continue + + if isinstance(nd, list): + fstr = False + nodes[i] = self._reduce_terms(nd, level=level + 1) + + if fstr: + return ' '.join(nodes) + return nodes + + +class OdtParser(Parser): + FNC1 = '1' + FNCI = 'I' + FNCi = 'i' + FNCA = 'A' + FNCa = 'a' + FNC8 = '*' + FNCN = 'N' + + def re_parser(self): + + self.textdoc = load(self.filepath) + self.level_list = 0 + self.control_list = {} + + # mm = ODF2MoinMoin(self.filepath) + # self.parser_list = [mm.toString(), ] + + self.parser_list = self._import_itens(self.textdoc.text, level=0) + + # self._reduce_terms() + + return self.parser_list + + def _import_itens(self, element, level=0): + try: + result = [] + for el in element.childNodes: + print(level, el.tagName) + _r = '' + if el.tagName == 'Text': + _r = str(el) + else: + if el.isInstanceOf(Note): + continue + elif el.isInstanceOf(Table): + _r = self._import_table(el, level=level + 1) + elif el.isInstanceOf(List): + _r = self._import_list(el, level=level + 1) + # elif el.isInstanceOf(P): + # _r = [self.extractText(el),] + elif el.hasChildNodes(): + _r = self._import_itens(el, level=level + 1) + else: + _r = str(el) + + if _r: + if isinstance(_r, str): + result += [_r, ] + else: + result += _r + + return result + except Exception as e: + print(e) + + def _import_table(self, element, level=0): + result = '' + print(level) + try: + if element.isInstanceOf(Table): + result += '' + + for el in element.childNodes: + _r = '' + if isinstance(el, Text): + _r = str(el) + else: + if el.isInstanceOf(TableRow): + _r = self._import_table(el, level=level + 1) + _r = '%s' % (''.join(_r)) + result += ''.join(_r) + elif el.isInstanceOf(TableCell): + _r = self._import_table(el, level=level + 1) + if el.getAttribute('numberrowsspanned'): + _r = '' % ( + el.getAttribute('numberrowsspanned'), + ''.join(_r)) + elif el.getAttribute('numbercolumnsspanned'): + _r = '' % ( + el.getAttribute('numbercolumnsspanned'), + ''.join(_r)) + else: + _r = '' % (''.join(_r)) + + result += ''.join(_r) + else: + _r = self.extractText(el) + # _r = self._reduce_terms(_r) + if isinstance(_r, list): + result += '
    '.join(_r) + else: + if _r: + result += _r + '
    ' + + if element.isInstanceOf(Table): + result += '
    %s%s%s
    ' + + return [result, ] + except Exception as e: + print(e) + + def _import_list(self, element, level=0): + self.level_list += 1 + result = [] + print(level) + + numsufixo = '' + numformat = '' + startvalue = '' + + count_list_item = 0 + + try: + if element.isInstanceOf(List): + _stylename = element.getAttribute('stylename') + + if _stylename: + self.stylename = _stylename + + liststyles = self.textdoc.getElementsByType(ListStyle) + + for liststyle in liststyles: + if liststyle.getAttribute('name') == self.stylename: + break + + stylesnumbers = liststyle.getElementsByType( + ListLevelStyleNumber) + + for item in stylesnumbers: + if item.getAttribute('level') == str(self.level_list): + numsufixo = item.getAttribute('numsuffix') or '' + numformat = item.getAttribute('numformat') or '' + startvalue = item.getAttribute('startvalue') or '' + break + + if not numformat: + stylesbullets = liststyle.getElementsByType( + ListLevelStyleBullet) + for item in stylesbullets: + if item.getAttribute('level') == str(self.level_list): + numformat = '*' + break + + _id = element.getAttribute('id') + if _id: + self.id_last_list = _id + + if self.id_last_list not in self.control_list: + self.control_list[self.id_last_list] = [0, ] * 10 + + if _id: + if not element.getAttribute('continuelist') and\ + self.level_list == 1: + self.control_list[self.id_last_list] = [0, ] * 10 + + except Exception as e: + print(e) + + try: + flag_first = True + for el in element.childNodes: + prefixo = '' + if isinstance(el, Text): + _r = [str(el), ] + else: + if el.isInstanceOf(ListHeader) or\ + el.isInstanceOf(ListItem): + + if startvalue and flag_first: + self.control_list[self.id_last_list][ + self.level_list - 1] = int(startvalue) - 1 + flag_first = False + + self.control_list[self.id_last_list][ + self.level_list - 1] += 1 + count_list_item = self.control_list[self.id_last_list][ + self.level_list - 1] + + if numformat == OdtParser.FNC1: + prefixo = str(count_list_item) + elif numformat == OdtParser.FNCI: + prefixo = utils.int_to_roman(count_list_item) + elif numformat == OdtParser.FNCi: + prefixo = utils.int_to_roman( + count_list_item).lower() + elif numformat == OdtParser.FNCA: + prefixo = utils.int_to_letter(count_list_item) + elif numformat == OdtParser.FNCa: + prefixo = utils.int_to_letter( + count_list_item).lower() + elif numformat == OdtParser.FNC8: + prefixo = '*' + else: + prefixo = str(count_list_item) + + prefixo += numsufixo + + _r = self._import_itens(el, level=level + 1) + + if _r: + if prefixo: + _r[0] = '%s %s' % (prefixo, _r[0]) + result += _r + else: + result += _r + + self.level_list -= 1 + return result + + except Exception as e: + print(e) + + def extractText(self, odfElement): + """ Extract text content from an Element, with whitespace represented + properly. Returns the text, with tabs, spaces, and newlines + correctly evaluated. This method recursively descends through the + children of the given element, accumulating text and "unwrapping" + , , and elements along the way. + """ + result = [] + + if len(odfElement.childNodes) != 0: + for child in odfElement.childNodes: + if child.nodeType == Node.TEXT_NODE: + result.append(child.data) + elif child.nodeType == Node.ELEMENT_NODE: + subElement = child + tagName = subElement.qname + if tagName == (u"urn:oasis:names:tc:opendocument:xmlns:" + + "text:1.0", u"line-break"): + result.append("\n") + elif tagName == (u"urn:oasis:names:tc:opendocument:" + + "xmlns:text:1.0", u"tab"): + result.append("\t") + elif tagName == (u"urn:oasis:names:tc:opendocument:" + + "xmlns:text:1.0", u"s"): + c = subElement.getAttribute('c') + if c: + spaceCount = int(c) + else: + spaceCount = 1 + + result.append(" " * spaceCount) + else: + result.append(self.extractText(subElement)) + return ''.join(result) diff --git a/compilacao/migrations/0015_auto_20151115_2310.py b/compilacao/migrations/0015_auto_20151115_2310.py new file mode 100644 index 000000000..e0ec8b9e6 --- /dev/null +++ b/compilacao/migrations/0015_auto_20151115_2310.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0014_auto_20151107_1836'), + ] + + operations = [ + migrations.AddField( + model_name='tipodispositivo', + name='dispositivo_de_alteracao', + field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Dispositivo de Alteração'), + ), + migrations.AlterField( + model_name='tipodispositivorelationship', + name='filho_permitido', + field=models.ForeignKey(related_name='possiveis_pais', to='compilacao.TipoDispositivo'), + ), + ] diff --git a/compilacao/migrations/0016_auto_20151119_0950.py b/compilacao/migrations/0016_auto_20151119_0950.py new file mode 100644 index 000000000..3f417e105 --- /dev/null +++ b/compilacao/migrations/0016_auto_20151119_0950.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models +import datetime +from django.utils.timezone import utc + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0015_auto_20151115_2310'), + ] + + operations = [ + migrations.CreateModel( + name='PerfilEstruturalTextosNormativos', + fields=[ + ('id', models.AutoField(auto_created=True, serialize=False, primary_key=True, verbose_name='ID')), + ('nome', models.CharField(max_length=50, verbose_name='Nome')), + ], + options={ + 'verbose_name_plural': 'Perfis Estruturais de Textos Normativos', + 'verbose_name': 'Perfil Estrutural de Textos Normativos', + }, + ), + migrations.RemoveField( + model_name='dispositivo', + name='timestamp', + ), + migrations.AddField( + model_name='dispositivo', + name='created', + field=models.DateTimeField(default=datetime.datetime(2015, 11, 19, 11, 49, 55, 455058, tzinfo=utc), auto_now_add=True, verbose_name='created'), + preserve_default=False, + ), + migrations.AddField( + model_name='dispositivo', + name='modified', + field=models.DateTimeField(auto_now=True, default=datetime.datetime(2015, 11, 19, 11, 50, 5, 86839, tzinfo=utc), verbose_name='modified'), + preserve_default=False, + ), + migrations.AddField( + model_name='tipodispositivorelationship', + name='perfil', + field=models.ForeignKey(blank=True, related_name='+', null=True, default=None, to='compilacao.PerfilEstruturalTextosNormativos'), + ), + ] diff --git a/compilacao/migrations/0017_auto_20151119_1035.py b/compilacao/migrations/0017_auto_20151119_1035.py new file mode 100644 index 000000000..8a902b838 --- /dev/null +++ b/compilacao/migrations/0017_auto_20151119_1035.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0016_auto_20151119_0950'), + ] + + operations = [ + migrations.AddField( + model_name='perfilestruturaltextosnormativos', + name='padrao', + field=models.BooleanField(verbose_name='Padrão', choices=[(True, 'Sim'), (False, 'Não')], default=False), + ), + migrations.AlterField( + model_name='tipodispositivorelationship', + name='perfil', + field=models.ForeignKey(to='compilacao.PerfilEstruturalTextosNormativos'), + ), + migrations.AlterUniqueTogether( + name='tipodispositivorelationship', + unique_together=set([('pai', 'filho_permitido', 'perfil')]), + ), + ] diff --git a/compilacao/migrations/0018_auto_20151119_1052.py b/compilacao/migrations/0018_auto_20151119_1052.py new file mode 100644 index 000000000..00e78daef --- /dev/null +++ b/compilacao/migrations/0018_auto_20151119_1052.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0017_auto_20151119_1035'), + ] + + operations = [ + migrations.RemoveField( + model_name='tipodispositivo', + name='quantidade_permitida', + ), + migrations.AddField( + model_name='tipodispositivorelationship', + name='quantidade_permitida', + field=models.IntegerField(default=-1, verbose_name='Quantidade permitida nesta relação'), + ), + ] diff --git a/compilacao/migrations/0019_auto_20151119_1120.py b/compilacao/migrations/0019_auto_20151119_1120.py new file mode 100644 index 000000000..f5a461faf --- /dev/null +++ b/compilacao/migrations/0019_auto_20151119_1120.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0018_auto_20151119_1052'), + ] + + operations = [ + migrations.AddField( + model_name='perfilestruturaltextosnormativos', + name='sigla', + field=models.CharField(max_length=10, verbose_name='Sigla', default='LC95'), + preserve_default=False, + ), + ] diff --git a/compilacao/migrations/0020_auto_20151119_1126.py b/compilacao/migrations/0020_auto_20151119_1126.py new file mode 100644 index 000000000..d63e4c8d2 --- /dev/null +++ b/compilacao/migrations/0020_auto_20151119_1126.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0019_auto_20151119_1120'), + ] + + operations = [ + migrations.AlterField( + model_name='perfilestruturaltextosnormativos', + name='sigla', + field=models.CharField( + max_length=10, verbose_name='Sigla', unique=True), + ), + ] diff --git a/compilacao/migrations/0021_auto_20151119_1617.py b/compilacao/migrations/0021_auto_20151119_1617.py new file mode 100644 index 000000000..e378f4a60 --- /dev/null +++ b/compilacao/migrations/0021_auto_20151119_1617.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0020_auto_20151119_1126'), + ] + + operations = [ + migrations.AlterModelOptions( + name='perfilestruturaltextosnormativos', + options={'verbose_name': 'Perfil Estrutural de Textos Normativos', 'verbose_name_plural': 'Perfis Estruturais de Textos Normativos', 'ordering': ['-padrao', 'sigla']}, + ), + migrations.AddField( + model_name='tipodispositivorelationship', + name='permitir_variacao', + field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], verbose_name='Permitir Variação Numérica', default=True), + ), + ] diff --git a/compilacao/models.py b/compilacao/models.py index 529c40718..b2d646eff 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -11,6 +11,17 @@ from sapl import utils from sapl.utils import YES_NO_CHOICES +class TimestampedMixin(models.Model): + created = models.DateTimeField( + verbose_name=_('created'), + editable=False, blank=True, auto_now_add=True) + modified = models.DateTimeField( + verbose_name=_('modified'), editable=False, blank=True, auto_now=True) + + class Meta: + abstract = True + + class BaseModel(models.Model): class Meta: @@ -77,12 +88,6 @@ class TipoVide(models.Model): class TipoDispositivo(BaseModel): """ - - para class_css articulacao, omissis, ementa, - bloco_alteracao, artigo, caput e paragrafo - são palavras chaves usadas no código e de existência obrigatória. - - - apenas articulacao recebe nivel zero - - no attributo rotulo_prefixo_texto, caso haja um ';' (ponto e vírgula), e só pode haver 1 ';', o método [def rotulo_padrao] considerará que o rótulo do dispositivo deverá ser escrito com o contéudo após o ';' @@ -200,6 +205,10 @@ class TipoDispositivo(BaseModel): choices=YES_NO_CHOICES, default=False, verbose_name=_('Dispositivo de Articulação (Sem Texto)')) + dispositivo_de_alteracao = models.BooleanField( + choices=YES_NO_CHOICES, + default=False, + verbose_name=_('Dispositivo de Alteração')) formato_variacao0 = models.CharField( max_length=1, choices=FORMATO_NUMERACAO_CHOICES, @@ -238,10 +247,6 @@ class TipoDispositivo(BaseModel): symmetrical=False, related_name='+') - quantidade_permitida = models.IntegerField( - default=-1, - verbose_name=_('Quantidade permitida dentro de uma Norma')) - class Meta: verbose_name = _('Tipo de Dispositivo') verbose_name_plural = _('Tipos de Dispositivo') @@ -250,32 +255,86 @@ class TipoDispositivo(BaseModel): def __str__(self): return self.nome - def permitido_inserir_in(self, base, excluir_autos=False): - pp = self.possiveis_pais.filter(pai=base) + def permitido_inserir_in( + self, base, include_relative_autos=True, perfil_pk=None): + + if not perfil_pk: + perfis = PerfilEstruturalTextosNormativos.objects.filter( + padrao=True)[:1] + + if not perfis.exists(): + return False + + perfil_pk = perfis[0].pk + + pp = self.possiveis_pais.filter(pai=base, perfil_id=perfil_pk) if pp.exists(): - if excluir_autos: + if not include_relative_autos: if pp[0].filho_de_insercao_automatica: return False return True return False + def permitido_variacao( + self, base, perfil_pk=None): + + if not perfil_pk: + perfis = PerfilEstruturalTextosNormativos.objects.filter( + padrao=True)[:1] + + if not perfis.exists(): + return False + + perfil_pk = perfis[0].pk + + pp = self.possiveis_pais.filter(pai=base, perfil_id=perfil_pk) + if pp.exists(): + if pp[0].permitir_variacao: + return True + return False + + +class PerfilEstruturalTextosNormativos(BaseModel): + sigla = models.CharField( + max_length=10, unique=True, verbose_name=_('Sigla')) + nome = models.CharField(max_length=50, verbose_name=_('Nome')) + padrao = models.BooleanField( + default=False, + choices=YES_NO_CHOICES, verbose_name=_('Padrão')) + + class Meta: + verbose_name = _('Perfil Estrutural de Textos Normativos') + verbose_name_plural = _('Perfis Estruturais de Textos Normativos') + + ordering = ['-padrao', 'sigla'] + + def __str__(self): + return self.nome + class TipoDispositivoRelationship(BaseModel): pai = models.ForeignKey(TipoDispositivo, related_name='filhos_permitidos') filho_permitido = models.ForeignKey( TipoDispositivo, - blank=True, null=True, default=None, related_name='possiveis_pais') + perfil = models.ForeignKey(PerfilEstruturalTextosNormativos) filho_de_insercao_automatica = models.BooleanField( default=False, choices=YES_NO_CHOICES, verbose_name=_('Filho de Inserção Automática')) + permitir_variacao = models.BooleanField( + default=True, + choices=YES_NO_CHOICES, verbose_name=_('Permitir Variação Numérica')) + + quantidade_permitida = models.IntegerField( + default=-1, + verbose_name=_('Quantidade permitida nesta relação')) class Meta: verbose_name = _('Relação Direta Permitida') verbose_name_plural = _('Relaçõe Diretas Permitidas') ordering = ['pai', 'filho_permitido'] unique_together = ( - ('pai', 'filho_permitido',),) + ('pai', 'filho_permitido', 'perfil'),) def __str__(self): return '%s - %s' % ( @@ -331,7 +390,7 @@ class Publicacao(models.Model): return '%s: %s' % (self.veiculo_publicacao, self.publicacao) -class Dispositivo(BaseModel): +class Dispositivo(BaseModel, TimestampedMixin): TEXTO_PADRAO_DISPOSITIVO_REVOGADO = _('(Revogado)') INTERVALO_ORDEM = 1000 ordem = models.PositiveIntegerField( @@ -411,8 +470,6 @@ class Dispositivo(BaseModel): choices=YES_NO_CHOICES, verbose_name=_('Visibilidade na Norma Publicada')) - timestamp = models.DateTimeField() - tipo_dispositivo = models.ForeignKey( TipoDispositivo, related_name='dispositivos_do_tipo_set', @@ -894,11 +951,12 @@ class Dispositivo(BaseModel): return proxima_articulacao[0] - def is_relative_auto_insert(self): + def is_relative_auto_insert(self, perfil_pk): if self.dispositivo_pai is not None: # pp possiveis_pais pp = self.tipo_dispositivo.possiveis_pais.filter( - pai=self.dispositivo_pai.tipo_dispositivo) + pai=self.dispositivo_pai.tipo_dispositivo, + perfil_id=perfil_pk) if pp.exists(): if pp[0].filho_de_insercao_automatica: diff --git a/compilacao/templatetags/compilacao_filters.py b/compilacao/templatetags/compilacao_filters.py index d1c1f75da..65b8abab1 100644 --- a/compilacao/templatetags/compilacao_filters.py +++ b/compilacao/templatetags/compilacao_filters.py @@ -46,6 +46,8 @@ def nota_automatica(dispositivo): d = dispositivo.dispositivo_atualizador.dispositivo_pai if dispositivo.texto == Dispositivo.TEXTO_PADRAO_DISPOSITIVO_REVOGADO: return 'Revogado pelo %s.' % d + elif not dispositivo.dispositivo_substituido: + return 'Inclusão feita pelo %s.' % d else: return 'Alteração feita pelo %s.' % d return '' @@ -69,6 +71,16 @@ def get_sign_vigencia(value): return signer.sign(str(string)) +@register.filter +def select_provaveis_inserts(view, request): + return view.select_provaveis_inserts(request) + + +@register.filter +def is_relative_auto_insert(dpt, request): + return dpt.is_relative_auto_insert(request.session.perfil_estrutural) + + @register.filter def isinst(value, class_str): classe = value.__class__.__name__ @@ -82,11 +94,11 @@ def render_actions_head(view, d_atual): return False # Menu - if view.pk_view == view.pk_add and d_atual.pk == view.pk_view: + if view.pk_view == view.pk_edit and d_atual.pk == view.pk_view: return True # conteudo e menu no filho - if view.pk_view != view.pk_add and d_atual.pk == view.pk_add: + if view.pk_view != view.pk_edit and d_atual.pk == view.pk_edit: return True return False @@ -95,7 +107,7 @@ def render_actions_head(view, d_atual): @register.filter def short_string(str, length): if len(str) > length: - return str[:length]+'...' + return str[:length] + '...' else: return str diff --git a/compilacao/urls.py b/compilacao/urls.py index b3c74e3d1..d59058411 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -1,9 +1,9 @@ from django.conf.urls import include, url from compilacao import views -from compilacao.views import (tipo_dispositivo_crud, tipo_nota_crud, - tipo_publicacao_crud, tipo_vide_crud, - veiculo_publicacao_crud) +from compilacao.views import (perfil_estr_txt_norm, tipo_dispositivo_crud, + tipo_nota_crud, tipo_publicacao_crud, + tipo_vide_crud, veiculo_publicacao_crud) urlpatterns_compilacao = [ url(r'^(?P[0-9]+)/compilacao$', @@ -37,4 +37,6 @@ urlpatterns = [ include(tipo_dispositivo_crud.urls)), url(r'^sistema/compilacao/veiculo-publicacao/', include(veiculo_publicacao_crud.urls)), + url(r'^sistema/compilacao/perfil-estrutural-textos-normativos/', + include(perfil_estr_txt_norm.urls)), ] diff --git a/compilacao/views.py b/compilacao/views.py index 3075bf275..b5972d3e7 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -2,17 +2,21 @@ from collections import OrderedDict from datetime import datetime, timedelta from os.path import sys +from django import forms from django.core.signing import Signer from django.db.models import Q from django.http.response import JsonResponse +from django.shortcuts import render from django.utils.dateparse import parse_date from django.utils.translation import ugettext_lazy as _ from django.views.generic.base import TemplateView from django.views.generic.edit import FormMixin from django.views.generic.list import ListView -from compilacao.models import (Dispositivo, TipoDispositivo, TipoNota, - TipoPublicacao, TipoVide, VeiculoPublicacao) +from compilacao.file2dispositivo import Parser +from compilacao.models import (Dispositivo, PerfilEstruturalTextosNormativos, + TipoDispositivo, TipoNota, TipoPublicacao, + TipoVide, VeiculoPublicacao) from norma.models import NormaJuridica from sapl.crud import build_crud @@ -49,6 +53,13 @@ tipo_publicacao_crud = build_crud( [('sigla', 2), ('nome', 10)]], ]) +perfil_estr_txt_norm = build_crud( + PerfilEstruturalTextosNormativos, 'perfil_estrutural', [ + + [_('Perfil Estrutural de Textos Normativos'), + [('sigla', 2), ('nome', 10)]], + ]) + veiculo_publicacao_crud = build_crud( VeiculoPublicacao, 'veiculo_publicacao', [ @@ -97,10 +108,6 @@ tipo_dispositivo_crud = build_crud( ], - [_('Outras Configurações'), - [('quantidade_permitida', 12), - ], - ], ]) @@ -246,7 +253,20 @@ class DispositivoView(CompilacaoView): return itens -class CompilacaoEditView(CompilacaoView): +class UpLoadImportFileForm(forms.Form): + import_file = forms.FileField( + required=True, + label=_('Arquivo formato ODF para Importanção')) + + +def handle_uploaded_file(f, outfilepath): + with open(outfilepath, 'wb+') as destination: + for chunk in f.chunks(): + destination.write(chunk) + + +class CompilacaoEditView(CompilacaoView, FormMixin): + template_name = 'compilacao/edit.html' flag_alteradora = -1 @@ -254,11 +274,60 @@ class CompilacaoEditView(CompilacaoView): flag_nivel_ini = 0 flag_nivel_old = -1 - pk_add = 0 + pk_edit = 0 pk_view = 0 + def post(self, request, *args, **kwargs): + form = UpLoadImportFileForm(request.POST, request.FILES) + message = "Arquivo Submetido com sucesso" + + self.object_list = self.get_queryset() + + if form.is_valid(): + try: + f = request.FILES['import_file'] + outfilepath = '/tmp/' + f.name + handle_uploaded_file(f, outfilepath) + + p = Parser() + p.parser(outfilepath) + + except Exception as e: + print(e) + + context = self.get_context_data( + object_list=self.object_list, + form=form, + message=message, + view=self, + parser_list=p.parser_list) + return render(request, self.template_name, context) + else: + context = self.get_context_data( + object_list=self.object_list, + form=form, + message=form.errors, + view=self) + return self.form_invalid(context) + + return self.render_to_response({'form': form}) + + def form_invalid(self, context): + return self.render_to_response(context) + + def get(self, request, *args, **kwargs): + + self.object_list = self.get_queryset() + form_class = UpLoadImportFileForm + self.form = self.get_form(form_class) + context = self.get_context_data( + object_list=self.object_list, + form=self.form) + + return self.render_to_response(context) + def get_queryset(self): - self.pk_add = 0 + self.pk_edit = 0 self.pk_view = 0 self.flag_alteradora = -1 @@ -315,8 +384,25 @@ class CompilacaoEditView(CompilacaoView): return result + def set_perfil_in_session(self, request=None, perfil_id=0): + if not request: + return None + + if perfil_id: + perfil = PerfilEstruturalTextosNormativos.objects.get( + pk=perfil_id) + request.session['perfil_estrutural'] = perfil.pk + else: + perfis = PerfilEstruturalTextosNormativos.objects.filter( + padrao=True)[:1] + + if not perfis.exists(): + request.session.pop('perfil_estrutural') + else: + request.session['perfil_estrutural'] = perfis[0].pk -class DispositivoEditView(CompilacaoEditView, FormMixin): + +class DispositivoEditView(CompilacaoEditView): template_name = 'compilacao/edit_bloco.html' def post(self, request, *args, **kwargs): @@ -357,19 +443,45 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): return JsonResponse(data, safe=False) + def get_queryset_perfil_estrutural(self): + perfis = PerfilEstruturalTextosNormativos.objects.all() + return perfis + + def get(self, request, *args, **kwargs): + + try: + if 'perfil_pk' in request.GET: + self.set_perfil_in_session( + request, request.GET['perfil_pk']) + elif 'perfil_estrutural' not in request.session: + self.set_perfil_in_session(request=request) + + self.object_list = self.get_queryset() + + self.perfil_estrutural_list = self.get_queryset_perfil_estrutural() + + context = self.get_context_data( + object_list=self.object_list, + perfil_estrutural_list=self.perfil_estrutural_list + ) + except Exception as e: + print(e) + + return self.render_to_response(context) + def get_queryset(self): self.flag_alteradora = -1 self.flag_nivel_ini = 0 self.flag_nivel_old = -1 try: - self.pk_add = int(self.request.GET['pkadd']) + self.pk_edit = int(self.request.GET['edit']) except: - self.pk_add = 0 + self.pk_edit = 0 self.pk_view = int(self.kwargs['dispositivo_id']) try: - if self.pk_add == self.pk_view: + if self.pk_edit == self.pk_view: bloco = Dispositivo.objects.get( pk=self.kwargs['dispositivo_id']) else: @@ -381,7 +493,7 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): self.flag_nivel_old = bloco.nivel - 1 self.flag_nivel_ini = bloco.nivel - if self.pk_add == self.pk_view: + if self.pk_edit == self.pk_view: return [bloco, ] proximo_bloco = Dispositivo.objects.filter( @@ -402,14 +514,20 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): ).select_related(*DISPOSITIVO_SELECT_RELATED) return itens - def select_provaveis_inserts(self): + def select_provaveis_inserts(self, request=None): try: + + if request and 'perfil_estrutural' not in request.session: + self.set_perfil_in_session(request) + + perfil_pk = request.session['perfil_estrutural'] + # Não salvar d_base - if self.pk_add == 0: + if self.pk_edit == 0: base = Dispositivo.objects.get(pk=self.pk_view) else: - base = Dispositivo.objects.get(pk=self.pk_add) + base = Dispositivo.objects.get(pk=self.pk_edit) prox_possivel = Dispositivo.objects.filter( ordem__gt=base.ordem, @@ -444,14 +562,15 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): if dp.nivel >= nivel: continue - if dp.is_relative_auto_insert(): + if dp.is_relative_auto_insert(perfil_pk): continue if prox_possivel and \ dp.tipo_dispositivo != base.tipo_dispositivo and\ dp.nivel < prox_possivel.nivel and\ not prox_possivel.tipo_dispositivo.permitido_inserir_in( - dp.tipo_dispositivo): + dp.tipo_dispositivo, + perfil_pk=perfil_pk): if dp.tipo_dispositivo != prox_possivel.tipo_dispositivo: continue @@ -469,6 +588,13 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): dp.tipo_dispositivo.nome,), 'dispositivo_base': base.pk}) + if dp.dispositivo_pai: + flag_pv = dp.tipo_dispositivo.permitido_variacao( + dp.dispositivo_pai.tipo_dispositivo, + perfil_pk=perfil_pk) + else: + flag_pv = False + r = [] flag_direcao = 1 flag_variacao = 0 @@ -491,8 +617,12 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): 'dispositivo_base': base.pk}) flag_direcao = -1 + r.reverse() + if not flag_pv: + r = [r[0], ] + if len(r) > 0 and dp.tipo_dispositivo.formato_variacao0 == \ TipoDispositivo.FNCN: r = [r[0], ] @@ -530,7 +660,9 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): for td in otds: if paradentro and not td.permitido_inserir_in( - tipb, excluir_autos=True): + tipb, + include_relative_autos=False, + perfil_pk=perfil_pk): continue base.tipo_dispositivo = td @@ -540,29 +672,32 @@ class DispositivoEditView(CompilacaoEditView, FormMixin): flag_insercao = False for possivelpai in parents: if td.permitido_inserir_in( - possivelpai.tipo_dispositivo, - excluir_autos=True): + possivelpai.tipo_dispositivo, + include_relative_autos=False, + perfil_pk=perfil_pk): flag_insercao = True break if not flag_insercao: continue - if possivelpai.is_relative_auto_insert(): + if possivelpai.is_relative_auto_insert(perfil_pk): continue if prox_possivel: if prox_possivel.nivel == base.nivel: if prox_possivel.tipo_dispositivo != td and\ not prox_possivel.tipo_dispositivo.\ - permitido_inserir_in(td): + permitido_inserir_in( + td, perfil_pk=perfil_pk): continue else: if possivelpai.tipo_dispositivo != \ prox_possivel.tipo_dispositivo and\ not prox_possivel.tipo_dispositivo.\ permitido_inserir_in( - possivelpai.tipo_dispositivo) and \ + possivelpai.tipo_dispositivo, + perfil_pk=perfil_pk) and \ possivelpai.nivel < \ prox_possivel.nivel: continue @@ -610,17 +745,33 @@ class ActionsEditMixin(object): def render_to_json_response(self, context, **response_kwargs): - if context['action'] == 'add_next': - return JsonResponse(self.add_next(context), safe=False) - elif context['action'] == 'add_in': - return JsonResponse(self.add_in(context), safe=False) - elif context['action'] == 'add_prior': - return JsonResponse(self.add_prior(context), safe=False) + test = getattr(self, context['action']) + return JsonResponse(test(context), safe=False) + + def delete_item_dispositivo(self, context): + return self.delete_bloco_dispositivo(context) + + def delete_bloco_dispositivo(self, context): + base = Dispositivo.objects.get(pk=context['dispositivo_id']) + + base_anterior = Dispositivo.objects.order_by('-ordem').filter( + norma_id=base.norma_id, + ordem__lt=base.ordem + )[:1] + base.delete() + + if base_anterior.exists(): + if base_anterior[0].dispositivo_pai_id: + data = {'pk': base_anterior[0].pk, 'pai': [ + base_anterior[0].dispositivo_pai_id, ]} + else: + data = {'pk': base_anterior[0].pk, 'pai': [-1, ]} + return data else: - return JsonResponse({}, safe=False) + return {} def add_prior(self, context): - pass + return {} def add_in(self, context): return self.add_next(context, local_add='add_in') @@ -637,7 +788,7 @@ class ActionsEditMixin(object): count_auto_insert = 0 for tipoauto in tipos_dp_auto_insert: - qtdp = tipoauto.filho_permitido.quantidade_permitida + qtdp = tipoauto.quantidade_permitida if qtdp >= 0: qtdp -= Dispositivo.objects.filter( norma_id=base.norma_id, @@ -657,7 +808,9 @@ class ActionsEditMixin(object): if dp.tipo_dispositivo == tipo: dp_irmao = dp break - if tipo.permitido_inserir_in(dp.tipo_dispositivo): + if tipo.permitido_inserir_in( + dp.tipo_dispositivo, + perfil_pk=context['perfil_pk']): dp_pai = dp break dp_pai = dp @@ -723,30 +876,33 @@ class ActionsEditMixin(object): antes da inserção atual e que são inferiores a dp, redirecionando para o novo pai''' - possiveis_filhos = Dispositivo.objects.filter( - ordem__gt=dp.ordem, - norma_id=dp.norma_id) - nivel = sys.maxsize flag_niveis = False - for filho in possiveis_filhos: - if filho.nivel > nivel: - continue + if not dp.tipo_dispositivo.dispositivo_de_alteracao: + possiveis_filhos = Dispositivo.objects.filter( + ordem__gt=dp.ordem, + norma_id=dp.norma_id) - if filho.dispositivo_pai.ordem >= dp.ordem: - continue + for filho in possiveis_filhos: - nivel = filho.nivel + if filho.nivel > nivel: + continue - if not filho.tipo_dispositivo.permitido_inserir_in( - dp.tipo_dispositivo): - continue + if filho.dispositivo_pai.ordem >= dp.ordem: + continue - filho.dispositivo_pai = dp - filho.clean() - filho.save() - flag_niveis = True + nivel = filho.nivel + + if not filho.tipo_dispositivo.permitido_inserir_in( + dp.tipo_dispositivo, + perfil_pk=context['perfil_pk']): + continue + + filho.dispositivo_pai = dp + filho.clean() + filho.save() + flag_niveis = True if flag_niveis: dp.organizar_niveis() @@ -795,7 +951,7 @@ class ActionsEditMixin(object): contagem continua, caso a inserção seja uma articulação''' numtipos = {} - if tipo.class_css == 'articulacao': + if dp.nivel == 0: proxima_articulacao = Dispositivo.objects.filter( ordem__gt=dp.ordem, @@ -894,6 +1050,14 @@ class ActionsEditView(ActionsEditMixin, TemplateView): def render_to_response(self, context, **response_kwargs): context['action'] = self.request.GET['action'] - context['tipo_pk'] = self.request.GET['tipo_pk'] - context['variacao'] = self.request.GET['variacao'] + + if 'tipo_pk' in self.request.GET: + context['tipo_pk'] = self.request.GET['tipo_pk'] + + if 'variacao' in self.request.GET: + context['variacao'] = self.request.GET['variacao'] + + if 'perfil_estrutural' in self.request.session: + context['perfil_pk'] = self.request.session['perfil_estrutural'] + return self.render_to_json_response(context, **response_kwargs) diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 80547dc4c..7d7abaf98 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -9,6 +9,7 @@ django-crispy-forms django-extra-views django-vanilla-views git+git://github.com/interlegis/django-sass-processor.git +git+git://github.com/LeandroRoberto/odfpy.git libsass psycopg2 pytz diff --git a/static/js/compilacao.js b/static/js/compilacao.js index f5ff95468..30e8551a0 100644 --- a/static/js/compilacao.js +++ b/static/js/compilacao.js @@ -63,12 +63,14 @@ var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action, var _action = __action; var _variacao = ''; var _tipo_pk = ''; + var _perfil_pk = ''; if (event != null) { pk_refresh = event.currentTarget.getAttribute('pk'); _action = $(this).attr('action'); _variacao = $(this).attr('variacao'); _tipo_pk = $(this).attr('tipo_pk'); + _perfil_pk = $(this).attr('perfil_pk'); } if (pk_edit == null) @@ -78,20 +80,22 @@ var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action, if (_action == '') return; else if ( _action == null) { - url = pk_refresh+'/refresh?pkadd='+pk_edit; + url = pk_refresh+'/refresh?edit='+pk_edit; } else if (_action.startsWith('refresh')) { - var str = _action.split(':'); if (str.length > 1) { - editortype = str[1]; - SetCookie("editortype", editortype, 30) - + if(_action.endsWith('perfil')) { + url = '&perfil_pk='+_perfil_pk; + } + else { + editortype = str[1]; + SetCookie("editortype", editortype, 30) + } } - url = pk_refresh+'/refresh?pkadd='+pk_edit+url; - $("#message_block").css("display", "block"); + url = pk_refresh+'/refresh?edit='+pk_edit+url; } - else { + else if (_action.startsWith('add_')) { url = pk_refresh+'/actions?action='+_action; url += '&tipo_pk='+_tipo_pk; @@ -100,11 +104,14 @@ var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action, $("#message_block").css("display", "block"); } + else if (_action.startsWith('delete_')) { + url = pk_refresh+'/actions?action='+_action; + $("#message_block").css("display", "block"); + } $.get(url).done(function( data ) { if ( _action == null || _action.startsWith('refresh')) { - if (flag_refresh_all) { if (flag_actions_vibible) clearEditSelected(); @@ -165,6 +172,16 @@ var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action, alert('Erro na inserção!'); } } + else if (_action.startsWith('delete_')) { + $("#message_block").css("display", "block"); + clearEditSelected(); + if (data.pk != null) { + refreshScreenFocusPk(data); + } + else { + alert('Erro exclusão!'); + } + } else { clearEditSelected(); reloadFunctionClicks(); @@ -196,11 +213,11 @@ function clearEditSelected() { } function reloadFunctionClicks() { - $('.dpt .de, .btn-action, .btn-inserts, .btn-edit').off(); + $('.dpt .de, .btn-action, .btn-edit').off(); $('.dpt .de, .btn-edit').on('click', clickEditDispositivo); - $('.btn-action, .btn-inserts').on('click', clickUpdateDispositivo); + $('.btn-action').on('click', clickUpdateDispositivo); $('#editdi_texto').focus(); } diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index ddd0c06f6..c1ca8d044 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -17,6 +17,7 @@ $color_actions_border: #CCC; border-radius: $radius; } + @mixin li_flutuante() { & > ul { @@ -34,19 +35,26 @@ $color_actions_border: #CCC; a { border-right: 0px !important; } - } - &::before { - border-width: 0.375rem; - border-style: inset inset solid; - content: ""; - display: block; - height: 0px; - width: 0px; - border-color: transparent transparent #3385CA; - position: absolute; - top: -0.75rem; - left: 0.9375rem; + + &:first-child { + + &::before { + border-width: 0.375rem; + border-style: inset inset solid; + content: ""; + display: block; + height: 0px; + width: 0px; + border-color: transparent transparent #3385CA; + position: absolute; + top: -0.75rem; + left: 0.9375rem; + } + &:hover::before { + border-color: transparent transparent #0A5EA4; + } + } } // This bridges the gap between the top bar and a dropdown. &::after { @@ -74,7 +82,9 @@ $color_actions_border: #CCC; } } - +.test_import:nth-child(even) { + background-color: #ccc; +} #message_block { display: block; position: fixed; @@ -267,7 +277,31 @@ $color_actions_border: #CCC; } .fixed{ + z-index:98; + opacity: 0.2; + transition: all 2s ease-in-out; + -webkit-transition-delay: 3s; /* Safari */ + transition-delay: 3s; + + &:hover { + -webkit-transition-delay: 0s; /* Safari */ + transition-delay: 0s; + transition: all 0.3s ease-in-out; + opacity: 0.9; + + &::-webkit-scrollbar { + width: 10px; + height: 10px; + } + + + &::-webkit-scrollbar-thumb:vertical { + height: 30px; + background-color: rgba(0, 0, 0, 0.1); + } + + } } } /* end cp */ @@ -297,7 +331,7 @@ $color_actions_border: #CCC; & > .actions_left { color: #fff; position: absolute; - left: -2em; + left: -2.6em; opacity: 0; transition: all 0.4s ease-in-out; a { @@ -360,13 +394,10 @@ $color_actions_border: #CCC; @extend .articulacao; margin: 0; padding-top: 3em; + padding-left: 0em; background: #ddd; &::before { content: "Bloco de Alteração"; - position:absolute; - left: 0; - right: 0; - top: 0; display: block; } @@ -407,11 +438,6 @@ $color_actions_border: #CCC; } - .bloco_alteracao { - &::before { - display: none; - } - } & > .bloco { padding: 1em 0; @@ -466,7 +492,6 @@ $color_actions_border: #CCC; & > a { text-shadow: 0 0 5px #777; color: #ff0; - font-weight: bold; } } } @@ -661,14 +686,16 @@ $color_actions_border: #CCC; } &.add_prior { @include li_flutuante(); - display: block; + table-layout: fixed; } &.opc_excluir { @include li_flutuante(); - display: block; + table-layout: fixed; + position: static; & > ul { + right: 0.5em; li { a { background-color: #A70808; @@ -676,10 +703,16 @@ $color_actions_border: #CCC; background: #c70808; } } - } - - &::before { - border-color: transparent transparent #A70808; + &:first-child { + &::before { + border-color: transparent transparent #A70808; + right: 10%; + left: auto; + } + &:hover::before { + border-color: transparent transparent #c70808; + } + } } } @@ -692,6 +725,21 @@ $color_actions_border: #CCC; .menu_flutuante { & > li { @include li_flutuante(); + + + &.opc_excluir { + & > ul { + li { + &:first-child { + &::before { + right: auto; + left: 0.9375rem; + } + } + } + } + + } } } @@ -803,7 +851,7 @@ $color_actions_border: #CCC; left: 1em !important; right: 1em !important; margin-left: 0; - &::before { + li:first-child::before { left: 37%; } } @@ -816,18 +864,18 @@ $color_actions_border: #CCC; right: 0 !important; margin-left: 0; margin-right: 0.5em; - &::before { + li:first-child::before { right: 42%; left: auto; } } &.opc_excluir > ul { - left: 30% !important; + left: 10% !important; right: 0 !important; margin-left: 0; margin-right: 0.5em; - &::before { - right: 35%; + li:first-child::before { + right: 27%; left: auto; } } diff --git a/templates/compilacao/edit.html b/templates/compilacao/edit.html index acc76a8ad..5781ca373 100644 --- a/templates/compilacao/edit.html +++ b/templates/compilacao/edit.html @@ -3,6 +3,8 @@ {% load compilacao_filters %} {% load staticfiles %} {% load sass_tags %} +{% load crispy_forms_tags %} + {% block head_content %}{{block.super}} @@ -22,4 +24,33 @@ {% include 'compilacao/edit_bloco.html'%}
    + +{% if user.is_authenticated and False %} +
    + {% csrf_token %} + + {% if message %} +
    + {{message}} + × +
    + {% endif %} + + +
    + {% trans 'Parser ODF' %} + {{ form.as_p }} + +
    +
    + +{% for parser in parser_list %} +
    + {{ parser|safe}} +
    +{% endfor %} +{% endif%} + + + {% endblock base_content %} diff --git a/templates/compilacao/edit_bloco.html b/templates/compilacao/edit_bloco.html index e0aa78341..5febac519 100644 --- a/templates/compilacao/edit_bloco.html +++ b/templates/compilacao/edit_bloco.html @@ -35,40 +35,40 @@ - -
    {% endif%} - {% if view.pk_view == 0 and view.pk_add == 0 or view.pk_add != view.pk_view %} -
    - E -
    + {% if view.pk_view == 0 and view.pk_edit == 0 or view.pk_edit != view.pk_view %} + {% if not dpt.rotulo and not dpt.texto %} +
    + E +
    + {% endif %}
    {% spaceless %} {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{% if dpt.texto == '' and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}({{dpt.tipo_dispositivo}} sem texto){%else%}{{ dpt.texto|safe }}{%endif%} diff --git a/templates/compilacao/index.html b/templates/compilacao/index.html index d0b436f15..ddec9f487 100644 --- a/templates/compilacao/index.html +++ b/templates/compilacao/index.html @@ -6,7 +6,6 @@ {% block head_content %}{{block.super}} - {% endblock %} @@ -29,11 +28,13 @@ $(window).load(function() { setTimeout(function() { height = $( "section.vigencias" ).height(); $('html, body').animate({ - scrollTop: window.pageYOffset - height - 37 + scrollTop: window.pageYOffset - height - 55 }, 300); }, 100); }); + + function textoMultiVigente(item) { $(".cp .tipo-vigencias a").removeClass("selected") $(item).addClass("selected") diff --git a/templates/sistema.html b/templates/sistema.html index d86b83cf4..079cf044c 100644 --- a/templates/sistema.html +++ b/templates/sistema.html @@ -84,7 +84,8 @@
  • Tipo de Nota
  • Tipo de Vide
  • Tipo de Publicação
  • -
  • Veículo de Públicação
  • +
  • Veículo de Públicação
  • +
  • Perfil Estrutural de Textos Normativos
  • Módulo Sessão Plenária
    From dad6edf797eb52b64251beed80e0ff0241a4800a Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Thu, 19 Nov 2015 19:40:06 -0200 Subject: [PATCH 14/23] =?UTF-8?q?atualiza=C3=A7=C3=A3o=20do=20sql=20inicia?= =?UTF-8?q?l=20dos=20tipos=20de=20dispositivos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- compilacao/insert_inicial_TipoDispositivo.sql | 374 ++++++++++++++++-- 1 file changed, 347 insertions(+), 27 deletions(-) diff --git a/compilacao/insert_inicial_TipoDispositivo.sql b/compilacao/insert_inicial_TipoDispositivo.sql index 196e8e46d..c37f5f14c 100644 --- a/compilacao/insert_inicial_TipoDispositivo.sql +++ b/compilacao/insert_inicial_TipoDispositivo.sql @@ -1,29 +1,349 @@ +-- +-- PostgreSQL database dump +-- -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (125, 'Texto Não Estruturado', 'texto_n_estruturado', '', '', 0, '', '', '', '', '', '', false, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (2, 'Ementa', 'ementa', '', '', 0, '', '', '', '', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (4, 'Omissis', 'omissis', '', '', 0, '', '', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (102, 'Disposições Gerais', 'disp_gerais', '', 'Disposições Gerais', 0, '', '
    ', '', '
    ', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (103, 'Disposições Transitórias', 'disp_transitorias', '', 'Disposições Transitórias', 0, '', '
    ', '', '
    ', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (104, 'Disposições Finais', 'disp_finais', '', 'Disposições Finais', 0, '', '
    ', '', '
    ', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (122, 'Inciso', 'inciso', '', '', 0, '', ' – ', '', '', '', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (123, 'Alinea', 'alinea', '', '', 0, '', ' – ', '', '', '', '', false, 'a', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (120, 'Caput', 'caput', '', '', 0, '', '', '', '', '', '', false, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (118, 'Item de Seção', 'itemsecao', '', 'Item ', 0, '', '
    ', '', '
    ', '
    ', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (117, 'SubSeção', 'subsecao', '', 'SubSeção ', 0, '', '
    ', '', '
    ', '
    ', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (116, 'Seção', 'secao', '', 'Seção ', 0, '', '
    ', '', '
    ', '
    ', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (114, 'Título', 'titulo', '', 'Título ', 0, '', '
    ', '', '
    ', '
    ', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (113, 'Livro', 'livro', '', 'Livro ', 0, '', '
    ', '', '
    ', '
    ', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (112, 'Parte', 'parte', '', 'Parte ', 0, '', '
    ', '', '
    ', '
    ', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (111, 'Anexo', 'anexo', '', 'Anexo ', 0, '', '
    ', '', '
    ', '
    ', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (115, 'Capítulo', 'capitulo', '', 'Capítulo ', 0, '', '
    ', '', '
    ', '
    ', '', false, 'I', 'A', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (124, 'Item', 'item', '', '', 0, '', ' – ', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '.', '.', '.', '.', '.', false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (121, 'Parágrafo', 'paragrafo', '', '§ ;Parágrafo Único ', 9, '', ' – ', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (101, 'Disposições Preliminares', 'disp_preliminares', '', 'Disposições Preliminares', 0, '', '
    ', '', '
    ', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (119, 'Artigo', 'artigo', '', 'Art. ', 9, '.', ' – ', '', '', '', '', true, '1', 'A', '1', '1', '1', '1', '-', '-', '-', '-', '-', true); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (3, 'Bloco Alteração', 'bloco_alteracao', '', '', 0, '', '', '', '', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', true); -INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao) VALUES (1, 'Articulação', 'articulacao', '', '', 0, '', '', '', '', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', true); - - - -SELECT pg_catalog.setval('compilacao_tipodispositivo_id_seq', 125, true); +-- Dumped from database version 9.4.5 +-- Dumped by pg_dump version 9.4.5 +-- Started on 2015-11-19 19:39:23 BRST + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SET check_function_bodies = false; +SET client_min_messages = warning; + +SET search_path = public, pg_catalog; + +-- +-- TOC entry 2567 (class 0 OID 40610) +-- Dependencies: 366 +-- Data for Name: compilacao_perfilestruturaltextosnormativos; Type: TABLE DATA; Schema: public; Owner: sapl +-- + +INSERT INTO compilacao_perfilestruturaltextosnormativos (id, nome, padrao, sigla) VALUES (1, 'Perfil Lei Complementar 95', false, 'LC95'); +INSERT INTO compilacao_perfilestruturaltextosnormativos (id, nome, padrao, sigla) VALUES (2, 'Perfil Jataí - Goiás', true, 'PJTIGO'); + + +-- +-- TOC entry 2575 (class 0 OID 0) +-- Dependencies: 365 +-- Name: compilacao_perfilestruturaltextosnormativos_id_seq; Type: SEQUENCE SET; Schema: public; Owner: sapl +-- + +SELECT pg_catalog.setval('compilacao_perfilestruturaltextosnormativos_id_seq', 2, true); + + +-- +-- TOC entry 2562 (class 0 OID 38245) +-- Dependencies: 204 +-- Data for Name: compilacao_tipodispositivo; Type: TABLE DATA; Schema: public; Owner: sapl +-- + +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (125, 'Texto Não Estruturado', 'texto_n_estruturado', '', '', 0, '', '', '', '', '', '', false, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (102, 'Disposições Gerais', 'disp_gerais', '', 'Disposições Gerais', 0, '', '
    ', '', '
    ', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (103, 'Disposições Transitórias', 'disp_transitorias', '', 'Disposições Transitórias', 0, '', '
    ', '', '
    ', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (104, 'Disposições Finais', 'disp_finais', '', 'Disposições Finais', 0, '', '
    ', '', '
    ', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (122, 'Inciso', 'inciso', '', '', 0, '', ' – ', '', '', '', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (120, 'Caput', 'caput', '', '', 0, '', '', '', '', '', '', false, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (118, 'Item de Seção', 'itemsecao', '', 'Item ', 0, '', '
    ', '', '
    ', '
    ', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (117, 'SubSeção', 'subsecao', '', 'SubSeção ', 0, '', '
    ', '', '
    ', '
    ', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (116, 'Seção', 'secao', '', 'Seção ', 0, '', '
    ', '', '
    ', '
    ', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (114, 'Título', 'titulo', '', 'Título ', 0, '', '
    ', '', '
    ', '
    ', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (113, 'Livro', 'livro', '', 'Livro ', 0, '', '
    ', '', '
    ', '
    ', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (112, 'Parte', 'parte', '', 'Parte ', 0, '', '
    ', '', '
    ', '
    ', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (111, 'Anexo', 'anexo', '', 'Anexo ', 0, '', '
    ', '', '
    ', '
    ', '', false, 'I', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (115, 'Capítulo', 'capitulo', '', 'Capítulo ', 0, '', '
    ', '', '
    ', '
    ', '', false, 'I', 'A', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (124, 'Item', 'item', '', '', 0, '', ' – ', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '.', '.', '.', '.', '.', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (121, 'Parágrafo', 'paragrafo', '', '§ ;Parágrafo Único ', 9, '', ' – ', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (101, 'Disposições Preliminares', 'disp_preliminares', '', 'Disposições Preliminares', 0, '', '
    ', '', '
    ', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (119, 'Artigo', 'artigo', '', 'Art. ', 9, '.', ' – ', '', '', '', '', true, '1', 'A', '1', '1', '1', '1', '-', '-', '-', '-', '-', true, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (1, 'Articulação', 'articulacao', '', '', 0, '', '', '', '', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', true, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (123, 'Alinea', 'alinea', '', '', 0, ')', ' – ', '', '', '', '', false, 'a', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (3, 'Bloco Alteração', 'bloco_alteracao', '', '', 0, '', '', '', '', '', '', true, 'N', 'N', 'N', 'N', 'N', 'N', '-', '-', '-', '-', '-', true, true); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (4, 'Omissis', 'omissis', '', '', 0, '', '', '', '', '', '', false, '1', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, true); +INSERT INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5, rotulo_separador_variacao01, rotulo_separador_variacao12, rotulo_separador_variacao23, rotulo_separador_variacao34, rotulo_separador_variacao45, dispositivo_de_articulacao, dispositivo_de_alteracao) VALUES (2, 'Ementa', 'ementa', '', '', 0, '', '', '', '', '', '', false, 'N', '1', '1', '1', '1', '1', '-', '-', '-', '-', '-', false, false); + + +-- +-- TOC entry 2576 (class 0 OID 0) +-- Dependencies: 205 +-- Name: compilacao_tipodispositivo_id_seq; Type: SEQUENCE SET; Schema: public; Owner: sapl +-- + +SELECT pg_catalog.setval('compilacao_tipodispositivo_id_seq', 28, true); + + +-- +-- TOC entry 2564 (class 0 OID 38253) +-- Dependencies: 206 +-- Data for Name: compilacao_tipodispositivorelationship; Type: TABLE DATA; Schema: public; Owner: sapl +-- + +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (318, 119, 113, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (319, 115, 114, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (320, 116, 114, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (321, 117, 114, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (323, 119, 114, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (324, 116, 115, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (325, 117, 115, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (327, 119, 115, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (328, 117, 116, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (330, 119, 116, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (332, 119, 117, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (334, 120, 119, true, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (336, 125, 119, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (337, 122, 120, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (338, 123, 120, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (339, 124, 120, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (340, 125, 120, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (342, 101, 1, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (343, 102, 1, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (344, 103, 1, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (345, 104, 1, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (346, 111, 1, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (347, 112, 1, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (348, 113, 1, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (349, 114, 1, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (350, 115, 1, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (351, 116, 1, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (352, 117, 1, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (354, 119, 1, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (355, 125, 1, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (356, 101, 3, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (357, 102, 3, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (358, 103, 3, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (359, 104, 3, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (360, 111, 3, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (361, 112, 3, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (362, 113, 3, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (363, 114, 3, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (364, 115, 3, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (365, 116, 3, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (366, 117, 3, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (368, 119, 3, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (369, 122, 121, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (370, 123, 121, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (371, 124, 121, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (372, 125, 121, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (373, 123, 122, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (374, 124, 122, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (375, 125, 122, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (376, 124, 123, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (377, 125, 123, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (378, 125, 124, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (379, 3, 119, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (380, 3, 121, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (381, 3, 122, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (382, 3, 123, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (383, 3, 124, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (384, 3, 120, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (126, 1, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (127, 2, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (128, 4, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (147, 125, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (146, 124, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (145, 123, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (144, 122, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (143, 121, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (142, 120, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (148, 111, 101, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (149, 112, 101, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (150, 113, 101, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (151, 114, 101, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (152, 115, 101, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (153, 116, 101, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (154, 117, 101, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (156, 119, 101, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (157, 111, 102, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (158, 112, 102, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (159, 113, 102, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (160, 114, 102, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (161, 115, 102, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (162, 116, 102, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (163, 117, 102, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (165, 119, 102, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (166, 111, 103, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (167, 112, 103, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (168, 113, 103, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (169, 114, 103, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (170, 115, 103, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (171, 116, 103, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (172, 117, 103, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (174, 119, 103, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (175, 111, 104, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (176, 112, 104, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (177, 113, 104, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (178, 114, 104, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (179, 115, 104, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (180, 116, 104, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (181, 117, 104, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (183, 119, 104, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (185, 112, 111, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (186, 113, 111, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (187, 114, 111, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (188, 115, 111, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (189, 116, 111, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (190, 117, 111, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (192, 119, 111, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (193, 113, 112, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (194, 114, 112, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (195, 115, 112, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (196, 116, 112, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (197, 117, 112, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (199, 119, 112, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (200, 114, 113, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (201, 115, 113, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (202, 116, 113, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (203, 117, 113, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (205, 119, 113, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (206, 115, 114, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (207, 116, 114, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (208, 117, 114, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (210, 119, 114, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (211, 116, 115, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (212, 117, 115, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (214, 119, 115, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (215, 117, 116, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (217, 119, 116, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (219, 119, 117, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (221, 120, 119, true, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (222, 121, 119, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (226, 125, 119, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (227, 122, 120, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (228, 123, 120, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (229, 124, 120, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (230, 125, 120, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (112, 101, 1, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (111, 2, 1, true, 2, 1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (322, 118, 114, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (326, 118, 115, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (329, 118, 116, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (331, 118, 117, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (353, 118, 1, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (367, 118, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (333, 119, 118, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (113, 102, 1, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (114, 103, 1, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (115, 104, 1, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (116, 111, 1, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (117, 112, 1, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (118, 113, 1, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (119, 114, 1, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (120, 115, 1, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (121, 116, 1, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (122, 117, 1, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (124, 119, 1, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 125, 1, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (129, 101, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (130, 102, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (131, 103, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (132, 104, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (133, 111, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (134, 112, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (135, 113, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (136, 114, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (137, 115, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (138, 116, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (139, 117, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (141, 119, 3, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (231, 122, 121, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (232, 123, 121, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (233, 124, 121, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (234, 125, 121, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (235, 123, 122, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (236, 124, 122, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (237, 125, 122, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (238, 124, 123, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (239, 125, 123, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (240, 125, 124, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (243, 3, 119, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (247, 3, 121, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (248, 3, 122, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (249, 3, 123, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (250, 3, 124, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (251, 3, 120, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (253, 1, 3, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (254, 2, 3, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (255, 4, 3, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (256, 125, 3, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (257, 124, 3, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (258, 123, 3, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (259, 122, 3, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (260, 121, 3, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (261, 120, 3, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (262, 111, 101, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (263, 112, 101, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (264, 113, 101, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (265, 114, 101, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (266, 115, 101, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (267, 116, 101, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (268, 117, 101, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (270, 119, 101, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (271, 111, 102, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (272, 112, 102, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (273, 113, 102, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (274, 114, 102, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (275, 115, 102, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (276, 116, 102, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (277, 117, 102, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (279, 119, 102, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (280, 111, 103, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (281, 112, 103, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (282, 113, 103, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (283, 114, 103, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (284, 115, 103, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (285, 116, 103, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (286, 117, 103, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (288, 119, 103, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (289, 111, 104, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (290, 112, 104, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (291, 113, 104, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (292, 114, 104, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (293, 115, 104, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (294, 116, 104, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (295, 117, 104, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (297, 119, 104, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (298, 112, 111, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (299, 113, 111, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (300, 114, 111, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (301, 115, 111, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (302, 116, 111, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (303, 117, 111, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (305, 119, 111, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (306, 113, 112, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (307, 114, 112, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (308, 115, 112, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (309, 116, 112, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (310, 117, 112, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (312, 119, 112, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (313, 114, 113, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (314, 115, 113, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (315, 116, 113, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (316, 117, 113, false, 1, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (341, 2, 1, true, 1, 1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (287, 118, 103, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (269, 118, 101, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (278, 118, 102, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (296, 118, 104, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (304, 118, 111, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (311, 118, 112, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (317, 118, 113, false, 2, -1, true); +INSERT INTO compilacao_tipodispositivorelationship (id, filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (335, 121, 119, false, 1, -1, false); + + +-- +-- TOC entry 2577 (class 0 OID 0) +-- Dependencies: 207 +-- Name: compilacao_tipodispositivorelationship_id_seq; Type: SEQUENCE SET; Schema: public; Owner: sapl +-- + +SELECT pg_catalog.setval('compilacao_tipodispositivorelationship_id_seq', 384, true); + + +-- Completed on 2015-11-19 19:39:24 BRST + +-- +-- PostgreSQL database dump complete +-- From 2e7f49e1c3b7f35783254789eace0bb89a5e9433 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 20 Nov 2015 11:27:36 -0200 Subject: [PATCH 15/23] fix bug in compilacao_filters.py --- compilacao/templatetags/compilacao_filters.py | 2 +- .../migrations/0007_auto_20151119_1944.py | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 parlamentares/migrations/0007_auto_20151119_1944.py diff --git a/compilacao/templatetags/compilacao_filters.py b/compilacao/templatetags/compilacao_filters.py index 65b8abab1..4bf6223b6 100644 --- a/compilacao/templatetags/compilacao_filters.py +++ b/compilacao/templatetags/compilacao_filters.py @@ -78,7 +78,7 @@ def select_provaveis_inserts(view, request): @register.filter def is_relative_auto_insert(dpt, request): - return dpt.is_relative_auto_insert(request.session.perfil_estrutural) + return dpt.is_relative_auto_insert(request.session['perfil_estrutural']) @register.filter diff --git a/parlamentares/migrations/0007_auto_20151119_1944.py b/parlamentares/migrations/0007_auto_20151119_1944.py new file mode 100644 index 000000000..6c10fa9da --- /dev/null +++ b/parlamentares/migrations/0007_auto_20151119_1944.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('parlamentares', '0006_auto_20151119_1318'), + ] + + operations = [ + migrations.AlterField( + model_name='parlamentar', + name='unidade_deliberativa', + field=models.BooleanField(), + ), + ] From 4bf19b3077e5cae5f9cef2393135f54ae6e11885 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 20 Nov 2015 18:29:59 -0200 Subject: [PATCH 16/23] fix qa_check and insert timestampdmixin --- base/migrations/0001_initial.py | 2 +- comissoes/migrations/0001_initial.py | 2 +- comissoes/migrations/0002_auto_20150729_1310.py | 2 +- compilacao/forms.py | 8 ++++++++ compilacao/migrations/0001_initial.py | 2 +- compilacao/migrations/0002_auto_20150907_2334.py | 2 +- compilacao/migrations/0003_auto_20150911_1735.py | 2 +- compilacao/migrations/0004_auto_20150914_0842.py | 2 +- compilacao/migrations/0005_auto_20150924_1012.py | 2 +- compilacao/migrations/0006_auto_20150924_1121.py | 2 +- compilacao/migrations/0007_auto_20150924_1131.py | 2 +- compilacao/migrations/0008_auto_20151005_1023.py | 2 +- compilacao/migrations/0009_auto_20151007_1635.py | 2 +- compilacao/migrations/0016_auto_20151119_0950.py | 3 ++- compilacao/models.py | 13 +++++-------- compilacao/views.py | 10 ++-------- lexml/migrations/0001_initial.py | 2 +- lexml/migrations/0002_auto_20150806_1614.py | 2 +- materia/migrations/0001_initial.py | 2 +- materia/migrations/0002_auto_20150729_1310.py | 2 +- materia/migrations/0003_auto_20150729_1717.py | 2 +- .../0004_materialegislativa_texto_original.py | 3 ++- materia/migrations/0005_auto_20150923_0941.py | 2 +- materia/migrations/0006_proposicao_status.py | 2 +- materia/migrations/0007_auto_20151021_1200.py | 2 +- materia/migrations/0008_auto_20151029_1416.py | 2 +- materia/migrations/0009_auto_20151029_1420.py | 2 +- materia/migrations/0010_auto_20151117_1551.py | 3 ++- norma/migrations/0001_initial.py | 2 +- norma/migrations/0002_auto_20150729_1717.py | 2 +- norma/migrations/0003_auto_20150906_0239.py | 2 +- norma/migrations/0004_auto_20150907_0004.py | 2 +- norma/migrations/0005_auto_20150915_1141.py | 2 +- norma/urls.py | 4 ++-- painel/migrations/0001_initial.py | 2 +- parlamentares/migrations/0001_initial.py | 2 +- parlamentares/migrations/0002_auto_20150729_1310.py | 2 +- parlamentares/migrations/0003_auto_20150729_1717.py | 2 +- parlamentares/migrations/0004_auto_20150929_1425.py | 2 +- .../migrations/0005_parlamentar_fotografia.py | 3 ++- parlamentares/migrations/0006_auto_20151119_1318.py | 2 +- protocoloadm/migrations/0001_initial.py | 2 +- protocoloadm/migrations/0002_auto_20150729_1717.py | 2 +- ...cumentoacessorioadministrativo_texto_integral.py | 3 ++- protocoloadm/migrations/0004_auto_20151007_1035.py | 3 ++- protocoloadm/migrations/0005_auto_20151008_0744.py | 3 ++- sapl/settings.py | 3 +-- sessao/migrations/0001_initial.py | 2 +- sessao/migrations/0002_auto_20150729_1450.py | 2 +- .../0003_remove_sessaoplenaria_tipo_expediente.py | 2 +- sessao/migrations/0004_auto_20150806_1614.py | 3 ++- .../0005_remove_presencaordemdia_data_ordem.py | 2 +- sessao/migrations/0006_auto_20150929_1425.py | 2 +- sessao/migrations/0007_auto_20150929_1426.py | 2 +- sessao/migrations/0008_auto_20151005_0814.py | 2 +- sessao/migrations/0009_auto_20151005_0934.py | 2 +- 56 files changed, 77 insertions(+), 71 deletions(-) diff --git a/base/migrations/0001_initial.py b/base/migrations/0001_initial.py index 9518c78f9..8b7f64d04 100644 --- a/base/migrations/0001_initial.py +++ b/base/migrations/0001_initial.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/comissoes/migrations/0001_initial.py b/comissoes/migrations/0001_initial.py index 5f87b599e..42cd116fa 100644 --- a/comissoes/migrations/0001_initial.py +++ b/comissoes/migrations/0001_initial.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/comissoes/migrations/0002_auto_20150729_1310.py b/comissoes/migrations/0002_auto_20150729_1310.py index 7f08b5fe3..eef2e558e 100644 --- a/comissoes/migrations/0002_auto_20150729_1310.py +++ b/comissoes/migrations/0002_auto_20150729_1310.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/compilacao/forms.py b/compilacao/forms.py index e69de29bb..6cfbbd873 100644 --- a/compilacao/forms.py +++ b/compilacao/forms.py @@ -0,0 +1,8 @@ +from django import forms +from django.utils.translation import ugettext_lazy as _ + + +class UpLoadImportFileForm(forms.Form): + import_file = forms.FileField( + required=True, + label=_('Arquivo formato ODF para Importanção')) diff --git a/compilacao/migrations/0001_initial.py b/compilacao/migrations/0001_initial.py index d8e06c220..fe763b7f0 100644 --- a/compilacao/migrations/0001_initial.py +++ b/compilacao/migrations/0001_initial.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/compilacao/migrations/0002_auto_20150907_2334.py b/compilacao/migrations/0002_auto_20150907_2334.py index f92031d91..da10519c5 100644 --- a/compilacao/migrations/0002_auto_20150907_2334.py +++ b/compilacao/migrations/0002_auto_20150907_2334.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/compilacao/migrations/0003_auto_20150911_1735.py b/compilacao/migrations/0003_auto_20150911_1735.py index 36cfd09af..67ae645a6 100644 --- a/compilacao/migrations/0003_auto_20150911_1735.py +++ b/compilacao/migrations/0003_auto_20150911_1735.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/compilacao/migrations/0004_auto_20150914_0842.py b/compilacao/migrations/0004_auto_20150914_0842.py index 991257507..a871bcc07 100644 --- a/compilacao/migrations/0004_auto_20150914_0842.py +++ b/compilacao/migrations/0004_auto_20150914_0842.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/compilacao/migrations/0005_auto_20150924_1012.py b/compilacao/migrations/0005_auto_20150924_1012.py index bf712fe02..3e4dbe625 100644 --- a/compilacao/migrations/0005_auto_20150924_1012.py +++ b/compilacao/migrations/0005_auto_20150924_1012.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/compilacao/migrations/0006_auto_20150924_1121.py b/compilacao/migrations/0006_auto_20150924_1121.py index df4fe2fd4..a27cddf2b 100644 --- a/compilacao/migrations/0006_auto_20150924_1121.py +++ b/compilacao/migrations/0006_auto_20150924_1121.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/compilacao/migrations/0007_auto_20150924_1131.py b/compilacao/migrations/0007_auto_20150924_1131.py index 8866b0d92..56d0bcc25 100644 --- a/compilacao/migrations/0007_auto_20150924_1131.py +++ b/compilacao/migrations/0007_auto_20150924_1131.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/compilacao/migrations/0008_auto_20151005_1023.py b/compilacao/migrations/0008_auto_20151005_1023.py index a701292f2..995d4d9e1 100644 --- a/compilacao/migrations/0008_auto_20151005_1023.py +++ b/compilacao/migrations/0008_auto_20151005_1023.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/compilacao/migrations/0009_auto_20151007_1635.py b/compilacao/migrations/0009_auto_20151007_1635.py index 9a8618131..1fbc966c8 100644 --- a/compilacao/migrations/0009_auto_20151007_1635.py +++ b/compilacao/migrations/0009_auto_20151007_1635.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/compilacao/migrations/0016_auto_20151119_0950.py b/compilacao/migrations/0016_auto_20151119_0950.py index 3f417e105..807940b86 100644 --- a/compilacao/migrations/0016_auto_20151119_0950.py +++ b/compilacao/migrations/0016_auto_20151119_0950.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import datetime + +from django.db import migrations, models from django.utils.timezone import utc diff --git a/compilacao/models.py b/compilacao/models.py index b2d646eff..baaa77dd1 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -368,7 +368,7 @@ class VeiculoPublicacao(models.Model): return '%s: %s' % (self.sigla, self.nome) -class Publicacao(models.Model): +class Publicacao(TimestampedMixin): norma = models.ForeignKey( NormaJuridica, verbose_name=_('Norma Jurídica')) veiculo_publicacao = models.ForeignKey( @@ -380,7 +380,6 @@ class Publicacao(models.Model): blank=True, null=True, verbose_name=_('Pg. Início')) pagina_fim = models.PositiveIntegerField( blank=True, null=True, verbose_name=_('Pg. Fim')) - timestamp = models.DateTimeField() class Meta: verbose_name = _('Publicação') @@ -852,7 +851,7 @@ class Dispositivo(BaseModel, TimestampedMixin): tipo_dispositivo_id=self.tipo_dispositivo.pk)) else: # contagem continua restrita a articulacao - proxima_articulacao = self.get_proxima_articulacao() + proxima_articulacao = self.get_proximo_nivel_zero() if proxima_articulacao is None: irmaos = list(Dispositivo.objects.filter( @@ -940,7 +939,7 @@ class Dispositivo(BaseModel, TimestampedMixin): irmao.clean() irmao.save() - def get_proxima_articulacao(self): + def get_proximo_nivel_zero(self): proxima_articulacao = Dispositivo.objects.filter( ordem__gt=self.ordem, nivel=0, @@ -1025,8 +1024,7 @@ class Dispositivo(BaseModel, TimestampedMixin): dispositivo.set_numero_completo([1, 0, 0, 0, 0, 0, ]) -class Vide(models.Model): - data_criacao = models.DateTimeField(verbose_name=_('Data de Criação')) +class Vide(TimestampedMixin): texto = models.TextField(verbose_name=_('Texto do Vide')) tipo = models.ForeignKey(TipoVide, verbose_name=_('Tipo do Vide')) @@ -1048,7 +1046,7 @@ class Vide(models.Model): return _('Vide %s') % self.texto -class Nota(models.Model): +class Nota(TimestampedMixin): NPRIV = 1 NSTRL = 2 NINST = 3 @@ -1070,7 +1068,6 @@ class Nota(models.Model): blank=True, verbose_name=_('Url externa')) - data_criacao = models.DateTimeField(verbose_name=_('Data de Criação')) publicacao = models.DateTimeField(verbose_name=_('Data de Publicação')) efetifidade = models.DateTimeField(verbose_name=_('Data de Efeito')) diff --git a/compilacao/views.py b/compilacao/views.py index b5972d3e7..28000547a 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -2,7 +2,6 @@ from collections import OrderedDict from datetime import datetime, timedelta from os.path import sys -from django import forms from django.core.signing import Signer from django.db.models import Q from django.http.response import JsonResponse @@ -14,6 +13,7 @@ from django.views.generic.edit import FormMixin from django.views.generic.list import ListView from compilacao.file2dispositivo import Parser +from compilacao.forms import UpLoadImportFileForm from compilacao.models import (Dispositivo, PerfilEstruturalTextosNormativos, TipoDispositivo, TipoNota, TipoPublicacao, TipoVide, VeiculoPublicacao) @@ -253,12 +253,6 @@ class DispositivoView(CompilacaoView): return itens -class UpLoadImportFileForm(forms.Form): - import_file = forms.FileField( - required=True, - label=_('Arquivo formato ODF para Importanção')) - - def handle_uploaded_file(f, outfilepath): with open(outfilepath, 'wb+') as destination: for chunk in f.chunks(): @@ -1018,7 +1012,7 @@ class ActionsEditMixin(object): pkfilho = dispositivo.pk dispositivo = dispositivo.dispositivo_pai - proxima_articulacao = dispositivo.get_proxima_articulacao() + proxima_articulacao = dispositivo.get_proximo_nivel_zero() if proxima_articulacao is not None: parents = Dispositivo.objects.filter( diff --git a/lexml/migrations/0001_initial.py b/lexml/migrations/0001_initial.py index 39d4926f4..6a2e21391 100644 --- a/lexml/migrations/0001_initial.py +++ b/lexml/migrations/0001_initial.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/lexml/migrations/0002_auto_20150806_1614.py b/lexml/migrations/0002_auto_20150806_1614.py index c8629742f..b0ae800e0 100644 --- a/lexml/migrations/0002_auto_20150806_1614.py +++ b/lexml/migrations/0002_auto_20150806_1614.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/materia/migrations/0001_initial.py b/materia/migrations/0001_initial.py index 20976175c..0552b7edb 100644 --- a/materia/migrations/0001_initial.py +++ b/materia/migrations/0001_initial.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/materia/migrations/0002_auto_20150729_1310.py b/materia/migrations/0002_auto_20150729_1310.py index 613e5653f..a9e9b21c3 100644 --- a/materia/migrations/0002_auto_20150729_1310.py +++ b/materia/migrations/0002_auto_20150729_1310.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/materia/migrations/0003_auto_20150729_1717.py b/materia/migrations/0003_auto_20150729_1717.py index 49abc8853..6ffea56bd 100644 --- a/materia/migrations/0003_auto_20150729_1717.py +++ b/materia/migrations/0003_auto_20150729_1717.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/materia/migrations/0004_materialegislativa_texto_original.py b/materia/migrations/0004_materialegislativa_texto_original.py index 163ae0ff2..214864cf8 100644 --- a/materia/migrations/0004_materialegislativa_texto_original.py +++ b/materia/migrations/0004_materialegislativa_texto_original.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models + import materia.models diff --git a/materia/migrations/0005_auto_20150923_0941.py b/materia/migrations/0005_auto_20150923_0941.py index ae62096ef..24148ca2b 100644 --- a/materia/migrations/0005_auto_20150923_0941.py +++ b/materia/migrations/0005_auto_20150923_0941.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/materia/migrations/0006_proposicao_status.py b/materia/migrations/0006_proposicao_status.py index d6f84f45a..9e8678308 100644 --- a/materia/migrations/0006_proposicao_status.py +++ b/materia/migrations/0006_proposicao_status.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/materia/migrations/0007_auto_20151021_1200.py b/materia/migrations/0007_auto_20151021_1200.py index fb3563751..2cdad3b5c 100644 --- a/materia/migrations/0007_auto_20151021_1200.py +++ b/materia/migrations/0007_auto_20151021_1200.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/materia/migrations/0008_auto_20151029_1416.py b/materia/migrations/0008_auto_20151029_1416.py index 530e26990..4ee72acaf 100644 --- a/materia/migrations/0008_auto_20151029_1416.py +++ b/materia/migrations/0008_auto_20151029_1416.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/materia/migrations/0009_auto_20151029_1420.py b/materia/migrations/0009_auto_20151029_1420.py index 771b76392..b831a3885 100644 --- a/materia/migrations/0009_auto_20151029_1420.py +++ b/materia/migrations/0009_auto_20151029_1420.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/materia/migrations/0010_auto_20151117_1551.py b/materia/migrations/0010_auto_20151117_1551.py index 93f67f486..7d64b431d 100644 --- a/materia/migrations/0010_auto_20151117_1551.py +++ b/materia/migrations/0010_auto_20151117_1551.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models + import materia.models diff --git a/norma/migrations/0001_initial.py b/norma/migrations/0001_initial.py index 5ac87c706..1e3be4b19 100644 --- a/norma/migrations/0001_initial.py +++ b/norma/migrations/0001_initial.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/norma/migrations/0002_auto_20150729_1717.py b/norma/migrations/0002_auto_20150729_1717.py index 1695f9460..d2a9cba0f 100644 --- a/norma/migrations/0002_auto_20150729_1717.py +++ b/norma/migrations/0002_auto_20150729_1717.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/norma/migrations/0003_auto_20150906_0239.py b/norma/migrations/0003_auto_20150906_0239.py index 82dafbf88..dff90c71e 100644 --- a/norma/migrations/0003_auto_20150906_0239.py +++ b/norma/migrations/0003_auto_20150906_0239.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/norma/migrations/0004_auto_20150907_0004.py b/norma/migrations/0004_auto_20150907_0004.py index 961acc32c..9a716cabc 100644 --- a/norma/migrations/0004_auto_20150907_0004.py +++ b/norma/migrations/0004_auto_20150907_0004.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/norma/migrations/0005_auto_20150915_1141.py b/norma/migrations/0005_auto_20150915_1141.py index 67ed2e0a1..6d9798f23 100644 --- a/norma/migrations/0005_auto_20150915_1141.py +++ b/norma/migrations/0005_auto_20150915_1141.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/norma/urls.py b/norma/urls.py index a27a6b879..69199c2c3 100644 --- a/norma/urls.py +++ b/norma/urls.py @@ -1,6 +1,6 @@ -from django.conf.urls import url, include +from django.conf.urls import include, url -from norma.views import NormaIncluirView, tipo_norma_crud, assunto_norma_crud +from norma.views import NormaIncluirView, assunto_norma_crud, tipo_norma_crud urlpatterns = [ # url(r'^norma/', include(norma_url_patterns, diff --git a/painel/migrations/0001_initial.py b/painel/migrations/0001_initial.py index a19a4efeb..3b2dfa3c1 100644 --- a/painel/migrations/0001_initial.py +++ b/painel/migrations/0001_initial.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/parlamentares/migrations/0001_initial.py b/parlamentares/migrations/0001_initial.py index 4e176b045..152a92f82 100644 --- a/parlamentares/migrations/0001_initial.py +++ b/parlamentares/migrations/0001_initial.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/parlamentares/migrations/0002_auto_20150729_1310.py b/parlamentares/migrations/0002_auto_20150729_1310.py index 1cb4c1188..102db958e 100644 --- a/parlamentares/migrations/0002_auto_20150729_1310.py +++ b/parlamentares/migrations/0002_auto_20150729_1310.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/parlamentares/migrations/0003_auto_20150729_1717.py b/parlamentares/migrations/0003_auto_20150729_1717.py index 066201542..946e5bb4c 100644 --- a/parlamentares/migrations/0003_auto_20150729_1717.py +++ b/parlamentares/migrations/0003_auto_20150729_1717.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/parlamentares/migrations/0004_auto_20150929_1425.py b/parlamentares/migrations/0004_auto_20150929_1425.py index 7a19d3765..ffb8ca672 100644 --- a/parlamentares/migrations/0004_auto_20150929_1425.py +++ b/parlamentares/migrations/0004_auto_20150929_1425.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/parlamentares/migrations/0005_parlamentar_fotografia.py b/parlamentares/migrations/0005_parlamentar_fotografia.py index c81ab2ef2..db67012a2 100644 --- a/parlamentares/migrations/0005_parlamentar_fotografia.py +++ b/parlamentares/migrations/0005_parlamentar_fotografia.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models + import parlamentares.models diff --git a/parlamentares/migrations/0006_auto_20151119_1318.py b/parlamentares/migrations/0006_auto_20151119_1318.py index f220639a4..443dbcced 100644 --- a/parlamentares/migrations/0006_auto_20151119_1318.py +++ b/parlamentares/migrations/0006_auto_20151119_1318.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/protocoloadm/migrations/0001_initial.py b/protocoloadm/migrations/0001_initial.py index a4a71a154..a9f0277e4 100644 --- a/protocoloadm/migrations/0001_initial.py +++ b/protocoloadm/migrations/0001_initial.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/protocoloadm/migrations/0002_auto_20150729_1717.py b/protocoloadm/migrations/0002_auto_20150729_1717.py index 6e3073134..253bbb0eb 100644 --- a/protocoloadm/migrations/0002_auto_20150729_1717.py +++ b/protocoloadm/migrations/0002_auto_20150729_1717.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/protocoloadm/migrations/0003_documentoacessorioadministrativo_texto_integral.py b/protocoloadm/migrations/0003_documentoacessorioadministrativo_texto_integral.py index 0d80f3f8d..7d41c8776 100644 --- a/protocoloadm/migrations/0003_documentoacessorioadministrativo_texto_integral.py +++ b/protocoloadm/migrations/0003_documentoacessorioadministrativo_texto_integral.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models + import protocoloadm.models diff --git a/protocoloadm/migrations/0004_auto_20151007_1035.py b/protocoloadm/migrations/0004_auto_20151007_1035.py index 909f48138..5be623a0f 100644 --- a/protocoloadm/migrations/0004_auto_20151007_1035.py +++ b/protocoloadm/migrations/0004_auto_20151007_1035.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models + import protocoloadm.models diff --git a/protocoloadm/migrations/0005_auto_20151008_0744.py b/protocoloadm/migrations/0005_auto_20151008_0744.py index a7e93611a..799a501e6 100644 --- a/protocoloadm/migrations/0005_auto_20151008_0744.py +++ b/protocoloadm/migrations/0005_auto_20151008_0744.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models + import protocoloadm.models diff --git a/sapl/settings.py b/sapl/settings.py index 9f57f65d1..52d0b2b53 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -60,8 +60,7 @@ INSTALLED_APPS = ( 'sass_processor', ) if DEBUG: - # INSTALLED_APPS += ('debug_toolbar',) - pass + INSTALLED_APPS += ('debug_toolbar',) MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', diff --git a/sessao/migrations/0001_initial.py b/sessao/migrations/0001_initial.py index 4151a7610..fe4d09a66 100644 --- a/sessao/migrations/0001_initial.py +++ b/sessao/migrations/0001_initial.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/sessao/migrations/0002_auto_20150729_1450.py b/sessao/migrations/0002_auto_20150729_1450.py index df29f69e5..6212c5f3f 100644 --- a/sessao/migrations/0002_auto_20150729_1450.py +++ b/sessao/migrations/0002_auto_20150729_1450.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/sessao/migrations/0003_remove_sessaoplenaria_tipo_expediente.py b/sessao/migrations/0003_remove_sessaoplenaria_tipo_expediente.py index 4dcc588c1..71e92b3d2 100644 --- a/sessao/migrations/0003_remove_sessaoplenaria_tipo_expediente.py +++ b/sessao/migrations/0003_remove_sessaoplenaria_tipo_expediente.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/sessao/migrations/0004_auto_20150806_1614.py b/sessao/migrations/0004_auto_20150806_1614.py index 03d6f8cbb..aaa5fe6c9 100644 --- a/sessao/migrations/0004_auto_20150806_1614.py +++ b/sessao/migrations/0004_auto_20150806_1614.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models + import sessao.models diff --git a/sessao/migrations/0005_remove_presencaordemdia_data_ordem.py b/sessao/migrations/0005_remove_presencaordemdia_data_ordem.py index 4064bdd68..8d73c542e 100644 --- a/sessao/migrations/0005_remove_presencaordemdia_data_ordem.py +++ b/sessao/migrations/0005_remove_presencaordemdia_data_ordem.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/sessao/migrations/0006_auto_20150929_1425.py b/sessao/migrations/0006_auto_20150929_1425.py index 429442f2b..4b438a29f 100644 --- a/sessao/migrations/0006_auto_20150929_1425.py +++ b/sessao/migrations/0006_auto_20150929_1425.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/sessao/migrations/0007_auto_20150929_1426.py b/sessao/migrations/0007_auto_20150929_1426.py index 6233ceb00..d97091ecb 100644 --- a/sessao/migrations/0007_auto_20150929_1426.py +++ b/sessao/migrations/0007_auto_20150929_1426.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/sessao/migrations/0008_auto_20151005_0814.py b/sessao/migrations/0008_auto_20151005_0814.py index d48449e4c..95cc5532a 100644 --- a/sessao/migrations/0008_auto_20151005_0814.py +++ b/sessao/migrations/0008_auto_20151005_0814.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/sessao/migrations/0009_auto_20151005_0934.py b/sessao/migrations/0009_auto_20151005_0934.py index dfb988970..b4d6819d6 100644 --- a/sessao/migrations/0009_auto_20151005_0934.py +++ b/sessao/migrations/0009_auto_20151005_0934.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): From 02c2af892d63af6a68f646fdb2028eacd5fbb7f8 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 20 Nov 2015 18:32:35 -0200 Subject: [PATCH 17/23] migrations files --- .../migrations/0022_auto_20151120_1503.py | 33 +++++++++++++++++ .../migrations/0023_auto_20151120_1529.py | 29 +++++++++++++++ .../migrations/0024_auto_20151120_1814.py | 37 +++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 compilacao/migrations/0022_auto_20151120_1503.py create mode 100644 compilacao/migrations/0023_auto_20151120_1529.py create mode 100644 compilacao/migrations/0024_auto_20151120_1814.py diff --git a/compilacao/migrations/0022_auto_20151120_1503.py b/compilacao/migrations/0022_auto_20151120_1503.py new file mode 100644 index 000000000..15eee6015 --- /dev/null +++ b/compilacao/migrations/0022_auto_20151120_1503.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import datetime + +from django.db import migrations, models +from django.utils.timezone import utc + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0021_auto_20151119_1617'), + ] + + operations = [ + migrations.RemoveField( + model_name='publicacao', + name='timestamp', + ), + migrations.AddField( + model_name='publicacao', + name='created', + field=models.DateTimeField(verbose_name='created', auto_now_add=True, default=datetime.datetime(2015, 11, 20, 17, 3, 45, 347063, tzinfo=utc)), + preserve_default=False, + ), + migrations.AddField( + model_name='publicacao', + name='modified', + field=models.DateTimeField(verbose_name='modified', default=datetime.datetime(2015, 11, 20, 17, 3, 51, 67108, tzinfo=utc), auto_now=True), + preserve_default=False, + ), + ] diff --git a/compilacao/migrations/0023_auto_20151120_1529.py b/compilacao/migrations/0023_auto_20151120_1529.py new file mode 100644 index 000000000..1a78f7212 --- /dev/null +++ b/compilacao/migrations/0023_auto_20151120_1529.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import datetime + +from django.db import migrations, models +from django.utils.timezone import utc + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0022_auto_20151120_1503'), + ] + + operations = [ + migrations.AddField( + model_name='vide', + name='created', + field=models.DateTimeField(verbose_name='created', auto_now_add=True, default=datetime.datetime(2015, 11, 20, 17, 29, 27, 32283, tzinfo=utc)), + preserve_default=False, + ), + migrations.AddField( + model_name='vide', + name='modified', + field=models.DateTimeField(verbose_name='modified', auto_now=True, default=datetime.datetime(2015, 11, 20, 17, 29, 31, 856683, tzinfo=utc)), + preserve_default=False, + ), + ] diff --git a/compilacao/migrations/0024_auto_20151120_1814.py b/compilacao/migrations/0024_auto_20151120_1814.py new file mode 100644 index 000000000..47d696f33 --- /dev/null +++ b/compilacao/migrations/0024_auto_20151120_1814.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import datetime + +from django.db import migrations, models +from django.utils.timezone import utc + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0023_auto_20151120_1529'), + ] + + operations = [ + migrations.RemoveField( + model_name='nota', + name='data_criacao', + ), + migrations.RemoveField( + model_name='vide', + name='data_criacao', + ), + migrations.AddField( + model_name='nota', + name='created', + field=models.DateTimeField(auto_now_add=True, default=datetime.datetime(2015, 11, 20, 20, 13, 57, 385520, tzinfo=utc), verbose_name='created'), + preserve_default=False, + ), + migrations.AddField( + model_name='nota', + name='modified', + field=models.DateTimeField(auto_now=True, default=datetime.datetime(2015, 11, 20, 20, 14, 3, 360297, tzinfo=utc), verbose_name='modified'), + preserve_default=False, + ), + ] From 4766497356691023950cff20eabd3eabdc55781f Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Thu, 26 Nov 2015 01:15:11 -0200 Subject: [PATCH 18/23] implement create e update Nota --- compilacao/forms.py | 116 +++++++ .../migrations/0025_auto_20151122_1744.py | 24 ++ .../migrations/0026_auto_20151122_1756.py | 28 ++ compilacao/models.py | 20 +- compilacao/urls.py | 12 + compilacao/views.py | 132 +++++++- sapl/settings.py | 3 +- static/img/down_arrow_select.jpg | Bin 0 -> 682 bytes static/img/hand-note.png | Bin 0 -> 502 bytes static/js/compilacao.js | 244 -------------- static/js/compilacao_edit.js | 254 +++++++++++++++ static/js/compilacao_notas.js | 91 ++++++ static/js/compilacao_view.js | 40 +++ static/styles/compilacao.scss | 302 ++++++++++++++++-- templates/compilacao/edit.html | 1 + templates/compilacao/edit_bloco.html | 13 +- templates/compilacao/index.html | 74 +---- templates/compilacao/index_bloco.html | 97 ++++-- .../compilacao/index_bloco_alteracao.html | 4 +- templates/compilacao/nota_ajaxform.html | 3 + 20 files changed, 1082 insertions(+), 376 deletions(-) create mode 100644 compilacao/migrations/0025_auto_20151122_1744.py create mode 100644 compilacao/migrations/0026_auto_20151122_1756.py create mode 100644 static/img/down_arrow_select.jpg create mode 100644 static/img/hand-note.png create mode 100644 static/js/compilacao_edit.js create mode 100644 static/js/compilacao_notas.js create mode 100644 static/js/compilacao_view.js create mode 100644 templates/compilacao/nota_ajaxform.html diff --git a/compilacao/forms.py b/compilacao/forms.py index 6cfbbd873..3842bf340 100644 --- a/compilacao/forms.py +++ b/compilacao/forms.py @@ -1,8 +1,124 @@ +from crispy_forms.helper import FormHelper +from crispy_forms.layout import Layout, Fieldset, ButtonHolder, Submit, Field,\ + Div, Column, Row, Hidden, Button from django import forms +from django.core.urlresolvers import reverse +from django.forms.models import ModelForm from django.utils.translation import ugettext_lazy as _ +from compilacao.models import Nota, TipoNota, Dispositivo +import sapl + class UpLoadImportFileForm(forms.Form): import_file = forms.FileField( required=True, label=_('Arquivo formato ODF para Importanção')) + + +def get_tipos_nota(): + return [(t.id, t.sigla + ' - ' + t.nome) for t in TipoNota.objects.all()] + + +class NotaForm(ModelForm): + NPRIV = 1 + NSTRL = 2 + NINST = 3 + NPUBL = 4 + + PUBLICIDADE_CHOICES = ( + # Only the owner of the note has visibility. + (NPRIV, _('Nota Privada')), + # All of the same group have visibility. + (NSTRL, _('Nota Setorial')), + # All authenticated users have visibility. + (NINST, _('Nota Institucional')), + # All users have visibility. + (NPUBL, _('Nota Pública')), + ) + + titulo = forms.CharField(label=' ', required=False) + texto = forms.CharField(label='', widget=forms.Textarea) + url_externa = forms.URLField(label='', required=False) + + publicidade = forms.ChoiceField( + required=True, + label='Publicidade', + choices=PUBLICIDADE_CHOICES, + widget=forms.Select(attrs={'class': 'selector'})) + + tipo = forms.ModelChoiceField( + required=False, + label='Tipo da Nota', + queryset=TipoNota.objects.all(), + empty_label=None) + + publicacao = forms.DateField(label=u'Publicação', + input_formats=['%d/%m/%Y'], + required=True, + widget=forms.DateInput( + format='%d/%m/%Y')) + efetividade = forms.DateField(label=u'Efetividade', + input_formats=['%d/%m/%Y'], + required=True, + widget=forms.DateInput( + format='%d/%m/%Y')) + dispositivo = forms.ModelChoiceField(queryset=Dispositivo.objects.all(), + widget=forms.HiddenInput()) + pk = forms.IntegerField(widget=forms.HiddenInput(), + required=False) + + class Meta: + model = Nota + fields = ['titulo', + 'texto', + 'url_externa', + 'publicidade', + 'publicacao', + 'efetividade', + 'tipo', + 'dispositivo', + 'pk' + ] + + def __init__(self, *args, **kwargs): + + row1 = sapl.layout.to_row([ + ('tipo', 4), + ]) + row1.append( + Column( + Field( + 'titulo', + placeholder=_('Título da Nota (opcional)') + ), + css_class='columns large-8')) + + row3 = sapl.layout.to_row([ + ('publicidade', 3), + ('publicacao', 3), + ('efetividade', 3), + (Button('submit', 'Salvar', + css_class='button primary'), 3) + ]) + + self.helper = FormHelper() + self.helper.layout = Layout( + row1, + Field('texto', placeholder=_('Adicionar Nota')), + Field('url_externa', placeholder=_('URL Externa (opcional)')), + row3 + ) + + kwargs.pop('norma_id') + dispositivo_id = kwargs.pop('dispositivo_id') + if 'pk' in kwargs: + pk = kwargs.pop('pk') + else: + pk = '' + + super(NotaForm, self).__init__(*args, **kwargs) + + self.fields['dispositivo'].initial = dispositivo_id + if pk: + self.fields['pk'].initial = pk diff --git a/compilacao/migrations/0025_auto_20151122_1744.py b/compilacao/migrations/0025_auto_20151122_1744.py new file mode 100644 index 000000000..1b69eb301 --- /dev/null +++ b/compilacao/migrations/0025_auto_20151122_1744.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0024_auto_20151120_1814'), + ] + + operations = [ + migrations.RenameField( + model_name='nota', + old_name='efetifidade', + new_name='efetividade', + ), + migrations.AlterField( + model_name='nota', + name='dispositivo', + field=models.ForeignKey(to='compilacao.Dispositivo', related_name='notas', verbose_name='Dispositivo da Nota'), + ), + ] diff --git a/compilacao/migrations/0026_auto_20151122_1756.py b/compilacao/migrations/0026_auto_20151122_1756.py new file mode 100644 index 000000000..9d75c3f91 --- /dev/null +++ b/compilacao/migrations/0026_auto_20151122_1756.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0025_auto_20151122_1744'), + ] + + operations = [ + migrations.AlterModelOptions( + name='nota', + options={'verbose_name': 'Nota', 'ordering': ['publicacao'], 'verbose_name_plural': 'Notas'}, + ), + migrations.AddField( + model_name='nota', + name='titulo', + field=models.CharField(verbose_name='Título', max_length=100, default=''), + ), + migrations.AlterField( + model_name='nota', + name='texto', + field=models.TextField(verbose_name='Texto'), + ), + ] diff --git a/compilacao/models.py b/compilacao/models.py index baaa77dd1..076df95e0 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -256,7 +256,7 @@ class TipoDispositivo(BaseModel): return self.nome def permitido_inserir_in( - self, base, include_relative_autos=True, perfil_pk=None): + self, pai_relativo, include_relative_autos=True, perfil_pk=None): if not perfil_pk: perfis = PerfilEstruturalTextosNormativos.objects.filter( @@ -267,7 +267,7 @@ class TipoDispositivo(BaseModel): perfil_pk = perfis[0].pk - pp = self.possiveis_pais.filter(pai=base, perfil_id=perfil_pk) + pp = self.possiveis_pais.filter(pai=pai_relativo, perfil_id=perfil_pk) if pp.exists(): if not include_relative_autos: if pp[0].filho_de_insercao_automatica: @@ -1051,6 +1051,7 @@ class Nota(TimestampedMixin): NSTRL = 2 NINST = 3 NPUBL = 4 + PUBLICIDADE_CHOICES = ( # Only the owner of the note has visibility. (NPRIV, _('Nota Privada')), @@ -1062,19 +1063,25 @@ class Nota(TimestampedMixin): (NPUBL, _('Nota Pública')), ) - texto = models.TextField(verbose_name=_('Texto da Nota')) + titulo = models.CharField( + verbose_name=_('Título'), + max_length=100, + default='', + blank=True) + texto = models.TextField(verbose_name=_('Texto')) url_externa = models.CharField( max_length=1024, blank=True, verbose_name=_('Url externa')) publicacao = models.DateTimeField(verbose_name=_('Data de Publicação')) - efetifidade = models.DateTimeField(verbose_name=_('Data de Efeito')) + efetividade = models.DateTimeField(verbose_name=_('Data de Efeito')) tipo = models.ForeignKey(TipoNota, verbose_name=_('Tipo da Nota')) dispositivo = models.ForeignKey( Dispositivo, - verbose_name=_('Dispositivo da Nota')) + verbose_name=_('Dispositivo da Nota'), + related_name='notas') owner = models.ForeignKey(User, verbose_name=_('Dono da Nota')) publicidade = models.PositiveSmallIntegerField( @@ -1084,9 +1091,10 @@ class Nota(TimestampedMixin): class Meta: verbose_name = _('Nota') verbose_name_plural = _('Notas') + ordering = ['-publicacao', '-modified'] def __str__(self): return '%s: %s' % ( self.tipo, - self.PUBLICIDADE_CHOICES[self.publicidade][1] + self.get_publicidade_display() ) diff --git a/compilacao/urls.py b/compilacao/urls.py index d59058411..7a3c2b012 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -22,6 +22,18 @@ urlpatterns_compilacao = [ url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/actions', views.ActionsEditView.as_view(), name='dispositivo_actions'), + url(r'^(?P[0-9]+)/compilacao/' + '(?P[0-9]+)/nota/create$', + views.NotasCreateView.as_view(), name='nota_create'), + + url(r'^(?P[0-9]+)/compilacao/' + '(?P[0-9]+)/nota/(?P[0-9]+)/edit$', + views.NotasEditView.as_view(), name='nota_edit'), + + url(r'^(?P[0-9]+)/compilacao/' + '(?P[0-9]+)/nota/delete$', + views.NotasDeleteView.as_view(), name='nota_delete'), + ] urlpatterns = [ diff --git a/compilacao/views.py b/compilacao/views.py index 28000547a..2702a8f9d 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -2,24 +2,29 @@ from collections import OrderedDict from datetime import datetime, timedelta from os.path import sys +from django.contrib.auth.models import User from django.core.signing import Signer +from django.core.urlresolvers import reverse from django.db.models import Q -from django.http.response import JsonResponse +from django.http.response import JsonResponse, HttpResponse from django.shortcuts import render from django.utils.dateparse import parse_date from django.utils.translation import ugettext_lazy as _ from django.views.generic.base import TemplateView -from django.views.generic.edit import FormMixin +from django.views.generic.edit import FormMixin, UpdateView from django.views.generic.list import ListView +from vanilla.model_views import CreateView +from compilacao import forms from compilacao.file2dispositivo import Parser -from compilacao.forms import UpLoadImportFileForm +from compilacao.forms import NotaForm from compilacao.models import (Dispositivo, PerfilEstruturalTextosNormativos, TipoDispositivo, TipoNota, TipoPublicacao, - TipoVide, VeiculoPublicacao) + TipoVide, VeiculoPublicacao, Nota) from norma.models import NormaJuridica from sapl.crud import build_crud + DISPOSITIVO_SELECT_RELATED = ( 'tipo_dispositivo', 'norma_publicada', @@ -149,7 +154,8 @@ class CompilacaoView(ListView): return Dispositivo.objects.filter( ordem__gt=0, norma_id=self.kwargs['norma_id'] - ).select_related(*DISPOSITIVO_SELECT_RELATED) + ).select_related(*DISPOSITIVO_SELECT_RELATED).prefetch_related( + 'notas',) def get_vigencias(self): itens = Dispositivo.objects.filter( @@ -272,7 +278,7 @@ class CompilacaoEditView(CompilacaoView, FormMixin): pk_view = 0 def post(self, request, *args, **kwargs): - form = UpLoadImportFileForm(request.POST, request.FILES) + form = forms.UpLoadImportFileForm(request.POST, request.FILES) message = "Arquivo Submetido com sucesso" self.object_list = self.get_queryset() @@ -312,7 +318,7 @@ class CompilacaoEditView(CompilacaoView, FormMixin): def get(self, request, *args, **kwargs): self.object_list = self.get_queryset() - form_class = UpLoadImportFileForm + form_class = forms.UpLoadImportFileForm self.form = self.get_form(form_class) context = self.get_context_data( object_list=self.object_list, @@ -739,8 +745,8 @@ class ActionsEditMixin(object): def render_to_json_response(self, context, **response_kwargs): - test = getattr(self, context['action']) - return JsonResponse(test(context), safe=False) + action = getattr(self, context['action']) + return JsonResponse(action(context), safe=False) def delete_item_dispositivo(self, context): return self.delete_bloco_dispositivo(context) @@ -778,7 +784,8 @@ class ActionsEditMixin(object): parents = [base, ] + base.get_parents() tipos_dp_auto_insert = tipo.filhos_permitidos.filter( - filho_de_insercao_automatica=True) + filho_de_insercao_automatica=True, + perfil_id=context['perfil_pk']) count_auto_insert = 0 for tipoauto in tipos_dp_auto_insert: @@ -793,9 +800,6 @@ class ActionsEditMixin(object): else: count_auto_insert += 1 - ordem = base.criar_espaco( - espaco_a_criar=1 + count_auto_insert, local=local_add) - dp_irmao = None dp_pai = None for dp in parents: @@ -838,6 +842,28 @@ class ActionsEditMixin(object): else: dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) + # verificar se existe restrição de quantidade de itens + if dp.dispositivo_pai: + pp = dp.tipo_dispositivo.possiveis_pais.filter( + pai_id=dp.dispositivo_pai.tipo_dispositivo_id, + perfil_id=context['perfil_pk']) + + if pp.exists() and pp[0].quantidade_permitida >= 0: + qtd_existente = Dispositivo.objects.filter( + norma_id=dp.norma_id, + tipo_dispositivo_id=dp.tipo_dispositivo_id).count() + + if qtd_existente >= pp[0].quantidade_permitida: + return {'pk': base.pk, + 'pai': [base.dispositivo_pai.pk, ], + 'alert': str(_('Limite de inserções de ' + 'dispositivos deste tipo ' + 'foi excedido.')) + } + + ordem = base.criar_espaco( + espaco_a_criar=1 + count_auto_insert, local=local_add) + dp.rotulo = dp.rotulo_padrao() dp.ordem = ordem dp.incrementar_irmaos(variacao, [local_add, ]) @@ -846,6 +872,7 @@ class ActionsEditMixin(object): dp.save() dp_auto_insert = None + # Inserção automática if count_auto_insert: dp_pk = dp.pk @@ -1055,3 +1082,82 @@ class ActionsEditView(ActionsEditMixin, TemplateView): context['perfil_pk'] = self.request.session['perfil_estrutural'] return self.render_to_json_response(context, **response_kwargs) + + +class NotasCreateView(FormMixin, CreateView): + template_name = 'compilacao/nota_ajaxform.html' + form_class = forms.NotaForm + + def get(self, request, *args, **kwargs): + + if 'action' in request.GET and request.GET['action'] == 'modelo_nota': + tn = TipoNota.objects.get(pk=request.GET['id_tipo']) + return HttpResponse(tn.modelo) + + return super(NotasCreateView, self).get(request, *args, **kwargs) + + def get_form_kwargs(self): + kwargs = super(NotasCreateView, self).get_form_kwargs() + kwargs.update(self.kwargs) + return kwargs + + def post(self, request, *args, **kwargs): + try: + form = NotaForm(request.POST, request.FILES, **kwargs) + + if form.is_valid(): + nt = form.save(commit=False) + # TODO: Implementar tratamento do usuário. + nt.owner_id = User.objects.order_by('id')[:1][0].pk + nt.save() + self.kwargs['pk'] = nt.pk + return self.form_valid(form) + else: + return self.form_invalid(form) + except Exception as e: + print(e) + return HttpResponse("post") + + def get_success_url(self): + return reverse( + 'dispositivo', kwargs={ + 'norma_id': self.kwargs[ + 'norma_id'], + 'dispositivo_id': self.kwargs[ + 'dispositivo_id']}) + + +class NotasEditView(UpdateView): + model = Nota + template_name = 'compilacao/nota_ajaxform.html' + form_class = forms.NotaForm + + def get(self, request, *args, **kwargs): + try: + # TODO: permitir edição apenas das notas do usuário conectado + # TODO: tratar revalidação no método post + # TODO: não mostrar botão de edição na interface + if 'action' in request.GET and request.GET['action'] == 'modelo_nota': + tn = TipoNota.objects.get(pk=request.GET['id_tipo']) + return HttpResponse(tn.modelo) + + return super(NotasEditView, self).get(request, *args, **kwargs) + except Exception as e: + print(e) + + def get_form_kwargs(self): + kwargs = super(NotasEditView, self).get_form_kwargs() + kwargs.update(self.kwargs) + return kwargs + + def get_success_url(self): + return reverse( + 'dispositivo', kwargs={ + 'norma_id': self.kwargs[ + 'norma_id'], + 'dispositivo_id': self.kwargs[ + 'dispositivo_id']}) + + +class NotasDeleteView(FormMixin, CreateView): + pass diff --git a/sapl/settings.py b/sapl/settings.py index 52d0b2b53..998d10b7d 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -60,7 +60,8 @@ INSTALLED_APPS = ( 'sass_processor', ) if DEBUG: - INSTALLED_APPS += ('debug_toolbar',) + # INSTALLED_APPS += ('debug_toolbar',) + pass MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', diff --git a/static/img/down_arrow_select.jpg b/static/img/down_arrow_select.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a3a75352de657ad3726610299bf186b44e66c699 GIT binary patch literal 682 zcmex=ToBmrb9I4~*(3Za|fAj}BV#md42HwNewMF9sx$3O*x#)XL+3okzWe~W>K znGxtfWs_otTWB0TU?OApD=jN-54AR^=2~A2KH>Gy&-}Crq;G%;MR(xdNzJP<_!JB%x LnM5IO~|*0<%SEE3>hist8>{cwGrq2R9C}fII|4_ zBVlB%#emrlMXrMuzp-ML+ZFYeG(gH zP2hCaZ_Q#r%Q6aKC%LVw%iyvi5(znLwnGtVTqRZ5mhj4=`OO*XzWLoJy{YAvN1;s4 zXJ?J7_|!vKwQSH)6YZNWcxYTfVwa*nO4c 1) { - if(_action.endsWith('perfil')) { - url = '&perfil_pk='+_perfil_pk; - } - else { - editortype = str[1]; - SetCookie("editortype", editortype, 30) - } - } - url = pk_refresh+'/refresh?edit='+pk_edit+url; - } - else if (_action.startsWith('add_')) { - - url = pk_refresh+'/actions?action='+_action; - url += '&tipo_pk='+_tipo_pk; - url += '&variacao='+_variacao; - - $("#message_block").css("display", "block"); - - } - else if (_action.startsWith('delete_')) { - url = pk_refresh+'/actions?action='+_action; - $("#message_block").css("display", "block"); - } - - $.get(url).done(function( data ) { - if ( _action == null || _action.startsWith('refresh')) { - - if (flag_refresh_all) { - if (flag_actions_vibible) - clearEditSelected(); - - $( '#dpt' + pk_refresh ).html( data); - } - else { - //console.log(pk_refresh + ' - '+pk_edit) - if (flag_actions_vibible == null || flag_actions_vibible) - clearEditSelected(); - - $( '#dpt' + pk_refresh ).prepend( data ); - } - - reloadFunctionClicks(); - - var _editortype = editortype; - if ( $('.edt-'+_editortype).length == 0) { - _editortype = 'construct'; - } - - if ( _editortype == 'tinymce' ) { - initTinymce(); - } - else if (_editortype == 'textarea') { - $('.csform form').submit(onSubmitEditForm); - } - else if (_editortype == 'construct') { - $('.csform .btn-salvar').parent().addClass("displaynone"); - $('.csform .btn-salvar, .csform .fields').addClass("displaynone"); - $('#dpt'+pk_refresh).css('min-height', $('.actions_right').height()*2); - $('.actions_inserts').removeClass('menu_flutuante'); - } - else if (_editortype == 'detail') { - $('.csform .btn-salvar').parent().removeClass("displaynone"); - $('.csform .btn-salvar, .csform .fields').removeClass("displaynone"); - $('#dpt'+pk_refresh).css('min-height', $('.actions_right').height()*2); - $('.actions_inserts').addClass('menu_flutuante'); - } - - $(".edt-"+_editortype).addClass('selected'); - //$(".container").addClass('class_color_container'); - - if (flag_actions_vibible == null || flag_actions_vibible) { - $('html, body').animate({ - scrollTop: $('#dpt' + pk_edit ).offset().top - window.innerHeight / 10 - }, 300); - $('#dpt'+pk_edit).addClass('dpt-selected'); - } - } - - else if (_action == 'add_next' || _action == 'add_in') { - clearEditSelected(); - if (data.pk != null) { - refreshScreenFocusPk(data); - } - else { - alert('Erro na inserção!'); - } - } - else if (_action.startsWith('delete_')) { - $("#message_block").css("display", "block"); - clearEditSelected(); - if (data.pk != null) { - refreshScreenFocusPk(data); - } - else { - alert('Erro exclusão!'); - } - } - else { - clearEditSelected(); - reloadFunctionClicks(); - } - }).always(function() { - $("#message_block").css("display", "none"); - }); -} - -function refreshScreenFocusPk(data) { - - for (var pai = 0; pai < data.pai.length; pai++) - if (data.pai[pai] != -1) { - clickUpdateDispositivo(null, data.pai[pai], data.pk, 'refresh', pai == 0, true); - } - else { - href = location.href.split('#')[0] - location.href = href+'#'+data.pk - location.reload(true) - } -} - -function clearEditSelected() { - $(".container").removeClass('class_color_container'); - tinymce.remove(); - $('.dpt-selected').removeClass('dpt-selected'); - $('.dpt').css('min-height', ''); - $('.csform').remove(); -} - -function reloadFunctionClicks() { - $('.dpt .de, .btn-action, .btn-edit').off(); - - $('.dpt .de, .btn-edit').on('click', clickEditDispositivo); - - $('.btn-action').on('click', clickUpdateDispositivo); - - $('#editdi_texto').focus(); -} - function initTinymce() { tinymce.init({ @@ -239,7 +15,6 @@ function initTinymce() { }); } -//cookies function SetCookie(cookieName,cookieValue,nDays) { var today = new Date(); var expire = new Date(); @@ -258,22 +33,3 @@ function ReadCookie(cookieName) { if (ind1==-1) ind1=theCookie.length; return unescape(theCookie.substring(ind+cookieName.length+2,ind1)); } - -$(document).ready(function() { - - editortype = ReadCookie("editortype") - - if (editortype == null || editortype == "") { - editortype = "textarea" - SetCookie("editortype", editortype, 30) - } - - reloadFunctionClicks(); - $("#message_block").css("display", "none"); - - href = location.href.split('#') - if (href.length == 2) { - clickUpdateDispositivo(null, href[1], href[1], 'refresh', true); - } - -}); diff --git a/static/js/compilacao_edit.js b/static/js/compilacao_edit.js new file mode 100644 index 000000000..1c7cb9226 --- /dev/null +++ b/static/js/compilacao_edit.js @@ -0,0 +1,254 @@ + +var editortype = "textarea"; +var gets = 0; +var onSubmitEditForm = function(event) { + + var texto = ''; + var editorTiny = tinymce.get('editdi_texto'); + + if (editorTiny != null) + texto = editorTiny.getContent(); + else + texto = $('#editdi_texto').val(); + + var formData = { + 'csrfmiddlewaretoken' : $('input[name=csrfmiddlewaretoken]').val(), + 'texto' : texto + }; + + var url = $('.csform form').attr( "action_ajax" ); + $("#message_block").css("display", "block"); + + $.post(url, formData) + .done(function(data) { + + if (typeof data == "string") { + $('.dpt-selected').html(data); + clearEditSelected(); + reloadFunctionClicks(); + return; + } + + clearEditSelected(); + + if (data.pk != null) + refreshScreenFocusPk(data); + else { + alert('Erro na inserção!'); + flag_refresh_all = false; + } + + }).always(function() { + $("#message_block").css("display", "none"); + }); + if (event != null) + event.preventDefault(); +} + + +var clickEditDispositivo = function(event) { + var _pk = event.currentTarget.getAttribute('pk'); + if ($('#dpt'+_pk).hasClass("dpt-selected")) { + clearEditSelected(); + return; + } + clearEditSelected(); + clickUpdateDispositivo(event); +} + +var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action, flag_actions_vibible, flag_refresh_all) { + + var pk_refresh = __pk_refresh; + var pk_edit = __pk_edit; + var _action = __action; + var _variacao = ''; + var _tipo_pk = ''; + var _perfil_pk = ''; + + if (event != null) { + pk_refresh = event.currentTarget.getAttribute('pk'); + _action = $(this).attr('action'); + _variacao = $(this).attr('variacao'); + _tipo_pk = $(this).attr('tipo_pk'); + _perfil_pk = $(this).attr('perfil_pk'); + } + + if (pk_edit == null) + pk_edit = pk_refresh; + + var url = ''; + if (_action == '') + return; + else if ( _action == null) { + url = pk_refresh+'/refresh?edit='+pk_edit; + } + else if (_action.startsWith('refresh')) { + var str = _action.split(':'); + if (str.length > 1) { + if(_action.endsWith('perfil')) { + url = '&perfil_pk='+_perfil_pk; + $("#message_block").css("display", "block"); + } + else { + editortype = str[1]; + SetCookie("editortype", editortype, 30) + } + } + url = pk_refresh+'/refresh?edit='+pk_edit+url; + + } + else if (_action.startsWith('add_')) { + + url = pk_refresh+'/actions?action='+_action; + url += '&tipo_pk='+_tipo_pk; + url += '&variacao='+_variacao; + + $("#message_block").css("display", "block"); + + } + else if (_action.startsWith('delete_')) { + var r = confirm("Confirma Exclusão deste dispositivo?"); + if (r == true) { + x = "You pressed OK!"; + } else { + return + } + url = pk_refresh+'/actions?action='+_action; + $("#message_block").css("display", "block"); + } + + $.get(url).done(function( data ) { + if ( _action == null || _action.startsWith('refresh')) { + + if (flag_refresh_all) { + if (flag_actions_vibible) + clearEditSelected(); + + $( '#dpt' + pk_refresh ).html( data); + } + else { + //console.log(pk_refresh + ' - '+pk_edit) + if (flag_actions_vibible == null || flag_actions_vibible) + clearEditSelected(); + + $( '#dpt' + pk_refresh ).prepend( data ); + } + + reloadFunctionClicks(); + + var _editortype = editortype; + if ( $('.edt-'+_editortype).length == 0) { + _editortype = 'construct'; + } + + if ( _editortype == 'tinymce' ) { + initTinymce(); + } + else if (_editortype == 'textarea') { + $('.csform form').submit(onSubmitEditForm); + } + else if (_editortype == 'construct') { + $('.csform .btn-salvar').parent().addClass("displaynone"); + $('.csform .btn-salvar, .csform .fields').addClass("displaynone"); + $('#dpt'+pk_refresh).css('min-height', $('.actions_right').height()*2); + $('.actions_inserts').removeClass('menu_flutuante'); + } + else if (_editortype == 'detail') { + $('.csform .btn-salvar').parent().removeClass("displaynone"); + $('.csform .btn-salvar, .csform .fields').removeClass("displaynone"); + $('#dpt'+pk_refresh).css('min-height', $('.actions_right').height()*2); + $('.actions_inserts').addClass('menu_flutuante'); + } + + $(".edt-"+_editortype).addClass('selected'); + //$(".container").addClass('class_color_container'); + + if (flag_actions_vibible == null || flag_actions_vibible) { + $('#dpt'+pk_edit).addClass('dpt-selected'); + $('html, body').animate({ + scrollTop: $('#dpt' + pk_edit ).offset().top - window.innerHeight / 10 + }, 300); + } + } + + else if (_action == 'add_next' || _action == 'add_in') { + clearEditSelected(); + if (data.pk != null) { + + if (data.alert != null) + alert(data.alert) + + refreshScreenFocusPk(data); + } + else { + alert('Erro na inserção!'); + } + } + else if (_action.startsWith('delete_')) { + $("#message_block").css("display", "block"); + clearEditSelected(); + if (data.pk != null) { + refreshScreenFocusPk(data); + } + else { + alert('Erro exclusão!'); + } + } + else { + clearEditSelected(); + reloadFunctionClicks(); + } + }).always(function() { + $("#message_block").css("display", "none"); + }); +} + +function refreshScreenFocusPk(data) { + + for (var pai = 0; pai < data.pai.length; pai++) + if (data.pai[pai] != -1) { + clickUpdateDispositivo(null, data.pai[pai], data.pk, 'refresh', pai == 0, true); + } + else { + href = location.href.split('#')[0] + location.href = href+'#'+data.pk + location.reload(true) + } +} + +function clearEditSelected() { + $(".container").removeClass('class_color_container'); + tinymce.remove(); + $('.dpt-selected').removeClass('dpt-selected'); + $('.dpt').css('min-height', ''); + $('.csform').remove(); +} + +function reloadFunctionClicks() { + $('.dpt .de, .btn-action, .btn-edit').off(); + + $('.dpt .de, .btn-edit').on('click', clickEditDispositivo); + + $('.btn-action').on('click', clickUpdateDispositivo); + + $('#editdi_texto').focus(); +} + +$(document).ready(function() { + + editortype = ReadCookie("editortype") + + if (editortype == null || editortype == "") { + editortype = "textarea" + SetCookie("editortype", editortype, 30) + } + + reloadFunctionClicks(); + $("#message_block").css("display", "none"); + + href = location.href.split('#') + if (href.length == 2) { + clickUpdateDispositivo(null, href[1], href[1], 'refresh', true); + } + +}); diff --git a/static/js/compilacao_notas.js b/static/js/compilacao_notas.js new file mode 100644 index 000000000..8688272c0 --- /dev/null +++ b/static/js/compilacao_notas.js @@ -0,0 +1,91 @@ + +function onEventsDneExec(pk) { + + $('html, body').animate({ + scrollTop: $('#dne' + pk ).offset().top - window.innerHeight / 5 + }, 300); + + $('.dateinput').fdatepicker({ + // TODO localize + format: 'dd/mm/yyyy', + language: 'pt', + endDate: '31/12/2100', + todayBtn: true + }); + + $('#dne'+pk+" select[name='tipo']").change(function(event) { + var url = ''; + url = 'compilacao/'+pk+'/nota/create?action=modelo_nota&id_tipo='+this.value; + $.get(url).done(function( data ) { + $('#dne'+pk+" textarea[name='texto']").val(data); + }); + }); + + $('#dne'+pk+" .button").click(onSubmitEditForm); +} + +var onSubmitEditForm = function(event) { + + var id_dispositivo = $('#id_dispositivo').val(); + var id_nota = $('#id_pk').val(); + var url = 'compilacao/'+id_dispositivo+'/nota/' + + if (id_nota == '') + url += 'create'; + else + url += id_nota+'/edit'; + + $.post( url, $('#dne'+id_dispositivo+" form").serialize(), function(data) { + + if (typeof data == "string") { + if (data.indexOf('= 0) { + $('#dne'+id_dispositivo+' .dne-form').html(data); + onEventsDneExec(id_dispositivo); + } + else { + $('#dne'+id_dispositivo+' .dne-form').closest('.dpt').html(data) + onReadyNotas(); + } + } + } + ); +} +function getFormNota(_this, _btn) { + + var id_dispositivo = $('.dne-exec .dne-form').closest('.dne').attr('pk'); + if (id_dispositivo != null) { + $('#dne'+id_dispositivo).removeClass('dne-exec'); + $('#dne'+id_dispositivo+' .dne-form').html(''); + } + + var url = ''; + if (_btn == 'btn-create') { + id_dispositivo = $(_this).attr('pk'); + url = 'compilacao/'+id_dispositivo+'/nota/create'; + } + else { + var id_nota = $(_this).attr('pk'); + id_dispositivo = $(_this).closest('.dn').attr('pk'); + url = 'compilacao/'+id_dispositivo+'/nota/'+id_nota+'/edit' + } + $('#dne'+id_dispositivo).addClass('dne-exec'); + $('#dne'+id_dispositivo).addClass('dne-exec'); + + $.get(url).done(function( data ) { + $('#dne'+id_dispositivo+' .dne-form').html(data); + onEventsDneExec(id_dispositivo); + }); +} +function onReadyNotas() { + $('.dne .btn-create').off(); + $('.dne .btn-edit').off(); + $('.dne .btn-create').click(function(){ + getFormNota(this, 'btn-create') + }); + $('.dn .btn-edit').click(function(){ + getFormNota(this, 'btn-edit') + }); +} +$(document).ready(function() { + onReadyNotas() +}); diff --git a/static/js/compilacao_view.js b/static/js/compilacao_view.js new file mode 100644 index 000000000..d196ef3e4 --- /dev/null +++ b/static/js/compilacao_view.js @@ -0,0 +1,40 @@ +$( window ).scroll(function() { + if (window.pageYOffset <= 180) + $( "section.vigencias" ).removeClass("fixed"); + else if (!$( "section.vigencias" ).hasClass("fixed")) + $( "section.vigencias" ).addClass("fixed"); +}); + +$(window).load(function() { + setTimeout(function() { + height = $( "section.vigencias" ).height(); + $('html, body').animate({ + scrollTop: window.pageYOffset - height - 55 + }, 300); + }, 100); +}); + +function textoMultiVigente(item) { + $(".cp .tipo-vigencias a").removeClass("selected") + $(item).addClass("selected") + $(".desativado").removeClass("displaynone"); + $(".link_alterador").removeClass("displaynone"); +} + +function textoVigente(item, link) { + $(".cp .tipo-vigencias a").removeClass("selected") + $(item).addClass("selected") + $(".desativado").addClass("displaynone"); + $(".link_alterador").removeClass("displaynone"); + if (!link) + $(".link_alterador").addClass("displaynone"); +} + +$(document).ready(function() { + $("#btn_font_menos").click(function() { + $(".dpt").css("font-size", "-=1"); + }); + $("#btn_font_mais").click(function() { + $(".dpt").css("font-size", "+=1"); + }); +}); diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index c1ca8d044..fbd590873 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -16,21 +16,49 @@ $color_actions_border: #CCC; -o-border-radius: $radius; border-radius: $radius; } +@mixin placeholder($color, $opacity, $fontsize, $fontweight) { + + &::-webkit-input-placeholder { + color: $color; + opacity: $opacity; + font-size:$fontsize; + font-weight: $fontweight; + } + &::-moz-placeholder { + color: $color; + opacity: $opacity; + font-size:$fontsize; + font-weight: $fontweight; + } + &::-moz-placeholder { + color: $color; + opacity: $opacity; + font-size:$fontsize; + font-weight: $fontweight; + } + &:-ms-input-placeholder { + color: $color; + opacity: $opacity; + font-size:$fontsize; + font-weight: $fontweight; + } +} + @mixin li_flutuante() { & > ul { transform: translateY(30px); - transition: transform 0.1s linear, - opacity 0.1s linear, - clip 0s 0.3s; + transition: transform 0.1s linear, opacity 0.1s linear, clip 0s 0.3s; clip: rect(0, 0, 0, 0); opacity: 0; position:absolute; margin-left: 0.5em; box-shadow: 0px 6px 18px rgba(0, 0, 0, 0.19), 0px 2px 6px rgba(0, 0, 0, 0.23); + -webkit-transition-delay: 0.4s; /* Safari */ + transition-delay: 0.4s; li { a { border-right: 0px !important; @@ -112,9 +140,20 @@ $color_actions_border: #CCC; .cp { + .desativado, .desativado * { + text-decoration: line-through; + color: #777 !important; + + table, table td { + border: 1px dotted #ccc; + } + } + .dpt { font-size:1em; transition: all 0.2s ease-in-out; + position: relative; + .ementa { padding: 4em 0em 3em 35%; @@ -169,6 +208,10 @@ $color_actions_border: #CCC; .artigo { font-size: 1.15em; float:left; + .dptt { + z-index: 98; + position: relative; + } } .caput { @@ -224,16 +267,223 @@ $color_actions_border: #CCC; color: #018 !important; } } - } /* and dpt */ - .desativado, .desativado * { - text-decoration: line-through; - color: #777 !important; + .dn { /* Notas de Dispositivo*/ + font-size: 0.8rem; + font-weight: normal; + line-height: 1rem; + position: relative; + p, ul { + font-size: 0.8rem; + font-weight: normal; + line-height: 1rem; + margin: 0 0 0 0; + list-style: none; + } + .dnl { /* Lista Notas de Dispositivo*/ + display: block; + margin-left: 15%; - table, table td { - border: 1px dotted #ccc; + .dnli { + margin-top: 0.5em; + border-top: 1px solid #c7e3d3; + display: block; + + ul { + transition: opacity 0.5s linear, clip 0s 0.3s; + clip: rect(0, 0, 0, 0); + opacity: 0; + position: absolute; + background: transparent; + right: 0; + padding: 0.5em 0.5em 0em 0.5em; + border: 1px solid #c7e3d3; + border-top: 0px; + + + } + + &:hover { + min-height: 2.5em; + ul { + transition: opacity 0.5s linear, clip 0s 0.3s; + clip: auto; + opacity: 1; + background: rgba(230,230,230, 0.9); + } + } + + li { + display: table-cell; + color: #aaa; + &.bullet { + padding: 0 0.333em; + padding-bottom: 0.2em; + } + + &:hover { + color: #787; + } + } + .ntitulo { + font-weight: bold; + color: #676; + font-size: 90%; + } + .ntexto { + color: #787; + } + .nowner { + color: #27AE60; + } + } + } } - } + + .dptt { + .dne { + position: relative; + display: block; + font-size: 0.8rem; + font-weight: normal; + line-height: 1rem; + text-align: left; + height: 0; + transform: scaleY(0); + transform-origin: top; + transition: all 0.3s ease; + * { + font-size: 0.8rem; + font-weight: normal; + line-height: 1rem; + } + + ul.btns-action { + position: absolute; + margin: 0 0 0 0; + display: table; + list-style: none; + clip: rect(0,0,0,0); + opacity: 0; + transition: opacity 1.5s linear, clip 1s linear; + transition-delay: 0s; + li { + display: table-cell; + background-color: #ddd; + border-radius: 50%; + a { + border-radius: 50%; + display: inline-block; + background: url(/static/img/hand-note.png) no-repeat 50% 50%; + padding: 1.2em 1.7em; + &:hover { + background-color: rgba(0, 150, 0, 0.1); + } + } + } + } + } + .dne-exec { + box-shadow: -4px 15px 15px rgba(0, 0, 0, 0.1), 0px 6px 6px rgba(0, 0, 0, 0.23); + @include background-top-down(#f5f5f5, #eee); + + transform: scaleY(1); + height: auto; + transition-delay: 0s; + margin: 1em 0 2em 0; + padding: 0em; + ul.btns-action { + display: none; + } + + .dne-form { + .asterisk { + color: transparent; + &::before { + color: red; + content: "\2b25"; + padding: 0.333em; + vertical-align: super; + } + } + fieldset { + border: 0px; + } + select { + background: url(/static/img/down_arrow_select.jpg) no-repeat right #ddd; + border: 0px; + outline:0px; + } + .row:first-of-type { + margin-top: 1em; + display: inline-block; + } + .input { + border: 0px; + border-bottom: 1px solid #ccc; + margin: 0 0 0 0 ; + padding: 0.5em; + background: #eee; + height: auto; + box-shadow: 0 0 0; + @include placeholder(#777, 1, 100%, normal); + &:focus { + background: #fafafa; + } + } + .textinput[name='titulo']{ + @extend .input; + font-size:130%; + font-weight: bold; + border-bottom: 0; + @include placeholder(#777, 1, 100%, bold); + } + + .textarea { + @extend .input; + resize: vertical; + font-weight: normal; + } + + .urlinput { + @extend .input; + margin-bottom: 1em; + } + + .button { + width: 100%; + margin-top: 1.6em; + height: 2.3125rem; + padding: 0; + } + } + } + &:hover { + .dne { + height: 3.2em; + transform: scaleY(1); + transition-delay: 1s; + + ul.btns-action { + clip: rect(-100px, 2000px, 2000px, -100px); + opacity: 1; + transition: opacity 0.5s linear, clip 0s 0.3s; + transition-delay: 0.5s; + li { + a { + } + } + } + } + .dne-exec { + transition-delay: 0s; + height: auto; + + } + } + + } + } /* and dpt */ .top-bar { line-height: 1.6rem; @@ -371,6 +621,7 @@ $color_actions_border: #CCC; } } + .bloco { display: block; clear: both; @@ -402,9 +653,7 @@ $color_actions_border: #CCC; display: block; } } - .btns-action { - opacity: 0; - } + } /* fim dpt */ .dpt-selected { @@ -488,10 +737,10 @@ $color_actions_border: #CCC; display: table-cell; vertical-align: top; &:hover { - background-color: rgba(0,0,0,0.08); + background-color: rgba(255, 255, 255, 0.5); & > a { text-shadow: 0 0 5px #777; - color: #ff0; + color: #0a5; } } } @@ -506,6 +755,10 @@ $color_actions_border: #CCC; font-size: 80%; text-align: right; z-index: 5; + display: table; + li { + display: table-cell; + } } .actions_parents { @@ -556,13 +809,13 @@ $color_actions_border: #CCC; left: 0; bottom: 0; display: inline-block; + border-top: 1px solid $color_actions_border; a { padding: 0 0.4em; } li { border: 0px; border-right: 1px solid $color_actions_border; - border-top: 1px solid $color_actions_border; } } @@ -688,9 +941,9 @@ $color_actions_border: #CCC; @include li_flutuante(); table-layout: fixed; } - &.opc_excluir { + &.menu_excluir { @include li_flutuante(); - table-layout: fixed; + display: block; position: static; @@ -727,7 +980,7 @@ $color_actions_border: #CCC; @include li_flutuante(); - &.opc_excluir { + &.menu_excluir { & > ul { li { &:first-child { @@ -738,14 +991,10 @@ $color_actions_border: #CCC; } } } - } } - } - - textarea { margin: 0; resize: vertical; @@ -775,7 +1024,7 @@ $color_actions_border: #CCC; } .selected { - background-color: rgba(0, 0, 0, 0.1); + background-color: rgba(255, 255, 255, 0.5); a { &:hover { color: $color_actions !important; @@ -799,6 +1048,9 @@ $color_actions_border: #CCC; text-shadow: 0 0 5px #fff; box-shadow: 0 0 5px #777; } +.mce-menu { + background: #eee !important; +} .displaynone { display: none !important; @@ -869,7 +1121,7 @@ $color_actions_border: #CCC; left: auto; } } - &.opc_excluir > ul { + &.menu_excluir > ul { left: 10% !important; right: 0 !important; margin-left: 0; diff --git a/templates/compilacao/edit.html b/templates/compilacao/edit.html index 5781ca373..404949703 100644 --- a/templates/compilacao/edit.html +++ b/templates/compilacao/edit.html @@ -9,6 +9,7 @@ {% block head_content %}{{block.super}} + {% endblock %} diff --git a/templates/compilacao/edit_bloco.html b/templates/compilacao/edit_bloco.html index 5febac519..4da277ed6 100644 --- a/templates/compilacao/edit_bloco.html +++ b/templates/compilacao/edit_bloco.html @@ -59,11 +59,11 @@ {% if not dpt|is_relative_auto_insert:request %} -
  •  Excluir +
  • @@ -82,9 +82,10 @@
    -
    -
    Ordem: {{dpt.ordem}}, Nivel: {{dpt.nivel}}, Número: {{dpt.get_numero_completo}}
    -
    +
      +
    • Ordem: {{dpt.ordem}}, Nivel: {{dpt.nivel}}, Número: {{dpt.get_numero_completo}}
    • +
    • .
    • +
      Em Edição:
      diff --git a/templates/compilacao/index.html b/templates/compilacao/index.html index ddec9f487..4e2aee533 100644 --- a/templates/compilacao/index.html +++ b/templates/compilacao/index.html @@ -6,6 +6,12 @@ {% block head_content %}{{block.super}} + + + + + {# TODO: incluir javascript compilacao_notas apenas se houver usuário conectado e que possua permissão para cadastro de notas #} + {% endblock %} @@ -14,67 +20,16 @@ {% endblock %} {% block base_content %} -
      +
      + a + A +
      -
      -a -A -
      - - {% for key, values in view.get_vigencias.items %} - {% if forloop.first %} + {% for key, values in view.get_vigencias.items %} + {% if forloop.first %}
      {% endblock base_content %} diff --git a/templates/compilacao/index_bloco.html b/templates/compilacao/index_bloco.html index def483898..65d7cd202 100644 --- a/templates/compilacao/index_bloco.html +++ b/templates/compilacao/index_bloco.html @@ -7,24 +7,85 @@ {% elif dpt.nivel < view.flag_nivel_old %} {% close_div view.flag_nivel_old dpt.nivel 0 %} {% endif%} -
      -
      - {% spaceless %} - {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto%}{{ dpt.texto|safe }}{%else%} {%endif%} - {% if dpt.norma_publicada_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} - - {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} - {% nota_automatica dpt %} - {{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }} - - {% endif %} - {% endspaceless %} - {% if view.is_norma_alteradora and dpt.tipo_dispositivo.class_css == 'bloco_alteracao'%} - {%with node=dpt template_name='compilacao/index_bloco_alteracao.html' %} - {%include template_name%} - {%endwith%} - {% endif%} + + + {% if forloop.first and view|isinst:'DispositivoView' %} + {% else %} +
      + {% endif%} + + {% spaceless %} +
      +
      + {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto%}{{ dpt.texto|safe }}{%else%} {%endif%} + {% if dpt.norma_publicada_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} + + {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} + {% nota_automatica dpt %} + {{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }} + + {% endif %} + {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao%} +
      {# TODO: User - dne - Dispostivo Nota Editor - tratar permissão de usuário#} + +
      +
      + {% endif%}
      + {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao%} +
      {# Dispostivo Nota#} + +
        {# Dispostivo Nota Lista#} + {% for nota in dpt.notas.all %}{# TODO: User - dnl - Dispostivo Nota Editor - tratar permissão de usuário quanto a publicidade#} +
      • +
          +
        • Editar
        • {# TODO: User - tratar permissão usuário #} +
        • +
        • Excluir
        • {# TODO: User - tratar permissão usuário #} +
        • + + +
        • {{nota.tipo.nome}}
        • +
        • +
        • {%if nota.owner.first_name%}{{nota.owner.first_name}}{%else%}{{nota.owner}}{%endif%}
        • +
        • +
        • {{nota.publicacao|date:"d M Y"}}
        • +
        + + + {%if nota.url_externa %}{%endif%} + {%if nota.titulo %}
        {{nota.titulo}}
        {%endif%} + {%if nota.url_externa %}
        {%endif%} + + {%if nota.url_externa %}{%endif%} +
        {{ nota.texto}}
        + {%if nota.url_externa %}
        {%endif%} + +{%comment%} +
          +
        • {{nota.efetividade|date:"d M Y"}}
        • +
        • +
        • {{nota.get_publicidade_display}}
        • +
        +{%endcomment%} +
      • {# Dispostivo Nota Lista Item#} + {% endfor %} +
      +
      + {% endif%} +
      + {% endspaceless %} + {% if view.is_norma_alteradora and dpt.tipo_dispositivo.class_css == 'bloco_alteracao'%} + {%with node=dpt template_name='compilacao/index_bloco_alteracao.html' %} + {%include template_name%} + {%endwith%} + {% endif%} {% set_nivel_old view dpt.nivel %} {% endfor %} -{% close_div view.flag_nivel_old view.flag_nivel_ini 0 %} +{% if view|isinst:'DispositivoView' %} + {% close_div view.flag_nivel_old view.flag_nivel_ini -1 %} +{% else %} + {% close_div view.flag_nivel_old view.flag_nivel_ini 0 %} +{% endif%} diff --git a/templates/compilacao/index_bloco_alteracao.html b/templates/compilacao/index_bloco_alteracao.html index 3f7b71744..e5925a8ac 100644 --- a/templates/compilacao/index_bloco_alteracao.html +++ b/templates/compilacao/index_bloco_alteracao.html @@ -3,8 +3,10 @@ {% spaceless %}
      +
      {{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ ch.rotulo }}{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }} -
      +
      +
      {% endspaceless %} {% endfor %} diff --git a/templates/compilacao/nota_ajaxform.html b/templates/compilacao/nota_ajaxform.html new file mode 100644 index 000000000..8b032736f --- /dev/null +++ b/templates/compilacao/nota_ajaxform.html @@ -0,0 +1,3 @@ +{% load crispy_forms_tags %} +{% crispy form form.helper%} + From beda456664992cf1be98759db3cb6b81f24eb103 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Thu, 26 Nov 2015 13:26:15 -0200 Subject: [PATCH 19/23] fix bug in json result of add_next --- compilacao/views.py | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/compilacao/views.py b/compilacao/views.py index 2702a8f9d..2ab02e82b 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -1025,33 +1025,33 @@ class ActionsEditMixin(object): if dp_auto_insert is None: data = self.get_json_for_refresh(dp) else: - data = self.get_json_for_refresh(dp_auto_insert) + data = self.get_json_for_refresh(dp=dp, dpauto=dp_auto_insert) return data - def get_json_for_refresh(self, dispositivo): + def get_json_for_refresh(self, dp, dpauto=None): - if dispositivo.tipo_dispositivo.contagem_continua: + if dp.tipo_dispositivo.contagem_continua: pais = [] - if dispositivo.dispositivo_pai is None: - data = {'pk': dispositivo.pk, 'pai': [-1, ]} + if dp.dispositivo_pai is None: + data = {'pk': dp.pk, 'pai': [-1, ]} else: - pkfilho = dispositivo.pk - dispositivo = dispositivo.dispositivo_pai + pkfilho = dp.pk + dp = dp.dispositivo_pai - proxima_articulacao = dispositivo.get_proximo_nivel_zero() + proxima_articulacao = dp.get_proximo_nivel_zero() if proxima_articulacao is not None: parents = Dispositivo.objects.filter( - norma_id=dispositivo.norma_id, - ordem__gte=dispositivo.ordem, + norma_id=dp.norma_id, + ordem__gte=dp.ordem, ordem__lt=proxima_articulacao.ordem, - nivel__lte=dispositivo.nivel) + nivel__lte=dp.nivel) else: parents = Dispositivo.objects.filter( - norma_id=dispositivo.norma_id, - ordem__gte=dispositivo.ordem, - nivel__lte=dispositivo.nivel) + norma_id=dp.norma_id, + ordem__gte=dp.ordem, + nivel__lte=dp.nivel) nivel = sys.maxsize for p in parents: @@ -1059,10 +1059,11 @@ class ActionsEditMixin(object): continue pais.append(p.pk) nivel = p.nivel - data = {'pk': pkfilho, 'pai': pais} + data = { + 'pk': pkfilho if not dpauto else dpauto.pk, 'pai': pais} else: - data = {'pk': dispositivo.pk, 'pai': [ - dispositivo.dispositivo_pai.pk, ]} + data = {'pk': dp.pk if not dpauto else dpauto.pk, 'pai': [ + dp.dispositivo_pai.pk, ]} return data From 604345d32c3ccff510a565bd30d3477ad30ed871 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 27 Nov 2015 17:18:19 -0200 Subject: [PATCH 20/23] add norma_temporario_crud --- compilacao/forms.py | 41 ++++++++++++++++++--------- compilacao/urls.py | 2 +- compilacao/views.py | 23 ++++++++++++--- norma/models.py | 5 ++-- norma/urls.py | 15 +++++++--- norma/views.py | 12 ++++---- static/js/compilacao_notas.js | 19 +++++++++++-- static/styles/compilacao.scss | 17 +++++++++-- templates/compilacao/edit_bloco.html | 1 - templates/compilacao/index_bloco.html | 18 +++++++----- 10 files changed, 109 insertions(+), 44 deletions(-) diff --git a/compilacao/forms.py b/compilacao/forms.py index 3842bf340..f47cebf0b 100644 --- a/compilacao/forms.py +++ b/compilacao/forms.py @@ -36,11 +36,19 @@ class NotaForm(ModelForm): # All users have visibility. (NPUBL, _('Nota Pública')), ) - + error_messages = { + 'required': _('Este campo é obrigatório'), + 'invalid': _('URL inválida.') + } titulo = forms.CharField(label=' ', required=False) - texto = forms.CharField(label='', widget=forms.Textarea) - url_externa = forms.URLField(label='', required=False) - + texto = forms.CharField( + label='', + widget=forms.Textarea, + error_messages=error_messages) + url_externa = forms.URLField( + label='', + required=False, + error_messages=error_messages) publicidade = forms.ChoiceField( required=True, label='Publicidade', @@ -53,16 +61,21 @@ class NotaForm(ModelForm): queryset=TipoNota.objects.all(), empty_label=None) - publicacao = forms.DateField(label=u'Publicação', - input_formats=['%d/%m/%Y'], - required=True, - widget=forms.DateInput( - format='%d/%m/%Y')) - efetividade = forms.DateField(label=u'Efetividade', - input_formats=['%d/%m/%Y'], - required=True, - widget=forms.DateInput( - format='%d/%m/%Y')) + publicacao = forms.DateField( + label=u'Publicação', + input_formats=['%d/%m/%Y'], + required=True, + widget=forms.DateInput( + format='%d/%m/%Y'), + error_messages=error_messages + ) + efetividade = forms.DateField( + label=u'Efetividade', + input_formats=['%d/%m/%Y'], + required=True, + widget=forms.DateInput( + format='%d/%m/%Y'), + error_messages=error_messages) dispositivo = forms.ModelChoiceField(queryset=Dispositivo.objects.all(), widget=forms.HiddenInput()) pk = forms.IntegerField(widget=forms.HiddenInput(), diff --git a/compilacao/urls.py b/compilacao/urls.py index 7a3c2b012..75089ab82 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -31,7 +31,7 @@ urlpatterns_compilacao = [ views.NotasEditView.as_view(), name='nota_edit'), url(r'^(?P[0-9]+)/compilacao/' - '(?P[0-9]+)/nota/delete$', + '(?P[0-9]+)/nota/(?P[0-9]+)/delete$', views.NotasDeleteView.as_view(), name='nota_delete'), ] diff --git a/compilacao/views.py b/compilacao/views.py index 2ab02e82b..3e8b09898 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -6,12 +6,14 @@ from django.contrib.auth.models import User from django.core.signing import Signer from django.core.urlresolvers import reverse from django.db.models import Q -from django.http.response import JsonResponse, HttpResponse +from django.http.response import JsonResponse, HttpResponse,\ + HttpResponseRedirect from django.shortcuts import render from django.utils.dateparse import parse_date from django.utils.translation import ugettext_lazy as _ from django.views.generic.base import TemplateView -from django.views.generic.edit import FormMixin, UpdateView +from django.views.generic.detail import SingleObjectMixin +from django.views.generic.edit import FormMixin, UpdateView, DeleteView from django.views.generic.list import ListView from vanilla.model_views import CreateView @@ -1160,5 +1162,18 @@ class NotasEditView(UpdateView): 'dispositivo_id']}) -class NotasDeleteView(FormMixin, CreateView): - pass +class NotasDeleteView(TemplateView): + + def get(self, request, *args, **kwargs): + nt = Nota.objects.get(pk=self.kwargs['pk']) + success_url = self.get_success_url() + nt.delete() + return HttpResponseRedirect(success_url) + + def get_success_url(self): + return reverse( + 'dispositivo', kwargs={ + 'norma_id': self.kwargs[ + 'norma_id'], + 'dispositivo_id': self.kwargs[ + 'dispositivo_id']}) diff --git a/norma/models.py b/norma/models.py index 265ad129d..875687f1b 100644 --- a/norma/models.py +++ b/norma/models.py @@ -3,7 +3,7 @@ from django.template import defaultfilters from django.utils.translation import ugettext_lazy as _ from materia.models import MateriaLegislativa -from sapl.utils import make_choices +from sapl.utils import make_choices, YES_NO_CHOICES class AssuntoNorma(models.Model): @@ -86,7 +86,8 @@ class NormaJuridica(models.Model): observacao = models.TextField( blank=True, null=True, verbose_name=_('Observação')) complemento = models.NullBooleanField( - blank=True, verbose_name=_('Complementar ?')) + blank=True, verbose_name=_('Complementar ?'), + choices=YES_NO_CHOICES) # XXX was a CharField (attention on migrate) assuntos = models.ManyToManyField( AssuntoNorma, diff --git a/norma/urls.py b/norma/urls.py index 69199c2c3..5e55c8713 100644 --- a/norma/urls.py +++ b/norma/urls.py @@ -1,12 +1,19 @@ from django.conf.urls import include, url -from norma.views import NormaIncluirView, assunto_norma_crud, tipo_norma_crud +from norma.views import NormaIncluirView, assunto_norma_crud, tipo_norma_crud,\ + norma_temporario_crud + +norma_url_patterns = norma_temporario_crud.urlpatterns + [] +# norma_url_patterns = norma_crud.urlpatterns + [] urlpatterns = [ - # url(r'^norma/', include(norma_url_patterns, - # norma_temporario_para_compilacao_crud.namespace, - # norma_temporario_para_compilacao_crud.namespace)), + url(r'^norma/', include(norma_url_patterns, + norma_temporario_crud.namespace, + norma_temporario_crud.namespace)), + + url(r'^sistema/norma/tipo/', include(tipo_norma_crud.urls)), url(r'^sistema/norma/assunto/', include(assunto_norma_crud.urls)), + url(r'^norma/incluir', NormaIncluirView.as_view(), name='norma-incluir'), ] diff --git a/norma/views.py b/norma/views.py index 9304f0cc7..00d2598f0 100644 --- a/norma/views.py +++ b/norma/views.py @@ -30,6 +30,7 @@ tipo_norma_crud = build_crud( ]) norma_crud = build_crud( + NormaJuridica, '', [ [_('Identificação Básica'), @@ -47,19 +48,18 @@ norma_crud = build_crud( [('indexacao', 12)], [('observacao', 12)]], - [_('Assuntos (Classificação) [+] '), + [_('Assuntos (Classificação) [+]'), + [('assunto_norma_FIXME', 12)], [('assunto_norma_FIXME', 12)], [('assunto_norma_FIXME', 12)]], ]) -norma_temporario_para_compilacao_crud = build_crud( - NormaJuridica, 'norma', [ +norma_temporario_crud = build_crud( + NormaJuridica, 'normajuridica', [ [_('Identificação Básica'), - [('tipo', 4), ('numero', 4), ('ano', 4)], - [('data', 4), ('esfera_federacao', 4)], - [('data_publicacao', 3)], + [('tipo', 5), ('numero', 2), ('ano', 2), ('data', 3)], [('ementa', 12)]], ]) diff --git a/static/js/compilacao_notas.js b/static/js/compilacao_notas.js index 8688272c0..c31b2873b 100644 --- a/static/js/compilacao_notas.js +++ b/static/js/compilacao_notas.js @@ -50,6 +50,18 @@ var onSubmitEditForm = function(event) { } ); } +var onDelete = function(event) { + + var id_dispositivo = $(event).closest('.dn').attr('pk'); + var id_nota = $(event).attr('pk'); + var url = 'compilacao/'+id_dispositivo+'/nota/'+id_nota+'/delete' + + $.get( url, function(data) { + $('#dne'+id_dispositivo+' .dne-form').closest('.dpt').html(data) + onReadyNotas(); + } + ); +} function getFormNota(_this, _btn) { var id_dispositivo = $('.dne-exec .dne-form').closest('.dne').attr('pk'); @@ -63,13 +75,12 @@ function getFormNota(_this, _btn) { id_dispositivo = $(_this).attr('pk'); url = 'compilacao/'+id_dispositivo+'/nota/create'; } - else { + else if (_btn == 'btn-edit') { var id_nota = $(_this).attr('pk'); id_dispositivo = $(_this).closest('.dn').attr('pk'); url = 'compilacao/'+id_dispositivo+'/nota/'+id_nota+'/edit' } $('#dne'+id_dispositivo).addClass('dne-exec'); - $('#dne'+id_dispositivo).addClass('dne-exec'); $.get(url).done(function( data ) { $('#dne'+id_dispositivo+' .dne-form').html(data); @@ -79,12 +90,16 @@ function getFormNota(_this, _btn) { function onReadyNotas() { $('.dne .btn-create').off(); $('.dne .btn-edit').off(); + $('.dne .btn-delete').off(); $('.dne .btn-create').click(function(){ getFormNota(this, 'btn-create') }); $('.dn .btn-edit').click(function(){ getFormNota(this, 'btn-edit') }); + $('.dn .btn-delete').click(function(){ + onDelete(this, 'btn-delete') + }); } $(document).ready(function() { onReadyNotas() diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index fbd590873..923c01d95 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -209,7 +209,7 @@ $color_actions_border: #CCC; font-size: 1.15em; float:left; .dptt { - z-index: 98; + z-index: 89; position: relative; } } @@ -273,6 +273,7 @@ $color_actions_border: #CCC; font-weight: normal; line-height: 1rem; position: relative; + text-decoration: none; p, ul { font-size: 0.8rem; font-weight: normal; @@ -299,8 +300,6 @@ $color_actions_border: #CCC; padding: 0.5em 0.5em 0em 0.5em; border: 1px solid #c7e3d3; border-top: 0px; - - } &:hover { @@ -323,15 +322,25 @@ $color_actions_border: #CCC; &:hover { color: #787; + a{ + color: #27AE60 !important; + } } + } .ntitulo { font-weight: bold; color: #676; font-size: 90%; + a{ + color: #294 !important; + } } .ntexto { color: #787; + a{ + color: #294 !important; + } } .nowner { color: #27AE60; @@ -342,6 +351,7 @@ $color_actions_border: #CCC; .dptt { .dne { + text-decoration: none; position: relative; display: block; font-size: 0.8rem; @@ -356,6 +366,7 @@ $color_actions_border: #CCC; font-size: 0.8rem; font-weight: normal; line-height: 1rem; + text-decoration: none; } ul.btns-action { diff --git a/templates/compilacao/edit_bloco.html b/templates/compilacao/edit_bloco.html index 4da277ed6..27348e7c9 100644 --- a/templates/compilacao/edit_bloco.html +++ b/templates/compilacao/edit_bloco.html @@ -35,7 +35,6 @@
      diff --git a/templates/compilacao/index_bloco.html b/templates/compilacao/index_bloco.html index 65d7cd202..a1ee1adb3 100644 --- a/templates/compilacao/index_bloco.html +++ b/templates/compilacao/index_bloco.html @@ -46,7 +46,6 @@
    • Excluir
    • {# TODO: User - tratar permissão usuário #}
    • -
    • {{nota.tipo.nome}}
    • {%if nota.owner.first_name%}{{nota.owner.first_name}}{%else%}{{nota.owner}}{%endif%}
    • @@ -54,14 +53,19 @@
    • {{nota.publicacao|date:"d M Y"}}
    + {%if nota.titulo %} +
    + {%if nota.url_externa %}{%endif%} + {{nota.titulo}} + {%if nota.url_externa %}{%endif%} +
    + {%endif%} +
    {%if nota.url_externa %}{%endif%} - {%if nota.titulo %}
    {{nota.titulo}}
    {%endif%} - {%if nota.url_externa %}
    {%endif%} - - {%if nota.url_externa %}{%endif%} -
    {{ nota.texto}}
    - {%if nota.url_externa %}
    {%endif%} + {{ nota.texto}} + {%if nota.url_externa %}{%endif%} +
    {%comment%}
      From ae19c6a170871cc4bb253fc753cc3392967e26ff Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Tue, 1 Dec 2015 16:53:33 -0200 Subject: [PATCH 21/23] Impl. of features for editing notes and quotes. --- compilacao/forms.py | 142 ++++++--- compilacao/models.py | 21 +- compilacao/templatetags/compilacao_filters.py | 11 +- compilacao/urls.py | 16 + compilacao/views.py | 284 +++++++++++++----- norma/urls.py | 4 +- sapl/settings.py | 3 +- static/js/compilacao.js | 4 + static/js/compilacao_notas.js | 149 ++++++--- static/styles/compilacao.scss | 248 ++++++++++++--- templates/compilacao/ajax_form.html | 3 + .../dispositivo_search_fragment_form.html | 43 +++ templates/compilacao/edit_bloco.html | 2 +- templates/compilacao/index_bloco.html | 177 ++++++++--- .../compilacao/index_bloco_alteracao.html | 4 +- templates/compilacao/nota_ajaxform.html | 3 - 16 files changed, 857 insertions(+), 257 deletions(-) create mode 100644 templates/compilacao/ajax_form.html create mode 100644 templates/compilacao/dispositivo_search_fragment_form.html delete mode 100644 templates/compilacao/nota_ajaxform.html diff --git a/compilacao/forms.py b/compilacao/forms.py index f47cebf0b..ff5d31c9f 100644 --- a/compilacao/forms.py +++ b/compilacao/forms.py @@ -1,13 +1,12 @@ from crispy_forms.helper import FormHelper -from crispy_forms.layout import Layout, Fieldset, ButtonHolder, Submit, Field,\ - Div, Column, Row, Hidden, Button +from crispy_forms.layout import HTML, Button, Column, Div, Field, Layout, Row from django import forms -from django.core.urlresolvers import reverse from django.forms.models import ModelForm from django.utils.translation import ugettext_lazy as _ -from compilacao.models import Nota, TipoNota, Dispositivo -import sapl +from compilacao.models import Dispositivo, Nota, TipoNota, TipoVide, Vide +from norma.models import TipoNormaJuridica +from sapl.layout import to_column, to_row class UpLoadImportFileForm(forms.Form): @@ -15,31 +14,25 @@ class UpLoadImportFileForm(forms.Form): required=True, label=_('Arquivo formato ODF para Importanção')) - -def get_tipos_nota(): - return [(t.id, t.sigla + ' - ' + t.nome) for t in TipoNota.objects.all()] +error_messages = { + 'required': _('Este campo é obrigatório'), + 'invalid': _('URL inválida.') +} class NotaForm(ModelForm): NPRIV = 1 - NSTRL = 2 - NINST = 3 - NPUBL = 4 + NINST = 2 + NPUBL = 3 PUBLICIDADE_CHOICES = ( # Only the owner of the note has visibility. (NPRIV, _('Nota Privada')), - # All of the same group have visibility. - (NSTRL, _('Nota Setorial')), # All authenticated users have visibility. (NINST, _('Nota Institucional')), # All users have visibility. (NPUBL, _('Nota Pública')), ) - error_messages = { - 'required': _('Este campo é obrigatório'), - 'invalid': _('URL inválida.') - } titulo = forms.CharField(label=' ', required=False) texto = forms.CharField( label='', @@ -51,18 +44,18 @@ class NotaForm(ModelForm): error_messages=error_messages) publicidade = forms.ChoiceField( required=True, - label='Publicidade', + label=_('Publicidade'), choices=PUBLICIDADE_CHOICES, widget=forms.Select(attrs={'class': 'selector'})) tipo = forms.ModelChoiceField( required=False, - label='Tipo da Nota', + label=_('Tipo da Nota'), queryset=TipoNota.objects.all(), empty_label=None) publicacao = forms.DateField( - label=u'Publicação', + label=_('Publicação'), input_formats=['%d/%m/%Y'], required=True, widget=forms.DateInput( @@ -70,7 +63,7 @@ class NotaForm(ModelForm): error_messages=error_messages ) efetividade = forms.DateField( - label=u'Efetividade', + label=_('Efetividade'), input_formats=['%d/%m/%Y'], required=True, widget=forms.DateInput( @@ -96,7 +89,7 @@ class NotaForm(ModelForm): def __init__(self, *args, **kwargs): - row1 = sapl.layout.to_row([ + row1 = to_row([ ('tipo', 4), ]) row1.append( @@ -107,31 +100,112 @@ class NotaForm(ModelForm): ), css_class='columns large-8')) - row3 = sapl.layout.to_row([ + row3 = to_row([ ('publicidade', 3), ('publicacao', 3), ('efetividade', 3), (Button('submit', 'Salvar', - css_class='button primary'), 3) + css_class='button primary radius'), 3) ]) self.helper = FormHelper() self.helper.layout = Layout( + Div(HTML(_('Notas')), css_class='title_form'), row1, Field('texto', placeholder=_('Adicionar Nota')), Field('url_externa', placeholder=_('URL Externa (opcional)')), row3 ) - kwargs.pop('norma_id') - dispositivo_id = kwargs.pop('dispositivo_id') - if 'pk' in kwargs: - pk = kwargs.pop('pk') - else: - pk = '' - super(NotaForm, self).__init__(*args, **kwargs) - self.fields['dispositivo'].initial = dispositivo_id - if pk: - self.fields['pk'].initial = pk + +class VideForm(ModelForm): + dispositivo_base = forms.ModelChoiceField( + queryset=Dispositivo.objects.all(), + widget=forms.HiddenInput()) + dispositivo_ref = forms.ModelChoiceField( + queryset=Dispositivo.objects.all(), + widget=forms.HiddenInput()) + + tipo_norma = forms.ModelChoiceField( + queryset=TipoNormaJuridica.objects.all(), + required=False) + num_norma = forms.IntegerField(label=_('Núm. da Norma'), required=False) + ano_norma = forms.IntegerField(label=_('Ano da Norma'), required=False) + + texto = forms.CharField( + label='', + widget=forms.Textarea, + error_messages=error_messages, + required=False) + tipo = forms.ModelChoiceField( + label=_('Tipo do Vide'), + queryset=TipoVide.objects.all(), + required=True) + + busca_dispositivo = forms.CharField( + label=_('Buscar Dispositivo a Referenciar'), + required=False) + pk = forms.IntegerField(widget=forms.HiddenInput(), + required=False) + + class Meta: + model = Vide + fields = ['dispositivo_base', + 'dispositivo_ref', + 'texto', + 'tipo', + 'pk'] + + def __init__(self, *args, **kwargs): + + self.helper = FormHelper() + self.helper.layout = Layout( + + Div(HTML(_('Vides')), css_class='title_form'), + + Row( + to_column(( + Div( + Div(to_column((Field( + 'tipo', + placeholder=_('Selecione um Tipo de Vide')), 12))), + Div(to_column(( + Field( + 'texto', + placeholder=_( + 'Texto Adicional ao Vide')), 12))), + Div(to_column(( + Button( + 'submit', + 'Salvar', + css_class='button primary radius'), 12))) + ), 4)), + to_column(( + Div( + Div(to_column(('tipo_norma', 6))), + Div(to_column(('num_norma', 3)), + to_column(('ano_norma', 3))), + Div(to_column( + (Field( + 'busca_dispositivo', + placeholder=_('Digite palavras, letras, ' + 'números ou algo' + ' que estejam ' + 'no rótulo ou no texto.')), 10)), + to_column(( + Button( + 'buscar', + 'Buscar', + css_class='button btn-busca radius'), 2)) + + ), + to_column( + (Div(css_class='container-busca'), 12)) + ), 8) + ) + ) + ) + + super(VideForm, self).__init__(*args, **kwargs) diff --git a/compilacao/models.py b/compilacao/models.py index 076df95e0..e6df58898 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -950,9 +950,16 @@ class Dispositivo(BaseModel, TimestampedMixin): return proxima_articulacao[0] - def is_relative_auto_insert(self, perfil_pk): + def is_relative_auto_insert(self, perfil_pk=None): if self.dispositivo_pai is not None: # pp possiveis_pais + + if not perfil_pk: + perfis = PerfilEstruturalTextosNormativos.objects.filter( + padrao=True)[:1] + if perfis.exists(): + perfil_pk = perfis[0].pk + pp = self.tipo_dispositivo.possiveis_pais.filter( pai=self.dispositivo_pai.tipo_dispositivo, perfil_id=perfil_pk) @@ -1032,15 +1039,16 @@ class Vide(TimestampedMixin): dispositivo_base = models.ForeignKey( Dispositivo, verbose_name=_('Dispositivo Base'), - related_name='%(class)s_dispositivo_base') + related_name='cita') dispositivo_ref = models.ForeignKey( Dispositivo, - related_name='%(class)s_dispositivo_ref', + related_name='citado', verbose_name=_('Dispositivo Referido')) class Meta: verbose_name = _('Vide') verbose_name_plural = _('Vides') + unique_together = ['dispositivo_base', 'dispositivo_ref'] def __str__(self): return _('Vide %s') % self.texto @@ -1048,15 +1056,12 @@ class Vide(TimestampedMixin): class Nota(TimestampedMixin): NPRIV = 1 - NSTRL = 2 - NINST = 3 - NPUBL = 4 + NINST = 2 + NPUBL = 3 PUBLICIDADE_CHOICES = ( # Only the owner of the note has visibility. (NPRIV, _('Nota Privada')), - # All of the same group have visibility. - (NSTRL, _('Nota Setorial')), # All authenticated users have visibility. (NINST, _('Nota Institucional')), # All users have visibility. diff --git a/compilacao/templatetags/compilacao_filters.py b/compilacao/templatetags/compilacao_filters.py index 4bf6223b6..74d3b06ee 100644 --- a/compilacao/templatetags/compilacao_filters.py +++ b/compilacao/templatetags/compilacao_filters.py @@ -128,9 +128,17 @@ def nomenclatura(d): @register.simple_tag -def nomenclatura_heranca(d): +def nomenclatura_heranca(d, ignore_ultimo=0, ignore_primeiro=0): result = '' while d is not None: + + if ignore_ultimo and d.dispositivo_pai is None: + break + if ignore_primeiro: + ignore_primeiro = 0 + d = d.dispositivo_pai + continue + if d.rotulo != '': if d.tipo_dispositivo.rotulo_prefixo_texto != '': result = d.rotulo + ' ' + result @@ -141,4 +149,5 @@ def nomenclatura_heranca(d): result = '(' + d.tipo_dispositivo.nome + \ d.rotulo_padrao() + ')' + ' ' + result d = d.dispositivo_pai + return result diff --git a/compilacao/urls.py b/compilacao/urls.py index 75089ab82..571794788 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -34,6 +34,22 @@ urlpatterns_compilacao = [ '(?P[0-9]+)/nota/(?P[0-9]+)/delete$', views.NotasDeleteView.as_view(), name='nota_delete'), + url(r'^(?P[0-9]+)/compilacao/' + '(?P[0-9]+)/vide/create$', + views.VideCreateView.as_view(), name='vide_create'), + + url(r'^(?P[0-9]+)/compilacao/' + '(?P[0-9]+)/vide/(?P[0-9]+)/edit$', + views.VideEditView.as_view(), name='vide_edit'), + + url(r'^(?P[0-9]+)/compilacao/' + '(?P[0-9]+)/vide/(?P[0-9]+)/delete$', + views.VideDeleteView.as_view(), name='vide_delete'), + + url(r'^(?P[0-9]+)/compilacao/search$', + views.DispositivoSearchFragmentFormView.as_view(), + name='search_dispositivo'), + ] urlpatterns = [ diff --git a/compilacao/views.py b/compilacao/views.py index 3e8b09898..ed14100b0 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -2,31 +2,30 @@ from collections import OrderedDict from datetime import datetime, timedelta from os.path import sys -from django.contrib.auth.models import User +from django.contrib.auth.decorators import login_required from django.core.signing import Signer from django.core.urlresolvers import reverse from django.db.models import Q -from django.http.response import JsonResponse, HttpResponse,\ - HttpResponseRedirect -from django.shortcuts import render +from django.http.response import (HttpResponse, HttpResponseRedirect, + JsonResponse) +from django.shortcuts import get_object_or_404, render from django.utils.dateparse import parse_date +from django.utils.decorators import method_decorator from django.utils.translation import ugettext_lazy as _ from django.views.generic.base import TemplateView -from django.views.generic.detail import SingleObjectMixin -from django.views.generic.edit import FormMixin, UpdateView, DeleteView +from django.views.generic.edit import FormMixin, UpdateView from django.views.generic.list import ListView from vanilla.model_views import CreateView from compilacao import forms from compilacao.file2dispositivo import Parser -from compilacao.forms import NotaForm -from compilacao.models import (Dispositivo, PerfilEstruturalTextosNormativos, +from compilacao.models import (Dispositivo, Nota, + PerfilEstruturalTextosNormativos, TipoDispositivo, TipoNota, TipoPublicacao, - TipoVide, VeiculoPublicacao, Nota) + TipoVide, VeiculoPublicacao, Vide) from norma.models import NormaJuridica from sapl.crud import build_crud - DISPOSITIVO_SELECT_RELATED = ( 'tipo_dispositivo', 'norma_publicada', @@ -131,6 +130,22 @@ class CompilacaoView(ListView): inicio_vigencia = None fim_vigencia = None + def get_context_data(self, **kwargs): + context = super(CompilacaoView, self).get_context_data(**kwargs) + + vides = Vide.objects.filter( + Q(dispositivo_base__norma_id=self.kwargs['norma_id']) | + Q(dispositivo_ref__norma_id=self.kwargs['norma_id'])) + + context['cita'] = [v.dispositivo_base_id for v in vides] + context['citado'] = [v.dispositivo_ref_id for v in vides] + + notas = Nota.objects.filter( + dispositivo__norma_id=self.kwargs['norma_id']) + + context['notas'] = [n.dispositivo_id for n in notas] + return context + def get_queryset(self): self.flag_alteradora = -1 self.flag_nivel_ini = 0 @@ -153,11 +168,22 @@ class CompilacaoView(ListView): norma_id=self.kwargs['norma_id'], ).select_related(*DISPOSITIVO_SELECT_RELATED) else: - return Dispositivo.objects.filter( + + r = Dispositivo.objects.filter( ordem__gt=0, - norma_id=self.kwargs['norma_id'] - ).select_related(*DISPOSITIVO_SELECT_RELATED).prefetch_related( - 'notas',) + norma_id=self.kwargs['norma_id'], + ).select_related( + 'tipo_dispositivo', + 'norma_publicada', + 'norma', + 'dispositivo_atualizador', + 'dispositivo_atualizador__dispositivo_pai', + 'dispositivo_atualizador__dispositivo_pai__norma', + 'dispositivo_atualizador__dispositivo_pai__norma__tipo', + 'dispositivo_pai', + 'dispositivo_pai__tipo_dispositivo') + + return r def get_vigencias(self): itens = Dispositivo.objects.filter( @@ -1087,31 +1113,65 @@ class ActionsEditView(ActionsEditMixin, TemplateView): return self.render_to_json_response(context, **response_kwargs) -class NotasCreateView(FormMixin, CreateView): - template_name = 'compilacao/nota_ajaxform.html' - form_class = forms.NotaForm +class DispositivoSuccessUrlMixin(object): - def get(self, request, *args, **kwargs): + def get_success_url(self): + return reverse( + 'dispositivo', kwargs={ + 'norma_id': self.kwargs[ + 'norma_id'], + 'dispositivo_id': self.kwargs[ + 'dispositivo_id']}) + + +class NotaMixin(DispositivoSuccessUrlMixin): + def get_modelo_nota(self, request): + # TODO: permitir edição apenas das notas do usuário conectado + # TODO: tratar revalidação no método post + # TODO: não mostrar botão de edição na interface if 'action' in request.GET and request.GET['action'] == 'modelo_nota': tn = TipoNota.objects.get(pk=request.GET['id_tipo']) - return HttpResponse(tn.modelo) + return True, tn.modelo + return False, '' - return super(NotasCreateView, self).get(request, *args, **kwargs) + def get_initial(self): + dispositivo = get_object_or_404( + Dispositivo, pk=self.kwargs.get('dispositivo_id')) + initial = {'dispositivo': dispositivo} + + if 'pk' in self.kwargs: + initial['pk'] = self.kwargs.get('pk') + + return initial - def get_form_kwargs(self): - kwargs = super(NotasCreateView, self).get_form_kwargs() - kwargs.update(self.kwargs) - return kwargs + @method_decorator(login_required) + def dispatch(self, *args, **kwargs): + return super(NotaMixin, self).dispatch(*args, **kwargs) + + +class NotasCreateView(NotaMixin, FormMixin, CreateView): + template_name = 'compilacao/ajax_form.html' + form_class = forms.NotaForm + + def get(self, request, *args, **kwargs): + flag_action, modelo_nota = self.get_modelo_nota(request) + if flag_action: + return HttpResponse(modelo_nota) + + return super(NotasCreateView, self).get(request, *args, **kwargs) def post(self, request, *args, **kwargs): try: - form = NotaForm(request.POST, request.FILES, **kwargs) + norma_id = kwargs.pop('norma_id') + dispositivo_id = kwargs.pop('dispositivo_id') + form = forms.NotaForm(request.POST, request.FILES, **kwargs) + kwargs['norma_id'] = norma_id + kwargs['dispositivo_id'] = dispositivo_id if form.is_valid(): nt = form.save(commit=False) - # TODO: Implementar tratamento do usuário. - nt.owner_id = User.objects.order_by('id')[:1][0].pk + nt.owner_id = request.user.pk nt.save() self.kwargs['pk'] = nt.pk return self.form_valid(form) @@ -1121,59 +1181,147 @@ class NotasCreateView(FormMixin, CreateView): print(e) return HttpResponse("post") - def get_success_url(self): - return reverse( - 'dispositivo', kwargs={ - 'norma_id': self.kwargs[ - 'norma_id'], - 'dispositivo_id': self.kwargs[ - 'dispositivo_id']}) - -class NotasEditView(UpdateView): +class NotasEditView(NotaMixin, UpdateView): model = Nota - template_name = 'compilacao/nota_ajaxform.html' + template_name = 'compilacao/ajax_form.html' form_class = forms.NotaForm def get(self, request, *args, **kwargs): + flag_action, modelo_nota = self.get_modelo_nota(request) + if flag_action: + return HttpResponse(modelo_nota) + + return super(NotasEditView, self).get(request, *args, **kwargs) + + +class NotasDeleteView(NotaMixin, TemplateView): + + def get(self, request, *args, **kwargs): + nt = Nota.objects.get(pk=self.kwargs['pk']) + nt.delete() + return HttpResponseRedirect(self.get_success_url()) + + +class VideMixin(DispositivoSuccessUrlMixin): + + def get_initial(self): + dispositivo_base = get_object_or_404( + Dispositivo, pk=self.kwargs.get('dispositivo_id')) + + initial = {'dispositivo_base': dispositivo_base} + + if 'pk' in self.kwargs: + initial['pk'] = self.kwargs.get('pk') + + return initial + + @method_decorator(login_required) + def dispatch(self, *args, **kwargs): + return super(VideMixin, self).dispatch(*args, **kwargs) + + +class VideCreateView(VideMixin, FormMixin, CreateView): + template_name = 'compilacao/ajax_form.html' + form_class = forms.VideForm + + def post(self, request, *args, **kwargs): try: - # TODO: permitir edição apenas das notas do usuário conectado - # TODO: tratar revalidação no método post - # TODO: não mostrar botão de edição na interface - if 'action' in request.GET and request.GET['action'] == 'modelo_nota': - tn = TipoNota.objects.get(pk=request.GET['id_tipo']) - return HttpResponse(tn.modelo) - - return super(NotasEditView, self).get(request, *args, **kwargs) + norma_id = kwargs.pop('norma_id') + dispositivo_id = kwargs.pop('dispositivo_id') + form = forms.VideForm(request.POST, request.FILES, **kwargs) + kwargs['norma_id'] = norma_id + kwargs['dispositivo_id'] = dispositivo_id + + if form.is_valid(): + vd = form.save(commit=False) + vd.save() + self.kwargs['pk'] = vd.pk + return self.form_valid(form) + else: + return self.form_invalid(form) except Exception as e: print(e) + return HttpResponse("post") - def get_form_kwargs(self): - kwargs = super(NotasEditView, self).get_form_kwargs() - kwargs.update(self.kwargs) - return kwargs - def get_success_url(self): - return reverse( - 'dispositivo', kwargs={ - 'norma_id': self.kwargs[ - 'norma_id'], - 'dispositivo_id': self.kwargs[ - 'dispositivo_id']}) +class VideEditView(VideMixin, UpdateView): + model = Vide + template_name = 'compilacao/ajax_form.html' + form_class = forms.VideForm -class NotasDeleteView(TemplateView): +class VideDeleteView(VideMixin, TemplateView): def get(self, request, *args, **kwargs): - nt = Nota.objects.get(pk=self.kwargs['pk']) - success_url = self.get_success_url() - nt.delete() - return HttpResponseRedirect(success_url) + vd = Vide.objects.get(pk=self.kwargs['pk']) + vd.delete() + return HttpResponseRedirect(self.get_success_url()) - def get_success_url(self): - return reverse( - 'dispositivo', kwargs={ - 'norma_id': self.kwargs[ - 'norma_id'], - 'dispositivo_id': self.kwargs[ - 'dispositivo_id']}) + +class DispositivoSearchFragmentFormView(ListView): + template_name = 'compilacao/dispositivo_search_fragment_form.html' + + @method_decorator(login_required) + def dispatch(self, *args, **kwargs): + return super( + DispositivoSearchFragmentFormView, + self).dispatch(*args, **kwargs) + + def get_queryset(self): + try: + busca = '' + + if 'busca' in self.request.GET: + busca = self.request.GET['busca'] + + q = Q(nivel__gt=0) + busca = busca.split(' ') + n = 10 + + for item in busca: + + if not item: + continue + + if q: + q = q & (Q(dispositivo_pai__rotulo__icontains=item) | + Q(rotulo__icontains=item) | + Q(texto__icontains=item) | + Q(texto_atualizador__icontains=item)) + n = 50 + else: + q = (Q(dispositivo_pai__rotulo__icontains=item) | + Q(rotulo__icontains=item) | + Q(texto__icontains=item) | + Q(texto_atualizador__icontains=item)) + n = 50 + + if 'tipo_norma' in self.request.GET: + tipo_norma = self.request.GET['tipo_norma'] + if tipo_norma: + q = q & Q(norma__tipo_id=tipo_norma) + n = 50 + + if 'num_norma' in self.request.GET: + num_norma = self.request.GET['num_norma'] + if num_norma: + q = q & Q(norma__numero=num_norma) + n = 50 + + if 'ano_norma' in self.request.GET: + ano_norma = self.request.GET['ano_norma'] + if ano_norma: + q = q & Q(norma__ano=ano_norma) + n = 50 + + if 'initial_ref' in self.request.GET: + initial_ref = self.request.GET['initial_ref'] + if initial_ref: + q = q & Q(pk=initial_ref) + n = 50 + + return Dispositivo.objects.filter(q)[:n] + + except Exception as e: + print(e) diff --git a/norma/urls.py b/norma/urls.py index 5e55c8713..66ed716cf 100644 --- a/norma/urls.py +++ b/norma/urls.py @@ -1,7 +1,7 @@ from django.conf.urls import include, url -from norma.views import NormaIncluirView, assunto_norma_crud, tipo_norma_crud,\ - norma_temporario_crud +from norma.views import (NormaIncluirView, assunto_norma_crud, + norma_temporario_crud, tipo_norma_crud) norma_url_patterns = norma_temporario_crud.urlpatterns + [] # norma_url_patterns = norma_crud.urlpatterns + [] diff --git a/sapl/settings.py b/sapl/settings.py index 998d10b7d..52d0b2b53 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -60,8 +60,7 @@ INSTALLED_APPS = ( 'sass_processor', ) if DEBUG: - # INSTALLED_APPS += ('debug_toolbar',) - pass + INSTALLED_APPS += ('debug_toolbar',) MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', diff --git a/static/js/compilacao.js b/static/js/compilacao.js index 2adf251fa..6cd8fc345 100644 --- a/static/js/compilacao.js +++ b/static/js/compilacao.js @@ -33,3 +33,7 @@ function ReadCookie(cookieName) { if (ind1==-1) ind1=theCookie.length; return unescape(theCookie.substring(ind+cookieName.length+2,ind1)); } + +function insertWaitAjax(element) { + jQuery(element).append('
      '); +} diff --git a/static/js/compilacao_notas.js b/static/js/compilacao_notas.js index c31b2873b..4c6a09bda 100644 --- a/static/js/compilacao_notas.js +++ b/static/js/compilacao_notas.js @@ -6,12 +6,18 @@ function onEventsDneExec(pk) { }, 300); $('.dateinput').fdatepicker({ - // TODO localize - format: 'dd/mm/yyyy', - language: 'pt', - endDate: '31/12/2100', - todayBtn: true - }); + // TODO localize + format: 'dd/mm/yyyy', + language: 'pt', + endDate: '31/12/2100', + todayBtn: true + }); + + $('#dne'+pk+" .primary").click(onSubmitEditForm); + $('#dne'+pk+" .btn-close-container").click(function(){ + $(this).closest('.dne-nota').removeClass('dne-nota'); + $(this).closest('.dne-form').html(''); + }); $('#dne'+pk+" select[name='tipo']").change(function(event) { var url = ''; @@ -21,19 +27,71 @@ function onEventsDneExec(pk) { }); }); - $('#dne'+pk+" .button").click(onSubmitEditForm); + $('#dne'+pk+" select[name='tipo_norma']" + ).change(onChangeParamNorma); + + $('#dne'+pk+" input[name='num_norma'], " + + '#dne'+pk+" input[name='ano_norma'], " + + '#dne'+pk+" input[name='busca_dispositivo']" + ).change(onChangeParamNorma); + + $('#dne'+pk+" .btn-busca").click(onChangeParamNorma); + + onChangeParamNorma(); +} +var onChangeParamNorma = function(event) { + var tipo_norma = $("select[name='tipo_norma']").val(); + var num_norma = $("input[name='num_norma']").val(); + var ano_norma = $("input[name='ano_norma']").val(); + var busca_dispositivo = $("input[name='busca_dispositivo']").val(); + var dispositivo_ref = $("#id_dispositivo_ref").val(); + $('#id_dispositivo_ref').remove(); + + if (dispositivo_ref == null) + dispositivo_ref = '' + + var url = ''; + var pk = $("select[name='tipo_norma']").closest('.dne').attr('pk') + + var formData = { + 'tipo_norma' : tipo_norma, + 'num_norma' : num_norma, + 'ano_norma' : ano_norma, + 'busca' : busca_dispositivo, + 'tipo_form' : 'radio', + 'initial_ref' : dispositivo_ref + }; + + url = 'compilacao/search'; + $('.container-busca').html(''); + insertWaitAjax('.container-busca') + $.get(url, formData).done(function( data ) { + $('.container-busca').html(data); + $("input[name='dispositivo_ref']").first().prop('checked', true); + }); } var onSubmitEditForm = function(event) { + var url = ''; + var model = 'nota'; + var id_edit = null; var id_dispositivo = $('#id_dispositivo').val(); - var id_nota = $('#id_pk').val(); - var url = 'compilacao/'+id_dispositivo+'/nota/' - if (id_nota == '') + if (id_dispositivo == null) { // trata-se de um vide + $('#id_dispositivo_ref').remove(); + id_dispositivo = $('#id_dispositivo_base').val(); + model='vide'; + } + + id_edit = $('#id_pk').val(); + url = 'compilacao/'+id_dispositivo+'/'+model+'/' + if (id_edit == null || id_edit == '') url += 'create'; else - url += id_nota+'/edit'; + url += id_edit+'/edit'; + + console.log($('#dne'+id_dispositivo+" form").serialize()); $.post( url, $('#dne'+id_dispositivo+" form").serialize(), function(data) { @@ -44,7 +102,12 @@ var onSubmitEditForm = function(event) { } else { $('#dne'+id_dispositivo+' .dne-form').closest('.dpt').html(data) - onReadyNotas(); + onReadyNotasVides(); + + $('html, body').animate({ + scrollTop: $('#dne' + id_dispositivo ).offset().top - window.innerHeight / 3 + }, 300); + } } } @@ -52,55 +115,65 @@ var onSubmitEditForm = function(event) { } var onDelete = function(event) { + var model = $(event).attr('model'); + var id_dispositivo = $(event).closest('.dn').attr('pk'); - var id_nota = $(event).attr('pk'); - var url = 'compilacao/'+id_dispositivo+'/nota/'+id_nota+'/delete' + var id_delete = $(event).attr('pk'); + var url = 'compilacao/'+id_dispositivo+'/'+model+'/'+id_delete+'/delete'; $.get( url, function(data) { $('#dne'+id_dispositivo+' .dne-form').closest('.dpt').html(data) - onReadyNotas(); + onReadyNotasVides(); } ); } -function getFormNota(_this, _btn) { - var id_dispositivo = $('.dne-exec .dne-form').closest('.dne').attr('pk'); +function getForm(_this) { + + var url = ''; + var model = $(_this).attr('model'); + var id_dispositivo = $('.dne-nota .dne-form').closest('.dne').attr('pk'); if (id_dispositivo != null) { - $('#dne'+id_dispositivo).removeClass('dne-exec'); + $('#dne'+id_dispositivo).removeClass('dne-nota'); $('#dne'+id_dispositivo+' .dne-form').html(''); } - var url = ''; - if (_btn == 'btn-create') { + if (_this.className.indexOf('create') >= 0 ) { id_dispositivo = $(_this).attr('pk'); - url = 'compilacao/'+id_dispositivo+'/nota/create'; - } - else if (_btn == 'btn-edit') { - var id_nota = $(_this).attr('pk'); + url = 'compilacao/'+id_dispositivo+'/'+model+'/create'; + } + else if (_this.className.indexOf('edit') >= 0 ) { + var id_edit = $(_this).attr('pk'); id_dispositivo = $(_this).closest('.dn').attr('pk'); - url = 'compilacao/'+id_dispositivo+'/nota/'+id_nota+'/edit' + url = 'compilacao/'+id_dispositivo+'/'+model+'/'+id_edit+'/edit' } - $('#dne'+id_dispositivo).addClass('dne-exec'); + + $('#dne'+id_dispositivo).addClass('dne-nota'); $.get(url).done(function( data ) { $('#dne'+id_dispositivo+' .dne-form').html(data); onEventsDneExec(id_dispositivo); + }).fail(function() { + onReadyNotasVides(); }); } -function onReadyNotas() { - $('.dne .btn-create').off(); - $('.dne .btn-edit').off(); - $('.dne .btn-delete').off(); - $('.dne .btn-create').click(function(){ - getFormNota(this, 'btn-create') - }); - $('.dn .btn-edit').click(function(){ - getFormNota(this, 'btn-edit') + +function onReadyNotasVides() { + + $('.dne-nota').removeClass('dne-nota'); + $('.dne-form').html(''); + + $('.dne .btn-action').off(); + $('.dn .btn-action').off(); + + $('.dne .btn-action, .dn .btn-action').not('.btn-nota-delete').not('.btn-vide-delete').click(function(){ + getForm(this); }); - $('.dn .btn-delete').click(function(){ - onDelete(this, 'btn-delete') + + $('.dn .btn-nota-delete, .dn .btn-vide-delete').click(function(){ + onDelete(this); }); } $(document).ready(function() { - onReadyNotas() + onReadyNotasVides() }); diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index 923c01d95..f51ab838a 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -19,32 +19,34 @@ $color_actions_border: #CCC; @mixin placeholder($color, $opacity, $fontsize, $fontweight) { &::-webkit-input-placeholder { - color: $color; + color: $color !important; opacity: $opacity; font-size:$fontsize; font-weight: $fontweight; } &::-moz-placeholder { - color: $color; + color: $color !important; opacity: $opacity; font-size:$fontsize; font-weight: $fontweight; } &::-moz-placeholder { - color: $color; + color: $color !important; opacity: $opacity; font-size:$fontsize; font-weight: $fontweight; } &:-ms-input-placeholder { - color: $color; + color: $color !important; opacity: $opacity; font-size:$fontsize; font-weight: $fontweight; } } - +a:link:after, a:visited:after { + content: ""; +} @mixin li_flutuante() { @@ -142,7 +144,7 @@ $color_actions_border: #CCC; .cp { .desativado, .desativado * { text-decoration: line-through; - color: #777 !important; + color: #999 !important; table, table td { border: 1px dotted #ccc; @@ -273,7 +275,6 @@ $color_actions_border: #CCC; font-weight: normal; line-height: 1rem; position: relative; - text-decoration: none; p, ul { font-size: 0.8rem; font-weight: normal; @@ -281,14 +282,30 @@ $color_actions_border: #CCC; margin: 0 0 0 0; list-style: none; } + .dnl { /* Lista Notas de Dispositivo*/ display: block; - margin-left: 15%; + text-align: left !important; + + * { + display: inline; + } + .bullet { + padding: 0 0.333em; + padding-bottom: 0.2em; + display: inline-block; + } .dnli { - margin-top: 0.5em; - border-top: 1px solid #c7e3d3; - display: block; + min-height: 2.5em; + &:hover { + ul { + transition: opacity 0.5s linear, clip 0s 0.3s; + clip: auto; + opacity: 1; + background: rgba(230,230,230, 0.9); + } + } ul { transition: opacity 0.5s linear, clip 0s 0.3s; @@ -300,38 +317,27 @@ $color_actions_border: #CCC; padding: 0.5em 0.5em 0em 0.5em; border: 1px solid #c7e3d3; border-top: 0px; - } - - &:hover { - min-height: 2.5em; - ul { - transition: opacity 0.5s linear, clip 0s 0.3s; - clip: auto; - opacity: 1; - background: rgba(230,230,230, 0.9); - } - } - - li { - display: table-cell; - color: #aaa; - &.bullet { - padding: 0 0.333em; - padding-bottom: 0.2em; - } + li { + display: table-cell; + color: #aaa; - &:hover { - color: #787; - a{ + &:hover { + color: #787; + a{ + color: #27AE60 !important; + } + } + .nowner { color: #27AE60 !important; } } - } + .ntitulo { font-weight: bold; color: #676; font-size: 90%; + text-decoration: none; a{ color: #294 !important; } @@ -342,11 +348,24 @@ $color_actions_border: #CCC; color: #294 !important; } } - .nowner { - color: #27AE60; + } + &:hover { + display: block; + + + * { + display: block; + } + & > .bullet { + display: none; + } + .dnli { + margin-top: 0.5em; + border-top: 1px solid #c7e3d3; } } } + } .dptt { @@ -366,7 +385,7 @@ $color_actions_border: #CCC; font-size: 0.8rem; font-weight: normal; line-height: 1rem; - text-decoration: none; + text-decoration: none !important; } ul.btns-action { @@ -378,23 +397,32 @@ $color_actions_border: #CCC; opacity: 0; transition: opacity 1.5s linear, clip 1s linear; transition-delay: 0s; + border-collapse:separate; + border-spacing:0.5em; li { display: table-cell; - background-color: #ddd; - border-radius: 50%; a { + background-color: #DDD; border-radius: 50%; + width: 3rem; + height: 3rem; display: inline-block; - background: url(/static/img/hand-note.png) no-repeat 50% 50%; - padding: 1.2em 1.7em; + font-size: 203%; + line-height: 3rem; + text-align: center; + &.btn-nota-create { + background: #ddd url(/static/img/hand-note.png) no-repeat 50% 50%; + } + &.btn-vide-create { + } &:hover { - background-color: rgba(0, 150, 0, 0.1); + background-color: #Cdc ; } } } } } - .dne-exec { + .dne-nota { box-shadow: -4px 15px 15px rgba(0, 0, 0, 0.1), 0px 6px 6px rgba(0, 0, 0, 0.23); @include background-top-down(#f5f5f5, #eee); @@ -413,10 +441,18 @@ $color_actions_border: #CCC; &::before { color: red; content: "\2b25"; - padding: 0.333em; + padding: 0 0.333em; vertical-align: super; } } + .title_form { + font-size: 2.5em; + padding: 0.5em 0.3em 0.2em; + background: #e5e5e5; + color: #777; + margin-bottom: 0.4em; + border-bottom: 1px solid #aaa; + } fieldset { border: 0px; } @@ -429,6 +465,9 @@ $color_actions_border: #CCC; margin-top: 1em; display: inline-block; } + .columns { + padding: 0 0.5rem; + } .input { border: 0px; border-bottom: 1px solid #ccc; @@ -440,6 +479,14 @@ $color_actions_border: #CCC; @include placeholder(#777, 1, 100%, normal); &:focus { background: #fafafa; + @include placeholder(#456, 1, 100%, normal); + } + } + .textinput{ + @include placeholder(#777, 1, 90%, normal); + &:focus { + background: #fafafa; + @include placeholder(#456, 1, 90%, normal); } } .textinput[name='titulo']{ @@ -448,6 +495,10 @@ $color_actions_border: #CCC; font-weight: bold; border-bottom: 0; @include placeholder(#777, 1, 100%, bold); + &:focus { + background: #fafafa; + @include placeholder(#777, 1, 100%, bold); + } } .textarea { @@ -464,14 +515,67 @@ $color_actions_border: #CCC; .button { width: 100%; margin-top: 1.6em; - height: 2.3125rem; padding: 0; + height: 2.835em; + } + .btn-busca { + margin-top: 1.25em; + } + .container-busca { + ul{ + list-style: none; + display: table; + margin-left: 0; + border-collapse:separate; + border-spacing:1px; + + li { + display: table-row; + + &:nth-child(even) { + background-color: rgba(0, 0, 0, 0.05); + + } + &:nth-child(odd) { + background-color: rgba(0, 0, 0, 0.08); + + } + + .iteminput { + display: table-cell; + padding: 0.5em; + vertical-align: middle; + text-align: center; + + input { + margin: 0; + } + } + + .itemlabel { + display: table-cell; + + padding: 0.5em; + vertical-align: middle; + width: 100%; + } + } + } + .norma_title { + padding: 0.15em 0.7em; + background-color: rgba(0, 0, 0, 0.15); + margin: 0.1em 0.08em 0 0.1em; + } + .nomenclatura_heranca { + font-size: 90%; + color: #057dba; + } } } } &:hover { .dne { - height: 3.2em; + height: 4.3em; transform: scaleY(1); transition-delay: 1s; @@ -486,7 +590,7 @@ $color_actions_border: #CCC; } } } - .dne-exec { + .dne-nota { transition-delay: 0s; height: auto; @@ -639,6 +743,9 @@ $color_actions_border: #CCC; *:hover { color: #27AE60; } + .de { + cursor: pointer; + } } .articulacao{ margin-left: -0.8em; @@ -1043,8 +1150,54 @@ $color_actions_border: #CCC; } } } +} +.btn-busca { + background-color: #0093dd; + &:hover { + background-color: #007ebe; + } + &:focus { + background-color: #036190; + } +} +.btn-close-container{ + position: absolute; + background-color: #AAA; + width: 2em; + height: 2em; + border: 0.3em solid #FFF; + top: -0.9em; + right: -0.9em; + border-radius: 50%; + cursor: pointer; + opacity: 0.7; + transform: rotate(45deg); + + .icon-close{ + background: #FFF; + height: 1.2em; + position: absolute; + width: 0.2em; + top: 0.15em; + left: 0.66em; + + + &::after { + background: #FFF; + content: ""; + height: 0.2em; + left: -0.5em; + position: absolute; + top: 0.48em; + width: 1.2em; + } + } + &:hover{ + opacity: 1; + } } + .class_color_container { background: #ddd !important; } @@ -1149,7 +1302,6 @@ $color_actions_border: #CCC; } } - @media print { .cp .vigencias { display:none; diff --git a/templates/compilacao/ajax_form.html b/templates/compilacao/ajax_form.html new file mode 100644 index 000000000..52cbf0e30 --- /dev/null +++ b/templates/compilacao/ajax_form.html @@ -0,0 +1,3 @@ +{% load crispy_forms_tags %} +
      +{% crispy form form.helper%} diff --git a/templates/compilacao/dispositivo_search_fragment_form.html b/templates/compilacao/dispositivo_search_fragment_form.html new file mode 100644 index 000000000..636818388 --- /dev/null +++ b/templates/compilacao/dispositivo_search_fragment_form.html @@ -0,0 +1,43 @@ +{% load i18n %} +{% load compilacao_filters %} + +{% if object_list.count >= 100 %} +
      + {% trans 'Use argumentos para simplificar listagem...' %} +
      +{% endif %} + +{% for dpt in object_list %} + {% ifchanged dpt.norma%} + {% if not forloop.first %}
    {% endif %} +
    {{dpt.norma}}
    +
      + {% endifchanged %} + + {% if dpt.is_relative_auto_insert and dpt.dispositivo_pai and dpt.dispositivo_pai.nivel != 0 %} + +
    • +
      + +
      +
      + + {% nomenclatura_heranca dpt 1 1 %} +
      +
    • + {% endif%} + + {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao and not dpt.is_relative_auto_insert %} +
    • +
      + +
      +
      + + {% nomenclatura_heranca dpt 1 1 %} +
      +
    • + {% endif%} + + {% if forloop.last %}
    {% endif %} +{% endfor %} diff --git a/templates/compilacao/edit_bloco.html b/templates/compilacao/edit_bloco.html index 27348e7c9..2a188f636 100644 --- a/templates/compilacao/edit_bloco.html +++ b/templates/compilacao/edit_bloco.html @@ -106,7 +106,7 @@ {% endif %}
    {% spaceless %} - {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{% if dpt.texto == '' and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}({{dpt.tipo_dispositivo}} sem texto){%else%}{{ dpt.texto|safe }}{%endif%} +
    {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{% if dpt.texto == '' and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}({{dpt.tipo_dispositivo}} sem texto){%else%}{{ dpt.texto|safe }}{%endif%}
    {% if dpt.norma_publicada_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} {{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }} diff --git a/templates/compilacao/index_bloco.html b/templates/compilacao/index_bloco.html index a1ee1adb3..3cb398859 100644 --- a/templates/compilacao/index_bloco.html +++ b/templates/compilacao/index_bloco.html @@ -11,12 +11,12 @@ {% if forloop.first and view|isinst:'DispositivoView' %} {% else %} -
    +
    {% endif%} {% spaceless %}
    -
    +
    {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ dpt.rotulo }}{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto%}{{ dpt.texto|safe }}{%else%} {%endif%} {% if dpt.norma_publicada_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} @@ -25,57 +25,134 @@ {{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }} {% endif %} - {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao%} -
    {# TODO: User - dne - Dispostivo Nota Editor - tratar permissão de usuário#} - -
    -
    - {% endif%} + {% if user.is_authenticated and not dpt.tipo_dispositivo.dispositivo_de_articulacao%} + {% if perms.compilacao.add_nota or perms.compilacao.add_vide %} +
    {# TODO: User - dne - Dispostivo Nota Editor - tratar permissão de usuário#} +
      + {% if perms.compilacao.add_nota %}
    •  
    • {% endif %} + {% if perms.compilacao.add_vide %}
    • V
    • {% endif %} +
    +
    +
    + {% endif %} + {% endif%}
    + {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao%} -
    {# Dispostivo Nota#} - -
      {# Dispostivo Nota Lista#} - {% for nota in dpt.notas.all %}{# TODO: User - dnl - Dispostivo Nota Editor - tratar permissão de usuário quanto a publicidade#} -
    • -
        -
      • Editar
      • {# TODO: User - tratar permissão usuário #} -
      • -
      • Excluir
      • {# TODO: User - tratar permissão usuário #} -
      • - -
      • {{nota.tipo.nome}}
      • -
      • -
      • {%if nota.owner.first_name%}{{nota.owner.first_name}}{%else%}{{nota.owner}}{%endif%}
      • -
      • -
      • {{nota.publicacao|date:"d M Y"}}
      • -
      - - {%if nota.titulo %} -
      +
      {# Dispostivo Nota e Vides #} +
        {# Dispostivo Nota Lista#} + {% if cita and dpt.pk in cita %} + {% for vide in dpt.cita.all %} + {%if not forloop.first %}
      • {%endif%} +
      • + +
          + {% if user.is_authenticated %} + {% if perms.compilacao.change_vide %} +
        • Editar
        • +
        • + {%endif%} + {% if perms.compilacao.delete_vide %} +
        • Excluir
        • +
        • + {%endif%} + {% endif %} +
        • {{vide.tipo.nome}}
        • +
        • +
        • {{vide.created|date:"d M Y"}}
        • +
        +
        Vide:
        +
        + {% if dpt.is_relative_auto_insert %} + {{ vide.dispositivo_ref.dispositivo_pai}} + {% else %} + {{ vide.dispositivo_ref}} + {% endif %} + {% if vide.texto %} - {{vide.texto}}{% endif %} +
        +
      • + {% endfor %} + {% endif %} + + {% if citado and dpt.pk in citado %} + {% for vide in dpt.citado.all %} + {%if not forloop.first %}
      • {%endif%} +
      • +
          +
        • {{vide.tipo.nome}}
        • +
        • +
        • {{vide.created|date:"d M Y"}}
        • +
        +
        Citado em:
        +
        + {% if dpt.is_relative_auto_insert %} + {{ vide.dispositivo_base.dispositivo_pai}} + {% else %} + {{ vide.dispositivo_base}} + {% endif %} + {% if vide.texto %} - {{vide.texto}}{% endif %} +
        +
      • + + {% endfor %} + {% endif %} + + + {%if notas and dpt.pk in notas and dpt.pk in cita or dpt.pk in citado and notas%}
      • {%endif%} + + {% if notas and dpt.pk in notas %} + + {% for nota in dpt.notas.all %} + + {% if user.is_superuser or nota.publicidade == nota.NPUBL or nota.publicidade == nota.NINST and user.is_authenticated or nota.publicidade = nota.NPRIV and nota.owner == user %} + {%if not forloop.first %}
      • {%endif%} +
      • +
          + {% if user.is_authenticated %} + {% if user == nota.owner and perms.compilacao.change_nota or user.is_superuser%} +
        • Editar
        • +
        • + {% endif %} + {% if user == nota.owner and perms.compilacao.delete_nota or user.is_superuser %} +
        • Excluir
        • +
        • + {% endif %} + {% endif %} +
        • {{nota.tipo.nome}}
        • +
        • +
        • {%if nota.owner.first_name%}{{nota.owner.first_name}}{%else%}{{nota.owner}}{%endif%}
        • +
        • +
        • {{nota.publicacao|date:"d M Y"}}
        • +
        + + {%if nota.titulo %} +
        + {%if nota.url_externa %}{%endif%} + {{nota.titulo}} - + {%if nota.url_externa %}{%endif%} +
        + {%endif%} + +
        {%if nota.url_externa %}{%endif%} - {{nota.titulo}} - {%if nota.url_externa %}{%endif%} -
        - {%endif%} - -
        - {%if nota.url_externa %}{%endif%} - {{ nota.texto}} - {%if nota.url_externa %}{%endif%} -
        - -{%comment%} -
          -
        • {{nota.efetividade|date:"d M Y"}}
        • -
        • -
        • {{nota.get_publicidade_display}}
        • -
        -{%endcomment%} -
      • {# Dispostivo Nota Lista Item#} - {% endfor %} + {{ nota.texto}} + {%if nota.url_externa %}{%endif%} +
      + + {%comment%} +
        +
      • {{nota.efetividade|date:"d M Y"}}
      • +
      • +
      • {{nota.get_publicidade_display}}
      • +
      + {%endcomment%} +
    • + {% endif %} + + + + {% endfor %} + {% endif %}
    {% endif%} diff --git a/templates/compilacao/index_bloco_alteracao.html b/templates/compilacao/index_bloco_alteracao.html index e5925a8ac..ef12970ed 100644 --- a/templates/compilacao/index_bloco_alteracao.html +++ b/templates/compilacao/index_bloco_alteracao.html @@ -3,9 +3,9 @@ {% spaceless %}
    -
    + {{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ ch.rotulo }}{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }} -
    +
    {% endspaceless %} diff --git a/templates/compilacao/nota_ajaxform.html b/templates/compilacao/nota_ajaxform.html deleted file mode 100644 index 8b032736f..000000000 --- a/templates/compilacao/nota_ajaxform.html +++ /dev/null @@ -1,3 +0,0 @@ -{% load crispy_forms_tags %} -{% crispy form form.helper%} - From 990ce4aa263b45e32eda967b2bdb0622deb23194 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Tue, 1 Dec 2015 16:53:33 -0200 Subject: [PATCH 22/23] Impl. of features for editing notes and quotes. --- .../migrations/0027_auto_20151130_1632.py | 33 ++++++++++++++++++ .../migrations/0028_auto_20151201_0042.py | 18 ++++++++++ .../migrations/0029_auto_20151201_1611.py | 19 ++++++++++ norma/migrations/0007_auto_20151130_1632.py | 19 ++++++++++ norma/models.py | 2 +- static/img/ajax-loader.gif | Bin 0 -> 7360 bytes 6 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 compilacao/migrations/0027_auto_20151130_1632.py create mode 100644 compilacao/migrations/0028_auto_20151201_0042.py create mode 100644 compilacao/migrations/0029_auto_20151201_1611.py create mode 100644 norma/migrations/0007_auto_20151130_1632.py create mode 100644 static/img/ajax-loader.gif diff --git a/compilacao/migrations/0027_auto_20151130_1632.py b/compilacao/migrations/0027_auto_20151130_1632.py new file mode 100644 index 000000000..81c64d951 --- /dev/null +++ b/compilacao/migrations/0027_auto_20151130_1632.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0026_auto_20151122_1756'), + ] + + operations = [ + migrations.AlterModelOptions( + name='nota', + options={'verbose_name': 'Nota', 'ordering': ['-publicacao', '-modified'], 'verbose_name_plural': 'Notas'}, + ), + migrations.AlterField( + model_name='nota', + name='titulo', + field=models.CharField(verbose_name='Título', default='', blank=True, max_length=100), + ), + migrations.AlterField( + model_name='vide', + name='dispositivo_base', + field=models.ForeignKey(verbose_name='Dispositivo Base', related_name='cita', to='compilacao.Dispositivo'), + ), + migrations.AlterField( + model_name='vide', + name='dispositivo_ref', + field=models.ForeignKey(verbose_name='Dispositivo Referido', related_name='citado', to='compilacao.Dispositivo'), + ), + ] diff --git a/compilacao/migrations/0028_auto_20151201_0042.py b/compilacao/migrations/0028_auto_20151201_0042.py new file mode 100644 index 000000000..990c31fbc --- /dev/null +++ b/compilacao/migrations/0028_auto_20151201_0042.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0027_auto_20151130_1632'), + ] + + operations = [ + migrations.AlterUniqueTogether( + name='vide', + unique_together=set([('dispositivo_base', 'dispositivo_ref')]), + ), + ] diff --git a/compilacao/migrations/0029_auto_20151201_1611.py b/compilacao/migrations/0029_auto_20151201_1611.py new file mode 100644 index 000000000..34055d72c --- /dev/null +++ b/compilacao/migrations/0029_auto_20151201_1611.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0028_auto_20151201_0042'), + ] + + operations = [ + migrations.AlterField( + model_name='nota', + name='publicidade', + field=models.PositiveSmallIntegerField(verbose_name='Nível de Publicidade', choices=[(1, 'Nota Privada'), (2, 'Nota Institucional'), (3, 'Nota Pública')]), + ), + ] diff --git a/norma/migrations/0007_auto_20151130_1632.py b/norma/migrations/0007_auto_20151130_1632.py new file mode 100644 index 000000000..745eda239 --- /dev/null +++ b/norma/migrations/0007_auto_20151130_1632.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0006_auto_20151025_1427'), + ] + + operations = [ + migrations.AlterField( + model_name='normajuridica', + name='complemento', + field=models.NullBooleanField(verbose_name='Complementar ?', choices=[(True, 'Sim'), (False, 'Não')]), + ), + ] diff --git a/norma/models.py b/norma/models.py index 875687f1b..d718c3c0d 100644 --- a/norma/models.py +++ b/norma/models.py @@ -3,7 +3,7 @@ from django.template import defaultfilters from django.utils.translation import ugettext_lazy as _ from materia.models import MateriaLegislativa -from sapl.utils import make_choices, YES_NO_CHOICES +from sapl.utils import YES_NO_CHOICES, make_choices class AssuntoNorma(models.Model): diff --git a/static/img/ajax-loader.gif b/static/img/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..812bcf757a1dfb8f851886cfceab676628c8e23b GIT binary patch literal 7360 zcmds+`&$!d+Q;XVIb<@K$$4gyNoFRN+ z5Kf8+f{F?f@K8L|qSk6v+yoI16%1$<54B*`QnjvC+qHe&_KkbJ-QDYYukLUAOXnYW zuKC`d?|pyo=NU70bi(jiEWiTW03bIf_vo>swVP{i-ndy-UUs4T!tOo0A3uETFY=!~ zb9U?Yt@rNSt6o=q?aH^k?|c98 zH;>C!l%4H7yL;#Ed-w0vZmhj_{o2vPN1uNG^oJjQ0RB6l^aJ^F($p!g#FV5VgW_N? za*FgVLXdzA#6COm*>3{q_m0ZUnCTM`-h11%V8n}-QpBN{=Ikl1I@Facb`P{aj`@xA zDlzx@x^Z~@J^Pe}3z?D^{HY0n!apqKmbyrU&q7SUm**A~EJyh&ge-GP1sKL9A;sg@ zyXZ}rAZd*CXrr4Ggj&l^aQ?bPk#x zx&U{uRtSR6U^W9xns4aAGX@)M+phmwX*h^clx>j=eiOHpS=$gQe0!bSF*)cffOCI8 zA}z-A;P@~N#q)7qsWo5qsxiJNB@iqmv5jdxC13%Jfzj@gia_*f60XY)dU^*)IHSw& zzSa!h+NL5bPZ5n6JiF2OXq9S&6e?7jN)hn?M6>@(w8Eu-UiyrTjsGBH#lMk}|8Hch z`4<__m}q~-L`0ssAz@==Z_O%!G$2Q6|JMHdso+4JVru zW27F!8z|M1Ca5u|E(4@0-_%RYu-T`k%`39FvtkmS{?>D!wpu_ki>Bv0tu~d(q?-4- zTwGkLUZt{GUw0Mr#Ywg@m00Vl;_GDsYE*A`(>v-p8w71@cG4K%qBTGU`tT9#BxX3H zJmHivs}<8;INKq2cPl?`J3*7yUP*b=*uj%uU<#!mXgWxvkvt}#e(gt)O~z4((Zx#LbSBCXESh+wlY zS2#w)lp0&JM;DsVhMirG&Q}3o@wd^j#{6w%P4f@T4?_HFLBe9TX-Av`qxg!*7Fs}`;&JZ{S8N9GL2abSvqEc z)2h_ItrgQ{#XOx3pJ@lR70ONNc9^LFBs-?urG*>a79F4i?FvCq>fdwAl3B^u9uka4 zQ{>Y!hj!2>TWCLeRvmWJmp|gTrc2JtmnF4YI(JFt@6eiCYVuQ>e@Ii31X@15a~A`D z&~LWI8uIo-ElR7pCmH5NZI&xnWsl?X)S6@-8=B0zvFf{V2WC^Vr$Od z(+2q;qm|x#y?2pX4l1ZNl|T~i@&R*wsQYa^P(p}UM*+?I_x zyoB4S+2fWW-BFE(Q*-YgauG)X<+B>oZ7ypB4oJEPo^zuB!-5y}mt8W++w~x*@4O-3 zmo5Do@=Lmi7LRG(xctpGGOu+fS2*;0FN_-yc{Ev>74Qx4?pOM`q}KzjSl zJK9ar8S&pR0If=$hmice;rc{y5Wepz5WaM!iNjIxksnb2OVJ*(6lSFkBS?@M) zVQ|bQ?$6%klB|rD(U?I{-1&jad_-%}=|CNQ+$Cru-Boj1)9Ioa;E3ir(c|R00fzXT z=;*w{W}%P9zf>B`-`V;kgGFtf8`B&?f6^{zjB4;rmya~@bDIbBhv32+;;=&x zX36YIksDXq(|g>j^!cZq4Gt-ARJx4S@!5+*`D$!Lvp!2RL5!_34D30Y9cUWA%w|$0 zJXhThu8aE}b;q;6ptE}NKQ;Rq`XnCW3LA9;|KXEaaZ9VUW0O*dh);a>DPN`?xVqXA z27Yasnc0DN>?jrg`ikzrly@*1 z%NqqKhi-4e#$7^5*LD5V`?84bZ$Xcedr4o5M4e61nm8xvaNmUX= z#4aSHG8(}ob3h|(ahsYD6=pCWqMF^31u-IKN}({<9&srUglA1{iimImf6;2XeE7VR zK8qt1Wx9HeLvX(DhOPUWfHSztK-p}Kr_9V#i(rG%sT+;0FhVf$NET>z9-C~A68*t> ziG?f4YpZww^t$0s22M*0C)(@FtuGwau1SnKt>&zLRx2YokN~E6*Yw?r@zoEWb1}AJ zC{&{o)KM=nk9_AhnpO8K%kYe%zzY-aFXpFiKRY?`=Q~=uRSEhrG0eP-Nbp8ogx{$i z(;l1{seO{1dSLd!qVgQzgR;}rw}yW*IVOtg&#%fd#nLi88jLhIgLZ+FS6Ff_q(>Ho zQiC!bE>|ehJ$AALg7kKpty5S7ZfdK|z?1BOmG3%b6tdYAFh#N0AvfEiQi~x`KH=ttbH*z|kMvSrgdSY1|F{C+|!hR617N z_ie;GeOoG%-O*=&Q{a_|elO3OGZBprJdb|XqrIs(pJQB>VP@?Gu8&yktTqLSg>NPTL+eB5?yKGzadQO0MEPU4`sr3+KBH>W_ zAt%)WiH4A2bDI;hc3BJ;4tBl+sjLu58pumd+N!$p$tO~uV7#Xk{#wvyiWpA4U%+;^ zNlN6g*=jlUW`NrR@!!8%Qk|Gyr21m|D`KFb5ne^n-7ZTl$1cWzI#}C3f-h6a% z2%A(^t4MQCA0L*`k#U~PhLobW?=GFu?CHB+h5e6c+!d_w76MME!&1$RD}jvow8vp( zWBWK!+4NRs08k*jTbt3lC=3A+)f_+~6f>a)8CIgK1pfFkG3w3v&5rZ0V8obZ&YoAP z>BRuV^hX86)~zu=6XmJ~@=Yu$!` z9agJ3HP2)3V7pwhhC3qex8@&oi5!Y*uv1n!rz=z@Uo-9SKj25i3l6;dq?)Wjgnfj9NE`m=hde{@1FKli3`!o-)X1S zXxH+*PA7);N_p2l5rxk+c1&y5cgm8W6dE}|r)zAXw8}>_(CBMdGx4=83BcVIVY6|6mQ^i<*SQ z{o&%%2Z{NkensjR0OK4n6G2eTK4KEVjz~<(tl$UWKiw_oj#zmnu&+O&+pK=?gn_^5 z8GVa0jA}~0{q^~bG`{%$LD!6FYi})SX!i0$FC3S2%9oD8CX>Rf5K_6)x6&pH1!lsW zwwxPXHiI))5H>k)-TE0aNkoDxT|c@pMN(**4SD-_r;xfsinrfBkivmMLe7y|+_WyJ zGXsFS-9>|<2qGN-7nV7-`eRj(=_<@#C&Uh|J}iOk1DiqnSWC6r(C^qQ`o|1^r+K=^ zTX2kW8XXnQ6~UGmX;fxP&aIh*UkFQZ7_^t5RsTe$H#&qx4DM5dH%LsRGFBq-B6anXdm@&$i)ODS+yM{+p zYxv4LGWM4}p&Oi`Xb3ky^}|zn=!QLmm#BX6(b`b&qj{D| zp*gZ2z*~#k+mD_8Xr|^o!DzKisFjN>g@pBzmg+KqpiTiY_mm$+qxYL0B!S z!AX|;Qghh%3Wni{`d}g8LlM=eCe9lI1~ONMW%ML_fg+T2S0b=rgs+5q-JBE_@8q`E7Y3zg^6CDbBbD2F8hzFSvM3s ztROV?ZF64B>7V-I$^zX$6*u(M&1I9NKOQ<^e;ArNJEEHJ?hB)iI-~v^wAB_0R$R9% zgIi=PrJZ`9T*z>7aH)-y4dvzQE1j5)YM@1JIaKF{O}l*C08^7opmxEy_R#XZw4%in zS)P%-uA}CbU~Ah9bBCE{82oS(OU5fw z=xxMWQHep`=1UXXAP9dxs|Fj;1~AN*&ude?k!u7MoA4wY)wY#jEeYOfePjJARU@+) zhp%9~8da4bp$DfG^mD&U?b#tl3#dvQ*Z2i6dmFG$Ig{^kywQ&`mNk4$IIyEa{7G}F z3awn!5ch&%tLZ=7j_Zi4Yt3(%RrcDk^W{%`6wq0}=WoILvBnLr-N-Fxi%%9jp=^Vq zw13nJ(`5Qj1_L=))_Vb*EOgQ<46uJWNUVLxQS72cCWYDFo@Yyx5LTpj>PE5 z7PM%8k&Uv!IL;f7RYz#0K5RcFOQ!Rb@k69+KX+b1DR~63oe~tcZJJ2zV~=$cX7iu! z8jYXrAc+U&x$M^}2%k8jLd-w*mcYh6==HS%v668@4HNQwKw6DT2AJ(#%Wwmu0F7rh z;&W;72cj2JC@hiu(+eP{*BF}90^wB9J^@DOUPJ~brZ&J}?&4|u(&!SXWuy?p0In2_ z808+I{c-2~`OUKFnQD92oNpOT{qaI*h%d{1rg-#SzjAoVX(VoJ{DJ8m7tP+3lU0d- z-Zjb+KPfIswZmH?FT<=DJ=u&eMA(^jy1-glWEb#th;dcq^?}@+Oqxr~)J7L?-E5Tg zX2dLPcUvP*4w&*iWZOO`f8Ya^>3CL4Ief}^9D&+5of2VFYe%Onc8QQmWjoPAQ#WAY z6Wj7gGox4|VY5N%PVp{V0DWtKTday7Sk-VQrNN2O+vD}U4}NtXr?tv){k_bYe1u5I z#1jygn^2BOX%2uZQM*RFb>x~ciOGt{GY77b9e`4w8r_t Date: Tue, 1 Dec 2015 17:35:06 -0200 Subject: [PATCH 23/23] remove file old error --- .../migrations/0007_auto_20151119_1944.py | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 parlamentares/migrations/0007_auto_20151119_1944.py diff --git a/parlamentares/migrations/0007_auto_20151119_1944.py b/parlamentares/migrations/0007_auto_20151119_1944.py deleted file mode 100644 index 6c10fa9da..000000000 --- a/parlamentares/migrations/0007_auto_20151119_1944.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('parlamentares', '0006_auto_20151119_1318'), - ] - - operations = [ - migrations.AlterField( - model_name='parlamentar', - name='unidade_deliberativa', - field=models.BooleanField(), - ), - ]