@ -10,7 +10,7 @@ from django.conf import settings
from django . contrib import messages
from django . contrib . auth . mixins import PermissionRequiredMixin
from django . contrib . contenttypes . models import ContentType
from django . core . exceptions import ValidationError
from django . core . exceptions import ValidationError , PermissionDenied
from django . core . signing import Signer
from django . core . urlresolvers import reverse , reverse_lazy
from django . db import transaction
@ -494,6 +494,18 @@ class TaListView(CompMixin, ListView):
~ Q ( owners = self . request . user . id ) ,
privacidade = STATUS_TA_PRIVATE )
if ' check ' in self . request . GET :
qs = qs . filter (
temp_check_migrations = False ,
privacidade = 0 ,
) . exclude ( dispositivos_set__tipo_dispositivo_id = 3 )
if ' check_dvt ' in self . request . GET :
qs = qs . filter (
) . filter (
dispositivos_set__isnull = False ,
dispositivos_set__dispositivo_vigencia__isnull = True ) . distinct ( )
return qs
@ -565,13 +577,29 @@ class TaDeleteView(CompMixin, DeleteView):
template_name = " crud/confirm_delete.html "
permission_required = ' compilacao.delete_textoarticulado '
def post ( self , request , * args , * * kwargs ) :
if not request . user . is_superuser :
raise PermissionDenied
return DeleteView . post ( self , request , * args , * * kwargs )
@property
def detail_url ( self ) :
return reverse_lazy ( ' sapl.compilacao:ta_detail ' ,
kwargs = { ' pk ' : self . kwargs [ ' pk ' ] } )
def get_success_url ( self ) :
return reverse_lazy ( ' sapl.compilacao:ta_list ' )
messages . info ( self . request , ' Texto Articulado excluido com sucesso! ' )
reverse_url = ' %s : %s _detail ' % (
self . object . content_object . _meta . app_config . name ,
self . object . content_object . _meta . model_name )
return reverse_lazy ( reverse_url ,
kwargs = { ' pk ' : self . object . content_object . pk } )
@property
def title ( self ) :
return ' <b>Texto Articulado:</b> %s ' % self . object
class DispositivoSuccessUrlMixin ( CompMixin ) :
@ -849,6 +877,10 @@ class TextView(CompMixin, ListView):
fim_vigencia = None
ta_vigencia = None
@property
def title ( self ) :
return ' <b>Texto Articulado:</b> %s ' % self . object
def has_permission ( self ) :
self . object = self . ta
return self . object . has_view_permission ( self . request )
@ -1078,7 +1110,7 @@ class TextEditView(CompMixin, TemplateView):
self . object . content_object . save ( )
else :
if ' lock ' in request . GET :
if ' lock ' in request . GET or ' check ' in request . GET :
# TODO - implementar logging de ação de usuário
notificacoes = self . get_notificacoes (
@ -1097,11 +1129,17 @@ class TextEditView(CompMixin, TemplateView):
' sapl.compilacao:ta_text_notificacoes ' , kwargs = {
' ta_id ' : self . object . id } ) )
self . object . editing_locked = True
self . object . privacidade = STATUS_TA_PUBLIC
self . object . save ( )
messages . success ( request , _ (
' Texto Articulado bloqueado com sucesso. ' ) )
if ' lock ' in request . GET :
self . object . editing_locked = True
self . object . privacidade = STATUS_TA_PUBLIC
self . object . save ( )
messages . success ( request , _ (
' Texto Articulado publicado com sucesso. ' ) )
else :
self . object . temp_check_migrations = True
self . object . save ( )
messages . success ( request , _ (
' Texto Articulado Checado... ' ) )
if self . object . content_object :
self . object . content_object . save ( )
@ -2083,6 +2121,10 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
if len ( result ) > 2 :
result . pop ( )
result [ 0 ] [ ' itens ' ] = result [ 1 ] [ ' itens ' ] + result [ 0 ] [ ' itens ' ]
result [ 0 ] [ ' tipo_insert ' ] = ' Inserção '
result [ 1 ] [ ' itens ' ] = [ ]
return result
except Exception as e :
@ -2097,7 +2139,6 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
dvt = Dispositivo . objects . get ( pk = self . kwargs [ ' dispositivo_id ' ] )
if dvt . auto_inserido :
dvt = dvt . dispositivo_pai
try :
Dispositivo . objects . filter (
ta = dvt . ta , ta_publicado__isnull = True
@ -2109,7 +2150,7 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
Dispositivo . objects . filter ( ta_publicado = dvt . ta
) . update (
dispositivo_vigencia = dvt ,
inicio_vigencia = dvt . inicio_efica cia ,
inicio_vigencia = dvt . inicio_vigen cia ,
inicio_eficacia = dvt . inicio_eficacia )
dps = Dispositivo . objects . filter ( dispositivo_vigencia = dvt )
@ -2162,6 +2203,10 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
dp_auto_insert = None
base = Dispositivo . objects . get ( pk = self . kwargs [ ' dispositivo_id ' ] )
if base . dispositivo_atualizador :
registro_inclusao = True
tipo = TipoDispositivo . objects . get ( pk = context [ ' tipo_pk ' ] )
pub_last = Publicacao . objects . order_by (
' data ' , ' hora ' ) . filter ( ta = base . ta ) . last ( )
@ -2197,11 +2242,13 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
dp_pai = dp
if dp_irmao is not None :
dp = Dispositivo . new_instance_based_on ( dp_irmao , tipo )
dp = Dispositivo . new_instance_based_on (
dp_irmao , tipo , base_alteracao = base )
dp . transform_in_next ( variacao )
else :
# Inserção sem precedente
dp = Dispositivo . new_instance_based_on ( dp_pai , tipo )
dp = Dispositivo . new_instance_based_on (
dp_pai , tipo , base_alteracao = base )
dp . dispositivo_pai = dp_pai
dp . nivel + = 1
@ -2224,6 +2271,9 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
else :
dp . set_numero_completo ( [ 1 , 0 , 0 , 0 , 0 , 0 , ] )
if dp . dispositivo_atualizador :
registro_inclusao = True
# verificar se existe restrição de quantidade de itens
if dp . dispositivo_pai :
for perfil in perfil_parents :
@ -2262,7 +2312,8 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
dp . incrementar_irmaos ( variacao , [ local_add , ] , force = False )
dp . publicacao = pub_last
dp . save ( )
dp . save ( clean = not registro_inclusao )
count_auto_insert = 0
if create_auto_inserts :
@ -2314,6 +2365,10 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
ordem + = Dispositivo . INTERVALO_ORDEM
dp = Dispositivo . objects . get ( pk = dp_pk )
dp . ta_publicado = None
dp . dispositivo_atualizador = None
dp . ordem_bloco_atualizador = 0
dp . save ( clean = False )
''' Reenquadrar todos os dispositivos que possuem pai
antes da inserção atual e que são inferiores a dp ,
@ -2624,8 +2679,12 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
ds = d
while ds . dispositivo_subsequente :
ds = ds . dispositivo_subsequente
dsps_ids . add ( ds . pk )
if revogacao and ds . dispositivo_de_revogacao :
dsps_ids . remove ( ds . pk )
if em_bloco :
proximo_bloco = Dispositivo . objects . filter (
ordem__gt = ds . ordem ,
@ -2636,9 +2695,18 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
' ta_id ' : ds . ta_id ,
' nivel__gte ' : ds . nivel ,
' ordem__gte ' : ds . ordem ,
' dispositivo_subsequente__isnull ' : True
' dispositivo_subsequente__isnull ' : True ,
}
if revogacao :
params . update (
{
' dispositivo_de_revogacao ' : False ,
' tipo_dispositivo__dispositivo_de_articulacao ' : False
}
)
if proximo_bloco :
params [ ' ordem__lt ' ] = proximo_bloco . ordem
@ -2655,9 +2723,9 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
dsps_ids = Dispositivo . objects . filter (
id__in = dsps_ids
) . values_list ( ' id ' , flat = " True " )
for dsp in dsps_ids :
with transaction . atomic ( ) :
) . values_list ( ' id ' , flat = " True " ) . order_by ( ' ordem ' )
with transaction . atomic ( ) :
for dsp in dsps_ids :
data . update (
self . registra_alteracao (
bloco_alteracao ,
@ -2713,10 +2781,10 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
if ndp . dispositivo_vigencia :
ndp . inicio_eficacia = ndp . dispositivo_vigencia . inicio_eficacia
ndp . inicio_vigencia = ndp . dispositivo_vigencia . inicio_efica cia
ndp . inicio_vigencia = ndp . dispositivo_vigencia . inicio_vigen cia
else :
ndp . inicio_eficacia = bloco_alteracao . inicio_eficacia
ndp . inicio_vigencia = bloco_alteracao . inicio_efica cia
ndp . inicio_vigencia = bloco_alteracao . inicio_vigen cia
try :
ordem = dsp_a_alterar . criar_espaco (
@ -2748,6 +2816,7 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
) . ordem_bloco_atualizador + Dispositivo . INTERVALO_ORDEM
else :
ndp . ordem_bloco_atualizador = Dispositivo . INTERVALO_ORDEM
ndp . save ( )
p . dispositivo_subsequente = ndp
@ -2765,10 +2834,10 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
filhos_diretos = dsp_a_alterar . dispositivos_filhos_set
for d in filhos_diretos . all ( ) :
d . dispositivo_pai = ndp
d . save ( )
d . save ( clean = False )
ndp . ta . reordenar_dispositivos ( )
bloco_alteracao . ordenar_bloco_alteracao ( )
# ndp.ta.reordenar_dispositivos( )
# bloco_alteracao.ordenar_bloco_alteracao( )
if not revogacao :
if ' message ' not in data :
@ -2980,201 +3049,172 @@ class DispositivoSearchFragmentFormView(ListView):
itens . append ( item )
return JsonResponse ( itens , safe = False )
response = ListView . get ( self , request , * args , * * kwargs )
if not self . object_list or \
not isinstance ( self . object_list , list ) and \
not self . object_list . exists ( ) :
messages . info (
request , _ ( ' Não foram encontrados resultados '
' com seus critérios de busca! ' ) )
username = self . request . user . username
self . logger . error ( " user= " + username + " . Não foram encontrados "
" resultados com esses critérios de busca. "
" id_tipo_ta= " . format ( request . GET [ ' tipo_ta ' ] ) )
try :
r = response . render ( )
return response
except Exception as e :
messages . error ( request , " Erro - %s " % str ( e ) )
context = { }
self . template_name = ' compilacao/messages.html '
username = self . request . user . username
self . logger . error ( " user= " + username + " . " + str ( e ) )
return self . render_to_response ( context )
return ListView . get ( self , request , * args , * * kwargs )
def get_queryset ( self ) :
try :
n = 10
if ' max_results ' in self . request . GET :
n = int ( self . request . GET [ ' max_results ' ] )
q = Q ( )
if ' initial_ref ' in self . request . GET :
initial_ref = self . request . GET [ ' initial_ref ' ]
if initial_ref :
q = q & Q ( pk = initial_ref )
result = Dispositivo . objects . filter ( q ) . select_related (
' ta ' ) . exclude (
tipo_dispositivo__dispositivo_de_alteracao = True )
return result [ : n ]
str_texto = ' '
texto = ' '
rotulo = ' '
num_ta = ' '
ano_ta = ' '
if ' texto ' in self . request . GET :
str_texto = self . request . GET [ ' texto ' ]
result = [ ]
try :
tipo_model = self . request . GET . get ( ' tipo_model ' , ' ' )
limit = int ( self . request . GET . get ( ' max_results ' , 100 ) )
tipo_ta = self . request . GET . get ( ' tipo_ta ' , ' ' )
num_ta = self . request . GET . get ( ' num_ta ' , ' ' )
ano_ta = self . request . GET . get ( ' ano_ta ' , ' ' )
rotulo = self . request . GET . get ( ' rotulo ' , ' ' )
str_texto = self . request . GET . get ( ' texto ' , ' ' )
texto = str_texto . split ( ' ' )
if ' rotulo ' in self . request . GET :
rotulo = self . request . GET [ ' rotulo ' ]
if rotulo :
q = q & Q ( rotulo__icontains = rotulo )
for item in texto :
if not item :
continue
if q :
q = q & ( Q ( texto__icontains = item ) |
Q ( texto_atualizador__icontains = item ) )
else :
q = ( Q ( texto__icontains = item ) |
Q ( texto_atualizador__icontains = item ) )
if ' tipo_ta ' in self . request . GET :
tipo_ta = self . request . GET [ ' tipo_ta ' ]
if tipo_ta :
q = q & Q ( ta__tipo_ta_id = tipo_ta )
if ' num_ta ' in self . request . GET :
num_ta = self . request . GET [ ' num_ta ' ]
if num_ta :
q = q & Q ( ta__numero = num_ta )
if ' ano_ta ' in self . request . GET :
ano_ta = self . request . GET [ ' ano_ta ' ]
if ano_ta :
q = q & Q ( ta__ano = ano_ta )
if not q . children and not n :
n = 10
q = q & Q ( nivel__gt = 0 )
result = Dispositivo . objects . order_by (
' -ta__data ' ,
' -ta__ano ' ,
' -ta__numero ' ,
' ta ' ,
' ordem ' ) . filter ( q ) . select_related ( ' ta ' )
if ' data_type_selection ' in self . request . GET and \
self . request . GET [ ' data_type_selection ' ] == ' checkbox ' :
result = result . exclude (
tipo_dispositivo__dispositivo_de_alteracao = True )
else :
if ' data_function ' in self . request . GET and \
self . request . GET [ ' data_function ' ] == ' alterador ' :
result = result . exclude (
tipo_dispositivo__dispositivo_de_alteracao = False ,
)
result = result . exclude (
tipo_dispositivo__dispositivo_de_articulacao = False ,
)
print ( str ( result . query ) )
def resultados ( r ) :
if n :
return r [ : n ]
else :
return r
tipo_resultado = self . request . GET . get ( ' tipo_resultado ' , ' ' )
tipo_resultado = ' ' if tipo_resultado == ' False ' else tipo_resultado
""" if num_ta and ano_ta and not rotulo and not str_texto and \
' data_type_selection ' in self . request . GET and \
self . request . GET [ ' data_type_selection ' ] == ' checkbox ' :
return r
else :
return r [ : n ] """
model_class = None
if ' tipo_model ' not in self . request . GET :
return resultados ( result )
if tipo_ta :
tipo_ta = TipoTextoArticulado . objects . get ( pk = tipo_ta )
if tipo_ta and tipo_model :
integrations_view_names = get_integrations_view_names ( )
for item in integrations_view_names :
if hasattr ( item , ' model_type_foreignkey ' ) and \
hasattr ( item , ' model ' ) :
if ( tipo_ta . content_type . model ==
item . model . __name__ . lower ( ) and
tipo_ta . content_type . app_label ==
item . model . _meta . app_label ) :
model_class = item . model
model_type_class = item . model_type_foreignkey
tipo_model = item . model_type_foreignkey . objects . get (
pk = tipo_model )
break
tipo_model = self . request . GET [ ' tipo_model ' ]
if not tipo_model :
return resultados ( result )
column_field = ' '
if model_class :
for field in model_class . _meta . fields :
if field . related_model == model_type_class :
column_field = field . column
break
integrations_view_names = get_integrations_view_names ( )
dts = self . request . GET . get ( ' data_type_selection ' , ' ' )
df = self . request . GET . get ( ' data_function ' , ' ' )
tipo_ta = TipoTextoArticulado . objects . get ( pk = tipo_ta )
AND_CONTROLS = ' '
if dts == ' checkbox ' :
AND_CONTROLS = ' AND td.dispositivo_de_alteracao = false '
else :
if df == ' alterador ' :
AND_CONTROLS = ''' AND td.dispositivo_de_alteracao = true
AND td . dispositivo_de_articulacao = true '''
texto = list ( map ( " d.texto ~* ' {} ' " . format , texto ) )
AND_TEXTO_ROTULO = ' '
if str_texto and rotulo :
AND_TEXTO_ROTULO = ''' AND ( ( {BUSCA_TEXTO} AND d.rotulo ~* ' {BUSCA_ROTULO} ' ) OR
( { BUSCA_TEXTO } AND d . rotulo = ' ' AND dp . rotulo ~ * ' {BUSCA_ROTULO} ' )
) ''' .format(
BUSCA_TEXTO = ' AND ' . join ( texto ) ,
BUSCA_ROTULO = rotulo
)
elif str_texto :
AND_TEXTO_ROTULO = ' AND ' . join ( texto )
elif rotulo :
AND_TEXTO_ROTULO = " AND d.rotulo ~* ' {BUSCA_ROTULO} ' " . format (
BUSCA_ROTULO = rotulo )
jtms = ' ' # JOIN_TYPE_MODEL_SELECTED
atms = ' ' # AND_TYPE_MODEL_SELECTED
if tipo_model :
jtms = ' JOIN {gfk_table} gfkt on (gfkt.id = ta.object_id) ' . format (
gfk_table = model_class . _meta . db_table )
atms = ' AND gfkt. {gfk_field_type} = {gfk_field_type_id} ' . format (
gfk_field_type = column_field ,
gfk_field_type_id = tipo_model . id ,
)
model_class = None
for item in integrations_view_names :
if hasattr ( item , ' model_type_foreignkey ' ) and \
hasattr ( item , ' model ' ) :
if ( tipo_ta . content_type . model ==
item . model . __name__ . lower ( ) and
tipo_ta . content_type . app_label ==
item . model . _meta . app_label ) :
model_class = item . model
model_type_class = item . model_type_foreignkey
tipo_model = item . model_type_foreignkey . objects . get (
pk = tipo_model )
break
sql = '''
SELECT d . * FROM compilacao_dispositivo d
JOIN compilacao_dispositivo dp on ( d . dispositivo_pai_id = dp . id )
JOIN compilacao_tipodispositivo td on ( d . tipo_dispositivo_id = td . id )
JOIN compilacao_textoarticulado ta on ( d . ta_id = ta . id )
{ JOIN_TYPE_MODEL_SELECTED }
where d . nivel > 0
{ AND_TYPE_MODEL_SELECTED }
{ AND_TEXTO_ROTULO }
{ AND1_NUMERO }
{ AND2_ANO }
{ AND3_TIPO_TA }
{ AND_CONTROLS }
order by ta . data desc ,
ta . numero desc ,
ta . id desc ,
d . ordem
{ limit } ;
''' .format(
limit = ' limit {} ' . format ( limit ) if limit else ' ' ,
JOIN_TYPE_MODEL_SELECTED = jtms ,
AND_TYPE_MODEL_SELECTED = atms ,
AND3_TIPO_TA = " AND ta.tipo_ta_id = {} " . format (
tipo_ta . id ) if tipo_ta else ' ' ,
AND2_ANO = " AND ta.ano = {} " . format (
ano_ta ) if ano_ta else ' ' ,
AND1_NUMERO = " AND ta.numero ~* ' {} ' " . format (
num_ta ) if num_ta else ' ' ,
AND_TEXTO_ROTULO = AND_TEXTO_ROTULO if AND_TEXTO_ROTULO else ' ' ,
AND_CONTROLS = AND_CONTROLS if AND_CONTROLS else ' '
)
if not model_class :
return resultados ( result )
result = Dispositivo . objects . raw ( sql )
column_field = ' '
for field in model_class . _meta . fields :
if field . related_model == model_type_class :
column_field = field . column
break
r = [ ]
ids = set ( )
if not column_field :
return resultados ( result )
def proc_dispositivos ( ds ) :
r = [ ]
for d in ds :
"""
ao integrar um model ao app de compilação , se este model possuir
if d . id not in ids :
r . append ( d )
ids . add ( d . id )
texto_articulado = GenericRelation (
TextoArticulado , related_query_name = ' texto_articulado ' )
if tipo_resultado == ' I ' :
if ds != result :
d . I = True
proc_dispositivos ( d . dispositivos_filhos_set . filter (
tipo_dispositivo__dispositivo_de_alteracao = False
) )
elif tipo_resultado == ' S ' and ds == result :
será uma integração mais eficiente para as buscas de Dispositivos
"""
if hasattr ( model_class , ' texto_articulado ' ) :
q = q & Q ( * * {
' ta__texto_articulado__ ' + column_field : tipo_model . pk
} )
if n :
result = result . filter ( q ) [ : n ]
else :
result = result . filter ( q )
seq = Dispositivo . objects . filter (
ta = d . ta ,
ordem__gt = d . ordem ,
nivel__gt = 0 ,
tipo_dispositivo__dispositivo_de_alteracao = False
)
proc_dispositivos ( seq [ : limit ] )
for d in result :
if not d . ta . content_object or \
not hasattr ( d . ta . content_object , column_field ) :
continue
elif tipo_resultado == ' S ' :
d . S = True
if tipo_model . pk == getattr ( d . ta . content_object , column_field ) :
r . append ( d )
proc_dispositivos ( result )
if ( len ( r ) == n and ( not num_ta or
not ano_ta or rotulo or str_texto ) ) :
break
return r
except Exception as e :
username = self . request . user . username
self . logger . error ( " user= " + username + " . " + str ( e ) )
return [ ]
pass
class DispositivoSearchModalView ( FormView ) :