From 4ac89737b39dad20118270f801b4fdca2225cd35 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 28 Aug 2015 15:28:13 -0300 Subject: [PATCH 01/32] Start compilacao app --- compilacao/__init__.py | 0 compilacao/forms.py | 4 ++++ compilacao/migrations/__init__.py | 0 compilacao/models.py | 4 ++++ compilacao/urls.py | 6 ++++++ compilacao/views.py | 1 + 6 files changed, 15 insertions(+) create mode 100644 compilacao/__init__.py create mode 100644 compilacao/forms.py create mode 100644 compilacao/migrations/__init__.py create mode 100644 compilacao/models.py create mode 100644 compilacao/urls.py create mode 100644 compilacao/views.py diff --git a/compilacao/__init__.py b/compilacao/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/compilacao/forms.py b/compilacao/forms.py new file mode 100644 index 000000000..c4f2ecbbc --- /dev/null +++ b/compilacao/forms.py @@ -0,0 +1,4 @@ +from django import forms + + +# place form definition here \ No newline at end of file diff --git a/compilacao/migrations/__init__.py b/compilacao/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/compilacao/models.py b/compilacao/models.py new file mode 100644 index 000000000..c389f5d7a --- /dev/null +++ b/compilacao/models.py @@ -0,0 +1,4 @@ +from django.db import models + + +# Create your models here. diff --git a/compilacao/urls.py b/compilacao/urls.py new file mode 100644 index 000000000..96ef53f2c --- /dev/null +++ b/compilacao/urls.py @@ -0,0 +1,6 @@ +try: + from django.conf.urls import * +except ImportError: # django < 1.4 + from django.conf.urls.defaults import * + +# place app url patterns here diff --git a/compilacao/views.py b/compilacao/views.py new file mode 100644 index 000000000..60f00ef0e --- /dev/null +++ b/compilacao/views.py @@ -0,0 +1 @@ +# Create your views here. From 4c5fcf7ba8af9424841840ea5b0fee690dbeb8a9 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 28 Aug 2015 15:28:13 -0300 Subject: [PATCH 02/32] Start compilacao app --- compilacao/__init__.py | 0 compilacao/forms.py | 4 ++++ compilacao/migrations/__init__.py | 0 compilacao/models.py | 4 ++++ compilacao/urls.py | 6 ++++++ compilacao/views.py | 1 + 6 files changed, 15 insertions(+) create mode 100644 compilacao/__init__.py create mode 100644 compilacao/forms.py create mode 100644 compilacao/migrations/__init__.py create mode 100644 compilacao/models.py create mode 100644 compilacao/urls.py create mode 100644 compilacao/views.py diff --git a/compilacao/__init__.py b/compilacao/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/compilacao/forms.py b/compilacao/forms.py new file mode 100644 index 000000000..c4f2ecbbc --- /dev/null +++ b/compilacao/forms.py @@ -0,0 +1,4 @@ +from django import forms + + +# place form definition here \ No newline at end of file diff --git a/compilacao/migrations/__init__.py b/compilacao/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/compilacao/models.py b/compilacao/models.py new file mode 100644 index 000000000..c389f5d7a --- /dev/null +++ b/compilacao/models.py @@ -0,0 +1,4 @@ +from django.db import models + + +# Create your models here. diff --git a/compilacao/urls.py b/compilacao/urls.py new file mode 100644 index 000000000..96ef53f2c --- /dev/null +++ b/compilacao/urls.py @@ -0,0 +1,6 @@ +try: + from django.conf.urls import * +except ImportError: # django < 1.4 + from django.conf.urls.defaults import * + +# place app url patterns here diff --git a/compilacao/views.py b/compilacao/views.py new file mode 100644 index 000000000..60f00ef0e --- /dev/null +++ b/compilacao/views.py @@ -0,0 +1 @@ +# Create your views here. From accb25a973125bed4cfb402f22b664d341caf3f7 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Tue, 1 Sep 2015 10:57:42 -0300 Subject: [PATCH 03/32] Class TipoNota inclusion --- compilacao/forms.py | 4 ---- compilacao/models.py | 14 +++++++++++++- compilacao/urls.py | 6 ------ 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/compilacao/forms.py b/compilacao/forms.py index c4f2ecbbc..e69de29bb 100644 --- a/compilacao/forms.py +++ b/compilacao/forms.py @@ -1,4 +0,0 @@ -from django import forms - - -# place form definition here \ No newline at end of file diff --git a/compilacao/models.py b/compilacao/models.py index c389f5d7a..8bbf1ced1 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -1,4 +1,16 @@ from django.db import models +from django.utils.translation import ugettext_lazy as _ -# Create your models here. +class TipoNota(models.Model): + sigla = models.CharField(max_length=10, verbose_name=_('Sigla')) + nome = models.CharField(max_length=50, verbose_name=_('Nome')) + modelo = models.TextField( + blank=True, null=True, verbose_name=_('Modelo')) + + class Meta: + verbose_name = _('Tipo de Nota') + verbose_name_plural = _('Tipos de Nota') + + def __str__(self): + return self.sigla diff --git a/compilacao/urls.py b/compilacao/urls.py index 96ef53f2c..e69de29bb 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -1,6 +0,0 @@ -try: - from django.conf.urls import * -except ImportError: # django < 1.4 - from django.conf.urls.defaults import * - -# place app url patterns here From 138fc0b75189067ebec8a5a14cce2a411f1dac74 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Tue, 1 Sep 2015 17:18:47 -0300 Subject: [PATCH 04/32] Construction compilation model --- compilacao/apps.py | 7 ++++ compilacao/models.py | 87 ++++++++++++++++++++++++++++++++++++++++++++ sapl/settings.py | 1 + sapl/utils.py | 1 + 4 files changed, 96 insertions(+) create mode 100644 compilacao/apps.py diff --git a/compilacao/apps.py b/compilacao/apps.py new file mode 100644 index 000000000..8cab3c8fb --- /dev/null +++ b/compilacao/apps.py @@ -0,0 +1,7 @@ +from django.apps import AppConfig +from django.utils.translation import ugettext_lazy as _ + + +class CompilacaoAppConfig(AppConfig): + name = 'compilacao' + verbose_name = _('Compilação') diff --git a/compilacao/models.py b/compilacao/models.py index 8a1aaae80..d4bb2c6e4 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -1,6 +1,7 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ +from sapl.utils import YES_NO_CHOICES, make_choices class TipoNota(models.Model): @@ -15,3 +16,89 @@ class TipoNota(models.Model): def __str__(self): return self.sigla + + +class TipoVide(models.Model): + sigla = models.CharField(max_length=10, verbose_name=_('Sigla')) + nome = models.CharField(max_length=50, verbose_name=_('Nome')) + + class Meta: + verbose_name = _('Tipo de Vide') + verbose_name_plural = _('Tipos de Vide') + + def __str__(self): + return self.sigla + + +class TipoDispositivo(models.Model): + FORMATO_NUMERACAO = [ + ('1', _('Numérico')), + ('I', _('Romano Maiúsculo')), + ('i', _('Romano Minúsculo')), + ('A', _('Alfabético Maiúsculo')), + ('a', _('Alfabético Minúsculo')), + ('*', _('Tópico sem contagem')), + ('N', _('Sem renderização de Contagem')), + ] + + nome = models.CharField( + max_length=50, unique = True, verbose_name=_('Nome')) + class_css = models.CharField( + max_length=20, verbose_name=_('Classe CSS')) + rotulo_prefixo_html = models.CharField( + max_length=100, verbose_name=_('Prefixo html do rótulo')) + rotulo_prefixo_texto = models.CharField( + max_length=30, + verbose_name=_('Prefixo de construção do rótulo')) + rotulo_ordinal = models.IntegerField( + verbose_name=_('Tipo de Número do Rótulo')) + rotulo_separadores_variacao = models.CharField( + max_length=5, verbose_name=_('Separadores das Variações')) + rotulo_sufixo_texto = models.CharField( + max_length=30, + verbose_name=_('Sufixo de construção do rótulo')) + rotulo_sufixo_html = models.CharField( + max_length=100, verbose_name=_('Sufixo html do rótulo')) + texto_prefixo_html = models.CharField( + max_length=100, verbose_name=_('Prefixo html do texto')) + texto_sufixo_html = models.CharField( + max_length=100, verbose_name=_('Sufixo html do texto')) + nota_automatica_prefixo_html = models.CharField( + max_length=100, verbose_name=_('Prefixo html da Nota Automática')) + nota_automatica_sufixo_html = models.CharField( + max_length=100, verbose_name=_('Sufixo html da Nota Automática')) + contagem_continua = models.BooleanField( + choices=YES_NO_CHOICES, verbose_name=_('Contagem contínua')) + formato_variacao0 = models.CharField( + max_length=1, + choices=FORMATO_NUMERACAO, + verbose_name=_('Formato da Numeração')) + formato_variacao1 = models.CharField( + max_length=1, + choices=FORMATO_NUMERACAO, + verbose_name=_('Formato da Variação 1')) + formato_variacao2 = models.CharField( + max_length=1, + choices=FORMATO_NUMERACAO, + verbose_name=_('Formato da Variação 2')) + formato_variacao3 = models.CharField( + max_length=1, + choices=FORMATO_NUMERACAO, + verbose_name=_('Formato da Variação 3')) + formato_variacao4 = models.CharField( + max_length=1, + choices=FORMATO_NUMERACAO, + verbose_name=_('Formato da Variação 4')) + formato_variacao5 = models.CharField( + max_length=1, + choices=FORMATO_NUMERACAO, + verbose_name=_('Formato da Variação 5')) + + + + class Meta: + verbose_name = _('Tipo de Dispositivo') + verbose_name_plural = _('Tipos de Dispositivo') + + def __str__(self): + return self.sigla \ No newline at end of file diff --git a/sapl/settings.py b/sapl/settings.py index 0857c2161..017f68646 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -43,6 +43,7 @@ INSTALLED_APPS = ( 'base', 'parlamentares', 'comissoes', + 'compilacao', 'sessao', 'materia', 'norma', diff --git a/sapl/utils.py b/sapl/utils.py index 3312fd119..62a96c0e2 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -8,6 +8,7 @@ from django.utils.translation import ugettext_lazy as _ appconfs = [apps.get_app_config(n) for n in [ 'parlamentares', 'comissoes', + 'compilacao', 'materia', 'norma', 'sessao', From 70688ff14169ca9f802306fbc2344e0abc376d59 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Tue, 1 Sep 2015 17:29:00 -0300 Subject: [PATCH 05/32] qa_check execution --- compilacao/forms.py | 4 ---- compilacao/models.py | 46 +++++++++++++++++++++----------------------- compilacao/urls.py | 6 ------ 3 files changed, 22 insertions(+), 34 deletions(-) diff --git a/compilacao/forms.py b/compilacao/forms.py index c4f2ecbbc..e69de29bb 100644 --- a/compilacao/forms.py +++ b/compilacao/forms.py @@ -1,4 +0,0 @@ -from django import forms - - -# place form definition here \ No newline at end of file diff --git a/compilacao/models.py b/compilacao/models.py index d4bb2c6e4..70f28c2c4 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -1,7 +1,7 @@ -from django.db import models - +from django.db import models from django.utils.translation import ugettext_lazy as _ -from sapl.utils import YES_NO_CHOICES, make_choices + +from sapl.utils import YES_NO_CHOICES class TipoNota(models.Model): @@ -16,33 +16,33 @@ class TipoNota(models.Model): def __str__(self): return self.sigla - - + + class TipoVide(models.Model): sigla = models.CharField(max_length=10, verbose_name=_('Sigla')) nome = models.CharField(max_length=50, verbose_name=_('Nome')) - + class Meta: verbose_name = _('Tipo de Vide') verbose_name_plural = _('Tipos de Vide') def __str__(self): return self.sigla - - + + class TipoDispositivo(models.Model): FORMATO_NUMERACAO = [ - ('1', _('Numérico')), - ('I', _('Romano Maiúsculo')), - ('i', _('Romano Minúsculo')), - ('A', _('Alfabético Maiúsculo')), - ('a', _('Alfabético Minúsculo')), - ('*', _('Tópico sem contagem')), - ('N', _('Sem renderização de Contagem')), + ('1', _('Numérico')), + ('I', _('Romano Maiúsculo')), + ('i', _('Romano Minúsculo')), + ('A', _('Alfabético Maiúsculo')), + ('a', _('Alfabético Minúsculo')), + ('*', _('Tópico sem contagem')), + ('N', _('Sem renderização de Contagem')), ] - + nome = models.CharField( - max_length=50, unique = True, verbose_name=_('Nome')) + max_length=50, unique=True, verbose_name=_('Nome')) class_css = models.CharField( max_length=20, verbose_name=_('Classe CSS')) rotulo_prefixo_html = models.CharField( @@ -51,9 +51,9 @@ class TipoDispositivo(models.Model): max_length=30, verbose_name=_('Prefixo de construção do rótulo')) rotulo_ordinal = models.IntegerField( - verbose_name=_('Tipo de Número do Rótulo')) + verbose_name=_('Tipo de Número do Rótulo')) rotulo_separadores_variacao = models.CharField( - max_length=5, verbose_name=_('Separadores das Variações')) + max_length=5, verbose_name=_('Separadores das Variações')) rotulo_sufixo_texto = models.CharField( max_length=30, verbose_name=_('Sufixo de construção do rótulo')) @@ -93,12 +93,10 @@ class TipoDispositivo(models.Model): max_length=1, choices=FORMATO_NUMERACAO, verbose_name=_('Formato da Variação 5')) - - - + class Meta: verbose_name = _('Tipo de Dispositivo') verbose_name_plural = _('Tipos de Dispositivo') - + def __str__(self): - return self.sigla \ No newline at end of file + return self.sigla diff --git a/compilacao/urls.py b/compilacao/urls.py index 96ef53f2c..e69de29bb 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -1,6 +0,0 @@ -try: - from django.conf.urls import * -except ImportError: # django < 1.4 - from django.conf.urls.defaults import * - -# place app url patterns here From bec7236f4c9c76638352dcd42aa5b9befe500f3c Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 28 Aug 2015 15:28:13 -0300 Subject: [PATCH 06/32] Start compilacao app --- compilacao/__init__.py | 0 compilacao/forms.py | 4 ++++ compilacao/migrations/__init__.py | 0 compilacao/models.py | 4 ++++ compilacao/urls.py | 6 ++++++ compilacao/views.py | 1 + 6 files changed, 15 insertions(+) create mode 100644 compilacao/__init__.py create mode 100644 compilacao/forms.py create mode 100644 compilacao/migrations/__init__.py create mode 100644 compilacao/models.py create mode 100644 compilacao/urls.py create mode 100644 compilacao/views.py diff --git a/compilacao/__init__.py b/compilacao/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/compilacao/forms.py b/compilacao/forms.py new file mode 100644 index 000000000..c4f2ecbbc --- /dev/null +++ b/compilacao/forms.py @@ -0,0 +1,4 @@ +from django import forms + + +# place form definition here \ No newline at end of file diff --git a/compilacao/migrations/__init__.py b/compilacao/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/compilacao/models.py b/compilacao/models.py new file mode 100644 index 000000000..c389f5d7a --- /dev/null +++ b/compilacao/models.py @@ -0,0 +1,4 @@ +from django.db import models + + +# Create your models here. diff --git a/compilacao/urls.py b/compilacao/urls.py new file mode 100644 index 000000000..96ef53f2c --- /dev/null +++ b/compilacao/urls.py @@ -0,0 +1,6 @@ +try: + from django.conf.urls import * +except ImportError: # django < 1.4 + from django.conf.urls.defaults import * + +# place app url patterns here diff --git a/compilacao/views.py b/compilacao/views.py new file mode 100644 index 000000000..60f00ef0e --- /dev/null +++ b/compilacao/views.py @@ -0,0 +1 @@ +# Create your views here. From d2665048e21db6719d9a821cc837aa8e35e801d7 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Tue, 1 Sep 2015 10:57:42 -0300 Subject: [PATCH 07/32] Class TipoNota inclusion --- compilacao/forms.py | 4 ---- compilacao/models.py | 14 +++++++++++++- compilacao/urls.py | 6 ------ 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/compilacao/forms.py b/compilacao/forms.py index c4f2ecbbc..e69de29bb 100644 --- a/compilacao/forms.py +++ b/compilacao/forms.py @@ -1,4 +0,0 @@ -from django import forms - - -# place form definition here \ No newline at end of file diff --git a/compilacao/models.py b/compilacao/models.py index c389f5d7a..8bbf1ced1 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -1,4 +1,16 @@ from django.db import models +from django.utils.translation import ugettext_lazy as _ -# Create your models here. +class TipoNota(models.Model): + sigla = models.CharField(max_length=10, verbose_name=_('Sigla')) + nome = models.CharField(max_length=50, verbose_name=_('Nome')) + modelo = models.TextField( + blank=True, null=True, verbose_name=_('Modelo')) + + class Meta: + verbose_name = _('Tipo de Nota') + verbose_name_plural = _('Tipos de Nota') + + def __str__(self): + return self.sigla diff --git a/compilacao/urls.py b/compilacao/urls.py index 96ef53f2c..e69de29bb 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -1,6 +0,0 @@ -try: - from django.conf.urls import * -except ImportError: # django < 1.4 - from django.conf.urls.defaults import * - -# place app url patterns here From c80c9353692e3c66b347fecb9fc7e61b7af862ee Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Tue, 1 Sep 2015 17:18:47 -0300 Subject: [PATCH 08/32] Construction compilation model --- compilacao/apps.py | 7 ++++ compilacao/models.py | 87 ++++++++++++++++++++++++++++++++++++++++++++ sapl/settings.py | 1 + sapl/utils.py | 1 + 4 files changed, 96 insertions(+) create mode 100644 compilacao/apps.py diff --git a/compilacao/apps.py b/compilacao/apps.py new file mode 100644 index 000000000..8cab3c8fb --- /dev/null +++ b/compilacao/apps.py @@ -0,0 +1,7 @@ +from django.apps import AppConfig +from django.utils.translation import ugettext_lazy as _ + + +class CompilacaoAppConfig(AppConfig): + name = 'compilacao' + verbose_name = _('Compilação') diff --git a/compilacao/models.py b/compilacao/models.py index 8bbf1ced1..77df1af10 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -1,5 +1,6 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ +from sapl.utils import YES_NO_CHOICES, make_choices class TipoNota(models.Model): @@ -14,3 +15,89 @@ class TipoNota(models.Model): def __str__(self): return self.sigla + + +class TipoVide(models.Model): + sigla = models.CharField(max_length=10, verbose_name=_('Sigla')) + nome = models.CharField(max_length=50, verbose_name=_('Nome')) + + class Meta: + verbose_name = _('Tipo de Vide') + verbose_name_plural = _('Tipos de Vide') + + def __str__(self): + return self.sigla + + +class TipoDispositivo(models.Model): + FORMATO_NUMERACAO = [ + ('1', _('Numérico')), + ('I', _('Romano Maiúsculo')), + ('i', _('Romano Minúsculo')), + ('A', _('Alfabético Maiúsculo')), + ('a', _('Alfabético Minúsculo')), + ('*', _('Tópico sem contagem')), + ('N', _('Sem renderização de Contagem')), + ] + + nome = models.CharField( + max_length=50, unique = True, verbose_name=_('Nome')) + class_css = models.CharField( + max_length=20, verbose_name=_('Classe CSS')) + rotulo_prefixo_html = models.CharField( + max_length=100, verbose_name=_('Prefixo html do rótulo')) + rotulo_prefixo_texto = models.CharField( + max_length=30, + verbose_name=_('Prefixo de construção do rótulo')) + rotulo_ordinal = models.IntegerField( + verbose_name=_('Tipo de Número do Rótulo')) + rotulo_separadores_variacao = models.CharField( + max_length=5, verbose_name=_('Separadores das Variações')) + rotulo_sufixo_texto = models.CharField( + max_length=30, + verbose_name=_('Sufixo de construção do rótulo')) + rotulo_sufixo_html = models.CharField( + max_length=100, verbose_name=_('Sufixo html do rótulo')) + texto_prefixo_html = models.CharField( + max_length=100, verbose_name=_('Prefixo html do texto')) + texto_sufixo_html = models.CharField( + max_length=100, verbose_name=_('Sufixo html do texto')) + nota_automatica_prefixo_html = models.CharField( + max_length=100, verbose_name=_('Prefixo html da Nota Automática')) + nota_automatica_sufixo_html = models.CharField( + max_length=100, verbose_name=_('Sufixo html da Nota Automática')) + contagem_continua = models.BooleanField( + choices=YES_NO_CHOICES, verbose_name=_('Contagem contínua')) + formato_variacao0 = models.CharField( + max_length=1, + choices=FORMATO_NUMERACAO, + verbose_name=_('Formato da Numeração')) + formato_variacao1 = models.CharField( + max_length=1, + choices=FORMATO_NUMERACAO, + verbose_name=_('Formato da Variação 1')) + formato_variacao2 = models.CharField( + max_length=1, + choices=FORMATO_NUMERACAO, + verbose_name=_('Formato da Variação 2')) + formato_variacao3 = models.CharField( + max_length=1, + choices=FORMATO_NUMERACAO, + verbose_name=_('Formato da Variação 3')) + formato_variacao4 = models.CharField( + max_length=1, + choices=FORMATO_NUMERACAO, + verbose_name=_('Formato da Variação 4')) + formato_variacao5 = models.CharField( + max_length=1, + choices=FORMATO_NUMERACAO, + verbose_name=_('Formato da Variação 5')) + + + + class Meta: + verbose_name = _('Tipo de Dispositivo') + verbose_name_plural = _('Tipos de Dispositivo') + + def __str__(self): + return self.sigla diff --git a/sapl/settings.py b/sapl/settings.py index 0857c2161..017f68646 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -43,6 +43,7 @@ INSTALLED_APPS = ( 'base', 'parlamentares', 'comissoes', + 'compilacao', 'sessao', 'materia', 'norma', diff --git a/sapl/utils.py b/sapl/utils.py index 3312fd119..62a96c0e2 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -8,6 +8,7 @@ from django.utils.translation import ugettext_lazy as _ appconfs = [apps.get_app_config(n) for n in [ 'parlamentares', 'comissoes', + 'compilacao', 'materia', 'norma', 'sessao', From 1bd42158d0f97b1fdf823e67d73223132f8af7dc Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Tue, 1 Sep 2015 17:29:00 -0300 Subject: [PATCH 09/32] qa_check execution --- compilacao/models.py | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/compilacao/models.py b/compilacao/models.py index 77df1af10..70f28c2c4 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -1,6 +1,7 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ -from sapl.utils import YES_NO_CHOICES, make_choices + +from sapl.utils import YES_NO_CHOICES class TipoNota(models.Model): @@ -15,33 +16,33 @@ class TipoNota(models.Model): def __str__(self): return self.sigla - - + + class TipoVide(models.Model): sigla = models.CharField(max_length=10, verbose_name=_('Sigla')) nome = models.CharField(max_length=50, verbose_name=_('Nome')) - + class Meta: verbose_name = _('Tipo de Vide') verbose_name_plural = _('Tipos de Vide') def __str__(self): return self.sigla - - + + class TipoDispositivo(models.Model): FORMATO_NUMERACAO = [ - ('1', _('Numérico')), - ('I', _('Romano Maiúsculo')), - ('i', _('Romano Minúsculo')), - ('A', _('Alfabético Maiúsculo')), - ('a', _('Alfabético Minúsculo')), - ('*', _('Tópico sem contagem')), - ('N', _('Sem renderização de Contagem')), + ('1', _('Numérico')), + ('I', _('Romano Maiúsculo')), + ('i', _('Romano Minúsculo')), + ('A', _('Alfabético Maiúsculo')), + ('a', _('Alfabético Minúsculo')), + ('*', _('Tópico sem contagem')), + ('N', _('Sem renderização de Contagem')), ] - + nome = models.CharField( - max_length=50, unique = True, verbose_name=_('Nome')) + max_length=50, unique=True, verbose_name=_('Nome')) class_css = models.CharField( max_length=20, verbose_name=_('Classe CSS')) rotulo_prefixo_html = models.CharField( @@ -50,9 +51,9 @@ class TipoDispositivo(models.Model): max_length=30, verbose_name=_('Prefixo de construção do rótulo')) rotulo_ordinal = models.IntegerField( - verbose_name=_('Tipo de Número do Rótulo')) + verbose_name=_('Tipo de Número do Rótulo')) rotulo_separadores_variacao = models.CharField( - max_length=5, verbose_name=_('Separadores das Variações')) + max_length=5, verbose_name=_('Separadores das Variações')) rotulo_sufixo_texto = models.CharField( max_length=30, verbose_name=_('Sufixo de construção do rótulo')) @@ -92,12 +93,10 @@ class TipoDispositivo(models.Model): max_length=1, choices=FORMATO_NUMERACAO, verbose_name=_('Formato da Variação 5')) - - - + class Meta: verbose_name = _('Tipo de Dispositivo') verbose_name_plural = _('Tipos de Dispositivo') - + def __str__(self): return self.sigla From bd01d3dc130ce26307c102be7a911a38d3b1307c Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Wed, 2 Sep 2015 17:53:40 -0300 Subject: [PATCH 10/32] =?UTF-8?q?Add=20more=20models=20in=20compila=C3=A7?= =?UTF-8?q?=C3=A3o=20application.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- compilacao/admin.py | 3 + compilacao/models.py | 250 ++++++++++++++++++++++++++++++++++++++----- 2 files changed, 229 insertions(+), 24 deletions(-) create mode 100644 compilacao/admin.py diff --git a/compilacao/admin.py b/compilacao/admin.py new file mode 100644 index 000000000..5c02ebd40 --- /dev/null +++ b/compilacao/admin.py @@ -0,0 +1,3 @@ +from sapl.utils import register_all_models_in_admin + +register_all_models_in_admin(__name__) diff --git a/compilacao/models.py b/compilacao/models.py index 70f28c2c4..6c9f926b5 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -1,25 +1,28 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ +from norma.models import NormaJuridica from sapl.utils import YES_NO_CHOICES class TipoNota(models.Model): - sigla = models.CharField(max_length=10, verbose_name=_('Sigla')) + sigla = models.CharField( + max_length=10, unique=True, verbose_name=_('Sigla')) nome = models.CharField(max_length=50, verbose_name=_('Nome')) modelo = models.TextField( - blank=True, null=True, verbose_name=_('Modelo')) + blank=True, verbose_name=_('Modelo')) class Meta: verbose_name = _('Tipo de Nota') verbose_name_plural = _('Tipos de Nota') def __str__(self): - return self.sigla + return self.sigla + ' - ' + self.nome class TipoVide(models.Model): - sigla = models.CharField(max_length=10, verbose_name=_('Sigla')) + sigla = models.CharField( + max_length=10, unique=True, verbose_name=_('Sigla')) nome = models.CharField(max_length=50, verbose_name=_('Nome')) class Meta: @@ -27,19 +30,26 @@ class TipoVide(models.Model): verbose_name_plural = _('Tipos de Vide') def __str__(self): - return self.sigla + return self.sigla + ' - ' + self.nome class TipoDispositivo(models.Model): - FORMATO_NUMERACAO = [ - ('1', _('Numérico')), - ('I', _('Romano Maiúsculo')), - ('i', _('Romano Minúsculo')), - ('A', _('Alfabético Maiúsculo')), - ('a', _('Alfabético Minúsculo')), - ('*', _('Tópico sem contagem')), - ('N', _('Sem renderização de Contagem')), - ] + FNC1 = '1' + FNCI = 'I' + FNCi = 'i' + FNCA = 'A' + FNCa = 'a' + FNC8 = '*' + FNCN = 'N' + FORMATO_NUMERACAO_CHOICES = ( + (FNC1, _('Numérico')), + (FNCI, _('Romano Maiúsculo')), + (FNCi, _('Romano Minúsculo')), + (FNCA, _('Alfabético Maiúsculo')), + (FNCa, _('Alfabético Minúsculo')), + (FNC8, _('Tópico sem contagem')), + (FNCN, _('Sem renderização de Contagem')), + ) nome = models.CharField( max_length=50, unique=True, verbose_name=_('Nome')) @@ -51,7 +61,7 @@ class TipoDispositivo(models.Model): max_length=30, verbose_name=_('Prefixo de construção do rótulo')) rotulo_ordinal = models.IntegerField( - verbose_name=_('Tipo de Número do Rótulo')) + verbose_name=_('Tipo de número do rótulo')) rotulo_separadores_variacao = models.CharField( max_length=5, verbose_name=_('Separadores das Variações')) rotulo_sufixo_texto = models.CharField( @@ -64,34 +74,40 @@ class TipoDispositivo(models.Model): texto_sufixo_html = models.CharField( max_length=100, verbose_name=_('Sufixo html do texto')) nota_automatica_prefixo_html = models.CharField( - max_length=100, verbose_name=_('Prefixo html da Nota Automática')) + max_length=100, verbose_name=_('Prefixo html da nota automática')) nota_automatica_sufixo_html = models.CharField( - max_length=100, verbose_name=_('Sufixo html da Nota Automática')) + max_length=100, verbose_name=_('Sufixo html da nota automática')) contagem_continua = models.BooleanField( choices=YES_NO_CHOICES, verbose_name=_('Contagem contínua')) formato_variacao0 = models.CharField( max_length=1, - choices=FORMATO_NUMERACAO, + choices=FORMATO_NUMERACAO_CHOICES, + default=FNC1, verbose_name=_('Formato da Numeração')) formato_variacao1 = models.CharField( max_length=1, - choices=FORMATO_NUMERACAO, + choices=FORMATO_NUMERACAO_CHOICES, + default=FNC1, verbose_name=_('Formato da Variação 1')) formato_variacao2 = models.CharField( max_length=1, - choices=FORMATO_NUMERACAO, + choices=FORMATO_NUMERACAO_CHOICES, + default=FNC1, verbose_name=_('Formato da Variação 2')) formato_variacao3 = models.CharField( max_length=1, - choices=FORMATO_NUMERACAO, + choices=FORMATO_NUMERACAO_CHOICES, + default=FNC1, verbose_name=_('Formato da Variação 3')) formato_variacao4 = models.CharField( max_length=1, - choices=FORMATO_NUMERACAO, + choices=FORMATO_NUMERACAO_CHOICES, + default=FNC1, verbose_name=_('Formato da Variação 4')) formato_variacao5 = models.CharField( max_length=1, - choices=FORMATO_NUMERACAO, + choices=FORMATO_NUMERACAO_CHOICES, + default=FNC1, verbose_name=_('Formato da Variação 5')) class Meta: @@ -99,4 +115,190 @@ class TipoDispositivo(models.Model): verbose_name_plural = _('Tipos de Dispositivo') def __str__(self): - return self.sigla + return self.nome + + +class TipoPublicacao(models.Model): + sigla = models.CharField( + max_length=10, unique=True, verbose_name=_('Sigla')) + nome = models.CharField(max_length=50, verbose_name=_('Nome')) + + class Meta: + verbose_name = _('Tipo de Publicação') + verbose_name_plural = _('Tipos de Publicação') + + def __str__(self): + return self.sigla + ' - ' + self.nome + + +class VeiculoPublicacao(models.Model): + sigla = models.CharField( + max_length=10, unique=True, verbose_name=_('Sigla')) + nome = models.CharField(max_length=60, verbose_name=_('Nome')) + + class Meta: + verbose_name = _('Veículo de Publicação') + verbose_name_plural = _('Veículos de Publicação') + + def __str__(self): + return self.sigla + ' - ' + self.nome + + +class Publicacao(models.Model): + norma = models.ForeignKey( + NormaJuridica, verbose_name=_('Norma Jurídica')) + 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')) + pagina_inicio = models.PositiveIntegerField( + blank=True, null=True, verbose_name=_('Pg. Início')) + pagina_fim = models.PositiveIntegerField( + blank=True, null=True, verbose_name=_('Pg. Fim')) + timestamp = models.DateTimeField() + + class Meta: + verbose_name = _('Publicação') + verbose_name_plural = _('Publicações') + + def __str__(self): + return self.veiculo_publicacao.nome + ": "+str(self.publicacao) + + +class Dispositivo(models.Model): + ordem = models.PositiveIntegerField( + default=0, + verbose_name=_('Ordem de Renderização')) + ordem_bloco_atualizador = models.PositiveIntegerField( + default=0, + verbose_name=_('Ordem de Renderização no Bloco Atualizador')) + nivel = models.PositiveIntegerField( + default=0, + blank=True, + null=True, + verbose_name=_('Nível Estrutural')) + + dispositivo0 = models.PositiveIntegerField( + default=0, + verbose_name=_('Número do Dispositivo')) + dispositivo1 = models.PositiveIntegerField( + default=0, + blank=True, + null=True, + verbose_name=_('Primeiro Nível de Variação')) + dispositivo2 = models.PositiveIntegerField( + default=0, + blank=True, + null=True, + verbose_name=_('Segundo Nível de Variação')) + dispositivo3 = models.PositiveIntegerField( + default=0, + blank=True, + null=True, + verbose_name=_('Terceiro Nível de Variação')) + dispositivo4 = models.PositiveIntegerField( + default=0, + blank=True, + null=True, + verbose_name=_('Quarto Nível de Variação')) + dispositivo5 = models.PositiveIntegerField( + default=0, + blank=True, + null=True, + verbose_name=_('Quinto Nível de Variação')) + + rotulo = models.CharField( + max_length=50, + blank=True, + default='', + verbose_name=_('Rótulo')) + texto = models.TextField( + blank=True, + default='', + verbose_name=_('Texto')) + texto_atualizador = models.TextField( + blank=True, + default='', + verbose_name=_('Texto no Dispositivo Atualizador')) + + inicio_vigencia = models.DateField( + verbose_name=_('Início de Vigência')) + fim_vigencia = models.DateField( + blank=True, null=True, verbose_name=_('Fim de Vigência')) + + inicio_eficacia = models.DateField( + verbose_name=_('Início de Eficácia')) + fim_eficacia = models.DateField( + blank=True, null=True, verbose_name=_('Fim de Eficácia')) + + inconstitucionalidade = models.BooleanField( + default=False, + choices=YES_NO_CHOICES, + verbose_name=_('Inconstitucionalidade')) + visibilidade = models.BooleanField( + default=False, + choices=YES_NO_CHOICES, + verbose_name=_('Visibilidade na Norma Publicada')) + + timestamp = models.DateTimeField() + + tipo_dispositivo = models.ForeignKey( + TipoDispositivo, + verbose_name=_('Tipo do Dispositivo')) + + publicacao = models.ForeignKey( + Publicacao, + blank=True, null=True, default=None, verbose_name=_('Publicação')) + + norma = models.ForeignKey( + NormaJuridica, + verbose_name=_('Norma Jurídica')) + norma_publicada = models.ForeignKey( + NormaJuridica, + blank=True, null=True, default=None, + related_name='%(class)s_norma_publicada', + verbose_name=_('Norma Jurídica Publicada')) + + dispositivo_subsequente = models.ForeignKey( + 'self', + blank=True, null=True, default=None, + related_name='%(class)s_dispositivo_subsequente', + verbose_name=_('Dispositivo Subsequente')) + dispositivo_substituido = models.ForeignKey( + 'self', + blank=True, null=True, default=None, + related_name='%(class)s_dispositivo_substituido', + verbose_name=_('Dispositivo Substituido')) + dispositivo_pai = models.ForeignKey( + 'self', + blank=True, null=True, default=None, + related_name='%(class)s_dispositivo_pai', + verbose_name=_('Dispositivo Pai')) + dispositivo_vigencia = models.ForeignKey( + 'self', + blank=True, null=True, default=None, + related_name='%(class)s_dispositivo_vigencia', + verbose_name=_('Dispositivo de Vigência')) + dispositivo_atualizador = models.ForeignKey( + 'self', + blank=True, null=True, default=None, + related_name='%(class)s_dispositivo_atualizador', + verbose_name=_('Dispositivo Atualizador')) + + class Meta: + verbose_name = _('Dispositivo') + verbose_name_plural = _('Dispositivos') + unique_together = ( + ('norma', 'ordem', ), + ('norma', + 'dispositivo0', + 'dispositivo1', + 'dispositivo2', + 'dispositivo3', + 'dispositivo4', + 'dispositivo5', + 'tipo_dispositivo', + 'dispositivo_pai', + 'publicacao', ), + ) From 8e969e37eef4415a42140d1be1aa162b06d7f95f Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 4 Sep 2015 19:07:50 -0300 Subject: [PATCH 11/32] =?UTF-8?q?First=20version=20of=20Compila=C3=A7?= =?UTF-8?q?=C3=A3o=20application=20model?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- compilacao/models.py | 84 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 71 insertions(+), 13 deletions(-) diff --git a/compilacao/models.py b/compilacao/models.py index 6c9f926b5..d9a98cf87 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -1,3 +1,4 @@ +from django.contrib.auth.models import User from django.db import models from django.utils.translation import ugettext_lazy as _ @@ -163,7 +164,7 @@ class Publicacao(models.Model): verbose_name_plural = _('Publicações') def __str__(self): - return self.veiculo_publicacao.nome + ": "+str(self.publicacao) + return self.veiculo_publicacao.nome + ": " + str(self.publicacao) class Dispositivo(models.Model): @@ -290,15 +291,72 @@ class Dispositivo(models.Model): verbose_name = _('Dispositivo') verbose_name_plural = _('Dispositivos') unique_together = ( - ('norma', 'ordem', ), - ('norma', - 'dispositivo0', - 'dispositivo1', - 'dispositivo2', - 'dispositivo3', - 'dispositivo4', - 'dispositivo5', - 'tipo_dispositivo', - 'dispositivo_pai', - 'publicacao', ), - ) + ('norma', 'ordem',), + ('norma', + 'dispositivo0', + 'dispositivo1', + 'dispositivo2', + 'dispositivo3', + 'dispositivo4', + 'dispositivo5', + 'tipo_dispositivo', + 'dispositivo_pai', + 'publicacao',), + ) + + +class Vide(models.Model): + data_criacao = models.DateTimeField(verbose_name=_('Data de Criação')) + texto = models.TextField(verbose_name=_('Texto do Vide')) + + tipo = models.ForeignKey(TipoVide, verbose_name=_('Tipo do Vide')) + + dispositivo_base = models.ForeignKey( + Dispositivo, + verbose_name=_('Dispositivo Base'), + related_name='%(class)s_dispositivo_base') + dispositivo_ref = models.ForeignKey( + Dispositivo, + related_name='%(class)s_dispositivo_ref', + verbose_name=_('Dispositivo Referido')) + + class Meta: + verbose_name = _('Vide') + verbose_name_plural = _('Vides') + + +class Nota(models.Model): + NPRIV = 1 + NSTRL = 2 + NINST = 3 + NPUBL = 4 + PUBLICIDADE_CHOICES = ( + # Apenas o dono da nota tem visibilidade. + (NPRIV, _('Nota Privada')), + # Todos do mesmo grupo tem visibilidade. + (NSTRL, _('Nota Setorial')), + # Todo usuário autênticado tem visibilidade + (NINST, _('Nota Institucional')), + # Todo usuário tem visibilidade + (NPUBL, _('Nota Pública')), + ) + + texto = models.TextField(verbose_name=_('Texto da Nota')) + url_externa = models.CharField( + max_length=1024, + blank=True, + verbose_name=_('Url externa')) + + data_criacao = models.DateTimeField(verbose_name=_('Data de Criação')) + publicacao = models.DateTimeField(verbose_name=_('Data de Publicação')) + efetifidade = models.DateTimeField(verbose_name=_('Data de Efeito')) + + tipo = models.ForeignKey(TipoNota, verbose_name=_('Tipo da Nota')) + dispositivo = models.ForeignKey( + Dispositivo, + verbose_name=_('Dispositivo da Nota')) + + owner = models.ForeignKey(User, verbose_name=_('Dono da Nota')) + publicidade = models.PositiveSmallIntegerField( + choice=PUBLICIDADE_CHOICES, + verbose_name=_('Nível de Publicidade')) From 0b7c679c620a74030f7372e7d28c68642433d46c Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Sun, 6 Sep 2015 02:46:06 -0300 Subject: [PATCH 12/32] alter models compilacao and norma --- compilacao/insert_inicial_TipoDispositivo.sql | 45 ++++ compilacao/migrations/0001_initial.py | 207 ++++++++++++++++++ compilacao/models.py | 75 +++++-- norma/migrations/0003_auto_20150906_0239.py | 35 +++ norma/models.py | 9 +- 5 files changed, 350 insertions(+), 21 deletions(-) create mode 100644 compilacao/insert_inicial_TipoDispositivo.sql create mode 100644 compilacao/migrations/0001_initial.py create mode 100644 norma/migrations/0003_auto_20150906_0239.py diff --git a/compilacao/insert_inicial_TipoDispositivo.sql b/compilacao/insert_inicial_TipoDispositivo.sql new file mode 100644 index 000000000..d3444ffa6 --- /dev/null +++ b/compilacao/insert_inicial_TipoDispositivo.sql @@ -0,0 +1,45 @@ + +INSERT INTO compilacao_tipodispositivo + (id, + nome, + class_css, + rotulo_prefixo_html, + rotulo_prefixo_texto, + rotulo_ordinal, + rotulo_separadores_variacao, + rotulo_sufixo_texto, + rotulo_sufixo_html, + texto_prefixo_html, + texto_sufixo_html, + nota_automatica_prefixo_html, + nota_automatica_sufixo_html, + contagem_continua, + formato_variacao0, + formato_variacao1, + formato_variacao2, + formato_variacao3, + formato_variacao4, + formato_variacao5) VALUES +(11, 'Anexo', 'anexo', '', 'Anexo', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'), +(12, 'Parte', 'parte', '', 'Parte', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'), +(13, 'Livro', 'livro', '', 'Livro', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'), +(15, 'Capítulo', 'capitulo', '', 'Capítulo', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'), +(16, 'Seção', 'secao', '', 'Seção', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'), +(17, 'SubSeção', 'subsecao', '', 'SubSeção', 0, '-----', '', '
', '', '
', '', '', False, '1', '1', '1', '1', '1', '1'), +(18, 'Item de Seção', 'itemsecao', '', 'Item', 0, '-----', '', '
', '', '
', '', '', False, '1', '1', '1', '1', '1', '1'), +(19, 'Artigo', 'artigo', '', 'Art.', 9, '-----', '', ' – ', '', '', '', '', True, '1', '1', '1', '1', '1', '1'), +(21, 'Parágrafo', 'paragrafo', '', '§;Parágrafo Único', 9, '-----', '', ' – ', '', '', '', '', False, '1', '1', '1', '1', '1', '1'), +(22, 'Inciso', 'inciso', '', '', 0, '.....', '', ' – ', '', '', '', '', False, 'I', '1', '1', '1', '1', '1'), +(23, 'Alinea', 'alinea', '', '', 0, '.....', '', ' – ', '', '', '', '', False, 'a', '1', '1', '1', '1', '1'), +(24, 'Item', 'item', '', '', 0, '.....', '', ' – ', '', '', '', '', False, '1', '1', '1', '1', '1', '1'), +(25, 'Disposições Preliminares', 'disp_preliminares', '', 'Disposições Preliminares', 0, '-----', '', '
', '', '
', '', '', False, 'N', '1', '1', '1', '1', '1'), +(26, 'Disposições Gerais', 'disp_gerais', '', 'Disposições Gerais', 0, '-----', '', '
', '', '
', '', '', False, 'N', '1', '1', '1', '1', '1'), +(27, 'Disposições Transitórias', 'disp_transitorias', '', 'Disposições Transitórias', 0, '-----', '', '
', '', '
', '', '', False, 'N', '1', '1', '1', '1', '1'), +(28, 'Disposições Finais', 'disp_finais', '', 'Disposições Finais', 0, '-----', '', '
', '', '
', '', '', False, 'N', '1', '1', '1', '1', '1'), +(14, 'Título', 'titulo', '', 'Título', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'), +(1, 'Articulação', 'articulacao', '', '', 0, '.....', '', '', '', '', '', '', True, '1', '1', '1', '1', '1', '1'), +(4, 'Bloco Alteração', 'bloco_alteracao', '', '', 0, '.....', '', '', '', '', '', '', True, '1', '1', '1', '1', '1', '1'), +(5, 'Omissis', 'omissis', '', '', 0, '.....', '', '', '', '', '', '', False, '1', '1', '1', '1', '1', '1'), +(6, 'Texto Não Estruturado', 'texto_n_estruturado', '', '', 0, '.....', '', '', '', '', '', '',False, '1', '1', '1', '1', '1', '1'), +(2, 'Ementa', 'ementa', '', '', 0, '.....', '', '', '', '', '', '', False, 'N', '1', '1', '1', '1', '1'), +(20, 'Caput', 'caput', '', '', 0, '', '', '', '', '', '', '', False, 'N', 'N', 'N', 'N', 'N', 'N'); diff --git a/compilacao/migrations/0001_initial.py b/compilacao/migrations/0001_initial.py new file mode 100644 index 000000000..d8e06c220 --- /dev/null +++ b/compilacao/migrations/0001_initial.py @@ -0,0 +1,207 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('norma', '0003_auto_20150906_0239'), + ] + + operations = [ + migrations.CreateModel( + name='Dispositivo', + fields=[ + ('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)), + ('ordem', models.PositiveIntegerField(verbose_name='Ordem de Renderização', default=0)), + ('ordem_bloco_atualizador', models.PositiveIntegerField(verbose_name='Ordem de Renderização no Bloco Atualizador', default=0)), + ('nivel', models.PositiveIntegerField(blank=True, null=True, verbose_name='Nível Estrutural', default=0)), + ('dispositivo0', models.PositiveIntegerField(verbose_name='Número do Dispositivo', default=0)), + ('dispositivo1', models.PositiveIntegerField(blank=True, null=True, verbose_name='Primeiro Nível de Variação', default=0)), + ('dispositivo2', models.PositiveIntegerField(blank=True, null=True, verbose_name='Segundo Nível de Variação', default=0)), + ('dispositivo3', models.PositiveIntegerField(blank=True, null=True, verbose_name='Terceiro Nível de Variação', default=0)), + ('dispositivo4', models.PositiveIntegerField(blank=True, null=True, verbose_name='Quarto Nível de Variação', default=0)), + ('dispositivo5', models.PositiveIntegerField(blank=True, null=True, verbose_name='Quinto Nível de Variação', default=0)), + ('rotulo', models.CharField(blank=True, max_length=50, verbose_name='Rótulo', default='')), + ('texto', models.TextField(blank=True, verbose_name='Texto', default='')), + ('texto_atualizador', models.TextField(blank=True, verbose_name='Texto no Dispositivo Atualizador', default='')), + ('inicio_vigencia', models.DateField(verbose_name='Início de Vigência')), + ('fim_vigencia', models.DateField(blank=True, null=True, verbose_name='Fim de Vigência')), + ('inicio_eficacia', models.DateField(verbose_name='Início de Eficácia')), + ('fim_eficacia', models.DateField(blank=True, null=True, verbose_name='Fim de Eficácia')), + ('inconstitucionalidade', models.BooleanField(verbose_name='Inconstitucionalidade', default=False, choices=[(True, 'Sim'), (False, 'Não')])), + ('visibilidade', models.BooleanField(verbose_name='Visibilidade na Norma Publicada', default=False, choices=[(True, 'Sim'), (False, 'Não')])), + ('timestamp', models.DateTimeField()), + ('dispositivo_atualizador', models.ForeignKey(blank=True, null=True, to='compilacao.Dispositivo', verbose_name='Dispositivo Atualizador', default=None, related_name='dispositivo_dispositivo_atualizador')), + ('dispositivo_pai', models.ForeignKey(blank=True, null=True, to='compilacao.Dispositivo', verbose_name='Dispositivo Pai', default=None, related_name='dispositivo_dispositivo_pai')), + ('dispositivo_subsequente', models.ForeignKey(blank=True, null=True, to='compilacao.Dispositivo', verbose_name='Dispositivo Subsequente', default=None, related_name='dispositivo_dispositivo_subsequente')), + ('dispositivo_substituido', models.ForeignKey(blank=True, null=True, to='compilacao.Dispositivo', verbose_name='Dispositivo Substituido', default=None, related_name='dispositivo_dispositivo_substituido')), + ('dispositivo_vigencia', models.ForeignKey(blank=True, null=True, to='compilacao.Dispositivo', verbose_name='Dispositivo de Vigência', default=None, related_name='dispositivo_dispositivo_vigencia')), + ('norma', models.ForeignKey(to='norma.NormaJuridica', verbose_name='Norma Jurídica')), + ('norma_publicada', models.ForeignKey(blank=True, null=True, to='norma.NormaJuridica', verbose_name='Norma Jurídica Publicada', default=None, related_name='dispositivo_norma_publicada')), + ], + options={ + 'verbose_name': 'Dispositivo', + 'verbose_name_plural': 'Dispositivos', + }, + ), + migrations.CreateModel( + name='Nota', + fields=[ + ('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)), + ('texto', models.TextField(verbose_name='Texto da Nota')), + ('url_externa', models.CharField(blank=True, max_length=1024, verbose_name='Url externa')), + ('data_criacao', models.DateTimeField(verbose_name='Data de Criação')), + ('publicacao', models.DateTimeField(verbose_name='Data de Publicação')), + ('efetifidade', models.DateTimeField(verbose_name='Data de Efeito')), + ('publicidade', models.PositiveSmallIntegerField(verbose_name='Nível de Publicidade', choices=[(1, 'Nota Privada'), (2, 'Nota Setorial'), (3, 'Nota Institucional'), (4, 'Nota Pública')])), + ('dispositivo', models.ForeignKey(to='compilacao.Dispositivo', verbose_name='Dispositivo da Nota')), + ('owner', models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='Dono da Nota')), + ], + options={ + 'verbose_name': 'Nota', + 'verbose_name_plural': 'Notas', + }, + ), + migrations.CreateModel( + name='Publicacao', + fields=[ + ('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)), + ('publicacao', models.DateTimeField(verbose_name='Data de Publicação')), + ('pagina_inicio', models.PositiveIntegerField(blank=True, null=True, verbose_name='Pg. Início')), + ('pagina_fim', models.PositiveIntegerField(blank=True, null=True, verbose_name='Pg. Fim')), + ('timestamp', models.DateTimeField()), + ('norma', models.ForeignKey(to='norma.NormaJuridica', verbose_name='Norma Jurídica')), + ], + options={ + 'verbose_name': 'Publicação', + 'verbose_name_plural': 'Publicações', + }, + ), + migrations.CreateModel( + name='TipoDispositivo', + fields=[ + ('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)), + ('nome', models.CharField(max_length=50, verbose_name='Nome', unique=True)), + ('class_css', models.CharField(max_length=20, verbose_name='Classe CSS')), + ('rotulo_prefixo_html', models.CharField(blank=True, max_length=100, verbose_name='Prefixo html do rótulo')), + ('rotulo_prefixo_texto', models.CharField(blank=True, max_length=30, verbose_name='Prefixo de construção do rótulo')), + ('rotulo_ordinal', models.IntegerField(verbose_name='Tipo de número do rótulo')), + ('rotulo_separadores_variacao', models.CharField(blank=True, max_length=5, verbose_name='Separadores das Variações')), + ('rotulo_sufixo_texto', models.CharField(blank=True, max_length=30, verbose_name='Sufixo de construção do rótulo')), + ('rotulo_sufixo_html', models.CharField(blank=True, max_length=100, verbose_name='Sufixo html do rótulo')), + ('texto_prefixo_html', models.CharField(blank=True, max_length=100, verbose_name='Prefixo html do texto')), + ('texto_sufixo_html', models.CharField(blank=True, max_length=100, verbose_name='Sufixo html do texto')), + ('nota_automatica_prefixo_html', models.CharField(blank=True, max_length=100, verbose_name='Prefixo html da nota automática')), + ('nota_automatica_sufixo_html', models.CharField(blank=True, max_length=100, verbose_name='Sufixo html da nota automática')), + ('contagem_continua', models.BooleanField(verbose_name='Contagem contínua', choices=[(True, 'Sim'), (False, 'Não')])), + ('formato_variacao0', models.CharField(max_length=1, verbose_name='Formato da Numeração', default='1', choices=[('1', '(1) Numérico'), ('I', '(I) Romano Maiúsculo'), ('i', '(i) Romano Minúsculo'), ('A', '(A) Alfabético Maiúsculo'), ('a', '(a) Alfabético Minúsculo'), ('*', 'Tópico - Sem contagem'), ('N', 'Sem renderização')])), + ('formato_variacao1', models.CharField(max_length=1, verbose_name='Formato da Variação 1', default='1', choices=[('1', '(1) Numérico'), ('I', '(I) Romano Maiúsculo'), ('i', '(i) Romano Minúsculo'), ('A', '(A) Alfabético Maiúsculo'), ('a', '(a) Alfabético Minúsculo'), ('*', 'Tópico - Sem contagem'), ('N', 'Sem renderização')])), + ('formato_variacao2', models.CharField(max_length=1, verbose_name='Formato da Variação 2', default='1', choices=[('1', '(1) Numérico'), ('I', '(I) Romano Maiúsculo'), ('i', '(i) Romano Minúsculo'), ('A', '(A) Alfabético Maiúsculo'), ('a', '(a) Alfabético Minúsculo'), ('*', 'Tópico - Sem contagem'), ('N', 'Sem renderização')])), + ('formato_variacao3', models.CharField(max_length=1, verbose_name='Formato da Variação 3', default='1', choices=[('1', '(1) Numérico'), ('I', '(I) Romano Maiúsculo'), ('i', '(i) Romano Minúsculo'), ('A', '(A) Alfabético Maiúsculo'), ('a', '(a) Alfabético Minúsculo'), ('*', 'Tópico - Sem contagem'), ('N', 'Sem renderização')])), + ('formato_variacao4', models.CharField(max_length=1, verbose_name='Formato da Variação 4', default='1', choices=[('1', '(1) Numérico'), ('I', '(I) Romano Maiúsculo'), ('i', '(i) Romano Minúsculo'), ('A', '(A) Alfabético Maiúsculo'), ('a', '(a) Alfabético Minúsculo'), ('*', 'Tópico - Sem contagem'), ('N', 'Sem renderização')])), + ('formato_variacao5', models.CharField(max_length=1, verbose_name='Formato da Variação 5', default='1', choices=[('1', '(1) Numérico'), ('I', '(I) Romano Maiúsculo'), ('i', '(i) Romano Minúsculo'), ('A', '(A) Alfabético Maiúsculo'), ('a', '(a) Alfabético Minúsculo'), ('*', 'Tópico - Sem contagem'), ('N', 'Sem renderização')])), + ], + options={ + 'verbose_name': 'Tipo de Dispositivo', + 'verbose_name_plural': 'Tipos de Dispositivo', + }, + ), + migrations.CreateModel( + name='TipoNota', + fields=[ + ('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)), + ('sigla', models.CharField(max_length=10, verbose_name='Sigla', unique=True)), + ('nome', models.CharField(max_length=50, verbose_name='Nome')), + ('modelo', models.TextField(blank=True, verbose_name='Modelo')), + ], + options={ + 'verbose_name': 'Tipo de Nota', + 'verbose_name_plural': 'Tipos de Nota', + }, + ), + migrations.CreateModel( + name='TipoPublicacao', + fields=[ + ('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)), + ('sigla', models.CharField(max_length=10, verbose_name='Sigla', unique=True)), + ('nome', models.CharField(max_length=50, verbose_name='Nome')), + ], + options={ + 'verbose_name': 'Tipo de Publicação', + 'verbose_name_plural': 'Tipos de Publicação', + }, + ), + migrations.CreateModel( + name='TipoVide', + fields=[ + ('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)), + ('sigla', models.CharField(max_length=10, verbose_name='Sigla', unique=True)), + ('nome', models.CharField(max_length=50, verbose_name='Nome')), + ], + options={ + 'verbose_name': 'Tipo de Vide', + 'verbose_name_plural': 'Tipos de Vide', + }, + ), + migrations.CreateModel( + name='VeiculoPublicacao', + fields=[ + ('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)), + ('sigla', models.CharField(max_length=10, verbose_name='Sigla', unique=True)), + ('nome', models.CharField(max_length=60, verbose_name='Nome')), + ], + options={ + 'verbose_name': 'Veículo de Publicação', + 'verbose_name_plural': 'Veículos de Publicação', + }, + ), + migrations.CreateModel( + name='Vide', + fields=[ + ('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)), + ('data_criacao', models.DateTimeField(verbose_name='Data de Criação')), + ('texto', models.TextField(verbose_name='Texto do Vide')), + ('dispositivo_base', models.ForeignKey(to='compilacao.Dispositivo', verbose_name='Dispositivo Base', related_name='vide_dispositivo_base')), + ('dispositivo_ref', models.ForeignKey(to='compilacao.Dispositivo', verbose_name='Dispositivo Referido', related_name='vide_dispositivo_ref')), + ('tipo', models.ForeignKey(to='compilacao.TipoVide', verbose_name='Tipo do Vide')), + ], + options={ + 'verbose_name': 'Vide', + 'verbose_name_plural': 'Vides', + }, + ), + migrations.AddField( + model_name='publicacao', + name='tipo_publicacao', + field=models.ForeignKey(to='compilacao.TipoPublicacao', verbose_name='Tipo de Publicação'), + ), + migrations.AddField( + model_name='publicacao', + name='veiculo_publicacao', + field=models.ForeignKey(to='compilacao.VeiculoPublicacao', verbose_name='Veículo de Publicação'), + ), + migrations.AddField( + model_name='nota', + name='tipo', + field=models.ForeignKey(to='compilacao.TipoNota', verbose_name='Tipo da Nota'), + ), + migrations.AddField( + model_name='dispositivo', + name='publicacao', + field=models.ForeignKey(blank=True, null=True, to='compilacao.Publicacao', verbose_name='Publicação', default=None), + ), + migrations.AddField( + model_name='dispositivo', + name='tipo_dispositivo', + field=models.ForeignKey(to='compilacao.TipoDispositivo', verbose_name='Tipo do Dispositivo'), + ), + migrations.AlterUniqueTogether( + name='dispositivo', + unique_together=set([('norma', 'dispositivo0', 'dispositivo1', 'dispositivo2', 'dispositivo3', 'dispositivo4', 'dispositivo5', 'tipo_dispositivo', 'dispositivo_pai', 'publicacao'), ('norma', 'ordem')]), + ), + ] diff --git a/compilacao/models.py b/compilacao/models.py index d9a98cf87..d0dac962e 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -18,7 +18,7 @@ class TipoNota(models.Model): verbose_name_plural = _('Tipos de Nota') def __str__(self): - return self.sigla + ' - ' + self.nome + return '%s: %s' % (self.sigla, self.nome) class TipoVide(models.Model): @@ -31,7 +31,7 @@ class TipoVide(models.Model): verbose_name_plural = _('Tipos de Vide') def __str__(self): - return self.sigla + ' - ' + self.nome + return '%s: %s' % (self.sigla, self.nome) class TipoDispositivo(models.Model): @@ -43,41 +43,58 @@ class TipoDispositivo(models.Model): FNC8 = '*' FNCN = 'N' FORMATO_NUMERACAO_CHOICES = ( - (FNC1, _('Numérico')), - (FNCI, _('Romano Maiúsculo')), - (FNCi, _('Romano Minúsculo')), - (FNCA, _('Alfabético Maiúsculo')), - (FNCa, _('Alfabético Minúsculo')), - (FNC8, _('Tópico sem contagem')), - (FNCN, _('Sem renderização de Contagem')), + (FNC1, _('(1) Numérico')), + (FNCI, _('(I) Romano Maiúsculo')), + (FNCi, _('(i) Romano Minúsculo')), + (FNCA, _('(A) Alfabético Maiúsculo')), + (FNCa, _('(a) Alfabético Minúsculo')), + (FNC8, _('Tópico - Sem contagem')), + (FNCN, _('Sem renderização')), ) nome = models.CharField( max_length=50, unique=True, verbose_name=_('Nome')) class_css = models.CharField( - max_length=20, verbose_name=_('Classe CSS')) + max_length=20, + verbose_name=_('Classe CSS')) rotulo_prefixo_html = models.CharField( - max_length=100, verbose_name=_('Prefixo html do rótulo')) + blank=True, + max_length=100, + verbose_name=_('Prefixo html do rótulo')) rotulo_prefixo_texto = models.CharField( + blank=True, max_length=30, verbose_name=_('Prefixo de construção do rótulo')) rotulo_ordinal = models.IntegerField( verbose_name=_('Tipo de número do rótulo')) rotulo_separadores_variacao = models.CharField( - max_length=5, verbose_name=_('Separadores das Variações')) + blank=True, + max_length=5, + verbose_name=_('Separadores das Variações')) rotulo_sufixo_texto = models.CharField( + blank=True, max_length=30, verbose_name=_('Sufixo de construção do rótulo')) rotulo_sufixo_html = models.CharField( - max_length=100, verbose_name=_('Sufixo html do rótulo')) + blank=True, + max_length=100, + verbose_name=_('Sufixo html do rótulo')) texto_prefixo_html = models.CharField( - max_length=100, verbose_name=_('Prefixo html do texto')) + blank=True, + max_length=100, + verbose_name=_('Prefixo html do texto')) texto_sufixo_html = models.CharField( - max_length=100, verbose_name=_('Sufixo html do texto')) + blank=True, + max_length=100, + verbose_name=_('Sufixo html do texto')) nota_automatica_prefixo_html = models.CharField( - max_length=100, verbose_name=_('Prefixo html da nota automática')) + blank=True, + max_length=100, + verbose_name=_('Prefixo html da nota automática')) nota_automatica_sufixo_html = models.CharField( - max_length=100, verbose_name=_('Sufixo html da nota automática')) + blank=True, + max_length=100, + verbose_name=_('Sufixo html da nota automática')) contagem_continua = models.BooleanField( choices=YES_NO_CHOICES, verbose_name=_('Contagem contínua')) formato_variacao0 = models.CharField( @@ -142,7 +159,7 @@ class VeiculoPublicacao(models.Model): verbose_name_plural = _('Veículos de Publicação') def __str__(self): - return self.sigla + ' - ' + self.nome + return '%s: %s' % (self.sigla, self.nome) class Publicacao(models.Model): @@ -164,7 +181,7 @@ class Publicacao(models.Model): verbose_name_plural = _('Publicações') def __str__(self): - return self.veiculo_publicacao.nome + ": " + str(self.publicacao) + return '%s: %s' % (self.veiculo_publicacao, self.publicacao) class Dispositivo(models.Model): @@ -304,6 +321,11 @@ class Dispositivo(models.Model): 'publicacao',), ) + def __str__(self): + return '%(rotulo)s - %(norma)s' % { + 'rotulo': self.rotulo, + 'norma': self.norma} + class Vide(models.Model): data_criacao = models.DateTimeField(verbose_name=_('Data de Criação')) @@ -324,6 +346,9 @@ class Vide(models.Model): verbose_name = _('Vide') verbose_name_plural = _('Vides') + def __str__(self): + return _('Vide %s') % self.texto + class Nota(models.Model): NPRIV = 1 @@ -358,5 +383,15 @@ class Nota(models.Model): owner = models.ForeignKey(User, verbose_name=_('Dono da Nota')) publicidade = models.PositiveSmallIntegerField( - choice=PUBLICIDADE_CHOICES, + choices=PUBLICIDADE_CHOICES, verbose_name=_('Nível de Publicidade')) + + class Meta: + verbose_name = _('Nota') + verbose_name_plural = _('Notas') + + def __str__(self): + return '%s: %s' % ( + self.tipo, + self.PUBLICIDADE_CHOICES[self.publicidade][1] + ) diff --git a/norma/migrations/0003_auto_20150906_0239.py b/norma/migrations/0003_auto_20150906_0239.py new file mode 100644 index 000000000..82dafbf88 --- /dev/null +++ b/norma/migrations/0003_auto_20150906_0239.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0002_auto_20150729_1717'), + ] + + operations = [ + migrations.CreateModel( + name='AssuntoNormaRelationship', + fields=[ + ('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)), + ('assunto', models.ForeignKey(to='norma.AssuntoNorma')), + ], + ), + migrations.RemoveField( + model_name='normajuridica', + name='assunto', + ), + migrations.AddField( + model_name='assuntonormarelationship', + name='norma', + field=models.ForeignKey(to='norma.NormaJuridica'), + ), + migrations.AddField( + model_name='normajuridica', + name='assuntos', + field=models.ManyToManyField(to='norma.AssuntoNorma', through='norma.AssuntoNormaRelationship'), + ), + ] diff --git a/norma/models.py b/norma/models.py index 153ea948e..fcc7db437 100644 --- a/norma/models.py +++ b/norma/models.py @@ -87,7 +87,9 @@ class NormaJuridica(models.Model): complemento = models.NullBooleanField( blank=True, verbose_name=_('Complementar ?')) # XXX was a CharField (attention on migrate) - assunto = models.ForeignKey(AssuntoNorma) + assuntos = models.ManyToManyField( + AssuntoNorma, + through='AssuntoNormaRelationship') data_vigencia = models.DateField(blank=True, null=True) timestamp = models.DateTimeField() @@ -103,6 +105,11 @@ class NormaJuridica(models.Model): 'ano': self.ano} +class AssuntoNormaRelationship(models.Model): + assunto = models.ForeignKey(AssuntoNorma) + norma = models.ForeignKey(NormaJuridica) + + class LegislacaoCitada(models.Model): materia = models.ForeignKey(MateriaLegislativa) norma = models.ForeignKey(NormaJuridica) From c26ce70d635b94413dfad9dbbc9e5acc3cef0202 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 7 Sep 2015 23:43:37 -0300 Subject: [PATCH 13/32] Changing relationships between models --- compilacao/insert_inicial_TipoDispositivo.sql | 72 +++++++------------ .../migrations/0002_auto_20150907_2334.py | 48 +++++++++++++ compilacao/models.py | 24 ++++--- norma/migrations/0004_auto_20150907_0004.py | 18 +++++ norma/models.py | 5 ++ 5 files changed, 111 insertions(+), 56 deletions(-) create mode 100644 compilacao/migrations/0002_auto_20150907_2334.py create mode 100644 norma/migrations/0004_auto_20150907_0004.py diff --git a/compilacao/insert_inicial_TipoDispositivo.sql b/compilacao/insert_inicial_TipoDispositivo.sql index d3444ffa6..987e0c81f 100644 --- a/compilacao/insert_inicial_TipoDispositivo.sql +++ b/compilacao/insert_inicial_TipoDispositivo.sql @@ -1,45 +1,27 @@ - -INSERT INTO compilacao_tipodispositivo - (id, - nome, - class_css, - rotulo_prefixo_html, - rotulo_prefixo_texto, - rotulo_ordinal, - rotulo_separadores_variacao, - rotulo_sufixo_texto, - rotulo_sufixo_html, - texto_prefixo_html, - texto_sufixo_html, - nota_automatica_prefixo_html, - nota_automatica_sufixo_html, - contagem_continua, - formato_variacao0, - formato_variacao1, - formato_variacao2, - formato_variacao3, - formato_variacao4, - formato_variacao5) VALUES -(11, 'Anexo', 'anexo', '', 'Anexo', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'), -(12, 'Parte', 'parte', '', 'Parte', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'), -(13, 'Livro', 'livro', '', 'Livro', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'), -(15, 'Capítulo', 'capitulo', '', 'Capítulo', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'), -(16, 'Seção', 'secao', '', 'Seção', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'), -(17, 'SubSeção', 'subsecao', '', 'SubSeção', 0, '-----', '', '
', '', '
', '', '', False, '1', '1', '1', '1', '1', '1'), -(18, 'Item de Seção', 'itemsecao', '', 'Item', 0, '-----', '', '
', '', '
', '', '', False, '1', '1', '1', '1', '1', '1'), -(19, 'Artigo', 'artigo', '', 'Art.', 9, '-----', '', ' – ', '', '', '', '', True, '1', '1', '1', '1', '1', '1'), -(21, 'Parágrafo', 'paragrafo', '', '§;Parágrafo Único', 9, '-----', '', ' – ', '', '', '', '', False, '1', '1', '1', '1', '1', '1'), -(22, 'Inciso', 'inciso', '', '', 0, '.....', '', ' – ', '', '', '', '', False, 'I', '1', '1', '1', '1', '1'), -(23, 'Alinea', 'alinea', '', '', 0, '.....', '', ' – ', '', '', '', '', False, 'a', '1', '1', '1', '1', '1'), -(24, 'Item', 'item', '', '', 0, '.....', '', ' – ', '', '', '', '', False, '1', '1', '1', '1', '1', '1'), -(25, 'Disposições Preliminares', 'disp_preliminares', '', 'Disposições Preliminares', 0, '-----', '', '
', '', '
', '', '', False, 'N', '1', '1', '1', '1', '1'), -(26, 'Disposições Gerais', 'disp_gerais', '', 'Disposições Gerais', 0, '-----', '', '
', '', '
', '', '', False, 'N', '1', '1', '1', '1', '1'), -(27, 'Disposições Transitórias', 'disp_transitorias', '', 'Disposições Transitórias', 0, '-----', '', '
', '', '
', '', '', False, 'N', '1', '1', '1', '1', '1'), -(28, 'Disposições Finais', 'disp_finais', '', 'Disposições Finais', 0, '-----', '', '
', '', '
', '', '', False, 'N', '1', '1', '1', '1', '1'), -(14, 'Título', 'titulo', '', 'Título', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'), -(1, 'Articulação', 'articulacao', '', '', 0, '.....', '', '', '', '', '', '', True, '1', '1', '1', '1', '1', '1'), -(4, 'Bloco Alteração', 'bloco_alteracao', '', '', 0, '.....', '', '', '', '', '', '', True, '1', '1', '1', '1', '1', '1'), -(5, 'Omissis', 'omissis', '', '', 0, '.....', '', '', '', '', '', '', False, '1', '1', '1', '1', '1', '1'), -(6, 'Texto Não Estruturado', 'texto_n_estruturado', '', '', 0, '.....', '', '', '', '', '', '',False, '1', '1', '1', '1', '1', '1'), -(2, 'Ementa', 'ementa', '', '', 0, '.....', '', '', '', '', '', '', False, 'N', '1', '1', '1', '1', '1'), -(20, 'Caput', 'caput', '', '', 0, '', '', '', '', '', '', '', False, 'N', 'N', 'N', 'N', 'N', 'N'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (1, 'Articulação', 'articulacao', '', '', 0, '.....', '', '', '', '', '', '', True, '1', '1', '1', '1', '1', '1'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (2, 'Ementa', 'ementa', '', '', 0, '.....', '', '', '', '', '', '', False, 'N', '1', '1', '1', '1', '1'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (3, 'Bloco Alteração', 'bloco_alteracao', '', '', 0, '.....', '', '', '', '', '', '', True, '1', '1', '1', '1', '1', '1'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (4, 'Omissis', 'omissis', '', '', 0, '.....', '', '', '', '', '', '', False, '1', '1', '1', '1', '1', '1'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (11, 'Anexo', 'anexo', '', 'Anexo', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (12, 'Parte', 'parte', '', 'Parte', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (13, 'Livro', 'livro', '', 'Livro', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (14, 'Título', 'titulo', '', 'Título', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (15, 'Capítulo', 'capitulo', '', 'Capítulo', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (16, 'Seção', 'secao', '', 'Seção', 0, '-----', '', '
', '', '
', '', '', False, 'I', '1', '1', '1', '1', '1'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (17, 'SubSeção', 'subsecao', '', 'SubSeção', 0, '-----', '', '
', '', '
', '', '', False, '1', '1', '1', '1', '1', '1'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (18, 'Item de Seção', 'itemsecao', '', 'Item', 0, '-----', '', '
', '', '
', '', '', False, '1', '1', '1', '1', '1', '1'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (19, 'Artigo', 'artigo', '', 'Art.', 9, '-----', '', ' – ', '', '', '', '', True, '1', '1', '1', '1', '1', '1'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (20, 'Caput', 'caput', '', '', 0, '', '', '', '', '', '', '', False, 'N', 'N', 'N', 'N', 'N', 'N'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (21, 'Parágrafo', 'paragrafo', '', '§;Parágrafo Único', 9, '-----', '', ' – ', '', '', '', '', False, '1', '1', '1', '1', '1', '1'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (22, 'Inciso', 'inciso', '', '', 0, '.....', '', ' – ', '', '', '', '', False, 'I', '1', '1', '1', '1', '1'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (23, 'Alinea', 'alinea', '', '', 0, '.....', '', ' – ', '', '', '', '', False, 'a', '1', '1', '1', '1', '1'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (24, 'Item', 'item', '', '', 0, '.....', '', ' – ', '', '', '', '', False, '1', '1', '1', '1', '1', '1'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (25, 'Disposições Preliminares', 'disp_preliminares', '', 'Disposições Preliminares', 0, '-----', '', '
', '', '
', '', '', False, 'N', '1', '1', '1', '1', '1'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (26, 'Disposições Gerais', 'disp_gerais', '', 'Disposições Gerais', 0, '-----', '', '
', '', '
', '', '', False, 'N', '1', '1', '1', '1', '1'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (27, 'Disposições Transitórias', 'disp_transitorias', '', 'Disposições Transitórias', 0, '-----', '', '
', '', '
', '', '', False, 'N', '1', '1', '1', '1', '1'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (28, 'Disposições Finais', 'disp_finais', '', 'Disposições Finais', 0, '-----', '', '
', '', '
', '', '', False, 'N', '1', '1', '1', '1', '1'); +insert INTO compilacao_tipodispositivo (id, nome, class_css, rotulo_prefixo_html, rotulo_prefixo_texto, rotulo_ordinal, rotulo_separadores_variacao, rotulo_sufixo_texto, rotulo_sufixo_html, texto_prefixo_html, texto_sufixo_html, nota_automatica_prefixo_html, nota_automatica_sufixo_html, contagem_continua, formato_variacao0, formato_variacao1, formato_variacao2, formato_variacao3, formato_variacao4, formato_variacao5) VALUES (29, 'Texto Não Estruturado', 'texto_n_estruturado', '', '', 0, '.....', '', '', '', '', '', '',False, '1', '1', '1', '1', '1', '1'); + + + +select setval('compilacao_tipodispositivo_id_seq'::regclass, (select max(id) from compilacao_tipodispositivo)); \ No newline at end of file diff --git a/compilacao/migrations/0002_auto_20150907_2334.py b/compilacao/migrations/0002_auto_20150907_2334.py new file mode 100644 index 000000000..f92031d91 --- /dev/null +++ b/compilacao/migrations/0002_auto_20150907_2334.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0001_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='dispositivo', + options={'ordering': ['norma', 'ordem'], 'verbose_name_plural': 'Dispositivos', 'verbose_name': 'Dispositivo'}, + ), + migrations.AlterField( + model_name='dispositivo', + name='dispositivo_atualizador', + field=models.ForeignKey(related_name='dispositivos_alterados_set', to='compilacao.Dispositivo', null=True, verbose_name='Dispositivo Atualizador', default=None, blank=True), + ), + migrations.AlterField( + model_name='dispositivo', + name='dispositivo_pai', + field=models.ForeignKey(related_name='+', to='compilacao.Dispositivo', null=True, verbose_name='Dispositivo Pai', default=None, blank=True), + ), + migrations.AlterField( + model_name='dispositivo', + name='dispositivo_subsequente', + field=models.ForeignKey(related_name='+', to='compilacao.Dispositivo', null=True, verbose_name='Dispositivo Subsequente', default=None, blank=True), + ), + migrations.AlterField( + model_name='dispositivo', + name='dispositivo_substituido', + field=models.ForeignKey(related_name='+', to='compilacao.Dispositivo', null=True, verbose_name='Dispositivo Substituido', default=None, blank=True), + ), + migrations.AlterField( + model_name='dispositivo', + name='dispositivo_vigencia', + field=models.ForeignKey(related_name='+', to='compilacao.Dispositivo', null=True, verbose_name='Dispositivo de Vigência', default=None, blank=True), + ), + migrations.AlterField( + model_name='dispositivo', + name='norma_publicada', + field=models.ForeignKey(related_name='dispositivos_alterados_set', to='norma.NormaJuridica', null=True, verbose_name='Norma Jurídica Publicada', default=None, blank=True), + ), + ] diff --git a/compilacao/models.py b/compilacao/models.py index d0dac962e..99104bd81 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -254,6 +254,7 @@ class Dispositivo(models.Model): default=False, choices=YES_NO_CHOICES, verbose_name=_('Inconstitucionalidade')) + # Relevant attribute only in altering norms visibilidade = models.BooleanField( default=False, choices=YES_NO_CHOICES, @@ -275,38 +276,39 @@ class Dispositivo(models.Model): norma_publicada = models.ForeignKey( NormaJuridica, blank=True, null=True, default=None, - related_name='%(class)s_norma_publicada', + related_name='dispositivos_alterados_set', verbose_name=_('Norma Jurídica Publicada')) dispositivo_subsequente = models.ForeignKey( 'self', blank=True, null=True, default=None, - related_name='%(class)s_dispositivo_subsequente', + related_name='+', verbose_name=_('Dispositivo Subsequente')) dispositivo_substituido = models.ForeignKey( 'self', blank=True, null=True, default=None, - related_name='%(class)s_dispositivo_substituido', + related_name='+', verbose_name=_('Dispositivo Substituido')) dispositivo_pai = models.ForeignKey( 'self', blank=True, null=True, default=None, - related_name='%(class)s_dispositivo_pai', + related_name='+', verbose_name=_('Dispositivo Pai')) dispositivo_vigencia = models.ForeignKey( 'self', blank=True, null=True, default=None, - related_name='%(class)s_dispositivo_vigencia', + related_name='+', verbose_name=_('Dispositivo de Vigência')) dispositivo_atualizador = models.ForeignKey( 'self', blank=True, null=True, default=None, - related_name='%(class)s_dispositivo_atualizador', + related_name='dispositivos_alterados_set', verbose_name=_('Dispositivo Atualizador')) class Meta: verbose_name = _('Dispositivo') verbose_name_plural = _('Dispositivos') + ordering = ['norma', 'ordem'] unique_together = ( ('norma', 'ordem',), ('norma', @@ -323,7 +325,7 @@ class Dispositivo(models.Model): def __str__(self): return '%(rotulo)s - %(norma)s' % { - 'rotulo': self.rotulo, + 'rotulo': (self.rotulo if self.rotulo else self.tipo_dispositivo), 'norma': self.norma} @@ -356,13 +358,13 @@ class Nota(models.Model): NINST = 3 NPUBL = 4 PUBLICIDADE_CHOICES = ( - # Apenas o dono da nota tem visibilidade. + # Only the owner of the note has visibility. (NPRIV, _('Nota Privada')), - # Todos do mesmo grupo tem visibilidade. + # All of the same group have visibility. (NSTRL, _('Nota Setorial')), - # Todo usuário autênticado tem visibilidade + # All authenticated users have visibility. (NINST, _('Nota Institucional')), - # Todo usuário tem visibilidade + # All users have visibility. (NPUBL, _('Nota Pública')), ) diff --git a/norma/migrations/0004_auto_20150907_0004.py b/norma/migrations/0004_auto_20150907_0004.py new file mode 100644 index 000000000..961acc32c --- /dev/null +++ b/norma/migrations/0004_auto_20150907_0004.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0003_auto_20150906_0239'), + ] + + operations = [ + migrations.AlterUniqueTogether( + name='assuntonormarelationship', + unique_together=set([('assunto', 'norma')]), + ), + ] diff --git a/norma/models.py b/norma/models.py index fcc7db437..fee95bdeb 100644 --- a/norma/models.py +++ b/norma/models.py @@ -109,6 +109,11 @@ class AssuntoNormaRelationship(models.Model): assunto = models.ForeignKey(AssuntoNorma) norma = models.ForeignKey(NormaJuridica) + class Meta: + unique_together = ( + ('assunto', 'norma'), + ) + class LegislacaoCitada(models.Model): materia = models.ForeignKey(MateriaLegislativa) From d8a500ffc7691cacf490a5fc7d4a1131b16c03f9 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 11 Sep 2015 17:43:29 -0300 Subject: [PATCH 14/32] create initial template page for anonymous user --- compilacao/models.py | 2 +- compilacao/templatetags/__init__.py | 0 compilacao/templatetags/compilacao_filters.py | 13 ++++++ compilacao/urls.py | 8 ++++ compilacao/views.py | 28 ++++++++++- norma/models.py | 4 +- sapl/urls.py | 2 + static/styles/compilacao.scss | 7 +++ templates/base.html | 1 + templates/compilacao/index.html | 46 +++++++++++++++++++ 10 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 compilacao/templatetags/__init__.py create mode 100644 compilacao/templatetags/compilacao_filters.py create mode 100644 static/styles/compilacao.scss create mode 100644 templates/compilacao/index.html diff --git a/compilacao/models.py b/compilacao/models.py index 99104bd81..37ea8f2ba 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -292,7 +292,7 @@ class Dispositivo(models.Model): dispositivo_pai = models.ForeignKey( 'self', blank=True, null=True, default=None, - related_name='+', + related_name='filhos', verbose_name=_('Dispositivo Pai')) dispositivo_vigencia = models.ForeignKey( 'self', diff --git a/compilacao/templatetags/__init__.py b/compilacao/templatetags/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/compilacao/templatetags/compilacao_filters.py b/compilacao/templatetags/compilacao_filters.py new file mode 100644 index 000000000..0e802bd9c --- /dev/null +++ b/compilacao/templatetags/compilacao_filters.py @@ -0,0 +1,13 @@ +from django import template +from django.db.models import Q + +from compilacao.models import Dispositivo + +register = template.Library() + + +@register.filter +def get_bloco(pk): + return Dispositivo.objects.order_by('ordem_bloco_atualizador').filter( + Q(dispositivo_pai_id=pk) | + Q(dispositivo_atualizador=pk)).select_related() diff --git a/compilacao/urls.py b/compilacao/urls.py index e69de29bb..158ce9fc1 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -0,0 +1,8 @@ +from django.conf.urls import url + +from compilacao import views + +urlpatterns = [ + url(r'^norma/(?P\d+)/compilacao/', + views.CompilacaoView.as_view(), name='compilacao'), +] diff --git a/compilacao/views.py b/compilacao/views.py index 60f00ef0e..ec70879d9 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -1 +1,27 @@ -# Create your views here. +from django.views.generic.list import ListView + +from compilacao.models import Dispositivo +from norma.models import NormaJuridica + + +class CompilacaoView(ListView): + model = Dispositivo + template_name = 'compilacao/index.html' + + flag_alteradora = None + + def get_queryset(self): + return Dispositivo.objects.filter( + ordem__gt=0, + norma_id=self.kwargs['norma_id']).select_related() + + def get_norma(self): + return NormaJuridica.objects.get( + pk=self.kwargs['norma_id']) + + def is_norma_alteradora(self): + if self.flag_alteradora is None: + self.flag_alteradora = NormaJuridica.objects.get( + pk=self.kwargs['norma_id'] + ).dispositivos_alterados_set.count() > 1 + return self.flag_alteradora diff --git a/norma/models.py b/norma/models.py index fee95bdeb..32d616dce 100644 --- a/norma/models.py +++ b/norma/models.py @@ -98,10 +98,10 @@ class NormaJuridica(models.Model): verbose_name_plural = _('Normas Jurídicas') def __str__(self): - return _('%(tipo)s nº %(numero)s - %(materia)s - %(ano)s') % { + return _('%(tipo)s nº %(numero)s - %(data)s - %(ano)s') % { 'tipo': self.tipo, 'numero': self.numero, - 'materia': self.materia, + 'data': self.data, 'ano': self.ano} diff --git a/sapl/urls.py b/sapl/urls.py index 4ebf95179..4be663a14 100644 --- a/sapl/urls.py +++ b/sapl/urls.py @@ -29,6 +29,8 @@ urlpatterns = [ url(r'', include('lexml.urls')), url(r'', include('painel.urls')), + url(r'', include('compilacao.urls')), + # must come at the end # so that base /sistema/ url doesn't capture its children url(r'', include('base.urls')), diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss new file mode 100644 index 000000000..2df3a5ea6 --- /dev/null +++ b/static/styles/compilacao.scss @@ -0,0 +1,7 @@ + + +.articulacao { + + background-color: rgba(100,100,100,0.3); + margin: 1em; +} \ No newline at end of file diff --git a/templates/base.html b/templates/base.html index 6c1742631..dae162f15 100644 --- a/templates/base.html +++ b/templates/base.html @@ -20,6 +20,7 @@ + {# Scripts #} {# modernizr must be in head (see http://modernizr.com/docs/#installing) #} diff --git a/templates/compilacao/index.html b/templates/compilacao/index.html new file mode 100644 index 000000000..c9f9e40f7 --- /dev/null +++ b/templates/compilacao/index.html @@ -0,0 +1,46 @@ +{% extends "base.html" %} +{% load i18n %} +{% load compilacao_filters %} + + +{% block title%} +

{{ view.get_norma }}

+{% endblock %} + +{% block base_content %} + {% for dispositivo in view.get_queryset %} + {% if dispositivo.tipo_dispositivo.class_css == 'articulacao'%} + {%if not forloop.first%} + + {% endif%} +
+ {% else %} + + + + + +
+ {{ dispositivo.tipo_dispositivo.class_css }} - {{ dispositivo.rotulo }} - {{ dispositivo.texto|safe }} +
+ + {% if view.is_norma_alteradora %} + {% if dispositivo.tipo_dispositivo.class_css == 'bloco_alteracao'%} + {% for alterado in dispositivo.id|get_bloco %} + +
+ {{ alterado.tipo_dispositivo.class_css }} - {{ alterado.rotulo }} - {{ alterado.texto }} +
+
+ + {% endfor %} + {% endif%} + {% endif%} + +
+ {% endif%} + {%if forloop.last %} +
+ {% endif%} + {% endfor %} +{% endblock base_content %} \ No newline at end of file From 649e1aac74c2071d03ec9ab79d243ca919b5e79c Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Fri, 11 Sep 2015 17:47:59 -0300 Subject: [PATCH 15/32] last makemigrations --- .../migrations/0003_auto_20150911_1735.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 compilacao/migrations/0003_auto_20150911_1735.py diff --git a/compilacao/migrations/0003_auto_20150911_1735.py b/compilacao/migrations/0003_auto_20150911_1735.py new file mode 100644 index 000000000..36cfd09af --- /dev/null +++ b/compilacao/migrations/0003_auto_20150911_1735.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0002_auto_20150907_2334'), + ] + + operations = [ + migrations.AlterField( + model_name='dispositivo', + name='dispositivo_pai', + field=models.ForeignKey(blank=True, null=True, verbose_name='Dispositivo Pai', to='compilacao.Dispositivo', related_name='filhos', default=None), + ), + ] From cd2179c0c1899590274f10caa66cd047612c69ca Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Tue, 15 Sep 2015 11:52:36 -0300 Subject: [PATCH 16/32] Construction of the first views on app compilacao MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Portuguese in message: - primeira visualização de normas sem controle de vigências - visualização e lincagem das normas alteradoras - sem notas e vides --- .../migrations/0004_auto_20150914_0842.py | 34 +++++ compilacao/models.py | 6 +- compilacao/templatetags/compilacao_filters.py | 51 ++++++- compilacao/urls.py | 4 +- compilacao/views.py | 104 ++++++++++++-- norma/models.py | 7 +- norma/urls.py | 9 +- norma/views.py | 11 ++ static/styles/compilacao.scss | 130 +++++++++++++++++- templates/compilacao/bloco_alteracao.html | 18 +++ templates/compilacao/index.html | 36 +---- .../compilacao/template_render_bloco.html | 42 ++++++ templates/norma/normajuridica_detail.html | 9 ++ 13 files changed, 405 insertions(+), 56 deletions(-) create mode 100644 compilacao/migrations/0004_auto_20150914_0842.py create mode 100644 templates/compilacao/bloco_alteracao.html create mode 100644 templates/compilacao/template_render_bloco.html create mode 100644 templates/norma/normajuridica_detail.html diff --git a/compilacao/migrations/0004_auto_20150914_0842.py b/compilacao/migrations/0004_auto_20150914_0842.py new file mode 100644 index 000000000..991257507 --- /dev/null +++ b/compilacao/migrations/0004_auto_20150914_0842.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('compilacao', '0003_auto_20150911_1735'), + ] + + operations = [ + migrations.AlterField( + model_name='dispositivo', + name='dispositivo_pai', + field=models.ForeignKey(to='compilacao.Dispositivo', verbose_name='Dispositivo Pai', blank=True, related_name='dispositivos_filhos_set', null=True, default=None), + ), + migrations.AlterField( + model_name='dispositivo', + name='norma', + field=models.ForeignKey(related_name='dispositivos_set', to='norma.NormaJuridica', verbose_name='Norma Jurídica'), + ), + migrations.AlterField( + model_name='dispositivo', + name='norma_publicada', + field=models.ForeignKey(to='norma.NormaJuridica', verbose_name='Norma Jurídica Publicada', blank=True, related_name='dispositivos_alterados_pela_norma_set', null=True, default=None), + ), + migrations.AlterField( + model_name='dispositivo', + name='tipo_dispositivo', + field=models.ForeignKey(related_name='dispositivos_do_tipo_set', to='compilacao.TipoDispositivo', verbose_name='Tipo do Dispositivo'), + ), + ] diff --git a/compilacao/models.py b/compilacao/models.py index 37ea8f2ba..ffc7f68e6 100644 --- a/compilacao/models.py +++ b/compilacao/models.py @@ -264,6 +264,7 @@ class Dispositivo(models.Model): tipo_dispositivo = models.ForeignKey( TipoDispositivo, + related_name='dispositivos_do_tipo_set', verbose_name=_('Tipo do Dispositivo')) publicacao = models.ForeignKey( @@ -272,11 +273,12 @@ class Dispositivo(models.Model): norma = models.ForeignKey( NormaJuridica, + related_name='dispositivos_set', verbose_name=_('Norma Jurídica')) norma_publicada = models.ForeignKey( NormaJuridica, blank=True, null=True, default=None, - related_name='dispositivos_alterados_set', + related_name='dispositivos_alterados_pela_norma_set', verbose_name=_('Norma Jurídica Publicada')) dispositivo_subsequente = models.ForeignKey( @@ -292,7 +294,7 @@ class Dispositivo(models.Model): dispositivo_pai = models.ForeignKey( 'self', blank=True, null=True, default=None, - related_name='filhos', + related_name='dispositivos_filhos_set', verbose_name=_('Dispositivo Pai')) dispositivo_vigencia = models.ForeignKey( 'self', diff --git a/compilacao/templatetags/compilacao_filters.py b/compilacao/templatetags/compilacao_filters.py index 0e802bd9c..ce7c18df6 100644 --- a/compilacao/templatetags/compilacao_filters.py +++ b/compilacao/templatetags/compilacao_filters.py @@ -1,13 +1,58 @@ +from builtins import ValueError + from django import template from django.db.models import Q from compilacao.models import Dispositivo + register = template.Library() @register.filter -def get_bloco(pk): +def get_bloco(pk_atualizador): return Dispositivo.objects.order_by('ordem_bloco_atualizador').filter( - Q(dispositivo_pai_id=pk) | - Q(dispositivo_atualizador=pk)).select_related() + Q(dispositivo_pai_id=pk_atualizador) | + Q(dispositivo_atualizador_id=pk_atualizador)).select_related() + + +@register.filter +def bloco_ja_incluso(view, bloco): + try: + return view.itens_de_bloco.index(bloco) >= 0 + except ValueError: + return False + + +@register.simple_tag +def dispositivo_desativado(dispositivo): + if dispositivo.fim_vigencia is not None: + return 'desativado' + return '' + + +@register.simple_tag +def nota_automatica(dispositivo): + # return '' + if dispositivo.norma_publicada is not None and \ + dispositivo.tipo_dispositivo.class_css != 'artigo': + d = dispositivo.dispositivo_atualizador.dispositivo_pai + return 'Alteração feita pelo %s.' % d + return '' + + +@register.simple_tag +def set_nivel_old(view, value): + view.flag_nivel_old = value + return '' + + +@register.simple_tag +def append_to_itens_de_bloco(view, value): + view.itens_de_bloco.append(value) + return '' + + +@register.simple_tag +def close_div(value_max, value_min): + return '' * (int(value_max) - int(value_min) + 1) diff --git a/compilacao/urls.py b/compilacao/urls.py index 158ce9fc1..0997d5747 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -3,6 +3,8 @@ from django.conf.urls import url from compilacao import views urlpatterns = [ - url(r'^norma/(?P\d+)/compilacao/', + url(r'^norma/(?P[0-9]+)/compilacao/$', views.CompilacaoView.as_view(), name='compilacao'), + url(r'^norma/(?P[0-9]+)/compilacao/(?P[0-9]+)/$', + views.DispositivoView.as_view(), name='dispositivo'), ] diff --git a/compilacao/views.py b/compilacao/views.py index ec70879d9..ff4e7edc1 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -3,25 +3,109 @@ from django.views.generic.list import ListView from compilacao.models import Dispositivo from norma.models import NormaJuridica +DISPOSITIVO_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') + class CompilacaoView(ListView): - model = Dispositivo template_name = 'compilacao/index.html' + flag_alteradora = -1 + + flag_nivel_ini = 0 + flag_nivel_old = -1 + + itens_de_bloco = [] + + def get_queryset(self): + self.flag_alteradora = -1 + self.flag_nivel_ini = 0 + self.flag_nivel_old = -1 + self.itens_de_bloco = [] + + if self.is_norma_alteradora(): + return Dispositivo.objects.filter( + ordem__gt=0, + norma_id=self.kwargs['norma_id'], + ).select_related(*DISPOSITIVO_SELECT_RELATED) + else: + return Dispositivo.objects.filter( + ordem__gt=0, + norma_id=self.kwargs['norma_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + + def get_norma(self): + return NormaJuridica.objects.select_related('tipo').get( + pk=self.kwargs['norma_id']) + + def is_norma_alteradora(self): + if self.flag_alteradora == -1: + self.flag_alteradora = Dispositivo.objects.select_related( + 'dispositivos_alterados_pela_norma_set' + ).filter(norma_id=self.kwargs['norma_id']).count() + return self.flag_alteradora > 0 + + +class DispositivoView(ListView): + #template_name = 'compilacao/index.html' + template_name = 'compilacao/template_render_bloco.html' + flag_alteradora = None + flag_nivel_ini = 0 + flag_nivel_old = -1 + + itens_de_bloco = [] + def get_queryset(self): - return Dispositivo.objects.filter( - ordem__gt=0, - norma_id=self.kwargs['norma_id']).select_related() + self.flag_alteradora = -1 + self.flag_nivel_ini = 0 + self.flag_nivel_old = -1 + self.itens_de_bloco = [] + + try: + bloco = Dispositivo.objects.get(pk=self.kwargs['dispositivo_id']) + except Dispositivo.DoesNotExist: + return [] + + self.flag_nivel_old = bloco.nivel - 1 + self.flag_nivel_ini = bloco.nivel + + proximo_bloco = Dispositivo.objects.filter( + ordem__gt=bloco.ordem, + nivel__lte=bloco.nivel, + norma_publicada=None, + norma_id=self.kwargs['norma_id'])[:1] + + if proximo_bloco.count() == 0: + itens = Dispositivo.objects.filter( + ordem__gte=bloco.ordem, + norma_publicada=None, + norma_id=self.kwargs['norma_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + else: + itens = Dispositivo.objects.filter( + ordem__gte=bloco.ordem, + ordem__lt=proximo_bloco[0].ordem, + norma_publicada=None, + norma_id=self.kwargs['norma_id'] + ).select_related(*DISPOSITIVO_SELECT_RELATED) + return itens def get_norma(self): - return NormaJuridica.objects.get( + return NormaJuridica.objects.select_related('tipo').get( pk=self.kwargs['norma_id']) def is_norma_alteradora(self): - if self.flag_alteradora is None: - self.flag_alteradora = NormaJuridica.objects.get( - pk=self.kwargs['norma_id'] - ).dispositivos_alterados_set.count() > 1 - return self.flag_alteradora + if self.flag_alteradora == -1: + self.flag_alteradora = Dispositivo.objects.select_related( + 'dispositivos_alterados_pela_norma_set' + ).filter(norma_id=self.kwargs['norma_id']).count() + return self.flag_alteradora > 0 diff --git a/norma/models.py b/norma/models.py index 32d616dce..62512d500 100644 --- a/norma/models.py +++ b/norma/models.py @@ -1,4 +1,5 @@ from django.db import models +from django.template import defaultfilters from django.utils.translation import ugettext_lazy as _ from materia.models import MateriaLegislativa @@ -96,13 +97,13 @@ class NormaJuridica(models.Model): class Meta: verbose_name = _('Norma Jurídica') verbose_name_plural = _('Normas Jurídicas') + ordering = ['-data'] def __str__(self): - return _('%(tipo)s nº %(numero)s - %(data)s - %(ano)s') % { + return _('%(tipo)s nº %(numero)s de %(data)s') % { 'tipo': self.tipo, 'numero': self.numero, - 'data': self.data, - 'ano': self.ano} + 'data': defaultfilters.date(self.data, "d \d\e N \d\e Y")} class AssuntoNormaRelationship(models.Model): diff --git a/norma/urls.py b/norma/urls.py index 300e80c72..1db761f8c 100644 --- a/norma/urls.py +++ b/norma/urls.py @@ -1,8 +1,15 @@ from django.conf.urls import include, url -from norma.views import assunto_norma_crud, tipo_norma_crud +from norma.views import (assunto_norma_crud, tipo_norma_crud, + norma_temporario_para_compilacao_crud) + +norma_url_patterns = norma_temporario_para_compilacao_crud.urlpatterns urlpatterns = [ + url(r'^norma/', include(norma_url_patterns, + norma_temporario_para_compilacao_crud.namespace, + norma_temporario_para_compilacao_crud.namespace)), + url(r'^sistema/norma/tipo/', include(tipo_norma_crud.urls)), url(r'^sistema/norma/assunto/', include(assunto_norma_crud.urls)), ] diff --git a/norma/views.py b/norma/views.py index 4c4102e83..24dd52009 100644 --- a/norma/views.py +++ b/norma/views.py @@ -45,6 +45,17 @@ norma_crud = build_crud( [('assunto_norma_FIXME', 12)]], ]) +norma_temporario_para_compilacao_crud = build_crud( + NormaJuridica, 'norma', [ + + [_('Identificação Básica'), + [('tipo', 4), ('numero', 4), ('ano', 4)], + [('data', 4), ('esfera_federacao', 4)], + [('data_publicacao', 3)], + [('ementa', 12)]], + ]) + + legislacao_citada_crud = build_crud( LegislacaoCitada, '', [ diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index 2df3a5ea6..566b82cac 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -1,7 +1,131 @@ -.articulacao { +.articulacao div { + background-color: #fff; +} + + +.dispositivo { + background-color: #ddd !important; + transition: all .4s ease-in-out; + display:inline; +} + + +.dispositivo .ementa { + padding: 2em 0em 3em 50%; + font-weight: bold; - background-color: rgba(100,100,100,0.3); - margin: 1em; +} + +.dispositivo .anexo { + font-size: 1.4em; + text-align: center; + font-weight: bold; + margin-top: 3em; +} + +.dispositivo .parte { + font-size: 1.5em; + text-align: center; + font-weight: bold; + margin-top: 2em; +} +.dispositivo .livro { + font-size: 1.5em; + text-align: center; + font-weight: bold; + margin-top: 2em; +} + +.dispositivo .titulo { + font-size: 1.5em; + text-align: center; + font-weight: bold; + margin-top: 2em; +} + +.dispositivo .capitulo { + margin-top: 1.5em; + font-size: 1.3em; + text-align: center; + font-weight: bold; +} + +.dispositivo .secao { + margin-top: 0.8em; + font-size: 1.2em; + text-align: center; + font-weight: bold; +} + +.dispositivo .subsecao, .dispositivo .itemsecao { + margin-top: 0.8em; + font-size: 1.2em; + text-align: center; + font-style: italic; + font-weight: bold; +} + +.dispositivo .artigo { + font-size: 1.15em; + float:left; +} +.dispositivo .caput { + font-size: 1.15em; + margin-bottom: 0.5em; + display: block; +} + +.dispositivo .paragrafo { + margin-left: 1.5em; + font-size: 1.1em; + margin-top: 5px; + margin-bottom: 3px; +} + +.dispositivo .inciso { + font-size: 1.1em; + margin-left: 2.5em; + margin-top: 5px; + margin-bottom: 3px; +} + +.dispositivo .alinea { + font-size: 1.0em; + margin-left: 3.5em; +} + +.dispositivo .item { + font-size: 1.0em; + margin-left: 4.5em; +} + +.dispositivo .desativado, .dispositivo .desativado * { + text-decoration: line-through; + color: #777 !important; +} +.dispositivo .desativado table, .dispositivo .desativado table td { + border: 1px dotted #ccc; + text-decoration: line-through; +} + +.dispositivo a { + color: #444444 !important; +} +.dispositivo a.link_alterador { + color: #2980B9 !important; + font-size: 0.9rem; +} + + +.dispositivo .bloco_alteracao{ + margin-left: 5em; +} + +.dispositivo .bloco_alteracao, +.dispositivo .bloco_alteracao a, +.dispositivo .bloco_alteracao table, +.dispositivo .bloco_alteracao table td { + color: #018 !important; } \ No newline at end of file diff --git a/templates/compilacao/bloco_alteracao.html b/templates/compilacao/bloco_alteracao.html new file mode 100644 index 000000000..3104bc978 --- /dev/null +++ b/templates/compilacao/bloco_alteracao.html @@ -0,0 +1,18 @@ +{% load compilacao_filters %} + +{% for ch in dispositivo.pk|get_bloco %} + +
+
+ + {{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }} + + {{ ch.rotulo }} + + {{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }} + + {{ ch.tipo_dispositivo.texto_prefixo_html|safe }} + {{ ch.texto|safe }} +
+
+{% endfor %} \ No newline at end of file diff --git a/templates/compilacao/index.html b/templates/compilacao/index.html index c9f9e40f7..e31422c53 100644 --- a/templates/compilacao/index.html +++ b/templates/compilacao/index.html @@ -7,40 +7,10 @@

{{ view.get_norma }}

{% endblock %} -{% block base_content %} - {% for dispositivo in view.get_queryset %} - {% if dispositivo.tipo_dispositivo.class_css == 'articulacao'%} - {%if not forloop.first%} - - {% endif%} -
- {% else %} - - - - -
- {{ dispositivo.tipo_dispositivo.class_css }} - {{ dispositivo.rotulo }} - {{ dispositivo.texto|safe }} -
- - {% if view.is_norma_alteradora %} - {% if dispositivo.tipo_dispositivo.class_css == 'bloco_alteracao'%} - {% for alterado in dispositivo.id|get_bloco %} -
- {{ alterado.tipo_dispositivo.class_css }} - {{ alterado.rotulo }} - {{ alterado.texto }} -
-
- - {% endfor %} - {% endif%} - {% endif%} +{% block base_content %} + + {% include 'compilacao/template_render_bloco.html'%} -
- {% endif%} - {%if forloop.last %} -
- {% endif%} - {% endfor %} {% endblock base_content %} \ No newline at end of file diff --git a/templates/compilacao/template_render_bloco.html b/templates/compilacao/template_render_bloco.html new file mode 100644 index 000000000..6c8969e56 --- /dev/null +++ b/templates/compilacao/template_render_bloco.html @@ -0,0 +1,42 @@ +{% load i18n %} +{% load compilacao_filters %} + + +{% for dispositivo in view.get_queryset %} + {% if dispositivo.nivel == view.flag_nivel_old %} + + {% elif dispositivo.nivel < view.flag_nivel_old %} + {% close_div view.flag_nivel_old dispositivo.nivel %} + {% endif%} +
+ {% spaceless %} +
+ + {{ dispositivo.tipo_dispositivo.rotulo_prefixo_html|safe }} + {{ dispositivo.rotulo }} + {{ dispositivo.tipo_dispositivo.rotulo_sufixo_html|safe }} + + {{ dispositivo.tipo_dispositivo.texto_prefixo_html|safe }} + {{ dispositivo.texto|safe }} + + {% if dispositivo.norma_publicada_id != None %} + + + {{ dispositivo.tipo_dispositivo.nota_automatica_prefixo_html|safe }} + {% nota_automatica dispositivo %} + {{ dispositivo.tipo_dispositivo.nota_automatica_sufixo_html|safe }} + + {% endif%} + {% if view.is_norma_alteradora and dispositivo.tipo_dispositivo.class_css == 'bloco_alteracao'%} + + {%with node=dispositivo template_name='compilacao/bloco_alteracao.html' %} + {%include template_name%} + {%endwith%} + {% endif%} +
+ {% endspaceless %} + + {% set_nivel_old view dispositivo.nivel %} +{% endfor %} +{% close_div view.flag_nivel_old view.flag_nivel_ini %} \ No newline at end of file diff --git a/templates/norma/normajuridica_detail.html b/templates/norma/normajuridica_detail.html new file mode 100644 index 000000000..360bfc43f --- /dev/null +++ b/templates/norma/normajuridica_detail.html @@ -0,0 +1,9 @@ +{% extends "crud/detail.html" %} +{% load i18n %} + +{% block sections_nav %} + +{% endblock sections_nav %} From 73a9f976b3fc9e37ea0283f3198443f2ac48cefa Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Tue, 15 Sep 2015 14:21:13 -0300 Subject: [PATCH 17/32] Basic error correction typing --- norma/migrations/0005_auto_20150915_1141.py | 18 ++++++++++++++++++ .../compilacao/template_render_bloco.html | 3 +-- 2 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 norma/migrations/0005_auto_20150915_1141.py diff --git a/norma/migrations/0005_auto_20150915_1141.py b/norma/migrations/0005_auto_20150915_1141.py new file mode 100644 index 000000000..67ed2e0a1 --- /dev/null +++ b/norma/migrations/0005_auto_20150915_1141.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('norma', '0004_auto_20150907_0004'), + ] + + operations = [ + migrations.AlterModelOptions( + name='normajuridica', + options={'verbose_name_plural': 'Normas Jurídicas', 'verbose_name': 'Norma Jurídica', 'ordering': ['-data']}, + ), + ] diff --git a/templates/compilacao/template_render_bloco.html b/templates/compilacao/template_render_bloco.html index 6c8969e56..bf8e9689a 100644 --- a/templates/compilacao/template_render_bloco.html +++ b/templates/compilacao/template_render_bloco.html @@ -21,8 +21,7 @@ {% if dispositivo.norma_publicada_id != None %} - + {{ dispositivo.tipo_dispositivo.nota_automatica_prefixo_html|safe }} {% nota_automatica dispositivo %} {{ dispositivo.tipo_dispositivo.nota_automatica_sufixo_html|safe }} From 102a262a0b65c72a737db282df0255342c74b540 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Thu, 17 Sep 2015 11:48:29 -0300 Subject: [PATCH 18/32] create timeline in compilacao app --- compilacao/templatetags/compilacao_filters.py | 8 ++ compilacao/views.py | 81 +++++++++++++------ norma/models.py | 2 +- norma/urls.py | 5 +- static/styles/compilacao.scss | 37 +++++++-- templates/compilacao/bloco_alteracao.html | 24 ++---- templates/compilacao/index.html | 54 +++++++++++-- .../compilacao/template_render_bloco.html | 51 +++++------- 8 files changed, 179 insertions(+), 83 deletions(-) diff --git a/compilacao/templatetags/compilacao_filters.py b/compilacao/templatetags/compilacao_filters.py index ce7c18df6..81ad6ea2c 100644 --- a/compilacao/templatetags/compilacao_filters.py +++ b/compilacao/templatetags/compilacao_filters.py @@ -16,6 +16,14 @@ def get_bloco(pk_atualizador): Q(dispositivo_atualizador_id=pk_atualizador)).select_related() +@register.filter +def get_field(value, key): + try: + return value[key] + except ValueError: + return None + + @register.filter def bloco_ja_incluso(view, bloco): try: diff --git a/compilacao/views.py b/compilacao/views.py index ff4e7edc1..e14114f48 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -1,8 +1,12 @@ +from collections import OrderedDict +from datetime import timedelta + from django.views.generic.list import ListView from compilacao.models import Dispositivo from norma.models import NormaJuridica + DISPOSITIVO_SELECT_RELATED = ( 'tipo_dispositivo', 'norma_publicada', @@ -22,13 +26,12 @@ class CompilacaoView(ListView): flag_nivel_ini = 0 flag_nivel_old = -1 - itens_de_bloco = [] + itens_de_vigencia = {} def get_queryset(self): self.flag_alteradora = -1 self.flag_nivel_ini = 0 self.flag_nivel_old = -1 - self.itens_de_bloco = [] if self.is_norma_alteradora(): return Dispositivo.objects.filter( @@ -41,6 +44,57 @@ class CompilacaoView(ListView): norma_id=self.kwargs['norma_id'] ).select_related(*DISPOSITIVO_SELECT_RELATED) + def get_vigencias(self): + itens = Dispositivo.objects.filter( + norma_id=self.kwargs['norma_id'], + ).order_by( + 'inicio_vigencia' + ).distinct( + 'inicio_vigencia' + ).select_related( + 'norma_publicada', + 'norma', + 'norma_publicada__tipo', + 'norma__tipo',) + + ajuste_datas_vigencia = [] + + for item in itens: + ajuste_datas_vigencia.append(item) + + lenLista = len(ajuste_datas_vigencia) + for i in range(lenLista): + if i + 1 < lenLista: + ajuste_datas_vigencia[ + i].fim_vigencia = ajuste_datas_vigencia[ + i + 1].inicio_vigencia - timedelta(days=1) + else: + ajuste_datas_vigencia[i].fim_vigencia = None + + self.itens_de_vigencia = {} + + idx = -1 + length = len(ajuste_datas_vigencia) + for item in ajuste_datas_vigencia: + idx += 1 + if idx == 0: + self.itens_de_vigencia[0] = [item, ] + continue + + if idx + 1 < length: + ano = item.norma_publicada.ano + if ano in self.itens_de_vigencia: + self.itens_de_vigencia[ano].append(item) + else: + self.itens_de_vigencia[ano] = [item, ] + else: + self.itens_de_vigencia[9999] = [item, ] + + self.itens_de_vigencia = OrderedDict( + sorted(self.itens_de_vigencia.items(), key=lambda t: t[0])) + + return self.itens_de_vigencia + def get_norma(self): return NormaJuridica.objects.select_related('tipo').get( pk=self.kwargs['norma_id']) @@ -53,22 +107,14 @@ class CompilacaoView(ListView): return self.flag_alteradora > 0 -class DispositivoView(ListView): - #template_name = 'compilacao/index.html' +class DispositivoView(CompilacaoView): + # template_name = 'compilacao/index.html' template_name = 'compilacao/template_render_bloco.html' - flag_alteradora = None - - flag_nivel_ini = 0 - flag_nivel_old = -1 - - itens_de_bloco = [] - def get_queryset(self): self.flag_alteradora = -1 self.flag_nivel_ini = 0 self.flag_nivel_old = -1 - self.itens_de_bloco = [] try: bloco = Dispositivo.objects.get(pk=self.kwargs['dispositivo_id']) @@ -98,14 +144,3 @@ class DispositivoView(ListView): norma_id=self.kwargs['norma_id'] ).select_related(*DISPOSITIVO_SELECT_RELATED) return itens - - def get_norma(self): - return NormaJuridica.objects.select_related('tipo').get( - pk=self.kwargs['norma_id']) - - def is_norma_alteradora(self): - if self.flag_alteradora == -1: - self.flag_alteradora = Dispositivo.objects.select_related( - 'dispositivos_alterados_pela_norma_set' - ).filter(norma_id=self.kwargs['norma_id']).count() - return self.flag_alteradora > 0 diff --git a/norma/models.py b/norma/models.py index 62512d500..a6f24dce7 100644 --- a/norma/models.py +++ b/norma/models.py @@ -103,7 +103,7 @@ class NormaJuridica(models.Model): return _('%(tipo)s nº %(numero)s de %(data)s') % { 'tipo': self.tipo, 'numero': self.numero, - 'data': defaultfilters.date(self.data, "d \d\e N \d\e Y")} + 'data': defaultfilters.date(self.data, "d \d\e F \d\e Y")} class AssuntoNormaRelationship(models.Model): diff --git a/norma/urls.py b/norma/urls.py index 1db761f8c..f2900f535 100644 --- a/norma/urls.py +++ b/norma/urls.py @@ -1,7 +1,8 @@ from django.conf.urls import include, url -from norma.views import (assunto_norma_crud, tipo_norma_crud, - norma_temporario_para_compilacao_crud) +from norma.views import (assunto_norma_crud, + norma_temporario_para_compilacao_crud, + tipo_norma_crud) norma_url_patterns = norma_temporario_para_compilacao_crud.urlpatterns diff --git a/static/styles/compilacao.scss b/static/styles/compilacao.scss index 566b82cac..b1c1cde84 100644 --- a/static/styles/compilacao.scss +++ b/static/styles/compilacao.scss @@ -3,17 +3,17 @@ .articulacao div { background-color: #fff; } - + .dispositivo { background-color: #ddd !important; transition: all .4s ease-in-out; - display:inline; + display:inline; } .dispositivo .ementa { - padding: 2em 0em 3em 50%; + padding: 4em 0em 3em 50%; font-weight: bold; } @@ -117,15 +117,38 @@ color: #2980B9 !important; font-size: 0.9rem; } - - -.dispositivo .bloco_alteracao{ + +.dispositivo .bloco_alteracao { margin-left: 5em; } +.dispositivo .bloco_alteracao:hover a { + text-decoration: underline; +} + .dispositivo .bloco_alteracao, .dispositivo .bloco_alteracao a, .dispositivo .bloco_alteracao table, .dispositivo .bloco_alteracao table td { color: #018 !important; -} \ No newline at end of file +} + + +.compilacao .top-bar-section li:not(.has-form) a:not(.button), +.compilacao .top-bar { + line-height: 1.6rem; + height: auto; +} +.compilacao .top-bar-section li:not(.has-form) a:not(.button) { + padding: 0 0.43333rem; +} + +.compilacao ul.nav { + background: #34495E; + display:block; + width: 100%; +} + +.compilacao .vigencias{ + margin: 2em 0 0 0; +} diff --git a/templates/compilacao/bloco_alteracao.html b/templates/compilacao/bloco_alteracao.html index 3104bc978..1051b0b6c 100644 --- a/templates/compilacao/bloco_alteracao.html +++ b/templates/compilacao/bloco_alteracao.html @@ -1,18 +1,10 @@ -{% load compilacao_filters %} - +{% load compilacao_filters %} {% for ch in dispositivo.pk|get_bloco %} - -
-
- - {{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }} - - {{ ch.rotulo }} - - {{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }} - - {{ ch.tipo_dispositivo.texto_prefixo_html|safe }} - {{ ch.texto|safe }} -
-
+{% spaceless %} +
+
+ {{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}{{ ch.rotulo }}{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }} +
+
+{% endspaceless %} {% endfor %} \ No newline at end of file diff --git a/templates/compilacao/index.html b/templates/compilacao/index.html index e31422c53..05ba14a41 100644 --- a/templates/compilacao/index.html +++ b/templates/compilacao/index.html @@ -1,16 +1,60 @@ {% extends "base.html" %} {% load i18n %} {% load compilacao_filters %} - - + + {% block title%}

{{ view.get_norma }}

-{% endblock %} +{% endblock %} {% block base_content %} - - {% include 'compilacao/template_render_bloco.html'%} + +
+
+ +
+ +{% include 'compilacao/template_render_bloco.html'%} +
{% endblock base_content %} \ No newline at end of file diff --git a/templates/compilacao/template_render_bloco.html b/templates/compilacao/template_render_bloco.html index bf8e9689a..f797163bd 100644 --- a/templates/compilacao/template_render_bloco.html +++ b/templates/compilacao/template_render_bloco.html @@ -1,41 +1,34 @@ {% load i18n %} -{% load compilacao_filters %} - +{% load compilacao_filters %} -{% for dispositivo in view.get_queryset %} +{% for dispositivo in view.get_queryset %} {% if dispositivo.nivel == view.flag_nivel_old %} -
+ {% elif dispositivo.nivel < view.flag_nivel_old %} {% close_div view.flag_nivel_old dispositivo.nivel %} {% endif%}
- {% spaceless %}
- - {{ dispositivo.tipo_dispositivo.rotulo_prefixo_html|safe }} - {{ dispositivo.rotulo }} - {{ dispositivo.tipo_dispositivo.rotulo_sufixo_html|safe }} - - {{ dispositivo.tipo_dispositivo.texto_prefixo_html|safe }} - {{ dispositivo.texto|safe }} - - {% if dispositivo.norma_publicada_id != None %} - - - {{ dispositivo.tipo_dispositivo.nota_automatica_prefixo_html|safe }} +{% spaceless %} + {{ dispositivo.tipo_dispositivo.rotulo_prefixo_html|safe }} + {{ dispositivo.rotulo }} + {{ dispositivo.tipo_dispositivo.rotulo_sufixo_html|safe }} + {{ dispositivo.tipo_dispositivo.texto_prefixo_html|safe }} + {{ dispositivo.texto|safe }} + {% if dispositivo.norma_publicada_id != None %} + + {{ dispositivo.tipo_dispositivo.nota_automatica_prefixo_html|safe }} {% nota_automatica dispositivo %} - {{ dispositivo.tipo_dispositivo.nota_automatica_sufixo_html|safe }} - + {{ dispositivo.tipo_dispositivo.nota_automatica_sufixo_html|safe }} + + {% endif %} +{% endspaceless %} + {% if view.is_norma_alteradora and dispositivo.tipo_dispositivo.class_css == 'bloco_alteracao'%} + {%with node=dispositivo template_name='compilacao/bloco_alteracao.html' %} + {%include template_name%} + {%endwith%} {% endif%} - {% if view.is_norma_alteradora and dispositivo.tipo_dispositivo.class_css == 'bloco_alteracao'%} - - {%with node=dispositivo template_name='compilacao/bloco_alteracao.html' %} - {%include template_name%} - {%endwith%} - {% endif%}
- {% endspaceless %} - - {% set_nivel_old view dispositivo.nivel %} -{% endfor %} + {% set_nivel_old view dispositivo.nivel %} +{% endfor %} {% close_div view.flag_nivel_old view.flag_nivel_ini %} \ No newline at end of file From 3aa4d4afb18d17a00d2e1c1471cc87b0ab5de204 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Thu, 17 Sep 2015 15:57:30 -0300 Subject: [PATCH 19/32] create timeline compilacao app --- compilacao/templatetags/compilacao_filters.py | 33 +++++++------------ compilacao/urls.py | 4 +++ compilacao/views.py | 19 +++++++++-- templates/compilacao/index.html | 17 ++++------ .../compilacao/template_render_bloco.html | 3 +- 5 files changed, 41 insertions(+), 35 deletions(-) diff --git a/compilacao/templatetags/compilacao_filters.py b/compilacao/templatetags/compilacao_filters.py index 81ad6ea2c..670b31ed8 100644 --- a/compilacao/templatetags/compilacao_filters.py +++ b/compilacao/templatetags/compilacao_filters.py @@ -1,5 +1,3 @@ -from builtins import ValueError - from django import template from django.db.models import Q @@ -18,24 +16,21 @@ def get_bloco(pk_atualizador): @register.filter def get_field(value, key): - try: - return value[key] - except ValueError: - return None - - -@register.filter -def bloco_ja_incluso(view, bloco): - try: - return view.itens_de_bloco.index(bloco) >= 0 - except ValueError: - return False + return value[key] @register.simple_tag -def dispositivo_desativado(dispositivo): - if dispositivo.fim_vigencia is not None: +def dispositivo_desativado(dispositivo, inicio_vigencia, fim_vigencia): + if inicio_vigencia and fim_vigencia: + if dispositivo.fim_vigencia is None: + return '' + if dispositivo.inicio_vigencia >= inicio_vigencia: + return '' return 'desativado' + + else: + if dispositivo.fim_vigencia is not None: + return 'desativado' return '' @@ -55,12 +50,6 @@ def set_nivel_old(view, value): return '' -@register.simple_tag -def append_to_itens_de_bloco(view, value): - view.itens_de_bloco.append(value) - return '' - - @register.simple_tag def close_div(value_max, value_min): return '
' * (int(value_max) - int(value_min) + 1) diff --git a/compilacao/urls.py b/compilacao/urls.py index 0997d5747..3adad4ef6 100644 --- a/compilacao/urls.py +++ b/compilacao/urls.py @@ -5,6 +5,10 @@ from compilacao import views urlpatterns = [ url(r'^norma/(?P[0-9]+)/compilacao/$', views.CompilacaoView.as_view(), name='compilacao'), + url(r'^norma/(?P[0-9]+)/compilacao/vigencia/' + + '(?P[0-9]+)/(?P[0-9]+)/(?P[0-9]+)/' + + '(?P[0-9]+)/(?P[0-9]+)/(?P[0-9]+)/$', + views.CompilacaoView.as_view(), name='vigencia'), url(r'^norma/(?P[0-9]+)/compilacao/(?P[0-9]+)/$', views.DispositivoView.as_view(), name='dispositivo'), ] diff --git a/compilacao/views.py b/compilacao/views.py index e14114f48..a6298330b 100644 --- a/compilacao/views.py +++ b/compilacao/views.py @@ -1,6 +1,7 @@ from collections import OrderedDict -from datetime import timedelta +from datetime import timedelta, datetime, date +from django.db.models import Q from django.views.generic.list import ListView from compilacao.models import Dispositivo @@ -28,13 +29,27 @@ class CompilacaoView(ListView): itens_de_vigencia = {} + inicio_vigencia = None + fim_vigencia = None + def get_queryset(self): self.flag_alteradora = -1 self.flag_nivel_ini = 0 self.flag_nivel_old = -1 - if self.is_norma_alteradora(): + self.inicio_vigencia = None + self.fim_vigencia = None + if 'iyear' in self.kwargs and 'eyear' in self.kwargs: + self.inicio_vigencia = date( + int(self.kwargs['iyear']), + int(self.kwargs['imonth']), + int(self.kwargs['iday'])) + self.fim_vigencia = date( + int(self.kwargs['eyear']), + int(self.kwargs['emonth']), + int(self.kwargs['eday'])) return Dispositivo.objects.filter( + Q(inicio_vigencia__lte=self.fim_vigencia), ordem__gt=0, norma_id=self.kwargs['norma_id'], ).select_related(*DISPOSITIVO_SELECT_RELATED) diff --git a/templates/compilacao/index.html b/templates/compilacao/index.html index 05ba14a41..d0041c8c0 100644 --- a/templates/compilacao/index.html +++ b/templates/compilacao/index.html @@ -7,11 +7,8 @@

{{ view.get_norma }}

{% endblock %} - - {% block base_content %} -