courseAid / app /controllers /review_controller.py
atharvp's picture
fixed assistant errors
b74eb81
Raw History Blame Contribute Delete
8.31 kB
import psycopg2
from flask import request, jsonify, render_template, session, flash, redirect, url_for
from ..models.intructors import Instructor
from ..models import reviews as r
from ..models.reviews import Reviews
from ..utils.helper import validate_instructor, get_consensus_summary, update_summary_cache
def get_user_reviews(conn):
cursor = conn.cursor()
message = ""
username = session.get("user_id")
try:
result = []
rows = Reviews.get_user_past_reviews(cursor, username)
for row in rows:
result.append({
'review_id': row[0],
'comment': row[1],
'rating': row[2],
'post_time': row[3],
'last_updated': row[4],
'course_number': row[5],
'instructor_first': row[6],
'instructor_last': row[7],
})
except psycopg2.Error as e:
message = f"Error getting reviews for {username}: {e}"
finally:
cursor.close()
conn.close()
return render_template("reviews/pastreviews.html", reviews=result,
message = message, message_type="info")
def get_reviews_for_instructor(conn, instructor_name):
cursor = conn.cursor()
message = ""
validate_instructor_results = validate_instructor(cursor, instructor_name )
if (validate_instructor_results):
instructor_first, instructor_last = validate_instructor_results
else:
message += "Instructor does not exist"
cursor.close()
return render_template("reviews/professor_reviews.html", reviews=[], message=message)
try:
print("getting summary...")
consensus_summary = get_consensus_summary(instructor_first, instructor_last)
print("got summary")
print(consensus_summary)
print("getting departments")
departments = Instructor.get_departments_of_instructor(cursor, instructor_name)
print("got departments")
print("getting courses")
courses = Instructor.get_courses_of_instructor(cursor, instructor_name)
print("got courses")
print("getting avg rating")
avg_rating = Instructor.get_average_rating(cursor, instructor_name)
print("got avg rating")
if not departments:
departments = []
if not courses:
courses = []
if not avg_rating:
avg_rating = 'NA'
username = session.get("user_id")
instructor_info = {
'first_name': instructor_first,
'last_name': instructor_last,
'courses': courses,
'departments': departments,
'avg_rating': avg_rating,
'consensus_summary': consensus_summary
}
print("getting reviews")
result = Reviews.get_reviews_for_instructor(cursor, instructor_first, instructor_last, username)
print("got reviews")
if not result:
message += "No reviews found for this instructor"
except Exception as e:
message = f"Error getting reviews for {instructor_name}: {e}"
result = []
instructor_info = {
'first_name': instructor_first,
'last_name': instructor_last,
'courses': [],
'departments': [],
'avg_rating': 'N/A',
'consensus_summary': "N/A"
}
finally:
cursor.close()
conn.close()
return render_template("reviews/professor_reviews.html",
reviews=result,
message=message,
instructor_name=f"{instructor_first} {instructor_last}",
instructor_info=instructor_info, )
def edit_review(review_id, conn):
cursor = conn.cursor()
message = ""
try:
if Reviews.check_review_exists(cursor, session.get("user_id"), review_id) is None:
cursor.close()
message += "No review found for this username"
return jsonify({
'success': False,
'message': message
})
data = request.get_json()
new_comment = data.get('comment')
new_rating = data.get('rating')
Reviews.edit_review(cursor,new_comment, new_rating, session.get("user_id"), review_id)
conn.commit()
cursor.close()
message = f"Reviews {review_id} successfully updated"
return jsonify({
'success': True,
'message': message
})
except psycopg2.Error as e:
message += f"Error getting reviews for {review_id}: {e}"
conn.rollback()
cursor.close()
return jsonify({
'success': False,
'message': message
})
except Exception as e:
message = f"Error getting reviews for {review_id}: {e}"
conn.rollback()
cursor.close()
return jsonify({
'success':False,
'message': message
})
finally:
cursor.close()
conn.close()
def delete_review(review_id, conn):
cursor = conn.cursor()
message = ""
try:
if Reviews.check_review_exists(cursor, session.get("user_id"), review_id) is None:
cursor.close()
message += "No review found for this username"
return jsonify({
'success': False,
'message': message
})
Reviews.delete_review(cursor, session.get("user_id"), review_id)
conn.commit()
cursor.close()
message = f"Reviews {review_id} successfully deleted"
return jsonify({
'success': True,
'message': message
})
except psycopg2.Error as e:
message = f"Database error: {review_id}: {e}"
conn.rollback()
cursor.close()
return jsonify({
'success': False,
'message': message
}), 500
except Exception as e:
message = f"Error getting reviews for {review_id}: {e}"
conn.rollback()
cursor.close()
return jsonify({
'success': False,
'message': message
}), 500
finally:
cursor.close()
conn.close()
def review_form(instructor_first,instructor_last):
"""Display review form for a specific professor"""
user_id = session.get("user_id")
courses = r.get_course_sections(instructor_first, instructor_last)
if not courses:
return redirect(url_for('index'))
if request.method == 'POST':
json_data = request.get_json(silent=True) or {}
course_number = request.form.get('course_number') or json_data.get('course_number')
rating = request.form.get('rating') or json_data.get('rating')
comment = request.form.get('comment') or json_data.get('comment')
if not course_number or not rating or not comment:
flash("Please add a comment before submitting your review.", "error")
return redirect(url_for("review_form", instructor_first=instructor_first, instructor_last=instructor_last))
new_review = r.Reviews(
comment=comment,
instructor_first=instructor_first,
instructor_last=instructor_last,
course_num=course_number,
rating = rating,
username = user_id)
review = r.save_review(new_review)
update_summary_cache(instructor_first, instructor_last)
r.save_review_embedding(review.id,review.embedding)
print(review)
if request.is_json:
return jsonify(new_review.to_dict()), 201
flash(f'Reviews for {instructor_first} {instructor_last} submitted successfully!', 'success')
return redirect(url_for('index'))
return render_template('review_form.html', courses=courses, instructor_first=instructor_first, instructor_last=instructor_last)
def view_reviews():
reviews = r.get_reviews()
return render_template('reviews/reviews_list.html', reviews=reviews)