Flask website giving unpredictable paginations on multi pagination page

Viewed 39

So i am making a review website, and one of the website pages I display all the reviews and have filter options to filter by latest and oldest reviews and another drop down menu filter to filter by a value (course). Everything seems to work well, but I notice every now and then it break when I use the drop down menu filter, and a I try to click on the next page of the pagination (if there is one) it will go back to a previous value review I filtered by.

# Reviews page
latest_posts = True    # Flag to check if we need to grab the latest posts
setup = True    # Flag to check if we need to setup the filter course dropdown
courses = ['ALL']    # List of all courses to allow user to filter by course
current_course_filter = 'ALL'    # Current course filter

@main.route("/reviews", methods=['GET', 'POST'])
def reviews():
    # Need to make this global so we can change it in the function
    global latest_posts, setup, current_course_filter
    
    # Paginate / Pagination is where we split items (posts/reviews) into separate pages for readability
    # and also to prevent longer loading times for each page
    page = request.args.get('page', 1, type=int)    # default 1
    
    # TODO FIX ISSUE WITH PAGINATION ON REVIEWS PAGE FOR FILTERED REVIEWS
    
    # Grab 5 posts per page (default)
    if latest_posts:
        if current_course_filter != 'ALL':    # If we have a course filter then filter by that
            posts = Reviews.query.filter_by(course=current_course_filter).order_by(Reviews.date.desc()).paginate(page=page, per_page=5)
        else:
            posts = Reviews.query.order_by(Reviews.date.desc()).paginate(page=page, per_page=5)
    else:
        if current_course_filter != 'ALL':
            posts = Reviews.query.filter_by(course=current_course_filter).order_by(Reviews.date.asc()).paginate(page=page, per_page=5)
        else:
            posts = Reviews.query.order_by(Reviews.date.asc()).paginate(page=page, per_page=5)
    
    # Check if we receive a POST request
    if request.method == "POST":
        if request.form.get("latest"):
            if current_course_filter != 'ALL':
                posts = Reviews.query.filter_by(course=current_course_filter).order_by(Reviews.date.desc()).paginate(page=page, per_page=5)
            else:
                posts = Reviews.query.order_by(Reviews.date.desc()).paginate(page=page, per_page=5)
            latest_posts = True
        elif request.form.get("oldest"):
            if current_course_filter != 'ALL':
                posts = Reviews.query.filter_by(course=current_course_filter).order_by(Reviews.date.asc()).paginate(page=page, per_page=5)
            else:
                posts = Reviews.query.order_by(Reviews.date.asc()).paginate(page=page, per_page=5)
            latest_posts = False
        elif request.form.get("course_select"):
            course_selection = request.form.get('course_select')
            current_course_filter = course_selection    # Update the current course filter
            
            if course_selection == 'ALL':    # If we select 'ALL' then we want to grab all posts
                posts = Reviews.query.order_by(Reviews.date.desc()).paginate(page=page, per_page=5)
            else:
                posts = Reviews.query.filter_by(course=course_selection).order_by(Reviews.date.desc()).paginate(page=page, per_page=5)
    
    # Check if we need to setup the filter course dropdown
    if setup:
        for value in Reviews.query.distinct(Reviews.course):    # Grab all unique courses
            courses.append(value.course)
        setup = False
    
    return render_template("reviews.html", reviews=posts, courses=courses)
0 Answers
Related