46 lines
3.3 KiB
Python
46 lines
3.3 KiB
Python
"""Export evidence, never active/private data or configuration."""
|
|
from pathlib import Path
|
|
import csv
|
|
import io
|
|
import json
|
|
import zipfile
|
|
import hashlib
|
|
|
|
root = Path(__file__).resolve().parent.parent
|
|
d = root / 'storage/app/private/investmoz-v2/portal-audit'
|
|
out = root / 'docs/investmoz/v2/auditoria-portal'
|
|
gaps = []
|
|
for level in [1, 2, 3]:
|
|
data = json.loads((d / f'geometry-qa-adm{level}-import.json').read_text(encoding='utf-8'))
|
|
for mapping in data['mappings']:
|
|
if mapping['matched_id'] is None:
|
|
gaps.append([level, mapping['pcode'], mapping['source_name'], mapping['source_parent_code'], mapping['match_basis'], len(mapping['candidates']), data['source_sha256']])
|
|
with (out / 'lacunas-geometrias-lote2.csv').open('w', encoding='utf-8-sig', newline='') as f:
|
|
writer = csv.writer(f)
|
|
writer.writerow(['ADM', 'PCODE da fonte', 'Nome da fonte', 'Pai na fonte', 'Motivo', 'Candidatos inequívocos', 'SHA256 do exemplar'])
|
|
writer.writerows(gaps)
|
|
|
|
proof_names = ['phpunit-final.json', 'phpunit-lote2-final.xml', 'consumer-actions-lote2.json',
|
|
'geometry-qa-adm1-import.json', 'geometry-qa-adm2-import.json', 'geometry-qa-adm3-import.json',
|
|
'geometry-source-scans.json', 'clamd-lote2.json', 'contagens-requisitos.json',
|
|
'territory-catalogue-coverage.json']
|
|
with zipfile.ZipFile(out / 'evidencias-lote2.zip', 'w', compression=zipfile.ZIP_DEFLATED) as z:
|
|
for name in proof_names:
|
|
z.write(d / name, name)
|
|
activation = json.loads((d / 'activation-evidence.json').read_text(encoding='utf-8'))
|
|
activation.pop('dump_path', None)
|
|
z.writestr('activation-evidence.json', json.dumps(activation, ensure_ascii=False, indent=2))
|
|
preview = json.loads((d / 'resources-lote2-preview.json').read_text(encoding='utf-16').lstrip('\ufeff'))
|
|
z.writestr('resources-lote2-preview.json', json.dumps(preview, ensure_ascii=False, indent=2))
|
|
for name in ['cobertura-consumidores-lote2.md', 'casos-reproducao.md', 'plano-ativacao.md', 'lacunas-geometrias-lote2.csv']:
|
|
z.write(out / name, name)
|
|
z.writestr('LEIA-ME.txt', '09/10/2026. API/persistência em QA; visual indisponível. Importação GIS interna, privada, sem publicação. Recursos ready=true/installed=false. Não contém dump, configuração, chaves ou dados pessoais. Provas históricas nos documentos são explicitamente separadas do estado atual. Checks de formato passam; npm check termina com código 1 devido aos 11 avisos lint existentes, sem erros. Fontes GIS: INE/UNOCHA, edição 2019-06-07, https://services.arcgis.com/iQ1dY19aHwbSDYIF/arcgis/rest/services/Mozambique/FeatureServer; originais privados preservados por hash, scans reais anexados.\n')
|
|
|
|
# Validate row widths and conserved source identities before delivery.
|
|
for name, expected in [('matriz-requisitos.csv', 3354), ('inventario-fontes.csv', 584)]:
|
|
with (out / name).open(encoding='utf-8-sig', newline='') as f:
|
|
rows = list(csv.reader(f))
|
|
if len(rows) - 1 != expected or any(len(row) != len(rows[0]) for row in rows):
|
|
raise RuntimeError(f'Invalid exported CSV: {name}')
|
|
print(json.dumps({'requirements': 3354, 'source_lines': 5830, 'inventory': 584, 'geometry_gaps': len(gaps), 'evidence_zip_sha256': hashlib.sha256((out / 'evidencias-lote2.zip').read_bytes()).hexdigest()}))
|