AlisJK:Daemon

AlisJK:Dari merupakan utilitas pelengkap aplikasi Analisis Lembar Jawaban Komputer (AlisJK), yang memiliki fungsi :

    1. Memproses otomatis setiap hasil scan dari Alisjk:SmartScan

    2. Setiap saat, AlisJK:Daemon akan memantau, apakah ada hasil scan yang masuk ? jika ada hasil scan ini akan dikirim ke AlisJK:ScanAdmin untuk diproses.

    3. Mencatat secara otomatis, berapa berkas LJK yang discan (nama batch, nama orang yang melakukan scan serta waktu scan), sehingga memudahkan proses rekapitulasi LJK untuk kebutuhan validasi jumlah LJK dan jumlah peserta yang hadir

Berikut adalah beberapa paket software yang harus diinstall :

sudo pip install pytz

Pastikan ODKScan_webapp [2] sudah terinstall dengan baik. Untuk integrasi script sederhana ini dengan ODKScan_webapp, dapat melihat commit 591f7bf.

#Memantau apakah ada LJK baru hasil scan yang masuk

#Jika ada, upload ke AlisJK:Scanadmin, jika sudah diupload pindahkan ke folder, done

#Misal :

#Direktori Root : root_dir = root_path_hasil_scan_ljk

#Setiap user yang melakukan proses scan, memiliki direktori sendiri, misal:

# root_dir/wildan

#setiap batch scan disimpan dalam folder baru

# root_dir/wildan/batch1

# misal, file pertama :

# root_dir/wildan/batch1/hasil_scan1.jpg

# Jika sudah dikirim ke AlisJK:ScanAdmin untuk diproses, file akan dipindahkan ke folder done

# root_dir/wildan/batch1/done/hasil_scan.jpg

#

# Untuk menjalankannya :

# python manage.py daemon --template=2

# 2 adalah template id, isi ini sesuai dengan SOP yang diberikan

import os

import time

import datetime

import pytz

from django.utils import timezone

import sys

import uuid

import shutil

from ODKScan_webapp.models import Template, FormImage, LogItem, SmartScan

from ODKScan_webapp import tasks

from optparse import make_option

from django.core.management.base import BaseCommand, CommandError

from django.conf import settings

path = 'root_path_hasil_scan_ljk'

class Command(BaseCommand):

help = "Memantau dan memproses LJK baru hasil scan yang masuk"

option_list = BaseCommand.option_list + (

make_option('--template',

dest='template',

help='Menentukan template id'),

)

def handle(self, *args, **options):

if options['template'] == None :

raise CommandError("Opsi `--template=...` harus ditentukan.")

#print settings.MEDIA_ROOT

#sys.exit(0)

for user_dirs in os.listdir(path):

for batch_dir in os.listdir(os.path.join(path,user_dirs)):

for ljk_file in os.listdir(os.path.join(path,user_dirs,batch_dir)):

if(os.path.isfile(os.path.join(path,user_dirs,batch_dir,ljk_file))):

waktu_scan = time.ctime(os.path.getctime(os.path.join(path,user_dirs,batch_dir,ljk_file)))

the_uuid = str(uuid.uuid4())

ljk_image = os.path.join(the_uuid,'photo',ljk_file)

target = os.path.join(settings.MEDIA_ROOT,the_uuid,'photo',ljk_file)

if not os.path.exists(os.path.dirname(target)):

os.makedirs(os.path.dirname(target))

shutil.copy2(os.path.join(path,user_dirs,batch_dir,ljk_file),target)

os.chown(os.path.join(settings.MEDIA_ROOT,the_uuid), 33, 33)

#done

done_dir = os.path.join(path,user_dirs,batch_dir,'done/')

if not os.path.exists(done_dir):

os.mkdir(os.path.dirname(done_dir))

shutil.move(os.path.join(path,user_dirs,batch_dir,ljk_file), os.path.join(done_dir,ljk_file))

props = {

'name' : user_dirs,

'batch' : batch_dir,

'image' : ljk_image,

'waktu_scan' : pytz.timezone("Asia/Jakarta").localize(datetime.datetime.strptime(waktu_scan, "%a %b %d %H:%M:%S %Y"), is_dst=None)

}

instance = SmartScan(**props)

instance.save()

props = {

'template' : Template.objects.get(id=options['template']),

'batch' : batch_dir,

'image' : ljk_image

}

instance = FormImage(**props)

instance.status = 'q'

instance.save()

tasks.process_image.delay(instance.id)

Referensi