コード例 #1
0
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()
コード例 #2
0
    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
コード例 #3
0
ファイル: mail.py プロジェクト: kunthar/zopsedu
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)
コード例 #4
0
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
コード例 #5
0
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
コード例 #6
0
    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)
コード例 #7
0
    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)
コード例 #8
0
ファイル: butce_kodlari.py プロジェクト: kunthar/zopsedu
    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"))
コード例 #9
0
ファイル: butce_kodlari.py プロジェクト: kunthar/zopsedu
    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)
コード例 #10
0
ファイル: views.py プロジェクト: kunthar/zopsedu
    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)
コード例 #11
0
ファイル: butce_kodlari.py プロジェクト: kunthar/zopsedu
    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)
コード例 #12
0
    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)
コード例 #13
0
    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)
コード例 #14
0
    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)
コード例 #15
0
    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)
コード例 #16
0
ファイル: mail.py プロジェクト: kunthar/zopsedu
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