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.

  1. login sebagai root
  2. cd /usr/local
  3. git clone https://github.com/hudora/pyJasper.git pyJasper
  4. cd pyJasper
  5. python setup.py install

Langkah 2
Buat jasper sebagai sebagai service menggunakan daemontools

  1. $cd /etc/service
  2. $md pyJasper
  3. $vi run
    isikan script berikut ini.

    #!/bin/sh
    echo starting
    exec /usr/local/pyJasper/pyjasper/backend/pyJasper-httpd.sh -Xms128m -Xmx1G
  4. chmod +x run

3. test menggunakan telnet
$telnet localhost 5555

Langkah 3 Buat cron untuk selalu menghapus data /tmp/pyJasper

  1. vi /etc/crontab
  2. 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