Files
boc/landvex-paket/api/__pycache__/main.cpython-39.pyc
T

99 lines
11 KiB
Plaintext
Raw Normal View History

a
ƒNjÈ7ã@s$dZddlZddlZddlZddlmZddlmZddlmZm Z m
Z
ddl m Z ddl
mZddlmZdd lmZej d
d ¡Zej d d
¡ZejeddeddddZejdœddZejedœddZe d¡e
eƒe
eƒfedœddƒZe d¡e dd d!d"e
eƒe
eƒfed#œd$d%„ƒZ Gd&d'„d'eƒZ!e "d(¡e
eƒe
eƒfe!d)œd*d+„ƒZ#Gd,d-„d-eƒZ$e d.¡dBed/œd0d1„ƒZ%e "d2¡e
eƒe
eƒfe$d)œd3d4„ƒZ&e d5¡e
eƒe
eƒfedœd6d7„ƒZ'e d8¡ed9œd:d;„ƒZ(e d<¡e
eƒe
eƒfd=d>„ƒZ)e d?¡d@dA„ƒZ*dS)Cuô
LandveX Fas 1 — Object API (förenklad)
3 endpoints:
1. GET /v0/objects/{lvx_id} — hämta objekt från SQLite
2. GET /v0/search?q=... — enkel fritextsökning
3. POST /v0/feedback — ta emot feedback (spara till fil)
éN)Údatetime)ÚOptional)ÚFastAPIÚQueryÚDepends)Ú JSONResponse)Ú BaseModel)Úverify_api_key)Úcheck_rate_limitZ
LANDVEX_DBz8/home/bernt/.openclaw/workspace/landvex-paket/landvex.dbZLANDVEX_FEEDBACK_DIRz:/home/bernt/.openclaw/workspace/landvex-paket/api/feedbackT)Úexist_okzLandveX Object APIú0.1.0u0Fas 1 — förenklad Object API över landvex.db)ÚtitleÚversionÚ description)ÚreturncCst t¡}tj|_|S)N)Úsqlite3ÚconnectÚDB_PATHÚRowZ row_factory)Úconn©rú9/home/bernt/.openclaw/workspace/landvex-paket/api/main.pyÚ_db*s
r)Úrowrcsfddˆ ¡DƒS)Ncsi|]}|ˆ|qSrr)Ú.0Úkey©rrrÚ
<dictcomp>1óz _row_to_dict.<locals>.<dictcomp>)ÚkeysrrrrÚ _row_to_dict0sr z/v0/objects/{lvx_id})Úlvx_idcCtƒ}| ¡}| d|f¡| ¡}|rJ| ¡t|ƒ}d|d<d|dœS| d|f¡| ¡}|r†| ¡t|ƒ}d|d<d|dœS| ¡tddd |d
d œd S)
u7Hämta ett objekt (klass eller modell) via dess LVX-ID.ú&SELECT * FROM objects WHERE lvx_id = ?ÚklassÚtypÚok)ÚstatusÚdataÚmodellé”ÚerrorzObjekt 'ú' hittades inte.©r&Úmessage©Ú status_codeÚcontent)rÚcursorÚexecuteÚfetchoneÚcloser r)r!ÚauthÚraterr1rr'rrrÚ
get_object5s*

þr7z
/v0/search.éuSökfras)Z
min_lengthr)Úqc Ctƒ}| ¡}d|d}g}| d||||f¡| ¡D]}t|ƒ}d|d<| |¡q:| d||||f¡| ¡D]}t|ƒ}d|d<| |¡qv| ¡d|t|ƒ|dœS) uIEnkel fritextsökning över namn, slug och LVX-ID i klasser och modeller.ú%zã
SELECT lvx_id, slug, namn_sv, namn_en, doman, tier, verifieringsniva, konfidens
FROM objects WHERE posttyp = 'objektklass'
WHERE lvx_id LIKE ? OR slug LIKE ? OR namn_sv LIKE ? OR namn_en LIKE ?
r#r$
SELECT lvx_id, slug, namn_sv, namn_en, doman, parent, verifieringsniva, konfidens
FROM objects WHERE posttyp = 'produktmodell'
WHERE lvx_id LIKE ? OR slug LIKE ? OR namn_sv LIKE ? OR namn_en LIKE ?
r(r%)r&ÚqueryÚcountÚresults©rr1r2Úfetchallr Úappendr4Úlen) r9r5r6rr1Úpatternr=rÚdrrrÚsearchTs4 
ú  
ú  ürDc@s>eZdZUdZeeed<dZeeed<gZ e
eed<dS)ÚIdentifyPayloadNÚbildÚpositionÚocr_extraherat) Ú__name__Ú
__module__Ú __qualname__rFrÚstrÚ__annotations__rGÚdictrHÚlistrrrrrEs
rEz /v0/identify)Úpayloadc
stƒ}| ¡}g}d}|jr|jD]è}d|d}| d||||f¡| ¡D]N} t| ƒdˆd<tddt|ƒdƒˆd <tfd
d |DƒƒsP|  ˆ¡qP| d ||||f¡| ¡D]N} t| ƒd
ˆd<tddt|ƒdƒˆd <tfdd |Dƒƒs¼|  ˆ¡q¼q$|s^| d¡| ¡D](} t| ƒd
ˆd<dˆd <|  ˆ¡q&dd|j
dœ}|  ¡|j ddddd|dd||jdœS)uPIdentifiera objekt frÃ¥n OCR-text. Förenklad version — matchar mot databasen.Nr:a
SELECT lvx_id, slug, namn_sv, namn_en, doman, parent, verifieringsniva, konfidens
FROM objects WHERE posttyp = 'produktmodell'
WHERE lvx_id LIKE ? OR slug LIKE ? OR namn_sv LIKE ? OR namn_en LIKE ?
Z
produktmodellZnivagffffffî?gffffffæ?gš™™™™™©?Ú konfidensc3s|]}|dˆdkVqdS©r!Nr©rÚrCrrÚ <genexpr>¤rzidentify.<locals>.<genexpr>a
SELECT lvx_id, slug, namn_sv, namn_en, doman, tier, verifieringsniva, konfidens
FROM objects WHERE posttyp = 'objektklass'
WHERE lvx_id LIKE ? OR slug LIKE ? OR namn_sv LIKE ? OR namn_en LIKE ?
Z objektklassg333333ë?g333333ã?c3s|]}|dˆdkVqdSrRrrSrUrrrV´r
SELECT lvx_id, slug, namn_sv, namn_en, doman, tier, verifieringsniva, konfidens
FROM objects WHERE posttyp = 'objektklass'
WHERE tier = 1
ORDER BY konfidens DESC
LIMIT 3
gà?Tu'Ingen modell kunde bestämmas frÃ¥n OCR)ZskapadZorsakrGcSs | dd¡S)NrQr)Úget)ÚxrrrÚ<lambda>Órzidentify.<locals>.<lambda>)rÚreverser%é)r&Ú
kandidaterÚbountyZ ocr_mottagen)
rr1rHr2r?r ÚminrAÚanyr@rGr4Úsort)
rPr5r6rr1r\r]ZtermrBrrrUrÚidentifyŠs^
 
ú  
ú ÿ ý
ürac@sFeZdZUdZeeed<dZeeed<eed<dZeeed<dS)ÚFeedbackPayloadNr!r$Ú kommentarÚ avsandare) rIrJrKr!rrLrMr$rdrrrrrbÞs
rbz /v0/bounties)r&c
Csvtƒ}| ¡}| d¡| ¡}| ¡g}|D]4}| |d|d|d|d|d|ddœ¡q0d t|ƒ|d
œS) zLista aktiva bountieszXSELECT id, title, description, reward, status, created_at FROM bounties ORDER BY id DESCrr8ééér[)Úidr
rZrewardr&Z
created_atr%)r&r<Úbounties)rr1r2r?r4r@rA)r&rr1ÚrowsrirrrrÚ
list_bountiesçs&
ú
ýrkz /v0/feedbackcCt ¡ ¡d}||j|j|j|jdœ}t ¡ d¡}tj  
t d|d¡}t |ddd(}| 
tj|d d
d ¡Wd ƒn1sˆ0Yd
d|dœS)z-Ta emot feedback och spara till en JSONL-fil.ÚZ)Ú timestampr!r$rcrdz%Y-%m-%dZ feedback_z.jsonlÚazutf-8)ÚencodingF)Ú ensure_asciiÚ
Nr%zFeedback mottagen. Tack!)r&r-Z received_at)rÚutcnowÚ isoformatr!r$rcrdÚstrftimeÚosÚpathÚjoinÚ FEEDBACK_DIRÚopenÚwriteÚjsonÚdumps)rPr5r6rmÚrecordZdate_strÚfilepathÚfrrrÚ
post_feedbacksû 6ýr€z/v0/objects/{lvx_id}/successionc Ctƒ}| ¡}| d|f¡| ¡}|sJ| ¡tddd|ddœdSt|ƒ}| d|f¡d d
| ¡Dƒ}| d ||f¡d d
| ¡Dƒ}| ¡d
|| d¡| dd¡||dœdœS)u(Hämta ersättningskedja för en modell.r"r)r*zModell 'r+r,r.z¦SELECT lvx_id, namn_sv, namn_en FROM objects WHERE posttyp = 'produktmodell' AND lvx_id IN (SELECT parent FROM objects WHERE posttyp = 'produktmodell' AND lvx_id = ?)cSsg|] }t|ƒqSr©r ©rÚrrrrÚ
<listcomp>4rz"get_succession.<locals>.<listcomp>zmSELECT lvx_id, namn_sv, namn_en FROM objects WHERE posttyp = 'produktmodell' WHERE parent = ? AND lvx_id != ?cSsg|] }t|ƒqSrrrrrrr„;rr%Znamn_svr&Zokand)ÚersatterÚ
ersatts_av)r&r!Znamnr&Z
succession) rr1r2r3r4rr r?rW) r!r5r6rr1rr(r…r†rrrÚget_successions<þþþ
þûr‡z"/v0/standards/{beteckning}/objects)Ú
beteckningcCtƒ}| ¡}d|d}g}| d|f¡| ¡D]}t|ƒ}d|d<| |¡q4| d|f¡| ¡D]}t|ƒ}d|d<| |¡qj| ¡d|t|ƒ|dœS) u-Hämta alla objekt kopplade till en standard.r:z´
SELECT lvx_id, slug, namn_sv, namn_en, doman, tier, verifieringsniva, konfidens