master
py 215 lines 9.16 KB
Raw
1 from flask import Flask, render_template, request
2
3 from ai_request import AIRequest
4 from datamanager.sqlite_data_manager import SQliteDataManager
5 from data_models import User, Movie
6 from movie_api import OMDBClient
7
8 app = Flask(__name__)
9 app.config['ENV'] = 'production'
10
11 data_manager = SQliteDataManager("sqlite:///movie_app.db")
12
13 # Error handlers
14 @app.errorhandler(404)
15 def page_not_found(e):
16 return render_template("404.html"), 404
17
18
19 @app.errorhandler(500)
20 def internal_server_error(e):
21 return render_template("500.html"), 500
22
23
24 # Home Route with simple navigation
25 @app.route('/')
26 def home():
27 return render_template("home.html")
28
29
30 # Users in a list view
31 @app.route('/users')
32 def list_users():
33 users = data_manager.users
34 return render_template("users.html",users=users)
35
36
37 # User movies in a list view
38 @app.route('/users/<user_id>', methods=["GET", "POST"])
39 def user_movies(user_id):
40 if request.method == "GET":
41 chosen_user = data_manager.get_user(user_id)
42 user_movies_list = data_manager.get_user_movies(user_id)
43 return render_template("user_movies.html", user_movies=user_movies_list,
44 user=chosen_user)
45 elif request.method == "POST":
46 chosen_user = data_manager.get_user(user_id)
47 movie_title = request.form["name"]
48 with data_manager.SessionFactory() as session:
49 movie = session.query(Movie).filter_by(name=movie_title).first()
50 if movie is None:
51 try:
52 movie = data_manager.set_movie(movie_title)
53 if movie is None:
54 raise Exception("Movie not found")
55 data_manager.set_user_movies(user_id=user_id, movie_id=movie.id)
56 user_movies_list = data_manager.get_user_movies(user_id)
57 return render_template("user_movies.html",
58 user_movies=user_movies_list,
59 user=chosen_user, success=True)
60 except Exception as e:
61 session.rollback()
62 user_movies_list = data_manager.get_user_movies(user_id)
63 return render_template("user_movies.html",
64 user_movies=user_movies_list,
65 user=chosen_user, success=False, error=e)
66 else:
67 if data_manager.get_user_movie(user_id, movie.id):
68 return render_template("user_movies.html",
69 user_movies=data_manager.get_user_movies(user_id),
70 user=chosen_user, success=False,
71 error="Movie already exists")
72 try:
73 data_manager.set_user_movies(user_id=user_id, movie_id=movie.id)
74 user_movies_list = data_manager.get_user_movies(user_id)
75 return render_template("user_movies.html",
76 user_movies=user_movies_list,
77 user=chosen_user, success=True)
78 except Exception as e:
79 session.rollback()
80 return render_template("user_movies.html",
81 user_movies=data_manager.get_user_movies(user_id),
82 user=chosen_user, success=False, error=e)
83
84
85 # single user movie view for updating
86 @app.route('/users/<user_id>/<movie_id>', methods=["GET", "POST"])
87 def update_user_movie(user_id, movie_id):
88 if request.method == "GET":
89 chosen_user = data_manager.get_user(user_id)
90 movie = data_manager.get_movie(movie_id)
91 user_movie = data_manager.get_user_movie(user_id, movie_id)
92 return render_template("user_movie.html", user_movie=user_movie,
93 user=chosen_user, movie=movie)
94 elif request.method == "POST":
95 chosen_user = data_manager.get_user(user_id)
96 movie = data_manager.get_movie(movie_id)
97 user_movie = data_manager.get_user_movie(user_id, movie_id)
98 user_rating = request.form["user_rating"]
99 user_comment = request.form["user_comment"] if "user_comment" in request.form else None
100 try:
101 data_manager.update_user_movie(user_id=user_id, movie_id=movie_id,
102 update_data={"user_rating": user_rating,
103 "user_comment": user_comment})
104 new_user_movie = data_manager.get_user_movie(user_id, movie_id)
105 return render_template("user_movie.html", user_movie=new_user_movie,
106 user=chosen_user, movie=movie, success=True)
107 except Exception as e:
108 return render_template("user_movie.html", user_movie=user_movie,
109 user=chosen_user, movie=movie, success=False, error=e)
110
111
112 # Adding new users
113 @app.route('/users/new', methods=["GET", "POST"])
114 def new_user():
115 if request.method == "GET":
116 return render_template("new_user.html")
117 elif request.method == "POST":
118 name = request.form["name"]
119 user = User(name=name)
120 with data_manager.SessionFactory() as session:
121 try:
122 session.add(user)
123 session.commit()
124 return render_template("new_user.html", success=True)
125 except Exception as e:
126 session.rollback()
127 return render_template("new_user.html", success=False, error=e)
128
129
130 # Adding new movies
131 @app.route('/movies/new', methods=["GET", "POST"])
132 def new_movie():
133 if request.method == "GET":
134 return render_template("new_movie.html")
135 elif request.method == "POST":
136 title = request.form["name"]
137 try:
138 newest_movie = data_manager.set_movie(title)
139 return render_template("new_movie.html",
140 movie_name=newest_movie.name, success=True)
141 except Exception as e:
142 error_msg = str(e)
143 return render_template("new_movie.html", movie_name=title,
144 success=False, error = error_msg)
145
146
147 # see list of all movies in database
148 @app.route('/movies', methods=["GET", "POST"])
149 def list_movies():
150 if request.method == "GET":
151 movies = data_manager.movies
152 return render_template("movies.html",movies=movies)
153 elif request.method == "POST":
154 movie_id = request.form["movie_id"]
155 deleted = data_manager.delete_movie(int(movie_id))
156 movies = data_manager.movies
157 return render_template("movies.html", movies=movies, success=deleted)
158
159
160 # get details of a single movie
161 @app.route('/movies/<movie_id>', methods=["GET", "POST"])
162 def movie_details(movie_id):
163 if request.method == "GET":
164 movie = data_manager.get_movie(movie_id)
165 return render_template("movie_details.html", movie=movie)
166 elif request.method == "POST":
167 movie_id = request.form["movie_id"]
168 deleted = data_manager.delete_movie(int(movie_id))
169 movies = data_manager.movies
170 return render_template("movies.html", movies=movies, success=deleted)
171
172 # delete user movie from database
173 @app.route('/users/<user_id>/delete/<movie_id>', methods=["GET", "POST"])
174 def delete_user_movie(user_id, movie_id):
175 if request.method == "GET":
176 chosen_user = data_manager.get_user(user_id)
177 movie = data_manager.get_movie(movie_id)
178 user_movie = data_manager.get_user_movie(user_id, movie_id)
179 return render_template("user_movie.html", user_movie=user_movie,
180 user=chosen_user, movie=movie)
181 elif request.method == "POST":
182 deleted = data_manager.delete_user_movie(user_id, movie_id)
183 chosen_user = data_manager.get_user(user_id)
184 movie = data_manager.get_movie(movie_id)
185 user_movies_list = data_manager.get_user_movies(user_id)
186 return render_template("user_movies.html", user_movies=user_movies_list,
187 user=chosen_user, movie=movie, movie_deleted=deleted)
188
189
190 # movie recommendation from AI
191 @app.route('/users/<user_id>/recommend_movie', methods=["GET", "POST"])
192 def recommendation(user_id):
193 if request.method == "GET":
194 chosen = data_manager.get_user(user_id)
195 return render_template("recommend.html", user=chosen)
196 elif request.method == "POST":
197 chosen= data_manager.get_user(user_id)
198 data_string = ""
199 for movie in data_manager.get_user_movies(user_id):
200 data_string += f"Title: {movie["name"]} User Rating: {movie['user_rating']},"
201 if "name" in request.form:
202 recommend = AIRequest().ai_excluded_movie_request(data_string,request.form[
203 "name"])
204 else:
205 recommend = AIRequest().ai_request(data_string)
206 poster = OMDBClient().get_movie(recommend["movie"]["title"])
207 recommend["movie"]["poster"] = poster["poster"]
208 recommend["movie"]["imdb"] = poster["rating"]
209 return render_template("recommend.html", user=chosen, movie=recommend["movie"], reasoning=recommend["reasoning"])
210
211
212 if __name__ == "__main__":
213
214 app.run(debug=True,host="127.0.0.1",port=5000)
215