Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ __pycache__/
instance/test.db

# Ignore VS Code settings (optional)
#.vscode/
.vscode/

# Ignore environment files (optional)
.env
.env
venv/
5 changes: 4 additions & 1 deletion App/controllers/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
from .user import *
from .user import create_user, login, set_password, check_password
from .auth import *
from .initialize import *
from .position import *
from .shortlist import *
from .employer import *
from .student import *
from .staff import *
57 changes: 57 additions & 0 deletions App/controllers/employer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
from App.models.employer import Employer
from App.database import db
from App.models.shortlist import Shortlist
from App.models.position import Position
from App.models.position import PositionStatus
from App.models.shortlist import DecisionStatus

def createPosition(title, employerID, description,numberOfPositions):
employer = Employer.query.filter_by(employerID = employerID).first()
if not employer:
return None
position = Position(employerID = employerID, title = title , description = description, numberOfPositions = numberOfPositions)
db.session.add(position)
db.session.commit()

def viewApplicants(positionID):
position = Position.query.filter_by(positionID = positionID).first()
applicants = position.shortlist if position else []

return applicants


def makeDecision(shortlistID, status ):
shortlist = Shortlist.query.filter_by(shortlistID = shortlistID).first()
if shortlist and status in ["Accepted", "Rejected", "Pending"]:
shortlist.status = DecisionStatus(status.lower())
db.session.commit()

def editPosition( employerID, positionID, title, description, numberOfPositions, shortlistID):
position = Position.query.get(positionID)
shortlist = Shortlist.query.get(shortlistID)
if not position or position.employerID != employerID:
return None
if not shortlist:
return None



if title:
position.title = title
if description:
position.description = description
if numberOfPositions:
position.numberOfPositions = numberOfPositions

allShortlist = Shortlist.query.filter_by(positonID = positionID).all()

accepted = sum( 1 for s in allShortlist if s.status == DecisionStatus.accepted)

if accepted >= position.numberOfPositions:
position.status = PositionStatus.closed
else:
position.status = PositionStatus.open


db.session.commit()
return position
11 changes: 6 additions & 5 deletions App/controllers/initialize.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from .user import create_user
from .shortlist import add_student_to_shortlist
from .position import open_position
from .staff import addToshortlist
from .employer import createPosition
from App.database import db


Expand All @@ -10,6 +10,7 @@ def initialize():
create_user('bob', 'bobpass', "student")
create_user('frank', 'frankpass', "employer")
create_user('john', 'johnpass', "staff")
open_position(user_id=2, title='Software Engineer', number_of_positions= 6)
open_position(user_id=2, title='Mechanical Engineer', number_of_positions= 6)
add_student_to_shortlist(student_id=1, position_id=1, staff_id=3)
createPosition( title='Software Engineer', employerID = 2, description = ' ', positionID = 4 , number_of_positions= 6)
createPosition( title='Web Designer', employerID = 2, description = ' ', positionID = 5 , number_of_positions= 6)

addToshortlist(1, 1, 3)
40 changes: 14 additions & 26 deletions App/controllers/position.py
Original file line number Diff line number Diff line change
@@ -1,34 +1,22 @@
from App.models import Position, Employer
from App.database import db

def open_position(user_id, title, number_of_positions=1):
employer = Employer.query.filter_by(user_id=user_id).first()

def getPositionsByEmployer(employerID):
employer = Employer.query.filter_by(employerID = employerID).first()
if not employer:
return None
return []

new_position = Position(title=title, number=number_of_positions, employer_id=employer.id)
db.session.add(new_position)
try:
db.session.commit()
return new_position
except Exception as e:
db.session.rollback()
return None

return Position.query.filter_by(employerID = employerID).all()

def get_positions_by_employer(user_id):
employer = Employer.query.filter_by(user_id=user_id).first()
return db.session.query(Position).filter_by(employer_id=employer.id).all()
def getAllPositions_json():
positions = Position.query.all()
return [p.toJSON() for p in positions] if positions else[]

def get_all_positions_json():
positions = Position.query.all()
if positions:
return [position.toJSON() for position in positions]
return []

def get_positions_by_employer_json(user_id):
employer = Employer.query.filter_by(user_id=user_id).first()
positions = db.session.query(Position).filter_by(employer_id=employer.id).all()
if positions:
return [position.toJSON() for position in positions]
return []
def getPositionsByEmployer_json(employerID):
employer = Employer.query.filter_by(employerID = employerID).first()
if not employer:
return []
positions = Position.query.filter_by(employerID = employerID).all()
return[p.toJSON() for p in positions] if positions else []
64 changes: 30 additions & 34 deletions App/controllers/shortlist.py
Original file line number Diff line number Diff line change
@@ -1,40 +1,36 @@
from sqlalchemy import false
from App.models import Shortlist, Position, Staff, Student

from App.models import Shortlist, Position, DecisionStatus, Student
from App.database import db

def add_student_to_shortlist(student_id, position_id, staff_id):
teacher = db.session.query(Staff).filter_by(user_id=staff_id).first()
student = db.session.query(Student).filter_by(user_id=student_id).first()
if student == None or teacher == None:
return False
list = db.session.query(Shortlist).filter_by(student_id=student.id, position_id=position_id).first()
position = db.session.query(Position).filter(
Position.id == position_id,
Position.number_of_positions > 0,
Position.status == "open"
).first()
if teacher and not list and position:
shortlist = Shortlist(student_id=student.id, position_id=position.id, staff_id=teacher.id, title=position.title)
db.session.add(shortlist)
db.session.commit()
return shortlist

return False

def decide_shortlist(student_id, position_id, decision):
student = db.session.query(Student).filter_by(user_id=student_id).first()
shortlist = db.session.query(Shortlist).filter_by(student_id=student.id, position_id=position_id, status ="pending").first()
position = db.session.query(Position).filter(Position.id==position_id, Position.number_of_positions > 0).first()
if shortlist and position:
shortlist.update_status(decision)
position.update_number_of_positions(position.number_of_positions - 1)
return shortlist
return False
def shortlistedStudent(studentID):
student = Student.query.filter_by(studentID = studentID).first()
if not student:
return[ ]
return Shortlist.query.filter_by(studentID =studentID).all()


def get_shortlist_by_student(student_id):
student = db.session.query(Student).filter_by(user_id=student_id).first()
return db.session.query(Shortlist).filter_by(student_id=student.id).all()
def shortlistedByPosition(positionID):
return Shortlist.query.filter_by(positionID = positionID).all()

def get_shortlist_by_position(position_id):
return db.session.query(Shortlist).filter_by(position_id=position_id).all()

def decideShortlist(studentID, positionID, decision):
student = Student.query.filter_by(studentID = studentID).first()
if not student:
return False

shortlist = Shortlist.query.filter_by(studentID= studentID, positionID = positionID,status = DecisionStatus.pending ).first()
if not shortlist:
return False

position = Position.query.filter_by(positionID = positionID).first()
if not position or position.numberOfPositions <= 0:
return False


shortlist.update_status(decision)

if decision == "accepted":
position.update_number_of_positions(position.numberOfPositions -1)

return shortlist
19 changes: 19 additions & 0 deletions App/controllers/staff.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from App.database import db
from App.models.shortlist import Shortlist
from App.models.student import Student
from App.models.position import Position

def addToshortlist(positionID, studentID ):
exists = Shortlist.query.filter_by(positionID = positionID, studentID= studentID).first()
if exists:
return f"Student{studentID} is already shortlisted for position {positionID}"
shortlist = Shortlist(positionID = positionID, studentID= studentID)
db.session.add(shortlist)
db.session.commit()

def viewAvailablePositions():
return Position.query.all()




36 changes: 36 additions & 0 deletions App/controllers/state.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
from App.database import db
from .states.accepted import Accepted
from states.rejected import Rejected
from .states.shortlisted import Shortlisted
from .states.applied import Applied
from .student import Student


STATUS_MAP = {
"Applied": Applied,
"Shortlisted": Shortlisted,
"Accepted": Accepted,
"Rejected": Rejected
}


class StudentController:



@staticmethod
def updateStatus(studentID, newStatus):

if newStatus not in STATUS_MAP:
return {"error": "Invalid status"}

student = Student.query.filter_by(studentID = studentID).first()
if not student:
return {"error": "Student not found"}

student.status = newStatus

StateClass = STATUS_MAP[newStatus]
student.state = StateClass(student)

db.session.commit()
47 changes: 47 additions & 0 deletions App/controllers/student.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
from App.database import db
from App.models.student import Student
from App.models.shortlist import Shortlist
from App.models.states import Accepted, Rejected, Applied, Shortlisted


def viewShortlist(studentID):
student = Student.query.filter_by(studentID=studentID).first()
entries = student.shortlist if student else []

return{
"studentID" : studentID,
"shortlist": [
{
"shortlistID" : s.shortlistID,
"positionID": s.positionID,
"status": s.status.value}
for s in entries]


}

def updateStatus(studentID, state):
student = Student.query.filter_by(studentID = studentID).first()

if not student:
return None

if student and state:

mapping = {
"Accepted": Accepted,
"Rejected": Rejected,
"Shortlisted": Shortlisted,
"Applied" : Applied
}

if state in mapping:
student.changeStatus(mapping[state])


db.session.commit()


def viewEmployerDecision( studentID):
return Shortlist.query.filter_by(studentID = studentID).all()

Loading