SPB Git forge

spb/job-ka

Public
229commits 1branches 0releases
38.1 MBsize
maindefault branch
2 h agolast push
HTML 82.1% Python 14.6% TypeScript 1.9% CSS 1% JavaScript 0.5%

History of jobka/web.py · clear filter

  1. Wed, Aug 26, 2026 1

  2. Tue, Aug 25, 2026 1

    1. Phase 3 — enrichissement des 1050+ connecteurs (exigences, séniorité) + refonte du display des offres avec métriques claires
      …
      Backend (enrichissement central via finalize() -> tous les connecteurs) :
      - normalize.py : extract_requirements() (années d'expérience, scolarité,
        langues exigées, FR/EN, bornes de plausibilité), parse_seniority()
        (stage/junior/intermédiaire/senior/direction : titre, libellés ATS,
        années d'expérience), en-têtes d'avantages élargis
      - schema.py : champ seniority + branchement des extracteurs (setdefault,
        jamais d'écrasement des valeurs ATS)
      - db.py : colonne seniority (migration auto) dans insert/update
      - web.py : filtre + facette séniorité, salary_context (médiane/quartiles
        de la catégorie + écart % de l'offre, cache 10 min), employer_jobs,
        median_salary_year dans /api/stats
      - scripts/backfill_enrich.py : backfill exécuté — 23 680 offres scannées,
        16 606 exigences ajoutées (26 % -> 77 %), 10 966 séniorités (0 -> 46 %)
      - tests/test_enrich.py : 27 nouveaux tests (101 au total, tous verts)
      
      Frontend (display + métriques claires) :
      - JobCard : badge Nouveau (≤3 j), salaire avec équivalent annuel, badges
        séniorité/exigences/bilingue, pied fraîcheur · avantages · plateforme
      - Fiche : panneau « En un coup d'œil » (salaire vs marché avec barre
        interquartile P25-P75, expérience, scolarité, langues, fraîcheur, date
        limite), volume d'offres de l'employeur, historique du salaire affiché
      - Accueil : filtre séniorité ; api.ts : types + helpers (compactMoney,
        yearlyEquiv, daysSince)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +61 −2
  3. Mon, Aug 24, 2026 1

  4. Sun, Aug 23, 2026 3

    1. Favoris unifies « Mon univers Ka » (hub KA ID) : coeur sur cartes et fiche, page /favoris
      …
      - jobka/hubfav.py : client du magasin central de favoris du hub Groupe KA
        (HMAC signe, toggle synchrone, lecture cachee 30 s, zero stockage local)
      - jobka/web.py : GET /api/favorites + POST /api/favorites/toggle (session
        KA ID requise, 401 sinon) ; route SPA /favoris
      - jobka/auth.py : parametre next (chemin local, transporte dans le state
        signe) pour revenir a la page courante apres la connexion KA ID
      - frontend : favorites.tsx (FavProvider + FavButton), coeur sur JobCard et
        la fiche /emploi/:uid, page /favoris + liens nav et prefooter, CSS fav-btn
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +36 −3
    2. stats v3 : rapports PDF personnalisés (catalogue, rendu au choix, ReportBuilder)
      …
      - kapdf.py v3 partagé (catalog, mode personnalise, heatmap calendrier)
      - web.py : GET /api/stats/catalog + POST /api/stats/report/custom
      - kacharts.tsx : composant ReportBuilder intégré à PdfButton (modal,
        ordre, rendus, modèles localStorage) — SPEC.md §3bis
      Simon-Pierre Boucher committed 1 mo ago · 1 file +42 −1
    3. taleo_tbe: secours og:title (retrait du JSON-LD par la plateforme) + fenêtre syncs_since_h
      …
      - Taleo TBE a retiré le JSON-LD JobPosting de requisition.jsp : les offres
        sans cache de détail étaient toutes différées par le filtre Québec →
        kruger publiait 0 offre depuis des jours (72 items RSS). Secours : lieu
        extrait du og:title (« … – Ville, RÉGION, PAYS »). Kruger retrouve 54
        offres QC ; sepaq/hec/exo tenaient encore grâce à leurs caches.
      - base.detail() : ne met plus en cache les payloads vides ({} cadenassé par
        clé stable = connecteur gelé) ; 89 caches vides purgés de la base.
      - /api/stats : paramètre optionnel syncs_since_h pour la supervision api-ka
        (fenêtre complète du sync_log au lieu des 20 dernières entrées).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +16 −3
  5. Sat, Aug 22, 2026 1

    1. SEO : SSR léger (accueil, fiches JobPosting, pages statiques), robots.txt et sitemaps
      …
      - jobka/seo.py : pattern Lou-Ka — head unique (title, description, canonical,
        hreflang fr-ca, og:locale fr_CA, twitter) + contenu HTML dans #root que
        React remplace au montage
      - accueil : title avec le nombre d'offres, JSON-LD WebSite/Organization,
        h1 + listes de liens (villes, dernières offres)
      - fiche emploi : JSON-LD JobPosting (baseSalary CAD, jobLocation QC/CA,
        employmentType, validThrough, TELECOMMUTE) + BreadcrumbList ; 404 inconnue,
        410 retirée, noindex quarantaine, canonical vers l'offre maîtresse (doublons)
      - robots.txt (Disallow /api/) + sitemap index + sitemap-pages +
        sitemap-emplois-N chunkés (10 000 URL, lastmod)
      - web.py : include_router(seo) avant le rattrape-tout SPA
      - index.html : lang fr-CA
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +6
  6. Wed, Aug 19, 2026 3

    1. Stats v2 : dashboard ultra complet + 5 rapports PDF (module commun ka-ui v2)
      …
      - jobka/kapdf.py + frontend/src/ka/stats/{kacharts.tsx,SPEC.md} : canoniques v2
      - statsdash.py : 10 KPI (sparklines actives/nouvelles/retraits), 4 jauges de
        complétude (salaire, mode, géoloc, catégorie), série des retraits,
        multi-courbes top secteurs (date de publication affichée), barres empilées
        ajouts par source (sync_log), 3 distributions (salaires annuels, taux
        horaires, âge des offres), heatmap horaire 7x24 des observations, tableaux
        secteurs + sources & connecteurs, 11 records ; deltas seulement si la
        période précédente est couverte (rien d'inventé)
      - /api/stats/report : 5 modes (complet/synthese/tendances/repartitions/
        donnees), mode inconnu -> complet, filename(..., mode)
      - Stats.tsx : sections v2 dans l'ordre du SPEC (jauges, StatSummary,
        MultiLineChart, StackedBarChart, Histogram, HourHeatmap, PdfButton 5 modes)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +6 −3
  7. Tue, Aug 18, 2026 1

    1. Badge « Offre directe » + stats directes/portails + canal de dépôt direct employeurs
      …
      - is_direct (source hors AGGREGATORS) exposé sur /api/jobs, /api/jobs/{uid}
        et jobs.geojson ; badge sobre sur les cartes d offres (frontend rebuild)
      - /api/stats : direct_jobs, direct_employers, direct_sources, portal_jobs,
        duplicates_hidden ; KPI « Offres directes employeur » au tableau de bord
      - POST /api/employeurs/offres : dépôt direct validé (pydantic + pot de miel),
        normalisé par JobPosting.finalize(), stocké source=depot-direct INACTIF en
        attente de modération ; page /employeurs (formulaire + explications)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +104 −1
  8. Mon, Aug 17, 2026 2

    1. Intégration complète à l'écosystème Groupe KA
      …
      - Design : ka-ui vendoré (tokens.css importé avant le CSS local), accent
        officiel cyan #0c8599 (fin du lime hérité), socle dédupliqué, badge
        « Un service Groupe KA » au header (desktop + mobile, zéro débordement
        à 360/768/1440), prefooter local + KaFooter commun, page /contact
        (ecosystem.json), title « Job-Ka — Un service Groupe KA », assets
        og.png/favicon.svg/apple-touch-icon + meta OG/Twitter absolues.
      - SSO KA ID : jobka/auth.py (client job-ka, cookie jobka_session, table
        users), bouton « Se connecter avec KA » au header, testé bout-en-bout
        jusqu'au hub (307 → /connexion, client reconnu).
      - Stats : /api/stats/dashboard (contrat SPEC, cache 5 min, salaires
        bornés 25–400 k$, série date_posted réelle) + /api/stats/report (PDF
        fpdf2 via jobka/kapdf.py, complet + synthèse), page /stats refaite sur
        ka/stats/kacharts.tsx ; /api/stats historique conservé pour le hub.
      - KA Agent : widget ka-agent.js câblé (site job-ka).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +42 −3
    2. Fondation Job·Ka : socle backend, 5 connecteurs pilotes, frontend, tests
      …
      - Schéma JobPosting + normalisation (salaires $/h↔$/an, dates ISO, villes
        canoniques, catégories) — 25 tests unitaires
      - Pipeline hérité de Lou·Ka : diff par content_hash, délai de grâce,
        anti-dérive, expiration sur date limite, dédup union-find, géocodage
        Nominatim + Adresses Québec avec cache
      - Plateformes ATS : Workday (facette Québec auto-découverte), Lever,
        Greenhouse, SmartRecruiters — connecteurs pilotes CAE, Desjardins, Poka,
        Mistplay, Ubisoft (442 offres QC)
      - API FastAPI (/api/jobs, geojson, facets, sources, stats, /health) +
        frontend React/Vite (liste, fiche, carte MapLibre, stats)
      - Fixtures HTTP enregistrées/rejouées hors ligne + hook pre-commit
        d'en-tête d'auteur (section 17)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +338