Browse Source

Ref list de prop nao recebidas/não incorp/incorp.

pull/854/head
LeandroRoberto 8 years ago
committed by Eduardo Edson Batista Cordeiro Alves
parent
commit
4b733be859
  1. 14
      sapl/crud/base.py
  2. 19
      sapl/materia/migrations/0071_auto_20161130_1001.py
  3. 19
      sapl/materia/migrations/0072_auto_20161130_1618.py
  4. 8
      sapl/materia/models.py
  5. 43
      sapl/materia/views.py
  6. 15
      sapl/rules/__init__.py
  7. 20
      sapl/rules/map_rules.py
  8. 9
      sapl/templates/materia/prop_devolvidas_list.html
  9. 16
      sapl/templates/materia/proposicao_detail.html

14
sapl/crud/base.py

@ -180,7 +180,15 @@ class PermissionRequiredContainerCrudMixin(PermissionRequiredMixin):
perms = self.get_permission_required()
# Torna a view pública se não possuir conteudo
# no atributo permission_required
return self.request.user.has_perms(perms) if len(perms) else True
if not len(perms):
return True
for perm in perms:
if self.request.user.has_perm(perm):
return True
return False
# return self.request.user.has_perms(perms) if len(perms) else True
def dispatch(self, request, *args, **kwargs):
if not self.has_permission():
@ -257,9 +265,7 @@ class CrudBaseMixin(CrispyLayoutFormMixin):
self.permission_required = list(
set(self.permission_required) - set(obj.public))
else:
obj.public = list(
set(self.permission_required) -
set((RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE)))
obj.public = []
self.permission_required = tuple((
self.permission(pr) for pr in self.permission_required))

19
sapl/materia/migrations/0071_auto_20161130_1001.py

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.11 on 2016-11-30 10:01
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('materia', '0070_auto_20161111_1301'),
]
operations = [
migrations.AlterModelOptions(
name='proposicao',
options={'permissions': (('detail_proposicao_enviada', 'Pode acessar detalhes de uma proposição enviada.'), ('detail_proposicao_devolvida', 'Pode acessar detalhes de uma proposição devolvida.')), 'verbose_name': 'Proposição', 'verbose_name_plural': 'Proposições'},
),
]

19
sapl/materia/migrations/0072_auto_20161130_1618.py

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.11 on 2016-11-30 16:18
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('materia', '0071_auto_20161130_1001'),
]
operations = [
migrations.AlterModelOptions(
name='proposicao',
options={'permissions': (('detail_proposicao_enviada', 'Pode acessar detalhes de uma proposição enviada.'), ('detail_proposicao_devolvida', 'Pode acessar detalhes de uma proposição devolvida.'), ('detail_proposicao_incorporada', 'Pode acessar detalhes de uma proposição incorporada.')), 'verbose_name': 'Proposição', 'verbose_name_plural': 'Proposições'},
),
]

8
sapl/materia/models.py

@ -598,6 +598,14 @@ class Proposicao(models.Model):
verbose_name = _('Proposição')
verbose_name_plural = _('Proposições')
unique_together = (('content_type', 'object_id'), )
permissions = (
('detail_proposicao_enviada',
_('Pode acessar detalhes de uma proposição enviada.')),
('detail_proposicao_devolvida',
_('Pode acessar detalhes de uma proposição devolvida.')),
('detail_proposicao_incorporada',
_('Pode acessar detalhes de uma proposição incorporada.')),
)
def __str__(self):
return '%s %s/%s' % (Proposicao._meta.verbose_name,

43
sapl/materia/views.py

@ -252,7 +252,7 @@ class ProposicaoDevolvida(PermissionRequiredMixin, ListView):
model = Proposicao
ordering = ['data_envio']
paginate_by = 10
permission_required = ('materia.list_proposicao', )
permission_required = ('materia.detail_proposicao_devolvida', )
def get_queryset(self):
return Proposicao.objects.filter(
@ -276,7 +276,7 @@ class ProposicaoPendente(PermissionRequiredMixin, ListView):
model = Proposicao
ordering = ['data_envio', 'autor', 'tipo', 'descricao']
paginate_by = 10
permission_required = ('materia.list_proposicao', )
permission_required = ('materia.detail_proposicao_enviada', )
def get_queryset(self):
return Proposicao.objects.filter(
@ -301,7 +301,7 @@ class ProposicaoRecebida(PermissionRequiredMixin, ListView):
model = Proposicao
ordering = ['data_envio']
paginate_by = 10
permission_required = ('materia.list_proposicao', )
permission_required = 'materia.detail_proposicao_incorporada'
def get_queryset(self):
return Proposicao.objects.filter(
@ -473,10 +473,16 @@ class ProposicaoCrud(Crud):
class DetailView(Crud.DetailView):
layout_key = 'Proposicao'
permission_required = (RP_DETAIL, 'materia.detail_proposicao_enviada',
'materia.detail_proposicao_devolvida',
'materia.detail_proposicao_incorporada')
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['subnav_template_name'] = ''
context['title'] = '%s <small>(%s)</small>' % (
self.object, self.object.autor)
return context
def get(self, request, *args, **kwargs):
@ -536,6 +542,37 @@ class ProposicaoCrud(Crud):
return redirect(reverse('sapl.materia:proposicao_detail',
kwargs={'pk': kwargs['pk']}))
def dispatch(self, request, *args, **kwargs):
try:
p = Proposicao.objects.get(id=kwargs['pk'])
except:
raise Http404()
if not self.has_permission():
return self.handle_no_permission()
if p.autor.user != request.user:
if not p.data_envio and not p.data_devolucao:
raise Http404()
if p.data_devolucao and not request.user.has_perm(
'materia.detail_proposicao_devolvida'):
raise Http404()
if p.data_envio and not p.data_recebimento\
and not request.user.has_perm(
'materia.detail_proposicao_enviada'):
raise Http404()
if p.data_envio and p.data_recebimento\
and not request.user.has_perm(
'materia.detail_proposicao_incorporada'):
raise Http404()
return super(PermissionRequiredMixin, self).dispatch(
request, *args, **kwargs)
class DeleteView(BaseLocalMixin, Crud.DeleteView):
def _action_is_valid(self, request, *args, **kwargs):

15
sapl/rules/__init__.py

@ -2,6 +2,21 @@ from django.utils.translation import ugettext_lazy as _
default_app_config = 'sapl.rules.apps.AppConfig'
"""
Os cinco radicais de permissão completa são:
RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE =\
'.list_', '.detail_', '.add_', '.change_', '.delete_',
Tanto a app crud quanto a app rules estão sempre ligadas a um model. Ao lidar
com permissões, sempre é analisado se é apenas um radical ou permissão
completa, sendo apenas um radical, a permissão completa é montada com base
no model associado.
"""
RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE =\
'.list_', '.detail_', '.add_', '.change_', '.delete_',
SAPL_GROUP_ADMINISTRATIVO = _("Operador Administrativo")
SAPL_GROUP_PROTOCOLO = _("Operador de Protocolo Administrativo")

20
sapl/rules/map_rules.py

@ -12,7 +12,9 @@ from sapl.rules import (SAPL_GROUP_ADMINISTRATIVO, SAPL_GROUP_ANONYMOUS,
SAPL_GROUP_GERAL, SAPL_GROUP_LOGIN_SOCIAL,
SAPL_GROUP_MATERIA, SAPL_GROUP_NORMA,
SAPL_GROUP_PAINEL, SAPL_GROUP_PARLAMENTAR,
SAPL_GROUP_PROTOCOLO, SAPL_GROUP_SESSAO)
SAPL_GROUP_PROTOCOLO, SAPL_GROUP_SESSAO,
RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE)
from sapl.sessao import models as sessao
"""
@ -42,20 +44,8 @@ arquivo (sapl.rules.map_rules.py) e criar os grupos definidos na regra de
negócio trabalham com os cinco radiais de permissão
e com qualquer outro tipo de permissão customizada, nesta ordem de precedência.
Os cinco radicais de permissão completa são:
RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE =\
'.list_', '.detail_', '.add_', '.change_', '.delete_',
Tanto a app crud quanto a app rules estão sempre ligadas a um model. Ao lidar
com permissões, sempre é analisado se é apenas um radical ou permissão
completa, sendo apenas um radical, a permissão completa é montada com base
no model associado.
"""
RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE =\
'.list_', '.detail_', '.add_', '.change_', '.delete_',
__base__ = [RP_LIST, RP_DETAIL, RP_ADD, RP_CHANGE, RP_DELETE]
__listdetailchange__ = [RP_LIST, RP_DETAIL, RP_CHANGE]
@ -83,7 +73,9 @@ rules_group_protocolo = {
(materia.Anexada, __base__),
(materia.Autoria, __base__),
(materia.Proposicao, __listdetailchange__),
(materia.Proposicao, ['detail_proposicao_enviada',
'detail_proposicao_devolvida',
'detail_proposicao_incorporada']),
(compilacao.TextoArticulado, ['view_restricted_textoarticulado'])
]
}

9
sapl/templates/materia/prop_devolvidas_list.html

@ -14,7 +14,7 @@
<th>Tipo</th>
<th>Descrição</th>
<th>Autor</th>
<th>Vínculo</th>
<th>Motivo da Devolução</th>
</tr>
</thead>
<tbody>
@ -24,12 +24,7 @@
<td>{{ prop.tipo.descricao }}</td>
<td>{{ prop.descricao }}</td>
<td>{{ prop.autor }}</td>
<td>
{% if prop.materia_gerada %}
<a href="{% url 'sapl.materia:materialegislativa_detail' prop.materia_gerada.pk %}">{{ prop.materia_gerada.tipo.sigla }} {{ prop.materia_gerada.numero }}/{{ prop.materia_gerada.ano }}</a>
{% elif prop.documento_gerado %}
<a href="{% url 'sapl.materia:documentoacessorio_detail' prop.documento_gerado.pk %}">{{ prop.documento_gerado.materia.tipo.sigla }} {{ prop.documento_gerado.materia.numero }}/{{ prop.documento_gerado.materia.ano }}</a>
{% endif %}
<td>{{ prop.justificativa_devolucao}}
</td>
</tr>
{% endfor %}

16
sapl/templates/materia/proposicao_detail.html

@ -15,14 +15,16 @@
{% block editions %}
{% if object.data_envio %}
{% block editions_actions_return %}
<div class="actions btn-group" role="group">
<a class="btn btn-default" onclick="window.open('{% url 'sapl.materia:recibo-proposicao' object.pk %}','Recibo','width=1100, height=600, scrollbars=yes')">{% trans "Recibo de Envio" %}</a>
{% if not object.data_recebimento %}
<a href="{{ view.detail_url }}?action=return" class="btn btn-default btn-excluir">{% trans 'Retornar Proposição Enviada' %}</a>
{% endif %}
</div>
{% if user == object.autor.user %}
{% block editions_actions_return %}
<div class="actions btn-group" role="group">
<a class="btn btn-default" onclick="window.open('{% url 'sapl.materia:recibo-proposicao' object.pk %}','Recibo','width=1100, height=600, scrollbars=yes')">{% trans "Recibo de Envio" %}</a>
{% if not object.data_recebimento %}
<a href="{{ view.detail_url }}?action=return" class="btn btn-default btn-excluir">{% trans 'Retornar Proposição Enviada' %}</a>
{% endif %}
</div>
{% endblock %}
{% endif %}
{% else %}

Loading…
Cancel
Save