Reporting dengan PY Jasper
Berikut langkah-langkah yang dijalankan:
Install aplikasi daemon tools$apt-get install daemontools daemontools-run
Install Java$apt-get install openjdk-7-jre
Langkah 1 Install PY Jasper.
- login sebagai root
- cd /usr/local
- git clone https://github.com/hudora/pyJasper.git pyJasper
- cd pyJasper
- python setup.py install
Langkah 2
Buat jasper sebagai sebagai service menggunakan daemontools
- $cd /etc/service
- $md pyJasper
- $vi run
isikan script berikut ini.
#!/bin/sh
echo starting
exec /usr/local/pyJasper/pyjasper/backend/pyJasper-httpd.sh -Xms128m -Xmx1G - chmod +x run
3. test menggunakan telnet$telnet localhost 5555
Langkah 3 Buat cron untuk selalu menghapus data /tmp/pyJasper
- vi /etc/crontab
- tambahkan baris berikut ini
0 1 * * * root /usr/bin/find /tmp/pyJasper/ -mtime +7 -type f -exec /bin/rm {} \;
Langkah 4 install pyJasperClient pada virtual environtment
$cd ~/env/bin
$pip install pyjasper
Langkah 5 Mebuat environment (by Sugiana)
Saat menjalankan pserve melalui terminal maka yang dibutuhkan adalah membuat file /etc/profile.d/pyjasper.sh yang berisi: * export PYJASPER_SERVLET_URL='http://localhost:5555/pyJasper/jasper.py'
Sedangkan saat production yang menggunakan WSGI maka yang perlu ditambahkan pada file wsgi/wsgi_handler.py adalah:
* import os
* os.environ['PYJASPER_SERVLET_URL'] = 'http://localhost:5555/pyJasper/jasper.py'
Langkah 6 Buat report
Setiap report yang dibuat harus bikin dulu xmlnya, kemudian buat Xpath
contoh xml ada di folder reports
dalam python dibuat class untuk setiap report seperti berikut ini:
class r001Generator(JasperGenerator):
def __init__(self):
super(r001Generator, self).__init__()
self.reportname = '/home/aagusti/env/osipkd/osipkd/reports/apbd/R0001.jrxml' #sayang saya belum bisa menemukan cara mendapatkan relative path edit disini
self.xpath = '/apbd/master/urusan'
self.root = ET.Element('apbd')
def generate_xml(self, rows, logo):
xml_a = ET.SubElement(self.root, 'master')
for kode, uraian in rows:
xml_greeting = ET.SubElement(xml_a, 'urusan')
ET.SubElement(xml_greeting, "kode").text = unicode(kode)
ET.SubElement(xml_greeting, "uraian").text = unicode(uraian)
return self.root
Kemudian untuk querynya ada procedure seperti berikut ini:
@view_config(route_name="anggaran_r000_act")
def anggaran_r000_act(self):
req = self.request
params = req.params
url_dict = req.matchdict
if self.logged :
if url_dict['act']=='r001' and self.is_akses_mod('read'):
query = DBSession.query(UrusanModel.kode, UrusanModel.nama).order_by(UrusanModel.kode).all()
generator = r001Generator()
pdf = generator.generate(query, self.logo)
response=req.response
response.content_type="application/pdf"
response.content_disposition='filename=output.pdf'
response.write(pdf)
return response