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): 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): 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.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