source: publico/ILSAPL/branches/2.5/SAPLTool.py @ 7145

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

fix bug em relacao as consultas

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