示例#1
0
class SatinalmaBelgelerView(FlaskView):
    @staticmethod
    @login_required
    @auth.requires(
        Permission(*permission_dict["bap"]["satinalma"]
                   ["satinalma_belgeleri_goruntuleme"]),
        Or(Role('BAP Yetkilisi'), Role('BAP Admin')))
    @route("<int:satinalma_id>/belgeler",
           methods=["GET", "POST"],
           endpoint="satinalma_belgeler")
    def satinalma_ozet(satinalma_id):

        satinalma = get_satinalma_with_related_fields(
            satinalma_id=satinalma_id)
        states_info = get_satinalma_next_states_info(satinalma_id=satinalma_id)
        actions_info = get_satinalma_actions_info(satinalma_id=satinalma_id)
        proje = DB.session.query(Proje).filter(
            Proje.id == satinalma.proje_id).first()
        templates = get_templates_info(satinalma_id=satinalma_id)

        return render_template("satinalma_dashboard/satinalma_belgeler.html",
                               satinalma=satinalma,
                               satinalma_id=satinalma_id,
                               proje=proje,
                               actions_info=actions_info,
                               states_info=states_info,
                               templates=templates)
示例#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)
示例#3
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)
示例#4
0
class YollukView(FlaskView):
    """Toplanti Gundem Viewi"""

    @staticmethod
    @login_required
    @auth.requires(Or(Permission(*permission_dict["bap"]["toplanti"]["toplanti_gundemi_listeleme"]),
                      Role("BAP Yetkilisi"),
                      Role("BAP Admin")),
                   menu_registry={'path': '.bap.yolluk.yolluk_arama',
                                  'title': _("Yolluk")})
    @route("/yolluk", methods=['GET'])
    def yolluk():
        return render_template("yolluk.html")
示例#5
0
class ProjeHakemView(FlaskView):
    """Proje hakem önerilerinin ve proje hakemlerinin goruntulendigi view"""

    @login_required
    @auth.requires(
        And(Permission(
            *permission_dict["bap"]["proje"]["dashboard"]["proje_hakemleri_goruntuleme"]),
            Or(Role('BAP Yetkilisi'), Role("BAP Admin"))))
    @route('<int:proje_id>/dashboard/hakem', methods=["GET"], endpoint='proje_hakem_get')
    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
        )

    @staticmethod
    @login_required
    @auth.requires(
        And(Permission(*permission_dict["bap"]["proje"]["dashboard"]["projeye_hakem_atama"]),
            Or(Role("BAP Yetkilisi"), Role("BAP Admin"))))
    @route('/<int:proje_id>/proje-hakemleri/<int:proje_hakem_id>', methods=['DELETE'])
    def proje_hakem_sil(proje_id, proje_hakem_id):
        """
        Seçilen hakemin projehakem davet durumunu cikarildi olarak degistirir.

        """
        try:

            proje_hakem = DB.session.query(ProjeHakemleri).filter(
                ProjeHakemleri.proje_id == proje_id,
                ProjeHakemleri.id == proje_hakem_id).one()
            proje_hakem.davet_durumu = ProjeHakemDavetDurumlari.cikarildi

            DB.session.commit()
            signal_payload = {
                "message_type": USER_ACTIVITY_MESSAGES.get("bap").get("hakem_atama_sil").type_index,
                "nesne": 'Proje Hakemleri',
                "nesne_id": proje_id,
                "ekstra_mesaj": "{} adlı kullanıcı, {} id'li hakemi proje hakemleri arasindan "
                                "cikardi.".format(current_user.username, proje_hakem_id)
            }
            signal_sender(**signal_payload)

            return jsonify(status="success")
        except SQLAlchemyError as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                                             hata="Proje idsi %s olan proje hakemleri arasından %s idli hakemi çıkarmaya "
                                                  "çalışılırken bir sorun oluştu. Hata: %s" % (
                                                      proje_id, proje_hakem_id, exc)
                                             )
        return jsonify(status="error"), 400

    @staticmethod
    @login_required
    @auth.requires(
        And(Permission(*permission_dict["bap"]["proje"]["dashboard"]["projeye_hakem_atama"]),
            Or(Role("BAP Yetkilisi"), Role("BAP Admin"))))
    @route('/<int:proje_id>/hakem/<int:hakem_id>/ekle', methods=['POST'])
    def proje_hakemi_ekle(proje_id, hakem_id):
        """
        Secilen hakemi proje hakemleri modeline kaydeder.
        Eger daha once kaydedilmemis bir hakem ise ProjeHakem model instance i olusturup kaydeder.
        Daha once projeye hakemlik teklifini reddeden bir hakeme teklif gonderilmis ise "davet_durumu"
        alani "gonderildi" yapilir.
        Eger daha önce projeye atanip proje hakemlerinden cikarilan bir hakemi eklemeye calisirsa
        var olan projehakem kaydini bulup "davet_durumu" alani "gonderildi" yapilir.


        """
        try:
            proje_hakem = DB.session.query(ProjeHakemleri).options(
                joinedload(ProjeHakemleri.hakem).joinedload(Hakem.person),
                joinedload(ProjeHakemleri.hakem).joinedload(Hakem.personel)
            ).filter(
                ProjeHakemleri.hakem_id == hakem_id,
                ProjeHakemleri.proje_id == proje_id).scalar()
            proje = DB.session.query(Proje.proje_no.label("proje_no")).filter(Proje.id == proje_id).first()
            if proje_hakem:
                if proje_hakem.davet_durumu == ProjeHakemDavetDurumlari.gonderildi:
                    # davet durumu gonderildi durumunda ise yani hakem daveti yanıtlamadıysa
                    # bu durum gecerlidir.
                    return jsonify(status="error",
                                   error_message=_("Bu hakeme zaten davet gönderildi")), 409
                elif proje_hakem.davet_durumu == ProjeHakemDavetDurumlari.kabul_edildi:
                    return jsonify(status="error",
                                   error_message=_("Bu kişi zaten proje hakemi")), 409

                else:
                    # daveti kabul etmeyen veya projeden cikarilan hakem durumlari icin gecerlidir
                    proje_hakem.davet_durumu = ProjeHakemDavetDurumlari.gonderildi
                # eger proje_hakem i var ise daha once bu hakeme teklif gonderilmis ve herhangi bir
                # "davet_durumu" stateinde olabilir.
                hakem_person_id = proje_hakem.hakem.personel.person_id if proje_hakem.hakem.personel else proje_hakem.hakem.person_id
            else:
                hakem = DB.session.query(Hakem).options(
                    joinedload(Hakem.person),
                    joinedload(Hakem.personel)
                ).filter(Hakem.id == hakem_id).first()
                # daha once bu hakem proje ile iliskilendirilmemis.
                yeni_hakem = ProjeHakemleri(proje_id=proje_id, hakem_id=hakem_id)
                DB.session.add(yeni_hakem)
                hakem_person_id = hakem.personel.person_id if hakem.personel else hakem.person_id

            payload = {
                "notification_receiver": hakem_person_id,
                "notification_title": "Proje Hakemlik Daveti",
                "notification_message": "{} numaralı projeye hakem olmanız için davet gönderildi.".format(
                    proje.proje_no),
                "proje_id": proje_id,
            }

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

            DB.session.commit()
            signal_payload = {
                "message_type": USER_ACTIVITY_MESSAGES.get("bap").get("hakem_atama").type_index,
                "nesne": 'Proje Hakemleri',
                "nesne_id": proje_id,
                "ekstra_mesaj": "{} adlı kullanıcı, {} id'li hakeme hakemlik daveti gonderidi.".format(
                    current_user.username,
                    hakem_id
                )
            }
            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 eklemeye çalışılırken bir sorun oluştu. Hata: %s"
                                                  % (proje_id, exc)
                                             )
        return jsonify(status="error", error_message=_(
            "Beklenmedik bir hata oluştur. Lütfen daha sonra tekrar deneyiniz")), 409
示例#6
0
class SatinAlmaTalepleriView(FlaskView):
    """Bap Satinalma Talepleri view class"""

    excluded_methods = ["qry"]

    @property
    def qry(self):
        """
                Proje ve ilgili alanlari icin query nesnesi olustur.
                Returns:
                """
        return DB.session.query(ProjeSatinAlmaTalebi).join(
            Proje, Proje.id == ProjeSatinAlmaTalebi.proje_id
        ).join(OgretimElemani, Proje.yurutucu == OgretimElemani.id).join(
            Personel, OgretimElemani.personel_id ==
            Personel.id).join(Person, Person.id == Personel.person_id).join(
                ProjeTuru, ProjeTuru.id == Proje.proje_turu).join(
                    AppState,
                    ProjeSatinAlmaTalebi.durum_id == AppState.id).add_columns(
                        ProjeSatinAlmaTalebi.id,
                        ProjeSatinAlmaTalebi.created_at.label("talep_tarihi"),
                        Proje.proje_no.label("proje_no"), Person.ad,
                        Person.soyad,
                        AppState.state_code.label("satinalma_durumu"),
                        ProjeTuru.ad.label("proje_turu_ad"))

    def process_data(self, result, form_data, total_record):
        data = [[
            index + 1, r.proje_no if r.proje_no else '-', r.satinalma_durumu,
            "{} {}".format(r.ad,
                           r.soyad), '{:%d.%m.%Y}'.format(r.talep_tarihi), """
            <a class="detail_arrow" href="{}"><span class="fa fa-arrow-circle-right fa-2x "></span>
                </a>
                """.format(
                               url_for('satinalma.satinalma_dashboard',
                                       satinalma_id=r.id))
        ] for index, r in enumerate(result)]

        return jsonify({
            "data": data,
            "draw": form_data['draw'],
            "recordsFiltered": len(result),
            "recordsTotal": total_record
        })

    @login_required
    @route('/liste', methods=['GET'])
    @auth.requires(Permission(*permission_dict["bap"]["satinalma"]
                              ["satınalma_talepleri_listesi_goruntuleme"]),
                   menu_registry={
                       "path": ".bap.satinalma.satinalma_talepleri",
                       "title": _("Talepler")
                   })
    def satinalma_talepleri_listele(self):
        search_form = SatinalmaTalepSearchForm()
        return render_template('satinalma_talepleri.html', form=search_form)

    @login_required
    @auth.requires(
        Or(
            Permission(*permission_dict["bap"]["satinalma"]
                       ["satınalma_talepleri_listesi_goruntuleme"]),
            Or(Role("BAP Admin"), Role("BAP Yetkilisi"))))
    @route('/data', methods=["POST"], endpoint="satinalma_search")
    def satilama_talebi_ara(self):  # pylint: disable=too-many-branches
        """
        Bap projelerinde POST ile gelen parametrelere gore arama yapip, sonuclari dondurur.
        Returns:
            http response
        """
        qry = self.qry
        total_record = qry.count()
        form_data = request.form.to_dict()
        search_form = SatinalmaTalepSearchForm(**form_data)

        talep_durumu = search_form.talep_durumu.data

        satinalma_sureci = search_form.satinalma_sureci.data

        if satinalma_sureci == "-1":
            qry = qry.filter(
                or_((AppState.current_app_state == 'basvuru_kabul'),
                    (AppState.current_app_state == 'devam'),
                    (AppState.current_app_state == 'son')))
        if satinalma_sureci == 'AppStates.basvuru_kabul':
            qry = qry.filter(AppState.current_app_state == 'basvuru_kabul')
        if satinalma_sureci == 'AppStates.devam':
            qry = qry.filter(AppState.current_app_state == 'devam')
        if satinalma_sureci == 'AppStates.son':
            qry = qry.filter(AppState.current_app_state == 'son')

        if talep_durumu != '0' and talep_durumu != 'None':
            qry = qry.filter(AppState.id == int(talep_durumu))

        if not search_form.validate():
            result = qry.order_by(desc(ProjeSatinAlmaTalebi.id)).offset(
                form_data['start']).limit(form_data['length']).all()
            return self.process_data(result, form_data, total_record)

        proje_no = search_form.proje_no.data
        talep_tarihi = search_form.date.talep_tarihi.data
        talep_tarihi_option = search_form.date.talep_tarihi_option.data
        yurutucu = search_form.yurutucu.data
        proje_turu_adi = search_form.proje_turu_adi.data

        if proje_no:
            qry = qry.filter(Proje.proje_no.ilike('%' + proje_no + '%'))

        if yurutucu:
            qry = qry.filter(Person.ad.ilike('%' + yurutucu + '%'))

        if proje_turu_adi:
            qry = qry.filter(ProjeTuru.ad.ilike('%' + yurutucu + '%'))

        if talep_tarihi:
            if talep_tarihi_option == '0':
                qry = qry.filter(
                    ProjeSatinAlmaTalebi.created_at >= talep_tarihi)
            if talep_tarihi_option == '1':
                qry = qry.filter(
                    ProjeSatinAlmaTalebi.created_at == talep_tarihi)
            if talep_tarihi_option == '2':
                qry = qry.filter(ProjeSatinAlmaTalebi.created_at <=
                                 Proje.kabul_edilen_baslama_tarihi)

        result = qry.order_by(desc(ProjeSatinAlmaTalebi.id)).offset(
            form_data['start']).limit(form_data['length']).all()

        return self.process_data(result, form_data, total_record)
示例#7
0
class SatinalmaDashboardView(FlaskView):
    """
    Satinalma Ozet
    """

    @staticmethod
    @login_required
    @auth.requires(Permission(*permission_dict["bap"]["satinalma"]["satinalma_ozeti_goruntuleme"]),
                   Or(Role('BAP Yetkilisi'), Role('BAP Admin')))
    @route("<int:satinalma_id>/ozet", methods=["GET", "POST"], endpoint="satinalma_dashboard")
    def satinalma_ozet(satinalma_id):
        """
        Satınalma özeti bilgilerine ulaşmak için kullanılır
        Args:
            satinalma_id(int): satinalma id si

        Returns:
        """

        try:
            satinalma = get_satinalma_with_related_fields(satinalma_id=satinalma_id)

            satinalma_dispatcher = SatinalmaStateDispatcher(state_type=StateTypes.satinalma,
                                                            action_type=ActionTypes.satinalma,
                                                            entity_type=ProjeSatinAlmaTalebi,
                                                            entity=satinalma)

            satinalma_durum = satinalma_dispatcher.current_state_info()

            possible_next_states = satinalma_dispatcher.possible_next_states_info()

            possible_actions = satinalma_dispatcher.possible_actions()

            proje = DB.session.query(Proje).options(
                joinedload(Proje.proje_kalemleri).lazyload("*")).filter(
                Proje.id == satinalma.proje_id).first()

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

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

            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"))

            satinalma_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.satinalma
            ).options(lazyload("*")).order_by(AppState.id).all()

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

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

            return abort(500)

        return render_template("satinalma_dashboard/satinalma_ozeti.html",
                               satinalma=satinalma,
                               satinalma_id=satinalma_id,
                               actions_info=actions_info,
                               states_info=states_info,
                               satinalma_durum=satinalma_durum,
                               proje=proje,
                               kullanilabilir_butce=kullanilabilir_butce,
                               kullanilan_butce=kullanilan_butce,
                               rezerv_butce=rezerv_butce,
                               toplam_butce=toplam_butce,
                               satinalma_islemleri=satinalma_islemleri,
                               satinalma_durumlari=satinalma_durumlari)

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

        template = satinalma_management_methods_get[action_code](satinalma_id=satinalma_id,
                                                                 action_code=action_code)
        return jsonify(status="success", template=template)

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

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

        try:
            # todo: donen deger unpack edilip template aktarilir. duruma gore render edilmis
            # template veya template ile birlikte bir hata mesaji gelir.hata mesaji gelirse
            # template (rendered_template, hata_mesaji) seklinde bir tuple olur. hata mesaji yoksa
            # template type "str" dir.
            # todo: daha guzel bir cozum bulunması gerekiyor. monkey patch !!!!
            template = satinalma_management_methods_post[action_code](
                satinalma_id=satinalma_id,
                action_code=action_code,
                form=form)
            if not template:
                return jsonify(status="success")

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

        except Exception as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(hata="Satinalma ile ilgili işlem yapılırken bir hata oluştu"
                                                  "Satinalma:{}, User:{}, Hata:{}".format(
                                                 satinalma_id, current_user.username, exc))

            return jsonify(status="error", template=None), 500
示例#8
0
文件: gundem.py 项目: kunthar/zopsedu
class GundemView(FlaskView):
    """Toplanti Gundem Viewi"""

    excluded_methods = [
        "qry",
        "qry_proje"
    ]

    @property
    def qry_proje(self):
        return DB.session.query(
            Proje.id.label("proje_id"),
            Proje.kabul_edilen_baslama_tarihi.label("kabul_edilen_baslama_tarihi"),
            Proje.bitis_tarihi.label("bitis_tarihi"),
            Proje.proje_basligi.label("proje_basligi"),
            Proje.proje_no.label("proje_no"),
            AppState.state_code.label("proje_durumu"),
            AppState.description.label("proje_durum_aciklamasi"),
            Proje.bitis_tarihi.label("bitis_tarihi"),
            Proje.kabul_edilen_baslama_tarihi.label("kabul_edilen_baslama_tarihi")
        ).join(AppState, AppState.id == Proje.proje_durumu_id)

    @property
    def qry(self):

        return DB.session.query(BapGundem). \
            outerjoin(Proje, BapGundem.proje_id == Proje.id). \
            outerjoin(File, BapGundem.ek_dosya_id == File.id). \
            outerjoin(BapToplanti, BapGundem.toplanti_id == BapToplanti.id).add_columns(
            BapGundem.id.label("gundem_id"),
            BapGundem.tipi.label("gundem_tipi"),
            BapGundem.aciklama.label("aciklama"),
            BapGundem.karar.label("karar"),
            BapGundem.ek_dosya_id.label("ek_dosya_id"),
            Proje.proje_no.label("proje_no"),
            Proje.proje_basligi.label("proje_basligi"),
            BapToplanti.toplanti_tarihi.label("toplanti_tarihi"),
            BapToplanti.id.label("toplanti_id")
        )

    def process_data_proje(self, result, form_data, total_record):
        gundem_olustur_formu = GundemOlustur()

        for proje in result:
            gundem_olustur_formu.projeler.append_entry({
                "proje_id": proje.proje_id,
                "proje_durum_aciklamasi": "{} ({})".format(proje.proje_durum_aciklamasi, proje.proje_durumu),
                "proje_baslik": proje.proje_basligi,
                "proje_no": proje.proje_no,
                "bitis_tarihi": proje.bitis_tarihi if proje.bitis_tarihi else ' - ',
                "kabul_edilen_baslama_tarihi": proje.kabul_edilen_baslama_tarihi if proje.kabul_edilen_baslama_tarihi else ' - ',
            })

        data = [[
            render_template_string("""
            {{ index }}
            {{ proje_id }}
            """, index=index + 1, proje_id=r.proje_id),
            render_template_string("""
            {{ secili_mi }}
            """, secili_mi=r.secili_mi),
            render_template_string("""
            {{ proje_no.data }}{{ proje_no }}
            """, proje_no=r.proje_no),
            render_template_string("""
            {{ proje_baslik.data }}{{ proje_baslik }}
            """, proje_baslik=r.proje_baslik),
            render_template_string("""
            {{ proje_durum_aciklamasi.data }} {{ proje_durum_aciklamasi }}
            """, proje_durum_aciklamasi=r.proje_durum_aciklamasi),
            render_template_string("""
                            {{ kabul_edilen_baslama_tarihi.data }} {{kabul_edilen_baslama_tarihi }}
                            """, kabul_edilen_baslama_tarihi=r.kabul_edilen_baslama_tarihi),
            render_template_string("""
            {{ bitis_tarihi.data }} {{bitis_tarihi }}
            """, bitis_tarihi=r.bitis_tarihi)

        ] for index, r in enumerate(gundem_olustur_formu['projeler'])]

        return jsonify({"data": data,
                        "draw": form_data['draw'],
                        "recordsFiltered": total_record,
                        "recordsTotal": total_record
                        })

    def process_data(self, result, form_data, total_record):
        data = [[
            index + 1,
            r.proje_no,
            r.proje_basligi,
            r.gundem_tipi.value,
            render_template_string("""
             {% if toplanti_tarihi %}
                {{ "{:%d.%m.%Y}".format(toplanti_tarihi) }}
            {% else %}
                {{ _('Toplantı eklenmedi') }}
            {% endif %}
            """, toplanti_tarihi=r.toplanti_tarihi),
            render_template_string("""
             {% if aciklama %}
                {{ aciklama | safe }}
                {% else %}
                -
            {% endif %}
            """, aciklama=r.aciklama),
            render_template_string("""
             {% if karar %}
                {{ karar | safe }}
                {% else %}
                -
            {% endif %}
            """, karar=r.karar),
            render_template_string("""
            {% if ek_dosya_id %}
                <div class="document-name attached-document clearfix">
                    <form method="post">
                        <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
                            <button class="btn btn-info"
                                id="ek_{{ ek_dosya_id }}"
                                name="ek_{{ ek_dosya_id }}"
                                value="{{ ek_dosya_id }}"
                                style="white-space: normal;"
                                formaction="{{ url_for('toplanti.ek_dosya_indir', 
                                                belge_id= ek_dosya_id ) }}">
                                {{ _('Ek Belge İndir') }}
                            </button>
                    </form>
                </div>
            {% else %}
                {{ _('Ek Belge Eklenmedi') }}
            {% endif %}    
            """, ek_dosya_id=r.ek_dosya_id),

            render_template_string("""
                 <a href="#gundem-toplanti-degistir"
                    data-toggle="modal"
                    data-target="#gundem-toplanti-degistir
                    data-toplanti-id="{{ toplanti_id if gundem_id }}"
                    data-gundem-id="{{ gundem_id }}"
                    onclick="gundem_modal_open('{{ gundem_id }}', '{{ toplanti_id }}');">
                    <span class="float-left detail_edit fa ft-edit fa-2x m-l-10"></span>
                </a>
            """, toplanti_tarihi=r.toplanti_tarihi if r.gundem_id else 0, gundem_id=r.gundem_id,
                                   toplanti_id=r.toplanti_id),

            render_template_string(""" <input type="hidden" id="gundem-id" value="{{ id }}"> """, id=r.gundem_id),

        ] for index, r in enumerate(result)]
        return jsonify({"data": data,
                        "draw": form_data['draw'],
                        "recordsFiltered": total_record,
                        "recordsTotal": total_record}
                       )

    @staticmethod
    @login_required
    @auth.requires(Or(Permission(*permission_dict["bap"]["toplanti"]["toplanti_gundemi_listeleme"]),
                      Role("BAP Yetkilisi"),
                      Role("BAP Admin")),
                   menu_registry={'path': '.bap.yk_toplanti.degerlendirilmemis_gundem_listele',
                                  'title': _("Gündemler")})
    @route("/degerlendirilmemis-gundemler", methods=['GET'])
    def degerlendirilmemis_gundem_listele():
        """
        Değerlendirilmemis gündemleri listeler

        """
        gundem_form = ToplantiGundem()

        gundem_sablon_list = [(i.id, i.sablon_tipi) for i in DB.session.query(GundemSablon).all()]
        gundem_form.sablon.choices = gundem_sablon_list

        gundem_filtrele_form = DegerlendirilmemisGundemFiltreleForm()

        return render_template('gundem_listele.html',
                               gundem_form=gundem_form,
                               gundem_filtrele_form=gundem_filtrele_form)

    @staticmethod
    @login_required
    @auth.requires(
        Or(Permission(*permission_dict["bap"]["toplanti"]["toplanti_gundemi_guncelleme"]),
           Role('BAP Yetkilisi'),
           Role("BAP Admin")))
    @route('/gundem/<int:gundem_id>', methods=['GET'], endpoint="get_gundem")
    def get_gundem(gundem_id):
        """Belirli bir toplanti gundemini almak icin kullaniriz"""
        user_id = current_user.id
        try:
            gundem = DB.session.query(BapGundem).options(
                joinedload(BapGundem.proje).load_only("proje_basligi", "proje_no", "id").lazyload(
                    "*"),
                raiseload("*")
            ).filter_by(id=gundem_id).one()
        except NoResultFound as exc:
            CustomErrorHandler.error_handler(
                hata="Var olmayan bir gundeme ulasilmalay calisildi. User id: {}, "
                     "Gundem id: {}, Hata: {}".format(user_id,
                                                      gundem_id,
                                                      exc))
            return abort(404)

        gundem_data = {
            "gundemId": gundem_id,
            "sablonId": gundem.sablon_id,
            "ekDosyaId": gundem.ek_dosya_id,
            "karar": gundem.karar,
            "aciklama": gundem.aciklama,
            "tipi": gundem.tipi.name,
            "kararDurumu": gundem.karar_durum.name,
            "gundemSiraNo": gundem.gundem_sira_no,
            "yonetimeBilgiNotu": gundem.yonetime_bilgi_notu,
            "kisiyeOzelNot": gundem.kisiye_ozel_not,
            "projeBasligi": gundem.proje.proje_basligi,
            "projeId": gundem.proje_id,
            "projeNo": gundem.proje.proje_no
        }

        return jsonify(status="success", gundemData=gundem_data)

    @staticmethod
    @login_required
    @auth.requires(
        Or(Permission(*permission_dict["bap"]["toplanti"]["toplanti_gundemi_guncelleme"]),
           Role('BAP Yetkilisi'),
           Role("BAP Admin")))
    @route('/gundem/<int:gundem_id>/guncelle',
           methods=['POST'],
           endpoint="gundem_guncelle")
    def gundem_guncelle(gundem_id):
        """Gundem guncellemek icin kullanilir"""
        user_id = current_user.id
        gundem_data = request.get_json()
        gundem_formu = ToplantiGundem(**gundem_data)
        try:
            gundem = DB.session.query(BapGundem).filter_by(id=gundem_id).one()
        except NoResultFound as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                hata="Olmayan bir gündem güncellenmeye çalışıldı."
                     "Gündem id: {}, User id: {}, Hata: {}".format(
                    gundem_id,
                    user_id,
                    exc)
            )

            return jsonify(status="error"), 400
        try:

            gundem_data = gundem_formu.data
            gundem_data.pop("proje_id")
            gundem_data.pop("gundem_id")
            if gundem_data.get("gundem_sira_no") is None:
                gundem_data.pop("gundem_sira_no")
            gundem.update_obj_data(gundem_data)
        except SQLAlchemyError as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                hata="Toplanti gündem güncellenmeye calisilirken bir hata olustu."
                     "Gundem id: {}, User id: {}, Hata: {}".format(
                    gundem_id,
                    user_id,
                    exc)
            )

            return jsonify(status="error"), 400

        signal_payload = {
            "message_type": USER_ACTIVITY_MESSAGES.get("toplanti").get(
                "gundem_guncelle").type_index,
            "nesne": 'BAP Gundem',
            "nesne_id": gundem_id,
            "ekstra_mesaj": "{username} adlı kullanıcı toplanti gundemini guncelledi.".format(
                username=current_user.username),
        }
        signal_sender(**signal_payload)
        DB.session.commit()

        toplanti_tarihi = gundem.toplanti.toplanti_tarihi.strftime(
            "%d.%m.%Y") if gundem.toplanti and gundem.toplanti.toplanti_tarihi else "Toplantı tarihi belirtilmedi"
        data = {
            "toplanti_tarihi": toplanti_tarihi,
            "gundem_tipi": gundem.tipi.value,
            "gundem_aciklama": gundem.aciklama,
            "gundem_karar": gundem.karar,
            "toplanti_id": gundem.toplanti_id
        }

        return jsonify(status="success", gundem_data=data)

    @staticmethod
    @login_required
    @auth.requires(
        Or(Permission(*permission_dict["bap"]["toplanti"]["toplanti_gundemi_guncelleme"]),
           Role('BAP Yetkilisi'),
           Role("BAP Admin")))
    @route('/<int:toplanti_id>/gundem/<int:gundem_id>',
           methods=['DELETE'],
           endpoint="toplanti_gundemi_sil")
    def gundem_sil(toplanti_id, gundem_id):
        """
        Gündemi toplanti gundemleri arasindan cikarmak icin kullanılır.
        """
        user_id = current_user.id
        try:
            cikarilacak_gundem = DB.session.query(BapGundem).filter_by(
                toplanti_id=toplanti_id,
                id=gundem_id).one()
            cikarilacak_gundem.toplanti_id = None
            DB.session.commit()
        except SQLAlchemyError as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                hata="Gündem silinirken bir hata oluştu.Gundem id: {}, Toplanti id:"
                     " {}, User id: {}, Hata: {}".format(gundem_id,
                                                         toplanti_id,
                                                         user_id,
                                                         exc)
            )

            return jsonify(status="error"), 400
        signal_payload = {
            "message_type": USER_ACTIVITY_MESSAGES.get("toplanti").get(
                "toplanti_gundem_cikar").type_index,
            "nesne": 'BAP Gundem',
            "nesne_id": gundem_id,
            "etkilenen_nesne": "BAP Toplanti",
            "etkilenen_nesne_id": toplanti_id,
            "ekstra_mesaj": "{username} adlı kullanıcı {gundem_id} id'li gundemi toplanti "
                            "gundemleri arasindan cikardi.".format(username=current_user.username,
                                                                   gundem_id=gundem_id),
        }
        signal_sender(**signal_payload)
        return jsonify(status="success")

    @staticmethod
    @login_required
    @auth.requires(
        Or(Permission(*permission_dict["bap"]["toplanti"]["toplanti_gundemi_guncelleme"]),
           Role('BAP Yetkilisi'),
           Role("BAP Admin")))
    @route('/<int:toplanti_id>/gundem_sira_no',
           methods=['POST'],
           endpoint="gundem_sira_no_guncelle")
    def gundem_sira_no_guncelle(toplanti_id):
        """
        Rowreorder datatable da gundem sirasinda bir degisiklik oldugunda ilgili gündemlerin
        sira numarasini degistirmek icin kullanılan view
        """
        gundem_data = request.get_json()
        user_id = current_user.id
        try:
            guncellenecek_gundem = DB.session.query(BapGundem).filter_by(
                id=gundem_data["gundem_id"], toplanti_id=toplanti_id).one()
        except SQLAlchemyError as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                hata="Gundem sira no guncellenirken hata olustu. Gundem id: {}, "
                     "User id: {}, Hata: {}".format(gundem_data["gundem_id"],
                                                    user_id,
                                                    exc))
            return abort(400)
        guncellenecek_gundem.gundem_sira_no = int(gundem_data["gundem_sira_no"])
        DB.session.commit()
        signal_payload = {
            "message_type": USER_ACTIVITY_MESSAGES.get("toplanti").get(
                "gundem_sira_degistir").type_index,
            "nesne": 'BAP Gundem',
            "etkilenen_nesne": "BAP Toplanti",
            "etkilenen_nesne_id": toplanti_id,
            "ekstra_mesaj": "{username} adlı kullanıcı toplanti gundem sirasini degistirdi.".format(
                username=current_user.username),
        }
        signal_sender(**signal_payload)

        return jsonify(status="success")

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

        """Gundem Ek Belgeler"""

        gundem_belge = BapGundem.query.filter(BapGundem.ek_dosya_id == belge_id).one()

        signal_payload = {
            "message_type": USER_ACTIVITY_MESSAGES.get("common").get("gundem_ek_indir").type_index,
            "nesne": 'GundemEkDosya',
            "nesne_id": belge_id,
            "ekstra_mesaj": "{} adlı kullanıcı {} id'li gundem ekini indirdi.".format(
                current_user.username,
                belge_id
            )
        }
        signal_sender(**signal_payload)

        return send_file(
            gundem_belge.ek_dosya_r.file_object,
            as_attachment=True,
            attachment_filename=gundem_belge.ek_dosya_r.content.file.filename,
            mimetype=gundem_belge.ek_dosya_r.content.content_type
        )

    @staticmethod
    @login_required
    @auth.requires(Or(Role('BAP Yetkilisi'), Role("BAP Admin")))
    @route('/render-gundem-sablonu', methods=["POST"])
    def render_gundem_sablonu():
        """
        İki farklı kullanımı mevcut

        Belirli bir gündemin gündem tipini degistirmeye calisildigi durumda Gündem id ve gündem tipi
        verisine(gundem verisinden ilgili projenin id si bulunur) gore ilgili sablonu render
        edip karar ve aciklama verisini döner.
        Belirli bir proje icin gundem olusturmaya calisirken proje id ve gundem tipi verisiyle
        kullanilabilir
        """
        try:
            gundem_id = request.get_json().get("gundem_id", None)
            sablon_tipi = request.get_json().get("sablon_tipi", None)
            proje_id = request.get_json().get("proje_id", None)

            gundem_sablonu = DB.session.query(
                GundemSablon.id.label("sablon_id"),
                GundemSablon.karar.label("karar"),
                GundemSablon.aciklama.label("aciklama"),
            ).filter(
                GundemSablon.sablon_tipi == sablon_tipi
            ).order_by(desc(GundemSablon.updated_at)).first()

            if gundem_id:
                gundem = DB.session.query(
                    BapGundem.aciklama.label("aciklama"),
                    BapGundem.karar.label("karar"),
                    BapGundem.proje_id.label("proje_id")
                ).options(
                    lazyload("*")
                ).filter(BapGundem.id == gundem_id).first()

                proje_id = gundem.proje_id

            if not gundem_sablonu:
                return jsonify(status="error"), 500

            gundem_proje_data_query = BapQueryHelpers.get_gundem_sablon_proje_data_query()
            proje_gundem_sablon_data = gundem_proje_data_query.filter(
                Proje.id == proje_id
            ).first()
            karar_text = render_template_string(gundem_sablonu.karar,
                                                proje=proje_gundem_sablon_data)
            aciklama_text = render_template_string(gundem_sablonu.aciklama,
                                                   proje=proje_gundem_sablon_data)
            data = {
                "karar": karar_text,
                "aciklama": aciklama_text,
                "sablon_id": gundem_sablonu.sablon_id
            }
            return jsonify(status="success", data=data)
        except Exception as exc:
            CustomErrorHandler.error_handler(
                hata="Gündemi tipine göre şablon metni render "
                     "edilirken bir hata meydana geldi. "
                     "Hata: {}".format(exc))
            return jsonify(status="error"), 500

    @staticmethod
    @login_required
    @auth.requires(
        Or(Permission(*permission_dict["bap"]["toplanti"]["toplanti_gundemi_guncelleme"]),
           Role('BAP Yetkilisi'),
           Role("BAP Admin")))
    @route('/olustur',
           methods=['GET'])
    def toplu_gundem_olustur_get():
        """Gundem guncellemek icin kullanilir"""

        projeler = DB.session.query(
            Proje.id.label("proje_id"),
            Proje.proje_no.label("proje_no"),
            Proje.proje_basligi.label("proje_basligi"),
            AppState.description.label("state_description"),
            AppState.state_code.label("state_code"),
            AppState.current_app_state
        ).join(
            AppState, Proje.proje_durumu_id == AppState.id
        ).options(
            lazyload("*")
        ).filter(
            or_(Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.revizyon_bekleniyor,
                Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi),
            AppState.current_app_state != AppStates.son
        ).all()

        gundem_olustur_formu = GundemOlustur()

        proje_filtrele_formu = ProjeFiltreleForm()

        for proje in projeler:
            gundem_olustur_formu.projeler.append_entry({
                "proje_id": proje.proje_id,
                "proje_state": "{} ({})".format(proje.state_description, proje.state_code),
                "proje_baslik": proje.proje_basligi,
                "proje_no": proje.proje_no
            })

        return render_template("gundem_olustur.html", gundem_olusturma_formu=gundem_olustur_formu,
                               proje_filtrele_formu=proje_filtrele_formu)

    @staticmethod
    @login_required
    @auth.requires(
        Or(Permission(*permission_dict["bap"]["toplanti"]["toplanti_gundemi_guncelleme"]),
           Role('BAP Yetkilisi'),
           Role("BAP Admin")))
    @route('/olustur',
           methods=['POST'])
    def toplu_gundem_olustur_post():
        """Gundem guncellemek icin kullanilir"""

        gundem_olustur_formu = GundemOlustur(request.form)

        gundem_olusturulacak_proje_ids = [proje.proje_id.data for proje in
                                          gundem_olustur_formu.projeler if proje.secili_mi.data]

        if not gundem_olusturulacak_proje_ids:
            flash("Gündem oluşturabilmek için proje seçmeniz gerekmektedir")
            return render_template("gundem_olustur.html",
                                   gundem_olusturma_formu=gundem_olustur_formu)

        try:
            gundem_sablonu_obj = DB.session.query(
                GundemSablon.id.label("id"),
                GundemSablon.karar.label("karar"),
                GundemSablon.aciklama.label("aciklama")
            ).filter(
                GundemSablon.sablon_tipi == gundem_olustur_formu.gundem_tipi.data
            ).order_by(
                desc(GundemSablon.updated_at)
            ).first()

            karar_sablonu = gundem_sablonu_obj.karar
            gundem_sablonu = gundem_sablonu_obj.aciklama

            gundem_proje_data_query = BapQueryHelpers.get_gundem_sablon_proje_data_query()
            gundem_olusturulacak_projeler = gundem_proje_data_query.filter(
                Proje.id.in_(gundem_olusturulacak_proje_ids)
            ).all()

            for proje in gundem_olusturulacak_projeler:
                karar_text = render_template_string(karar_sablonu, proje=proje)
                gundem_text = render_template_string(gundem_sablonu, proje=proje)
                yeni_gundem = BapGundem(proje_id=proje.proje_id,
                                        sablon_id=gundem_sablonu_obj.id,
                                        karar=karar_text,
                                        aciklama=gundem_text,
                                        tipi=gundem_olustur_formu.gundem_tipi.data)
                DB.session.add(yeni_gundem)
                # todo: user activity log
                # todo: adminlere mesaj atilabilir !!!

            signal_payload = {
                "message_type": USER_ACTIVITY_MESSAGES.get("toplanti").get(
                    "toplanti_sonuclandirildi").type_index,
                "ekstra_mesaj": "{} adlı kullanıcı {} 'idli proje/projeleri icin {} tipinde toplu gündem oluşturdu.".format(
                    current_user.username,
                    ",".join(str(proje_id) for proje_id in gundem_olusturulacak_proje_ids),
                    gundem_olustur_formu.gundem_tipi.data
                ),
            }
            signal_sender(**signal_payload)
            DB.session.commit()
            flash("Gündemler başarıyla oluşturuldu.")

        except Exception as exc:
            CustomErrorHandler.error_handler(
                hata="Gündem oluşturulurken bir hatayla karşılaşıldı. "
                     "Hata: {}".format(exc))
            DB.session.rollback()
            flash("Gündem oluşturulurken bir hata ile karşılaşıldı. "
                  "Lütfen daha sonra tekrar deneyiniz.")
            return render_template("gundem_olustur.html",
                                   gundem_olusturma_formu=gundem_olustur_formu)

        return redirect(url_for("toplanti.GundemView:degerlendirilmemis_gundem_listele"))

    @login_required
    @auth.requires(Or(Permission(*permission_dict["bap"]["proje"]["proje_arama"]["projeleri_arama"])),
                   Or(Role("BAP Admin"), Role("BAP Yetkilisi")))
    @route('/data-proje', methods=["POST"], endpoint="proje_search")
    def proje_arama(self):  # pylint: disable=too-many-branches
        """
        Bap projelerinde POST ile gelen parametrelere gore arama yapip, sonuclari dondurur.

        Returns:
            http response

        """
        qry = self.qry_proje
        total_record = qry.count()
        form_data = request.form.to_dict()
        search_form = ProjeFiltreleForm(**form_data)

        proje_durumu = search_form.proje_durumu.data
        proje_sureci = search_form.proje_sureci.data

        if proje_sureci == "-1":
            qry = qry.filter(or_((AppState.current_app_state == 'basvuru_kabul'),
                                 (AppState.current_app_state == 'devam'),
                                 (AppState.current_app_state == 'son')))
        if proje_sureci == 'AppStates.basvuru_kabul':
            qry = qry.filter(AppState.current_app_state == 'basvuru_kabul')
        if proje_sureci == 'AppStates.devam':
            qry = qry.filter(AppState.current_app_state == 'devam')
        if proje_sureci == 'AppStates.son':
            qry = qry.filter(AppState.current_app_state == 'son')

        if proje_durumu != '0' and proje_durumu != 'None':
            qry = qry.filter(AppState.id == int(proje_durumu))

        if not search_form.validate():
            result = qry.order_by(desc(Proje.id)).offset(form_data['start']).limit(
                form_data['length']).all()
            total_record = qry.count()
            return self.process_data(result, form_data, total_record)

        proje_basligi = search_form.ad.data.strip()
        proje_no = search_form.proje_no.data
        kabul_edilen_baslama_tarihi = search_form.date.baslama_tarihi.data
        bitis_tarihi = search_form.date.bitis_tarihi.data
        baslama_tarihi_option = search_form.date.baslama_tarihi_option.data
        bitis_tarihi_option = search_form.date.bitis_tarihi_option.data

        if proje_basligi:
            qry = qry.filter(Proje.proje_basligi.ilike('%' + proje_basligi + '%'))

        if proje_no:
            qry = qry.filter(Proje.proje_no == proje_no)

        if kabul_edilen_baslama_tarihi:
            if baslama_tarihi_option == '0':
                qry = qry.filter(Proje.kabul_edilen_baslama_tarihi <= kabul_edilen_baslama_tarihi)
            if baslama_tarihi_option == '1':
                qry = qry.filter(Proje.kabul_edilen_baslama_tarihi == kabul_edilen_baslama_tarihi)
            if baslama_tarihi_option == '2':
                qry = qry.filter(kabul_edilen_baslama_tarihi <= Proje.kabul_edilen_baslama_tarihi)

        if bitis_tarihi:
            if bitis_tarihi_option == '0':
                qry = qry.filter(Proje.bitis_tarihi <= bitis_tarihi)
            if bitis_tarihi_option == '1':
                qry = qry.filter(Proje.bitis_tarihi == bitis_tarihi)
            if bitis_tarihi_option == '2':
                qry = qry.filter(bitis_tarihi <= Proje.bitis_tarihi)

        result = qry.order_by(desc(Proje.id)).offset(form_data['start']).limit(
            form_data['length']).all()

        return self.process_data_proje(result, form_data, total_record)

    @login_required
    @auth.requires(Or(Permission(*permission_dict["bap"]["toplanti"]["toplanti_gundemi_listeleme"]),
                      Role("BAP Yetkilisi"),
                      Role("BAP Admin")))
    @route('/data', methods=["POST"], endpoint="gundem_search")
    def gundem_arama(self):  # pylint: disable=too-many-branches
        """
        Bap gündemlerinde POST ile gelen parametrelere gore arama yapip, sonuclari dondurur.

        Returns:
            http response

        """
        qry = self.qry
        total_record = qry.count()
        form_data = request.form.to_dict()
        search_form = DegerlendirilmemisGundemFiltreleForm(**form_data)

        gundem_durumu = search_form.gundem_durumu.data
        gundem_tipi = search_form.gundem_tipi.data
        date = search_form.date.toplanti_tarihi.data
        date_option = search_form.date.toplanti_tarihi_option.data
        proje_numarasi = search_form.proje_numarasi.data

        """ Gündem henüz degerlendirilmedi """
        if gundem_durumu == "degerlendirilmedi":
            qry = qry.filter(BapGundem.karar_durum == GundemDurumu.degerlendirilmedi)

        """ Gündem bir toplantıya atanmadı """
        if gundem_durumu == "atanmamis":
            qry = qry.filter(BapGundem.toplanti_id.is_(None))

        if gundem_tipi != 'tüm_gündemler' and gundem_tipi != 'None':
            gundem_tipi = getattr(GundemTipi, gundem_tipi)
            qry = qry.filter(BapGundem.tipi == gundem_tipi)

        if not search_form.validate():
            result = qry.order_by(desc(Proje.id)).offset(form_data['start']).limit(
                form_data['length']).all()
            total_record = qry.count()
            return self.process_data(result, form_data, total_record)

        if proje_numarasi:
            qry = qry.filter(Proje.proje_no == proje_numarasi)

        if date:
            if date_option == '0':
                qry = qry.filter(BapToplanti.toplanti_tarihi >= date)
            if date_option == '1':
                qry = qry.filter(BapToplanti.toplanti_tarihi == date)
            if date_option == '2':
                qry = qry.filter(BapToplanti.toplanti_tarihi <= date)

        result = qry.order_by(desc(Proje.id)).offset(form_data['start']).limit(
            form_data['length']).all()

        return self.process_data(result, form_data, total_record)
示例#9
0
文件: views.py 项目: kunthar/zopsedu
class FilterView(FlaskView):
    """
    Filter View
    """
    route_base = "/select"

    excluded_methods = [
        "query_data",
        "initial_val",
        "get_paginated_query_data_and_number_of_row",
        "check_request_params",
        "prepare_response",
    ]

    def __init__(self):
        with app.app_context():
            current_app.logger.info("asdfasffasfdsa")

    @property
    def query_data(self):
        """request form query"""
        return request.form.get("q")

    @property
    def initial_val(self):
        """request form initial_val"""
        return request.form.get("initial_val")

    @login_required
    @route('/personel', methods=["POST"], endpoint='select.personel.arama')
    @auth.requires(Permission(*permission_dict["common"]["app"]["modal_filter"]["personel_arama"]))
    def filter_personel(self):
        """
        select2 tarafından query_param olarak gönderilen "q" değişkeni alınıp personel tablosunda
        "ad" ve "soyad" fieldlarında arama yapılır. "q" değişkeni ile başlayan "ad" veya "soyad"
        varsa gerekli degerler return edilir
        Returns:
            {
                "items": [{ "id":1, "text": "Ad1 Soyad1"},...],
                "total_count": number_of_total_row,
            }

        """

        self.check_request_params()

        query = DB.session.query(
            Personel
        ).join(
            Person,
            Personel.person_id == Person.id
        ).join(HitapUnvan, HitapUnvan.id == Personel.unvan).add_columns(
            Personel.id, Person.ad.label("ad"), Person.soyad.label("soyad"),
            HitapUnvan.ad.label("hitap_unvan")
        )

        if self.query_data:
            query = query.filter(or_(Person.ad.ilike(self.query_data + "%"),
                                     Person.soyad.ilike(self.query_data + "%")))
        else:
            query = query.filter(Person.id == self.initial_val)

        return self.prepare_response(query, text_field=["ad", "soyad", "hitap_unvan"],
                                     text_format="{} {} - {}")

    @login_required
    @route('/universite', methods=["POST"], endpoint="select.universite.arama")
    @auth.requires(
        Permission(*permission_dict["common"]["app"]["modal_filter"]["universite_arama"]))
    def filter_universite(self):
        """
         select2 tarafından query_param olarak gönderilen "q" değişkeni alınıp birim tablosunda
        universite isimleri arasinda filtre edilir ve seçilen universitenin birim id si doner
        varsa gerekli degerler return edilir
        :return:
        """

        query = DB.session.query(Birim).filter(Birim.birim_tipi == "Üniversite").options(
            load_only("id", "uzun_ad"))

        if self.query_data:
            filter_param = or_(Birim.ad.ilike("%" + self.query_data + "%"),
                               Birim.uzun_ad.ilike("%" + self.query_data + "%"))
            query = query.filter(filter_param)
        else:
            query = query.filter(Birim.id == self.initial_val)

        return self.prepare_response(query)

    @login_required
    @route('/birim', methods=["POST"], endpoint='select.birim.arama')
    @auth.requires(Permission(*permission_dict["common"]["app"]["modal_filter"]["birim_arama"]))
    def filter_birim(self):
        """

        select2 tarafından query_param olarak gönderilen "q" değişkeni alınıp birim tablosunda
        "ad" ve "uzun_ad" fieldlarında arama yapılır. "q" değişkeni içeren "ad" veya "uzun_ad"
        varsa gerekli degerler return edilir
        Returns:
            {
                "items": [{ "id":1, "text": "İktisat"},...],
                "total_count": number_of_total_row,
            }

        """
        self.check_request_params()
        ust_birim_id = request.form.get("dependant_value")

        kurum_ici = request.form.get("kurum_ici")

        birim_tipi = request.form.get("birim_tipi")

        query = DB.session.query(Birim).options(load_only("id", "uzun_ad"))

        if self.query_data:
            filter_param = or_(Birim.ad.ilike("%" + self.query_data + "%"),
                               Birim.uzun_ad.ilike("%" + self.query_data + "%"))

            if kurum_ici == 'true':
                universite_id = SessionHandler.universite_id()
                if birim_tipi == BirimTipiEnum.fakulte.value:
                    ust_birim_id = universite_id

            if ust_birim_id:
                filter_param = and_(filter_param, Birim.ust_birim_id == ust_birim_id)

            if birim_tipi:
                filter_param = and_(filter_param, Birim.birim_tipi == birim_tipi)

            query = query.filter(filter_param)

        else:
            query = query.filter(Birim.id == self.initial_val)

        return self.prepare_response(query)

    @login_required
    @route('/bap_belge', methods=["POST"], endpoint='select.bap_belge.arama')
    @auth.requires(Permission(*permission_dict["common"]["app"]["modal_filter"]["belge_arama"]))
    def filter_bap_belge(self):
        """

        Returns:

        """
        self.check_request_params()

        query = DB.session.query(BAPBelge).options(load_only("id", "adi", "aciklama"))

        if self.query_data:
            query = query.filter(BAPBelge.adi.ilike(self.query_data + "%"))
        else:
            query = query.filter(BAPBelge.id == self.initial_val)

        return self.prepare_response(query, text_field=["adi", "aciklama"],
                                     text_format="{}\n{}")

    @login_required
    @route('/hakem', methods=["POST"], endpoint='select.hakem.arama')
    @auth.requires(Permission(*permission_dict["common"]["app"]["modal_filter"]["hakem_arama"]))
    def filter_hakem(self):
        """
        Hakem Filtrelemek için kullanılır
        """
        self.check_request_params()

        query = DB.session.query(Hakem).join(
            Hakem.person
        ).options(
            load_only('unvan', 'hakem_turu'),
            joinedload(Hakem.person).load_only('ad', 'soyad'),
            joinedload(Hakem.personel))

        if self.query_data:
            query = query.filter(or_(Person.ad.ilike('%' + self.query_data.strip() + '%'),
                                     Person.soyad.ilike('%' + self.query_data.strip() + '%')))
        else:
            query = query.filter(Person.ad.ilike('%' + self.initial_val.strip() + '%'))

        return self.prepare_response(query,
                                     text_field=["unvan", "person.ad", "person.soyad",
                                                 "universite.ad"])

    @login_required
    @route('/hitap_unvan', methods=["POST"])
    @auth.requires(
        Permission(*permission_dict["common"]["app"]["modal_filter"]["hitap_unvan_arama"]))
    def filter_hitap_unvan(self):
        """
        HitapUnvan Filtrelemek için kullanılır
        """
        self.check_request_params()

        query = DB.session.query(HitapUnvan).options(load_only("id", "ad", "kod"))

        if self.query_data:
            query = query.filter(HitapUnvan.ad.ilike("%" + self.query_data.upper() + "%"))
        else:
            query = query.filter(HitapUnvan.id == self.initial_val)

        return self.prepare_response(query, text_field=["ad", "kod"])

    @login_required
    @route('/ogrenci', methods=["POST"])
    @auth.requires(Permission(*permission_dict["common"]["app"]["modal_filter"]["ogrenci_arama"]))
    def filter_ogrenci(self):
        """
        select2 tarafından query_param olarak gönderilen "q" değişkeni alınıp ogrenci tablosunda
        "ad" ve "soyad" fieldlarında arama yapılır. "q" değişkeni ile başlayan "ad" veya "soyad"
        varsa gerekli degerler return edilir
        Returns:
            {
                "items": [{ "id":1, "text": "Ad1 Soyad1"},...],
                "total_count": number_of_total_row,
            }

        """
        self.check_request_params()

        query = DB.session.query(Ogrenci).join(Person, Ogrenci.person_id == Person.id). \
            add_columns(Ogrenci.id, Person.ad, Person.soyad)

        if self.query_data:
            query = query.filter(or_(Person.ad.ilike("%" + self.query_data + "%"),
                                     Person.soyad.ilike("%" + self.query_data + "%")))
        else:
            query = query.filter(Person.id == self.initial_val)

        return self.prepare_response(query, text_field=["ad", "soyad"], text_format="{} {}")

    @login_required
    @route('/ogretim-uyesi', methods=["POST"])
    @auth.requires(
        Permission(*permission_dict["common"]["app"]["modal_filter"]["ogretim_uyesi_arama"]))
    def filter_ogretim_uyesi(self):
        """
        select2 tarafından query_param olarak gönderilen "q" değişkeni alınıp ogretim elamani
        tablosunda üzerinden person tablosunun
        "ad" ve "soyad" fieldlarında arama yapılır. "q" değişkeni ile başlayan "ad" veya "soyad"
        varsa gerekli degerler return edilir
        Returns:
            {
                "items": [{ "id":1, "text": "Ad1 Soyad1"},...],
                "total_count": number_of_total_row,
            }

        """
        self.check_request_params()

        query = DB.session.query(OgretimElemani).join(
            Personel, OgretimElemani.personel_id == Personel.id).join(
            Person, Personel.person_id == Person.id).add_columns(
            OgretimElemani.id, Person.ad, Person.soyad)

        if self.query_data:
            query = query.filter(or_(Person.ad.ilike("%" + self.query_data + "%"),
                                     Person.soyad.ilike("%" + self.query_data + "%"), ))
        else:
            query = query.filter(Person.id == self.initial_val)

        return self.prepare_response(query, text_field=["ad", "soyad"], text_format="{} {}")

    @route('/vergi-dairesi', methods=["POST"], endpoint='select.vergi_dairesi.arama')
    @auth.requires(
        Or(Permission(*permission_dict["common"]["app"]["modal_filter"]["vergi_dairesi_arama"]),
           Role("anonymous")))
    def filter_vergi_dairesi(self):
        """
        select2 tarafından query_param olarak gönderilen "q" değişkeni alınıp vergi dairesi
        tablosunda "kodu", "adi" ve "il" fieldlarında arama yapılır. "q" değişkeni içeren "adi" ve "kodu"
        varsa gerekli degerler return edilir
        Returns:
            {
                "items": [{ "id":1, "text": "urla vergi dairesi"},...],
                "total_count": number_of_total_row,
            }

        """
        self.check_request_params()

        query = DB.session.query(VergiDairesi)

        if self.query_data:
            query = query.filter(or_(VergiDairesi.kodu.ilike("%" + self.query_data + "%"),
                                     VergiDairesi.adi.ilike("%" + self.query_data + "%"),
                                     VergiDairesi.il.ilike("%" + self.query_data + "%")))
        else:
            query = query.filter(VergiDairesi.id == self.initial_val)

        return self.prepare_response(query, text_field=["adi", "kodu"], text_format="{} - {}")


    @route('/detayli-hesap-kodu', methods=["POST"], endpoint='select.detayli_hesap_plani.arama')
    @auth.requires(
        Permission(*permission_dict["common"]["app"]["modal_filter"]["detayli_hesap_kodu_arama"]))
    def filter_detayli_hesap_plani(self):
        """
        detayli hesap plani modelinde "hesap_kodu" ve "ana_hesap_hesap_grubu_yardimci_hesap_adi"
        alanlarinda arama yapar
        """
        self.check_request_params()

        query = DB.session.query(DetayliHesapPlanlari)

        if self.query_data:
            query = query.filter(
                or_(DetayliHesapPlanlari.hesap_kodu.ilike("%" + self.query_data + "%"),
                    DetayliHesapPlanlari.ana_hesap_hesap_grubu_yardimci_hesap_adi.ilike(
                        "%" + self.query_data + "%")))
        else:
            query = query.filter(DetayliHesapPlanlari.id == self.initial_val)

        return self.prepare_response(query, text_field=["hesap_kodu",
                                                        "ana_hesap_hesap_grubu_yardimci_hesap_adi"],
                                     text_format="{} - {}")

    @login_required
    @route('/gelir-kasasi', methods=["POST"], endpoint='select.gelir_kasasi.arama')
    @auth.requires(
        Permission(*permission_dict["common"]["app"]["modal_filter"]["gelir_kasasi_arama"]))
    def filter_gelir_kasasi(self):
        """
        Güncel gelir kasalari arasinda arama yapar.
        """
        self.check_request_params()

        query = DB.session.query(GelirKasasi)

        if self.query_data:
            query = query.filter(GelirKasasi.adi.ilike("%" + self.query_data + "%"),
                                 GelirKasasi.mali_yil == datetime.now().year)
        else:
            query = query.filter(GelirKasasi.id == self.initial_val)

        return self.prepare_response(query, text_field=["adi"], text_format="{}")

    # pylint: disable=invalid-name
    @staticmethod
    def get_paginated_query_data_and_number_of_row(query):
        """

        Args:
            query: query

        Returns:    query_result(list_model_instance), number_of_row(int)

        """
        page = int(request.form.get("page", 1))
        page_size = int(request.form.get("page_size", SELECT2_PAGE_SIZE))

        count_query = query.statement.with_only_columns([func.count()])
        number_of_row = DB.session.execute(count_query).scalar()

        query_result = query.limit(page_size).offset((page - 1) * page_size).all()
        return query_result, number_of_row
        # pylint: enable=invalid-name

    def check_request_params(self):  # pylint: disable=inconsistent-return-statements
        """
        Check request params and returns empty result if both q and initial_data aren't given.

        Returns:
            Empty result

        """

        if not (self.query_data or self.initial_val):
            return jsonify({"results": []})

    def prepare_response(self, query, id_field="id", text_field=None, text_format=None):
        """

        Args:
            query:
            id_field:
            text_field:
            text_format:

        Returns:

        """

        if not text_field:
            text_field = ["ad"]

        if isinstance(text_field, str):
            text_field = [text_field]

        text = operator.attrgetter(*text_field)
        text_field_number = len(text_field)

        if not text_format:
            text_format = "{} - " * text_field_number

        def format_text(item):
            """

            Args:
                item: query result item

            Returns:
                (str) formatted text

            """

            item_vals = text(item)
            item_vals = list(item_vals) if isinstance(item_vals, tuple) else [item_vals]
            return text_format.format(*item_vals).rstrip('- ')

        items, number_of_row = self.get_paginated_query_data_and_number_of_row(query)
        data = [
            {
                "id": getattr(item, id_field),
                "text": format_text(item)
            } for item in items
        ]

        return jsonify({
            "items": data,
            "total_count": number_of_row
        })
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))
示例#11
0
class ToplantiOlusturView(FlaskView):
    """
    Toplanti olusturmak icin kullanilan view
    """

    @staticmethod
    @login_required
    @auth.requires(
        Or(Permission(*permission_dict["bap"]["toplanti"]["toplanti_guncelleme"]),
           Role('BAP Yetkilisi'),
           Role("BAP Admin")))
    @route('/<int:toplanti_id>/gundem', methods=['GET'], endpoint="toplanti_gundem_listele")
    def toplanti_gundem_listele(toplanti_id):
        """Toplanti gundemlerini listeler"""
        user_id = current_user.id
        gundem_form = ToplantiGundem()
        try:
            toplanti = DB.session.query(BapToplanti).options(
                joinedload(BapToplanti.gundemler).joinedload(
                    BapGundem.proje).load_only("id", "proje_no", "proje_basligi").lazyload("*"),
                raiseload("*")
            ).filter_by(id=toplanti_id).one()
        except NoResultFound as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                hata="Var olmayan bir toplanti id ile istek gönderildi.User id: {},"
                     " Hata: {}".format(user_id, exc))
            return abort(404)
        gundem_sayisi = len(toplanti.gundemler)
        gundem_form.gundem_sira_no.choices = [(i + 1, str(i + 1)) for i in range(gundem_sayisi)]

        # sablon tipi id '51' Yönetim Kurulu Tutanak Şablonunu temsil etmektedir.
        toplanti_tutanak_sablonu = DB.session.query(Sablon.id.label("sablon_id"),
                                                    Sablon.sablon_tipi_id.label("sablon_tipi_id")).filter(
            Sablon.sablon_tipi_id == 51).order_by(desc(Sablon.updated_at)).first()

        return render_template('toplanti_gundemleri.html',
                               gundemler=toplanti.gundemler,
                               gundem_form=gundem_form,
                               toplanti_id=toplanti_id,
                               toplanti_sonuclandi_mi=toplanti.sonuclandi_mi,
                               toplanti_tutanak_sablon_id=toplanti_tutanak_sablonu.sablon_id,
                               sablon_type_id=toplanti_tutanak_sablonu.sablon_tipi_id)

    @staticmethod
    @login_required
    @auth.requires(Permission(*permission_dict["bap"]["toplanti"]["toplanti_olusturma"]))
    @route('/', methods=['POST'], endpoint='kaydet')
    def toplanti_kaydet():
        """
        Formda kaydedilen gundemler ve tarih/saat ile yeni bir toplantı olusturur.
        Returns:
        """
        form_nesne = ToplantiOlusturForm(request.form)
        toplantiya_alinanlar = list(
            filter(lambda x: x['toplantiya_alinsin'], form_nesne.data['gundem_listesi']))

        if form_nesne.validate() and toplantiya_alinanlar:
            try:
                toplanti = BapToplanti(toplanti_durumu=ToplantiDurumu.gerceklestirilmedi,
                                       ekleyen_id=current_user.id)
                DB.session.add(toplanti)
                DB.session.flush()
                for ind, top_al in enumerate(toplantiya_alinanlar):
                    gundem_id = top_al['id']
                    gundem = BapGundem.query.get(gundem_id)
                    gundem.toplanti_id = toplanti.id
                toplanti.toplanti_tarihi = form_nesne.data['toplanti_tarih_saat']
                DB.session.commit()

                signal_payload = {
                    "message_type": USER_ACTIVITY_MESSAGES.get("toplanti").get(
                        "toplanti_olustur").type_index,
                    "nesne": 'BapToplanti',
                    "nesne_id": toplanti.id,
                    "ekstra_mesaj": "{user} kullanıcısı, {gundemler} idli gündemlerle, {toplanti} "
                                    "idli yeni toplantı "
                                    "oluşturdu.".format(
                        user=current_user.username,
                        gundemler=list(map(lambda x: x['id'], toplantiya_alinanlar)),
                        toplanti=toplanti.id
                    )
                }
                signal_sender(**signal_payload)

                return redirect(url_for('index'))
            except SQLAlchemyError as e:
                DB.session.rollback()
                CustomErrorHandler.error_handler(
                    hata="{} kullanıcısı bir toplantı oluşturmaya çalışırken hata "
                         "meydana geldi. hata: {}".format(current_user.username, e))

                flash(_("Bir hata meydana geldi. İşleminiz kaydedilemedi."))
                return redirect(url_for('.ToplantiOlusturView:toplanti_maddeleri_listele'))

        else:
            flash('Formu doğru doldurduğunuzdan emin olunuz.')
            return redirect(url_for('.ToplantiOlusturView:toplanti_maddeleri_listele'))

    @staticmethod
    @login_required
    @auth.requires(Permission(*permission_dict["bap"]["toplanti"]["toplanti_olusturma"]))
    @route('/listele/sonuclanmamis', methods=['GET'], endpoint='degerlendirilmemis_toplantilar')
    def sonuclanmamis_toplantilar():
        """Sonuclanmamis gundemleri dondurur"""
        sonuclanmamis_toplantilar = DB.session.query(BapToplanti).options(
            joinedload(BapToplanti.ekleyen).load_only("id").joinedload(
                User.person).load_only("ad", "soyad").lazyload("*"),
            raiseload("*")
        ).filter(BapToplanti.sonuclandi_mi == False).all()
        data = []
        for toplanti in sonuclanmamis_toplantilar:
            toplanti_tarihi = toplanti.toplanti_tarihi.strftime(
                "%d.%m.%Y") if toplanti.toplanti_tarihi else "Toplantı tarihi belirtilmedi"
            data.append({
                "id": toplanti.id,
                "ekleyen": "{} {}".format(toplanti.ekleyen.person.ad if toplanti.ekleyen else "",
                                          toplanti.ekleyen.person.soyad if toplanti.ekleyen else ""),
                "toplanti_tarihi": toplanti_tarihi,
                "toplanti_durumu": toplanti.toplanti_durumu.value
            })
        return jsonify(status="success", sonuclanmamis_toplantilar=data)

    @staticmethod
    @login_required
    @auth.requires(
        Or(Permission(*permission_dict["bap"]["toplanti"]["toplanti_guncelleme"]),
           Role('BAP Yetkilisi'),
           Role("BAP Admin")))
    @route('<int:toplanti_id>/katilimci-ekle', methods=['GET', 'POST'])
    def katilimci_ekle(toplanti_id):
        if request.method == 'GET':
            idari_personeller = DB.session.query(BapIdariPersonel.id.label("id"),
                                                 BapIdariPersonel.gorevi.label("gorevi"),
                                                 Person.ad.label("person_ad"),
                                                 Person.soyad.label("person_soyad")). \
                filter(BapIdariPersonel.gorevde_mi == True). \
                join(Personel, BapIdariPersonel.personel_id == Personel.id). \
                join(Person, Personel.person_id == Person.id).all()

            toplanti_katilimcilari = DB.session.query(ToplantiKatilimci.katilimcilar.label("katilimcilar")).filter(
                ToplantiKatilimci.toplanti_id == toplanti_id).first()

            toplanti_katilimci_form = ToplantiKatilimciEkleForm()

            for idari_personel in idari_personeller:
                katildi_mi = False
                if toplanti_katilimcilari:
                    katildi_mi = True if idari_personel.id in [key for key in
                                                               toplanti_katilimcilari.katilimcilar] else False

                toplanti_katilimci_form.katilimcilar.append_entry({
                    'secili_mi': katildi_mi,
                    'idari_personel_id': idari_personel.id,
                    'ad': "{} {}".format(idari_personel.person_ad, idari_personel.person_soyad),
                    'gorevi': idari_personel.gorevi.value
                })

            return render_template("toplanti_katilimcilari.html",
                                   toplanti_id=toplanti_id,
                                   katilimci_form=toplanti_katilimci_form)

        katilimcilar = request.form
        toplanti_katilimci_ekle_form = ToplantiKatilimciEkleForm(**katilimcilar)
        if not toplanti_katilimci_ekle_form.validate():
            flash("Bir hata oluştu lütfen daha sonra tekrar deneyiniz")
            return render_template("toplanti_katilimcilari.html",
                                   toplanti_id=toplanti_id,
                                   katilimci_form=toplanti_katilimci_ekle_form)

        katilimci_list = []
        for katilimci in toplanti_katilimci_ekle_form.katilimcilar:
            if katilimci.secili_mi.data:
                katilimci_list.append(katilimci.idari_personel_id.data)

        toplanti_katilimci_kayit = DB.session.query(ToplantiKatilimci).filter(
            ToplantiKatilimci.toplanti_id == toplanti_id).first()

        if not katilimci_list:
            flash("Toplantıya en az bir adet katılımcı eklemelisiniz")
            return render_template("toplanti_katilimcilari.html",
                                   toplanti_id=toplanti_id,
                                   katilimci_form=toplanti_katilimci_ekle_form)

        try:
            if not toplanti_katilimci_kayit:
                toplanti_katilimci_kayit = ToplantiKatilimci(katilimcilar=katilimci_list,
                                                             toplanti_id=toplanti_id)
                DB.session.add(toplanti_katilimci_kayit)
            else:
                toplanti_katilimci_kayit.katilimcilar = katilimci_list
                toplanti_katilimci_kayit.toplanti_id = toplanti_id
            DB.session.commit()
        except SQLAlchemyError as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                hata="Toplanti idsi %s olan toplantıya katılımcılar eklenirken hata oluştu. Hata: %s"
                     % (toplanti_id, exc)
            )
            flash("Bir hata oluştu lütfen daha sonra tekrar deneyiniz")
            return render_template("toplanti_katilimcilari.html",
                                   toplanti_id=toplanti_id,
                                   katilimci_form=toplanti_katilimci_ekle_form)

        signal_payload = {
            "message_type": USER_ACTIVITY_MESSAGES.get("toplanti").get(
                "toplanti_katilimcilari_duzenlendi").type_index,
            "nesne": 'BAP Toplanti',
            "nesne_id": toplanti_id,
            "ekstra_mesaj": "{} idli toplantiya katılanlar duzenlendi".format(
                toplanti_id),
        }
        signal_sender(**signal_payload)

        flash("Toplantı katılımcılarını başarıyla düzenlendiniz")
        return redirect(url_for('toplanti.toplanti_gundem_listele', toplanti_id=toplanti_id))

    @staticmethod
    @login_required
    @auth.requires(
        Or(Permission(*permission_dict["bap"]["toplanti"]["toplanti_guncelleme"]),
           Role('BAP Yetkilisi'),
           Role("BAP Admin")))
    @route('/<int:toplanti_id>/sonuclandir', methods=['POST'])
    def toplanti_sonuclandir(toplanti_id):
        """YK toplantisini sonuclandir"""
        toplanti_katilimci_kayit = DB.session.query(ToplantiKatilimci).filter(
            ToplantiKatilimci.toplanti_id == toplanti_id).first()

        if not toplanti_katilimci_kayit:
            flash("Lütfen sonuçlandırmadan önce toplantıya katılımcı ekleyiniz")
            return redirect(url_for("toplanti.toplanti_gundem_listele",
                                    toplanti_id=toplanti_id))

        try:
            degerlendirmemis_gundem_sayisi = DB.session.query(
                BapGundem
            ).filter(
                BapGundem.toplanti_id == toplanti_id,
                BapGundem.karar_durum == KararDurumu.degerlendirilmedi
            ).count()

            if degerlendirmemis_gundem_sayisi:
                flash("Toplantıda değerlendirilmemiş gündemler mevcut. "
                      "Lütfen gündemleri değerlendirin veya toplantıdan çıkarınız.")
                return redirect(url_for("toplanti.toplanti_gundem_listele",
                                        toplanti_id=toplanti_id))

            toplanti = DB.session.query(BapToplanti).options(lazyload("*")).filter_by(
                id=toplanti_id).one()
            toplanti.sonuclandi_mi = True
            toplanti.toplanti_durumu = ToplantiDurumu.gerceklestirildi
            flash("Toplantı başarılı bir şekilde sonuçlandırıldı.")
            DB.session.commit()
            signal_payload = {
                "message_type": USER_ACTIVITY_MESSAGES.get("toplanti").get(
                    "toplanti_sonuclandirildi").type_index,
                "nesne": 'BAP Toplanti',
                "nesne_id": toplanti.id,
                "ekstra_mesaj": "{} adlı kullanıcı bap toplantisini sonuçlandırdı.".format(
                    current_user.username),
            }
            signal_sender(**signal_payload)
        except Exception as exc:
            DB.session.rollback()
            CustomErrorHandler.error_handler(
                hata="Var olmayan bir toplanti id ile istek gönderildi.User id: {},"
                     " Hata: {}".format(current_user.id, exc))
            return abort(404)

        return redirect(url_for("toplanti.toplanti_gundem_listele",
                                toplanti_id=toplanti_id))
示例#12
0
class ProjeYurutucusuProjeAramaView(FlaskView):
    """Proje Arama"""

    excluded_methods = [
        "qry",
    ]

    @login_required
    @route('/', methods=["GET"])
    @auth.requires(Role("Öğretim Üyesi"),
                   menu_registry={
                       'path': '.bap.projelerim',
                       'title': _("Projelerim"),
                       "order": 1
                   })
    def proje_listesi(self):
        """
        Proje arama index sayfasi
        Returns:
            http response
        """

        ogretim_gorevlisi = DB.session.query(User). \
            join(Person, Person.user_id == User.id). \
            join(Personel, Person.id == Personel.person_id). \
            add_columns(Personel.id.label("ogretim_gorevlisi_id")). \
            filter(User.id == current_user.id).one()

        ogretim_gorevlisi_id = ogretim_gorevlisi.ogretim_gorevlisi_id

        tum_projeler = DB.session.query(Proje).filter(
            Proje.yurutucu == ogretim_gorevlisi_id,
            or_(
                Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi,
                Proje.proje_basvuru_durumu ==
                ProjeBasvuruDurumu.revizyon_bekleniyor)).options(
                    joinedload(Proje.proje_durumu)).all()

        basvuru_kabul = list(
            filter(
                lambda x: x.proje_durumu.current_app_state == AppStates.
                basvuru_kabul, tum_projeler))

        devam_eden = list(
            filter(
                lambda x: x.proje_durumu.current_app_state == AppStates.devam,
                tum_projeler))

        sonlandirilmis = list(
            filter(lambda x: x.proje_durumu.current_app_state == AppStates.son,
                   tum_projeler))

        revizyon_beklenenler = []
        for proje in tum_projeler:
            if proje.proje_durumu.current_app_state == AppStates.basvuru_kabul and proje.proje_basvuru_durumu == ProjeBasvuruDurumu.revizyon_bekleniyor:
                revizyon_beklenenler.append(proje)

        taslak_olan_projeler = DB.session.query(Proje).options(
            lazyload('*')).filter(
                Proje.user_id == current_user.id,
                Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.taslak).all()

        return render_template('proje_arama/proje_yurutucu_proje_arama.html',
                               tum_projelerim=tum_projeler,
                               basvuru_kabul=basvuru_kabul,
                               devam_eden=devam_eden,
                               sonlandirilmis=sonlandirilmis,
                               revizyon_beklenenler=revizyon_beklenenler,
                               taslak_olan_projeler=taslak_olan_projeler)
示例#13
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
示例#14
0
class MuayeneTeslimListesiView(FlaskView):
    """Bap Satinalma Muayene teslim listesi view class"""
    @property
    def qry(self):
        """
                Proje ve ilgili alanlari icin query nesnesi olustur.
                Returns:
                """
        return DB.session.query(SiparisTakip). \
            join(TalepKalemleri, TalepKalemleri.id == SiparisTakip.satinalma_talep_kalemleri_id). \
            join(FirmaTeklifKalemi, FirmaTeklifKalemi.id == SiparisTakip.kazanan_firma_teklif_id). \
            join(FirmaSatinalmaTeklif, FirmaSatinalmaTeklif.id == FirmaTeklifKalemi.teklif_id). \
            join(BapFirma, BapFirma.id == FirmaSatinalmaTeklif.firma_id). \
            join(ProjeKalemi, ProjeKalemi.id == TalepKalemleri.proje_kalemi_id). \
            join(ProjeSatinAlmaTalebi, TalepKalemleri.satinalma_id == ProjeSatinAlmaTalebi.id). \
            join(Proje, Proje.id == ProjeSatinAlmaTalebi.proje_id). \
            join(OgretimElemani, Proje.yurutucu == OgretimElemani.id). \
            join(Personel, OgretimElemani.personel_id == Personel.id). \
            join(Person, Person.id == Personel.person_id). \
            join(HitapUnvan, Personel.unvan == HitapUnvan.id). \
            add_columns(
            ProjeKalemi.ad.label("malzeme_adi"),
            SiparisTakip.siparis_numarasi.label("siparis_numarasi"),
            Proje.proje_no.label("proje_no"),
            Person.ad.label("yurutucu_ad"),
            Person.ad.label("yurutucu_soyad"),
            HitapUnvan.ad.label("yurutucu_unvan"),
            SiparisTakip.muayeneye_gonderilen_tarih.label("muayeneye_gonderilen_tarih"),
            SiparisTakip.siparis_durumu.label("siparis_durumu"),
            TalepKalemleri.talep_miktari.label("talep_miktari"),
            FirmaTeklifKalemi.teklif.label("toplam_fiyati"),
            ProjeKalemi.birim.label("birim"),
            TalepKalemleri.satinalma_id.label("satinalma_id"),
            BapFirma.adi.label("firma_adi"),
            TalepKalemleri.talep_miktari.label("talpe_miktari"),
            ProjeKalemi.birim.label("birim"))

    def process_data(self, result, form_data, total_record):
        data = [[
            index + 1, r.malzeme_adi, "{} {}".format(r.talep_miktari, r.birim),
            r.siparis_numarasi, r.firma_adi, r.proje_no,
            "{} {} {}".format(r.yurutucu_unvan, r.yurutucu_ad,
                              r.yurutucu_soyad), "{}".format(
                                  r.muayeneye_gonderilen_tarih.strftime(
                                      current_app.config['DATE_FORMAT'])),
            "{}".format(r.siparis_durumu.value), """
            <a class="detail_arrow" href="{}"><span class="fa fa-arrow-circle-right fa-2x "></span>
                </a>
                """.format(
                url_for('satinalma.satinalma_dashboard',
                        satinalma_id=r.satinalma_id))
        ] for index, r in enumerate(result)]

        return jsonify({
            "data": data,
            "draw": form_data['draw'],
            "recordsFiltered": total_record,
            "recordsTotal": total_record
        })

    @staticmethod
    @login_required
    @route('/liste', methods=['GET'])
    @auth.requires(Permission(*permission_dict["bap"]["satinalma"]
                              ["muayene_teslim_listesi_goruntuleme"]),
                   menu_registry={
                       "path": ".bap.satinalma.muayene_teslim_listesi",
                       "title": _("Muayene Takibi")
                   })
    def muayene_teslim_listele():
        search_form = MuayeneTeslimListesiSearchForm()
        return render_template("muayene_teslim_listesi.html", form=search_form)

    @login_required
    @auth.requires(
        Or(
            Permission(*permission_dict["bap"]["satinalma"]
                       ["muayene_teslim_listesi_goruntuleme"]),
            Or(Role("BAP Admin"), Role("BAP Yetkilisi"))))
    @route('/data', methods=["POST"], endpoint="muayene_teslim_listesi_search")
    def muayene_teslim_listesi_ara(self):  # pylint: disable=too-many-branches
        """
        Bap projelerinde POST ile gelen parametrelere gore arama yapip, sonuclari dondurur.
        Returns:
            http response
        """
        qry = self.qry
        total_record = qry.count()
        form_data = request.form.to_dict()
        search_form = MuayeneTeslimListesiSearchForm(**form_data)
        muayene_durumu = search_form.muayene_durumu.data

        if muayene_durumu == "-1":
            qry = qry.filter(
                or_((SiparisTakip.siparis_durumu == 'muayeneye_gonderildi'),
                    (SiparisTakip.siparis_durumu == 'muayene_onayladi'),
                    (SiparisTakip.siparis_durumu == 'muayene_reddetti')))
        if muayene_durumu == 'SiparisDurumu.muayeneye_gonderildi':
            qry = qry.filter(
                SiparisTakip.siparis_durumu == 'muayeneye_gonderildi')
        if muayene_durumu == 'SiparisDurumu.muayene_onayladi':
            qry = qry.filter(SiparisTakip.siparis_durumu == 'muayene_onayladi')
        if muayene_durumu == 'SiparisDurumu.muayene_reddetti':
            qry = qry.filter(SiparisTakip.siparis_durumu == 'muayene_reddetti')

        if not search_form.validate():
            result = qry.order_by(desc(
                SiparisTakip.muayeneye_gonderilen_tarih)).offset(
                    form_data['start']).limit(form_data['length']).all()
            return self.process_data(result, form_data, total_record)

        firma_adi = search_form.firma_adi.data
        malzeme_adi = search_form.malzeme_adi.data
        proje_no = search_form.proje_no.data
        muayeneye_gonderilen_tarih = search_form.date.muayeneye_gonderilen_tarih.data
        muayeneye_gonderilen_tarih_option = search_form.date.muayeneye_gonderilen_tarih_option.data
        yurutucu = search_form.yurutucu.data

        if proje_no:
            qry = qry.filter(Proje.proje_no.ilike('%' + proje_no + '%'))

        if yurutucu:
            qry = qry.filter(Person.ad.ilike('%' + yurutucu + '%'))

        if firma_adi:
            qry = qry.filter(BapFirma.adi.ilike('%' + firma_adi + '%'))

        if malzeme_adi:
            qry = qry.filter(ProjeKalemi.ad.ilike('%' + malzeme_adi + '%'))

        if muayeneye_gonderilen_tarih:
            if muayeneye_gonderilen_tarih_option == '0':
                qry = qry.filter(SiparisTakip.muayeneye_gonderilen_tarih <=
                                 muayeneye_gonderilen_tarih)
            if muayeneye_gonderilen_tarih_option == '1':
                qry = qry.filter(SiparisTakip.muayeneye_gonderilen_tarih ==
                                 muayeneye_gonderilen_tarih)
            if muayeneye_gonderilen_tarih_option == '2':
                qry = qry.filter(SiparisTakip.muayeneye_gonderilen_tarih >=
                                 muayeneye_gonderilen_tarih)

        result = qry.order_by(desc(
            SiparisTakip.muayeneye_gonderilen_tarih)).offset(
                form_data['start']).limit(form_data['length']).all()

        return self.process_data(result, form_data, total_record)
示例#15
0
class EskiProjeler(FlaskView):
    """
    Universitelerin eksi sistemlerinden kalma projelerle ilgili islemlerin yapildigi view
    """
    @staticmethod
    @login_required
    @auth.requires(And(
        Permission(*permission_dict["bap"]["proje"]["proje_arama"]
                   ["eski_projeleri_arama"]),
        Or(Role("BAP Admin"), Role("BAP Yetkilisi"))),
                   menu_registry={
                       "path": ".bap.proje.eski_projeler",
                       "title": _("Eski Projeler")
                   })
    @route('listele', methods=['GET'])
    def eski_projeler_listele():
        """Eski projelerin listelendigi view"""
        # todo: pagination ozelligi eklenmesi gerekiyor.
        return render_template("proje_arama/eski_projeler_listele.html")

    @staticmethod
    @login_required
    @auth.requires(
        And(
            Permission(*permission_dict["bap"]["proje"]["proje_arama"]
                       ["eski_projeleri_goruntuleme"]),
            Or(Role("BAP Admin"), Role("BAP Yetkilisi"))))
    @route('listele/data', methods=['POST'])
    def eski_projeler_datatable():
        """Eski projeleri Datatable'a gonderir"""
        eski_projeler = DB.session.query(EskiProje)

        dts = DataTableServer(columns={
            0: EskiProje.id,
            1: EskiProje.no,
            2: EskiProje.tipi,
            3: EskiProje.baslik,
            4: EskiProje.yurutucu_adi,
            5: EskiProje.fakulte_ismi,
            6: EskiProje.sure,
            7: EskiProje.butce,
            8: EskiProje.baslama_tarihi
        },
                              qry=eski_projeler)

        eski_projeler = dts.query(request)
        data = [[
            eski_proje.id, eski_proje.no, eski_proje.tipi, eski_proje.baslik,
            eski_proje.yurutucu_adi, eski_proje.fakulte_ismi,
            "{sure} {sure_birimi}".format(
                sure=eski_proje.sure,
                sure_birimi=eski_proje.sure_birimi.value),
            float(eski_proje.butce),
            eski_proje.baslama_tarihi.strftime("%d.%m.%Y")
        ] for eski_proje in eski_projeler.items]

        return jsonify({
            "data": data,
            "recordsFiltered": eski_projeler.total,
            "recordsTotal": eski_projeler.filtered_from
        })
示例#16
0
class IsTakipView(FlaskView):
    """Zamanlanmış işleri takip ekrani"""

    excluded_methods = [
        "qry"
    ]

    @property
    def qry(self):
        """AkademikPersonel BaseQuery"""

        return DB.session.query(AppStateTracker). \
            outerjoin(AppState, AppStateTracker.state_id == AppState.id). \
            outerjoin(job_store.jobs_t,
                      AppStateTracker.apscheduler_job_id == job_store.jobs_t.c.id). \
            join(Person, AppStateTracker.triggered_by == Person.user_id). \
            add_columns(
            AppStateTracker.id,
            AppStateTracker.apscheduler_job_id,
            AppState.state_code,
            AppStateTracker.description,
            AppStateTracker.params,
            AppStateTracker.date,
            AppStateTracker.job_type,
            Person.ad,
            Person.soyad,
            job_store.jobs_t.c.next_run_time
        ).order_by(desc(AppStateTracker.updated_at))

    @login_required
    @route('/data', methods=["POST"])
    @auth.requires(Role("BAP Admin"))
    def data_table(self):
        """
        Data table ajax sorgularini karsilayan method
        :return: json(Response)
        """

        dts = DataTableServer({
            0: AppState.state_code,
            1: AppStateTracker.description,
            2: AppStateTracker.params,
            3: AppStateTracker.date,
            4: Person.ad
        }, self.qry)
        result = dts.query(request)
        data = [[
            '{}'.format(r.state_code) if r.state_code else None,
            r.description,
            '{}'.format(r.params),
            '{:%d.%m.%Y}'.format(r.date),
            '{}'.format(datetime.datetime.fromtimestamp(int(r.next_run_time)).strftime(
                '%d.%m.%Y %H:%M:%S')) if r.next_run_time else None,
            '{} {}'.format(r.ad, r.soyad),
            '{}'.format(r.job_type.value),
            """                   <td class="sorting_1" tabindex="0">
                                            <span class="btn-group">
                                                  <a href="#"
                                                     class="btn btn-default">İşlemler</a>
                                                  <a href="#"
                                                     class="btn btn-default dropdown-toggle"
                                                     data-toggle="dropdown"></a>
                                                  <ul class="dropdown-menu pull-right">
                                                  <li>
                                                        <a onclick="is_baslat('{}');">
                                                            <button
                                                                    class="btn btn-link"
                                                                    style="white-space: normal;">Başlat
                                                            </button>
                                                        </a>
                                                      </li>
                                                      <li>
                                                        <a onclick="is_durdur('{}');">
                                                            <button
                                                                    class="btn btn-link"
                                                                    style="white-space: normal;">Durdur
                                                            </button>
                                                        </a>
                                                      </li>
                                                      <li>
                                                        <a onclick="is_sil('{}');">
                                                            <button
                                                                    class="btn btn-link"
                                                                    style="white-space: normal;">Sil
                                                            </button>
                                                        </a>
                                                      </li>
                                                  </ul>
                                            </span>
                                </td>
            
            """.format(r.apscheduler_job_id, r.apscheduler_job_id,
                       r.apscheduler_job_id) if r.apscheduler_job_id else None] for r in
            result.items]

        return jsonify(
            {"data": data, "recordsFiltered": result.total, "recordsTotal": result.filtered_from})

    @login_required
    @auth.requires(Role("BAP Admin"),
                   menu_registry={"path": ".sistem_takibi.is_takibi", "title": _("İş Takip")})
    @route("/is-listesi", methods=['GET'])
    def is_listele(self):
        """ Zamanlanmış işleri listeler"""

        qry = self.qry.limit(50)

        return render_template("is_takibi/is_listele.html", results=qry)

    @login_required
    @auth.requires(Role("BAP Admin"))
    @route("/is-bitir", methods=['POST'], endpoint='is_bitir')
    def is_bitir(self):
        """ Zamanlanmış işleri listeler"""
        job_id = request.get_json()['job_id']

        try:
            job_handler = JobHandler(remove_jobs=[job_id])
            job_handler.remove_job()
        except Exception as exc:
            return jsonify(status='error'), 500

        return jsonify(status='success')

    @login_required
    @auth.requires(Role("BAP Admin"))
    @route("/is-baslat", methods=['POST'], endpoint='is_baslat')
    def is_baslat(self):
        """ Zamanlanmış işleri listeler"""
        job_id = request.get_json()['job_id']

        try:
            job_handler = JobHandler(resume_jobs=[job_id])
            job_handler.resume_job()
        except Exception as exc:
            return jsonify(status='error'), 500

        return jsonify(status='success')

    @login_required
    @auth.requires(Role("BAP Admin"))
    @route("/is-durdur", methods=['POST'], endpoint='is_durdur')
    def is_durdur(self):
        """ Zamanlanmış işleri listeler"""
        job_id = request.get_json()['job_id']

        try:
            job_handler = JobHandler(pause_jobs=[job_id])
            job_handler.pause_job()
        except Exception as exc:
            return jsonify(status='error'), 500

        return jsonify(status='success')
示例#17
0
class ToplantiView(FlaskView):
    """Toplanti ile ilgili islemler Viewi"""

    excluded_methods = [
        "qry",
        "toplanti_ekle_form",
        "user_id"
    ]

    @property
    def qry(self):
        kabul = DB.session.query(
            BapGundem.toplanti_id, func.count('*').label('gundem_kabul')
        ).group_by(
            BapGundem.toplanti_id, BapGundem.karar_durum
        ).having(
            BapGundem.karar_durum == 'kabul'
        ).subquery()

        # Karar durumu "ret" olma sayisi
        ret = DB.session.query(
            BapGundem.toplanti_id, func.count('*').label('gundem_ret')
        ).group_by(
            BapGundem.toplanti_id, BapGundem.karar_durum
        ).having(
            BapGundem.karar_durum == 'ret'
        ).subquery()

        # Karar durumu "degerlendirilmesi" olma sayisi
        degerlendirilmedi = DB.session.query(
            BapGundem.toplanti_id, func.count('*').label('gundem_degerlendirilmedi')
        ).group_by(
            BapGundem.toplanti_id, BapGundem.karar_durum
        ).having(
            BapGundem.karar_durum == KararDurumu.degerlendirilmedi
        ).subquery()

        # Her bir BapToplanti elemeni ve iliskisi bulundugu BapGundem elemaninin kabul ve ret
        #    durumlarinin sayisini dondurur.
        toplanti_listesi = DB.session.query(
            BapToplanti,
            kabul.c.gundem_kabul.label("kabul"),
            ret.c.gundem_ret.label("ret"),
            degerlendirilmedi.c.gundem_degerlendirilmedi.label("degerlendirilmedi"),
        ).outerjoin(
            kabul, BapToplanti.id == kabul.c.toplanti_id
        ).outerjoin(
            ret, BapToplanti.id == ret.c.toplanti_id
        ).outerjoin(
            degerlendirilmedi, BapToplanti.id == degerlendirilmedi.c.toplanti_id
        ).options(
            joinedload(BapToplanti.ekleyen).joinedload(User.person).load_only("ad", "soyad"),
            raiseload("*")
        )

        return toplanti_listesi

    def process_data(self, result, form_data, total_record):
        data = [[
            index + 1,
            render_template_string("""
                    {% if toplanti_tarihi %}
                        {{ '{:%d.%m.%Y}'.format(toplanti_tarihi) }}
                    {% else %}
                        -
                    {% endif %}
               """, toplanti_tarihi=r[0].toplanti_tarihi),
            r[0].toplanti_durumu.value,
            render_template_string("""
                {{ item.ekleyen.person.ad + ' ' + item.ekleyen.person.soyad }}
                """, item=r[0]),
            render_template_string("""
                {% if kabul == None %}
                    {% set kabul = 0 %}
                {% endif %}
                {% if ret == None %}
                    {% set ret = 0 %}
                {% endif %}
                {% if degerlendirilmedi == None %}
                    {% set degerlendirilmedi = 0 %}
                {% endif %}
                    {{ degerlendirilmedi | string + " Değerlendirilmedi, " if degerlendirilmedi else ""}} {{ kabul }} Kabul ve {{ ret }} Ret
                """, kabul=r.kabul, ret=r.ret, degerlendirilmedi=r.degerlendirilmedi),
            render_template_string("""
                 <a class="detail_arrow"
                    href="{{ url_for('toplanti.toplanti_gundem_listele', toplanti_id=id) }}">
                    <span class="float-left detail_edit fa ft-edit fa-2x m-l-10"></span>
                </a>
                """, id=r[0].id)

        ] for index, r in enumerate(result)]

        return jsonify({"data": data,
                        "draw": form_data['draw'],
                        "recordsFiltered": total_record,
                        "recordsTotal": total_record
                        })

    @property
    def user_id(self):
        """Kullanici idsi dondurur"""
        return current_user.id

    @property
    def toplanti_ekle_form(self):
        """Toplanti Ekleme Formu dondurur"""
        toplanti_ekle_form = ToplantiEkleForm(request.form)
        return toplanti_ekle_form

    @login_required
    @auth.requires(Permission(*permission_dict["bap"]["toplanti"]["toplanti_listesi_goruntuleme"]),
                   menu_registry={'path': '.bap.yk_toplanti.toplanti_listesi',
                                  'title': _("Toplantı")}
                   )
    @route("/listesi")
    def liste(self):
        """Toplanti Listesi Ekrani"""

        form = ToplantiFiltreleForm()

        return render_template("toplanti_listele.html",
                               toplanti_ekle_form=self.toplanti_ekle_form,
                               form=form)

    @login_required
    @auth.requires(Permission(*permission_dict["bap"]["toplanti"]["toplanti_olusturma"]))
    @route("/listesi", methods=["POST"], endpoint='ekle')
    def ekle(self):
        """Toplanti Ekleme"""
        toplanti_ekle_form = ToplantiEkleForm(request.form)
        toplanti = BapToplanti(toplanti_tarihi=toplanti_ekle_form.toplanti_tarihi.data,
                               toplanti_durumu=toplanti_ekle_form.toplanti_durumu.data,
                               ekleyen_id=self.user_id, )
        DB.session.add(toplanti)
        DB.session.commit()
        flash(_("Toplantı başarıyla eklenmiştir."))
        signal_payload = {
            "message_type": USER_ACTIVITY_MESSAGES.get("toplanti").get(
                "toplanti_olustur").type_index,
            "nesne": 'BAP Toplanti',
            "nesne_id": toplanti.id,
            "ekstra_mesaj": "{} adlı kullanıcı yeni toplanti olusturdu.".format(
                current_user.username),
        }
        signal_sender(**signal_payload)
        return redirect(url_for('toplanti.ToplantiView:liste'))

    @staticmethod
    @login_required
    @auth.requires(Permission(*permission_dict["bap"]["toplanti"]["toplanti_silme"]))
    @route("/sil/<int:toplanti_id>", methods=["DELETE"], endpoint='sil')
    def sil(toplanti_id):
        """Toplanti Silme"""
        toplanti = DB.session.query(
            BapToplanti).filter(BapToplanti.id == toplanti_id).one()
        if toplanti:
            DB.session.delete(toplanti)
            DB.session.commit()
            signal_payload = {
                "message_type": USER_ACTIVITY_MESSAGES.get("toplanti").get(
                    "toplanti_sil").type_index,
                "nesne": 'BAP Toplanti',
                "nesne_id": toplanti.id,
                "ekstra_mesaj": "{} adlı kullanıcı bap toplantisini sildi.".format(
                    current_user.username),
            }
            signal_sender(**signal_payload)
            return jsonify(status="success")

        return abort(400)

    @login_required
    @auth.requires(Or(Permission(*permission_dict["bap"]["toplanti"]["toplanti_listesi_goruntuleme"]),
                      Role("BAP Yetkilisi"),
                      Role("BAP Admin")))
    @route('/data', methods=["POST"], endpoint="toplanti_search")
    def toplanti_arama(self):  # pylint: disable=too-many-branches
        """
        Bap toplanti POST ile gelen parametrelere gore arama yapip, sonuclari dondurur.

        Returns:
            http response

        """
        qry = self.qry
        total_record = qry.count()
        form_data = request.form.to_dict()
        search_form = ToplantiFiltreleForm(**form_data)

        date = search_form.date.toplanti_tarihi.data
        date_option = search_form.date.toplanti_tarihi_option.data
        toplanti_durumu = search_form.toplanti_durumu.data

        if toplanti_durumu != '0' and toplanti_durumu:
            qry = qry.filter(BapToplanti.toplanti_durumu == toplanti_durumu)

        if not search_form.validate():
            result = qry.order_by(desc(BapToplanti.created_at)).offset(form_data['start']).limit(
                form_data['length']).all()
            total_record = qry.count()
            return self.process_data(result, form_data, total_record)

        if date:
            if date_option == '0':
                qry = qry.filter(BapToplanti.toplanti_tarihi >= date)
            if date_option == '1':
                qry = qry.filter(BapToplanti.toplanti_tarihi == date)
            if date_option == '2':
                qry = qry.filter(BapToplanti.toplanti_tarihi <= date)

        result = qry.order_by(desc(BapToplanti.created_at)).offset(form_data['start']).limit(
            form_data['length']).all()

        return self.process_data(result, form_data, total_record)
示例#18
0
class BapFirmaView(FlaskView):
    """Bap anasyafa view classi"""
    @staticmethod
    @login_required
    @auth.requires(Or(
        Permission(*permission_dict["yonetim"]["firma_yonetimi"]
                   ["firma_listesi_goruntuleme"]), Role("BAP Yetkilisi")),
                   menu_registry={
                       'path': '.yonetim.firma_yonetimi.firma_listesi',
                       'title': _("Firma Listesi")
                   })
    @route('/firma-liste', methods=['GET'])
    def firma_liste():
        """Firma Listesi Ekrani"""
        firmalar = DB.session.query(BapFirma).options(joinedload(
            BapFirma.user)).all()
        onay_bekleyen_firmalar = []
        reddedilen_firmalar = []
        kabul_edilen_firmalar = []

        for firma in firmalar:
            if firma.onaylandi:
                kabul_edilen_firmalar.append(firma)
            elif firma.reddedildi_mi:
                reddedilen_firmalar.append(firma)
            else:
                onay_bekleyen_firmalar.append(firma)

        return render_template("firma_liste.html",
                               kabul_edilen_firmalar=kabul_edilen_firmalar,
                               reddedilen_firmalar=reddedilen_firmalar,
                               onay_bekleyen_firmalar=onay_bekleyen_firmalar)

    @staticmethod
    @login_required
    @auth.requires(
        Or(
            Permission(*permission_dict["yonetim"]["firma_yonetimi"]
                       ["firma_goruntuleme"]), Role("BAP Yetkilisi")))
    @route('/firma-detay/<int:firma_id>', methods=['GET'])
    def firma_detay(firma_id):
        """Firma Listesi Ekrani"""

        firma = DB.session.query(BapFirma).filter(
            BapFirma.id == firma_id).one()
        form = FirmaKayitFormu(**firma.to_dict())

        return render_template("firma_bilgileri.html", firma=firma, form=form)

    @staticmethod
    @login_required
    @auth.requires(
        Or(
            Permission(*permission_dict["yonetim"]["firma_yonetimi"]
                       ["firma_guncelleme"]), FirmaYetkilisi()))
    @route('/firma-detay-guncelle/<int:firma_id>',
           methods=['POST'],
           endpoint='firma_detay_guncelle')
    def firma_detay_guncelle(firma_id):
        """Firma Listesi Ekrani"""

        firma = DB.session.query(BapFirma).filter(
            BapFirma.id == firma_id).one()
        form = FirmaKayitFormu(request.form)
        form.yetkili_email.validators = None
        form.yetkili_adi.validators = None
        form.yetkili_soyadi.validators = None
        form.adres.validators = None
        form.firma_faaliyet_belgesi_id.validators = None
        form.telefon.validators = None
        form.email.validators = None
        firma.yetkili_adi = form.yetkili_adi.data
        firma.yetkili_soyadi = form.yetkili_soyadi.data
        firma.yetkili_email = form.yetkili_email.data
        firma.adres = form.adres.data
        firma_faaliyet_belgesi_id = request.files.get(
            form.firma_faaliyet_belgesi_id.name)
        if firma_faaliyet_belgesi_id:
            firma.firma_faaliyet_belgesi_id = firma_faaliyet_belgesi_id

        firma.telefon = form.telefon.data
        firma.email = form.email.data
        DB.session.commit()
        flash("Firma bilgileri başarıyla güncellenmiştir.")
        return redirect(url_for('firma.firma_detay', firma_id=firma.id))

    @staticmethod
    @login_required
    @auth.requires(
        Or(
            Permission(*permission_dict["yonetim"]["firma_yonetimi"]
                       ["firma_goruntuleme"]), Role("BAP Yetkilisi")))
    @route('/faaliyet-belgesi-indir/<int:firma_id>',
           methods=['GET'],
           endpoint="firma_faaliyet_belgesi_indir")
    def firma_faaliyet_belgesi_indir(firma_id):
        """Firma Listesi Ekrani"""
        firma = DB.session.query(BapFirma).get(firma_id)
        try:
            belge = DB.session.query(File).filter(
                File.id == firma.firma_faaliyet_belgesi_id).one()
            return send_file(belge.file_object,
                             attachment_filename=belge.content.file.filename,
                             as_attachment=True,
                             mimetype=belge.content.file.content_type)
        except Exception as exc:
            CustomErrorHandler.error_handler()
            return abort(400)

    @login_required
    @auth.requires(
        Or(
            Permission(*permission_dict["yonetim"]["firma_yonetimi"]
                       ["firma_onaylama"]), Role("BAP Yetkilisi"),
            Role("BAP Admin")))
    @route('/firma-onay/<int:firma_id>', methods=['POST'])
    def firma_onay(self, firma_id):
        onay = bool(int(request.get_json().get('onay')))
        firma = DB.session.query(BapFirma).filter(
            BapFirma.id == firma_id).first()

        if not onay:
            firma.onaylandi = False
            firma.reddedildi_mi = True
            firma.faaliyet_durumu = False
            DB.session.commit()
            signal_payload = {
                "message_type":
                USER_ACTIVITY_MESSAGES.get("bap").get("firma_red").type_index,
                "nesne":
                'BapFirma',
                "nesne_id":
                firma.id,
                "ekstra_mesaj":
                "{} adlı kullanıcı, {} idli firmayı reddetti.".format(
                    current_user.username, firma.id)
            }
            signal_sender(**signal_payload)
            return jsonify(status="success")
        else:
            firma.onaylandi = True
            firma.faaliyet_durumu = True
            firma.reddedildi_mi = False

            DB.session.commit()
            signal_payload = {
                "message_type":
                USER_ACTIVITY_MESSAGES.get("bap").get("firma_onay").type_index,
                "nesne":
                'BapFirma',
                "nesne_id":
                firma.id,
                "ekstra_mesaj":
                "{} adlı kullanıcı, {} idli firmayı onayladı.".format(
                    current_user.username, firma.id)
            }
            signal_sender(**signal_payload)
            flash("Firma başarıyla onaylanmıştır..")
            return jsonify(status="success")
示例#19
0
class ProjeDegerlendirmeView(FlaskView):
    """ProjeDegerlendirmeleri View"""
    @staticmethod
    @login_required
    @auth.requires(
        Or(
            Permission(*permission_dict["bap"]["proje"]["dashboard"]
                       ["proje_degerlendirme_goruntuleme"]),
            Role('BAP Yetkilisi'), Role("BAP Admin")))
    @route('<int:proje_id>/dashboard/degerlendirme',
           methods=["GET"],
           endpoint='degerlendirme_listele')
    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)

    # todo: işlevli mi ???
    @staticmethod
    @login_required
    # todo: proje yurutucusu olma durumu eklenmesi gerekiyormu.
    # todo: aynı kontrol buna benzer(proje kararlari, proje mesajlari vb)
    # todo: viewlarda yapilmalimi kontrol et
    @auth.requires(
        Or(
            Permission(*permission_dict["bap"]["proje"]["dashboard"]
                       ["proje_degerlendirme_goruntuleme"]),
            Role('BAP Yetkilisi'), Role("BAP Admin")))
    @route('<int:proje_id>/dashboard/degerlendirme/<int:degerlendirme_id>',
           methods=["GET"],
           endpoint='degerlendirme_detay')
    def degerlendirme_detay(proje_id, degerlendirme_id):
        """Proje degerlendirme detayı goruntulemek icin kullanilir"""
        user_id = current_user.id
        try:
            # todo: degerlendirme tamamlandimi kontrol et
            # todo: degerlendirme ilgili projeye mi ait kontrol et
            proje_degerlendirme = DB.session.query(
                ProjeDegerlendirmeleri).join(
                    ProjeDegerlendirmeleri.degerlendirme_hakemi).filter(
                        ProjeDegerlendirmeleri.id == degerlendirme_id,
                        ProjeDegerlendirmeleri.degerlendirme_sonuclandi_mi ==
                        True, ProjeHakemleri.proje_id == proje_id).one()
        except NoResultFound as exc:
            CustomErrorHandler.error_handler(
                hata=
                "Var olmayan bir proje değerlendirmesine ulaşılmaya çalışıldı."
                "User id: {}, Hata: {}".format(user_id, exc))
            return abort(404)
        # todo: degerlendirme sablon uzerinden mi yapilacak var olan form ile mi devam edilecek ?
        degerlendirme_form = ProjeDegerlendirmeForm(
            **proje_degerlendirme.degerlendirme)
        return render_template('dashboard/proje_degerlendirme_detay.html',
                               degerlendirme_form=degerlendirme_form,
                               proje_id=proje_id)

    @staticmethod
    @login_required
    @auth.requires(
        Or(
            Permission(*permission_dict["bap"]["proje"]["dashboard"]
                       ["proje_degerlendirme_goruntuleme"]),
            Role('BAP Yetkilisi'), Role("BAP Admin")))
    @route('hakem_rapor_gorusleri_oku/<int:degerlendirme_id>/',
           methods=["GET"],
           endpoint='hakem_rapor_gorusleri_oku')
    def hakem_rapor_gorusleri_oku(degerlendirme_id):
        try:
            proje_degerlendirme = DB.session.query(
                ProjeDegerlendirmeleri).filter(
                    ProjeDegerlendirmeleri.id == degerlendirme_id,
                    ProjeDegerlendirmeleri.degerlendirme_sonuclandi_mi ==
                    True).first()
            if not proje_degerlendirme:
                return jsonify(
                    status="error",
                    hata_mesaji="İlgili değerlendirme bulunamadı"), 400
            degerlendirme = {
                "rapor_turu":
                proje_degerlendirme.rapor.rapor_tipi.value,
                "degerlendirme_sonucu":
                proje_degerlendirme.sonuc.value,
                "gonderim_tarihi":
                proje_degerlendirme.degerlendirme_gonderim_tarihi.strftime(
                    "%d.%m.%Y"),
                "metin":
                proje_degerlendirme.degerlendirme,
            }
        except Exception as exc:
            return jsonify(status="error")

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

    @staticmethod
    @login_required
    @auth.requires(
        And(
            Permission(*permission_dict["bap"]["proje"]["dashboard"]
                       ["proje_degerlendirme_goruntuleme"]),
            Or(Role('BAP Yetkilisi'), Role("BAP Admin"))))
    @route('degerlendirme/<int:degerlendirme_id>/guncelle', methods=["POST"])
    def degerlendirme_guncelle(degerlendirme_id):
        """
        Yetkili tarafindan yapilir. Degerlendirme metninde hakemin ismi yazma durumunda silmek
        icin kullanilir.
        :param degerlendirme_id:
        :return:
        """
        proje_degerlendirme = DB.session.query(ProjeDegerlendirmeleri).filter(
            ProjeDegerlendirmeleri.id == degerlendirme_id,
            ProjeDegerlendirmeleri.degerlendirme_sonuclandi_mi ==
            True).first()
        if not proje_degerlendirme:
            return redirect(
                url_for("proje.degerlendirme_listele",
                        proje_id=proje_degerlendirme.rapor.proje_id))
        degerlendirme_guncelle_form = DegerlendirmeGuncelleForm(request.form)
        proje_degerlendirme.degerlendirme = degerlendirme_guncelle_form.degerlendirme_metni.data
        DB.session.commit()

        return redirect(
            url_for("proje.degerlendirme_listele",
                    proje_id=proje_degerlendirme.rapor.proje_id))
示例#20
0
class ProjeYurutucuDashboard(FlaskView):
    """
    Proje Yurutucu Dashboard view methodlarini icerir
    """
    @staticmethod
    @login_required
    @route("kontrol-paneli", methods=["GET"])
    @auth.requires(Role("Öğretim Üyesi"),
                   menu_registry={
                       'path': '.yurutucu_dashboard',
                       'title': _("Kontrol Paneli")
                   })
    @auth.requires(Role("Öğretim Üyesi"))
    def genel():
        """Proje yurutucusu dashboard genel bilgiler"""
        ogretim_gorevlisi = DB.session.query(User). \
            join(Person, Person.user_id == User.id). \
            join(Personel, Person.id == Personel.person_id). \
            add_columns(Personel.id.label("ogretim_gorevlisi_id")). \
            filter(User.id == current_user.id).one()
        ogretim_gorevlisi_id = ogretim_gorevlisi.ogretim_gorevlisi_id

        # tamamlanan proje sayisi
        tamamlanan_proje_sayisi = DB.session.query(Proje.id).join(
            AppState, AppState.id == Proje.proje_durumu_id).filter(
                AppState.current_app_state == AppStates.son,
                Proje.yurutucu == ogretim_gorevlisi_id).count()

        # devam eden proje sayisi
        devam_eden_proje_sayisi = DB.session.query(Proje.id).join(
            AppState, AppState.id == Proje.proje_durumu_id).filter(
                or_(AppState.current_app_state == AppStates.basvuru_kabul,
                    AppState.current_app_state == AppStates.devam),
                Proje.yurutucu == ogretim_gorevlisi_id).count()

        # tamamlanmis basvurular arasinda yurutucu oldugu projeleri getirir.
        yurutucu_oldugu_projeler = DB.session.query(Proje.id.label("proje_id"),
                                                    Proje.yurutucu,
                                                    Proje.proje_basvuru_durumu,
                                                    Proje.kabul_edilen_butce
                                                    ). \
            filter(Proje.yurutucu == ogretim_gorevlisi_id,
                   or_(Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi,
                       Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.revizyon_bekleniyor)).all()

        proje_kalemleri = DB.session.query(ProjeKalemi.kullanilan_butce.label("kullanilan_butce")). \
            join(Proje, Proje.id == ProjeKalemi.proje_id). \
            filter(Proje.yurutucu == ogretim_gorevlisi_id).all()
        harcanan_butce = 0

        for proje_kalemi in proje_kalemleri:
            harcanan_butce += proje_kalemi.kullanilan_butce

        toplam_butce = 0
        proje_idleri = []
        proje_idleri_dict = []
        islem_gecmisi = []
        for proje in yurutucu_oldugu_projeler:
            toplam_butce += proje.kabul_edilen_butce if proje.kabul_edilen_butce else 0
            proje_idleri_dict.append({"proje_id": proje.proje_id})
            proje_idleri.append(proje.proje_id)

        # yurutucusu oldugu ve tamamlanmis projelerin islem gecmislerini getirir
        proje_islem_gecmisleri = []
        for id in proje_idleri_dict:
            islem_gecmisi = DB.session.query(AppStateTracker).\
                filter(AppStateTracker.params.contains(id),
                       or_(AppStateTracker.job_type == JobTypes.project_state_change,
                           AppStateTracker.job_type == JobTypes.project_action)). \
                join(Proje, Proje.id == AppStateTracker.params["proje_id"].astext.cast(Integer)).\
                join(Person, Person.user_id == AppStateTracker.triggered_by). \
                join(AppState, AppStateTracker.state_id == AppState.id). \
                add_columns(
                AppState.state_code.label("state_code"),
                Person.ad.label("ad"),
                Person.soyad.label("soyad"),
                Proje.proje_basligi.label("proje_basligi"),
                Proje.id.label("proje_id")
            ).order_by(desc(AppStateTracker.created_at)).limit(15).all()

        # yurutucusu oldugu ve tamamlanmis projelerin mesajlarini getirir
        proje_mesajlari = DB.session.query(ProjeMesaj).join(
            Proje, ProjeMesaj.proje_id == Proje.id).join(
                Mesaj, Mesaj.id == ProjeMesaj.mesaj_id).join(
                    Person, Person.id == Mesaj.alici).add_columns(
                        Proje.proje_basligi, Proje.id.label("proje_id"),
                        Mesaj.okundu, Mesaj.gonderim_zamani, Mesaj.baslik,
                        Person.ad.label("gonderen_ad"),
                        Person.soyad.label("gonderen_soyad")).filter(
                            ProjeMesaj.proje_id.in_(proje_idleri)).order_by(
                                desc(Mesaj.created_at)).limit(15).all()

        bap_duyurular = get_bap_duyurular()

        return render_template('yurutucu_dashboard/genel.html',
                               tamamlanan_proje_sayisi=tamamlanan_proje_sayisi,
                               devam_eden_proje_sayisi=devam_eden_proje_sayisi,
                               toplam_butce=toplam_butce,
                               harcanan_butce=harcanan_butce,
                               islem_gecmisi=islem_gecmisi,
                               proje_mesajlari=proje_mesajlari,
                               bap_duyurular=bap_duyurular)
示例#21
0
class ProjeAramaView(FlaskView):
    """Proje Arama"""

    excluded_methods = [
        "qry"
    ]
    def process_data(self, result, form_data, total_record):
        data = [[
            index + 1,
            r.proje_turu_ad,
            r.proje_no if r.proje_no else '-',
            r.state_code,
            r.proje_basligi,
            '{:%d.%m.%Y}'.format(r.kabul_edilen_baslama_tarihi) if r.kabul_edilen_baslama_tarihi else "-",
            "{} {}".format(r.ad, r.soyad),
            format_currency(r.kabul_edilen_butce, 'TL', '#,##0.00 ¤¤¤',
                            locale='tr_TR') if r.kabul_edilen_butce else "-",
            """
            <a class="detail_arrow" href="{}"><span class="fa fa-arrow-circle-right fa-2x "></span>
                </a>
                """.format(url_for('proje.proje_dashboard', proje_id=r.id))] for index, r in enumerate(result)]

        return jsonify({"data": data,
                        "draw": form_data['draw'],
                        "recordsFiltered": total_record,
                        "recordsTotal": total_record}
                       )

    @property
    def qry(self):
        """
        Proje ve ilgili alanlari icin query nesnesi olustur.
        Returns:
        """
        return DB.session.query(
            Proje
        ).join(
            OgretimElemani, Proje.yurutucu == OgretimElemani.id
        ).join(
            Personel, OgretimElemani.personel_id == Personel.id
        ).join(
            Person, Person.id == Personel.person_id
        ).join(AppState, AppState.id == Proje.proje_durumu_id).join(ProjeTuru,
                                                                    ProjeTuru.id == Proje.proje_turu).add_columns(
            Proje.id,
            Proje.kabul_edilen_butce,
            Proje.kabul_edilen_baslama_tarihi,
            Proje.bitis_tarihi,
            Proje.proje_basligi,
            Proje.proje_turu_numarasi,
            Proje.proje_no,
            Person.ad,
            Person.soyad,
            AppState.state_code,
            ProjeTuru.ad.label("proje_turu_ad")
        )

    @login_required
    @route('/', methods=["GET"])
    @auth.requires(Or(Permission(*permission_dict["bap"]["proje"]["proje_arama"]["projeleri_arama"])),
                   Or(Role("BAP Admin"), Role("BAP Yetkilisi")),
                   menu_registry={'path': '.bap.proje.proje_arama',
                                  'title': _("Proje Arama"), 'order': 3})
    def proje_listele(self):
        """
        Proje arama index sayfasi
        Returns:
            http response

        """
        search_form = SearchForm()
        return render_template('/proje_arama/proje_arama.html', form=search_form)

    @login_required
    @auth.requires(Or(Permission(*permission_dict["bap"]["proje"]["proje_arama"]["projeleri_arama"])),
                   Or(Role("BAP Admin"), Role("BAP Yetkilisi")))
    @route('/data', methods=["POST"], endpoint="proje_search")
    def proje_arama(self):  # pylint: disable=too-many-branches
        """
        Bap projelerinde POST ile gelen parametrelere gore arama yapip, sonuclari dondurur.

        Returns:
            http response

        """
        qry = self.qry
        total_record = qry.count()
        form_data = request.form.to_dict()
        search_form = SearchForm(**form_data)

        proje_durumu = search_form.proje_durumu.data
        proje_sureci = search_form.proje_sureci.data

        if proje_sureci == "-1":
            qry = qry.filter(or_((AppState.current_app_state == 'basvuru_kabul'),
                                 (AppState.current_app_state == 'devam'),
                                 (AppState.current_app_state == 'son')))
        if proje_sureci == 'AppStates.basvuru_kabul':
            qry = qry.filter(AppState.current_app_state == 'basvuru_kabul')
        if proje_sureci == 'AppStates.devam':
            qry = qry.filter(AppState.current_app_state == 'devam')
        if proje_sureci == 'AppStates.son':
            qry = qry.filter(AppState.current_app_state == 'son')

        if proje_durumu != '0' and proje_durumu != 'None':
            qry = qry.filter(AppState.id == int(proje_durumu))

        if not search_form.validate():
            result = qry.order_by(desc(Proje.id)).offset(form_data['start']).limit(
                form_data['length']).all()
            total_record = qry.count()
            return self.process_data(result, form_data, total_record)

        proje_basligi = search_form.ad.data.strip()
        proje_turu_adi = search_form.proje_turu_adi.data
        proje_no = search_form.proje_no.data
        kabul_edilen_baslama_tarihi = search_form.date.baslama_tarihi.data
        bitis_tarihi = search_form.date.bitis_tarihi.data
        baslama_tarihi_option = search_form.date.baslama_tarihi_option.data
        bitis_tarihi_option = search_form.date.bitis_tarihi_option.data
        yurutucu = search_form.yurutucu.data.strip()
        kabul_edilen_butce = search_form.butce.data
        kabul_edilen_butce_option = search_form.butce_option.data

        if proje_basligi:
            qry = qry.filter(Proje.proje_basligi.ilike('%' + proje_basligi + '%'))

        if proje_turu_adi:
            qry = qry.filter(ProjeTuru.ad.ilike('%' + proje_turu_adi + '%'))

        if proje_no:
            qry = qry.filter(Proje.proje_no == proje_no)

        if yurutucu:
            qry = qry.filter(Person.ad.ilike('%' + yurutucu + '%'))

        if kabul_edilen_butce:
            if kabul_edilen_butce_option == '0':
                qry = qry.filter(Proje.kabul_edilen_butce < kabul_edilen_butce)
            elif kabul_edilen_butce_option == '1':
                qry = qry.filter(
                    cast(Proje.kabul_edilen_butce, String()) == str(kabul_edilen_butce))
            else:
                qry = qry.filter(Proje.kabul_edilen_butce > kabul_edilen_butce)

        if kabul_edilen_baslama_tarihi:
            if baslama_tarihi_option == '0':
                qry = qry.filter(Proje.kabul_edilen_baslama_tarihi <= kabul_edilen_baslama_tarihi)
            if baslama_tarihi_option == '1':
                qry = qry.filter(Proje.kabul_edilen_baslama_tarihi == kabul_edilen_baslama_tarihi)
            if baslama_tarihi_option == '2':
                qry = qry.filter(kabul_edilen_baslama_tarihi <= Proje.kabul_edilen_baslama_tarihi)

        if bitis_tarihi:
            if bitis_tarihi_option == '0':
                qry = qry.filter(Proje.bitis_tarihi <= bitis_tarihi)
            if bitis_tarihi_option == '1':
                qry = qry.filter(Proje.bitis_tarihi == bitis_tarihi)
            if bitis_tarihi_option == '2':
                qry = qry.filter(bitis_tarihi <= Proje.bitis_tarihi)

        result = qry.order_by(desc(Proje.id)).offset(form_data['start']).limit(
            form_data['length']).all()

        return self.process_data(result, form_data, total_record)
示例#22
0
class TeslimBeklenenFirmalarView(FlaskView):
    """Bap Satinalma Teslim Beklenen Firmalar view class"""

    excluded_methods = ["qry"]

    def kalan_gun_sayisi(self, teslim_edilmesi_beklenen_tarih):
        kalan_gun = (datetime(teslim_edilmesi_beklenen_tarih.year,
                              teslim_edilmesi_beklenen_tarih.month,
                              teslim_edilmesi_beklenen_tarih.day) -
                     datetime.now()).days
        if kalan_gun < 0:
            return ("{} Gün geçti".format(abs(kalan_gun)), kalan_gun)

        return ("{} Gün kaldı".format(kalan_gun), kalan_gun)

    @property
    def qry(self):
        """
                Proje ve ilgili alanlari icin query nesnesi olustur.
                Returns:
                """
        return DB.session.query(BapFirma). \
            join(FirmaSatinalmaTeklif, FirmaSatinalmaTeklif.firma_id == BapFirma.id). \
            join(FirmaTeklifKalemi, FirmaTeklifKalemi.teklif_id == FirmaSatinalmaTeklif.id). \
            join(ProjeSatinAlmaTalebi, ProjeSatinAlmaTalebi.id == FirmaSatinalmaTeklif.satinalma_id). \
            join(TalepKalemleri, TalepKalemleri.satinalma_id == ProjeSatinAlmaTalebi.id). \
            join(SiparisTakip, SiparisTakip.satinalma_talep_kalemleri_id == TalepKalemleri.id). \
            join(Proje, Proje.id == ProjeSatinAlmaTalebi.proje_id). \
            join(OgretimElemani, Proje.yurutucu == OgretimElemani.id). \
            join(Personel, OgretimElemani.personel_id == Personel.id). \
            join(Person, Person.id == Personel.person_id). \
            join(HitapUnvan, Personel.unvan == HitapUnvan.id). \
            add_columns(
            BapFirma.adi.label("firma_adi"),
            Proje.proje_no.label("proje_no"),
            SiparisTakip.siparis_numarasi.label("siparis_no"),
            SiparisTakip.siparis_tarihi.label("siparis_tarihi"),
            SiparisTakip.teslim_edilmesi_beklenen_tarih.label("teslim_edilmesi_beklenen_tarih"),
            Person.ad.label("ad"),
            Person.ad.label("soyad"),
            HitapUnvan.ad.label("unvan"),
            ProjeSatinAlmaTalebi.id.label("satinalma_id"),
            FirmaTeklifKalemi.teslimat_suresi.label("teslimat_suresi")
        ). \
            filter(SiparisTakip.siparis_durumu == SiparisDurumu.firma_bekleniyor)

    def process_data(self, result, form_data, total_record):
        data = [[
            index + 1, r.firma_adi, r.proje_no if r.proje_no else '-',
            r.siparis_no, "{} {} {}".format(r.unvan, r.ad, r.soyad),
            '{}'.format(
                r.siparis_tarihi.strftime(current_app.config['DATE_FORMAT'])),
            '{}'.format(
                r.teslim_edilmesi_beklenen_tarih.strftime(
                    current_app.config['DATE_FORMAT'])),
            "{}".format(
                self.kalan_gun_sayisi(r.teslim_edilmesi_beklenen_tarih)[0]),
            """
            <a class="detail_arrow" href="{}"><span class="fa fa-arrow-circle-right fa-2x "></span>
                </a>
                """.format(
                url_for('satinalma.satinalma_dashboard',
                        satinalma_id=r.satinalma_id))
        ] for index, r in enumerate(result)]

        return jsonify({
            "data": data,
            "draw": form_data['draw'],
            "recordsFiltered": total_record,
            "recordsTotal": total_record
        })

    @staticmethod
    @login_required
    @route('/', methods=['GET'])
    @auth.requires(
        Permission(*permission_dict["bap"]["satinalma"]
                   ["teslimi_beklenen_firmalar_listesi_görüntüleme"]),
        menu_registry={
            "path": ".bap.satinalma.teslim_beklenen_firmalar",
            "title": _("Ürün Teslim Takibi")
        })
    def teslimi_beklenen_firmalar_listele():
        search_form = TeslimiBeklenenFirmalarSearchForm()
        return render_template("teslimi_beklenen_firmalar.html",
                               form=search_form)

    @login_required
    @auth.requires(
        Or(
            Permission(*permission_dict["bap"]["satinalma"]
                       ["teslimi_beklenen_firmalar_listesi_görüntüleme"]),
            Or(Role("BAP Admin"), Role("BAP Yetkilisi"))))
    @route('/data',
           methods=["POST"],
           endpoint="teslim_beklenen_firmalar_search")
    def teslimi_beklenen_firmalar_ara(self):  # pylint: disable=too-many-branches
        """
        Bap projelerinde POST ile gelen parametrelere gore arama yapip, sonuclari dondurur.
        Returns:
            http response
        """

        qry = self.qry
        total_record = qry.count()
        form_data = request.form.to_dict()
        search_form = TeslimiBeklenenFirmalarSearchForm(**form_data)

        if search_form.gun_gecikmesi.data == '1':
            qry = qry.filter(
                SiparisTakip.teslim_edilmesi_beklenen_tarih > date.today())

        elif search_form.gun_gecikmesi.data == '2':
            qry = qry.filter(
                SiparisTakip.teslim_edilmesi_beklenen_tarih < date.today())

        elif search_form.gun_gecikmesi.data == '3':
            qry = qry.filter(
                SiparisTakip.teslim_edilmesi_beklenen_tarih == date.today())

        if not search_form.validate():
            result = qry.order_by(desc(SiparisTakip.siparis_tarihi)).offset(
                form_data['start']).limit(form_data['length']).all()
            total_record = qry.count()
            return self.process_data(result, form_data, total_record)

        firma_adi = search_form.firma_adi.data
        proje_no = search_form.proje_no.data
        yurutucu = search_form.yurutucu.data
        siparis_no = search_form.siparis_no.data
        siparis_tarihi = search_form.date.siparis_tarihi.data
        siparis_tarihi_option = search_form.date.siparis_tarihi_option.data
        teslim_edilmesi_beklenen_tarih = search_form.date.teslim_edilmesi_beklenen_tarih.data
        teslim_edilmesi_beklenen_tarih_option = search_form.date.teslim_edilmesi_beklenen_tarih_option.data

        if proje_no:
            qry = qry.filter(Proje.proje_no.ilike('%' + proje_no + '%'))

        if yurutucu:
            qry = qry.filter(Person.ad.ilike('%' + yurutucu + '%'))

        if firma_adi:
            qry = qry.filter(BapFirma.adi.ilike('%' + firma_adi + '%'))

        if siparis_no:
            qry = qry.filter(
                SiparisTakip.siparis_numarasi.ilike('%' + siparis_no + '%'))

        if siparis_tarihi:
            if siparis_tarihi_option == '0':
                qry = qry.filter(SiparisTakip.siparis_tarihi <= siparis_tarihi)
            if siparis_tarihi_option == '1':
                qry = qry.filter(SiparisTakip.siparis_tarihi == siparis_tarihi)
            if siparis_tarihi_option == '2':
                qry = qry.filter(SiparisTakip.siparis_tarihi >= siparis_tarihi)

        if teslim_edilmesi_beklenen_tarih:
            if teslim_edilmesi_beklenen_tarih_option == '0':
                qry = qry.filter(SiparisTakip.teslim_edilmesi_beklenen_tarih <=
                                 teslim_edilmesi_beklenen_tarih)
            if teslim_edilmesi_beklenen_tarih_option == '1':
                qry = qry.filter(SiparisTakip.teslim_edilmesi_beklenen_tarih ==
                                 teslim_edilmesi_beklenen_tarih)
            if teslim_edilmesi_beklenen_tarih_option == '2':
                qry = qry.filter(SiparisTakip.teslim_edilmesi_beklenen_tarih >=
                                 teslim_edilmesi_beklenen_tarih)

        result = qry.order_by(desc(SiparisTakip.siparis_tarihi)).offset(
            form_data['start']).limit(form_data['length']).all()

        return self.process_data(result, form_data, total_record)
示例#23
0
class RolAtamaView(FlaskView):
    """Kullaniciya rol atama ekrani"""

    excluded_methods = ["qry", "user_id"]

    def process_data(self, result, form_data, total_record):
        data = [[
            index + 1, r.unvan_ad, "{} {}".format(r.ad, r.soyad),
            render_template_string("""<ul>
                    {% if item.roles %}
                        {% for r in item.roles %}
                            <li>{{ r.name }}</li> 
                        {% endfor %}
                        {% else %}
                        {{ _('Henüz bu kullanıcıya ait bir rol bulunmamaktadır.') }}

                    {% endif %}
                    </ul>
                """,
                                   item=r.User),
            render_template_string("""
             <button class="btn btn-success"
                     data-toggle="modal"
                     onclick="rol_atama_{{id}}()">
                     Rol Ata
            </button>
               <script>
                    function rol_atama_{{ id }}() {
                     $('#rolAtaModal').modal('show');
                     $('#ata').attr("formaction", "{{ url_for('yetki_yonetimi.kisi_rol_ata', u_id=id) }}");
                    }
                </script>
            """,
                                   id=r.User.id)
        ] for index, r in enumerate(result)]

        return jsonify({
            "data": data,
            "draw": form_data['draw'],
            "recordsFiltered": total_record,
            "recordsTotal": total_record
        })

    @property
    def qry(self):
        """AkademikPersonel BaseQuery"""
        return DB.session.query(User).options(joinedload(User.roles)). \
            join(Person, Person.user_id == User.id). \
            join(Personel, Personel.person_id == Person.id). \
            join(HitapUnvan, Personel.unvan == HitapUnvan.id).add_columns(
            Person.ad.label("ad"),
            Person.soyad.label("soyad"),
            HitapUnvan.ad.label("unvan_ad")
        )

    @property
    def user_id(self):
        """Kullanici idsi dondurur"""
        return current_user.id

    @login_required
    @auth.requires(Or(
        Permission(*permission_dict["yonetim"]["yetki_yonetimi"]["rol_atama"]),
        Role("BAP Admin")),
                   menu_registry={
                       'path': '.yonetim.yetki_yonetimi.rol_atama',
                       'title': _("Rol Atama")
                   })
    @route("/", methods=['GET'])
    def kisi_listesi(self):
        """Kisi Listesi Ekrani"""
        roller = [(r.id, r.name) for r in DB.session.query(RoleModel).all()
                  if r.name != "anonymous"]
        rol_atama_form = RolAtamaForm()
        rol_atama_form.roller.choices = roller
        rol_atama_form.process()
        kisi_search_form = KisiSearchForm()

        return render_template("kullanici_rolleri.html",
                               rol_atama_form=rol_atama_form,
                               form=kisi_search_form)

    @login_required
    @auth.requires(
        Or(
            Permission(
                *permission_dict["yonetim"]["yetki_yonetimi"]["rol_atama"]),
            Role("BAP Admin")))
    @route("/<int:u_id>", methods=["POST"], endpoint="kisi_rol_ata")
    def kisi_rol_ata(self, u_id):
        """Kisi Listesi Ekrani"""

        form = RolAtamaForm(request.form)
        for r in form.roller.data:
            yeni_rol = UserRole(user_id=u_id, role_id=r)
            DB.session.add(yeni_rol)
            DB.session.commit()

        return redirect(url_for('yetki_yonetimi.RolAtamaView:kisi_listesi'))

    @login_required
    @auth.requires(
        Or(
            Permission(
                *permission_dict["yonetim"]["yetki_yonetimi"]["rol_atama"]),
            Role("BAP Admin")))
    @route('/data', methods=["POST"], endpoint="kisi_rol_search")
    def kisi_arama(self):  # pylint: disable=too-many-branches
        """
        Bap kişilerinde POST ile gelen parametrelere gore arama yapip, sonuclari dondurur.

        Returns:
            http response
        """

        qry = self.qry
        total_record = qry.count()
        form_data = request.form.to_dict()
        search_form = KisiSearchForm(**form_data)

        if not search_form.validate():
            result = qry.offset(form_data['start']).limit(
                form_data['length']).all()
            total_record = qry.count()
            return self.process_data(result, form_data, total_record)

        kisi_ad = search_form.kisi_ad.data
        kisi_soyad = search_form.kisi_soyad.data

        if kisi_ad:
            qry = qry.filter(Person.ad.ilike('%' + kisi_ad + '%'))

        if kisi_soyad:
            qry = qry.filter(Person.soyad.ilike('%' + kisi_soyad + '%'))

        result = qry.offset(form_data['start']).limit(
            form_data['length']).all()

        return self.process_data(result, form_data, total_record)
class SatinAlinanMalzemelerView(FlaskView):
    """Bap Satinalma Satınalınan Malzemeler view class"""

    excluded_methods = [
        "qry"
    ]

    @property
    def qry(self):
        """
        ilgili alanlari icin query nesnesi olustur.
        Returns:
        """
        return DB.session.query(SiparisTakip). \
            join(TalepKalemleri, TalepKalemleri.id == SiparisTakip.satinalma_talep_kalemleri_id). \
            join(FirmaTeklifKalemi, FirmaTeklifKalemi.id == SiparisTakip.kazanan_firma_teklif_id). \
            join(FirmaSatinalmaTeklif, FirmaSatinalmaTeklif.id == FirmaTeklifKalemi.teklif_id). \
            join(BapFirma, BapFirma.id == FirmaSatinalmaTeklif.firma_id). \
            join(ProjeKalemi, ProjeKalemi.id == TalepKalemleri.proje_kalemi_id). \
            join(ProjeSatinAlmaTalebi, TalepKalemleri.satinalma_id == ProjeSatinAlmaTalebi.id). \
            join(Proje, Proje.id == ProjeSatinAlmaTalebi.proje_id). \
            join(OgretimElemani, Proje.yurutucu == OgretimElemani.id). \
            join(Personel, OgretimElemani.personel_id == Personel.id). \
            join(Person, Person.id == Personel.person_id). \
            join(HitapUnvan, Personel.unvan == HitapUnvan.id). \
            add_columns(
            ProjeKalemi.ad.label("malzeme_adi"),
            SiparisTakip.siparis_numarasi.label("siparis_numarasi"),
            Proje.proje_no.label("proje_no"),
            Person.ad.label("yurutucu_ad"),
            Person.ad.label("yurutucu_soyad"),
            HitapUnvan.ad.label("yurutucu_unvan"),
            SiparisTakip.kabul_tarihi.label("siparis_kabul_tarihi"),
            TalepKalemleri.talep_miktari.label("talep_miktari"),
            FirmaTeklifKalemi.teklif.label("toplam_fiyati"),
            ProjeKalemi.birim.label("birim"),
            TalepKalemleri.satinalma_id.label("satinalma_id"),
            BapFirma.adi.label("firma_adi")). \
            filter(SiparisTakip.siparis_durumu == SiparisDurumu.siparis_tamamlandi)

    def process_data(self, result, form_data, total_record):
        data = [[
            index + 1,
            r.malzeme_adi,
            r.siparis_numarasi,
            r.firma_adi,
            r.proje_no,
            "{} {} {}".format(r.yurutucu_unvan, r.yurutucu_ad, r.yurutucu_soyad),
            "{}".format(r.siparis_kabul_tarihi.strftime(current_app.config['DATE_FORMAT'])),
            "{} {}".format(r.talep_miktari, r.birim),
            format_currency(r.toplam_fiyati, 'TL', '#,##0.00 ¤¤¤', locale='tr_TR') if r.toplam_fiyati else "-",
            """
            <a class="detail_arrow" href="{}"><span class="fa fa-arrow-circle-right fa-2x "></span>
                </a>
                """.format(url_for('satinalma.satinalma_dashboard', satinalma_id=r.satinalma_id))

        ] for index, r in enumerate(result)]

        return jsonify({"data": data,
                        "draw": form_data['draw'],
                        "recordsFiltered": total_record,
                        "recordsTotal": total_record})

    @login_required
    @auth.requires(Permission(*permission_dict["bap"]["satinalma"]["satınalinan_malzemeler_listesi_goruntuleme"]),
                   menu_registry={"path": ".bap.satinalma.satin_alinan_malzemeler",
                                  "title": _("Malzeme Arama")})
    @route('/liste', methods=['GET'])
    def satinalinan_malzemeler_listele(self):
        search_form = SatinalinanMalzemelerSearchForm()
        return render_template("satinalinan_malzemeler.html", form=search_form)

    @login_required
    @auth.requires(Or(Permission(*permission_dict["bap"]["satinalma"]["satınalinan_malzemeler_listesi_goruntuleme"])),
                   Or(Role("BAP Admin"), Role("BAP Yetkilisi")))
    @route('/data', methods=["POST"], endpoint="satinalinan_malzeme_search")
    def satinalinan_malzeme_ara(self):  # pylint: disable=too-many-branches
        """
         POST ile gelen parametrelere gore arama yapip, sonuclari dondurur.
        Returns:
            http response
        """

        qry = self.qry
        total_record = qry.count()
        form_data = request.form.to_dict()
        search_form = SatinalinanMalzemelerSearchForm(**form_data)

        if not search_form.validate():
            result = qry.order_by(desc(SiparisTakip.kabul_tarihi)).offset(form_data['start']).limit(
                form_data['length']).all()
            return self.process_data(result, form_data, total_record)

        malzeme_adi = search_form.malzeme_adi.data
        siparis_no = search_form.siparis_no.data
        proje_no = search_form.proje_no.data
        yurutucu = search_form.yurutucu.data
        siparis_kabul_tarihi = search_form.date.siparis_kabul_tarihi.data
        siparis_kabul_tarihi_option = search_form.date.siparis_kabul_tarihi_option.data
        talep_miktari = search_form.talep_miktari.data
        toplam_fiyati = search_form.toplam_fiyati.data
        toplam_fiyati_option = search_form.toplam_fiyati_option.data
        firma_adi = search_form.firma_adi.data

        if malzeme_adi:
            qry = qry.filter(ProjeKalemi.ad.ilike('%' + malzeme_adi + '%'))
        if siparis_no:
            qry = qry.filter(SiparisTakip.siparis_numarasi.ilike('%' + siparis_no + '%'))
        if proje_no:
            qry = qry.filter(Proje.proje_no.ilike('%' + proje_no + '%'))
        if yurutucu:
            qry = qry.filter(Person.ad.ilike('%' + yurutucu + '%'))
        if firma_adi:
            qry = qry.filter(BapFirma.adi.ilike('%' + firma_adi + '%'))

        if siparis_kabul_tarihi:
            if siparis_kabul_tarihi_option == '0':
                qry = qry.filter(SiparisTakip.kabul_tarihi >= siparis_kabul_tarihi)
            if siparis_kabul_tarihi_option == '1':
                qry = qry.filter(SiparisTakip.kabul_tarihi == siparis_kabul_tarihi)
            if siparis_kabul_tarihi_option == '2':
                qry = qry.filter(SiparisTakip.kabul_tarihi <= siparis_kabul_tarihi)

        if talep_miktari:
            if toplam_fiyati_option == '0':
                qry = qry.filter(TalepKalemleri.talep_miktari <= talep_miktari)
            if toplam_fiyati_option == '1':
                qry = qry.filter(TalepKalemleri.talep_miktari == talep_miktari)
            if toplam_fiyati_option == '2':
                qry = qry.filter(TalepKalemleri.talep_miktari >= talep_miktari)

            qry = qry.filter(TalepKalemleri.talep_miktari == talep_miktari)

        if toplam_fiyati:
            if toplam_fiyati_option == '0':
                qry = qry.filter(FirmaTeklifKalemi.teklif <= toplam_fiyati)
            if toplam_fiyati_option == '1':
                qry = qry.filter(FirmaTeklifKalemi.teklif == toplam_fiyati)
            if toplam_fiyati_option == '2':
                qry = qry.filter(FirmaTeklifKalemi.teklif >= toplam_fiyati)

        result = qry.order_by(desc(ProjeSatinAlmaTalebi.id)).offset(form_data['start']).limit(form_data['length']).all()

        return self.process_data(result, form_data, total_record)
示例#25
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})
示例#26
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))
示例#27
0
class BapYetkilisiDashboardView(FlaskView):
    """
    Proje Yurutucu Dashboard view methodlarini icerir
    """
    @staticmethod
    @login_required
    @route("/bap-yetkilisi-kontrol-paneli", methods=["GET"])
    @auth.requires(Or(Role("BAP Yetkilisi"), Role("BAP Admin")),
                   menu_registry={
                       'path': '.bap_yetkilisi_dashboard',
                       'title': _("Kontrol Paneli")
                   })
    def index():
        """Bap yetkilisi dashboard genel bilgiler"""

        personel_sayi = DB.session.query(
            Personel.id).filter(Personel.personel_turu == "akademik").count()
        hakemler = DB.session.query(Hakem).all()
        projeler = DB.session.query(Proje).filter(
            or_(
                Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi,
                Proje.proje_basvuru_durumu ==
                ProjeBasvuruDurumu.revizyon_bekleniyor)).all()
        devam_etmeyen_proje_sayi = 0
        toplam_butce = DB.session.query(
            func.sum(GelirKasasi.toplam_para).label("toplam_butce"),
            func.sum(GelirKasasi.harcanan_para).label("harcanan_para"),
            func.sum(GelirKasasi.rezerv_para).label("rezerv_para"),
            GelirKasasi.adi.label("kasa_adi"),
            GelirKasasi.toplam_para.label("toplam_para")).filter(
                GelirKasasi.mali_yil == datetime.date.today().year).group_by(
                    GelirKasasi.toplam_para, GelirKasasi.adi,
                    GelirKasasi.harcanan_para, GelirKasasi.rezerv_para).all()
        butce_toplami = 0
        butce_kasalari = {}
        harcanan_para = 0
        rezerv_para = 0
        for butce in toplam_butce:
            butce_toplami += butce.toplam_butce.quantize(Decimal(".01"))
            harcanan_para += butce.harcanan_para.quantize(Decimal(".01"))
            rezerv_para += butce.rezerv_para.quantize(Decimal(".01"))

        butce_harcamalari = {
            "Toplam Bütçe": butce_toplami,
            "Harcanan": harcanan_para,
            "Rezerv": rezerv_para
        }

        proje_butce = 0
        proje_degerlendirmeleri = {
            "Olumlu": 0,
            "Olumsuz": 0,
            "Revizyon gerekli": 0,
            "Değerlendirilmedi": 0,
        }
        hakem_sayi = {"Kurum içi": 0, "Kurum dışı": 0}
        for hakem in hakemler:
            if hakem.kurum_ici:
                hakem_sayi["Kurum içi"] += 1
            else:
                hakem_sayi["Kurum dışı"] += 1
        for proje in projeler:
            if proje.proje_durumu.current_app_state == AppStates.son:
                devam_etmeyen_proje_sayi += 1

            for rapor in proje.proje_raporlari:
                if rapor.rapor_degerlendirme_durumu:
                    if rapor.rapor_degerlendirme_durumu == ProjeDegerlendirmeSonuc.olumlu:
                        proje_degerlendirmeleri["Olumlu"] += 1
                    elif rapor.rapor_degerlendirme_durumu == ProjeDegerlendirmeSonuc.olumsuz:
                        proje_degerlendirmeleri["Olumsuz"] += 1
                    elif rapor.rapor_degerlendirme_durumu == ProjeDegerlendirmeSonuc.revizyon:
                        proje_degerlendirmeleri["Revizyon gerekli"] += 1
                    elif rapor.rapor_degerlendirme_durumu == ProjeDegerlendirmeSonuc.degerlendirilmedi:
                        proje_degerlendirmeleri["Değerlendirilmedi"] += 1

            proje_butce += proje.kabul_edilen_butce if proje.kabul_edilen_butce else 0

        proje_sayi = {
            'Devam Eden': len(projeler) - devam_etmeyen_proje_sayi,
            'Devam Etmeyen': devam_etmeyen_proje_sayi
        }

        for butce in toplam_butce:
            toplam_para = butce.toplam_para.quantize(Decimal(".01"))
            butce_kasalari.update({butce.kasa_adi: toplam_para})

        return render_template('bap_yetkilisi_dashboard.html',
                               hakem_sayi=hakem_sayi,
                               butce_toplami=butce_toplami,
                               proje_sayi=proje_sayi,
                               proje_degerlendirmeleri=proje_degerlendirmeleri,
                               proje_butce=proje_butce,
                               personel_sayi=personel_sayi,
                               butce_kasalari=butce_kasalari,
                               butce_harcamalari=butce_harcamalari)

    @staticmethod
    @login_required
    @route("/rektor-kokpiti", methods=["GET"])
    @auth.requires(Role("Rektör"))
    def rektor_kokpiti():

        return render_template('rektor_kokpiti.html')