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