AlisJK:Daemon
AlisJK:Dari merupakan utilitas pelengkap aplikasi Analisis Lembar Jawaban Komputer (AlisJK), yang memiliki fungsi :
Memproses otomatis setiap hasil scan dari Alisjk:SmartScan
Setiap saat, AlisJK:Daemon akan memantau, apakah ada hasil scan yang masuk ? jika ada hasil scan ini akan dikirim ke AlisJK:ScanAdmin untuk diproses.
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
Tracking Changes in Directories with Python, http://thomassileo.com/blog/2013/12/12/tracking-changes-in-directories-with-python/
ODKScan_webapp, https://github.com/nathanathan/ODKScan_webapp