diff --git a/app/forms/project.py b/app/forms/project.py index fd3982bc125f057ea3746c209061df6be7515e6a..8bc9f114da2fae9af4d0ea031662208dd567792c 100644 --- a/app/forms/project.py +++ b/app/forms/project.py @@ -15,3 +15,8 @@ class ProjectForm(FlaskForm): raise ValidationError( "Student proposer cannot be empty if project is marked as student proposal." ) + + def validate_category(self, field): + if field == self.category and field.data == "": + self.category.errors += "Please choose a category for the project." + raise ValidationError("Please choose a category for the project.") diff --git a/app/messages/__init__.py b/app/messages/__init__.py index f721558124ee320f6f41964703e7450fb085094e..62f52746bc679d9392b986f8351deb00102cc85a 100644 --- a/app/messages/__init__.py +++ b/app/messages/__init__.py @@ -1,6 +1,7 @@ from .message_builders import ( deadline_expired_for_staff, deadline_expired_for_students, + invalid_category, login_manager_message, login_unsuccessful_error, project_not_found, @@ -17,5 +18,7 @@ LOGIN_MANAGER_MESSAGE = login_manager_message() PROJECT_NOT_FOUND = project_not_found() SHORTLIST_NOT_FOUND = shortlist_not_found() +INVALID_CATEGORY = invalid_category() + DEADLINE_EXPIRED_FOR_STUDENTS = deadline_expired_for_students() DEADLINE_EXPIRED_FOR_STAFF = deadline_expired_for_staff() diff --git a/app/messages/message_builders.py b/app/messages/message_builders.py index 9f81dff9ef1e8f8e95215305e58692082718fa59..de3184e1b16997dcb55df7e78c3ea06db3d39186 100644 --- a/app/messages/message_builders.py +++ b/app/messages/message_builders.py @@ -66,6 +66,16 @@ def shortlist_not_found(): ) +def invalid_category(): + return MessageEncoder.encode( + Message( + header="<h3><strong>Invalid category</strong></h3>", + body="<p>Please select a valid category for the project.</p>", + style=ERROR, + ) + ) + + def deadline_expired_for_students(): return MessageEncoder.encode( Message( diff --git a/app/views/staff.py b/app/views/staff.py index d23bf52002d3f32d0348e93093192754c6963798..e400f5d16e3cb313d2cc756a4601ffcf81ad30cc 100644 --- a/app/views/staff.py +++ b/app/views/staff.py @@ -75,7 +75,9 @@ def create_project(): Category.code.in_(category_codes) ).all() form = ProjectForm() - form.category.choices = [(c.code, c.name) for c in categories] + form.category.choices = [("", "Choose an option")] + [ + (c.code, c.name) for c in categories + ] if form.validate_on_submit(): project = Project( title=form.title.data, @@ -89,6 +91,9 @@ def create_project(): if project.on_behalf: shortlist_proposer(project) return redirect(url_for("staff.projects")) + elif request.method == "POST": + if form.category.data not in category_codes: + flash(messages.INVALID_CATEGORY) return render_template( "pages/project-form.html", form=form, person=Person(), categories=categories ) @@ -194,7 +199,7 @@ def view_project(project_id): @login_required @staff_only def projects_ranking(): - projects: list[Shortlisting] = ( + own_projects: list[Shortlisting] = ( Shortlisting.query.join(Project) .filter(Project.proposer == current_user.username) .order_by(Shortlisting.staff_ranking) @@ -203,7 +208,7 @@ def projects_ranking(): full_names = {} - for shortlisting in projects: + for shortlisting in own_projects: person = Person.query.filter( Person.username == shortlisting.student ).first() or Person(username=shortlisting.student, firstname="", lastname="") @@ -214,7 +219,7 @@ def projects_ranking(): return render_template( "pages/staff/shortlisted-projects.html", - projects=projects, + projects=own_projects, full_names=full_names, )