Add iranestekhdam.ir as an ingestion source (clinical job ads at named facilities)
New IranEstekhdamListingSource: reads the site monthly ad sitemaps (sitemap-ads.xml -> sitemap-ads-YYYY-M.xml), keeps only ad URLs whose Persian slug names a clinical role (veterinary/non-clinical excluded), then extracts each ad title + description (+ phone). These are employer ads at NAMED facilities, so they directly improve the unknown-facility problem the classifieds content has. Wired in like Medjobs: AppSetting toggles (IranEstekhdamEnabled/MaxAds/UseProxy) + EF migration, SettingsService persistence, admin Settings UI, and DI registration. Off by default; the medical-gate validator + AI auditor + junk filters screen results downstream. Note: e-estekhdam / jobinja / jobvision are JS-rendered SPAs whose ad lists are not in static HTML, so they need API reverse-engineering (a separate effort), not this static-scrape path. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -147,6 +147,16 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="source-box">
|
||||
<label class="toggle-row">
|
||||
<input type="checkbox" name="IranEstekhdamEnabled" value="true" checked="@Model.IranEstekhdamEnabled" />
|
||||
<span class="t-body"><span>🏥 ایراناستخدام (iranestekhdam.ir)</span><span class="t-hint">آگهیهای استخدامِ مراکز درمانیِ نامدار از سایتمپِ ماهانه؛ فقط نقشهای بالینی.</span></span>
|
||||
</label>
|
||||
<div class="filter-group"><label>حداکثر آگهی در هر اجرا</label><input type="number" name="IranEstekhdamMaxAds" min="1" max="500" value="@Model.IranEstekhdamMaxAds" dir="ltr" />
|
||||
<label class="proxy-toggle"><input type="checkbox" name="IranEstekhdamUseProxy" value="true" checked="@Model.IranEstekhdamUseProxy" /> از پروکسی استفاده شود</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="source-box">
|
||||
<label class="toggle-row">
|
||||
<input type="checkbox" name="WebsitesEnabled" value="true" checked="@Model.WebsitesEnabled" />
|
||||
|
||||
@@ -47,6 +47,9 @@ public class SettingsModel : PageModel
|
||||
[BindProperty] public string? DivarQueries { get; set; }
|
||||
[BindProperty] public bool MedjobsEnabled { get; set; }
|
||||
[BindProperty] public int MedjobsMaxAds { get; set; } = 40;
|
||||
[BindProperty] public bool IranEstekhdamEnabled { get; set; }
|
||||
[BindProperty] public int IranEstekhdamMaxAds { get; set; } = 40;
|
||||
[BindProperty] public bool IranEstekhdamUseProxy { get; set; }
|
||||
[BindProperty] public bool SmsEnabled { get; set; }
|
||||
[BindProperty] public string? SmsApiKey { get; set; }
|
||||
[BindProperty] public string? SmsTemplate { get; set; }
|
||||
@@ -95,6 +98,9 @@ public class SettingsModel : PageModel
|
||||
DivarQueries = s.DivarQueries;
|
||||
MedjobsEnabled = s.MedjobsEnabled;
|
||||
MedjobsMaxAds = s.MedjobsMaxAds;
|
||||
IranEstekhdamEnabled = s.IranEstekhdamEnabled;
|
||||
IranEstekhdamMaxAds = s.IranEstekhdamMaxAds;
|
||||
IranEstekhdamUseProxy = s.IranEstekhdamUseProxy;
|
||||
SmsEnabled = s.SmsEnabled;
|
||||
SmsApiKey = s.SmsApiKey;
|
||||
SmsTemplate = s.SmsTemplate;
|
||||
@@ -140,6 +146,9 @@ public class SettingsModel : PageModel
|
||||
DivarQueries = DivarQueries,
|
||||
MedjobsEnabled = MedjobsEnabled,
|
||||
MedjobsMaxAds = MedjobsMaxAds,
|
||||
IranEstekhdamEnabled = IranEstekhdamEnabled,
|
||||
IranEstekhdamMaxAds = IranEstekhdamMaxAds,
|
||||
IranEstekhdamUseProxy = IranEstekhdamUseProxy,
|
||||
SmsEnabled = SmsEnabled,
|
||||
SmsApiKey = SmsApiKey,
|
||||
SmsTemplate = SmsTemplate,
|
||||
|
||||
Reference in New Issue
Block a user