QuentinL52 commited on
Commit
22d1c60
·
verified ·
1 Parent(s): 2db43b3

Update src/agents/scoring_agent.py

Browse files
Files changed (1) hide show
  1. src/agents/scoring_agent.py +31 -54
src/agents/scoring_agent.py CHANGED
@@ -18,6 +18,9 @@ class ScoringAgent:
18
  }
19
 
20
  def calculate_scores(self, candidat_data: Dict[str, Any]) -> Dict[str, List[Dict[str, Any]]]:
 
 
 
21
  skills_data = candidat_data.get("compétences", {})
22
  skills_list = []
23
 
@@ -27,6 +30,9 @@ class ScoringAgent:
27
  elif isinstance(skills_data, list):
28
  skills_list = [item.get("nom") for item in skills_data if item.get("nom")]
29
 
 
 
 
30
  if not skills_list:
31
  return {"analyse_competences": []}
32
 
@@ -50,13 +56,28 @@ class ScoringAgent:
50
 
51
  def _analyze_experiences(self, candidat_data: Dict[str, Any], skill_metrics: Dict[str, Any]):
52
  experiences_key = "expériences" if "expériences" in candidat_data else "experiences_professionnelles"
 
 
 
 
53
 
54
- for exp in candidat_data.get(experiences_key, []):
 
 
 
55
  exp_text = json.dumps(exp, ensure_ascii=False).lower()
56
- duration = self._calculate_duration_in_years(
57
- exp.get("date_debut", exp.get("start_date", "")),
58
- exp.get("date_fin", exp.get("end_date", ""))
59
- )
 
 
 
 
 
 
 
 
60
 
61
  for skill in skill_metrics:
62
  if skill in exp_text:
@@ -147,76 +168,32 @@ class ScoringAgent:
147
  return datetime(year, 1, 1)
148
 
149
  return None
150
-
151
  def _validate_and_parse_date(self, date_str: str) -> datetime:
152
  """Valide et parse une date en vérifiant le format avant parsing"""
153
 
154
  # Format YYYY
155
- if re.match(r'^\d{4}
156
-
157
- def _calculate_duration_in_years(self, start_date_str: str, end_date_str: str) -> float:
158
- start_date = self._parse_date(start_date_str)
159
- end_date = self._parse_date(end_date_str)
160
-
161
- if start_date and end_date:
162
- if end_date < start_date:
163
- return 0.0
164
- return (end_date - start_date).days / 365.25
165
-
166
- return 0.0, date_str):
167
  year = int(date_str)
168
  if 1900 <= year <= 2030:
169
  return datetime(year, 1, 1)
170
 
171
  # Format MM/YYYY
172
- if re.match(r'^\d{1,2}/\d{4}
173
-
174
- def _calculate_duration_in_years(self, start_date_str: str, end_date_str: str) -> float:
175
- start_date = self._parse_date(start_date_str)
176
- end_date = self._parse_date(end_date_str)
177
-
178
- if start_date and end_date:
179
- if end_date < start_date:
180
- return 0.0
181
- return (end_date - start_date).days / 365.25
182
-
183
- return 0.0, date_str):
184
  parts = date_str.split('/')
185
  month, year = int(parts[0]), int(parts[1])
186
  if 1 <= month <= 12 and 1900 <= year <= 2030:
187
  return datetime(year, month, 1)
188
 
189
  # Format YYYY-MM
190
- if re.match(r'^\d{4}-\d{1,2}
191
-
192
- def _calculate_duration_in_years(self, start_date_str: str, end_date_str: str) -> float:
193
- start_date = self._parse_date(start_date_str)
194
- end_date = self._parse_date(end_date_str)
195
-
196
- if start_date and end_date:
197
- if end_date < start_date:
198
- return 0.0
199
- return (end_date - start_date).days / 365.25
200
-
201
- return 0.0, date_str):
202
  parts = date_str.split('-')
203
  year, month = int(parts[0]), int(parts[1])
204
  if 1 <= month <= 12 and 1900 <= year <= 2030:
205
  return datetime(year, month, 1)
206
 
207
  # Format DD/MM/YYYY
208
- if re.match(r'^\d{1,2}/\d{1,2}/\d{4}
209
-
210
- def _calculate_duration_in_years(self, start_date_str: str, end_date_str: str) -> float:
211
- start_date = self._parse_date(start_date_str)
212
- end_date = self._parse_date(end_date_str)
213
-
214
- if start_date and end_date:
215
- if end_date < start_date:
216
- return 0.0
217
- return (end_date - start_date).days / 365.25
218
-
219
- return 0.0, date_str):
220
  parts = date_str.split('/')
221
  day, month, year = int(parts[0]), int(parts[1]), int(parts[2])
222
  if 1 <= day <= 31 and 1 <= month <= 12 and 1900 <= year <= 2030:
 
18
  }
19
 
20
  def calculate_scores(self, candidat_data: Dict[str, Any]) -> Dict[str, List[Dict[str, Any]]]:
21
+ if not candidat_data or not isinstance(candidat_data, dict):
22
+ return {"analyse_competences": []}
23
+
24
  skills_data = candidat_data.get("compétences", {})
25
  skills_list = []
26
 
 
30
  elif isinstance(skills_data, list):
31
  skills_list = [item.get("nom") for item in skills_data if item.get("nom")]
32
 
33
+ # Filtrer les skills valides
34
+ skills_list = [skill for skill in skills_list if skill and isinstance(skill, str) and skill.strip()]
35
+
36
  if not skills_list:
37
  return {"analyse_competences": []}
38
 
 
56
 
57
  def _analyze_experiences(self, candidat_data: Dict[str, Any], skill_metrics: Dict[str, Any]):
58
  experiences_key = "expériences" if "expériences" in candidat_data else "experiences_professionnelles"
59
+ experiences = candidat_data.get(experiences_key, [])
60
+
61
+ if not isinstance(experiences, list):
62
+ return
63
 
64
+ for exp in experiences:
65
+ if not isinstance(exp, dict):
66
+ continue
67
+
68
  exp_text = json.dumps(exp, ensure_ascii=False).lower()
69
+
70
+ # Récupération sécurisée des dates
71
+ start_date_str = exp.get("date_debut", exp.get("start_date", ""))
72
+ end_date_str = exp.get("date_fin", exp.get("end_date", ""))
73
+
74
+ # S'assurer que ce sont des strings
75
+ if not isinstance(start_date_str, str):
76
+ start_date_str = str(start_date_str) if start_date_str else ""
77
+ if not isinstance(end_date_str, str):
78
+ end_date_str = str(end_date_str) if end_date_str else ""
79
+
80
+ duration = self._calculate_duration_in_years(start_date_str, end_date_str)
81
 
82
  for skill in skill_metrics:
83
  if skill in exp_text:
 
168
  return datetime(year, 1, 1)
169
 
170
  return None
171
+
172
  def _validate_and_parse_date(self, date_str: str) -> datetime:
173
  """Valide et parse une date en vérifiant le format avant parsing"""
174
 
175
  # Format YYYY
176
+ if re.match(r'^\d{4}$', date_str):
 
 
 
 
 
 
 
 
 
 
 
177
  year = int(date_str)
178
  if 1900 <= year <= 2030:
179
  return datetime(year, 1, 1)
180
 
181
  # Format MM/YYYY
182
+ if re.match(r'^\d{1,2}/\d{4}$', date_str):
 
 
 
 
 
 
 
 
 
 
 
183
  parts = date_str.split('/')
184
  month, year = int(parts[0]), int(parts[1])
185
  if 1 <= month <= 12 and 1900 <= year <= 2030:
186
  return datetime(year, month, 1)
187
 
188
  # Format YYYY-MM
189
+ if re.match(r'^\d{4}-\d{1,2}$', date_str):
 
 
 
 
 
 
 
 
 
 
 
190
  parts = date_str.split('-')
191
  year, month = int(parts[0]), int(parts[1])
192
  if 1 <= month <= 12 and 1900 <= year <= 2030:
193
  return datetime(year, month, 1)
194
 
195
  # Format DD/MM/YYYY
196
+ if re.match(r'^\d{1,2}/\d{1,2}/\d{4}$', date_str):
 
 
 
 
 
 
 
 
 
 
 
197
  parts = date_str.split('/')
198
  day, month, year = int(parts[0]), int(parts[1]), int(parts[2])
199
  if 1 <= day <= 31 and 1 <= month <= 12 and 1900 <= year <= 2030: