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

1""" 

2Handles connection to the MongoDB database and provides access to the collections. 

3""" 

4 

5import datetime 

6from flask import jsonify, session 

7 

8 

9class DeadlineManager: 

10 """Handles deadlines for the application.""" 

11 

12 def __init__(self): 

13 from app import DATABASE_MANAGER 

14 

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 ) 

31 

32 def get_details_deadline(self): 

33 """Get the deadline from the database.""" 

34 

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 

45 

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 ) 

52 

53 def get_student_ranking_deadline(self): 

54 """Get the deadline from the database.""" 

55 

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 

67 

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 

72 

73 def get_opportunities_ranking_deadline(self): 

74 """Get the deadline from the database.""" 

75 

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 

89 

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 

94 

95 def update_deadlines( 

96 self, details_deadline, student_ranking_deadline, opportunities_ranking_deadline 

97 ): 

98 """Update the deadlines in the database.""" 

99 

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 

108 

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 ) 

130 

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 ) 

140 

141 return jsonify({"message": "All deadlines updated successfully"}), 200 

142 

143 def get_deadline_type(self): 

144 

145 if "employer" in session: 

146 pass 

147 

148 if not self.is_past_details_deadline(): 

149 return 0 

150 

151 if not self.is_past_student_ranking_deadline(): 

152 return 1 

153 

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 

165 

166 elif not self.is_past_opportunities_ranking_deadline(): 

167 return 3 

168 

169 return None