Skip to content
Snippets Groups Projects
Commit c526d2d7 authored by Andrea Callia D'Iddio's avatar Andrea Callia D'Iddio
Browse files

Feat: add endpoint and related page for ranking management for lecturers.

parent b0caac87
No related branches found
No related tags found
No related merge requests found
Pipeline #307836 passed
......@@ -11,5 +11,9 @@ class Project(db.Model):
timestamp = db.Column(db.DateTime, nullable=False, server_default=utcnow())
deleted = db.Column(db.DateTime)
shortlistings = db.relationship(
"Shortlisting", backref="project", lazy=True, cascade="all,delete-orphan"
)
def is_student_proposal(self) -> bool:
return self.on_behalf is not None
{% extends "components/layout.html" %}
{% block content %}
<div class="w3-content">
<div class="w3-container">
<section class="w3-section">
<h1 class="w3-center w3-text-blue">Who wants to do a project with you</h1>
<ul class="w3-ul" id="projects">
{% for shortlisting in projects %}
<li class="w3-display-container" data-id="{{ shortlisting.id }}">
<span class="w3-bar-item sort-list-handle">
<i class="fa-solid fa-bars"></i>&ensp;
</span>
<span>
{{ shortlisting.project.title }} - {{ shortlisting.student }}
</span>
</li>
{% endfor %}
</ul>
</section>
<button id="save-button" type="button" class="w3-btn w3-blue w3-right">Save</button>
</div>
</div>
{% endblock %}
{% block scripts %}
<script src="{{ url_for('static', filename='js/lib/sortable.min.js') }}"></script>
<script>
const projectList = document.getElementById("projects")
const sortableProjectList = Sortable.create(projectList, {
handle: ".sort-list-handle",
ghostClass: "ghost",
})
/*
const saveButton = document.getElementById("save-button")
saveButton.addEventListener("click", async () => {
saveButton.setAttribute("disabled", "")
saveButton.innerHTML = "Saving..."
await fetch("{{ url_for("student.update_ranking") }}", {
method: 'put',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(sortableProjectList.toArray().map(id => parseInt(id)))
})
.then((response) => {
saveButton.removeAttribute("disabled")
if (!response.ok) {
saveButton.classList.replace("w3-blue", "w3-red")
saveButton.innerHTML = "Error!"
} else {
saveButton.classList.replace("w3-blue", "w3-green")
saveButton.innerHTML = "Saved!"
setTimeout(() => {
saveButton.classList.remove("w3-green", "w3-red")
saveButton.classList.add("w3-blue")
saveButton.innerHTML = "Save"
}, 5000)
}
})
}) */
</script>
{% endblock %}
\ No newline at end of file
......@@ -3,7 +3,7 @@ from datetime import datetime
from flask import render_template, Blueprint, redirect, url_for, flash
from flask_login import login_required, current_user
from app import Project, db, messages
from app import Project, db, messages, Shortlisting
from app.forms.project import ProjectForm
bp = Blueprint("staff", __name__, url_prefix="/staff")
......@@ -63,3 +63,14 @@ def edit_project(project_id):
return render_template("pages/project-form.html", form=form, project=project)
flash(messages.PROJECT_NOT_FOUND)
return redirect(url_for("staff.projects"))
@bp.route("/projects/ranking")
@login_required
def projects_ranking():
projects: list[Shortlisting] = (
Shortlisting.query.join(Project)
.filter(Project.proposer == current_user.username)
.all()
)
return render_template("pages/staff/projects-ranking.html", projects=projects)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment