From b3d8ef6f36b77b99139c9d4f7b40cad97f5522df Mon Sep 17 00:00:00 2001 From: Hugo Pierret Date: Sun, 20 Oct 2024 14:51:15 +0200 Subject: [PATCH] Use local storage for csv --- __pycache__/config.cpython-312.pyc | Bin 0 -> 1178 bytes config.py | 25 ++++++++ data/diary.csv | 66 --------------------- main.py | 5 +- src/api/__pycache__/routes.cpython-312.pyc | Bin 7261 -> 7453 bytes src/api/routes.py | 62 +++++++++++-------- 6 files changed, 67 insertions(+), 91 deletions(-) create mode 100644 __pycache__/config.cpython-312.pyc create mode 100644 config.py delete mode 100644 data/diary.csv diff --git a/__pycache__/config.cpython-312.pyc b/__pycache__/config.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e86d50970c148636d0351d7011ad902ad970f9c1 GIT binary patch literal 1178 zcmb7COKTHR6u$GwOfpT=JgQ=mB7$Jh*oF8i(uK_=L`x`rfQG;@&Am<2CYg9A2?jSQ zCbTKM(8Gtn}RDh(vpDCmFLVPeYxs^`R&zU*j`Of#rNsWNb{D~F6 ziG=*Zm$CUq&fpC=Jwgc;$|Ofbk|tE_5Gw6M1zJvUV=}~iOxTx3QPGVm5LM4bB_=X> zsQ;6clUqVO@Eg;!1+U0MdGs>qfYT!k{y<3%>bCvo(>#BB;{O;GsCe3)LZzGvkN*nw zGWDI-2U<#8b(BS`x>+hZ+N!>|qOTdR^|y{nS<~2It&|g3(UX}~V|``mia{F6sdpJ(Hm<2Q_|Sz(6ZXogX-XrqjN&@kRL%<||)v}{LZ)n-53U&#QepJW&3^XoR_c7Cf-v}*ZfZWXy%shIVWRn0H4 zdY$nN>pe{*OD1n6mZ2p`PAr!SJB%kbOgO4EUvT+7thG3f-vw0CehkndhmlxsraRM{ z?aqD_&P4efpS@gR8+)^{^JI{wZDaRrE?4W6qlVyk~LY`s#RFE?#+FTqx9Lhj|br7xV0RG=Titc4IV*o{~1H?+88j` z4gz#YKNxQ7hv9qU<}l|%bI2HNkODYs?h2bD?2icM6riKJbi$wrZ4^)rkB!@KDjWA- zW`k|=NrVuB%gbeWiQEmmMZin@CICouUW9}2{dVRs7}?dmkzj6IawcG7$AfjW+G$(3 z%A01RT!#U>J-9pIju0yy#oLZcGd}UZ@V0n?--0Y8ZZ7~FNrE8!B!R!OPe=*J1aTOW mg!rB^BybEhS%`jY4hbAbAu@fpAHCC`x_zw5nz*aD4gUiRD)NN@ literal 0 HcmV?d00001 diff --git a/config.py b/config.py new file mode 100644 index 0000000..c1c59ee --- /dev/null +++ b/config.py @@ -0,0 +1,25 @@ +import os + +class Config: + # Configuration générale + SECRET_KEY = os.environ.get('SECRET_KEY', 'dev_key') + DEBUG = False + TESTING = False + REDIS_URL = os.environ.get("REDIS_URL", "redis://localhost:6379") + +class DevelopmentConfig(Config): + DEBUG = True + # Configuration pour le développement local + REDIS_URL = "redis://localhost:6379" + +class ProductionConfig(Config): + # Configuration pour la production (Render, etc.) + REDIS_URL = os.environ.get("REDIS_URL") + # Peut désactiver le debug mode pour la prod + DEBUG = False + +config = { + 'development': DevelopmentConfig, + 'production': ProductionConfig, + 'default': DevelopmentConfig +} diff --git a/data/diary.csv b/data/diary.csv deleted file mode 100644 index 496fac2..0000000 --- a/data/diary.csv +++ /dev/null @@ -1,66 +0,0 @@ -Watched Date,Name,Year,Letterboxd URI,Rating,Rewatch,Tags,Watched Date -2023-12-15,Ghost in the Shell,1995,https://boxd.it/5k8vT3,3.5,,,2023-12-13 -2024-01-03,Baby Driver,2017,https://boxd.it/5tDbaP,4.0,,,2024-01-02 -2024-01-04,The Shawshank Redemption,1994,https://boxd.it/5ugTgP,4.5,,,2024-01-03 -2024-01-05,Léon: The Professional,1994,https://boxd.it/5uRr6B,4.0,,,2024-01-04 -2024-01-06,Brothers,2009,https://boxd.it/5vuRQN,3.5,,,2024-01-05 -2024-01-07,"Crazy, Stupid, Love.",2011,https://boxd.it/5wgeFn,4.0,,,2024-01-06 -2024-01-08,There Will Be Blood,2007,https://boxd.it/5x4B37,4.5,,,2024-01-07 -2024-01-09,(500) Days of Summer,2009,https://boxd.it/5xDHe1,4.0,,,2024-01-08 -2024-01-20,Dallas Buyers Club,2013,https://boxd.it/5DrLPb,4.0,,,2024-01-19 -2024-01-22,Boogie Nights,1997,https://boxd.it/5EEjCN,4.0,,,2024-01-21 -2024-01-24,Saltburn,2023,https://boxd.it/5FxIYT,4.0,,,2024-01-23 -2024-01-25,Under the Skin,2013,https://boxd.it/5G0SG9,2.5,,,2024-01-24 -2024-01-26,Anatomy of a Fall,2023,https://boxd.it/5GuroR,4.0,,,2024-01-25 -2024-01-31,Poor Things,2023,https://boxd.it/5J4AI7,4.5,,,2024-01-30 -2024-02-01,In the Mood for Love,2000,https://boxd.it/5JweK7,4.5,,,2024-01-31 -2024-02-07,Black Swan,2010,https://boxd.it/5MhygD,4.0,,,2024-02-06 -2024-02-13,Rain Man,1988,https://boxd.it/5OXE5j,4.0,,,2024-02-12 -2024-02-20,The 40 Year Old Virgin,2005,https://boxd.it/5Sgvxj,3.5,,,2024-02-19 -2024-02-21,Captain Fantastic,2016,https://boxd.it/5SHgol,4.0,,,2024-02-20 -2024-02-23,The Prestige,2006,https://boxd.it/5TwaTp,4.5,,,2024-02-22 -2024-02-29,The Shining,1980,https://boxd.it/5WgsV9,4.0,,,2024-02-28 -2024-03-02,Dune: Part Two,2024,https://boxd.it/5X4Ep5,5.0,,,2024-03-01 -2024-03-12,Fantastic Mr. Fox,2009,https://boxd.it/622Xk5,4.5,,,2024-03-11 -2024-03-13,Past Lives,2023,https://boxd.it/62uP1F,4.5,,,2024-03-12 -2024-03-19,Little Women,2019,https://boxd.it/65jkNX,3.0,,,2024-03-18 -2024-03-21,The Perks of Being a Wallflower,2012,https://boxd.it/668ca1,4.0,,,2024-03-20 -2024-03-28,Amélie,2001,https://boxd.it/69lEoN,4.5,,,2024-03-27 -2024-03-29,Lost in Translation,2003,https://boxd.it/69Kn1n,4.0,,,2024-03-28 -2024-04-03,No Country for Old Men,2007,https://boxd.it/6clZZd,4.0,,,2024-04-02 -2024-04-05,Fargo,1996,https://boxd.it/6dadIv,3.5,,,2024-04-04 -2024-04-09,No Hard Feelings,2023,https://boxd.it/6f0cwL,2.5,,,2024-04-08 -2024-04-17,"OSS 117: Cairo, Nest of Spies",2006,https://boxd.it/6i7AOl,4.0,,,2024-04-16 -2024-04-20,The Neon Demon,2016,https://boxd.it/6j9IF5,3.0,,,2024-04-19 -2024-04-23,Taxi Driver,1976,https://boxd.it/6ktjeR,3.5,,,2024-04-22 -2024-04-30,The Theory of Everything,2014,https://boxd.it/6nlzHL,4.5,,,2024-04-29 -2024-05-09,Civil War,2024,https://boxd.it/6rbidl,4.5,,,2024-05-08 -2024-05-10,Scott Pilgrim vs. the World,2010,https://boxd.it/6rxEAl,4.0,,,2024-05-09 -2024-05-15,Asteroid City,2023,https://boxd.it/6txkqD,3.5,,,2024-05-14 -2024-05-22,Battle of the Sexes,2017,https://boxd.it/6wiCsp,3.5,,,2024-05-22 -2024-05-26,War Dogs,2016,https://boxd.it/6xS8YB,3.5,,,2024-05-25 -2024-05-28,The Creator,2023,https://boxd.it/6yPVwT,4.5,,,2024-05-27 -2024-05-30,Full Metal Jacket,1987,https://boxd.it/6zEwVV,4.0,,,2024-05-29 -2024-06-04,Dead Poets Society,1989,https://boxd.it/6BNjNv,3.5,,,2024-06-03 -2024-06-05,Perfect Days,2023,https://boxd.it/6C9zSb,4.0,,,2024-06-04 -2024-06-07,Burn After Reading,2008,https://boxd.it/6CQVG3,3.0,,,2024-06-06 -2024-06-12,Before Sunrise,1995,https://boxd.it/6EWJMD,4.0,,,2024-06-11 -2024-06-20,OSS 117: Lost in Rio,2009,https://boxd.it/6I1d3j,3.5,,,2024-06-19 -2024-06-23,Inside Out 2,2024,https://boxd.it/6J9mU7,4.0,,,2024-06-22 -2024-06-26,May December,2023,https://boxd.it/6KqGP5,2.5,,,2024-06-25 -2024-06-29,Ferrari,2023,https://boxd.it/6Lv8pV,3.0,,,2024-06-28 -2024-06-30,Sicario,2015,https://boxd.it/6LUq2b,4.0,,,2024-06-29 -2024-07-21,Gladiator,2000,https://boxd.it/6Vcoij,4.5,,,2024-07-20 -2024-07-22,Perfect Blue,1997,https://boxd.it/6VIhi1,4.0,,,2024-07-21 -2024-07-23,Paprika,2006,https://boxd.it/6WcVWb,4.5,,,2024-07-22 -2024-07-24,Dream Scenario,2023,https://boxd.it/6WCG0t,4.0,,,2024-07-23 -2024-07-29,Yes Man,2008,https://boxd.it/6ZbFWJ,3.0,,,2024-07-29 -2024-07-30,Deadpool & Wolverine,2024,https://boxd.it/6Zo8Sb,3.5,,,2024-07-29 -2024-07-31,Source Code,2011,https://boxd.it/6ZPH0H,3.5,,,2024-07-30 -2024-08-04,Almost Famous,2000,https://boxd.it/71w9tb,4.0,,,2024-08-03 -2024-08-05,The Master,2012,https://boxd.it/72e6pN,3.0,,,2024-08-05 -2024-08-10,Millennium Actress,2001,https://boxd.it/747e7V,4.0,,,2024-08-10 -2024-08-14,The King of Comedy,1982,https://boxd.it/75VeGl,4.5,,,2024-08-13 -2024-08-15,American Fiction,2023,https://boxd.it/76lZ2J,4.0,,,2024-08-14 -2024-08-18,The Diary of a Teenage Girl,2015,https://boxd.it/77HSDB,3.5,,,2024-08-17 -2024-08-20,Punch-Drunk Love,2002,https://boxd.it/78Mk2P,4.0,,,2024-08-19 diff --git a/main.py b/main.py index 1992ea9..cee0556 100644 --- a/main.py +++ b/main.py @@ -3,12 +3,15 @@ from flask import Flask from flask_cors import CORS from src.api.routes import api_bp from flask_sse import sse +from config import config def create_app(): app = Flask(__name__) CORS(app) - app.config["REDIS_URL"] = "redis://localhost:6379" + env = os.environ.get('FLASK_ENV', 'default') + app.config.from_object(config[env]) + app.register_blueprint(sse, url_prefix='/stream') app.register_blueprint(api_bp, url_prefix='/api') diff --git a/src/api/__pycache__/routes.cpython-312.pyc b/src/api/__pycache__/routes.cpython-312.pyc index a7e92a83c2bd7454368b64276ed3486d91e43c40..33f28c8ea2e9f163d9eecc171d392f57ea63f3ca 100644 GIT binary patch literal 7453 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 delta 3913 zcmb7GU2GKB6~1?V)-(I-{jt6F?t0f418Z!+A=JTj04FvnjSCc-G%S$SvNN`Kz3a8^ zj_t(kvVc+*OKlu_k>J6RT(we(pi$biQdORafR{>@BU34zIBF}=hx8?m+J~wSRqvVc z?5<6us8^bE&)j?FoIB^|JNMmz&z^Jt!R4|eHh%Z$&tvcVuDgSke`ADhA_XZphZ5$D z6PUeoIWEs9_`Hx1@?t{7u*c_Y`G!P;!3#MlFDGP!7jyQ!BjGT3oO32zOxBij=RFAz zMjTRkr9o}H!+~Xl5?;0<-!We*DB)wTj*VB8@GDXxpvV(A(WK&Rk1178vwQ2`OkNEr z_Nw|I)8|nfcb#|Gufb4UZ=tIGR@Iw5V6FqD_q=k4Tk(wJyVV0K-a7dZ$kShW{X2bI zr2KVKVI}YuN<=K#jwYpflg5@h+4ibbaEr#)I;p576>n2Qn{hdx zCtQT?;D(##ZF}}ADJ`Y*>Ei6XtYlK;%{?FHxJHbJXqn%M&(YuW-MEGRoxf-w3bzyH#ATbok_*yS`T^g{j*x9-D}l;gd(|YTg{-5M zsy|fbwTQKvZMV4ET;fZ3p8alBi%>#}IM3>et&0ei#gfQ4_CeVO$Eba2a2`gPfUOOc z8%hn?4mf4SQB@{soz@2>$yyyoi}Ip9&5xrrcb?V6IaW$#xol^8WH7|cgI2rZg#To- zYh!l9taUMBjIBFX48|1Cl6al_(H;Sn9iX@t?vjK3FDeO2s|3`yDh%tq^{PMfodWtKE&hCFkjlc@EE^ zH~2GX4#%60(`jj#-jiP54S7YtCfNyO7bCjuWTB|3BrcFJyoy>uOXWzE_Q~f*nsu&F z)P?DkHlf?pH!?-7s7tIil4F^iN(7MSGgBI2!9%)`BI8A!A6GSUQs7jB>%*UbK;4|M=v_|yPvo`i)RS^PS1P30}hBy6|~q`VP;DC{02KR3rGV1UoE``fI9Sl`1Y?%8HB@n|CTG)FK1VY?j)r;JJ{Yl8yq7bjVkfe2eR zhQcYfy6hDI1WSngx~_8I+b9JLs@X! zmQjN<4B*~kZD+w>tnE#CJ#MS?%6y5>h725PP$WfG>`VOJ8Y01N6%Z{w3{|Sos5tMs ztn*-0=OWfu8EjO6Rq+~~qTYpp%`V(_8qg$W8DVJBRTkfFv>mtKVW|OX}@S}G>GP}pzH8E2p!w!Y*I&9hdVTcgkq@NRz`<+sCz5kfUXb63KbFGlf>S<$*S!9l zq3fYrXI8yC=|2LU9tI7^7LMJRSXQqcd+h9?9ZlKDfg$g3GkVZ0j|lvOXxs2%{=q>E z{9$oKptqYk?f+#**?euNJbi6o^-@E7c4?>!ws~o&-xap*vP>}Us>~8H`U=tjFO8vy z8lZ+TN@gdfzE)qhrqHG|)G3sz%>`XTMss0vU2~C->vo99h|wIrMftZPPy)-2Uskf!M(#u5SQY}@;KDJ*E&J;C#l&N)}g}pN=#u z`|1S{u7?U=SM~-r*6oX%kaKSXpaKha_1?G<>}r4&Ndx>hMhO|0h?+4`k?Z1Y|C%^E zj?;8&hXcBZ5o6Lr7h8k)WqP~y+h!!?uZkp8Hf!PLU13W^$rw{stc#~zQFE%M8VE4S z_8^wUw;6$eN?#RFryEL8yfN|E8Kt9bljpWG>8nGIp$NL~b_0#bFEsP_cXYkrBBBsSU>isA-35Q<@m zo(+X7P&2xeOagQzle#T6ok?DpHoCIz%H&hyYO<)3*-Tm`uY>NBKmZiUc_0SJL4VOj zQkY?Ydkj_~U?z|Pa2bhBz!~o$0v*W6{QpRU`GV3plT#0oIkpHsEbe1;oyQn|iX5LJ z`7fyVW7JDs;qF*t@UrWZ=FmIeUqQaVZq&r!!r(2}^2Jrh{>u`5G2H8o<5T#bJmR|7 zIbhdcrB}j7JV87Ni+k5O#;rd~SHgjV5`N8)>|N)8T@N5m`eFD=_*#B>VmWa+yo&dI N$;lf+eI{$1{eS+O^MC*V diff --git a/src/api/routes.py b/src/api/routes.py index 795a0bf..36b8497 100644 --- a/src/api/routes.py +++ b/src/api/routes.py @@ -1,6 +1,7 @@ +import io import math import os -from flask import Blueprint, jsonify, request +from flask import Blueprint, jsonify, request, session from werkzeug.utils import secure_filename from src.services.tmdb_service import TMDBService from src.services.image_service import ImageService @@ -12,10 +13,9 @@ api_bp = Blueprint('api', __name__) tmdb_service = TMDBService() image_service = ImageService() -UPLOAD_FOLDER = './data' ALLOWED_EXTENSIONS = {'csv'} -csv_file = os.path.join(UPLOAD_FOLDER, 'diary.csv') +user_csvs = {} @lru_cache(maxsize=1000) def get_poster_url(movie_name, movie_year): @@ -28,27 +28,36 @@ def get_poster_url(movie_name, movie_year): @api_bp.route('/movies', methods=['GET']) def get_movies(): + user_id = session.get('user_id') # Récupérer l'ID de l'utilisateur de la session + + if user_id not in user_csvs: + return jsonify({'movies': [], 'message': 'No movies found. Please upload a CSV file.'}), 200 + + # Lire le DataFrame à partir du cache + csv_content = user_csvs[user_id] + try: - if not os.path.exists(csv_file): - return jsonify({'movies': [], 'message': 'No movies found. Please upload a CSV file.'}), 200 + # Si csv_content est une chaîne, il n'est pas nécessaire de décoder + if isinstance(csv_content, bytes): + df = pd.read_csv(io.StringIO(csv_content.decode('utf-8'))) + else: + df = pd.read_csv(io.StringIO(csv_content)) + # Reste de votre code pour la pagination et le traitement... page = int(request.args.get('page', 1)) limit = int(request.args.get('limit', 10)) - - df = pd.read_csv(csv_file) - + df = df.iloc[::-1].reset_index(drop=True) - total_movies = len(df) total_pages = math.ceil(total_movies / limit) - + start_index = (page - 1) * limit end_index = start_index + limit - + df_page = df.iloc[start_index:end_index] - + movies = df_page.to_dict('records') - + movies_with_posters = [ { 'id': start_index + i + 1, @@ -59,7 +68,7 @@ def get_movies(): } for i, movie in enumerate(movies) ] - + return jsonify({ 'movies': movies_with_posters, 'total': total_movies, @@ -88,25 +97,26 @@ def allowed_file(filename): @api_bp.route('/upload-csv', methods=['POST']) def upload_csv(): + user_id = session.get('user_id') + if 'file' not in request.files: return jsonify({'error': 'No file part'}), 400 file = request.files['file'] if file.filename == '': return jsonify({'error': 'No selected file'}), 400 if file and allowed_file(file.filename): - filename = secure_filename(file.filename) - file_path = os.path.join(UPLOAD_FOLDER, filename) - file.save(file_path) + content = file.read() + user_csvs[user_id] = content try: - df = pd.read_csv(file_path) + df = pd.read_csv(io.StringIO(content.decode('utf-8'))) df = df.rename(columns={ 'Date': 'Watched Date', 'Name': 'Name', 'Year': 'Year' }) - df.to_csv(csv_file, index=False) + user_csvs[user_id] = df.to_csv(index=False) return jsonify({'success': True, 'message': 'File uploaded and processed successfully'}), 200 except Exception as e: @@ -115,23 +125,27 @@ def upload_csv(): @api_bp.route('/check-csv', methods=['GET']) def check_csv(): + user_id = session.get('user_id') + try: - if os.path.exists(csv_file): + if user_id in user_csvs: return jsonify({'fileExists': True}), 200 else: return jsonify({'fileExists': False}), 200 except Exception as e: print(f"Error in check_csv: {str(e)}") return jsonify({'error': 'An error occurred while checking the CSV file'}), 500 - + @api_bp.route('/delete-csv', methods=['DELETE']) def delete_csv(): + user_id = session.get('user_id') + try: - if os.path.exists(csv_file): - os.remove(csv_file) + if user_id in user_csvs: + del user_csvs[user_id] return jsonify({'success': True, 'message': 'CSV file deleted successfully'}), 200 else: return jsonify({'error': 'CSV file not found'}), 404 except Exception as e: print(f"Error in delete_csv: {str(e)}") - return jsonify({'error': 'An error occurred while deleting the CSV file'}), 500 \ No newline at end of file + return jsonify({'error': 'An error occurred while deleting the CSV file'}), 500