| 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 |