From 04680d9264cb4929968a52e2ef4bb736324b6173 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ses=C3=B3stris=20Vieira?= Date: Wed, 24 Mar 2021 16:07:26 -0300 Subject: [PATCH] =?UTF-8?q?Mudan=C3=A7as=20no=20menu=20e=20na=20conex?= =?UTF-8?q?=C3=A3o=20LDAP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sigi/apps/convenios/admin.py | 36 +++++- sigi/apps/convenios/management/__init__.py | 0 .../convenios/management/commands/__init__.py | 0 .../management/commands/duracao_act.py | 43 +++++++ sigi/apps/home/templatetags/menu_conf.yaml | 58 ++++----- .../management/commands/sync_ldap.py | 114 ++++++++++++++---- 6 files changed, 196 insertions(+), 55 deletions(-) create mode 100644 sigi/apps/convenios/management/__init__.py create mode 100644 sigi/apps/convenios/management/commands/__init__.py create mode 100644 sigi/apps/convenios/management/commands/duracao_act.py diff --git a/sigi/apps/convenios/admin.py b/sigi/apps/convenios/admin.py index 8b42c64..f199c9a 100644 --- a/sigi/apps/convenios/admin.py +++ b/sigi/apps/convenios/admin.py @@ -41,7 +41,8 @@ class ConvenioAdmin(BaseModelAdmin): change_list_template = 'convenios/change_list.html' fieldsets = ( (None, - {'fields': ('casa_legislativa', 'num_processo_sf', 'num_convenio', 'projeto', 'observacao')} + {'fields': ('casa_legislativa', 'num_processo_sf', 'num_convenio', + 'projeto', 'observacao')} ), (_(u'Datas'), {'fields': ('data_adesao', 'data_retorno_assinatura', 'duracao', @@ -55,11 +56,12 @@ class ConvenioAdmin(BaseModelAdmin): actions = ['adicionar_convenios'] inlines = (TramitacaoInline, AnexosInline, EquipamentoPrevistoInline) list_display = ('num_convenio', 'casa_legislativa', 'get_uf', - 'data_adesao', 'data_retorno_assinatura', 'data_pub_diario', 'data_termo_aceite', - 'projeto', + 'status_convenio', 'link_sigad', 'data_adesao', + 'data_retorno_assinatura', 'duracao', 'data_pub_diario', + 'data_termo_aceite', 'projeto', ) list_display_links = ('num_convenio', 'casa_legislativa',) - list_filter = ('projeto', 'casa_legislativa__tipo', 'conveniada', 'equipada', 'casa_legislativa__municipio__uf', ) + list_filter = ('projeto', 'casa_legislativa__tipo', 'conveniada','equipada', 'casa_legislativa__municipio__uf', ) #date_hierarchy = 'data_adesao' ordering = ('casa_legislativa__tipo__sigla', 'casa_legislativa__municipio__uf', 'casa_legislativa') raw_id_fields = ('casa_legislativa',) @@ -72,6 +74,32 @@ class ConvenioAdmin(BaseModelAdmin): get_uf.short_description = _(u'UF') get_uf.admin_order_field = 'casa_legislativa__municipio__uf__sigla' + def status_convenio(self, obj): + if obj.pk is None: + return "" + status = obj.get_status() + + if status in [u"Vencido", u"Desistência"]: + label = r"danger" + elif status == u"Vigente": + label = r"success" + elif status == u"Pendente": + label = r"warning" + else: + label = r"info" + + return u'

{status}

'.format(label=label, status=status) + status_convenio.short_description = _(u"Status do convênio") + status_convenio.allow_tags = True + + def link_sigad(self, obj): + if obj.pk is None: + return "" + return obj.get_sigad_url() + + link_sigad.short_description = _("Processo no Senado") + link_sigad.allow_tags = True + def changelist_view(self, request, extra_context=None): import re request.GET._mutable = True diff --git a/sigi/apps/convenios/management/__init__.py b/sigi/apps/convenios/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sigi/apps/convenios/management/commands/__init__.py b/sigi/apps/convenios/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sigi/apps/convenios/management/commands/duracao_act.py b/sigi/apps/convenios/management/commands/duracao_act.py new file mode 100644 index 0000000..2144582 --- /dev/null +++ b/sigi/apps/convenios/management/commands/duracao_act.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# +# sigi.apps.casas.management.commands.importa_gerentes +# +# Copyright (c) 2015 by Interlegis +# +# GNU General Public License (GPL) +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. +# + +from django.core.management.base import BaseCommand, CommandError +from sigi.apps.convenios.models import Projeto, Convenio + +class Command(BaseCommand): + help = u"""Define a duração de todos os ACT para 60 meses. + * A sigla do Projeto precisa ser ACT; + * O campo duracao precisa estar em branco. + """ + + def handle(self, *args, **options): + self.stdout.write(u"Atualizando ACTs... ") + act = Projeto.objects.get(sigla='ACT') + for conv in Convenio.objects.filter(projeto=act, duracao=None): + conv.duracao = 60 + conv.save() + self.stdout.write(u"\tACT {sigad} da Casa {casa} atualizado".format( + sigad=conv.num_processo_sf, casa=conv.casa_legislativa.nome + )) + self.stdout.write(u"Pronto!") diff --git a/sigi/apps/home/templatetags/menu_conf.yaml b/sigi/apps/home/templatetags/menu_conf.yaml index 0388ff7..ec7dcb7 100644 --- a/sigi/apps/home/templatetags/menu_conf.yaml +++ b/sigi/apps/home/templatetags/menu_conf.yaml @@ -34,15 +34,15 @@ main_menu: url: parlamentares/cargo/ - title: Tabela de partidos url: parlamentares/partido/ - - title: Diagnósticos - url: diagnosticos/diagnostico/ - children: - - title: Administração - url: diagnosticos/diagnostico/ - - title: Coleta de dados - url: diagnosticos/mobile/ - - title: Gráficos e estatísticas - url: diagnosticos/graficos + # - title: Diagnósticos + # url: diagnosticos/diagnostico/ + # children: + # - title: Administração + # url: diagnosticos/diagnostico/ + # - title: Coleta de dados + # url: diagnosticos/mobile/ + # - title: Gráficos e estatísticas + # url: diagnosticos/graficos - title: Convênios url: convenios/convenio/ children: @@ -50,21 +50,21 @@ main_menu: url: convenios/convenio/ - title: Planos diretores url: metas/planodiretor/ - - title: Inventário - url: inventario/bem/ - children: - - title: Bens - url: inventario/bem/ - - title: Fornecedores - url: inventario/fornecedor/ - - title: Equipamentos - url: inventario/equipamento/ - - title: Fabricantes - url: inventario/fabricante/ - - title: Tipos de equipamentos - url: inventario/tipoequipamento/ - - title: Modelos de equipamentos - url: inventario/modeloequipamento/ + # - title: Inventário + # url: inventario/bem/ + # children: + # - title: Bens + # url: inventario/bem/ + # - title: Fornecedores + # url: inventario/fornecedor/ + # - title: Equipamentos + # url: inventario/equipamento/ + # - title: Fabricantes + # url: inventario/fabricante/ + # - title: Tipos de equipamentos + # url: inventario/tipoequipamento/ + # - title: Modelos de equipamentos + # url: inventario/modeloequipamento/ - title: Servidores url: servidores/servidor/?user__is_active__exact=1 children: @@ -109,8 +109,8 @@ main_menu: url: eventos/tipoevento/ - title: Funções na equipe url: eventos/funcao/ - - title: Financeiro - url: financeiro/desembolso/ - children: - - title: Desembolsos - url: financeiro/desembolso/ \ No newline at end of file + # - title: Financeiro + # url: financeiro/desembolso/ + # children: + # - title: Desembolsos + # url: financeiro/desembolso/ \ No newline at end of file diff --git a/sigi/apps/servidores/management/commands/sync_ldap.py b/sigi/apps/servidores/management/commands/sync_ldap.py index 6c2c9c3..530d8a6 100644 --- a/sigi/apps/servidores/management/commands/sync_ldap.py +++ b/sigi/apps/servidores/management/commands/sync_ldap.py @@ -18,26 +18,95 @@ class Command(BaseCommand): filter = "(&(objectclass=Group))" values = ['cn', ] l = ldap.initialize(AUTH_LDAP_SERVER_URI) - l.protocol_version = ldap.VERSION3 - l.simple_bind_s(AUTH_LDAP_BIND_DN.encode('utf-8'), AUTH_LDAP_BIND_PASSWORD) - result_id = l.search(AUTH_LDAP_GROUP, ldap.SCOPE_SUBTREE, filter, values) - result_type, result_data = l.result(result_id, 1) - l.unbind() - return result_data + try: + l.protocol_version = ldap.VERSION3 + l.set_option(ldap.OPT_REFERRALS, 0) + l.simple_bind_s(AUTH_LDAP_BIND_DN.encode('utf-8'), + AUTH_LDAP_BIND_PASSWORD) + + page_control = ldap.controls.SimplePagedResultsControl( + True, + size=1000, + cookie='' + ) + result = [] + pages = 0 + + while True: + pages += 1 + response = l.search_ext( + AUTH_LDAP_GROUP, + ldap.SCOPE_SUBTREE, + filter, + values, + serverctrls=[page_control] + ) + rtype, rdata, rmsgid, serverctrls = l.result3(response) + result.extend(rdata) + controls = [control for control in serverctrls + if control.controlType == + ldap.controls.SimplePagedResultsControl.controlType] + if not controls: + raise Exception('The server ignores RFC 2696 control') + if not controls[0].cookie: + break + page_control.cookie = controls[0].cookie + # result_id = l.search(AUTH_LDAP_GROUP, ldap.SCOPE_SUBTREE, filter, values) + # result_type, result_data = l.result(result_id, 1) + finally: + l.unbind() + return result def get_ldap_users(self): - filter = "(&(objectclass=user))" + filter = "(&(objectclass=user)(memberof=CN=ILB,OU=Grupos,DC=senado,DC=gov,DC=br))" values = ['sAMAccountName', 'userPrincipalName', 'givenName', 'sn', 'cn'] l = ldap.initialize(AUTH_LDAP_SERVER_URI) - l.protocol_version = ldap.VERSION3 - l.simple_bind_s(AUTH_LDAP_BIND_DN.encode('utf-8'), AUTH_LDAP_BIND_PASSWORD) - result_id = l.search(AUTH_LDAP_USER.encode('utf-8'), ldap.SCOPE_SUBTREE, filter, values) - result_type, result_data = l.result(result_id, 1) - l.unbind() - return result_data + try: + l.protocol_version = ldap.VERSION3 + l.set_option(ldap.OPT_REFERRALS, 0) + l.simple_bind_s( + AUTH_LDAP_BIND_DN.encode('utf-8'), + AUTH_LDAP_BIND_PASSWORD + ) + + page_control = ldap.controls.SimplePagedResultsControl( + True, + size=1000, + cookie='' + ) + + result = [] + pages = 0 + + while True: + pages += 1 + response = l.search_ext( + AUTH_LDAP_USER.encode('utf-8'), + ldap.SCOPE_SUBTREE, + filter, + values, + serverctrls=[page_control] + ) + rtype, rdata, rmsgid, serverctrls = l.result3(response) + result.extend(rdata) + controls = [control for control in serverctrls + if control.controlType == + ldap.controls.SimplePagedResultsControl.controlType] + if not controls: + raise Exception('The server ignores RFC 2696 control') + if not controls[0].cookie: + break + page_control.cookie = controls[0].cookie + # result_id = l.search(AUTH_LDAP_USER.encode('utf-8'), ldap.SCOPE_SUBTREE, filter, values) + # result_type, result_data = l.result(result_id, 1) + finally: + l.unbind() + return result def sync_groups(self): + print "Syncing groups..." ldap_groups = self.get_ldap_groups() + print "\tFetched groups: %s" % len(ldap_groups) for ldap_group in ldap_groups: try: group_name = ldap_group[1]['cn'][0] @@ -49,12 +118,13 @@ class Command(BaseCommand): except Group.DoesNotExist: group = Group(name=group_name) group.save() - print "Group '%s' created." % group_name + print "\tGroup '%s' created." % group_name print "Groups are synchronized." def sync_users(self): + print "Syncing users..." ldap_users = self.get_ldap_users() - + print "\tFetched users: %s" % len(ldap_users) def get_ldap_property(ldap_user, property_name, default_value=None): value = ldap_user[1].get(property_name, None) return value[0].decode('utf8') if value else default_value @@ -72,7 +142,7 @@ class Command(BaseCommand): user = User.objects.get(email=email) old_username = user.username user.username = username - print "User with email '%s' had his/her username updated from [%s] to [%s]." % ( + print "\tUser with email '%s' had his/her username updated from [%s] to [%s]." % ( email, old_username, username) except User.DoesNotExist: user = User.objects.create_user( @@ -81,17 +151,17 @@ class Command(BaseCommand): last_name=last_name, email=email, ) - print "User '%s' created." % username + print "\tUser '%s' created." % username if not user.first_name == first_name: user.first_name = first_name - print "User '%s' first name updated." % username + print "\tUser '%s' first name updated." % username if not user.last_name == last_name: user.last_name = last_name - print "User '%s' last name updated." % username + print "\tUser '%s' last name updated." % username if not user.email == email: user.email = email - print "User '%s' email updated." % username + print "\tUser '%s' email updated." % username nome_completo = get_ldap_property(ldap_user, 'cn', '') try: @@ -101,11 +171,11 @@ class Command(BaseCommand): servidor = Servidor.objects.get(nome_completo=nome_completo) except Servidor.DoesNotExist: servidor = user.servidor_set.create(nome_completo=nome_completo) - print "Servidor '%s' created." % nome_completo + print "\tServidor '%s' created." % nome_completo else: if not servidor.nome_completo == nome_completo: servidor.nome_completo = nome_completo - print "Full name of Servidor '%s' updated." % nome_completo + print "\tFull name of Servidor '%s' updated." % nome_completo servidor.user = user servidor.save()