Beispiel #1
0
def register():
    form = RegistrationForm()
    username_not_unique = None

    if form.validate_on_submit():
        # Successful POST, i.e. the username and password have passed validation checking.
        # Use the service layer to attempt to add the new user.
        try:
            services.add_user(form.username.data, form.password.data, repo.repo_instance)

            # All is well, redirect the user to the login page.
            return redirect(url_for('authentication_bp.login'))
        except services.NameNotUniqueException:
            username_not_unique = 'Your username is already taken - please supply another'

    # For a GET or a failed POST request, return the Registration Web page.
    return render_template(
        'authentication/credentials.html',
        title='Register',
        form=form,
        username_error_message=username_not_unique,
        handler_url=url_for('authentication_bp.register'),
        selected_movies=utilities.get_selected_movies(),
        genre_urls=utilities.get_genres_and_urls()
    )
Beispiel #2
0
def home():
    return render_template(
        'home/home.html',
        selected_movies=utilities.get_selected_movies(),
        genre_urls=utilities.get_genres_and_urls(),
        actor_urls=utilities.get_actors_and_urls(),
        director_urls=utilities.get_directors_and_urls(),
    )
Beispiel #3
0
def movies_by_genre():
    movies_per_page = 3

    # Read query parameters.
    genre_name = request.args.get('genre')
    cursor = request.args.get('cursor')

    if cursor is None:
        # No cursor query parameter, so initialise cursor to start at the beginning.
        cursor = 0
    else:
        # Convert cursor from string to int.
        cursor = int(cursor)

    # Retrieve movie ranks for movies has the genre of genre_name.
    movie_ranks = services.get_movies_ranks_for_genre(genre_name, repo.repo_instance)

    movies = services.get_movies_by_rank(movie_ranks[cursor:cursor + movies_per_page], repo.repo_instance)

    first_movie_url = None
    last_movie_url = None
    next_movie_url = None
    prev_movie_url = None

    if cursor > 0:
        # There are preceding movies, so generate URLs for the 'previous' and 'first' navigation buttons.
        prev_movie_url = url_for('movies_bp.movies_by_genre', genre=genre_name, cursor=cursor - movies_per_page)
        first_movie_url = url_for('movies_bp.movies_by_genre', genre=genre_name)

    if cursor + movies_per_page < len(movie_ranks):
        # There are further movies, so generate URLs for the 'next' and 'last' navigation buttons.
        next_movie_url = url_for('movies_bp.movies_by_genre', genre=genre_name, cursor=cursor + movies_per_page)

        last_cursor = movies_per_page * int(len(movie_ranks) / movies_per_page)
        if len(movie_ranks) % movies_per_page == 0:
            last_cursor -= movies_per_page
        last_movie_url = url_for('movies_bp.movies_by_genre', genre=genre_name, cursor=last_cursor)

    # Generate the webpage to display the movies.
    return render_template(
        'movies/movies.html',
        title='Movies',
        movies_title='Movies with genre ' + genre_name,
        movies=movies,
        selected_movies=utilities.get_selected_movies(len(movies) * 2),
        genre_urls=utilities.get_genres_and_urls(),
        first_movie_url=first_movie_url,
        last_movie_url=last_movie_url,
        prev_movie_url=prev_movie_url,
        next_movie_url=next_movie_url,
    )
Beispiel #4
0
def review_on_movie():
    # Obtain the username of the currently logged in user.
    username = session['username']

    # Create form. The form maintains state, e.g. when this method is called with a HTTP GET request and populates
    # the form with an movie id, when subsequently called with a HTTP POST request, the movie id remains in the
    # form.
    form = ReviewForm()

    if form.validate_on_submit():
        # Successful POST, i.e. the review text has passed data validation.
        # Extract the movie id, representing the reviewed movie, from the form.
        movie_id = int(form.movie_id.data)

        # Use the service layer to store the new review.
        services.add_review(movie_id, form.review.data, username,
                            repo.repo_instance)

        # Retrieve the movie in dict form.
        movie = services.get_movie(movie_id, repo.repo_instance)

        # Cause the web browser to display the page of all movies that have the same date as the reviewed movie,
        # and display all reviews, including the new review.
        return redirect(
            url_for('news_bp.movies_by_date',
                    date=movie['date'],
                    view_reviews_for=movie_id))

    if request.method == 'GET':
        # Request is a HTTP GET to display the form.
        # Extract the movie id, representing the movie to review, from a query parameter of the GET request.
        movie_id = int(request.args.get('movie'))

        # Store the movie id in the form.
        form.movie_id.data = movie_id
    else:
        # Request is a HTTP POST where form validation has failed.
        # Extract the movie id of the movie being reviewed from the form.
        movie_id = int(form.movie_id.data)

    # For a GET or an unsuccessful POST, retrieve the movie to review in dict form, and return a Web page that allows
    # the user to enter a review. The generated Web page includes a form object.
    movie = services.get_movie(movie_id, repo.repo_instance)
    return render_template('news/review_on_movie.html',
                           title='Edit movie',
                           movie=movie,
                           form=form,
                           handler_url=url_for('news_bp.review_on_movie'),
                           selected_movies=utilities.get_selected_movies(),
                           genre_urls=utilities.get_genres_and_urls())
Beispiel #5
0
def movie_by_rank():
    # Read query parameters.
    target_rank = request.args.get('rank')

    # Fetch the first and last movies in the series.
    first_movie = services.get_first_movie(repo.repo_instance)
    last_movie = services.get_last_movie(repo.repo_instance)

    if target_rank is None:
        # No date query parameter, so return movies starting from rank 1 of the series.
        target_rank = first_movie['rank']
    else:
        target_rank = int(target_rank)

    movie, previous_rank, next_rank = services.get_movie_by_a_rank(target_rank, repo.repo_instance)

    movies_to_display = services.mov_on_page(target_rank, repo.repo_instance)

    first_movie_url = None
    last_movie_url = None
    next_movie_url = None
    prev_movie_url = None

    if movie is not None:
        # There is a movie with the given rank
        if previous_rank is not None:
            # There is a movie with -1 smaller rank. So generate URLs for the 'previous' and 'first' navigation buttons.
            prev_movie_url = url_for('movies_bp.movie_by_rank', rank=previous_rank)
            first_movie_url = url_for('movies_bp.movie_by_rank', rank=first_movie['rank'])
        if next_rank is not None:
            # There are movies with +1 larger rank, so generate URLs for the 'next' and 'last' navigation buttons.
            next_movie_url = url_for('movies_bp.movie_by_rank', rank=next_rank)
            last_movie_url = url_for('movies_bp.movie_by_rank', rank=last_movie['rank'])

        # Generate the webpage to display the articles.
        return render_template(
            'movies/movies.html',
            title='Movies',
            movie_title=target_rank,
            movies=movie,
            selected_movies=utilities.get_selected_movies(8),
            selected_movies_on_page=movies_to_display,
            genre_urls=utilities.get_genres_and_urls(),
            first_movie_url=first_movie_url,
            last_movie_url=last_movie_url,
            prev_movie_url=prev_movie_url,
            next_movie_url=next_movie_url,
        )
    # No articles to show, so return the homepage.
    return redirect(url_for('home_bp.home'))
Beispiel #6
0
def home():
    username = session.get('username')

    movies_per_page = 4
    cursor = request.args.get("cursor", 0, type=int)

    filter_form = utilities.FilterForm()
    sign_up_form = utilities.RegistrationForm()
    login_form = utilities.LoginForm()

    selected_movies = utilities.get_selected_movies()

    movie_ids = get_all_movie_ids(repo.repo_instance)
    movies = get_movies_by_id(movie_ids[cursor:cursor + movies_per_page],
                              repo.repo_instance)
    genres = services.get_genre_names(repo.repo_instance)

    first_movie_url = None
    last_movie_url = None
    next_movie_url = None
    prev_movie_url = None

    if cursor > 0:
        prev_movie_url = url_for("home_bp.home",
                                 cursor=cursor - movies_per_page)
        first_movie_url = url_for("home_bp.home")
    if cursor + movies_per_page < len(movie_ids):
        next_movie_url = url_for("home_bp.home",
                                 cursor=cursor + movies_per_page)
        last_cursor = movies_per_page * int(len(movie_ids) / movies_per_page)
        if len(movie_ids) % movies_per_page == 0:
            last_cursor -= movies_per_page
        last_movie_url = url_for("home_bp.home", cursor=last_cursor)

    return render_template(
        'home.html',
        movies=movies,
        genres=genres,
        selected_movies=selected_movies,
        first_movie_url=first_movie_url,
        last_movie_url=last_movie_url,
        next_movie_url=next_movie_url,
        prev_movie_url=prev_movie_url,
        filter_form=filter_form,
        sign_up_form=sign_up_form,
        login_form=login_form,
        username=username,
    )
Beispiel #7
0
def get_movie_by_id(id):
    username = session.get('username')

    filter_form = utilities.FilterForm()
    sign_up_form = utilities.RegistrationForm()
    login_form = utilities.LoginForm()
    comment_form = utilities.CommentForm()

    movie = services.get_movie(id, repo.repo_instance)
    genres = get_genre_names(repo.repo_instance)
    selected_movies = utilities.get_selected_movies()
    return render_template(
        "details.html",
        movie=movie,
        genres=genres,
        selected_movies=selected_movies,
        filter_form=filter_form,
        sign_up_form=sign_up_form,
        login_form=login_form,
        comment_form=comment_form,
        username=username,
    )
Beispiel #8
0
def login():
    form = LoginForm()
    username_not_recognised = None
    password_does_not_match_username = None

    if form.validate_on_submit():
        # Successful POST, i.e. the username and password have passed validation checking.
        # Use the service layer to lookup the user.
        try:
            user = services.get_user(form.username.data, repo.repo_instance)

            # Authenticate user.
            services.authenticate_user(user['username'], form.password.data, repo.repo_instance)

            # Initialise session and redirect the user to the home page.
            session.clear()
            session['username'] = user['username']
            return redirect(url_for('home_bp.home'))

        except services.UnknownUserException:
            # Username not known to the system, set a suitable error message.
            username_not_recognised = 'Username not recognised - please supply another'

        except services.AuthenticationException:
            # Authentication failed, set a suitable error message.
            password_does_not_match_username = '******'

    # For a GET or a failed POST, return the Login Web page.
    return render_template(
        'authentication/credentials.html',
        title='Login',
        username_error_message=username_not_recognised,
        password_error_message=password_does_not_match_username,
        form=form,
        selected_movies=utilities.get_selected_movies(),
        genre_urls=utilities.get_genres_and_urls()
    )
Beispiel #9
0
def watchlist():
    username = session['username']
    user_watchlist = services.get_watchlist(username, repo.repo_instance)

    movies_per_page = 3

    # Read query parameters.
    cursor = request.args.get('cursor')
    movie_to_show_reviews = request.args.get('view_reviews_for')

    if movie_to_show_reviews is None:
        # No view-reviews query parameter, so set to a non-existent movie id.
        movie_to_show_reviews = -1
    else:
        # Convert movie_to_show_reviews from string to int.
        movie_to_show_reviews = int(movie_to_show_reviews)

    if cursor is None:
        # No cursor query parameter, so initialise cursor to start at the beginning.
        cursor = 0
    else:
        # Convert cursor from string to int.
        cursor = int(cursor)

    # Retrieve the batch of movies to display on the Web page.
    movies = services.movies_to_dict(user_watchlist)

    first_movie_url = None
    last_movie_url = None
    next_movie_url = None
    prev_movie_url = None

    if cursor > 0:
        # There are preceding movies, so generate URLs for the 'previous' and 'first' navigation buttons.
        prev_movie_url = url_for('movie_library_bp.watchlist',
                                 cursor=cursor - movies_per_page)
        first_movie_url = url_for('movie_library_bp.watchlist')

    if cursor + movies_per_page < len(movies):
        # There are further movies, so generate URLs for the 'next' and 'last' navigation buttons.
        next_movie_url = url_for('movie_library_bp.watchlist',
                                 cursor=cursor + movies_per_page)

        last_cursor = movies_per_page * int(len(movies) / movies_per_page)
        if len(movies) % movies_per_page == 0:
            last_cursor -= movies_per_page
        last_movie_url = url_for('movie_library_bp.watchlist',
                                 cursor=last_cursor)

    # Construct urls for viewing movie reviews and adding reviews.
    for movie in movies:
        movie['view_review_url'] = url_for('movie_library_bp.watchlist',
                                           cursor=cursor,
                                           view_reviews_for=movie['id'])
        movie['add_review_url'] = url_for(
            'movie_library_bp.write_review_on_movie', movie=movie['id'])
        movie['add_to_watchlist_url'] = url_for(
            'movie_library_bp.add_to_watchlist', movie=movie['id'])
        movie['remove_from_watchlist_url'] = url_for(
            'movie_library_bp.remove_from_watchlist', movie=movie['id'])
    # Generate the webpage to display the movies.
    return render_template('movie_library/movies.html',
                           title='Movies',
                           movies_title=username + "'s Watch List",
                           movies=movies,
                           selected_movies=utilities.get_selected_movies(3),
                           actor_urls=utilities.get_actors_and_urls(),
                           director_urls=utilities.get_directors_and_urls(),
                           genre_urls=utilities.get_genres_and_urls(),
                           first_movie_url=first_movie_url,
                           last_movie_url=last_movie_url,
                           prev_movie_url=prev_movie_url,
                           next_movie_url=next_movie_url,
                           show_reviews_for_movie=movie_to_show_reviews,
                           is_watchlist=True)
Beispiel #10
0
def movies_by_rank():
    # Read query parameters.
    target_id = request.args.get('id')
    movie_to_show_reviews = request.args.get('view_reviews_for')

    # Fetch the first and last movies in the series.
    first_movie = services.get_first_movie(repo.repo_instance)
    last_movie = services.get_last_movie(repo.repo_instance)

    if target_id is None:
        # No id query parameter, so return movies from day 1 of the series.
        target_id = first_movie['id']
    else:
        # Convert target_year from string to int.
        target_id = int(target_id)

    if movie_to_show_reviews is None:
        # No view-reviews query parameter, so set to a non-existent movie id.
        movie_to_show_reviews = -1
    else:
        # Convert movie_to_show_reviews from string to int.
        movie_to_show_reviews = int(movie_to_show_reviews)

    # Fetch movie(s) for the target id. This call also returns the previous and next ids for movies immediately
    # before and after the target.
    movies, previous_id, next_id = services.get_movies_by_rank(
        target_id, repo.repo_instance)

    first_movie_url = None
    last_movie_url = None
    next_movie_url = None
    prev_movie_url = None

    if len(movies) > 0:
        # There's at least one movie for the target id.
        if previous_id is not None:
            # There are movie on a previous id, so generate URLs for the 'previous' and 'first' navigation buttons.
            prev_movie_url = url_for('movie_library_bp.movies_by_rank',
                                     id=previous_id)
            first_movie_url = url_for('movie_library_bp.movies_by_rank',
                                      id=first_movie['id'])

        # There are movies subsequent, so generate URLs for the 'next' and 'last' navigation buttons.
        if next_id is not None:
            next_movie_url = url_for('movie_library_bp.movies_by_rank',
                                     id=next_id)
            last_movie_url = url_for('movie_library_bp.movies_by_rank',
                                     id=last_movie['id'])

        # Construct urls for viewing movie reviews and adding reviews.
        for movie in movies:
            movie['view_review_url'] = url_for(
                'movie_library_bp.movies_by_rank',
                id=target_id,
                view_reviews_for=movie['id'])
            movie['add_review_url'] = url_for(
                'movie_library_bp.write_review_on_movie', movie=movie['id'])
            movie['add_to_watchlist_url'] = url_for(
                'movie_library_bp.add_to_watchlist', movie=movie['id'])
        # Generate the webpage to display the movies.
        return render_template(
            'movie_library/movies.html',
            title='Movies',
            movies_title="Ranked: " + str(target_id),
            movies=movies,
            selected_movies=utilities.get_selected_movies(3),
            actor_urls=utilities.get_actors_and_urls(),
            director_urls=utilities.get_directors_and_urls(),
            genre_urls=utilities.get_genres_and_urls(),
            first_movie_url=first_movie_url,
            last_movie_url=last_movie_url,
            prev_movie_url=prev_movie_url,
            next_movie_url=next_movie_url,
            show_reviews_for_movie=movie_to_show_reviews,
            is_watchlist=False)

    # No movies to show, so return the homepage.
    return redirect(url_for('home_bp.home'))
Beispiel #11
0
def movies_by_genre():
    movies_per_page = 5

    # Read query parameters.
    genre_name = request.args.get('genre')
    cursor = request.args.get('cursor')
    movie_to_show_reviews = request.args.get('view_reviews_for')

    if movie_to_show_reviews is None:
        # No view-reviews query parameter, so set to a non-existent movie id.
        movie_to_show_reviews = -1
    else:
        # Convert movie_to_show_reviews from string to int.
        movie_to_show_reviews = int(movie_to_show_reviews)

    if cursor is None:
        # No cursor query parameter, so initialise cursor to start at the beginning.
        cursor = 0
    else:
        # Convert cursor from string to int.
        cursor = int(cursor)

    # Retrieve movie ids for movies that are genreged with genre_name.
    movie_ids = services.get_movie_ids_for_genre(genre_name,
                                                 repo.repo_instance)

    # Retrieve the batch of movies to display on the Web page.
    movies = services.get_movies_by_id(
        movie_ids[cursor:cursor + movies_per_page], repo.repo_instance)

    first_movie_url = None
    last_movie_url = None
    next_movie_url = None
    prev_movie_url = None

    if cursor > 0:
        # There are preceding movies, so generate URLs for the 'previous' and 'first' navigation buttons.
        prev_movie_url = url_for('news_bp.movies_by_genre',
                                 genre=genre_name,
                                 cursor=cursor - movies_per_page)
        first_movie_url = url_for('news_bp.movies_by_genre', genre=genre_name)

    if cursor + movies_per_page < len(movie_ids):
        # There are further movies, so generate URLs for the 'next' and 'last' navigation buttons.
        next_movie_url = url_for('news_bp.movies_by_genre',
                                 genre=genre_name,
                                 cursor=cursor + movies_per_page)

        last_cursor = movies_per_page * int(len(movie_ids) / movies_per_page)
        if len(movie_ids) % movies_per_page == 0:
            last_cursor -= movies_per_page
        last_movie_url = url_for('news_bp.movies_by_genre',
                                 genre=genre_name,
                                 cursor=last_cursor)

    # Construct urls for viewing movie reviews and adding reviews.
    for movie in movies:
        movie['view_review_url'] = url_for('news_bp.movies_by_genre',
                                           genre=genre_name,
                                           cursor=cursor,
                                           view_reviews_for=movie['id'])
        movie['add_review_url'] = url_for('news_bp.review_on_movie',
                                          movie=movie['id'])

    # Generate the webpage to display the movies.
    return render_template('news/articles.html',
                           title='Movies',
                           movies_title='Movies by ' + genre_name,
                           movies=movies,
                           selected_movies=utilities.get_selected_movies(
                               len(movies) * 2),
                           genre_urls=utilities.get_genres_and_urls(),
                           first_movie_url=first_movie_url,
                           last_movie_url=last_movie_url,
                           prev_movie_url=prev_movie_url,
                           next_movie_url=next_movie_url,
                           show_reviews_for_movie=movie_to_show_reviews)
Beispiel #12
0
def movies_by_date():
    # Read query parameters.
    target_date = request.args.get('date')
    movie_to_show_reviews = request.args.get('view_reviews_for')

    # Fetch the first and last movies in the series.
    first_movie = services.get_first_movie(repo.repo_instance)
    last_movie = services.get_last_movie(repo.repo_instance)

    if target_date is None:
        # No date query parameter, so return movies from day 1 of the series.
        target_date = first_movie['date']
    else:
        # Convert target_date from string to date.
        target_date = date.fromisoformat(target_date)

    if movie_to_show_reviews is None:
        # No view-reviews query parameter, so set to a non-existent movie id.
        movie_to_show_reviews = -1
    else:
        # Convert movie_to_show_reviews from string to int.
        movie_to_show_reviews = int(movie_to_show_reviews)

    # Fetch movie(s) for the target date. This call also returns the previous and next dates for movies immediately
    # before and after the target date.
    movies, previous_date, next_date = services.get_movies_by_date(
        target_date, repo.repo_instance)

    first_movie_url = None
    last_movie_url = None
    next_movie_url = None
    prev_movie_url = None

    if len(movies) > 0:
        # There's at least one movie for the target date.
        if previous_date is not None:
            # There are movies on a previous date, so generate URLs for the 'previous' and 'first' navigation buttons.
            prev_movie_url = url_for('news_bp.movies_by_date',
                                     date=previous_date.isoformat())
            first_movie_url = url_for('news_bp.movies_by_date',
                                      date=first_movie['date'].isoformat())

        # There are movies on a subsequent date, so generate URLs for the 'next' and 'last' navigation buttons.
        if next_date is not None:
            next_movie_url = url_for('news_bp.movies_by_date',
                                     date=next_date.isoformat())
            last_movie_url = url_for('news_bp.movies_by_date',
                                     date=last_movie['date'].isoformat())

        # Construct urls for viewing movie reviews and adding reviews.
        for movie in movies:
            movie['view_review_url'] = url_for('news_bp.movies_by_date',
                                               date=target_date,
                                               view_reviews_for=movie['id'])
            movie['add_review_url'] = url_for('news_bp.review_on_movie',
                                              movie=movie['id'])

        # Generate the webpage to display the movies.
        return render_template(
            'news/articles.html',
            title='Movies',
            movies_title='Movies made in ' + target_date.strftime('%Y'),
            movies=movies,
            selected_movies=utilities.get_selected_movies(len(movies) * 2),
            genre_urls=utilities.get_genres_and_urls(),
            first_movie_url=first_movie_url,
            last_movie_url=last_movie_url,
            prev_movie_url=prev_movie_url,
            next_movie_url=next_movie_url,
            show_reviews_for_movie=movie_to_show_reviews)

    # No movies to show, so return the homepage.
    return redirect(url_for('home_bp.home'))
def movies_by_actor():
    movies_per_page = 3

    actor_name = request.args.get('actor')
    cursor = request.args.get('cursor')
    movie_to_show_reviews = request.args.get('view_reviews_for')

    if movie_to_show_reviews is None:
        movie_to_show_reviews = -1
    else:
        movie_to_show_reviews = int(movie_to_show_reviews)

    if cursor is None:
        cursor = 0
    else:
        cursor = int(cursor)

    movie_ids = services.get_movie_ids_for_actor(actor_name,
                                                 repo.repo_instance)
    movies = services.get_movies_by_id(
        movie_ids[cursor:cursor + movies_per_page], repo.repo_instance)

    first_movie_url = None
    last_movie_url = None
    next_movie_url = None
    prev_movie_url = None

    if cursor > 0:
        prev_movie_url = url_for('movie_bp.movies_by_actor',
                                 actor=actor_name,
                                 cursor=cursor - movies_per_page)
        first_movie_url = url_for('movie_bp.movies_by_actor', actor=actor_name)

    if cursor + movies_per_page < len(movie_ids):
        next_movie_url = url_for('movie_bp.movies_by_actor',
                                 actor=actor_name,
                                 cursor=cursor + movies_per_page)

        last_cursor = movies_per_page * int(len(movie_ids) / movies_per_page)
        if len(movie_ids) % movies_per_page == 0:
            last_cursor -= movies_per_page
        last_movie_url = url_for('movie_bp.movies_by_actor',
                                 actor=actor_name,
                                 cursor=last_cursor)

    for movie in movies:
        movie['view_review_url'] = url_for('movie_bp.movies_by_actor',
                                           actor=actor_name,
                                           cursor=cursor,
                                           view_reviews_for=movie['id'])
        movie['add_review_url'] = url_for('movie_bp.review_on_movie',
                                          movie=movie['id'])
        movie['add_to_watchlist_url'] = url_for('movie_bp.add_to_watchlist',
                                                movie=movie['id'])

    return render_template('movie/movies.html',
                           title='Movies',
                           movies_title='Movies featuring ' + actor_name,
                           movies=movies,
                           selected_movies=utilities.get_selected_movies(3),
                           actor_urls=utilities.get_actors_and_urls(),
                           director_urls=utilities.get_directors_and_urls(),
                           genre_urls=utilities.get_genres_and_urls(),
                           first_movie_url=first_movie_url,
                           last_movie_url=last_movie_url,
                           prev_movie_url=prev_movie_url,
                           next_movie_url=next_movie_url,
                           show_reviews_for_movie=movie_to_show_reviews,
                           is_watchlist=False)
def movies_by_id():
    # Read query parameters.
    target_id = request.args.get('id')
    movie_to_show_reviews = request.args.get('view_reviews_for')

    first_movie = services.get_first_movie(repo.repo_instance)
    last_movie = services.get_last_movie(repo.repo_instance)

    if target_id is None:
        target_id = first_movie['id']

    else:
        target_id = int(target_id)

    if movie_to_show_reviews is None:
        movie_to_show_reviews = -1

    else:
        movie_to_show_reviews = int(movie_to_show_reviews)

    movies, previous_id, next_id = services.get_top_movies(
        target_id, repo.repo_instance)

    first_movie_url = None
    last_movie_url = None
    next_movie_url = None
    prev_movie_url = None

    if len(movies) > 0:
        if previous_id is not None:
            prev_movie_url = url_for('movie_bp.movies_by_id', id=previous_id)
            first_movie_url = url_for('movie_bp.movies_by_id',
                                      id=first_movie['id'])

        if next_id is not None:
            next_movie_url = url_for('movie_bp.movies_by_id', id=next_id)
            last_movie_url = url_for('movie_bp.movies_by_id',
                                     id=last_movie['id'])

        for movie in movies:
            movie['view_review_url'] = url_for('movie_bp.movies_by_id',
                                               id=target_id,
                                               view_reviews_for=movie['id'])
            movie['add_review_url'] = url_for('movie_bp.review_on_movie',
                                              movie=movie['id'])
            movie['add_to_watchlist_url'] = url_for(
                'movie_bp.add_to_watchlist', movie=movie['id'])

        return render_template(
            'movie/movies.html',
            title='Movies',
            movies_title="Ranked: " + str(target_id),
            movies=movies,
            selected_movies=utilities.get_selected_movies(3),
            actor_urls=utilities.get_actors_and_urls(),
            director_urls=utilities.get_directors_and_urls(),
            genre_urls=utilities.get_genres_and_urls(),
            first_movie_url=first_movie_url,
            last_movie_url=last_movie_url,
            prev_movie_url=prev_movie_url,
            next_movie_url=next_movie_url,
            show_reviews_for_movie=movie_to_show_reviews,
            is_watchlist=False)

    # No movies to show, so return the homepage.
    return redirect(url_for('home_bp.home'))
Beispiel #15
0
def filter_movies():
    username = session.get('username')

    filter_form = utilities.FilterForm()
    sign_up_form = utilities.RegistrationForm()
    login_form = utilities.LoginForm()

    if filter_form.validate_on_submit():
        return redirect(
            url_for("movies_bp.filter_movies",
                    genre=filter_form.genre.data,
                    actor=filter_form.actor.data,
                    director=filter_form.director.data))

    movies_per_page = 4
    cursor = request.args.get("cursor", 0, type=int)

    selected_movies = utilities.get_selected_movies()

    genre_name = request.args.get("genre", '')
    actor_name = request.args.get("actor", '')
    director_name = request.args.get("director", '')

    movie_ids = services.filter_movies(actor_name, director_name, genre_name,
                                       repo.repo_instance)
    movies = services.get_movies_by_id(
        movie_ids[cursor:cursor + movies_per_page], repo.repo_instance)
    genres = get_genre_names(repo.repo_instance)

    first_movie_url = None
    last_movie_url = None
    next_movie_url = None
    prev_movie_url = None

    if cursor > 0:
        prev_movie_url = url_for("movies_bp.filter_movies",
                                 cursor=cursor - movies_per_page,
                                 genre=genre_name.lower(),
                                 actor=actor_name.lower(),
                                 director=director_name.lower())
        first_movie_url = url_for("movies_bp.filter_movies")
    if cursor + movies_per_page < len(movie_ids):
        next_movie_url = url_for("movies_bp.filter_movies",
                                 cursor=cursor + movies_per_page,
                                 genre=genre_name.lower(),
                                 actor=actor_name.lower(),
                                 director=director_name.lower())
        last_cursor = movies_per_page * int(len(movie_ids) / movies_per_page)
        if len(movie_ids) % movies_per_page == 0:
            last_cursor -= movies_per_page
        last_movie_url = url_for("movies_bp.filter_movies",
                                 cursor=last_cursor,
                                 genre=genre_name.lower(),
                                 actor=actor_name.lower(),
                                 director=director_name.lower())

    return render_template(
        'home.html',
        movies=movies,
        genres=genres,
        selected_movies=selected_movies,
        first_movie_url=first_movie_url,
        last_movie_url=last_movie_url,
        next_movie_url=next_movie_url,
        prev_movie_url=prev_movie_url,
        filter_form=filter_form,
        sign_up_form=sign_up_form,
        login_form=login_form,
        username=username,
    )