1
0
Files

79 lines
3.3 KiB
Python

#!/usr/bin/env python3
"""Pašvaldību reģistra lasītājs.
python3 tools/reader.py # visas pašvaldības, tabula
python3 tools/reader.py 0038001 # viena pašvaldība pēc ATVK koda (arī iepriekšējā koda)
python3 tools/reader.py --json | --csv # cits izvades formāts
python3 tools/reader.py --remote # lasīt no ProcessGit (main zars), nevis no lokālās kopijas
python3 tools/reader.py --no-validate # nepārbaudīt pret shēmu
Pēc noklusējuma datne tiek pārbaudīta pret shēmu schemas/pasvaldibu-registrs-0.1.xsd. Ar --remote datne un shēma
tiek lejupielādētas no https://processgit.org/Valsts-Pirmkods/Pasvaldibu-registrs. Vajadzīga bibliotēka lxml.
"""
import csv
import io
import json
import os
import sys
import urllib.request
from lxml import etree
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
RAW = "https://processgit.org/Valsts-Pirmkods/Pasvaldibu-registrs/raw/branch/main/"
DATA = "data/pasvaldibas-atvk.xml"
SCHEMA = "schemas/pasvaldibu-registrs-0.1.xsd"
NS = {"p": "urn:pppa:vpk:pasvaldibas:0.1"}
FIELDS = ["atvk", "nosaukums", "tips", "iepriekšējie_kodi"]
def load(rel, remote):
if remote:
req = urllib.request.Request(RAW + rel, headers={"User-Agent": "pasvaldibu-registrs-reader/0.1"})
return etree.parse(io.BytesIO(urllib.request.urlopen(req, timeout=60).read()))
return etree.parse(os.path.join(ROOT, rel))
def read(doc):
rows = [{"atvk": m.get("atvk"), "nosaukums": m.findtext("p:Name", namespaces=NS), "tips": m.get("kind"),
"iepriekšējie_kodi": " ".join(x.text for x in m.findall("p:FormerCode", NS))}
for m in doc.getroot().findall("p:Municipality", NS)]
src = doc.getroot().find("p:Metadata/p:Source", NS)
meta = {"avots": src.findtext("p:Act", namespaces=NS), "speka_no": src.get("inForce"),
"datu_versija": doc.getroot().find("p:Metadata/p:DataVersion", NS).get("number")}
return rows, meta
def main(argv):
flags = {a for a in argv if a.startswith("--")}
keys = [a for a in argv if not a.startswith("--")]
remote = "--remote" in flags
doc = load(DATA, remote)
if "--no-validate" not in flags:
xsd = etree.XMLSchema(load(SCHEMA, remote))
if not xsd.validate(doc):
for e in list(xsd.error_log)[:10]:
print(f"KĻŪDA {e.line}: {e.message}", file=sys.stderr)
sys.exit(1)
rows, meta = read(doc)
if keys:
rows = [r for r in rows if r["atvk"] in keys or set(r["iepriekšējie_kodi"].split()) & set(keys)]
if not rows:
print("nav atrasts:", ", ".join(keys), file=sys.stderr)
sys.exit(2)
if "--json" in flags:
print(json.dumps({**meta, "pasvaldibas": rows}, ensure_ascii=False, indent=2))
elif "--csv" in flags:
w = csv.DictWriter(sys.stdout, fieldnames=FIELDS)
w.writeheader()
w.writerows(rows)
else:
for r in rows:
prev = f" (iepriekš {r['iepriekšējie_kodi']})" if r["iepriekšējie_kodi"] else ""
print(f"{r['atvk']} {r['tips']:13} {r['nosaukums']}{prev}")
print(f"spēkā no {meta['speka_no']}, datu versija {meta['datu_versija']}: {len(rows)} pašvaldības", file=sys.stderr)
if __name__ == "__main__":
main(sys.argv[1:])