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)
def use_permission(): with Permission( Or( HasLevel(AuthLevels.admin), HasLevel(AuthLevels.staff), And(HasLevel(AuthLevels.user), HasPermission("promote")), )): pass return "thumbs up"
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 SatinalmaIslemGecmisiListesiView(FlaskView): """ Satinalma islem gecmisini listeleyen view """ @login_required @auth.requires( Or(Permission(*permission_dict["bap"]["satinalma"]["satinalma_islem_gecmisi_goruntuleme"]), RoleReq('BAP Yetkilisi'), RoleReq("BAP Admin"))) @route('/<int:satinalma_id>/islem-gecmisi', methods=['GET'], endpoint='satinalma_islem_gecmisi_listele') def satinalma_islem_gecmisi(self, satinalma_id): """ Satinalma islem gecmisine ulasmak icin kullanilir :param satinalma_id: satinalma_id(int) :return: http response """ params = {"satinalma_id": satinalma_id} try: 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() islem_listesi = DB.session.query(AppStateTracker). \ filter(AppStateTracker.params.contains(params), or_(AppStateTracker.job_type == JobTypes.satinalma_state_change, AppStateTracker.job_type == JobTypes.satinalma_action)). \ 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("person_ad"), Person.soyad.label("person_soyad"), ).all() except Exception as exc: CustomErrorHandler.error_handler( hata="Satinalma işlem geçmişi görüntülenirken hata oluştu." "Hata: {}, Satinalma id: {}".format(satinalma_id, exc) ) return abort(500) return render_template("satinalma_dashboard/satinalma_yapilan_islemler.html", islem_listesi=islem_listesi, satinalma=satinalma, satinalma_id=satinalma_id, proje=proje, actions_info=actions_info, states_info=states_info)
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 MuhasebeFisleriView(FlaskView): """Bap Bütçe Kodları view classi""" @staticmethod @login_required @route('/liste', methods=['GET']) @auth.requires(Permission( *permission_dict["bap"]["butce"]["muhasebe_fisleri_goruntuleme"]), menu_registry={ "path": ".bap.butce.muhasebe_fisleri", "title": _("Muhasebe Fişleri") }) def butce_kodlari_goruntuleme_listele(): # todo: monkey patch !!! # todo: server side yapilacak muhasebe_fisleri = DB.session.query(MuhasebeFisi).all() return render_template("muhasebe_fisleri_listeleme.html", muhasebe_fisleri=muhasebe_fisleri) @login_required @auth.requires( Permission( *permission_dict["bap"]["butce"]["muhasebe_fisleri_goruntuleme"]), Or(RoleReq('BAP Yetkilisi'), RoleReq("BAP Admin"))) @route('/muhasebe-fisi/<int:muhasebe_fis_id>', methods=['GET']) def get_odeme_emri(self, muhasebe_fis_id): """ Odeme emri sablonunu ilgili muhasebe fisi alanlari ile render edip kullaniciya doner """ try: muhasebe_fisi_data = BapQueryHelpers.get_muhasebe_fisi_bilgileri( muhasebe_fis_id) # sablon tipi id 49 --> Ödeme Emri Şablonu odeme_emri_sablonu = DB.session.query(Sablon).filter( Sablon.sablon_tipi_id == 49, Sablon.kullanilabilir_mi == True).order_by( desc(Sablon.updated_at)).first() muhasebe_fisi = DB.session.query(MuhasebeFisi).filter( MuhasebeFisi.id == muhasebe_fis_id).first() muhasebe_fisi.odeme_emri_tamamlandi = True DB.session.commit() return render_template_string(odeme_emri_sablonu.sablon_text, data=muhasebe_fisi_data) except Exception as exc: DB.session.rollback() CustomErrorHandler.error_handler( hata="Muhasebe fişi ödeme emrine çevrilirken bir hata " "oluştu.Hata: {}, Muhasebe Fisi id: {}".format( muhasebe_fis_id, exc)) return abort(500)
def can_post_reply(user, topic=None): kwargs = {} if isinstance(topic, int): kwargs["topic_id"] = topic elif isinstance(topic, Topic): kwargs["topic"] = topic return Permission( Or( IsAtleastSuperModerator, IsModeratorInForum(), And(Has("postreply"), TopicNotLocked(**kwargs)), ), identity=user, )
def can_post_topic(user, forum): kwargs = {} if isinstance(forum, int): kwargs["forum_id"] = forum elif isinstance(forum, Forum): kwargs["forum"] = forum return Permission( Or( IsAtleastSuperModerator, IsModeratorInForum(**kwargs), And(Has("posttopic"), ForumNotLocked(**kwargs)), ), identity=user, )
def can_delete_topic(user, topic=None): kwargs = {} if isinstance(topic, int): kwargs["topic_id"] = topic elif isinstance(topic, Topic): kwargs["topic"] = topic return Permission( Or( IsAtleastSuperModerator, And(IsModeratorInForum(), Has("deletetopic")), And(IsSameUser(), Has("deletetopic"), TopicNotLocked(**kwargs)), ), identity=user, )
def can_edit_post(user, topic_or_post=None): kwargs = {} if isinstance(topic_or_post, int): kwargs["topic_id"] = topic_or_post elif isinstance(topic_or_post, Topic): kwargs["topic"] = topic_or_post elif isinstance(topic_or_post, Post): kwargs["post"] = topic_or_post return Permission( Or( IsAtleastSuperModerator, And(IsModeratorInForum(), Has("editpost")), And( IsSameUser(topic_or_post), Has("editpost"), TopicNotLocked(**kwargs), ), ), identity=user, )
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)
def test_OrConditional_shortcircuit(always, never, member, request): cond = Or(always, never) cond.fulfill(member, request) assert not never.called
class SatinalmaMuhasebeFisleri(FlaskView): """ Satinalma muhasebe fisi islemleri """ def get_siparis_with_firma_and_talep_kalemleri(self, siparis_id): """ id si verilen siparisin faturası teslim alındı ise satınalma talep kalemleri ve firma ile birlikte getirir :param siparis_id: siparis id :return: SiparisTakip instance """ siparis = DB.session.query(SiparisTakip).options( joinedload(SiparisTakip.satinalma_talep_kalemleri), joinedload(SiparisTakip.kazanan_firma_teklif).joinedload( FirmaTeklifKalemi.satinalma_teklif).joinedload( FirmaSatinalmaTeklif.firma) ).filter( SiparisTakip.siparis_durumu == SiparisDurumu.fatura_teslim_alindi, SiparisTakip.id == siparis_id ).first() return siparis def get_proje_for_muhasebe_fisi(self, proje_id): """ "proje_id" li projeyi proje yurutucusu fakultesi ve bolumu join edilmis sekilde getirir :param proje_id: satinalma proje id :return: Proje model instance """ proje = DB.session.query(Proje).options( joinedload(Proje.proje_yurutucu), joinedload(Proje.fakulte), joinedload(Proje.bolum), joinedload(Proje.gelir_kasasi) ).filter(Proje.id == proje_id).first() return proje @login_required @auth.requires( Or(Permission(*permission_dict["bap"]["satinalma"]["satinalma_muhasebe_fisi_goruntule"]), RoleReq('BAP Yetkilisi'), RoleReq("BAP Admin"))) @route('/<int:satinalma_id>/muhase-fisleri', methods=['GET']) def muhasebe_fisleri(self, satinalma_id): """ muhasebe fislerini listeleyen view methodu :param satinalma_id: ilgili satinalma id """ try: 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() satinalma_talep_kalemleri_ids = [talep_kalemi.id for talep_kalemi in satinalma.talep_kalemleri] satinalma_muhasebe_fisleri = DB.session.query(MuhasebeFisi).filter( MuhasebeFisi.satinalma_talep_id == satinalma_id ).all() satinalma_siparisleri = DB.session.query(SiparisTakip).options( joinedload(SiparisTakip.satinalma_talep_kalemleri), joinedload(SiparisTakip.kazanan_firma_teklif).joinedload( FirmaTeklifKalemi.satinalma_teklif).joinedload( FirmaSatinalmaTeklif.firma) ).filter( SiparisTakip.satinalma_talep_kalemleri_id.in_(satinalma_talep_kalemleri_ids), SiparisTakip.siparis_durumu == SiparisDurumu.fatura_teslim_alindi ).all() siparis_data = [] for siparis in satinalma_siparisleri: kdv_dahil_fiyat = kdv_dahil_fiyat_hesabi(siparis.kazanan_firma_teklif.teklif, siparis.kazanan_firma_teklif.kdv_orani) if not siparis.satinalma_talep_kalemleri.muhasebe_fis_id: siparis_data.append({ "siparis_id": siparis.id, "proje_kalemi": siparis.satinalma_talep_kalemleri.proje_kalemi.ad, "miktar": siparis.satinalma_talep_kalemleri.talep_miktari, "birim": siparis.satinalma_talep_kalemleri.proje_kalemi.birim.value, "kdv_dahil_tutar": kdv_dahil_fiyat, "tutar": siparis.kazanan_firma_teklif.teklif, "siparis_numarasi": siparis.siparis_numarasi, "firma_adi": siparis.kazanan_firma_teklif.satinalma_teklif.firma.adi, "kabul_tarihi": siparis.kabul_tarihi }) muhasebe_information_form = MuhasebeFisiListelemeInformation() except Exception as exc: CustomErrorHandler.error_handler(hata="Satinalma muhasebe fişi listesi görüntülenirken " "hata oluştu.Hata: {}, Satinalma id: {}".format( satinalma_id, exc) ) return abort(500) return render_template("satinalma_dashboard/muhasebe_fisleri.html", muhasebe_information_form=muhasebe_information_form, muhesabe_fisleri=satinalma_muhasebe_fisleri, satinalma_siparisleri=siparis_data, satinalma=satinalma, satinalma_id=satinalma_id, proje=proje, actions_info=actions_info, states_info=states_info) @login_required @auth.requires( Or(Permission(*permission_dict["bap"]["satinalma"]["satinalma_muhasebe_fisi_olustur"]), RoleReq('BAP Yetkilisi'), RoleReq("BAP Admin"))) @route('/<int:satinalma_id>/siparis/<int:siparis_id>/muhase-fisi-olustur', methods=['GET']) def muhasebe_fisi_olustur_get(self, satinalma_id, siparis_id): """ Muhasebe fisi olusturma ekrani :param satinalma_id: ilgili satinalma id :param firma_id: muhasebe fisinin kesilecegi firma id """ try: universite_id = SessionHandler.universite_id() satinalma = get_satinalma_with_related_fields(satinalma_id=satinalma_id) proje = self.get_proje_for_muhasebe_fisi(satinalma.proje_id) siparis = self.get_siparis_with_firma_and_talep_kalemleri(siparis_id) if not siparis: flash(_("Böyle bir sipariş bulunamadı"), category="error") return redirect(url_for("satinalma.SatinalmaMuhasebeFisleri:muhasebe_fisleri", satinalma_id=satinalma_id)) if siparis.satinalma_talep_kalemleri.muhasebe_fis_id: flash(_("Bu sipariş için daha önce muhasebe fişi oluşturdunuz."), category="error") return redirect(url_for("satinalma.SatinalmaMuhasebeFisleri:muhasebe_fisleri", satinalma_id=satinalma_id)) proje_bilgiler_data = self.get_proje_bilgileri(proje) genel_ayarlar = DB.session.query(GenelAyarlar).filter_by(universite_id=universite_id, aktif_mi=True).first() firma_bilgileri = siparis.kazanan_firma_teklif.satinalma_teklif.firma kisi_bilgileri = self.get_kisi_bilgiler(firma_bilgileri) kdv_dahil_alacak = kdv_dahil_fiyat_hesabi(siparis.kazanan_firma_teklif.teklif, siparis.kazanan_firma_teklif.kdv_orani) proje_kalemi = siparis.satinalma_talep_kalemleri.proje_kalemi proje_kalemi_data = self.get_proje_kalemi_data(proje_kalemi, kdv_dahil_alacak) fatura_bilgisi_data = self.get_fatura_bilgileri(siparis) muhasebe_fis_formu = self.init_muhasebe_fisi_form(genel_ayarlar, kisi_bilgileri, kdv_dahil_alacak, proje, fatura_bilgisi_data) # simdiki yil ve siparis id birlesiminden belge numarasi uretir belge_numarasi = "{}{}".format(date.today().year, siparis.id) muhasebe_fis_formu.fis_genel_bilgileri.belge_numarasi.data = belge_numarasi except Exception as exc: CustomErrorHandler.error_handler(hata="Satinalma muhasebe fişi listesi görüntülenirken " "hata oluştu.Hata: {}, Satinalma id: {}".format( satinalma_id, exc) ) return abort(500) return render_template("satinalma_dashboard/muhasebe_fisi_olustur.html", muhasebe_fis_formu=muhasebe_fis_formu, proje_bilgileri=proje_bilgiler_data, proje_kalemi_data=proje_kalemi_data, satinalma=satinalma, satinalma_id=satinalma_id, siparis_id=siparis_id) @login_required @auth.requires( Or(Permission(*permission_dict["bap"]["satinalma"]["satinalma_muhasebe_fisi_olustur"]), RoleReq('BAP Yetkilisi'), RoleReq("BAP Admin"))) @route('/<int:satinalma_id>/siparis/<int:siparis_id>/muhase-fisi-olustur', methods=['POST']) def muhasebe_fisi_olustur_post(self, satinalma_id, siparis_id): """ Muhasebe fisi olusturma kaydeden view methodu :param satinalma_id: ilgili satinalma id :param siparis_id: muhasebe fisinin kesilecegi siparis id """ # todo: kasa bilgileri gosterilecek! try: universite_id = SessionHandler.universite_id() satinalma = get_satinalma_with_related_fields(satinalma_id=satinalma_id) proje = self.get_proje_for_muhasebe_fisi(satinalma.proje_id) proje_bilgiler_data = self.get_proje_bilgileri(proje) genel_ayarlar = DB.session.query(GenelAyarlar).filter_by(universite_id=universite_id, aktif_mi=True).first() fonksiyonel_kod_choices = self.get_fonksiyonel_kod_choices( genel_ayarlar.bap_butce.get("fonksiyonel_kodlar", None) ) siparis = self.get_siparis_with_firma_and_talep_kalemleri(siparis_id) kdv_dahil_tutar = kdv_dahil_fiyat_hesabi(siparis.kazanan_firma_teklif.teklif, siparis.kazanan_firma_teklif.kdv_orani) proje_kalemi = siparis.satinalma_talep_kalemleri.proje_kalemi proje_kalemi_data = self.get_proje_kalemi_data(proje_kalemi, kdv_dahil_tutar) muhasebe_fis_formu = MuhasebeFisiForm(request.form) for fis_maddesi in muhasebe_fis_formu.fis_maddeleri: fis_maddesi.fonksiyonel_kod.choices = fonksiyonel_kod_choices if not muhasebe_fis_formu.validate(): return render_template("satinalma_dashboard/muhasebe_fisi_olustur.html", muhasebe_fis_formu=muhasebe_fis_formu, proje_bilgileri=proje_bilgiler_data, proje_kalemi_data=proje_kalemi_data, satinalma=satinalma, satinalma_id=satinalma_id, siparis_id=siparis_id) # belge numarasinin daha once atanmis olma durumu kontrol edilir belge_numarasi_exist = DB.session.query(exists().where( MuhasebeFisi.muhasebe_fis_no == muhasebe_fis_formu.fis_genel_bilgileri.belge_numarasi.data)).scalar() if belge_numarasi_exist: oneri_belge_numarasi = "{}{}".format(date.today().year, siparis_id) hata_mesaji = "Muhasebe fişi belge numarası kullanılmaktadır. (Öneri belge " \ "numarası {})".format(oneri_belge_numarasi) muhasebe_fis_formu.fis_genel_bilgileri.belge_numarasi.errors.append(hata_mesaji) return render_template("satinalma_dashboard/muhasebe_fisi_olustur.html", muhasebe_fis_formu=muhasebe_fis_formu, proje_bilgileri=proje_bilgiler_data, proje_kalemi_data=proje_kalemi_data, satinalma=satinalma, satinalma_id=satinalma_id, siparis_id=siparis_id) proje_kalemi = siparis.satinalma_talep_kalemleri.proje_kalemi talep_edilen_miktar = siparis.satinalma_talep_kalemleri.talep_miktari # firma teklifi kabul edildigi zaman firmanin teklifinin kdv dahil tutari rezerv # butce olarak proje kalemine eklenmisti. Muhasebe fisi olusturuldugu anda rezerv # edilen para kullanilan paraya aktarilir proje_kalemi.rezerv_butce = proje_kalemi.rezerv_butce - kdv_dahil_tutar proje_kalemi.kullanilan_butce = proje_kalemi.kullanilan_butce + kdv_dahil_tutar # proje yurutucusu satinalma talebi yaptigi anda talep edilen miktar rezerv edilmisti # Muhasebe fisi olusturuldugu anda rezerv miktar kullanilan miktara aktarilir proje_kalemi.rezerv_edilen_miktar = proje_kalemi.rezerv_edilen_miktar - talep_edilen_miktar proje_kalemi.kullanilan_miktar = proje_kalemi.kullanilan_miktar + talep_edilen_miktar proje_bilgileri_data = self.get_proje_bilgileri(proje) yeni_muhasebe_fisi = self.muhasebe_fisi_kaydet( muhasebe_fis_formu, proje_bilgileri_data["proje_no"], proje_bilgileri_data["proje_yurutucu_ad_soyad"], satinalma_id=satinalma_id, fis_tutari=kdv_dahil_tutar ) DB.session.add(yeni_muhasebe_fisi) DB.session.flush() self.muhasebe_fis_maddesi_kaydet(muhasebe_fis_formu.fis_maddeleri, yeni_muhasebe_fisi.id) siparis.satinalma_talep_kalemleri.muhasebe_fis_id = yeni_muhasebe_fisi.id siparis.siparis_durumu = SiparisDurumu.siparis_tamamlandi projenin_bagli_oldugu_kasa = proje.gelir_kasasi projenin_bagli_oldugu_kasa.rezerv_para -= kdv_dahil_tutar projenin_bagli_oldugu_kasa.harcanan_para += kdv_dahil_tutar signal_payload = { "message_type": USER_ACTIVITY_MESSAGES.get("bap").get("muhasebe_fisi_olusturuldu").type_index, "nesne": 'Proje', "nesne_id": proje.id, "ekstra_mesaj": "{} isimli kullanıcı {} id'li projenin {} id'li proje kaleminde " "yapilan satınalma sonucu {} id 'li {} TL tutarında muhasebe fişi " "oluşturdu".format( current_user.username, proje.id, proje_kalemi.id, yeni_muhasebe_fisi.id, kdv_dahil_tutar ) } signal_sender(**signal_payload) DB.session.commit() flash(_("Muhasebe fişi başarıyla oluşturulmuştur."), category="success") return redirect(url_for("satinalma.SatinalmaMuhasebeFisleri:muhasebe_fisleri", satinalma_id=satinalma_id)) except Exception as exc: DB.session.rollback() CustomErrorHandler.error_handler(hata="Satinalma muhasebe fişi listesi görüntülenirken " "hata oluştu.Hata: {}, Satinalma id: {}".format( satinalma_id, exc) ) return abort(500) @login_required @auth.requires( Or(Permission(*permission_dict["bap"]["satinalma"]["satinalma_muhasebe_fisi_olustur"]), RoleReq('BAP Yetkilisi'), RoleReq("BAP Admin"))) @route('/<int:satinalma_id>/muhasebe-fisi/<int:muhasebe_fis_id>', methods=['GET']) def get_odeme_emri_sablonu(self, satinalma_id, muhasebe_fis_id): """ Odeme emri sablonunu ilgili muhasebe fisi alanlari ile render edip kullaniciya doner """ try: muhasebe_fisi_data = BapQueryHelpers.get_muhasebe_fisi_bilgileri(muhasebe_fis_id) # sablon tipi id 49 --> Ödeme Emri Şablonu odeme_emri_sablonu = DB.session.query(Sablon).filter( Sablon.sablon_tipi_id == 49, Sablon.kullanilabilir_mi == True ).order_by(desc(Sablon.updated_at)).first() muhasebe_fisi = DB.session.query(MuhasebeFisi).filter( MuhasebeFisi.id == muhasebe_fis_id).first() muhasebe_fisi.odeme_emri_tamamlandi = True DB.session.commit() return render_template_string(odeme_emri_sablonu.sablon_text, data=muhasebe_fisi_data) except Exception as exc: DB.session.rollback() CustomErrorHandler.error_handler(hata="Muhasebe fişi ödeme emrine çevrilirken bir hata " "oluştu.Hata: {}, Satinalma id: {}, " "Muhasebe Fisi id: {}".format( satinalma_id, muhasebe_fis_id, exc) ) return abort(500) def get_kisi_bilgiler(self, firma_bilgileri): """ Firma bilgilerinden muhasebe fisi formu icin uygun formatta kisi bilgileri olusturur :param firma_bilgileri: :return: """ kisi_bilgileri = { "adi_soyadi": "{} {} - {}".format( firma_bilgileri.yetkili_adi, firma_bilgileri.yetkili_adi, firma_bilgileri.adi ), "banka_sube": firma_bilgileri.banka_sube_adi, "vergi_no": firma_bilgileri.vergi_kimlik_numarasi, "hesap_no": firma_bilgileri.iban, "vergi_dairesi_id": firma_bilgileri.vergi_dairesi_id, } return kisi_bilgileri def get_fatura_bilgileri(self, siparis): """ Siparis fatura bilgilerinden muhasebe formu icin uygun formatta data olusturur :param siparis: Siparis model instance :return: """ fatura_bilgileri = { "fatura_no": siparis.fatura_no, "fatura_tarihi": siparis.fatura_tarihi, } return fatura_bilgileri def get_proje_bilgileri(self, proje): """ proje model instancendan proje bilgileri dict olusturur :param proje: Proje model instance :return: dict """ proje_bilgiler_data = { "proje_no": proje.proje_no, "proje_adi": proje.proje_basligi, "proje_yurutucu_ad_soyad": "{} {} {}".format( proje.proje_yurutucu.hitap_unvan.ad, proje.proje_yurutucu.personel.person.ad, proje.proje_yurutucu.personel.person.soyad), "proje_fakulte": proje.fakulte.ad, "proje_bolum": proje.bolum.ad, } return proje_bilgiler_data def init_muhasebe_fisi_form(self, genel_ayarlar, kisi_bilgileri, kdv_dahil_alacak, proje, fatura_bilgisi): """ :param genel_ayarlar: uygulama genel ayarlari :param kisi_bilgileri: muhasebe fisinin kesilecegi kisi :param kdv_dahil_alacak: firmanin teklifi ve kdv oranindan olusan kdv dahil alacak :return: MuhasebeFisiForm """ kurumsal_kod = "" genel_ayarlar_butce = {} fonksiyonel_kod_choices = [] if genel_ayarlar: genel_ayarlar_butce.update(genel_ayarlar.bap_butce) kurumsal_kod = genel_ayarlar_butce.get("kurum_kodu", "") fonksiyonel_kod_choices = self.get_fonksiyonel_kod_choices( genel_ayarlar_butce.get("fonksiyonel_kodlar", None) ) genel_ayarlar_butce.update( {"fakulte_bolum": "{}/{}".format(proje.fakulte.ad, proje.bolum.ad)}) muhasebe_fis_formu = MuhasebeFisiForm(fis_genel_bilgileri=genel_ayarlar_butce, odeme_yapilacak_kisi_bilgileri=kisi_bilgileri, fatura_bilgileri=fatura_bilgisi) for index, fis_maddesi in enumerate(muhasebe_fis_formu.fis_maddeleri, start=0): fis_maddesi.kurumsal_kod.data = kurumsal_kod fis_maddesi.fonksiyonel_kod.choices = fonksiyonel_kod_choices fis_maddesi.fonksiyonel_kod.default = fonksiyonel_kod_choices[0] if index % 2 == 0: fis_maddesi.borc.data = kdv_dahil_alacak fis_maddesi.alacak.data = Decimal("0.00") else: fis_maddesi.borc.data = Decimal("0.00") fis_maddesi.alacak.data = kdv_dahil_alacak return muhasebe_fis_formu def get_fonksiyonel_kod_choices(self, fonksiyonel_kodlar): """ genel ayarlari kaydedilmis fonksiyonel kodlari alip muhasebe fisi maddelerinde kullanmak üzere list of tuple a cevirir :param fonksiyonel_kodlar: List of dict :return: List of tuple """ fonksiyonel_kod_choices = [] for fonksiyonel_kod in fonksiyonel_kodlar: fonksiyonel_kod_choices.append((fonksiyonel_kod.get("kod"), fonksiyonel_kod.get("kod"))) return fonksiyonel_kod_choices def muhasebe_fisi_kaydet(self, muhasebe_fisi_formu, proje_no, yurutucu_ad_soyad, satinalma_id, fis_tutari): vergi_dairesi = DB.session.query(VergiDairesi).filter( VergiDairesi.id == muhasebe_fisi_formu.odeme_yapilacak_kisi_bilgileri.vergi_dairesi_id.data).first() yeni_muhasebe_fisi = MuhasebeFisi( satinalma_talep_id=satinalma_id, muhasebe_fis_no=muhasebe_fisi_formu.fis_genel_bilgileri.belge_numarasi.data, muhasebe_fis_tarihi=muhasebe_fisi_formu.fis_genel_bilgileri.belge_tarihi.data, butce_yili=muhasebe_fisi_formu.fis_genel_bilgileri.yil.data, kurum_adi=muhasebe_fisi_formu.fis_genel_bilgileri.kurum_adi.data, kurum_kodu=muhasebe_fisi_formu.fis_genel_bilgileri.kurum_kodu.data, birim_adi=muhasebe_fisi_formu.fis_genel_bilgileri.birim_adi.data, birim_kodu=muhasebe_fisi_formu.fis_genel_bilgileri.birim_kodu.data, muhasebe_birim_adi=muhasebe_fisi_formu.fis_genel_bilgileri.muhasebe_birimi_adi.data, muhasebe_birim_kodu=muhasebe_fisi_formu.fis_genel_bilgileri.muhasebe_birimi_kodu.data, proje_no=proje_no, proje_yurutucusu=yurutucu_ad_soyad, fakulte_bolum=muhasebe_fisi_formu.fis_genel_bilgileri.fakulte_bolum.data, ad_soyad=muhasebe_fisi_formu.odeme_yapilacak_kisi_bilgileri.adi_soyadi.data, vergi_kimlik_no=muhasebe_fisi_formu.odeme_yapilacak_kisi_bilgileri.vergi_no.data, banka_sube=muhasebe_fisi_formu.odeme_yapilacak_kisi_bilgileri.banka_sube.data, banka_iban=muhasebe_fisi_formu.odeme_yapilacak_kisi_bilgileri.hesap_no.data, bagli_oldugu_vergi_dairesi=vergi_dairesi.adi, fatura_no=muhasebe_fisi_formu.fatura_bilgileri.fatura_no.data, fatura_tarihi=muhasebe_fisi_formu.fatura_bilgileri.fatura_tarihi.data, fatura_aciklama=muhasebe_fisi_formu.fatura_bilgileri.aciklama.data, fis_tutari=fis_tutari ) return yeni_muhasebe_fisi def muhasebe_fis_maddesi_kaydet(self, fis_maddeleri_formu, muhasebe_fisi_id): for fis_maddesi in fis_maddeleri_formu: detayli_hesap_kodu = DB.session.query(DetayliHesapPlanlari).filter( DetayliHesapPlanlari.id == fis_maddesi.hesap_kodu.data).first() hesap_kod_duzeyleri = self.detayli_hesap_kodu_parser(detayli_hesap_kodu.hesap_kodu) yeni_fis_maddesi = MuhasebeFisMaddesi( muhasebe_fis_id=muhasebe_fisi_id, hesap_kodu=hesap_kod_duzeyleri["hesap_kodu"], ekonomik_hesap_kodu=hesap_kod_duzeyleri["ekonomik_kod"], kurumsal_kod=fis_maddesi.kurumsal_kod.data, fonksiyonel_kod=fis_maddesi.fonksiyonel_kod.data, finans_kodu=fis_maddesi.finans_kodu.data, borc=fis_maddesi.borc.data, alacak=fis_maddesi.alacak.data, hesap_ayrinti_adi=detayli_hesap_kodu.ana_hesap_hesap_grubu_yardimci_hesap_adi, ) DB.session.add(yeni_fis_maddesi) def detayli_hesap_kodu_parser(self, hesap_kodu): """ Muhasebe fis maddelerini kaydederken hesap kodunu ve ekonomik kodu ayrı ayrı kaydediyoruz. 630.03.07.00.00 seklinde bir kod geliyor. 630 lu kısım hesap kodu. 03.07.00.00 lı kısım ekonomik kodu temsil ediyor. Duruma gore sadece "630" seklinde bir kodda gelebiliyor. :param hesap_kodu: detayli hesap plani tablosunda yer alan kod :return: """ hesap_kod_duzeyleri = { "hesap_kodu": "", "ekonomik_kod": "", } # genel kodu "." ya gore 1 kere split eder hesap_kodu_array = hesap_kodu.split(".", 1) hesap_kod_duzeyleri["hesap_kodu"] = hesap_kodu_array[0] if len(hesap_kodu_array) > 1: hesap_kod_duzeyleri["ekonomik_kod"] = hesap_kodu_array[1] return hesap_kod_duzeyleri def get_proje_kalemi_data(self, proje_kalemi, kdv_dahil_tutar): data = { "proje_kalemi_adi": proje_kalemi.ad, "butce_kalemi_kodu": proje_kalemi.proje_turu_butce_kalemi.gider_siniflandirma_kalemi.kodu, "butce_kalemi_adi": proje_kalemi.proje_turu_butce_kalemi.gider_siniflandirma_kalemi.aciklama, "fis_tutari": kdv_dahil_tutar, "toplam_butce": proje_kalemi.toplam_butce, "rezerv_butce": proje_kalemi.rezerv_butce, "kullanilan_butce": proje_kalemi.kullanilan_butce, } return data
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 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 ProjeSablonEkDosyaView(FlaskView): """ Proje şablonlari ve ek dosyalari goruntulendigi view """ @login_required @auth.requires( Or( And( Permission(*permission_dict["bap"]["proje"]["dashboard"] ["proje_sablon_ek_dosya_goruntuleme"]), ProjeYurutucusu()), RoleReq('BAP Yetkilisi'), RoleReq("BAP Admin"), AtanmisHakem())) @route('/<int:proje_id>/sablon', methods=['GET'], endpoint='sablon_ekdosya_listele') def sablon_ekdosya_listele(self, proje_id): """ Projenin şablon cikti ve ek dosyalarina ulasmak icin kullanilir """ proje_yurutucusu_mu = ProjeYurutucusu().fulfill(user=current_user) atanmis_hakem = AtanmisHakem() proje = DB.session.query(Proje).options( joinedload(Proje.proje_proje_turu).load_only( "oneri_sablon_id", "hakem_degerlendirme_sablon_id", "hakem_ara_rapor_sablon_id", "ara_rapor_sablon_id", "sonuc_raporu_sablon_id", "sozlesme_sablon_id", "hakem_sonuc_rapor_sablon_id"), joinedload(Proje.proje_yurutucu).load_only("id").joinedload( OgretimElemani.personel).load_only("id").joinedload( Personel.person).load_only("ad", "soyad"), joinedload(Proje.proje_belgeleri), lazyload(Proje.proje_detayi), lazyload(Proje.kabul_edilen_proje_hakemleri), lazyload(Proje.proje_hakem_onerileri), lazyload(Proje.proje_destekleyen_kurulus), lazyload(Proje.proje_kalemleri), ).filter( Proje.id == proje_id, or_( Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.tamamlandi, Proje.proje_basvuru_durumu == ProjeBasvuruDurumu.revizyon_bekleniyor)).first() next_states_info = get_next_states_info(proje_id=proje_id) actions_info = get_actions_info(proje_id=proje_id) proje_turu = DB.session.query(ProjeTuru).options( joinedload(ProjeTuru.cikti), joinedload(ProjeTuru.ek_dosyalar).joinedload(EkDosya.belge), ).filter_by(id=proje.proje_turu).one() ciktilar = [] for cikti in proje_turu.cikti: ciktilar.append({ "adi": cikti.adi, "yurutucu_gorebilir_mi": True if cikti.gorunurluk == GorunurlukSecenekleri.yurutucu_ve_yonetici else False, "sablon_id": cikti.sablon_id, "sablon_adi": cikti.sablon_belge.adi, }) proje_ek_dosyalar = [] proje_diger_dosyalar = [] for ek_dosya in proje_turu.ek_dosyalar: for proje_belge in proje.proje_belgeleri: if proje_belge.proje_turu_ek_dosya_id == ek_dosya.id: proje_ek_dosyalar.append({ # "proje_belge_id", "proje_belge_file_id": proje_belge.belge_id, "proje_belge_aciklama": proje_belge.aciklama, "ornek_file_id": ek_dosya.belge.file_id, "ornek_file_ad": ek_dosya.belge.adi, "proje_icerik_dosyasi_mi": ek_dosya.proje_icerik_dosyasi_mi, "belgenin_ciktisi_alinacak_mi": ek_dosya.belgenin_ciktisi_alinacak_mi, "zorunlu_mu": ek_dosya.zorunlu_mu }) break for proje_belge in proje.proje_belgeleri: if proje_belge.proje_turu_ek_dosya_id is None: proje_diger_dosyalar.append({ "adi": proje_belge.baslik, "aciklama": proje_belge.aciklama, "file_id": proje_belge.belge_id }) break # todo: gereklimi ? ustteki querye dahil edilip alinabilir proje_turu_sablonlari = DB.session.query(Sablon).filter( Sablon.id.in_([ proje.proje_proje_turu.oneri_sablon_id, proje.proje_proje_turu.hakem_degerlendirme_sablon_id, proje.proje_proje_turu.hakem_ara_rapor_sablon_id, proje.proje_proje_turu.hakem_sonuc_rapor_sablon_id, proje.proje_proje_turu.ara_rapor_sablon_id, proje.proje_proje_turu.sonuc_raporu_sablon_id, proje.proje_proje_turu.sozlesme_sablon_id, ])).all() return render_template("dashboard/proje_sablon_ekdosyalar.html", proje_id=proje_id, proje=proje, next_states_info=next_states_info, actions_info=actions_info, proje_yurutucusu_mu=proje_yurutucusu_mu, ciktilar=ciktilar, proje_ek_dosyalar=proje_ek_dosyalar, proje_diger_dosyalar=proje_diger_dosyalar, proje_turu_sablonlari=proje_turu_sablonlari, proje_turu=proje_turu, atanmis_hakem=atanmis_hakem)
class SatinalmaUrunlerListesiView(FlaskView): """ Satinalma ürünleri listeleyen view """ @login_required @auth.requires( Or(Permission(*permission_dict["bap"]["satinalma"]["satinalma_urun_listesi_goruntuleme"]), RoleReq('BAP Yetkilisi'), RoleReq("BAP Admin"))) @route('/<int:satinalma_id>/urun-listesi', methods=['GET'], endpoint='satinalma_urunler_listele') def satinalma_urunler_listele(self, satinalma_id): """ Satinalma ürünlerine ulasmak icin kullanilir :param satinalma_id: satinalma_id(int) :return: http response """ try: 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() talep_kalemleri_with_siparis_info = [] for talep_kalemi in satinalma.talep_kalemleri: data = { "kalem_adi": talep_kalemi.proje_kalemi.ad, "kalem_gerekce": talep_kalemi.proje_kalemi.gerekce, "birim": talep_kalemi.proje_kalemi.birim.value, "miktar": talep_kalemi.talep_miktari, "tutar": talep_kalemi.proje_kalemi.toplam_butce / talep_kalemi.proje_kalemi.toplam_miktar * talep_kalemi.talep_miktari, "teknik_sartname_id": talep_kalemi.teknik_sartname_file_id, "firma_adi": "-", "teslimat_suresi": "-", "kdv_dahil_teklif": 0, "siparis_takip_no": "-", "siparis_durumu": "-" } if talep_kalemi.siparis_takip: kdv_dahil_teklif = kdv_dahil_fiyat_hesabi(talep_kalemi.siparis_takip.kazanan_firma_teklif.teklif, talep_kalemi.siparis_takip.kazanan_firma_teklif.kdv_orani) data.update({ "firma_adi": talep_kalemi.siparis_takip.kazanan_firma_teklif.satinalma_teklif.firma.adi, "teslimat_suresi": talep_kalemi.siparis_takip.kazanan_firma_teklif.teslimat_suresi, "kdv_dahil_teklif": kdv_dahil_teklif, "siparis_takip_no": talep_kalemi.siparis_takip.siparis_numarasi, "siparis_durumu": talep_kalemi.siparis_takip.siparis_durumu.value if talep_kalemi.siparis_takip.siparis_durumu else "-" }) talep_kalemleri_with_siparis_info.append(data) except Exception as exc: CustomErrorHandler.error_handler(hata="Satinalma ürün listesi görüntülenirken hata oluştu." "Hata: {}, Satinalma id: {}".format(satinalma_id, exc) ) return abort(500) return render_template("satinalma_dashboard/satinalma_urunler.html", talep_kalemleri_with_siparis_info=talep_kalemleri_with_siparis_info, satinalma=satinalma, satinalma_id=satinalma_id, proje=proje, actions_info=actions_info, states_info=states_info)
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 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)
user_groups = {g.id for g in user.groups} return bool(forum_groups & user_groups) def IsAtleastModeratorInForum(forum_id=None, forum=None): return Or( IsAtleastSuperModerator, IsModeratorInForum(forum_id=forum_id, forum=forum), ) IsMod = And(IsAuthed(), Has("mod")) IsSuperMod = And(IsAuthed(), Has("super_mod")) IsAdmin = And(IsAuthed(), Has("admin")) IsAtleastModerator = Or(IsAdmin, IsSuperMod, IsMod) IsAtleastSuperModerator = Or(IsAdmin, IsSuperMod) CanBanUser = Or(IsAtleastSuperModerator, Has("mod_banuser")) CanEditUser = Or(IsAtleastSuperModerator, Has("mod_edituser")) CanEditPost = Or( IsAtleastSuperModerator, And(IsModeratorInForum(), Has("editpost")), And(CanAccessForum(), IsSameUser(), Has("editpost"), TopicNotLocked()), ) CanDeletePost = CanEditPost