feat: visor da peça com zoom real, ficha NOBRADE e filtros agrupados pela norma

- painel à esquerda (folha no celular) com barra ← mural | filtros, palco com
  roda, pinça, duplo clique, arrastar e modo só a imagem (F)
- ficha arquivística: código, nível, arranjo clicável, data da norma com selo
  de atribuída, produtor ISAAR, suporte, original, reprodução e citação
- filtros em Arranjo, Data, Pontos de acesso e Suporte e uso; autor pela
  autoridade, espécie da 1.5 e condição de reprodução; link pelo código
- datas: ano implausível vira ilegível, atribuição pelo miolo p10–p90 e
  histograma só com datas de até 30 anos de amplitude
This commit is contained in:
2026-09-30 22:30:13 +02:00
parent 23b56e8c87
commit 5c84619e5d
5 changed files with 668 additions and 311 deletions
+14 -5
View File
@@ -122,6 +122,15 @@ def _limites(ds: list[dict]) -> dict:
'inicio': a, 'fim': b, 'qualidade': 'datas-limite', 'tipo': 'produção'}
def _robustos(ds: list[dict]) -> dict:
"""Datas-limite para atribuir a dossiês sem data: o miolo (percentis 10–90)
das datas conhecidas, para que um punhado de extremos não vire [1800-1999?]."""
anos = sorted(d['inicio'] for d in ds if d and d.get('inicio'))
if not anos:
return {'inicio': None, 'fim': None}
return {'inicio': anos[int(len(anos) * .1)], 'fim': anos[min(len(anos) - 1, int(len(anos) * .9))]}
def _dimensao(especies: Counter, n_itens: int, bytes_: int) -> dict:
partes = [f'{n} {e}' for e, n in especies.most_common()]
return {'por_especie': dict(especies), 'arquivos_digitais': n_itens, 'bytes': bytes_,
@@ -330,9 +339,9 @@ def monta():
# datas atribuídas aos s.d. (proc. 1.3.3.2): período do fotógrafo, senão datas-limite da série
rev_por_handle = {r['handle']: r for r in rev_datas}
lim_secao = {inst: _limites([u['1.3']['producao'] for (i, _), us in por_serie.items() if i == inst
for u in us if not u['_sd']]) for inst, _ in por_serie}
lim_serie = {k: _limites([u['1.3']['producao'] for u in us if not u['_sd']]) for k, us in por_serie.items()}
lim_secao = {inst: _robustos([u['1.3']['producao'] for (i, _), us in por_serie.items() if i == inst
for u in us if not u['_sd']]) for inst, _ in por_serie}
lim_serie = {k: _robustos([u['1.3']['producao'] for u in us if not u['_sd']]) for k, us in por_serie.items()}
for k, us in por_serie.items():
for u in us:
if not u['_sd']:
@@ -342,10 +351,10 @@ def monta():
if per:
nova = datas.atribuida(*per, 'período de atividade do autor')
elif lim_serie[k]['inicio']:
nova = datas.atribuida(lim_serie[k]['inicio'], lim_serie[k]['fim'], 'datas-limite da série')
nova = datas.atribuida(lim_serie[k]['inicio'], lim_serie[k]['fim'], 'miolo das datas conhecidas da série (percentis 10–90)')
elif lim_secao[k[0]]['inicio']:
nova = datas.atribuida(lim_secao[k[0]]['inicio'], lim_secao[k[0]]['fim'],
'datas-limite da instituição de origem')
'miolo das datas conhecidas da instituição de origem (percentis 10–90)')
else:
continue
nova['original'] = u['1.3']['producao']['original']