Membangun Aplikasi Mini HRD dengan Django (7): Membuat Laporan Kehadiran dengan Reportlab

Ridwan Fajar 26 Juni 2016

Membangun Aplikasi Mini HRD dengan Django (7): Membuat Laporan Kehadiran dengan Reportlab

Tak terasa, tutorial berseri Django ini sudah mencapai bagian ketujuh. Bagi Anda yang mengikutinya dari awal mungkin sekarang sudah dapat membuat sebuah aplikasi yang tentunya dapat memuaskan hati Anda. Tapi bagi Anda yang baru melihat tutorial ini, Anda dapat membaca episode awal dari tutorial ini hingga bagian keenam. Jika di tutorial sebelumnya kita membahas tentang pagination, maka di tutorial yang ketujuh ini kita akan membuat sebuah fitur untuk mencetak laporan sederhana dalam format PDF.

Di dokumentasi Django sendiri, telah ada sebuah tutorial singkat yang membahas tentang membuat sebuah file non-HTML seperti CSV dan PDF. Modul yang digunakan untuk membuat PDF di Django salah satunya adalah ReportLab. Sebuah modul yang sudah sangat mature untuk menghasilkan konten berupa PDF. ReportLab sendiri merupakan sebuah modul Python yang tidak hanya dapat dipasang dengan Django. Web framework apappun yang berbasis Python dapat menggunakan ReportLab. ReportLab memiliki dokumentasi yang cukup baik sehingga peminatnya cukup banyak.

Kali ini kita akan menambahkan fitur cetak PDF, di halaman melihat daftar hadir. Saatnya kita ngodinggg!.

Instalasi Reportlab

Sebelum memulai tahap coding, kita harus memasang terlebih dahulu modul ReportLab dengan menggunakan PIP (Python Index Package). Berikut adalah cara memasang ReportLab dengan PIP melalui console:
$ pip install reportlab
Setelah selesai terpasang, mari kita lanjutkan ke bagian tutorial berikutnya. Mari gan!

Membuat views pembuat laporan kehadiran

Disini kita akan sedikit bekerja lebih keras dan teliti. Pertama mari kita tambahkan code untuk meng-import berbagai modul yang dibutuhkan untuk membuat laporan dalam format PDF dengan menggunakan ReportLab:. Tambahkan kode berikut dibawah kode import terakhir di file kehadiran/views.py:
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import inch
from reportlab.lib.pagesizes import A4, landscape
from reportlab.lib import colors
Pada kode diatas, kita import beberapa bagian dokumen seperti template, paragraf, spacer, dan tabel. Kemudian kita importjuga beberapa style seperti untuk tabel dan paragraf. Beberapa komponen penting lainnya kita sertakan juga seperti ukuran dalam inch, ukuran kertas A4, orientasi kertas berupa landscape, dan beberapa kumpulan warna yang sebagian warnanya akan digunakan untuk membuat file dokumen kita nanti.

Sekarang mari kita lanjutkan ke bagian inti dari tutorial ini. Silahkan tambahkan views berikut di bagian paling bawah file kehadiran/views.py. Buat kode berikut tepat dibawah views lainnya yang sudah dikerjakan:

.............................................


@login_required(login_url=settings.LOGIN_URL)
def cetak_daftar_hadir(request, bulan, tahun):
    # pengaturan respon berformat pdf
    filename = "daftar_hadir_" + str(bulan) + "_" + str(tahun)
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="' + filename + '.pdf"'

    # mengambil daftar kehadiran dan mengubahnya menjadi data ntuk tabel
    data = Kehadiran.objects.filter(waktu__year=tahun, waktu__month=bulan, karyawan__id=request.session['karyawan_id'])
    table_data = []
    table_data.append([ "Tanggal", "Status" ])
    for x in data:
        table_data.append([ x.waktu, x.jenis_kehadiran ])


    # membuat dokumen baru
    doc = SimpleDocTemplate(response, pagesize=A4, rightMargin=72, leftMargin=72, topMargin=72, bottomMargin=18)
    styles = getSampleStyleSheet()

    # pengaturan tabel di pdf
    table_style = TableStyle([
                               ('ALIGN',(1,1),(-2,-2),'RIGHT'),
                               ('FONT', (0, 0), (-1, 0), 'Helvetica-Bold'),
                               ('VALIGN',(0,0),(0,-1),'TOP'),
                               ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
                               ('BOX', (0,0), (-1,-1), 0.25, colors.black),
                           ])
    kehadiran_table = Table(table_data, colWidths=[doc.width/4.0]*2)
    kehadiran_table.setStyle(table_style)

    # mengisi pdf
    content = []
    content.append(Paragraph('Daftar Kehadiran %s/%s' % (bulan, tahun), styles['Title']))
    content.append(Spacer(1,12))
    content.append(Paragraph('Berikut ini adalah hasil rekam jejak kehadiran Anda selama bulan %s tahun %s:' % (bulan, tahun), styles['Normal']))
    content.append(Spacer(1,12))
    content.append(kehadiran_table)
    content.append(Spacer(1,36))
    content.append(Paragraph('Mengetahui, ', styles['Normal']))
    content.append(Spacer(1,48))
    content.append(Paragraph('Mira Kumalasari, Head of Department PT. Ngabuburit Sentosa Sejahtera. ', styles['Normal']))

    # menghasilkan pdf untk di download
    doc.build(content)
    return response

Sekarang mari kita telaah bagian - bagian penting dari kode diatas. Views untuk mencetak PDF diatas kita namai dengan cetak_daftar_hadir() dengan parameter "bulan" dan "tahun" yang diinginkan. Kemudian kita bentengi views tersebut dengan decorator login_required() agar hanya user yang sudah login yang boleh mengeksekusi views ini. Sekarang mari kita ke blok yang pertama, dimana kita membuat sebuah nama untuk file PDF yang akan di-generate. Kita namai dengan format "daftar_hadir_[ bulan ]_[ tahun ]". Setelah itu kita atur header untuk response yang akan dihadapkan kepada user menjadi response berupa download file. Kita ubah response menjadi "application/pdf" yang biasanya "text/html".

Di blok berikutnya, kita ambil daftar hadir di bulan dan tahun yang diinginkan. Kemudian kita kemas data kehadiran tersebut ke dalam sebuah list, untuk diproses oleh Reportlab. Sebelum membuat tabel, kita buat dulu template dokumen baru dengan ukuran A4 dan margin yang ditentukan. Kemudian kita atur juga style yang akan diterapkan pada tabel yang akan dicetak di halaman PDF. Berikutnya kita buat tabel yang memperlihatkan daftar hadir beserta penerapan style tabel yang telah diatur sebelumnya.

Berikutnya kita mulai membuat isi lainnya seperti judul dokumen, paragraf pertama dari dokumen, kemudian menyisipkan jarak antar paragraf, memasukkan tabel yang telah didefinisikan sebelumnya, dan menampilkan akhir dari dokumen berupa kolom tanda tangan. Setelah siap dengan pendefinisian dokumen, sekarang kita buat file tersebut dan dikembalikan menjadi sebuah response berupa download di hadapan user.

Tapi tunggu kita belum dapat mengeksekusi kode diatas karena kita harus menambahkan dulu tombol "cetak PDF" di halaman daftar hadir. Ayo kita lanjutkan perjalanan kita!

Mengubah template daftar hadir

Karena kita perlu membuat sebuah trigger untuk mengunduh file PDF yang kita inginkan, maka tambahkanlah tombol "Cetak PDF" di template* "kehadiran/templates/new/daftar_hadir.html tepat di setelah tombol "Tampilkan Grafik":
..........................................................
<br/>
{% if daftar_hadir %}
<a href="/daftar_hadir/grafik/{{ bulan }}/{{ tahun }}" class="btn btn-info"><i class="fa fa-bar-chart-o"></i> Tampilkan Grafik</a>
<a href="/daftar_hadir/cetak/{{ bulan }}/{{ tahun }}" class="btn btn-primary"><i class="fa fa-file-pdf-o"></i> Cetak PDF</a>
{% endif %}

..........................................................

Sekarang mari kita lihat hasilnya seperti pada gambar berikut ini:

 

Penutup

Sekarang Anda sudah mengetahui salah satu cara untuk menghasilkan file PDF di Django. ReportLab membantu Anda untuk membuat file di Django. Banyak sekali yang dapat diekplor untuk membuat file PDF dengan menggunakan ReportLab dan Python. Anda dapat membuat laporan keuangan hingga sebuah jurnal bila Anda sudah menguasai ReportLab lebih jauh. Dengan tutorial ini, semoga Anda dapat membuat sebuah sesuatu yang menakjubkan dengan Django dan Reportlab. Sampai jumpa di tutorial bagian ke delapan.

(rfs/djangoproject)