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

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

correcao do bug

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