Browse Source

Módulo Python com classes para manipulação de relatórios produzidos no Eclipse BIRT

diagnosticos
Sesostris Vieira 14 years ago
parent
commit
a1ef68dd22
  1. 0
      sigi/birtReport/__init__.py
  2. 108
      sigi/birtReport/birtReport.py
  3. 57
      sigi/birtReport/birtReportTree.py

0
sigi/birtReport/__init__.py

108
sigi/birtReport/birtReport.py

@ -0,0 +1,108 @@
'''
Created on 11/05/2011
@author: sesostris
'''
import os
import xml.dom.minidom as minidom
class BirtReport():
'''
Handles a birtReport report
'''
rptFile = ''
def __init__(self, rptFile):
'''
rptFile param is the FQN of birt report file
'''
self.rptFile = rptFile
def rptExists(self):
return os.path.isfile(self.rptFile)
def getReportParams(self):
if not self.rptExists():
return {}
formFields = {}
doc = minidom.parse(self.rptFile)
parameterTags = doc.getElementsByTagName("parameters")
for parameterTag in parameterTags:
for parameter in parameterTag.childNodes:
if parameter.nodeType != minidom.Element.TEXT_NODE:
formField = {}
for property in parameter.childNodes:
if property.nodeType != minidom.Element.TEXT_NODE and property.hasChildNodes():
fieldName = property.getAttribute('name').encode('ascii')
fieldValue = property.childNodes[0].nodeValue
if fieldName == 'selectionList':
fieldValue = ()
for structure in property.getElementsByTagName('structure'):
s = {}
for structProp in structure.getElementsByTagName('property'):
s[structProp.getAttribute('name').encode('ascii')] = structProp.childNodes[0].nodeValue
fieldValue = fieldValue + (s,)
if fieldName == 'defaultValue':
fieldValue = ()
for value in property.getElementsByTagName('value'):
if value.getAttribute('type') == 'constant':
fieldValue = fieldValue + (value.childNodes[0].nodeValue, )
formField[fieldName] = fieldValue
if formField['valueType'] == 'dynamic':
for dataSets in doc.getElementsByTagName("data-sets"):
for dataSet in dataSets.getElementsByTagName("oda-data-set"):
if dataSet.getAttribute('name') == formField['dataSetName']:
for xmlProp in dataSet.getElementsByTagName('xml-property'):
if xmlProp.getAttribute('name') == 'queryText':
formField['queryText'] = xmlProp.childNodes[0].data
try:
from django.db import connection
cursor = connection.cursor()
cursor.execute(formField['queryText'])
resultSet = cursor.fetchall()
formField['selectionList'] = ()
for record in resultSet:
formField['selectionList'] = formField['selectionList'] + ({'value': record[0],'label': record[1]},)
# formField['selectionList'] = resultSet
except:
formField['selectionList'] = {}
formFields[parameter.getAttribute('name').encode('ascii')] = formField
return formFields
def getName(self):
doc = minidom.parse(self.rptFile)
root = doc.documentElement
for element in root.childNodes:
if (element.localName == "text-property" and element.hasAttribute("name") and element.getAttribute("name") == 'displayName'):
return element.childNodes[0].data
def getTitle(self):
doc = minidom.parse(self.rptFile)
root = doc.documentElement
for element in root.childNodes:
if (element.localName == "text-property" and element.hasAttribute("name") and element.getAttribute("name") == 'title'):
return element.childNodes[0].data
#r = birtReport('/home/sesostris/workspace/sigi/BIRT_Reports/teste_parametros.rptdesign')
#p = r.getReportParams()
#print p['prm_estado']
#for q in p:
# print q

57
sigi/birtReport/birtReportTree.py

@ -0,0 +1,57 @@
# -*- encoding: utf-8 -*-
'''
Created on 11/05/2011
@author: sesostris
'''
import os
import xml.dom.minidom as minidom
class BirtReportTree():
'''Gerencia uma árvore de relatórios birtReports, permitindo montar telas
de navegação (menus) para acessar os relatórios'''
birtReportRoot = '/'
def __init__(self, root = '/'):
self.birtReportRoot = root
def getRootItems(self):
return self.getFolderItems('')
def getFolderItems(self, folder):
folder = self.birtReportRoot + folder
items = {'folders': {}, 'reports': {}}
dirList = os.listdir(folder)
for fname in dirList:
name = fname
title = "- * -"
if os.path.isdir(folder + fname) and fname[0] != '.':
# Tratar folders #
if os.path.isfile(folder + fname + '/.birtfolder'):
fd = os.open(folder + fname + '/.birtfolder', os.O_RDONLY)
try:
data = eval(os.read(fd, 4096))
name = data['name']
title = data['title']
finally:
os.close(fd)
items['folders'][fname] = {'name': name, 'title': title}
elif fname[-10:] == '.rptdesign' and fname[0] != '.':
doc = minidom.parse(folder + fname)
root = doc.documentElement
for element in root.childNodes:
if (element.localName == "text-property" and element.hasAttribute("name")):
name = element.getAttribute("name")
value = element.childNodes[0].data
if name == "title":
title = value
elif name == "displayName":
name = value
items['reports'][fname] = {'name': name, 'title': title}
return items
Loading…
Cancel
Save