source: publico/ILSAPL/trunk/SAPLTool.py @ 7251

Última Alteração nesse arquivo desde 7251 foi 7251, incluída por gustavolepri, 6 anos atrás

verificação no momento do login se o parlamentar está na camara

  • Propriedade svn:executable mudada para *
File size: 12.7 KB
Linha 
1# -*- coding: utf-8 -*-
2
3import re
4import subprocess
5
6from lxml.builder import ElementMaker
7from lxml import etree
8
9from datetime import datetime
10
11from AccessControl import ClassSecurityInfo
12from Globals import DTMLFile
13from Globals import InitializeClass
14from OFS.SimpleItem import SimpleItem
15
16from Products.CMFCore.ActionInformation import ActionInformation
17from Products.CMFCore.ActionProviderBase import ActionProviderBase
18from Products.CMFCore.Expression import Expression
19from Products.CMFCore.permissions import ListFolderContents
20from Products.CMFCore.permissions import ManagePortal
21from Products.CMFCore.utils import _checkPermission
22from Products.CMFCore.utils import _dtmldir
23from Products.CMFCore.utils import SimpleItemWithProperties
24from Products.CMFCore.utils import UniqueObject
25
26from zope.interface import Interface
27
28from Products.CMFCore.utils import getToolByName
29
30
31class ISAPLTool(Interface):
32    """ Marker interface for SAPL Tool.
33    """
34    pass
35
36
37class SAPLTool(UniqueObject, SimpleItem, ActionProviderBase):
38
39    __implements__ = (ISAPLTool)
40
41    id = 'portal_sapl'
42    meta_type = 'SAPL Tool'
43
44    XSI_NS = 'http://www.w3.org/2001/XMLSchema-instance'
45    ns = {'lexml': 'http://www.lexml.gov.br/oai_lexml'}
46    schema = {'oai_lexml': 'http://projeto.lexml.gov.br/esquemas/oai_lexml.xsd'}
47
48    def verifica_esfera_federacao(self):
49        ''' Funcao para verificar a esfera da federacao
50        '''
51        nome_camara = self.sapl_documentos.props_sapl.nom_casa
52        camara = [u'Câmara','Camara','camara',u'camara']
53        assembleia = [u'Assembléia','Assembleia','assembleia',u'assembléia']
54
55        if [tipo for tipo in camara if nome_camara.startswith(tipo)]:
56            return 'M'
57        elif [tipo for tipo in assembleia if nome_camara.startswith(tipo)]:
58            return 'E'
59        else:
60            return ''
61
62    def monta_id(self,cod_norma):
63        ''' Funcao que monta o id do objeto do LexML
64        '''
65
66        #consultas
67        consulta = self.zsql.lexml_normas_juridicas_obter_zsql(cod_norma=cod_norma)
68        if consulta:
69            consulta = self.zsql.lexml_normas_juridicas_obter_zsql(cod_norma=cod_norma)[0]
70           
71            end_web_casa = self.sapl_documentos.props_sapl.end_web_casa
72            sgl_casa = self.sapl_documentos.props_sapl.sgl_casa.lower()
73            num = len(end_web_casa.split('.'))
74            dominio = '.'.join(end_web_casa.split('.')[1:num])
75           
76            prefixo_oai = '%s.%s:sapl/' % (sgl_casa,dominio)
77            numero_interno = consulta.num_norma
78            tipo_norma = consulta.voc_lexml
79            ano_norma = consulta.ano_norma
80           
81            identificador = '%s%s;%s;%s' % (prefixo_oai,tipo_norma,ano_norma,numero_interno)
82       
83            return identificador
84        else:
85            return None
86       
87    def monta_urn(self, cod_norma):
88        ''' Funcao que monta a URN do LexML
89        '''
90
91        esfera = self.verifica_esfera_federacao()
92        consulta = self.zsql.lexml_normas_juridicas_obter_zsql(cod_norma=cod_norma)
93        if consulta:
94            consulta = self.zsql.lexml_normas_juridicas_obter_zsql(cod_norma=cod_norma)[0]
95            url = self.portal_url() + '/consultas/norma_juridica/norma_juridica_mostrar_proc?cod_norma=' + str(cod_norma)
96            urn='urn:lex:br;'
97            esferas = {'M':'municipal','E':'estadual'}
98           
99            localidade = self.zsql.localidade_obter_zsql(cod_localidade = self.sapl_documentos.props_sapl.cod_localidade)
100            municipio = localidade[0].nom_localidade_pesq.lower()
101            for i in re.findall('\s',municipio):
102                municipio = municipio.replace(i, '.')
103           
104            # solucao temporaria
105            if re.search( '\.de\.', municipio):
106                municipio = [municipio.replace(i, '.') for i in re.findall( '\.de\.', municipio)][0]
107            if re.search( '\.da\.', municipio):
108                municipio = [municipio.replace(i, '.') for i in re.findall( '\.da\.', municipio)][0]
109            if re.search( '\.das\.', municipio):
110                municipio = [municipio.replace(i, '.') for i in re.findall( '\.das\.', municipio)][0]
111            if re.search( '\.do\.', municipio):
112                municipio = [municipio.replace(i, '.') for i in re.findall( '\.do\.', municipio)][0]
113            if re.search( '\.dos\.', municipio):
114                municipio = [municipio.replace(i, '.') for i in re.findall( '\.dos\.', municipio)][0]
115
116            sigla_uf=localidade[0].sgl_uf
117            uf = self.zsql.localidade_obter_zsql(sgl_uf=sigla_uf,tip_localidade='U')[0].nom_localidade_pesq.lower()
118            for i in re.findall('\s',uf):
119                uf = uf.replace(i, '.')
120           
121            # solucao temporaria
122            if re.search( '\.de\.', uf):
123                uf = [uf.replace(i, '.') for i in re.findall( '\.de\.', uf)][0]
124            if re.search( '\.da\.', uf):
125                uf = [uf.replace(i, '.') for i in re.findall( '\.da\.', uf)][0]
126            if re.search( '\.das\.', uf):
127                uf = [uf.replace(i, '.') for i in re.findall( '\.das\.', uf)][0]
128            if re.search( '\.do\.', uf):
129                uf = [uf.replace(i, '.') for i in re.findall( '\.do\.', uf)][0]
130            if re.search( '\.dos\.', uf):
131                uf = [uf.replace(i, '.') for i in re.findall( '\.dos\.', uf)][0]
132
133            if self.verifica_esfera_federacao() == 'M':
134                urn += uf + ';'
135                urn += municipio + ':'
136            elif self.verifica_esfera_federacao() == 'E':
137                urn += uf + ':'
138
139            if esfera == 'M':
140                if consulta.voc_lexml == 'regimento.interno' or consulta.voc_lexml == 'resolucao':
141                    urn += 'camara.municipal:'
142                else:
143                    urn += esferas[esfera] + ':'
144            else:
145                urn += esferas[esfera] + ':'
146
147            urn += consulta.voc_lexml + ':'
148
149            urn += self.pysc.port_to_iso_pysc(consulta.dat_norma) + ';'
150
151            if consulta.voc_lexml == 'lei.organica' or consulta.voc_lexml == 'constituicao':
152                urn += consulta.ano_norma
153            else:
154                urn += consulta.num_norma
155
156            if consulta.dat_vigencia and consulta.dat_publicacao:
157                urn += '@'
158                urn += self.pysc.port_to_iso_pysc(consulta.dat_vigencia)
159                urn += ';publicacao;'
160                urn += self.pysc.port_to_iso_pysc(consulta.dat_publicacao)
161            elif consulta.dat_publicacao:
162                urn += '@'
163                urn += 'inicio.vigencia;publicacao;' + self.pysc.port_to_iso_pysc(consulta.dat_publicacao)
164#            else:
165#                urn += 'inicio.vigencia;publicacao;'
166#               
167#            if consulta.dat_publicacao:
168#                urn += self.pysc.port_to_iso_pysc(consulta.dat_publicacao)
169               
170            return urn
171        else:
172            return None
173   
174    def monta_xml(self,urn,cod_norma):
175        #criacao do xml
176
177        # consultas
178        consulta = self.zsql.lexml_normas_juridicas_obter_zsql(cod_norma=cod_norma)
179        publicador = self.zsql.lexml_publicador_obter_zsql()
180        if consulta and publicador:
181            consulta = self.zsql.lexml_normas_juridicas_obter_zsql(cod_norma=cod_norma)[0]
182            publicador = self.zsql.lexml_publicador_obter_zsql()[0]
183       
184            url = self.portal_url() + '/consultas/norma_juridica/norma_juridica_mostrar_proc?cod_norma=' + str(cod_norma)
185           
186            E = ElementMaker()
187            LEXML = ElementMaker(namespace=self.ns['lexml'],nsmap=self.ns)
188           
189            oai_lexml = LEXML.LexML()
190           
191            oai_lexml.attrib['{%s}schemaLocation' % self.XSI_NS] = '%s %s' % (
192                        'http://www.lexml.gov.br/oai_lexml',
193                        'http://projeto.lexml.gov.br/esquemas/oai_lexml.xsd')
194           
195            id_publicador = str(publicador.id_publicador)
196
197            # montagem da epigrafe
198            localidade = self.zsql.localidade_obter_zsql(cod_localidade = self.sapl_documentos.props_sapl.cod_localidade)[0].nom_localidade
199            sigla_uf = self.zsql.localidade_obter_zsql(cod_localidade = self.sapl_documentos.props_sapl.cod_localidade)[0].sgl_uf
200            if consulta.voc_lexml == 'lei.organica':
201                epigrafe = u'%s de %s - %s, de %s' % (consulta.des_tipo_norma, localidade,sigla_uf, consulta.ano_norma)
202            elif consulta.voc_lexml == 'constituicao':
203                epigrafe = u'%s do Estado de %s, de %s' % (consulta.des_tipo_norma, localidade, consulta.ano_norma)
204            else:
205                epigrafe = u'%s n° %s,  de %s' % (consulta.des_tipo_norma, consulta.num_norma, self.pysc.data_converter_por_extenso_pysc(consulta.dat_norma))
206           
207            ementa = consulta.txt_ementa
208           
209            indexacao = consulta.txt_indexacao
210           
211            formato = 'text/html'
212            id_documento = u'%s_%s' % (str(cod_norma), self.sapl_documentos.norma_juridica.nom_documento)
213            if hasattr(self.sapl_documentos.norma_juridica,id_documento):
214                arquivo = getattr(self.sapl_documentos.norma_juridica,id_documento)
215                url_conteudo = arquivo.absolute_url()
216                formato = arquivo.content_type
217                if formato == 'application/octet-stream':
218                    formato = 'application/msword'
219                if formato == 'image/ipeg':
220                    formato = 'image/jpeg'
221           
222            else:
223                url_conteudo = self.portal_url() + '/consultas/norma_juridica/norma_juridica_mostrar_proc?cod_norma=' + str(cod_norma)
224           
225            item_conteudo = E.Item(url_conteudo,formato=formato, idPublicador=id_publicador,tipo='conteudo')
226            oai_lexml.append(item_conteudo)
227           
228            item_metadado = E.Item(url,formato='text/html', idPublicador=id_publicador,tipo='metadado')
229            oai_lexml.append(item_metadado)
230           
231            documento_individual = E.DocumentoIndividual(urn)
232            oai_lexml.append(documento_individual)
233            oai_lexml.append(E.Epigrafe(epigrafe.decode('iso-8859-1')))
234            oai_lexml.append(E.Ementa(ementa.decode('iso-8859-1')))
235            if indexacao:
236                oai_lexml.append(E.Indexacao(indexacao.decode('iso-8859-1')))
237            return etree.tostring(oai_lexml)
238        else:
239            return None
240
241    def oai_query(self,
242                  offset=0,
243                  batch_size=20,
244                  from_date=None,
245                  until_date=None,
246                  identifier=None):
247
248        esfera = self.verifica_esfera_federacao()
249
250        if batch_size < 0:
251            batch_size = 0
252
253        # garante que a data 'until'(ate) esteja setada, e nao no futuro
254        if until_date == None or until_date > datetime.now():
255            until_date = datetime.now()
256
257        if from_date is None:
258            from_date = ''
259
260        normas = self.zsql.lexml_normas_juridicas_obter_zsql(from_date=from_date,
261                                                             until_date=until_date,
262                                                             offset=offset,
263                                                             batch_size=batch_size,
264                                                             num_norma=identifier,
265                                                             tip_esfera_federacao=esfera)
266        for norma in normas:
267            resultado = {}           
268            cod_norma = norma.cod_norma
269            identificador = self.monta_id(cod_norma)
270            urn = self.monta_urn(cod_norma)
271            xml_lexml = self.monta_xml(urn,cod_norma)
272           
273            resultado['tx_metadado_xml'] = xml_lexml
274            #resultado['id_registro_item'] = resultado['name']
275            #del resultado['name']
276            #record['sets'] = record['sets'].strip().split(' ')
277            #if resultado['sets'] == [u'']:
278            #    resultado['sets'] = []
279            resultado['cd_status'] = 'N'
280            resultado['id'] = identificador
281            resultado['when_modified'] = norma.timestamp
282            resultado['deleted'] = 0
283            if norma.ind_excluido == 1:
284                resultado['deleted'] = 1
285#                resultado['cd_status'] = 'D'
286            yield {'record': resultado,
287#                   'sets': ['person'],
288                   'metadata': resultado['tx_metadado_xml'],
289#                   'assets':{}
290                   }
291
292    def get_mac_address(self, ip_address):
293        cmd = 'arping -c 1 ' + ip_address
294
295        p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
296        output, errors = p.communicate()
297        if output is not None :
298            return re.findall(r'(\[.*\])', output)[0].replace('[', '').replace(']', '')
299
300InitializeClass(SAPLTool)
Note: Veja TracBrowser para ajuda no uso do navegador do trac.
 

The contents and data of this website are published under license:
Creative Commons 4.0 Brasil - Atribuir Fonte - Compartilhar Igual.