diff --git a/sapl/api/views.py b/sapl/api/views.py
index 9ddafb9ec..b9f0a2403 100644
--- a/sapl/api/views.py
+++ b/sapl/api/views.py
@@ -383,7 +383,7 @@ class _ProposicaoViewSet():
q = Q(data_recebimento__isnull=False, object_id__isnull=False)
if not self.request.user.is_anonymous():
- q |= Q(autor__user=self.request.user)
+ q |= Q(autor__autoruser__user=self.request.user)
qs = qs.filter(q)
return qs
diff --git a/sapl/base/forms.py b/sapl/base/forms.py
index eeed61860..deba48775 100644
--- a/sapl/base/forms.py
+++ b/sapl/base/forms.py
@@ -1947,4 +1947,25 @@ class AutorUserForm(ModelForm):
user = User.objects.get(username=cd['username'])
autor = cd['autor']
autor_user = AutorUser.objects.create(autor=autor, user=user)
+
+
+ ####################################
+ # TODO: Isto é necessário?
+ # if not autor.tipo.content_type:
+ # autor.content_type = None
+ # autor.object_id = None
+ # autor.autor_related = None
+ # else:
+ # autor.autor_related = autor.tipo.content_type.model_class(
+ # ).objects.get(pk=self.cleaned_data['autor_related'])
+ # autor.nome = str(autor.autor_related)
+
+ # autor.save()
+ ####################################
+
+ # FIXME melhorar captura de grupo de Autor, levando em conta,
+ # no mínimo, a tradução.
+ grupo = Group.objects.filter(name='Autor')[0]
+ user.groups.add(grupo)
+
return autor_user
\ No newline at end of file
diff --git a/sapl/base/migrations/0042_remove_autor_user.py b/sapl/base/migrations/0042_remove_autor_user.py
new file mode 100644
index 000000000..990c0313f
--- /dev/null
+++ b/sapl/base/migrations/0042_remove_autor_user.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.20 on 2019-09-11 20:01
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('base', '0041_auto_20190911_1541'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='autor',
+ name='user',
+ ),
+ ]
diff --git a/sapl/base/models.py b/sapl/base/models.py
index 3b64fb33f..999215440 100644
--- a/sapl/base/models.py
+++ b/sapl/base/models.py
@@ -212,10 +212,6 @@ class TipoAutor(models.Model):
@reversion.register()
class Autor(models.Model):
- user = models.OneToOneField(get_settings_auth_user_model(),
- on_delete=models.SET_NULL,
- null=True)
-
tipo = models.ForeignKey(TipoAutor, verbose_name=_('Tipo do Autor'),
on_delete=models.PROTECT)
@@ -246,8 +242,6 @@ class Autor(models.Model):
return '{} - {}'.format(self.nome, self.cargo)
else:
return str(self.nome)
- if self.user:
- return str(self.user.username)
return '?'
diff --git a/sapl/base/views.py b/sapl/base/views.py
index a95a9c7e8..546ce97ff 100644
--- a/sapl/base/views.py
+++ b/sapl/base/views.py
@@ -1641,12 +1641,6 @@ def get_estatistica(request):
return JsonResponse(json_dict)
-def deleta_autoruser(request):
- pk = int(request.GET['pk'])
- AutorUser.objects.get(pk=pk).delete()
- return JsonResponse({})
-
-
class ListarMandatoSemDataInicioView(PermissionRequiredMixin, ListView):
model = get_user_model()
template_name = 'base/mandato_sem_data_inicio.html'
@@ -2284,6 +2278,19 @@ class RelatorioNormasPorAutorView(RelatorioMixin, FilterView):
return context
+def deleta_autoruser(request):
+ pk = int(request.GET['pk'])
+ autor_user = AutorUser.objects.get(pk=pk)
+
+ # FIXME melhorar captura de grupo de Autor, levando em conta,
+ # no mínimo, a tradução.
+ grupo = Group.objects.filter(name='Autor')[0]
+ autor_user.user.groups.remove(grupo)
+
+ autor_user.delete()
+ return JsonResponse({})
+
+
class AutorUserFormView(FormView):
form_class = AutorUserForm
template_name = 'base/autoruser_form.html'
diff --git a/sapl/materia/views.py b/sapl/materia/views.py
index 94f10f539..d7c291712 100644
--- a/sapl/materia/views.py
+++ b/sapl/materia/views.py
@@ -108,7 +108,7 @@ def proposicao_texto(request, pk):
if proposicao.texto_original:
if (not proposicao.data_recebimento and
- proposicao.autor.user_id != request.user.id):
+ not proposicao.autor.autoruser_set.filter(user=request.user).exists()):
logger.error("user=" + username + ". Usuário ({}) não tem permissão para acessar o texto original."
.format(request.user.id))
messages.error(request, _(
@@ -314,7 +314,7 @@ class ProposicaoTaView(IntegracaoTaView):
proposicao = get_object_or_404(self.model, pk=kwargs['pk'])
if not proposicao.data_envio and\
- request.user != proposicao.autor.user:
+ proposicao.autor.autoruser_set.filter(user=request.user).exists():
raise Http404()
return IntegracaoTaView.get(self, request, *args, **kwargs)
@@ -586,7 +586,7 @@ class RetornarProposicao(UpdateView):
"user=" + username + ". Objeto Proposicao com id={} não encontrado.".format(kwargs['pk']))
raise Http404()
- if p.autor.user != request.user:
+ if not p.autor.autoruser_set.filter(user=request.user).exists():
self.logger.error(
"user=" + username + ". Usuário ({}) sem acesso a esta opção.".format(request.user))
messages.error(
@@ -728,7 +728,7 @@ class UnidadeTramitacaoCrud(CrudAux):
class ProposicaoCrud(Crud):
model = Proposicao
help_topic = 'proposicao'
- container_field = 'autor__user'
+ container_field = 'autor__autoruser__user'
class BaseMixin(Crud.BaseMixin):
list_field_names = ['data_envio', 'data_recebimento', 'descricao',
@@ -892,7 +892,7 @@ class ProposicaoCrud(Crud):
if not self.has_permission():
return self.handle_no_permission()
- if p.autor.user != request.user:
+ if not p.autor.autoruser_set.filter(user=request.user).exists():
if not p.data_envio and not p.data_devolucao:
raise Http404()
@@ -1107,9 +1107,9 @@ class ReciboProposicaoView(TemplateView):
if not self.request.user.has_perms(perms):
return False
- return (Proposicao.objects.filter(
- id=self.kwargs['pk'],
- autor__user_id=self.request.user.id).exists())
+ prop = Proposicao.objects.get(
+ id=self.kwargs['pk'])
+ return prop.autor.autoruser_set.filter(user=self.request.user).exists()
def get_context_data(self, **kwargs):
context = super(ReciboProposicaoView, self).get_context_data(
diff --git a/sapl/templates/base.html b/sapl/templates/base.html
index 000a74cdf..3c937d3ed 100644
--- a/sapl/templates/base.html
+++ b/sapl/templates/base.html
@@ -63,7 +63,7 @@