class BapFormListesi(ListNode): class Meta: title = __(u"BAP Form Listesi") key = fields.String("Key", hidden=True) sec = fields.Boolean(__(u"Projeye Dahil Et"), type="checkbox") ad = fields.String(__(u"Form Adı"), index=True) file = fields.File( __(u"File"), index=True, random_name=True ) # form eger PDF olarak yulendiyse bu alan kullanilir. gereklilik = fields.Boolean(__(u"Zorunluluk"), type="checkbox", required=False)
class IzinBasvuruForm(forms.JsonForm): """ İzin Başvuru iş akışı için kullanılacak formdur. """ izin_turleri = ((1, gettext_lazy("Yıllık İzin")), (2, gettext_lazy("Mazeret İzni")), (3, gettext_lazy("Refakat İzni")), (4, gettext_lazy("Fazla Mesai İzni")), (5, gettext_lazy("Ücretsiz İzin")), ) gecerli_yil = date.today().year yillar = ((gecerli_yil, gecerli_yil),) izin_turu = fields.Integer(gettext_lazy(u"İzin Türü Seçiniz"), choices=izin_turleri) izin_ait_yil = fields.Integer(gettext_lazy(u"Ait Olduğu Yıl"), choices=yillar) izin_baslangic = fields.Date(gettext_lazy(u"İzin Başlangıç Tarihi")) izin_bitis = fields.Date(gettext_lazy(u"İzin Bitiş Tarihi")) izin_adres = fields.Text(gettext_lazy(u"İzindeki Adres")) personel_ad_soyad = fields.String(gettext_lazy(u"İzin Talep Eden")) personel_gorev = fields.String(gettext_lazy(u"Görevi")) personel_sicil_no = fields.String(gettext_lazy(u"Sicil no")) personel_birim = fields.String(gettext_lazy(u"Birimi")) yol_izni = fields.Boolean(gettext_lazy(u"Yol İzni")) toplam_izin_gun = fields.Integer(gettext_lazy(u"Kullanacağı İzin Süresi(Gün)")) toplam_kalan_izin = fields.Integer(gettext_lazy(u"Kalan İzin Süresi(Gün)")) ileri = fields.Button(gettext_lazy(u"İleri"))
class Kalem(ListNode): class Meta: title = __(u"Bütçe Kalemleri") sec = fields.Boolean(_(u"Seç"), type="checkbox") ad = fields.String(_(u"Tanımı/Adı"), readonly=True) adet = fields.Integer(_(u"Adet"), readonly=True) toplam_fiyat = fields.Float(_(u"Toplam Fiyat"), readonly=True) butce_plan_key = fields.String(_(u"Key"), hidden=True)
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)
class Personel(ListNode): key = fields.String("Key", hidden=True) sec = fields.Boolean(gettext_lazy(u"Seç"), type="checkbox") tckn = fields.String(gettext_lazy(u"TCK No")) ad_soyad = fields.String(gettext_lazy(u"Ad")) kadro_derece = fields.String(gettext_lazy(u"Kadro Derece")) #tn: Görev Aylığı gorev_ayligi = fields.String(gettext_lazy(u"GA")) #tn: Kazanılmış Hak kazanilmis_hak = fields.String(gettext_lazy(u"KH")) #tn: Emekli Muktesebat emekli_muktesebat = fields.String(gettext_lazy(u"EM")) # tn: Yeni Görev Aylığı yeni_gorev_ayligi = fields.String(gettext_lazy(u"Yeni GA")) #tn: Yeni Kazanılmış Hak yeni_kazanilmis_hak = fields.String(gettext_lazy(u"Yeni KH")) #tn: Yeni Emekli Muktesebat yeni_emekli_muktesebat = fields.String(gettext_lazy(u"Yeni EM"))
class Donemler(ListNode): secim = fields.Boolean(type="checkbox") donem = fields.String(gettext_lazy(u'Dönem')) key = fields.String('Key', hidden=True) aciklama = fields.String(gettext_lazy(u'Aciklama'))
def not_kontrol(self): """Okutmanların girmiş olduğu öğrenci notlarının listelenmesini sağlayan method. Bu method hem ``sinav_kontrol`` methodu hem de ``not_girisi`` methodları üzerinden yapılan yönlendirmeleri karşılar. Eğer seçilen sınava ait notlar onaylanmış (teslim edilmiş) ise ``not_giris`` methoduna başlı olan not giriş adımı atlanarak bu adıma yönlendirme yapılmaktadır. Bu durumda notlar, veritabanı üzerinden alınarak listelenirken, ``not_girisi`` adımından gelen yönlendirmelerde form ile birlikte gönderilen veriler listelenmektedir. ``sinav_kontrol`` methodu ile yapılan yönlendirmelerde notlar üzerinde herhangi bir güncelleme, değişiklik yapılamayacağı için bu operasyonlara ait form düğmeleri gösterilmemekte ve okutmana bu dersler üzerinde bir değişiklik yapamayacağını bildiren bir mesaj kutusu gösterilmektedir. """ _form = forms.JsonForm(current=self.current, title=_(u"Not Önizleme Ekranı")) try: # Eğer istek sinav_kontrol aşamasından yönlendirilmemişse öğrenci notları için formdan gelen veriyi kullan ogrenci_notlar = self.current.input['form']['Ogrenciler'] self.current.task_data["notlar"] = ogrenci_notlar notlar = [] for ogr in ogrenci_notlar: ogrnot = OrderedDict({}) ogrnot[_(u'Öğrenci No')] = ogr['ogrenci_no'] ogrnot[_(u'Adı Soyadı')] = ogr['ad_soyad'] ogrnot[_(u'Değerlendirme')] = ogr['degerlendirme'] ogrnot[_(u'Açıklama')] = ogr['aciklama'] notlar.append(ogrnot) except: # Eğer istek sinav_kontrol aşamasından yönlendirilmişse notlar için veritabanı kayıtlarını kullan sinav_key = self.current.task_data['sinav_key'] sube_key = self.current.task_data["sube"] sinav = Sinav.objects.get(sinav_key) ogrenciler = OgrenciDersi.objects.filter(sube_id=sube_key) notlar = [] for ogr in ogrenciler: try: # Öğrencinin bu sınava ait daha önceden kayıtlı notu var mı? degerlendirme = DegerlendirmeNot.objects.get( sinav=sinav, ogrenci=ogr.ogrenci_program.ogrenci) puan = degerlendirme.puan aciklama = degerlendirme.aciklama except: puan = 0 aciklama = "" ogrnot = OrderedDict({}) ogrnot[_(u'Öğrenci No')] = ogr.ogrenci_program.ogrenci_no ogrnot[_(u'Adı Soyadı')] = '%s %s' % ( ogr.ogrenci_program.ogrenci.ad, ogr.ogrenci_program.ogrenci.soyad) ogrnot[_(u'Değerlendirme')] = puan ogrnot[_(u'Açıklama')] = aciklama notlar.append(ogrnot) # Eğer notlar okutman tarından onaylanmışsa (teslim edilmişse) uyarı göster if self.current.task_data['sinav_degerlendirme']: self.current.output['msgbox'] = { 'type': 'info', "title": _(u'Notlar Onaylandı'), "msg": _(u'Bu derse ait notlar onaylanmış olduğu için içeriği değiştirilemez.' ) } _form.ders_secim = fields.Button(_(u"Ders Seçim Ekranına Dön"), cmd="ders_sec", flow="ders_secim_adimina_don") _form.sinav_secim = fields.Button(_(u"Sınav Seçim Ekranına Dön"), cmd="sinav_sec", flow="sinav_secim_adimina_don") else: # Eğer notlar hala onaylanmamışsa (teslim edilmemişse) form düğmelerini göster _form.not_onay = fields.Boolean( _(u"Sınav Notlarını Onaylıyorum (Bu işlem geri alınamaz!)")) _form.not_duzenle = fields.Button(_(u"Notları Düzenle"), cmd="not_girisi", flow="not_giris_formuna_don") _form.kaydet = fields.Button(_(u"Kaydet"), cmd="not_kaydet", flow="end") _form.kaydet_ve_ders_sec = fields.Button( _(u"Kaydet ve Ders Seçim Ekranına Dön"), cmd="ders_sec", flow="ders_adimina_don") _form.kaydet_ve_sinav_sec = fields.Button( _(u"Kaydet ve Sınav Seçim Ekranına Dön"), cmd="sinav_sec", flow="sinav_adimina_don") self.current.output['object'] = { "type": "table-multiRow", "fields": notlar, "actions": False } self.form_out(_form)
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')
class OkutmanListesi(ListNode): secim = fields.Boolean(gettext_lazy(u"Seçim"), type="checkbox") okutman = fields.String(gettext_lazy(u'Okutman')) key = fields.String(hidden=True)
class Okutmanlar(ListNode): secim = fields.Boolean(gettext_lazy(u'Seçim'), type="checkbox") ad_soyad = fields.String(gettext_lazy(u'Ad Soyad')) key = fields.String(gettext_lazy(u'Key'), hidden=True)
class Kalemler(ListNode): sec = fields.Boolean(__(u"Seç"), type="checkbox", default=False) kalem = fields.String(__(u"Kalem")) kalem_key = fields.String(__(u"Kalem Key"), hidden=True)
class OkutmanListesi(ListNode): secim = fields.Boolean(_(u"Seçim"), type="checkbox") okutman = fields.String(_(u'Okutman'), index=True) key = fields.String(hidden=True)