62 lines
2.0 KiB
Python
62 lines
2.0 KiB
Python
from __future__ import annotations
|
|
|
|
from apps.sources.models import RawDocument
|
|
|
|
from .base import ExtractionResult
|
|
from .ats import (
|
|
GreenhouseAdapter,
|
|
LeverAdapter,
|
|
RecruiteeAdapter,
|
|
SmartRecruitersAdapter,
|
|
WorkableAdapter,
|
|
)
|
|
from .generic_html import GenericHtmlAdapter
|
|
from .jsonld import JsonLdJobPostingAdapter
|
|
from .rss import RssAdapter
|
|
|
|
|
|
class AdapterRegistry:
|
|
def __init__(self) -> None:
|
|
self.greenhouse = GreenhouseAdapter()
|
|
self.lever = LeverAdapter()
|
|
self.recruitee = RecruiteeAdapter()
|
|
self.smartrecruiters = SmartRecruitersAdapter()
|
|
self.workable = WorkableAdapter()
|
|
self.jsonld = JsonLdJobPostingAdapter()
|
|
self.generic = GenericHtmlAdapter()
|
|
self.rss = RssAdapter()
|
|
self.providers = [
|
|
self.greenhouse,
|
|
self.lever,
|
|
self.recruitee,
|
|
self.smartrecruiters,
|
|
self.workable,
|
|
]
|
|
|
|
def extract(self, document: RawDocument) -> ExtractionResult:
|
|
content = document.body_text
|
|
url = document.final_url or document.url
|
|
content_type = (document.content_type or "").lower()
|
|
if document.kind == RawDocument.Kind.XML or "rss" in content_type or "atom" in content_type:
|
|
return self.rss.extract(content, url=url)
|
|
|
|
for provider in self.providers:
|
|
if provider._supports_url(url):
|
|
result = provider.extract(content, url=url)
|
|
if any(
|
|
msg in result.warnings
|
|
for msg in ("Geen parseerbare ATS-response", "Geen herkenbare ATS-markup voor deze adapter")
|
|
):
|
|
continue
|
|
return result
|
|
|
|
jsonld_result = self.jsonld.extract(content, url=url)
|
|
if jsonld_result.jobs:
|
|
return jsonld_result
|
|
generic_result = self.generic.extract(content, url=url)
|
|
generic_result.warnings = jsonld_result.warnings + generic_result.warnings
|
|
return generic_result
|
|
|
|
|
|
registry = AdapterRegistry()
|