+++++++++++++++++++++++ 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: - `FET (Free Timetabling Software) `_ - `OptaPlanner `_ - `Making a Class Schedule Using a Genetic Algorithm `_ - `Greedy Algorithms `_ UniTime hakkında daha detaylı bilgiye aşağıdaki link üzerinden erişebilirsiniz: http://www.unitime.org 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 | Instructional Offering | | nesnesine denk gelir | | +--------------------------+-----------------------------+ | Egitimin organizasyonu | Configuration | | (sadece teori, | | | teori ve uygulama, vb) | | +--------------------------+-----------------------------+ | 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 | Classes | | Ders icin biraraya | | | gelmis ogrenci toplulugu | | | | | | Ders programinda | | | zamanlanacak nesneler | | | Subelerdir | | +--------------------------+-----------------------------+ | ? | 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: 1. **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ı). 2. **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ı). 3. **Unitime** üzerinde hesaplaması biten akademik ders takviminin Ulakbüs üzerinde bulunan **DersProgrami** modeline kayıt edilmesi. 4. **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: https://github.com/UniTime/unitime/blob/master/Documentation%2FInterfaces%2FExamples%2FdepartmentImport.xml :: 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 = '' # 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.