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 ff5d31c9f..e6b9ab3b4 100644 --- a/compilacao/forms.py +++ b/compilacao/forms.py @@ -1,12 +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) +from crispy_forms_foundation.layout.buttons import Button +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 norma.models import TipoNormaJuridica -from sapl.layout import to_column, to_row +from compilacao.models import (PARTICIPACAO_SOCIAL_CHOICES, Dispositivo, Nota, + TextoArticulado, TipoNota, TipoTextoArticulado, + TipoVide, Vide, TipoPublicacao, + VeiculoPublicacao, Publicacao) +from compilacao.utils import YES_NO_CHOICES, FormLayout, to_column, to_row class UpLoadImportFileForm(forms.Form): @@ -19,6 +25,122 @@ error_messages = { 'invalid': _('URL inválida.') } +ta_error_messages = { + 'required': _('Este campo é obrigatório'), +} + + +class TipoTaForm(ModelForm): + sigla = forms.CharField( + label=TipoTextoArticulado._meta.get_field( + 'sigla').verbose_name) + descricao = forms.CharField( + label=TipoTextoArticulado._meta.get_field( + 'descricao').verbose_name) + + participacao_social = forms.NullBooleanField( + label=TipoTextoArticulado._meta.get_field( + 'participacao_social').verbose_name, + widget=forms.Select(choices=YES_NO_CHOICES), + required=True) + + class Meta: + model = TipoTextoArticulado + fields = ['sigla', + 'descricao', + 'content_type', + 'participacao_social', + ] + + def __init__(self, *args, **kwargs): + + row1 = to_row([ + ('sigla', 2), + ('descricao', 4), + ('content_type', 3), + ('participacao_social', 3), + ]) + + self.helper = FormHelper() + self.helper.layout = FormLayout( + Fieldset(_('Identificação Básica'), + row1, css_class="large-12")) + super(TipoTaForm, self).__init__(*args, **kwargs) + + +class TaForm(ModelForm): + tipo_ta = forms.ModelChoiceField( + label=TipoTextoArticulado._meta.verbose_name, + queryset=TipoTextoArticulado.objects.all(), + required=True, + empty_label=None) + numero = forms.IntegerField( + label=TextoArticulado._meta.get_field( + 'numero').verbose_name, + required=True) + ano = forms.IntegerField( + label=TextoArticulado._meta.get_field( + 'ano').verbose_name, + required=True) + + data = forms.DateField( + label=TextoArticulado._meta.get_field( + 'data').verbose_name, + 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) + participacao_social = forms.NullBooleanField( + label=TextoArticulado._meta.get_field( + 'participacao_social').verbose_name, + widget=forms.Select(choices=PARTICIPACAO_SOCIAL_CHOICES), + required=False) + + class Meta: + model = TextoArticulado + fields = ['tipo_ta', + 'numero', + 'ano', + 'data', + 'ementa', + 'observacao', + 'participacao_social', + ] + + def __init__(self, *args, **kwargs): + + row1 = to_row([ + ('tipo_ta', 3), + ('numero', 2), + ('ano', 2), + ('data', 2), + ('participacao_social', 3), + ]) + + self.helper = FormHelper() + self.helper.layout = FormLayout( + Fieldset(_('Identificação Básica'), row1, css_class="large-12"), + Fieldset(TextoArticulado._meta.get_field( + 'ementa').verbose_name, Column('ementa'), css_class="large-12"), + Fieldset( + TextoArticulado._meta.get_field( + 'observacao').verbose_name, Column('observacao'), css_class="large-12"), + + ) + + super(TaForm, self).__init__(*args, **kwargs) + class NotaForm(ModelForm): NPRIV = 1 @@ -104,7 +226,7 @@ class NotaForm(ModelForm): ('publicidade', 3), ('publicacao', 3), ('efetividade', 3), - (Button('submit', 'Salvar', + (Button('submit', _('Salvar'), css_class='button primary radius'), 3) ]) @@ -128,21 +250,24 @@ class VideForm(ModelForm): queryset=Dispositivo.objects.all(), widget=forms.HiddenInput()) - tipo_norma = forms.ModelChoiceField( - queryset=TipoNormaJuridica.objects.all(), + tipo_ta = forms.ModelChoiceField( + label=_('Tipo do Texto Articulado'), + queryset=TipoTextoArticulado.objects.all(), required=False) - num_norma = forms.IntegerField(label=_('Núm. da Norma'), required=False) - ano_norma = forms.IntegerField(label=_('Ano da Norma'), required=False) + num_ta = forms.IntegerField( + label=_('Núm Texto Articulado'), required=False) + ano_ta = forms.IntegerField( + label=_('Ano Texto Articulado'), required=False) texto = forms.CharField( label='', widget=forms.Textarea, - error_messages=error_messages, required=False) tipo = forms.ModelChoiceField( - label=_('Tipo do Vide'), + label=TipoVide._meta.verbose_name, queryset=TipoVide.objects.all(), - required=True) + required=True, + error_messages=error_messages) busca_dispositivo = forms.CharField( label=_('Buscar Dispositivo a Referenciar'), @@ -157,6 +282,12 @@ class VideForm(ModelForm): 'texto', 'tipo', 'pk'] + error_messages = { + NON_FIELD_ERRORS: { + 'unique_together': + _("Ja existe um Vide deste tipo para o Dispositivo Referido "), + } + } def __init__(self, *args, **kwargs): @@ -184,9 +315,9 @@ class VideForm(ModelForm): ), 4)), to_column(( Div( - Div(to_column(('tipo_norma', 6))), - Div(to_column(('num_norma', 3)), - to_column(('ano_norma', 3))), + Div(to_column(('tipo_ta', 6))), + Div(to_column(('num_ta', 3)), + to_column(('ano_ta', 3))), Div(to_column( (Field( 'busca_dispositivo', @@ -209,3 +340,96 @@ class VideForm(ModelForm): ) super(VideForm, self).__init__(*args, **kwargs) + + +class PublicacaoForm(ModelForm): + + tipo_publicacao = forms.ModelChoiceField( + label=TipoPublicacao._meta.verbose_name, + queryset=TipoPublicacao.objects.all()) + + veiculo_publicacao = forms.ModelChoiceField( + label=VeiculoPublicacao._meta.verbose_name, + queryset=VeiculoPublicacao.objects.all()) + + url_externa = forms.CharField( + label=Publicacao._meta.get_field('url_externa').verbose_name, + required=False) + + data = forms.DateField( + label=Publicacao._meta.get_field('data').verbose_name, + input_formats=['%d/%m/%Y'], + required=True, + widget=forms.DateInput( + format='%d/%m/%Y'), + error_messages=error_messages + ) + hora = forms.TimeField( + label=Publicacao._meta.get_field('hora').verbose_name, + required=False, + widget=forms.TextInput( + attrs={'class': 'hora_hms'})) + numero = forms.IntegerField( + label=Publicacao._meta.get_field( + 'numero').verbose_name, + required=False) + ano = forms.IntegerField( + label=Publicacao._meta.get_field( + 'ano').verbose_name) + edicao = forms.IntegerField( + label=Publicacao._meta.get_field( + 'edicao').verbose_name, + required=False) + pagina_inicio = forms.IntegerField( + label=Publicacao._meta.get_field( + 'pagina_inicio').verbose_name, + required=False) + pagina_fim = forms.IntegerField( + label=Publicacao._meta.get_field( + 'pagina_fim').verbose_name, + required=False) + ta = forms.ModelChoiceField(queryset=TextoArticulado.objects.all(), + widget=forms.HiddenInput()) + + class Meta: + model = Publicacao + fields = ['tipo_publicacao', + 'veiculo_publicacao', + 'url_externa', + 'data', + 'hora', + 'numero', + 'ano', + 'edicao', + 'pagina_inicio', + 'pagina_fim', + 'ta'] + + def __init__(self, *args, **kwargs): + + row1 = to_row([ + ('tipo_publicacao', 4), + ('veiculo_publicacao', 6), + ('ano', 2), + ]) + + row2 = to_row([ + ('data', 4), + ('hora', 4), + ('numero', 2), + ('edicao', 2), + ]) + + row3 = to_row([ + ('pagina_inicio', 2), + ('pagina_fim', 2), + ('url_externa', 8), + ]) + + self.helper = FormHelper() + self.helper.layout = FormLayout( + Fieldset(Publicacao._meta.verbose_name, + row1, row2, row3, css_class="large-12")) + + super(PublicacaoForm, self).__init__(*args, **kwargs) + pass 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/0032_auto_20151213_1538.py b/compilacao/migrations/0032_auto_20151213_1538.py new file mode 100644 index 000000000..3bd8555a7 --- /dev/null +++ b/compilacao/migrations/0032_auto_20151213_1538.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0031_merge'), + ] + + operations = [ + migrations.AlterUniqueTogether( + name='vide', + unique_together=set( + [('dispositivo_base', 'dispositivo_ref', 'tipo')]), + ), + ] diff --git a/compilacao/migrations/0033_auto_20151226_1320.py b/compilacao/migrations/0033_auto_20151226_1320.py new file mode 100644 index 000000000..db1b3b145 --- /dev/null +++ b/compilacao/migrations/0033_auto_20151226_1320.py @@ -0,0 +1,115 @@ +# -*- 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(serialize=False, auto_created=True, 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(serialize=False, auto_created=True, 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(null=True, verbose_name='Data', blank=True)), + ('ementa', models.TextField(verbose_name='Ementa')), + ('observacao', models.TextField(null=True, verbose_name='Observação', blank=True)), + ('numero', models.PositiveIntegerField(verbose_name='Número')), + ('ano', models.PositiveSmallIntegerField(verbose_name='Ano')), + ('participacao_social', models.NullBooleanField(choices=[(None, 'Padrão definido no Tipo'), (True, 'Sim'), (False, 'Não')], default=None, verbose_name='Participação Social')), + ], + options={ + 'verbose_name_plural': 'Textos Articulados', + 'verbose_name': 'Texto Articulado', + 'ordering': ['-data', '-numero'], + }, + ), + migrations.CreateModel( + name='TipoTextoArticulado', + fields=[ + ('id', models.AutoField(serialize=False, auto_created=True, 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')), + ('participacao_social', models.NullBooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Participação Social')), + ], + options={ + 'verbose_name_plural': 'Tipos de Texto Articulados', + 'verbose_name': 'Tipo de Texto Articulado', + }, + ), + migrations.AlterModelOptions( + name='dispositivo', + options={'verbose_name_plural': 'Dispositivos', 'verbose_name': 'Dispositivo', 'ordering': ['ta', 'ordem']}, + ), + 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.AddField( + model_name='textoarticulado', + name='tipo_ta', + field=models.ForeignKey(to='compilacao.TipoTextoArticulado', default=None, blank=True, null=True, verbose_name='Tipo de Texto Articulado'), + ), + 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(default=1, to='compilacao.TextoArticulado', related_name='dispositivos_set', verbose_name='Texto Articulado'), + preserve_default=False, + ), + migrations.AddField( + model_name='dispositivo', + name='ta_publicado', + field=models.ForeignKey(to='compilacao.TextoArticulado', default=None, blank=True, null=True, related_name='dispositivos_alterados_pelo_ta_set', verbose_name='Texto Articulado Publicado'), + ), + migrations.AddField( + model_name='publicacao', + name='ta', + field=models.ForeignKey(default=1, to='compilacao.TextoArticulado', verbose_name='Texto Articulado'), + preserve_default=False, + ), + ] diff --git a/compilacao/migrations/0034_auto_20151226_1321.py b/compilacao/migrations/0034_auto_20151226_1321.py new file mode 100644 index 000000000..6f4c8f6d1 --- /dev/null +++ b/compilacao/migrations/0034_auto_20151226_1321.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0033_auto_20151226_1320'), + ] + + operations = [ + migrations.AlterUniqueTogether( + name='dispositivo', + unique_together=set([('ta', 'ordem'), ('ta', 'dispositivo0', 'dispositivo1', 'dispositivo2', 'dispositivo3', 'dispositivo4', 'dispositivo5', 'tipo_dispositivo', 'dispositivo_pai', 'ta_publicado', 'publicacao')]), + ), + ] diff --git a/compilacao/migrations/0035_auto_20151226_1349.py b/compilacao/migrations/0035_auto_20151226_1349.py new file mode 100644 index 000000000..ded460760 --- /dev/null +++ b/compilacao/migrations/0035_auto_20151226_1349.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import builtins + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('compilacao', '0034_auto_20151226_1321'), + ] + + operations = [ + migrations.AddField( + model_name='textoarticulado', + name='content_type', + field=models.ForeignKey( + to='contenttypes.ContentType', default=142), + preserve_default=False, + ), + migrations.AddField( + model_name='textoarticulado', + name='object_id', + field=models.PositiveIntegerField(default=1), + preserve_default=False, + ), + ] diff --git a/compilacao/migrations/0036_auto_20151226_1411.py b/compilacao/migrations/0036_auto_20151226_1411.py new file mode 100644 index 000000000..1ae7b9baf --- /dev/null +++ b/compilacao/migrations/0036_auto_20151226_1411.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0035_auto_20151226_1349'), + ] + + operations = [ + migrations.AlterField( + model_name='textoarticulado', + name='content_type', + field=models.ForeignKey(default=None, null=True, to='contenttypes.ContentType', blank=True), + ), + ] diff --git a/compilacao/migrations/0037_auto_20151226_1414.py b/compilacao/migrations/0037_auto_20151226_1414.py new file mode 100644 index 000000000..5420d7917 --- /dev/null +++ b/compilacao/migrations/0037_auto_20151226_1414.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0036_auto_20151226_1411'), + ] + + operations = [ + migrations.AlterField( + model_name='textoarticulado', + name='object_id', + field=models.PositiveIntegerField(blank=True, default=None, null=True), + ), + ] diff --git a/compilacao/migrations/0038_tipotextoarticulado_model.py b/compilacao/migrations/0038_tipotextoarticulado_model.py new file mode 100644 index 000000000..561196e71 --- /dev/null +++ b/compilacao/migrations/0038_tipotextoarticulado_model.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0037_auto_20151226_1414'), + ] + + operations = [ + migrations.AddField( + model_name='tipotextoarticulado', + name='model', + field=models.CharField(max_length=50, blank=True, default='', null=True, verbose_name='Modelagem Django'), + ), + ] diff --git a/compilacao/migrations/0039_auto_20151226_1433.py b/compilacao/migrations/0039_auto_20151226_1433.py new file mode 100644 index 000000000..807711408 --- /dev/null +++ b/compilacao/migrations/0039_auto_20151226_1433.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0038_tipotextoarticulado_model'), + ] + + operations = [ + migrations.AlterField( + model_name='tipotextoarticulado', + name='model', + field=models.CharField(verbose_name='Modelagem Django', default='', blank=True, null=True, max_length=50, unique=True), + ), + ] diff --git a/compilacao/migrations/0040_auto_20160106_1956.py b/compilacao/migrations/0040_auto_20160106_1956.py new file mode 100644 index 000000000..e621839d6 --- /dev/null +++ b/compilacao/migrations/0040_auto_20160106_1956.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('compilacao', '0039_auto_20151226_1433'), + ] + + operations = [ + migrations.RemoveField( + model_name='tipotextoarticulado', + name='model', + ), + migrations.AddField( + model_name='tipotextoarticulado', + name='content_type', + field=models.ForeignKey(verbose_name='Modelo Integrado', blank=True, default=None, null=True, to='contenttypes.ContentType'), + ), + ] diff --git a/compilacao/migrations/0041_auto_20160109_1928.py b/compilacao/migrations/0041_auto_20160109_1928.py new file mode 100644 index 000000000..9d854832c --- /dev/null +++ b/compilacao/migrations/0041_auto_20160109_1928.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0040_auto_20160106_1956'), + ] + + operations = [ + migrations.RenameField( + model_name='publicacao', + old_name='publicacao', + new_name='data', + ), + migrations.AddField( + model_name='publicacao', + name='ano', + field=models.PositiveIntegerField(null=True, verbose_name='Pg. Início', blank=True), + ), + migrations.AddField( + model_name='publicacao', + name='edicao', + field=models.PositiveIntegerField(null=True, verbose_name='Pg. Início', blank=True), + ), + migrations.AddField( + model_name='publicacao', + name='numero', + field=models.PositiveIntegerField(null=True, verbose_name='Pg. Início', blank=True), + ), + migrations.AddField( + model_name='publicacao', + name='url_externa', + field=models.CharField(max_length=1024, verbose_name='Link para Versão Eletrônica', blank=True), + ), + ] diff --git a/compilacao/migrations/0042_auto_20160110_1620.py b/compilacao/migrations/0042_auto_20160110_1620.py new file mode 100644 index 000000000..97e2396cc --- /dev/null +++ b/compilacao/migrations/0042_auto_20160110_1620.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import datetime + +from django.db import migrations, models +from django.utils.timezone import utc + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0041_auto_20160109_1928'), + ] + + operations = [ + migrations.AddField( + model_name='publicacao', + name='hora', + field=models.TimeField(default=datetime.datetime( + 2016, 1, 10, 18, 20, 1, 151209, tzinfo=utc), verbose_name='Horário de Publicação'), + preserve_default=False, + ), + migrations.AlterField( + model_name='publicacao', + name='ano', + field=models.PositiveIntegerField( + verbose_name='Ano', blank=True, null=True), + ), + migrations.AlterField( + model_name='publicacao', + name='data', + field=models.DateField(verbose_name='Data de Publicação'), + ), + migrations.AlterField( + model_name='publicacao', + name='edicao', + field=models.PositiveIntegerField( + verbose_name='Edição', blank=True, null=True), + ), + migrations.AlterField( + model_name='publicacao', + name='numero', + field=models.PositiveIntegerField( + verbose_name='Número', blank=True, null=True), + ), + ] diff --git a/compilacao/migrations/0043_auto_20160110_1733.py b/compilacao/migrations/0043_auto_20160110_1733.py new file mode 100644 index 000000000..94261c8bf --- /dev/null +++ b/compilacao/migrations/0043_auto_20160110_1733.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0042_auto_20160110_1620'), + ] + + operations = [ + migrations.AlterField( + model_name='publicacao', + name='hora', + field=models.TimeField(null=True, verbose_name='Horário de Publicação', blank=True), + ), + ] diff --git a/compilacao/models.py b/compilacao/models.py index e6df58898..88494093f 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -1,14 +1,16 @@ from datetime import datetime from django.contrib.auth.models import User +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType 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 +60,72 @@ 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')) + content_type = models.ForeignKey( + ContentType, + blank=True, null=True, default=None, + verbose_name=_('Modelo Integrado')) + participacao_social = models.NullBooleanField( + default=False, + blank=True, null=True, + choices=utils.YES_NO_CHOICES, + verbose_name=_('Participação Social')) + + class Meta: + verbose_name = _('Tipo de Texto Articulado') + verbose_name_plural = _('Tipos de Texto Articulados') + + def __str__(self): + return self.descricao + + +PARTICIPACAO_SOCIAL_CHOICES = [ + (None, _('Padrão definido no Tipo')), + (True, _('Sim')), + (False, _('Não'))] + + +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, + blank=True, null=True, default=None, + verbose_name=_('Tipo de Texto Articulado')) + participacao_social = models.NullBooleanField( + default=None, + blank=True, null=True, + choices=PARTICIPACAO_SOCIAL_CHOICES, + verbose_name=_('Participação Social')) + + content_type = models.ForeignKey( + ContentType, + blank=True, null=True, default=None) + object_id = models.PositiveIntegerField( + blank=True, null=True, default=None) + content_object = GenericForeignKey('content_type', 'object_id') + + class Meta: + verbose_name = _('Texto Articulado') + verbose_name_plural = _('Textos Articulados') + ordering = ['-data', '-numero'] + + def __str__(self): + if self.content_object: + return str(self.content_object) + else: + return _('%(tipo)s 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 +327,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 +347,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 +362,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 +371,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 +385,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')) @@ -352,7 +420,7 @@ class TipoPublicacao(models.Model): verbose_name_plural = _('Tipos de Publicação') def __str__(self): - return self.sigla + ' - ' + self.nome + return self.nome class VeiculoPublicacao(models.Model): @@ -369,13 +437,30 @@ 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( TipoPublicacao, verbose_name=_('Tipo de Publicação')) - publicacao = models.DateTimeField(verbose_name=_('Data de Publicação')) + + data = models.DateField(verbose_name=_('Data de Publicação')) + hora = models.TimeField( + blank=True, null=True, verbose_name=_('Horário de Publicação')) + + numero = models.PositiveIntegerField( + blank=True, null=True, verbose_name=_('Número')) + + ano = models.PositiveIntegerField( + blank=True, null=True, verbose_name=_('Ano')) + + edicao = models.PositiveIntegerField( + blank=True, null=True, verbose_name=_('Edição')) + + url_externa = models.CharField( + max_length=1024, + blank=True, + verbose_name=_('Link para Versão Eletrônica')) pagina_inicio = models.PositiveIntegerField( blank=True, null=True, verbose_name=_('Pg. Início')) pagina_fim = models.PositiveIntegerField( @@ -386,7 +471,10 @@ class Publicacao(TimestampedMixin): verbose_name_plural = _('Publicações') def __str__(self): - return '%s: %s' % (self.veiculo_publicacao, self.publicacao) + return _('%s realizada em %s \n %s') % ( + self.tipo_publicacao, + defaultfilters.date(self.data, "d \d\e F \d\e Y"), + self.ta) class Dispositivo(BaseModel, TimestampedMixin): @@ -467,7 +555,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 +566,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 +605,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 +617,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 +862,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 +936,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 +945,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 +1032,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 +1044,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 +1074,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 +1094,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( @@ -1048,7 +1137,7 @@ class Vide(TimestampedMixin): class Meta: verbose_name = _('Vide') verbose_name_plural = _('Vides') - unique_together = ['dispositivo_base', 'dispositivo_ref'] + unique_together = ['dispositivo_base', 'dispositivo_ref', 'tipo'] def __str__(self): return _('Vide %s') % self.texto diff --git a/compilacao/templatetags/compilacao_filters.py b/compilacao/templatetags/compilacao_filters.py index 74d3b06ee..a8dfe91b9 100644 --- a/compilacao/templatetags/compilacao_filters.py +++ b/compilacao/templatetags/compilacao_filters.py @@ -1,3 +1,4 @@ +from compressor.utils import get_class from django import template from django.core.signing import Signer from django.db.models import Q @@ -22,8 +23,9 @@ def get_tipos_dispositivo(pk_atual): @register.filter -def get_field(value_dict, key): - return value_dict[key] +def lookup(d, key): + skey = str(key) + return d[str(key)] if skey in d else [] @register.simple_tag @@ -42,7 +44,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 @@ -151,3 +153,33 @@ def nomenclatura_heranca(d, ignore_ultimo=0, ignore_primeiro=0): d = d.dispositivo_pai return result + + +@register.simple_tag +def field_verbose_name(instance, field_name): + return instance._meta.get_field(field_name).verbose_name + + +@register.simple_tag +def fieldclass_verbose_name(class_name, field_name): + cls = get_class( + 'compilacao.models.' + class_name) + return cls._meta.get_field( + field_name).verbose_name + + +@register.simple_tag +def model_verbose_name(class_name): + model = get_class('compilacao.models.' + class_name) + return model._meta.verbose_name + + +@register.simple_tag +def model_verbose_name_plural(class_name): + model = get_class('compilacao.models.' + class_name) + return model._meta.verbose_name_plural + + +@register.filter +def urldetail_content_type(obj): + return '%s:detail' % obj.content_type.model diff --git a/compilacao/urls.py b/compilacao/urls.py index 571794788..93653f379 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -1,70 +1,101 @@ 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, +from compilacao.views import (tipo_nota_crud, tipo_publicacao_crud, tipo_vide_crud, veiculo_publicacao_crud) urlpatterns_compilacao = [ - url(r'^(?P[0-9]+)/compilacao$', - views.CompilacaoView.as_view(), name='compilacao'), - url(r'^(?P[0-9]+)/compilacao/(?P[0-9]+)/$', - views.DispositivoView.as_view(), name='dispositivo'), + url(r'^$', views.TaListView.as_view(), name='ta_list'), + url(r'^create$', views.TaCreateView.as_view(), name='ta_create'), + 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'), + url(r'^(?P[0-9]+)/delete$', + views.TaDeleteView.as_view(), name='ta_delete'), + + + url(r'^(?P[0-9]+)/text$', + views.TextView.as_view(), name='ta_text'), + url(r'^(?P[0-9]+)/text/vigencia/(?P.+)/$', + views.TextView.as_view(), name='ta_vigencia'), + + url(r'^(?P[0-9]+)/text/edit', + views.TextEditView.as_view(), name='ta_text_edit'), - url(r'^(?P[0-9]+)/compilacao/vigencia/(?P.+)/$', - views.CompilacaoView.as_view(), name='vigencia'), + url(r'^(?P[0-9]+)/text/(?P[0-9]+)/$', + views.DispositivoView.as_view(), name='dispositivo'), - 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]+)/text/(?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]+)/text/(?P[0-9]+)/actions', views.ActionsEditView.as_view(), name='dispositivo_actions'), - url(r'^(?P[0-9]+)/compilacao/' + + + url(r'^(?P[0-9]+)/text/' '(?P[0-9]+)/nota/create$', views.NotasCreateView.as_view(), name='nota_create'), - url(r'^(?P[0-9]+)/compilacao/' + url(r'^(?P[0-9]+)/text/' '(?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]+)/text/' '(?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]+)/text/' '(?P[0-9]+)/vide/create$', views.VideCreateView.as_view(), name='vide_create'), - url(r'^(?P[0-9]+)/compilacao/' + url(r'^(?P[0-9]+)/text/' '(?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]+)/text/' '(?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]+)/text/search$', views.DispositivoSearchFragmentFormView.as_view(), name='search_dispositivo'), -] -urlpatterns = [ - url(r'^norma/', include(urlpatterns_compilacao)), + url(r'^(?P[0-9]+)/publicacao$', + views.PublicacaoListView.as_view(), name='ta_pub_list'), + url(r'^(?P[0-9]+)/publicacao/create$', + views.PublicacaoCreateView.as_view(), name='ta_pub_create'), + url(r'^(?P[0-9]+)/publicacao/(?P[0-9]+)$', + views.PublicacaoDetailView.as_view(), name='ta_pub_detail'), + url(r'^(?P[0-9]+)/publicacao/(?P[0-9]+)/edit$', + views.PublicacaoUpdateView.as_view(), name='ta_pub_edit'), + url(r'^(?P[0-9]+)/publicacao/(?P[0-9]+)/delete$', + views.PublicacaoDeleteView.as_view(), name='ta_pub_delete'), + - url(r'^sistema/compilacao/tipo-nota/', + url(r'^config/tipo-textoarticulado$', + views.TipoTaListView.as_view(), name='tipo_ta_list'), + url(r'^config/tipo-textoarticulado/create$', + views.TipoTaCreateView.as_view(), name='tipo_ta_create'), + url(r'^config/tipo-textoarticulado/(?P[0-9]+)$', + views.TipoTaDetailView.as_view(), name='tipo_ta_detail'), + url(r'^config/tipo-textoarticulado/(?P[0-9]+)/edit$', + views.TipoTaUpdateView.as_view(), name='tipo_ta_edit'), + url(r'^config/tipo-textoarticulado/(?P[0-9]+)/delete$', + views.TipoTaDeleteView.as_view(), name='tipo_ta_delete'), + + url(r'^config/tipo-nota/', include(tipo_nota_crud.urls)), - url(r'^sistema/compilacao/tipo-vide/', + url(r'^config/tipo-vide/', include(tipo_vide_crud.urls)), - url(r'^sistema/compilacao/tipo-publicacao/', + url(r'^config/tipo-publicacao/', include(tipo_publicacao_crud.urls)), - url(r'^sistema/compilacao/tipo-dispositivo/', - include(tipo_dispositivo_crud.urls)), - url(r'^sistema/compilacao/veiculo-publicacao/', + url(r'^config/veiculo-publicacao/', include(veiculo_publicacao_crud.urls)), - url(r'^sistema/compilacao/perfil-estrutural-textos-normativos/', - include(perfil_estr_txt_norm.urls)), + +] + +urlpatterns = [ + url(r'^ta/', include(urlpatterns_compilacao)), ] diff --git a/compilacao/utils.py b/compilacao/utils.py new file mode 100644 index 000000000..dd6b40f66 --- /dev/null +++ b/compilacao/utils.py @@ -0,0 +1,324 @@ +from braces.views import FormMessagesMixin +from crispy_forms.helper import FormHelper +from crispy_forms_foundation.layout import Column, Fieldset, Row +from crispy_forms_foundation.layout.base import HTML, Div, Layout +from crispy_forms_foundation.layout.buttons import Submit +from django import forms +from django.conf.urls import url +from django.core.urlresolvers import reverse, reverse_lazy +from django.utils.functional import cached_property +from django.utils.translation import ugettext_lazy as _ +from django.views.generic.detail import DetailView +from django.views.generic.edit import CreateView, DeleteView, UpdateView +from django.views.generic.list import ListView + +NO_ENTRIES_MSG = _('Não existem registros') + + +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 to_fieldsets(fields): + for field in fields: + if isinstance(field, list): + legend, *row_specs = field + rows = [to_row(name_span_list) for name_span_list in row_specs] + yield Fieldset(legend, *rows) + else: + yield field + + +def 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 + + +def get_field_display(obj, fieldname): + field = obj._meta.get_field(fieldname) + verbose_name = str(field.verbose_name) + if field.choices: + value = getattr(obj, 'get_%s_display' % fieldname)() + else: + value = getattr(obj, fieldname) + + if value is None: + display = '' + elif 'date' in str(type(value)): + display = value.strftime("%d/%m/%Y") + elif 'bool' in str(type(value)): + display = 'Sim' if value else 'Não' + else: + display = str(value) + + return verbose_name, display + + +class FormLayout(Layout): + + def __init__(self, *fields): + buttons = Div( + HTML('%s' % _('Cancelar')), + Submit('submit', _('Enviar'), + css_class='button radius success right'), + css_class='radius clearfix' + ) + _fields = list(to_fieldsets(fields)) + \ + [Row(Column(buttons, css_class='clearfix'))] + super(FormLayout, self).__init__(*_fields) + + +class Crud(object): + pass + + +def build_crud(model, help_path, layout): + crud = Crud() + crud.model = model + crud.help_path = help_path + crud.namespace = model._meta.model_name + + class CrispyForm(forms.ModelForm): + + class Meta: + model = crud.model + exclude = [] + + def __init__(self, *args, **kwargs): + super(CrispyForm, self).__init__(*args, **kwargs) + self.helper = FormHelper() + self.helper.layout = FormLayout(*layout) + + crud.model_form = CrispyForm + + def in_namespace(url_name): + return '%s:%s' % (crud.namespace, url_name) + + def make_form_invalid_message(msg): + return '%s %s' % (_('Formulário inválido.'), msg) + + class BaseMixin(object): + model = crud.model + + verbose_name = crud.model._meta.verbose_name + verbose_name_plural = crud.model._meta.verbose_name_plural + + list_url = reverse_lazy(in_namespace('list')) + create_url = reverse_lazy(in_namespace('create')) + help_path = crud.help_path # FIXME + + def get_url_for_this_object(self, url_name): + return reverse(in_namespace(url_name), args=(self.object.id,)) + + @property + def detail_url(self): + return self.get_url_for_this_object('detail') + + @property + def update_url(self): + return self.get_url_for_this_object('update') + + @property + def delete_url(self): + return self.get_url_for_this_object('delete') + + def get_template_names(self): + names = super(BaseMixin, self).get_template_names() + names.append("compilacao/%s.html" % + self.template_name_suffix.lstrip('_')) + return names + + class CrudListView(BaseMixin, ListView): + title = BaseMixin.verbose_name_plural + paginate_by = 10 + no_entries_msg = NO_ENTRIES_MSG + + @cached_property + def field_names(self): + '''The list of field names to display on table + + This base implementation returns the field names + in the first fieldset of the layout. + ''' + rows = layout[0][1:] + return [fieldname for row in rows for fieldname, __ in row] + + def get_rows(self, object_list): + return [[(get_field_display(obj, name)[1], + obj.pk if i == 0 else None) + for i, name in enumerate(self.field_names)] + for obj in object_list + ] + + def get_context_data(self, **kwargs): + context = super(CrudListView, self).get_context_data(**kwargs) + paginator = context['paginator'] + page_obj = context['page_obj'] + context['page_range'] = make_pagination( + page_obj.number, paginator.num_pages) + object_list = context['object_list'] + context['headers'] = [ + self.model._meta.get_field(fieldname).verbose_name + for fieldname in self.field_names] + context['rows'] = self.get_rows(object_list) + context['NO_ENTRIES_MSG'] = NO_ENTRIES_MSG + return context + + class CrudCreateView(BaseMixin, FormMessagesMixin, CreateView): + form_class = crud.model_form + title = _('Adicionar %(verbose_name)s') % { + 'verbose_name': BaseMixin.verbose_name} + form_valid_message = _('Registro criado com sucesso!') + form_invalid_message = make_form_invalid_message( + _('O registro não foi criado.')) + cancel_url = BaseMixin.list_url + + def form_invalid(self, form): + """ + If the form is invalid, re-render the context data with the + data-filled form and errors. + """ + print(form.errors) + return self.render_to_response(self.get_context_data(form=form)) + + def get_success_url(self): + return self.detail_url + + class CrudDetailView(BaseMixin, DetailView): + + @property + def title(self): + return self.get_object() + + def get_column(self, fieldname, span): + obj = self.get_object() + verbose_name, text = get_field_display(obj, fieldname) + return { + 'id': fieldname, + 'span': span, + 'verbose_name': verbose_name, + 'text': text, + } + + @property + def fieldsets(self): + return [ + {'legend': legend, + 'rows': [[self.get_column(fieldname, span) + for fieldname, span in row] + for row in rows] + } for legend, *rows in layout] + + class CrudUpdateView(BaseMixin, FormMessagesMixin, UpdateView): + form_class = crud.model_form + form_valid_message = _('Registro alterado com sucesso!') + form_invalid_message = make_form_invalid_message( + _('Suas alterações não foram salvas.')) + + @property + def title(self): + return self.get_object() + + def get_success_url(self): + return self.detail_url + + def cancel_url(self): + return self.detail_url + + class CrudDeleteView(BaseMixin, FormMessagesMixin, DeleteView): + form_valid_message = _('Registro excluído com sucesso!') + form_invalid_message = make_form_invalid_message( + _('O registro não foi excluído.')) + + def get_success_url(self): + return self.list_url + + crud.CrudListView = CrudListView + crud.CrudCreateView = CrudCreateView + crud.CrudDetailView = CrudDetailView + crud.CrudUpdateView = CrudUpdateView + crud.CrudDeleteView = CrudDeleteView + + # XXX transform into a property of Crud to enable override + crud.urlpatterns = [ + url(r'^$', CrudListView.as_view(), name='list'), + url(r'^create$', CrudCreateView.as_view(), name='create'), + url(r'^(?P\d+)$', CrudDetailView.as_view(), name='detail'), + url(r'^(?P\d+)/edit$', + CrudUpdateView.as_view(), name='update'), + url(r'^(?P\d+)/delete$', + CrudDeleteView.as_view(), name='delete'), + ] + crud.urls = crud.urlpatterns, crud.namespace, crud.namespace + + return crud diff --git a/compilacao/views.py b/compilacao/views.py index ed14100b0..fd137838b 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -1,39 +1,44 @@ from collections import OrderedDict from datetime import datetime, timedelta -from os.path import sys +import sys +from braces.views import FormMessagesMixin +from django import forms from django.contrib.auth.decorators import login_required +from django.contrib.contenttypes.models import ContentType 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.shortcuts import get_object_or_404, redirect 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 +from django.views.generic.detail import DetailView +from django.views.generic.edit import CreateView, DeleteView, UpdateView from django.views.generic.list import ListView -from vanilla.model_views import CreateView -from compilacao import forms -from compilacao.file2dispositivo import Parser +from compilacao import utils +from compilacao.forms import NotaForm, TaForm, TipoTaForm, VideForm,\ + PublicacaoForm from compilacao.models import (Dispositivo, Nota, - PerfilEstruturalTextosNormativos, - TipoDispositivo, TipoNota, TipoPublicacao, - TipoVide, VeiculoPublicacao, Vide) -from norma.models import NormaJuridica -from sapl.crud import build_crud + PerfilEstruturalTextoArticulado, + TextoArticulado, TipoDispositivo, TipoNota, + TipoPublicacao, TipoTextoArticulado, TipoVide, + VeiculoPublicacao, Vide, Publicacao) +from compilacao.utils import build_crud, NO_ENTRIES_MSG + 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_ta', 'dispositivo_pai', 'dispositivo_pai__tipo_dispositivo') @@ -59,13 +64,6 @@ tipo_publicacao_crud = build_crud( [('sigla', 2), ('nome', 10)]], ]) -perfil_estr_txt_norm = build_crud( - PerfilEstruturalTextosNormativos, 'perfil_estrutural', [ - - [_('Perfil Estrutural de Textos Normativos'), - [('sigla', 2), ('nome', 10)]], - ]) - veiculo_publicacao_crud = build_crud( VeiculoPublicacao, 'veiculo_publicacao', [ @@ -74,51 +72,263 @@ veiculo_publicacao_crud = build_crud( [('sigla', 2), ('nome', 10)]], ]) -tipo_dispositivo_crud = build_crud( - TipoDispositivo, 'tipo_dispositivo', [ - [_('Dados Básicos'), - [('nome', 8), ('class_css', 4)]], +class IntegracaoTaView(TemplateView): - [_('Configurações para Edição do Rótulo'), - [('rotulo_prefixo_texto', 3), - ('rotulo_sufixo_texto', 3), - ('rotulo_ordinal', 3), - ('contagem_continua', 3)], + def get(self, *args, **kwargs): + item = get_object_or_404(self.model, pk=kwargs['pk']) + related_object_type = ContentType.objects.get_for_model(item) - ], + ta = TextoArticulado.objects.filter( + object_id=item.pk, + content_type=related_object_type) - [_('Configurações para Renderização de Rótulo e Texto'), - [('rotulo_prefixo_html', 6), - ('rotulo_sufixo_html', 6), ], + if not ta.exists(): + ta = TextoArticulado() + tipo_ta = TipoTextoArticulado.objects.filter( + content_type=related_object_type)[:1] + if tipo_ta.exists(): + ta.tipo_ta = tipo_ta[0] + ta.content_object = item + else: + ta = ta[0] - [('texto_prefixo_html', 4), - ('dispositivo_de_articulacao', 4), - ('texto_sufixo_html', 4)], - ], + if hasattr(item, 'ementa') and item.ementa: + ta.ementa = item.ementa + else: + ta.ementa = 'Integração com %s sem ementa.' % item - [_('Configurações para Nota Automática'), - [('nota_automatica_prefixo_html', 6), - ('nota_automatica_sufixo_html', 6), - ], - ], + if hasattr(item, 'observacao') and item.observacao: + ta.observacao = item.observacao + else: + ta.observacao = 'Integração com %s sem observacao.' % item - [_('Configurações para Variações Numéricas'), + if hasattr(item, 'numero') and item.numero: + ta.numero = item.numero + else: + ta.numero = int('%s%s%s' % ( + int(datetime.now().year), + int(datetime.now().month), + int(datetime.now().day))) - [('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), ], + if hasattr(item, 'ano') and item.ano: + ta.ano = item.ano + else: + ta.ano = datetime.now().year - ], + if hasattr(item, 'data_apresentacao'): + ta.data = item.data_apresentacao + elif hasattr(item, 'data'): + ta.data = item.data + else: + ta.data = datetime.now() + + ta.save() + + return redirect(to=reverse_lazy('ta_text', kwargs={'ta_id': ta.pk})) + + class Meta: + abstract = True + + +def get_integrations_view_names(): + result = [] + modules = sys.modules + for key, value in modules.items(): + if key.endswith('.views'): + for v in value.__dict__.values(): + if hasattr(v, '__bases__'): + for base in v.__bases__: + if base == IntegracaoTaView: + result.append(v) + return result + + +def choice_extenal_views(): + integrations_view_names = get_integrations_view_names() + result = [(None, '-------------'), ] + for item in integrations_view_names: + ct = ContentType.objects.filter( + model=item.model.__name__.lower(), + app_label=item.model._meta.app_label) + if ct.exists(): + result.append(( + ct[0].pk, + item.model._meta.verbose_name_plural)) + return result + + +class CompMixin(object): + + @property + def title(self): + try: + return self.get_object() + except: + return self.object + + +class TipoTaListView(ListView): + model = TipoTextoArticulado + paginate_by = 10 + verbose_name = model._meta.verbose_name + + @property + def title(self): + return self.model._meta.verbose_name_plural + + @property + def create_url(self): + return reverse_lazy('tipo_ta_create') + + +class TipoTaCreateView(FormMessagesMixin, CreateView): + model = TipoTextoArticulado + form_class = TipoTaForm + template_name = "compilacao/form.html" + form_valid_message = _('Registro criado com sucesso!') + form_invalid_message = _('O registro não foi criado.') + + def get(self, request, *args, **kwargs): + self.object = None + form = self.get_form() + form.fields['content_type'] = forms.ChoiceField( + choices=choice_extenal_views(), + label=_('Modelo Integrado'), required=False) + + return self.render_to_response(self.get_context_data(form=form)) + + def get_success_url(self): + return reverse_lazy('tipo_ta_detail', kwargs={'pk': self.object.id}) + + @property + def cancel_url(self): + return reverse_lazy('tipo_ta_list') + + +class TipoTaDetailView(CompMixin, DetailView): + model = TipoTextoArticulado - ]) +class TipoTaUpdateView(CompMixin, UpdateView): + model = TipoTextoArticulado + form_class = TipoTaForm + template_name = "compilacao/form.html" -class CompilacaoView(ListView): - template_name = 'compilacao/index.html' + def get(self, request, *args, **kwargs): + self.object = self.get_object() + form = self.get_form() + form.fields['content_type'] = forms.ChoiceField( + choices=choice_extenal_views(), + label=_('Modelo Integrado'), required=False) + return self.render_to_response(self.get_context_data(form=form)) + + def get_success_url(self): + return reverse_lazy('tipo_ta_detail', kwargs={'pk': self.kwargs['pk']}) + + @property + def cancel_url(self): + return reverse_lazy('tipo_ta_detail', kwargs={'pk': self.kwargs['pk']}) + + +class TipoTaDeleteView(CompMixin, DeleteView): + model = TipoTextoArticulado + template_name = "compilacao/confirm_delete.html" + + @property + def detail_url(self): + return reverse_lazy('tipo_ta_detail', kwargs={'pk': self.kwargs['pk']}) + + def get_success_url(self): + return reverse_lazy('tipo_ta_list') + + +class TaListView(ListView): + model = TextoArticulado + paginate_by = 10 + verbose_name = model._meta.verbose_name + + @property + def title(self): + return self.model._meta.verbose_name_plural + + @property + def create_url(self): + return reverse_lazy('ta_create') + + def get_context_data(self, **kwargs): + 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 + + +class TaDetailView(DetailView): + model = TextoArticulado + + @property + def title(self): + if self.get_object().content_object: + return _( + 'Metadados para o Texto Articulado da %s - %s') % ( + self.get_object().content_object._meta.verbose_name_plural, + self.get_object().content_object) + else: + return self.get_object() + + +class TaCreateView(FormMessagesMixin, CreateView): + model = TextoArticulado + form_class = TaForm + template_name = "compilacao/form.html" + form_valid_message = _('Registro criado com sucesso!') + form_invalid_message = _('O registro não foi criado.') + + def get_success_url(self): + return reverse_lazy('ta_detail', kwargs={'pk': self.object.id}) + + @property + def cancel_url(self): + return reverse_lazy('ta_list') + + +class TaUpdateView(CompMixin, UpdateView): + model = TextoArticulado + form_class = TaForm + template_name = "compilacao/form.html" + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + form = self.get_form() + # if self.object and self.object.content_object: + # form.fields['tipo_ta'].required = False + # form.fields['tipo_ta'].widget.attrs['disabled'] = 'disabled' + return self.render_to_response(self.get_context_data(form=form)) + + def get_success_url(self): + return reverse_lazy('ta_detail', kwargs={'pk': self.kwargs['pk']}) + + @property + def cancel_url(self): + return reverse_lazy('ta_detail', kwargs={'pk': self.kwargs['pk']}) + + +class TaDeleteView(CompMixin, DeleteView): + model = TextoArticulado + template_name = "compilacao/confirm_delete.html" + + @property + def detail_url(self): + return reverse_lazy('ta_detail', kwargs={'pk': self.kwargs['pk']}) + + def get_success_url(self): + return reverse_lazy('ta_list') + + +class TextView(ListView, CompMixin): + template_name = 'compilacao/text_list.html' flag_alteradora = -1 @@ -130,20 +340,88 @@ class CompilacaoView(ListView): inicio_vigencia = None fim_vigencia = None - def get_context_data(self, **kwargs): - context = super(CompilacaoView, self).get_context_data(**kwargs) + def get(self, request, *args, **kwargs): + ta = TextoArticulado.objects.get(pk=self.kwargs['ta_id']) + self.object = ta + if ta.content_object: + item = ta.content_object + self.object = item + if hasattr(item, 'ementa') and item.ementa: + ta.ementa = item.ementa + else: + ta.ementa = 'Integração com %s sem ementa.' % item - vides = Vide.objects.filter( - Q(dispositivo_base__norma_id=self.kwargs['norma_id']) | - Q(dispositivo_ref__norma_id=self.kwargs['norma_id'])) + if hasattr(item, 'observacao') and item.observacao: + ta.observacao = item.observacao + else: + ta.observacao = 'Integração com %s sem observacao.' % item - context['cita'] = [v.dispositivo_base_id for v in vides] - context['citado'] = [v.dispositivo_ref_id for v in vides] + if hasattr(item, 'numero') and item.numero: + ta.numero = item.numero + else: + ta.numero = int('%s%s%s' % ( + int(datetime.now().year), + int(datetime.now().month), + int(datetime.now().day))) - notas = Nota.objects.filter( - dispositivo__norma_id=self.kwargs['norma_id']) + if hasattr(item, 'ano') and item.ano: + ta.ano = item.ano + else: + ta.ano = datetime.now().year - context['notas'] = [n.dispositivo_id for n in notas] + if hasattr(item, 'data_apresentacao'): + ta.data = item.data_apresentacao + elif hasattr(item, 'data'): + ta.data = item.data + else: + ta.data = datetime.now() + ta.save() + + return super(TextView, self).get(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + context = super(TextView, self).get_context_data(**kwargs) + + context['object'] = TextoArticulado.objects.get( + pk=self.kwargs['ta_id']) + + 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): @@ -165,38 +443,29 @@ class CompilacaoView(ListView): return Dispositivo.objects.filter( inicio_vigencia__lte=self.fim_vigencia, ordem__gt=0, - norma_id=self.kwargs['norma_id'], + ta_id=self.kwargs['ta_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') + ta_id=self.kwargs['ta_id'], + ).select_related(*DISPOSITIVO_SELECT_RELATED) return r def get_vigencias(self): itens = Dispositivo.objects.filter( - norma_id=self.kwargs['norma_id'], + ta_id=self.kwargs['ta_id'], ).order_by( 'inicio_vigencia' ).distinct( 'inicio_vigencia' ).select_related( - 'norma_publicada', - 'norma', - 'norma_publicada__tipo', - 'norma__tipo',) + 'ta_publicado', + 'ta', + 'ta_publicado__tipo_ta', + 'ta__tipo_ta',) ajuste_datas_vigencia = [] @@ -223,7 +492,7 @@ class CompilacaoView(ListView): continue if idx + 1 < length: - ano = item.norma_publicada.ano + ano = item.ta_publicado.ano if ano in self.itens_de_vigencia: self.itens_de_vigencia[ano].append(item) else: @@ -239,21 +508,17 @@ class CompilacaoView(ListView): 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): + def is_ta_alterador(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() + 'dispositivos_alterados_pelo_texto_articulado_set' + ).filter(ta_id=self.kwargs['ta_id']).count() return self.flag_alteradora > 0 -class DispositivoView(CompilacaoView): +class DispositivoView(TextView): # template_name = 'compilacao/index.html' - template_name = 'compilacao/index_bloco.html' + template_name = 'compilacao/text_list_bloco.html' def get_queryset(self): self.flag_alteradora = -1 @@ -271,31 +536,24 @@ class DispositivoView(CompilacaoView): proximo_bloco = Dispositivo.objects.filter( ordem__gt=bloco.ordem, nivel__lte=bloco.nivel, - norma_id=self.kwargs['norma_id'])[:1] + ta_id=self.kwargs['ta_id'])[:1] if proximo_bloco.count() == 0: itens = Dispositivo.objects.filter( ordem__gte=bloco.ordem, - norma_id=self.kwargs['norma_id'] + 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, - norma_id=self.kwargs['norma_id'] + 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' +class TextEditView(TextView): + template_name = 'compilacao/text_edit.html' flag_alteradora = -1 @@ -304,55 +562,14 @@ class CompilacaoEditView(CompilacaoView, FormMixin): 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) + object_list=self.object_list) - return self.render_to_response(context) + return self.render_to_response(context)""" def get_queryset(self): self.pk_edit = 0 @@ -363,12 +580,12 @@ class CompilacaoEditView(CompilacaoView, FormMixin): self.flag_nivel_old = -1 result = Dispositivo.objects.filter( - norma_id=self.kwargs['norma_id'] + ta_id=self.kwargs['ta_id'] ).select_related(*DISPOSITIVO_SELECT_RELATED) if not result.exists(): - norma = NormaJuridica.objects.get(pk=self.kwargs['norma_id']) + ta = TextoArticulado.objects.get(pk=self.kwargs['ta_id']) td = TipoDispositivo.objects.filter(class_css='articulacao')[0] a = Dispositivo() @@ -376,10 +593,10 @@ class CompilacaoEditView(CompilacaoView, FormMixin): a.ordem = Dispositivo.INTERVALO_ORDEM a.ordem_bloco_atualizador = 0 a.set_numero_completo([1, 0, 0, 0, 0, 0, ]) - a.norma = norma + a.ta = ta a.tipo_dispositivo = td - a.inicio_vigencia = norma.data_publicacao - a.inicio_eficacia = norma.data_publicacao + a.inicio_vigencia = ta.data + a.inicio_eficacia = ta.data a.timestamp = datetime.now() a.save() @@ -389,12 +606,12 @@ class CompilacaoEditView(CompilacaoView, FormMixin): 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.ta = ta e.tipo_dispositivo = td - e.inicio_vigencia = norma.data_publicacao - e.inicio_eficacia = norma.data_publicacao + e.inicio_vigencia = ta.data + e.inicio_eficacia = ta.data e.timestamp = datetime.now() - e.texto = norma.ementa + e.texto = ta.ementa e.dispositivo_pai = a e.save() @@ -407,7 +624,7 @@ class CompilacaoEditView(CompilacaoView, FormMixin): a.save() result = Dispositivo.objects.filter( - norma_id=self.kwargs['norma_id'] + ta_id=self.kwargs['ta_id'] ).select_related(*DISPOSITIVO_SELECT_RELATED) return result @@ -417,11 +634,11 @@ class CompilacaoEditView(CompilacaoView, FormMixin): return None if perfil_id: - perfil = PerfilEstruturalTextosNormativos.objects.get( + perfil = PerfilEstruturalTextoArticulado.objects.get( pk=perfil_id) request.session['perfil_estrutural'] = perfil.pk else: - perfis = PerfilEstruturalTextosNormativos.objects.filter( + perfis = PerfilEstruturalTextoArticulado.objects.filter( padrao=True)[:1] if not perfis.exists(): @@ -430,8 +647,8 @@ class CompilacaoEditView(CompilacaoView, FormMixin): request.session['perfil_estrutural'] = perfis[0].pk -class DispositivoEditView(CompilacaoEditView): - template_name = 'compilacao/edit_bloco.html' +class DispositivoEditView(TextEditView): + template_name = 'compilacao/text_edit_bloco.html' def post(self, request, *args, **kwargs): @@ -449,22 +666,25 @@ class DispositivoEditView(CompilacaoEditView): if texto != '': dnext = Dispositivo.objects.filter( - norma_id=d.norma_id, + 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, ] + dnext = [] + dnext[0] = d else: - if dnext[0].dispositivo_pai_id == d.dispositivo_pai_id: - pais = [dnext[0].dispositivo_pai_id, ] + + if dnext[0].nivel > d.nivel: + pais = [d.pk, ] else: - pais = [ - dnext[0].dispositivo_pai_id, d.dispositivo_pai_id, ] + 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, ]} @@ -472,7 +692,7 @@ class DispositivoEditView(CompilacaoEditView): return JsonResponse(data, safe=False) def get_queryset_perfil_estrutural(self): - perfis = PerfilEstruturalTextosNormativos.objects.all() + perfis = PerfilEstruturalTextoArticulado.objects.all() return perfis def get(self, request, *args, **kwargs): @@ -527,18 +747,18 @@ class DispositivoEditView(CompilacaoEditView): proximo_bloco = Dispositivo.objects.filter( ordem__gt=bloco.ordem, nivel__lte=bloco.nivel, - norma_id=self.kwargs['norma_id'])[:1] + ta_id=self.kwargs['ta_id'])[:1] if proximo_bloco.count() == 0: itens = Dispositivo.objects.filter( ordem__gte=bloco.ordem, - norma_id=self.kwargs['norma_id'] + 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, - norma_id=self.kwargs['norma_id'] + ta_id=self.kwargs['ta_id'] ).select_related(*DISPOSITIVO_SELECT_RELATED) return itens @@ -560,7 +780,7 @@ class DispositivoEditView(CompilacaoEditView): prox_possivel = Dispositivo.objects.filter( ordem__gt=base.ordem, nivel__lte=base.nivel, - norma_id=base.norma_id)[:1] + ta_id=base.ta_id)[:1] if prox_possivel.exists(): prox_possivel = prox_possivel[0] @@ -783,7 +1003,7 @@ class ActionsEditMixin(object): base = Dispositivo.objects.get(pk=context['dispositivo_id']) base_anterior = Dispositivo.objects.order_by('-ordem').filter( - norma_id=base.norma_id, + ta_id=base.ta_id, ordem__lt=base.ordem )[:1] base.delete() @@ -820,7 +1040,7 @@ class ActionsEditMixin(object): qtdp = tipoauto.quantidade_permitida if qtdp >= 0: qtdp -= Dispositivo.objects.filter( - norma_id=base.norma_id, + ta_id=base.ta_id, tipo_dispositivo_id=tipoauto.filho_permitido.pk ).count() if qtdp > 0: @@ -855,7 +1075,7 @@ class ActionsEditMixin(object): '-ordem').filter( ordem__lte=base.ordem, tipo_dispositivo_id=tipo.pk, - norma_id=base.norma_id)[:1] + ta_id=base.ta_id)[:1] if not ultimo_irmao.exists(): dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) @@ -878,7 +1098,7 @@ class ActionsEditMixin(object): if pp.exists() and pp[0].quantidade_permitida >= 0: qtd_existente = Dispositivo.objects.filter( - norma_id=dp.norma_id, + ta_id=dp.ta_id, tipo_dispositivo_id=dp.tipo_dispositivo_id).count() if qtd_existente >= pp[0].quantidade_permitida: @@ -931,7 +1151,7 @@ class ActionsEditMixin(object): if not dp.tipo_dispositivo.dispositivo_de_alteracao: possiveis_filhos = Dispositivo.objects.filter( ordem__gt=dp.ordem, - norma_id=dp.norma_id) + ta_id=dp.ta_id) for filho in possiveis_filhos: @@ -1005,18 +1225,18 @@ class ActionsEditMixin(object): proxima_articulacao = Dispositivo.objects.filter( ordem__gt=dp.ordem, nivel=0, - norma_id=dp.norma_id)[:1] + ta_id=dp.ta_id)[:1] if not proxima_articulacao.exists(): filhos_continuos = list(Dispositivo.objects.filter( ordem__gt=dp.ordem, - norma_id=dp.norma_id, + 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), - norma_id=dp.norma_id, + ta_id=dp.ta_id, tipo_dispositivo__contagem_continua=True)) for filho in filhos_continuos: @@ -1071,13 +1291,13 @@ class ActionsEditMixin(object): if proxima_articulacao is not None: parents = Dispositivo.objects.filter( - norma_id=dp.norma_id, + ta_id=dp.ta_id, ordem__gte=dp.ordem, ordem__lt=proxima_articulacao.ordem, nivel__lte=dp.nivel) else: parents = Dispositivo.objects.filter( - norma_id=dp.norma_id, + ta_id=dp.ta_id, ordem__gte=dp.ordem, nivel__lte=dp.nivel) @@ -1118,8 +1338,8 @@ class DispositivoSuccessUrlMixin(object): def get_success_url(self): return reverse( 'dispositivo', kwargs={ - 'norma_id': self.kwargs[ - 'norma_id'], + 'ta_id': self.kwargs[ + 'ta_id'], 'dispositivo_id': self.kwargs[ 'dispositivo_id']}) @@ -1127,9 +1347,6 @@ class DispositivoSuccessUrlMixin(object): 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 @@ -1150,9 +1367,9 @@ class NotaMixin(DispositivoSuccessUrlMixin): return super(NotaMixin, self).dispatch(*args, **kwargs) -class NotasCreateView(NotaMixin, FormMixin, CreateView): +class NotasCreateView(NotaMixin, CreateView): template_name = 'compilacao/ajax_form.html' - form_class = forms.NotaForm + form_class = NotaForm def get(self, request, *args, **kwargs): flag_action, modelo_nota = self.get_modelo_nota(request) @@ -1163,10 +1380,10 @@ class NotasCreateView(NotaMixin, FormMixin, CreateView): def post(self, request, *args, **kwargs): try: - norma_id = kwargs.pop('norma_id') + ta_id = kwargs.pop('ta_id') dispositivo_id = kwargs.pop('dispositivo_id') - form = forms.NotaForm(request.POST, request.FILES, **kwargs) - kwargs['norma_id'] = norma_id + form = NotaForm(request.POST, request.FILES, **kwargs) + kwargs['ta_id'] = ta_id kwargs['dispositivo_id'] = dispositivo_id if form.is_valid(): @@ -1179,13 +1396,13 @@ class NotasCreateView(NotaMixin, FormMixin, CreateView): return self.form_invalid(form) except Exception as e: print(e) - return HttpResponse("post") + return HttpResponse("error post") class NotasEditView(NotaMixin, UpdateView): model = Nota template_name = 'compilacao/ajax_form.html' - form_class = forms.NotaForm + form_class = NotaForm def get(self, request, *args, **kwargs): flag_action, modelo_nota = self.get_modelo_nota(request) @@ -1221,16 +1438,18 @@ class VideMixin(DispositivoSuccessUrlMixin): return super(VideMixin, self).dispatch(*args, **kwargs) -class VideCreateView(VideMixin, FormMixin, CreateView): +class VideCreateView(VideMixin, CreateView): + model = Vide template_name = 'compilacao/ajax_form.html' - form_class = forms.VideForm + form_class = VideForm - def post(self, request, *args, **kwargs): + def post_old(self, request, *args, **kwargs): try: - norma_id = kwargs.pop('norma_id') + self.object = None + ta_id = kwargs.pop('ta_id') dispositivo_id = kwargs.pop('dispositivo_id') - form = forms.VideForm(request.POST, request.FILES, **kwargs) - kwargs['norma_id'] = norma_id + form = VideForm(request.POST, request.FILES, **kwargs) + kwargs['ta_id'] = ta_id kwargs['dispositivo_id'] = dispositivo_id if form.is_valid(): @@ -1242,13 +1461,13 @@ class VideCreateView(VideMixin, FormMixin, CreateView): return self.form_invalid(form) except Exception as e: print(e) - return HttpResponse("post") + return HttpResponse("error post") class VideEditView(VideMixin, UpdateView): model = Vide template_name = 'compilacao/ajax_form.html' - form_class = forms.VideForm + form_class = VideForm class VideDeleteView(VideMixin, TemplateView): @@ -1297,22 +1516,22 @@ class DispositivoSearchFragmentFormView(ListView): 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) + if 'tipo_ta' in self.request.GET: + tipo_ta = self.request.GET['tipo_ta'] + if tipo_ta: + q = q & Q(ta__tipo_ta_id=tipo_ta) 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) + 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_norma' in self.request.GET: - ano_norma = self.request.GET['ano_norma'] - if ano_norma: - q = q & Q(norma__ano=ano_norma) + 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: @@ -1325,3 +1544,102 @@ class DispositivoSearchFragmentFormView(ListView): except Exception as e: print(e) + + +class PublicacaoListView(ListView): + model = Publicacao + verbose_name = model._meta.verbose_name + + @property + def title(self): + return _('%s da %s' % ( + self.model._meta.verbose_name_plural, + self.ta)) + + @property + def ta(self): + ta = TextoArticulado.objects.get(pk=self.kwargs['ta_id']) + return ta + + @property + def create_url(self): + return reverse_lazy( + 'ta_pub_create', + kwargs={'ta_id': self.kwargs['ta_id']}) + + def get_queryset(self): + pubs = Publicacao.objects.filter(ta_id=self.kwargs['ta_id']) + return pubs + + def get_context_data(self, **kwargs): + context = super(PublicacaoListView, self).get_context_data(**kwargs) + context['NO_ENTRIES_MSG'] = NO_ENTRIES_MSG + return context + + +class PublicacaoCreateView(FormMessagesMixin, CreateView): + model = Publicacao + form_class = PublicacaoForm + template_name = "compilacao/form.html" + form_valid_message = _('Registro criado com sucesso!') + form_invalid_message = _('O registro não foi criado.') + + def get_success_url(self): + return reverse_lazy( + 'ta_pub_detail', + kwargs={ + 'pk': self.object.id, + 'ta_id': self.kwargs['ta_id']}) + + @property + def cancel_url(self): + return reverse_lazy( + 'ta_pub_list', + kwargs={'ta_id': self.kwargs['ta_id']}) + + def get_initial(self): + return {'ta': self.kwargs['ta_id']} + + +class PublicacaoDetailView(CompMixin, DetailView): + model = Publicacao + + +class PublicacaoUpdateView(CompMixin, UpdateView): + model = Publicacao + form_class = PublicacaoForm + template_name = "compilacao/form.html" + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + form = self.get_form() + # if self.object and self.object.content_object: + # form.fields['tipo_ta'].required = False + # form.fields['tipo_ta'].widget.attrs['disabled'] = 'disabled' + return self.render_to_response(self.get_context_data(form=form)) + + def get_success_url(self): + return reverse_lazy('ta_pub_detail', + kwargs={ + 'pk': self.object.id, + 'ta_id': self.kwargs['ta_id']}) + + @property + def cancel_url(self): + return self.get_success_url() + + +class PublicacaoDeleteView(CompMixin, DeleteView): + model = Publicacao + template_name = "compilacao/confirm_delete.html" + + @property + def detail_url(self): + return reverse_lazy('ta_pub_detail', + kwargs={ + 'pk': self.object.id, + 'ta_id': self.kwargs['ta_id']}) + + def get_success_url(self): + return reverse_lazy('ta_pub_list', + kwargs={'ta_id': self.kwargs['ta_id']}) diff --git a/compilacao/views2.py b/compilacao/views2.py new file mode 100644 index 000000000..4c09763f3 --- /dev/null +++ b/compilacao/views2.py @@ -0,0 +1,54 @@ +from django.utils.translation import ugettext_lazy as _ + +from compilacao.models import PerfilEstruturalTextoArticulado, TipoDispositivo +from sapl.crud import build_crud + +perfil_estr_txt_norm = build_crud( + PerfilEstruturalTextoArticulado, 'perfil_estrutural', [ + + [_('Perfil Estrutural de Textos Articulados'), + [('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), ], + + ], + + ]) diff --git a/materia/urls.py b/materia/urls.py index e728f31aa..e7ddf4317 100644 --- a/materia/urls.py +++ b/materia/urls.py @@ -6,18 +6,33 @@ from materia.views import (AutoriaEditView, AutoriaView, FormularioCadastroView, FormularioSimplificadoView, LegislacaoCitadaEditView, LegislacaoCitadaView, MateriaAnexadaEditView, MateriaAnexadaView, - MateriaLegislativaPesquisaView, NumeracaoEditView, - NumeracaoView, PesquisaMateriaListView, - ProposicaoListView, ProposicaoView, - RelatoriaEditView, RelatoriaView, - TramitacaoEditView, TramitacaoView, autor_crud, - materia_legislativa_crud, orgao_crud, origem_crud, - regime_tramitacao_crud, status_tramitacao_crud, - tipo_autor_crud, tipo_documento_crud, - tipo_fim_relatoria_crud, tipo_materia_crud, - tipo_proposicao_crud, unidade_tramitacao_crud) + MateriaLegislativaPesquisaView, MateriaTaView, + NumeracaoEditView, NumeracaoView, + PesquisaMateriaListView, ProposicaoListView, + ProposicaoTaView, ProposicaoView, RelatoriaEditView, + RelatoriaView, TramitacaoEditView, TramitacaoView, + autor_crud, materia_legislativa_crud, orgao_crud, + origem_crud, regime_tramitacao_crud, + status_tramitacao_crud, tipo_autor_crud, + tipo_documento_crud, tipo_fim_relatoria_crud, + tipo_materia_crud, tipo_proposicao_crud, + unidade_tramitacao_crud) + +materia_legislativa_patterns = materia_legislativa_crud.urlpatterns + urlpatterns = [ + url(r'^materia/', include(materia_legislativa_patterns, + materia_legislativa_crud.namespace, + materia_legislativa_crud.namespace)), + + + url(r'^materia/(?P[0-9]+)/ta$', + MateriaTaView.as_view(), name='materia_ta'), + url(r'^materia/proposicao/(?P[0-9]+)/ta$', + ProposicaoTaView.as_view(), name='proposicao_ta'), + + 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 +50,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/materia/views.py b/materia/views.py index 49a918abd..3cdda9262 100644 --- a/materia/views.py +++ b/materia/views.py @@ -13,10 +13,11 @@ from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ from django.views.generic import ListView from django.views.generic.edit import FormMixin -from vanilla import GenericView +from vanilla.views import GenericView import sapl from comissoes.models import Comissao, Composicao +from compilacao.views import IntegracaoTaView from norma.models import LegislacaoCitada, NormaJuridica, TipoNormaJuridica from parlamentares.models import Parlamentar from sapl.crud import build_crud @@ -508,10 +509,10 @@ class MateriaAnexadaView(FormMixin, GenericView): error = 'A matéria a ser anexada não pode ser do mesmo \ tipo da matéria principal.' return self.render_to_response( - {'error': error, - 'form': form, - 'materialegislativa': mat_principal, - 'anexadas': anexadas}) + {'error': error, + 'form': form, + 'materialegislativa': mat_principal, + 'anexadas': anexadas}) anexada = Anexada() anexada.materia_principal = mat_principal @@ -527,17 +528,17 @@ class MateriaAnexadaView(FormMixin, GenericView): error = 'A matéria a ser anexada não existe no cadastro \ de matérias legislativas.' return self.render_to_response( - {'error': error, - 'form': form, - 'materialegislativa': mat_principal, - 'anexadas': anexadas}) + {'error': error, + 'form': form, + 'materialegislativa': mat_principal, + 'anexadas': anexadas}) return self.form_valid(form) else: return self.render_to_response( - {'form': form, - 'materialegislativa': mat_principal, - 'anexadas': anexadas}) + {'form': form, + 'materialegislativa': mat_principal, + 'anexadas': anexadas}) def get_success_url(self): pk = self.kwargs['pk'] @@ -615,14 +616,14 @@ class MateriaAnexadaEditView(FormMixin, GenericView): error = 'A matéria a ser anexada não existe no cadastro \ de matérias legislativas.' return self.render_to_response( - {'error': error, - 'form': form, - 'materialegislativa': mat_principal}) + {'error': error, + 'form': form, + 'materialegislativa': mat_principal}) else: return self.render_to_response( - {'form': form, - 'materialegislativa': mat_principal}) + {'form': form, + 'materialegislativa': mat_principal}) def get_success_url(self): pk = self.kwargs['pk'] @@ -950,7 +951,7 @@ class NumeracaoForm(ModelForm): required=True, queryset=TipoMateriaLegislativa.objects.all(), empty_label='Selecione', - ) + ) data_materia = forms.DateField(label='Data', required=False, @@ -1090,7 +1091,7 @@ class DocumentoAcessorioForm(ModelForm): required=True, queryset=TipoDocumento.objects.all(), empty_label='Selecione', - ) + ) data = forms.DateField(label='Data', required=False, @@ -1519,7 +1520,7 @@ class TramitacaoEditView(FormMixin, GenericView): if form.is_valid(): if 'excluir' in request.POST: if tramitacao == Tramitacao.objects.filter( - materia=materia).last(): + materia=materia).last(): tramitacao.delete() return self.form_valid(form) else: @@ -1765,7 +1766,7 @@ class ProposicaoForm(ModelForm): ButtonHolder( Submit('sumbmit', 'Salvar', css_class='button primary') - ), css_class='columns large-2')) + ), css_class='columns large-2')) self.helper = FormHelper() self.helper.layout = Layout( @@ -1836,7 +1837,7 @@ class ProposicaoListView(ListView): page_obj = context['page_obj'] context['page_range'] = sapl.crud.make_pagination( - page_obj.number, paginator.num_pages) + page_obj.number, paginator.num_pages) return context @@ -1852,7 +1853,7 @@ class MateriaLegislativaPesquisaForm(forms.Form): required=False, queryset=Autor.objects.all().order_by('tipo'), empty_label='Selecione', - ) + ) # relatores são os parlamentares ativos? relator = forms.ModelChoiceField( @@ -1861,14 +1862,14 @@ class MateriaLegislativaPesquisaForm(forms.Form): queryset=Parlamentar.objects.filter( ativo=True).order_by('nome_parlamentar'), empty_label='Selecione', - ) + ) tipo = forms.ModelChoiceField( label='Tipo de Matéria', required=False, queryset=TipoMateriaLegislativa.objects.all(), empty_label='Selecione', - ) + ) data_apresentacao = forms.DateField(label=u'Data de Apresentação', input_formats=['%d/%m/%Y'], @@ -1894,20 +1895,20 @@ class MateriaLegislativaPesquisaForm(forms.Form): required=False, queryset=UnidadeTramitacao.objects.all(), empty_label='Selecione', - ) + ) situacao = forms.ModelChoiceField( label='Situação', required=False, queryset=StatusTramitacao.objects.all(), empty_label='Selecione', - ) + ) tramitacao = forms.ChoiceField(required=False, label='Tramitando', choices=em_tramitacao(), widget=forms.Select( - attrs={'class': 'selector'})) + attrs={'class': 'selector'})) # TODO: Verificar se esses campos estão corretos # assunto? # -> usado 'ementa' em 'assunto' @@ -1979,13 +1980,13 @@ class MateriaLegislativaPesquisaView(FormMixin, GenericView): if request.POST['data_apresentacao']: kwargs['data_apresentacao'] = datetime.strptime( - request.POST['data_apresentacao'], - '%d/%m/%Y').strftime('%Y-%m-%d') + request.POST['data_apresentacao'], + '%d/%m/%Y').strftime('%Y-%m-%d') if request.POST['data_publicacao']: kwargs['data_publicacao'] = datetime.strptime( - request.POST['data_publicacao'], - '%d/%m/%Y').strftime('%Y-%m-%d') + request.POST['data_publicacao'], + '%d/%m/%Y').strftime('%Y-%m-%d') if request.POST['tramitacao']: kwargs['em_tramitacao'] = request.POST['tramitacao'] @@ -2018,3 +2019,11 @@ class PesquisaMateriaListView(FormMixin, ListView): context['page_range'] = sapl.crud.make_pagination( page_obj.number, paginator.num_pages) return context + + +class MateriaTaView(IntegracaoTaView): + model = MateriaLegislativa + + +class ProposicaoTaView(IntegracaoTaView): + model = Proposicao diff --git a/norma/migrations/0009_auto_20160106_1511.py b/norma/migrations/0009_auto_20160106_1511.py new file mode 100644 index 000000000..f7c0766cb --- /dev/null +++ b/norma/migrations/0009_auto_20160106_1511.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0008_normajuridica_texto_integral'), + ] + + operations = [ + migrations.AlterField( + model_name='normajuridica', + name='tipo', + field=models.ForeignKey(verbose_name='Tipo da Norma Juridica', to='norma.TipoNormaJuridica'), + ), + ] diff --git a/norma/models.py b/norma/models.py index 66aefee18..cd2c677c8 100644 --- a/norma/models.py +++ b/norma/models.py @@ -72,7 +72,8 @@ class NormaJuridica(models.Model): null=True, upload_to=texto_upload_path, verbose_name=_('Texto Integral')) - tipo = models.ForeignKey(TipoNormaJuridica, verbose_name=_('Tipo')) + tipo = models.ForeignKey( + TipoNormaJuridica, verbose_name=_('Tipo da Norma Juridica')) materia = models.ForeignKey(MateriaLegislativa, blank=True, null=True) numero = models.PositiveIntegerField(verbose_name=_('Número')) ano = models.PositiveSmallIntegerField(verbose_name=_('Ano')) diff --git a/norma/urls.py b/norma/urls.py index 66ed716cf..862e535ed 100644 --- a/norma/urls.py +++ b/norma/urls.py @@ -1,9 +1,9 @@ from django.conf.urls import include, url -from norma.views import (NormaIncluirView, assunto_norma_crud, +from norma.views import (NormaIncluirView, NormaTaView, 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,6 +11,8 @@ urlpatterns = [ norma_temporario_crud.namespace, norma_temporario_crud.namespace)), + url(r'^norma/(?P[0-9]+)/ta$', + NormaTaView.as_view(), name='norma_ta'), url(r'^sistema/norma/tipo/', include(tipo_norma_crud.urls)), url(r'^sistema/norma/assunto/', include(assunto_norma_crud.urls)), diff --git a/norma/views.py b/norma/views.py index a5e680213..655b8e89a 100644 --- a/norma/views.py +++ b/norma/views.py @@ -10,9 +10,10 @@ from django.utils.html import strip_tags from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ from django.views.generic.edit import FormMixin -from vanilla import GenericView +from vanilla.views import GenericView import sapl +from compilacao.views import IntegracaoTaView from materia.models import MateriaLegislativa, TipoMateriaLegislativa from sapl.crud import build_crud @@ -218,3 +219,7 @@ class NormaIncluirView(FormMixin, GenericView): return self.form_valid(form) else: return self.form_invalid(form) + + +class NormaTaView(IntegracaoTaView): + model = NormaJuridica 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/crud.py b/sapl/crud.py index e99772ead..69f5f5779 100644 --- a/sapl/crud.py +++ b/sapl/crud.py @@ -169,6 +169,14 @@ def build_crud(model, help_path, layout): _('O registro não foi criado.')) cancel_url = BaseMixin.list_url + def form_invalid(self, form): + """ + If the form is invalid, re-render the context data with the + data-filled form and errors. + """ + print(form.errors) + return self.render_to_response(self.get_context_data(form=form)) + def get_success_url(self): return self.detail_url diff --git a/sapl/settings.py b/sapl/settings.py index 3ee00751d..c3971715d 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -59,8 +59,8 @@ INSTALLED_APPS = ( 'crispy_forms_foundation', 'sass_processor', ) -if DEBUG: - INSTALLED_APPS += ('debug_toolbar',) +# if DEBUG: +# INSTALLED_APPS += ('debug_toolbar',) MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', @@ -117,7 +117,7 @@ DATABASES = { # https://docs.djangoproject.com/en/1.8/topics/i18n/ LANGUAGE_CODE = 'pt-br' TIME_ZONE = 'America/Sao_Paulo' -USE_I18N = False +USE_I18N = True USE_L10N = False USE_TZ = True # DATE_FORMAT = 'N j, Y' @@ -160,6 +160,7 @@ BOWER_INSTALLED_APPS = ( 'jquery-ui', 'jquery-runner', 'jQuery-Mask-Plugin', + 'jsdiff', ) # Additional search paths for SASS files when using the @import statement 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/img/ajax-loader.gif b/static/img/ajax-loader.gif deleted file mode 100644 index 812bcf757..000000000 Binary files a/static/img/ajax-loader.gif and /dev/null differ diff --git a/static/js/app.js b/static/js/app.js new file mode 100644 index 000000000..9f265dd7d --- /dev/null +++ b/static/js/app.js @@ -0,0 +1,33 @@ + +tinymce.init({selector:'textarea'}); +$(document).foundation(); + +$(document).ready(function(){ + + + $('.dateinput').fdatepicker({ + // TODO localize + format: 'dd/mm/yyyy', + language: 'pt', + endDate: '31/12/2100', + todayBtn: true + }); + + $('.telefone').mask("(99) 9999-9999", {placeholder:"(__) ____ -____"}); + $('.cpf').mask("000.000.000-00", {placeholder:"___.___.___-__"}); + $('.cep').mask("00000-000", {placeholder:"_____-___"}); + $('.rg').mask("0.000.000", {placeholder:"_.___.___"}); + $('.titulo_eleitor').mask("0000.0000.0000.0000", {placeholder:"____.____.____.____"}); + $('.hora').mask("00:00", {placeholder:"hh:mm"}); + $('.hora_hms').mask("00:00:00", {placeholder:"hh:mm:ss"}); + + var href = location.href.split('?') + $('.masthead .sub-nav a').each(function() { + + if (href.length >= 1) { + if (href[0].endsWith($(this).attr('href'))) + $(this).parent().addClass('active') + } + }); + +}); diff --git a/static/js/compilacao.js b/static/js/compilacao.js index 6cd8fc345..2a76a1acb 100644 --- a/static/js/compilacao.js +++ b/static/js/compilacao.js @@ -35,5 +35,6 @@ function ReadCookie(cookieName) { } function insertWaitAjax(element) { - jQuery(element).append('
'); + //jQuery(element).append('
'); + jQuery(element).append('
'); } diff --git a/static/js/compilacao_edit.js b/static/js/compilacao_edit.js index 1c7cb9226..44ad142ba 100644 --- a/static/js/compilacao_edit.js +++ b/static/js/compilacao_edit.js @@ -131,6 +131,7 @@ var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action, if (flag_actions_vibible == null || flag_actions_vibible) clearEditSelected(); + //$( '#dpt' + pk_refresh+' > .bloco' ).addClass('displaynone' ); $( '#dpt' + pk_refresh ).prepend( data ); } @@ -166,8 +167,8 @@ var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action, if (flag_actions_vibible == null || flag_actions_vibible) { $('#dpt'+pk_edit).addClass('dpt-selected'); $('html, body').animate({ - scrollTop: $('#dpt' + pk_edit ).offset().top - window.innerHeight / 10 - }, 300); + scrollTop: $('#dpt' + pk_edit ).offset().top - window.innerHeight / 9 + }, 0); } } @@ -217,6 +218,8 @@ function refreshScreenFocusPk(data) { } function clearEditSelected() { + $('.bloco' ).removeClass('displaynone' ); + $(".container").removeClass('class_color_container'); tinymce.remove(); $('.dpt-selected').removeClass('dpt-selected'); diff --git a/static/js/compilacao_notas.js b/static/js/compilacao_notas.js index 4c6a09bda..8d1168acd 100644 --- a/static/js/compilacao_notas.js +++ b/static/js/compilacao_notas.js @@ -21,7 +21,7 @@ function onEventsDneExec(pk) { $('#dne'+pk+" select[name='tipo']").change(function(event) { var url = ''; - url = 'compilacao/'+pk+'/nota/create?action=modelo_nota&id_tipo='+this.value; + url = 'text/'+pk+'/nota/create?action=modelo_nota&id_tipo='+this.value; $.get(url).done(function( data ) { $('#dne'+pk+" textarea[name='texto']").val(data); }); @@ -40,9 +40,9 @@ function onEventsDneExec(pk) { onChangeParamNorma(); } var onChangeParamNorma = function(event) { - var tipo_norma = $("select[name='tipo_norma']").val(); - var num_norma = $("input[name='num_norma']").val(); - var ano_norma = $("input[name='ano_norma']").val(); + var tipo_ta = $("select[name='tipo_ta']").val(); + var num_ta = $("input[name='num_ta']").val(); + var ano_ta = $("input[name='ano_ta']").val(); var busca_dispositivo = $("input[name='busca_dispositivo']").val(); var dispositivo_ref = $("#id_dispositivo_ref").val(); $('#id_dispositivo_ref').remove(); @@ -51,18 +51,18 @@ var onChangeParamNorma = function(event) { dispositivo_ref = '' var url = ''; - var pk = $("select[name='tipo_norma']").closest('.dne').attr('pk') + var pk = $("select[name='tipo_ta']").closest('.dne').attr('pk') var formData = { - 'tipo_norma' : tipo_norma, - 'num_norma' : num_norma, - 'ano_norma' : ano_norma, + 'tipo_ta' : tipo_ta, + 'num_ta' : num_ta, + 'ano_ta' : ano_ta, 'busca' : busca_dispositivo, 'tipo_form' : 'radio', 'initial_ref' : dispositivo_ref }; - url = 'compilacao/search'; + url = 'text/search'; $('.container-busca').html(''); insertWaitAjax('.container-busca') $.get(url, formData).done(function( data ) { @@ -85,7 +85,7 @@ var onSubmitEditForm = function(event) { } id_edit = $('#id_pk').val(); - url = 'compilacao/'+id_dispositivo+'/'+model+'/' + url = 'text/'+id_dispositivo+'/'+model+'/' if (id_edit == null || id_edit == '') url += 'create'; else @@ -119,7 +119,7 @@ var onDelete = function(event) { var id_dispositivo = $(event).closest('.dn').attr('pk'); var id_delete = $(event).attr('pk'); - var url = 'compilacao/'+id_dispositivo+'/'+model+'/'+id_delete+'/delete'; + var url = 'text/'+id_dispositivo+'/'+model+'/'+id_delete+'/delete'; $.get( url, function(data) { $('#dne'+id_dispositivo+' .dne-form').closest('.dpt').html(data) @@ -140,12 +140,12 @@ function getForm(_this) { if (_this.className.indexOf('create') >= 0 ) { id_dispositivo = $(_this).attr('pk'); - url = 'compilacao/'+id_dispositivo+'/'+model+'/create'; + url = 'text/'+id_dispositivo+'/'+model+'/create'; } else if (_this.className.indexOf('edit') >= 0 ) { var id_edit = $(_this).attr('pk'); id_dispositivo = $(_this).closest('.dn').attr('pk'); - url = 'compilacao/'+id_dispositivo+'/'+model+'/'+id_edit+'/edit' + url = 'text/'+id_dispositivo+'/'+model+'/'+id_edit+'/edit' } $('#dne'+id_dispositivo).addClass('dne-nota'); diff --git a/static/js/compilacao_view.js b/static/js/compilacao_view.js index d196ef3e4..f64c74e40 100644 --- a/static/js/compilacao_view.js +++ b/static/js/compilacao_view.js @@ -1,40 +1,159 @@ $( window ).scroll(function() { if (window.pageYOffset <= 180) $( "section.vigencias" ).removeClass("fixed"); - else if (!$( "section.vigencias" ).hasClass("fixed")) + else if ( ! $( "section.vigencias" ).hasClass("fixed") ) $( "section.vigencias" ).addClass("fixed"); }); -$(window).load(function() { - setTimeout(function() { - height = $( "section.vigencias" ).height(); - $('html, body').animate({ - scrollTop: window.pageYOffset - height - 55 - }, 300); - }, 100); -}); -function textoMultiVigente(item) { +function isElementInViewport (el) { + + //special bonus for those using jQuery + if (typeof jQuery === "function" && el instanceof jQuery) { + el = el[0]; + } + + var rect = el.getBoundingClientRect(); + + return ( + rect.top >= 0 && + rect.left >= 0 && + rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */ + rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */ + ); +} + +function textoMultiVigente(item, diff) { + var elv = null; + var ldpts = $(".dptt") + for (var i = 0; i < ldpts.length; i++) { + if ($(ldpts[i]).hasClass('displaynone')) + continue; + if (isElementInViewport( ldpts[i])) { + elv = ldpts[i]; + break; + } + } + $(".cp .tipo-vigencias a").removeClass("selected") $(item).addClass("selected") - $(".desativado").removeClass("displaynone"); + $(".dptt.desativado").removeClass("displaynone"); + $(".dtxt").removeClass("displaynone"); + $(".dtxt.diff").remove(); $(".link_alterador").removeClass("displaynone"); + + if (diff) { + $(".dtxt[id^='da'").each(function() { + + if ( $(this).html().search( /<\/\w+>/g ) > 0) + + return; + + var pk = $(this).attr('pk') + var pks = $(this).attr('pks') + + var a = $('#d'+pks).contents().filter(function () { + return this.nodeType === Node.TEXT_NODE; + }); + var b = $('#da'+pk).contents().filter(function () { + return this.nodeType === Node.TEXT_NODE; + }); + + + + + var diff = JsDiff.diffWordsWithSpace($(a).text(), $(b).text()); + + if (diff.length > 0) { + $('#d'+pks).closest('.desativado').addClass("displaynone"); + + + var clone = $('#da'+pk).clone(); + $('#da'+pk).after( clone ); + $('#da'+pk).addClass('displaynone'); + $(clone).addClass('diff').html(''); + + + diff.forEach(function(part){ + var color = part.added ? '#018' : + part.removed ? '#faa' : ''; + + var span = document.createElement('span'); + + var value = part.value; + + if (part.removed) { + $(span).addClass('desativado') + value += ' '; + } + else if (part.added) { + $(span).addClass('added') + } + + span.appendChild(document.createTextNode(value)); + $(clone).append(span); + }); + } + }); + //textoVigente(item, true); + } + + if (elv) { + $('html, body').animate({ + scrollTop: $(elv).parent().offset().top - 60 + }, 0); + } } function textoVigente(item, link) { - $(".cp .tipo-vigencias a").removeClass("selected") - $(item).addClass("selected") - $(".desativado").addClass("displaynone"); - $(".link_alterador").removeClass("displaynone"); - if (!link) - $(".link_alterador").addClass("displaynone"); + var elv = null; + var ldpts = $(".dptt") + for (var i = 0; i < ldpts.length; i++) { + if ($(ldpts[i]).hasClass('displaynone')) + continue; + if (isElementInViewport( ldpts[i])) { + elv = ldpts[i]; + break; + } + } + + $(".cp .tipo-vigencias a").removeClass("selected") + $(item).addClass("selected") + + $(".dptt.desativado").addClass("displaynone"); + $(".link_alterador").removeClass("displaynone"); + if (!link) + $(".link_alterador").addClass("displaynone"); + + if (elv) { + $('html, body').animate({ + scrollTop: $(elv).parent().offset().top - 60 + }, 0); + } } $(document).ready(function() { + setTimeout(function() { + var href = location.href.split('#') + if (href.length == 2) { + $('html, body').animate({ + scrollTop: $('#dptt' + href[1] ).offset().top - window.innerHeight / 9 + }, 0); + } + }, 100); + + $("#btn_font_menos").click(function() { $(".dpt").css("font-size", "-=1"); }); $("#btn_font_mais").click(function() { $(".dpt").css("font-size", "+=1"); }); + + $(".dpt").each(function() { + var nivel = parseInt($(this).attr('nivel')); + + $(this).css('z-index', 20-nivel) + + }); }); diff --git a/static/styles/app.scss b/static/styles/app.scss index 286488098..4368dccc9 100644 --- a/static/styles/app.scss +++ b/static/styles/app.scss @@ -25,8 +25,8 @@ $top-bar-dropdown-radius: $global-radius; } } -// Restyles to foundation top bar menu, in order to behave aesthetically different -/* +// Restyles to foundation top bar menu, in order to behave aesthetically different +/* XXX Is there a better way to implement these styles using best practices without the need to override this much of foundation? Or at least avoid too much nesting and @@ -38,7 +38,7 @@ $top-bar-dropdown-radius: $global-radius; .has-dropdown { // Default values for dropdowns, while also being hidden. .dropdown { - // Border-radius for the first and last dropdown items. We don't style the parent dropdown, as the items overflows it. + // Border-radius for the first and last dropdown items. We don't style the parent dropdown, as the items overflows it. @include radius(rem-calc($top-bar-dropdown-radius)); // Second child here actually targets the first item, since Foundation JS injects a hidden li before it for a mobile back button. > li:nth-child(2), > li:nth-child(2) > a { @@ -50,8 +50,8 @@ $top-bar-dropdown-radius: $global-radius; box-shadow: 0 10px 18px rgba(0, 0, 0, 0.19), 0 2px 6px rgba(0, 0, 0, 0.23); // For the transition effect. - opacity: 0; - // Show the dropdown accurately while it animates. + opacity: 0; + // Show the dropdown accurately while it animates. width: auto; // This will allow the triangle pip to be visible above the dropdown. overflow: visible; @@ -68,14 +68,14 @@ $top-bar-dropdown-radius: $global-radius; position: absolute; top: rem-calc(-12px); left: rem-calc(15px); - } - // This bridges the gap between the top bar and a dropdown. + } + // This bridges the gap between the top bar and a dropdown. &::after { content: ""; position: absolute; z-index: -1; left: 0; - top: rem-calc(-25px); + top: rem-calc(-25px); height: rem-calc(25px); width: 100%; // This transition is for hover-on. @@ -94,7 +94,7 @@ $top-bar-dropdown-radius: $global-radius; pointer-events: auto; // Animating with a beautiful cubic-bezier curve, or Google's "Swift out" easing :) transition: transform 0.3s cubic-bezier(0.55,0,0.1,1), - opacity 0.3s cubic-bezier(0.55,0,0.1,1), + opacity 0.3s cubic-bezier(0.55,0,0.1,1), // Here we make sure the clipping is set before any other transition. clip 0s 0s; // Don't forget to properly animate our bridge, so it keeps only between our gap. @@ -107,6 +107,8 @@ $top-bar-dropdown-radius: $global-radius; } } + + // Our app // - - - - - - - - - - - - - - - - - - - - - - - - - @@ -158,7 +160,7 @@ color: $primary-color; .fadein { -webkit-animation: fadeIn 0.25s ease-in-out; -moz-animation: fadeIn 0.25s ease-in-out; --o-animation: fadeIn 0.25s ease-in-out; +-o-animation: fadeIn 0.25s ease-in-out; } .container { @@ -181,7 +183,7 @@ color: #444444; display: table-row; box-sizing: content-box; } - + /* XXX find a better way to fix main layout box-sizing */ .page__row > .container > *{ box-sizing: border-box; @@ -196,15 +198,19 @@ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 1px 4px rgba(0, 0, 0, 0.23); max-width: 960px; } - .icon-bar { vertical-align: top; } - .masthead > .container { - padding-top: 20px; - border-bottom: 20px solid $primary-color; - background-color: #ffffff; + .masthead .container { + padding: 10px 0; + background-color: #e3e3e3; + } + + .masthead > .container { + padding: 0px; + max-width: none; + border-bottom: 1px solid $primary-color; } .masthead__logo { @@ -218,19 +224,19 @@ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 1px 4px rgba(0, 0, 0, 0.23); .masthead__logo img { width: auto; - height: 95px; + height: 85px; } .masthead__heading { display: inline-block; - margin-left: 15px; - vertical-align: middle; + margin-left: 10px; + vertical-align: top; } .masthead__heading h1 { color: #333333; text-shadow: 1px 1px 3px #dadada; - font-size: 150%; + font-size: 130%; } .masthead__heading h2 { @@ -238,9 +244,51 @@ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 1px 4px rgba(0, 0, 0, 0.23); color: #444444; text-shadow: 1px 1px 3px #dadada; font-weight: normal; - font-size: 100%; + font-size: 90%; } + + .masthead .sub-nav { + display: block; + overflow: hidden; + padding-top: 0.25rem; + width: auto; + position: absolute; + bottom: -1px; + margin: 0; + right: 0; + + + dd { + margin: 0; + border: 1px solid transparent; + border-bottom: 1px solid $primary-color; + border-top: 2px solid transparent; + border-radius: 5px 5px 0px 0px; + + a { + color: #18577A; + background-color: transparent; + display: inline-block; + padding: 2px 6px 0; + position: relative; + font-size: 90%; + &:hover { + color: #444; + background-color: transparent; + } + } + + &:hover, &.active { + background: #fff; + border: 1px solid $primary-color; + border-bottom: 1px solid #fff; + border-top: 2px solid $primary-color; + + } + } + } + .content { position: relative; display: table-cell; @@ -254,10 +302,6 @@ font-size: 100%; height: 100%; background-color: #ffffff; } - - .content a:hover { - color: #444444; - } /* Layout */ .footer { @@ -301,7 +345,7 @@ text-align: center; .footer__block--about { padding-left: 0; - max-width: 195px; + max-width: 195px; } .footer__block--license { diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index f51ab838a..5b3bebf16 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -1,7 +1,8 @@ $color_actions: #16407c; $color_actions_border: #CCC; +$color_buttons: #2980B9; + @mixin background-top-down($top, $bottom) { - background: $top; background-image: -webkit-linear-gradient(top, $top, $bottom); background-image: -moz-linear-gradient(top, $top, $bottom); background-image: -ms-linear-gradient(top, $top, $bottom); @@ -78,7 +79,7 @@ a:link:after, a:visited:after { width: 0px; border-color: transparent transparent #3385CA; position: absolute; - top: -0.75rem; + top: -0.71rem; left: 0.9375rem; } &:hover::before { @@ -150,6 +151,15 @@ a:link:after, a:visited:after { border: 1px dotted #ccc; } } + .diff { + .desativado, .desativado * { + text-decoration: line-through; + color: #dbb !important; + } + .added { + color: #018; + } + } .dpt { font-size:1em; @@ -211,7 +221,6 @@ a:link:after, a:visited:after { font-size: 1.15em; float:left; .dptt { - z-index: 89; position: relative; } } @@ -250,6 +259,9 @@ a:link:after, a:visited:after { &.link_alterador { color: #2980B9; font-size: 0.75em; + &:hover { + text-decoration: underline; + } } &.desativado { @extend .desativado; @@ -371,16 +383,22 @@ a:link:after, a:visited:after { .dptt { .dne { text-decoration: none; - position: relative; + position: absolute; display: block; font-size: 0.8rem; font-weight: normal; line-height: 1rem; text-align: left; height: 0; - transform: scaleY(0); - transform-origin: top; + transform: scaleX(0); + transform-origin: right; transition: all 0.3s ease; + top: 0; + left: -1.6em; + right: -1.6em; + background-color: #2980b9; + z-index: 18; + * { font-size: 0.8rem; font-weight: normal; @@ -396,27 +414,22 @@ a:link:after, a:visited:after { clip: rect(0,0,0,0); opacity: 0; transition: opacity 1.5s linear, clip 1s linear; - transition-delay: 0s; border-collapse:separate; - border-spacing:0.5em; + border-spacing: 0; + top: 0px; + right: 0px; + z-index: 19; li { display: table-cell; + background-color: $color_buttons; a { - background-color: #DDD; - border-radius: 50%; - width: 3rem; - height: 3rem; + font-size: 155%; + padding: 0.4em 0.8em; display: inline-block; - font-size: 203%; - line-height: 3rem; - text-align: center; - &.btn-nota-create { - background: #ddd url(/static/img/hand-note.png) no-repeat 50% 50%; - } - &.btn-vide-create { - } + float: right; + color: #fff !important; &:hover { - background-color: #Cdc ; + background-color: rgba(0, 0, 0, 0.15); } } } @@ -425,12 +438,15 @@ a:link:after, a:visited:after { .dne-nota { box-shadow: -4px 15px 15px rgba(0, 0, 0, 0.1), 0px 6px 6px rgba(0, 0, 0, 0.23); @include background-top-down(#f5f5f5, #eee); - - transform: scaleY(1); + position: relative; + transform: scaleX(1); height: auto; - transition-delay: 0s; + left: 0; + right: 0; margin: 1em 0 2em 0; padding: 0em; + border: 0px; + z-index: 19; ul.btns-action { display: none; } @@ -447,7 +463,7 @@ a:link:after, a:visited:after { } .title_form { font-size: 2.5em; - padding: 0.5em 0.3em 0.2em; + padding: 0.5em 0.3em 0.3em; background: #e5e5e5; color: #777; margin-bottom: 0.4em; @@ -461,6 +477,9 @@ a:link:after, a:visited:after { border: 0px; outline:0px; } + .alert-box { + margin-bottom: 0; + } .row:first-of-type { margin-top: 1em; display: inline-block; @@ -561,7 +580,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; @@ -575,15 +594,14 @@ a:link:after, a:visited:after { } &:hover { .dne { - height: 4.3em; - transform: scaleY(1); + height: 0.1667rem; + transform: scaleX(1); transition-delay: 1s; ul.btns-action { clip: rect(-100px, 2000px, 2000px, -100px); opacity: 1; transition: opacity 0.5s linear, clip 0s 0.3s; - transition-delay: 0.5s; li { a { } @@ -591,9 +609,8 @@ a:link:after, a:visited:after { } } .dne-nota { - transition-delay: 0s; height: auto; - + transition-delay: 0s; } } @@ -632,6 +649,10 @@ a:link:after, a:visited:after { .tipo-vigencias { border-top: 1px solid #62B5B5; + position: fixed; + bottom: 0; + transform: translate(-50%,0); + left: 50%; } .vigencias { @@ -781,6 +802,7 @@ a:link:after, a:visited:after { padding: 2.2em 2.2em 1.6em 2.2em; box-shadow: -4px 15px 15px rgba(0, 0, 0, 0.1), 0px 6px 6px rgba(0, 0, 0, 0.23); + @include background-top-down(#eaeaee, #ddd); @@ -872,7 +894,7 @@ a:link:after, a:visited:after { padding: 0.3em; font-size: 80%; text-align: right; - z-index: 5; + z-index: 15; display: table; li { display: table-cell; @@ -880,7 +902,7 @@ a:link:after, a:visited:after { } .actions_parents { - z-index: 1; + z-index: 11; top: 0em; left: 0em; a { @@ -966,7 +988,7 @@ a:link:after, a:visited:after { .actions_inserts { background: transparent; position: relative; - z-index: 9; + z-index: 19; display: table; width: 100%; @@ -1000,7 +1022,7 @@ a:link:after, a:visited:after { } &::before { - z-index: 10; + z-index: 20; position: absolute; background: url(/static/img/icon_delete_white.png) no-repeat 50% 50%; content:""; @@ -1173,6 +1195,7 @@ a:link:after, a:visited:after { cursor: pointer; opacity: 0.7; transform: rotate(45deg); + z-index: 98; .icon-close{ background: #FFF; @@ -1303,7 +1326,8 @@ a:link:after, a:visited:after { } @media print { - .cp .vigencias { + .cp .vigencias, .toggle-topbar, .menu-icon, .button { display:none; } + } diff --git a/templates/base.html b/templates/base.html index 31f9d7858..9c84d5c98 100644 --- a/templates/base.html +++ b/templates/base.html @@ -88,12 +88,12 @@ --> - +