Coverage for core/deadline_manager.py: 87%
78 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-05 14:02 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-05 14:02 +0000
1"""
2Handles connection to the MongoDB database and provides access to the collections.
3"""
5import datetime
6from flask import jsonify, session
9class DeadlineManager:
10 """Handles deadlines for the application."""
12 def __init__(self):
13 from app import DATABASE_MANAGER
15 self.database_manager = DATABASE_MANAGER
16 details = self.get_details_deadline()
17 student = self.get_student_ranking_deadline()
18 opportunities = self.get_opportunities_ranking_deadline()
19 if details > student or student > opportunities or details > opportunities:
20 self.update_deadlines(
21 details,
22 (
23 datetime.datetime.strptime(details, "%Y-%m-%d")
24 + datetime.timedelta(weeks=1)
25 ).strftime("%Y-%m-%d"),
26 (
27 datetime.datetime.strptime(details, "%Y-%m-%d")
28 + datetime.timedelta(weeks=2)
29 ).strftime("%Y-%m-%d"),
30 )
32 def get_details_deadline(self):
33 """Get the deadline from the database."""
35 find_deadline = self.database_manager.get_one_by_field("deadline", "type", 0)
36 deadline = None
37 if not find_deadline:
38 deadline = (datetime.datetime.now() + datetime.timedelta(weeks=1)).strftime(
39 "%Y-%m-%d"
40 )
41 self.database_manager.insert("deadline", {"type": 0, "deadline": deadline})
42 else:
43 deadline = find_deadline["deadline"]
44 return deadline
46 def is_past_details_deadline(self) -> bool:
47 """Check if the deadline has passed."""
48 deadline = self.get_details_deadline()
49 return datetime.datetime.now() >= datetime.datetime.strptime(
50 deadline, "%Y-%m-%d"
51 )
53 def get_student_ranking_deadline(self):
54 """Get the deadline from the database."""
56 find_deadline = self.database_manager.get_one_by_field("deadline", "type", 1)
57 deadline = None
58 if not find_deadline:
59 deadline = (
60 datetime.datetime.strptime(self.get_details_deadline(), "%Y-%m-%d")
61 + datetime.timedelta(weeks=1)
62 ).strftime("%Y-%m-%d")
63 self.database_manager.insert("deadline", {"type": 1, "deadline": deadline})
64 else:
65 deadline = find_deadline["deadline"]
66 return deadline
68 def is_past_student_ranking_deadline(self) -> bool:
69 """Check if the deadline has passed."""
70 deadline = self.get_student_ranking_deadline()
71 return datetime.datetime.now().strftime("%Y-%m-%d") >= deadline
73 def get_opportunities_ranking_deadline(self):
74 """Get the deadline from the database."""
76 find_deadline = self.database_manager.get_one_by_field("deadline", "type", 2)
77 deadline = None
78 if not find_deadline:
79 deadline = (
80 datetime.datetime.strptime(
81 self.get_student_ranking_deadline(), "%Y-%m-%d"
82 )
83 + datetime.timedelta(weeks=1)
84 ).strftime("%Y-%m-%d")
85 self.database_manager.insert("deadline", {"type": 2, "deadline": deadline})
86 else:
87 deadline = find_deadline["deadline"]
88 return deadline
90 def is_past_opportunities_ranking_deadline(self) -> bool:
91 """Check if the deadline has passed."""
92 deadline = self.get_opportunities_ranking_deadline()
93 return datetime.datetime.now().strftime("%Y-%m-%d") >= deadline
95 def update_deadlines(
96 self, details_deadline, student_ranking_deadline, opportunities_ranking_deadline
97 ):
98 """Update the deadlines in the database."""
100 try:
101 datetime.datetime.strptime(details_deadline, "%Y-%m-%d")
102 datetime.datetime.strptime(student_ranking_deadline, "%Y-%m-%d")
103 datetime.datetime.strptime(opportunities_ranking_deadline, "%Y-%m-%d")
104 except ValueError:
105 return jsonify({"error": "Invalid deadline format. Use YYYY-MM-DD."}), 400
106 except Exception as e:
107 return jsonify({"error": str(e)}), 400
109 if details_deadline > student_ranking_deadline:
110 return (
111 jsonify(
112 {
113 "error": "Details deadline cannot be later than Student Ranking deadline."
114 }
115 ),
116 400,
117 )
118 if student_ranking_deadline > opportunities_ranking_deadline:
119 return (
120 jsonify(
121 {
122 "error": (
123 "Student Ranking deadline cannot be later than "
124 "Opportunities Ranking deadline."
125 )
126 }
127 ),
128 400,
129 )
131 self.database_manager.update_one_by_field(
132 "deadline", "type", 0, {"deadline": details_deadline}
133 )
134 self.database_manager.update_one_by_field(
135 "deadline", "type", 1, {"deadline": student_ranking_deadline}
136 )
137 self.database_manager.update_one_by_field(
138 "deadline", "type", 2, {"deadline": opportunities_ranking_deadline}
139 )
141 return jsonify({"message": "All deadlines updated successfully"}), 200
143 def get_deadline_type(self):
145 if "employer" in session:
146 pass
148 if not self.is_past_details_deadline():
149 return 0
151 if not self.is_past_student_ranking_deadline():
152 return 1
154 if not self.is_past_opportunities_ranking_deadline() and session.get(
155 "employer"
156 ):
157 employer_id = session["employer"]["_id"]
158 opps = self.database_manager.get_all_by_field(
159 "opportunities", "employer_id", employer_id
160 )
161 for opp in opps:
162 if "preferences" not in opp:
163 return 2
164 return 3
166 elif not self.is_past_opportunities_ranking_deadline():
167 return 3
169 return None