from django.db import models from django.template import defaultfilters from django.utils.translation import ugettext_lazy as _ from model_utils import Choices from materia.models import MateriaLegislativa from sapl.utils import RANGE_ANOS, YES_NO_CHOICES class AssuntoNorma(models.Model): assunto = models.CharField(max_length=50, verbose_name=_('Assunto')) descricao = models.CharField( max_length=250, blank=True, verbose_name=_('Descrição')) class Meta: verbose_name = _('Assunto de Norma') verbose_name_plural = _('Assuntos de Norma') def __str__(self): return self.assunto class TipoNormaJuridica(models.Model): # TODO transform into Domain Model and use an FK for the field EQUIVALENTE_LEXML_CHOICES = ((name, name) for name in ('constituicao', 'ementa.constitucional', 'lei.complementar', 'lei.delegada', 'lei', 'decreto.lei', 'medida.provisoria', 'decreto', 'lei.organica', 'emenda.lei.organica', 'decreto.legislativo', 'resolucao', 'regimento.interno', )) equivalente_lexml = models.CharField( max_length=50, blank=True, verbose_name=_('Equivalente LexML'), choices=EQUIVALENTE_LEXML_CHOICES) sigla = models.CharField(max_length=3, verbose_name=_('Sigla')) descricao = models.CharField(max_length=50, verbose_name=_('Descrição')) class Meta: verbose_name = _('Tipo de Norma Jurídica') verbose_name_plural = _('Tipos de Norma Jurídica') def __str__(self): return self.descricao def get_norma_media_path(instance, subpath, filename): return './norma/%s/%s/%s' % (instance, subpath, filename) def texto_upload_path(instance, filename): return get_norma_media_path(instance, instance.ano, filename) class NormaJuridica(models.Model): ESFERA_FEDERACAO_CHOICES = Choices( ('E', 'estadual', _('Estadual')), ('F', 'federal', _('Federal')), ('M', 'municipal', _('Municipal')), ) texto_integral = models.FileField( blank=True, null=True, upload_to=texto_upload_path, verbose_name=_('Texto Integral')) tipo = models.ForeignKey( TipoNormaJuridica, verbose_name=_('Tipo da Norma Juridica')) materia = models.ForeignKey(MateriaLegislativa, blank=True, null=True) numero = models.PositiveIntegerField(verbose_name=_('Número')) ano = models.PositiveSmallIntegerField(verbose_name=_('Ano'), choices=RANGE_ANOS) esfera_federacao = models.CharField( max_length=1, verbose_name=_('Esfera Federação'), choices=ESFERA_FEDERACAO_CHOICES) data = models.DateField(verbose_name=_('Data')) data_publicacao = models.DateField( blank=True, null=True, verbose_name=_('Data Publicação')) veiculo_publicacao = models.CharField( max_length=30, blank=True, verbose_name=_('Veículo Publicação')) pagina_inicio_publicacao = models.PositiveIntegerField( blank=True, null=True, verbose_name=_('Pg. Início')) pagina_fim_publicacao = models.PositiveIntegerField( blank=True, null=True, verbose_name=_('Pg. Fim')) ementa = models.TextField(verbose_name=_('Ementa')) indexacao = models.TextField( blank=True, verbose_name=_('Indexação')) observacao = models.TextField( blank=True, verbose_name=_('Observação')) complemento = models.NullBooleanField( blank=True, verbose_name=_('Complementar ?'), choices=YES_NO_CHOICES) # XXX was a CharField (attention on migrate) assuntos = models.ManyToManyField( AssuntoNorma, through='AssuntoNormaRelationship') data_vigencia = models.DateField(blank=True, null=True) timestamp = models.DateTimeField() class Meta: verbose_name = _('Norma Jurídica') verbose_name_plural = _('Normas Jurídicas') ordering = ['-data', '-numero'] def __str__(self): return _('%(tipo)s nº %(numero)s de %(data)s') % { 'tipo': self.tipo, 'numero': self.numero, 'data': defaultfilters.date(self.data, "d \d\e F \d\e Y")} 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) norma = models.ForeignKey(NormaJuridica) disposicoes = models.CharField( max_length=15, blank=True, verbose_name=_('Disposição')) parte = models.CharField( max_length=8, blank=True, verbose_name=_('Parte')) livro = models.CharField( max_length=7, blank=True, verbose_name=_('Livro')) titulo = models.CharField( max_length=7, blank=True, verbose_name=_('Título')) capitulo = models.CharField( max_length=7, blank=True, verbose_name=_('Capítulo')) secao = models.CharField( max_length=7, blank=True, verbose_name=_('Seção')) subsecao = models.CharField( max_length=7, blank=True, verbose_name=_('Subseção')) artigo = models.CharField( max_length=4, blank=True, verbose_name=_('Artigo')) paragrafo = models.CharField( max_length=3, blank=True, verbose_name=_('Parágrafo')) inciso = models.CharField( max_length=10, blank=True, verbose_name=_('Inciso')) alinea = models.CharField( max_length=3, blank=True, verbose_name=_('Alínea')) item = models.CharField( max_length=3, blank=True, verbose_name=_('Item')) class Meta: verbose_name = _('Matéria Legislativa') verbose_name_plural = _('Matérias Legislativas') class VinculoNormaJuridica(models.Model): TIPO_VINCULO_CHOICES = ( ('A', _('Altera a norma')), ('R', _('Revoga a norma')), ('P', _('Revoga parcialmente a norma')), ('T', _('Revoga por consolidação a norma')), ('C', _('Norma correlata')), ('I', _('Suspende a execução da norma')), ('G', _('Regulamenta a norma')), ) # TODO M2M ??? norma_referente = models.ForeignKey(NormaJuridica, related_name='+') norma_referida = models.ForeignKey(NormaJuridica, related_name='+') tipo_vinculo = models.CharField( max_length=1, blank=True, choices=TIPO_VINCULO_CHOICES) class Meta: verbose_name = _('Vínculo entre Normas Jurídicas') verbose_name_plural = _('Vínculos entre Normas Jurídicas') def __str__(self): return _('Referente: %(referente)s \n' 'Referida: %(referida)s \nVínculo: %(vinculo)s') % { 'referente': self.norma_referente, 'referida': self.norma_referida, 'vinculo': self.tipo_vinculo}