diff --git a/sapl/api/views.py b/sapl/api/views.py index 769196c76..f2f146e24 100644 --- a/sapl/api/views.py +++ b/sapl/api/views.py @@ -22,7 +22,7 @@ from sapl.api.forms import SaplFilterSetMixin from sapl.api.permissions import SaplModelPermissions from sapl.api.serializers import ChoiceSerializer from sapl.base.models import Autor, AppConfig, DOC_ADM_OSTENSIVO -from sapl.materia.models import Proposicao +from sapl.materia.models import Proposicao, TipoMateriaLegislativa from sapl.parlamentares.models import Parlamentar from sapl.utils import models_with_gr_for_model, choice_anos_com_sessaoplenaria @@ -349,6 +349,23 @@ class _ProposicaoViewSet(SaplSetViews['materia']['proposicao']): return qs +class _TipoMateriaLegislativaViewSet(SaplSetViews['materia']['tipomaterialegislativa']): + + @action(detail=True, methods=['POST']) + def change_position(self, request, *args, **kwargs): + result = { + 'status': 200, + 'message': 'OK' + } + d = request.data + if 'pos_ini' in d and 'pos_fim' in d: + if d['pos_ini'] != d['pos_fim']: + pk = kwargs['pk'] + TipoMateriaLegislativa.objects.reposicione(pk, d['pos_fim']) + + return Response(result) + + class _DocumentoAdministrativoViewSet(SaplSetViews['protocoloadm']['documentoadministrativo']): class DocumentoAdministrativoPermission(SaplModelPermissions): @@ -427,6 +444,7 @@ class _SessaoPlenariaViewSet( SaplSetViews['base']['autor'] = _AutorViewSet.build_class_with_actions() SaplSetViews['materia']['proposicao'] = _ProposicaoViewSet +SaplSetViews['materia']['tipomaterialegislativa'] = _TipoMateriaLegislativaViewSet SaplSetViews['parlamentares']['parlamentar'] = _ParlamentarViewSet diff --git a/sapl/materia/models.py b/sapl/materia/models.py index 14e23dfc0..494d52a88 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -78,8 +78,39 @@ class TipoProposicao(models.Model): return self.descricao +class TipoMateriaManager(models.Manager): + + def reordene(self, exclude_pk=None): + tipos = self.get_queryset() + if exclude_pk: + tipos = tipos.exclude(pk=exclude_pk) + sr = 1 + for t in tipos: + t.sequencia_regimental = sr + t.save() + sr += 1 + + def reposicione(self, pk, idx): + tipos = self.reordene(exclude_pk=pk) + + self.get_queryset( + ).filter( + sequencia_regimental__gte=idx + ).update( + sequencia_regimental=models.F('sequencia_regimental') + 1 + ) + + self.get_queryset( + ).filter( + pk=pk + ).update( + sequencia_regimental=idx + ) + + @reversion.register() class TipoMateriaLegislativa(models.Model): + objects = TipoMateriaManager() sigla = models.CharField(max_length=5, verbose_name=_('Sigla')) descricao = models.CharField(max_length=50, verbose_name=_('Descrição ')) # XXX o que é isso ? diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 9dea69843..e727fe0c7 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -2501,13 +2501,26 @@ class TipoMateriaCrud(CrudAux): class DetailView(CrudAux.DetailView): layout_key = 'TipoMateriaLegislativaDetail' + class DeleteView(CrudAux.DeleteView): + def delete(self, request, *args, **kwargs): + d = CrudAux.DeleteView.delete(self, request, *args, **kwargs) + TipoMateriaLegislativa.objects.reordene() + return d + class ListView(CrudAux.ListView): paginate_by = None layout_key = 'TipoMateriaLegislativaDetail' template_name = "materia/tipomaterialegislativa_list.html" - def hook_sequencia_regimental(self, obj): - return obj.sequencia_regimental + def hook_sigla(self, obj, default, url): + return '{}'.format( + url, obj.id, obj.sigla), '' + + def get(self, request, *args, **kwargs): + if TipoMateriaLegislativa.objects.filter( + sequencia_regimental=0).exists(): + TipoMateriaLegislativa.objects.reordene() + return CrudAux.ListView.get(self, request, *args, **kwargs) class CreateView(CrudAux.CreateView): @@ -2516,12 +2529,7 @@ class TipoMateriaCrud(CrudAux): if not TipoMateriaLegislativa.objects.exclude( sequencia_regimental=0).exists(): - tipos = TipoMateriaLegislativa.objects.all() - sr = 1 - for t in tipos: - t.sequencia_regimental = sr - t.save() - sr += 1 + TipoMateriaLegislativa.objects.reordene() else: sr__max = TipoMateriaLegislativa.objects.all().aggregate( Max('sequencia_regimental')) diff --git a/sapl/templates/materia/tipomaterialegislativa_list.html b/sapl/templates/materia/tipomaterialegislativa_list.html index 8ba1f428c..87e28a4a4 100644 --- a/sapl/templates/materia/tipomaterialegislativa_list.html +++ b/sapl/templates/materia/tipomaterialegislativa_list.html @@ -7,20 +7,33 @@