Ejemplo n.º 1
0
    def proje_mesajlari(proje_id):
        """Proje mesajlarini gosterir"""
        proje_yurutucusu_mu = ProjeYurutucusu().fulfill(user=current_user)
        proje = DB.session.query(Proje).options(
            joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                OgretimElemani.personel).load_only("id").joinedload(
                    Personel.person).load_only("ad", "soyad"),
            lazyload(Proje.proje_detayi),
            lazyload(Proje.kabul_edilen_proje_hakemleri),
            lazyload(Proje.proje_hakem_onerileri),
            lazyload(Proje.proje_destekleyen_kurulus),
            lazyload(Proje.proje_kalemleri),
        ).filter(
            Proje.id == proje_id,
            or_(
                Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi,
                Proje.proje_basvuru_durumu ==
                ProjeBasvuruDurumu.revizyon_bekleniyor)).first()

        next_states_info = get_next_states_info(proje_id=proje_id)
        actions_info = get_actions_info(proje_id=proje_id)

        proje_mesajlari = DB.session.query(Mesaj).join(
            ProjeMesaj, ProjeMesaj.mesaj_id == Mesaj.id).filter(
                ProjeMesaj.proje_id == proje_id).all()

        return render_template('dashboard/proje_mesajlari.html',
                               proje_id=proje_id,
                               next_states_info=next_states_info,
                               proje_mesajlari=proje_mesajlari,
                               proje_yurutucusu_mu=proje_yurutucusu_mu,
                               actions_info=actions_info,
                               proje=proje)
Ejemplo n.º 2
0
class ProjeNotlariView(FlaskView):
    """
    Proje Notlari
    """
    @staticmethod
    @login_required
    @auth.requires(
        Permission(*permission_dict["bap"]["proje"]["dashboard"]
                   ["proje_notlari_goruntuleme"]),
        Or(ProjeYurutucusu(), Role('BAP Yetkilisi'), Role('BAP Admin')))
    @route("<int:proje_id>/dashboard/notlar",
           methods=["GET"],
           endpoint="proje_notlari")
    def proje_notlari(proje_id):
        """
        projeye eklenen özel notları görüntüler
        Args:
            proje_id(int): projenin id si

        Returns:

        """
        proje = DB.session.query(Proje).options(
            joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                OgretimElemani.personel).load_only("id").joinedload(
                    Personel.person).load_only("ad", "soyad"),
            lazyload(Proje.proje_detayi),
            lazyload(Proje.kabul_edilen_proje_hakemleri),
            lazyload(Proje.proje_hakem_onerileri),
            lazyload(Proje.proje_destekleyen_kurulus),
            lazyload(Proje.proje_kalemleri),
        ).filter(
            Proje.id == proje_id,
            or_(
                Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi,
                Proje.proje_basvuru_durumu ==
                ProjeBasvuruDurumu.revizyon_bekleniyor)).first()
        next_states_info = get_next_states_info(proje_id=proje_id)
        actions_info = get_actions_info(proje_id=proje_id)

        proje_yurutucusu_mu = ProjeYurutucusu().fulfill(user=current_user)
        proje_notlari = DB.session.query(
            ProjeNot, Person.ad.label("ad"),
            Person.soyad.label("soyad")).filter(
                ProjeNot.proje_id == proje_id).join(
                    Person,
                    Person.user_id == ProjeNot.notu_ekleyen_yetkili).all()

        if not proje:
            pass
            # todo: proje bulunamadı hatası dön

        return render_template("dashboard/proje_notlari.html",
                               proje=proje,
                               next_states_info=next_states_info,
                               proje_yurutucusu_mu=proje_yurutucusu_mu,
                               actions_info=actions_info,
                               proje_notlari=proje_notlari,
                               proje_id=proje.id)
Ejemplo n.º 3
0
class ProjeRevizyon(FlaskView):
    """Proje revizyon view classı"""

    @staticmethod
    @login_required
    @auth.requires(
        And(Permission(*permission_dict["bap"]["proje"]["basvuru"]["proje_basvurusu_yapma"]),
            And(TamamlanmamisProjeBasvurusu(), ProjeYurutucusu())))
    @route('/revizyon/<int:proje_id>', methods=['GET'])
    def proje_revizyon_get(proje_id):
        """
        Proje yetkilisi tarafindan gerekli gorulup yurutucuden proje revizyonu yapmasi istenirse
        bu view methodu kullanilir.
        Projenin ilgili state durumunda olup olmadigi(P9 - Başvurunun onaylanması için yürütücü
        revizyonu bekleniyor (ilgili state id = 9))  kontrolu yapilir.
        :param proje_id: revizyon beklenen projenin id si
        :return:
        """
        user_id = current_user.id
        revizyon_proje = DB.session.query(Proje).filter(
            Proje.id == Proje.id,
            Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.revizyon_bekleniyor).first()
        if not revizyon_proje:
            CustomErrorHandler.error_handler(
                hata="Revizyon istenmeyen bir proje revize edilmeye "
                     "calisildi".format(user_id, proje_id))
            return abort(404)

        proje_turu = get_proje_turu_with_related_field(revizyon_proje.proje_turu, False)
        proje_turu_dict = proje_turu_to_dict(proje_turu)
        yurutucu_calisan_id = None

        yurutucu_calisan = DB.session.query(ProjeCalisanlari).filter_by(
            proje_id=proje_id,
            personel_id=revizyon_proje.yurutucu).first()
        if yurutucu_calisan:
            yurutucu_calisan_id = yurutucu_calisan.id

        form_data = get_proje_data(proje_turu_dict, revizyon_proje)

        proje_formu = basvuru_formu_restriction(proje_turu_dict=proje_turu_dict, **form_data)
        return render_template(
            'arastirma_projesi_basvuru/arastirma_proje_basvurusu.html',
            yeni_basvuru_formu=proje_formu,
            proje_tur_dict=proje_turu.to_dict(),
            proje_id=proje_id,
            proje_hakem_onerileri=revizyon_proje.proje_hakem_onerileri,
            proje_calisanlari=[calisan for calisan in revizyon_proje.proje_calisanlari if
                               not (
                                           revizyon_proje.yurutucu and revizyon_proje.yurutucu == calisan.personel_id)],
            yurutucu_calisan_id=yurutucu_calisan_id,
            taslak_mi=False,
            revizyon_bekleniyor_mu=True,
            uyari_mesajlari=proje_turu_dict.get("genel_uyari_mesajlari", None)
        )
Ejemplo n.º 4
0
class ProjeKararlariView(FlaskView):
    """Proje kararları listeleme"""
    @staticmethod
    @login_required
    @auth.requires(
        And(
            Permission(*permission_dict["bap"]["proje"]["dashboard"]
                       ["proje_kararlari_goruntuleme"]),
            Or(ProjeYurutucusu(), Role('BAP Yetkilisi'), Role("BAP Admin"))))
    @route('<int:proje_id>/dashboard/karar',
           methods=["GET"],
           endpoint='proje_kararlari_listele')
    def proje_kararlari(proje_id):
        """Yönetim Kurulu Kararları Listesi Ekrani"""
        proje_yurutucusu_mu = ProjeYurutucusu().fulfill(user=current_user)

        proje = DB.session.query(Proje).options(
            joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                OgretimElemani.personel).load_only("id").joinedload(
                    Personel.person).load_only("ad", "soyad"),
            lazyload(Proje.proje_detayi),
            lazyload(Proje.kabul_edilen_proje_hakemleri),
            lazyload(Proje.proje_hakem_onerileri),
            lazyload(Proje.proje_destekleyen_kurulus),
            lazyload(Proje.proje_kalemleri),
        ).filter(
            Proje.id == proje_id,
            or_(
                Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi,
                Proje.proje_basvuru_durumu ==
                ProjeBasvuruDurumu.revizyon_bekleniyor)).first()

        next_states_info = get_next_states_info(proje_id=proje_id)
        actions_info = get_actions_info(proje_id=proje_id)
        try:
            karar_listesi = DB.session.query(BapGundem).filter(
                BapGundem.proje_id == proje_id,
                BapGundem.karar_durum != KararDurumu.degerlendirilmedi)
        except SQLAlchemyError as exc:
            CustomErrorHandler.error_handler(
                hata="Proje kararları sorgusunda hata oluştu  "
                "Hata: {}, User id: {}, Proje id: {}".format(
                    exc, current_user.id, proje_id))

            return abort(500)

        return render_template("dashboard/proje_kararlari.html",
                               karar_listesi=karar_listesi,
                               proje_id=proje_id,
                               proje=proje,
                               next_states_info=next_states_info,
                               actions_info=actions_info,
                               proje_yurutucusu_mu=proje_yurutucusu_mu)
Ejemplo n.º 5
0
    def islem_gecmisi(self, proje_id):
        """
        Projenin islem gecmisine ulasmak icin kullanilir
        :param proje_id: proje_id(int)
        :return: http response
        """
        proje_yurutucusu_mu = ProjeYurutucusu().fulfill(user=current_user)
        params = {"proje_id": proje_id}
        try:
            proje = DB.session.query(Proje).options(
                joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                    OgretimElemani.personel).load_only("id").joinedload(
                        Personel.person).load_only("ad", "soyad"),
                lazyload(Proje.proje_detayi),
                lazyload(Proje.kabul_edilen_proje_hakemleri),
                lazyload(Proje.proje_hakem_onerileri),
                lazyload(Proje.proje_destekleyen_kurulus),
                lazyload(Proje.proje_kalemleri),
            ).filter(
                Proje.id == proje_id,
                or_(
                    Proje.proje_basvuru_durumu ==
                    ProjeBasvuruDurumu.tamamlandi, Proje.proje_basvuru_durumu
                    == ProjeBasvuruDurumu.revizyon_bekleniyor)).first()

            next_states_info = get_next_states_info(proje_id=proje_id)
            actions_info = get_actions_info(proje_id=proje_id)

            islem_listesi = DB.session.query(AppStateTracker). \
                filter(AppStateTracker.params.contains(params),
                       or_(AppStateTracker.job_type == JobTypes.project_state_change,
                            AppStateTracker.job_type == JobTypes.project_action)). \
                       join(Person, Person.user_id == AppStateTracker.triggered_by). \
                       join(AppState, AppStateTracker.state_id == AppState.id). \
                       add_columns(
                           AppState.state_code,
                           Person.ad,
                           Person.soyad,
                       ).all()

        except Exception as exc:
            CustomErrorHandler.error_handler(
                hata="Proje işlem geçmişi görüntülenirken hata oluştu."
                "Hata: {}, Proje id: {}".format(proje_id, exc))
            return abort(500)

        return render_template("dashboard/proje_islem_gecmisi.html",
                               islem_listesi=islem_listesi,
                               proje_id=proje_id,
                               proje=proje,
                               next_states_info=next_states_info,
                               actions_info=actions_info,
                               proje_yurutucusu_mu=proje_yurutucusu_mu)
Ejemplo n.º 6
0
    def proje_notlari(proje_id):
        """
        projeye eklenen özel notları görüntüler
        Args:
            proje_id(int): projenin id si

        Returns:

        """
        proje = DB.session.query(Proje).options(
            joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                OgretimElemani.personel).load_only("id").joinedload(
                    Personel.person).load_only("ad", "soyad"),
            lazyload(Proje.proje_detayi),
            lazyload(Proje.kabul_edilen_proje_hakemleri),
            lazyload(Proje.proje_hakem_onerileri),
            lazyload(Proje.proje_destekleyen_kurulus),
            lazyload(Proje.proje_kalemleri),
        ).filter(
            Proje.id == proje_id,
            or_(
                Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi,
                Proje.proje_basvuru_durumu ==
                ProjeBasvuruDurumu.revizyon_bekleniyor)).first()
        next_states_info = get_next_states_info(proje_id=proje_id)
        actions_info = get_actions_info(proje_id=proje_id)

        proje_yurutucusu_mu = ProjeYurutucusu().fulfill(user=current_user)
        proje_notlari = DB.session.query(
            ProjeNot, Person.ad.label("ad"),
            Person.soyad.label("soyad")).filter(
                ProjeNot.proje_id == proje_id).join(
                    Person,
                    Person.user_id == ProjeNot.notu_ekleyen_yetkili).all()

        if not proje:
            pass
            # todo: proje bulunamadı hatası dön

        return render_template("dashboard/proje_notlari.html",
                               proje=proje,
                               next_states_info=next_states_info,
                               proje_yurutucusu_mu=proje_yurutucusu_mu,
                               actions_info=actions_info,
                               proje_notlari=proje_notlari,
                               proje_id=proje.id)
Ejemplo n.º 7
0
    def proje_rapor_get(self, proje_id):
        """Proje raporlarini goruntulemek icin kullanilir"""

        proje_yurutucusu_mu = ProjeYurutucusu().fulfill(user=current_user)
        atanmis_hakem = AtanmisHakem()
        proje = DB.session.query(Proje).options(
            joinedload(Proje.proje_proje_turu).load_only(
                "ara_rapor_sablon_id", "sonuc_raporu_sablon_id"),
            joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                OgretimElemani.personel).load_only("id").joinedload(
                    Personel.person).load_only("ad", "soyad"),
            joinedload(Proje.proje_raporlari),
            lazyload(Proje.proje_detayi),
            lazyload(Proje.kabul_edilen_proje_hakemleri),
            lazyload(Proje.proje_hakem_onerileri),
            lazyload(Proje.proje_destekleyen_kurulus),
            lazyload(Proje.proje_kalemleri),
        ).filter(
            Proje.id == proje_id,
            or_(
                Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi,
                Proje.proje_basvuru_durumu ==
                ProjeBasvuruDurumu.revizyon_bekleniyor)).first()
        next_states_info = get_next_states_info(proje_id=proje_id)
        actions_info = get_actions_info(proje_id=proje_id)
        ara_rapor_degerlendirme_sablon_id = proje.proje_proje_turu.ara_rapor_sablon_id
        sonuc_raporu_degerlendirme_sablon_id = proje.proje_proje_turu.sonuc_raporu_sablon_id

        return render_template(
            'dashboard/proje_raporlari.html',
            ara_rapor_degerlendirme_sablon_id=ara_rapor_degerlendirme_sablon_id,
            sonuc_raporu_degerlendirme_sablon_id=
            sonuc_raporu_degerlendirme_sablon_id,
            proje_raporlari=proje.proje_raporlari,
            proje_id=proje_id,
            proje=proje,
            proje_yurutucusu_mu=proje_yurutucusu_mu,
            next_states_info=next_states_info,
            actions_info=actions_info,
            rapor_duzenle_formu=RaporForm(),
            atanmis_hakem=atanmis_hakem)
Ejemplo n.º 8
0
    def proje_kararlari(proje_id):
        """Yönetim Kurulu Kararları Listesi Ekrani"""
        proje_yurutucusu_mu = ProjeYurutucusu().fulfill(user=current_user)

        proje = DB.session.query(Proje).options(
            joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                OgretimElemani.personel).load_only("id").joinedload(
                    Personel.person).load_only("ad", "soyad"),
            lazyload(Proje.proje_detayi),
            lazyload(Proje.kabul_edilen_proje_hakemleri),
            lazyload(Proje.proje_hakem_onerileri),
            lazyload(Proje.proje_destekleyen_kurulus),
            lazyload(Proje.proje_kalemleri),
        ).filter(
            Proje.id == proje_id,
            or_(
                Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi,
                Proje.proje_basvuru_durumu ==
                ProjeBasvuruDurumu.revizyon_bekleniyor)).first()

        next_states_info = get_next_states_info(proje_id=proje_id)
        actions_info = get_actions_info(proje_id=proje_id)
        try:
            karar_listesi = DB.session.query(BapGundem).filter(
                BapGundem.proje_id == proje_id,
                BapGundem.karar_durum != KararDurumu.degerlendirilmedi)
        except SQLAlchemyError as exc:
            CustomErrorHandler.error_handler(
                hata="Proje kararları sorgusunda hata oluştu  "
                "Hata: {}, User id: {}, Proje id: {}".format(
                    exc, current_user.id, proje_id))

            return abort(500)

        return render_template("dashboard/proje_kararlari.html",
                               karar_listesi=karar_listesi,
                               proje_id=proje_id,
                               proje=proje,
                               next_states_info=next_states_info,
                               actions_info=actions_info,
                               proje_yurutucusu_mu=proje_yurutucusu_mu)
Ejemplo n.º 9
0
    def proje_personelleri(proje_id):
        """
        projenin personel bilgilerine ulaşmak için kullanılır
        Args:
            proje_id(int): projenin id si

        Returns:

        """

        proje_yurutucusu_mu = ProjeYurutucusu().fulfill(user=current_user)
        proje = DB.session.query(Proje).options(
            joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                OgretimElemani.personel).load_only("id").joinedload(
                    Personel.person).load_only("ad", "soyad"),
            joinedload(Proje.proje_calisanlari),
            lazyload(Proje.proje_detayi),
            lazyload(Proje.kabul_edilen_proje_hakemleri),
            lazyload(Proje.proje_hakem_onerileri),
            lazyload(Proje.proje_destekleyen_kurulus),
            lazyload(Proje.proje_kalemleri),
        ).filter(
            Proje.id == proje_id,
            or_(
                Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi,
                Proje.proje_basvuru_durumu ==
                ProjeBasvuruDurumu.revizyon_bekleniyor)).first()

        next_states_info = get_next_states_info(proje_id=proje_id)
        actions_info = get_actions_info(proje_id=proje_id)
        if not proje:
            pass
            # todo: proje bulunamadı hatası dön
        return render_template("dashboard/proje_personelleri.html",
                               proje=proje,
                               next_states_info=next_states_info,
                               proje_yurutucusu_mu=proje_yurutucusu_mu,
                               actions_info=actions_info,
                               proje_id=proje.id)
Ejemplo n.º 10
0
    def proje_hakem_get(self, proje_id):
        """Proje raporlarini goruntulemek icin kullanilir"""

        proje = DB.session.query(Proje).options(
            joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                OgretimElemani.personel).load_only("id").joinedload(
                Personel.person).load_only("ad", "soyad"),
            lazyload(Proje.proje_detayi),
            lazyload(Proje.kabul_edilen_proje_hakemleri),
            lazyload(Proje.proje_destekleyen_kurulus),
            lazyload(Proje.proje_kalemleri),
        ).filter(Proje.id == proje_id, or_(Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi,
                                           Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.revizyon_bekleniyor)).first()

        next_states_info = get_next_states_info(proje_id=proje_id)
        actions_info = get_actions_info(proje_id=proje_id)
        proje_yurutucusu_mu = ProjeYurutucusu().fulfill(user=current_user)

        proje_hakem_onerileri = proje.proje_hakem_onerileri

        proje_hakemleri = DB.session.query(ProjeHakemleri).options(
            joinedload(ProjeHakemleri.hakem).joinedload("*")
        ).filter(ProjeHakemleri.proje_id == proje_id).all()

        hakem_ekle_form = HakemEkleForm()

        return render_template(
            'dashboard/proje_hakemleri.html',
            proje_id=proje_id,
            proje=proje,
            proje_yurutucusu_mu=proje_yurutucusu_mu,
            next_states_info=next_states_info,
            actions_info=actions_info,
            hakem_onerileri=proje_hakem_onerileri,
            proje_hakemleri=proje_hakemleri,
            hakem_ekle_form=hakem_ekle_form
        )
Ejemplo n.º 11
0
    def satinalma_talepleri(self, proje_id):
        """
        Satinalma Talpeleri view class

            """

        satinalma_form = ProjeSatinAlmaTalepleri()

        proje_yurutucusu_mu = ProjeYurutucusu()
        proje = DB.session.query(Proje).options(
            joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                OgretimElemani.personel).load_only("id").joinedload(
                    Personel.person).load_only("ad", "soyad"),
            joinedload(Proje.satinalma_talepleri),
            lazyload(Proje.proje_detayi),
            lazyload(Proje.kabul_edilen_proje_hakemleri),
            lazyload(Proje.proje_hakem_onerileri),
            lazyload(Proje.proje_destekleyen_kurulus),
        ).filter(
            Proje.id == proje_id,
            or_(
                Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi,
                Proje.proje_basvuru_durumu ==
                ProjeBasvuruDurumu.revizyon_bekleniyor)).first()

        next_states_info = get_next_states_info(proje_id=proje_id)
        actions_info = get_actions_info(proje_id=proje_id)
        proje_durum = DB.session.query(AppState).filter(
            AppState.id == proje.proje_durumu_id).first()

        proje_satinalma_talepleri_data = []
        # satinalma talepleri uyari mesajlari
        sa_talepleri_uyari_mesajlari = []

        for satinalma_talebi in proje.satinalma_talepleri:
            data = {
                "satinalma_id": satinalma_talebi.id,
                "talep_numarasi": satinalma_talebi.talep_numarasi,
                "created_at": satinalma_talebi.created_at,
                "state_code": satinalma_talebi.durumu.state_code,
                "state_description": satinalma_talebi.durumu.description,
                "duyuru_id": satinalma_talebi.duyuru_id,
                "duyuru_duzenlensin_mi":
                satinalma_talebi.duyuru_duzenlensin_mi,
                "teknik_sartname_duzenlensin_mi": False
            }
            if satinalma_talebi.duyuru_duzenlensin_mi:
                sa_talepleri_uyari_mesajlari.append(
                    _("{} numaralı satınalma talebi için işlemler bölümünden duyuru düzenmeniz "
                      "gerekmektedir.".format(
                          satinalma_talebi.talep_numarasi)))

            for talep_kalemi in satinalma_talebi.talep_kalemleri:
                if talep_kalemi.teknik_sartname_duzenlensin_mi:
                    data["teknik_sartname_duzenlensin_mi"] = True
                    sa_talepleri_uyari_mesajlari.append(
                        _("{} numaralı satınalma talebi için işlemler bölümünden teknik şartname "
                          "düzenlemeniz gerekmektedir.".format(
                              satinalma_talebi.talep_numarasi)))
                    break

            proje_satinalma_talepleri_data.append(data)
        """
        proje_kalemleri_data {
            "Mal Malzeme Alımı": {
                "satinalma_talebi_yapilabilir_mi": True,
                "butce_kalemi_id": proje_kalemi.proje_turu_butce_kalemi.id,
                "proje_kalemleri": []
            }
            "Hizmet Alımı": {
                "satinalma_talebi_yapilabilir_mi": True,
                "butce_kalemi_id": proje_kalemi.proje_turu_butce_kalemi.id,
                "proje_kalemleri": []
            }
        }
        butce_kalemi adı: projeyenin harcama yapabilecegi butce kalemlerini temsil eder
        satinalma_talebi_yapilabilir_mi degeri kullanilabilir miktari ve kullanilabilir butcesine
        gore uretilir. ilgili degerlerden biri 0 ise basvuru yapmasi engellenir.
        butce_kalemi_id projenin harcama yapabilecegi butce kaleminin id sini temsil eder
        """
        proje_kalemleri_data = {}
        for proje_kalemi in proje.proje_kalemleri:
            butce_kalemi_adi = "{} {}".format(
                proje_kalemi.proje_turu_butce_kalemi.
                gider_siniflandirma_kalemi.kodu, proje_kalemi.
                proje_turu_butce_kalemi.gider_siniflandirma_kalemi.aciklama)
            if not proje_kalemleri_data.get(butce_kalemi_adi):
                proje_kalemleri_data[butce_kalemi_adi] = {
                    "satinalma_talebi_yapilabilir_mi": False,
                    "butce_kalemi_id": proje_kalemi.proje_turu_butce_kalemi.id,
                    "proje_kalemleri": []
                }

            kullanilabilir_miktar = proje_kalemi.toplam_miktar - proje_kalemi.kullanilan_miktar - proje_kalemi.rezerv_edilen_miktar
            kullanilabilir_butce = proje_kalemi.toplam_butce - proje_kalemi.rezerv_butce - proje_kalemi.kullanilan_butce
            kullanilabilir_butce = kullanilabilir_butce.quantize(
                Decimal(".01"))
            proje_kalemleri_data[butce_kalemi_adi]["proje_kalemleri"].append({
                "proje_kalemi_ad":
                proje_kalemi.ad,
                "toplam_miktar":
                proje_kalemi.toplam_miktar,
                "birim":
                proje_kalemi.birim.value,
                "kullanilan_miktar":
                proje_kalemi.kullanilan_miktar,
                "rezerv_edilen_miktar":
                proje_kalemi.rezerv_edilen_miktar,
                "kullanilabilir_miktar":
                kullanilabilir_miktar,
                "toplam_butce":
                proje_kalemi.toplam_butce,
                "kullanilan_butce":
                proje_kalemi.kullanilan_butce,
                "rezerv_edilen_butce":
                proje_kalemi.rezerv_butce,
                "kullanilabilir_butce":
                kullanilabilir_butce
            })

            if kullanilabilir_miktar > 0 and kullanilabilir_butce > 0:
                proje_kalemleri_data[butce_kalemi_adi][
                    "satinalma_talebi_yapilabilir_mi"] = True

        return render_template(
            "dashboard/proje_satinalma_talepleri.html",
            proje_yurutucusu_mu=proje_yurutucusu_mu,
            proje_id=proje_id,
            next_states_info=next_states_info,
            actions_info=actions_info,
            proje=proje,
            satinalma_form=satinalma_form,
            proje_satinalma_talepleri=proje_satinalma_talepleri_data,
            proje_kalemleri_data=proje_kalemleri_data,
            proje_durum=proje_durum,
            satinalma_talepleri_uyari_mesajlari=sa_talepleri_uyari_mesajlari)
Ejemplo n.º 12
0
    def degerlendirme_listele(proje_id):
        """Proje degerlemdirmelerini goruntulemek icin kullanilir"""
        proje_yurutucusu_mu = ProjeYurutucusu()
        atanmis_hakem = AtanmisHakem()

        proje = DB.session.query(Proje).options(
            joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                OgretimElemani.personel).load_only("id").joinedload(
                    Personel.person).load_only("ad", "soyad"),
            lazyload(Proje.proje_detayi),
            lazyload(Proje.proje_hakem_onerileri),
            lazyload(Proje.proje_destekleyen_kurulus),
            lazyload(Proje.proje_kalemleri),
        ).filter(
            Proje.id == proje_id,
            or_(
                Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi,
                Proje.proje_basvuru_durumu ==
                ProjeBasvuruDurumu.revizyon_bekleniyor)).first()

        next_states_info = get_next_states_info(proje_id=proje_id)
        actions_info = get_actions_info(proje_id=proje_id)

        proje_degerlendirmeleri = []
        """
        Proje degerlendirme teklifini kabul eden hakemlerin tamamlanan degerlendirmelerini 
        listeleyip proje_degerlendirme templatetine gonderir
        """
        for proje_hakemi in proje.kabul_edilen_proje_hakemleri:
            for proje_degerlendirme in proje_hakemi.tamamlanan_proje_degerlendirmeleri:
                hakem_ad_soyad = ""
                hakem = proje_hakemi.hakem
                if hakem.person_id:
                    hakem_ad_soyad = hakem.person.ad + hakem.person.soyad
                elif hakem.personel_id:
                    hakem_ad_soyad = hakem.personel.person.ad + hakem.personel.person.soyad
                proje_degerlendirmeleri.append({
                    "hakem_ad_soyad":
                    hakem_ad_soyad,
                    "degerlendirme_sonucu":
                    proje_degerlendirme.sonuc,
                    "degerlendirme_id":
                    proje_degerlendirme.id,
                    "degerlendirme_incelendi_mi":
                    proje_degerlendirme.degerlendirme_incelendi_mi,
                    "rapor_tipi":
                    proje_degerlendirme.rapor.rapor_tipi,
                    "degerlendirilen_rapor_file_id":
                    proje_degerlendirme.rapor.file_id
                })

        degerlendirme_guncelleme_formu = DegerlendirmeGuncelleForm()
        return render_template(
            'dashboard/proje_degerlendirmeleri.html',
            proje_degerlendirmeleri=proje_degerlendirmeleri,
            proje_id=proje_id,
            next_states_info=next_states_info,
            actions_info=actions_info,
            proje_yurutucusu_mu=proje_yurutucusu_mu,
            atanmis_hakem_mi=atanmis_hakem,
            degerlendirme_guncelleme_formu=degerlendirme_guncelleme_formu,
            proje=proje)
Ejemplo n.º 13
0
class ProjeSatinalmaTalepleriView(FlaskView):
    """
    Proje Satinalma Talepleri
    """
    @login_required
    @auth.requires(
        Permission(*permission_dict["bap"]["proje"]["dashboard"]
                   ["proje_satinalma_talepleri_goruntuleme"]),
        Or(ProjeYurutucusu(), Role('BAP Yetkilisi'), Role('BAP Admin')))
    @route("<int:proje_id>/dashboard/satinalma-talepleri",
           methods=["GET"],
           endpoint="satinalma_talepleri")
    def satinalma_talepleri(self, proje_id):
        """
        Satinalma Talpeleri view class

            """

        satinalma_form = ProjeSatinAlmaTalepleri()

        proje_yurutucusu_mu = ProjeYurutucusu()
        proje = DB.session.query(Proje).options(
            joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                OgretimElemani.personel).load_only("id").joinedload(
                    Personel.person).load_only("ad", "soyad"),
            joinedload(Proje.satinalma_talepleri),
            lazyload(Proje.proje_detayi),
            lazyload(Proje.kabul_edilen_proje_hakemleri),
            lazyload(Proje.proje_hakem_onerileri),
            lazyload(Proje.proje_destekleyen_kurulus),
        ).filter(
            Proje.id == proje_id,
            or_(
                Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi,
                Proje.proje_basvuru_durumu ==
                ProjeBasvuruDurumu.revizyon_bekleniyor)).first()

        next_states_info = get_next_states_info(proje_id=proje_id)
        actions_info = get_actions_info(proje_id=proje_id)
        proje_durum = DB.session.query(AppState).filter(
            AppState.id == proje.proje_durumu_id).first()

        proje_satinalma_talepleri_data = []
        # satinalma talepleri uyari mesajlari
        sa_talepleri_uyari_mesajlari = []

        for satinalma_talebi in proje.satinalma_talepleri:
            data = {
                "satinalma_id": satinalma_talebi.id,
                "talep_numarasi": satinalma_talebi.talep_numarasi,
                "created_at": satinalma_talebi.created_at,
                "state_code": satinalma_talebi.durumu.state_code,
                "state_description": satinalma_talebi.durumu.description,
                "duyuru_id": satinalma_talebi.duyuru_id,
                "duyuru_duzenlensin_mi":
                satinalma_talebi.duyuru_duzenlensin_mi,
                "teknik_sartname_duzenlensin_mi": False
            }
            if satinalma_talebi.duyuru_duzenlensin_mi:
                sa_talepleri_uyari_mesajlari.append(
                    _("{} numaralı satınalma talebi için işlemler bölümünden duyuru düzenmeniz "
                      "gerekmektedir.".format(
                          satinalma_talebi.talep_numarasi)))

            for talep_kalemi in satinalma_talebi.talep_kalemleri:
                if talep_kalemi.teknik_sartname_duzenlensin_mi:
                    data["teknik_sartname_duzenlensin_mi"] = True
                    sa_talepleri_uyari_mesajlari.append(
                        _("{} numaralı satınalma talebi için işlemler bölümünden teknik şartname "
                          "düzenlemeniz gerekmektedir.".format(
                              satinalma_talebi.talep_numarasi)))
                    break

            proje_satinalma_talepleri_data.append(data)
        """
        proje_kalemleri_data {
            "Mal Malzeme Alımı": {
                "satinalma_talebi_yapilabilir_mi": True,
                "butce_kalemi_id": proje_kalemi.proje_turu_butce_kalemi.id,
                "proje_kalemleri": []
            }
            "Hizmet Alımı": {
                "satinalma_talebi_yapilabilir_mi": True,
                "butce_kalemi_id": proje_kalemi.proje_turu_butce_kalemi.id,
                "proje_kalemleri": []
            }
        }
        butce_kalemi adı: projeyenin harcama yapabilecegi butce kalemlerini temsil eder
        satinalma_talebi_yapilabilir_mi degeri kullanilabilir miktari ve kullanilabilir butcesine
        gore uretilir. ilgili degerlerden biri 0 ise basvuru yapmasi engellenir.
        butce_kalemi_id projenin harcama yapabilecegi butce kaleminin id sini temsil eder
        """
        proje_kalemleri_data = {}
        for proje_kalemi in proje.proje_kalemleri:
            butce_kalemi_adi = "{} {}".format(
                proje_kalemi.proje_turu_butce_kalemi.
                gider_siniflandirma_kalemi.kodu, proje_kalemi.
                proje_turu_butce_kalemi.gider_siniflandirma_kalemi.aciklama)
            if not proje_kalemleri_data.get(butce_kalemi_adi):
                proje_kalemleri_data[butce_kalemi_adi] = {
                    "satinalma_talebi_yapilabilir_mi": False,
                    "butce_kalemi_id": proje_kalemi.proje_turu_butce_kalemi.id,
                    "proje_kalemleri": []
                }

            kullanilabilir_miktar = proje_kalemi.toplam_miktar - proje_kalemi.kullanilan_miktar - proje_kalemi.rezerv_edilen_miktar
            kullanilabilir_butce = proje_kalemi.toplam_butce - proje_kalemi.rezerv_butce - proje_kalemi.kullanilan_butce
            kullanilabilir_butce = kullanilabilir_butce.quantize(
                Decimal(".01"))
            proje_kalemleri_data[butce_kalemi_adi]["proje_kalemleri"].append({
                "proje_kalemi_ad":
                proje_kalemi.ad,
                "toplam_miktar":
                proje_kalemi.toplam_miktar,
                "birim":
                proje_kalemi.birim.value,
                "kullanilan_miktar":
                proje_kalemi.kullanilan_miktar,
                "rezerv_edilen_miktar":
                proje_kalemi.rezerv_edilen_miktar,
                "kullanilabilir_miktar":
                kullanilabilir_miktar,
                "toplam_butce":
                proje_kalemi.toplam_butce,
                "kullanilan_butce":
                proje_kalemi.kullanilan_butce,
                "rezerv_edilen_butce":
                proje_kalemi.rezerv_butce,
                "kullanilabilir_butce":
                kullanilabilir_butce
            })

            if kullanilabilir_miktar > 0 and kullanilabilir_butce > 0:
                proje_kalemleri_data[butce_kalemi_adi][
                    "satinalma_talebi_yapilabilir_mi"] = True

        return render_template(
            "dashboard/proje_satinalma_talepleri.html",
            proje_yurutucusu_mu=proje_yurutucusu_mu,
            proje_id=proje_id,
            next_states_info=next_states_info,
            actions_info=actions_info,
            proje=proje,
            satinalma_form=satinalma_form,
            proje_satinalma_talepleri=proje_satinalma_talepleri_data,
            proje_kalemleri_data=proje_kalemleri_data,
            proje_durum=proje_durum,
            satinalma_talepleri_uyari_mesajlari=sa_talepleri_uyari_mesajlari)

    @login_required
    @auth.requires(
        Permission(*permission_dict["bap"]["proje"]["dashboard"]
                   ["proje_satinalma_talepleri_goruntuleme"]),
        Or(ProjeYurutucusu(), Role('BAP Yetkilisi'), Role('BAP Admin')))
    @route(
        "<int:proje_id>/dashboard/satinalma-talep/<int:butce_kalemi_id>/talep-olustur",
        methods=["GET"])
    def satinalma_talep_get(self, proje_id, butce_kalemi_id):
        """
        Satinalma Talpeleri view class

        """

        proje_kalemleri = DB.session.query(ProjeKalemi).filter(
            ProjeKalemi.proje_id == proje_id,
            ProjeKalemi.proje_turu_butce_kalem_id == butce_kalemi_id).all()

        satinalma_talep_form = ProjeSatinAlmaTalepleri()

        satinalma_talebi_yapilabilir_mi = False

        for proje_kalemi in proje_kalemleri:
            kullanilabilir_miktar = proje_kalemi.toplam_miktar - proje_kalemi.kullanilan_miktar - proje_kalemi.rezerv_edilen_miktar
            kullanilabilir_butce = proje_kalemi.toplam_butce - proje_kalemi.rezerv_butce - proje_kalemi.kullanilan_butce
            kullanilabilir_butce = kullanilabilir_butce.quantize(
                Decimal(".01"))

            if kullanilabilir_miktar > 0 and kullanilabilir_butce > 0:
                satinalma_talebi_yapilabilir_mi = True
                satinalma_talep_form.talepler.append_entry({
                    "proje_kalemi_id":
                    proje_kalemi.id,
                    "proje_kalemi_adi":
                    proje_kalemi.ad,
                    "toplam_miktar":
                    proje_kalemi.toplam_miktar,
                    "birim":
                    proje_kalemi.birim.value,
                    "kullanilan_miktar":
                    proje_kalemi.kullanilan_miktar,
                    "rezerv_edilen_miktar":
                    proje_kalemi.rezerv_edilen_miktar,
                    "kullanilabilir_miktar":
                    kullanilabilir_miktar,
                    # "toplam_butce": proje_kalemi.toplam_butce,
                    # "kullanilan_butce": proje_kalemi.kullanilan_butce,
                    # "rezerv_edilen_butce": proje_kalemi.rezerv_butce,
                    # "kullanilabilir_butce": kullanilabilir_butce
                })

        return render_template(
            "dashboard/proje_satinalma_talep_basvuru.html",
            proje_id=proje_id,
            butce_kalemi_id=butce_kalemi_id,
            satinalma_talep_form=satinalma_talep_form,
            satinalma_talebi_yapilabilir_mi=satinalma_talebi_yapilabilir_mi)

    @login_required
    @auth.requires(
        Or(ProjeYurutucusu(), Role('BAP Yetkilisi'), Role('BAP Admin')))
    @route(
        "<int:proje_id>/dashboard/satinalma-talep/<int:butce_kalemi_id>/talep-olustur",
        methods=["POST"])
    def satinalma_talebi_kaydet(self, proje_id, butce_kalemi_id):
        """
        Talep Oluşturur

        """

        try:
            satinalma_talep_formu = ProjeSatinAlmaTalepleri(request.form)

            if not satinalma_talep_formu.validate():
                return render_template(
                    "dashboard/proje_satinalma_talep_basvuru.html",
                    proje_id=proje_id,
                    butce_kalemi_id=butce_kalemi_id,
                    satinalma_talep_form=satinalma_talep_formu)

            # mkk ya eklenen uyelerin aynı kişi olma durumuna bakilir
            select_field_list = [
                satinalma_talep_formu.baskan, satinalma_talep_formu.yedek_uye,
                satinalma_talep_formu.yedek_uye2, satinalma_talep_formu.uye,
                satinalma_talep_formu.yedek_baskan, satinalma_talep_formu.uye2
            ]

            seen = set()
            for select_field in select_field_list:
                if select_field.data not in seen:
                    seen.add(select_field.data)
                else:
                    select_field.errors.append(
                        "Komisyon üyesini birden fazla kez dahil ettiniz")

            if not satinalma_talep_formu.validate():
                return render_template(
                    "dashboard/proje_satinalma_talep_basvuru.html",
                    proje_id=proje_id,
                    butce_kalemi_id=butce_kalemi_id,
                    satinalma_talep_form=satinalma_talep_formu)

            genel_teknik_sartname = request.files.get(
                satinalma_talep_formu.genel_teknik_sartname_belge.name, None)
            genel_teknik_sartname_file = None
            if genel_teknik_sartname:
                genel_teknik_sartname_file = File(
                    content=genel_teknik_sartname, user_id=current_user.id)
                DB.session.add(genel_teknik_sartname_file)

            proje_kalemleri = DB.session.query(ProjeKalemi).filter(
                ProjeKalemi.proje_id == proje_id,
                ProjeKalemi.proje_turu_butce_kalem_id ==
                butce_kalemi_id).all()

            satinalma_talebi = ProjeSatinAlmaTalebi(
                proje_id=proje_id,
                butce_kalem_id=butce_kalemi_id,
                mkk_baskan_id=satinalma_talep_formu.baskan.data,
                mkk_uye1_id=satinalma_talep_formu.uye.data,
                mkk_uye2_id=satinalma_talep_formu.uye2.data,
                mkk_yedek_baskan_id=satinalma_talep_formu.yedek_baskan.data,
                mkk_yedek_uye1_id=satinalma_talep_formu.yedek_uye.data,
                mkk_yedek_uye2_id=satinalma_talep_formu.yedek_uye2.data,
            )
            DB.session.add(satinalma_talebi)
            DB.session.flush()

            talep_kalemi_sayisi = 0
            for proje_kalemi in proje_kalemleri:
                for talep in satinalma_talep_formu.talepler:
                    kullanilabilir_miktar = proje_kalemi.toplam_miktar - proje_kalemi.kullanilan_miktar - proje_kalemi.rezerv_edilen_miktar
                    if proje_kalemi.id == talep.proje_kalemi_id.data and talep.secili_mi.data and (
                            kullanilabilir_miktar > 0):
                        if not (0 < talep.talep_edilen_miktar.data <=
                                kullanilabilir_miktar):
                            flash(
                                "Talep edilen miktar sıfırdan büyük ve kullanılabilir miktardan "
                                "küçük olmak zorunda.", "error")
                            break
                        teknik_sartname = request.files.get(
                            talep.teknik_sartname_belge.name, None)
                        if teknik_sartname:
                            teknik_sartname_file = File(
                                content=teknik_sartname,
                                user_id=current_user.id)
                            DB.session.add(teknik_sartname_file)
                            DB.session.flush()
                            talep_teknik_sartname_file_id = teknik_sartname_file.id
                        elif genel_teknik_sartname:
                            talep_teknik_sartname_file_id = genel_teknik_sartname_file.id
                        else:
                            # eger ilgili talebe ozel teknik sartname yuklenmemisse ve genel bir teknik
                            # şartnamede yuklememis ise hata donulur
                            flash("Teknik şartname yüklemek zorundasınız",
                                  "error")
                            break

                        talep_kalemi_sayisi += 1
                        # talep edilen miktar proje kaleminden rezerv edilir
                        proje_kalemi.rezerv_edilen_miktar += talep.talep_edilen_miktar.data
                        talep_kalemi = TalepKalemleri(
                            satinalma_id=satinalma_talebi.id,
                            teknik_sartname_file_id=
                            talep_teknik_sartname_file_id,
                            proje_kalemi_id=proje_kalemi.id,
                            talep_miktari=talep.talep_edilen_miktar.data)
                        DB.session.add(talep_kalemi)

            if not talep_kalemi_sayisi:
                flash(
                    "Satınalma talebini tamamlamak için en az bir kalem seçmelisiniz",
                    "error")

            # eger bir hata var ise db session rollback edilip hatalari kullaniciya gostermek icin
            # ilgili sayfa render edilir
            if get_flashed_messages(category_filter=["error"]):
                DB.session.rollback()
                return render_template(
                    "dashboard/proje_satinalma_talep_basvuru.html",
                    proje_id=proje_id,
                    butce_kalemi_id=butce_kalemi_id,
                    satinalma_talep_form=satinalma_talep_formu)
            # satinalma id si talep numarasi olarak atanir
            satinalma_talebi.talep_numarasi = str(satinalma_talebi.id)
            # st1 state id satinalma durum id olarak atanir
            satinalma_talebi.durum_id = 34

            proje = DB.session.query(Proje.proje_no.label("proje_no")).filter(
                Proje.id == proje_id).first()
            for bap_admin in bap_yetkili_and_admin_ids():
                payload = {
                    "notification_receiver":
                    bap_admin.person_id,
                    "notification_title":
                    "Satınalma Talebi Yapıldı",
                    "notification_message":
                    "{} adlı kullanıcı {} numaralı projede satınalma talebi yaptı"
                    .format(current_user.username, proje.proje_no),
                }

                signal_sender(log=False, notification=True, **payload)

            signal_payload = {
                "message_type":
                USER_ACTIVITY_MESSAGES.get("bap").get(
                    "satinalma_talebi_olustur").type_index,
                "nesne":
                '',
                "nesne_id":
                proje_id,
                "ekstra_mesaj":
                "{} adlı {} id li kullanici satinalma talebi yaptı .".format(
                    current_user.id, current_user.username)
            }
            signal_sender(**signal_payload)
            DB.session.commit()

            flash("Satınalma talebi başarıyla oluşturuldu.", "success")
        except Exception as exc:
            flash(
                "Satınalma talebi yaparken beklenmedik bir sorunla karşılaşıldı. "
                "Lütfen daha sonra tekrar deneyin")
            DB.session.rollback()
            CustomErrorHandler.error_handler()
        return redirect(url_for("proje.satinalma_talepleri",
                                proje_id=proje_id))

    @login_required
    @auth.requires(
        Permission(*permission_dict["bap"]["proje"]["dashboard"]
                   ["proje_satinalma_talepleri_goruntuleme"]),
        Or(ProjeYurutucusu(), Role('BAP Yetkilisi'), Role('BAP Admin')))
    @route("<int:proje_id>/dashboard/satinalma-talepleri/duyuru-goster",
           methods=["POST"],
           endpoint="duyuru_goster")
    def duyuru_goster(self, proje_id):
        """
        Butce Kalemleri Ürünlerini Listeler

        """
        duyuru_id = request.get_json()['duyuru_id']
        duyuru_form = DuyuruForm()
        duyuru_icerigi = DB.session.query(
            Icerik.icerik.label("icerik"), Icerik.baslik.label("baslik"),
            Icerik.id.label("id")).filter(Icerik.id == duyuru_id).first()

        duyuru_form.duyuru_metni.data = duyuru_icerigi.icerik
        duyuru_form.duyuru_basligi.data = duyuru_icerigi.baslik
        duyuru_form.duyuru_id.data = duyuru_icerigi.id

        form_text = """
        {% from 'macros/_formhelpers.html' import render_text_field %}
        <form id="duyuru-duzenle-form">
        {{ form.csrf_token }}
        {{ form.duyuru_id}}
        {{render_text_field(form.duyuru_basligi)}}
        <br>
        {{ form.duyuru_metni }}
        </form>
        """
        data = {'duyuru': render_template_string(form_text, form=duyuru_form)}
        return jsonify(status="success", data=data)

    @login_required
    @auth.requires(
        Permission(*permission_dict["bap"]["proje"]["dashboard"]
                   ["proje_satinalma_talepleri_goruntuleme"]),
        Or(ProjeYurutucusu(), Role('BAP Yetkilisi'), Role('BAP Admin')))
    @route("<int:proje_id>/dashboard/satinalma-talepleri/duyuru-kaydet",
           methods=["POST"],
           endpoint="duyuru_kaydet")
    def duyuru_kaydet(self, proje_id):
        """
        Duyuruları Listeler

        """
        duyuru_duzenle_form = request.get_json()['duyuru_form']

        imd = ImmutableMultiDict([(duyuru['name'], duyuru['value'])
                                  for duyuru in duyuru_duzenle_form])
        duyuru_form = DuyuruForm(imd)

        if not duyuru_form.validate():
            form_text = """
                    {% from 'macros/form_helpers/text_fields.html' import render_text_field %}
                    <form id="duyuru-duzenle-form">
                    {{ form.csrf_token }}
                    {{ form.duyuru_id}}
                    {{render_text_field(form.duyuru_basligi)}}
                    <br>
                    {{ form.duyuru_metni }}
                    </form>
                    """
            data = {
                'duyuru_form': render_template_string(form_text,
                                                      form=duyuru_form)
            }
            return jsonify(
                status="error",
                message=
                "Lütfen doldurulması gereken alanları boş bırakmayınız.",
                data=data), 400

        duyuru_yurutucunun_mu = DB.session.query(ProjeSatinAlmaTalebi).filter(
            ProjeSatinAlmaTalebi.proje_id == proje_id,
            ProjeSatinAlmaTalebi.duyuru_id ==
            duyuru_form.duyuru_id.data).first()

        if not duyuru_yurutucunun_mu:
            return jsonify(
                status="error",
                message="Değiştirmeye çalıştığınız duyuru size ait değil. "
                "Lütfen yetkili ile iletişime geçiniz."), 400

        try:
            duyuru_icerigi = DB.session.query(Icerik).filter(
                Icerik.id == duyuru_form.duyuru_id.data).first()
            duyuru_icerigi.baslik = duyuru_form.duyuru_basligi.data
            duyuru_icerigi.icerik = duyuru_form.duyuru_metni.data
            duyuru_yurutucunun_mu.duyuru_duzenlensin_mi = False

            payload = {
                "message_type":
                USER_ACTIVITY_MESSAGES.get("icerik").get(
                    "satinalma_duyurusu_duzenlendi").type_index,
                "ekstra_mesaj":
                "".format(),
                "nesne":
                'İçerik',
                "nesne_id":
                duyuru_form.duyuru_id.data,
            }

            signal_sender(notification=True, **payload)

            for yetkili in bap_yetkili_and_admin_ids():
                payload = {
                    "message_type":
                    USER_ACTIVITY_MESSAGES.get("icerik").get(
                        "satinalma_duyurusu_duzenlendi").type_index,
                    "ekstra_mesaj":
                    "{} id'li duyuru içeriği {} isimli kullanıcı tarafından değiştrildi"
                    .format(duyuru_form.duyuru_id.data, current_user.username),
                    "notification_receiver":
                    yetkili.person_id,
                    "notification_title":
                    "{} İsimli Kullanıcı Duyuru İçeriği Düzenledi".format(
                        current_user.username),
                    "notification_message":
                    "{} isimli kullanıcı duyuru içeriği düzenledi. Lütfen kontrol ediniz"
                    .format(current_user.username),
                    "proje_id":
                    proje_id
                }
                signal_sender(log=False, notification=True, **payload)
            DB.session.commit()
        except Exception as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                hata="Duyuru içeriği değiştirilirken bir hata oluştu. "
                "Hata: {}, İçerik id: {}".format(exc,
                                                 duyuru_form.duyuru_id.data))
            return jsonify(
                status="error",
                message="Bir hata oluştu. Lütfen daha sonra tekrar deneyiniz.!"
            ), 400

        return jsonify(status="success")

    @login_required
    @auth.requires(
        Permission(*permission_dict["bap"]["proje"]["dashboard"]
                   ["proje_satinalma_talepleri_goruntuleme"]),
        Or(ProjeYurutucusu(), Role('BAP Yetkilisi'), Role('BAP Admin')))
    @route(
        "<int:proje_id>/dashboard/satinalma/<int:satinalma_id>/teknik-sartname-duzenle",
        methods=["GET"])
    def satinalma_teknik_sartname_duzenle(self, proje_id, satinalma_id):
        """
        Satinalma talep kalemleri teknik sartname duzenleme view methodu

        """
        satinalma_talep_kalemleri = DB.session.query(TalepKalemleri).filter(
            TalepKalemleri.satinalma_id == satinalma_id,
            TalepKalemleri.teknik_sartname_duzenlensin_mi == True).all()

        if not satinalma_talep_kalemleri:
            flash(_("Teknik şartnamesi düzenlenecek talep kalemi bulunamadı."))
            return redirect(
                url_for("proje.satinalma_talepleri", proje_id=proje_id))

        teknik_sartname_duzenle_form = TeknikSartnameDuzenlemeFormu()
        for talep_kalemi in satinalma_talep_kalemleri:
            if talep_kalemi.teknik_sartname_duzenlensin_mi:
                teknik_sartname_duzenle_form.talep_kalemleri.append_entry({
                    "talep_kalemi_id":
                    talep_kalemi.id,
                    "eski_teknik_sartname_id":
                    talep_kalemi.teknik_sartname_file_id,
                    "proje_kalemi_adi":
                    talep_kalemi.proje_kalemi.ad,
                    "talep_edilen_miktar":
                    talep_kalemi.talep_miktari,
                    "birim":
                    talep_kalemi.proje_kalemi.birim.value
                })

        return render_template(
            "dashboard/teknik_sarname_duzenle.html",
            proje_id=proje_id,
            satinalma_id=satinalma_id,
            teknik_sartname_duzenle_form=teknik_sartname_duzenle_form)

    @login_required
    @auth.requires(
        Permission(*permission_dict["bap"]["proje"]["dashboard"]
                   ["proje_satinalma_talepleri_goruntuleme"]),
        Or(ProjeYurutucusu(), Role('BAP Yetkilisi'), Role('BAP Admin')))
    @route(
        "<int:proje_id>/dashboard/satinalma/<int:satinalma_id>/teknik-sartname-kaydet",
        methods=["POST"])
    def satinalma_teknik_sartname_post(self, proje_id, satinalma_id):
        """
        Satinalma talep kalemleri teknik sartname duzenleme kaydetme view,

        """
        teknik_sartname_duzenle_form = TeknikSartnameDuzenlemeFormu(
            request.form)

        if not teknik_sartname_duzenle_form.validate():
            return render_template(
                "dashboard/teknik_sarname_duzenle.html",
                proje_id=proje_id,
                satinalma_id=satinalma_id,
                teknik_sartname_duzenle_form=teknik_sartname_duzenle_form)

        satinalma_talebi = DB.session.query(ProjeSatinAlmaTalebi).filter(
            ProjeSatinAlmaTalebi.id == satinalma_id).first()

        for talep_kalemi in satinalma_talebi.talep_kalemleri:
            for talep_kalemi_form in teknik_sartname_duzenle_form.talep_kalemleri:
                if talep_kalemi.id == talep_kalemi_form.talep_kalemi_id.data:
                    yeni_teknik_sartname = request.files.get(
                        talep_kalemi_form.yeni_teknik_sartname.name)
                    yeni_file = File(user_id=current_user.id,
                                     content=yeni_teknik_sartname)
                    DB.session.add(yeni_file)
                    DB.session.flush()
                    talep_kalemi.teknik_sartname_file_id = yeni_file.id
                    talep_kalemi.teknik_sartname_duzenlensin_mi = False

        DB.session.commit()
        payload = {
            "message_type":
            USER_ACTIVITY_MESSAGES.get("bap").get(
                "teknik_sartname_duzenle").type_index,
            "ekstra_mesaj":
            "{} id li satınalmanin talep kalemleri teknik şartname dosyası bap "
            "yetkilisi talebiyle yürütücü tarafından düzenlendi".format(
                satinalma_id),
            "nesne":
            'ProjeSatinAlmaTalebi',
            "nesne_id":
            satinalma_talebi.id,
        }

        signal_sender(notification=True, **payload)

        for yetkili in bap_yetkili_and_admin_ids():
            payload = {
                "message_type":
                USER_ACTIVITY_MESSAGES.get("icerik").get(
                    "satinalma_duyurusu_duzenlendi").type_index,
                "ekstra_mesaj":
                "{} id'li satınalmanın teknik şartname dosyaları {} isimli "
                "kullanıcı tarafından değiştrildi".format(
                    satinalma_id, current_user.username),
                "notification_receiver":
                yetkili.person_id,
                "notification_title":
                "{} İsimli Kullanıcı Teknik Şartname Düzenledi".format(
                    current_user.username),
                "notification_message":
                "{} isimli kullanıcı talep edilen teknik şartname düzenleme "
                "işlemini gerçekleştirdi. Lütfen kontrol ediniz".format(
                    current_user.username),
                "proje_id":
                proje_id
            }
            signal_sender(log=False, notification=True, **payload)
        flash(_("Teknik şartnameler başarıyla düzenlendi."))
        return redirect(url_for("proje.satinalma_talepleri",
                                proje_id=proje_id))
Ejemplo n.º 14
0
class ProjeRaporView(FlaskView):
    """Proje ara ve sonuc raporlarini goruntuleme, filtreleme ve indirme viewi"""

    excluded_methods = [
        "qry",
        "proje_rapor_filtreleme_form",
    ]

    @login_required
    @auth.requires(
        And(
            Permission(*permission_dict["bap"]["proje"]["dashboard"]
                       ["proje_raporlari_goruntuleme"]),
            Or(ProjeYurutucusu(), Role('BAP Yetkilisi'), Role("BAP Admin"),
               AtanmisHakem())))
    @route('<int:proje_id>/dashboard/rapor',
           methods=["GET"],
           endpoint='proje_rapor_index_get')
    def proje_rapor_get(self, proje_id):
        """Proje raporlarini goruntulemek icin kullanilir"""

        proje_yurutucusu_mu = ProjeYurutucusu().fulfill(user=current_user)
        atanmis_hakem = AtanmisHakem()
        proje = DB.session.query(Proje).options(
            joinedload(Proje.proje_proje_turu).load_only(
                "ara_rapor_sablon_id", "sonuc_raporu_sablon_id"),
            joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                OgretimElemani.personel).load_only("id").joinedload(
                    Personel.person).load_only("ad", "soyad"),
            joinedload(Proje.proje_raporlari),
            lazyload(Proje.proje_detayi),
            lazyload(Proje.kabul_edilen_proje_hakemleri),
            lazyload(Proje.proje_hakem_onerileri),
            lazyload(Proje.proje_destekleyen_kurulus),
            lazyload(Proje.proje_kalemleri),
        ).filter(
            Proje.id == proje_id,
            or_(
                Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi,
                Proje.proje_basvuru_durumu ==
                ProjeBasvuruDurumu.revizyon_bekleniyor)).first()
        next_states_info = get_next_states_info(proje_id=proje_id)
        actions_info = get_actions_info(proje_id=proje_id)
        ara_rapor_degerlendirme_sablon_id = proje.proje_proje_turu.ara_rapor_sablon_id
        sonuc_raporu_degerlendirme_sablon_id = proje.proje_proje_turu.sonuc_raporu_sablon_id

        return render_template(
            'dashboard/proje_raporlari.html',
            ara_rapor_degerlendirme_sablon_id=ara_rapor_degerlendirme_sablon_id,
            sonuc_raporu_degerlendirme_sablon_id=
            sonuc_raporu_degerlendirme_sablon_id,
            proje_raporlari=proje.proje_raporlari,
            proje_id=proje_id,
            proje=proje,
            proje_yurutucusu_mu=proje_yurutucusu_mu,
            next_states_info=next_states_info,
            actions_info=actions_info,
            rapor_duzenle_formu=RaporForm(),
            atanmis_hakem=atanmis_hakem)

    @login_required
    @auth.requires(
        And(
            Permission(*permission_dict["bap"]["proje"]["dashboard"]
                       ["proje_raporlari_goruntuleme"]),
            Or(ProjeYurutucusu(), Role('BAP Yetkilisi'), Role("BAP Admin"))))
    @route('<int:proje_id>/rapor/<int:rapor_id>/information', methods=["GET"])
    def get_rapor_information(self, proje_id, rapor_id):
        """Proje raporunun bilgilerini getirir"""
        rapor_bilgileri = DB.session.query(ProjeRapor).filter(
            ProjeRapor.id == rapor_id,
            ProjeRapor.proje_id == proje_id).scalar()
        if not rapor_bilgileri:
            return jsonify(status="error"), 404

        rapor_data = {
            "rapor_metni":
            rapor_bilgileri.rapor_icerigi,
            "tamamlandi_mi":
            True if rapor_bilgileri.durumu == ProjeRaporDurumu.tamamlandi else
            False,
            "file_id":
            rapor_bilgileri.file_id
        }
        return jsonify(status="success", rapor_data=rapor_data)

    @login_required
    @auth.requires(
        And(
            Permission(*permission_dict["bap"]["proje"]["dashboard"]
                       ["proje_raporlari_duzenleme"]),
            Or(ProjeYurutucusu(), Role('BAP Yetkilisi'), Role("BAP Admin"))))
    @route("<int:proje_id>/rapor/<int:rapor_id>/",
           methods=["POST"],
           endpoint='proje_rapor_guncelle')
    def rapor_guncelle(self, proje_id, rapor_id):  # pylint: disable=R0201
        """
            Proje raporunu duzenlemek icin kullanilir
        """
        rapor_formu = RaporForm(request.form)

        proje_raporu = DB.session.query(ProjeRapor).filter(
            ProjeRapor.proje_id == proje_id, ProjeRapor.id == rapor_id).one()
        if proje_raporu.duzenlenebilir_mi:
            proje_raporu.rapor_icerigi = rapor_formu.rapor_metni.data
            proje_raporu.file_id = rapor_formu.rapor_dosya.data
            if rapor_formu.tamamlandi_mi.data:
                proje_raporu.duzenlenebilir_mi = False
                proje_raporu.durumu = ProjeRaporDurumu.tamamlandi
            signal_payload = {
                "message_type":
                USER_ACTIVITY_MESSAGES.get("bap").get(
                    "proje_raporu_guncellendi").type_index,
                "nesne":
                'Proje Rapor',
                "nesne_id":
                proje_raporu.id,
                "etkilenen_nesne":
                "Proje",
                "etkilenen_nesne_id":
                proje_id,
                "ekstra_mesaj":
                "{} adlı kullanıcı, {} id'li proje raporunu güncelledi.".
                format(current_user.username, proje_raporu.id)
            }
            signal_sender(**signal_payload)

            flash(_("Rapor başarıyla güncellendi."))
            DB.session.commit()
        else:
            flash(
                _("Rapor kaydedilemedi. Raporu güncelleyebilmeniz için düzenlenebilir olması gerekir"
                  ))

        return redirect(
            url_for('proje.proje_rapor_index_get', proje_id=proje_id))

    @login_required
    @auth.requires(
        And(
            Permission(*permission_dict["bap"]["proje"]["dashboard"]
                       ["proje_raporlari_silme"]),
            Or(ProjeYurutucusu(), Role('BAP Yetkilisi'), Role("BAP Admin"))))
    @route("<int:proje_id>/rapor/<int:rapor_id>/sil",
           methods=["GET"],
           endpoint="proje_rapor_dosyasi_sil")
    def rapor_dosyasi_sil(self, proje_id, rapor_id):  # pylint: disable=R0201
        """
            Proje raporunu silmek icin kullanilir
        """
        rapor = DB.session.query(ProjeRapor).filter(
            ProjeRapor.proje_id == proje_id, ProjeRapor.id == rapor_id).one()

        rapor.file_id = None
        DB.session.commit()

        signal_payload = {
            "message_type":
            USER_ACTIVITY_MESSAGES.get("bap").get(
                "proje_rapor_dosyasi_sil").type_index,
            "nesne":
            'Proje Rapor',
            "nesne_id":
            rapor.id,
            "etkilenen_nesne":
            "Proje",
            "etkilenen_nesne_id":
            proje_id,
            "ekstra_mesaj":
            "{} adlı kullanıcı, {} id'li proje raporunun dosyasini kaldırdı.".
            format(current_user.username, rapor_id)
        }
        signal_sender(**signal_payload)
        flash(_("Rapor dosyası başarıyla kaldırıldı."))
        return redirect(
            url_for('proje.proje_rapor_index_get', proje_id=proje_id))

    @login_required
    @auth.requires(
        And(
            Permission(*permission_dict["bap"]["proje"]["dashboard"]
                       ["proje_raporlari_duzenleme"]),
            Or(Role('BAP Yetkilisi'), Role("BAP Admin"))))
    @route("<int:proje_id>/rapor/<int:rapor_id>/duzenlenebilir_mi",
           methods=["GET"],
           endpoint="proje_rapor_duzenlenebilir_mi")
    def duzenlenebilir_mi(self, proje_id, rapor_id):  # pylint: disable=R0201
        """
            Proje raporunun duzenlenebilirligini degistirmek icin kullanilir
        """
        rapor = DB.session.query(ProjeRapor).filter(
            ProjeRapor.proje_id == proje_id, ProjeRapor.id == rapor_id).one()
        rapor.duzenlenebilir_mi = not rapor.duzenlenebilir_mi
        DB.session.commit()
        signal_payload = {
            "message_type":
            USER_ACTIVITY_MESSAGES.get("bap").get(
                "proje_raporu_duzenlenebilir").type_index,
            "nesne":
            'Proje Rapor',
            "nesne_id":
            rapor.id,
            "ekstra_mesaj":
            "{} adlı kullanıcı, {} id'li proje raporunu düzenlenebilir "
            "yaptı.".format(current_user.username, rapor.id)
        }
        signal_sender(**signal_payload)
        if rapor.duzenlenebilir_mi:
            flash(_("Seçtiğiniz rapor artık düzenlenebilir."))
        else:
            flash(_("Seçtiğiniz raporun düzenlenebilirliğini kaldırdınız."))
        return redirect(
            url_for('proje.proje_rapor_index_get', proje_id=proje_id))

    @login_required
    @auth.requires(
        And(
            Permission(*permission_dict["bap"]["proje"]["dashboard"]
                       ["proje_raporlari_duzenleme"]),
            Or(ProjeYurutucusu(), Role('BAP Yetkilisi'), Role("BAP Admin"))))
    @route("<int:proje_id>/rapor-olustur/",
           methods=["POST"],
           endpoint='yeni_rapor_ekle')
    def yeni_rapor_ekle(self, proje_id):  # pylint: disable=R0201
        """
            Projeye yeni rapor eklemek icin kullanilir
        """
        ara_rapor_mu = request.args.get("ara_rapor_mu")
        rapor_form = RaporForm(request.form)

        # todo: monkey patch
        rapor_tipi = ProjeRaporTipi.ara_rapor if ara_rapor_mu == 'true' else ProjeRaporTipi.sonuc_raporu
        rapor_durumu = ProjeRaporDurumu.tamamlandi if rapor_form.tamamlandi_mi.data else ProjeRaporDurumu.tamamlanmadi
        duzenlenebilir_mi = False if rapor_durumu == ProjeRaporDurumu.tamamlandi else True

        yeni_rapor = ProjeRapor(rapor_tipi=rapor_tipi,
                                proje_id=proje_id,
                                file_id=rapor_form.rapor_dosya.data,
                                rapor_icerigi=rapor_form.rapor_metni.data,
                                durumu=rapor_durumu,
                                duzenlenebilir_mi=duzenlenebilir_mi)
        DB.session.add(yeni_rapor)
        DB.session.commit()
        signal_payload = {
            "message_type":
            USER_ACTIVITY_MESSAGES.get("bap").get(
                "proje_raporu_eklendi").type_index,
            "nesne":
            'Proje Rapor',
            "nesne_id":
            yeni_rapor.id,
            "etkilenen_nesne":
            "Proje",
            "etkilenen_nesne_id":
            proje_id,
            "ekstra_mesaj":
            "{} adlı kullanıcı, {} id'li proje raporu {} id'li projeye "
            "ekledi.".format(current_user.username, yeni_rapor.id, proje_id)
        }
        signal_sender(**signal_payload)

        flash(_("Rapor başarıyla projeye eklendi."))

        return redirect(
            url_for('proje.proje_rapor_index_get', proje_id=proje_id))

    @login_required
    @auth.requires(
        And(
            Permission(*permission_dict["bap"]["proje"]["dashboard"]
                       ["proje_raporlari_goruntuleme"]),
            Or(ProjeYurutucusu(), Role('BAP Yetkilisi'), Role("BAP Admin"),
               AtanmisHakem())))
    @route('<int:proje_id>/rapor/<int:rapor_id>', methods=["GET"])
    def get_single_proje_rapor(self, proje_id, rapor_id):
        """Projenin belirli bir raporunu almak icin kullanilir"""

        proje_rapor = DB.session.query(ProjeRapor).filter(
            ProjeRapor.proje_id == proje_id, ProjeRapor.id == rapor_id).one()

        return jsonify(status="success",
                       rapor={"rapor_metni": proje_rapor.rapor_icerigi})
Ejemplo n.º 15
0
class BasvuruPersonelView(FlaskView):
    """Basvuru Personel Kaydet View Class"""

    excluded_methods = ["ozgecmis_kaydet"]

    @staticmethod
    def ozgecmis_kaydet(ozgecmis_text, ozgecmis_file_id):
        """Proje calisanlarinin ozgecmislerini kaydeder. ozgecmis id doner"""
        calisan_ozgecmis = Ozgecmis(tecrube=ozgecmis_text,
                                    file_id=ozgecmis_file_id,
                                    user_id=current_user.id)
        DB.session.add(calisan_ozgecmis)
        DB.session.flush()
        return calisan_ozgecmis.id

    @login_required
    @auth.requires(
        And(
            Permission(*permission_dict["bap"]["proje"]["basvuru"]
                       ["proje_basvurusu_yapma"]), ProjeYurutucusu(),
            TamamlanmamisProjeBasvurusu()))
    @route('/<int:proje_id>/arastirmaci-kaydet/', methods=['POST'])
    def arastirmaci_kaydet(self, proje_id):
        """
        Proje çalışanlarına araştırmacı kaydetmek için kullanılır
        """
        arastirmaci_data = request.get_json()
        personel_id = arastirmaci_data.get("personel_id")

        try:
            proje = DB.session.query(Proje).filter(Proje.id == proje_id).one()
            if proje.proje_yurutucu.personel.id == int(personel_id):
                return jsonify(
                    status="error",
                    error_message=_(
                        "Proje yürütücüsünü personel olarak ekleyemezsiniz")
                ), 400

            try:
                personel = DB.session.query(Personel).options(
                    load_only("id", "person_id"), lazyload(Personel.birimi),
                    lazyload(Personel.user),
                    joinedload(Personel.person).load_only(
                        "ad", "soyad")).filter_by(id=personel_id).one()
            except NoResultFound as exc:
                DB.session.rollback()
                CustomErrorHandler.error_handler(
                    hata=
                    "Var olmayan bir personel id si ile projeye arastirmaci eklenmeye calışıldı. "
                    "Hata: {}, Proje id: {}".format(exc, proje_id))
                return jsonify(status="error"), 400
            if personel_proje_calisani_mi(proje_id, personel_id):
                return jsonify(
                    status="error",
                    error_message=_(
                        "Eklemeye çalıştığınız personel zaten proje çalışanı.")
                ), 400
            arastirmaci_ozgecmis_id = self.ozgecmis_kaydet(
                ozgecmis_text=arastirmaci_data.pop("ozgecmis_text", None),
                ozgecmis_file_id=arastirmaci_data.pop("ozgecmis_file_id",
                                                      None))

            yeni_arastirmaci = ProjeCalisanlari(
                proje_id=proje_id,
                universite_disindan_mi=False,
                ozgecmis_id=arastirmaci_ozgecmis_id,
                **arastirmaci_data)
            personel_ad = personel.person.ad
            personel_soyad = personel.person.soyad
            DB.session.add(yeni_arastirmaci)
            DB.session.commit()
            signal_payload = {
                "message_type":
                USER_ACTIVITY_MESSAGES.get("bap").get(
                    "projeye_arastirmaci_eklendi").type_index,
                "nesne":
                'Proje Calisanlari',
                "nesne_id":
                yeni_arastirmaci.id,
                "etkilenen_nesne":
                "Personel",
                "etkilenen_nesne_id":
                personel.id,
                "ekstra_mesaj":
                "{} adlı kullanıcı, {} {} adlı personeli {} id'li projeye "
                "araştırmacı olarak ekledi.".format(current_user.username,
                                                    personel_ad,
                                                    personel_soyad, proje_id)
            }
            signal_sender(**signal_payload)
            return jsonify(status="success",
                           calisan={
                               "id": yeni_arastirmaci.id,
                               "ad": personel_ad,
                               "soyad": personel_soyad,
                               "gorevi": yeni_arastirmaci.projedeki_gorevi
                           })
        except SQLAlchemyError as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                hata="Proje idsi %s olan projeye arastirmaci atamaya"
                "çalışılırken bir sorun oluştu. Hata: %s" % (proje_id, exc))

        return jsonify(status="error"), 400

    @login_required
    @auth.requires(
        And(
            Permission(*permission_dict["bap"]["proje"]["basvuru"]
                       ["proje_basvurusu_yapma"]), ProjeYurutucusu(),
            TamamlanmamisProjeBasvurusu()))
    @route('/<int:proje_id>/bursiyer-kaydet/', methods=['POST'])
    def bursiyer_kaydet(self, proje_id):
        """
        Proje çalışanlarına bursiyer kaydetmek için kullanılır
        """
        bursiyer_data = request.get_json()
        ogrenci_id = bursiyer_data.get("ogrenci_id")

        try:
            try:
                ogrenci = DB.session.query(Ogrenci).options(
                    load_only("id", "person_id"), lazyload(Ogrenci.user),
                    joinedload(Ogrenci.person).load_only(
                        "ad", "soyad")).filter_by(id=ogrenci_id).one()
            except NoResultFound as exc:
                CustomErrorHandler.error_handler(
                    hata=
                    "Var olmayan bir öğrenci id si ile projeye bursiyer eklenmeye calışıldı. "
                    "Hata: {}, Proje id: {}".format(proje_id, exc))

                return jsonify(status="error"), 400
            bursiyer_calisan = DB.session.query(ProjeCalisanlari.id).filter(
                ProjeCalisanlari.ogrenci_id == ogrenci_id,
                ProjeCalisanlari.proje_id == proje_id).scalar()
            if bursiyer_calisan:
                return jsonify(
                    status="error",
                    error_message=_(
                        "Eklemeye çalıştığınız öğrenci zaten proje çalışanı.")
                ), 400

            bursiyer_ozgecmis_id = self.ozgecmis_kaydet(
                ozgecmis_text=bursiyer_data.pop("ozgecmis_text", None),
                ozgecmis_file_id=bursiyer_data.pop("ozgecmis_file_id", None))

            yeni_bursiyer = ProjeCalisanlari(proje_id=proje_id,
                                             universite_disindan_mi=False,
                                             ozgecmis_id=bursiyer_ozgecmis_id,
                                             **bursiyer_data)
            ogrenci_ad = ogrenci.person.ad
            ogrenci_soyad = ogrenci.person.soyad
            DB.session.add(yeni_bursiyer)
            DB.session.commit()
            signal_payload = {
                "message_type":
                USER_ACTIVITY_MESSAGES.get("bap").get(
                    "projeye_bursiyer_eklendi").type_index,
                "nesne":
                'Proje Calisanlari',
                "nesne_id":
                yeni_bursiyer.id,
                "etkilenen_nesne":
                "Proje",
                "etkilenen_nesne_id":
                proje_id,
                "ekstra_mesaj":
                "{} adlı kullanıcı, {} {} adlı öğrenciyi bursiyer olarak "
                "ekledi.".format(current_user.username, ogrenci_ad,
                                 ogrenci_soyad)
            }
            signal_sender(**signal_payload)
            return jsonify(status="success",
                           calisan={
                               "id": yeni_bursiyer.id,
                               "ad": ogrenci_ad,
                               "soyad": ogrenci_soyad,
                               "gorevi": yeni_bursiyer.projedeki_gorevi
                           })
        except SQLAlchemyError as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                hata="Proje idsi %s olan projeye bursiyer atamaya"
                "çalışılırken bir sorun oluştu. Hata: %s" % (proje_id, exc))

        return jsonify(status="error"), 400

    @login_required
    @auth.requires(
        And(
            Permission(*permission_dict["bap"]["proje"]["basvuru"]
                       ["proje_basvurusu_yapma"]), ProjeYurutucusu(),
            TamamlanmamisProjeBasvurusu()))
    @route('/<int:proje_id>/harici-arastirmaci-kaydet/', methods=['POST'])
    def harici_arastirmaci_kaydet(self, proje_id):
        """
        Proje çalışanlarına üniversite dışı araştırmacı kaydetmek için kullanılır.
        """
        harici_arastirmaci_data = request.get_json()
        adi = harici_arastirmaci_data.pop("ad")
        soyad = harici_arastirmaci_data.pop("soyad")
        email = harici_arastirmaci_data.pop("email")

        try:

            yeni_person = Person(ad=adi, soyad=soyad, birincil_eposta=email)
            DB.session.add(yeni_person)
            DB.session.flush()

            harici_arastirmaci_ozgecmis_id = self.ozgecmis_kaydet(
                ozgecmis_text=harici_arastirmaci_data.pop(
                    "ozgecmis_text", None),
                ozgecmis_file_id=harici_arastirmaci_data.pop(
                    "ozgecmis_file_id", None))

            yeni_harici_arastirmaci = ProjeCalisanlari(
                proje_id=proje_id,
                ozgecmis_id=harici_arastirmaci_ozgecmis_id,
                person_id=yeni_person.id,
                **harici_arastirmaci_data)
            DB.session.add(yeni_harici_arastirmaci)
            DB.session.commit()
            signal_payload = {
                "message_type":
                USER_ACTIVITY_MESSAGES.get("bap").get(
                    "projeye_harici_arastirmaci_eklendi").type_index,
                "nesne":
                'Proje Calisanlari',
                "nesne_id":
                yeni_harici_arastirmaci.id,
                "etkilenen_nesne":
                "Proje",
                "etkilenen_nesne_id":
                proje_id,
                "ekstra_mesaj":
                "{} adlı kullanıcı, {} {} adlı kisiyi üniversite dışı arastırmacı "
                "olarak kaydetti.".format(current_user.username, adi, soyad)
            }
            signal_sender(**signal_payload)
            return jsonify(status="success",
                           calisan={
                               "id": yeni_harici_arastirmaci.id,
                               "ad": adi,
                               "soyad": soyad,
                               "gorevi":
                               yeni_harici_arastirmaci.projedeki_gorevi
                           })
        except SQLAlchemyError as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                hata="Proje idsi %s olan projeye harici araştırmacı atamaya"
                "çalışılırken bir sorun oluştu. Hata: %s" % (proje_id, exc))

        return jsonify(status="error"), 400

    @staticmethod
    @login_required
    @auth.requires(
        And(
            Permission(*permission_dict["bap"]["proje"]["basvuru"]
                       ["proje_basvurusu_yapma"]), ProjeYurutucusu(),
            TamamlanmamisProjeBasvurusu()))
    @route('/<int:proje_id>/calisan-sil/<int:calisan_id>', methods=['DELETE'])
    def proje_calisani_sil(proje_id, calisan_id):
        """
        Daha önce projeye kaydedilmiş çalışanı siler.
        """
        try:
            try:
                silinecek_calisan = DB.session.query(
                    ProjeCalisanlari).filter_by(id=calisan_id,
                                                proje_id=proje_id).one()
            except NoResultFound as exc:
                DB.session.rollback()
                CustomErrorHandler.error_handler(
                    hata="Var olmayan bir id ile proje çalışanı silinmeye "
                    "çalışıldı. Proje id: {}, Hata: {}".format(proje_id, exc))
                return jsonify(status="error"), 400

            DB.session.delete(silinecek_calisan)
            if silinecek_calisan.person:
                DB.session.delete(silinecek_calisan.person)
            DB.session.commit()
            signal_payload = {
                "message_type":
                USER_ACTIVITY_MESSAGES.get("bap").get(
                    "proje_calisani_sil").type_index,
                "nesne":
                'Proje Calisanlari',
                "nesne_id":
                calisan_id,
                "etkilenen_nesne":
                "Proje",
                "etkilenen_nesne_id":
                proje_id,
                "ekstra_mesaj":
                "{} adlı kullanıcı, proje çalışanını projeden sildi.".format(
                    current_user.username)
            }
            signal_sender(**signal_payload)
            return jsonify(status="success")
        except SQLAlchemyError as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                hata=
                "Proje çalışanı silinmeye çalışırken hata ile karşılaşıldı. "
                "Proje id: {}, Calisan id: {}, Hata: {}".format(
                    proje_id, calisan_id, exc))
        return jsonify(status="error"), 400

    @staticmethod
    @login_required
    @auth.requires(
        And(
            Permission(*permission_dict["bap"]["proje"]["basvuru"]
                       ["proje_basvurusu_yapma"]), ProjeYurutucusu(),
            TamamlanmamisProjeBasvurusu()))
    @route('/<int:proje_id>/calisan/<int:calisan_id>', methods=['GET'])
    def get_proje_calisani(proje_id, calisan_id):
        """
        Var olan bir çalışanı almak için kullanılır.
        """
        try:
            try:
                calisan = DB.session.query(ProjeCalisanlari).options(
                    lazyload(ProjeCalisanlari.ogrenci),
                    lazyload(ProjeCalisanlari.personel),
                    joinedload(ProjeCalisanlari.person).load_only(
                        "ad", "soyad"),
                    joinedload(ProjeCalisanlari.fakulte).load_only("ad"),
                    joinedload(ProjeCalisanlari.bolum).load_only("ad"),
                    joinedload(ProjeCalisanlari.hitap_unvan).load_only(
                        "ad", "kod")).filter_by(id=calisan_id,
                                                proje_id=proje_id).one()
            except NoResultFound as exc:
                CustomErrorHandler.error_handler(
                    hata="Var olmayan bir id ile proje çalışanı alınmaya "
                    "çalışıldı. Proje id: {}, Hata: {}".format(proje_id, exc))
                return abort(404)
        except SQLAlchemyError as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                hata=
                "Proje çalışanı silinmeye çalışırken hata ile karşılaşıldı. "
                "Proje id: {}, Calisan id: {}, Hata: {}".format(
                    proje_id, calisan_id, exc))
            return abort(400)
        data = calisan.to_dict()
        data["projeye_katkisi"] = float(
            calisan.projeye_katkisi) if calisan.projeye_katkisi else float(0)

        data.update({
            "ozgecmis_text": calisan.ozgecmis.tecrube,
            "ozgecmis_file_id": calisan.ozgecmis.file_id
        })
        if calisan.person:
            hitap_unvan_ad = ""
            if calisan.hitap_unvan:
                hitap_unvan_ad = "{} {}".format(
                    calisan.hitap_unvan.kod,
                    calisan.hitap_unvan.ad if calisan.hitap_unvan else "")

            data.update({
                "hitap_unvan_ad":
                hitap_unvan_ad,
                "fakulte_ad":
                calisan.fakulte.ad if calisan.fakulte else "",
                "bolum_ad":
                calisan.bolum.ad if calisan.bolum else "",
                "ad":
                calisan.person.ad,
                "soyad":
                calisan.person.soyad,
            })
        return jsonify(status="success", calisan=data)

    @staticmethod
    @login_required
    @auth.requires(
        And(
            Permission(*permission_dict["bap"]["proje"]["basvuru"]
                       ["proje_basvurusu_yapma"]), ProjeYurutucusu(),
            TamamlanmamisProjeBasvurusu()))
    @route('/<int:proje_id>/calisan/<int:calisan_id>', methods=['POST'])
    def calisan_guncelle(proje_id, calisan_id):
        """
        Çalışan güncellemek için kullanılır.
        """
        calisan_data = request.get_json()
        try:
            try:
                calisan = DB.session.query(ProjeCalisanlari).filter_by(
                    id=calisan_id, proje_id=proje_id).one()
            except NoResultFound as exc:
                CustomErrorHandler.error_handler(
                    hata="Var olmayan bir id ile proje çalışanı alınmaya "
                    "çalışıldı. Proje id: {}, Hata: {}".format(proje_id, exc))
                return abort(404)
            if calisan.person_id:
                calisan.person.ad = calisan_data.get("ad")
                calisan.person.soyad = calisan_data.get("soyad")
            # todo: calisan guncellenirken ozgecmisinde bir degisklik var ise guncelle.
            calisan.ozgecmis.tecrube = calisan_data.pop("ozgecmis_text", None)
            calisan.ozgecmis.file_id = calisan_data.pop(
                "ozgecmis_file_id", None)
            calisan.update_obj_data(calisan_data)
            DB.session.commit()
        except SQLAlchemyError as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                hata=
                "Proje çalışanı silinmeye çalışırken hata ile karşılaşıldı. "
                "Proje id: {}, Calisan id: {}, Hata: {}".format(
                    proje_id, calisan_id, exc))
            return abort(400)
        data = {"id": calisan.id, "gorevi": calisan.projedeki_gorevi}
        if calisan.person_id:
            data.update({
                "ad": calisan.person.ad,
                "soyad": calisan.person.soyad
            })
        elif calisan.personel_id:
            data.update({
                "ad": calisan.personel.person.ad,
                "soyad": calisan.personel.person.soyad
            })
        else:
            data.update({
                "ad": calisan.ogrenci.person.ad,
                "soyad": calisan.ogrenci.person.soyad
            })
        signal_payload = {
            "message_type":
            USER_ACTIVITY_MESSAGES.get("bap").get(
                "proje_calisan_guncelle").type_index,
            "nesne":
            'Proje Calisanlari',
            "nesne_id":
            calisan_id,
            "etkilenen_nesne":
            "Proje",
            "etkilenen_nesne_id":
            proje_id,
            "ekstra_mesaj":
            "{} adlı kullanıcı, {} {} adlı proje çalışanının bilgilerini "
            "güncelledi.".format(current_user.username, data["ad"],
                                 data["soyad"])
        }
        signal_sender(**signal_payload)
        return jsonify(status="success", calisan=data)
Ejemplo n.º 16
0
class HakemOneriView(FlaskView):
    """Hakem Oneri View Class"""

    @staticmethod
    @login_required
    @auth.requires(
        And(Permission(*permission_dict["bap"]["proje"]["hakem"]["projeye_hakem_onerme"]),
            ProjeYurutucusu(), TamamlanmamisProjeBasvurusu()))
    @route('/<int:proje_id>/hakem-oner/', methods=['POST'])
    def hakem_oner(proje_id):
        """
        Ad, Soyad ve email ile önerilen kişileri HakemOneri modeline kaydeder.

        Projenin belirli bir hakem limiti vardır.Bunlar kontrol edilip kaydedilir.
        Limite ulaşılmış ise hata dönülür
        Returns:

        """
        adi = request.get_json().get('ad')
        soyad = request.get_json().get('soyad')
        email = request.get_json().get('email')
        ogretim_elemani_id = request.get_json().get("ogretim_elemani_id")
        try:
            try:
                proje = DB.session.query(Proje).filter_by(id=proje_id).one()
                proje_turu = DB.session.query(ProjeTuru).filter_by(id=proje.proje_turu).one()
            except NoResultFound as exc:
                CustomErrorHandler.error_handler(
                    hata="Var Olmayan bir proje_turu_id veya proje_id ile hakem onerisi eklenmeye "
                    "çalışıldı. Hata: {}".format(exc))
                return abort(400)
            if not proje_turu.hakem_onerilsin_mi:
                # todo: bu projeye hakem onerilemez hatası dön
                pass
            if ogretim_elemani_id:
                try:
                    onerilen_hakemlerde_var_mi = DB.session.query(HakemOneri).filter_by(
                        proje_id=proje_id, ogretim_elemani_id=ogretim_elemani_id).first()
                    if onerilen_hakemlerde_var_mi:
                        return abort(400)
                    ogretim_elemani = DB.session.query(OgretimElemani).filter_by(
                        id=ogretim_elemani_id).one()
                    hakem_onerisi = HakemOneri(proje_id=proje_id,
                                               ogretim_elemani_id=ogretim_elemani_id)
                    DB.session.add(hakem_onerisi)
                    DB.session.commit()
                    signal_payload = {
                        "message_type": USER_ACTIVITY_MESSAGES.get("bap").get(
                            "oe_hakem_onerildi").type_index,
                        "nesne": 'Hakem Oneri',
                        "nesne_id": ogretim_elemani_id,
                        "etkilenen_nesne": "Proje",
                        "etkilenen_nesne_id": proje_id,
                        "ekstra_mesaj": "{} adlı kullanıcı, {} {} öğretim elemanını hakem olarak "
                                        "önerdi.".format(current_user.username, adi, soyad)
                    }
                    signal_sender(**signal_payload)
                    person = ogretim_elemani.person
                    return jsonify(status="success",
                                   hakemOneriData={
                                       "id": hakem_onerisi.id,
                                       "ad": person.ad,
                                       "soyad": person.soyad,
                                       "email": person.birincil_eposta or person.ikincil_eposta})
                except NoResultFound as exc:
                    DB.session.rollback()
                    CustomErrorHandler.error_handler(
                                                     hata="Var Olmayan bir ogretim_elemani_id ile hakem onerisi eklenmeye "
                                                          "çalışıldı. Hata: {}".format(exc)
                                                     )
                    return jsonify(status="error"), 400
            else:
                hakem_onerisi = HakemOneri(proje_id=proje_id,
                                           ad=adi,
                                           soyad=soyad,
                                           email=email)
                DB.session.add(hakem_onerisi)
                DB.session.commit()
                signal_payload = {
                    "message_type": USER_ACTIVITY_MESSAGES.get("bap").get(
                        "kisi_hakem_onerildi").type_index,
                    "nesne": 'Hakem Oneri',
                    "nesne_id": ogretim_elemani_id,
                    "etkilenen_nesne": "Proje",
                    "etkilenen_nesne_id": proje_id,
                    "ekstra_mesaj": "{} adlı kullanıcı, {} {} kişiyi hakem olarak önerdi.".format(
                        current_user.username,
                        adi, soyad)
                }
                signal_sender(**signal_payload)
                return jsonify(status="success", hakemOneriData={"id": hakem_onerisi.id,
                                                                 "ad": adi,
                                                                 "soyad": soyad,
                                                                 "email": email})
        except SQLAlchemyError as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                                             hata="Proje idsi %s olan projeye hakem önerisi eklemeye"
                                                  "çalışılırken bir sorun oluştu. Hata: %s" % (
                                                      proje_id, exc)
                                             )
        return jsonify(status="error"), 400

    @staticmethod
    @login_required
    @auth.requires(
        And(Permission(*permission_dict["bap"]["proje"]["hakem"]["projeye_hakem_onerme"]),
            ProjeYurutucusu(), TamamlanmamisProjeBasvurusu()))
    @route('/<int:proje_id>/hakem-oneri-sil/<int:oneri_id>', methods=['DELETE'])
    def hakem_oneri_sil(proje_id, oneri_id):
        """
        Daha önce proje için önerilip kaydedilmiş hakem önerisini siler
        """
        try:
            silinecek_oneri = DB.session.query(HakemOneri).filter_by(
                id=oneri_id, proje_id=proje_id).first()
            DB.session.delete(silinecek_oneri)
            DB.session.commit()
            signal_payload = {
                "message_type": USER_ACTIVITY_MESSAGES.get("bap").get(
                    "hakem_onerisi_kaldirildi").type_index,
                "nesne": 'Hakem Oneri',
                "nesne_id": oneri_id,
                "etkilenen_nesne": "Proje",
                "etkilenen_nesne_id": proje_id,
                "ekstra_mesaj": "{} adlı kullanıcı, {} {} kişiyi hakem önerilerinden "
                                "kaldırdı.".format(current_user.username,
                                                   silinecek_oneri.ad, silinecek_oneri.soyad)
            }
            signal_sender(**signal_payload)
            return jsonify(status="success")
        except SQLAlchemyError as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                                             hata="Proje idsi %s olan projeye hakem önerisi silinmeye"
                                                  "çalışılırken bir sorun oluştu. Hata: %s" % (
                                                      proje_id, exc)
                                             )
        return jsonify(status="error"), 400
Ejemplo n.º 17
0
    def sablon_ekdosya_listele(self, proje_id):
        """
        Projenin şablon cikti ve ek dosyalarina ulasmak icin kullanilir
        """
        proje_yurutucusu_mu = ProjeYurutucusu().fulfill(user=current_user)
        atanmis_hakem = AtanmisHakem()
        proje = DB.session.query(Proje).options(
            joinedload(Proje.proje_proje_turu).load_only(
                "oneri_sablon_id", "hakem_degerlendirme_sablon_id",
                "hakem_ara_rapor_sablon_id", "ara_rapor_sablon_id",
                "sonuc_raporu_sablon_id", "sozlesme_sablon_id",
                "hakem_sonuc_rapor_sablon_id"),
            joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                OgretimElemani.personel).load_only("id").joinedload(
                    Personel.person).load_only("ad", "soyad"),
            joinedload(Proje.proje_belgeleri),
            lazyload(Proje.proje_detayi),
            lazyload(Proje.kabul_edilen_proje_hakemleri),
            lazyload(Proje.proje_hakem_onerileri),
            lazyload(Proje.proje_destekleyen_kurulus),
            lazyload(Proje.proje_kalemleri),
        ).filter(
            Proje.id == proje_id,
            or_(
                Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi,
                Proje.proje_basvuru_durumu ==
                ProjeBasvuruDurumu.revizyon_bekleniyor)).first()

        next_states_info = get_next_states_info(proje_id=proje_id)
        actions_info = get_actions_info(proje_id=proje_id)

        proje_turu = DB.session.query(ProjeTuru).options(
            joinedload(ProjeTuru.cikti),
            joinedload(ProjeTuru.ek_dosyalar).joinedload(EkDosya.belge),
        ).filter_by(id=proje.proje_turu).one()
        ciktilar = []
        for cikti in proje_turu.cikti:
            ciktilar.append({
                "adi":
                cikti.adi,
                "yurutucu_gorebilir_mi":
                True if cikti.gorunurluk
                == GorunurlukSecenekleri.yurutucu_ve_yonetici else False,
                "sablon_id":
                cikti.sablon_id,
                "sablon_adi":
                cikti.sablon_belge.adi,
            })

        proje_ek_dosyalar = []
        proje_diger_dosyalar = []
        for ek_dosya in proje_turu.ek_dosyalar:
            for proje_belge in proje.proje_belgeleri:
                if proje_belge.proje_turu_ek_dosya_id == ek_dosya.id:
                    proje_ek_dosyalar.append({
                        # "proje_belge_id",
                        "proje_belge_file_id":
                        proje_belge.belge_id,
                        "proje_belge_aciklama":
                        proje_belge.aciklama,
                        "ornek_file_id":
                        ek_dosya.belge.file_id,
                        "ornek_file_ad":
                        ek_dosya.belge.adi,
                        "proje_icerik_dosyasi_mi":
                        ek_dosya.proje_icerik_dosyasi_mi,
                        "belgenin_ciktisi_alinacak_mi":
                        ek_dosya.belgenin_ciktisi_alinacak_mi,
                        "zorunlu_mu":
                        ek_dosya.zorunlu_mu
                    })
                    break
        for proje_belge in proje.proje_belgeleri:
            if proje_belge.proje_turu_ek_dosya_id is None:
                proje_diger_dosyalar.append({
                    "adi": proje_belge.baslik,
                    "aciklama": proje_belge.aciklama,
                    "file_id": proje_belge.belge_id
                })
                break

        # todo: gereklimi ? ustteki querye dahil edilip alinabilir
        proje_turu_sablonlari = DB.session.query(Sablon).filter(
            Sablon.id.in_([
                proje.proje_proje_turu.oneri_sablon_id,
                proje.proje_proje_turu.hakem_degerlendirme_sablon_id,
                proje.proje_proje_turu.hakem_ara_rapor_sablon_id,
                proje.proje_proje_turu.hakem_sonuc_rapor_sablon_id,
                proje.proje_proje_turu.ara_rapor_sablon_id,
                proje.proje_proje_turu.sonuc_raporu_sablon_id,
                proje.proje_proje_turu.sozlesme_sablon_id,
            ])).all()
        return render_template("dashboard/proje_sablon_ekdosyalar.html",
                               proje_id=proje_id,
                               proje=proje,
                               next_states_info=next_states_info,
                               actions_info=actions_info,
                               proje_yurutucusu_mu=proje_yurutucusu_mu,
                               ciktilar=ciktilar,
                               proje_ek_dosyalar=proje_ek_dosyalar,
                               proje_diger_dosyalar=proje_diger_dosyalar,
                               proje_turu_sablonlari=proje_turu_sablonlari,
                               proje_turu=proje_turu,
                               atanmis_hakem=atanmis_hakem)
Ejemplo n.º 18
0
    def proje_dashboard(self, proje_id):
        """
        Proje özeti bilgilerine ulaşmak için kullanılır
        Args:
            proje_id(int): proje id si

        Returns:

        """
        proje_yurutucusu_mu = ProjeYurutucusu().fulfill(user=current_user)
        atanmis_hakem = AtanmisHakem()
        sozlesme_ekle_form = SozlesmeYukleForm()

        try:
            proje = DB.session.query(Proje).options(
                joinedload(Proje.proje_proje_turu).load_only("ad"),
                joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                    OgretimElemani.personel).load_only("id").joinedload(
                        Personel.person).load_only("ad", "soyad"),
                joinedload(Proje.fakulte).load_only("ad"),
                joinedload(Proje.bolum).load_only("ad"),
                joinedload(Proje.ana_bilim_dali).load_only("ad"),
                joinedload(Proje.bilim_dali).load_only("ad"),
                lazyload(Proje.proje_detayi),
                lazyload(Proje.kabul_edilen_proje_hakemleri),
                lazyload(Proje.proje_hakem_onerileri),
                lazyload(Proje.proje_destekleyen_kurulus),
                joinedload(Proje.proje_kalemleri).lazyload("*"),
            ).filter(
                Proje.id == proje_id,
                or_(
                    Proje.proje_basvuru_durumu ==
                    ProjeBasvuruDurumu.tamamlandi, Proje.proje_basvuru_durumu
                    == ProjeBasvuruDurumu.revizyon_bekleniyor)).first()

            toplam_butce = Decimal("0.00")
            rezerv_butce = Decimal("0.00")
            kullanilan_butce = Decimal("0.00")
            for proje_kalemi in proje.proje_kalemleri:
                toplam_butce += proje_kalemi.toplam_butce
                rezerv_butce += proje_kalemi.rezerv_butce
                kullanilan_butce += proje_kalemi.kullanilan_butce

            kullanilabilir_butce = toplam_butce - rezerv_butce - kullanilan_butce
            kullanilabilir_butce = kullanilabilir_butce.quantize(
                Decimal(".01"))

            proje_durum = ProjeStateDispacther.current_state_info(
                proje_id=proje.id)

            possible_next_states = ProjeStateDispacther.possible_next_states_info(
                current_app_state_id=proje_durum.id)

            possible_actions = ProjeStateDispacther.possible_actions(
                current_app_state_id=proje_durum.id)

            actions_info = DB.session.query(AppAction).filter(
                AppAction.action_code.in_(possible_actions)).all()

            states_info = DB.session.query(AppState). \
                filter(AppState.state_code.in_(possible_next_states)).all()

            genel_uyari_mesajlari = proje.proje_proje_turu.genel_uyari_mesajlari
            sozlesme_sablon_id = proje.proje_proje_turu.sozlesme_sablon_id

            proje_durumlari = DB.session.query(
                AppState.state_code.label("state_code"),
                AppState.description.label("state_description"),
                AppState.current_app_state.label("current_app_state"),
            ).filter(AppState.state_type == StateTypes.proje).options(
                lazyload("*")).order_by(AppState.id).all()

            proje_islemleri = DB.session.query(
                AppAction.action_code.label("action_code"),
                AppAction.description.label("action_description"),
            ).filter(AppAction.action_type == ActionTypes.proje).order_by(
                AppAction.id).all()

        except SQLAlchemyError as exc:
            CustomErrorHandler.error_handler(
                hata=
                "Proje dashboard ekranı yüklenirken database sorgularında sorun oluştu "
                "Hata: {}, User id: {}, Proje id: {}".format(
                    exc, current_user.id, proje_id))

            return abort(500)

        # proje.proje_durum
        if not proje:
            pass
            # todo: proje bulunamadı hatası dön
        return render_template("dashboard/proje_ozeti.html",
                               proje=proje,
                               states_info=states_info,
                               actions_info=actions_info,
                               proje_durum=proje_durum,
                               sozlesme_ekle_form=sozlesme_ekle_form,
                               proje_yurutucusu_mu=proje_yurutucusu_mu,
                               atanmis_hakem=atanmis_hakem,
                               genel_uyari_mesajlari=genel_uyari_mesajlari,
                               kullanilabilir_butce=kullanilabilir_butce,
                               kullanilan_butce=kullanilan_butce,
                               rezerv_butce=rezerv_butce,
                               toplam_butce=toplam_butce,
                               proje_durumlari=proje_durumlari,
                               proje_islemleri=proje_islemleri,
                               sozlesme_sablon_id=sozlesme_sablon_id)
Ejemplo n.º 19
0
class ProjeIslemGecmisiListesiView(FlaskView):
    """
        Proje islem gecmisini listeleyen view
    """
    @login_required
    @auth.requires(
        Or(
            And(
                Permission(*permission_dict["bap"]["proje"]["dashboard"]
                           ["islem_gecmisi_goruntuleme"]), ProjeYurutucusu()),
            RoleReq('BAP Yetkilisi'), RoleReq("BAP Admin")))
    @route('/<int:proje_id>/dashboard/islem-gecmisi',
           methods=['GET'],
           endpoint='proje_islem_gecmisi_listele')
    def islem_gecmisi(self, proje_id):
        """
        Projenin islem gecmisine ulasmak icin kullanilir
        :param proje_id: proje_id(int)
        :return: http response
        """
        proje_yurutucusu_mu = ProjeYurutucusu().fulfill(user=current_user)
        params = {"proje_id": proje_id}
        try:
            proje = DB.session.query(Proje).options(
                joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                    OgretimElemani.personel).load_only("id").joinedload(
                        Personel.person).load_only("ad", "soyad"),
                lazyload(Proje.proje_detayi),
                lazyload(Proje.kabul_edilen_proje_hakemleri),
                lazyload(Proje.proje_hakem_onerileri),
                lazyload(Proje.proje_destekleyen_kurulus),
                lazyload(Proje.proje_kalemleri),
            ).filter(
                Proje.id == proje_id,
                or_(
                    Proje.proje_basvuru_durumu ==
                    ProjeBasvuruDurumu.tamamlandi, Proje.proje_basvuru_durumu
                    == ProjeBasvuruDurumu.revizyon_bekleniyor)).first()

            next_states_info = get_next_states_info(proje_id=proje_id)
            actions_info = get_actions_info(proje_id=proje_id)

            islem_listesi = DB.session.query(AppStateTracker). \
                filter(AppStateTracker.params.contains(params),
                       or_(AppStateTracker.job_type == JobTypes.project_state_change,
                            AppStateTracker.job_type == JobTypes.project_action)). \
                       join(Person, Person.user_id == AppStateTracker.triggered_by). \
                       join(AppState, AppStateTracker.state_id == AppState.id). \
                       add_columns(
                           AppState.state_code,
                           Person.ad,
                           Person.soyad,
                       ).all()

        except Exception as exc:
            CustomErrorHandler.error_handler(
                hata="Proje işlem geçmişi görüntülenirken hata oluştu."
                "Hata: {}, Proje id: {}".format(proje_id, exc))
            return abort(500)

        return render_template("dashboard/proje_islem_gecmisi.html",
                               islem_listesi=islem_listesi,
                               proje_id=proje_id,
                               proje=proje,
                               next_states_info=next_states_info,
                               actions_info=actions_info,
                               proje_yurutucusu_mu=proje_yurutucusu_mu)
Ejemplo n.º 20
0
class ProjeMesajView(FlaskView):
    """Proje mesajlari"""
    @staticmethod
    @login_required
    @auth.requires(
        Or(
            And(
                Permission(*permission_dict["bap"]["proje"]
                           ["dashboard"]["proje_mesajlari_goruntuleme"]),
                ProjeYurutucusu()), Role("BAP Yetkilisi"), Role("BAP Admin")))
    @route('<int:proje_id>/dashboard/mesaj',
           methods=["GET"],
           endpoint='proje_mesajlari')
    def proje_mesajlari(proje_id):
        """Proje mesajlarini gosterir"""
        proje_yurutucusu_mu = ProjeYurutucusu().fulfill(user=current_user)
        proje = DB.session.query(Proje).options(
            joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                OgretimElemani.personel).load_only("id").joinedload(
                    Personel.person).load_only("ad", "soyad"),
            lazyload(Proje.proje_detayi),
            lazyload(Proje.kabul_edilen_proje_hakemleri),
            lazyload(Proje.proje_hakem_onerileri),
            lazyload(Proje.proje_destekleyen_kurulus),
            lazyload(Proje.proje_kalemleri),
        ).filter(
            Proje.id == proje_id,
            or_(
                Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi,
                Proje.proje_basvuru_durumu ==
                ProjeBasvuruDurumu.revizyon_bekleniyor)).first()

        next_states_info = get_next_states_info(proje_id=proje_id)
        actions_info = get_actions_info(proje_id=proje_id)

        proje_mesajlari = DB.session.query(Mesaj).join(
            ProjeMesaj, ProjeMesaj.mesaj_id == Mesaj.id).filter(
                ProjeMesaj.proje_id == proje_id).all()

        return render_template('dashboard/proje_mesajlari.html',
                               proje_id=proje_id,
                               next_states_info=next_states_info,
                               proje_mesajlari=proje_mesajlari,
                               proje_yurutucusu_mu=proje_yurutucusu_mu,
                               actions_info=actions_info,
                               proje=proje)

    @staticmethod
    @login_required
    @auth.requires(
        Or(
            And(
                Permission(*permission_dict["bap"]["proje"]
                           ["dashboard"]["proje_mesajlari_goruntuleme"]),
                ProjeYurutucusu()), Role("BAP Yetkilisi"), Role("BAP Admin")))
    @route('<int:proje_id>/dashboard/mesaj/<int:mesaj_id>',
           methods=["GET"],
           endpoint='proje_mesaj_detay')
    def proje_mesaj_detay(proje_id, mesaj_id):
        """ Gelen kutusuna dusen mesajlarin, icerigini, kimden geldigini vs. gosterir."""
        mesaj = DB.session.query(Mesaj).filter_by(id=mesaj_id).options(
            joinedload(Mesaj.gonderen_kisi).load_only(
                'ad', 'soyad', 'birincil_eposta')).one()
        if not mesaj.okundu:
            mesaj.okundu = True
            mesaj.okunma_zamani = datetime.now()
            okunma_tarihi = datetime.now().strftime('%d-%m-%Y')
            okunma_ip_adresi = request.remote_addr
            mesaj.okunma_ip_adresi = request.remote_addr
            DB.session.commit()
        else:
            okunma_tarihi = mesaj.okunma_zamani.strftime('%d-%m-%Y')
            okunma_ip_adresi = mesaj.okunma_ip_adresi

        signal_payload = {
            "message_type":
            USER_ACTIVITY_MESSAGES.get("common").get(
                "mesaj_okundu").type_index,
            "nesne":
            'Mesaj',
            "nesne_id":
            mesaj_id,
            "ekstra_mesaj":
            "{} adlı kullanıcı {} id'li mesajı okudu.".format(
                current_user.username, mesaj_id)
        }
        signal_sender(**signal_payload)
        mesaj_detay = {
            'gonderim_tarihi':
            mesaj.gonderim_zamani.strftime('%d-%m-%Y'),
            'okunma_tarihi':
            okunma_tarihi,
            'okunma_ip_adresi':
            okunma_ip_adresi,
            'gonderen_kisi_ad_soyad':
            mesaj.gonderen_kisi.ad + " " + mesaj.gonderen_kisi.soyad,
            'gonderen_kisi_birincil_eposta':
            mesaj.gonderen_kisi.birincil_eposta,
            'baslik':
            mesaj.baslik,
            'metin':
            mesaj.metin,
            'mesaj_ek':
            render_template_string("""
                       <ul class="attached-document clearfix">
                            {% for ek in mesaj_ek %}
                                {% if ek.belge_r.content %}
                                    <li>
                                        <div class="document-name">
                                         <form method="post">
                                                <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
                                            <button class="btn btn-link" id="ek_{{ ek.belge }}" name="ek_{{ ek.belge }}"
                                                            value="{{ ek.belge }}" style="white-space: normal;"
                                                            formaction="{{ url_for('mesaj.mesaj_ek', 
                                                                                    mesaj_id=mesaj_id, 
                                                                                    belge_id= ek.belge ) }}">
                                               {{ ek.belge_r.content.file.filename }}
                                                    </button>
                                               </form>
                                        </div>
                                    </li>
                                {% endif %}
                            {% endfor %}
                        </ul>""",
                                   mesaj_ek=mesaj.mesajek,
                                   mesaj_id=mesaj_id)
        }

        return jsonify(status="success",
                       mesaj=mesaj_detay,
                       mesaj_id=int(mesaj_id))
Ejemplo n.º 21
0
class ProjeDashboardView(FlaskView):
    """
    Proje Dashboard
    """
    @login_required
    @auth.requires(
        Permission(*permission_dict["bap"]["proje"]["dashboard"]
                   ["proje_ozeti_goruntuleme"]),
        Or(ProjeYurutucusu(), Role('BAP Yetkilisi'), Role('BAP Admin'),
           AtanmisHakem()))
    @route("<int:proje_id>/dashboard/ozet",
           methods=["GET", "POST"],
           endpoint="proje_dashboard")
    def proje_dashboard(self, proje_id):
        """
        Proje özeti bilgilerine ulaşmak için kullanılır
        Args:
            proje_id(int): proje id si

        Returns:

        """
        proje_yurutucusu_mu = ProjeYurutucusu().fulfill(user=current_user)
        atanmis_hakem = AtanmisHakem()
        sozlesme_ekle_form = SozlesmeYukleForm()

        try:
            proje = DB.session.query(Proje).options(
                joinedload(Proje.proje_proje_turu).load_only("ad"),
                joinedload(Proje.proje_yurutucu).load_only("id").joinedload(
                    OgretimElemani.personel).load_only("id").joinedload(
                        Personel.person).load_only("ad", "soyad"),
                joinedload(Proje.fakulte).load_only("ad"),
                joinedload(Proje.bolum).load_only("ad"),
                joinedload(Proje.ana_bilim_dali).load_only("ad"),
                joinedload(Proje.bilim_dali).load_only("ad"),
                lazyload(Proje.proje_detayi),
                lazyload(Proje.kabul_edilen_proje_hakemleri),
                lazyload(Proje.proje_hakem_onerileri),
                lazyload(Proje.proje_destekleyen_kurulus),
                joinedload(Proje.proje_kalemleri).lazyload("*"),
            ).filter(
                Proje.id == proje_id,
                or_(
                    Proje.proje_basvuru_durumu ==
                    ProjeBasvuruDurumu.tamamlandi, Proje.proje_basvuru_durumu
                    == ProjeBasvuruDurumu.revizyon_bekleniyor)).first()

            toplam_butce = Decimal("0.00")
            rezerv_butce = Decimal("0.00")
            kullanilan_butce = Decimal("0.00")
            for proje_kalemi in proje.proje_kalemleri:
                toplam_butce += proje_kalemi.toplam_butce
                rezerv_butce += proje_kalemi.rezerv_butce
                kullanilan_butce += proje_kalemi.kullanilan_butce

            kullanilabilir_butce = toplam_butce - rezerv_butce - kullanilan_butce
            kullanilabilir_butce = kullanilabilir_butce.quantize(
                Decimal(".01"))

            proje_durum = ProjeStateDispacther.current_state_info(
                proje_id=proje.id)

            possible_next_states = ProjeStateDispacther.possible_next_states_info(
                current_app_state_id=proje_durum.id)

            possible_actions = ProjeStateDispacther.possible_actions(
                current_app_state_id=proje_durum.id)

            actions_info = DB.session.query(AppAction).filter(
                AppAction.action_code.in_(possible_actions)).all()

            states_info = DB.session.query(AppState). \
                filter(AppState.state_code.in_(possible_next_states)).all()

            genel_uyari_mesajlari = proje.proje_proje_turu.genel_uyari_mesajlari
            sozlesme_sablon_id = proje.proje_proje_turu.sozlesme_sablon_id

            proje_durumlari = DB.session.query(
                AppState.state_code.label("state_code"),
                AppState.description.label("state_description"),
                AppState.current_app_state.label("current_app_state"),
            ).filter(AppState.state_type == StateTypes.proje).options(
                lazyload("*")).order_by(AppState.id).all()

            proje_islemleri = DB.session.query(
                AppAction.action_code.label("action_code"),
                AppAction.description.label("action_description"),
            ).filter(AppAction.action_type == ActionTypes.proje).order_by(
                AppAction.id).all()

        except SQLAlchemyError as exc:
            CustomErrorHandler.error_handler(
                hata=
                "Proje dashboard ekranı yüklenirken database sorgularında sorun oluştu "
                "Hata: {}, User id: {}, Proje id: {}".format(
                    exc, current_user.id, proje_id))

            return abort(500)

        # proje.proje_durum
        if not proje:
            pass
            # todo: proje bulunamadı hatası dön
        return render_template("dashboard/proje_ozeti.html",
                               proje=proje,
                               states_info=states_info,
                               actions_info=actions_info,
                               proje_durum=proje_durum,
                               sozlesme_ekle_form=sozlesme_ekle_form,
                               proje_yurutucusu_mu=proje_yurutucusu_mu,
                               atanmis_hakem=atanmis_hakem,
                               genel_uyari_mesajlari=genel_uyari_mesajlari,
                               kullanilabilir_butce=kullanilabilir_butce,
                               kullanilan_butce=kullanilan_butce,
                               rezerv_butce=rezerv_butce,
                               toplam_butce=toplam_butce,
                               proje_durumlari=proje_durumlari,
                               proje_islemleri=proje_islemleri,
                               sozlesme_sablon_id=sozlesme_sablon_id)

    @login_required
    @auth.requires(
        Permission(*permission_dict["bap"]["proje"]["dashboard"]
                   ["proje_ozeti_goruntuleme"]),
        Or(ProjeYurutucusu(), Role('BAP Yetkilisi'), Role('BAP Admin')))
    @route("<int:proje_id>/proje_ek/<int:ek_id>",
           methods=["POST"],
           endpoint='proje_eki')
    def proje_ekleri(self, proje_id, ek_id):
        """
        Proje eklerini indirmek icin kullanilir
        Args:
            self:
            proje_id(int): proje idsi
            belge_id(int): projenin belge idsi

        Returns:

        """
        proje = get_proje_with_related_fields(proje_id=proje_id)
        proje_ek = DB.session.query(ProjeBelgeleri).filter_by(
            belge_id=ek_id).first()

        # for belge in proje.proje_belgeleri:
        # if request.method == "POST" and request.form.get(ek.baslik) == str(ek.belge_id):
        context = {**proje.__dict__, 'proje_detay': proje.proje_detayi}

        renderer = TRenderer(template=proje_ek.belge.file_object,
                             context=context)
        rendered_document = renderer.render_document()

        signal_payload = {
            "message_type":
            USER_ACTIVITY_MESSAGES.get("bap").get(
                "proje_eki_indirildi").type_index,
            "nesne":
            'Proje Belgeleri',
            "nesne_id":
            ek_id,
            "etkilenen_nesne":
            "Proje",
            "etkilenen_nesne_id":
            proje_id,
            "ekstra_mesaj":
            "{} adlı kullanıcı, {} adlı proje ekini indirdi.".format(
                current_user.username, proje_ek.belge.content.file.filename)
        }
        signal_sender(**signal_payload)

        return send_file(
            BytesIO(rendered_document),
            as_attachment=True,
            attachment_filename=proje_ek.belge.content.file.filename,
            mimetype='application/vnd.oasis.opendocument.text')

    @staticmethod
    @login_required
    @auth.requires(
        Permission(*permission_dict["bap"]["proje"]["dashboard"]
                   ["proje_sozlesmesi_yukleme"]))
    @route("/dashboard/<int:proje_id>/sozlesme_yukle",
           methods=["POST"],
           endpoint="sozlesme_yukle")
    def proje_sozlesmesi_yukle(proje_id):
        """
        Proje sozlemesini Yukleme
        """
        try:
            sozlesme_formu = SozlesmeYukleForm(request.form)
            if sozlesme_formu.validate():
                sozlesme_file = request.files.get(
                    sozlesme_formu.sozlesme_file.name, None)
                if sozlesme_file:
                    file = File(content=sozlesme_file, user_id=current_user.id)
                    DB.session.add(file)
                    DB.session.flush()
                    proje = DB.session.query(Proje).filter(
                        Proje.id == proje_id).first()
                    sozlesme_var_mi = True if proje.proje_sozlesme_id else False
                    proje.proje_sozlesme_id = file.id
                    DB.session.commit()
                    flash(
                        _("Proje Sözleşmesi başarılı bir şekilde yüklenmiştir."
                          ))

                    if sozlesme_var_mi:
                        user_activity_message = _(
                            "Proje Sözleşmesi Güncellendi")
                    else:
                        user_activity_message = _("Proje Sözleşmesi Yüklendi")

                    revizyon_signal_payload = {
                        "message_type":
                        USER_ACTIVITY_MESSAGES.get("bap").get(
                            "proje_sozlesmesi_yuklendi").type_index,
                        "nesne":
                        'Proje',
                        "nesne_id":
                        proje_id,
                        "ekstra_mesaj":
                        "{} adlı kullanıcı, {} numaralı projeye sözleşme yükledi"
                        .format(current_user.username, proje.proje_no)
                    }

                    signal_sender(**revizyon_signal_payload)

                    for bap_admin in bap_yetkili_and_admin_ids():
                        payload = {
                            "message_type":
                            USER_ACTIVITY_MESSAGES.get("bap").get(
                                "proje_sozlesmesi_yuklendi").type_index,
                            "ekstra_mesaj":
                            "{} id li projeye sözleşme yüklendi".format(
                                proje.id),
                            "notification_receiver":
                            bap_admin.person_id,
                            "notification_title":
                            user_activity_message,
                            "notification_message":
                            "{} numaralı projenin sözleşmesi {} adlı kullanıcı"
                            " tarafından yüklendi.".format(
                                proje.proje_no, current_user.username),
                            "proje_id":
                            proje.id
                        }

                        signal_sender(log=False, notification=True, **payload)
                else:
                    flash(_("Lütfen proje sözleşmesi yükleyiniz"))
            else:
                flash(_("Sözleşme kaydedilemedi."))
                flash(sozlesme_formu.sozlesme_file.errors[0])
        except Exception as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                hata="Proje sözleşmesi yüklenirken bir hata meydana geldi"
                "Hata: {}".format(exc))
        return redirect(url_for("proje.proje_dashboard", proje_id=proje_id))

    @staticmethod
    @login_required
    @auth.requires(Or(Role("BAP Admin"), Role("BAP Yetkilisi")))
    @route("/dashboard/<int:proje_id>/",
           methods=["POST"],
           endpoint="proje_durum_degistir")
    def proje_durum_degistir(proje_id):
        kod = request.get_json()['kod']

        template = project_management_methods_get[kod](proje_id=proje_id,
                                                       code=kod)

        return jsonify(status="success", template=template)

    @staticmethod
    @login_required
    @auth.requires(Or(Role("BAP Admin"), Role("BAP Yetkilisi")))
    @route("/<int:proje_id>", methods=["POST"], endpoint="proje_durum_kaydet")
    def proje_durum_kaydet(proje_id):

        request_json = request.get_json()
        form = request_json['form']
        kod = request_json['kod']

        try:
            template = project_management_methods_post[kod](proje_id=proje_id,
                                                            code=kod,
                                                            form=form)
            if not template:
                return jsonify(status="success")

            if type(template) is str:
                return jsonify(status="error",
                               template=template,
                               code=kod,
                               hata_mesaji=""), 400
            return jsonify(
                status="error",
                template=template[0],
                code=kod,
                hata_mesaji=template[1] if len(template) > 1 else ""), 400

        except Exception as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                hata="Proje ile ilgili işlem yapılırken bir hata oluştu"
                "Hata: {}, Proje id: {}".format(exc, proje_id))
            return jsonify(status="error", template=None), 500
Ejemplo n.º 22
0
class ProjeBasvuruView(FlaskView):
    """Proje başvurusu view classı"""

    excluded_methods = [
        "basvuru_formu_restriction", "proje_diger_dosya_kaydet",
        "proje_ek_dosyalar_kaydet", "yurutucu_kaydet", "butce_kaydet"
    ]

    @staticmethod
    @login_required
    @auth.requires(Permission(
        *permission_dict["bap"]["proje"]["basvuru"]["proje_basvurusu_yapma"]),
                   menu_registry={
                       "path": ".bap.yeni_basvuru",
                       "title": _("Proje Başvuru"),
                       "order": 0
                   })
    @route('/yeni-basvuru', methods=['GET'])
    def basvuru_icin_proje_turu_sec():
        """Proje başvurusu yapabilmek için başvuracağımız proje türünü seçmek için kullanırız"""
        proje_turleri = DB.session.query(ProjeTuru).filter_by(
            basvuru_aktif_mi=True,
            guncel_mi=True).order_by(desc(ProjeTuru.updated_at)).all()
        return render_template(
            'arastirma_projesi_basvuru/proje_basvuru_sec.html',
            proje_turleri=proje_turleri)

    @staticmethod
    @login_required
    @auth.requires(
        Permission(*permission_dict["bap"]["proje"]["basvuru"]
                   ["proje_basvurusu_yapma"]))
    @route('/yeni-basvuru/tur/<int:tur_id>',
           methods=['GET'],
           endpoint='proje_yeni_basvuru')
    def yeni_basvuru(tur_id):
        """Yeni proje başvurusu formları"""
        user_id = current_user.id
        try:
            p_tur = DB.session.query(ProjeTuru).filter_by(
                id=tur_id, basvuru_aktif_mi=True, guncel_mi=True).one()
        except NoResultFound as exc:
            CustomErrorHandler.error_handler(
                hata="Güncel olmayan veya var olmayan bir proje türü ile proje "
                "basvurusu yapılmaya çalışıldı. Hata: {}, User id: {}, "
                "Proje turu id: {}".format(exc, user_id, tur_id))
            return abort(404)

        proje_tur_dict = proje_turu_to_dict(p_tur)

        # basvuruyu yapan ogretim elamanininin id sini getirir
        ogretim_elemani = DB.session.query(
            OgretimElemani.id.label("ogretim_elemani_id")).join(
                Personel, OgretimElemani.personel_id == Personel.id).join(
                    Person, Personel.person_id == Person.id).filter(
                        Person.user_id == current_user.id).one()
        yurutucu_id = ogretim_elemani.ogretim_elemani_id

        yeni_basvuru_formu = basvuru_formu_restriction(proje_tur_dict)
        yeni_basvuru_formu.proje_personeli.yurutucu.yurutucu_id.data = yurutucu_id

        yeni_proje = Proje(proje_turu=p_tur.id,
                           proje_turu_numarasi=p_tur.tur_kodu,
                           yurutucu=yurutucu_id,
                           user_id=user_id)
        DB.session.add(yeni_proje)
        DB.session.flush()
        proje_no = "{}{}".format(date.today().year, yeni_proje.id)
        yeni_proje.proje_no = proje_no
        # proje_basvuru_durumu=ProjeBasvuruDurumu.taslak
        DB.session.commit()
        signal_payload = {
            "message_type":
            USER_ACTIVITY_MESSAGES.get("bap").get(
                "proje_basvuru_basla").type_index,
            "nesne":
            'Proje',
            "nesne_id":
            yeni_proje.id,
            "ekstra_mesaj":
            "{} adlı kullanıcı, {} kategorisine proje başvuru islemine "
            "basladi.".format(current_user.username, p_tur.kategori)
        }
        signal_sender(**signal_payload)
        # yeni_basvuru_formu.proje_id.data = yeni_proje.id

        return render_template(
            'arastirma_projesi_basvuru/arastirma_proje_basvurusu.html',
            yeni_basvuru_formu=yeni_basvuru_formu,
            proje_tur_dict=proje_tur_dict,
            proje_id=yeni_proje.id,
            revizyon_bekleniyor_mu=False,
            uyari_mesajlari=proje_tur_dict.get("genel_uyari_mesajlari", None))

    @staticmethod
    @login_required
    @auth.requires(
        And(
            Permission(*permission_dict["bap"]["proje"]["basvuru"]
                       ["proje_basvurusu_yapma"]), ProjeYurutucusu(),
            TamamlanmamisProjeBasvurusu()))
    @route('/proje/<int:proje_id>/kaydet',
           methods=['POST'],
           endpoint='yeni_proje_kaydet')
    def proje_kaydet(proje_id):
        """
        Proje başvurusunun taslak olarak kaydedilmedi kaydedilen taslağın güncellenmesi ve
        başvurunun tamamlanıp sonuçlandırılması işini yapar
        """
        taslak_mi = request.args.get("taslak_mi", False)
        user_id = current_user.id
        form_data = request.form

        proje_turu_id = form_data.get("proje_turu")
        try:
            proje_turu = get_proje_turu_with_related_field(proje_turu_id)
        except NoResultFound as exc:
            CustomErrorHandler.error_handler(
                hata="Güncel olmayan veya var olmayan bir proje türü id si ile "
                "başvuru yapılmaya çalışıldı. Hata: {}, User id: {}, "
                "Proje Turu id: {}".format(exc, user_id, proje_turu_id))
            return abort(404)

        proje_tur_dict = proje_turu_to_dict(proje_turu)

        proje_formu = basvuru_formu_restriction(initial_form_data=form_data,
                                                proje_turu_dict=proje_tur_dict)
        proje = DB.session.query(Proje).filter_by(id=proje_id).one()
        revizyon_bekleniyor_mu = True if proje.proje_basvuru_durumu == ProjeBasvuruDurumu.revizyon_bekleniyor else False

        if not taslak_mi and not proje_formu.validate():
            hata_listesi = set()

            form_errors_dict_to_set(proje_formu.errors, hata_listesi)
            proje_formu.proje_personeli.yurutucu.yurutucu_id.data = proje.yurutucu
            return render_template(
                'arastirma_projesi_basvuru/arastirma_proje_basvurusu.html',
                yeni_basvuru_formu=proje_formu,
                proje_tur_dict=proje_turu.to_dict(),
                proje_id=proje_id,
                proje_hakem_onerileri=proje.proje_hakem_onerileri,
                proje_calisanlari=[
                    calisan for calisan in proje.proje_calisanlari
                    if not (proje.yurutucu
                            and proje.yurutucu == calisan.personel_id)
                ],
                taslak_mi=taslak_mi,
                revizyon_bekleniyor_mu=revizyon_bekleniyor_mu,
                hata_mesajlari=hata_listesi)
        try:
            form_genel = proje_formu.genel_bilgiler
            proje.update_obj_data(form_genel.genel_bilgiler.data)
            proje.update_obj_data(form_genel.fakulte.data)
            proje.update_obj_data(form_genel.ozet_bilgiler.data)
            proje.onaylayan_yetkili_id = form_genel.onaylayan_yetkili.onaylayan_yetkili_id.data
            proje.onay_tarihi = form_genel.onaylayan_yetkili.onay_tarihi.data

            toplam_katki = Decimal(0)

            # yürütücü kaydeder
            # yurutucu calisan olarak kaydedilmis ise gerekli veriyi getirir
            yurutucu_calisan = DB.session.query(ProjeCalisanlari).filter_by(
                proje_id=proje_id,
                personel_id=proje.proje_yurutucu.personel_id).first()
            if not yurutucu_calisan:
                yurutucu_kaydet(proje_id, proje_tur_dict,
                                proje_formu.proje_personeli.yurutucu,
                                proje.yurutucu, taslak_mi)
            else:
                yurutucu = DB.session.query(ProjeCalisanlari).filter_by(
                    proje_id=proje_id,
                    personel_id=proje.proje_yurutucu.personel_id).first()
                yurutucu.update_obj_data(
                    proje_formu.proje_personeli.yurutucu.data)

            # destekleyen kuruluş kaydeder
            if proje.proje_destekleyen_kurulus:

                proje.proje_destekleyen_kurulus.update_obj_data(
                    form_genel.destekleyen_kurulus.data)
            else:
                proje_destekleyen_kurulus = ProjeDestekleyenKurulus(
                    proje_id=proje.id, **form_genel.destekleyen_kurulus.data)
                DB.session.add(proje_destekleyen_kurulus)

            # proje formu diger alanlarını kaydeder
            if proje_formu.diger:
                # proje basvurusu için ek dosyalari kaydeder
                proje_ek_dosyalar_kaydet(user_id, proje_id,
                                         proje_formu.diger.ek_dosyalar,
                                         proje.proje_belgeleri, taslak_mi)

                # proje basvurusu için diğer dosyaları kaydeder
                var_olan_dosyalar = []
                if proje_formu.diger.proje_diger:
                    var_olan_dosyalar = proje_diger_dosya_kaydet(
                        user_id, proje_id, proje_formu.diger.proje_diger,
                        proje.proje_belgeleri)

                for dosya in proje.proje_belgeleri:
                    if dosya.id not in var_olan_dosyalar and not dosya.proje_turu_ek_dosya_id:
                        DB.session.delete(dosya)
            # proje basvurusu butce alanlarini kaydeder
            for proje_kalemi in proje.proje_kalemleri:
                DB.session.delete(proje_kalemi)
            DB.session.flush()
            onerilen_proje_butcesi, butce_hatalari = butce_kaydet(
                proje_id, proje_formu.butce.data)
            proje.teklif_edilen_butce = onerilen_proje_butcesi

            # proje başvurusu tamamlanmaya çalışılıyorsa gerekli kontroller yapılır
            if not taslak_mi:
                # proje turunden gelen proje sure alt ve ust limitleri
                sure_alt_limiti = proje_tur_dict.get("sure_alt_limiti")
                sure_ust_limiti = proje_tur_dict.get("sure_ust_limiti")
                sure_birimi = proje_tur_dict.get("sure_birimi")

                # karsilastirma yapabilmek icin teklif edilen, sure alt limitini ve sure ust
                # limitini gun cinsine ceviriyoruz
                min_sure = month_year_to_day(sure_alt_limiti, sure_birimi)
                max_sure = month_year_to_day(sure_ust_limiti, sure_birimi)
                teklif_edilen_proje_suresi = month_year_to_day(
                    proje_formu.genel_bilgiler.genel_bilgiler.proje_suresi.
                    data, proje_formu.genel_bilgiler.genel_bilgiler.
                    proje_suresi_birimi.data)

                if teklif_edilen_proje_suresi < min_sure or teklif_edilen_proje_suresi > max_sure:
                    flash(
                        _("Proje süreniz {} ile {} {} arasında olabilir".
                          format(sure_alt_limiti, sure_ust_limiti,
                                 sure_birimi)), "error")

                if proje.teklif_edilen_butce:
                    if proje_turu.butce.butce_alt_limiti > proje.teklif_edilen_butce:
                        flash(
                            _("Proje bütçeniz en az {} TL olabilir".format(
                                proje_turu.butce.butce_alt_limiti)), "error")
                    elif proje_turu.butce.butce_ust_limiti < proje.teklif_edilen_butce:
                        flash(
                            _("Proje bütçeniz en fazla {} TL olabilir".format(
                                proje_turu.butce.butce_ust_limiti)), "error")

                for calisan in proje.proje_calisanlari:
                    toplam_katki += Decimal(
                        calisan.projeye_katkisi
                    ) if calisan.projeye_katkisi else Decimal(0)
                    if proje_tur_dict.get("ozgecmis_yuklenmesi_zorunlu_mu"):
                        if calisan.ozgecmis.file_id is None and not calisan.ozgecmis.tecrube:
                            flash(
                                _("Proje personeli İçin Özgeçmiş Yüklemeniz Zorunludur"
                                  ), "error")
                            break
                    zorunlu_banka_bilgileri = proje_tur_dict.get(
                        "banka_bilgilerini_girmek_zorunlu_mu")
                    if zorunlu_banka_bilgileri and not calisan.banka_bilgisi:
                        flash(
                            _("Proje personeli İçin Banka Bilgileri Girilmesi Zorunludur"
                              ), "error")
                        break

                if proje_tur_dict.get("hakem_onerilsin_mi", None):
                    basvuru_hakem_oneri_sayisi = proje_tur_dict.get(
                        "basvuru_hakem_oneri_sayisi", 0)
                    if len(proje.proje_hakem_onerileri
                           ) < basvuru_hakem_oneri_sayisi:
                        flash(
                            _("Projenizin değerlendirmeye alınabilmesi için en az {} adet hakem "
                              "önerisinde bulunmanız gerekmektedir"
                              ".").format(basvuru_hakem_oneri_sayisi), "error")

                if toplam_katki > 100:
                    flash(
                        _("Personellerin toplam katkı değerleri en fazla 100 olabilir."
                          ), "error")
                form_personel = proje_turu.personel_ayarlari
                # projede bulunan personel sayisindan yurutucuyu cikarinca
                # projeye eklenen personel sayisi bulunur
                calisan_sayisi = len(proje.proje_calisanlari) - 1
                if form_personel.yardimci_arastirmaci_secenekleri == \
                        YardimciArastirmaciSecenekleri.sinirli:
                    if form_personel.yardimci_arastirmaci_alt_limiti > calisan_sayisi:
                        flash(
                            _("{} personel eklediniz. En az {} personel eklemelisiniz."
                              ).format(
                                  calisan_sayisi, form_personel.
                                  yardimci_arastirmaci_alt_limiti), "error")
                    elif form_personel.yardimci_arastirmaci_ust_limiti < calisan_sayisi:
                        flash(
                            _("{} personel eklediniz. En fazla {} personel ekleyebilirsiniz."
                              ).format(
                                  calisan_sayisi, form_personel.
                                  yardimci_arastirmaci_ust_limiti), "error")
                for butce_hata in butce_hatalari:
                    flash(butce_hata, "error")

                if get_flashed_messages(category_filter=["error"]):
                    DB.session.rollback()
                    proje_formu.proje_personeli.yurutucu.yurutucu_id.data = proje.yurutucu
                    return render_template(
                        'arastirma_projesi_basvuru/arastirma_proje_basvurusu.html',
                        yeni_basvuru_formu=proje_formu,
                        proje_tur_dict=proje_tur_dict,
                        proje_id=proje_id,
                        proje_hakem_onerileri=proje.proje_hakem_onerileri,
                        proje_calisanlari=[
                            calisan for calisan in proje.proje_calisanlari
                            if not (proje.yurutucu
                                    and proje.yurutucu == calisan.personel_id)
                        ],
                        taslak_mi=taslak_mi,
                        revizyon_bekleniyor_mu=revizyon_bekleniyor_mu,
                        hata_mesajlari=get_flashed_messages(
                            category_filter=["error"]))

            if taslak_mi:
                proje.proje_basvuru_durumu = ProjeBasvuruDurumu.taslak
                signal_payload = {
                    "message_type":
                    USER_ACTIVITY_MESSAGES.get("bap").get(
                        "proje_basvuru_guncelle").type_index,
                    "nesne":
                    'Proje',
                    "nesne_id":
                    proje_id,
                    "ekstra_mesaj":
                    "{} adlı kullanıcı, proje başvurusunu güncelledi.".format(
                        current_user.username)
                }
                signal_sender(**signal_payload)
                return redirect(
                    url_for('proje.proje_yeni_basvuru_taslak_with_id',
                            proje_id=proje.id))

            # todo: revizyon tamamlaninca admine mesaj !!!
            proje.proje_basvuru_durumu = ProjeBasvuruDurumu.tamamlandi

            if not revizyon_bekleniyor_mu:
                proje.gelir_kasasi_id = proje_tur_dict.get(
                    "gelir_kasasi_id", None)
                proje.teklif_edilen_baslama_tarihi = date.today()
                ProjeStateDispacther.project_init(
                    params={"proje_id": proje_id},
                    triggered_by=current_user.id,
                    proje_id=proje_id)
                signal_payload = {
                    "message_type":
                    USER_ACTIVITY_MESSAGES.get("bap").get(
                        "proje_basvuru_tamamla").type_index,
                    "nesne":
                    'Proje',
                    "nesne_id":
                    proje_id,
                    "ekstra_mesaj":
                    "{} adlı kullanıcı, proje başvurusunu tamamladi.".format(
                        current_user.username)
                }

                signal_sender(**signal_payload)
            else:
                revizyon_signal_payload = {
                    "message_type":
                    USER_ACTIVITY_MESSAGES.get("bap").get(
                        "proje_basvuru_tamamla").type_index,
                    "nesne":
                    'Proje',
                    "nesne_id":
                    proje_id,
                    "ekstra_mesaj":
                    "{} adlı kullanıcı, projesinin revizyonunu tamamladi.".
                    format(current_user.username)
                }

                signal_sender(**revizyon_signal_payload)

                for bap_admin in bap_yetkili_and_admin_ids():
                    payload = {
                        "message_type":
                        USER_ACTIVITY_MESSAGES.get("bap").get(
                            "proje_islem").type_index,
                        "ekstra_mesaj":
                        "{} id li projenin revizyon işlemi tamamlandı".format(
                            proje.id),
                        "notification_receiver":
                        bap_admin.person_id,
                        "notification_title":
                        _("Proje revize edildi"),
                        "notification_message":
                        "{} numaralı projenin revizyon işlemi proje yürütücüsü"
                        " tarafından tamamlandı.".format(proje.proje_no),
                        "proje_id":
                        proje.id
                    }

                    signal_sender(log=False, notification=True, **payload)

            DB.session.commit()
            return redirect(url_for('proje.proje_dashboard',
                                    proje_id=proje.id))
        except IntegrityError as exc:
            CustomErrorHandler.error_handler(
                hata="Bir hata meydana geldi. Hata: {}".format(exc))
            DB.session.rollback()
            proje_formu.proje_personeli.yurutucu.yurutucu_id.data = proje.yurutucu
            return render_template(
                'arastirma_projesi_basvuru/arastirma_proje_basvurusu.html',
                yeni_basvuru_formu=proje_formu,
                proje_tur_dict=proje_turu.to_dict(),
                proje_id=proje_id,
                proje_hakem_onerileri=proje.proje_hakem_onerileri,
                proje_calisanlari=[
                    calisan for calisan in proje.proje_calisanlari
                    if not (proje.yurutucu
                            and proje.yurutucu == calisan.personel_id)
                ],
                revizyon_bekleniyor_mu=revizyon_bekleniyor_mu,
                taslak_mi=taslak_mi)

    @staticmethod
    @login_required
    @auth.requires(
        And(
            Permission(*permission_dict["bap"]["proje"]["basvuru"]
                       ["proje_basvurusu_yapma"]),
            And(TamamlanmamisProjeBasvurusu(), ProjeYurutucusu())))
    @route('/yeni-basvuru/taslak/<int:proje_id>',
           methods=['GET'],
           endpoint='proje_yeni_basvuru_taslak_with_id')
    # pylint: disable=too-many-locals
    def get_proje_taslak_with_id(proje_id):
        """Id'si verilen kaydedilmiş taslak projeyi getirir"""
        user_id = current_user.id
        try:
            proje = DB.session.query(Proje).filter_by(
                id=proje_id,
                proje_basvuru_durumu=ProjeBasvuruDurumu.taslak).one()

        except NoResultFound as exc:
            CustomErrorHandler.error_handler(
                hata=
                "Basvuru durumu taslak olmayan veya var olmayan bir proje ile "
                "proje basvurusu taslağına ulaşılmaya calışıldı. Hata: {}, "
                "User id: {}, Proje id: {}".format(exc, user_id, proje_id))
            return abort(404)
        proje_turu = get_proje_turu_with_related_field(proje.proje_turu)
        if not proje_turu:
            #  todo: current app logger customerror handlera cevrilecek
            CustomErrorHandler.error_handler(
                hata=
                "Güncel olmayan bir proje türünün kayıtlı taslagına ulaşılmaya"
                " çalışıldı. User id: {}, Proje id: {}".format(
                    user_id, proje_id))
            flash(
                "Taslak kaydı yaptığınız projenin başvuru koşulları BAP birimi tarafından "
                "güncellenmiştir. Lütfen güncel proje türü üzerinden tekrar başvurunuzu "
                "gerçekleştiriniz.")
            return redirect(
                url_for("proje.ProjeBasvuruView:basvuru_icin_proje_turu_sec"))
        proje_turu_dict = proje_turu_to_dict(proje_turu)
        yurutucu_calisan_id = None

        yurutucu_calisan = DB.session.query(ProjeCalisanlari).filter_by(
            proje_id=proje_id, personel_id=proje.yurutucu).first()
        if yurutucu_calisan:
            yurutucu_calisan_id = yurutucu_calisan.id

        form_data = get_proje_data(proje_turu_dict, proje)

        proje_formu = basvuru_formu_restriction(
            proje_turu_dict=proje_turu_dict, **form_data)
        return render_template(
            'arastirma_projesi_basvuru/arastirma_proje_basvurusu.html',
            yeni_basvuru_formu=proje_formu,
            proje_tur_dict=proje_turu.to_dict(),
            proje_id=proje_id,
            proje_hakem_onerileri=proje.proje_hakem_onerileri,
            proje_calisanlari=[
                calisan for calisan in proje.proje_calisanlari if not (
                    proje.yurutucu and proje.yurutucu == calisan.personel_id)
            ],
            yurutucu_calisan_id=yurutucu_calisan_id,
            taslak_mi=True,
            revizyon_bekleniyor_mu=False,
            uyari_mesajlari=proje_turu_dict.get("genel_uyari_mesajlari", None))