class DerslikSinavPlani(Model): class META: verbose_name = _(u'Derslik Sınav Planı') verbose_name_plural = _(u'Derslik Sınav Planları') unique_together = [('derslik', 'zaman_dilimi', 'birim', 'gun')] search_fields = ['derslik', 'birim', 'zaman_dilimi', 'gun', 'durum'] derslik = Room(_(u'Derslik')) birim = Unit(_(u'Bölüm')) donem = Donem(_(u'Güncel Dönem')) zaman_dilimi = SinavZamanDilimi(_(u'Sınav Zaman Dilimi')) durum = field.Integer(_(u"Uygunluk Durumu"), choices=uygunluk_durumu_listele(), default=1, index=True) gun = field.Integer(_(u"Gün"), choices=HAFTA) def __unicode__(self): return '{}/{}/{}'.format(dict(HAFTA)[self.gun], self.zaman_dilimi, dict(uygunluk_durumu_listele())[self.durum])
class SinavEtkinligi(Model): class Meta: verbose_name = _(u'Sınav Etkinliği') verbose_name_plural = _(u'Sınav Etkinlikleri') search_field = ['bolum', 'ders', 'sube', 'donem'] sube = Sube(_(u'Şube'), index=True) ders = Ders(_(u'Ders'), index=True) donem = Donem(_(u'Dönem'), index=True) bolum = Unit(_(u'Bölüm'), index=True) unitime_key = fields.String(index=True) # default False, unitime solver tarafindan True yapilir. solved = fields.Boolean(_(u'Sınav Planı Çözüm Durumu'), index=True, default=False) # unitime cozumunun ardindan, is akisiyla sinav takvimi yayinlanip True yapilir. published = fields.Boolean(_(u'Sınav Planı Yayınlanma Durumu'), index=True, default=False) # sistem servisiyle sinavlarin ardindan True yapilir. archived = fields.Boolean(_(u'Arşivlenmiş'), default=False, index=True) tarih = fields.DateTime(_(u'Sınav Tarihi'), index=True) class SinavYerleri(ListNode): room = Room(_(u'Sınav Yeri'), index=True) @classmethod def sube_sinav_listesi(cls, sube, archived=False, donem=None): """ Şubeye, döneme ve arşive göre sınav etkinliği listesi döndürür. """ donem = donem or Donem.guncel_donem() return [e for e in cls.objects.filter( published=True, sube=sube, archived=archived, donem=donem ).order_by('-tarih')] def __unicode__(self): return '{} {} {}'.format(self.ders.ad, self.sube.ad, self.sinav_zamani()) def sinav_zamani(self): return format_datetime(self.tarih) if self.tarih else _(u'Henüz zamanlanmadi')
class DersEtkinligi(Model): class Meta: verbose_name = _(u"Ders Etkinliği") verbose_name_plural = _(u"Ders Etkinlikleri") search_fields = ['unit_yoksis_no', 'room', 'okutman'] solved = fields.Boolean(_(u'Ders Planı Çözüm Durumu'), index=True) unitime_key = fields.String(index=True) # class id unit_yoksis_no = fields.Integer(_(u'Bölüm Yöksis Numarası'), index=True) room_type = RoomType(_(u'İşleneceği Oda Türü'), index=True) okutman = Okutman(_(u"Öğretim Elemanı"), index=True) sube = Sube(_(u'Şube'), index=True) donem = Donem(_(u'Dönem'), index=True) bolum = Unit(_(u'Bölüm'), index=True) published = fields.Boolean(_(u'Ders Planı Yayınlanma Durumu'), index=True) # Arama amaçlı ders = Ders(_(u'Ders'), index=True) ek_ders = fields.Boolean(index=True) sure = fields.Integer("Ders Etkinliği Süresi", index=True) # teori = field.Integer("Ders Teori Saati", index=True) # uygulama = field.Integer("Ders Uygulama Saati", index=True) # dersin süresinin ne kadarı teori ne kadarı uygulama gibi 2+2, 4+0 gibi # to be calculated room = Room(_(u'Derslik')) gun = fields.String(_(u"Gün"), choices=gun_listele) baslangic_saat = fields.String(_(u"Başlangıç Saati")) baslangic_dakika = fields.String(_(u"Başlangıç Dakikası")) bitis_saat = fields.String(_(u"Bitiş Saati")) bitis_dakika = fields.String(_(u"Bitiş Dakikası")) def post_creation(self): """Yeni bir DersEtkinligi oluşturulduğunda arama amaçlı olan alanları otomatik olarak doldurur.""" self.ders = self.sube.ders self.save() def __unicode__(self): return '%s - %s - %s:%s|%s:%s - %s' % ( self.room.name, self.gun, self.baslangic_saat, self.baslangic_dakika, self.bitis_saat, self.bitis_dakika, self.okutman)
def yeni_donem(ad, baslangic, bitis): d = Donem(ad='%s - %s' % (ad, baslangic.split('.')[2]), baslangic_tarihi=baslangic, bitis_tarihi=bitis) d.blocking_save()
class SinavEtkinligi(Model): class Meta: verbose_name = _(u'Sınav Etkinliği') verbose_name_plural = _(u'Sınav Etkinlikleri') search_field = ['bolum', 'ders', 'sube', 'donem'] sube = Sube(_(u'Şube'), index=True) ders = Ders(_(u'Ders'), index=True) donem = Donem(_(u'Dönem'), index=True) bolum = Unit(_(u'Bölüm'), index=True) unitime_key = fields.String(index=True) # default False, unitime solver tarafindan True yapilir. solved = fields.Boolean(_(u'Sınav Planı Çözüm Durumu'), index=True, default=False) # unitime cozumunun ardindan, is akisiyla sinav takvimi yayinlanip True yapilir. published = fields.Boolean(_(u'Sınav Planı Yayınlanma Durumu'), index=True, default=False) # sistem servisiyle sinavlarin ardindan True yapilir. archived = fields.Boolean(_(u'Arşivlenmiş'), default=False, index=True) tarih = fields.DateTime(_(u'Sınav Tarihi'), index=True) class SinavYerleri(ListNode): room = Room(_(u'Sınav Yeri'), index=True) class Ogrenciler(ListNode): ogrenci = Ogrenci(_(u'Öğrenci')) room = Room(_(u'Sınav Yeri'), index=True) @classmethod def aktif_bolum_sinav_etkinlik_listesi(cls, donem, bolum): """ Verilen bölümün aktif yayınlanmış sınav etkinliklerinin listesini döndürür. """ return [e for e in cls.objects.filter(published=True, archived=False, donem=donem, bolum=bolum)] def sinav_ogrenci_listesi(self): """ Verilen sınav etkinliğine katılacak olan öğrencilerin listesini döndürür. """ return [e.ogrenci for e in self.Ogrenciler] def doluluk_orani_hesapla(self): """ Bir sınav etkinliğine kayıtlı olan öğrencilerin sayısı ile etkinliğin yapılacak sınav yerlerinin toplam kontenjan sayısının birbirine bölünmesi ile elde edilen oranı döndürür. Bu oran öğrencileri odalara dengeli şekilde dağıtmak için kullanılacaktır. """ toplam_kontenjan = sum([e.room.capacity for e in self.SinavYerleri]) doluluk_orani = len(self.Ogrenciler) / float(toplam_kontenjan) return doluluk_orani def ogrencileri_odalara_dagit(self, doluluk_orani): """ Öğrencileri sınavın yapılacağı odalara doluluk oranını göz önüne alarak dengeli bir şekilde dağıtır. """ from math import ceil random.shuffle(self.Ogrenciler) j = 0 for sinav_yeri in self.SinavYerleri: temp = j + int(ceil(sinav_yeri.room.capacity * doluluk_orani)) i = j j = temp for ogrenci in self.Ogrenciler[i:j]: ogrenci.room = sinav_yeri.room self.save() @classmethod def ogrencileri_odalara_rastgele_ata(cls, bolum): """ Bir bölümün yayınlanmış sınav programındaki her bir sınav etkinliğine katılacak olan öğrencileri, sınavın yapılabilineceği odalara rastgele atar, bu atamayı yaparken kontenjan sınırını aşmamasına dikkat edilir. """ donem = Donem.guncel_donem() aktif_sinav_etkinlikleri = cls.aktif_bolum_sinav_etkinlik_listesi(donem, bolum) for etkinlik in aktif_sinav_etkinlikleri: doluluk_orani = etkinlik.doluluk_orani_hesapla() etkinlik.ogrencileri_odalara_dagit(doluluk_orani) def ogrenci_sinav_oda_getir(self, ogrenci): """ Verilen öğrencinin sınava gireceği oda bilgisini döndürür. """ for ogrenci_oda in self.Ogrenciler: if ogrenci_oda.ogrenci == ogrenci: break return ogrenci_oda.room @classmethod def sube_sinav_listesi(cls, sube, archived=False, donem=None): """ Şubeye, döneme ve arşive göre sınav etkinliği listesi döndürür. """ donem = donem or Donem.guncel_donem() return [e for e in cls.objects.filter( published=True, sube=sube, archived=archived, donem=donem ).order_by('-tarih')] def __unicode__(self): return '{} {} {}'.format(self.ders.ad, self.sube.ad, self.sinav_zamani()) def sinav_zamani(self): return format_datetime(self.tarih) if self.tarih else _(u'Henüz zamanlanmadi')
def yeni_donem(ad, baslangic, bitis): d = Donem(ad='%s - %s' % (ad, baslangic.split('.')[2]), baslangic=baslangic, bitis=bitis) d.save()