MCPcopy Create free account
hub / github.com/RASAAS/docmcp-knowledge / SFDAChecker

Class SFDAChecker

scripts/tier2_checkers.py:408–610  ·  view source on GitHub ↗

Checks SFDA (Saudi Arabia) for medical device safety updates. Two sources: 1. NCMDR Weekly Alert page (weekly PDF reports) -- parsed from HTML table 2. SFDA RSS feed (general medical device news) -- filtered for device content

Source from the content-addressed store, hash-verified

406# ---------------------------------------------------------------------------
407
408class SFDAChecker:
409 """Checks SFDA (Saudi Arabia) for medical device safety updates.
410
411 Two sources:
412 1. NCMDR Weekly Alert page (weekly PDF reports) -- parsed from HTML table
413 2. SFDA RSS feed (general medical device news) -- filtered for device content
414 """
415
416 def __init__(self, session: requests.Session, state: dict,
417 seed_mode: bool = False):
418 self.session = session
419 self.state = state
420 self.seed_mode = seed_mode
421
422 def check(self, source_id: str, source: dict) -> Optional[dict]:
423 check_sub = source.get("check_sub", "weekly_alert")
424 if check_sub == "rss":
425 return self._check_rss(source_id, source)
426 return self._check_weekly_alert(source_id, source)
427
428 def _check_weekly_alert(self, source_id: str, source: dict) -> Optional[dict]:
429 url = source["url"]
430 prev = self.state.get(source_id, {})
431 prev_ids = set(prev.get("seen_ids", []))
432
433 try:
434 resp = self.session.get(url, timeout=30)
435 resp.raise_for_status()
436 except Exception as e:
437 print(f" ERROR SFDA weekly: {e}")
438 return None
439
440 entries = self._parse_weekly_page(resp.text)
441 if not entries:
442 print(" WARNING: No entries from SFDA weekly alert page")
443 return None
444
445 print(f" INFO: Parsed {len(entries)} weekly reports from SFDA")
446
447 new_items = []
448 all_ids = list(prev_ids)
449
450 for entry in entries:
451 eid = entry.get("id", entry.get("title", ""))
452 if not eid or eid in prev_ids:
453 continue
454 all_ids.append(eid)
455 new_items.append(entry)
456
457 self.state[source_id] = {
458 "url": url,
459 "last_checked": datetime.now().isoformat(),
460 "seen_ids": all_ids[-200:],
461 }
462
463 if new_items and (prev_ids or self.seed_mode):
464 if self.seed_mode and not prev_ids:
465 new_items = new_items[:5]

Callers 1

__init__Method · 0.90

Calls

no outgoing calls

Tested by

no test coverage detected