2323from flask_sqlalchemy import SQLAlchemy
2424from flask_migrate import Migrate
2525from functools import wraps
26- from flask_colorpicker import colorpicker
2726from icecream import install
2827from flask_babel import Babel , lazy_gettext , gettext , _
2928from flask_socketio import SocketIO
30- from sqlalchemy import URL
3129from flask_bcrypt import Bcrypt
32- import os
30+ import os , logging , json
31+ from logging .handlers import SMTPHandler
3332from dotenv import load_dotenv
3433from datetime import datetime
3534install ()
3635load_dotenv ()
37- from sqlalchemy import make_url
36+ from urllib . parse import quote
3837from werkzeug import exceptions
39- from sentry_sdk import init
40- from sentry_sdk .integrations .flask import FlaskIntegration
38+ # from sentry_sdk import init
39+ # from sentry_sdk.integrations.flask import FlaskIntegration
4140# met la langue en francais pour le formatage des dates
4241import locale
4342locale .setlocale (locale .LC_TIME ,'' )
4443
4544app = Flask (__name__ )
46- app .config [ 'SERVER_NAME' ] = 'localhost:5000'
47- password = os .environ . get ( 'db_password ' )
45+ app .subdomain_matching = True
46+ app . config [ 'SERVER_NAME' ] = os .getenv ( 'SERVER_NAME ' )
4847app .config ['SECRET_KEY' ] = os .environ .get ('SECRET_KEY' ) #! change that for deployment
49- url_object = URL . create (
50- "mysql+pymysql" ,
51- username = "root" ,
52- password = password , # plain (unescaped) text
53- host = "localhost" ,
54- database = "site" ,
55- )
56- app .config ["SQLALCHEMY_DATABASE_URI" ] = url_object
48+
49+ password = os . environ . get ( 'db_password' )
50+ username = os . environ . get ( 'db_user' )
51+ hostname = os . environ . get ( 'db_host' )
52+ databasename = os . environ . get ( 'db_name' )
53+
54+ url = f"mysql+pymysql:// { username } : { quote ( password ) } @ { hostname } / { databasename } "
55+ app .config ["SQLALCHEMY_DATABASE_URI" ] = url
5756app .config ['BABEL_TRANSLATION_DIRECTORIES' ] = f'{ app .root_path } /translations'
5857app .jinja_env .add_extension ('jinja2.ext.loopcontrols' )
5958app .url_map .default_subdomain = ''
59+ app .config ['SQLALCHEMY_TRACK_MODIFICATIONS' ] = False
60+ app .config ["SQLALCHEMY_POOL_RECYCLE" ] = 280
6061
6162DEFAULT_PROFIL_PIC = 'icone.png'
6263LANGAGES = ['de' , 'fr' , 'en' ]
6364if app .debug :
6465 LANGAGES += ['ids' , 'pseudo' ]
6566PICTURE_SIZE = (200 , 200 )
6667
67- if not app .debug :
68- ic ('init sentry' )
69- init (
70- dsn = os .environ .get ('SANTRY_DSN' ),
71- send_default_pii = True ,
72- traces_sample_rate = 1.0 ,
73- profiles_sample_rate = 1.0 ,
74- integrations = [FlaskIntegration (
75- transaction_style = 'endpoint'
76- )],
77- )
78-
7968db = SQLAlchemy (app )
8069
8170migrate = Migrate (app , db )
8978login_manager .login_view = 'users.login'
9079login_manager .login_message_category = 'info'
9180
92- colorpicker (app )
81+ # ? error report
82+ mail_host = tuple (json .loads (os .getenv ('mail_host' )))
83+ from_addr = os .getenv ('from_addr' )
84+ mail_token = os .getenv ('mail_token' )
85+ to_addrs = json .loads (os .getenv ('to_addrs' ))
86+ ic (mail_host , from_addr , mail_token , to_addrs )
87+
88+ class MailFormatter (logging .Formatter ):
89+ def format (self , record ):
90+ #region
91+ try : post_data = "\n \t " .join ([f'"{ k } ": "{ v } "' if v else f'"{ k } "' for k , v in request .get_json ().items ()])
92+ except : post_data = request .get_data () if request .get_data ()!= b'' else ''
93+ args = "\n \t " .join ([f'"{ k } ": "{ v } "' if v else f'"{ k } "' for k , v in request .args .to_dict ().items ()])
94+ user = f"""\
95+ username: { current_user .username }
96+ id: { current_user .id }
97+ name: { current_user .name } """ if current_user .is_authenticated else "anonymous"
98+ message = f'''\
99+ an error occurred in the chrono des vignes:
100+
101+ { record .message } - { record .levelname }
102+ it occured on the { self .formatTime (record , "%A, %d %B %Y %H:%M:%S" )}
103+ [user]
104+ { user }
105+
106+ [request]
107+ url: { request .url }
108+ endpoint:{ request .endpoint }
109+ route: { request .url_rule }
110+ method: { request .method }
111+ args: { args }
112+ post: { post_data }
113+
114+ [traceback]
115+ { record .exc_text }
116+
117+ '''
118+ return message
119+ #endregion
120+
121+ smtp_handeler = SMTPHandler (mailhost = mail_host , fromaddr = to_addrs , toaddrs = to_addrs , subject = 'server error' , credentials = (from_addr , mail_token ))
122+ smtp_handeler .setFormatter (MailFormatter ())
123+ smtp_handeler .setLevel (logging .WARNING )
124+
125+ app .logger .addHandler (smtp_handeler )
93126
94127#? instansiate flask babel
95- old = '.venv/Lib/site-packages/babel/locale-data/fr_CH.dat'
96- new = ('.venv/Lib/site-packages/babel/locale-data/pseudo.dat' , '.venv/Lib/site-packages/babel/locale-data/ids.dat' )
97- for file in new :
98- if not os .path .exists (file ):
99- with open (old , 'rb' ) as file1 :
100- with open (file , '+wb' ) as file2 :
101- file2 .write (file1 .read ())
102-
103- from babel .core import LOCALE_ALIASES
104- LOCALE_ALIASES ['pseudo' ] = 'pseudo'
105- LOCALE_ALIASES ['ids' ] = 'ids'
106-
107-
128+ if app .debug :
129+ old = '.venv/Lib/site-packages/babel/locale-data/fr_CH.dat'
130+ new = ('.venv/Lib/site-packages/babel/locale-data/pseudo.dat' , '.venv/Lib/site-packages/babel/locale-data/ids.dat' )
131+ for file in new :
132+ if not os .path .exists (file ):
133+ with open (old , 'rb' ) as file1 :
134+ with open (file , '+wb' ) as file2 :
135+ file2 .write (file1 .read ())
136+
137+ from babel .core import LOCALE_ALIASES
138+ LOCALE_ALIASES ['pseudo' ] = 'pseudo'
139+ LOCALE_ALIASES ['ids' ] = 'ids'
140+
141+ babel = Babel (app )
142+ @babel .localeselector
108143def get_locale ():
109144 # if a user is logged in, use the locale from the user settings
110145 if session .get ('lang' ) :
@@ -114,11 +149,6 @@ def get_locale():
114149 # example. The best match wins.
115150 return request .accept_languages .best_match (LANGAGES )
116151
117- def get_timezone ():
118- pass
119-
120- babel = Babel (app , locale_selector = get_locale , timezone_selector = get_timezone )
121-
122152from chrono_des_vignes .models import User
123153@login_manager .user_loader
124154def load_user (user_id :str ):
0 commit comments