def before_first_request(): """ App'in aldığı İLK istek öncesinde çalışan pre-request hook'udur. anonim user için session'da kullanılacak bilgiler redis'e yazılır. """ SessionHandler.anonymous_user_set_cache() set_system_user_info() SessionHandler.universite_id() user_activity_message_index_controll() init_mail()
def get_satinalma_for_siparis_formu(satinalma_id): """ Satinalma siparis formu için eklenmiştir. """ proje = DB.session.query( Proje, ProjeSatinAlmaTalebi.talep_numarasi).join( ProjeSatinAlmaTalebi, ProjeSatinAlmaTalebi.proje_id == Proje.id).filter( ProjeSatinAlmaTalebi.id == satinalma_id).one() form = FirmaSelectForm(satinalma_id) uni_adi = \ DB.session.query(Birim.ad).filter(Birim.id == SessionHandler.universite_id()).first()[0] universite_adi = uni_adi if uni_adi else 'ilgili üniversite' data = { 'form': form, 'satinalma_id': satinalma_id, 'proje': proje[0], 'talep_numarasi': proje[1], 'universite_adi': universite_adi } return data
def init_mail(app=None): """ flask-mail i initialize eder """ if app is None: app = current_app mail = Mail() try: universite_id = SessionHandler.universite_id() ayarlar = DB.session.query(SiteAyarlari).filter_by( universite_id=universite_id).first() mail_sunucu_ayarlari = ayarlar.params["mail_sunucu_ayarlari"] mail_config = { "MAIL_SERVER": mail_sunucu_ayarlari['mail_server'], "MAIL_PORT": mail_sunucu_ayarlari['mail_port'], "MAIL_USE_TLS": mail_sunucu_ayarlari['mail_use_tls'], "MAIL_USE_SSL": mail_sunucu_ayarlari['mail_use_ssl'], "MAIL_USERNAME": mail_sunucu_ayarlari['mail_username'], "MAIL_PASSWORD": ayarlar.mail_password, "MAIL_DEFAULT_SENDER": mail_sunucu_ayarlari['mail_default_sender'], "MAIL_MAX_EMAILS": mail_sunucu_ayarlari['mail_max_emails'] } app.logger.info("Mail ayarlari databaseden tekrar yuklendi") state = mail.init_mail(config=mail_config) app.extensions['mail'] = state except (AttributeError, RuntimeError, InternalError, ProgrammingError): app.logger.info( "Mail ayarlari databaseden yuklenemedi config'den aliniyor") mail.init_app(app=app)
def get_sablon_logo_url(): universite_id = SessionHandler.universite_id() result = DB.session.query(SiteAyarlari).options( load_only('logo')).filter_by(universite_id=universite_id).first() logo_url = '/static/assets/img/brand-logo2.png' if result and result.logo: logo_url = current_app.wsgi_app.url_for(result.logo.path) sablon_logo_url = "{}{}".format(request.url_root.strip('/'), logo_url) return sablon_logo_url
def get_logo_url(): """Universite ID'sini kullanarak site logosunun url ini return eder.""" universite_id = SessionHandler.universite_id() result = DB.session.query(SiteAyarlari).options( load_only('logo')).filter_by(universite_id=universite_id).first() logo_url = None if result and result.logo: logo_url = current_app.wsgi_app.url_for(result.logo.path) return logo_url
def get(): """Ayarlar ekraninin goruntulendigi view""" universite_id = SessionHandler.universite_id() genel_ayar = DB.session.query(GenelAyarlar).filter_by( universite_id=universite_id, aktif_mi=True).first() if genel_ayar and genel_ayar.bap_hakem: form = HakemForm(**genel_ayar.bap_hakem) else: form = HakemForm() return render_template("hakem.html", form=form)
def diger_get(): """ "Diger" ayarlarinin görüntülendigi view """ diger_formu = DigerFormu() universite_id = SessionHandler.universite_id() genel_ayarlar = DB.session.query(GenelAyarlar).filter_by( universite_id=universite_id, aktif_mi=True).first() if genel_ayarlar and genel_ayarlar.bap_diger: diger_formu = DigerFormu(**genel_ayarlar.bap_diger) return render_template('diger.html', diger_formu=diger_formu)
def kurum_kodlari_kaydet(): """ Butce kodlarinin kaydedildigi view """ butce_kodlari_form = ButceKodlari(request.form) universite_id = SessionHandler.universite_id() if not butce_kodlari_form.validate(): flash(_("Lütfen hatalı yerleri düzeltip tekrar deneyin.")) fonksiyonel_kodlar_form = FonksiyonelKodlar() hesap_kodu_search_form = HesapKodlariSearch() return render_template( 'butce_kodlari_listeleme.html', fonksiyonel_kodlar=fonksiyonel_kodlar_form, hesap_kodu_search_form=hesap_kodu_search_form, butce_kodlari_formu=butce_kodlari_form) butce_kodlari_form_data = dict(butce_kodlari_form.data) butce_kodlari_form_data.pop('csrf_token') eski_genel_ayarlar = DB.session.query(GenelAyarlar).filter_by( universite_id=universite_id, aktif_mi=True).first() if eski_genel_ayarlar: yeni_data = eski_genel_ayarlar.to_dict()["bap_butce"] yeni_data.update(butce_kodlari_form_data) yeni_ayarlar = genel_ayarlar_guncelle( eski_genel_ayarlar, guncellenecek_field="bap_butce", yeni_data=yeni_data) else: yeni_ayarlar = GenelAyarlar(universite_id=universite_id, bap_butce=butce_kodlari_form_data) DB.session.add(yeni_ayarlar) DB.session.commit() flash(_("İşlem başarıyla gerçekleşti.")) signal_payload = { "message_type": USER_ACTIVITY_MESSAGES.get("bap").get( "butce_kodlari_kaydet").type_index, "nesne": 'GenelAyarlar', "nesne_id": yeni_ayarlar.id, "ekstra_mesaj": "{} adlı kullanıcı, bap bütçe kurum kodları ayarlarını güncelledi." .format(current_user.username) } signal_sender(**signal_payload) return redirect( url_for("butce.ButceKodlariView:butce_kodlari_goruntuleme"))
def detayli_hesap_kodlari_search(self): """ Butce detaylı hesap kodlarinin search edildigi view """ search_query = DB.session.query(DetayliHesapPlanlari) form_data = request.form.to_dict() search_form = HesapKodlariSearch(**form_data) universite_id = SessionHandler.universite_id() genel_ayarlar = DB.session.query(GenelAyarlar).filter_by( universite_id=universite_id, aktif_mi=True).first() if not search_form.validate(): total_record = search_query.count() result = search_query.offset(form_data['start']).limit( form_data['length']).all() return self.process_data(result, form_data, total_record) if search_form.kod.data: search_query = search_query.filter( DetayliHesapPlanlari.hesap_kodu.ilike('%' + search_form.kod.data + '%')) if search_form.aciklama.data: search_query = search_query.filter( DetayliHesapPlanlari.ana_hesap_hesap_grubu_yardimci_hesap_adi. ilike('%' + search_form.aciklama.data + '%')) if genel_ayarlar: if genel_ayarlar.bap_butce: # detayli_hesap_kodlari icerisinde 38 li ve 39 ku universiteler icin ayri kodlar # bulunmakta. Eger ayarlar bolumunden kurum kodu girilmis ise ("39.01.00.00" gibi) # parse edilip 38 li veya 39 lu oldugu anlasilir query ona gore atilir. kurum_kodu = genel_ayarlar.bap_butce.get("kurum_kodu") yok_kurum_kodu = kurum_kodu.split(".")[0] try: if int(yok_kurum_kodu) == 38 or int(yok_kurum_kodu) == 39: search_query = search_query.filter( DetayliHesapPlanlari.kurum_turu == int( yok_kurum_kodu)) except Exception as exc: pass total_record = search_query.count() result = search_query.offset(form_data['start']).limit( form_data['length']).all() return self.process_data(result, form_data, total_record)
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)
def butce_kodlari_goruntuleme(): """ Butce kodlarinin goruntulendigi view """ universite_id = SessionHandler.universite_id() genel_ayar = DB.session.query(GenelAyarlar).filter_by( universite_id=universite_id, aktif_mi=True).first() hesap_kodu_search_form = HesapKodlariSearch() if genel_ayar and genel_ayar.bap_butce: kurum_kodlari_form = ButceKodlari(**genel_ayar.bap_butce) fonksiyonel_kodlar_form = FonksiyonelKodlar(**genel_ayar.bap_butce) else: kurum_kodlari_form = ButceKodlari() fonksiyonel_kodlar_form = FonksiyonelKodlar() return render_template("butce_kodlari_listeleme.html", butce_kodlari_formu=kurum_kodlari_form, fonksiyonel_kodlar=fonksiyonel_kodlar_form, hesap_kodu_search_form=hesap_kodu_search_form)
def diger_post(): """ "Diger" ayarlarinin kaydedildigi view """ diger_formu = DigerFormu(request.form) if diger_formu.validate(): universite_id = SessionHandler.universite_id() diger_ayarlar_data = dict(diger_formu.data) diger_ayarlar_data.pop('csrf_token') diger_ayarlar_data['yayinlar'].pop('csrf_token') diger_ayarlar_data['firma'].pop('csrf_token') diger_ayarlar_data['diger'].pop('csrf_token') genel_ayarlar = DB.session.query(GenelAyarlar).filter_by( universite_id=universite_id, aktif_mi=True).first() if genel_ayarlar: yeni_ayarlar = genel_ayarlar_guncelle(genel_ayarlar, "bap_diger", diger_ayarlar_data) else: yeni_ayarlar = GenelAyarlar(universite_id=universite_id, bap_diger=diger_ayarlar_data) DB.session.add(yeni_ayarlar) DB.session.commit() flash(_("İşlem başarıyla gerçekleşti.")) signal_payload = { "message_type": USER_ACTIVITY_MESSAGES.get("ayarlar").get( "bap_proje_guncelle").type_index, "nesne": 'GenelAyarlar', "nesne_id": yeni_ayarlar.id, "ekstra_mesaj": "{} adlı kullanıcı, bap diger ayarlarını güncelledi.".format( current_user.username) } signal_sender(**signal_payload) return render_template('diger.html', diger_formu=diger_formu)
def post(): """ Ayarlarin kaydedildiği view """ form = HakemForm(request.form) if form.validate(): form_data = dict(form.data) form_data.pop('csrf_token') universite_id = SessionHandler.universite_id() genel_ayar = DB.session.query(GenelAyarlar).filter_by( universite_id=universite_id, aktif_mi=True).first() if genel_ayar: yeni_ayarlar = genel_ayarlar_guncelle(genel_ayar, "bap_hakem", form_data) else: yeni_ayarlar = GenelAyarlar(universite_id=universite_id, bap_hakem=form_data) DB.session.add(yeni_ayarlar) DB.session.commit() flash(_("Ayarlarınız başarılı bir şekilde kayıt edildi.")) signal_payload = { "message_type": USER_ACTIVITY_MESSAGES.get("ayarlar").get( "bap_hakem_guncelle").type_index, "nesne": 'GenelAyarlar', "nesne_id": yeni_ayarlar.id, "ekstra_mesaj": "{} adlı kullanıcı, bap hakem ayarlarını güncelledi.".format( current_user.username) } signal_sender(**signal_payload) return redirect(url_for('bap_yonetimi.HakemAyarlarView:get')) return render_template("hakem.html", form=form)
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)
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)
def send_mail_with_template(recipients: list, subject, content_text, logo_src=None, logo_text=None, logo_href=None, title_text=None, greeting=None, greeting_name=None, button_href=None, button_text=None, content_end_text=None, footer_text=None, template=None, attachments=None, cc=None, bcc=None, body=None, sender=None): """ :param recipients: recipient mail addresses. List of strings :param subject: subject of the mail. Passed to Message instance :param logo_src: url of logo passed to template, default : logo located in SiteAyarlari or Zopsedu logo :param logo_text: logo text located under the logo, passed to template. :param logo_href: href value passed to both logo_text and logo_url :param title_text: title text passed to template :param greeting: greeting for the greeting name, passed to template :param greeting_name: greeting name, passed to the template :param content_text: content text, passed to the template :param button_href: href value of button, passed to the template :param button_text: text value of button, passed to the template :param content_end_text: content end text, passed to the template :param footer_text: footer text passed to template :param template: template name for the send mail. Gets used for rendering the mail. :param attachments: A list of Attachment instances, gets added to the Message instance :param cc: CC mail addresses. List of strings :param bcc: BCC mail addresses. List of strings :param body: Plain text value for body of mail. Passed to Message instance :param sender: Sender mail address of mail. default: default sender mail address set while initiating mail instance :return: returns rendered template html """ ayarlar = DB.session.query(SiteAyarlari).filter_by( universite_id=SessionHandler.universite_id()).first() genel_ayarlar = None if ayarlar and ayarlar.params and ayarlar.params[ "site_ayarlari"] and ayarlar.params["site_ayarlari"]["genel"]: genel_ayarlar = ayarlar.params["site_ayarlari"]["genel"] if not logo_src: if ayarlar and ayarlar.logo and genel_ayarlar: logo_src = "{}{}".format(genel_ayarlar["site_adi"], ayarlar.logo.url) logo_href = genel_ayarlar["site_adi"] else: logo_src = 'http://v2.zopsedu.net/static/assets/img/brand-logo2-white.png' if template is None: # sablon tipi 52 email sablonunu isaret eder. degistirilmemelidir. guncel_email_sablonu = DB.session.query(Sablon).filter( Sablon.kullanilabilir_mi == True, Sablon.sablon_tipi_id == 52).order_by(desc( Sablon.updated_at)).first() template = guncel_email_sablonu.sablon_text if not footer_text and genel_ayarlar: footer_text = """ <strong>Telefon: {}</strong><br> <strong>Faks: {}</strong><br> <strong>Adres: {}</strong><br> """.format(genel_ayarlar.get("telefon", "-"), genel_ayarlar.get("faks", "-"), genel_ayarlar.get("adres", "-")) html = render_template_string( template, logo_src=logo_src, logo_text=logo_text, logo_href=logo_href, title_text=title_text if title_text else subject, greeting=greeting, greeting_name=greeting_name, content_text=content_text, button_href=button_href, button_text=button_text, content_end_text=content_end_text, footer_text=footer_text, ) msg = Message(recipients=recipients, attachments=attachments, cc=cc, bcc=bcc, body=body, sender=sender, subject=subject) msg.html = html current_app.extensions['mail'].send(msg) return html