UniTime Entegrasyonları¶
UniTime Nedir?¶
UniTime, bir araştırma sahası olan “akademik takvimleme problemleri”ni çözmek üzere geliştirilen, açık kaynaklı bir yazılım projesidir. Ulakbüs projesi kapsamında, bu alanda geliştirilmiş diğer projeler incelendiğinde, UniTime’ın daha kararlı bir proje olduğu ortaya çıkmıştır.
Aşağıdaki listede, incelenen diğer projeler ve algoritmalar listelenmektedir:
UniTime hakkında daha detaylı bilgiye aşağıdaki link üzerinden erişebilirsiniz:
Kavram Şeması¶
UniTime ve Ulakbüs yazılımı arasında veri akışını sağlayacak olan entegrasyonları yaparken, iki ayrı projenin farklı terminolojilerinden kaynaklanan bir harita dosyası ihtiyacı duyulmuştur.
Aşağıdaki tabloda Ulakbus modellerinin UniTime projesindeki kavramlara karşılıkları listelenmiştir:
Ulakbüs | UniTime |
---|---|
Building | Building |
Campus | Campus |
Ders | Course |
Cogunlukla bir Ders nesnesine denk gelir | Instructional Offering |
Egitimin organizasyonu (sadece teori, teori ve uygulama, vb) | Configuration |
Donem | Academic Session |
Okutman | Instructors |
Ogrenci | Student |
Personel | Staff |
Program | Subject Area |
Room | Room |
RoomType | Room Type |
Sinav | Exam |
Unit (unit_type=”Bölüm”) | Department |
Sube Ders icin biraraya gelmis ogrenci toplulugu Ders programinda zamanlanacak nesneler Subelerdir |
Classes |
? | Academic Classifications |
? | Academic Areas |
? | Majors |
? | Minors |
? | Student Accommodations |
? | Curriculum Projection Rules |
? | Last-like Enrollments |
Entegrasyon Yöntemi¶
UniTime ve Ulakbüs yazılımı arasında veri akışını sağlayacak olan entegrasyonları yaparken, UniTime projesinin veri giriş/çıkış (data export import) imkan sağlayan XML arabirimi (Data Exchanger) kullanılmıştır. UniTime projesi ile birlikte sunulan örnek Data Exchanger XML dosyalarına aşağıdaki adresten ulaşmanız mümkündür:
https://github.com/UniTime/unitime/tree/master/Documentation/Interfaces/Examples
Entegrasyon kapsamında,
- Akademik Dönem, Kampüs, Bina, Oda
- Okutman, Öğrenci, Personel
- Bölüm, Program, Ders, Öğrenci
Modellerine ait verilerin Ulakbüs üzerinden UniTime’a aktarılması hedeflenmektedir.
Verilerin aktarılmasının ardından hedeflenen işlevsellikler aşağıdaki kapsamdadır:
Güncel akademik dönem boyunca verilecek olan ders programlarının takvimlendirilmesi (ders programlarının varolan dersliklere ve tarih - saatlere dağılımının hesaplanması).
Güncel akademik dönem boyunca yapılacak olan sınavların takvimlendirilmesi (sınavların varolan dersliklere ve tarih - saatlere dağılımının hesaplanması).
Unitime üzerinde hesaplaması biten akademik ders takviminin Ulakbüs üzerinde bulunan DersProgrami modeline kayıt edilmesi.
Unitime üzerinde hesaplaması biten sınav takvimlerinin Ulakbüs üzerinde bulunan Sınav modeline kayıt edilmesi.
Önemli Not: Entegrasyon sırasında dışarıya aktarılan verinin, Ulakbüs üzerinde güncel olarak görünen akademik döneme ait olması hedeflenmiştir. Geçmiş dönemlere ait veriler dışarıya aktarılamaz.
Geçmiş dönemlere ait verilerin dışarıya aktarıma kısıtlanmasının nedeni; bu dönemlere ait işlemlerin Ulakbüs tarafında yeni döneme (güncel akademik döneme) aktarılarak işlenmesidir.
Örnek Entegrasyon¶
Bu örnekte UniTime üzerinde Department olarak adlandırılan ve Ulakbüs üzerinde Bölüm‘e denk düşen kayıtların aktarılması için gerekli XML dosyasının yaratılacağı bir fonksiyon örneklendirilmiştir. Örnek XML şemasına aşağıdaki adreten ulaşılabilir:
class DepartmanAktar(Command):
CMD_NAME = 'departman_aktar'
HELP = 'Akademik bölüm listesi için UniTime XML import dosyası oluşturur.'
PARAMS = []
def run(self):
import os
import datetime
from lxml import etree
from ulakbus.models import Donem, Unit, Campus
root_directory = os.path.dirname(os.path.abspath(__file__))
# Güncel akademik dönemi seç
term = Donem.objects.filter(guncel=True)[0]
# Unit modeli üzerinden üniversite seç
uni = Unit.objects.filter(parent_unit_no=0)[0].yoksis_no
# Unit modeli üzerinden bölümleri seç
units = Unit.objects.filter(unit_type='Bölüm')
# Campus modeli üzerinden kampüs listesini al
campuses = Campus.objects.filter()
doc_type = '<!DOCTYPE departments PUBLIC "-//UniTime//DTD University Course Timetabling/EN" "http://www.unitime.org/interface/Department.dtd">'
# XML ağacını oluştur (create XML tree)
for campus in campuses:
if campus:
root = etree.Element('departments', campus="%s" % uni, term="%s" % term.ad,
year="%s" % term.baslangic_tarihi.year)
for unit in units:
etree.SubElement(root, 'department', externalId="%s" % unit.key,
abbreviation="%s" % unit.yoksis_no, name="%s" % unit.name,
deptCode="%s" % unit.yoksis_no, allowEvents="true")
# Stringi düzgünleştir (string prettify)
s = etree.tostring(root, pretty_print=True, xml_declaration=True, encoding='UTF-8',
doctype="%s" % doc_type)
# Güncel tarih-saat tabanlı export klasörü yarat
current_date = datetime.datetime.now()
directory_name = current_date.strftime('%d_%m_%Y_%H_%M_%S')
export_directory = root_directory + '/bin/dphs/data_exchange/' + directory_name
if not os.path.exists(export_directory):
os.makedirs(export_directory)
# Stringi dosyaya yazdır
out_file = open(export_directory + '/departmentImport.xml', 'w+')
out_file.write("%s" % s)
print("Dosya %s dizini altina kayit edilmistir" % export_directory)
Oluşturulan XML dosyası, UniTime üzerinde **Administration** -> **Academic Sessions** -> **Data Exchange** menüsü ile ulaşabileceğiniz form aracığılığı ile sisteme import edilir.