From 5d0272b3c7c0a57e493904a4b183c165bb3114a5 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Wed, 23 Dec 2015 19:36:11 -0200 Subject: [PATCH] Criar Texto Articulado e seu CRUD --- compilacao/file2dispositivo.py | 327 ---- compilacao/forms.py | 76 +- compilacao/insert_inicial_TipoDispositivo.sql | 349 ----- .../migrations/0033_auto_20151222_1608.py | 119 ++ .../migrations/0034_auto_20151222_1609.py | 22 + .../migrations/0035_auto_20151223_1709.py | 32 + compilacao/models.py | 114 +- compilacao/templatetags/compilacao_filters.py | 8 +- compilacao/urls.py | 66 +- compilacao/utils.py | 83 + compilacao/views.py | 1351 +---------------- compilacao/views2.py | 1351 +++++++++++++++++ materia/urls.py | 10 +- norma/urls.py | 5 +- requirements/requirements.txt | 1 - sapl/utils.py | 27 - static/styles/compilacao.scss | 2 +- .../dispositivo_search_fragment_form.html | 8 +- templates/compilacao/edit.html | 2 +- templates/compilacao/edit_bloco.html | 8 +- .../compilacao/edit_bloco_alteracao.html | 2 +- templates/compilacao/form.html | 6 + templates/compilacao/index.html | 14 +- templates/compilacao/index_bloco.html | 14 +- .../compilacao/index_bloco_alteracao.html | 2 +- .../compilacao/textoarticulado_detail.html | 71 + .../compilacao/textoarticulado_list.html | 61 + 27 files changed, 2005 insertions(+), 2126 deletions(-) delete mode 100644 compilacao/file2dispositivo.py delete mode 100644 compilacao/insert_inicial_TipoDispositivo.sql create mode 100644 compilacao/migrations/0033_auto_20151222_1608.py create mode 100644 compilacao/migrations/0034_auto_20151222_1609.py create mode 100644 compilacao/migrations/0035_auto_20151223_1709.py create mode 100644 compilacao/utils.py create mode 100644 compilacao/views2.py create mode 100644 templates/compilacao/form.html create mode 100644 templates/compilacao/textoarticulado_detail.html create mode 100644 templates/compilacao/textoarticulado_list.html diff --git a/compilacao/file2dispositivo.py b/compilacao/file2dispositivo.py deleted file mode 100644 index e6bbb6ae8..000000000 --- a/compilacao/file2dispositivo.py +++ /dev/null @@ -1,327 +0,0 @@ -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/forms.py b/compilacao/forms.py index 9cb8617bc..46b899bb5 100644 --- a/compilacao/forms.py +++ b/compilacao/forms.py @@ -1,13 +1,18 @@ + from crispy_forms.helper import FormHelper -from crispy_forms.layout import HTML, Button, Column, Div, Field, Layout, Row +from crispy_forms_foundation.layout import (HTML, Column, Div, Fieldset, + Layout, Row, Submit) +from crispy_forms_foundation.layout.buttons import Button, ButtonHolder +from crispy_forms_foundation.layout.fields import Field from django import forms from django.core.exceptions import NON_FIELD_ERRORS from django.forms.models import ModelForm from django.utils.translation import ugettext_lazy as _ -from compilacao.models import Dispositivo, Nota, TipoNota, TipoVide, Vide +from compilacao.models import Dispositivo, Nota, TipoNota, TipoVide, Vide,\ + TextoArticulado, TipoTextoArticulado +from compilacao.utils import to_row, to_column from norma.models import TipoNormaJuridica -from sapl.layout import to_column, to_row class UpLoadImportFileForm(forms.Form): @@ -20,6 +25,71 @@ nota_error_messages = { 'invalid': _('URL inválida.') } +ta_error_messages = { + 'required': _('Este campo é obrigatório'), +} + + +class TaForm(ModelForm): + tipo_ta = forms.ModelChoiceField( + label=_('Tipo do Texto Articulado'), + queryset=TipoTextoArticulado.objects.all(), + required=True, + empty_label=None) + numero = forms.IntegerField(label=_('Número'), required=True) + ano = forms.IntegerField(label=_('Ano'), required=True) + + data = forms.DateField( + label=_('Data'), + input_formats=['%d/%m/%Y'], + required=True, + widget=forms.DateInput( + format='%d/%m/%Y'), + error_messages=ta_error_messages + ) + ementa = forms.CharField( + label='', + widget=forms.Textarea, + error_messages=ta_error_messages) + observacao = forms.CharField( + label='', + widget=forms.Textarea, + error_messages=ta_error_messages, + required=False) + + class Meta: + model = TextoArticulado + fields = ['tipo_ta', + 'numero', + 'ano', + 'data', + 'ementa', + 'observacao', + ] + + def __init__(self, *args, **kwargs): + + row1 = to_row([ + ('tipo_ta', 5), + ('numero', 2), + ('ano', 2), + ('data', 3), + ]) + + self.helper = FormHelper() + self.helper.layout = Layout( + row1, + Fieldset(_('Ementa'), Column('ementa'), css_class="large-12"), + Fieldset( + _('Observações'), Column('observacao'), css_class="large-12"), + ButtonHolder( + Submit('Save', 'Save', + css_class='radius') + ) + ) + + super(TaForm, self).__init__(*args, **kwargs) + class NotaForm(ModelForm): NPRIV = 1 diff --git a/compilacao/insert_inicial_TipoDispositivo.sql b/compilacao/insert_inicial_TipoDispositivo.sql deleted file mode 100644 index c37f5f14c..000000000 --- a/compilacao/insert_inicial_TipoDispositivo.sql +++ /dev/null @@ -1,349 +0,0 @@ --- --- PostgreSQL database dump --- - --- 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 --- - diff --git a/compilacao/migrations/0033_auto_20151222_1608.py b/compilacao/migrations/0033_auto_20151222_1608.py new file mode 100644 index 000000000..ae5f7a647 --- /dev/null +++ b/compilacao/migrations/0033_auto_20151222_1608.py @@ -0,0 +1,119 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0032_auto_20151213_1538'), + ] + + operations = [ + migrations.CreateModel( + name='PerfilEstruturalTextoArticulado', + fields=[ + ('id', models.AutoField( + auto_created=True, serialize=False, primary_key=True, + verbose_name='ID')), + ('sigla', models.CharField( + unique=True, max_length=10, verbose_name='Sigla')), + ('nome', models.CharField(max_length=50, verbose_name='Nome')), + ('padrao', models.BooleanField( + choices=[(True, 'Sim'), (False, 'Não')], default=False, + verbose_name='Padrão')), + ], + options={ + 'verbose_name_plural': 'Perfis Estruturais de' + ' Textos Articulados', + 'verbose_name': 'Perfil Estrutural de Texto Articulado', + 'ordering': ['-padrao', 'sigla'], + }, + ), + migrations.CreateModel( + name='TextoArticulado', + fields=[ + ('id', models.AutoField( + auto_created=True, + serialize=False, primary_key=True, verbose_name='ID')), + ('created', models.DateTimeField( + auto_now_add=True, verbose_name='created')), + ('modified', models.DateTimeField( + auto_now=True, verbose_name='modified')), + ('data', models.DateField( + blank=True, null=True, verbose_name='Data')), + ('ementa', models.TextField(verbose_name='Ementa')), + ('observacao', models.TextField( + blank=True, null=True, verbose_name='Observação')), + ('numero', models.PositiveIntegerField(verbose_name='Número')), + ('ano', models.PositiveSmallIntegerField(verbose_name='Ano')), + ], + options={ + 'verbose_name_plural': 'Textos Articulados', + 'verbose_name': 'Texto Articulado', + }, + ), + migrations.AlterModelOptions( + name='dispositivo', + options={'verbose_name_plural': 'Dispositivos', + 'verbose_name': 'Dispositivo'}, + ), + migrations.RemoveField( + model_name='publicacao', + name='norma', + ), + migrations.AlterField( + model_name='dispositivo', + name='visibilidade', + field=models.BooleanField(choices=[( + True, 'Sim'), (False, 'Não')], default=False, + verbose_name='Visibilidade no Texto Articulado Publicado'), + ), + migrations.AlterField( + model_name='tipodispositivorelationship', + name='perfil', + field=models.ForeignKey( + to='compilacao.PerfilEstruturalTextoArticulado'), + ), + migrations.AlterUniqueTogether( + name='dispositivo', + unique_together=set([]), + ), + migrations.DeleteModel( + name='PerfilEstruturalTextosNormativos', + ), + migrations.RemoveField( + model_name='dispositivo', + name='norma', + ), + migrations.RemoveField( + model_name='dispositivo', + name='norma_publicada', + ), + migrations.AddField( + model_name='dispositivo', + name='ta', + field=models.ForeignKey( + related_name='dispositivos_set', + verbose_name='Texto Articulado', + to='compilacao.TextoArticulado', default=1), + preserve_default=False, + ), + migrations.AddField( + model_name='dispositivo', + name='ta_publicado', + field=models.ForeignKey( + related_name='dispositivos_alterados_pelo_ta_set', blank=True, + verbose_name='Texto Articulado Publicado', + default=None, to='compilacao.TextoArticulado', null=True), + ), + migrations.AddField( + model_name='publicacao', + name='ta', + field=models.ForeignKey( + verbose_name='Texto Articulado', + to='compilacao.TextoArticulado', default=1), + preserve_default=False, + ), + ] diff --git a/compilacao/migrations/0034_auto_20151222_1609.py b/compilacao/migrations/0034_auto_20151222_1609.py new file mode 100644 index 000000000..f77cd2634 --- /dev/null +++ b/compilacao/migrations/0034_auto_20151222_1609.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0033_auto_20151222_1608'), + ] + + operations = [ + migrations.AlterModelOptions( + name='dispositivo', + options={'ordering': ['ta', 'ordem'], 'verbose_name_plural': 'Dispositivos', 'verbose_name': 'Dispositivo'}, + ), + migrations.AlterUniqueTogether( + name='dispositivo', + unique_together=set([('ta', 'dispositivo0', 'dispositivo1', 'dispositivo2', 'dispositivo3', 'dispositivo4', 'dispositivo5', 'tipo_dispositivo', 'dispositivo_pai', 'ta_publicado', 'publicacao'), ('ta', 'ordem')]), + ), + ] diff --git a/compilacao/migrations/0035_auto_20151223_1709.py b/compilacao/migrations/0035_auto_20151223_1709.py new file mode 100644 index 000000000..071cf3da5 --- /dev/null +++ b/compilacao/migrations/0035_auto_20151223_1709.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0034_auto_20151222_1609'), + ] + + operations = [ + migrations.CreateModel( + name='TipoTextoArticulado', + fields=[ + ('id', models.AutoField(auto_created=True, serialize=False, primary_key=True, verbose_name='ID')), + ('sigla', models.CharField(max_length=3, verbose_name='Sigla')), + ('descricao', models.CharField(max_length=50, verbose_name='Descrição')), + ], + options={ + 'verbose_name_plural': 'Tipos de Texto Articulados', + 'verbose_name': 'Tipo de Texto Articulado', + }, + ), + migrations.AddField( + model_name='textoarticulado', + name='tipo_ta', + field=models.ForeignKey(to='compilacao.TipoTextoArticulado', default=1, verbose_name='Tipo de Texto Articulado'), + preserve_default=False, + ), + ] diff --git a/compilacao/models.py b/compilacao/models.py index a96818b60..8c213c57d 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -4,11 +4,11 @@ from django.contrib.auth.models import User from django.db import models from django.db.models import F, Q from django.db.models.aggregates import Max +from django.template import defaultfilters from django.utils.translation import ugettext_lazy as _ -from norma.models import NormaJuridica -from sapl import utils -from sapl.utils import YES_NO_CHOICES +from compilacao import utils +from compilacao.utils import YES_NO_CHOICES class TimestampedMixin(models.Model): @@ -58,6 +58,41 @@ class BaseModel(models.Model): raise ValidationError(msg) +class TipoTextoArticulado(models.Model): + sigla = models.CharField(max_length=3, verbose_name=_('Sigla')) + descricao = models.CharField(max_length=50, verbose_name=_('Descrição')) + + class Meta: + verbose_name = _('Tipo de Texto Articulado') + verbose_name_plural = _('Tipos de Texto Articulados') + + def __str__(self): + return self.descricao + + +class TextoArticulado(TimestampedMixin): + data = models.DateField(blank=True, null=True, verbose_name=_('Data')) + ementa = models.TextField(verbose_name=_('Ementa')) + observacao = models.TextField( + blank=True, null=True, verbose_name=_('Observação')) + numero = models.PositiveIntegerField(verbose_name=_('Número')) + ano = models.PositiveSmallIntegerField(verbose_name=_('Ano')) + tipo_ta = models.ForeignKey( + TipoTextoArticulado, + verbose_name=_('Tipo de Texto Articulado')) + + class Meta: + verbose_name = _('Texto Articulado') + verbose_name_plural = _('Textos Articulados') + ordering = ['-data', '-numero'] + + def __str__(self): + return _('Texto Articulado nº %(numero)s de %(data)s') % { + 'tipo': self.tipo_ta, + 'numero': self.numero, + 'data': defaultfilters.date(self.data, "d \d\e F \d\e Y")} + + class TipoNota(models.Model): sigla = models.CharField( max_length=10, unique=True, verbose_name=_('Sigla')) @@ -259,7 +294,7 @@ class TipoDispositivo(BaseModel): self, pai_relativo, include_relative_autos=True, perfil_pk=None): if not perfil_pk: - perfis = PerfilEstruturalTextosNormativos.objects.filter( + perfis = PerfilEstruturalTextoArticulado.objects.filter( padrao=True)[:1] if not perfis.exists(): @@ -279,7 +314,7 @@ class TipoDispositivo(BaseModel): self, base, perfil_pk=None): if not perfil_pk: - perfis = PerfilEstruturalTextosNormativos.objects.filter( + perfis = PerfilEstruturalTextoArticulado.objects.filter( padrao=True)[:1] if not perfis.exists(): @@ -294,7 +329,7 @@ class TipoDispositivo(BaseModel): return False -class PerfilEstruturalTextosNormativos(BaseModel): +class PerfilEstruturalTextoArticulado(BaseModel): sigla = models.CharField( max_length=10, unique=True, verbose_name=_('Sigla')) nome = models.CharField(max_length=50, verbose_name=_('Nome')) @@ -303,8 +338,8 @@ class PerfilEstruturalTextosNormativos(BaseModel): 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') + verbose_name = _('Perfil Estrutural de Texto Articulado') + verbose_name_plural = _('Perfis Estruturais de Textos Articulados') ordering = ['-padrao', 'sigla'] @@ -317,7 +352,7 @@ class TipoDispositivoRelationship(BaseModel): filho_permitido = models.ForeignKey( TipoDispositivo, related_name='possiveis_pais') - perfil = models.ForeignKey(PerfilEstruturalTextosNormativos) + perfil = models.ForeignKey(PerfilEstruturalTextoArticulado) filho_de_insercao_automatica = models.BooleanField( default=False, choices=YES_NO_CHOICES, verbose_name=_('Filho de Inserção Automática')) @@ -369,8 +404,8 @@ class VeiculoPublicacao(models.Model): class Publicacao(TimestampedMixin): - norma = models.ForeignKey( - NormaJuridica, verbose_name=_('Norma Jurídica')) + ta = models.ForeignKey( + TextoArticulado, verbose_name=_('Texto Articulado')) veiculo_publicacao = models.ForeignKey( VeiculoPublicacao, verbose_name=_('Veículo de Publicação')) tipo_publicacao = models.ForeignKey( @@ -467,7 +502,7 @@ class Dispositivo(BaseModel, TimestampedMixin): visibilidade = models.BooleanField( default=False, choices=YES_NO_CHOICES, - verbose_name=_('Visibilidade na Norma Publicada')) + verbose_name=_('Visibilidade no Texto Articulado Publicado')) tipo_dispositivo = models.ForeignKey( TipoDispositivo, @@ -478,15 +513,15 @@ class Dispositivo(BaseModel, TimestampedMixin): Publicacao, blank=True, null=True, default=None, verbose_name=_('Publicação')) - norma = models.ForeignKey( - NormaJuridica, + ta = models.ForeignKey( + TextoArticulado, related_name='dispositivos_set', - verbose_name=_('Norma Jurídica')) - norma_publicada = models.ForeignKey( - NormaJuridica, + verbose_name=_('Texto Articulado')) + ta_publicado = models.ForeignKey( + TextoArticulado, blank=True, null=True, default=None, - related_name='dispositivos_alterados_pela_norma_set', - verbose_name=_('Norma Jurídica Publicada')) + related_name='dispositivos_alterados_pelo_ta_set', + verbose_name=_('Texto Articulado Publicado')) dispositivo_subsequente = models.ForeignKey( 'self', @@ -517,10 +552,10 @@ class Dispositivo(BaseModel, TimestampedMixin): class Meta: verbose_name = _('Dispositivo') verbose_name_plural = _('Dispositivos') - ordering = ['norma', 'ordem'] + ordering = ['ta', 'ordem'] unique_together = ( - ('norma', 'ordem',), - ('norma', + ('ta', 'ordem',), + ('ta', 'dispositivo0', 'dispositivo1', 'dispositivo2', @@ -529,14 +564,14 @@ class Dispositivo(BaseModel, TimestampedMixin): 'dispositivo5', 'tipo_dispositivo', 'dispositivo_pai', - 'norma_publicada', + 'ta_publicado', 'publicacao',), ) def __str__(self): - return '%(rotulo)s - %(norma)s' % { + return '%(rotulo)s - %(ta)s' % { 'rotulo': (self.rotulo if self.rotulo else self.tipo_dispositivo), - 'norma': self.norma} + 'ta': self.ta} def rotulo_padrao(self, local_insert=0, for_insert_in=0): """ @@ -774,36 +809,37 @@ class Dispositivo(BaseModel, TimestampedMixin): proximo_bloco = Dispositivo.objects.filter( ordem__gt=self.ordem, nivel__lte=self.nivel, - norma_id=self.norma_id)[:1] + ta_id=self.ta_id)[:1] elif local == 'add_in': proximo_bloco = Dispositivo.objects.filter( ordem__gt=self.ordem, nivel__lte=self.nivel + 1, - norma_id=self.norma_id).exclude( + ta_id=self.ta_id).exclude( tipo_dispositivo__class_css='caput')[:1] else: proximo_bloco = Dispositivo.objects.filter( ordem__gte=self.ordem, - norma_id=self.norma_id)[:1] + ta_id=self.ta_id)[:1] 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) + ta_id=self.ta_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 + # inserção no fim da ta ordem_max = Dispositivo.objects.order_by( - 'ordem').filter(norma_id=self.norma_id).aggregate( + 'ordem').filter( + ta_id=self.ta_id).aggregate( Max('ordem')) if ordem_max['ordem__max'] is None: raise Exception( - 'Não existem registros base nesta Norma') + 'Não existem registros base neste Texto Articulado') ordem = ordem_max['ordem__max'] + Dispositivo.INTERVALO_ORDEM return ordem @@ -847,7 +883,7 @@ class Dispositivo(BaseModel, TimestampedMixin): elif self.dispositivo_pai is None: irmaos = list(Dispositivo.objects.filter( ordem__gt=self.ordem, - norma_id=self.norma_id, + ta_id=self.ta_id, tipo_dispositivo_id=self.tipo_dispositivo.pk)) else: # contagem continua restrita a articulacao @@ -856,13 +892,13 @@ class Dispositivo(BaseModel, TimestampedMixin): if proxima_articulacao is None: irmaos = list(Dispositivo.objects.filter( ordem__gt=self.ordem, - norma_id=self.norma_id, + ta_id=self.ta_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, + ta_id=self.ta_id, tipo_dispositivo_id=self.tipo_dispositivo.pk)) dp_profundidade = self.get_profundidade() @@ -943,7 +979,7 @@ class Dispositivo(BaseModel, TimestampedMixin): proxima_articulacao = Dispositivo.objects.filter( ordem__gt=self.ordem, nivel=0, - norma_id=self.norma_id)[:1] + ta_id=self.ta_id)[:1] if not proxima_articulacao.exists(): return None @@ -955,7 +991,7 @@ class Dispositivo(BaseModel, TimestampedMixin): # pp possiveis_pais if not perfil_pk: - perfis = PerfilEstruturalTextosNormativos.objects.filter( + perfis = PerfilEstruturalTextoArticulado.objects.filter( padrao=True)[:1] if perfis.exists(): perfil_pk = perfis[0].pk @@ -985,7 +1021,7 @@ class Dispositivo(BaseModel, TimestampedMixin): dispositivo_base.get_numero_completo()) dp.nivel = dispositivo_base.nivel dp.texto = '' - dp.norma = dispositivo_base.norma + dp.ta = dispositivo_base.ta dp.dispositivo_pai = dispositivo_base.dispositivo_pai dp.inicio_eficacia = dispositivo_base.inicio_eficacia dp.inicio_vigencia = dispositivo_base.inicio_vigencia @@ -1005,7 +1041,7 @@ class Dispositivo(BaseModel, TimestampedMixin): tipo_dispositivo_id=tipo_base.pk, ordem__lte=dispositivo_base.ordem, ordem__gt=raiz.ordem, - norma_id=dispositivo_base.norma_id)[:1] + ta_id=dispositivo_base.ta_id)[:1] if disps.exists(): dispositivo.set_numero_completo( diff --git a/compilacao/templatetags/compilacao_filters.py b/compilacao/templatetags/compilacao_filters.py index 7a59720c9..3934d7705 100644 --- a/compilacao/templatetags/compilacao_filters.py +++ b/compilacao/templatetags/compilacao_filters.py @@ -43,7 +43,7 @@ def dispositivo_desativado(dispositivo, inicio_vigencia, fim_vigencia): @register.simple_tag def nota_automatica(dispositivo): - if dispositivo.norma_publicada is not None: + if dispositivo.ta_publicado is not None: d = dispositivo.dispositivo_atualizador.dispositivo_pai if dispositivo.texto == Dispositivo.TEXTO_PADRAO_DISPOSITIVO_REVOGADO: return 'Revogado pelo %s.' % d @@ -152,3 +152,9 @@ def nomenclatura_heranca(d, ignore_ultimo=0, ignore_primeiro=0): d = d.dispositivo_pai return result + + + +@register.simple_tag +def verbose_name(instance, field_name): + return instance._meta.get_field(field_name).verbose_name.title() diff --git a/compilacao/urls.py b/compilacao/urls.py index 571794788..352f3931d 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -1,70 +1,66 @@ from django.conf.urls import include, url from compilacao import views -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$', + + url(r'^$', views.TaListView.as_view(), name='ta_list'), + url(r'^(?P[0-9]+)$', views.TaDetailView.as_view(), name='ta_detail'), + url(r'^(?P[0-9]+)/edit$', + views.TaUpdateView.as_view(), name='ta_edit'), + +] + +urlpatterns = [ + url(r'^ta/', include(urlpatterns_compilacao)), + + + +] + + +""" + url(r'^(?P[0-9]+)/compilacao$', views.CompilacaoView.as_view(), name='compilacao'), - url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/$', + url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/$', views.DispositivoView.as_view(), name='dispositivo'), - url(r'^(?P[0-9]+)/compilacao/vigencia/(?P.+)/$', + url(r'^(?P[0-9]+)/compilacao/vigencia/(?P.+)/$', views.CompilacaoView.as_view(), name='vigencia'), - url(r'^(?P[0-9]+)/compilacao/edit', + url(r'^(?P[0-9]+)/compilacao/edit', views.CompilacaoEditView.as_view(), name='comp_edit'), - url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/refresh', + url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/refresh', views.DispositivoEditView.as_view(), name='dispositivo_edit'), - url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/actions', + url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/actions', views.ActionsEditView.as_view(), name='dispositivo_actions'), - url(r'^(?P[0-9]+)/compilacao/' + url(r'^(?P[0-9]+)/compilacao/' '(?P[0-9]+)/nota/create$', views.NotasCreateView.as_view(), name='nota_create'), - url(r'^(?P[0-9]+)/compilacao/' + 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/' + url(r'^(?P[0-9]+)/compilacao/' '(?P[0-9]+)/nota/(?P[0-9]+)/delete$', views.NotasDeleteView.as_view(), name='nota_delete'), - url(r'^(?P[0-9]+)/compilacao/' + url(r'^(?P[0-9]+)/compilacao/' '(?P[0-9]+)/vide/create$', views.VideCreateView.as_view(), name='vide_create'), - url(r'^(?P[0-9]+)/compilacao/' + 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/' + 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$', + url(r'^(?P[0-9]+)/compilacao/search$', views.DispositivoSearchFragmentFormView.as_view(), name='search_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)), - url(r'^sistema/compilacao/perfil-estrutural-textos-normativos/', - include(perfil_estr_txt_norm.urls)), -] +""" diff --git a/compilacao/utils.py b/compilacao/utils.py new file mode 100644 index 000000000..f07d47a07 --- /dev/null +++ b/compilacao/utils.py @@ -0,0 +1,83 @@ +from crispy_forms_foundation.layout import (HTML, Column, Div, Fieldset, + Layout, Row, Submit) +from django.apps import apps +from django.contrib import admin +from django.utils.translation import ugettext_lazy as _ + + +def to_column(name_span): + fieldname, span = name_span + return Column(fieldname, css_class='large-%d' % span) + + +def to_row(names_spans): + return Row(*list(map(to_column, names_spans))) + + +def make_choices(*choice_pairs): + assert len(choice_pairs) % 2 == 0 + ipairs = iter(choice_pairs) + choices = list(zip(ipairs, ipairs)) + yield choices + for key, value in choices: + 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 + + +def from_to(start, end): + return list(range(start, end + 1)) + + +def make_pagination(index, num_pages): + '''Make a list of adjacent page ranges interspersed with "None"s + + The list starts with [1, 2] and end with [num_pages-1, num_pages]. + The list includes [index-1, index, index+1] + "None"s separate those ranges and mean ellipsis (...) + + Example: [1, 2, None, 10, 11, 12, None, 29, 30] + ''' + + PAGINATION_LENGTH = 10 + if num_pages <= PAGINATION_LENGTH: + return from_to(1, num_pages) + else: + if index - 1 <= 5: + tail = [num_pages - 1, num_pages] + head = from_to(1, PAGINATION_LENGTH - 3) + else: + if index + 1 >= num_pages - 3: + tail = from_to(index - 1, num_pages) + else: + tail = [index - 1, index, index + 1, + None, num_pages - 1, num_pages] + head = from_to(1, PAGINATION_LENGTH - len(tail) - 1) + return head + [None] + tail diff --git a/compilacao/views.py b/compilacao/views.py index 8f86e0229..e3fb96522 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -3,1351 +3,72 @@ from datetime import datetime, timedelta from os.path import sys from django.contrib.auth.decorators import login_required +from django.contrib.messages.api import success from django.core.signing import Signer -from django.core.urlresolvers import reverse +from django.core.urlresolvers import reverse, reverse_lazy from django.db.models import Q 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.functional import cached_property 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 DetailView +from django.views.generic.edit import FormMixin, UpdateView, CreateView from django.views.generic.list import ListView -from vanilla.model_views import CreateView -from compilacao import forms -from compilacao.file2dispositivo import Parser +from compilacao import forms, utils from compilacao.models import (Dispositivo, Nota, - PerfilEstruturalTextosNormativos, + PerfilEstruturalTextoArticulado, TipoDispositivo, TipoNota, TipoPublicacao, - TipoVide, VeiculoPublicacao, Vide) -from norma.models import NormaJuridica -from sapl.crud import build_crud + TipoVide, VeiculoPublicacao, Vide, + TextoArticulado) + DISPOSITIVO_SELECT_RELATED = ( 'tipo_dispositivo', - 'norma_publicada', - 'norma', + 'ta_publicado', + 'ta', 'dispositivo_atualizador', 'dispositivo_atualizador__dispositivo_pai', - 'dispositivo_atualizador__dispositivo_pai__norma', - 'dispositivo_atualizador__dispositivo_pai__norma__tipo', + 'dispositivo_atualizador__dispositivo_pai__ta', + 'dispositivo_atualizador__dispositivo_pai__ta__tipo', '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)]], - ]) - -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', [ - - [_('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): - template_name = 'compilacao/index.html' - - flag_alteradora = -1 - - flag_nivel_ini = 0 - flag_nivel_old = -1 - - itens_de_vigencia = {} - - inicio_vigencia = None - fim_vigencia = None +class TaListView(ListView): + model = TextoArticulado + paginate_by = 10 + title = TextoArticulado._meta.verbose_name_plural def get_context_data(self, **kwargs): - context = super(CompilacaoView, self).get_context_data(**kwargs) - - cita = Vide.objects.filter( - Q(dispositivo_base__norma_id=self.kwargs['norma_id'])).\ - select_related( - 'dispositivo_ref', - 'dispositivo_ref__norma', - 'dispositivo_ref__dispositivo_pai', - 'dispositivo_ref__dispositivo_pai__norma', 'tipo') - - context['cita'] = {} - for c in cita: - if str(c.dispositivo_base_id) not in context['cita']: - context['cita'][str(c.dispositivo_base_id)] = [] - context['cita'][str(c.dispositivo_base_id)].append(c) - - citado = Vide.objects.filter( - Q(dispositivo_ref__norma_id=self.kwargs['norma_id'])).\ - select_related( - 'dispositivo_base', - 'dispositivo_base__norma', - 'dispositivo_base__dispositivo_pai', - 'dispositivo_base__dispositivo_pai__norma', 'tipo') - - context['citado'] = {} - for c in citado: - if str(c.dispositivo_ref_id) not in context['citado']: - context['citado'][str(c.dispositivo_ref_id)] = [] - context['citado'][str(c.dispositivo_ref_id)].append(c) - - notas = Nota.objects.filter( - dispositivo__norma_id=self.kwargs['norma_id']).select_related( - 'owner', 'tipo') - - context['notas'] = {} - for n in notas: - if str(n.dispositivo_id) not in context['notas']: - context['notas'][str(n.dispositivo_id)] = [] - context['notas'][str(n.dispositivo_id)].append(n) + context = super(TaListView, self).get_context_data(**kwargs) + paginator = context['paginator'] + page_obj = context['page_obj'] + context['page_range'] = utils.make_pagination( + page_obj.number, paginator.num_pages) return context - def get_queryset(self): - self.flag_alteradora = -1 - self.flag_nivel_ini = 0 - self.flag_nivel_old = -1 - - self.inicio_vigencia = None - self.fim_vigencia = None - if 'sign' in self.kwargs: - signer = Signer() - try: - string = signer.unsign(self.kwargs['sign']).split(',') - self.inicio_vigencia = parse_date(string[0]) - self.fim_vigencia = parse_date(string[1]) - except: - return{} - - return Dispositivo.objects.filter( - inicio_vigencia__lte=self.fim_vigencia, - ordem__gt=0, - norma_id=self.kwargs['norma_id'], - ).select_related(*DISPOSITIVO_SELECT_RELATED) - else: - - r = Dispositivo.objects.filter( - ordem__gt=0, - 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( - norma_id=self.kwargs['norma_id'], - ).order_by( - 'inicio_vigencia' - ).distinct( - 'inicio_vigencia' - ).select_related( - 'norma_publicada', - 'norma', - 'norma_publicada__tipo', - 'norma__tipo',) - - ajuste_datas_vigencia = [] - - for item in itens: - ajuste_datas_vigencia.append(item) - - lenLista = len(ajuste_datas_vigencia) - for i in range(lenLista): - if i + 1 < lenLista: - ajuste_datas_vigencia[ - i].fim_vigencia = ajuste_datas_vigencia[ - i + 1].inicio_vigencia - timedelta(days=1) - else: - ajuste_datas_vigencia[i].fim_vigencia = None - - self.itens_de_vigencia = {} - - idx = -1 - length = len(ajuste_datas_vigencia) - for item in ajuste_datas_vigencia: - idx += 1 - if idx == 0: - self.itens_de_vigencia[0] = [item, ] - continue - - if idx + 1 < length: - ano = item.norma_publicada.ano - if ano in self.itens_de_vigencia: - self.itens_de_vigencia[ano].append(item) - else: - self.itens_de_vigencia[ano] = [item, ] - else: - self.itens_de_vigencia[9999] = [item, ] - - if len(self.itens_de_vigencia.keys()) <= 1: - return {} - - self.itens_de_vigencia = OrderedDict( - sorted(self.itens_de_vigencia.items(), key=lambda t: t[0])) - - return self.itens_de_vigencia - - def get_norma(self): - return NormaJuridica.objects.select_related('tipo').get( - pk=self.kwargs['norma_id']) - - def is_norma_alteradora(self): - if self.flag_alteradora == -1: - self.flag_alteradora = Dispositivo.objects.select_related( - 'dispositivos_alterados_pela_norma_set' - ).filter(norma_id=self.kwargs['norma_id']).count() - return self.flag_alteradora > 0 - - -class DispositivoView(CompilacaoView): - # template_name = 'compilacao/index.html' - template_name = 'compilacao/index_bloco.html' - - def get_queryset(self): - self.flag_alteradora = -1 - self.flag_nivel_ini = 0 - self.flag_nivel_old = -1 - - try: - 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 - - 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 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 - - flag_nivel_ini = 0 - flag_nivel_old = -1 - - pk_edit = 0 - pk_view = 0 - - def post(self, request, *args, **kwargs): - form = forms.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 = forms.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_edit = 0 - self.pk_view = 0 - - self.flag_alteradora = -1 - self.flag_nivel_ini = 0 - self.flag_nivel_old = -1 - - 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.dispositivo_pai = a - 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 - - 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): - template_name = 'compilacao/edit_bloco.html' - - def post(self, request, *args, **kwargs): - - d = Dispositivo.objects.get( - 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.strip() - d.save() - - 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_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_edit = int(self.request.GET['edit']) - except: - self.pk_edit = 0 - self.pk_view = int(self.kwargs['dispositivo_id']) - - try: - if self.pk_edit == 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_edit == 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, 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_edit == 0: - base = Dispositivo.objects.get(pk=self.pk_view) - else: - base = Dispositivo.objects.get(pk=self.pk_edit) - - prox_possivel = Dispositivo.objects.filter( - ordem__gt=base.ordem, - nivel__lte=base.nivel, - norma_id=base.norma_id)[:1] - - if prox_possivel.exists(): - prox_possivel = prox_possivel[0] - else: - prox_possivel = None - - 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 - parents = base.get_parents() - parents.insert(0, base) - nivel = sys.maxsize - for dp in parents: - - if dp.nivel >= nivel: - continue - - 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, - perfil_pk=perfil_pk): - - if dp.tipo_dispositivo != prox_possivel.tipo_dispositivo: - continue - - 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(local_insert=1), - 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 - while True: - if dp.dispositivo0 == 0: - local_insert = 1 - else: - local_insert = 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 not flag_pv: - r = [r[0], ] - - if len(r) > 0 and dp.tipo_dispositivo.formato_variacao0 == \ - TipoDispositivo.FNCN: - r = [r[0], ] - - if dp.tipo_dispositivo == base.tipo_dispositivo: - result[0]['itens'] += r - else: - result[0]['itens'] += r - result[2]['itens'] += r - if nivel == 0: - break +class TaDetailView(DetailView): + model = TextoArticulado - # tipo do dispositivo base - tipb = base.tipo_dispositivo + @property + def title(self): + return self.get_object() - 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']) - 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) - for td in otds: +class TaUpdateView(UpdateView): + model = TextoArticulado + form_class = forms.TaForm + template_name = "compilacao/form.html" - if paradentro and not td.permitido_inserir_in( - tipb, - include_relative_autos=False, - perfil_pk=perfil_pk): - continue - - base.tipo_dispositivo = td - - if not paradentro: - - flag_insercao = False - for possivelpai in parents: - if td.permitido_inserir_in( - 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(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, 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, - perfil_pk=perfil_pk) and \ - possivelpai.nivel < \ - prox_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, - '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[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) - - # 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 - - -class ActionsEditMixin(object): - - def render_to_json_response(self, context, **response_kwargs): - - action = getattr(self, context['action']) - return JsonResponse(action(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 {} - - def add_prior(self, context): - return {} - - def add_in(self, context): - return self.add_next(context, local_add='add_in') - - 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']) - variacao = int(context['variacao']) - parents = [base, ] + base.get_parents() - - tipos_dp_auto_insert = tipo.filhos_permitidos.filter( - filho_de_insercao_automatica=True, - perfil_id=context['perfil_pk']) - - count_auto_insert = 0 - for tipoauto in tipos_dp_auto_insert: - qtdp = tipoauto.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: - count_auto_insert += 1 - - 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, - perfil_pk=context['perfil_pk']): - dp_pai = dp - break - dp_pai = dp - - if dp_irmao is not None: - dp = Dispositivo.new_instance_based_on(dp_irmao, tipo) - dp.transform_in_next(variacao) - else: - # 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( - '-ordem').filter( - ordem__lte=base.ordem, - tipo_dispositivo_id=tipo.pk, - norma_id=base.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, ]) - - # 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, ]) - - dp.clean() - dp.save() - - dp_auto_insert = None - - # Inserção automática - if count_auto_insert: - dp_pk = dp.pk - dp.nivel += 1 - 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, - redirecionando para o novo pai''' - - nivel = sys.maxsize - flag_niveis = False - - if not dp.tipo_dispositivo.dispositivo_de_alteracao: - possiveis_filhos = Dispositivo.objects.filter( - ordem__gt=dp.ordem, - norma_id=dp.norma_id) - - for filho in possiveis_filhos: - - if filho.nivel > nivel: - continue - - if filho.dispositivo_pai.ordem >= dp.ordem: - continue - - 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() - - 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 dp.nivel == 0: - - 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) - - if dp_auto_insert is None: - data = self.get_json_for_refresh(dp) - else: - data = self.get_json_for_refresh(dp=dp, dpauto=dp_auto_insert) - - return data - - def get_json_for_refresh(self, dp, dpauto=None): - - if dp.tipo_dispositivo.contagem_continua: - pais = [] - if dp.dispositivo_pai is None: - data = {'pk': dp.pk, 'pai': [-1, ]} - else: - pkfilho = dp.pk - dp = dp.dispositivo_pai - - proxima_articulacao = dp.get_proximo_nivel_zero() - - if proxima_articulacao is not None: - parents = Dispositivo.objects.filter( - norma_id=dp.norma_id, - ordem__gte=dp.ordem, - ordem__lt=proxima_articulacao.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: - if p.nivel > nivel: - continue - pais.append(p.pk) - nivel = p.nivel - data = { - 'pk': pkfilho if not dpauto else dpauto.pk, 'pai': pais} - else: - data = {'pk': dp.pk if not dpauto else dpauto.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'] - - 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) - - -class DispositivoSuccessUrlMixin(object): + @property + def title(self): + return self.get_object() 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 True, tn.modelo - return False, '' - - 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 - - @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: - 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) - nt.owner_id = request.user.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") - - -class NotasEditView(NotaMixin, UpdateView): - model = Nota - 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: - 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") - - -class VideEditView(VideMixin, UpdateView): - model = Vide - template_name = 'compilacao/ajax_form.html' - form_class = forms.VideForm - - -class VideDeleteView(VideMixin, TemplateView): - - def get(self, request, *args, **kwargs): - vd = Vide.objects.get(pk=self.kwargs['pk']) - vd.delete() - return HttpResponseRedirect(self.get_success_url()) - - -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) + return reverse_lazy('ta_detail', kwargs={'pk': self.kwargs['pk']}) diff --git a/compilacao/views2.py b/compilacao/views2.py new file mode 100644 index 000000000..c2068fda7 --- /dev/null +++ b/compilacao/views2.py @@ -0,0 +1,1351 @@ +from collections import OrderedDict +from datetime import datetime, timedelta +from os.path import sys + +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 (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.edit import FormMixin, UpdateView, CreateView +from django.views.generic.list import ListView + +from compilacao import forms +from compilacao.models import (Dispositivo, Nota, + PerfilEstruturalTextoArticulado, + TipoDispositivo, TipoNota, TipoPublicacao, + TipoVide, VeiculoPublicacao, Vide, + TextoArticulado) +from sapl.crud import build_crud + +DISPOSITIVO_SELECT_RELATED = ( + 'tipo_dispositivo', + 'ta_publicado', + 'ta', + 'dispositivo_atualizador', + 'dispositivo_atualizador__dispositivo_pai', + 'dispositivo_atualizador__dispositivo_pai__ta', + 'dispositivo_atualizador__dispositivo_pai__ta__tipo', + '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)]], + ]) + +perfil_estr_txt_norm = build_crud( + PerfilEstruturalTextoArticulado, 'perfil_estrutural', [ + + [_('Perfil Estrutural de Textos Articulados'), + [('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): + template_name = 'compilacao/index.html' + + flag_alteradora = -1 + + flag_nivel_ini = 0 + flag_nivel_old = -1 + + itens_de_vigencia = {} + + inicio_vigencia = None + fim_vigencia = None + + def get_context_data(self, **kwargs): + context = super(CompilacaoView, self).get_context_data(**kwargs) + + cita = Vide.objects.filter( + Q(dispositivo_base__ta_id=self.kwargs['ta_id'])).\ + select_related( + 'dispositivo_ref', + 'dispositivo_ref__ta', + 'dispositivo_ref__dispositivo_pai', + 'dispositivo_ref__dispositivo_pai__ta', 'tipo') + + context['cita'] = {} + for c in cita: + if str(c.dispositivo_base_id) not in context['cita']: + context['cita'][str(c.dispositivo_base_id)] = [] + context['cita'][str(c.dispositivo_base_id)].append(c) + + citado = Vide.objects.filter( + Q(dispositivo_ref__ta_id=self.kwargs['ta_id'])).\ + select_related( + 'dispositivo_base', + 'dispositivo_base__ta', + 'dispositivo_base__dispositivo_pai', + 'dispositivo_base__dispositivo_pai__ta', 'tipo') + + context['citado'] = {} + for c in citado: + if str(c.dispositivo_ref_id) not in context['citado']: + context['citado'][str(c.dispositivo_ref_id)] = [] + context['citado'][str(c.dispositivo_ref_id)].append(c) + + notas = Nota.objects.filter( + dispositivo__ta_id=self.kwargs['ta_id']).select_related( + 'owner', 'tipo') + + context['notas'] = {} + for n in notas: + if str(n.dispositivo_id) not in context['notas']: + context['notas'][str(n.dispositivo_id)] = [] + context['notas'][str(n.dispositivo_id)].append(n) + return context + + def get_queryset(self): + self.flag_alteradora = -1 + self.flag_nivel_ini = 0 + self.flag_nivel_old = -1 + + self.inicio_vigencia = None + self.fim_vigencia = None + if 'sign' in self.kwargs: + signer = Signer() + try: + string = signer.unsign(self.kwargs['sign']).split(',') + self.inicio_vigencia = parse_date(string[0]) + self.fim_vigencia = parse_date(string[1]) + except: + return{} + + return Dispositivo.objects.filter( + inicio_vigencia__lte=self.fim_vigencia, + ordem__gt=0, + ta_id=self.kwargs['ta_id'], + ).select_related(*DISPOSITIVO_SELECT_RELATED) + else: + + r = Dispositivo.objects.filter( + ordem__gt=0, + ta_id=self.kwargs['ta_id'], + ).select_related( + 'tipo_dispositivo', + 'ta_publicado', + 'ta', + 'dispositivo_atualizador', + 'dispositivo_atualizador__dispositivo_pai', + 'dispositivo_atualizador__dispositivo_pai__ta', + 'dispositivo_atualizador__dispositivo_pai__ta__tipo', + 'dispositivo_pai', + 'dispositivo_pai__tipo_dispositivo') + + return r + + def get_vigencias(self): + itens = Dispositivo.objects.filter( + ta_id=self.kwargs['ta_id'], + ).order_by( + 'inicio_vigencia' + ).distinct( + 'inicio_vigencia' + ).select_related( + 'ta_publicado', + 'ta', + 'ta_publicado__tipo', + 'ta__tipo',) + + ajuste_datas_vigencia = [] + + for item in itens: + ajuste_datas_vigencia.append(item) + + lenLista = len(ajuste_datas_vigencia) + for i in range(lenLista): + if i + 1 < lenLista: + ajuste_datas_vigencia[ + i].fim_vigencia = ajuste_datas_vigencia[ + i + 1].inicio_vigencia - timedelta(days=1) + else: + ajuste_datas_vigencia[i].fim_vigencia = None + + self.itens_de_vigencia = {} + + idx = -1 + length = len(ajuste_datas_vigencia) + for item in ajuste_datas_vigencia: + idx += 1 + if idx == 0: + self.itens_de_vigencia[0] = [item, ] + continue + + if idx + 1 < length: + ano = item.ta_publicado.ano + if ano in self.itens_de_vigencia: + self.itens_de_vigencia[ano].append(item) + else: + self.itens_de_vigencia[ano] = [item, ] + else: + self.itens_de_vigencia[9999] = [item, ] + + if len(self.itens_de_vigencia.keys()) <= 1: + return {} + + self.itens_de_vigencia = OrderedDict( + sorted(self.itens_de_vigencia.items(), key=lambda t: t[0])) + + return self.itens_de_vigencia + + def get_ta(self): + return TextoArticulado.objects.select_related('tipo').get( + pk=self.kwargs['ta_id']) + + def is_ta_alterador(self): + if self.flag_alteradora == -1: + self.flag_alteradora = Dispositivo.objects.select_related( + 'dispositivos_alterados_pelo_texto_articulado_set' + ).filter(ta_id=self.kwargs['ta_id']).count() + return self.flag_alteradora > 0 + + +class DispositivoView(CompilacaoView): + # template_name = 'compilacao/index.html' + template_name = 'compilacao/index_bloco.html' + + def get_queryset(self): + self.flag_alteradora = -1 + self.flag_nivel_ini = 0 + self.flag_nivel_old = -1 + + try: + 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 + + proximo_bloco = Dispositivo.objects.filter( + ordem__gt=bloco.ordem, + nivel__lte=bloco.nivel, + ta_id=self.kwargs['ta_id'])[:1] + + if proximo_bloco.count() == 0: + itens = Dispositivo.objects.filter( + ordem__gte=bloco.ordem, + ta_id=self.kwargs['ta_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + else: + itens = Dispositivo.objects.filter( + ordem__gte=bloco.ordem, + ordem__lt=proximo_bloco[0].ordem, + ta_id=self.kwargs['ta_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + return itens + + +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 + + flag_nivel_ini = 0 + flag_nivel_old = -1 + + pk_edit = 0 + pk_view = 0 + + def post(self, request, *args, **kwargs): + form = forms.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=[]) + 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 = forms.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_edit = 0 + self.pk_view = 0 + + self.flag_alteradora = -1 + self.flag_nivel_ini = 0 + self.flag_nivel_old = -1 + + result = Dispositivo.objects.filter( + ta_id=self.kwargs['ta_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + + if not result.exists(): + + ta = TextoArticulado.objects.get(pk=self.kwargs['ta_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.ta = ta + a.tipo_dispositivo = td + a.inicio_vigencia = ta.data_publicacao + a.inicio_eficacia = ta.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.ta = ta + e.tipo_dispositivo = td + e.inicio_vigencia = ta.data_publicacao + e.inicio_eficacia = ta.data_publicacao + e.timestamp = datetime.now() + e.texto = ta.ementa + e.dispositivo_pai = a + 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( + ta_id=self.kwargs['ta_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + + return result + + def set_perfil_in_session(self, request=None, perfil_id=0): + if not request: + return None + + if perfil_id: + perfil = PerfilEstruturalTextoArticulado.objects.get( + pk=perfil_id) + request.session['perfil_estrutural'] = perfil.pk + else: + perfis = PerfilEstruturalTextoArticulado.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): + template_name = 'compilacao/edit_bloco.html' + + def post(self, request, *args, **kwargs): + + d = Dispositivo.objects.get( + 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.strip() + d.save() + + if texto != '': + dnext = Dispositivo.objects.filter( + ta_id=d.ta_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_perfil_estrutural(self): + perfis = PerfilEstruturalTextoArticulado.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_edit = int(self.request.GET['edit']) + except: + self.pk_edit = 0 + self.pk_view = int(self.kwargs['dispositivo_id']) + + try: + if self.pk_edit == 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_edit == self.pk_view: + return [bloco, ] + + proximo_bloco = Dispositivo.objects.filter( + ordem__gt=bloco.ordem, + nivel__lte=bloco.nivel, + ta_id=self.kwargs['ta_id'])[:1] + + if proximo_bloco.count() == 0: + itens = Dispositivo.objects.filter( + ordem__gte=bloco.ordem, + ta_id=self.kwargs['ta_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + else: + itens = Dispositivo.objects.filter( + ordem__gte=bloco.ordem, + ordem__lt=proximo_bloco[0].ordem, + ta_id=self.kwargs['ta_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + return itens + + 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_edit == 0: + base = Dispositivo.objects.get(pk=self.pk_view) + else: + base = Dispositivo.objects.get(pk=self.pk_edit) + + prox_possivel = Dispositivo.objects.filter( + ordem__gt=base.ordem, + nivel__lte=base.nivel, + ta_id=base.ta_id)[:1] + + if prox_possivel.exists(): + prox_possivel = prox_possivel[0] + else: + prox_possivel = None + + 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 + parents = base.get_parents() + parents.insert(0, base) + nivel = sys.maxsize + for dp in parents: + + if dp.nivel >= nivel: + continue + + 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, + perfil_pk=perfil_pk): + + if dp.tipo_dispositivo != prox_possivel.tipo_dispositivo: + continue + + 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(local_insert=1), + 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 + while True: + if dp.dispositivo0 == 0: + local_insert = 1 + else: + local_insert = 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 not flag_pv: + r = [r[0], ] + + if len(r) > 0 and dp.tipo_dispositivo.formato_variacao0 == \ + TipoDispositivo.FNCN: + r = [r[0], ] + + if dp.tipo_dispositivo == 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 = 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']) + 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) + + for td in otds: + + if paradentro and not td.permitido_inserir_in( + tipb, + include_relative_autos=False, + perfil_pk=perfil_pk): + continue + + base.tipo_dispositivo = td + + if not paradentro: + + flag_insercao = False + for possivelpai in parents: + if td.permitido_inserir_in( + 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(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, 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, + perfil_pk=perfil_pk) and \ + possivelpai.nivel < \ + prox_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, + '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[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) + + # 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 + + +class ActionsEditMixin(object): + + def render_to_json_response(self, context, **response_kwargs): + + action = getattr(self, context['action']) + return JsonResponse(action(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( + ta_id=base.ta_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 {} + + def add_prior(self, context): + return {} + + def add_in(self, context): + return self.add_next(context, local_add='add_in') + + 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']) + variacao = int(context['variacao']) + parents = [base, ] + base.get_parents() + + tipos_dp_auto_insert = tipo.filhos_permitidos.filter( + filho_de_insercao_automatica=True, + perfil_id=context['perfil_pk']) + + count_auto_insert = 0 + for tipoauto in tipos_dp_auto_insert: + qtdp = tipoauto.quantidade_permitida + if qtdp >= 0: + qtdp -= Dispositivo.objects.filter( + ta_id=base.ta_id, + tipo_dispositivo_id=tipoauto.filho_permitido.pk + ).count() + if qtdp > 0: + count_auto_insert += 1 + else: + count_auto_insert += 1 + + 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, + perfil_pk=context['perfil_pk']): + dp_pai = dp + break + dp_pai = dp + + if dp_irmao is not None: + dp = Dispositivo.new_instance_based_on(dp_irmao, tipo) + dp.transform_in_next(variacao) + else: + # 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( + '-ordem').filter( + ordem__lte=base.ordem, + tipo_dispositivo_id=tipo.pk, + ta_id=base.ta_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, ]) + + # 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( + ta_id=dp.ta_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, ]) + + dp.clean() + dp.save() + + dp_auto_insert = None + + # Inserção automática + if count_auto_insert: + dp_pk = dp.pk + dp.nivel += 1 + 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, + redirecionando para o novo pai''' + + nivel = sys.maxsize + flag_niveis = False + + if not dp.tipo_dispositivo.dispositivo_de_alteracao: + possiveis_filhos = Dispositivo.objects.filter( + ordem__gt=dp.ordem, + ta_id=dp.ta_id) + + for filho in possiveis_filhos: + + if filho.nivel > nivel: + continue + + if filho.dispositivo_pai.ordem >= dp.ordem: + continue + + 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() + + 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 dp.nivel == 0: + + proxima_articulacao = Dispositivo.objects.filter( + ordem__gt=dp.ordem, + nivel=0, + ta_id=dp.ta_id)[:1] + + if not proxima_articulacao.exists(): + filhos_continuos = list(Dispositivo.objects.filter( + ordem__gt=dp.ordem, + ta_id=dp.ta_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), + ta_id=dp.ta_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) + + if dp_auto_insert is None: + data = self.get_json_for_refresh(dp) + else: + data = self.get_json_for_refresh(dp=dp, dpauto=dp_auto_insert) + + return data + + def get_json_for_refresh(self, dp, dpauto=None): + + if dp.tipo_dispositivo.contagem_continua: + pais = [] + if dp.dispositivo_pai is None: + data = {'pk': dp.pk, 'pai': [-1, ]} + else: + pkfilho = dp.pk + dp = dp.dispositivo_pai + + proxima_articulacao = dp.get_proximo_nivel_zero() + + if proxima_articulacao is not None: + parents = Dispositivo.objects.filter( + ta_id=dp.ta_id, + ordem__gte=dp.ordem, + ordem__lt=proxima_articulacao.ordem, + nivel__lte=dp.nivel) + else: + parents = Dispositivo.objects.filter( + ta_id=dp.ta_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 if not dpauto else dpauto.pk, 'pai': pais} + else: + data = {'pk': dp.pk if not dpauto else dpauto.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'] + + 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) + + +class DispositivoSuccessUrlMixin(object): + + def get_success_url(self): + return reverse( + 'dispositivo', kwargs={ + 'ta_id': self.kwargs[ + 'ta_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 True, tn.modelo + return False, '' + + 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 + + @method_decorator(login_required) + def dispatch(self, *args, **kwargs): + return super(NotaMixin, self).dispatch(*args, **kwargs) + + +class NotasCreateView(NotaMixin, 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: + ta_id = kwargs.pop('ta_id') + dispositivo_id = kwargs.pop('dispositivo_id') + form = forms.NotaForm(request.POST, request.FILES, **kwargs) + kwargs['ta_id'] = ta_id + kwargs['dispositivo_id'] = dispositivo_id + + if form.is_valid(): + nt = form.save(commit=False) + nt.owner_id = request.user.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") + + +class NotasEditView(NotaMixin, UpdateView): + model = Nota + 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, CreateView): + template_name = 'compilacao/ajax_form.html' + form_class = forms.VideForm + + def post(self, request, *args, **kwargs): + try: + ta_id = kwargs.pop('ta_id') + dispositivo_id = kwargs.pop('dispositivo_id') + form = forms.VideForm(request.POST, request.FILES, **kwargs) + kwargs['ta_id'] = ta_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") + + +class VideEditView(VideMixin, UpdateView): + model = Vide + template_name = 'compilacao/ajax_form.html' + form_class = forms.VideForm + + +class VideDeleteView(VideMixin, TemplateView): + + def get(self, request, *args, **kwargs): + vd = Vide.objects.get(pk=self.kwargs['pk']) + vd.delete() + return HttpResponseRedirect(self.get_success_url()) + + +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_ta' in self.request.GET: + tipo_ta = self.request.GET['tipo_ta'] + if tipo_ta: + q = q & Q(ta__tipo_id=tipo_ta) + n = 50 + + if 'num_ta' in self.request.GET: + num_ta = self.request.GET['num_ta'] + if num_ta: + q = q & Q(ta__numero=num_ta) + n = 50 + + if 'ano_ta' in self.request.GET: + ano_ta = self.request.GET['ano_ta'] + if ano_ta: + q = q & Q(ta__ano=ano_ta) + 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/materia/urls.py b/materia/urls.py index e728f31aa..17cff8167 100644 --- a/materia/urls.py +++ b/materia/urls.py @@ -17,7 +17,16 @@ from materia.views import (AutoriaEditView, AutoriaView, tipo_fim_relatoria_crud, tipo_materia_crud, tipo_proposicao_crud, unidade_tramitacao_crud) + +materia_legislativa_patterns = materia_legislativa_crud.urlpatterns +# + __url__compilacao + + urlpatterns = [ + url(r'^materia/', include(materia_legislativa_patterns, + materia_legislativa_crud.namespace, + materia_legislativa_crud.namespace)), + url(r'^sistema/proposicoes/tipo/', include(tipo_proposicao_crud.urls)), url(r'^sistema/proposicoes/autor/', include(autor_crud.urls)), url(r'^sistema/materia/tipo/', include(tipo_materia_crud.urls)), @@ -35,7 +44,6 @@ urlpatterns = [ url(r'^sistema/materia/status-tramitacao/', include(status_tramitacao_crud.urls)), url(r'^sistema/materia/orgao/', include(orgao_crud.urls)), - url(r'^materia/', include(materia_legislativa_crud.urls)), url(r'^materia/formulario-simplificado', FormularioSimplificadoView.as_view(), name='formulario_simplificado'), diff --git a/norma/urls.py b/norma/urls.py index 66ed716cf..fb3110513 100644 --- a/norma/urls.py +++ b/norma/urls.py @@ -1,9 +1,11 @@ from django.conf.urls import include, url +from compilacao.urls import urlpatterns as __url__compilacao 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_temporario_crud.urlpatterns # norma_url_patterns = norma_crud.urlpatterns + [] urlpatterns = [ @@ -11,7 +13,6 @@ urlpatterns = [ 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)), diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 451623c54..af7c3d8a2 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -9,7 +9,6 @@ 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/sapl/utils.py b/sapl/utils.py index 139a504c2..62a96c0e2 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -37,30 +37,3 @@ 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 0906e6649..5d8abca8a 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -576,7 +576,7 @@ a:link:after, a:visited:after { } } } - .norma_title { + .ta_title { padding: 0.15em 0.7em; background-color: rgba(0, 0, 0, 0.15); margin: 0.1em 0.08em 0 0.1em; diff --git a/templates/compilacao/dispositivo_search_fragment_form.html b/templates/compilacao/dispositivo_search_fragment_form.html index 636818388..19244586c 100644 --- a/templates/compilacao/dispositivo_search_fragment_form.html +++ b/templates/compilacao/dispositivo_search_fragment_form.html @@ -8,9 +8,9 @@ {% endif %} {% for dpt in object_list %} - {% ifchanged dpt.norma%} + {% ifchanged dpt.ta%} {% if not forloop.first %}{% endif %} -
{{dpt.norma}}
+
{{dpt.ta}}
    {% endifchanged %} @@ -22,7 +22,7 @@
    - {% nomenclatura_heranca dpt 1 1 %} + {% nomenclatura_heranca dpt 1 1 %}
    {% endif%} @@ -34,7 +34,7 @@
    - {% nomenclatura_heranca dpt 1 1 %} + {% nomenclatura_heranca dpt 1 1 %}
    {% endif%} diff --git a/templates/compilacao/edit.html b/templates/compilacao/edit.html index 8038d6910..c544995d5 100644 --- a/templates/compilacao/edit.html +++ b/templates/compilacao/edit.html @@ -14,7 +14,7 @@ {% block title%} -

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

    +

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

    {% endblock %} {% block base_content %} diff --git a/templates/compilacao/edit_bloco.html b/templates/compilacao/edit_bloco.html index 16e58f84a..1d53cece5 100644 --- a/templates/compilacao/edit_bloco.html +++ b/templates/compilacao/edit_bloco.html @@ -23,7 +23,7 @@
  • E+
  • {%endif%}
  • E*
  • -
  • C
  • +
  • C