diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dfa7ad8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/config/database.yml +/config/secrets.yml +/Gemfile.lock diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d0a4f8..4e0d620 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,138 +1,119 @@ -## Archimista 3.0.0 (23 dicembre 2016) -Nuove funzionalità -- Ogni item delle entità Complesso archivistico (di 1° livello), Produttore, Conservatore e Progetto mostra il gruppo di appartenenza che ha generato il dato. -- Aggiunto flag "Pubblicato" per le entità Complesso archivistico (a ogni livello), Progetto, Soggetto Produttore, Soggetto Conservatore, Unità e Oggetto Digitale e link alle azioni "Pubblica/Rimuovi pubblicazione" negli elenchi di visualizzazione - di Complessi archivistici e Progetti. Le suddette azioni agiscono a cascata su tutte le istanze di entità collegate mentre il check/uncheck della flag singola agisce puntualmente sull'entità selezionata. -- Esportazione/Importazione di Oggetti digitali associati ai corredi in formato aef. -- Aggiunto tool di controllo e bonifica delle occorrenze multiple delle schede Fonti in Strumenti/Occorrenze Multiple. Nel caso di più istanze duplicate, la selezione della fonte corretta da mantenere elimina tutti i duplicati e fa ereditare tutte le relazioni relative alle istanze eliminate. -- Modificata la funzione "Unisci a" per un Complesso archivistico: è possibile effettuare l'unione su un qualsiasi livello gerarchico anzichè sul 1° come in precedenza. -- Aggiunta la funzione "Dividi" per un Complesso archivistico: è possibile dividere un qualsiasi livello gerarchico di un Complesso archivistico dal Complesso di primo livello di appartenenza creando un nuovo Complesso archivistico di 1° livello. -- Le entità Profili documentari e Profili istituzionali saranno modificabili esclusivamente a cura degli operatori di profilo admin. -- Aggiunto filtro Schede speciali in modalità visione tabellare per le unità. - -## Archimista 2.2.0 (22 settembre 2016) - -Correzione errori: -- corretto errore che si manifestava nel form indice dei soggetti produttori. Il comando "Nuova scheda" presentava la lista con l'opzione "F - Fotografia" invece che "Famiglia". Sono state aggiornate le traduzioni dei termini nel file "config\locales\views\units.yml" aggiungendo il livello "units_sc2_tsk" per fare in modo che le traduzioni dei valori del campo units.sc2_tsk non interferiscano con il resto. Cambiati coerentemente i form di visualizzazione delle unità (app\views\units\_form.html.erb, app\views\units\show.html.erb) -- è stata aggiunta una migrazione del database per correggere la gestione dei valori del vocabolario di units.sc2_tsk -- nella pagina che mostra le unità collegate ad un indice corretto errore che in presenta di unità di livelli maggiori del primo le mostrava con una caption non corretta (la caption era preceduta da "—" invece che dal corrispondente carattere) -- corretto errore nella procedura di recupero dei dati delle unità speciali (vedi lib\sc2_restore.rb) che non recuperava correttamente i dati di MISA e MISL delle schede OA, BDM -- corretta funzione di export e import da aef (app\models\export.rb, app\models\import.rb): i campi delle schede speciali non venivano esportati ed importati -- per questa correzione è stata creata una migrazione (20160401000000_sc2_add_legacy_current_id_field.rb) che aggiunge un nuovo campo (legacy_current_id) alle tabelle sc2_authors e sc2_commissions -- rigenerati i file db\seeds\*.json utilizzati per creare un database nuovo con la procedura "rake db:setup". Oltre ad aggiungere i file .json corrispondenti alle modifiche alla struttura di database introdotte dalla versione 2.1.0 in avanti, sono stati corretti alcuni errori nei contenuti dei file già esistenti, che non corrispondevano più alla struttura del database. In particolare tra questi è stata attuata la segnalazione evidenziata in https://github.com/ProgettoArchimista/archimista/pull/2 e relativa alla tabella groups. -- sono state aggiornate anche le procedure rake lib\tasks\db.rake che oltre a non prevedere i dati di seeding per i modelli introdotti dalla 2.1.0 in avanti, avevano qualche errore nel codice legato all'utilizzo delle nuove versioni ruby/rail introdotte con la versione 2.0.0 - -Nuove funzionalità -- gestione di profili utente associati a più di un gruppo con possibilità per questi utenti di visionare/modificare i dati appartenenti a più gruppi -- nel report inventario aggiunta la gestione dei campi con ripetitività doppia (es. schede speciali CARS: "Motivo dell'attribuzione" dell'autore e "Nome" nella committenza). In precedenza non erano gestiti. (lib\report_support.rb) -- In Bacheca>ComplessiArchivistici>Elenco visualizzato anche l'elenco dei progetti collegati -- In Bacheca>SoggettiProduttori>Elenco visualizzato anche l'elenco dei progetti collegati -- In Bacheca>Progetti>Elenco visualizzato anche Tipologia dell'intervento, Responsabili (tutti e anche i soggetti coinvolti), Status -- In Bacheca>Progetti>Elenco possibilità di ricerca per Denominazione, Tipologia dell'intervento, Status -- Aggiunto campo consistenza nelle unità (extent) dopo Descrizione>Contenuto. Aggiornati report, anteprima unità, editing in formato tabella -- modificata la gestione dei report per correggere una segnalazione del 22/06/2016: "nei report il titolo viene sempre scritto, quindi selezionandolo come campo da scrivere viene scritto due volte". La soluzione adottata è stata di togliere il campo titolo dai campi di default delle unità, e di aggiungere nell'elenco dei campi una indicazione del fatto che il titolo delle unità compare sempre anche se non è selezionato. -- aggiunto pannello di opzioni nel form di editing delle unità per permettere di impostare etichette alternative per i prefissi utilizzati per comporre il valore del campo "Segnatura definitiva" come concatenazione dei campi "Busta", "Fascicolo". -- esportazione/importazione unità in formato .aef. -- nella visualizzazione delle unità di un complesso aggiunta la possibilità di selezionare solo le unità del complesso di primo livello e la possibilità di non effettuare la paginazione dei risultati per poter selezionare tutte le unità di un complesso. -- nella visualizzazione elenco di produttori, conservatori, complessi, indici, progetti, fonti e unità il filtro è stato reso sempre visibile indipendentemente dal numero di risultati -- modificato il nome del file prodotto con l'esportazione in formato aef in modo che contenga l'indicazione dell'entità di riferimento che è stata esportata (Es.: archimista-export_complesso-20160921182205.aef) - - -## Archimista 2.1.0 (25 marzo 2016) - -- Scheda progetto - modificato vocabolario controllato del campo Identificazione/Tipologia di intervento - modificato vocabolario controllato del campo Identificazione/Status - modificato vocabolario controllato del campo Responsabilità/Responsabili/Qualifica - modificato vocabolario controllato del campo Responsabilità/Soggetti coinvolti/Qualifica - aggiornata la struttura di database che adesso prevede due tabelle distinte per i "Responsabili" (project_managers) e i "Soggetti coinvolti" (project_stakeholders) - nella procedura di migrazione della banca dati contestuale all'installazione della nuova versione viene gestito il corretto passaggio dei dati pregressi alle due nuove tabelle - -- Modifiche per gestione "multisito" - modificate le informazioni descrittive dei gruppi in modo da potervi associare dati (nome sotto-sito, descrizione del gruppo, credits) e immagini (carousel, loghi) che vengono utilizzati per la pubblicazione tramite ArchiVista - -- Schede speciali - la logica di gestione delle schede speciali è stata cambiata in modo che siano delle estensioni di schede unità di tipo "unità documentaria". Le relative informazioni aggiuntive previste per ciascuna tipologia di scheda speciale si rendono disponibili per la compilazione se l'operatore imposta un valore per il campo "Unità/Scheda speciale" che a sua volta è disponibile solo se il campo Tipologia è impostato su "Unità documentaria" - sono state ridefinite le categorie di schede scpeciali esistenti (CARS - Cartografia Storica, D - Disegno artistico, DT - Disegno tecnico, F - Fotografia, S - Stampe). Le tipologie OA e BDM sono state eliminate - nella procedura di migrazione della banca dati contestuale all'installazione della nuova versione viene gestito ll recupero dei dati pregressi per mapparli nei nuvi campi previsti. Le informazioni che non sono più previste dalla nuova versione delle schede così come i contenuti delle vecchie schede speciali di tipo OA e BDM vengono recuperati nel campo "Unità/descrizione estrinseca" - -- Unità - modificata la funzione di ordinamento delle unità in modo che sia possibile richiedere l'ordinamento anche di tutte le unità contenute nei complessi archivistici discendenti dal complesso archivistico corrente - -- Correzione di errori - Lemmi - Corretto errore nella pagina di presentazione dei lemmi (Indici) che impediva di aprire l'unità associata ad un determinato lemma - Corretto errore che impediva di creare una relazione nuova tra scheda unità e lemma nuovo (direttamente da scheda unità) - Modificato il funzionamento del pannello modale per l'impostazione di una relazione nuova tra scheda unità e lemma esistente. Prima presentava una lista comprendente al max 20 elementi, adesso invece è stato rimosso questo limite: si ritornano tutti i lemmi che soddisfano l'eventuale criterio di filtro impostato con il campo "Cerca un lemma". - Modificata l'interfaccia che nel pannello dell'unità mostra le relazioni con i lemmi. E' stato dato più spazio alla lista e sono stati ridotti i padding dei div contenuti nella parte destra dell'interfaccia (file app\views\shared\_side.html.erb). - Corretto errore in importazione lemmi da CSV - - Controllo qualità - Corretto errore nella funzione "Controllo qualità" che ne impediva l'esecuzione. - - Report - corretto errore nella produzione dei report in formato PDF nella versione standalone - - -## Archimista 2.0.0 (24 novembre 2015) - -- Aggiornate le versioni di Ruby e Rails: Ruby 2.1.5 e Rails 4.2.1 -- Report: - possibilità di scegliere i campi da inserire per tutte le entità coinvolte - possibilità di scegliere se inserire le etichette dei campi - riorganizzazione delle informazioni presentate in ciascun report - aggiunta la gestione dei dati relativi alle schede speciali - ottimizzazione dei tempi di elaborazione per il formato RTF (per ora solo su "Inventario") - -- Campo "Collegamenti" - navigabilità del link (url) in modalità anteprima per tutte le entità in cui è previsto - aggiunto anche in "Progetto" nel quale precedentemente non era visualizzato - -- Relazioni - le relazioni tra un'entità e le fonti sono ora gestibili in entrambe le direzioni (es. da complesso a fonti e viceversa da fonti a complesso) - -## Archimista 1.2.1 (18 giugno 2013) - -Correzione di bug. Vedi [dettaglio](https://github.com/codexcoop/archimista/compare/v1.2.0...v1.2.1) - -## Archimista 1.2.0 (25 marzo 2013) - -La nuova versione consolida e migliora le funzionalità dell'applicazione, con particolare riguardo a Oggetti digitali, Unità e Report. Si segnalano le novità principali. - +## Archimista 3.1.1 rev20210716 +* Fix mantenimento formattazione testi in ICAR-Import +* Miglioramento gestione assenza di oggetti digitali in ICAR-Export +* Aggiunto supporto per container docker e pubblicazione immagine su docker hub +* Aggiunta conversione automatica custodian con qualifier 'AU' o '["OT", "AU"]' in 'OT' per import .aef +* Corretto preferred_name assente per import di Creator o Custodian + +## Archimista 3.1.1 +* Il ruolo admin può ora gestire le schede anagrafiche all'interno del suo gruppo. +* Ripristinata l'anteprima delle text area nelle unità archivistiche. +* Modificati i loghi sulla home page. +* Correzione codifica caratteri accentati su alcune pagine. +* Modificata pagina di Informazioni e Copyright. +* Aumentata la dimensione di diversi campi testuali a 16777215 caratteri. +* Corretto il caricamento dei CSV in maniera tale da poter inserire nei campi testuali le virgole. +* Modificato il modo in cui sono conteggiate le unità archivistiche. +* Aggiunto filtro per complesso archivistico sulla pagina degli oggetti digitali. +* Corretta la tipologia fascicolo nella versione standalone. +* Corretta la segnatura provvisoria - numero delle unità: accetta solo caratteri numerici. +* Rese utilizzabili tutte le lingue nel relativo vocabolario. +* Modificato l'export XML (SCONS2, EAC-CPF, EAD3) in maniera tale da essere conforme al relativo tracciato. +* Tracciato EAC-CPF: modificato import dei soggetti produttori. +* Tracciato EAC-CPF: implementato import dei profili istituzionali. +* Tracciato EAC-CPF: implementato import delle schede anagrafiche. +* Tracciato SCONS2: modificato import dei soggetti conservatori. + +## Archimista 3.0 e 3.1 – gennaio 2019 +* Sviluppo del fascicolo edilizio secondo il modello presentato e dopo analisi con l’ICAR; +* Integrazione con la procedura di esportazione/importazione aef; +* Integrazione con la procedura di esportazione/importazione EAD3/EAC; +* Integrazione con la procedura di esportazione CAT-SAN/METS SAN; +* Integrazione con la procedura di batch esportazione/importazione aef comprensiva degli oggetti digitali;. +* Procedura batch di caricamento multiplo di documenti digitali (jpg e pdf) ad una unità utilizzando una nomenclatura specifica o una piccola struttura in json o in xml; + +## Archimista 2.2.0 - 22 settembre 2016 +* Correzione errori: + * corretto errore che si manifestava nel form indice dei soggetti produttori. Il comando "Nuova scheda" presentava la lista con l'opzione "F - Fotografia" invece che "Famiglia". Sono state aggiornate le traduzioni dei termini nel file "config\locales\views\units.yml" aggiungendo il livello "units_sc2_tsk" per fare in modo che le traduzioni dei valori del campo units.sc2_tsk non interferiscano con il resto. Cambiati coerentemente i form di visualizzazione delle unità (app\views\units\_form.html.erb, app\views\units\show.html.erb) + * è stata aggiunta una migrazione del database per correggere la gestione dei valori del vocabolario di units.sc2_tsk + * nella pagina che mostra le unità collegate ad un indice corretto errore che in presenta di unità di livelli maggiori del primo le mostrava con una caption non corretta (la caption era preceduta da "—" invece che dal corrispondente carattere) + * corretto errore nella procedura di recupero dei dati delle unità speciali (vedi lib\sc2_restore.rb) che non recuperava correttamente i dati di MISA e MISL delle schede OA, BDM + * corretta funzione di export e import da aef (app\models\export.rb, app\models\import.rb): i campi delle schede speciali non venivano esportati ed importati + * per questa correzione è stata creata una migrazione (20160401000000_sc2_add_legacy_current_id_field.rb) che aggiunge un nuovo campo (legacy_current_id) alle tabelle sc2_authors e sc2_commissions + * rigenerati i file db\seeds\*.json utilizzati per creare un database nuovo con la procedura "rake db:setup". Oltre ad aggiungere i file .json corrispondenti alle modifiche alla struttura di database introdotte dalla versione 2.1.0 in avanti, sono stati corretti alcuni errori nei contenuti dei file già esistenti, che non corrispondevano più alla struttura del database. In particolare tra questi è stata attuata la segnalazione evidenziata in https://github.com/ProgettoArchimista/archimista/pull/2 e relativa alla tabella groups. + * sono state aggiornate anche le procedure rake lib\tasks\db.rake che oltre a non prevedere i dati di seeding per i modelli introdotti dalla 2.1.0 in avanti, avevano qualche errore nel codice legato all'utilizzo delle nuove versioni ruby/rail introdotte con la versione 2.0.0 +* Nuove funzionalità: + * gestione di profili utente associati a più di un gruppo con possibilità per questi utenti di visionare/modificare i dati appartenenti a più gruppi + * nel report inventario aggiunta la gestione dei campi con ripetitività doppia (es. schede speciali CARS: "Motivo dell'attribuzione" dell'autore e "Nome" nella committenza). In precedenza non erano gestiti. (lib\report_support.rb) + * In Bacheca>ComplessiArchivistici>Elenco visualizzato anche l'elenco dei progetti collegati + * In Bacheca>SoggettiProduttori>Elenco visualizzato anche l'elenco dei progetti collegati + * In Bacheca>Progetti>Elenco visualizzato anche Tipologia dell'intervento, Responsabili (tutti e anche i soggetti coinvolti), Status + * In Bacheca>Progetti>Elenco possibilità di ricerca per Denominazione, Tipologia dell'intervento, Status + * Aggiunto campo consistenza nelle unità (extent) dopo Descrizione>Contenuto. Aggiornati report, anteprima unità, editing in formato tabella + * modificata la gestione dei report per correggere una segnalazione del 22/06/2016: "nei report il titolo viene sempre scritto, quindi selezionandolo come campo da scrivere viene scritto due volte". La soluzione adottata è stata di togliere il campo titolo dai campi di default delle unità, e di aggiungere nell'elenco dei campi una indicazione del fatto che il titolo delle unità compare sempre anche se non è selezionato. + * aggiunto pannello di opzioni nel form di editing delle unità per permettere di impostare etichette alternative per i prefissi utilizzati per comporre il valore del campo "Segnatura definitiva" come concatenazione dei campi "Busta", "Fascicolo". + * esportazione/importazione unità in formato .aef. + * nella visualizzazione delle unità di un complesso aggiunta la possibilità di selezionare solo le unità del complesso di primo livello e la possibilità di non effettuare la paginazione dei risultati per poter selezionare tutte le unità di un complesso. + * nella visualizzazione elenco di produttori, conservatori, complessi, indici, progetti, fonti e unità il filtro è stato reso sempre visibile indipendentemente dal numero di risultati + * modificato il nome del file prodotto con l'esportazione in formato aef in modo che contenga l'indicazione dell'entità di riferimento che è stata esportata (Es.: archimista-export_complesso-20160921182205.aef) + +## Archimista 2.1.0 versione server e stand alone – 28 marzo 2016 +* Ridisegno unità speciali, in particolare per la descrizione di schede unità documentaria di tipo CARS – cartografia storica, D-Disegno, DT-Disegno Tecnico, S-Stampa +* Migliorameno vocabolari controllati scheda Progetto +* Miglioramento scheda Gruppo, per gestione delle pubblicazioni in ArchiVista con filtri corrispondenti ai gruppi di lavoro +* Risoluzione bug per Indici +* Risoluzione bug per per report pdf su versioni stand alone + +## ArchiVista 2.0.0 versione server e stand alone (prima ArchimistaWeb solo versione server) – 28 marzo 2016 +* Introduzione della versione stand alone per consentire la visione dei dati sulle postazioni stand alone su cui è installato Archimista stand alone +* Gestione multisito: possibilità di creare una home page per ogni gruppo di lavoro presente in Archimista che consenta la ricerca e navigazione sui soli dati del gruppo +* Miglioramento visualizzazione unità speciali + +## Archimista Web 1.0.0 – 14 marzo 2014 +* Rilascio iniziale della versione 1.0.0 + +## Archimista 2.0.0 - 23 novembre 2015 +* Aggiornamento del framework, in particolare + * versione server: Ruby 2.1.5 e Rails 4.2.1 + * versione stand alone per sistemi Windows successivi a XP: Ruby 2.1.5 e Rails 4.2.1 + * versione stand alone per sistemi Windows XP: Ruby versione 2.0.0 e Rails 4.2.1 +* Report personalizzati, in particolare: + * possibilità di scelta dei campi da inserire per le entità (Progetto, Conservatore, Produttore, Complesso, Unità) + * possibilità di inserire o togliere le etichette dei campi per ogni entità +* Relazione tra fonti e altre entità, in particolare + * possibilità dalla scheda Fonte di creare una relazione con istanze delle entità Complesso, Conservatore, Produttore + +## Archimista 1.2.1 - 18 giugno 2013 +* Correzione errore nell’importazione aef di complessi archivistici con sottounità in un’istanza di Archimista con altri complessi archivistici comprensivi di sottounità +* Risoluzione della visualizzazione incompleta degli elenchi nei report rtf +Vedi elenco [completo delle correzioni](https://github.com/codexcoop/archimista/compare/v1.2.0...v1.2.1) + +## Archimista 1.2.0 - 25 marzo 2013 +La versione consolida e migliora le funzionalità dell’applicazione, con particolare riguardo a Oggetti digitali, Unità e Report. ### Oggetti digitali - -- Funzionalità di upload multiplo di file per singolo record di entità (Unità archivistica, Soggetto produttore, ecc.) -- Funzionalità di riordino dei file mediante *drag and drop* -- Migliorata l'interfaccia utente - +* Funzionalità di upload multiplo di file per singolo record di entità (Unità archivistica, Soggetto produttore, ecc.) +* Funzionalità di riordino dei file mediante *drag and drop* +* Migliorata l'interfaccia utente ### Unità - -- Possibilità di creare unità di terzo livello (sottosottounità) -- Possibilità di modificare il livello delle unità (trasformare unità in sottounità e viceversa, trasformare sottounità in sottosottounità e viceversa) -- Visualizzazione del numero di sequenza di sottounità e sottounità nella forma: 1.1, 1.1.1 - +* Possibilità di creare unità di terzo livello (sottosottounità) +* Possibilità di modificare il livello delle unità (trasformare unità in sottounità e viceversa, trasformare sottounità in sottosottounità e viceversa) +* Visualizzazione del numero di sequenza di sottounità e sottounità nella forma: 1.1, 1.1.1 ### Report - -- Migliorato il report *Inventario* -- Migliorato il report *Etichette unità*, con possibilità di esportazione in formato CSV / Excel per una completa personalizzazione mediante word processor -- Migliorato il report *Lista unità*, con possibilità di esportazione in formato CSV / Excel -- Aggiunto il report per *Soggetto conservatore* -- Aggiunto il report per *Progetto* - +* Migliorato il report *Inventario* +* Migliorato il report *Etichette unità*, con possibilità di esportazione in formato CSV / Excel per una completa personalizzazione mediante word processor +* Migliorato il report *Lista unità*, con possibilità di esportazione in formato CSV / Excel +* Aggiunto il report per *Soggetto conservatore* +* Aggiunto il report per *Progetto* ### Correzioni di bug - -- Unità: in modalità tabella talvolta non era possibile digitare spazi nei campi testo e nelle caselle dei filtri. Riferimento: [http://www.archiviando.org/forum/viewtopic.php?f=65&t=1388](http://www.archiviando.org/forum/viewtopic.php?f=65&t=1388) -- Soggetti produttori: nella creazione di nuova scheda Persona non si visualizzavano i campi "Luogo di nascita" e "Luogo di morte" -- Varie correzioni minori - -## Archimista 1.1.0 (22 giugno 2012) - -- Migliorate le funzionalità di Esporta / Importa (in formato *aef*). -È ora possibile esportare e importare i dati non solo di singoli complessi archivistici, ma anche di insiemi di complessi archivistici collegati a un soggetto conservatore o a un progetto. -- Risolto il problema che azzerava il numero di sequenza delle unità nelle azioni di riordino (si verificava solo nella versione standalone). Riferimento: [http://www.archiviando.org/forum/viewtopic.php?f=65&t=1115](http://www.archiviando.org/forum/viewtopic.php?f=65&t=1115) -- Risolto il problema che impediva di "catturare" i nomi di compilatori nelle schede di altre entità (si verificava solo nella versione standalone) -- Modifiche minori del codice di programmazione e dell'interfaccia utente - -## Archimista 1.0.0 (20 aprile 2012) - -Rilascio iniziale +* Unità: in modalità tabella talvolta non era possibile digitare spazi nei campi testo e nelle caselle dei filtri. Riferimento: [http://www.archiviando.org/forum/viewtopic.php?f=65&t=1388](http://www.archiviando.org/forum/viewtopic.php?f=65&t=1388) +* Soggetti produttori: nella creazione di nuova scheda Persona non si visualizzavano i campi "Luogo di nascita" e "Luogo di morte" +* Varie correzioni minori + +## Archimista 1.1.0 - 22 giugno 2012 +* Migliorate le funzionalità di Esporta / Importa (in formato *aef*). È ora possibile esportare e importare i dati non solo di singoli complessi archivistici, ma anche di insiemi di complessi archivistici collegati a un soggetto conservatore o a un progetto. +* Risolto il problema che azzerava il numero di sequenza delle unità nelle azioni di riordino (si verificava solo nella versione standalone; bug segnalato sul [Forum Archiviando](http://www.archiviando.org/forum/viewtopic.php?f=65&t=1115) +* Risolto il problema che impediva di "catturare" i nomi di compilatori nelle schede di altre entità (si verificava solo nella versione standalone) +* Modifiche minori del codice di programmazione e dell'interfaccia utente + +## Archimista 1.0.0 - 20 aprile 2012 +* Rilascio iniziale della versione 1.0.0 diff --git a/COPYRIGHT b/COPYRIGHT index 527f176..10092e1 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -1,5 +1,10 @@ -Copyright (C) 2011-2015 Direzione Generale per gli Archivi, Regione Lombardia, -Università degli Studi di Pavia, Politecnico di Milano +Copyright (C) 2011-2019 +Direzione Generale per gli Archivi +ICAR – Istituto Centrale per gli Archivi +Regione Lombardia, Direzione Generale Autonomia e Cultura +Università degli Studi di Pavia +Politecnico di Milano +Regione Piemonte Archimista is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/CREDITS.md b/CREDITS.md new file mode 100644 index 0000000..95c5679 --- /dev/null +++ b/CREDITS.md @@ -0,0 +1,61 @@ +## Crediti +2018 - in corso +* [Direzione Generale per gli Archivi](http://www.regione.lombardia.it) +* [ICAR – Istituto Centrale per gli Archivi](http://www.icar.beniculturali.it/) +* [Regione Lombardia, Direzione Generale Istruzione, Formazione e Cultura](http://www.regione.lombardia.it/wps/portal/istituzionale/HP/istituzione/direzioni-generali/direzione-generale-autonomia-e-cultura) +* [Università degli Studi di Pavia](http://www.unipv.eu/site/home.html) +* [Politecnico di Milano](https://www.polimi.it/) +* [Regione Piemonte](https://www.regione.piemonte.it/) + + +**2015 - 2018** +**Promozione e finanziamento** +* [Politecnico di Milano](http://www.polimi.it/) +* [Regione Lombardia, Direzione Generale Culture, Identità e Autonomie](http://www.cultura.regione.lombardia.it/) + +Contribuiscono allo sviluppo [Fondazione Famiglia Legler](http://www.ffl.it/) e [Fondazione ISEC](http://www.fondazioneisec.it/) + +**Comitato di pilotaggio** +* [Politecnico di Milano](http://www.polimi.it/) +* [Regione Lombardia, Direzione Generale Culture, Identità e Autonomie](http://www.cultura.regione.lombardia.it/) +* [Soprintendenza archivistica della Lombardia](http://www.sa-lom.archivi.beniculturali.it/) + +**Archimista versioni 2.0.0 e 2.1.0** +* Sviluppo 2.0.0: [TAI S.a.s.](http://www.taisas.com/), Milano +* Attività: aggiornamento framework (Ruby 2.1.5 e Rails 4.2.1), personalizzazione report, miglioramento relazione fra Fonti ed entità principali. Per dettagli consultare [Note di rilascio](http://www.archimista.it/?page_id=30) +* Rilasci: versione 2.0.0, 2.1.0 + +**ArchiVista versione 2.0.0** +* Sviluppo 2.0.0: [TAI S.a.s.](http://www.taisas.com/), Milano +* Attività: gestione multisito, visione campi speciali schede unità documentarie. Per dettagli consultare [Note di rilascio](http://www.archimista.it/?page_id=30) +* Rilasci: versione 2.0.0 + +**Licenza** +Questo programma è software libero; è lecito redistribuirlo o modificarlo secondo i termini della GNU General Public License come è pubblicata dalla Free Software Foundation; o la versione 2 della licenza o una versione successiva. + +Di seguito si elencano le responsabilità di progetto per gli anni precedenti + +**2012 - 2014** +**Promozione e finanziamento** +* [Politecnico di Milano](http://www.polimi.it/) +* [Regione Lombardia, Direzione Generale Culture, Identità e Autonomie](http://www.cultura.regione.lombardia.it/) + +**Comitato di pilotaggio** +* [Politecnico di Milano](http://www.polimi.it/) +* [Regione Lombardia, Direzione Generale Culture, Identità e Autonomie](http://www.cultura.regione.lombardia.it/) +* [Soprintendenza archivistica della Lombardia](http://www.sa-lom.archivi.beniculturali.it/) + +*Attività*: Miglioramento report, miglioramento riordini, gestione unità e sottounità, gestione oggetti digitali, modulo interrogazione web +*Rilasci*: versione 1.2.0, 1.2.1, Archimista Web 1.0.0 + +**2010 - 2012** +**Promozione e finanziamento** +* [Direzione Generale per gli Archivi](http://www.archivi.beniculturali.it/) +* [Regione Lombardia, Direzione Generale Culture, Identità e Autonomie](http://www.cultura.regione.lombardia.it/) +* [Regione Piemonte](http://www.regione.piemonte.it/) + +**Coordinamento scientifico** +* [Università degli Studi di Pavia](http://www.unipv.eu/site/home.html) + +*Attività*: sviluppo core di Archimista con data entry, viste e ordinamento dati +*Rilasci*: versione 1.0.0, 1.1.0 diff --git a/FAQ.md b/FAQ.md new file mode 100644 index 0000000..4e1292f --- /dev/null +++ b/FAQ.md @@ -0,0 +1,65 @@ +## Archimista FAQ 3.1.1 + +**È possibile estrarre un complesso o un’unità includendo tutta la gerarchia (ascendenza e discendenza)?** +Sì. Il tracciato relativo ad un complesso ora contiene: tutta l’ascendenza (se presente) a partire dal complesso radice secondo una struttura breve contenente solo *unitid* e *unittitle*; il complesso oggetto di esportazione; tutta la discendenza (se presente); le unità archivistiche associate al complesso oggetto di esportazione ed ai complessi figli. Il tracciato relativo ad una unità ora contiene: tutta l’ascendenza sia in termini di complessi che di unità a partire dal complesso radice secondo una struttura breve contenente solo *unitid* e *unittitle*; l’unità oggetto di esportazione; tutta la discendenza (se presente). + +**Come avviene l’esportazione di dati secondo il nuovo tracciato ICAR-IMPORT?** +L’esportazione avviene in un unico file, di un complesso archivistico e di tutte le entità ad esso associate. +Il tracciato ICAR-IMPORT è costruito a partire da un complesso archivistico (radice o non) ed include le seguenti entità: +* complesso archivistico secondo il tracciato EAD3 (con tutta la gerarchia ascendente e discendente); +* i complessi figli sono inseriti con tutte le informazioni che il tracciato prevede; +* ogni unità comprende gli oggetti digitali collegati (file inclusi nell’archivio zip insieme al file ICAR-IMPORT); +* i soggetti conservatori collegati al complesso radice secondo il tracciato SCONS2; +* i soggetti produttori collegati al complesso oggetto di esportazione o ad uno dei suoi complessi figli secondo il tracciato EAC-CPF; +* i profili istituzionali collegati ai soggetti produttori secondo il tracciato EAC-CPF; +* le schede anagrafiche collegate alle unità incluse secondo il tracciato EAC-CPF; +* le fonti archivistiche collegate al complesso oggetto di esportazione o ai complessi figli secondo il tracciato EAD3. + +**Tentando di estrarre mediante unzip un archivio generato dall'export in formato ICAR-IMPORT si ottiene un errore del tipo "error: invalid zip file with overlapped components (possible zip bomb)"; come risolvere?** +Per archivi di dimensioni superiori a 4GB potrebbe verificarsi un errore in fase di estrazione mediante unzip. Per ovviare al problema è possibile utilizzare in alernativa il software "7zip" o il comando "jar xf ". + +**È possibile creare una scheda sottofascicolo?** +Sì. È possibile crearla, dalla schermata in cui compare la lista delle unità relative ad un determinato complesso archivistico, è sufficiente cliccare sul bottone “crea sottofascicolo”. E’ anche possibile reiterare l’operazione su più livelli. + +**Gli aef prodotti con le precedenti versioni si importano senza problemi?** +Sì. Gli aef delle versioni sono sempre importati: si è scelto di gestire sempre la compatibilità con le versioni precedenti. +Anche i dati delle schede speciali prodotti con le versioni precedenti (sino alla versione 2.0.0) sono riconvertiti automaticamente e riportati nei nuovi campi delle schede unità di tipo unità documentaria al variare del tracciato di riferimento (in particolare D, F, S). +Tutti i dati delle vecchie schede speciali che non hanno corrispondenza nelle nuove (OA, BDM) sono salvati nel campo “descrizione estrinseca” (unità documentaria). + +**Per installare la nuova versione si sovrascrive la vecchia versione o è meglio disinstallare e reinstallare?** +Quando si procede a una nuova installazione della versione standalone, il database eventualmente già presente viene automaticamente aggiornato alla nuova versione (dati ed eventuali oggetti digitali). +Questo avviene anche se si procede alla disinstallazione della versione precedente (operazione consigliata), perché il database non viene mai rimosso. + +**Perché in Unità non visualizzo più il pulsante “Vai a scheda speciale” presente sino alla versione 2.0.0?** +La nuova versione 2.1.0 ha modificato il concetto di scheda speciale: in modalità scheda unità documentaria (da Unità), l’utente può richiedere l’attivazione di campi speciali, per la descrizione di schede unità documentaria di tipo: +* CARS Cartografia storica +* D Disegno +* DT Disegno tecnico +* F Fotografia +* S Stampa + +Per altri dettagli consulta la pagina [Note di rilascio](http://www.archimista.it/?page_id=30) + +**Le novità già introdotte dalla versione 2.0.0 riguardano:** +* Report + * possibilità di personalizzare il report scegliendo quali campi mostrare per le entità Progetto, Produttore, Conservatore, Complesso archivistico e Unità + * scelta per la visualizzazione o non visualizzazione del nome del campo per ogni entità principale +*Esempio di report con etichetta del campo* +`Titolo` +`“Titolo della mia unità”` +`Estremi cronologici 1977-2015` +*Esempio di report senza etichetta del campo* +`“Titolo della mia unità”` +`1977-2015` + * possibilità di inserimento dei campi delle schede speciali Unità +* Fonti + * possibilità di creare relazioni fra Fonti e le entità principali direttamente dalla scheda Fonte + +Per dettagli consulta la pagina [Note di rilascio](http://www.archimista.it/?page_id=30) + +**Le novità introdotte dalla versione 1.2.1 riguardano** +* esportazioni e importazioni, possibili sia per Complesso, sia per Progetto oppure Conservatore +* produzione di report per Complesso archivistico, Progetto o Soggetto conservatore +* upload multiplo di oggetti digitali +* creazione sotto-unità e sotto-sotto-unità e possibilità di modificarne il livello + diff --git a/Gemfile b/Gemfile index 583604c..033a491 100644 --- a/Gemfile +++ b/Gemfile @@ -46,8 +46,8 @@ gem 'devise', '>=3.5.1' gem 'devise-encryptable', '0.2.0' gem 'cancancan' -gem 'acts_as_list', '>=0.8.2' -gem 'ancestry', '>=2.2.1' +gem 'acts_as_list', '>=0.7.2' +gem 'ancestry', '>=2.1.0' gem 'will_paginate', '>=3.0.7' gem 'RedCloth', '>=4.2.9' gem 'paperclip', '>=4.2.1' diff --git a/README.md b/README.md index de1571c..db070fc 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ ## Archimista Archimista è un'applicazione web open source per la descrizione di archivi storici. È disponibile in due versioni: standalone e server. -Versione corrente: **3.0.0** +La versione corrente è la **3.1.1**. ## Requisiti -Archimista funziona sui sistemi operativi GNU/Linux, Mac OS X, Windows Vista e superiori. Per Windows XP è necessario utilizzare una versione apposita - +Archimista funziona sui sistemi operativi GNU/Linux, Mac OS X, Windows Vista e superiori. Per Windows XP è necessario utilizzare una versione apposita che viene compilata allo scopo. +I requisiti generali dell’applicazione sono i seguenti: * Ruby 2.1.5 * Rails 4.2.1 * Varie gemme Ruby dichiarate nel file Gemfile @@ -14,42 +14,53 @@ Archimista funziona sui sistemi operativi GNU/Linux, Mac OS X, Windows Vista e s * Webserver configurato per applicazioni Rails ## Installazione -Per Windows, versione standalone, è disponibile un pacchetto di installazione, scaricabile dal sito ufficiale: [http://www.archimista.it](http://www.archimista.it). - +Sono disponibili le versioni standalone con un proprio pacchetto di installazione per le versioni windows XP e per le versioni superiori. I pacchetti di installazione sono disponibili su github nella directory releases. Per la versione server, nel caso di prima installazione: - 1. Predisporre il proprio computer con il software indicato nei Requisiti 2. Creare un file di configurazione per il database: config/database.yml. Per maggiori informazioni leggi: [http://guides.rubyonrails.org/v2.3.11/getting_started.html#configuring-a-database](http://guides.rubyonrails.org/v2.3.11/getting_started.html#configuring-a-database) 3. Eseguire il task rake gems:install 4. Eseguire il task RAILS_ENV=production rake db:setup -5. Avviare il webserver +5. Nel file config/initializers/metadata.rb modificare la variabile BASE_URL inserendo il proprio url di archivista, modificare il file tmp/Configurazione_dl.rb con i dati da usare negli export SAN +6. Avviare il webserver L'utente per il primo login è: - * user: admin_archimista * pass: admin_archimista Nel caso di aggiornamento da versioni precedenti dell'applicazione: - 1. Eseguire il task RAILS_ENV=production rake db:migrate 2. Eseguire il task RAILS_ENV=production rake assets:clean +## Macchina virtuale +È possibile utilizzare una macchina virtuale già pronta per l'utilizzo di archimista e archivista scaricandola dal seguente url: +[http://archimista.icar.beniculturali.it/downloads/2021-02-06-archimista.ova](http://archimista.icar.beniculturali.it/downloads/2021-02-06-archimista.ova) (*se si dovessero verificare problemi nell'apertura del link, è consigliato copiare e incollare l'url in un nuovo tab del browser manualmente*) + +Di seguito il link alla guida all'uso della macchina virtuale: +[http://archimista.icar.beniculturali.it/downloads/VM-Archimista-manuale.pdf](http://archimista.icar.beniculturali.it/downloads/VM-Archimista-manuale.pdf) + +*NB: VirtualBox non è al momento compatibile con chip M1* + +## Supporto a Windows XP +In considerazione dell'obsolescenza del sistema operativo Windows XP, non più supportato da Microsoft dal 2014, non è stato possibile verificare appieno le funzionalità della versione archimista 3.1.1 per XP, e quindi non se ne raccomanda l'installazione. A partire dalle versioni di archimista successive alla 3.1.1, Windows XP non sarà più supportato. + +## FAQ +Consulta le FAQ per risolvere problemi comuni come ad esempio la gestione di export di dimensioni maggiori di 4GB o scoprire come utilizzare al meglio archimista. +[https://github.com/ProgettoArchimista/archimista/blob/master/FAQ.md](https://github.com/ProgettoArchimista/archimista/blob/master/FAQ.md) + ## Crediti Archimista è un progetto promosso da: - -* Direzione Generale per gli Archivi -* Regione Lombardia, Direzione Generale Istruzione, Formazione e Cultura -* Università degli Studi di Pavia -* Politecnico di Milano +* [Direzione Generale per gli Archivi](http://www.regione.lombardia.it) +* [ICAR – Istituto Centrale per gli Archivi](http://www.icar.beniculturali.it/) +* [Regione Lombardia, Direzione Generale Istruzione, Formazione e Cultura](http://www.regione.lombardia.it/wps/portal/istituzionale/HP/istituzione/direzioni-generali/direzione-generale-autonomia-e-cultura) +* [Università degli Studi di Pavia](http://www.unipv.eu/site/home.html) +* [Politecnico di Milano](https://www.polimi.it/) +* [Regione Piemonte](https://www.regione.piemonte.it/) ## Autori -Codex Società Cooperativa, Pavia -* [http://www.codexcoop.it](http://www.codexcoop.it) -TAI S.a.s. -* [http://www.taisas.com](http://www.taisas.com) - -Lo sviluppo attuale è curato da INGLOBA360 s.r.l. -* [http://www.ingloba360.it](http://www.ingloba360.it) +Codex Società Cooperativa, Pavia ([http://www.codexcoop.it](http://www.codexcoop.it)) +TAI S.a.s. ([http://www.taisas.com](http://www.taisas.com)) +Lo sviluppo attuale è curato da INGLOBA360 s.r.l. ([http://www.ingloba360.it](http://www.ingloba360.it)) ## Licenza Archimista è rilasciato sotto licenza GNU General Public License v2.0 o successive. + diff --git a/app/controllers/anagraphics_controller.rb b/app/controllers/anagraphics_controller.rb new file mode 100644 index 0000000..c60dec1 --- /dev/null +++ b/app/controllers/anagraphics_controller.rb @@ -0,0 +1,302 @@ +require 'csv' + +class AnagraphicsController < ApplicationController + helper_method :sort_column + + load_and_authorize_resource :except => [:ajax_list, :modal_new, :modal_link, :import_csv] + + def current_ability + if @current_ability.nil? + if (current_user.is_multi_group_user?()) + if (["show","edit","update","destroy"].include?(params[:action])) + a = Anagraphic.find(params[:id]) + @current_ability ||= Ability.new(current_user, a.group_id) + elsif (["list"].include?(params[:action])) + group_id = str2int(params[:group_id]) + @current_ability ||= Ability.new(current_user, group_id) + elsif (["index"].include?(params[:action])) + @current_ability ||= Ability.new(current_user, -1) + elsif (["new","create"].include?(params[:action])) + if params[:group_id].present? + group_id = str2int(params[:group_id]) + @current_ability ||= Ability.new(current_user, group_id) + end + elsif (["preview_csv","save_csv"].include?(params[:action])) + if params[:anagraphic][:group_id].present? + group_id = str2int(params[:anagraphic][:group_id]) + @current_ability ||= Ability.new(current_user, group_id) + end + elsif (["modal_link","modal_create"].include?(params[:action])) + related_entity_controller = if params["related_entity"].present? then params["related_entity"] else nil end + related_entity_id = if params["related_entity_id"].present? then params["related_entity_id"] else nil end + if !related_entity_controller.nil? && !related_entity_id.nil? + if related_entity_controller == "units" + group_id = str2int(Fond.find(Unit.find(related_entity_id).fond_id).group_id) + else + group_id = nil + end + if !group_id.nil? + @current_ability ||= Ability.new(current_user, group_id) + end + end + elsif (["ajax_link","ajax_remove"].include?(params[:action])) + if params[:anagraphic_id].present? + group_id = str2int(Anagraphic.find(params[:anagraphic_id]).group_id) + @current_ability ||= Ability.new(current_user, group_id) + end + end + end + end + if @current_ability.nil? + @current_ability = super + end + return @current_ability + end + + def index + terms + conditions = params[:view] ? "anagraphic_type = '#{params[:view]}'" : "" + + @anagraphics = Anagraphic.list.accessible_by(current_ability, :read).where(conditions).order(sort_column + ' ' + sort_direction).page(params[:page]) + + @counts_by_type = Anagraphic.accessible_by(current_ability, :read).group(:anagraphic_type).count("id") + + @units_counts = RelUnitAnagraphic.where({:anagraphic_id => @anagraphics.map(&:id)}).group(:anagraphic_id).count("id") + + end + + def list + terms + term = params[:term] || "" + + unless params[:exclude].blank? + exclude_condition = " AND id NOT IN (#{params[:exclude].join(',')})" + end + + @anagraphics = Anagraphic.accessible_by(current_ability, :read). + where("(LOWER(anagraphic_type) LIKE '%#{term}%' + OR LOWER(name) LIKE '%#{term}%' + OR LOWER(surname) LIKE '%#{term}%') + #{exclude_condition}").order("name") + + ActiveRecord::Base.include_root_in_json = false + response = @anagraphics.to_json(:methods => [:id, :value], :only => :methods) + + respond_to do |format| + format.json { render :json => response } + end + end + + def show + terms + @anagraphic = Anagraphic.find(params[:id]) + + @units = Unit.includes(:rel_unit_anagraphics).where("rel_unit_anagraphics.anagraphic_id = #{@anagraphic.id}").references(:rel_unit_anagraphics).page(params[:page]) + end + + def new + terms + @anagraphic = Anagraphic.new + end + + def edit + terms + @anagraphic = Anagraphic.find(params[:id]) + end + + def create + terms + @anagraphic = Anagraphic.new(anagraphic_params).tap do |anagraphic| + if current_user.is_multi_group_user?() + anagraphic.group_id = current_ability.target_group_id + else + anagraphic.group_id = current_user.rel_user_groups[0].group_id + end + end + + if @anagraphic.save + redirect_to(anagraphics_url, :notice => 'Anagrafica creata') + else + render :action => "new" + end + end + + def modal_new + terms + @anagraphic = Anagraphic.new + render :partial => 'anagraphics/new_anagraphic', :layout => false + end + + def modal_link + terms + model = params[:related_entity].singularize.camelize.constantize + + @entity = model.includes(:anagraphics).find(params[:related_entity_id]) + render :partial => 'anagraphics/link_anagraphic', :object => @entity.anagraphic_ids, :layout => false, :as => "object" + end + + def modal_create + model = params[:related_entity].singularize.camelize.constantize + @entity = model.find(params[:related_entity_id]) + @anagraphic = Anagraphic.new(anagraphic_params) + + respond_to do |format| + if @anagraphic.new_record? + @entity.anagraphics.create(anagraphic_params) + format.json { render :json => {:status => "success" }} + else + @entity.anagraphics.push(@anagraphic) unless @entity.anagraphics.include? @anagraphic + format.json { render :json => {:status => "success" }} + end + end + end + + def ajax_list + model = params[:related_entity].singularize.camelize.constantize + + @entity = model.includes(:anagraphics).find(params[:related_entity_id]) + render :partial => 'anagraphics/list_for', :object => @entity.anagraphics, :layout => false, :as => "object" + end + + def ajax_remove + @anagraphic = Anagraphic.find(params[:anagraphic_id]) + model = params[:related_entity].singularize.camelize.constantize + @entity = model.find(params[:related_entity_id]) + @entity.anagraphics.delete(@anagraphic) + + respond_to do |format| + if @entity.save + format.json { render :json => {:status => "success"} } + else + format.json { render :json => {:status => "failure", :msg => 'Rimozione non riuscita'} } + end + end + end + + def ajax_link + @anagraphic = Anagraphic.find(params[:anagraphic_id]) + model = params[:related_entity].singularize.camelize.constantize + @entity = model.find(params[:related_entity_id]) + @entity.anagraphics.push(@anagraphic) unless @entity.anagraphics.include? @anagraphic + respond_to do |format| + format.json { render :json => {:status => "success"} } + end + end + + def update + terms + @anagraphic = Anagraphic.find(params[:id]) + + if @anagraphic.update_attributes(anagraphic_params) + redirect_to(anagraphics_url(:view => @anagraphic.anagraphic_type), :notice => 'Anagrafica aggiornata') + else + render :action => "edit" + end + end + + def destroy + @anagraphic = Anagraphic.find(params[:id]) + @anagraphic.destroy + + redirect_to(anagraphics_url) + end + + def import_csv + end + + def preview_csv + terms + + if params[:upload].present? + begin + + @csv = CSV.read(params[:upload][:csv].path(), :col_sep => ";", :headers => headers) + + rescue Exception => e + flash.now[:alert] = "CSV non valido" + render :action => "import_csv" + end + else + render :action => "import_csv" + end + end + + def save_csv + terms + if File.exist?(params[:filename]) + @file = File.new(params[:filename], "r") + + @csv_anag = CSV.new(@file, :col_sep => ";", :headers => headers) + + @csv_identifiers = CSV.read(@file, :col_sep => ";", :headers => headers) + + @csv_identifiers.each_with_index do |csvirow, index| + if csvirow.empty? + @breakrow = index +1 + break + end + end + + @csv_anag.each do |row| + if row.empty? + break + else + aia = Hash.new(0) + @csv_identifiers.drop(@breakrow).each do |idrow| + if(idrow[0] == row[0]) + id = rand(10 ** 10).to_s + aia[id] = {:identifier=> idrow[1], :qualifier=> idrow[2]} + end + end + if aia.size > 0 + @record = Anagraphic.new( + :anag_identifiers_attributes => aia, + :anagraphic_type => nil, + :name => row[1], + :surname => row[2], + :start_date_place => row[3], + :start_date => row[4], + :end_date_place => row[5], + :end_date => row[6], + :group_id => if current_user.is_multi_group_user?() then current_ability.target_group_id else current_user.rel_user_groups[0].group_id end + ) + else + @record = Anagraphic.new( + :anagraphic_type => nil, + :name => row[1], + :surname => row[2], + :start_date_place => row[3], + :start_date => row[4], + :end_date_place => row[5], + :end_date => row[6], + :group_id => if current_user.is_multi_group_user?() then current_ability.target_group_id else current_user.rel_user_groups[0].group_id end + ) + end + @record.save + end + end + redirect_to(anagraphics_url, :notice => "Anagrafiche importate") + else + redirect_to(anagraphics_url, :alert => "Si è verificato un errore durante l'importazione delle anagrafiche") + end + end + + private + + def sort_column + params[:sort] || "anagraphics.name" + end + + def anagraphic_params + if !params[:group_id].present? + if current_user.is_multi_group_user?() + group_id = current_ability.target_group_id + else + group_id = current_user.rel_user_groups[0].group_id + end + params.require(:anagraphic).merge(group_id: group_id).permit! + else + params.require(:anagraphic).permit! + end + end +end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index eea8843..4ad33be 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -67,7 +67,7 @@ def sc2_terms def langs # Upgrade 2.0.0 inizio # @langs = Lang.find(:all, :conditions => {:active => true}) - @langs = Lang.where(active: true) + @langs = Lang.where(active: true).order("active DESC, it_name ASC") # Upgrade 2.0.0 fine end @@ -147,3 +147,4 @@ def after_sign_out_path_for(resource_or_scope) end + diff --git a/app/controllers/digital_objects_controller.rb b/app/controllers/digital_objects_controller.rb index f9e470d..429e1f1 100644 --- a/app/controllers/digital_objects_controller.rb +++ b/app/controllers/digital_objects_controller.rb @@ -47,6 +47,12 @@ def current_ability # Upgrade 2.2.0 fine def all + #if params[:type].present? + # @selected_attachable = {:type => params[:type]} + #else + # @selected_attachable = {:type => "Fond"} + #end + # Upgrade 2.0.0 inizio =begin @digital_objects = DigitalObject.accessible_by(current_ability, :read). @@ -62,14 +68,89 @@ def all to_a. delete_if {|o| o.attachable.nil? || (o.attachable.has_attribute?("sequence_number") && o.attachable.sequence_number.nil?) } =end - @digital_objects = DigitalObject.accessible_by(current_ability, :read). - joins(:group). - includes(:attachable). - order(sort_column + ' ' + sort_direction).page(params[:page]). - to_a. - delete_if {|o| o.attachable.nil? || (o.attachable.has_attribute?("sequence_number") && o.attachable.sequence_number.nil?) } -# Upgrade 2.2.0 fine -# Upgrade 2.0.0 fine +=begin + #Ricerca degli oggetti digitali appartenenti a fondi che hanno come ROOT un fondo con il nome ricercato (like) + + @digital_objects = DigitalObject.accessible_by(current_ability, :read). + joins(:group). + includes(:attachable). + where(attachable: Fond.roots.where("fonds.name LIKE ?", "%" + params[:q] + "%"). + joins("INNER JOIN fonds f_child ON f_child.ancestry LIKE CONCAT(fonds.id, '/%') OR f_child.ancestry_depth = 0")). + order(sort_column + ' ' + sort_direction). + page(params[:page]). + to_a. + delete_if { + |o| o.attachable.nil? || + (o.attachable.has_attribute?("sequence_number") && o.attachable.sequence_number.nil?)} +=end + if params[:q].present? or params[:unit].present? + if params[:unit] != "" && params[:q] != "" + @digital_objects = DigitalObject.accessible_by(current_ability, :read). + joins(:group). + includes(:attachable). + where(attachable: Unit.joins("INNER JOIN fonds ON units.root_fond_id = fonds.id"). + where("fonds.name LIKE ? AND units.title LIKE ?", + "%" + params[:q] + "%", + "%" + params[:unit] + "%")). + order(sort_column + ' ' + sort_direction).page(params[:page]). + to_a. + delete_if { + |o| o.attachable.nil? || + (o.attachable.has_attribute?("sequence_number") && o.attachable.sequence_number.nil?) + } + elsif params[:unit] != "" + @digital_objects = DigitalObject.accessible_by(current_ability, :read). + joins(:group). + includes(:attachable). + where(attachable: Unit.joins("INNER JOIN fonds ON units.root_fond_id = fonds.id"). + where("units.title LIKE ?", + "%" + params[:unit] + "%")). + order(sort_column + ' ' + sort_direction).page(params[:page]). + to_a. + delete_if { + |o| o.attachable.nil? || + (o.attachable.has_attribute?("sequence_number") && o.attachable.sequence_number.nil?) + } + + elsif params[:q] != "" + @digital_objects = DigitalObject.accessible_by(current_ability, :read). + joins(:group). + includes(:attachable). + where(attachable: Unit.joins("INNER JOIN fonds ON units.root_fond_id = fonds.id"). + where("fonds.name LIKE ?", "%" + params[:q] + "%")). + order(sort_column + ' ' + sort_direction).page(params[:page]). + to_a. + delete_if { + |o| o.attachable.nil? || + (o.attachable.has_attribute?("sequence_number") && o.attachable.sequence_number.nil?) + } + end + + @fond_ids_AEF = Array.new + @fond_ids_EAD = Array.new + @unit_ids = Array.new + + @digital_objects.each do |dig_obj| + if dig_obj.attachable_type == "Unit" + @fond_ids_AEF.push Unit.find(dig_obj.attachable_id).root_fond_id + @unit_ids.push dig_obj.attachable_id + end + if dig_obj.attachable_type == "Fond" + @fond_ids_AEF.push dig_obj.attachable_id + @fond_ids_EAD.push dig_obj.attachable_id + end + end + else + @digital_objects = DigitalObject.accessible_by(current_ability, :read). + joins(:group). + includes(:attachable). + order(sort_column + ' ' + sort_direction).page(params[:page]). + to_a. + delete_if {|o| o.attachable.nil? || (o.attachable.has_attribute?("sequence_number") && o.attachable.sequence_number.nil?) } + end + + #Upgrade 2.2.0 fine + #Upgrade 2.0.0 fine # FIXME: retrieving del path di fonds/units è query intensive. Ma per ora teniamocelo... end diff --git a/app/controllers/exports_batch_controller.rb b/app/controllers/exports_batch_controller.rb new file mode 100644 index 0000000..07839a9 --- /dev/null +++ b/app/controllers/exports_batch_controller.rb @@ -0,0 +1,312 @@ +class ExportsBatchController < ApplicationController + + OK_EXPORT_MESSAGE = "Esportazione batch avviata." + KO_EXPORT_MESSAGE = "Errore nell'avvio dell'esportazione batch." + + def index + @export_folder = "#{Rails.root}/public/exports" + + @fonds = Fond.list. + roots. + accessible_by(current_ability, :read). + active. + default_order + + @custodians = Custodian.export_list.accessible_by(current_ability, :read) + @projects = Project.export_list.accessible_by(current_ability, :read) + @creators = Creator.export_list.accessible_by(current_ability, :read) + @sources = Source.export_list.accessible_by(current_ability, :read) + + @project_select_options = [] + @projects.each do |project| + @project_select_options.append([project.name, project.id]) + end + + @fonds_select_options = [] + @fonds.each do |fond| + @fonds_select_options.append([fond.name, fond.id]) + end + + @custodians_select_options = [] + @custodians.each do |custodian| + @custodians_select_options.append([custodian.name, custodian.id]) + end + + @sources_select_options = [] + @sources.each do |source| + @sources_select_options.append([source.short_title, source.id]) + end + end + + def icarimport + begin + fond_id = params[:fond_id] + if fond_id.nil? + add_message = " Selezionare un Complesso." + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE + add_message) + return + end + + rake_req = 'rake ead:build_xml[icar-import,"' + fond_id + '"]' + + Rails.logger.info "Esecuzione rake task: " + rake_req + system rake_req + redirect_to({ :action=>'index' }, :notice => OK_EXPORT_MESSAGE) + rescue Exception => e + Rails.logger.warn "ECCEZIONE in exports_batch_controller: #{e.message}" + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE) + end + end + + def aefallfonds + begin + project_id = params[:project_id] + if project_id.nil? + add_message = " Selezionare un Progetto." + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE + add_message) + return + end + + rake_req = 'rake aef:build_data[fonds,"SELECT DISTINCT f.* from fonds f\, rel_project_fonds r\, projects p where p.id=r.project_id and f.id=r.fond_id and f.published is true and p.id=' + project_id + ' and trashed is false and f.ancestry_depth=0 and p.published is true"]' + + Rails.logger.info "Esecuzione rake task: " + rake_req + system rake_req + redirect_to({ :action=>'index' }, :notice => OK_EXPORT_MESSAGE) + rescue Exception => e + Rails.logger.warn "ECCEZIONE in exports_batch_controller: #{e.message}" + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE) + end + end + + def aeffondsnoancestry + begin + fond_ids = params[:fond_id] + if fond_ids.nil? + add_message = " Selezionare almeno un Fondo." + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE + add_message) + return + end + + fond_ids_list = fond_ids.to_s.gsub("[", "(").gsub("]", ")").gsub("\"", "").gsub(" ", "").gsub(",", "\\,") + + rake_req = 'rake aef:build_data[fonds,"SELECT DISTINCT * from fonds where id IN ' + fond_ids_list + ' and ancestry_depth=0"]' + + Rails.logger.info "Esecuzione rake task: " + rake_req + system rake_req + redirect_to({ :action=>'index' }, :notice => OK_EXPORT_MESSAGE) + rescue Exception => e + Rails.logger.warn "ECCEZIONE in exports_batch_controller: #{e.message}" + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE) + end + end + + def aefallfondsnoancestry + begin + rake_req = 'rake aef:build_data[fonds,"SELECT DISTINCT * from fonds where ancestry_depth=0"]' + Rails.logger.info "Esecuzione rake task: " + rake_req + system rake_req + redirect_to({ :action=>'index' }, :notice => OK_EXPORT_MESSAGE) + rescue Exception => e + Rails.logger.warn "ECCEZIONE in exports_batch_controller: #{e.message}" + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE) + end + end + + def aefprojects + begin + project_ids = params[:project_id] + if project_ids.nil? + add_message = " Selezionare almeno un Progetto." + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE + add_message) + return + end + + project_ids_list = project_ids.to_s.gsub("[", "(").gsub("]", ")").gsub("\"", "").gsub(" ", "").gsub(",", "\\,") + + rake_req = 'rake aef:build_data[projects,"SELECT DISTINCT * from projects where id IN ' + project_ids_list + ' and published is true"]' + + Rails.logger.info "Esecuzione rake task: " + rake_req + system rake_req + redirect_to({ :action=>'index' }, :notice => OK_EXPORT_MESSAGE) + rescue Exception => e + Rails.logger.warn "ECCEZIONE in exports_batch_controller: #{e.message}" + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE) + end + end + + def aefallprojects + begin + rake_req = 'rake aef:build_data[projects,"SELECT DISTINCT * from projects where published is true"]' + Rails.logger.info "Esecuzione rake task: " + rake_req + system rake_req + redirect_to({ :action=>'index' }, :notice => OK_EXPORT_MESSAGE) + rescue Exception => e + Rails.logger.warn "ECCEZIONE in exports_batch_controller: #{e.message}" + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE) + end + end + + def aefcustodiansproject + begin + project_id = params[:project_id] + if project_id.nil? + add_message = " Selezionare un Progetto." + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE + add_message) + return + end + + rake_req = 'rake aef:build_data[custodians,"SELECT * from custodians where id IN (SELECT DISTINCT custodian_id FROM rel_custodian_fonds WHERE fond_id IN (SELECT DISTINCT f.id from rel_project_fonds r\, fonds f\, projects p where p.id=r.project_id and f.id=r.fond_id and f.published is true and p.id=' + project_id + ' and trashed is false and f.ancestry_depth=0 and p.published is true))"]' + + Rails.logger.info "Esecuzione rake task: " + rake_req + system rake_req + redirect_to({ :action=>'index' }, :notice => OK_EXPORT_MESSAGE) + rescue Exception => e + Rails.logger.warn "ECCEZIONE in exports_batch_controller: #{e.message}" + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE) + end + end + + def aefcustodians + begin + custodian_ids = params[:custodian_id] + if custodian_ids.nil? + add_message = " Selezionare almeno un Conservatore." + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE + add_message) + return + end + + custodian_ids_list = custodian_ids.to_s.gsub("[", "(").gsub("]", ")").gsub("\"", "").gsub(" ", "").gsub(",", "\\,") + + rake_req = 'rake aef:build_data[custodians,"SELECT DISTINCT * from custodians where id IN ' + custodian_ids_list + '"]' + + Rails.logger.info "Esecuzione rake task: " + rake_req + system rake_req + redirect_to({ :action=>'index' }, :notice => OK_EXPORT_MESSAGE) + rescue Exception => e + Rails.logger.warn "ECCEZIONE in exports_batch_controller: #{e.message}" + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE) + end + end + + def aefallcustodians + begin + rake_req = 'rake aef:build_data[custodians,"SELECT DISTINCT * from custodians"]' + Rails.logger.info "Esecuzione rake task: " + rake_req + system rake_req + redirect_to({ :action=>'index' }, :notice => OK_EXPORT_MESSAGE) + rescue Exception => e + Rails.logger.warn "ECCEZIONE in exports_batch_controller: #{e.message}" + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE) + end + end + + def xmlallfonds + begin + project_id = params[:project_id] + if project_id.nil? + add_message = " Selezionare un Progetto." + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE + add_message) + return + end + + rake_req = 'rake ead:build_xml[fonds,"SELECT DISTINCT f.* from rel_project_fonds r\, fonds f\, projects p where p.id=r.project_id and f.id=r.fond_id and f.published is true and p.id=' + project_id + ' and trashed is false and f.ancestry_depth=0"]' + + Rails.logger.info "Esecuzione rake task: " + rake_req + system rake_req + redirect_to({ :action=>'index' }, :notice => OK_EXPORT_MESSAGE) + rescue Exception => e + Rails.logger.warn "ECCEZIONE in exports_batch_controller: #{e.message}" + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE) + end + end + + def xmlfondsnoancestry + begin + fond_ids = params[:fond_id] + if fond_ids.nil? + add_message = " Selezionare almeno un Fondo." + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE + add_message) + return + end + + fond_ids_list = fond_ids.to_s.gsub("[", "(").gsub("]", ")").gsub("\"", "").gsub(" ", "").gsub(",", "\\,") + + rake_req = 'rake ead:build_xml[fonds,"SELECT DISTINCT * from fonds where id IN ' + fond_ids_list + ' and ancestry_depth=0"]' + + Rails.logger.info "Esecuzione rake task: " + rake_req + system rake_req + redirect_to({ :action=>'index' }, :notice => OK_EXPORT_MESSAGE) + rescue Exception => e + Rails.logger.warn "ECCEZIONE in exports_batch_controller: #{e.message}" + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE) + end + end + + def xmlallfondsnoancestry + begin + rake_req = 'rake ead:build_xml[fonds,"SELECT DISTINCT * from fonds where ancestry_depth=0"]' + Rails.logger.info "Esecuzione rake task: " + rake_req + system rake_req + redirect_to({ :action=>'index' }, :notice => OK_EXPORT_MESSAGE) + rescue Exception => e + Rails.logger.warn "ECCEZIONE in exports_batch_controller: #{e.message}" + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE) + end + end + + def xmlsourcesproject + begin + project_id = params[:project_id] + if project_id.nil? + add_message = " Selezionare un Progetto." + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE + add_message) + return + end + + rake_req = 'rake ead:build_xml[sources,"SELECT * from sources where id IN (SELECT DISTINCT source_id FROM rel_fond_sources WHERE fond_id IN (SELECT DISTINCT f.id from rel_project_fonds r\, fonds f\, projects p where p.id=r.project_id and f.id=r.fond_id and f.published is true and p.id=' + project_id + ' and trashed is false and f.ancestry_depth=0))"]' + # cambiato: rel_source_fonds -> rel_fond_sources + + Rails.logger.info "Esecuzione rake task: " + rake_req + system rake_req + redirect_to({ :action=>'index' }, :notice => OK_EXPORT_MESSAGE) + rescue Exception => e + Rails.logger.warn "ECCEZIONE in exports_batch_controller: #{e.message}" + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE) + end + end + + def xmlsources + begin + source_ids = params[:source_id] + if source_ids.nil? + add_message = " Selezionare almeno una Fonte o Strumento." + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE + add_message) + return + end + + source_ids_list = source_ids.to_s.gsub("[", "(").gsub("]", ")").gsub("\"", "").gsub(" ", "").gsub(",", "\\,") + + rake_req = 'rake ead:build_xml[sources,"SELECT DISTINCT * from sources where id IN ' + source_ids_list + '"]' + + Rails.logger.info "Esecuzione rake task: " + rake_req + system rake_req + redirect_to({ :action=>'index' }, :notice => OK_EXPORT_MESSAGE) + rescue Exception => e + Rails.logger.warn "ECCEZIONE in exports_batch_controller: #{e.message}" + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE) + end + end + + def xmlallsources + begin + rake_req = 'rake ead:build_xml[sources,"SELECT DISTINCT * from sources"]' + Rails.logger.info "Esecuzione rake task: " + rake_req + system rake_req + redirect_to({ :action=>'index' }, :notice => OK_EXPORT_MESSAGE) + rescue Exception => e + Rails.logger.warn "ECCEZIONE in exports_batch_controller: #{e.message}" + redirect_to({ :action=>'index' }, :alert => KO_EXPORT_MESSAGE) + end + end + +end diff --git a/app/controllers/exports_controller.rb b/app/controllers/exports_controller.rb index 821928c..95834c1 100644 --- a/app/controllers/exports_controller.rb +++ b/app/controllers/exports_controller.rb @@ -1,8 +1,12 @@ class ExportsController < ApplicationController # Upgrade 2.0.0 inizio require 'exportjson' +require 'builder' # Upgrade 2.0.0 fine + @@is_icar_file = false + @@icar_download_file = "" + def index @fonds = Fond.list. roots. @@ -12,6 +16,9 @@ def index @custodians = Custodian.export_list.accessible_by(current_ability, :read) @projects = Project.export_list.accessible_by(current_ability, :read) + @creators = Creator.export_list.accessible_by(current_ability, :read) + @sources = Source.export_list.accessible_by(current_ability, :read) + if params[:target_id].present? && params[:target_class].present? suffix = Time.now.strftime("%Y%m%d%H%M%S") @@ -31,7 +38,6 @@ def index entity = model.find(params[:target_id]) @export.group_id = entity.group_id # Upgrade 2.2.0 fine -# Upgrade 3.0.0 inizio begin @export.create_export_file rescue Exception => e @@ -39,7 +45,7 @@ def index redirect_to exports_path, :alert => 'Errore nella creazione del file di export' return end -# Upgrade 3.0.0 fine + # Upgrade 2.0.0 inizio # usando la struttura @export si verificava un errore @exportjson = ExportJson.new @@ -57,17 +63,58 @@ def index end end + def xml + if params[:target_id].present? && params[:target_class].present? + suffix = Time.now.strftime("%Y%m%d%H%M%S") + @export = Export.new + @export.target_id = params[:target_id] + @export.target_class = params[:target_class] + @export.mode = params[:mode] + @export.metadata_file = Export::TMP_EXPORTS + "/metadata-#{suffix}.json" + @export.data_file = Export::TMP_EXPORTS + "/data-#{params[:target_class]}-#{suffix}.xml" + @export.dest_file = "#{Rails.root}/public/downloads/archimista-#{get_target_class_caption(@export.target_class)}-#{suffix}.zip" + @export.inc_digit = params[:inc_digit] + + model = params[:target_class].singularize.camelize.constantize + entity = model.find(params[:target_id]) + @export.group_id = entity.group_id + target_xml = params[:target_xml] + if target_xml.include? "san" + @@is_icar_file = false + @export.create_export_xml_san_file + else + @@is_icar_file = true + @export.stream_icar_import + @@icar_download_file = @export.get_icarimportfile + end + + + @exportjson = ExportJson.new + @exportjson.metadata_file = @export.metadata_file + @exportjson.data_file = @export.data_file + @exportjson.dest_file = @export.dest_file + + respond_to do |format| + format.json { render :json => @exportjson } + end + end + end + def download #File.delete("#{Export::TMP_EXPORTS}/#{params[:data]}") #File.delete("#{Export::TMP_EXPORTS}/#{params[:meta]}") - file = "#{Rails.root}/public/downloads/#{params[:file]}" + if @@is_icar_file + file = @@icar_download_file + else + file = "#{Rails.root}/public/downloads/#{params[:file]}" + end send_file(file) end # Upgrade 2.2.0 inizio def units -# Upgrade 3.0.0 inizio -# Definizione dell'export in formato csv per unità + # Upgrade 3.0.0 inizio + # Definizione dell'export in formato csv per unità if params[:unit_ids].present? && params[:ref_fond_id].present? suffix = Time.now.strftime("%Y%m%d%H%M%S") @export = Export.new @@ -105,8 +152,7 @@ def units end end end - # Upgrade 3.0.0 fine - + # Upgrade 3.0.0 fine def get_target_class_caption(target_class) case target_class when "fond" @@ -124,5 +170,46 @@ def get_target_class_caption(target_class) end # Upgrade 2.2.0 fine + def units_ead + if params[:units].present? + ids = String.new + params[:units].each do |unit| + ids += unit.to_s + "\\," + end + ids = ids[0...-2] + rake_req = "rake ead:build_xml[units,\"SELECT DISTINCT * from units where id IN (" + ids + ")\"]" + puts rake_req + system rake_req + end +=begin +# Al momento solo le unita' vengono ricercate e quindi esportate in EAD + if(params[:fonds].present?) + ids = String.new + params[:units].each do |fond| + ids += fond.to_s + "\\," + end + ids = ids[0...-2] + rake_req = "rake ead:build_xml[fonds,\"SELECT DISTINCT * from fonds where id IN (" + ids + ")\"]" + puts rake_req + system rake_req + end +=end + head :ok + end + + def fonds_aef + if params[:fonds].present? + ids = String.new + params[:fonds].each do |fond| + ids += fond.to_s + "\\," + end + ids = ids[0...-2] + rake_req = "rake aef:build_data[fonds,\"SELECT DISTINCT * from fonds where id IN (" + ids + ")\"]" + puts rake_req + system rake_req + end + head :ok + end + end diff --git a/app/controllers/fonds_controller.rb b/app/controllers/fonds_controller.rb index ac63cbd..b9bc9d4 100644 --- a/app/controllers/fonds_controller.rb +++ b/app/controllers/fonds_controller.rb @@ -13,7 +13,7 @@ class FondsController < ApplicationController def current_ability if @current_ability.nil? if (current_user.is_multi_group_user?()) - if (["treeview","tree","trash","move_to_trash","trashed_subtree","restore_subtree","show","edit","ajax_update","merge_with","merge","update","rename","move","destroy","destroy_subtree"].include?(params[:action])) + if (["treeview","tree","trash","move_to_trash","trashed_subtree","restore_subtree","show","edit","ajax_update","merge_with","merge","update","rename","move","destroy","destroy_subtree","split", "split_fond"].include?(params[:action])) f = Fond.select("group_id").find(params[:id]) @current_ability ||= Ability.new(current_user, f.group_id) elsif (["index"].include?(params[:action])) @@ -227,7 +227,7 @@ def index # Upgrade 2.2.0 fine if @fonds.size > 0 @units_counts = Unit.joins(:fond). - where({:root_fond_id => @fonds.map(&:id), :fonds => {:trashed => false}}). + where({:root_fond_id => @fonds.map(&:id), :fonds => {:trashed => false}, :ancestry => nil}). group(:root_fond_id).count("id") end # Upgrade 2.0.0 fine @@ -442,15 +442,15 @@ def merge_with def merge @fond = Fond.find(params[:id]) - if params[:new_root_id].present? - if params[:id] == params[:new_root_id] + if params[:choosen_root_id].present? + if params[:id] == params[:choosen_root_id] flash[:alert] = 'Impossibile unire un complesso archivistico con se stesso.' redirect_to fonds_url return end @choosen_root = Fond.find(params[:choosen_root_id]) - new_root_id = params[:new_root_id].to_i + new_root_id = params[:choosen_root_id].to_i if @fond.move_with_external_sequence(:new_parent_id => @choosen_root.id, :new_position => 1) # Upgrade 3.0.0 inizio # Unit.update_all("root_fond_id = #{@new_root.id}", ["root_fond_id = ?", @fond.id]) diff --git a/app/controllers/imports_controller.rb b/app/controllers/imports_controller.rb index 22e3233..dd8243d 100644 --- a/app/controllers/imports_controller.rb +++ b/app/controllers/imports_controller.rb @@ -1,11 +1,21 @@ class ImportsController < ApplicationController load_and_authorize_resource -# Upgrade 2.2.0 inizio + # Upgrade 2.2.0 inizio skip_load_and_authorize_resource :only => [ :new ] -# Upgrade 2.2.0 fine + # Upgrade 2.2.0 fine -# Upgrade 2.2.0 inizio + attr_accessor :is_batch_import, :batch_import_user, :batch_import_filename + + # Upgrade 2.2.0 inizio def current_ability + current_user_tmp = NIL + if !@is_batch_import + current_user_tmp = current_user + else + current_user_tmp = @batch_import_user + end + current_user = current_user_tmp + if @current_ability.nil? if (current_user.is_multi_group_user?()) if (["destroy"].include?(params[:action])) @@ -19,65 +29,76 @@ def current_ability end end end - if @current_ability.nil? - @current_ability = super + if !@is_batch_import + if @current_ability.nil? + @current_ability = super + end end return @current_ability end -# Upgrade 2.2.0 fine + # Upgrade 2.2.0 fine def index -# Upgrade 2.0.0 inizio -# @imports = Import.accessible_by(current_ability, :read).all(:include => [:importable], :conditions => {:deletable => true}, :order => "created_at DESC") + # Upgrade 2.0.0 inizio + #@imports = Import.accessible_by(current_ability, :read).all(:include => [:importable], :conditions => {:deletable => true}, :order => "created_at DESC") @imports = Import.accessible_by(current_ability, :read).includes([:importable]).where({:deletable => true}).order("created_at DESC") -# Upgrade 2.0.0 fine + # Upgrade 2.0.0 fine end def new @import = Import.new + @is_icar_import = false end def create -# Upgrade 2.0.0 inizio Strong parameters -# if params[:import].present? -# @import = Import.new(params[:import]) if import_params.present? - @import = Import.new(import_params) -# Upgrade 2.0.0 fine + current_user_tmp = NIL + if !@is_batch_import + @import = Import.new(import_params) + current_user_tmp = current_user + else + current_user_tmp = @batch_import_user + @import = Import.new({"group_id"=>"1"}) + @import.is_batch_import = true + @import.batch_import_filename = @batch_import_filename + end + current_user = current_user_tmp + @import.user_id = current_user.id -# Upgrade 2.2.0 inizio -# @import.group_id = current_user.group_id if current_user.is_multi_group_user?() @import.group_id = current_ability.target_group_id else @import.group_id = current_user.rel_user_groups[0].group_id end - if (params[:context].present? && params[:context] == "units_import") - is_units_import = true - if (params[:ref_fond_id].present?) - @import.ref_fond_id = params[:ref_fond_id] - end - if (params[:ref_root_fond_id].present?) - @import.ref_root_fond_id = params[:ref_root_fond_id] - end - if (params[:ref_fond_id].present?) - redirect_url = fond_units_path(params[:ref_fond_id]) - redirect_url_new = redirect_url + + if !@is_batch_import + if (params[:context].present? && params[:context] == "units_import") + is_units_import = true + if (params[:ref_fond_id].present?) + @import.ref_fond_id = params[:ref_fond_id] + end + if (params[:ref_root_fond_id].present?) + @import.ref_root_fond_id = params[:ref_root_fond_id] + end + if (params[:ref_fond_id].present?) + redirect_url = fond_units_path(params[:ref_fond_id]) + redirect_url_new = redirect_url + else + redirect_url = imports_url + redirect_url_new = new_import_url + end else + is_units_import = false redirect_url = imports_url redirect_url_new = new_import_url end - else - is_units_import = false - redirect_url = imports_url - redirect_url_new = new_import_url end -# Upgrade 2.2.0 fine + @import.identifier = Digest::SHA1.hexdigest("#{Time.now}") if @import.save begin @import.is_valid_file? -# Upgrade 2.2.0 inizio + # Upgrade 2.2.0 inizio if is_units_import if !@import.is_unit_aef_file? raise "Il file aef selezionato non è stato creato esportando unità e non può quindi essere utilizzato con questa funzionalità dell'applicazione.
Per importarlo è necessario utilizzare le funzioni di importazione di file aef disponibili all'interno della relativa sezione dell'applicazione." @@ -87,52 +108,122 @@ def create raise "Il file aef selezionato è stato creato esportando unità e non può quindi essere utilizzato con questa funzionalità dell'applicazione.
Per importarlo è necessario utilizzare la funzionità di importazione di file aef contenenti unità disponibile nella pagina di visualizzazione delle unità di un complesso." end end -# Upgrade 2.2.0 fine + # Upgrade 2.2.0 fine rescue Exception => e + Rails.logger.info("eccezione: #{e.message}") @import.delete_tmp_files @import.delete -# Upgrade 2.2.0 inizio -# redirect_to new_import_url, :alert => e.message - redirect_to redirect_url_new, :alert => e.message -# Upgrade 2.2.0 fine + if !@is_batch_import + redirect_to redirect_url_new, :alert => e.message + else + Rails.logger.warn e.message + puts "\n>>> #{e.message}" + end return end -# Upgrade 2.2.0 inizio -# if @import.import_aef_file(current_user) -# Upgrade 3.0.0 inizio + # Upgrade 2.2.0 inizio + #if @import.import_aef_file(current_user) extens = File.extname(@import.data_file_name).downcase.gsub('.', '') - if ['aef'].include? extens if @import.import_aef_file(current_user, current_ability) -# Upgrade 2.2.0 fine + # Upgrade 2.2.0 fine @import.delete_tmp_files @import.update_attributes :importable_id => @import.importable_id, :importable_type => @import.importable_type -# Upgrade 2.2.0 inizio -# redirect_to imports_url, :notice => "File importato correttamente." - redirect_to redirect_url, :notice => "File importato correttamente." -# Upgrade 2.2.0 fine + msg = "File importato correttamente." + if !@is_batch_import + redirect_to redirect_url, :notice => msg + else + Rails.logger.info msg + puts "\n> #{msg}" + end else @import.delete_tmp_files @import.delete -# Upgrade 2.2.0 inizio -# redirect_to imports_url, :alert => "Si è verificato un errore durante l'importazione del file aef." - redirect_to redirect_url, :alert => "Si è verificato un errore durante l'importazione del file aef." -# Upgrade 2.2.0 fine + msg = "Si è verificato un errore durante l'importazione del file aef." + if !@is_batch_import + redirect_to redirect_url, :alert => msg + else + Rails.logger.warn msg + puts "\n>>> #{msg}" + end end - else + elsif ['xml'].include? extens + result = @import.import_xml_file(current_user, current_ability) + if result == 1 + @import.update_attributes :importable_id => @import.importable_id, :importable_type => @import.importable_type + if @import.does_source_have_fonds + msg_notice = "File importato correttamente." + msg_alert = "Fonte importata collegata a dei complessi.\n I complessi collegati devono essere riassociati manualmente" + if !@is_batch_import + redirect_to redirect_url, :notice => msg_notice, :alert => msg_alert + else + Rails.logger.info msg_notice + Rails.logger.warn msg_alert + puts "\n> #{msg_notice}" + puts ">>> #{msg_alert}" + end + else + msg = "File importato correttamente." + if !@is_batch_import + redirect_to redirect_url, :notice => msg + else + Rails.logger.info msg + puts "\n> #{msg}" + end + end + else + @import.delete + + if result == 2 + alert = "Si è verificato un errore nella validazione del file xml." + else + alert = "Si è verificato un errore durante l'importazione del file xml." + end + + if !@is_batch_import + redirect_to redirect_url, :alert => alert + else + Rails.logger.warn alert + puts "\n>>> #{alert}" + end + end + elsif ['csv'].include? extens if @import.import_csv_file(current_user, current_ability) - redirect_to redirect_url, :notice => "File importato correttamente." + msg = "File importato correttamente." + if !@is_batch_import + redirect_to redirect_url, :notice => msg + else + Rails.logger.info msg + puts "\n> #{msg}" + end else @import.delete - redirect_to redirect_url, :alert => "Si è verificato un errore durante l'importazione del file csv." + msg = "Si è verificato un errore durante l'importazione del file csv." + if !@is_batch_import + redirect_to redirect_url, :alert => msg + else + Rails.logger.warn msg + puts "\n>>> #{msg}" + end + end + else + @import.delete + msg = "Formato file non supportato." + if !@is_batch_import + redirect_to redirect_url, :alert => msg + else + Rails.logger.warn msg + puts "\n>>> #{msg}" end end -# Upgrade 3.0.0 fine else -# Upgrade 2.2.0 inizio -# redirect_to imports_url, :alert => "Si è verificato un errore durante il salvataggio del file aef." - redirect_to redirect_url, :alert => "Si è verificato un errore durante il salvataggio del file aef." -# Upgrade 2.2.0 fine + msg = "Si è verificato un errore durante il salvataggio del file aef." + if !@is_batch_import + redirect_to redirect_url, :alert => msg + else + Rails.logger.warn msg + puts "\n>>> #{msg}" + end end else render :action => "new" @@ -151,10 +242,13 @@ def destroy end end -# Upgrade 2.0.0 inizio Strong parameters def import_params - params.require(:import).permit! + if !@is_batch_import + imp_pars = params.require(:import).permit! + else + imp_pars = {"is_import_batch" => true} + end + return imp_pars end -# Upgrade 2.0.0 fine end diff --git a/app/controllers/reports_controller.rb b/app/controllers/reports_controller.rb index 0a90460..4f57b77 100644 --- a/app/controllers/reports_controller.rb +++ b/app/controllers/reports_controller.rb @@ -90,9 +90,15 @@ def summary # @fonds = Fond.subtree_of(params[:id]).active.all(:include => [:preferred_event], :order => "sequence_number") # @root_fond_name = @fonds.first.name # @fond risulta non assegnato, da cui il fatto che è stata aggiunta l'istruzione che lo inizializza. Non è chiaro come poteva funzionare nella precedente versione - @fonds = Fond.subtree_of(params[:id]).active.includes([:preferred_event]).order("sequence_number") - @fond = @fonds.find(params[:id]) + #@fonds = Fond.subtree_of(params[:id]).active.includes([:preferred_event]).order("sequence_number") + base_ids = [params[:id].to_i] + tree_ordered_ids = tree_array(base_ids) + + + @fonds = Fond.subtree_of(params[:id]).active.includes([:preferred_event]).sort_by{|thing| tree_ordered_ids.index thing.id} + @fond = Fond.find(params[:id]) @root_fond_name = @fond.name + # Upgrade 2.0.0 fine respond_to do |format| format.html @@ -103,6 +109,16 @@ def summary end end + def tree_array(ids) + arr = [] + ids.each do |node, children| + children = Fond.children_of(node).active.order("position").map(&:id) + arr << node + arr += tree_array(children) unless children.empty? || children.nil? + end + arr + end + def inventory extend ReportSupport @@ -127,15 +143,26 @@ def inventory # ---------------- @report_settings.initialize_entities_selected_attribute_names(params, cookies) - @fonds = Fond.subtree_of(params[:id]).active. - includes([ + #@fonds = Fond.subtree_of(params[:id]).active. + # includes([ + # :other_names, :fond_langs, :fond_owners, :fond_urls, :fond_identifiers, :fond_editors, :preferred_event, :sources, + # [:projects => [:project_managers, :project_stakeholders, :project_urls]], + # [:units => [:preferred_event, :unit_damages, :unit_other_reference_numbers, :unit_langs, :unit_urls, :unit_identifiers, :sources, :unit_editors, :iccd_description, :iccd_tech_spec, :iccd_authors, :iccd_subjects, :iccd_damages]], + # [:creators => [:preferred_name, :preferred_event, :other_names, :creator_legal_statuses, :creator_urls, :creator_identifiers, :creator_activities, :sources, :creator_editors]], + # [:custodians => [:preferred_name, :other_names, :custodian_contacts, :custodian_urls, :custodian_identifiers, :custodian_headquarter, :custodian_other_buildings, :sources, :custodian_editors]] + # ]). + # order("sequence_number") + + base_ids = [params[:id].to_i] + tree_ordered_ids = tree_array(base_ids) + + @fonds = Fond.subtree_of(params[:id]).active.includes([ :other_names, :fond_langs, :fond_owners, :fond_urls, :fond_identifiers, :fond_editors, :preferred_event, :sources, [:projects => [:project_managers, :project_stakeholders, :project_urls]], [:units => [:preferred_event, :unit_damages, :unit_other_reference_numbers, :unit_langs, :unit_urls, :unit_identifiers, :sources, :unit_editors, :iccd_description, :iccd_tech_spec, :iccd_authors, :iccd_subjects, :iccd_damages]], [:creators => [:preferred_name, :preferred_event, :other_names, :creator_legal_statuses, :creator_urls, :creator_identifiers, :creator_activities, :sources, :creator_editors]], [:custodians => [:preferred_name, :other_names, :custodian_contacts, :custodian_urls, :custodian_identifiers, :custodian_headquarter, :custodian_other_buildings, :sources, :custodian_editors]] - ]). - order("sequence_number") + ]).sort_by{|thing| tree_ordered_ids.index thing.id} @root_fond = @fonds.first @display_sequence_numbers = Unit.display_sequence_numbers_of(@root_fond) @@ -537,7 +564,9 @@ def pdf_init(action) html = render_to_string(:action => action, :layout => false) kit = PDFKitWrapper.new(html, options) kit.stylesheets << "#{Rails.root}/public/stylesheets/reports-print.css" + Rails.logger.info(kit.command("#{Rails.root}/public/downloads/#{filename}.pdf")) kit.to_file("#{Rails.root}/public/downloads/#{filename}.pdf") + filename # Upgrade 2.0.0 fine end diff --git a/app/controllers/sources_controller.rb b/app/controllers/sources_controller.rb index 0418aff..a562f8c 100644 --- a/app/controllers/sources_controller.rb +++ b/app/controllers/sources_controller.rb @@ -41,6 +41,8 @@ def index def list sources = Source.accessible_by(current_ability, :read).autocomplete_list(params[:term]) + @export_sources = Source.accessible_by(current_ability, :read).autocomplete_export_list(params[:term]) + results = @export_sources.to_json(:methods => [:id, :value], :only => :methods) respond_to do |format| format.html do @@ -50,7 +52,7 @@ def list :selected_label_short => lambda{|source| h(source.short_title)}, :selected_label_full => lambda{|source, builder| builder.formatted_source(source)} } end - format.json { render :json => sources.map(&:attributes) } + format.json { render :json => results } end end diff --git a/app/controllers/units_controller.rb b/app/controllers/units_controller.rb index dedf937..7472171 100644 --- a/app/controllers/units_controller.rb +++ b/app/controllers/units_controller.rb @@ -11,6 +11,8 @@ def current_ability u = Unit.find(params[:id]) f = Fond.find(u.fond_id) @current_ability ||= Ability.new(current_user, f.group_id) + elsif (["index"].include?(params[:action])) + @current_ability ||= Ability.new(current_user, -1) end end end @@ -335,16 +337,14 @@ def index @units = @fond.descendant_units end else - @units = @fond.units + @units = Unit.where(Unit.arel_table[:fond_id].in(@fond.subtree_ids)) end -# Upgrade 3.0.0 inizio select_clause = "units.id, units.fond_id, units.position, units.sequence_number, units.ancestry, units.ancestry_depth, units.published, units.tsk, units.reference_number, units.tmp_reference_number, units.title, unit_events.start_date_display AS preferred_start_date_display, unit_events.end_date_display AS preferred_end_date_display, unit_events.order_date AS preferred_order_date".squish -# Upgrade 3.0.0 fine join_clause = "LEFT OUTER JOIN unit_events ON units.id = unit_events.unit_id" where_clause = "units.sequence_number IS NOT NULL AND (unit_events.preferred = ? OR unit_events.preferred IS NULL)" order_clause = sort_column + ' ' + sort_direction @@ -804,6 +804,8 @@ def setup_relation_collections relation_collections :related => "sources", :through => "rel_unit_sources" relation_collections :related => "headings", :through => "rel_unit_headings", :available => Heading.accessible_by(current_ability, :read).count('id') + relation_collections :related => "anagraphics", :through => "rel_unit_anagraphics", + :available => Anagraphic.accessible_by(current_ability, :read).count('id') end def sort_column diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index eda04e2..d52a5b0 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -76,6 +76,10 @@ def edit_object_path(object) def add_child_link(name, association, replace_reference_string=nil) link_to(name, "javascript:void(0)", :class => "add_child", :"data-association" => association, :replace_reference => replace_reference_string) end + + def add_child_link_anag(name, association, replace_reference_string=nil) + link_to(name, "javascript:void(0)", :class => "add_child anag_child", :"data-association" => association, :replace_reference => replace_reference_string) + end # Upgrade 2.0.0 fine def link_to_digital_objects_by_count(digital_objects_count, name, object, html_options = {}) @@ -179,6 +183,10 @@ def heading_types options_for_select(@terms.select {|l| l.vocabulary_name == "headings.heading_type"}.map {|a| [a.term_value, a.term_value]}) end + def anagraphic_types + options_for_select(@terms.select {|l| l.vocabulary_name == "anagraphics.anagraphic_type"}.map {|a| [a.term_value, a.term_value]}) + end + def required_marker " * " end @@ -250,7 +258,7 @@ def show_item(item, options=['', ''], translate=nil, is_apply_raw = true) # ShowEditor def show_editor(object) - string = object.name + string = object.name.nil? ? "" : object.name string += " (#{object.qualifier})" unless object.qualifier.blank? string += ", #{object.editing_type}" unless object.editing_type.blank? string += ", #{l object.edited_at, :format => :long}" unless object.edited_at.blank? diff --git a/app/helpers/fonds_helper.rb b/app/helpers/fonds_helper.rb index 95f68cf..fbc1a41 100644 --- a/app/helpers/fonds_helper.rb +++ b/app/helpers/fonds_helper.rb @@ -40,4 +40,4 @@ def unpublish_fond(id) end # Upgrade 3.0.0 fine -end \ No newline at end of file +end diff --git a/app/helpers/imports_helper.rb b/app/helpers/imports_helper.rb index 0374ba0..2139c20 100644 --- a/app/helpers/imports_helper.rb +++ b/app/helpers/imports_helper.rb @@ -1,24 +1,47 @@ -# Upgrade 2.2.0 inizio module ImportsHelper def importable_type_caption(import) - if (import.is_unit_importable_type?) - caption = "Unità archivistiche" - else - caption = t(import.importable_type.downcase) - end - return caption + if (import.is_unit_importable_type?) + caption = "Unità archivistiche" + elsif (import.is_institution_importable_type?) + caption = "Profilo istituzionale" + elsif (import.is_anagraphic_importable_type?) + caption = "Scheda anagrafica" + elsif (import.is_source_importable_type?) + caption = "Strumento di ricerca" + else + caption = t(import.importable_type.downcase) + end + return caption end def import_caption(import) - if (import.is_unit_importable_type?) - units_count = Unit.where({:db_source => import.identifier}).count("id") - caption = "(#{units_count.to_s}) importate in: \"#{Fond.find(import.importable.fond_id).display_name}\"" - else - caption = import.importable.display_name - end - return caption + if (import.is_unit_importable_type?) + units_count = Unit.where({:db_source => import.identifier}).count("id") + caption = "(#{units_count.to_s}) importate in: \"#{Fond.find(import.importable.fond_id).display_name}\"" + elsif (import.is_institution_importable_type?) + caption = import.importable.name + elsif (import.is_creator_importable_type? || import.is_custodian_importable_type?) + caption = import.importable.try(:preferred_name).try(:name).to_s + #if (caption.empty?) + # caption = import.importable.try(:display_name).to_s + #end + if (caption.empty?) + caption = import.importable.try(:name).to_s + end + if (caption.empty?) + caption = "(Denominazione non trovata)" + end + elsif (import.is_anagraphic_importable_type?) + caption = import.importable.name + if !import.importable.surname.nil? && !import.importable.surname.empty? + caption += " " + import.importable.surname + end + elsif (import.is_source_importable_type?) + caption = import.importable.short_title + else + caption = import.importable.display_name + end + return caption end - end -# Upgrade 2.2.0 fine \ No newline at end of file diff --git a/app/models/ability.rb b/app/models/ability.rb index 7aced88..a65d5c6 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -5,7 +5,7 @@ class Ability # Upgrade 2.2.0 inizio # Upgrade 3.0.0 inizio attr_accessor :target_group_id - @target_group_id = -1 + @c = -1 def initialize(user, targetGroupId) @target_group_id = targetGroupId @@ -67,7 +67,7 @@ def prv_initialize(user_id, role, group_id, userRelatedGroupIds) when "admin" if (group_id == -1) - can :manage, [Fond, Creator, Custodian, Source, DigitalObject, Institution, DocumentForm, Project, Editor, Heading, Import, Unit], :group_id => userRelatedGroupIds + can :manage, [Anagraphic, Fond, Creator, Custodian, Source, DigitalObject, Institution, DocumentForm, Project, Editor, Heading, Import, Unit], :group_id => userRelatedGroupIds can :manage, User, :rel_user_groups => { :group_id => userRelatedGroupIds } can :manage, RelUserGroup, :group_id => userRelatedGroupIds @@ -76,7 +76,7 @@ def prv_initialize(user_id, role, group_id, userRelatedGroupIds) cannot :create, Group can :manage, GroupImage, :group_id => userRelatedGroupIds else - can :manage, [Fond, Creator, Custodian, Source, DigitalObject, Project, Editor, Heading, Import, Institution, DocumentForm, Unit], :group_id => group_id + can :manage, [Anagraphic, Fond, Creator, Custodian, Source, DigitalObject, Project, Editor, Heading, Import, Institution, DocumentForm, Unit], :group_id => group_id can :manage, User, :rel_user_groups => { :group_id => group_id } cannot [:update, :destroy], User, :rel_user_groups => { :role => 'superadmin' } @@ -118,7 +118,7 @@ def initialize_210(user) cannot [:destroy], Group, :name => 'default' when "admin" - can :manage, [Fond, Creator, Custodian, Source, DigitalObject, Institution, DocumentForm, Project, Editor, Heading, Import], :group_id => user.group_id + can :manage, [Anagraphic, Fond, Creator, Custodian, Source, DigitalObject, Institution, DocumentForm, Project, Editor, Heading, Import], :group_id => user.group_id can :manage, User, :group_id => user.group_id cannot [:update, :destroy], User, :role => 'superadmin' can :manage, Group, :id => user.group_id @@ -136,4 +136,5 @@ def initialize_210(user) end # Upgrade 2.1.0 fine -end \ No newline at end of file +end + diff --git a/app/models/anag_identifier.rb b/app/models/anag_identifier.rb new file mode 100644 index 0000000..2c20e13 --- /dev/null +++ b/app/models/anag_identifier.rb @@ -0,0 +1,3 @@ +class AnagIdentifier < ActiveRecord::Base + belongs_to :anagraphic +end diff --git a/app/models/anagraphic.rb b/app/models/anagraphic.rb new file mode 100644 index 0000000..29f0bc2 --- /dev/null +++ b/app/models/anagraphic.rb @@ -0,0 +1,73 @@ +class Anagraphic < ActiveRecord::Base + + cattr_reader :per_page + @@per_page = 100 + + extend Cleaner + + belongs_to :updater, :class_name => "User", :foreign_key => "updated_by" + + # One-to-many associations (rel) + has_one :import, :as => :importable, :dependent => :destroy + + # Many-to-many associations (rel) + has_many :rel_unit_anagraphics, :autosave => true, :dependent => :destroy + has_many :anag_identifiers, :dependent => :destroy + has_many :units, :through => :rel_unit_anagraphics + + belongs_to :group + + + # Validations + validates_presence_of :name + validates_uniqueness_of :name, :scope => [:anagraphic_type, :surname, :db_source, :group_id], :case_sensitive => false + + accepts_nested_attributes_for :anag_identifiers, + :allow_destroy => true, + :reject_if => Proc.new { |a| a['identifier'].blank? } + + # Virtual attributes + def full_string + if start_date.nil? + date = "" + else + date = start_date.strftime("%d-%m-%Y") + end + + [ name, surname, date ]. + delete_if { |fragment| fragment.blank? }. + join(", ") + end + + alias_attribute :value, :full_string + + # Callbacks + squished_fields :name, :dates, :qualifier + + scope :autocomplete_list, -> (*term) { + term = term.shift + if term.present? + conditions = ["LOWER(anagraphic_type) LIKE :term + OR LOWER(name) LIKE :term + OR LOWER(surname) LIKE :term", + {:term => "%#{term}%"}] + limit = 20 + else + conditions = nil + limit = nil + end + + select("id, anagraphic_type, name, surname"). + where(conditions). + order("anagraphic_type, name, surname"). + limit(limit) + } + + scope :list, -> { select("anagraphics.id, anagraphics.anagraphic_type, anagraphics.name, anagraphics.surname, anagraphics.start_date, anagraphics.end_date, group_id, groups.short_name").joins(:group) } + + def self.find_or_initialize(params) + self.find_or_initialize_by(params) + end +end + + diff --git a/app/models/creator.rb b/app/models/creator.rb index fface7c..3cc15c8 100644 --- a/app/models/creator.rb +++ b/app/models/creator.rb @@ -48,6 +48,8 @@ def is_corporate? has_many :digital_objects, :as => :attachable, :dependent => :destroy + has_one :import, :as => :importable, :dependent => :destroy + # Many-to-many associations (rel) has_many :rel_creator_creators, :dependent => :destroy, :autosave => true @@ -168,6 +170,11 @@ def is_corporate? scope :list, -> { select("creators.id, creators.creator_type, creator_names.name, creators.residence, creators.updated_at, creators.published, group_id, groups.short_name").joins(:preferred_name, :group) } # Upgrade 2.2.0 fine + # Upgrade 3.0.1 ICAR inizio + scope :export_list, -> { select("creators.id, creator_names.name, creators.updated_at, creators.db_source, count(creators.id) AS num").joins([:fonds, :preferred_name]).group("creators.id, creator_names.name").order("creator_names.name") } + # Upgrade 3.0.1 fine + + scope :search, ->(q) { conditions = ["creator_names.qualifier = 'A' AND LOWER(creator_names.name) LIKE :q", {:q => "%#{q.downcase.squish}%"}] if q.present? where(conditions) @@ -227,7 +234,7 @@ def reset_associated_records_by_creator_type preferred_name.first_name = nil preferred_name.last_name = nil preferred_name.note_p = nil - preferred_name.note = preferred_name.note_cf + #preferred_name.note = preferred_name.note_cf # causa note NULL in produttore corporate end end @@ -270,3 +277,4 @@ def sorted_rel_creator_sources end + diff --git a/app/models/custodian.rb b/app/models/custodian.rb index 05371f3..35bd252 100644 --- a/app/models/custodian.rb +++ b/app/models/custodian.rb @@ -16,7 +16,10 @@ class Custodian < ActiveRecord::Base has_one :preferred_name, :class_name => 'CustodianName', :conditions => {:qualifier => 'AU', :preferred => true} has_many :other_names, :class_name => 'CustodianName', :conditions => {:preferred => false} =end - has_one :preferred_name, -> { where({:qualifier => 'AU', :preferred => true}) }, :class_name => 'CustodianName' + +#has_one :preferred_name, -> { where({:qualifier => ['OT', 'AU'], :preferred => true}) }, :class_name => 'CustodianName' + has_one :preferred_name, -> { where({:qualifier => 'OT', :preferred => true}) }, :class_name => 'CustodianName' + has_many :other_names, -> { where({:preferred => false}) }, :class_name => 'CustodianName' # Upgrade 2.0.0 fine @@ -150,14 +153,14 @@ class Custodian < ActiveRecord::Base scope :export_list, -> { select("custodians.id, custodian_names.name, custodians.updated_at, custodians.db_source, count(custodians.id) AS num").joins([:fonds, :preferred_name]).group("custodians.id, custodian_names.name").order("custodian_names.name") } scope :search, ->(q) { - conditions = ["custodian_names.qualifier = 'AU' AND LOWER(custodian_names.name) LIKE :q", {:q => "%#{q.downcase.squish}%"}] if q.present? + conditions = ["custodian_names.qualifier = 'OT' AND LOWER(custodian_names.name) LIKE :q", {:q => "%#{q.downcase.squish}%"}] if q.present? where(conditions) } scope :autocomplete_list, ->(term) { select("custodians.id AS id, custodian_names.name AS value, custodian_names.name AS name"). joins(:custodian_names). - where(["custodian_names.preferred = ? AND custodian_names.qualifier = ? AND LOWER(custodian_names.name) LIKE ?", true, 'AU', "%#{term}%"]). + where(["custodian_names.preferred = ? AND custodian_names.qualifier = ? AND LOWER(custodian_names.name) LIKE ?", true, 'OT', "%#{term}%"]). order("custodian_names.name ASC"). limit(10) } diff --git a/app/models/digital_object.rb b/app/models/digital_object.rb index 124f94e..13716fb 100644 --- a/app/models/digital_object.rb +++ b/app/models/digital_object.rb @@ -23,19 +23,24 @@ def scope_condition before_create :generate_access_token # Paperclip - has_attached_file :asset, - :styles => { :large => "1280x1280>", :medium => "210x210>", :thumb => "130x130>" }, - :url => "/digital_objects/:access_token/:style.:extension", - :default_url => "/images/missing-:style.jpg" + begin + has_attached_file :asset, + :styles => { :large => "1280x1280>", :medium => "210x210>", :thumb => "130x130>" }, + :url => "/digital_objects/:access_token/:style.:extension", + :default_url => "/images/missing-:style.jpg" - validates_attachment_presence :asset + validates_attachment_presence :asset - validates_attachment_content_type :asset, - :content_type => ["image/jpeg", "image/jpg", "image/pjpeg", "application/pdf", "video/mp4", "application/mp4", "video/mpeg4"] + validates_attachment_content_type :asset, + :content_type => ["image/jpeg", "image/jpg", "image/pjpeg", "application/pdf", "video/mp4", "application/mp4", "video/mpeg4"] - validates_attachment_size :asset, :less_than => 8.megabytes + validates_attachment_size :asset, :less_than => 8.megabytes - before_post_process :is_image? + before_post_process :is_image? + rescue + # caso del batch import + # do_nothing + end # Scopes # Upgrade 2.0.0 inizio @@ -87,7 +92,10 @@ def to_jq_upload private def generate_access_token - self.access_token = Digest::SHA1.hexdigest("#{asset_file_name}#{Time.now.to_i}") + if self.access_token.nil? + self.access_token = Digest::SHA1.hexdigest("#{asset_file_name}#{Time.now.to_i}") + end + return self.access_token end Paperclip.interpolates :access_token do |attachment, style| diff --git a/app/models/export.rb b/app/models/export.rb index 48c86d8..daeb10c 100644 --- a/app/models/export.rb +++ b/app/models/export.rb @@ -5,9 +5,17 @@ class Export < ActiveRecord::Base # require 'zip/zip' # nella versione rubyzip-1.1.6 zip.rb non è nella sottocartella zip dove invece era nella rubyzip-0.9.9 usata prima require 'zip' + require 'builder' # Upgrade 2.0.0 fine TMP_EXPORTS = "#{Rails.root}/tmp/exports" + PUBLIC_DOWNLOADS = "#{Rails.root}/public/downloads" + + @@icarimportfile = "" + + def get_icarimportfile + @@icarimportfile + end def self.columns() @columns ||= []; end @@ -34,7 +42,7 @@ def tables :fonds => ["fond_events", "fond_identifiers", "fond_langs", "fond_names", "fond_owners", "fond_urls", "fond_editors"], # Upgrade 2.2.0 inizio # :units => ["unit_events", "unit_identifiers", "unit_damages", "unit_langs", "unit_other_reference_numbers", "unit_urls", "unit_editors", "iccd_authors", "iccd_descriptions", "iccd_tech_specs", "iccd_damages", "iccd_subjects"], - :units => ["unit_events", "unit_identifiers", "unit_damages", "unit_langs", "unit_other_reference_numbers", "unit_urls", "unit_editors", "iccd_authors", "iccd_descriptions", "iccd_tech_specs", "iccd_damages", "iccd_subjects", "sc2s", "sc2_textual_elements", "sc2_visual_elements", "sc2_authors", "sc2_commissions", "sc2_techniques", "sc2_scales"], + :units => ["unit_events", "unit_identifiers", "unit_damages", "unit_langs", "unit_other_reference_numbers", "unit_urls", "unit_editors", "iccd_authors", "iccd_descriptions", "iccd_tech_specs", "iccd_damages", "iccd_subjects", "sc2s", "sc2_textual_elements", "sc2_visual_elements", "sc2_authors", "sc2_commissions", "sc2_techniques", "sc2_scales", "fsc_organizations", "fsc_nationalities", "fsc_codes", "fsc_opens", "fsc_closes", "fe_identifications", "fe_contexts", "fe_operas", "fe_designers", "fe_cadastrals", "fe_land_parcels", "fe_fract_land_parcels", "fe_fract_edil_parcels"], # Upgrade 2.2.0 fine :creators => ["creator_events", "creator_identifiers","creator_legal_statuses", "creator_names", "creator_urls", "creator_activities", "creator_editors"], :custodians => ["custodian_buildings", "custodian_contacts","custodian_identifiers", "custodian_names", "custodian_owners", "custodian_urls", "custodian_editors"], @@ -413,6 +421,502 @@ def digital_objects end end + def create_export_xml_ead_file + @data_names = Array.new + if self.mode == 'full' + case self.target_class + when "fond" + set_fonds(self.target_id) + stream_ead(@fonds, self.target_id) + related_to_eadfond + when "custodian" + set_custodians(self.target_id) + stream_ead(@custodians, self.target_id) + related_to_eadcustodian + when "creator" + set_ead_creators(self.target_id) + @rel_ead_creator_ids.each do |reci| + intreci = [reci.to_i] + @creators = Creator.where("id = ?", intreci).sort_by { |u| intreci.index(u.id) } + stream_ead(@creators, selected_fond_ids) + end + related_to_eadcreator + when "source" + set_sources(self.target_id) + stream_ead(@sources, self.target_id) + related_to_eadsource + else + Rails.logger.info("scelto altro") + end + else + case self.target_class + when "fond" + set_fonds(self.target_id) + stream_ead(@fonds, self.target_id) + when "custodian" + set_custodians(self.target_id) + stream_ead(@custodians, self.target_id) + when "creator" + set_ead_creators(self.target_id) + @rel_ead_creator_ids.each do |reci| + intreci = [reci.to_i] + @creators = Creator.where("id = ?", intreci).sort_by { |u| intreci.index(u.id) } + stream_ead(@creators, selected_fond_ids) + end + when "source" + set_sources(self.target_id) + stream_ead(@sources, self.target_id) + else + Rails.logger.info("scelto altro") + end + end + + create_xml_ead_export_file + end + + def create_export_xml_san_file + @data_names = Array.new + if self.mode == 'full' + case self.target_class + when "fond" + set_fonds(self.target_id) + stream(@fonds, self.target_id) + if self.inc_digit == 'true' + set_units(self.target_id) + stream_mets(@units) + end + related_to_fond + when "custodian" + set_custodians(self.target_id) + stream(@custodians, self.target_id) + related_to_custodian + when "creator" + set_creators(self.target_id) + stream(@creators, selected_fond_ids) + related_to_creator + when "source" + set_sources(self.target_id) + stream(@sources, self.target_id) + related_to_source + else + Rails.logger.info("scelto altro") + end + else + case self.target_class + when "fond" + set_fonds(self.target_id) + stream(@fonds, self.target_id) + if self.inc_digit == 'true' + set_units(self.target_id) + stream_mets(@units) + end + when "custodian" + set_custodians(self.target_id) + stream(@custodians, self.target_id) + when "creator" + set_creators(self.target_id) + stream(@creators, selected_fond_ids) + when "source" + set_sources(self.target_id) + stream(@sources, self.target_id) + else + Rails.logger.info("scelto altro") + end + end + + create_xml_export_file + end + + def related_to_fond + custodians = RelCustodianFond.where("fond_id IN (#{self.target_id})") + custodians.each do |c| + set_custodians(c.custodian_id) + stream(@custodians, self.target_id) + end + set_fond_creators(self.target_id) + stream(@creators, selected_fond_ids) + fond_sources = Fond.find(self.target_id) + sources = fond_sources.sources.where("source_type_code = 2") + stream(sources, self.target_id) + end + + def related_to_eadfond + custodians = RelCustodianFond.where("fond_id IN (#{self.target_id})") + custodians.each do |c| + set_custodians(c.custodian_id) + stream_ead(@custodians, self.target_id) + end + set_ead_fond_creators(self.target_id) + @rel_ead_creator_ids.each do |reci| + intreci = [reci.to_i] + @creators = Creator.where("id = ?", intreci).sort_by { |u| intreci.index(u.id) } + stream_ead(@creators, selected_fond_ids) + end + + fond_sources = Fond.find(self.target_id) + sources = fond_sources.sources.where("source_type_code = 2") + stream_ead(sources, self.target_id) + end + + def related_to_source + source = Source.find(self.target_id) + source_fonds_ids = source.fond_ids + set_fonds(source_fonds_ids) + stream(@fonds, source_fonds_ids) + if self.inc_digit == 'true' + set_units(source_fonds_ids) + stream_mets(@units) + end + end + + def related_to_eadsource + source = Source.find(self.target_id) + source_fonds_ids = source.fond_ids + source_fonds_ids.each do |sfi| + intsfi = [sfi.to_i] + @fonds = Fond.where("id IN (?) AND trashed = 0", intsfi).sort_by { |u| intsfi.index(u.id) } + stream_ead(@fonds, sfi) + end + end + + def related_to_creator + creator = Creator.find(self.target_id) + c_fond_ids = creator.fond_ids + creator_root_fond_ids = c_fond_ids & selected_fond_ids + set_fonds(creator_root_fond_ids) + stream(@fonds, creator_root_fond_ids) + if self.inc_digit == 'true' + set_units(creator_root_fond_ids) + stream_mets(@units) + end + custodian_ids = RelCustodianFond.where("fond_id IN (?)", creator_root_fond_ids).map(&:custodian_id).uniq + custodians = Custodian.where("id IN (?)", custodian_ids).sort_by { |u| custodian_ids.index(u.id) } + stream(custodians, self.target_id) + fond_source_ids = Array.new + creator_root_fond_ids.each do |crfi| + fond_sources = Fond.find(crfi) + sources_ids = fond_sources.sources.where("source_type_code = 2").map(&:id) + fond_source_ids = (fond_source_ids + sources_ids).uniq + end + sources = Source.where("id IN (?)", fond_source_ids).sort_by { |u| fond_source_ids.index(u.id) } + stream(sources, self.target_id) + end + + def related_to_eadcreator + creator = Creator.find(self.target_id) + c_fond_ids = creator.fond_ids + creator_root_fond_ids = c_fond_ids & selected_fond_ids + creator_root_fond_ids.each do |crfi| + intcrfi = [crfi.to_i] + @fonds = Fond.where("id IN (?) AND trashed = 0", intcrfi).sort_by { |u| intcrfi.index(u.id) } + stream_ead(@fonds, crfi) + end + custodian_ids = RelCustodianFond.where("fond_id IN (?)", creator_root_fond_ids).map(&:custodian_id).uniq + custodians = Custodian.where("id IN (?)", custodian_ids).sort_by { |u| custodian_ids.index(u.id) } + stream_ead(custodians, self.target_id) + fond_source_ids = Array.new + creator_root_fond_ids.each do |crfi| + fond_sources = Fond.find(crfi) + sources_ids = fond_sources.sources.where("source_type_code = 2").map(&:id) + fond_source_ids = (fond_source_ids + sources_ids).uniq + end + sources = Source.where("id IN (?)", fond_source_ids).sort_by { |u| fond_source_ids.index(u.id) } + stream_ead(sources, self.target_id) + end + + def related_to_custodian + custodian = Custodian.find(self.target_id) + custodian_fonds_ids = custodian.fond_ids + set_fonds(custodian_fonds_ids) + stream(@fonds, custodian_fonds_ids) + if self.inc_digit == 'true' + set_units(custodian_fonds_ids) + stream_mets(@units) + end + set_custodian_fonds_creators(custodian_fonds_ids) + stream(@creators, selected_fond_ids) + fond_source_ids = Array.new + custodian_fonds_ids.each do |cfi| + fond_sources = Fond.find(cfi) + sources_ids = fond_sources.sources.where("source_type_code = 2").map(&:id) + fond_source_ids = (fond_source_ids + sources_ids).uniq + end + sources = Source.where("id IN (?)", fond_source_ids).sort_by { |u| fond_source_ids.index(u.id) } + stream(sources, self.target_id) + end + + def related_to_eadcustodian + custodian = Custodian.find(self.target_id) + custodian_fonds_ids = custodian.fond_ids + custodian_fonds_ids.each do |cfi| + intcfi = [cfi.to_i] + @fonds = Fond.where("id IN (?) AND trashed = 0", intcfi).sort_by { |u| intcfi.index(u.id) } + stream_ead(@fonds, cfi) + end + set_ead_custodian_fonds_creators(custodian_fonds_ids) + @rel_ead_creator_ids.each do |reci| + intreci = [reci.to_i] + @creators = Creator.where("id = ?", intreci).sort_by { |u| intreci.index(u.id) } + stream_ead(@creators, selected_fond_ids) + end + fond_source_ids = Array.new + custodian_fonds_ids.each do |cfi| + fond_sources = Fond.find(cfi) + sources_ids = fond_sources.sources.where("source_type_code = 2").map(&:id) + fond_source_ids = (fond_source_ids + sources_ids).uniq + end + sources = Source.where("id IN (?)", fond_source_ids).sort_by { |u| fond_source_ids.index(u.id) } + stream_ead(sources, self.target_id) + end + + def views_path(record) + File.join(File.dirname(__FILE__), "..", "views", record) + end + + def set_units(id) + @units = Unit.where("id IN (?) AND root_fond_id IN (?)", DigitalObject.distinct.select(:attachable_id).where("attachable_type = 'Unit' AND asset_content_type LIKE 'image%'"), id).order(:sequence_number) + end + + def set_fonds(id) + @fonds = Fond.where('id IN (?) AND trashed = 0', id) + id.kind_of?(Array) ? fond_ids = id : fond_ids = [id.to_i] + end + + def set_fond_creators(f_id) + fond_creator_ids = Array.new + fond = Fond.find(f_id) + fond_creator_ids = (fond_creator_ids + fond.creator_ids).uniq + creators = Creator.find(fond_creator_ids).sort_by { |u| fond_creator_ids.index(u.id) } + fond_creator_creator_ids = Array.new + creators.each do |c| + fond_creator_creator_ids = (fond_creator_creator_ids + c.related_creator_ids).uniq + end + rel_creator_ids = (fond_creator_ids + fond_creator_creator_ids).uniq + @creators = Creator.where("id IN (?)", rel_creator_ids).sort_by { |u| rel_creator_ids.index(u.id) } + end + + def set_ead_fond_creators(f_id) + fond_creator_ids = Array.new + fond = Fond.find(f_id) + fond_creator_ids = (fond_creator_ids + fond.creator_ids).uniq + creators = Creator.find(fond_creator_ids).sort_by { |u| fond_creator_ids.index(u.id) } + fond_creator_creator_ids = Array.new + creators.each do |c| + fond_creator_creator_ids = (fond_creator_creator_ids + c.related_creator_ids).uniq + end + @rel_ead_creator_ids = (fond_creator_ids + fond_creator_creator_ids).uniq + end + + def set_ead_custodian_fonds_creators(c_ids) + fond_creator_ids = Array.new + c_ids.each do |cfi| + cust_fond = Fond.find(cfi) + fond_creator_ids = (fond_creator_ids + cust_fond.creator_ids).uniq + end + creators = Creator.find(fond_creator_ids).sort_by { |u| fond_creator_ids.index(u.id) } + custodian_fond_creator_ids = Array.new + creators.each do |c| + custodian_fond_creator_ids = (custodian_fond_creator_ids + c.related_creator_ids).uniq + end + @rel_ead_creator_ids = (fond_creator_ids + custodian_fond_creator_ids).uniq + end + + def set_custodian_fonds_creators(c_ids) + fond_creator_ids = Array.new + c_ids.each do |cfi| + cust_fond = Fond.find(cfi) + fond_creator_ids = (fond_creator_ids + cust_fond.creator_ids).uniq + end + creators = Creator.find(fond_creator_ids).sort_by { |u| fond_creator_ids.index(u.id) } + custodian_fond_creator_ids = Array.new + creators.each do |c| + custodian_fond_creator_ids = (custodian_fond_creator_ids + c.related_creator_ids).uniq + end + rel_creator_ids = (fond_creator_ids + custodian_fond_creator_ids).uniq + @creators = Creator.where("id IN (?)", rel_creator_ids).sort_by { |u| rel_creator_ids.index(u.id) } + end + + def set_ead_creators(id) + creator = Creator.find("#{id}") + rel_creator_ids = creator.related_creator_ids + @rel_ead_creator_ids = [id.to_i] + rel_creator_ids + end + + def set_creators(id) + creator = Creator.find("#{id}") + rel_creator_ids = creator.related_creator_ids + ids = [id.to_i] + rel_creator_ids + @creators = Creator.where("id IN (?)", ids).sort_by { |u| ids.index(u.id) } + end + + def set_custodians(id) + @custodians = Custodian.where("id = #{id}") + custodian_ids = [id.to_i] + end + + def set_sources(id) + @sources = Source.where("id = #{id}") + source_ids = [id.to_i] + end + + def set_all_fonds + @fonds = Fond.roots.order(:name).all + end + + def selected_fond_ids + set_all_fonds + fond_ids = @fonds.map(&:id) + end + + def stream_icar_import() + set_fonds(self.target_id) + fond = @fonds.first + + prefix = Time.now.strftime("%Y-%m-%d-%H-%M-%S-") + zip_file_name = PUBLIC_DOWNLOADS + "/#{prefix}icar-import-#{fond.id}.zip" + @@icarimportfile = zip_file_name + File.delete(zip_file_name) if File.exist?(zip_file_name) + + file_name = "#{prefix}icar-import-#{fond.id}.xml" + data_file_name = PUBLIC_DOWNLOADS + "/" + file_name + file_dest = File.new(data_file_name, 'w+') + view = ActionView::Base.new(views_path("icar-import")) + xml = ::Builder::XmlMarkup.new(target: file_dest, :indent => 2) + digital_objects = Array.new + xml = view.render(:file => "icar-import.xml.builder", :locals => {:fond => fond}) + + xml_formatted = '' + require "rexml/document" + doc = REXML::Document.new(xml.to_s) + #formatter = REXML::Formatters::Pretty.new # Rimuove CR/LF + #formatter.compact = true # dai testi nelle Text Area + formatter = REXML::Formatters::Default.new + formatter.write(doc, xml_formatted) + + File.open(file_dest, 'w+') { |f| f.write(xml_formatted) } + Zip::File.open(zip_file_name, Zip::File::CREATE) do |zipfile| + zipfile.add(file_name, file_dest.path) + end + + begin + file_dest.close + File.delete(data_file_name) if File.exist?(data_file_name) + rescue Exception => e + Rails.logger.info "ECCEZIONE export.rb > stream_icar_import: #{e.message}" + end + + #oggetti digitali + fonds_id = Array.new + fonds_id.push(fond.id) + if fond.ancestry.nil? + query = "ancestry LIKE '#{fond.id}/%' OR ancestry = '#{fond.id}'" + else + query = "ancestry LIKE '#{fond.ancestry}/%' OR ancestry = '#{fond.ancestry}'" + end + children_ids = Fond.where(query).pluck(:id) + fonds_id = fonds_id + children_ids + unit_ids = Unit.where(fond_id: fonds_id).pluck(:id) + digital_objects = DigitalObject.where(attachable_id: unit_ids) + if !digital_objects.empty? + Zip::File.open(zip_file_name, false) do |zipfile| + digital_objects.each do |digital_object| + begin + dob_files = Dir.entries("#{Rails.root}/public/digital_objects/#{digital_object.access_token}").select {|f| !File.directory? f} + dob_files.each do |dob_file_name| + dob_file_path = "#{Rails.root}/public/digital_objects/#{digital_object.access_token}/#{dob_file_name}" + zipfile.add("#{digital_object.access_token}/#{dob_file_name}", dob_file_path) + end + rescue Exception => e + Rails.logger.info "ERRORE export.rb > stream_icar_import > oggetti digitali: #{e.message}" + end + end + end + end + end + + def stream_ead(records, ids = []) + if records.present? + + suffix = Time.now.strftime("%Y%m%d%H%M%S") + file = "#{records[0].class.name.tableize}_ead.xml" + view = ActionView::Base.new(views_path(records[0].class.name.tableize)) + if records[0].class.name.tableize == 'creators' + data_file_name = TMP_EXPORTS + "/sp-#{records[0].id}-#{suffix}.xml" + elsif records[0].class.name.tableize == 'fonds' + data_file_name = TMP_EXPORTS + "/ca-#{records[0].id}-#{suffix}.xml" + elsif records[0].class.name.tableize == 'custodians' + data_file_name = TMP_EXPORTS + "/sc-#{records[0].id}-#{suffix}.xml" + else + data_file_name = TMP_EXPORTS + "/data-#{records[0].class.name.tableize}-#{suffix}.xml" + end + + self.data_file = data_file_name + @data_names.push(data_file_name) + file_dest = File.new(data_file_name, 'w+') + + xml = ::Builder::XmlMarkup.new(target: file_dest, :indent => 2) + + xml = view.render(:partial => "#{file}.builder", :locals => {:records => records, :fond_ids => ids}) + File.open(file_dest, 'w+') { |f| f.write(xml) } + else + puts "Nessun risultato" + end + end + + def stream(records, fond_ids = []) + if records.present? + eval File.read('/usr/local/webapps/archimista/tmp/Configurazione_dl.rb') + dl_metadata = {'DL_FOND_ID' => DL_FOND_ID, 'PROVIDER_DL' => PROVIDER_DL, + 'DL_HACONSERVATORE' => DL_HACONSERVATORE, 'DL_REPOSITORYID' => DL_REPOSITORYID, + 'DL_ABBR' => DL_ABBR, 'DL_CORPNAME' => DL_CORPNAME, + 'DL_HAPROGETTO' => DL_HAPROGETTO, 'DL_HACOMPLESSO' => DL_HACOMPLESSO, + 'DL_UNITID' => DL_UNITID, 'DL_UNITTITLE' => DL_UNITTITLE + } + + suffix = Time.now.strftime("%Y%m%d%H%M%S") + file = "#{records[0].class.name.tableize}.xml" + view = ActionView::Base.new(views_path(records[0].class.name.tableize)) + + #file_dest = File.new(self.data_file, 'w+') + data_file_name = TMP_EXPORTS + "/data-#{records[0].class.name.tableize}-#{suffix}.xml" + + self.data_file = data_file_name + @data_names.push(data_file_name) + file_dest = File.new(data_file_name, 'w+') + xml = ::Builder::XmlMarkup.new(target: file_dest, :indent => 2) + + xml = view.render(:partial => "#{file}.builder", :locals => {:records => records, :fond_ids => fond_ids, :metadata => dl_metadata}) + File.open(file_dest, 'w+') { |f| f.write(xml) } + else + puts "Nessun risultato" + end + end + + def stream_mets(records) + if records.present? + eval File.read('/usr/local/webapps/archimista/tmp/Configurazione_dl.rb') + dl_metadata = {'DL_FOND_ID' => DL_FOND_ID, 'PROVIDER_DL' => PROVIDER_DL, + 'DL_HACONSERVATORE' => DL_HACONSERVATORE, 'DL_REPOSITORYID' => DL_REPOSITORYID, + 'DL_ABBR' => DL_ABBR, 'DL_CORPNAME' => DL_CORPNAME, + 'DL_HAPROGETTO' => DL_HAPROGETTO, 'DL_HACOMPLESSO' => DL_HACOMPLESSO, + 'DL_UNITID' => DL_UNITID, 'DL_UNITTITLE' => DL_UNITTITLE + } + + file = "digital_objects.xml" + file_mets = TMP_EXPORTS + "/digital_objects_CL.xml" + @data_names.push(file_mets) + view = ActionView::Base.new(views_path("digital_objects")) + + file_dest_mets = File.new(file_mets, 'w+') + xml_mets = ::Builder::XmlMarkup.new(target: file_dest_mets, :indent => 2) + + xml_mets = view.render(:partial => "#{file}.builder", :locals => {:records => records, :metadata => dl_metadata}) + File.open(file_dest_mets, 'w+') { |f| f.write(xml_mets) } + else + puts "Nessun risultato" + end + end + def create_export_file create_data_file create_metadata_file @@ -432,6 +936,16 @@ def create_export_file # Upgrade 2.2.0 fine end + def create_xml_export_file + create_metadata_file + create_aef_for_xml_file + end + + def create_xml_ead_export_file + create_metadata_file + create_aef_for_xml_ead_file + end + # Upgrade 2.2.0 inizio def create_units_export_file(unit_ids) create_units_data_file(unit_ids) @@ -440,12 +954,12 @@ def create_units_export_file(unit_ids) end # Upgrade 2.2.0 fine -# Upgrade 3.0.0 inizio +# Upgrade 2.2.0 inizio def create_units_export_file_csv(unit_ids, fond_id, dest_folder) create_units_data_file_csv(unit_ids, fond_id) create_csv_file(dest_folder) end -# Upgrade 3.0.0 fine +# Upgrade 2.2.0 fine private @@ -455,6 +969,102 @@ def create_csv_file(dest_folder) end # Upgrade 3.0.0 fine + def create_aef_for_xml_ead_file + files = {} + @data_names.each do |dn| + case dn + when /fond/ + files["data-fond.xml"] = dn + when /ca/ + url_split = dn.split("/") + ca_name = url_split[-1] + name_split = ca_name.split("-") + fond_name = name_split[0] + "-" + name_split[1] + ".xml" + files[fond_name] = dn + when /custodian/ + files["data-custodian.xml"] = dn + when /sp/ + url_split = dn.split("/") + sp_name = url_split[-1] + name_split = sp_name.split("-") + creator_name = name_split[0] + "-" + name_split[1] + ".xml" + files[creator_name] = dn + when /digital/ + files["data-digital-object.xml"] = dn + when /source/ + files["data-source.xml"] = dn + end + end + +# Upgrade 3.0.0 inizio +# definizione directory oggetti digitali + @dir = "#{Rails.root}/public/digital_objects" + @dir.sub!(%r[/$],'') + include_digital_objects = self.inc_digit +# Upgrade 3.0.0 fine + +# Upgrade 2.0.0 inizio +# Zip::ZipFile.open(self.dest_file, Zip::ZipFile::CREATE) do |zipfile| + Zip::File.open(self.dest_file, Zip::File::CREATE) do |zipfile| +# Upgrade 2.0.0 fine + files.each do |dst, src| + zipfile.add(dst, src) + end +# Upgrade 3.0.0 inizio +# recupero degli access tokens corrispondenti alle cartelle degli oggetti digitali da importare se selezionato checkbox + if include_digital_objects == 'true' + fond_access_tokens = DigitalObject.select("access_token").where(:attachable_id => self.fond_ids, :attachable_type => "Fond").map(&:access_token) + unit_access_tokens = DigitalObject.select("access_token").where(:attachable_id => self.unit_ids, :attachable_type => "Unit").map(&:access_token) + entries = fond_access_tokens + unit_access_tokens + writeEntries(entries, "", zipfile ) + end +# Upgrade 3.0.0 fine + end + end + + def create_aef_for_xml_file + files = {} + @data_names.each do |dn| + case dn + when /fond/ + files["data-fond.xml"] = dn + when /custodian/ + files["data-custodian.xml"] = dn + when /creator/ + files["data-creator.xml"] = dn + when /digital/ + files["data-digital-object.xml"] = dn + when /source/ + files["data-source.xml"] = dn + end + end + +# Upgrade 3.0.0 inizio +# definizione directory oggetti digitali + @dir = "#{Rails.root}/public/digital_objects" + @dir.sub!(%r[/$],'') + include_digital_objects = self.inc_digit +# Upgrade 3.0.0 fine + +# Upgrade 2.0.0 inizio +# Zip::ZipFile.open(self.dest_file, Zip::ZipFile::CREATE) do |zipfile| + Zip::File.open(self.dest_file, Zip::File::CREATE) do |zipfile| +# Upgrade 2.0.0 fine + files.each do |dst, src| + zipfile.add(dst, src) + end +# Upgrade 3.0.0 inizio +# recupero degli access tokens corrispondenti alle cartelle degli oggetti digitali da importare se selezionato checkbox + if include_digital_objects == 'true' + fond_access_tokens = DigitalObject.select("access_token").where(:attachable_id => self.fond_ids, :attachable_type => "Fond").map(&:access_token) + unit_access_tokens = DigitalObject.select("access_token").where(:attachable_id => self.unit_ids, :attachable_type => "Unit").map(&:access_token) + entries = fond_access_tokens + unit_access_tokens + writeEntries(entries, "", zipfile ) + end +# Upgrade 3.0.0 fine + end + end + # Upgrade 2.2.0 inizio def create_aef_file files = {"metadata.json" => self.metadata_file, "data.json" => self.data_file} @@ -464,6 +1074,7 @@ def create_aef_file @dir.sub!(%r[/$],'') include_digital_objects = self.inc_digit # Upgrade 3.0.0 fine + # Upgrade 2.0.0 inizio # Zip::ZipFile.open(self.dest_file, Zip::ZipFile::CREATE) do |zipfile| Zip::File.open(self.dest_file, Zip::File::CREATE) do |zipfile| @@ -535,7 +1146,6 @@ def create_units_data_file(unit_ids) end end -# Upgrade 3.0.0 inizio def create_units_data_file_csv(unit_ids, fond_id) fond = Fond.select("id, ancestry, name").find(fond_id) display_sequence_numbers = Unit.display_sequence_numbers_of(fond.root) @@ -545,7 +1155,7 @@ def create_units_data_file_csv(unit_ids, fond_id) end end - def create_csv(ids, sequence_numbers, options = {}) + def create_csv(ids, sequence_numbers) conditionParam = "#{:id} IN (#{ids.join(',')})" ucsv = Unit.where(conditionParam).order("sequence_number") attributes_all = Unit.column_names @@ -553,20 +1163,22 @@ def create_csv(ids, sequence_numbers, options = {}) attributes = attributes_all - attributes_except attr_names = attributes.collect { |x| "units_" + x } - CSV.generate(options) do |new_csv| + CSV.generate(:force_quotes => true) do |new_csv| new_csv << attr_names ucsv.each_with_index do |csv_unit, index| csv_data = [] attributes.each do |attribute| + value = nil if attribute == "legacy_id" - csv_data << csv_unit.id + value = csv_unit.id elsif attribute == "legacy_parent_unit_id" - csv_data << csv_unit.is_root? ? nil : csv_unit.parent_id.to_s + value = csv_unit.is_root? ? nil : csv_unit.parent_id elsif attribute == "sequence_number" - csv_data << csv_unit.display_sequence_number_from_hash(sequence_numbers) + value = csv_unit.display_sequence_number_from_hash(sequence_numbers) else - csv_data << csv_unit.try(attribute.to_sym).to_s + value = csv_unit.try(attribute.to_sym) end + csv_data << value end new_csv << csv_data end @@ -574,13 +1186,13 @@ def create_csv(ids, sequence_numbers, options = {}) end end - def create_related_csv(table, set_element, options = {}) + def create_related_csv(table, set_element) related_attributes_all = table.singularize.camelize.constantize.column_names related_attributes_except = ["id", "db_source", "created_at", "updated_at"] related_attributes = related_attributes_all - related_attributes_except related_attr_names = related_attributes.collect { |j| table + "_" + j } - CSV.generate(options) do |new_related_csv| + CSV.generate(:force_quotes => true) do |new_related_csv| new_related_csv << related_attr_names set_element.each_with_index do |csv_related_unit, index| csv_related_data = [] @@ -590,17 +1202,19 @@ def create_related_csv(table, set_element, options = {}) if (table == "sc2_commissions") then @sc2_commission_names_ids.push(csv_related_unit.id) end end related_attributes.each do |attribute| + value = nil if attribute == "legacy_id" if table == "sc2_attribution_reasons" - csv_related_data << csv_related_unit.sc2_author_id + value = csv_related_unit.sc2_author_id elsif table == "sc2_commission_names" - csv_related_data << csv_related_unit.sc2_commission_id + value = csv_related_unit.sc2_commission_id else - csv_related_data << csv_related_unit.unit_id + value = csv_related_unit.unit_id end else - csv_related_data << csv_related_unit.try(attribute.to_sym).to_s + value = csv_related_unit.try(attribute.to_sym) end + csv_related_data << value end new_related_csv << csv_related_data end @@ -637,7 +1251,6 @@ def export_units_related_entities_csv(file, unit_ids, unit_related_tables) end end end -# Upgrade 3.0.0 fine def export_units_related_entities(file, unit_ids, unit_related_tables) #TODO considerare each_slice su unit_ids per grandi quantitativi di unità (+query ma meno memoria). @@ -750,7 +1363,7 @@ def create_data_file self.fond_ids += tmp end end - fonds_and_units + fonds_and_units major_entities headings document_forms @@ -788,4 +1401,4 @@ def create_data_file end end -end \ No newline at end of file +end diff --git a/app/models/fe_cadastral.rb b/app/models/fe_cadastral.rb new file mode 100644 index 0000000..99900ec --- /dev/null +++ b/app/models/fe_cadastral.rb @@ -0,0 +1,4 @@ +class FeCadastral < ActiveRecord::Base + belongs_to :unit +end + diff --git a/app/models/fe_context.rb b/app/models/fe_context.rb new file mode 100644 index 0000000..f647e82 --- /dev/null +++ b/app/models/fe_context.rb @@ -0,0 +1,4 @@ +class FeContext < ActiveRecord::Base + belongs_to :unit +end + diff --git a/app/models/fe_designer.rb b/app/models/fe_designer.rb new file mode 100644 index 0000000..573be67 --- /dev/null +++ b/app/models/fe_designer.rb @@ -0,0 +1,4 @@ +class FeDesigner < ActiveRecord::Base + belongs_to :unit +end + diff --git a/app/models/fe_fract_edil_parcel.rb b/app/models/fe_fract_edil_parcel.rb new file mode 100644 index 0000000..f866a98 --- /dev/null +++ b/app/models/fe_fract_edil_parcel.rb @@ -0,0 +1,4 @@ +class FeFractEdilParcel < ActiveRecord::Base + belongs_to :unit +end + diff --git a/app/models/fe_fract_land_parcel.rb b/app/models/fe_fract_land_parcel.rb new file mode 100644 index 0000000..20d95b8 --- /dev/null +++ b/app/models/fe_fract_land_parcel.rb @@ -0,0 +1,4 @@ +class FeFractLandParcel < ActiveRecord::Base + belongs_to :unit +end + diff --git a/app/models/fe_identification.rb b/app/models/fe_identification.rb new file mode 100644 index 0000000..e2db3c7 --- /dev/null +++ b/app/models/fe_identification.rb @@ -0,0 +1,4 @@ +class FeIdentification < ActiveRecord::Base + belongs_to :unit +end + diff --git a/app/models/fe_land_parcel.rb b/app/models/fe_land_parcel.rb new file mode 100644 index 0000000..54374eb --- /dev/null +++ b/app/models/fe_land_parcel.rb @@ -0,0 +1,4 @@ +class FeLandParcel < ActiveRecord::Base + belongs_to :unit +end + diff --git a/app/models/fe_opera.rb b/app/models/fe_opera.rb new file mode 100644 index 0000000..825f543 --- /dev/null +++ b/app/models/fe_opera.rb @@ -0,0 +1,4 @@ +class FeOpera < ActiveRecord::Base + belongs_to :unit +end + diff --git a/app/models/fond.rb b/app/models/fond.rb index 5995be4..6c8dcc8 100644 --- a/app/models/fond.rb +++ b/app/models/fond.rb @@ -1,5 +1,13 @@ class Fond < ActiveRecord::Base + # INIZIO - require richiesti per l'import batch + require File.join(File.dirname(__FILE__), ".", "fond_event.rb") + require File.join(File.dirname(__FILE__), ".", "unit.rb") + require File.join(File.dirname(__FILE__), ".", "fond_editor.rb") + require File.join(File.dirname(__FILE__), ".", "fond_name.rb") + require File.join(File.dirname(__FILE__), ".", "fond_identifier.rb") + # FINE - require richiesti per l'import batch + # Modules extend Cleaner @@ -64,7 +72,15 @@ class Fond < ActiveRecord::Base def active_descendant_units_count # Upgrade 2.0.0 inizio # Unit.count("id", :joins => :fond, :conditions => {:fond_id => subtree_ids, :fonds => {:trashed => false}}) - Unit.joins(:fond).where({:fond_id => subtree_ids, :fonds => {:trashed => false}}).count("id") + Unit.joins(:fond).where({:fond_id => subtree_ids, :fonds => {:trashed => false}, :ancestry => nil}).count("id") +# Upgrade 2.0.0 fine + end + + def active_descendant_units_count_children +# Upgrade 2.0.0 inizio +# Unit.count("id", :joins => :fond, :conditions => {:fond_id => subtree_ids, :fonds => {:trashed => false}}) +# Unit.joins(:fond).where({:fond_id => id, :fonds => {:trashed => false}, :ancestry => #nil}).count("id") + Unit.joins(:fond).where({:fond_id => subtree_ids, :ancestry_depth =>0, :fonds => {:trashed => false}, :ancestry => nil}).count("id") # Upgrade 2.0.0 fine end @@ -331,7 +347,7 @@ def at_most_one_custodian # rel_custodian_fonds.length is not a proper solution because make a # SELECT * and computes the size on the resulting array rel_custodian_fonds_size = rel_custodian_fonds.size - rel_custodian_fonds.select{|rec| rec.marked_for_destruction?}.size - errors.add_to_base :at_most_one_custodian if rel_custodian_fonds_size > 1 + errors[:base] << :at_most_one_custodian if rel_custodian_fonds_size > 1 end end diff --git a/app/models/fsc_close.rb b/app/models/fsc_close.rb new file mode 100644 index 0000000..736106f --- /dev/null +++ b/app/models/fsc_close.rb @@ -0,0 +1,4 @@ +class FscClose < ActiveRecord::Base + belongs_to :unit +end + diff --git a/app/models/fsc_code.rb b/app/models/fsc_code.rb new file mode 100644 index 0000000..9613a91 --- /dev/null +++ b/app/models/fsc_code.rb @@ -0,0 +1,4 @@ +class FscCode < ActiveRecord::Base + belongs_to :unit +end + diff --git a/app/models/fsc_nationality.rb b/app/models/fsc_nationality.rb new file mode 100644 index 0000000..1d64439 --- /dev/null +++ b/app/models/fsc_nationality.rb @@ -0,0 +1,4 @@ +class FscNationality < ActiveRecord::Base + belongs_to :unit +end + diff --git a/app/models/fsc_open.rb b/app/models/fsc_open.rb new file mode 100644 index 0000000..54cdd3b --- /dev/null +++ b/app/models/fsc_open.rb @@ -0,0 +1,4 @@ +class FscOpen < ActiveRecord::Base + belongs_to :unit +end + diff --git a/app/models/fsc_organization.rb b/app/models/fsc_organization.rb new file mode 100644 index 0000000..5e726d6 --- /dev/null +++ b/app/models/fsc_organization.rb @@ -0,0 +1,4 @@ +class FscOrganization < ActiveRecord::Base + belongs_to :unit +end + diff --git a/app/models/import.rb b/app/models/import.rb index 02ef469..5cc1e30 100644 --- a/app/models/import.rb +++ b/app/models/import.rb @@ -1,230 +1,3585 @@ class Import < ActiveRecord::Base -# Upgrade 2.0.0 inizio -# require 'zip/zip' -# nella versione rubyzip-1.1.6 zip.rb non è nella sottocartella zip dive invece era nella rubyzip-0.9.9 usata prima + require 'csv' + require 'nokogiri' + require 'open-uri' require 'zip' -# Upgrade 2.0.0 fine + require 'active_support' + + # INIZIO - require richiesti per l'import batch + require File.join(File.dirname(__FILE__), ".", "fond.rb") + require File.join(File.dirname(__FILE__), ".", "creator_event.rb") + require File.join(File.dirname(__FILE__), ".", "creator.rb") + require File.join(File.dirname(__FILE__), ".", "fond_lang.rb") + require File.join(File.dirname(__FILE__), ".", "rel_custodian_fond.rb") + require File.join(File.dirname(__FILE__), ".", "rel_fond_source.rb") + require File.join(File.dirname(__FILE__), ".", "digital_object.rb") + require File.join(File.dirname(__FILE__), ".", "source.rb") + require File.join(File.dirname(__FILE__), ".", "source_url.rb") + require File.join(File.dirname(__FILE__), ".", "creator_corporate_type.rb") + require File.join(File.dirname(__FILE__), ".", "rel_creator_fond.rb") + require File.join(File.dirname(__FILE__), ".", "creator_url.rb") + require File.join(File.dirname(__FILE__), ".", "creator_editor.rb") + require File.join(File.dirname(__FILE__), ".", "creator_name.rb") + require File.join(File.dirname(__FILE__), ".", "creator_legal_status.rb") + require File.join(File.dirname(__FILE__), ".", "rel_creator_source.rb") + require File.join(File.dirname(__FILE__), ".", "rel_creator_institution.rb") + require File.join(File.dirname(__FILE__), ".", "institution.rb") + require File.join(File.dirname(__FILE__), ".", "institution_editor.rb") + require File.join(File.dirname(__FILE__), ".", "custodian.rb") + require File.join(File.dirname(__FILE__), ".", "custodian_type.rb") + require File.join(File.dirname(__FILE__), ".", "custodian_name.rb") + require File.join(File.dirname(__FILE__), ".", "custodian_url.rb") + require File.join(File.dirname(__FILE__), ".", "rel_custodian_source.rb") + require File.join(File.dirname(__FILE__), ".", "custodian_identifier.rb") + require File.join(File.dirname(__FILE__), ".", "custodian_building.rb") + require File.join(File.dirname(__FILE__), ".", "custodian_contact.rb") + require File.join(File.dirname(__FILE__), ".", "custodian_editor.rb") + require File.join(File.dirname(__FILE__), ".", "source_type.rb") + require File.join(File.dirname(__FILE__), ".", "unit_identifier.rb") + require File.join(File.dirname(__FILE__), ".", "sc2.rb") + require File.join(File.dirname(__FILE__), ".", "unit_editor.rb") + require File.join(File.dirname(__FILE__), ".", "heading.rb") + require File.join(File.dirname(__FILE__), ".", "rel_unit_heading.rb") + + require File.join(File.dirname(__FILE__), ".", "unit_url.rb") + require File.join(File.dirname(__FILE__), ".", "unit_event.rb") + require File.join(File.dirname(__FILE__), ".", "anagraphic.rb") + require File.join(File.dirname(__FILE__), ".", "rel_unit_anagraphic.rb") + require File.join(File.dirname(__FILE__), ".", "anag_identifier.rb") + require File.join(File.dirname(__FILE__), ".", "fond_editor.rb") + require File.join(File.dirname(__FILE__), ".", "fond_name.rb") + require File.join(File.dirname(__FILE__), ".", "fond_event.rb") + require File.join(File.dirname(__FILE__), ".", "fond_identifier.rb") + require File.join(File.dirname(__FILE__), ".", "creator_identifier.rb") + require File.join(File.dirname(__FILE__), ".", "document_form.rb") + require File.join(File.dirname(__FILE__), ".", "rel_fond_document_form.rb") + require File.join(File.dirname(__FILE__), ".", "term.rb") + require File.join(File.dirname(__FILE__), ".", "vocabulary.rb") + require File.join(File.dirname(__FILE__), ".", "sc2_scale.rb") + require File.join(File.dirname(__FILE__), ".", "sc2_technique.rb") + require File.join(File.dirname(__FILE__), ".", "sc2_textual_element.rb") + require File.join(File.dirname(__FILE__), ".", "sc2_visual_element.rb") + require File.join(File.dirname(__FILE__), ".", "sc2_author.rb") + require File.join(File.dirname(__FILE__), ".", "sc2_attribution_reason.rb") + require File.join(File.dirname(__FILE__), ".", "fe_context.rb") + require File.join(File.dirname(__FILE__), ".", "fe_identification.rb") + # FINE - require richiesti per l'import batch + + extend Sc2Restore + attr_accessor :imported_file_version, :does_source_have_fonds + attr_accessor :ref_fond_id, :ref_root_fond_id, :is_icar_import, :is_batch_import, :batch_import_filename + + TMP_IMPORTS = "#{Rails.root}/tmp/imports" + PUBLIC_IMPORTS = "#{Rails.root}/public/imports" + DIGITAL_FOLDER_PATH = "#{Rails.root}/public/digital_objects" + + belongs_to :user + belongs_to :importable, :polymorphic => true + + @is_batch_import = false + + begin + has_attached_file :data, :path => ":rails_root/public/imports/:id/:basename.:extension" + rescue + @is_batch_import = true + end + + before_create :sanitize_file_name + + begin + validates_attachment_presence :data + do_not_validate_attachment_file_type :data + rescue + # caso del batch import + # do_nothing + end + + def ar_connection + # Upgrade 2.0.0 inizio + #ActiveRecord::Base.connection + self.class.connection + # Upgrade 2.0.0 fine + end + + def adapter + ar_connection.adapter_name.downcase + end + + def xml_data_file + PUBLIC_IMPORTS + "/#{self.id}/#{self.data_file_name}" + end + + # Upgrade 3.0.0 inizio + def csv_data_file + PUBLIC_IMPORTS + "/#{self.id}/#{self.data_file_name}" + end + # Upgrade 3.0.0 fine + + def data_file + TMP_IMPORTS + "/#{self.id}_data.json" + end + + def metadata_file + TMP_IMPORTS + "/#{self.id}_metadata.json" + end + + def delete_tmp_files + File.delete(data_file) if File.exists?(data_file) + File.delete(metadata_file) if File.exists?(metadata_file) + end + + def delete_tmp_zip_files + @extracted_files.each do |efd| + File.delete(efd) if File.exists?(efd) + end + File.delete(TMP_IMPORTS + "/data.json") if File.exists?(TMP_IMPORTS + "/data.json") + end + + def delete_digital_folder(folder) + if Dir.exists?(DIGITAL_FOLDER_PATH + "/" + folder) + FileUtils.remove_dir(DIGITAL_FOLDER_PATH + "/" + folder) + end + end + + def db_has_subunits? + Unit.exists?(["db_source = ? AND ancestry_depth > 0", self.identifier]) + end + + def db_has_digital_objects? + DigitalObject.exists?(["db_source = ?", self.identifier]) + end + + def is_institution_importable_type? + return (importable_type == "Institution") + end + + def is_creator_importable_type? + return (importable_type == "Creator") + end + + def is_anagraphic_importable_type? + return (importable_type == "Anagraphic") + end + + def is_custodian_importable_type? + return (importable_type == "Custodian") + end + + def is_source_importable_type? + return (importable_type == "Source") + end + + # Upgrade 2.2.0 inizio + def is_unit_importable_type? + return (importable_type == "Unit") + end + + def is_unit_aef_file? + return is_unit_importable_type? + end + + # Upgrade 3.0.0 inizio + # modificata nella 3.1.1 con l'utilizzo della gemma csv + def import_csv_file(user, ability) + begin + unit_aef_import_units_count = 0 + rebuild_sequence = false + + ActiveRecord::Base.transaction do + model = nil + prev_model = nil + object = nil + prev_line = "" + headers = nil + elem_count = 0 + separator = "" + date_time = DateTime.now + sequence_number = nil + + CSV.foreach(csv_data_file) do |row| + if prev_line.blank? and (!row.blank? or !row.all?(&:blank?)) + pos_last = -1 + elem = row[0].split('_') + elem.each do |e| + if e.last == "s" + pos_last += 1 + break + else + pos_last += 1 + end + end + key = (elem[0..pos_last].join('_'))[0..-2] + key = key.to_s + model = key.camelize.constantize + headers = [] + row.each do |elem| + if !elem.nil? + headers.push(elem.gsub!(key + 's_', '')) + end + end + prev_line = "not_blank" + else + if row.all?(&:blank?) + prev_line = "" + else + values = row.map! { |value| value.nil? ? '' : value } + zipped = headers.zip(values) + ipdata = Hash[zipped] + object = model.new(ipdata) + object.db_source = self.identifier + if object.has_attribute? 'group_id' + object.group_id = if user.is_multi_group_user?() then + ability.target_group_id + else + user.rel_user_groups[0].group_id + end + end + if (self.is_unit_aef_file?) + if (model.to_s == "Unit") + object.fond_id = self.ref_fond_id + object.root_fond_id = prv_get_ref_root_fond_id + rebuild_sequence = true + + if sequence_number.nil? + sequence_number = Unit.where(:root_fond_id => object.root_fond_id).maximum(:sequence_number) + end + sequence_number = sequence_number + 1 + object.sequence_number = sequence_number + + unit_aef_import_units_count += 1 + end + end + object.created_by = user.id if object.has_attribute? 'created_by' + object.updated_by = user.id if object.has_attribute? 'updated_by' + if object.created_at.nil? + object.created_at = date_time + end + if object.updated_at.nil? + object.updated_at = date_time + end + + object.sneaky_save! + + if model != prev_model && !prev_model.nil? + prev_object = prev_model.new + set_lacking_field_values(prev_object) + end + prev_model = model + end + end + end + end + update_statements(unit_aef_import_units_count) + + if rebuild_sequence + Fond.find(prv_get_ref_root_fond_id).rebuild_external_sequence + end + rescue Exception => e + Rails.logger.info "import_csv_file errore: " + e.message.to_s + return false + ensure + end + end + # Upgrade 3.0.0 fine + + def import_unit_from_path document, user_id, group_id + Rails.logger.info "Import unita' INIZIATO da import.rb" + + datetime = Time.now.strftime("%Y-%m-%d %H:%M:%S") + unit_component = document.xpath("did/unitid") + + unit = Unit.new + + unit.db_source = self.identifier + unit.created_by = user_id + unit.updated_by = user_id + unit.created_at = datetime + unit.updated_at = datetime + + case document.xpath("@level").text + #fpu when "list" + # unit.unit_type = "registro o altra unità rilegata" + when "file" + case document.xpath("@otherlevel").text + when "registro" + unit.unit_type = "registro o altra unità rilegata" + when "fascicolopersonale" + unit.unit_type = "fascicolo o altra unità complessa" + unit.file_type = "fascicolo personale" + when "cartografiastorica" + unit.unit_type = "unità documentaria" + unit.sc2_tsk = "CARS" + when "disegnoartistico" + unit.unit_type = "unità documentaria" + unit.sc2_tsk = "D" + when "disegnotecnico" + unit.unit_type = "unità documentaria" + unit.sc2_tsk = "DT" + when "fotografia" + unit.unit_type = "unità documentaria" + unit.sc2_tsk = "F" + when "stampa" + unit.unit_type = "unità documentaria" + unit.sc2_tsk = "S" + else + unit.unit_type = "fascicolo o altra unità complessa" + end + when "item" + unit.unit_type = "unità documentaria" + end + + + unit.legacy_id = unit_component.xpath("@identifier").text + + if unit_component.xpath("../../accessrestrict/p").present? + terms = Term.where(vocabulary_id: Vocabulary.where(name: "units.access_condition").first.id).select(:term_key) + condition = unit_component.xpath("../../accessrestrict/p").text + if terms.include? condition.downcase + unit.access_condition = condition.downcase + else + unit.access_condition_note = condition.gsub(/\t/, '') + end + end + if unit_component.xpath("../../userestrict/p").present? + terms = Term.where(vocabulary_id: Vocabulary.where(name: "units.use_condition").first.id).select(:term_key) + condition = unit_component.xpath("../../userestrict/p").text + if terms.include? condition.downcase + unit.use_condition = condition.downcase + else + unit.use_condition_note = condition.gsub(/\t/, '') + end + end + + unit.ancestry = nil + unit.ancestry_depth = 0 + if (unit.ancestry.present?) + unit.ancestry_depth = Unit.find(unit.ancestry).ancestry_depth + 1 + end + unit.arrangement_note = unit_component.xpath("../processinfo[@localtype='noteDellArchivista']/p").text + unit.content = unit_component.xpath("../../scopecontent/p").text + unit.extent = unit_component.xpath("../physdescstructured/quantity").text + unit.physical_type = unit_component.xpath("../physdescstructured/unittype").text + unit.file_number = unit_component.xpath("../unitid[@localtype='numFascicolo']").text + unit.folder_number = unit_component.xpath("../unitid[@localtype='busta']").text + unit.medium = unit_component.xpath("../physdescstructured/physfacet[@localtype='Supporto']").text + unit.physical_container_number = unit_component.xpath("../container/@containerid").text + unit.physical_container_title = unit_component.xpath("../container").text + unit.physical_container_type = unit_component.xpath("../container/@localtype").text + unit.physical_description = unit_component.xpath("../physdescstructured/descriptivenote").text + unit.preservation_note = unit_component.xpath("../physdescstructured/phystech").text + unit.reference_number = unit_component.xpath("../unitid[@localtype='segnaturaAttuale']").text + unit.title = unit_component.xpath("../unittitle[@localtype='denominazione']").text + unit.given_title = unit_component.xpath("../unittitle[@localtype='titoloAttribuito']").text + unit.tmp_reference_number = unit_component.xpath("../unitid[@localtype='segnaturaProvvisoriaNumero']").text + unit.tmp_reference_string = unit_component.xpath("../unitid[@localtype='segnaturaProvvisoriaTesto']").text + + unit.fond_id = nil + if (unit.fond_id.present?) + unit.root_fond_id = Fond.find(unit.fond_id).root.id + end + Rails.logger.info "Salvataggio unita'" + unit.sneaky_save + + unit_component.xpath("../unitid").each do |unitid| + if unitid.xpath("@identifier").present? + unit_identifier = UnitIdentifier.new + unit_identifier.unit_id = unit.id + unit_identifier.identifier = unitid.text + unit_identifier.note = "Identificativo di sistema" + unit_identifier.db_source = self.identifier + unit_identifier.save! + end + end + + if unit_component.xpath("../unitid[@localtype='classificazione']").present? || + unit_component.xpath("../unitid[@localtype='fascicolo']").present? || + unit_component.xpath("../unitid[@localtype='subfascicolo']").present? + fe_context = FeContext.new + fe_context.unit_id = unit.id + fe_context.classification = unit_component.xpath("../unitid[@localtype='classificazione']").text + fe_context.number = unit_component.xpath("../unitid[@localtype='fascicolo']").text + fe_context.sub_number = unit_component.xpath("../unitid[@localtype='subfascicolo']").text + fe_context.save! + end + + if unit_component.xpath("../unitid[@localtype='classe']").present? || + unit_component.xpath("../unitid[@localtype='codice']").present? || + unit_component.xpath("../unitid[@localtype='categoria']").present? || + unit_component.xpath("../unitid[@localtype='anno']").present? + fe_identifications = FeIdentification.new + fe_identifications.unit_id = unit.id + fe_identifications.identification_class = unit_component.xpath("../unitid[@localtype='classe']").text + fe_identifications.code = unit_component.xpath("../unitid[@localtype='codice']").text + fe_identifications.category = unit_component.xpath("../unitid[@localtype='categoria']").text + fe_identifications.file_year = unit_component.xpath("../unitid[@localtype='anno']").text + fe_identifications.save! + end + + if unit_component.xpath("../physdescstructured").present? || + unit_component.xpath("../../odd[@localtype='NumeroTavola']/p").present? || + unit_component.xpath("../../controlaccess/subject[@localtype='Soggetto']").present? + sc2 = Sc2.new + sc2.unit_id = unit.id + sc2.mtce = unit_component.xpath("../physdescstructured/physfacet[@localtype='Esecuzione']").text + sc2.sdtt = unit_component.xpath("../physdescstructured/physfacet[@localtype='Tiporappresentazione']").text + sc2.misa = unit_component.xpath("../physdescstructured/physfacet[@localtype='altezza']").text + sc2.misl = unit_component.xpath("../physdescstructured/physfacet[@localtype='larghezza']").text + sc2.lrc = unit_component.xpath("../physdescstructured/descriptivenote/p/geoname[@localtype='Luogorappresentazione']/part").text + sc2.dpgf = unit_component.xpath("../../odd[@localtype='NumeroTavola']/p").text + sc2.sgti = unit_component.xpath("../../controlaccess/subject[@localtype='Soggetto']/part").text + sc2.save! + end + + if unit_component.xpath("../physdescstructured/physfacet[@localtype='Scala']").present? + sc2_scales = Sc2Scale.new + sc2_scales.unit_id = unit.id + sc2_scales.sca = unit_component.xpath("../physdescstructured/physfacet[@localtype='Scala']").text + sc2_scales.save! + end + + if unit_component.xpath("../physdescstructured/physfacet[@localtype='Tecnica']").present? + sc2_techniques = Sc2Technique.new + sc2_techniques.unit_id = unit.id + sc2_techniques.mtct = unit_component.xpath("../physdescstructured/physfacet[@localtype='Tecnica']").text + sc2_techniques.save! + end + + if unit_component.xpath("../../odd[@localtype='ElementiTestuali']/p").present? + sc2_textual_element = Sc2TextualElement.new + sc2_textual_element.unit_id = unit.id + sc2_textual_element.isri = unit_component.xpath("../../odd[@localtype='ElementiTestuali']/p").text + sc2_textual_element.save! + end + + if unit_component.xpath("../../odd[@localtype='ElementiFigurati']/p").present? + sc2_visual_elements = Sc2VisualElement.new + sc2_visual_elements.unit_id = unit.id + sc2_visual_elements.stmd = unit_component.xpath("../../odd[@localtype='ElementiFigurati']/p").text + sc2_visual_elements.save! + end + + if unit_component.xpath("../../controlaccess/name[@localtype='Autore']").present? + sc2_authors = Sc2Author.new + sc2_authors.autr = unit_component.xpath("../../controlaccess/name[@localtype='Autore']/part[@localtype='Ruolo']").text + sc2_authors.autn = unit_component.xpath("../../controlaccess/name[@localtype='Autore']/part[@localtype='Autore']").text + sc2_authors.auta = unit_component.xpath("../../controlaccess/name[@localtype='Autore']/part[@localtype='DatiAnagrafici']").text + sc2_authors.save! + + if unit_component.xpath("../../controlaccess/name[@localtype='Autore']/part[@localtype='Attribuzione']").present? + sc2_attribution_reasons = Sc2AttributionReason.new + sc2_attribution_reasons.sc2_author_id = sc2_authors.id + sc2_attribution_reasons.autm = unit_component.xpath("../../controlaccess/name[@localtype='Autore']/part[@localtype='Attribuzione']").text + sc2_attribution_reasons.save! + end + end + + #if unit_component.xpath("../../controlaccess/name[@localtype='Committente']").present? + # sc2_commission = Sc2Commission.new + # sc2_commission.unit_id = unit.id + # sc2_commission.cmmc + #end + if unit_component.xpath("../../processinfo[@localtype='compilatori']/processinfo").present? + unit_component.xpath("../../processinfo[@localtype='compilatori']/processinfo").each do |pi| + editor = UnitEditor.new + editor.unit_id = unit.id + editor.name = pi.xpath("p/persname/part[@localtype='compilatore']").text + tipo_intervento = pi.xpath("p/persname/part[@localtype='tipoIntervento']").text + if tipo_intervento == "inserimento" || tipo_intervento == "created" + editor.editing_type = "inserimento dati" + elsif tipo_intervento == "modifica" || tipo_intervento == "updated" + editor.editing_type = "aggiornamento scheda" + end + editor.qualifier = pi.xpath("p/persname/part[@localtype='qualifica']").text + editor.edited_at = pi.xpath("p/date[@localtype='dataIntervento']").text + editor.save! + end + else + if unit_component.xpath("/ead/control/maintenancehistory/maintenanceevent").present? + unit_component.xpath("/ead/control/maintenancehistory/maintenanceevent").each do |maintenance_event| + editor = UnitEditor.new + editor.unit_id = unit.id + editor.name = maintenance_event.xpath("agent").text.squish + editor.editing_type = import_editing_type(maintenance_event.xpath("eventtype/@value").text) + if maintenance_event.xpath("eventdatetime").present? + editor.edited_at = maintenance_event.xpath("eventdatetime").text.squish + end + editor.qualifier = import_agent_type(maintenance_event.xpath("agenttype/@value").text) + editor.save + end + end + end + + if unit_component.xpath("../../controlaccess/persname").present? + unit_component.xpath("../../controlaccess/persname").each do |heading| + headingObj = get_heading_obj(heading, 'Persona') + save_heading(headingObj, unit.id) + end + end + + if unit_component.xpath("../../controlaccess/famname").present? + unit_component.xpath("../../controlaccess/famname").each do |heading| + headingObj = get_heading_obj(heading, 'Famiglia') + save_heading(headingObj, unit.id) + end + end + + if unit_component.xpath("../../controlaccess/corpname").present? + unit_component.xpath("../../controlaccess/corpname").each do |heading| + headingObj = get_heading_obj(heading, 'Ente') + save_heading(headingObj, unit.id) + end + end + + if unit_component.xpath("../../controlaccess/geogname").present? + unit_component.xpath("../../controlaccess/geogname").each do |heading| + headingObj = get_heading_obj(heading, 'Toponimo') + save_heading(headingObj, unit.id) + end + end + + if unit_component.xpath("../../controlaccess/subject").present? + unit_component.xpath("../../controlaccess/subject").each do |heading| + headingObj = get_heading_obj(heading, 'Altro') + save_heading(headingObj, unit.id) + end + end + + if unit_component.xpath("../../controlaccess/genreform").present? + unit_component.xpath("../../controlaccess/genreform").each do |heading| + headingObj = get_heading_obj(heading, 'Tipologia documentaria') + save_heading(headingObj, unit.id) + end + end + + if unit_component.xpath("../../relations/relation[@otherrelationtype='URL']").present? + unit_component.xpath("../../relation/relationtype[@otherrelationtype='URL']").each do |url| + unit_url = UnitUrl.new + unit_url.id = unit.id + unit_url.url = url.xpath('@href').text + unit_url.note = url.xpath('relationentry').text + unit_url.save! + end + end + + if unit_component.xpath("../unitdatestructured").present? + date = unit_component.xpath("../unitdatestructured") + unit_event = UnitEvent.new + unit_event.unit_id = unit.id + if date.xpath("dateset").present? + import_dateset date.xpath("dateset").first, unit_event, datetime + else + import_dateset date, unit_event, datetime + end + end + + if unit_component.xpath("../../relations/relation[@otherrelationtype='INDICE']/relationentry[@localtype='identificativo']").present? + unit_component.xpath("../../relations/relation[@otherrelationtype='INDICE']/relationentry[@localtype='identificativo']").each do |anagraphic_id| + anagraphic = Anagraphic.where(db_source: self.identifier, legacy_id: anagraphic_id.text[3..10].to_i.to_s) + if anagraphic.present? + rel_unit_anag = RelUnitAnagraphic.new + rel_unit_anag.db_source = self.identifier + rel_unit_anag.unit_id = unit.id + rel_unit_anag.anagraphic_id = anagraphic.first.id + rel_unit_anag.legacy_unit_id = unit.legacy_id + rel_unit_anag.legacy_anagraphic_id = anagraphic.first.legacy_id + rel_unit_anag.save + end + end + end + if unit_component.xpath("../../did/dao").present? + unit_component.xpath("../../did/dao").each do |digital_obj| + digital_object = DigitalObject.new + digital_object.attachable_type = 'Unit' + digital_object.attachable_id = unit.id + digital_object.db_source = self.identifier + digital_object.legacy_id = digital_obj.xpath('@id').text + href = digital_obj.xpath('@href').text.split('/') + + #if href.last == "" + # href.pop + #end + #digital_object.asset_file_name = href.pop #esclude il nome del file .jpg dopo aver eliminato la stringa vuota dovuta all'eventuale fine dell'url con uno slash + #digital_object.access_token = href.last + digital_object.access_token = href.first + digital_object.asset_file_name = href.last + + digital_object.asset_content_type = digital_obj.xpath("@linkrole").text + digital_object.title = "importato senza titolo" + digital_object.created_by = user_id + digital_object.updated_by = user_id + digital_object.group_id = group_id + digital_object.asset_updated_at = datetime + digital_object.save! + Rails.logger.info "Oggetto digitale #{digital_object.id} aggiunto all'unità #{digital_object.attachable_id}" + end + end + + + Rails.logger.info "Unita' salvata, id: #{unit.id}" + self.importable_id = unit.id + return unit + end + + def save_heading (headingObj, unit_id) + rel_unit_heading = RelUnitHeading.new + unless headingObj.id? + headingObj.save! + end + rel_unit_heading.heading_id = headingObj.id + rel_unit_heading.unit_id = unit_id + rel_unit_heading.save! + end + + def get_heading_obj (heading_xml, heading_type) + heading_name = [] + heading_name.push(heading_xml.xpath('part[@localtype="cognome"]').text) + heading_name.push(heading_xml.xpath('part[@localtype="nome"]').text) + heading_name.push(heading_xml.xpath('part[not(@*)]').text) + name = heading_name.join(' ').squish + + headingObj = Heading.find_by(name: name) #il nome deve essere unico + if headingObj.nil? + headingObj = Heading.new + headingObj.heading_type = heading_type + headingObj.name = name + headingObj.dates = heading_xml.xpath("part[@localtype='estremiCronologici']").text + headingObj.qualifier = heading_xml.xpath("part[@localtype='qualifica']").text + end + + headingObj + end + + def import_unit_hierarchy (unit_xpath, root_fond_id, fond_id, user_id, group_id, ancestry) + fond = Fond.find(fond_id) + unit_just_saved = Unit.find (import_unit_from_path unit_xpath, user_id, group_id).id + unit_just_saved.ancestry = ancestry + unit_just_saved.fond_id = fond_id + unit_just_saved.root_fond_id = root_fond_id + Rails.logger.info "unita' #{unit_just_saved.id} del complesso #{fond_id} con root: #{root_fond_id}" + unit_just_saved.ancestry_depth = 0 + if ancestry != nil + unit_just_saved.ancestry_depth = ancestry.split('/').size + end + fond.units_count = fond.units.count + unit_just_saved.sequence_number = fond.units.count + 1 + unit_just_saved.sneaky_update + fond.sneaky_update + if unit_xpath.xpath('c').present? + unit_xpath.xpath('c').each do |subunit| + if ancestry != nil + import_unit_hierarchy subunit, root_fond_id, fond_id, user_id, group_id, (ancestry + '/' + unit_just_saved.id.to_s) + else + import_unit_hierarchy subunit, root_fond_id, fond_id, user_id, group_id, unit_just_saved.id.to_s + end + end + end + Rails.logger.info "Unita` #{unit_xpath.xpath('did/unitid/@identifier').text} salvata." + return + end + + #fond_root: ead/archdesc o ..dsc/c + #ancestry: rappresenta una stringa contenente tutti i parent dell'entita` in considerazione + def import_fond_hierarchy (fond_root, user_id, group_id, ancestry) + #TODO da rendere una costante globale. + fond_types = [ + "fonds", + "recordgrp", + "subfonds", + "series", + "subseries", + "subsubseries", + "otherlevel" + ] + #otherlevels = Term.where(id: Vocabulary.find_by(name: "fonds.fond_type").id).select(:term_value) + + def eredita_compilatori (fond_id, ancestry) + if ancestry != "" + + fond_editor = FondEditor.find_by_fond_id(fond_id) + + if fond_editor.nil? + parent_fond_id = ancestry.split("/")[-1].to_i + + FondEditor.where(fond_id: parent_fond_id).find_each do |parent_fond_editor| + new_fond_editor = FondEditor.new + new_fond_editor.fond_id = fond_id + new_fond_editor.name = parent_fond_editor.name + new_fond_editor.qualifier = parent_fond_editor.qualifier + new_fond_editor.editing_type = parent_fond_editor.editing_type + new_fond_editor.edited_at = parent_fond_editor.edited_at + new_fond_editor.db_source = parent_fond_editor.db_source + new_fond_editor.legacy_id = parent_fond_editor.legacy_id + new_fond_editor.created_at = parent_fond_editor.created_at + new_fond_editor.updated_at = parent_fond_editor.updated_at + new_fond_editor.save! + end + end + end + end + + if ancestry == '' + fond_just_saved = import_fond_from_path fond_root, user_id, group_id + root_fond_id = fond_just_saved.id + + eredita_compilatori(fond_just_saved.id, ancestry) + + ancestry = fond_just_saved.id.to_s + import_fond_control_field fond_root.xpath("../control"), root_fond_id + + if fond_root.xpath('dsc/c').present? + Rails.logger.info "Importazione figli di primo livello del fondo." + fond_root.xpath('dsc/c').each do |subfond| + if fond_types.include? subfond.xpath("@level").text + fond_just_saved = Fond.find (import_fond_from_path subfond, user_id, group_id).id + fond_just_saved.ancestry = ancestry + fond_just_saved.ancestry_depth = 1 + fond_just_saved.sneaky_update + + eredita_compilatori(fond_just_saved.id, ancestry) + + import_fond_hierarchy subfond, user_id, group_id, (ancestry + '/' + fond_just_saved.id.to_s) + else + import_unit_hierarchy subfond, ancestry.split('/').first.to_i, ancestry.split('/').last.to_i, user_id, group_id, nil + end + end + end + return root_fond_id + else + if fond_root.xpath('c').present? + Rails.logger.info "Importazione figli del fondo di livelli successivi al primo." + fond_root.xpath('c').each do |subfond| + if fond_types.include? subfond.xpath("@level").text + fond_just_saved = Fond.find (import_fond_from_path subfond, user_id, group_id).id + fond_just_saved.ancestry = ancestry + fond_just_saved.ancestry_depth = ancestry.split('/').size + fond_just_saved.sneaky_update + + eredita_compilatori(fond_just_saved.id, ancestry) + + import_fond_hierarchy subfond, user_id, group_id, (ancestry + '/' + fond_just_saved.id.to_s) + else + import_unit_hierarchy subfond, ancestry.split('/').first.to_i, ancestry.split('/').last.to_i, user_id, group_id, nil + end + end + end + end + end + + # dato un generico path xml importa i dati del complesso: + # sara' /archdesc per il complesso principale e /c per tutti i figli. + def import_fond_from_path path, user_id, group_id + Rails.logger.info "import_fond_from_path" + datetime = Time.now.strftime("%Y-%m-%d %H:%M:%S") + + fond = Fond.new + otherlevel_from_path = "" + level_from_path = path.xpath("@level").text + level = level_from_path + if level_from_path == "otherlevel" + otherlevel_from_path = path.xpath("@otherlevel").text + level = otherlevel_from_path + end + fond.fond_type = import_level_type(level) + + if level_from_path == "otherlevel" + if otherlevel_from_path == "" + Rails.logger.warn "Fondo con @level = otherlevel, descrizione @otherlevel non indicata (campo obbligatorio)" + else + Rails.logger.info "Fondo con @level = #{level_from_path}, @otherlevel = #{otherlevel_from_path}, fond_type: #{fond.fond_type}" + end + else + if level_from_path == "" + Rails.logger.warn "Livello di descrizione del fondo non indicato (campo obbligatorio)" + else + Rails.logger.info "Fondo con @level = #{level_from_path}, fond_type: #{fond.fond_type}" + end + end + + path.xpath("did/unittitle").each do |title| + if title.xpath('@localtype').text.downcase == "denominazione" + fond.name = title.text + end + end + + # verra' utilizzato per ricostruire le relazioni presenti nel file icar-import se non presente dovra` + # dare un'eccezione + + + fond.legacy_id = path.xpath("did/unitid").text.squish + + fond.db_source = self.identifier + fond.created_by = user_id + fond.updated_by = user_id + fond.group_id = group_id + fond.created_at = datetime + fond.updated_at = datetime + + if path.xpath("accessrestrict/p").present? + terms = Term.where(vocabulary_id: Vocabulary.where(name: "fonds.access_condition").first.id).select(:term_key) + condition = path.xpath("accessrestrict/p").first.text + if terms.include? condition.downcase + fond.access_condition = condition.downcase + else + fond.access_condition_note = condition.downcase + end + end + + fond.published = false + if path.xpath("processinfo/p").text.downcase == "pubblicata" + fond.published = true + end + + fond.history = path.xpath("custodhist/p").text + + fond.extent = path.xpath("did/physdesc").text + + path.xpath("did/physdescstructured").each do |pd| + quantity = pd.xpath("quantity").text.squish + unit_type = pd.xpath("unittype").text.squish + + if unit_type == "metri lineari" + begin + fond.length = Float(quantity) + rescue + Rails.logger.info "ead/did/physdescstructured/quantity NON numerico" + end + else + if fond.extent != "" + fond.extent += "\n" + end + fond.extent += quantity + " " + unit_type + end + end + + if path.xpath("did/physloc").present? + Rails.logger.info "Fondo: #{fond.name.squish} - Trovato ma non importato il tag 'ead/did/physloc': #{path.xpath("did/physloc").text.squish}" + end + + if path.xpath("did/didnote").present? + Rails.logger.info "Fondo: #{fond.name.squish} - Trovato ma non importato il tag 'ead/did/didnote': #{path.xpath("did/didnote").text.squish}" + end + + if path.xpath("acqinfo").present? + Rails.logger.info "Fondo: #{fond.name.squish} - Trovato ma non importato il tag 'ead/acqinfo': #{path.xpath("acqinfo").text.squish}" + end + + if path.xpath("separatedmaterial").present? + Rails.logger.info "Fondo: #{fond.name.squish} - Trovato ma non importato il tag 'ead/separatedmaterial': #{path.xpath("separatedmaterial").text.squish}" + end + + if path.xpath("bibliography").present? + Rails.logger.info "Fondo: #{fond.name.squish} - Trovato ma non importato il tag 'ead/bibliography': #{path.xpath("bibliography").text.squish}" + end + + fond.description = path.xpath("scopecontent/p").text + + fond.arrangement_note = "" + if path.xpath("arrangement/p").present? + fond.arrangement_note += "Criteri di ordinamento: " + path.xpath("arrangement/p").text + "\n" + end + + fond.sneaky_save! + + self.importable_id = fond.id + + if path.xpath("processinfo/processinfo/p").present? + path.xpath("processinfo[@localtype='compilatori']/processinfo[@localtype='compilatore']").each do |pi| + editor = FondEditor.new + editor.fond_id = fond.id + editor.name = pi.xpath("p/persname/part[@localtype='compilatore']").text + editor.qualifier = pi.xpath("p/persname/part[@localtype='qualifica']").text + tipo_intervento = pi.xpath("p/persname/part[@localtype='tipoIntervento']").text + if tipo_intervento == "inserimento" || tipo_intervento == "created" + editor.editing_type = "inserimento dati" + elsif tipo_intervento == "modifica" || tipo_intervento == "updated" + editor.editing_type = "aggiornamento scheda" + end + if pi.xpath("p/date").text.present? + editor.edited_at = Date.parse pi.xpath("p/date").text + end + editor.save! + end + else + if path.xpath("../control/maintenancehistory/maintenanceevent").present? + path.xpath("../control/maintenancehistory/maintenanceevent").each do |maintenance_event| + editor = FondEditor.new + editor.fond_id = fond.id + editor.name = maintenance_event.xpath("agent").text.squish + editor.editing_type = import_editing_type(maintenance_event.xpath("eventtype/@value").text) + if maintenance_event.xpath("eventdatetime").present? + editor.edited_at = maintenance_event.xpath("eventdatetime").text.squish + end + editor.qualifier = import_agent_type(maintenance_event.xpath("agenttype/@value").text) + editor.db_source = self.identifier + editor.save + end + end + end + + if path.xpath("controlaccess/genreform").present? + path.xpath("controlaccess/genreform").each do |fond_document| + rel__f_d = RelFondDocumentForm.new + rel__f_d.name = fond_document.xpath("part[@localtype='denominazione']").text.squish + rel__f_d.description = fond_document.xpath("part[@localtype='descrizione']").text + rel__f_d.note = fond_document.xpath("part[@localtype='note']").text + if DocumentForm.where("document_forms.name = ?", rel__f_d.name).first.present? + rel__f_d.document_form_id = DocumentForm.where("document_forms.name = ?", rel__f_d.name).first[:id] + rel__f_d.fond_id = fond.id + rel__f_d.save! + else + puts("Nessun DocumentForm trovato con il nome inserito. Non e' stato aggiunto alcun record del tipo 'RelFondDocumentForm'") + end + end + end + + #altre denominazioni + path.xpath("did/unittitle").each do |unittitle| + if (unittitle.text != fond.name) + fond_name = FondName.new + fond_name.fond_id = fond.id + fond_name.name = unittitle.text + fond_name.created_at = datetime + fond_name.updated_at = datetime + fond_name.qualifier = "O" + if unittitle.xpath("@localtype").text == "denominazioneParallela" + fond_name.note = "Denominazione parallela;" + end + if unittitle.xpath("@lang").text.present? + fond_name.note += " Codice lingua: " + unittitle.xpath("@lang").text + end + + fond_name.save! + end + end + + if path.xpath("did/unitdatestructured/dateset").present? + event = FondEvent.new + event.fond_id = fond.id + import_dateset(path.xpath("did/unitdatestructured/dateset").first, event, datetime) + end + + if path.xpath("did/unitdatestructured/daterange").present? + event = FondEvent.new + event.fond_id = fond.id + import_dateset(path.xpath("did/unitdatestructured").first, event, datetime) + end + + # Salvataggio delle informazioni riguardanti le relazioni in campi "di fortuna". + #if path.xpath("relations/relation").present? && !@is_icar_import + # if !fond.related_materials.present? + # fond.related_materials = "" + # end + # path.xpath("relations/relation").each do |relation| + # fond.related_materials += + # "relation: {\n + # @relationtype: #{relation.xpath("@relationtype").text};\n + # @href: #{relation.xpath("@href").text};\n + # relationentry: #{relation.xpath("relationentry").text};\n + # relationentry/@localtype: #{relation.xpath("relationentry/@localtype").text}; + # \n}\n" + # end + #end + + # Import per il campo Archimista: Fondo > Altre informazioni > Documentazione collegata + if path.xpath("relatedmaterials/archref/ref").present? + if !fond.related_materials.present? + fond.related_materials = "" + end + fond.related_materials += path.xpath("relatedmaterials/archref/ref").text + end + + source = path.xpath("did/unitid") + if source.xpath("@identifier").present? + fond_identifier = FondIdentifier.new + fond_identifier.fond_id = fond.id + fond_identifier.identifier = source.xpath("@identifier").text + #fond_identifier.identifier_source = source.xpath("@localtype").text + fond_identifier.db_source = self.identifier + fond_identifier.note = "Identificativo di sistema" + fond_identifier.save + end + + # Produttori: + #if path.xpath("did/origination/corpname").present? + # path.xpath("did/origination/corpname").each do |source| + # fond_identifier = FondIdentifier.new + # fond_identifier.fond_id = fond.id + # fond_identifier.identifier = source.xpath("@identifier").text + # fond_identifier.identifier_source = "" + # fond_identifier.db_source = self.identifier + # fond_identifier.note = source.xpath("part").text + # fond_identifier.save + # end + #end + #if path.xpath("did/origination/persname").present? + # path.xpath("did/origination/persname").each do |source| + # fond_identifier = FondIdentifier.new + # fond_identifier.fond_id = fond.id + # fond_identifier.identifier = source.xpath("@identifier").text + # fond_identifier.identifier_source = "" + # fond_identifier.db_source = self.identifier + # fond_identifier.note = source.xpath("part").text + # fond_identifier.save + # end + #end + #if path.xpath("did/origination/famname").present? + # path.xpath("did/origination/famname").each do |source| + # fond_identifier = FondIdentifier.new + # fond_identifier.fond_id = fond.id + # fond_identifier.identifier = source.xpath("@identifier").text + # fond_identifier.identifier_source = "" + # fond_identifier.db_source = self.identifier + # fond_identifier.note = source.xpath("part").text + # fond_identifier.save + # end + #end + + def create_rel_creator_fond_from_origination(path, fond_id, fond_legacy_id, datetime) + if path.xpath("@identifier").present? + creator_legacy_id = path.xpath("@identifier").text + creator_ids = Creator.where(legacy_id: creator_legacy_id).ids + if creator_ids.present? + rel_creator_fond = RelCreatorFond.new + rel_creator_fond.creator_id = creator_ids.first + rel_creator_fond.fond_id = fond_id + rel_creator_fond.db_source = self.identifier + rel_creator_fond.legacy_creator_id = creator_legacy_id + rel_creator_fond.legacy_fond_id = fond_legacy_id + rel_creator_fond.created_at = datetime + rel_creator_fond.updated_at = datetime + rel_creator_fond.save! + end + end + end + + if path.xpath("did/origination").present? + path.xpath("did/origination/persname").each do |creator_name| + create_rel_creator_fond_from_origination(creator_name, fond.id, fond.legacy_id, datetime) + end + path.xpath("did/origination/corpname").each do |creator_name| + create_rel_creator_fond_from_origination(creator_name, fond.id, fond.legacy_id, datetime) + end + path.xpath("did/origination/famname").each do |creator_name| + create_rel_creator_fond_from_origination(creator_name, fond.id, fond.legacy_id, datetime) + end + end + + if path.xpath("relations/relation").present? + path.xpath("relations/relation").each do |relation| + if relation.xpath("@relationtype").text == "resourcerelation" + rel_fond_source = RelFondSource.new + source = Source.find_by(db_source: self.identifier, legacy_id: relation.xpath("@href").text) + if source.present? + Rails.logger.info "Risorsa fonte trovata '#{source.short_title}'" + rel_fond_source.fond_id = fond.id + rel_fond_source.source_id = source.id + rel_fond_source.db_source = self.identifier + rel_fond_source.legacy_source_id = source.legacy_id + rel_fond_source.legacy_fond_id = fond.legacy_id + rel_fond_source.save + + source_id = source.id + source_legacy_id = source.legacy_id + + Rails.logger.info "Relazione (legacy) Fonte #{rel_fond_source.legacy_source_id} -> Complesso #{rel_fond_source.legacy_fond_id} ricostruita." + else + Rails.logger.info "Risorsa fonte NON trovata '#{relation.xpath("@href").text}'" + source_new = Source.new + source_new.created_by = user_id + source_new.updated_by = user_id + source_new.group_id = group_id + source_new.created_at = datetime + source_new.updated_at = datetime + source_new.db_source = self.identifier + source_new.legacy_id = fond.legacy_id + if relation.xpath("relationentry/@localtype").text == "strumentoRicercaInterno" + source_new.source_type_code = 2 # strumento di corredo + else + source_new.source_type_code = 3 # fonte archivistica + end + title = relation.xpath("relationentry").text.squish + source_new.title = title + source_new.short_title = title.truncate(50, separator: /\s/) + if Source.where("short_title = '#{source_new.short_title.gsub(/'/, "''")}'").present? + source_new.sneaky_save + source_new.short_title << " - #{source_new.id.to_s}" + end + source_new.save! + + source_id = source_new.id + source_legacy_id = source_new.legacy_id + + fonte_url = relation.xpath("@href").text + if fonte_url.present? && fonte_url != "" + source_url = SourceUrl.new + source_url.url = fonte_url + source_url.source_id = source_new.id + source_url.save! + end + + Rails.logger.info "Risorsa fonte creata '#{source_new.title}'" + end + + rel_fond_source.fond_id = fond.id + rel_fond_source.source_id = source_id + rel_fond_source.db_source = self.identifier + rel_fond_source.legacy_source_id = source_legacy_id + rel_fond_source.legacy_fond_id = fond.legacy_id + rel_fond_source.save + + Rails.logger.info "Relazione (legacy) Fonte #{rel_fond_source.legacy_source_id} -> Complesso #{rel_fond_source.legacy_fond_id} ricostruita." + end + + if relation.xpath("@relationtype").text == "otherrelationtype" + tipo = relation.xpath("@otherrelationtype").text + title = relation.xpath("relationentry").text.squish + + if tipo == "BIBTEXT" || tipo == "BIBSBN" || tipo == "FONTETEXT" || tipo == "FONTEURI" + if tipo == "BIBSBN" || tipo == "FONTEURI" + fonte_url = relation.xpath("@href").text + if fonte_url.present? && fonte_url != "" + link = FondUrl .new + link.db_source = self.identifier + link.fond_id = fond.id + link.url = fonte_url + link.save + end + end + + if title.present? && title != "" + source_by_title = Source.find_by_title(title) + if source_by_title.nil? + source = Source.new + source.created_by = user_id + source.updated_by = user_id + source.group_id = group_id + source.created_at = datetime + source.updated_at = datetime + source.db_source = self.identifier + source.legacy_id = fond.legacy_id + if tipo == "BIBTEXT" || tipo == "BIBSBN" + source.source_type_code = 1 # bibliografia + elsif tipo == "FONTETEXT" || tipo == "FONTEURI" + source.source_type_code = 3 # fonte archivistica + end + source.title = title + source.short_title = title.truncate(50, separator: /\s/) + if Source.where("short_title = '#{source.short_title.gsub(/'/, "''")}'").present? + source.sneaky_save + source.short_title << " - #{source.id.to_s}" + end + source.save! + if tipo == "BIBSBN" || tipo == "FONTEURI" + fonte_url = relation.xpath("@href").text + if fonte_url.present? && fonte_url != "" + source_url = SourceUrl.new + source_url.url = fonte_url + source_url.source_id = source.id + source_url.save! + end + end + source_id = source.id + else + source_id = source_by_title.id + end + rel_fond_source = RelFondSource.new + rel_fond_source.fond_id = fond.id + rel_fond_source.source_id = source_id + rel_fond_source.save! + end + end + end + end + end + + + Rails.logger.info "Salvataggio complesso importato da import.rb > import_fond_from_path" + fond.save + Rails.logger.info "Salvataggio complesso COMPLETATO da import.rb > import_fond_from_path" + return fond + end + + #Per importare le informazioni presenti nella sezione "control" presente solo per il fondo di root + #path: xpath("ead/control") + def import_fond_control_field(path, fond_id) + if path.xpath("sources").present? + path.xpath("sources/source").each do |source| + fond_identifier = FondIdentifier.new + fond_identifier.fond_id = fond_id + fond_identifier.identifier = source.xpath("@id").text + fond_identifier.identifier_source = source.xpath("@href").text + fond_identifier.note = source.xpath("sourceentry").text + fond_identifier.save + end + end + end + + def import_icar_import(document, user_id, group_id) + @is_icar_import = true + + # 0) import schede anagrafiche: + document.xpath("//icar-import/listRecords/record/recordBody/eac-cpf").each do |anagraphic_root| + if anagraphic_root.xpath("cpfDescription/identity/entityType").present? + if anagraphic_root.xpath("cpfDescription/identity/entityType").text == "person" && + anagraphic_root.xpath("cpfDescription/identity/entityId/@localType").present? + returned_bundle = import_anagraphic anagraphic_root.xpath(".."), user_id, group_id + end + end + end + + # 5) import fonti relative ai vari complessi: + document.xpath("//icar-import/listRecords/record/recordBody/ead").each do |document_source_root| + if ((document_source_root.xpath("archdesc/did/*").size == 1) && + (document_source_root.xpath("archdesc/did/unittitle").text == "") && + !document_source_root.xpath("boolean(archdesc/dsc)")) + returned_bundle = import_source document_source_root.xpath(".."), user_id, group_id + + #returned_bundle[:legacy_fond_ids].each do |legacy_fond_id| + # rel_fond_source = RelFondSource.new + # fond = Fond.where(db_source: self.identifier, legacy_id: legacy_fond_id) + # if fond.present? + # rel_fond_source.fond_id = fond.first.id + # rel_fond_source.source_id = returned_bundle[:source_id] + # rel_fond_source.db_source = self.identifier + # rel_fond_source.legacy_source_id = Source.find(rel_fond_source.source_id).legacy_id + # rel_fond_source.legacy_fond_id = legacy_fond_id + # rel_fond_source.save + # Rails.logger.info "Relazione (legacy) Fonte #{rel_fond_source.legacy_source_id} -> Complesso #{rel_fond_source.legacy_fond_id} ricostruita." + # end + #end + + end + end + + # import produttori e creazione relaazioni con i complessi/fondi + document.xpath("//icar-import/listRecords/record/recordBody/eac-cpf").each do |creator_root| + if creator_root.xpath('cpfDescription/identity/@localType').text == 'soggettoProduttore' + returned_bundle = import_creator creator_root.xpath(".."), user_id, group_id + returned_bundle[:legacy_fond_ids].each do |legacy_fond_id| + rel_creator_fond = RelCreatorFond.new + rel_creator_fond.creator_id = returned_bundle[:creator_id] + fond = Fond.where(db_source: self.identifier, legacy_id: legacy_fond_id) + if fond.present? + rel_creator_fond.fond_id = fond.first.id + rel_creator_fond.db_source = self.identifier + rel_creator_fond.legacy_creator_id = Creator.find(rel_creator_fond.creator_id).legacy_id + rel_creator_fond.legacy_fond_id = legacy_fond_id + rel_creator_fond.save + Rails.logger.info "Relazione (legacy) Produttore #{rel_creator_fond.legacy_creator_id} -> Fondo #{legacy_fond_id} ricostruita." + end + end + end + end + + # 1.a) import complesso principale e relativi figli + # 1.b) import unita' relative ai complessi e relazione unita`-scheda anagrafica: + root_fond_id = nil + _document_fond_root = document.xpath("//icar-import/listRecords/record/recordBody/ead/archdesc") + _document_fond_root.each do |document_fond_root| + if ((document_fond_root.xpath("did/*").size == 1) && (document_fond_root.xpath("did/unittitle").text == "") && + !document_fond_root.xpath("boolean(dsc)")) + Rails.logger.info "Trovata fonte anziche` complesso" + else + root_fond_id = import_fond_hierarchy document_fond_root, user_id, group_id, "" + fonds_to_upload = Fond.where(db_source: self.identifier) + fonds_to_upload.each do |fond| + fond.units_count = fond.units.count + fond.sneaky_update + end + end + end + + # 1.c) import oggetti digitali relativi alle unita': + + # 2) import conservatori relativi al SOLO complesso principale: + document.xpath("//icar-import/listRecords/record/recordBody/scons").each do |custodian_root| + rel_custodian_fond = RelCustodianFond.new + rel_custodian_fond.custodian_id = (import_custodian custodian_root.xpath(".."), user_id, group_id)[:custodian_id] + rel_custodian_fond.fond_id = root_fond_id + rel_custodian_fond.db_source = self.identifier + rel_custodian_fond.legacy_custodian_id = Custodian.find(rel_custodian_fond.custodian_id).legacy_id + rel_custodian_fond.legacy_fond_id = Fond.find(root_fond_id).legacy_id + rel_custodian_fond.save + Rails.logger.info "Relazione (legacy) Conservatore #{rel_custodian_fond.legacy_custodian_id} -> Fondo #{rel_custodian_fond.legacy_fond_id} ricostruita." + end + + # 4) import profili istituzionali relativi ai produttori: + document.xpath("//icar-import/listRecords/record/recordBody/eac-cpf").each do |institution_root| + if institution_root.xpath('cpfDescription/identity/@localType') && institution_root.xpath('cpfDescription/identity/@localType').text == 'profiloIstituzionale' + returned_bundle = import_institution institution_root.xpath(".."), user_id, group_id + returned_bundle[:legacy_creator_ids].each do |legacy_creator_id| + rel_creator_institution = RelCreatorInstitution.new + creator = Creator.where(db_source: self.identifier, legacy_id: legacy_creator_id) + if creator.present? + rel_creator_institution.institution_id = returned_bundle[:institution_id] + rel_creator_institution.creator_id = creator.first.id + rel_creator_institution.db_source = self.identifier + rel_creator_institution.legacy_creator_id = legacy_creator_id + rel_creator_institution.legacy_institution_id = Institution.find(rel_creator_institution.institution_id).legacy_id + rel_creator_institution.save + Rails.logger.info "Relazione (legacy) Produttore #{rel_creator_institution.legacy_creator_id} -> Profilo istituzionale #{rel_creator_institution.legacy_institution_id} ricostruita." + end + end + end + end + + self.importable_id = root_fond_id + Rails.logger.info "ICAR-IMPORT relativo al complesso #{root_fond_id} completato -> Inizio salvataggio import " + end + + #import profilo istituzionale + #document Nokogiri::XML + #user_id utente che effettua l'import + #group_id gruppo dell'utente che effettua l'import + def import_institution(document, user_id, group_id) + institution = Institution.new + if document.xpath("eac-cpf/cpfDescription/identity/nameEntry/part").present? + institution.name = document.xpath("eac-cpf/cpfDescription/identity/nameEntry/part").first.text #denominazione + elsif document.xpath("eac-cpf/cpfDescription/identity/nameEntryParallel/nameEntry/part").present? + institution.name = document.xpath("eac-cpf/cpfDescription/identity/nameEntryParallel/nameEntry/part").first.text #denominazione + end + if document.xpath("eac-cpf/cpfDescription/description/biogHist/p").present? + institution.description = document.xpath("eac-cpf/cpfDescription/description/biogHist/p").first.text.squish #descrizione + end + + document.xpath("eac-cpf/cpfDescription/identity/nameEntryParallel/nameEntry").each do |nameEntry| + attr_name = nameEntry.xpath("name(@*)").squish + attr_value = nameEntry.xpath("@*").text.squish + if (attr_name.include? "lang") && (attr_value != "ita") + institution_description = institution.description.nil? ? "" : (institution.description + "\n") + institution.description = institution_description + "Denominazione parallela: " + nameEntry.xpath("part").text.squish + " [codice lingua: #{attr_value}]" + end + end + + document.xpath("eac-cpf/cpfDescription/description/localDescription").each do |localDescription| + if localDescription.xpath("@localType").text == "tipologiaEnte" + term = localDescription.xpath("term") + if term.present? && term.xpath("@vocabularySource").text == "http://dati.san.beniculturali.it/SAN/TesauroSAN/sottotipologia_ente" + institution_description = institution.description.nil? ? "" : (institution.description + "\n") + institution.description = institution_description + "Tipologia ente: " + term.text.squish + end + end + end + + document.xpath("eac-cpf/cpfDescription/description/legalStatuses").each do |legalStatuses| + term = legalStatuses.xpath("legalStatus/term") + if term.present? + institution_description = institution.description.nil? ? "" : (institution.description + "\n") + institution.description = institution_description + "Condizione giuridica: " + term.text.squish + end + end + + date_range = document.xpath("eac-cpf/cpfDescription/description/existDates/dateRange") + if date_range.present? && date_range.xpath("@localType").text == "data di esistenza" + exist_date = "-" + from_Date = date_range.xpath("fromDate") + to_Date = date_range.xpath("toDate") + if from_Date.present? + exist_date = from_Date.text.squish + exist_date + end + if to_Date.present? + exist_date = exist_date + to_Date.text.squish + end + if exist_date != "-" + institution_description = institution.description.nil? ? "" : (institution.description + "\n") + institution.description = institution_description + "Date di esistenza: " + exist_date + end + end + + # vale per: Sede, Giurisdizione, Ambito territoriale e altri tag place con figli placeRole e placeEntry presenti + document.xpath("eac-cpf/cpfDescription/description/place").each do |place| + placeRole = place.xpath("placeRole") + placeEntry = place.xpath("placeEntry") + if placeRole.present? && placeEntry.present? + institution_description = institution.description.nil? ? "" : (institution.description + "\n") + institution.description = institution_description + placeRole.text.squish.capitalize + ": " + placeEntry.text.squish + end + end + + document.xpath("eac-cpf/cpfDescription/relations").each do |relations| + # Profilo istituzionale associato + cpf_relation = relations.xpath("cpfRelation") + if cpf_relation.present? && cpf_relation.xpath("@cpfRelationType").text == "associative" + relation_entry = cpf_relation.xpath("relationEntry") + if relation_entry.present? && relation_entry.xpath("@localType").text == "profiloIstituzionale" + institution_description = institution.description.nil? ? "" : (institution.description + "\n") + institution.description = institution_description + "Profilo istituzionale associato: " + relation_entry.text.squish + end + end + + # Contesto Storico istituzionale e Ambito territoriale + relations.xpath("resourceRelation").each do |resourceRelation| + if resourceRelation.xpath("@resourceRelationType").text == "other" + relation_entry = resourceRelation.xpath("relationEntry") + if relation_entry.present? + case relation_entry.xpath("@localType").text + when "ambitoTerritoriale" + label = "Ambito territoriale: " + value = relation_entry.text.squish + institution_description = institution.description.nil? ? "" : (institution.description + "\n") + institution.description = institution_description + label + value + when "contestoStoricoIstituzionale" + label = "Contesto storico istituzionale: " + value = relation_entry.text.squish + institution_description = institution.description.nil? ? "" : (institution.description + "\n") + institution.description = institution_description + label + value + end + end + end + end + end + + institution.legacy_id = document.xpath("eac-cpf/control/recordId").text + institution.note = "" + institution.created_by = user_id + institution.updated_by = user_id + institution.group_id = group_id + institution.db_source = self.identifier + institution.save! + + self.importable_id = institution.id + + #compilatori + datetime = Time.now.strftime("%Y-%m-%d %H:%M:%S") + document.xpath("eac-cpf/control/maintenanceHistory/maintenanceEvent").each do |editor| + event_type = editor.xpath("eventType").first.text + event_datetime = "" + if editor.xpath("eventDateTime").present? + if editor.xpath("eventDateTime/@standardDateTime").present? + event_datetime = editor.xpath("eventDateTime/@standardDateTime").first.text + else + event_datetime = editor.xpath("eventDateTime").first.text + end + + end + agent_type = import_agent_type(editor.xpath("agentType").first.text) + agent = editor.xpath("agent").first.text + event_description_present = editor.xpath("boolean(eventDescription)") + + if ((event_type == "created") && (event_datetime == "") && (agent_type == "human") && (agent == "") && !event_description_present) + #ogni entità ha un evento di compilazione di default di questo tipo + # + # created + # + # human + # + # + #nell'import è ignorato + next + else + institution_editor = InstitutionEditor.new + institution_editor.institution_id = institution.id + institution_editor.name = agent + institution_editor.editing_type = import_editing_type(event_type) + institution_editor.qualifier = agent_type + if !event_datetime.empty? + institution_editor.edited_at = Date.parse(event_datetime) + end + institution_editor.created_at = datetime + institution_editor.updated_at = datetime + if event_description_present + institution_editor.qualifier = editor.xpath("eventDescription").first.text + end + institution_editor.save! + end + end + return_bundle = {institution_id: institution.id, legacy_creator_ids: Array.new} + # ripristina eventuali relazioni con dei produttori + if document.xpath("eac-cpf/cpfDescription/relations/cpfRelation/relationEntry[@localType='soggettoProduttore']").present? + Rails.logger.info "Associazione profilo istituzionale #{institution.id} al produttore" + document.xpath("eac-cpf/cpfDescription/relations/cpfRelation/relationEntry[@localType='soggettoProduttore']").each do |related_creator| + return_bundle[:legacy_creator_ids].push related_creator.text + Rails.logger.info "Associazione produttore con legacy_id #{related_creator.text}" + end + end + return return_bundle + end + + #import soggetto produttore + #document Nokogiri::XML + #user_id utente che effettua l'import + #group_id gruppo dell'utente che effettua l'import + def import_creator(document, user_id, group_id) + datetime = Time.now.strftime("%Y-%m-%d %H:%M:%S") + + creator = Creator.new + + localType = document.xpath("eac-cpf/cpfDescription/identity/entityType").first.text + if (localType == "corporateBody") + creator.creator_type = "C" #tipologia + + corporate_type = "" + if document.xpath("eac-cpf/cpfDescription/description/localDescription/term").present? + description = document.xpath("eac-cpf/cpfDescription/description/localDescription/term").first.text + case description + when "TesauroSAN/opera_pia-istituzione_ed_ente_assistenza_e_beneficenza_ospedale" + corporate_type = "ente di assistenza e beneficenza" + when "TesauroSAN/banca-istituto_di_credito-ente_assicurativo-ente_previdenziale" + corporate_type = "ente di credito, assicurativo, previdenziale" + when "TesauroSAN/accademia_ente_di_cultura" + corporate_type = "ente di cultura, ricreativo, sportivo, turistico" + when "TesauroSAN/ente_ricreativo-sportivo-turistico_sp" + corporate_type = "ente di cultura, ricreativo, sportivo, turistico" + when "TesauroSAN/scuola-ente_di_istruzione" + corporate_type = "ente di istruzione e ricerca" + when "TesauroSAN/universita-ente_di_ricerca" + corporate_type = "ente di istruzione e ricerca" + when "TesauroSAN/ente_culto_cattolico-associazione_cattolica" + corporate_type = "ente e associazione della chiesa cattolica" + when "TesauroSAN/ente_di_culto_acattolico-associazione_acattolica" + corporate_type = "ente e associazione di culto acattolico" + when "TesauroSAN/corporazione_religiosa" + corporate_type = "ente ecclesiastico" + when "TesauroSAN/ente_economico-impresa-studio_professionale_sp" + corporate_type = "ente economico / impresa" + #when "TesauroSAN/ente_territoriale_minore" + #corporate_type = "ente funzionale territoriale" + when "TesauroSAN/ente_territoriale_minore" + corporate_type = "ente pubblico territoriale" + when "TesauroSAN/ente_sanitario-ente_servizi_alla_persona" + corporate_type = "ente sanitario" + when "TesauroSAN/arte_ordine_collegio_associazione_di_categoria" + corporate_type = "ordine professionale, associazione di categoria" + when "TesauroSAN/organo_e_ufficio_statale_periferico_di_periodo_postunitario" + corporate_type = "organo periferico dello stato" + when "TesauroSAN/partito_e_movimento_politico-associazione_politica" + corporate_type = "partito politico, organizzazione sindacale" + when "TesauroSAN/organo_e_ufficio_statale_centrale_del_periodo_preunitario" + corporate_type = "preunitario" + when "TesauroSAN/regione-regione_a_statuto_speciale_sp" + corporate_type = "regione" + #when "TesauroSAN/statali" + #corporate_type = "organo giudiziario" + when "TesauroSAN/statali" + corporate_type = "stato" + + when "opera_pia-istituzione_ed_ente_assistenza_e_beneficenza_ospedale" + corporate_type = "ente di assistenza e beneficenza" + when "banca-istituto_di_credito-ente_assicurativo-ente_previdenziale" + corporate_type = "ente di credito, assicurativo, previdenziale" + when "accademia_ente_di_cultura" + corporate_type = "ente di cultura, ricreativo, sportivo, turistico" + when "ente_ricreativo-sportivo-turistico_sp" + corporate_type = "ente di cultura, ricreativo, sportivo, turistico" + when "scuola-ente_di_istruzione" + corporate_type = "ente di istruzione e ricerca" + when "universita-ente_di_ricerca" + corporate_type = "ente di istruzione e ricerca" + when "ente_culto_cattolico-associazione_cattolica" + corporate_type = "ente e associazione della chiesa cattolica" + when "ente_di_culto_acattolico-associazione_acattolica" + corporate_type = "ente e associazione di culto acattolico" + when "corporazione_religiosa" + corporate_type = "ente ecclesiastico" + when "ente_economico-impresa-studio_professionale_sp" + corporate_type = "ente economico / impresa" + #when "ente_territoriale_minore" + #corporate_type = "ente funzionale territoriale" + when "ente_territoriale_minore" + corporate_type = "ente pubblico territoriale" + when "ente_sanitario-ente_servizi_alla_persona" + corporate_type = "ente sanitario" + when "arte_ordine_collegio_associazione_di_categoria" + corporate_type = "ordine professionale, associazione di categoria" + when "organo_e_ufficio_statale_periferico_di_periodo_postunitario" + corporate_type = "organo periferico dello stato" + when "partito_e_movimento_politico-associazione_politica" + corporate_type = "partito politico, organizzazione sindacale" + when "organo_e_ufficio_statale_centrale_del_periodo_preunitario" + corporate_type = "preunitario" + when "regione-regione_a_statuto_speciale_sp" + corporate_type = "regione" + #when "statali" + #corporate_type = "organo giudiziario" + when "statali" + corporate_type = "stato" + end + + corporate_type_from_db = CreatorCorporateType.select(:id).where(:corporate_type => corporate_type) + if !corporate_type_from_db.empty? + creator.creator_corporate_type_id = corporate_type_from_db.first.id + end + end + elsif (localType == "person") + creator.creator_type = "P" + elsif (localType == "family") + creator.creator_type = "F" + end + + if document.xpath("eac-cpf/cpfDescription/description/biogHist/abstract").present? + creator.abstract = document.xpath("eac-cpf/cpfDescription/description/biogHist/abstract").first.text.squish + end + + if document.xpath("eac-cpf/cpfDescription/description/biogHist/p").present? + creator.history = document.xpath("eac-cpf/cpfDescription/description/biogHist/p").first.text.squish + end + + creator.legacy_id = document.xpath("eac-cpf/control/recordId").text + creator.db_source = self.identifier + creator.created_by = user_id + creator.updated_by = user_id + creator.group_id = group_id + creator.created_at = datetime + creator.updated_at = datetime + creator.sneaky_save! + self.importable_id = creator.id + + document.xpath("eac-cpf/cpfDescription/relations/resourceRelation").each do |resourceRelation| + if resourceRelation.xpath("relationEntry/@localType").text == "URI" + creator_url = CreatorUrl.new + creator_url.creator_id = creator.id + creator_url.url = resourceRelation.xpath("@href").text + creator_url.note = resourceRelation.xpath("relationEntry").text + creator_url.created_at = datetime + creator_url.updated_at = datetime + creator_url.save! + end + + if resourceRelation.xpath("@resourceRelationType").text == "creatorOf" && resourceRelation.xpath("relationEntry/@localType").text == "complesso" + creator_of_complesso = resourceRelation.xpath("relationEntry").text.squish + if creator_of_complesso[0..3] != "http" + fond_by_legacy_id = Fond.find_by_legacy_id(creator_of_complesso) + if !fond_by_legacy_id.nil? + rel_creator_fond = RelCreatorFond.new + rel_creator_fond.legacy_creator_id = creator.legacy_id + rel_creator_fond.legacy_fond_id = fond_by_legacy_id.legacy_id + rel_creator_fond.creator_id = creator.id + rel_creator_fond.fond_id = fond_by_legacy_id.id + rel_creator_fond.created_at = datetime + rel_creator_fond.updated_at = datetime + rel_creator_fond.save! + end + end + end + + if resourceRelation.xpath("relationEntry/@localType").text == "contestoStoricoIstituzionale" + if resourceRelation.xpath("relationEntry").text[0..3] != "http" + contesto_storico_istituzionale = "Contesto storico istituzionale: " + resourceRelation.xpath("relationEntry").text.squish + if creator.history.nil? + creator.history = contesto_storico_istituzionale + else + creator.history += ("\n" + contesto_storico_istituzionale) + end + else + creator_url = CreatorUrl.new + creator_url.creator_id = creator.id + creator_url.url = resourceRelation.xpath("relationEntry").text.squish + creator_url.note = "Contesto storico istituzionale" + creator_url.created_at = datetime + creator_url.updated_at = datetime + creator_url.save! + end + end + + if resourceRelation.xpath("relationEntry/@localType").text == "ambitoTerritoriale" + if resourceRelation.xpath("relationEntry").text[0..3] != "http" + ambito_territoriale = "Ambito territoriale: " + resourceRelation.xpath("relationEntry").text.squish + if creator.history.nil? + creator.history = ambito_territoriale + else + creator.history += ("\n" + ambito_territoriale) + end + else + creator_url = CreatorUrl.new + creator_url.creator_id = creator.id + creator_url.url = resourceRelation.xpath("relationEntry").text.squish + creator_url.note = "Ambito territoriale" + creator_url.created_at = datetime + creator_url.updated_at = datetime + creator_url.save! + end + end + end + + if document.xpath("eac-cpf/control/recordId").present? + creator_identifier = CreatorIdentifier.new + creator_identifier.creator_id = creator.id + creator_identifier.identifier = document.xpath("eac-cpf/control/recordId").text + creator_identifier.identifier_source = CGI.unescape(document.xpath("eac-cpf/control/recordId/@localType").text) + creator_identifier.note = "Identificativo di sistema" + creator_identifier.created_at = datetime + creator_identifier.updated_at = datetime + creator_identifier.save! + end + + document.xpath("eac-cpf/control/otherRecordId").each do |otherRecordId| + creator_identifier = CreatorIdentifier.new + creator_identifier.creator_id = creator.id + creator_identifier.identifier = otherRecordId.text + creator_identifier.identifier_source = CGI.unescape(otherRecordId.xpath("@localType").text) + creator_identifier.created_at = datetime + creator_identifier.updated_at = datetime + creator_identifier.save! + end + + document.xpath("eac-cpf/control/maintenanceHistory/maintenanceEvent").each do |editor| + event_type = editor.xpath("eventType").first.text + if editor.xpath("eventDateTime/@standardDateTime").present? + date_format = 'YMD' + event_datetime = editor.xpath("eventDateTime/@standardDateTime").first.text + if event_datetime.size == 4 + dateFormat = 'Y' + event_datetime << "-01-01" + elsif event_datetime.size == 7 + date_format = 'YM' + event_datetime << "-01" + end + else + event_datetime = editor.xpath("eventDateTime").first.text + end + agent_type = import_agent_type(editor.xpath("agentType").first.text) + agent = editor.xpath("agent").first.text + event_description_present = editor.xpath("boolean(eventDescription)") + + if ((event_type == "created") && (event_datetime == "") && (agent_type == "human") && (agent == "") && !event_description_present) + #ogni entità ha un evento di compilazione di default di questo tipo + # + # created + # + # human + # + # + #nell'import è ignorato + next + else + editor_model = CreatorEditor.new + editor_model.creator_id = creator.id + editor_model.name = agent + editor_model.editing_type = import_editing_type(event_type) + if !event_datetime.empty? + editor_model.edited_at = Date.parse(event_datetime) + end + editor_model.created_at = datetime + editor_model.updated_at = datetime + editor_model.qualifier = agent_type + #TODO creazione attributo per date_format. + editor_model.save! + end + end + + if creator.is_corporate? + if document.xpath("eac-cpf/cpfDescription/identity/nameEntryParallel").present? + #denominazione principale e denominazioni parallele + document.xpath("eac-cpf/cpfDescription/identity/nameEntryParallel/nameEntry").each do |nameEntry| + nameEntry_part = nameEntry.xpath("part").first + + creator_name = CreatorName.new + creator_name.creator_id = creator.id + creator_name.name = nameEntry_part.text + + if CreatorName.where(creator_id: creator.id).present? + #denominazione parallela + creator_name.preferred = false + creator_name.qualifier = "PA" + else + #denominazione principale (se e` la prima denominazione salvata). + creator_name.preferred = true + creator_name.qualifier = "A" + end + + begin + if nameEntry.xpath("@lang").present? + lang = nameEntry.xpath("@lang").text + elsif nameEntry.xpath("@xml:lang").present? + lang = nameEntry.xpath("@xml:lang").text + end + if lang.present? + creator_name.note = "codice lingua: " + lang + end + rescue + Rails.logger.info "sigla della lingua non trovata" + creator_name.note = "codice lingua: " + lang + end + + creator_name.created_at = datetime + creator_name.updated_at = datetime + creator_name.save! + end + + # altre denominazioni + #document.xpath("eac-cpf/cpfDescription/identity/nameEntry/part").each do |nameEntry| + # creator_name = CreatorName.new + # creator_name.creator_id = creator.id + # creator_name.name = nameEntry.text + # creator_name.preferred = false + # creator_name.qualifier = import_qualifer_type(nameEntry.xpath("@localType").text) + # creator_name.note = "" + # creator_name.created_at = datetime + # creator_name.updated_at = datetime + # creator_name.save! + #end + + else + #non sono presenti denominazioni parallele + preferred_name_already_set = false + document.xpath("eac-cpf/cpfDescription/identity/nameEntry/part").each do |nameEntry| + creator_name = CreatorName.new + creator_name.creator_id = creator.id + creator_name.name = nameEntry.text + if (nameEntry.xpath("boolean(@localType)") || preferred_name_already_set) + #altra denominazione + creator_name.preferred = false + creator_name.qualifier = import_qualifer_type(nameEntry.xpath("@localType").text) + else + #denominazione principale + creator_name.preferred = true + creator_name.qualifier = "A" + preferred_name_already_set = true + end + + creator_name.note = "" + + if nameEntry.xpath("../useDates/date").present? + creator_name_date = nameEntry.xpath("../useDates/date").text.squish + + if creator_name_date != "" + if !creator_name.name.nil? + if creator_name.name != "" + creator_name.name += " " + end + creator_name.name += "(" + creator_name_date + ")" + else + creator_name.name = "(" + creator_name_date + ")" + end + end + end + + creator_name.created_at = datetime + creator_name.updated_at = datetime + creator_name.save! + end + end + + document.xpath("eac-cpf/cpfDescription/description/legalStatuses/legalStatus").each do |legalStatus| + legalStatus_text = legalStatus.xpath("term").text + if legalStatus_text == "Pubblico" + legalStatus_id = "PU" + elsif legalStatus_text == "Privato" + legalStatus_id = "PR" + elsif legalStatus_text == "Ecclesiastico" + legalStatus_id = "EC" + else + legalStatus_id = "NA" + end + + creator_legal_status = CreatorLegalStatus.new + creator_legal_status.creator_id = creator.id + creator_legal_status.legal_status = legalStatus_id + creator_legal_status.created_at = datetime + creator_legal_status.updated_at = datetime + creator_legal_status.save! + end + + if document.xpath("eac-cpf/cpfDescription/description/existDates").present? + event = CreatorEvent.new + event.creator_id = creator.id + import_dateset(document.xpath("eac-cpf/cpfDescription/description/existDates").first, event, datetime) + + event.save! + end + + document.xpath("eac-cpf/cpfDescription/description/place").each do |place| + placerole_voc_src = place.xpath("placeRole/@vocabularySource").text + tipo_luogo_CPF_URL = "http://dati.san.beniculturali.it/SAN/TesauroSAN/Tipo_luogo_CPF" + placerole_tag = place.xpath("placeRole").text + if (placerole_voc_src != tipo_luogo_CPF_URL && placerole_tag == "Sede") || + (placerole_voc_src == tipo_luogo_CPF_URL && placerole_tag == "TesauroSAN/sede") + creator.residence = place.xpath("placeEntry").text.squish + end + end + elsif creator.is_person? + firstnameFound = false + lastnameFound = false + + creator_name = CreatorName.new + creator_name.creator_id = creator.id + if document.xpath("eac-cpf/cpfDescription/identity/nameEntry/part[@localType='nome']").present? + creator_name.first_name = document.xpath("eac-cpf/cpfDescription/identity/nameEntry/part[@localType='nome']").first.text + firstnameFound = true + end + + if document.xpath("eac-cpf/cpfDescription/identity/nameEntry/part[@localType='cognome']").present? + creator_name.last_name = document.xpath("eac-cpf/cpfDescription/identity/nameEntry/part[@localType='cognome']").first.text + lastnameFound = true + end + + if document.xpath("eac-cpf/cpfDescription/identity/nameEntry/part[@localType='denominazione']").present? || + document.xpath("eac-cpf/cpfDescription/identity/nameEntry/part[@localType='intestazione']").present? + #denominazione principale + if document.xpath("eac-cpf/cpfDescription/identity/nameEntry/part[@localType='denominazione']").present? + name = document.xpath("eac-cpf/cpfDescription/identity/nameEntry/part[@localType='denominazione']").first.text + else + name = document.xpath("eac-cpf/cpfDescription/identity/nameEntry/part[@localType='intestazione']").first.text + end + + creator_name.name = name + if name.include?(",") + name_parts = name.split(",") + if (!lastnameFound) + creator_name.last_name = name_parts[0].strip + end + if (!firstnameFound) + creator_name.first_name = name_parts[1].strip + end + else + if (!lastnameFound) + creator_name.last_name = name + end + if (!firstnameFound) + creator_name.first_name = "" + end + end + end + + if (!creator_name.name.empty?) + creator_name.preferred = true + creator_name.qualifier = "A" + creator_name.note = "" + creator_name.created_at = datetime + creator_name.updated_at = datetime + creator_name.save! + end + + document.xpath("eac-cpf/cpfDescription/identity/nameEntry/part").each do |nameEntry| + if (nameEntry.xpath("boolean(@localType)")) + if (nameEntry.xpath("@localType").text == "denominazione" || + #nameEntry.xpath("@localType").text == "intestazione" || + nameEntry.xpath("@localType").text == "cognome" || + nameEntry.xpath("@localType").text == "nome") + next + end + + creator_name = CreatorName.new + creator_name.creator_id = creator.id + + name = nameEntry.text + creator_name.name = name + #altra denominazione + creator_name.preferred = false + creator_name.qualifier = "OT" + + case nameEntry.xpath("@localType").text.downcase + when "intestazione" + creator_name.qualifier = "IN" + when "patronimico" + creator_name.qualifier = "PT" + when "soprannome" + creator_name.qualifier = "SN" + when "pseudonimo" + creator_name.qualifier = "AL" + when "alias" + creator_name.qualifier = "AL" + else + creator_name.note = nameEntry.xpath("@localType").text.downcase + end + + creator_name.created_at = datetime + creator_name.updated_at = datetime + creator_name.save! + end + end + + if (document.xpath("eac-cpf/cpfDescription/description/existDates").present? || document.xpath("eac-cpf/cpfDescription/description/place").present?) + event = CreatorEvent.new + event.creator_id = creator.id + + if document.xpath("eac-cpf/cpfDescription/description/existDates").present? + import_dateset(document.xpath("eac-cpf/cpfDescription/description/existDates").first, event, datetime) + end + + document.xpath("eac-cpf/cpfDescription/description/place").each do |place| + if (place.xpath("placeRole").text == "TesauroSAN/luogo di nascita") + event.start_date_place = place.xpath("placeEntry").text + elsif (place.xpath("placeRole").text == "TesauroSAN/luogo di morte") + event.end_date_place = place.xpath("placeEntry").text + end + end + + event.save! + end + elsif creator.is_family? + document.xpath("eac-cpf/cpfDescription/identity/nameEntry/part").each do |nameEntry| + creator_name = CreatorName.new + creator_name.creator_id = creator.id + creator_name.name = nameEntry.text + creator_name.note = "" + if (nameEntry.xpath("boolean(@localType)")) + #altra denominazione + creator_name.preferred = false + creator_name.qualifier = "OT" + + case nameEntry.xpath("@localType").text.downcase + when "intestazione" + creator_name.qualifier = "IN" + when "patronimico" + creator_name.qualifier = "PT" + when "soprannome" + creator_name.qualifier = "SN" + when "pseudonimo" + creator_name.qualifier = "AL" + when "alias" + creator_name.qualifier = "AL" + else + creator_name.note = nameEntry.xpath("@localType").text.downcase + end + else + #denominazione principale + creator_name.preferred = true + creator_name.qualifier = "A" + end + creator_name.created_at = datetime + creator_name.updated_at = datetime + creator_name.save! + end + + if document.xpath("eac-cpf/cpfDescription/description/existDates").present? + event = CreatorEvent.new + event.creator_id = creator.id + import_dateset(document.xpath("eac-cpf/cpfDescription/description/existDates").first, event, datetime) + + event.save! + end + end + + # Extra "Tipo_luogo" per tutti i tipi di produttore + document.xpath("eac-cpf/cpfDescription/description/place").each do |place| + if place.xpath("placeRole/@vocabularySource").text == "http://dati.san.beniculturali.it/SAN/TesauroSAN/Tipo_luogo_CPF" + creator_history = creator.history.nil? ? "" : (creator.history + "\n") + placeRole_text = place.xpath("placeRole").text + placEntry_label = placeRole_text.squish.capitalize + ": " + if (placeRole_text != "sede" && placeRole_text != "TesauroSAN/sede") || creator.residence.nil? + creator.history = creator_history + placEntry_label + place.xpath("placeEntry[count(@*)=0]").text.squish + end + end + end + + if document.xpath("eac-cpf/cpfDescription/relations/cpfRelation").present? && !@is_icar_import + Rails.logger.info "Sono presenti relazioni non ricostruibili per il produttore #{creator.id}" + if !creator.note.present? + #creator.note = "" + end + document.xpath("eac-cpf/cpfDescription/relations/cpfRelation").each do |relation| + if relation.xpath("relationEntry").text[0..3] == "http" + link = CreatorUrl.new + link.db_source = self.identifier + link.creator_id = creator.id + link.url = relation.xpath("relationEntry").text + link.note = relation.xpath("relationEntry/@localType").text + link.save + else + #creator.note += "#{relation.xpath("relationEntry/@localType").text}: #{relation.xpath("relationEntry").text}\n;" + end + end + end + + if document.xpath("eac-cpf/cpfDescription/relations/resourceRelation").present? && !@is_icar_import + Rails.logger.info "Sono presenti relazioni non ricostruibili per il produttore #{creator.id}" + + document.xpath("eac-cpf/cpfDescription/relations/resourceRelation").each do |relation| + if relation.xpath("relationEntry").text[0..3] == "http" + note = relation.xpath("relationEntry/@localType").text + if (note != "contestoStoricoIstituzionale" && note != "ambitoTerritoriale") + link = CreatorUrl.new + link.db_source = self.identifier + link.creator_id = creator.id + link.url = relation.xpath("relationEntry").text + link.note = note + link.save + end + end + + tipo = relation.xpath("relationEntry/@localType").text + if tipo == "BIBTEXT" || tipo == "BIBSBN" || tipo == "FONTEURI" || tipo == "FONTETEXT" + title = relation.xpath("relationEntry").text.squish + + if tipo == "BIBSBN" || tipo == "FONTEURI" + source_url = relation.xpath("@href").text + if source_url.present? && source_url != "" + link = CreatorUrl.new + link.db_source = self.identifier + link.creator_id = creator.id + link.url = source_url + link.save + end + end + + if title.present? && title != "" + source_by_title = Source.find_by_title(title) + if source_by_title.nil? + source = Source.new + datetime = Time.now.strftime("%Y-%m-%d %H:%M:%S") + source.created_by = user_id + source.updated_by = user_id + source.group_id = group_id + source.created_at = datetime + source.updated_at = datetime + source.db_source = self.identifier + source.legacy_id = document.xpath("eac-cpf/control/recordId").text + if tipo == "BIBTEXT" || tipo == "BIBSBN" + source.source_type_code = 1 # bibliografia + elsif tipo == "FONTETEXT" || tipo == "FONTEURI" + source.source_type_code = 3 # fonte archivistica + end + source.title = title + source.short_title = title.truncate(50, separator: /\s/) + if Source.where("short_title = '#{source.short_title.gsub(/'/, "''")}'").present? + source.sneaky_save + source.short_title << " - #{source.id.to_s}" + end + source.save! + if tipo == "BIBSBN" || tipo == "FONTEURI" + fonte_url = relation.xpath("@href").text + if fonte_url.present? && fonte_url != "" + source_url = SourceUrl.new + source_url.url = fonte_url + source_url.source_id = source.id + source_url.save! + end + end + source_id = source.id + else + source_id = source_by_title.id + end + rel_creator_source = RelCreatorSource.new + rel_creator_source.creator_id = creator.id + rel_creator_source.source_id = source_id + rel_creator_source.save! + end + end + end + end -# Upgrade 2.1.0 inizio - extend Sc2Restore -# Upgrade 2.1.0 fine + creator.save! + Rails.logger.info "Produttore #{creator.id} salvato" + + return_bundle = {creator_id: creator.id, legacy_fond_ids: Array.new} + # ripristina eventuali relazioni con dei complessi + if document.xpath("eac-cpf/cpfDescription/relations/resourceRelation/relationEntry[@localType='complesso']").present? + Rails.logger.info "Associazione complessi al produttore #{creator.id}" + document.xpath("eac-cpf/cpfDescription/relations/resourceRelation/relationEntry[@localType='complesso']").each do |related_fond| + return_bundle[:legacy_fond_ids].push related_fond.text + Rails.logger.info "Associazione complesso con legacy_id #{related_fond.text[3..10].to_i.to_s}" + end + end + + return return_bundle + end + + #import scheda anagrafica + #document Nokogiri::XML + #user_id utente che effettua l'import + #group_id gruppo dell'utente che effettua l'import + def import_anagraphic(document, user_id, group_id) + Rails.logger.info "import_anagraphic start" + Rails.logger.info document + datetime = Time.now.strftime("%Y-%m-%d %H:%M:%S") + + anagraphic = Anagraphic.new + + document.xpath("eac-cpf/cpfDescription/identity/nameEntry/part").each do |nameEntry| + if (nameEntry.xpath("@localType").text == "cognome") + anagraphic.surname = nameEntry.text + else + anagraphic.name = nameEntry.text + end + end + + if document.xpath("eac-cpf/cpfDescription/description/existDates/dateRange/fromDate").present? + anagraphic.start_date = document.xpath("eac-cpf/cpfDescription/description/existDates/dateRange/fromDate/@standardDate").first.text + end + + if document.xpath("eac-cpf/cpfDescription/description/existDates/dateRange/toDate").present? + anagraphic.end_date = document.xpath("eac-cpf/cpfDescription/description/existDates/dateRange/toDate/@standardDate").first.text + end + + document.xpath("eac-cpf/cpfDescription/description/place").each do |place| + if (place.xpath("placeRole").text == "TesauroSAN/luogo di nascita") + anagraphic.start_date_place = place.xpath("placeEntry").text + elsif (place.xpath("placeRole").text == "TesauroSAN/luogo di morte") + anagraphic.end_date_place = place.xpath("placeEntry").text + end + end + + anagraphic.legacy_id = document.xpath("eac-cpf/control/recordId").text + anagraphic.db_source = self.identifier + anagraphic.group_id = group_id + anagraphic.created_at = datetime + anagraphic.updated_at = datetime + anagraphic.sneaky_save! + + self.importable_id = anagraphic.id + + document.xpath("eac-cpf/control/otherRecordId").each do |otherRecordId| + anag_identifier = AnagIdentifier.new + anag_identifier.anagraphic_id = anagraphic.id + anag_identifier.identifier = otherRecordId.text + anag_identifier.qualifier = CGI.unescape(otherRecordId.xpath("@localType").text) + anag_identifier.created_at = datetime + anag_identifier.updated_at = datetime + anag_identifier.save! + end + + anagraphic.save + return_bundle = {anagraphic_id: anagraphic.id} + return return_bundle + end + + #import soggetti conservatore + #document Nokogiri::XML + #user_id utente che effettua l'import + #group_id gruppo dell'utente che effettua l'import + def import_custodian(document, user_id, group_id) + datetime = Time.now.strftime("%Y-%m-%d %H:%M:%S") + + custodian = Custodian.new + + custodian_type = "" + description = document.xpath("scons/tipologia").first.text + case description + when "TesauroSAN/archivio_di_Stato" + custodian_type = "stato" + when "TesauroSAN/regione-regione_a_statuto_speciale_conservatore" + custodian_type = "regione" + when "TesauroSAN/ente_territoriale" + custodian_type = "ente pubblico territoriale" + when "TesauroSAN/ente_diverso" + custodian_type = "ente funzionale territoriale" + when "TesauroSAN/ente_economico-impresa-studio_professionale_conservatore" + custodian_type = "ente economico / impresa" + when "TesauroSAN/istituto_di_credito" + custodian_type = "ente di credito, assicurativo, previdenziale" + when "TesauroSAN/ente_di_assistenza-beneficenza-previdenza-servizi_alla_persona" + custodian_type = "ente di assistenza e beneficenza" + when "TesauroSAN/ente_sanitario" + custodian_type = "ente sanitario" + when "TesauroSAN/ente_di_cultura-ente_di_ricerca" + custodian_type = "ente di istruzione e ricerca" + when "TesauroSAN/ente_ricreativo-sportivo-turistico_conservatore" + custodian_type = "ente di cultura, ricreativo, sportivo, turistico" + when "TesauroSAN/sindacato-organizzazione_sindacale_conservatore" + custodian_type = "partito politico, organizzazione sindacale" + when "TesauroSAN/arte-ordine-collegio-associazione_di_categoria" + custodian_type = "ordine professionale, associazione di categoria" + when "TesauroSAN/ente_e_associazione_di_culto_cattolico" + custodian_type = "ente e associazione della chiesa cattolica" + when "TesauroSAN/ente_e_associazione_di_culti_acattolici" + custodian_type = "ente e associazione di culto acattolico" + when "TesauroSAN/persona-famiglia" + custodian_type = "persona o famiglia" + + when "archivio_di_Stato" + custodian_type = "stato" + when "regione-regione_a_statuto_speciale_conservatore" + custodian_type = "regione" + when "ente_territoriale" + custodian_type = "ente pubblico territoriale" + when "ente_diverso" + custodian_type = "ente funzionale territoriale" + when "ente_economico-impresa-studio_professionale_conservatore" + custodian_type = "ente economico / impresa" + when "istituto_di_credito" + custodian_type = "ente di credito, assicurativo, previdenziale" + when "ente_di_assistenza-beneficenza-previdenza-servizi_alla_persona" + custodian_type = "ente di assistenza e beneficenza" + when "ente_sanitario" + custodian_type = "ente sanitario" + when "ente_di_cultura-ente_di_ricerca" + custodian_type = "ente di istruzione e ricerca" + when "ente_ricreativo-sportivo-turistico_conservatore" + custodian_type = "ente di cultura, ricreativo, sportivo, turistico" + when "sindacato-organizzazione_sindacale_conservatore" + custodian_type = "partito politico, organizzazione sindacale" + when "arte-ordine-collegio-associazione_di_categoria" + custodian_type = "ordine professionale, associazione di categoria" + when "ente_e_associazione_di_culto_cattolico" + custodian_type = "ente e associazione della chiesa cattolica" + when "ente_e_associazione_di_culti_acattolici" + custodian_type = "ente e associazione di culto acattolico" + when "persona-famiglia" + custodian_type = "persona o famiglia" + end + custodian_type_id = CustodianType.select(:id).where(:custodian_type => custodian_type).first.id + custodian.custodian_type_id = custodian_type_id + + if document.xpath("scons/descrizione").present? + custodian.history = document.xpath("scons/descrizione").text.gsub(/\t/, '') + end + + if document.xpath("scons/servizi").present? + custodian.services = document.xpath("scons/servizi").text + end + + custodian.accessibility = "" + custodian.legacy_id = document.xpath("scons/identificativi/identificativo").text + custodian.db_source = self.identifier + custodian.created_by = user_id + custodian.updated_by = user_id + custodian.group_id = group_id + custodian.created_at = datetime + custodian.updated_at = datetime + custodian.sneaky_save! + + self.importable_id = custodian.id + + denominazioni = document.xpath("scons/denominazione") + if (denominazioni.size == 1) + custodian_name = CustodianName.new + custodian_name.custodian_id = custodian.id + custodian_name.name = denominazioni.first.text + + if denominazioni.xpath("@data").text != "" + custodian_name.name += " (" + denominazioni.xpath("@data").text + ")" + end + + custodian_name.created_at = datetime + custodian_name.updated_at = datetime + custodian_name.preferred = true + custodian_name.qualifier = "OT" + + custodian_name.save! + else + preferred_found = false + denominazioni.each do |denominazione| + if denominazione.xpath("@qualifica").text == "principale" + preferred_found = true + break + end + end + + denominazioni.each do |denominazione| + custodian_name = CustodianName.new + custodian_name.custodian_id = custodian.id + custodian_name.name = denominazione.text + + if denominazione.xpath("@data").text != "" + custodian_name.name += " (" + denominazione.xpath("@data").text + ")" + end + + custodian_name.created_at = datetime + custodian_name.updated_at = datetime + + qualifica = denominazione.xpath("@qualifica").text + preferred = false + note = "" + if (!preferred_found || (qualifica == "principale")) + preferred_found = true + + preferred = true + qualifier = "OT" + elsif (qualifica == "altraDenominazione") + qualifier = "OT" + elsif (qualifica == "parallela") + qualifier = "PA" + lingua = "" + if denominazione.xpath("boolean(@lingua)") + lingua_xml = denominazione.xpath("@lingua").text + if lingua_xml == "nnn" + lingua = "" + else + lingua = lingua_xml + end + else + lingua = "" + end + if lingua != "" + note = "codice lingua: " + lingua + end + elsif (qualifica == "acronimo") + qualifier = "AC" + else + qualifier = "OT" + end + custodian_name.preferred = preferred + custodian_name.qualifier = qualifier + custodian_name.note = note + custodian_name.save! + end + end + + document.xpath("scons/relazioni/relazione").each do |relazione| + tipo = relazione.xpath("@tipo").text + if tipo == "URL" || tipo == "BIBSBN" || tipo == "FONTEURI" + custodian_url = CustodianUrl.new + custodian_url.custodian_id = custodian.id + custodian_url.url = relazione.xpath("@href").text + custodian_url.note = relazione.text.squish + custodian_url.created_at = datetime + custodian_url.updated_at = datetime + custodian_url.save! + end + + if tipo == "BIBTEXT" || tipo == "BIBSBN" || tipo == "FONTETEXT" || tipo == "FONTEURI" + title = relazione.text.squish + if title.present? && title != "" + source_by_title = Source.find_by_title(title) + if source_by_title.nil? + source = Source.new + source.created_by = user_id + source.updated_by = user_id + source.group_id = group_id + source.created_at = datetime + source.updated_at = datetime + source.db_source = self.identifier + source.legacy_id = custodian.legacy_id + if tipo == "BIBTEXT" || tipo == "BIBSBN" + source.source_type_code = 1 # bibliografia + elsif tipo == "FONTETEXT" || tipo == "FONTEURI" + source.source_type_code = 3 # fonte archivistica + end + source.title = title + source.short_title = title.truncate(50, separator: /\s/) + if Source.where("short_title = '#{source.short_title.gsub(/'/, "''")}'").present? + source.sneaky_save + source.short_title << " - #{source.id.to_s}" + end + source.save! + if tipo == "BIBSBN" || tipo == "FONTEURI" + fonte_url = relazione.xpath("@href").text + if fonte_url.present? && fonte_url != "" + source_url = SourceUrl.new + source_url.url = fonte_url + source_url.source_id = source.id + source_url.save! + end + end + source_id = source.id + else + source_id = source_by_title.id + end + rel_custodian_source = RelCustodianSource.new + rel_custodian_source.custodian_id = custodian.id + rel_custodian_source.source_id = source_id + rel_custodian_source.save! + end + end + end + + if document.xpath("scons/identificativi/identificativo").present? + custodian_identifier = CustodianIdentifier.new + custodian_identifier.custodian_id = custodian.id + custodian_identifier.identifier = document.xpath("scons/identificativi/identificativo").text + custodian_identifier.identifier_source = document.xpath("scons/identificativi/identificativo/@tipo").text + custodian_identifier.note = "Identificativo di sistema" + + #if document.xpath("scons/identificativi/identificativo/@href").present? + # custodian_identifier.note = document.xpath("scons/identificativi/identificativo/@href").text + #else + # custodian_identifier.note = "Identificativo di sistema" + #end + + custodian_identifier.created_at = datetime + custodian_identifier.updated_at = datetime + custodian_identifier.save! + end + + document.xpath("scons/identificativi/altroidentificativo").each do |altroidentificativo| + custodian_identifier = CustodianIdentifier.new + custodian_identifier.custodian_id = custodian.id + custodian_identifier.identifier = altroidentificativo.text + custodian_identifier.identifier_source = altroidentificativo.xpath("@tipo").text + custodian_identifier.note = "Altro identificativo" + + #if altroidentificativo.xpath("@href").present? + # custodian_identifier.note = altroidentificativo.xpath("@href").text + #else + # custodian_identifier.note = "Altro identificativo" + #end + + custodian_identifier.created_at = datetime + custodian_identifier.updated_at = datetime + custodian_identifier.save! + end + + principale_found = false + document.xpath("scons/localizzazioni/localizzazione").each do |localizzazione| + custodian_building = CustodianBuilding.new + custodian_building.custodian_id = custodian.id + custodian_building.name = localizzazione.xpath("denominazione").text + custodian_building.address = localizzazione.xpath("indirizzo/@denominazioneStradale").text + + if custodian_building.address == "" + custodian_building.address = localizzazione.xpath("indirizzo").text.squish + if localizzazione.xpath("indirizzo/@numeroCivico").present? + numero_civico = localizzazione.xpath("indirizzo/@numeroCivico").text + if numero_civico != "" + custodian_building.address += (" " + numero_civico) + end + end + end + + custodian_building.postcode = localizzazione.xpath("indirizzo/@cap").text + custodian_building.city = localizzazione.xpath("indirizzo/@comune").text + custodian_building.country = localizzazione.xpath("indirizzo/@paese").text + custodian_building.legacy_id = localizzazione.xpath("@identificativo").text + custodian_building.created_at = datetime + custodian_building.updated_at = datetime + + custodian_building_type = "" + if (localizzazione.xpath("@consultazione").text == "S") + custodian_building_type = "sede di consultazione" + end + custodian_building.custodian_building_type = custodian_building_type + + custodian_building.save! + + localizzazione.xpath("contatto").each do |contatto| + custodian_contact = CustodianContact.new + custodian_contact.custodian_id = custodian.id + custodian_contact.contact = contatto.text + custodian_contact.contact_note = custodian_building.name; + custodian_contact.created_at = datetime + custodian_contact.updated_at = datetime + + if (contatto.xpath("@tipo").text == "telefono") + contact_type = "tel" + elsif (contatto.xpath("@tipo").text == "mail") + contact_type = "email" + elsif (contatto.xpath("@tipo").text == "pec") + contact_type = "pec" + elsif (contatto.xpath("@tipo").text == "fax") + contact_type = "fax" + elsif (contatto.xpath("@tipo").text == "sitoweb") + contact_type = "web" + end + custodian_contact.contact_type = contact_type + + custodian_contact.save! + end + + if localizzazione.xpath("boolean(orario)") + if !custodian.accessibility.empty? + custodian.accessibility += "\n\n" + end + custodian.accessibility += "Orari Sede " + custodian_building.name + " - " + localizzazione.xpath("orario").text.squish + end + + if localizzazione.xpath("boolean(accesso)") + if !custodian.accessibility.empty? + custodian.accessibility += "\n" + end + custodian.accessibility += "Accesso Sede " + custodian_building.name + " - " + localizzazione.xpath("accesso").text.squish + end + + if ((localizzazione.xpath("@principale").text == "S") && !principale_found) + principale_found = true + + legal_status = nil + privato = localizzazione.xpath("@privato").text + if (privato == "S") + legal_status = "PR" + elsif (privato == "N") + legal_status = "PU" + end + custodian.legal_status = legal_status + end + end + + document.xpath("scons/info/evento").each do |evento| + custodian_editor = CustodianEditor.new + custodian_editor.custodian_id = custodian.id + custodian_editor.created_at = datetime + custodian_editor.updated_at = datetime + + name = "" + if evento.xpath("boolean(agente/nome)") + name = evento.xpath("agente/nome").first.text + end + if evento.xpath("boolean(agente/cognome)") + if !name.empty? + name += " " + end + name += evento.xpath("agente/cognome").first.text + end + if evento.xpath("boolean(agente/denominazione)") + name = evento.xpath("agente/denominazione").first.text + end + custodian_editor.name = name + + if evento.xpath("agente/@tipo").present? + custodian_editor.qualifier = evento.xpath("agente/@tipo").first.text + end + + date_str = evento.xpath("@dataEvento").first.text + if !date_str.empty? + date_time = DateTime::strptime(date_str, "%Y-%m-%dT%H:%M:%S") + custodian_editor.edited_at = date_time.strftime("%Y-%m-%d") + end + + editing_type = "" + xml_editing_type = evento.xpath("@tipoEvento").first.text + if (xml_editing_type == "creazione") + editing_type = "inserimento dati" + elsif (xml_editing_type == "modifica") + editing_type = "aggiornamento scheda" + elsif (xml_editing_type == "cancellazione") + editing_type = "aggiornamento scheda" + elsif (xml_editing_type == "altro") + editing_type = "schedatura" + end + custodian_editor.editing_type = editing_type + + custodian_editor.save! + end + + custodian.save! + + return_bundle = {custodian_id: custodian.id} + return return_bundle + end + + #import fonti archivistiche + #document Nokogiri::XML + #user_id utente che effettua l'import + #group_id gruppo dell'utente che effettua l'import + def import_source(document, user_id, group_id) + source = Source.new + datetime = Time.now.strftime("%Y-%m-%d %H:%M:%S") + + source.created_by = user_id + source.updated_by = user_id + source.group_id = group_id + source.created_at = datetime + source.updated_at = datetime + source.db_source = self.identifier + source.legacy_id = document.xpath("ead/control/recordid").text + source.title = nil + document.xpath("ead/control/filedesc/titlestmt/titleproper").each do |title| + if source.title.nil? + if title.xpath("@lang").present? + source.title = "[#{title.xpath("@lang").text}: #{title.text}]\n\n" + else + source.title = "[#{title.text}]\n" + end + else + source.title += "[#{title.xpath("@lang").text}: #{title.text}]\n" + end + end + + source_Curator = document.xpath('ead/control/filedesc/titlestmt/author[@localtype="Curator"]') + source_curatore = document.xpath('ead/control/filedesc/titlestmt/author[@localtype="curatore"]') + source_author = document.xpath('ead/control/filedesc/titlestmt/author') + + if source_Curator.present? + source.editor = source_Curator.text.squish + elsif source_curatore.present? + source.editor = source_curatore.text.squish + elsif source_author.present? + source.author = source_author.text.squish + end + + source.publisher = document.xpath('ead/control/filedesc/publicationstmt/publisher').text + source.place = document.xpath('ead/control/filedesc/publicationstmt/address/addressline').text + + document.xpath("ead/control/filedesc/notestmt/controlnote").each do |controlnote| + if controlnote.xpath("p").present? + control_note = controlnote.xpath("p").text.squish + if control_note != "" + if !source.abstract.nil? && source.abstract != "" + source.abstract += "\n" + control_note + else + source.abstract = control_note + end + end + end + end + + compilatori = "" + if document.xpath("ead/control/maintenancehistory/maintenanceevent").present? + document.xpath("ead/control/maintenancehistory/maintenanceevent").each do |maintenance_event| + + tipo_evento = "" + data_evento = "" + tipo_agente = "" + nome_agente = "" + descrizione_evento = "" + + if maintenance_event.xpath("eventtype").present? + tipo_evento = maintenance_event.xpath("eventtype").text.squish + end + + if maintenance_event.xpath("eventdatetime").present? + data_evento = maintenance_event.xpath("eventdatetime").text.squish + end + + if maintenance_event.xpath("agenttype/@value").present? + tipo_agente = import_agent_type(maintenance_event.xpath("agenttype/@value").text) + end + + if maintenance_event.xpath("agent").present? + nome_agente = maintenance_event.xpath("agent").text.squish + end + + if maintenance_event.xpath("eventdescription").present? + descrizione_evento = maintenance_event.xpath("eventdescription").text.squish + end + + evento = "" + if nome_agente != "" || tipo_agente != "" + evento += "Compilatore: " + nome_agente + if tipo_agente != "" + if nome_agente != "" + evento += " " + end + evento += "(" + tipo_agente + ")" + end + evento += "\n" + end + + if data_evento != "" + evento += "Data intervento: " + data_evento + "\n" + end + + if tipo_evento != "" + evento += "Tipo intervento: " + tipo_evento + "\n" + end + + if descrizione_evento != "" + evento += "Descrizione evento: " + descrizione_evento + "\n" + end + + if evento != "" + evento = "\n" + evento + end + + compilatori += evento + end + + if compilatori != "" + compilatori = "COMPILATORI:\n" + compilatori + end + end + + if !source.abstract.nil? && source.abstract != "" + source.abstract += "\n\n" + compilatori + else + source.abstract = compilatori + end + + source_type = SourceType.where("source_types.source_type = ?", document.xpath('ead/control/filedesc/editionstmt/edition[@localtype="typology"]').text.downcase).first + if !source_type.present? + Rails.logger.info("Nessun source_type corrispondente alla tipologia indicata in: \n ead/control/filedesc/editionstmt/edition[@localtype='typology'], e` stato assegnato 'fonte archivistica' di default ") + source.source_type_code = 2 + else + if source_type.parent_code.nil? + source.source_type_code = source_type.code + else + source.source_type_code = source_type.parent_code + source.source_subtype_code = source_type.code + end + end + if document.xpath('ead/control/filedesc/editionstmt/edition[@localtype="published"]').text == 'no' + source.finding_aid_published = 0 + else + source.finding_aid_published = 1 + end + + if document.xpath("ead/control/filedesc/publicationstmt/date").present? + source.date_string = document.xpath("ead/control/filedesc/publicationstmt/date").text + end + + document.xpath("ead/control/otherrecordid").each do |other_record_id| + if (!source.legacy_description.nil? && source.legacy_description != "") + source.legacy_description += " " + other_record_id.text.squish + else + source.legacy_description = other_record_id.text.squish + end + end + + source.sneaky_save + + source.short_title = document.xpath("ead/control/filedesc/titlestmt/titleproper").text.truncate(50, separator: /\s/) + if Source.where("short_title = '#{source.short_title.gsub(/'/, "''")}'").present? + source.short_title << " - #{source.id.to_s}" + end + Rails.logger.info "Import: Salvataggio sorgente #{source.id}" + + source.save! + Rails.logger.info "Import: sorgente salvata" + + + i = 0 + until document.xpath("ead/control/representation")[i].nil? do + source_url = SourceUrl.new + source_url.note = document.xpath("ead/control/representation")[i].text + source_url.url = document.xpath("ead/control/representation/@href")[i].value + source_url.source_id = source.id + source_url.save! + i = i +1 + end + + document.xpath("ead/control/sources/source").each do |xmlSourceUrl| + if xmlSourceUrl.xpath("@href").present? + source_url = SourceUrl.new + source_url.url = xmlSourceUrl.xpath("@href").first.text + if xmlSourceUrl.xpath("sourceentry").present? + source_url.note = xmlSourceUrl.xpath("sourceentry").first.text + end + source_url.source_id = source.id + source_url.save! + end + end + + self.importable_id = source.id + + return_bundle = {source_id: source.id, legacy_fond_ids: Array.new} + + #if document.xpath("ead/control/localcontrol/term").present? + # document.xpath("ead/control/localcontrol/term/@identifier").each do |related_fond| + # Rails.logger.info "Associazione fonti a complessi" + # return_bundle[:legacy_fond_ids].push related_fond.text + # Rails.logger.info "Associazione complesso con legacy_id #{related_fond.text}" + # end + #end + + return return_bundle + end + + #import complessi archivistici + #document Nokogiri::XML + #user_id utente che effettua l'import + #group_id gruppo dell'utente che effettua l'import + def import_fond(document, user_id, group_id) + Rails.logger.info "Inizio importazione complesso da import.rb" + datetime = Time.now.strftime("%Y-%m-%d %H:%M:%S") + + fond = Fond.new + + fond_type = "" + level = document.xpath("archdesc/@level").first.text + if level == 'otherlevel' + level = path.xpath("archdesc/@otherlevel").text + end + fond_type = import_level_type(level) + + #fond_type = "sottosezione" + #when "otherlevel" + #fond_type = "categoria" + #when "otherlevel" + #fond_type = "classe" + #when "otherlevel" + #fond_type = "sottoclasse" + #when "otherlevel" + #fond_type = "rubrica" + #when "otherlevel" + #fond_type = "voce" + #when "otherlevel" + #fond_type = "sottovoce" + #when "otherlevel" + #fond_type = "titolo" + #when "otherlevel" + #fond_type = "sottotitolo" + #when "otherlevel" + #fond_type = "articolo" + # + fond.fond_type = fond_type + + #solo la prima Denominazione è considerata come principale + + document.xpath("//ead/archdesc/did/unittitle").each do |title| + if title.xpath('@localtype').text.downcase == "denominazione" + fond.name = title.text + end + end + + puts fond.inspect + puts fond + + fond.legacy_id = document.xpath("did/unitid").text.squish + fond.db_source = self.identifier + fond.created_by = user_id + fond.updated_by = user_id + fond.group_id = group_id + fond.created_at = datetime + fond.updated_at = datetime + + if document.xpath("//ead/archdesc/accessrestrict").present? + fond.access_condition = document.xpath("//ead/archdesc/accessrestrict").first.text + fond.access_condition_note = document.xpath("//ead/archdesc/accessrestrict/p").first.text + end + fond.published = false + if document.xpath("//ead/archdesc/processinfo/p").first.text.downcase == "pubblicata" + fond.published = true + end + + fond.history = document.xpath("//ead/archdesc/custodhist/p").text.squish + fond.length = document.xpath("//ead/archdesc/did/physdescstructured/quantity").text + #fond.extent = document.xpath("//ead/archdesc/did/physdescstructured/descriptivenote/p").text + fond.extent = document.xpath("//ead/archdesc/did/physdesc").text.squish + fond.description = document.xpath("//ead/archdesc/scopecontent/p").text.squish + fond.arrangement_note = document.xpath("//ead/archdesc/scopecontent/p").text.squish + + fond.sneaky_save! + + self.importable_id = fond.id + + if document.xpath("//ead/archdesc/processinfo/processinfo/p").present? + document.xpath("//ead/archdesc/processinfo[@localtype='compilatori']/processinfo[@localtype='compilatore']").each do |pi| + editor = FondEditor.new + editor.fond_id = fond.id + editor.name = pi.xpath("p/persname/part[@localtype='compilatore']").text + editor.qualifier = pi.xpath("p/persname/part[@localtype='qualifica']").text + tipo_intervento = pi.xpath("p/persname/part[@localtype='tipoIntervento']").text + if tipo_intervento == "inserimento" || tipo_intervento == "created" + editor.editing_type = "inserimento dati" + elsif tipo_intervento == "modifica" || tipo_intervento == "updated" + editor.editing_type = "aggiornamento scheda" + end + editor.edited_at = Date.parse pi.xpath("p/date").text + editor.save! + end + end + + puts fond.inspect + puts fond + + if document.xpath("//ead/archdesc/controlaccess/genreform").present? + document.xpath("//ead/archdesc/controlaccess/genreform").each do |fond_document| + rel__f_d = RelFondDocumentForm.new + rel__f_d.name = fond_document.xpath("part[@localtype='denominazione']").first.text.squish + rel__f_d.description = fond_document.xpath("part[@localtype='descrizione']").first.text.squish + rel__f_d.note = fond_document.xpath("part[@localtype='note']").first.text.squish + if DocumentForm.where("document_forms.name = ?", rel__f_d.name).first.present? + rel__f_d.document_form_id = DocumentForm.where("document_forms.name = ?", rel__f_d.name).first[:id] + rel__f_d.fond_id = fond.id + rel__f_d.save! + else + puts("Nessun DocumentForm trovato con il nome inserito. Non e' stato aggiunto alcun record del tipo 'RelFondDocumentForm'") + end + end + end + + #altre denominazioni + document.xpath("//ead/archdesc/did/unittitle").each do |unittitle| + if (unittitle.text != fond.name) + fond_name = FondName.new + fond_name.fond_id = fond.id + fond_name.name = unittitle.text + fond_name.created_at = datetime + fond_name.updated_at = datetime + fond_name.qualifier = "O" + fond_name.note = "" + if unittitle.xpath("@localtype").text == "denominazioneParallela" + fond_name.note = "Denominazione parallela;" + end + if unittitle.xpath("@lang").text.present? + fond_name.note += " Codice lingua: " + unittitle.xpath("@lang").text + end + fond_name.save! + end + end + + if document.xpath("boolean(//ead/archdesc/did/unitdatestructured/dateset)") + event = FondEvent.new + event.fond_id = fond.id + import_dateset(document.xpath("//ead/archdesc/did/unitdatestructured/dateset").first, event, datetime) + end + Rails.logger.info "Salvataggio complesso importato da import.rb > import_fond" + fond.save + Rails.logger.info "Salvataggio complesso COMPLETATO da import.rb > import_fond" + end + + #import unità archivistiche + #document Nokogiri::XML + #user_id utente che effettua l'import + #group_id gruppo dell'utente che effettua l'import + def import_unit(document, user_id, group_id) + root_unit_path = document.xpath("ead/archdesc/dsc/c") + + #La parte commentata serve ad importare la gerarchia delle unita in un fondo esistente nel db. + #fond_id = document.xpath("ead/control/recordid").text.to_i + #Rails.logger.info "Le unita' del file verranno importate nel complesso #{fond_id} del database, se presente" + #if Fond.exists?(fond_id) + # Rails.logger.info "complesso archivistico con id: #{fond_id} presente" + # fond = Fond.find(fond_id) + # if fond.ancestry == nil + # root_fond_id = fond_id + # else + # root_fond_id = fond.ancestry.root.id + # end + # import_unit_hierarchy root_unit_path, root_fond_id, fond_id, user_id, group_id, nil + #else + # Rails.logger.info "Complesso con id #{fond_id} non presente nel database, ne verra' creato uno nuovo per contenere le unita'" + + Rails.logger.info "Verra` importata la gerarchia dei complessi con le loro unita`" + self.importable_id = import_fond_hierarchy document.xpath("ead/archdesc"), user_id, group_id, '' + #end + root_unit = Unit.where(db_source: self.identifier, legacy_id: root_unit_path.xpath("did/unitid/@identifier").text).first + #self.importable_id = root_unit.id + Rails.logger.info "Unita' salvate a partire dalla radice #{root_unit_path.xpath("did/unitid/@identifier").text}, ora rappresentata dall'id #{self.importable_id}" + end + + #mapping tipologia di intervento + def import_editing_type(event_type) + editing_type = "" + + if event_type == "created" || event_type == "derived" + editing_type = "inserimento dati" + elsif event_type == "updated" + editing_type = "aggiornamento scheda" + elsif event_type == "revised" + editing_type = "revisione" + end + + return editing_type + end + + def import_agent_type(agent_type) + if agent_type == 'human' + 'persona' + elsif agent_type == 'machine' + 'software' + else + agent_type + end + end + + #mapping qualifica altra denominazione + def import_qualifer_type(localType) + qualifier = "" + + if localType == "altraDenominazione" + qualifier = "OT" + elsif localType == "acronimo" + qualifier = "AC" + else + qualifier = "OT" + end + + return qualifier + end + + def import_level_type(level) + case level + when "fonds" + "fondo" + when "recordgrp" + "complesso di fondi" + when "subfonds" + "sezione" + when "series" + "serie" + when "subseries" + "sottoserie" + when "subsubseries" + "sottosottoserie" + else + level + end + end - attr_accessor :imported_file_version -# Upgrade 2.2.0 inizio - attr_accessor :ref_fond_id, :ref_root_fond_id -# Upgrade 2.2.0 fine + #estrae la datazione dall'xml del tracciato EAD3 e la salva sul database + def import_dateset(dateset, event, datetime) + Rails.logger.info "inizio funzione import_dateset()" + event.preferred = true + event.is_valid = true + event.created_at = datetime + event.updated_at = datetime - TMP_IMPORTS = "#{Rails.root}/tmp/imports" -# Upgrade 3.0.0 inizio - PUBLIC_IMPORTS = "#{Rails.root}/public/imports" -# Upgrade 3.0.0 fine - DIGITAL_FOLDER_PATH = "#{Rails.root}/public/digital_objects" + d = extract_archidate(dateset) - belongs_to :user - belongs_to :importable, :polymorphic => true + event.start_date_display = d[:start_date_display] + event.start_date_from = d[:start_date_from] + event.start_date_to = d[:start_date_to] + event.start_date_format = d[:start_date_format] + event.start_date_spec = d[:start_date_spec] + event.start_date_valid = d[:start_date_valid] - has_attached_file :data, :path => ":rails_root/public/imports/:id/:basename.:extension" + event.end_date_display = d[:end_date_display] + event.end_date_from = d[:end_date_from] + event.end_date_to = d[:end_date_to] + event.end_date_format = d[:end_date_format] + event.end_date_spec = d[:end_date_spec] + event.end_date_valid = d[:end_date_valid] - before_create :sanitize_file_name - validates_attachment_presence :data -# Upgrade 2.0.0 inizio - do_not_validate_attachment_file_type :data -# Upgrade 2.0.0 fine + event.note = d[:note] - def ar_connection -# Upgrade 2.0.0 inizio -# ActiveRecord::Base.connection - self.class.connection -# Upgrade 2.0.0 fine + Rails.logger.info "fine funzione import_dateset(), salvataggio..." + Rails.logger.info "XML - [ #{dateset.text} \n Data = #{event.inspect}]" + event.sneaky_save + Rails.logger.info("...dateset salvato.") end - def adapter - ar_connection.adapter_name.downcase - end + def extract_archidate(xml_item) + Rails.logger.info xml_item + ret = {} -# Upgrade 3.0.0 inizio - def csv_data_file - PUBLIC_IMPORTS + "/#{self.id}/#{self.data_file_name}" - end -# Upgrade 3.0.0 fine + #Estremo cronologico iniziale uguale a estremo cronologico finale + if xml_item.xpath("datesingle[not(@localtype)]").present? || xml_item.xpath("dateSingle[not(@localtype)]").present? + single_date = {} + if xml_item.xpath("datesingle[not(@localtype)]").present? + single_date = extract_singledate(xml_item.xpath("datesingle[not(@localtype)]").first, true) + end + if xml_item.xpath("dateSingle[not(@localtype)]").present? + single_date = extract_singledate(xml_item.xpath("dateSingle[not(@localtype)]").first, true) + end + ret[:start_date_from] = single_date[:date_from] + ret[:start_date_to] = single_date[:date_to] + ret[:start_date_display] = single_date[:date_display] + ret[:start_date_format] = single_date[:date_format] + ret[:start_date_spec] = single_date[:date_spec] + ret[:start_date_valid] = single_date[:date_valid] - def data_file - TMP_IMPORTS + "/#{self.id}_data.json" - end + if xml_item.xpath("datesingle[not(@localtype)]").present? + single_date = extract_singledate(xml_item.xpath("datesingle[not(@localtype)]").first, false, true) + end + if xml_item.xpath("dateSingle[not(@localtype)]").present? + single_date = extract_singledate(xml_item.xpath("dateSingle[not(@localtype)]").first, false, true) + end + ret[:end_date_from] = single_date[:date_from] + ret[:end_date_to] = single_date[:date_to] + ret[:end_date_display] = single_date[:date_display] + ret[:end_date_format] = single_date[:date_format] + ret[:end_date_spec] = single_date[:date_spec] + ret[:end_date_valid] = single_date[:date_valid] + end - def metadata_file - TMP_IMPORTS + "/#{self.id}_metadata.json" - end + #Estremo cronologico iniziale diverso da estremo cronologico finale + if xml_item.xpath("daterange").present? || xml_item.xpath("dateRange").present? + single_date = {} + if (xml_item.xpath("daterange").present?) + single_date = extract_singledate(xml_item.xpath("daterange/fromdate").first, true) + end + if (xml_item.xpath("dateRange").present?) + single_date = extract_singledate(xml_item.xpath("dateRange/fromDate").first, true) + end - def delete_tmp_files - File.delete(data_file) if File.exists?(data_file) - File.delete(metadata_file) if File.exists?(metadata_file) - end + ret[:start_date_from] = single_date[:date_from] + ret[:start_date_to] = single_date[:date_to] + ret[:start_date_display] = single_date[:date_display] + ret[:start_date_format] = single_date[:date_format] + ret[:start_date_spec] = single_date[:date_spec] + ret[:start_date_valid] = single_date[:date_valid] - def delete_digital_folder(folder) - if Dir.exists?(DIGITAL_FOLDER_PATH + "/" + folder) - FileUtils.remove_dir(DIGITAL_FOLDER_PATH + "/" + folder) + if (xml_item.xpath("daterange").present?) + single_date = extract_singledate(xml_item.xpath("daterange/todate").first, false) + end + if (xml_item.xpath("dateRange").present?) + single_date = extract_singledate(xml_item.xpath("dateRange/toDate").first, false) + end + ret[:end_date_from] = single_date[:date_from] + ret[:end_date_to] = single_date[:date_to] + ret[:end_date_display] = single_date[:date_display] + ret[:end_date_format] = single_date[:date_format] + ret[:end_date_spec] = single_date[:date_spec] + ret[:end_date_valid] = single_date[:date_valid] end - end - def db_has_subunits? - Unit.exists?(["db_source = ? AND ancestry_depth > 0", self.identifier]) + #Gestione per existDates eac-cpf + if xml_item.xpath("date").present? + single_date = extract_singledate(xml_item.xpath("date").first, true) + + ret[:start_date_from] = single_date[:date_from] + ret[:start_date_to] = single_date[:date_to] + ret[:start_date_display] = single_date[:date_display] + ret[:start_date_format] = single_date[:date_format] + ret[:start_date_spec] = single_date[:date_spec] + ret[:start_date_valid] = single_date[:date_valid] + + single_date = extract_singledate(xml_item.xpath("date").first, false, true) + + ret[:end_date_from] = single_date[:date_from] + ret[:end_date_to] = single_date[:date_to] + ret[:end_date_display] = single_date[:date_display] + ret[:end_date_format] = single_date[:date_format] + ret[:end_date_spec] = single_date[:date_spec] + ret[:end_date_valid] = single_date[:date_valid] + end + + #Gestione note alla data + if xml_item.xpath("datesingle[@localtype='noteAllaData']").present? + ret[:note] = xml_item.xpath("datesingle[@localtype='noteAllaData']").first.text.gsub(/\t/, '') + + elsif xml_item.xpath("dateSingle[@localtype='noteAllaData']").present? + ret[:note] = xml_item.xpath("dateSingle[@localtype='noteAllaData']").first.text.gsub(/\t/, '') + + elsif xml_item.xpath("datesingle[@localtype='notealladata']").present? + ret[:note] = xml_item.xpath("datesingle[@localtype='notealladata']").first.text.gsub(/\t/, '') + + elsif xml_item.xpath("dateSingle[@localtype='notealladata']").present? + ret[:note] = xml_item.xpath("dateSingle[@localtype='notealladata']").first.text.gsub(/\t/, '') + + elsif xml_item.xpath("descriptiveNote/p").present? + ret[:note] = xml_item.xpath("descriptiveNote/p").first.text.gsub(/\t/, '') + + end + + return ret end - def db_has_digital_objects? - DigitalObject.exists?(["db_source = ?", self.identifier]) + def extract_singledate(xml_item_date, start, date_open = false) + singledate = {} + + singledate[:date_display] = xml_item_date.text + + if xml_item_date.xpath("boolean(@notbefore)") || xml_item_date.xpath("boolean(@notBefore)") + if xml_item_date.xpath("boolean(@notbefore)") + singledate[:date_from] = xml_item_date.xpath("@notbefore").first.text + end + if xml_item_date.xpath("boolean(@notBefore)") + singledate[:date_from] = xml_item_date.xpath("@notBefore").first.text + end + if xml_item_date.text[0..3].downcase == "sec." + singledate[:date_format] = "C" + else + singledate[:date_format] = "Y" + end + singledate[:date_spec] = "idem" + end + if xml_item_date.xpath("boolean(@notafter)") || xml_item_date.xpath("boolean(@notAfter)") + if xml_item_date.xpath("boolean(@notafter)") + singledate[:date_to] = xml_item_date.xpath("@notafter").first.text + end + if xml_item_date.xpath("boolean(@notAfter)") + singledate[:date_to] = xml_item_date.xpath("@notAfter").first.text + end + if xml_item_date.text[0..3].downcase == "sec." + singledate[:date_format] = "C" + else + singledate[:date_format] = "Y" + end + singledate[:date_spec] = "idem" + end + if xml_item_date.xpath("boolean(@standarddate)") || xml_item_date.xpath("boolean(@standardDate)") || xml_item_date.xpath("not(@*)") + if xml_item_date.xpath("boolean(@standarddate)") + singledate[:date_from] = xml_item_date.xpath("@standarddate").text + end + if xml_item_date.xpath("boolean(@standardDate)") + singledate[:date_from] = xml_item_date.xpath("@standardDate").text + end + if xml_item_date.xpath("not(@*)") + singledate[:date_from] = xml_item_date.text + end + + singledate[:date_format] = "YMD" + if singledate[:date_from].size == 4 + singledate[:date_format] = "Y" + if start + singledate[:date_from] << "-01-01" + else + singledate[:date_from] << "-12-31" + end + elsif singledate[:date_from].size == 7 && singledate[:date_from].include?("-") + singledate[:date_format] = "YM" + if start + singledate[:date_from] << "-01" + else + singledate[:date_from] << "-#{Time.days_in_month(date[5..6].to_i, date[0..3].to_i)}" + end + elsif singledate[:date_from].size == 6 && !singledate[:date_from].include?("-") + singledate[:date_format] = "YM" + singledate[:date_from] = singledate[:date_from][0..3] + "-" + singledate[:date_from][4..5] + if start + singledate[:date_from] << "-01" + else + singledate[:date_from] << "-#{Time.days_in_month(date[5..6].to_i, date[0..3].to_i)}" + end + elsif singledate[:date_from].size == 8 && !singledate[:date_from].include?("-") + singledate[:date_from] = singledate[:date_from][0..3] + "-" + singledate[:date_from][4..5] + "-" + singledate[:date_from][6..7] + end + + if singledate[:date_format] == "YMD" && singledate[:date_display].size == 4 && singledate[:date_display].scan(/\D/).empty? + singledate[:date_format] = "Y" + end + + singledate[:date_to] = singledate[:date_from] + end + + if singledate.key?(:date_from) && singledate[:date_from].size == 8 && !singledate[:date_from].include?("-") + singledate[:date_from] = singledate[:date_from][0..3] + "-" + singledate[:date_from][4..5] + "-" + singledate[:date_from][6..7] + end + + if singledate.key?(:date_to) && singledate[:date_to].size == 8 && !singledate[:date_to].include?("-") + singledate[:date_to] = singledate[:date_to][0..3] + "-" + singledate[:date_to][4..5] + "-" + singledate[:date_to][6..7] + end + + if singledate[:date_display].include? "ante" + singledate[:date_spec] = "ante" + elsif singledate[:date_display].include? "post" + singledate[:date_spec] = "post" + elsif singledate[:date_display].include? "circa" + singledate[:date_spec] = "circa" + else + singledate[:date_spec] = "idem" + end + + # Gestione estremo aperto (se non data singola) + exist_notbefore = xml_item_date.xpath("boolean(@notbefore)") || xml_item_date.xpath("boolean(@notBefore)") + exist_notafter = xml_item_date.xpath("boolean(@notafter)") || xml_item_date.xpath("boolean(@notAfter)") + if ((singledate[:date_display].empty? || singledate[:date_display] == "?" || singledate[:date_display] == "s.d." || singledate[:date_display] == "non indicata") && !start) || (date_open && !(exist_notbefore && exist_notafter)) + singledate[:date_format] = "O" + singledate[:date_valid] = "U" + singledate[:date_spec] = "idem" + singledate[:date_from] = "9999-12-31" + singledate[:date_to] = "9999-12-31" + end + + #@certainty + if !singledate.key?(:date_valid) + if (singledate[:date_display].start_with?("[") and singledate[:date_display].end_with?("?]")) + singledate[:date_valid] = "UQ" + elsif singledate[:date_display].start_with?("[") + singledate[:date_valid] = "Q" + elsif singledate[:date_display].end_with?("?") + singledate[:date_valid] = "U" + else + singledate[:date_valid] = "C" + end + end + + return singledate end -# Upgrade 2.2.0 inizio - def is_unit_importable_type? - return (importable_type == "Unit") + #calcolo data finale della data secolare + #il calcolo si base sui valori presenti nella lib archidate + def calc_end_periodo_data_secolare(date, date_display) + date_obj = Date::strptime(date, "%Y-%m-%d") + + if date_display.include?("prima metà") || date_display.include?("seconda metà") + date_str = date_obj.next_year(49).strftime("%Y-%m-%d") + elsif date_display.include?("inizio") || date_display.include?("fine") || date_display.include?("metà") + date_str = date_obj.next_year(9).strftime("%Y-%m-%d") + elsif date_display.include?("quarto") + date_str = date_obj.next_year(24).strftime("%Y-%m-%d") + else + date_str = "" + end + + return date_str end - def is_unit_aef_file? - return is_unit_importable_type? + #calcolo data iniziale della data secolare + #il calcolo si base sui valori presenti nella lib archidate + def calc_start_periodo_data_secolare(date, date_display) + date_obj = Date::strptime(date, "%Y-%m-%d") + + if date_display.include?("prima metà") || date_display.include?("seconda metà") + date_str = date_obj.next_year(-49).strftime("%Y-%m-%d") + elsif date_display.include?("inizio") || date_display.include?("fine") || date_display.include?("metà") + date_str = date_obj.next_year(-9).strftime("%Y-%m-%d") + elsif date_display.include?("quarto") + date_str = date_obj.next_year(-24).strftime("%Y-%m-%d") + else + date_str = "" + end + + return date_str end -# Upgrade 3.0.0 inizio - def import_csv_file(user, ability) + #import xml relativo ai tracciati EAD3, SCONS2, EAC-CPF, ICAR-IMPORT + #ritorna 0: errore di import + # 1: import ok + # 2: errore di validazione xml + def import_xml_file(user, ability) begin - lines = File.readlines(csv_data_file) - unit_aef_import_units_count = 0 ActiveRecord::Base.transaction do - model = nil - prev_model = nil - object = nil - prev_line = "" - headers = "" - elem_count = 0 - separator = "" - lines.each do |line| - if prev_line.blank? - elements = line.delete("\n").split(',') - elem_count > elements.count - 1 ? elem_count = elem_count : elem_count = elements.count - 1 - separator = ","*elem_count - elem = elements[0].split('_') - pos_last = -1 - elem.each do |e| - if e.last == "s" - pos_last += 1 - break - else - pos_last += 1 - end + document = Nokogiri::XML(File.open(xml_data_file)) + + if (!document.errors.empty?) + Rails.logger.info("errore: syntax error in xml") + return 0 + end + + #rimozione namespace: ad esempio xsi:schemaLocation diventa schemaLocation + #per poter usare xpath più agevolmente il namespace è rimosso + document.remove_namespaces! + + group_id = "" + if user.is_multi_group_user?() + group_id = ability.target_group_id + else + group_id = user.rel_user_groups[0].group_id + end + + #l'xsd del tracciato EAD3 ha un elemento non deterministico + #e.anyname + #quando è istanziato l'oggetto schema è lanciata l'eccezione + #Nokogiri::XML::SyntaxError: complex type 'e.anyname': The content model is not determinist. + #non sembra essere possibile utilizzare l'xsd con la versione attuale di nokogiri + #non è inoltre possibile aggiornare nokogiri perché le versioni successive non sono compatibili con la versione di ruby utilizzata + #perciò la validazione non è effettuata in caso di EAD3 + + skip_validation = true + + xsd_link = "" + header_tag = "" + if (document.xpath("boolean(//icar-import)")) + header_tag = "icar-import" + skip_validation = true + elsif (document.xpath("boolean(//eac-cpf)")) + header_tag = "eac-cpf" + elsif (document.xpath("boolean(//scons)")) + header_tag = "scons" + elsif (document.xpath("boolean(//ead)")) + header_tag = "ead" + skip_validation = true + elsif (document.xpath("boolean(//icar-import)")) + header_tag = "icar-import" + skip_validation = true + else + Rails.logger.info("error: l'xml non è relativo al formato SCONS2, EAC-CPF, EAD3 o ICAR-IMPORT") + return 0 + end + document.xpath("//" + header_tag + "/@schemaLocation").first.value.split(" ").each do |schemaLocation| + if (schemaLocation.start_with?("http") && schemaLocation.end_with?(".xsd")) + xsd_link = schemaLocation + break + end + end + if xsd_link == "" + Rails.logger.info("error: l'xml non contiene il link all'xsd") + return 0 + end + + #la versione di Ruby utilizzata non prevede i redirect da http a https o viceversa + #workaround: in redirect.uri c'è l'url verso il quale deve essere effettuata la redirezione + # si effettuano massimo 3 tentativi per cercare di accedere all'xsd + if !skip_validation + uri = URI.parse(xsd_link) + tries = 3 + begin + uri.open(redirect: false) + rescue OpenURI::HTTPRedirect => redirect + uri = redirect.uri #"Location" response header + retry if (tries -= 1) > 0 + raise + end + + schema = Nokogiri::XML::Schema(uri.read) + document_w_namespace = Nokogiri::XML(File.open(xml_data_file)) #la validazione deve essere condotta sull'xml completo di namespace + validation_errors = schema.validate(document_w_namespace) + else + validation_errors = Array.new + end + if validation_errors.empty? + + if (document.xpath("boolean(//icar-import)")) + import_icar_import document, user.id, group_id + self.importable_type = "Fond" + elsif (document.xpath("boolean(//eac-cpf)")) + if document.xpath("boolean(//eac-cpf/cpfDescription/identity/@localType)") + local_type = document.xpath("//eac-cpf/cpfDescription/identity/@localType").first.value + if (local_type == "profiloIstituzionale") + import_institution(document, user.id, group_id) + self.importable_type = "Institution" + elsif (local_type == "soggettoProduttore") + import_creator(document, user.id, group_id) + self.importable_type = "Creator" + end + elsif document.xpath("//eac-cpf/cpfDescription/identity/entityType").first.text == "person" && + document.xpath("boolean(//eac-cpf/cpfDescription/identity/entityId)") && + document.xpath("//eac-cpf/cpfDescription/identity/entityId/@localType").text == "" + import_anagraphic(document, user.id, group_id) + self.importable_type = "Anagraphic" + else + Rails.logger.info("error: l'xml relativo al formato EAC-CPF non è corretto") + return 0 end - key = (elem[0..pos_last].join('_'))[0..-2] - model = key.camelize.constantize - headers = elements.map!{ |element| element.gsub(key + 's_', '') } - prev_line = "not_blank" - else - line = line.delete("\n") - if (line.include? separator) || (line.blank?) - prev_line = "" - next + elsif (document.xpath("boolean(//scons)")) + import_custodian(document, user.id, group_id) + self.importable_type = "Custodian" + elsif (document.xpath("boolean(//ead)")) + if ((document.xpath("//ead/archdesc/did/*").size == 1) && (document.xpath("//ead/archdesc/did/unittitle").text == "") && + !document.xpath("boolean(//ead/archdesc/dsc)")) + import_source(document, user.id, group_id) + self.importable_type = "Source" else - values = line.delete("\n").split(',') - values = values.map!{ |element| element.gsub('""', '') } - zipped = headers.zip(values) - ipdata = Hash[zipped] - object = model.new(ipdata) - object.db_source = self.identifier - if object.has_attribute? 'group_id' - object.group_id = if user.is_multi_group_user?() then ability.target_group_id else user.rel_user_groups[0].group_id end - end - if (self.is_unit_aef_file?) - if (model.to_s == "Unit") - object.fond_id = self.ref_fond_id - object.root_fond_id = prv_get_ref_root_fond_id - unit_aef_import_units_count += 1 - end - end - object.created_by = user.id if object.has_attribute? 'created_by' - object.updated_by = user.id if object.has_attribute? 'updated_by' - object.sneaky_save! - if model != prev_model && !prev_model.nil? - prev_object = prev_model.new - set_lacking_field_values(prev_object) + if !document.xpath("//ead/control/filedesc/titlestmt/titleproper/@encodinganalog").empty? && !document.xpath("//ead/control/recordid/@*").empty? + import_unit(document, user.id, group_id) + #import_fond(document, user.id, group_id) + self.importable_type = "Fond" + else + import_unit(document, user.id, group_id) + self.importable_type = "Fond" + # self.importable_type = "Unit" #TODO da rivedere: in realtà dovrebbe essere comunque l'import di un complesso, quello che contiene l'unita' end - prev_model = model end + else + Rails.logger.info("error: l'xml non è relativo al formato SCONS2, EAC-CPF, EAD3 o ICAR-IMPORT") + return 0 end + else + validation_errors.each do |error| + Rails.logger.info("validation error: #{error}") + end + return 2 end end - update_statements(unit_aef_import_units_count) + return 1 rescue Exception => e - Rails.logger.info "import_csv_file Errore=" + e.message.to_s - return false + Rails.logger.info("\n\nEccezione - e.message: #{e.message}\n\n") + # Decommentare le due righe seguenti in caso di necessità + #Rails.logger.info("\n\nEccezione - e.backtrace") + #e.backtrace.each { |line| logger.error line } + return 0 ensure end end -# Upgrade 3.0.0 fine -# def import_aef_file(user) + # def import_aef_file(user) def import_aef_file(user, ability) -# Upgrade 2.2.0 fine -=begin - File.open(data_file) do |file| - begin - ActiveRecord::Base.transaction do - lines = file.enum_for(:each_line) - lines.each do |line| - next if line.blank? - data = ActiveSupport::JSON.decode(line.strip) - key = data.keys.first - model = key.camelize.constantize - data[key].delete_if{|k, v| not model.column_names.include? k} - object = model.new(data[key]) - object.db_source = self.identifier - object.group_id = user.group_id if object.has_attribute? 'group_id' - object.created_by = user.id if object.has_attribute? 'created_by' - object.updated_by = user.id if object.has_attribute? 'updated_by' - object.send(:create_without_callbacks) - end - end - update_statements - return true - rescue - return false - ensure - file.close - end - end -=end + + #File.open(data_file) do |file| + # begin + # ActiveRecord::Base.transaction do + # lines = file.enum_for(:each_line) + # lines.each do |line| + # next if line.blank? + # data = ActiveSupport::JSON.decode(line.strip) + # key = data.keys.first + # model = key.camelize.constantize + # data[key].delete_if{|k, v| not model.column_names.include? k} + # object = model.new(data[key]) + # object.db_source = self.identifier + # object.group_id = user.group_id if object.has_attribute? 'group_id' + # object.created_by = user.id if object.has_attribute? 'created_by' + # object.updated_by = user.id if object.has_attribute? 'updated_by' + # object.send(:create_without_callbacks) + # end + # end + # update_statements + # return true + # rescue + # return false + # ensure + # file.close + # end + #end - begin - lines = File.readlines(data_file) -# Upgrade 2.2.0 inizio + begin + lines = File.readlines(data_file) unit_aef_import_units_count = 0 -# Upgrade 2.2.0 fine - ActiveRecord::Base.transaction do -# Upgrade 2.0.0 inizio + ActiveRecord::Base.transaction do model = nil prev_model = nil object = nil -# Upgrade 2.0.0 fine - lines.each do |line| - next if line.blank? - data = ActiveSupport::JSON.decode(line.strip) - key = data.keys.first -# Upgrade 2.1.0 inizio + lines.each do |line| + if line.include? "custodian_name" + line = line.gsub('"qualifier":"AU"', '"qualifier":"OT"') + line = line.gsub('"qualifier":"[\"OT\", \"AU\"]"', '"qualifier":"OT"') + line = line.gsub('"qualifier":"[\'OT\', \'AU\']"', '"qualifier":"OT"') + end + + next if line.blank? + data = ActiveSupport::JSON.decode(line.strip) + key = data.keys.first ipdata = data[key] if imported_file_version < "2.1.0" key = prv_adjust_ante_210_project(key, ipdata) key = prv_adjust_ante_210_project_credits(key, ipdata) end -# Upgrade 2.1.0 fine - model = key.camelize.constantize -# Upgrade 2.1.0 inizio -# data[key].delete_if{|k, v| not model.column_names.include? k} -# object = model.new(data[key]) - ipdata.delete_if{|k, v| not model.column_names.include? k} - object = model.new(ipdata) -# Upgrade 2.1.0 fine - object.db_source = self.identifier -# Upgrade 2.2.0 inizio -# object.group_id = user.group_id if object.has_attribute? 'group_id' + model = key.camelize.constantize + #data[key].delete_if{|k, v| not model.column_names.include? k} + #object = model.new(data[key]) + ipdata.delete_if { |k, v| not model.column_names.include? k } + object = model.new(ipdata) + object.db_source = self.identifier + #object.group_id = user.group_id if object.has_attribute? 'group_id' if object.has_attribute? 'group_id' - object.group_id = if user.is_multi_group_user?() then ability.target_group_id else user.rel_user_groups[0].group_id end + object.group_id = if user.is_multi_group_user?() then + ability.target_group_id + else + user.rel_user_groups[0].group_id + end end if (self.is_unit_aef_file?) @@ -234,51 +3589,44 @@ def import_aef_file(user, ability) unit_aef_import_units_count += 1 end end -# Upgrade 2.2.0 fine - object.created_by = user.id if object.has_attribute? 'created_by' - object.updated_by = user.id if object.has_attribute? 'updated_by' + object.created_by = user.id if object.has_attribute? 'created_by' + object.updated_by = user.id if object.has_attribute? 'updated_by' -# Upgrade 2.0.0 inizio -# object.send(:create_without_callbacks) - object.sneaky_save! + #object.send(:create_without_callbacks) + object.sneaky_save! if model != prev_model && !prev_model.nil? prev_object = prev_model.new set_lacking_field_values(prev_object) end prev_model = model - end + end if !object.nil? set_lacking_field_values(object) end -# Upgrade 2.0.0 fine - end -# Upgrade 2.2.0 inizio -# update_statements + end update_statements(unit_aef_import_units_count) -# Upgrade 2.2.0 fine - return true + return true rescue Exception => e Rails.logger.info "import_aef_file Errore=" + e.message.to_s return false - ensure - end + ensure + end end -# Upgrade 2.2.0 inizio -# def update_statements + # Upgrade 2.2.0 inizio + #def update_statements def update_statements(unit_aef_import_units_count) -# Upgrade 2.2.0 fine + # Upgrade 2.2.0 fine begin ActiveRecord::Base.transaction do -# Upgrade 2.2.0 inizio -=begin - update_fonds_ancestry - update_units_fond_id - update_subunits_ancestry if db_has_subunits? - update_one_to_many_relations - update_many_to_many_relations - update_digital_objects if db_has_digital_objects? -=end + # Upgrade 2.2.0 inizio + #update_fonds_ancestry + #update_units_fond_id + #update_subunits_ancestry if db_has_subunits? + #update_one_to_many_relations + #update_many_to_many_relations + #update_digital_objects if db_has_digital_objects? + if (self.is_unit_aef_file?) units_aef_file_update_tables(unit_aef_import_units_count) else @@ -290,16 +3638,16 @@ def update_statements(unit_aef_import_units_count) update_digital_objects if db_has_digital_objects? end update_sc2_second_level_relations -# Upgrade 2.2.0 fine -# Upgrade 2.1.0 inizio - #if imported_file_version < "2.1.0" -# Upgrade 3.0.0 inizio + # Upgrade 2.2.0 fine + # Upgrade 2.1.0 inizio + #if imported_file_version < "2.1.0" + # Upgrade 3.0.0 inizio if !imported_file_version.nil? && imported_file_version < "2.1.0" -# Upgrade 3.0.0 fine + # Upgrade 3.0.0 fine Import.restore_d_f_s(self.identifier) Import.restore_bdm_oa(self.identifier) end -# Upgrade 2.1.0 fine + # Upgrade 2.1.0 fine if self.importable_type == 'Fond' self.importable_id = Fond.find_by_db_source_and_ancestry("#{self.identifier}", nil).id @@ -307,17 +3655,13 @@ def update_statements(unit_aef_import_units_count) self.importable_id = self.importable_type.constantize.find_by_db_source("#{self.identifier}").id end end - rescue Exception => e - Rails.logger.info "Errore update statements=" + e.message.to_s - return false - ensure end end -# Upgrade 2.0.0 inizio -# assegna created_at, updated_at con la data corrente sul modello object + # Upgrade 2.0.0 inizio + # assegna created_at, updated_at con la data corrente sul modello object def set_lacking_field_values(object) - current_datetime = Time.now.utc.strftime("%Y-%m-%d %H:%M:%S") # nel db le date sono in utc + current_datetime = Time.now.utc.strftime("%Y-%m-%d %H:%M:%S") # nel db le date sono in utc table_name = object.class.table_name.to_s sqlSetClause = "" @@ -327,7 +3671,9 @@ def set_lacking_field_values(object) sqlWhereClause = sqlWhereClause + " AND (created_at IS NULL)" end if object.attributes.include? "updated_at" - if !sqlSetClause.empty? then sqlSetClause = sqlSetClause + "," end + if !sqlSetClause.empty? then + sqlSetClause = sqlSetClause + "," + end sqlSetClause = sqlSetClause + "updated_at = '#{current_datetime}'" sqlWhereClause = sqlWhereClause + " AND (updated_at IS NULL)" end @@ -337,37 +3683,45 @@ def set_lacking_field_values(object) ar_connection.execute(sqlStmt) end end -# Upgrade 2.0.0 fine + # Upgrade 2.0.0 fine def update_fonds_ancestry(parent_id = nil, ancestry = nil) -# Upgrade 2.0.0 inizio -# Fond.find_each(:conditions => {:legacy_parent_id => parent_id, :db_source => self.identifier}) do |node| + # Upgrade 2.0.0 inizio + #Fond.find_each(:conditions => {:legacy_parent_id => parent_id, :db_source => self.identifier}) do |node| Fond.where({:legacy_parent_id => parent_id, :db_source => self.identifier}).find_each do |node| -# Upgrade 2.0.0 fine + # Upgrade 2.0.0 fine node.without_ancestry_callbacks do node.update_attribute :ancestry, ancestry end - update_fonds_ancestry node.legacy_id, if ancestry.nil? then "#{node.id}" else "#{ancestry}/#{node.id}" end + update_fonds_ancestry node.legacy_id, if ancestry.nil? then + "#{node.id}" + else + "#{ancestry}/#{node.id}" + end end end -# Upgrade 2.2.0 inizio + # Upgrade 2.2.0 inizio def units_aef_file_update_tables(unit_aef_import_units_count) # maxsn = max sequence_number di tutte le unità del fondo considerato per l'importazione sqlWhereClause = "(fond_id=#{self.ref_fond_id}) AND (root_fond_id=#{prv_get_ref_root_fond_id}) AND (db_source IS NULL OR db_source <> '#{self.identifier}')" maxsn = Unit.where(sqlWhereClause).maximum("sequence_number") - if (maxsn.nil?) then maxsn = 0 end - + if (maxsn.nil?) then + maxsn = 0 + end + # maxpos = max position di tutte le unità non sotto-unità o sotto-sotto-unità del fondo considerato per l'importazione sqlWhereClause = "(fond_id=#{self.ref_fond_id}) AND (ancestry IS NULL) AND (db_source IS NULL OR db_source <> '#{self.identifier}')" maxpos = Unit.where(sqlWhereClause).maximum("position") - if (maxpos.nil?) then maxpos = 0 end + if (maxpos.nil?) then + maxpos = 0 + end # incrementa sequence_number delle unità del fondo radice considerato che avevano sequence_number > maxsn di un numero pari al numero di nuove unità importate (unit_aef_import_units_count) in modo da "fare spazio" nella sequenza alle nuove arrivate sqlWhereClause = "(root_fond_id=#{prv_get_ref_root_fond_id}) AND (db_source IS NULL OR db_source <> '#{self.identifier}') AND (sequence_number > #{maxsn})" sqlStmt = "UPDATE units SET sequence_number=sequence_number+#{unit_aef_import_units_count} WHERE #{sqlWhereClause}" ar_connection.execute(sqlStmt) - + # alle nuove unità importate si eseguono i seguenti aggiornamenti: # setta sequence_number in modo che si incastrino nella posizione prevista (in coda a quelle del fondo considerato) sqlWhereClause = "db_source = '#{self.identifier}'" @@ -375,7 +3729,7 @@ def units_aef_file_update_tables(unit_aef_import_units_count) ar_connection.execute(sqlStmt) update_subunits_ancestry if db_has_subunits? - + posindex = maxpos + 1 prev_ancestry = "" prev_ancestry_depth = 0 @@ -383,28 +3737,30 @@ def units_aef_file_update_tables(unit_aef_import_units_count) Unit.where(sqlWhereClause).order("ancestry_depth, sequence_number").each do |unit| ancestry = unit.ancestry - if (ancestry.nil?) then ancestry = "" end + if (ancestry.nil?) then + ancestry = "" + end ancestry_depth = unit.ancestry_depth if (ancestry != prev_ancestry || ancestry_depth != prev_ancestry_depth) posindex = 1 end unit.update_column("position", posindex) - + posindex += 1 prev_ancestry = ancestry prev_ancestry_depth = ancestry_depth end - + update_one_to_many_relations - + update_digital_objects if db_has_digital_objects? # aggiorna l'informazione sul numero di unità collegate al fondo di riferimento sqlStmt = "UPDATE fonds SET units_count=units_count+#{unit_aef_import_units_count} WHERE id=#{self.ref_fond_id}" ar_connection.execute(sqlStmt) end -# Upgrade 2.2.0 fine - + # Upgrade 2.2.0 fine + def update_units_fond_id case adapter when 'sqlite' @@ -500,20 +3856,20 @@ def update_subunits_ancestry def update_one_to_many_relations entities = { - :fonds => ["fond_events", "fond_identifiers", "fond_langs", "fond_names", "fond_owners", "fond_urls", "fond_editors"], -# Upgrade 2.2.0 inizio -# :units => ["unit_events", "unit_identifiers", "unit_damages", "unit_langs", "unit_other_reference_numbers", "unit_urls", "unit_editors", "iccd_authors", "iccd_descriptions", "iccd_tech_specs", "iccd_damages", "iccd_subjects"], - :units => ["unit_events", "unit_identifiers", "unit_damages", "unit_langs", "unit_other_reference_numbers", "unit_urls", "unit_editors", "iccd_authors", "iccd_descriptions", "iccd_tech_specs", "iccd_damages", "iccd_subjects", "sc2s", "sc2_textual_elements", "sc2_visual_elements", "sc2_authors", "sc2_commissions", "sc2_techniques", "sc2_scales"], -# Upgrade 2.2.0 fine - :creators => ["creator_events", "creator_identifiers", "creator_legal_statuses", "creator_names", "creator_urls", "creator_activities", "creator_editors"], - :custodians => ["custodian_buildings", "custodian_contacts", "custodian_identifiers", "custodian_names", "custodian_owners", "custodian_urls", "custodian_editors"], -# Upgrade 2.0.0 inizio -# :projects => ["project_credits", "project_urls"], - :projects => ["project_managers", "project_stakeholders", "project_urls"], -# Upgrade 2.0.0 fine - :sources => ["source_urls"], - :institutions => ["institution_editors"], - :document_forms => ["document_form_editors"] + :fonds => ["fond_events", "fond_identifiers", "fond_langs", "fond_names", "fond_owners", "fond_urls", "fond_editors"], + # Upgrade 2.2.0 inizio + # :units => ["unit_events", "unit_identifiers", "unit_damages", "unit_langs", "unit_other_reference_numbers", "unit_urls", "unit_editors", "iccd_authors", "iccd_descriptions", "iccd_tech_specs", "iccd_damages", "iccd_subjects"], + :units => ["unit_events", "unit_identifiers", "unit_damages", "unit_langs", "unit_other_reference_numbers", "unit_urls", "unit_editors", "iccd_authors", "iccd_descriptions", "iccd_tech_specs", "iccd_damages", "iccd_subjects", "sc2s", "sc2_textual_elements", "sc2_visual_elements", "sc2_authors", "sc2_commissions", "sc2_techniques", "sc2_scales", "fsc_organizations", "fsc_nationalities", "fsc_codes", "fsc_opens", "fsc_closes", "fe_identifications", "fe_contexts", "fe_operas", "fe_designers", "fe_cadastrals", "fe_land_parcels", "fe_fract_land_parcels", "fe_fract_edil_parcels"], + # Upgrade 2.2.0 fine + :creators => ["creator_events", "creator_identifiers", "creator_legal_statuses", "creator_names", "creator_urls", "creator_activities", "creator_editors"], + :custodians => ["custodian_buildings", "custodian_contacts", "custodian_identifiers", "custodian_names", "custodian_owners", "custodian_urls", "custodian_editors"], + # Upgrade 2.0.0 inizio + # :projects => ["project_credits", "project_urls"], + :projects => ["project_managers", "project_stakeholders", "project_urls"], + # Upgrade 2.0.0 fine + :sources => ["source_urls"], + :institutions => ["institution_editors"], + :document_forms => ["document_form_editors"] } entities.each do |target, tables| @@ -548,18 +3904,18 @@ def update_one_to_many_relations def update_many_to_many_relations tables = { - :rel_creator_creators => ["creators", "creators"], - :rel_creator_fonds => ["creators", "fonds"], - :rel_creator_institutions => ["creators", "institutions"], - :rel_creator_sources => ["creators", "sources"], - :rel_custodian_fonds => ["custodians", "fonds"], - :rel_custodian_sources => ["custodians", "sources"], - :rel_fond_document_forms => ["fonds", "document_forms"], - :rel_fond_headings => ["fonds", "headings"], - :rel_fond_sources => ["fonds", "sources"], - :rel_project_fonds => ["projects", "fonds"], - :rel_unit_headings => ["units", "headings"], - :rel_unit_sources => ["units", "sources"] + :rel_creator_creators => ["creators", "creators"], + :rel_creator_fonds => ["creators", "fonds"], + :rel_creator_institutions => ["creators", "institutions"], + :rel_creator_sources => ["creators", "sources"], + :rel_custodian_fonds => ["custodians", "fonds"], + :rel_custodian_sources => ["custodians", "sources"], + :rel_fond_document_forms => ["fonds", "document_forms"], + :rel_fond_headings => ["fonds", "headings"], + :rel_fond_sources => ["fonds", "sources"], + :rel_project_fonds => ["projects", "fonds"], + :rel_unit_headings => ["units", "headings"], + :rel_unit_sources => ["units", "sources"] } tables.each do |table, entities| @@ -641,18 +3997,18 @@ def update_many_to_many_relations def update_digital_objects attachable_entities = { - 'Fond' => 'fonds', - 'Unit' => 'units', - 'Creator' => 'creators', - 'Custodian' => 'custodians', - 'Source' => 'sources' + 'Fond' => 'fonds', + 'Unit' => 'units', + 'Creator' => 'creators', + 'Custodian' => 'custodians', + 'Source' => 'sources' } attachable_entities.each do |value, table| -# Upgrade 2.0.0 inizio -# set = DigitalObject.all(:conditions => {:attachable_type => value, :db_source => self.identifier}) + # Upgrade 2.0.0 inizio + #set = DigitalObject.all(:conditions => {:attachable_type => value, :db_source => self.identifier}) set = DigitalObject.where({:attachable_type => value, :db_source => self.identifier}) -# Upgrade 2.0.0 fine + # Upgrade 2.0.0 fine unless set.blank? ids = set.map(&:id).join(',') case adapter @@ -689,44 +4045,37 @@ def update_digital_objects end end - -# Upgrade 3.0.0 inizio -# Copia degli oggetti digitali dall'aef alla destinazione fisica - begin - Zip::File.open("#{Rails.root}/public/imports/#{self.id}/#{self.data_file_name}") { |zip_file| - zip_file.each { |f| - if (f.name.include? "public") && (f.name.include? "digital_objects") - f_path=File.join("#{Rails.root}/", f.name) - FileUtils.mkdir_p(File.dirname(f_path)) - zip_file.extract(f, f_path){ true } unless File.exist?(f_path) - end - } + # Upgrade 3.0.0 inizio + # Copia degli oggetti digitali dall'aef alla destinazione fisica + Zip::File.open("#{Rails.root}/public/imports/#{self.id}/#{self.data_file_name}") { |zip_file| + zip_file.each { |f| + if (f.name.include? "public") && (f.name.include? "digital_objects") + f_path = File.join("#{Rails.root}/", f.name) + FileUtils.mkdir_p(File.dirname(f_path)) + zip_file.extract(f, f_path) { true } unless File.exist?(f_path) + end } - rescue Exception => e - Rails.logger.info "Errore apertura file=" + e.message.to_s - return false - ensure - end - -# Upgrade 3.0.0 fine - + } + # Upgrade 3.0.0 fine end -# Upgrade 2.2.0 inizio + # Upgrade 2.2.0 inizio def update_sc2_second_level_relations tables = - [ - {:table => "sc2_attribution_reasons", :parent_table => "sc2_authors", :foreign_key => "sc2_author_id" }, - {:table => "sc2_commission_names", :parent_table => "sc2_commissions", :foreign_key => "sc2_commission_id" } - ] - + [ + {:table => "sc2_attribution_reasons", :parent_table => "sc2_authors", :foreign_key => "sc2_author_id"}, + {:table => "sc2_commission_names", :parent_table => "sc2_commissions", :foreign_key => "sc2_commission_id"} + ] + tables.each do |settings| table = settings[:table] parent_table = settings[:parent_table] if ((!table.nil? || table != "") && (!parent_table.nil? || parent_table != "")) foreign_key = settings[:foreign_key] - if (foreign_key.nil? || foreign_key == "") then foreign_key = "#{parent_table}".singularize + "_id" end + if (foreign_key.nil? || foreign_key == "") then + foreign_key = "#{parent_table}".singularize + "_id" + end case adapter when 'sqlite' sql_stmt = "UPDATE #{table} SET #{foreign_key} = (SELECT id @@ -758,27 +4107,46 @@ def update_sc2_second_level_relations end end end -# Upgrade 2.2.0 fine + # Upgrade 2.2.0 fine def is_valid_file? + if @is_batch_import == true + src_file = File.join(Rails.root, "public", "imports", "batch_import", @batch_import_filename) + + dst_path = File.join(Rails.root, "public", "imports", self.id.to_s, ".") + dirname = File.dirname(dst_path) + unless File.directory?(dirname) + FileUtils.mkdir_p(dirname) + end + + extension = File.extname(@batch_import_filename).downcase + filename = "#{Time.now.strftime("%Y%m%d%H%M%S")}" + + full_dst_filename = filename + "_batch_import" + extension + dst_file = File.join(Rails.root, "public", "imports", self.id.to_s, full_dst_filename) + FileUtils.copy_file(src_file, dst_file) + + self.data_file_name = full_dst_filename + end + begin extension = File.extname(data_file_name).downcase.gsub('.', '') -# Upgrade 3.0.0 inizio - raise Zip::ZipInternalError unless ['aef', 'csv'].include? extension - + # Upgrade 3.0.0 inizio + raise Zip::ZipInternalError unless ['aef', 'csv', 'xml'].include? extension + rescue Zip::ZipInternalError - raise 'Il file fornito non è di formato aef o csv' + raise 'Formato file non supportato.' end -# Upgrade 3.0.0 fine + # Upgrade 3.0.0 fine if ['aef'].include? extension files = ["metadata.json", "data.json"] begin - # Upgrade 2.0.0 inizio - # Zip::ZipFile.open("#{Rails.root}/public/imports/#{self.id}/#{self.data_file_name}") do |zipfile| + # Upgrade 2.0.0 inizio + # Zip::ZipFile.open("#{Rails.root}/public/imports/#{self.id}/#{self.data_file_name}") do |zipfile| Zip::File.open("#{Rails.root}/public/imports/#{self.id}/#{self.data_file_name}") do |zipfile| - # Upgrade 2.0.0 fine - # Upgrade 3.0.0 inizio - # esclusi dal controllo di validità i file degli oggetti digitali + # Upgrade 2.0.0 fine + # Upgrade 3.0.0 inizio + # esclusi dal controllo di validità i file degli oggetti digitali zipfile.each do |entry| if (entry.directory?) && (entry.to_s.include? "public") next @@ -791,7 +4159,7 @@ def is_valid_file? end end end - # Upgrade 3.0.0 fine + # Upgrade 3.0.0 fine end rescue Zip::ZipInternalError raise 'Il file fornito non è di formato aef' @@ -801,7 +4169,8 @@ def is_valid_file? raise 'Il file aef è danneggiato' rescue Zip::ZipDestinationFileExistsError raise "Errore interno di #{APP_NAME}, stale files nella directory tmp" - rescue + rescue StandardError => e + Rails.logger.error e.inspect raise "Si è verificato un errore nell'elaborazione del file aef" end @@ -826,18 +4195,17 @@ def is_valid_file? ensure file.close end - end - else + end + elsif ['csv'].include? extension self.importable_type = "Unit" end - # Upgrade 3.0.0 fine end def wipe_all_related_records tables = ar_connection.tables - ["schema_migrations"] begin ActiveRecord::Base.transaction do -# Upgrade 2.2.0 inizio + # Upgrade 2.2.0 inizio importable_type = Import.where("identifier = '#{self.identifier}'").first.importable_type if (importable_type == "Unit") # l'idea è decrementare il campo units_count dei fondi che contengono le unità importate che si stanno cancellando. @@ -850,29 +4218,29 @@ def wipe_all_related_records sql_stmt = "update fonds set units_count=units_count-#{n_units} where id=#{fond_id}" ar_connection.execute(sql_stmt) end - end -# Upgrade 2.2.0 fine + end + # Upgrade 2.2.0 fine tables.each do |table| model = table.classify.constantize object = model.new if object.has_attribute? 'db_source' -# Upgrade 3.0.0 inizio -# Vengono eliminati fisicamente gli oggetti digitali precedentemente importati -# insieme alle cartelle corrispondenti e prima dell'eliminazione dei record corrispondenti su db + # Upgrade 3.0.0 inizio + # Vengono eliminati fisicamente gli oggetti digitali precedentemente importati + # insieme alle cartelle corrispondenti e prima dell'eliminazione dei record corrispondenti su db if table.include? "digital_objects" digital_object_ids = DigitalObject.where(:db_source => self.identifier).map(&:access_token) digital_object_ids.each do |doi| delete_digital_folder(doi) end end -# Upgrade 3.0.0 fine + # Upgrade 3.0.0 fine model.delete_all("db_source = '#{self.identifier}'") end end end return true rescue Exception => e -Rails.logger.info "################ Errore=" + e.message + Rails.logger.info "################ Errore=" + e.message return false end end @@ -888,23 +4256,24 @@ def prv_get_ref_root_fond_id end return ref_root_fond_id end -# Upgrade 2.2.0 fine - + # Upgrade 2.2.0 fine def sanitize_file_name - extension = File.extname(data_file_name).downcase - filename = "#{Time.now.strftime("%Y%m%d%H%M%S")}" - self.data.instance_write(:file_name, "#{filename}#{extension}") + if !@is_batch_import + extension = File.extname(data_file_name).downcase + filename = "#{Time.now.strftime("%Y%m%d%H%M%S")}" + self.data.instance_write(:file_name, "#{filename}#{extension}") + end end def prv_adjust_ante_210_project(key, ipdata) begin if key == "project" case ipdata["project_type"] - when "riordino e schedatura" - ipdata["project_type"] = "riordino" - when "schedatura" - ipdata["project_type"] = "recupero" + when "riordino e schedatura" + ipdata["project_type"] = "riordino" + when "schedatura" + ipdata["project_type"] = "recupero" end end rescue Exception => e @@ -923,51 +4292,51 @@ def prv_adjust_ante_210_project_credits(key, ipdata) if ipdata["credit_type"] == "PS" if ipdata.has_key?("qualifier") case ipdata["qualifier"] - when "coordinatore" - key = "project_stakeholder" - ipdata["qualifier"] = "coordinamento operativo" - when "finanziatore" - key = "project_stakeholder" - ipdata["qualifier"] = "finanziamento" - when "promotore" - key = "project_stakeholder" - ipdata["qualifier"] = "promozione" - when "realizzatore" - key = "project_stakeholder" - ipdata["qualifier"] = "realizzazione" - when "schedatore" - key = "project_manager" - when "responsabile scientifico" - key = "project_manager" -# Upgrade 2.1.0 inizio - else - key = "project_stakeholder" -# Upgrade 2.1.0 fine + when "coordinatore" + key = "project_stakeholder" + ipdata["qualifier"] = "coordinamento operativo" + when "finanziatore" + key = "project_stakeholder" + ipdata["qualifier"] = "finanziamento" + when "promotore" + key = "project_stakeholder" + ipdata["qualifier"] = "promozione" + when "realizzatore" + key = "project_stakeholder" + ipdata["qualifier"] = "realizzazione" + when "schedatore" + key = "project_manager" + when "responsabile scientifico" + key = "project_manager" + # Upgrade 2.1.0 inizio + else + key = "project_stakeholder" + # Upgrade 2.1.0 fine end end else # caso ipdata["credit_type"] == "PM" o ipdata["credit_type"] == qualsiasi altro valore if ipdata.has_key?("qualifier") case ipdata["qualifier"] - when "coordinatore" - key = "project_manager" - when "finanziatore" - key = "project_stakeholder" - ipdata["qualifier"] = "finanziamento" - when "promotore" - key = "project_stakeholder" - ipdata["qualifier"] = "promozione" - when "realizzatore" - key = "project_stakeholder" - ipdata["qualifier"] = "realizzazione" - when "schedatore" - key = "project_manager" - when "responsabile scientifico" - key = "project_manager" -# Upgrade 2.1.0 inizio - else - key = "project_manager" -# Upgrade 2.1.0 fine + when "coordinatore" + key = "project_manager" + when "finanziatore" + key = "project_stakeholder" + ipdata["qualifier"] = "finanziamento" + when "promotore" + key = "project_stakeholder" + ipdata["qualifier"] = "promozione" + when "realizzatore" + key = "project_stakeholder" + ipdata["qualifier"] = "realizzazione" + when "schedatore" + key = "project_manager" + when "responsabile scientifico" + key = "project_manager" + # Upgrade 2.1.0 inizio + else + key = "project_manager" + # Upgrade 2.1.0 fine end end end diff --git a/app/models/institution.rb b/app/models/institution.rb index 565d4a5..0aba35a 100644 --- a/app/models/institution.rb +++ b/app/models/institution.rb @@ -8,6 +8,8 @@ class Institution < ActiveRecord::Base has_many :institution_editors, -> { order(:edited_at) }, :dependent => :destroy # Upgrade 2.0.0 fine + has_one :import, :as => :importable, :dependent => :destroy + # Upgrade 2.2.0 inizio belongs_to :group # Upgrade 2.2.0 fine @@ -23,3 +25,4 @@ class Institution < ActiveRecord::Base end + diff --git a/app/models/personal_fsc.rb b/app/models/personal_fsc.rb new file mode 100644 index 0000000..da88928 --- /dev/null +++ b/app/models/personal_fsc.rb @@ -0,0 +1,4 @@ +class PersonalFsc < ActiveRecord::Base + belongs_to :unit +end + diff --git a/app/models/rel_unit_anagraphic.rb b/app/models/rel_unit_anagraphic.rb new file mode 100644 index 0000000..c965067 --- /dev/null +++ b/app/models/rel_unit_anagraphic.rb @@ -0,0 +1,5 @@ +class RelUnitAnagraphic < ActiveRecord::Base + belongs_to :unit + belongs_to :anagraphic +end + diff --git a/app/models/source.rb b/app/models/source.rb index 97f9171..0c79e9d 100644 --- a/app/models/source.rb +++ b/app/models/source.rb @@ -19,6 +19,8 @@ class Source < ActiveRecord::Base # Upgrade 2.2.0 inizio has_one :first_digital_object, -> { where({:position => 1}) }, :as => :attachable, :class_name => DigitalObject # Upgrade 2.2.0 fine + + has_one :import, :as => :importable, :dependent => :destroy # Many-to-many associations (rel) # OPTIMIZE: valutare uso di Polymorphic Association. Quali pro/contro ? @@ -75,6 +77,10 @@ class Source < ActiveRecord::Base trimmed_fields :abstract + # Upgrade 3.0.1 ICAR inizio + scope :export_list, -> { select("sources.id, sources.title, sources.short_title, sources.db_source, sources.updated_at, count(sources.id) AS num").joins([:fonds]).group("sources.id").order("sources.short_title")} + # Upgrade 3.0.1 fine + def set_year if date_string.present? self.year = date_string.guess_year @@ -127,6 +133,16 @@ def set_year conditions = ["LOWER(sources.short_title) LIKE :q OR LOWER(sources.title) LIKE :q", {:q => "%#{q.downcase.squish}%"}] if q.present? where(conditions) } +# Upgrade 3.0.1 ICAR inizio + scope :autocomplete_export_list, ->(*term){ + term = term.shift.to_s + conditions = ["LOWER(title) LIKE :term OR LOWER(short_title) LIKE :term", {:term => "%#{term}%"}] + select("id, CONCAT(short_title,' (', title, ') ') AS value"). + where(conditions). + order("short_title"). + limit(10) + } + # Upgrade 3.0.1 ICAR fine # Upgrade 2.0.0 fine diff --git a/app/models/unit.rb b/app/models/unit.rb index 27ed78e..5c60b5f 100644 --- a/app/models/unit.rb +++ b/app/models/unit.rb @@ -4,6 +4,12 @@ class Unit < ActiveRecord::Base + # INIZIO - require richiesti per l'import batch + require File.join(File.dirname(__FILE__), ".", "unit_event.rb") + require File.join(File.dirname(__FILE__), ".", "term.rb") + require File.join(File.dirname(__FILE__), ".", "vocabulary.rb") + # FINE - require richiesti per l'import batch + MAX_LEVEL_OF_NODES = 2 cattr_reader :per_page @@ -57,6 +63,87 @@ class Unit < ActiveRecord::Base has_many :unit_editors, -> { order(:edited_at) }, :dependent => :destroy # Upgrade 2.0.0 fine + #has_many :personal_fscs, :dependent => :destroy + has_many :fsc_organizations, :dependent => :destroy + has_many :fsc_nationalities, :dependent => :destroy + has_many :fsc_codes, :dependent => :destroy + has_many :fsc_opens, :dependent => :destroy + has_many :fsc_closes, :dependent => :destroy + + has_many :fe_identifications, :dependent => :destroy + has_many :fe_contexts, :dependent => :destroy + has_many :fe_operas, :dependent => :destroy + has_many :fe_designers, :dependent => :destroy + has_many :fe_cadastrals, :dependent => :destroy + has_many :fe_land_parcels, :dependent => :destroy + has_many :fe_fract_land_parcels, :dependent => :destroy + has_many :fe_fract_edil_parcels, :dependent => :destroy + + accepts_nested_attributes_for :fe_identifications, :allow_destroy => true, :reject_if => :fe_identifications_reject_if + accepts_nested_attributes_for :fe_contexts, :allow_destroy => true, :reject_if => :fe_contexts_reject_if + accepts_nested_attributes_for :fe_operas, :allow_destroy => true, :reject_if => :fe_operas_reject_if + accepts_nested_attributes_for :fe_designers, :allow_destroy => true, :reject_if => :fe_designers_reject_if + accepts_nested_attributes_for :fe_cadastrals, :allow_destroy => true, :reject_if => :fe_cadastrals_reject_if + accepts_nested_attributes_for :fe_land_parcels, :allow_destroy => true, :reject_if => :fe_land_parcels_reject_if + accepts_nested_attributes_for :fe_fract_land_parcels, :allow_destroy => true, :reject_if => :fe_fract_land_parcels_reject_if + accepts_nested_attributes_for :fe_fract_edil_parcels, :allow_destroy => true, :reject_if => :fe_fract_edil_parcels_reject_if + + def fe_identifications_reject_if(attributes) + exists = attributes[:id].present? + empty = attributes[:code].blank? + attributes.merge!({_destroy: 1}) if exists and empty + return (!exists and empty) + end + + def fe_contexts_reject_if(attributes) + exists = attributes[:id].present? + empty = attributes[:number].blank? + attributes.merge!({_destroy: 1}) if exists and empty + return (!exists and empty) + end + + def fe_operas_reject_if(attributes) + exists = attributes[:id].present? + empty = attributes[:building_name].blank? + attributes.merge!({_destroy: 1}) if exists and empty + return (!exists and empty) + end + + def fe_designers_reject_if(attributes) + exists = attributes[:id].present? + empty = attributes[:designer_name].blank? + attributes.merge!({_destroy: 1}) if exists and empty + return (!exists and empty) + end + + def fe_cadastrals_reject_if(attributes) + exists = attributes[:id].present? + empty = attributes[:way_code].blank? + attributes.merge!({_destroy: 1}) if exists and empty + return (!exists and empty) + end + + def fe_land_parcels_reject_if(attributes) + exists = attributes[:id].present? + empty = attributes[:land_parcel_number].blank? + attributes.merge!({_destroy: 1}) if exists and empty + return (!exists and empty) + end + + def fe_fract_land_parcels_reject_if(attributes) + exists = attributes[:id].present? + empty = attributes[:fract_land_parcel_number].blank? + attributes.merge!({_destroy: 1}) if exists and empty + return (!exists and empty) + end + + def fe_fract_edil_parcels_reject_if(attributes) + exists = attributes[:id].present? + empty = attributes[:fract_edil_parcel_number].blank? + attributes.merge!({_destroy: 1}) if exists and empty + return (!exists and empty) + end + has_many :digital_objects, :as => :attachable, :dependent => :destroy has_many :rel_unit_sources, :autosave => true, :dependent => :destroy @@ -65,6 +152,9 @@ class Unit < ActiveRecord::Base has_many :rel_unit_headings, :autosave => true, :dependent => :destroy has_many :headings, :through => :rel_unit_headings + has_many :rel_unit_anagraphics, :autosave => true, :dependent => :destroy + has_many :anagraphics, :through => :rel_unit_anagraphics + has_one :iccd_description has_one :iccd_tech_spec has_many :iccd_authors, :dependent => :destroy @@ -192,6 +282,61 @@ def sc2_commissions_reject_if(attributes) :allow_destroy => true, :reject_if => Proc.new { |a| a['heading_id'].blank? } + accepts_nested_attributes_for :rel_unit_anagraphics, + :allow_destroy => true, + :reject_if => Proc.new { |a| a['anagraphic_id'].blank? } + + accepts_nested_attributes_for :fsc_codes, :allow_destroy => true, :reject_if => :fsc_codes_reject_if + + def fsc_codes_reject_if(attributes) + exists = attributes[:id].present? + empty = attributes[:code].blank? + attributes.merge!({_destroy: 1}) if exists and empty + return (!exists and empty) + end + + accepts_nested_attributes_for :fsc_nationalities, :allow_destroy => true, :reject_if => :fsc_nationalities_reject_if + + def fsc_nationalities_reject_if(attributes) + exists = attributes[:id].present? + empty = attributes[:nationality].blank? + attributes.merge!({_destroy: 1}) if exists and empty + return (!exists and empty) + end + + accepts_nested_attributes_for :fsc_organizations, :allow_destroy => true, :reject_if => :fsc_organizations_reject_if + + def fsc_organizations_reject_if(attributes) + exists = attributes[:id].present? + empty = attributes[:organization].blank? + attributes.merge!({_destroy: 1}) if exists and empty + return (!exists and empty) + end + + accepts_nested_attributes_for :fsc_opens, :allow_destroy => true, :reject_if => :fsc_opens_reject_if + + def fsc_opens_reject_if(attributes) + exists = attributes[:id].present? + empty = attributes[:open].blank? + attributes.merge!({_destroy: 1}) if exists and empty + return (!exists and empty) + end + + accepts_nested_attributes_for :fsc_closes, :allow_destroy => true, :reject_if => :fsc_closes_reject_if + + def fsc_closes_reject_if(attributes) + exists = attributes[:id].present? + empty = attributes[:close].blank? + attributes.merge!({_destroy: 1}) if exists and empty + return (!exists and empty) + end + + #def personal_fscs_reject_if(attributes) + # empty = attributes[:code].blank? + # attributes.merge!({_destroy: 1}) if empty + # return empty + #end + # Validations validates_presence_of :title @@ -222,15 +367,15 @@ def sc2_commissions_reject_if(attributes) :allowed_ancestry_depth def matching_parent_and_fond - errors.add_to_base :not_matching_parent_and_fond if parent && fond_id != parent.fond_id + errors[:base] << :not_matching_parent_and_fond if parent && fond_id != parent.fond_id end def matching_fond_and_root_fond - errors.add_to_base :not_matching_fond_and_root_fond unless fond_id && root_fond_id && root_fond_id == fond.root_id + errors[:base] << :not_matching_fond_and_root_fond unless fond_id && root_fond_id && root_fond_id == fond.root_id end def allowed_ancestry_depth - errors.add_to_base :not_allowed_ancestry_depth if ancestry_depth > MAX_LEVEL_OF_NODES + errors[:base] << :not_allowed_ancestry_depth if ancestry_depth > MAX_LEVEL_OF_NODES end # Scopes @@ -395,6 +540,10 @@ def sorted_rel_unit_headings # Upgrade 2.0.0 fine end + def sorted_rel_unit_anagraphics + rel_unit_anagraphics.includes(:anagraphic).sort_by{|rel| rel.anagraphic.try(:name) || 'zz'} + end + def self.build_order_options(params) TreeExt::OrderOptionsBuilder.new(params, self).build_order_options end @@ -470,3 +619,4 @@ def set_root_fond_id end end + diff --git a/app/views/anagraphics/_anag_identifier.html.erb b/app/views/anagraphics/_anag_identifier.html.erb new file mode 100644 index 0000000..9be2dd1 --- /dev/null +++ b/app/views/anagraphics/_anag_identifier.html.erb @@ -0,0 +1,14 @@ +
+
+ <%= f.label :identifier, t('identifier') %> + <%= f.text_field :identifier, :class =>"span4" %> +
+
+ <%= f.label :qualifier, t('qualifier') %> + <%= f.text_field :qualifier, :class =>"span4" %> +
+
+ +
<%= f.check_box :_destroy %> <%= f.label :_destroy, t('destroy') %>
+
+
\ No newline at end of file diff --git a/app/views/anagraphics/_anag_modal_identifier.html.erb b/app/views/anagraphics/_anag_modal_identifier.html.erb new file mode 100644 index 0000000..0c247e4 --- /dev/null +++ b/app/views/anagraphics/_anag_modal_identifier.html.erb @@ -0,0 +1,11 @@ +
+
+ <%= f.label :identifier, t('identifier') %> + <%= f.text_field :identifier, :class =>"span4" %> + + <%= f.label :qualifier, t('qualifier') %> + <%= f.text_field :qualifier, :class =>"span4" %> + +
<%= f.check_box :_destroy %> <%= f.label :_destroy, t('destroy') %>
+
+
\ No newline at end of file diff --git a/app/views/anagraphics/_anagraphic_group.html.erb b/app/views/anagraphics/_anagraphic_group.html.erb new file mode 100644 index 0000000..21a1ed6 --- /dev/null +++ b/app/views/anagraphics/_anagraphic_group.html.erb @@ -0,0 +1,25 @@ + diff --git a/app/views/anagraphics/_form.html.erb b/app/views/anagraphics/_form.html.erb new file mode 100644 index 0000000..6f1f713 --- /dev/null +++ b/app/views/anagraphics/_form.html.erb @@ -0,0 +1,41 @@ +<%= render :partial => "shared/generic_error_message", object: @anagraphic, as: "object"%> + +<%= form_for @anagraphic do |f| %> + + <%= hidden_field_tag 'group_id', current_ability.target_group_id %> + +
+
+ <% @anag_identifiers = build_or_retrieve(f.object.anag_identifiers) %> +
+

<%= t('anagraphic_identifier') %>

+ <%= f.fields_for :anag_identifiers do |on_form| %> + <%= render :partial => "anag_identifier", :locals => { :f => on_form } %> + <% end %> +

<%= add_child_link t('new_anagraphic_identifier'), "anag_identifiers" %>

+
+
+ + <%= f.label 'anagraphic_name', raw(t('anagraphic_name') + required_marker) %> + <%= f.text_field :name, :class=> "span4" %> + + <%= f.label 'anagraphic_surname', raw(t('anagraphic_surname') + required_marker) %> + <%= f.text_field :surname, :class=> "span4" %> + + <%= f.label 'anagraphic_start_date_place', t('anagraphic_start_date_place') %> + <%= f.text_field :start_date_place, :class=> "span4" %> + + <%= f.label 'anagraphic_start_date', t('anagraphic_start_date') %> + <%= f.text_field :start_date, { :class => "span4 datepicker" } %> + + <%= f.label 'anagraphic_end_date_place', t('anagraphic_end_date_place') %> + <%= f.text_field :end_date_place, :class=> "span4" %> + + <%= f.label 'anagraphic_end_date', t('anagraphic_end_date') %> + <%= f.text_field :end_date, { :class => "span4 datepicker" } %> + +

<%= f.submit @anagraphic.new_record? ? t('create_anagraphic') : t('save'), :class => "btn btn-primary" %>

+
+<% end %> + + \ No newline at end of file diff --git a/app/views/anagraphics/_link_anagraphic.html.erb b/app/views/anagraphics/_link_anagraphic.html.erb new file mode 100644 index 0000000..33d84db --- /dev/null +++ b/app/views/anagraphics/_link_anagraphic.html.erb @@ -0,0 +1,36 @@ + + + diff --git a/app/views/anagraphics/_list_for.html.erb b/app/views/anagraphics/_list_for.html.erb new file mode 100644 index 0000000..b3cb836 --- /dev/null +++ b/app/views/anagraphics/_list_for.html.erb @@ -0,0 +1,13 @@ +<% if object.present? %> +
    + <% object.each do |h| %> +
  • + <%= h.full_string %> + <%= link_to "[rimuovi]", "#", :'data-anagraphic_id' => h.id, + :'data-related_entity' => params[:related_entity], + :'data-related_entity_id' => params[:related_entity_id], + :class => "anagraphic-remove" %> +
  • + <% end %> +
+<% end %> diff --git a/app/views/anagraphics/_new_anagraphic.html.erb b/app/views/anagraphics/_new_anagraphic.html.erb new file mode 100644 index 0000000..6a37bac --- /dev/null +++ b/app/views/anagraphics/_new_anagraphic.html.erb @@ -0,0 +1,48 @@ +<%= form_for @anagraphic, :remote => true do |f| %> + +<% end %> \ No newline at end of file diff --git a/app/views/anagraphics/edit.html.erb b/app/views/anagraphics/edit.html.erb new file mode 100644 index 0000000..64053d0 --- /dev/null +++ b/app/views/anagraphics/edit.html.erb @@ -0,0 +1,8 @@ +<% content_for :status_bar do %> +

<%= t('anagraphics') %><%= path_separator %><%= t('edit_anagraphic') %>

+ +<% end %> + +<%= render :partial => "form" %> diff --git a/app/views/anagraphics/import_csv.html.erb b/app/views/anagraphics/import_csv.html.erb new file mode 100644 index 0000000..3f868ae --- /dev/null +++ b/app/views/anagraphics/import_csv.html.erb @@ -0,0 +1,34 @@ +<% content_for :status_bar do %> +

<%= t('anagraphic') %><%= path_separator %><%= t('import_anagraphic') %>

+ +<% end %> + +
+ <%= form_for :upload, :url => preview_csv_anagraphics_path, :html => {:multipart => true } do |f| %> + <% if current_user.is_multi_group_user?() %> +
+ Per eseguire l'operazione è necessario selezionare il gruppo cui associare le schede anagrafiche che verranno importate scegliendolo tra i gruppi associati all'utente corrente. +
+
+ <%= label_tag :group_id, raw(t('devise.attributes.group_id') + required_marker + 'obbligatorio'), :class => "control-label" %> + <%= select :anagraphic, :group_id, rel_user_groups_select(current_user.rel_user_groups), {:prompt => t('devise.attributes.group_id_prompt'), :selected => current_user.rel_user_groups[0].group_id} %> +
+ <% else %> + <%= hidden_field_tag 'anagraphic[group_id]', current_ability.target_group_id %> + <% end %> + +
+

Puoi importare le anagrafiche da un file in formato CSV strutturato.

+ +

Ogni riga della prima tabella del file definisce una anagrafica mediante indicazione del valore di massimo sette colonne separate da ";" i cui contenuti sono assegnati nell'ordine ai seguenti campi: Numero di anagrafica, <%= t('anagraphic_name') %>, <%= t('anagraphic_surname') %>, <%= t('anagraphic_start_date') %>, <%= t('anagraphic_start_date_place') %>, <%= t('anagraphic_end_date') %>, <%= t('anagraphic_end_date_place') %>.

+

La prima riga è considerata titolo e il suo contenuto viene quindi ignorato.

+

Ogni riga della seconda tabella del file definisce gli identificativi mediante indicazione del valore di massimo tre colonne separate da ";" i cui contenuti sono assegnati nell'ordine ai seguenti campi: Numero di anagrafica associata, <%= t('anagraphic_identifier') %>, <%= t('anagraphic_qualifier') %>.

+

La riga vuota tra le due tabelle serve a distinguere i valori per l'import corretto, i numeri identificativi servono a stabilire la corretta associazione in fase di import.

+

<%= f.file_field :csv %>

+

<%= f.submit t('import_file'), :class => "btn btn-primary" %>

+ <% end %> +
+
+ diff --git a/app/views/anagraphics/index.html.erb b/app/views/anagraphics/index.html.erb new file mode 100644 index 0000000..d1c77ff --- /dev/null +++ b/app/views/anagraphics/index.html.erb @@ -0,0 +1,79 @@ +<% content_for :status_bar do %> +

<%= t('anagraphics') %>

+<% end %> + +
+
+
+ <% if current_user.is_multi_group_user?() %> + <%= link_to raw(t('new') + '   '), "#select_anagraphic_group_modal", { :"data-toggle" => "modal", :class => "btn btn-small new" } %> + <% else %> + <%= link_to t('new_anagraphic'), new_anagraphic_path, { :class => "btn btn-small new" } %> + <% end %> + <%= link_to raw(' ' + t('import_anagraphic')), import_csv_anagraphics_path, { :class => "btn btn-small" } %> +
+
+<% if false %> +<% if @counts_by_type.present? %> +

+ <% + s1 = link_to_unless(params[:view].nil?, "Tutti", anagraphics_path) + s2 = @terms.select {|l| l.vocabulary_name == "anagraphics.anagraphic_type"}.map {|a| + link_to_unless(params[:view] == "#{a.term_value}", "#{a.term_value} ", anagraphics_path(:view => "#{a.term_value}")) + + raw("(#{(number_with_delimiter(@counts_by_type[a.term_value]) || 0).to_s})") + } + %> + <%= raw(s1) + " | " + raw(s2.join(" | ")) if !s2.nil? && s2.length > 0 %> + <%= raw(s1) if s2.nil? || s2.length == 0 %> +

+<% end %> +<% end %> +<% if @anagraphics.size > 0 %> + +<%= display_page_entries_info @anagraphics %> + + + + + + + + + + <% if current_user.is_multi_group_user?() || current_user.is_superadmin?() %> + + <% end %> + + + + + <% @anagraphics.each do |anagraphic| %> + + + + + + + <% if current_user.is_multi_group_user?() || current_user.is_superadmin?() %> + + <% end %> + + + <% end %> + +
<%= sortable("anagraphics.name", t('anagraphic_name')) %><%= sortable("anagraphics.surname", t('anagraphic_surname')) %><%= sortable("anagraphics.start_date", t('anagraphic_start_date')) %><%= sortable("anagraphics.end_date", t('anagraphic_end_date')) %>Occorrenze<%= sortable("groups.short_name", t('list_group_short_name')) %> 
<%= link_to anagraphic.name, edit_anagraphic_path(anagraphic) %><%= anagraphic.surname %><%= (if anagraphic.start_date.nil? then "" else l anagraphic.start_date, :format => :long end) %><%= (if anagraphic.start_date.nil? then "" else l anagraphic.start_date, :format => :long end) %><%= link_to "#{number_with_delimiter(@units_counts[anagraphic.id] || "0")} unità", anagraphic_path(anagraphic) %><%= anagraphic.group.short_name %> + <%= link_to t('destroy'), anagraphic, data: {:confirm => t('are_you_sure')}, :method => :delete %> +
+ +
+ <%= will_paginate @anagraphics, :container => false %> +
+ +<% else %> +

Non sono presenti anagrafiche.

+<% end %> +
+ +<% if current_user.is_multi_group_user?() %> +<%= render :partial => "anagraphics/anagraphic_group" %> +<% end %> diff --git a/app/views/anagraphics/new.html.erb b/app/views/anagraphics/new.html.erb new file mode 100644 index 0000000..9c8901f --- /dev/null +++ b/app/views/anagraphics/new.html.erb @@ -0,0 +1,8 @@ +<% content_for :status_bar do %> +

<%= t('anagraphics') %><%= path_separator %><%= t('new_anagraphic') %>

+ +<% end %> + +<%= render :partial => "form" %> diff --git a/app/views/anagraphics/preview_csv.html.erb b/app/views/anagraphics/preview_csv.html.erb new file mode 100644 index 0000000..24aebaf --- /dev/null +++ b/app/views/anagraphics/preview_csv.html.erb @@ -0,0 +1,68 @@ +<% content_for :status_bar do %> +

<%= t('anagraphics') %><%= path_separator %><%= t('import_anagraphic') %><%= path_separator %><%= "Anteprima dell'importazione" %>

+ +<% end %> + +
+<%= form_tag '/anagraphics/save_csv' do -%> +

Sei sicuro di voler importare le seguenti anagrafiche?

+

+ <%= hidden_field_tag 'anagraphic[group_id]', current_ability.target_group_id %> + + <%= hidden_field_tag :filename, params[:upload][:csv].path -%> + <%= submit_tag t('confirm'), :class => "btn btn-primary" -%> oppure + <%= link_to t('cancel'), anagraphics_path -%> +

+<% end -%> +<% @breakrow = 0 %> +<% if @csv.size > 0 %> + + + + + + + + + + + <% @csv.each_with_index do |row, index| %> + <% if row.empty? + @breakrow = index +1 + break + else %> + + + + + + + + + + <% end %> + <% end %> +
<%= "#" %><%= t('anagraphic_name') %><%= t('anagraphic_surname') %><%= t('anagraphic_start_date_place') %><%= t('anagraphic_start_date') %><%= t('anagraphic_end_date_place') %><%= t('anagraphic_end_date') %>
<%= row[0] %><%= row[1] %><%= row[2] %><%= row[3] %><%= row[4] %><%= row[5] %><%= row[6] %>
+

Identificativi anagrafici

+ + + + + + + <% @csv.drop(@breakrow).each do |row| %> + + + + + + <% end %> +
<%= "#" %><%= t('anagraphic_identifier') %><%= t('anagraphic_qualifier') %>
<%= row[0] %><%= row[1] %><%= row[2] %>
+ +<% else %> +

<%= t('no_anagraphics') %>

+<% end %> + +
diff --git a/app/views/anagraphics/show.html.erb b/app/views/anagraphics/show.html.erb new file mode 100644 index 0000000..3db2a20 --- /dev/null +++ b/app/views/anagraphics/show.html.erb @@ -0,0 +1,61 @@ +<% content_for :status_bar do %> +

<%= t('anagraphics') %><%= path_separator %>Occorrenze anagrafica

+ +<% end %> + +
+ +

<%= show_value(@anagraphic.name) %> <%= show_value(@anagraphic.surname) %>, nato a <%= show_value(@anagraphic.start_date_place) %> in data <%= show_value(@anagraphic.start_date) %>

+ +<% if @units.size > 0 %> +

Unità collegate

+ <%= display_page_entries_info @units %> + + + + + + + + + <% @units.each do |unit| %> + "> + + + + <% end %> + +
+ <%= unit.display_sequence_number_from_hash(@display_sequence_numbers) %> + + <%= raw("—" * unit.ancestry_depth) %> + <% if false %> + <%= link_to unit.title, edit_iccd_unit_path(unit, :t => unit.tsk) %> + [<%= unit.tsk %>] + <% else %> + <%= link_to unit.formatted_title, edit_unit_path(unit) %> + <% end %> + <% if @fond.blank? || @fond.is_root? %> +
+ <% depth = @fond.blank? ? 0 : 1 %> + + <%= raw(unit.fond.path_items(depth).map(&:name).join(path_separator)) %> + +
+ <% end %> +
+ +
+ <%= will_paginate @units, :container => false %> +
+ +<% else %> +

Nessuna unità collegata a questa anagrafica.

+<% end %> + +<%= link_to t('edit'), edit_anagraphic_path(@anagraphic) %> | +<%= link_to t('back'), anagraphics_path %> + +
\ No newline at end of file diff --git a/app/views/creators/_catheader.xml.builder b/app/views/creators/_catheader.xml.builder new file mode 100644 index 0000000..9f84c70 --- /dev/null +++ b/app/views/creators/_catheader.xml.builder @@ -0,0 +1,11 @@ +xml.catheader do + xml.systemId "#{PROVIDER}" + xml.contact do + xml.name "INGLOBA360" + xml.mail "account@ingloba360.it" + end + xml.filedesc do + xml.title "Export da Archimista a SAN" + xml.date DateTime.now + end +end \ No newline at end of file diff --git a/app/views/creators/_creator.xml.builder b/app/views/creators/_creator.xml.builder new file mode 100644 index 0000000..a05adc0 --- /dev/null +++ b/app/views/creators/_creator.xml.builder @@ -0,0 +1,106 @@ +related_fonds = creator.fonds.where(["fond_id IN (?)", fond_ids]) +xml.catRecord do + xml.catRecordHeader :type => "soggetto produttore" do + xml.id "SP-#{creator.id}" + xml.lastUpdate creator.updated_at.strftime("%Y-%m-%dT%H:%M:%S") + end + xml.catRecordBody do + xml.tag! "eac-cpf", :xmlns => "http://san.mibac.it/eac-san/" do + xml.control do + xml.otherRecordId "SP-#{creator.id}", :localType => "#{metadata['PROVIDER_DL']}" + xml.maintenanceStatus "scheda pubblicata" + xml.sources do + xml.source :"xlink:href" => "#{CREATORS_URL}/#{creator.id}" + end + end + + types = {"C" => "corporateBody", "P" => "person", "F" => "family"} + entityType = types[creator.creator_type] + + xml.cpfDescription do + xml.identity do + xml.entityType entityType + xml.nameEntry do + xml.part creator.preferred_name.name + end + + # NOTA: non implementato 06: "Forma parallela nel caso di bilinguismo" + creator.other_names.each do |other_name| + xml.nameEntry :localType => "altradenominazione" do + xml.part other_name.name + end + end + end + + xml.description do + xml.existDates do + xml.dateSet do + if creator.preferred_event.present? + if creator.preferred_event.start_date_from.nil? + c_start_date = "00000101" + else + c_start_date = creator.preferred_event.start_date_from.strftime("%Y%m%d") + end + + if creator.preferred_event.end_date_to.nil? + c_end_date = "99991231" + else + c_end_date = creator.preferred_event.end_date_to.strftime("%Y%m%d") + end + + xml.date creator.preferred_event.full_display_date, { + :localType => "date di esistenza", + :standardDate => [c_start_date, c_end_date].uniq.join("/") + } + else + xml.date "non indicata", :standardDate => "00000101/99991231", :localType => "date di esistenza" + end + end + end + + # TODO: Persone - indicare luoghi di nascita e morte ? + if entityType == "corporateBody" + xml.placeDates do + xml.placeDate do + xml.place creator.residence.present? ? creator.residence : "non indicata" + xml.descriptiveNote "sede" + end + end + end + + # TODO: Persone - indicare activities ? + if entityType == "corporateBody" && creator.creator_corporate_type.present? + xml.descriptiveEntries do + xml.descriptiveEntry do + xml.term creator.creator_corporate_type.corporate_type + xml.descriptiveNote "tipologia ente" + end + end + end + + if creator.abstract.present? + xml.biogHist do + xml.abstract creator.abstract + end + end + end + + xml.relations do + related_fonds.each do |fond| + xml.resourceRelation :resourceRelationType => "creatorOf" do + xml.relationEntry "CA-#{fond.id}" + end + end + + creator.rel_creator_creators.each do |rel| + xml.cpfRelation :localType => rel.creator_association_type.association_type do + xml.relationEntry "SP-#{rel.related_creator_id}" + end + end + end + + end + end + end +end + diff --git a/app/views/creators/_creator_ead.xml.builder b/app/views/creators/_creator_ead.xml.builder new file mode 100644 index 0000000..33bed30 --- /dev/null +++ b/app/views/creators/_creator_ead.xml.builder @@ -0,0 +1,326 @@ +xml.control do + sc_id_str = sprintf '%08d', creator.id + xml.recordId "SP-#{sc_id_str}" + identifiers = creator.creator_identifiers + if identifiers.present? + identifiers.each do |identifier| + xml.otherRecordId identifier.identifier, :localType => CGI.escape(identifier.identifier_source) + end + end + xml.maintenanceStatus "new" + xml.publicationStatus "approved" + xml.maintenanceAgency do + xml.agencyName PROVIDER + end + xml.languageDeclaration do + xml.language "Italian", :languageCode => "ita" + xml.script "Italian", :scriptCode => "Ital" + end + xml.conventionDeclaration do + xml.citation "http://dati.san.beniculturali.it/SAN/TesauroSAN/Tipo_luogo_CPF" + end + xml.conventionDeclaration do + xml.citation "http://dati.san.beniculturali.it/SAN/TesauroSAN/natura_giuridica_ente" + end + xml.conventionDeclaration do + xml.citation "http://dati.san.beniculturali.it/SAN/TesauroSAN/sottotipologia_ente" + end + xml.conventionDeclaration do + xml.citation "ISO 639-2" + end + xml.conventionDeclaration do + xml.citation "ISO 8601" + end + xml.conventionDeclaration do + xml.citation "ISO 15924" + end + xml.conventionDeclaration do + xml.citation "NIERA" + end + xml.conventionDeclaration do + xml.citation "ISAAR(CPF)" + end + xml.maintenanceHistory do + editors = creator.creator_editors + if editors.present? + event_types = { + "aggiornamento scheda" => "updated", + "inserimento dati" => "created", + "integrazione successiva" => "updated", + "prima redazione" => "created", + "revisione" => "revised", + "rielaborazione" => "revised", + "schedatura" => "created" + } + editors.each do |editor| + xml.maintenanceEvent do + if editor.editing_type.present? + editing_type = editor.editing_type.downcase + event_type = event_types.key?(editing_type) ? event_types[editing_type] : "unknown" + else + event_type = "unknown" + end + + if editor.edited_at.present? + edited_at = editor.edited_at.strftime("%Y-%m-%dT%H:%M:%S") + end + + xml.eventType event_type + if !edited_at.nil? + xml.eventDateTime edited_at, :standardDateTime => edited_at + elsif + xml.eventDateTime "" + end + xml.agentType "human" + xml.agent editor.name + xml.eventDescription editor.qualifier + end + end + end + end +end +xml.cpfDescription do + creator_type = creator.creator_type.downcase + xml.identity :localType => "soggettoProduttore" do + types = {"c" => "corporateBody", "p" => "person", "f" => "family"} + entityType = types[creator_type] + xml.entityType entityType + case creator_type + when 'c' + parallel_names = Array.new + creator.other_names.each do |other_name| + if other_name.qualifier.downcase == "pa" + parallel_name = a = {'id' => other_name.id, 'name' => other_name.name, 'note' => other_name.note} + parallel_names << parallel_name + end + end + if parallel_names.empty? + xml.nameEntry do + xml.part creator.preferred_name.name + end + else + xml.nameEntryParallel do + xml.nameEntry do + xml.part creator.preferred_name.name + end + parallel_names.each do |parallel_name| + xml.nameEntry do + xml.part parallel_name['name'], :"xml:lang" => parallel_name['note'] + end + end + end + end + creator.other_names.each do |other_name| + qualifiers = {"au" => "altraDenominazione", "pa" => "parallela", "ac" => "altraDenominazione", "ot" => "altraDenominazione"} + qualifier = qualifiers.key?(other_name.qualifier.downcase) ? qualifiers[other_name.qualifier.downcase] : "altraDenominazione" + if qualifier == "parallela" + next + else + xml.nameEntry do + xml.part other_name.name, :localType => qualifier + end + end + end + when 'p' + xml.nameEntry do + xml.part creator.preferred_name.name, :localType => "denominazione" + end + creator.other_names.each do |other_name| + xml.nameEntry do + xml.part other_name.name, :localType => "altraDenominazione" + end + end + when 'f' + xml.nameEntry do + xml.part creator.preferred_name.name + end + creator.other_names.each do |other_name| + xml.nameEntry do + xml.part other_name.name, :localType => "altraDenominazione" + end + end + end + end + xml.description do + case creator_type + when 'c' + if creator.preferred_event.present? + xml.existDates do + xml.dateRange :localType => "Data di esistenza" do + if creator.preferred_event.start_date_format != "O" + xml.fromDate creator.preferred_event.start_date_display, :standardDate => creator.preferred_event.start_date_from.strftime("%Y-%m-%d") + else + xml.fromDate creator.preferred_event.start_date_display, :standardDate => "2099" + creator.preferred_event.start_date_from.strftime("-%m-%d") + end + if creator.preferred_event.end_date_format != "O" + xml.toDate creator.preferred_event.end_date_display, :standardDate => creator.preferred_event.end_date_to.strftime("%Y-%m-%d") + else + xml.toDate creator.preferred_event.end_date_display, :standardDate => "2099" + creator.preferred_event.end_date_to.strftime("-%m-%d") + end + end + if creator.preferred_event.note.present? + xml.descriptiveNote do + xml.p creator.preferred_event.note + end + end + end + end + xml.place do + xml.placeRole "TesauroSAN/sede", :vocabularySource => "http://dati.san.beniculturali.it/SAN/TesauroSAN/Tipo_luogo_CPF" + xml.placeEntry creator.residence.present? ? creator.residence : "non indicata" + end + xml.localDescription :localType => "tipologiaEnte" do + corporate_types = { + "stato" => "TesauroSAN/statali", + "regione" => "TesauroSAN/regione-regione_a_statuto_speciale_sp", + "ente pubblico territoriale" => "TesauroSAN/ente_territoriale_minore", + "ente funzionale territoriale" => "TesauroSAN/ente_territoriale_minore", + "ente economico / impresa" => "TesauroSAN/ente_economico-impresa-studio_professionale_sp", + "ente di credito, assicurativo, previdenziale" => "TesauroSAN/banca-istituto_di_credito-ente_assicurativo-ente_previdenziale", + "ente di assistenza e beneficenza" => "TesauroSAN/opera_pia-istituzione_ed_ente_assistenza_e_beneficenza_ospedale", + "ente sanitario" => "TesauroSAN/ente_sanitario-ente_servizi_alla_persona", + "ente di istruzione e ricerca" => "TesauroSAN/scuola-ente_di_istruzione", + "ente di cultura, ricreativo, sportivo, turistico" => "TesauroSAN/accademia_ente_di_cultura", + "partito politico, organizzazione sindacale" => "TesauroSAN/partito_e_movimento_politico-associazione_politica", + "ordine professionale, associazione di categoria" => "TesauroSAN/arte_ordine_collegio_associazione_di_categoria", + "ente e associazione della chiesa cattolica" => "TesauroSAN/ente_culto_cattolico-associazione_cattolica", + "ente e associazione di culto acattolico" => "TesauroSAN/ente_di_culto_acattolico-associazione_acattolica", + "preunitario" => "TesauroSAN/organo_e_ufficio_statale_centrale_del_periodo_preunitario", + "organo giudiziario" => "TesauroSAN/statali", + "organo periferico dello stato" => "TesauroSAN/organo_e_ufficio_statale_periferico_di_periodo_postunitario", + "ente ecclesiastico" => "TesauroSAN/corporazione_religiosa" + } + ente_type = creator.creator_corporate_type.corporate_type.downcase + corporate_type = corporate_types.key?(ente_type) ? corporate_types[ente_type] : "altro" + xml.term corporate_type, :vocabularySource => "http://dati.san.beniculturali.it/SAN/TesauroSAN/sottotipologia_ente" + end + when 'p' + if creator.preferred_event.present? + xml.existDates do + xml.dateRange do + if creator.preferred_event.start_date_format != "O" + xml.fromDate creator.preferred_event.start_date_display, :standardDate => creator.preferred_event.start_date_from.strftime("%Y-%m-%d") + else + xml.fromDate creator.preferred_event.start_date_display, :standardDate => "2099" + creator.preferred_event.start_date_from.strftime("-%m-%d") + end + if creator.preferred_event.end_date_format != "O" + xml.toDate creator.preferred_event.end_date_display, :standardDate => creator.preferred_event.end_date_from.strftime("%Y-%m-%d") + else + xml.toDate creator.preferred_event.end_date_display, :standardDate => "2099" + creator.preferred_event.end_date_from.strftime("-%m-%d") + end + end + end + if creator.preferred_event.start_date_place.present? + xml.place do + xml.placeRole "TesauroSAN/luogo di nascita", :vocabularySource => "http://dati.san.beniculturali.it/SAN/TesauroSAN/Tipo_luogo_CPF" + xml.placeEntry creator.preferred_event.start_date_place.present? ? creator.preferred_event.start_date_place : "non indicata" + end + end + if creator.preferred_event.end_date_place.present? + xml.place do + xml.placeRole "TesauroSAN/luogo di morte", :vocabularySource => "http://dati.san.beniculturali.it/SAN/TesauroSAN/Tipo_luogo_CPF" + xml.placeEntry creator.preferred_event.end_date_place.present? ? creator.preferred_event.end_date_place : "non indicata" + end + end + end + when 'f' + xml.existDates do + if creator.preferred_event.present? + xml.dateRange do + if creator.preferred_event.start_date_format != "O" + xml.fromDate creator.preferred_event.start_date_display, :standardDate => creator.preferred_event.start_date_from.strftime("%Y-%m-%d") + else + xml.fromDate creator.preferred_event.start_date_display, :standardDate => "2099" + creator.preferred_event.start_date_from.strftime("-%m-%d") + end + if creator.preferred_event.end_date_format != "O" + xml.toDate creator.preferred_event.end_date_display, :standardDate => creator.preferred_event.end_date_to.strftime("%Y-%m-%d") + else + xml.toDate creator.preferred_event.end_date_display, :standardDate => "2099" + creator.preferred_event.end_date_to.strftime("-%m-%d") + end + end + else + xml.dateRange do + xml.fromDate "non indicata", :standardDate => "0000-01-01" + xml.toDate "non indicata", :standardDate => "2099-12-31" + end + end + end + xml.place do + xml.placeRole "TesauroSAN/sede", :vocabularySource => "http://dati.san.beniculturali.it/SAN/TesauroSAN/Tipo_luogo_CPF" + xml.placeEntry "non indicato", :vocabularySource => "http://dati.san.beniculturali.it/ASI" + end + end + if creator.creator_legal_statuses.present? + status = {"PU" => "Pubblico", "PR" => "Privato", "EC" => "Ecclesiastico", "NA" => "Non definito"} + legalStatuses = creator.creator_legal_statuses + xml.legalStatuses do + legalStatuses.each do |ls| + xml.legalStatus do + xml.term status[ls.legal_status] + end + end + end + end + if creator.history.present? + xml.biogHist do + xml.abstract creator.abstract + xml.p creator.history + end + end + end + + xml.relations do + related_institutions = creator.rel_creator_institutions + if related_institutions.present? + related_institutions.each do |institution| + xml.cpfRelation :cpfRelationType => "hierarchical", :"xlink:href" => "#{INSTITUTIONS_URL}/#{institution.institution_id}" do + pi_id_str = sprintf '%08d', institution.id + xml.relationEntry "PI-#{pi_id_str}", :localType => "profiloIstituzionale" + end + end + end + + related_creators = creator.rel_creator_creators + if related_creators.present? + related_creators.each do |related_creator| + xml.cpfRelation :cpfRelationType => "associative", :"xlink:href" => "#{CREATORS_URL}/#{related_creator.related_creator_id}" do + sp_id_str = sprintf '%08d', related_creator.related_creator_id + xml.relationEntry "SP-#{sp_id_str}", :localType => "soggettoProduttore" + end + end + end + + related_fonds = creator.fonds.where(["fond_id IN (?)", fond_ids]) + if related_fonds.present? + related_fonds.each do |fond| + xml.resourceRelation :resourceRelationType => "creatorOf", :"xlink:href" => "#{FONDS_URL}/#{fond.id}" do + ca_id_str = sprintf '%08d', fond.id + xml.relationEntry "CA-#{ca_id_str}", :localType => "complesso" + end + end + end + + creator_sources = creator.sources + if creator_sources.present? + creator_sources.each do |creator_source| + if creator_source.source_type_code == 1 + localType = "BIBTEXT" + else + localType = "FONTETEXT" + end + xml.resourceRelation :resourceRelationType => "other", :"xlink:href" => "#{SOURCES_URL}/#{creator_source.id}" do + xml.relationEntry creator_source.title, :localType => localType + end + end + end + + related_urls = creator.creator_urls + if related_urls.present? + related_urls.each do |url| + xml.resourceRelation :resourceRelationType => "other", :"xlink:href" => url.url do + xml.relationEntry url.note, :localType => "URI" + end + end + end + end +end diff --git a/app/views/creators/_creators.xml.builder b/app/views/creators/_creators.xml.builder new file mode 100644 index 0000000..0232d91 --- /dev/null +++ b/app/views/creators/_creators.xml.builder @@ -0,0 +1,21 @@ +xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" +xml.tag! "cat-import", { + :"xmlns" => "http://san.mibac.it/cat-import", + :"xmlns:eac-cpf" => "http://san.mibac.it/eac-san/", + :"xmlns:ead-complarc" => "http://san.mibac.it/ead-san/", + :"xmlns:ead-str" => "http://san.mibac.it/ricerca-san/", + :"xmlns:scons" => "http://san.mibac.it/scons-san/", + :"xmlns:xlink" => "http://www.w3.org/1999/xlink", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xsi:schemaLocation" => "http://san.mibac.it/cat-import http://www.san.beniculturali.it/tracciato/cat-import.xsd" +} do + + xml << render(:partial => "catheader.xml") + + xml.catListRecords do + records.each do |creator| + xml << render(:partial => "creator.xml", :locals => {:creator => creator, :fond_ids => fond_ids, :metadata => metadata}) + end + end + +end \ No newline at end of file diff --git a/app/views/creators/_creators_ead.xml.builder b/app/views/creators/_creators_ead.xml.builder new file mode 100644 index 0000000..1060085 --- /dev/null +++ b/app/views/creators/_creators_ead.xml.builder @@ -0,0 +1,12 @@ +xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" +xml.tag! "eac-cpf", { + :"xsi:schemaLocation" => "urn:isbn:1-931666-33-4 http://eac.staatsbibliothek-berlin.de/schema/cpf.xsd", + :"xmlns" => "urn:isbn:1-931666-33-4", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xmlns:xs" => "http://www.w3.org/2001/XMLSchema", + :"xmlns:xlink" => "http://www.w3.org/1999/xlink" +} do + records.each do |creator| + xml << render(:partial => "creator_ead.xml", :locals => {:creator => creator, :fond_ids => fond_ids}) + end +end diff --git a/app/views/creators/_form.html.erb b/app/views/creators/_form.html.erb index dd124f4..4408aba 100644 --- a/app/views/creators/_form.html.erb +++ b/app/views/creators/_form.html.erb @@ -38,7 +38,7 @@ <%= f.label :creator_corporate_type, t('creator_corporate_type'), {:class => "hide"} %> <%= select( "creator", "creator_corporate_type_id", CreatorCorporateType.all.collect {|p| [ p.corporate_type.capitalize, p.id ] }, - {:include_blank => false, + {:include_blank => "---", :selected => @creator.creator_corporate_type_id}, :class => "hide span5") %> diff --git a/app/views/creators/show.xml.builder b/app/views/creators/show.xml.builder new file mode 100644 index 0000000..a591651 --- /dev/null +++ b/app/views/creators/show.xml.builder @@ -0,0 +1,213 @@ +xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" +xml.tag! "eac-cpf", { + :"xsi:schemaLocation" => "http://eac.staatsbibliothek-berlin.de/schema/cpf.xsd", + :"xmlns" => "urn:isbn:1-931666-33-4", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xmlns:xs" => "http://www.w3.org/2001/XMLSchema", + :"xmlns:xlink" => "http://www.w3.org/1999/xlink" +} do + xml.control do + xml.recordid "SP.#{@creator.id}" + xml.maintenancestatus "new" + xml.publicationtatus @creator.published? ? "published" : "not published" + xml.maintenanceagency do + xml.agencyname PROVIDER + end + xml.languagedeclaration do + xml.language "Italian", :languageCode => "ita" + xml.script "Italian", :scriptCode => "Italiano" + end + xml.conventiondeclaration do + xml.citation PROVIDER + end + editors = @creator.creator_editors + event_type = {"Aggiornamento scheda" => "updated", "Inserimento dati" => "created", + "Integrazione successiva" => "updated", "Prima redazione" => "revised", + "Revisione" => "revised", "Rielaborazione" => "derived", "Schedatura" => "unknown"} + if editors.present? + xml.maintenanceHistory do + editors.each do |editor| + xml.maintenanceEvent do + xml.eventType event_type[editor.editing_type] + xml.eventDateTime editor.edited_at, :standardDate => editor.edited_at.strftime("%Y-%m-%dT%H:%M:%S") + xml.agentType "human" + xml.agent editor.name + end + end + end + end + end + xml.cpfDescription do + xml.identity do + types = {"C" => "corporateBody", "P" => "person", "F" => "family"} + entityType = types[@creator.creator_type] + xml.entityType entityType + xml.nameEntry do + xml.part @creator.preferred_name.name, :localType => "Denominazione" + end + qualifier = {"PA" => "Denominazione parallela", "AC" => "Acronimo", "OT" => "Altre denominazioni"} + @creator.other_names.each do |other_name| + entityQualifier = qualifier[other_name.qualifier] + xml.nameEntry :localType => entityQualifier do + xml.part other_name.name + end + end + end + xml.description do + case @creator.creator_type + when 'C' + xml.existDates do + xml.dateRange :localType => "Data di esistenza" do + xml.fromDate @creator.preferred_event.start_date_display, :standardDate => @creator.preferred_event.start_date_from.strftime("%Y-%m-%d") + xml.toDate @creator.preferred_event.end_date_display, :standardDate => @creator.preferred_event.end_date_to.strftime("%Y-%m-%d") + end + end + xml.place do + xml.placeRole "Sede" + xml.placeEntry @creator.residence.present? ? @creator.residence : "non indicata" + if @creator.preferred_event.note.present? + xml.descriptiveNote do + xml.p @creator.preferred_event.note + end + end + end + when 'P' + xml.existDates do + xml.date @creator.preferred_event.start_date_display, :standardDate => @creator.preferred_event.start_date_from.strftime("%Y%m%d"), :localType => "Data di nascita" + end + xml.existDates do + xml.date @creator.preferred_event.end_date_display, :standardDate => @creator.preferred_event.end_date_from.strftime("%Y%m%d"), :localType => "Data di morte" + end + if @creator.preferred_event.present? + if @creator.preferred_event.start_date_place.present? + xml.place do + xml.placeRole "Luogo di nascita" + xml.placeEntry @creator.preferred_event.start_date_place.present? ? @creator.preferred_event.start_date_place : "non indicata" + if @creator.preferred_event.note.present? + xml.descriptiveNote do + xml.p @creator.preferred_event.note + end + end + end + end + if @creator.preferred_event.end_date_place.present? + xml.place do + xml.placeRole "Luogo di morte" + xml.placeEntry @creator.preferred_event.end_date_place.present? ? @creator.preferred_event.end_date_place : "non indicata" + if @creator.preferred_event.note.present? + xml.descriptiveNote do + xml.p @creator.preferred_event.note + end + end + end + end + end + when 'F' + xml.existDates :localType => "Data remota" do + xml.dateRange do + xml.fromDate @creator.preferred_event.start_date_display, :standardDate => @creator.preferred_event.start_date_from.strftime("%Y-%m-%d") + xml.toDate @creator.preferred_event.start_date_display, :standardDate => @creator.preferred_event.start_date_to.strftime("%Y-%m-%d") + end + end + xml.existDates :localType => "Data recente" do + xml.dateRange do + xml.fromDate @creator.preferred_event.end_date_display, :standardDate => @creator.preferred_event.end_date_from.strftime("%Y-%m-%d") + xml.toDate @creator.preferred_event.end_date_display, :standardDate => @creator.preferred_event.end_date_to.strftime("%Y-%m-%d") + end + end + xml.place do + xml.placeRole "Luogo" + xml.placeEntry "non indicato" + if @creator.preferred_event.note.present? + xml.descriptiveNote do + xml.p @creator.preferred_event.note + end + end + end + end + if @creator.creator_identifiers.present? + identifiers = @creator.creator_identifiers + identifiers.each do |id| + xml.localDescription :localType => "Codici" do + xml.term id.identifier + xml.descriptiveNote do + xml.p id.note + end + end + end + end + if @creator.creator_legal_statuses.present? + status = {"PU" => "Pubblico", "PR" => "Privato", "EC" => "Ecclesiastico", "NA" => "Non definito"} + legalStatuses = @creator.creator_legal_statuses + xml.legalStatuses do + legalStatuses.each do |ls| + xml.legalStatus do + xml.term status[ls.legal_status] + end + end + end + end + if @creator.history.present? + xml.biogHist do + xml.abstract @creator.history + end + end + end + xml.relations do + related_fonds = @creator.fonds + if related_fonds.present? + related_fonds.each do |fond| + xml.cpfRelation :cpfRelationType => "creatorOf", :"href" => "#{FONDS_URL}/#{fond.id}" do + xml.relationEntry "CA.#{fond.id}", :localType => "Complesso" + end + end + end + + related_institutions = @creator.rel_creator_institutions + if related_institutions.present? + related_institutions.each do |institution| + xml.cpfRelation :cpfRelationType => "hierarchical", :"href" => "#{INSTITUTIONS_URL}/#{institution.id}" do + xml.relationEntry "PI.#{institution.id}", :localType => "Profilo Istituzionale" + end + end + end + + related_creators = @creator.rel_creator_creators + if related_creators.present? + related_creators.each do |rel| + xml.cpfRelation :cpfRelationType => rel.creator_association_type.association_type , :"href" => "#{CREATORS_URL}/#{rel.related_creator_id}" do + xml.relationEntry "SP.#{rel.related_creator_id}", :localType => "Soggetto Produttore" + end + end + end + + relcreatorsourcesbib = @creator.sources.where("source_type_code = 1") + if relcreatorsourcesbib.present? + relcreatorsourcesbib.each do |rcsb| + xml.cpfRelation :cpfRelationType => "other" do + xml.relationentry "SR.#{rcsb.id}", :localType => "BIBID" + end + end + end + + relcreatorsourcesfonte = @creator.sources.where("source_type_code = 2") + if relcreatorsourcesfonte.present? + relcreatorsourcesfonte.each do |rcsf| + xml.cpfRelation :cpfRelationType => "other" do + xml.relationentry "SR.#{rcsf.id}", :localType => "FONTEID" + end + end + end + + related_urls = @creator.creator_urls + if related_urls.present? + related_urls.each do |url| + xml.cpfRelation :cpfRelationType => "other", :"href" => url.url do + xml.relationEntry url.note, :localType => "URI" + end + end + end + + end + end +end diff --git a/app/views/custodians/_catheader.xml.builder b/app/views/custodians/_catheader.xml.builder new file mode 100644 index 0000000..9f84c70 --- /dev/null +++ b/app/views/custodians/_catheader.xml.builder @@ -0,0 +1,11 @@ +xml.catheader do + xml.systemId "#{PROVIDER}" + xml.contact do + xml.name "INGLOBA360" + xml.mail "account@ingloba360.it" + end + xml.filedesc do + xml.title "Export da Archimista a SAN" + xml.date DateTime.now + end +end \ No newline at end of file diff --git a/app/views/custodians/_custodian.xml.builder b/app/views/custodians/_custodian.xml.builder new file mode 100644 index 0000000..c0e5849 --- /dev/null +++ b/app/views/custodians/_custodian.xml.builder @@ -0,0 +1,49 @@ +xml.catRecord do + xml.catRecordHeader :type => "soggetto conservatore" do + xml.id "SC-#{custodian.id}" + xml.lastUpdate custodian.updated_at.strftime("%Y-%m-%dT%H:%M:%S") + end + xml.catRecordBody do + xml.scons :xmlns => "http://san.mibac.it/scons-san/" do + + xml.formaautorizzata custodian.preferred_name.name + # NOTA: non implementato 06: "Forma parallela nel caso di bilinguismo" + + #acronimo = custodian.other_names.first(:conditions => "qualifier = 'AC'") + acronimo = custodian.other_names.where("qualifier = 'AC'").first + xml.acronimo acronimo.name if acronimo.present? + + xml.identifier :href => "#{CUSTODIANS_URL}/#{custodian.id}" do + xml.recordId "SC-#{custodian.id}" + xml.sistemaId "#{metadata['PROVIDER_DL']}" + end + + tipologia = custodian.custodian_type.present? ? custodian.custodian_type.custodian_type : "non indicata" + xml.tipologia tipologia + + # OPTIMIZE: schiacciare localizzazioni doppie ? + # Oppure considerare solo "sede legale" (custodian_headquarter) ? ma non sempre è compilato... + custodian.custodian_buildings.each do |building| + if building.city.present? + city = building.city.chomp(')').split('(') + xml.tag! "localizzazione", {:comune => city[0].strip, :provincia => city[1], :cap => building.postcode, :paese => building.country}, building.address + end + end + + custodian.custodian_urls.each do |url| + xml.sitoweb :href => url.url + end + + xml.servizi custodian.services if custodian.services.present? + xml.descrizione custodian.history if custodian.history.present? + + # FIXME: il campo SAN "altroaccesso" (come "orario") ha come limite 1024 caratteri. Archimista non ha limite. + # Il superamento del limite blocca l'importazione in SAN, d'altra parte non conviene troncare l'html. + # SELECT id, char_length(accessibility) FROM custodians ORDER BY char_length(accessibility) desc; + # Che fare ? Per ora non si rileva il dato. + xml.altroaccesso "" # textilize(custodian.accessibility) + xml.consultazione "" + + end + end +end \ No newline at end of file diff --git a/app/views/custodians/_custodian_ead.xml.builder b/app/views/custodians/_custodian_ead.xml.builder new file mode 100644 index 0000000..a1871fb --- /dev/null +++ b/app/views/custodians/_custodian_ead.xml.builder @@ -0,0 +1,137 @@ +xml.tag! "scons", { + :"xsi:schemaLocation" => "http://www.san.beniculturali.it/scons2 http://www.san.beniculturali.it/tracciato/scons2.xsd", + :"xmlns" => "http://www.san.beniculturali.it/scons2", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xmlns:xlink" => "http://www.w3.org/1999/xlink" +} do + editors = custodian.custodian_editors + if !editors.empty? + xml.info do + event_types = { + "aggiornamento scheda" => "modifica", + "inserimento dati" => "creazione", + "integrazione successiva" => "modifica", + "prima redazione" => "creazione", + "revisione" => "modifica", + "rielaborazione" => "modifica", + "schedatura" => "altro" + } + editors.each do |editor| + if editor.edited_at.present? + event_date = editor.edited_at.strftime("%Y-%m-%dT%H:%M:%S") + else + event_date = "" + end + xml.evento :dataEvento => event_date, :tipoEvento => event_types[editor.editing_type.downcase] do + xml.agente :tipo => "persona" do + xml.cognome editor.name + end + end + end + end + end + xml.identificativi do + xml.identificativosistema PROVIDER + id_str = sprintf '%08d', custodian.id + xml.identificativo "SC-#{id_str}", :tipo => PROVIDER, :href => "#{CUSTODIANS_URL}/#{custodian.id}" + if custodian.custodian_identifiers.present? + custodian.custodian_identifiers.each do |identifier| + xml.altroidentificativo identifier.identifier, :tipo => identifier.identifier_source + end + end + end + xml.denominazione custodian.preferred_name.name, :qualifica => "principale" + if custodian.other_names.present? + qualifiers = {"au" => "altraDenominazione", "pa" => "parallela", "ac" => "acronimo", "ot" => "altraDenominazione"} + custodian.other_names.each do |other_name| + qualifica = qualifiers[other_name.qualifier.downcase] + if (qualifica == "parallela") + if (other_name.note.nil? || other_name.note.empty? || (other_name.note.downcase.match(/(a-z){3}/) == nil)) + lingua = "nnn" + else + lingua = other_name.note.downcase + end + xml.denominazione other_name.name, :qualifica => qualifica, :lingua => lingua + else + xml.denominazione other_name.name, :qualifica => qualifica + end + end + end + custodian_types = { + "stato" => "TesauroSAN/archivio_di_Stato", + "regione" => "TesauroSAN/regione-regione_a_statuto_speciale_conservatore", + "ente pubblico territoriale" => "TesauroSAN/ente_territoriale", + "ente funzionale territoriale" => "TesauroSAN/ente_diverso", + "ente economico / impresa" => "TesauroSAN/ente_economico-impresa-studio_professionale_conservatore", + "ente di credito, assicurativo, previdenziale" => "TesauroSAN/istituto_di_credito", + "ente di assistenza e beneficenza" => "TesauroSAN/ente_di_assistenza-beneficenza-previdenza-servizi_alla_persona", + "ente sanitario" => "TesauroSAN/ente_sanitario", + "ente di istruzione e ricerca" => "TesauroSAN/ente_di_cultura-ente_di_ricerca", + "ente di cultura, ricreativo, sportivo, turistico" => "TesauroSAN/ente_ricreativo-sportivo-turistico_conservatore", + "partito politico, organizzazione sindacale" => "TesauroSAN/sindacato-organizzazione_sindacale_conservatore", + "ordine professionale, associazione di categoria" => "TesauroSAN/arte-ordine-collegio-associazione_di_categoria", + "ente e associazione della chiesa cattolica" => "TesauroSAN/ente_e_associazione_di_culto_cattolico", + "ente e associazione di culto acattolico" => "TesauroSAN/ente_e_associazione_di_culti_acattolici", + "persona o famiglia" => "TesauroSAN/persona-famiglia" + } + custodian_type = custodian.custodian_type.present? ? custodian_types[custodian.custodian_type.custodian_type.downcase] : "altro" + xml.tipologia custodian_type + xml.localizzazioni do + if custodian.legal_status == "PU" + privato = "N" + else + privato = "S" + end + custodian.custodian_buildings.each_with_index do |custodian_building, i| + if i == 0 + principale = "S" + else + principale = "N" + end + if custodian_building.custodian_building_type == "sede di consultazione" + consultazione = "S" + else + consultazione = "N" + end + xml.localizzazione :identificativo => custodian_building.id, :principale => principale, :consultazione => consultazione, :privato => privato do + xml.denominazione custodian_building.name + attributes = {:paese => "ITA", :comune => custodian_building.city} + if custodian_building.postcode.present? + attributes[:cap] = custodian_building.postcode + end + if custodian_building.address.present? + attributes[:denominazioneStradale] = custodian_building.address + end + xml.indirizzo attributes + if (i < 1) + if custodian.custodian_contacts.present? + contact_types = {"tel" => "telefono", "fax" => "fax", "email" => "mail", "pec" => "pec", "web" => "web"} + custodian.custodian_contacts.each do |custodian_contacts| + contact_type = custodian_contacts.contact_type? ? contact_types[custodian_contacts.contact_type.downcase] : "altro" + xml.contatto custodian_contacts.contact, :tipo => contact_type + end + end + xml.orario custodian.accessibility + end + end + end + end + xml.descrizione custodian.history + xml.servizi custodian.services + xml.relazioni do + custodian.custodian_urls.each do |custodian_url| + xml.relazione (custodian_url.note.present? ? custodian_url.note : custodian_url.url), :tipo => "URL", :href => custodian_url.url + end + custodian.sources.each do |source| + if (source.source_type.code == 1) + xml.relazione source.title, :tipo => "BIBTEXT", :href => "#{SOURCES_URL}/#{source.id}" + else + xml.relazione source.title, :tipo => "FONTETEXT", :href => "#{SOURCES_URL}/#{source.id}" + end + end + custodian.fonds.each do |fond| + fond_id_str = sprintf '%08d', fond.id + xml.relazione "CA-#{fond_id_str}", :tipo => "COMPL", :href => "#{FONDS_URL}/#{fond.id}" + end + end +end diff --git a/app/views/custodians/_custodians.xml.builder b/app/views/custodians/_custodians.xml.builder new file mode 100644 index 0000000..4d8aafd --- /dev/null +++ b/app/views/custodians/_custodians.xml.builder @@ -0,0 +1,21 @@ +xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" +xml.tag! "cat-import", { + :"xmlns" => "http://san.mibac.it/cat-import", + :"xmlns:eac-cpf" => "http://san.mibac.it/eac-san/", + :"xmlns:ead-complarc" => "http://san.mibac.it/ead-san/", + :"xmlns:ead-str" => "http://san.mibac.it/ricerca-san/", + :"xmlns:scons" => "http://san.mibac.it/scons-san/", + :"xmlns:xlink" => "http://www.w3.org/1999/xlink", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xsi:schemaLocation" => "http://san.mibac.it/cat-import http://www.san.beniculturali.it/tracciato/cat-import.xsd" +} do + + xml << render(:partial => "catheader.xml") + + xml.catListRecords do + records.each do |custodian| + xml << render(:partial => "custodian.xml", :locals => {:custodian => custodian, :metadata => metadata}) + end + end + +end \ No newline at end of file diff --git a/app/views/custodians/_custodians_ead.xml.builder b/app/views/custodians/_custodians_ead.xml.builder new file mode 100644 index 0000000..eeed4dd --- /dev/null +++ b/app/views/custodians/_custodians_ead.xml.builder @@ -0,0 +1,6 @@ +xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" +records.each do |custodian| + xml << render(:partial => "custodian_ead.xml", :locals => {:custodian => custodian}) +end + + diff --git a/app/views/custodians/show.xml.builder b/app/views/custodians/show.xml.builder new file mode 100644 index 0000000..12d9315 --- /dev/null +++ b/app/views/custodians/show.xml.builder @@ -0,0 +1,69 @@ +xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" +xml.scons do + published = @custodian.published? ? "Pubblicato" : "Non pubblicato" + xml.info :datacreazione => "#{@custodian.created_at}", :status => published do + editors = @custodian.custodian_editors + editors.each do |e| + xml.agente :ruolo => e.qualifier, :tipo => "Persona" do + xml.nome e.name + xml.intervento e.editing_type + xml.data e.edited_at, :format => :long + end + end + end + xml.formaautorizzata @custodian.preferred_name.name + if @custodian.other_names.present? + @custodian.other_names.each do |other_name| + xml.altradenominazione show_item(other_name.name), :qualifica => show_item(t(other_name.qualifier)).capitalize + end + end + xml.identifier :type => PROVIDER, :href => "#{CUSTODIANS_URL}/#{@custodian.id}" do + xml.recordId "SC-#{@custodian.id}" + xml.OtherRecordId "#{DL_CONSERVATORE}" + xml.sistemaId "#{PROVIDER}" + xml.status published + end + if @custodian.custodian_type.present? + xml.tipologia @custodian.custodian_type.custodian_type.capitalize + end + xml.localizzazioni do + @custodian.custodian_buildings.each_with_index do |custodian_building, i| + xml.localizzazione :paese => show_item(custodian_building.country), :comune => show_item(custodian_building.city), :cap => show_item(custodian_building.postcode) do + xml.text!("#{show_item(custodian_building.name)}") + xml.indirizzo "#{show_item(custodian_building.address)}" + if(i < 1) + if @custodian.custodian_contacts.present? + @custodian.custodian_contacts.each do |custodian_contacts| + xml.contatto custodian_contacts.contact, {:tipo => custodian_contacts.contact_type} + end + end + xml.orario @custodian.accessibility + xml.accesso @custodian.services + end + end + end + end + xml.relazioni do + urls = @custodian.custodian_urls + urls.each do |url| + xml.relazione (url.note.present? ? url.note : url.url), {:tipo => "URL", :href => "#{url.url}"} + end + sources = @custodian.sources + sources.each do |source| + if (source.source_type.code == 1) + xml.relazione source.title, {:tipo => "BIB", :sottotipo => "#{source.source_type.source_type}" } + elsif (source.source_type.code == 3 || source.source_type.code == 4) + xml.relazione source.title, {:tipo => "FONTE", :id => "SR-#{source.id}"} + end + end + fonds = @custodian.fonds + if(fonds.length > 0) + xml.complessi do + fonds.each do |fond| + xml.complesso "CA-#{fond.id}", {:tipo => PROVIDER, :href => "#{FONDS_URL}/#{fond.id}", :data => "#{fond.created_at.strftime("%Y%m%d")}"} + end + end + end + end + xml.descrizione @custodian.history +end diff --git a/app/views/digital_objects/_digital_object.xml.builder b/app/views/digital_objects/_digital_object.xml.builder new file mode 100644 index 0000000..5a3b563 --- /dev/null +++ b/app/views/digital_objects/_digital_object.xml.builder @@ -0,0 +1,150 @@ +xml.tag! "envelope:record" do + +xml.tag! "envelope:recordHeader", :DIRECTIVE => "UPSERT" do + xml.tag! "envelope:recordIdentifier", "#{metadata['PROVIDER_DL']}-UA-#{unit.id}" + xml.tag! "envelope:recordDatestamp", Time.now.strftime("%Y-%m-%dT%H:%M:%S") +end + +xml.tag! "envelope:recordBody" do + xml.tag! "mets:mets" do + + custodians = unit.fond.root.custodians + + xml.tag! "mets:metsHdr", { + :CREATEDATE => Time.now.strftime("%Y-%m-%dT%H:%M:%S"), + :LASTMODDATE => Time.now.strftime("%Y-%m-%dT%H:%M:%S"), + :RECORDSTATUS => "Complete" + } do + + xml.tag! "mets:agent", :TYPE => "ORGANIZATION", :ROLE => "CREATOR" do + xml.tag! "mets:name", metadata['PROVIDER_DL'] + end + + xml.tag! "mets:agent", :TYPE => "ORGANIZATION", :ROLE => "IPOWNER" do + xml.tag! "mets:name", custodians.present? ? custodians[0].preferred_name.name : metadata['PROVIDER_DL'] + end + + xml.tag! "mets:altRecordID", "#{metadata['PROVIDER_DL']}:UA-#{unit.id}", :TYPE => metadata['PROVIDER_DL'] + + end + + xml.tag! "mets:dmdSec", :GROUPID => "desc", :ID => "ead-context-001" do + xml.tag! "mets:mdWrap", :MIMETYPE => "text/xml", :LABEL => "Contesto", :MDTYPE => "EAD", :MDTYPEVERSION => "Arch" do + xml.tag! "mets:xmlData" do + xml.tag! "ead-context:ead" do + xml.tag! "ead-context:archdesc" do + xml.tag! "ead-context:did" do + xml.tag! "ead-context:unitid", "#{metadata['DL_UNITID']}" + xml.tag! "ead-context:unittitle", "#{metadata['DL_UNITTITLE']}" + if custodians.present? + xml.tag! "ead-context:repository", :id => "#{metadata['DL_REPOSITORYID']}" do + xml.tag! "ead-context:corpname", "#{metadata['DL_CORPNAME']}" + xml.tag! "ead-context:abbr", "#{metadata['DL_ABBR']}" + end + end + end + end + end + end + end + end + + xml.tag! "mets:dmdSec", :GROUPID => "desc", :ID => "ead-desc-001" do + xml.tag! "mets:mdWrap", :MIMETYPE => "text/xml", :LABEL => "Descrizione oggetto", :MDTYPE => "EAD", :MDTYPEVERSION => "Arch" do + xml.tag! "mets:xmlData" do + xml.tag! "ead:c" do + xml.tag! "ead:did" do + xml.tag! "ead:unitid", "#{metadata['PROVIDER_DL']}:UA-#{unit.id}" + xml.tag! "ead:unittitle", unit.title + if unit.content.present? + xml.tag! "ead:abstract", unit.content + else + xml.tag! "ead:abstract", "" + end + if unit.preferred_event.present? + xml.tag! "ead:unitdate", unit.preferred_event.full_display_date, { + :normal => [unit.preferred_event.start_date_from.strftime("%Y%m%d"), unit.preferred_event.end_date_to.strftime("%Y%m%d")].uniq.join("/"), + :datechar => "principale" + } + else + xml.tag! "ead:unitdate", "non indicata", :normal => "00000101", :datechar => "non indicata" + end + xml.tag! "ead:physdesc" do + xml.tag! "ead:genreform", unit.unit_type, :type => "tipologie documentarie" + end + lingue = unit.unit_langs + if lingue.present? + lingue.each do |l| + xml.tag! "ead:langmaterial" do + xml.tag! "ead:language", :langcode => l.code + end + end + end + end + xml.tag! "ead:dao", :"xlink:href" => "#{FONDS_URL}/#{unit.fond.id}/units/#{unit.id}" + end + end + end + end + + xml.tag! "mets:dmdSec", :ID => "rel" do + xml.tag! "mets:mdWrap", :MIMETYPE => "text/xml", :LABEL => "Relazioni SAN", :MDTYPE => "OTHER", :OTHERMDTYPE => "RDF" do + xml.tag! "mets:xmlData" do + xml.tag! "rdf:RDF" do + xml.tag! "rdf:Description", :"rdf:about" => "#{metadata['PROVIDER_DL']}:UA-#{unit.id}" do + xml.tag! "san-dl:haSistemaAderente", :"rdf:resource" => metadata['PROVIDER_DL'] + xml.tag! "san-dl:haProgettoDigitalizzazione", :"rdf:resource" => metadata['DL_HAPROGETTO'] + xml.tag! "san-dl:haConservatore", :"rdf:resource" => metadata['DL_HACONSERVATORE'] + xml.tag! "san-dl:haComplesso", :"rdf:resource" => metadata['DL_HACOMPLESSO'] + end + end + end + end + end + + xml.tag! "mets:amdSec" do + xml.tag! "mets:rightsMD", :ID => "amdRD001" do + xml.tag! "mets:mdWrap", :MIMETYPE => "text/xml", :LABEL => "Diritti oggetto digitale", :MDTYPE => "METSRIGHTS" do + xml.tag! "mets:xmlData" do + xml.tag! "metsrights:RightsDeclarationMD", :RIGHTSCATEGORY => "COPYRIGHTED" do + xml.tag! "metsrights:RightsHolder" do + xml.tag! "metsrights:RightsHolderName", custodians.present? ? custodians[0].preferred_name.name : metadata['PROVIDER_DL'] + end + end + end + end + end + + xml.tag! "mets:rightsMD", :ID => "amdRA001" do + xml.tag! "mets:mdWrap", :MIMETYPE => "text/xml", :LABEL => "Diritti oggetto analogico", :MDTYPE => "METSRIGHTS" do + xml.tag! "mets:xmlData" do + xml.tag! "metsrights:RightsDeclarationMD", :RIGHTSCATEGORY => "COPYRIGHTED" do + xml.tag! "metsrights:RightsHolder" do + xml.tag! "metsrights:RightsHolderName", custodians.present? ? custodians[0].preferred_name.name : metadata['PROVIDER_DL'] + end + end + end + end + end + end + + xml.tag! "mets:fileSec" do + dob = unit.digital_objects.all.order(:position).first + dob_id_str = sprintf '%08d', dob.id + xml.tag! "mets:fileGrp", :USE => "thumbnail image" do + xml.tag! "mets:file", :MIMETYPE => "image/jpeg", :ID => "OD-#{dob_id_str}" do + xml.tag! "mets:FLocat", :LOCTYPE => "URL", + :"xlink:href" => "#{DIGITAL_OBJECTS_URL}/#{dob.access_token}/thumb.jpg" + end + end + xml.tag! "mets:fileGrp", :USE => "reference image" do + xml.tag! "mets:file", :MIMETYPE => "image/jpeg", :ID => "OD-#{dob_id_str}" do + xml.tag! "mets:FLocat", :LOCTYPE => "URL", :"xlink:href" => "#{DIGITAL_OBJECTS_URL}/#{dob.access_token}/original.jpg" + end + end + end + + end +end + +end diff --git a/app/views/digital_objects/_digital_objects.xml.builder b/app/views/digital_objects/_digital_objects.xml.builder new file mode 100644 index 0000000..cf69b22 --- /dev/null +++ b/app/views/digital_objects/_digital_objects.xml.builder @@ -0,0 +1,27 @@ +xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" +xml.tag! "envelope:envelope", { + :"xmlns:ead" => "http://san.mibac.it/ead-san-objdig/", + :"xmlns:ead-context" => "http://san.mibac.it/ead-san-objdig/context", + :"xmlns:ead-noarch" => "http://san.mibac.it/ead-san-objdig-noarch/", + :"xmlns:envelope" => "http://san.beniculturali.it/envelope-san/", + :"xmlns:mets" => "http://san.mibac.it/mets-san/", + :"xmlns:metsrights" => "http://san.mibac.it/metsrights-lite/", + :"xmlns:mix" => "http://san.mibac.it/mix-lite/", + :"xmlns:rdf" => "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + :"xmlns:san-dl" => "http://mibac.it/san/dl#", + :"xmlns:xlink" => "http://www.w3.org/1999/xlink", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xsi:schemaLocation" => "http://san.beniculturali.it/envelope-san/ http://san.beniculturali.it/tracciato/envelope-san.xsd" +} do + + xml.tag! "envelope:header", :CREATED => Time.now.strftime("%Y-%m-%dT%H:%M:%S") do + xml.tag! "envelope:source", metadata['PROVIDER_DL'] + end + + xml.tag! "envelope:recordList" do + records.each do |unit| + xml << render(:partial => "digital_object.xml", :locals => {:unit => unit, :metadata => metadata}) + end + end + +end \ No newline at end of file diff --git a/app/views/digital_objects/all.html.erb b/app/views/digital_objects/all.html.erb index 4a1f172..f63ee1e 100644 --- a/app/views/digital_objects/all.html.erb +++ b/app/views/digital_objects/all.html.erb @@ -3,7 +3,37 @@ <% end %> <%# TODO: [1.x] search e filtri per digital_objects %> +
+
+   + + <%= form_tag('/digital_objects/all', :method => :get, :class => "skip-prompt form-search pull-right") do %> + <%= text_field_tag :q, params[:q], :class => "search-query", :placeholder => "Complesso Archivistico"%> + <%= text_field_tag :unit, params[:unit], :class => "search-query", :placeholder => "Unità" %> + <%= submit_tag "Cerca", :name => "", :class => "btn btn-small" %> + <% end %> + <% if params[:q].present? || params[:unit].present? %> + <%= link_to raw(' ' + t('export') + " AEF"), + { + controller: :exports, + action: :fonds_aef, + remote: true, + fonds: @fond_ids_AEF + }, + {onclick:'alert("Export AEF iniziato.\n Al termine il risultato sara\' posizionato nella cartella: archimista/tmp/exports.")', :class => "btn btn-small" } %> + <%= link_to raw(' ' + t('export') + " EAD"), + { + controller: :exports, + action: :units_ead, + remote: true, + units: @unit_ids, + fonds: @fond_ids_EAD + }, + { onclick:'alert("Export EAD3 iniziato.\n\n Al termine il risultato sara\' posizionato nella cartella: archimista/tmp/exports.")', :class => "btn btn-small" } %> + <% end %> +
+ <% if @digital_objects.size > 0 %> <%= display_page_entries_info @digital_objects %> diff --git a/app/views/editors/index.html.erb b/app/views/editors/index.html.erb index 3f0888e..c6e2d30 100644 --- a/app/views/editors/index.html.erb +++ b/app/views/editors/index.html.erb @@ -37,7 +37,7 @@ <%# Upgrade 2.2.0 inizio %> <% if current_user.is_multi_group_user?() || current_user.is_superadmin?() %> - <%= editor.group.short_name %> + <% unless editor.group.nil? %><%= editor.group.short_name %><% end %> <% end %> <%# Upgrade 2.2.0 fine %> diff --git a/app/views/exports/_form_creators.html.erb b/app/views/exports/_form_creators.html.erb new file mode 100644 index 0000000..cb34829 --- /dev/null +++ b/app/views/exports/_form_creators.html.erb @@ -0,0 +1,16 @@ +

Seleziona un soggetto produttore

+<%= form_tag("/exports", :method => :get, :id => "exports-creator-choice", :class => "skip-prompt export-wait") do %> +
+
+   +
+
+ <%= text_field_tag :q, params[:q], :id => "exports-creator-name-autocomplete", + :class => "autocomplete", + :'data-autocompletion-controller' => 'creators', + :'data-autocompletion-action' => 'list', + :style => "width:600px;" %> + <%= hidden_field_tag :target_id, "", :id => "exports-creator-id-autocomplete" %> +
+
+<% end %> \ No newline at end of file diff --git a/app/views/exports/_form_sources.html.erb b/app/views/exports/_form_sources.html.erb new file mode 100644 index 0000000..538b91c --- /dev/null +++ b/app/views/exports/_form_sources.html.erb @@ -0,0 +1,17 @@ +

Seleziona una scheda fonte, scegliendo prima il formato di esportazione

+<%# TAI aggiunto = prima di form_tag %> +<%= form_tag("/exports", :method => :get, :id => "exports-source-choice", :class => "skip-prompt export-wait") do %> +
+
+   +
+
+ <%= text_field_tag :q, params[:q], :id => "exports-source-name-autocomplete", + :class => "autocomplete", + :'data-autocompletion-controller' => 'sources', + :'data-autocompletion-action' => 'list', + :style => "width:600px;" %> + <%= hidden_field_tag :target_id, "", :id => "exports-source-id-autocomplete" %> +
+
+<% end %> \ No newline at end of file diff --git a/app/views/exports/index.html.erb b/app/views/exports/index.html.erb index e91dbe3..f02502c 100644 --- a/app/views/exports/index.html.erb +++ b/app/views/exports/index.html.erb @@ -5,13 +5,20 @@

Puoi esportare i tuoi complessi archivistici nel formato aef adatto all'importazione in un'altra istanza di Archimista.
+ In alternativa puoi esportare i tuoi complessi archivistici nel formato xml adatto all'importazione nei formati CAT-SAN, METS-SAN, EAD e EAC-CPF.
Seleziona un singolo complesso archivistico o un insieme di complessi collegati a un soggetto conservatore o a un progetto.

- <%= check_box_tag 'inc_digit'%><%= label_tag 'inc_digit', 'Includi gli oggetti digitali', :class => 'digital_checkbox' %> - +

<%= check_box_tag 'inc_digit'%><%= label_tag 'inc_digit', 'Includi gli oggetti digitali', :class => 'digital_checkbox exports_checkbox' %>

+

<%= check_box_tag 'inc_entities'%><%= label_tag 'inc_entities', 'Includi le entità correlate all\'oggetto da esportare', :class => 'digital_checkbox exports_checkbox' %>

+

<%= check_box_tag 'inc_san'%><%= label_tag 'inc_san', 'Esporta le entità selezionate in formato CAT-SAN e METS-SAN', :class => 'digital_checkbox exports_checkbox' %>

+

<%= check_box_tag 'inc_ead'%><%= label_tag 'inc_ead', 'Esporta il complesso selezionato in formato ICAR-IMPORT', :class => 'digital_checkbox exports_checkbox' %>

+ +
@@ -27,7 +34,7 @@ <% @fonds.each do |fond| %> - <%= link_to fond.name, '#', {:class => "export-aef-wait", "target-id".to_sym => fond.id, "target-class" => "fond", "target-mode" => "full"} %> + <%= link_to fond.name, '#', {:class => "export-trigger-wait", "target-id".to_sym => fond.id, "target-class" => "fond", "target-mode" => "full"} %> <%= fond.preferred_event.try(:full_display_date) %> <% if fond.fond_type.present? %> (<%= fond.fond_type %>) @@ -60,7 +67,7 @@ <% @custodians.each do |custodian| %> - <%= link_to custodian.name, '#', {:class => "export-aef-wait", "target-id".to_sym => custodian.id, "target-class" => "custodian", "target-mode" => "full"} %>
+ <%= link_to custodian.name, '#', {:class => "export-trigger-wait", "target-id".to_sym => custodian.id, "target-class" => "custodian", "target-mode" => "full"} %>
<%# TAI cambiato XXXX.human_name in XXXX.model_name.human %> <%= custodian.num %> <%= Fond.model_name.human(:count => custodian.num.to_i).downcase %> <% if Rails.env == "development" && custodian.db_source.present? %> @@ -110,6 +117,71 @@ <% end %>
+
+ <% if @creators.length > 0 %> + <% if @creators.length < 100 %> +

Scegli il soggetto produttore di cui esportare i complessi archivistici:

+ + + + + <% @creators.each do |creator| %> + + + + + <% end %> + +
+ <%= link_to creator.name, '#', {:class => "export-trigger-wait", "target-id".to_sym => creator.id, "target-class" => "creator", "target-mode" => "full"} %>
+<%# TAI cambiato XXXX.human_name in XXXX.model_name.human %> + <%= creator.num %> <%= Fond.model_name.human(:count => creator.num.to_i).downcase %> + <% if Rails.env == "development" && creator.db_source.present? %> + (<%= creator.db_source %>) + <% end %> +
<%= l creator.updated_at, :format => :long %>
+ <% else %> + <%= render :partial => "form_creators" %> + <% end %> + <% else %> +

Non sono presenti schede soggetto produttore collegate a complessi archivistici.
+ Export per soggetto produttore non disponibili.

+ <% end %> +
+ +
+ <% if @sources.length > 0 %> + <% if @sources.length < 100 %> +

Scegli la fonte della quale esportare i complessi archivistici:

+ + + + + <% @sources.each do |source| %> + + + + + <% end %> + +
+ <%= link_to source.short_title, '#', {:class => "export-trigger-wait", "target-id".to_sym => source.id, "target-class" => "source", "target-mode" => "full"} %> + <%= source.title %>
+<%# TAI cambiato XXXX.human_name in XXXX.model_name.human %> + <%= source.num %> <%= Fond.model_name.human(:count => source.num.to_i).downcase %> + <% if Rails.env == "development" && source.db_source.present? %> + (<%= source.db_source %>) + <% end %> +
<%= l source.updated_at, :format => :long %>
+ <% else %> + <%= render :partial => "form_sources" %> + <% end %> + <% else %> +

Non sono presenti schede fonte collegate a complessi archivistici.
+ Export per fonti non disponibili.

+ <% end %> +
+
diff --git a/app/views/exports_batch/index.html.erb b/app/views/exports_batch/index.html.erb new file mode 100644 index 0000000..ecd2f13 --- /dev/null +++ b/app/views/exports_batch/index.html.erb @@ -0,0 +1,233 @@ +<% container_class "container-fluid" %> +<% content_for :status_bar do %> +

Esportazione batch

+<% end %> + +
+

Esportazione in formato icar:import

+

L'esportazione in formato icar:import consente di esportare - a partire dal complesso archivistico selezionato - tutte le entità ad esso collegate (soggetto conservatore, soggetto produttore, profili istituzionali, fonti, oggetti digitali) raccolte in un unico pacchetto informativo in formato XML conforme ai tracciati di interoperabilità ICAR.

+
+ + <% if @fonds_select_options.length > 0 %> + <%= form_tag('/exports_batch/icarimport') do -%> + <%= label_tag("Seleziona il Complesso da esportare:") %> + <%= select_tag(:fond_id, options_for_select(@fonds_select_options), :multiple => false, :style => "width:30%") %> +
<%= submit_tag('Esporta') %>
+ <% end -%> + + <% else %> +

Non sono presenti Fondi di primo livello.
+ Esportazione batch dei non disponibile.


+ <% end %> + + +
+ +

Esportazione di Fondi in formato aef

+
+ +

— Esportazione di tutti i Fondi di primo livello di un Progetto.

+ + <% if @project_select_options.length > 0 %> + <%= form_tag('/exports_batch/aefallfonds') do -%> + <%= label_tag("Seleziona il Progetto di cui esportare i Fondi:") %> + <%= select_tag(:project_id, options_for_select(@project_select_options), :multiple => false, :style => "width:30%") %> +
<%= submit_tag('Esporta') %>
+ <% end -%> + + <% else %> +

Non sono presenti schede Progetto collegate a complessi archivistici.
+ Esportazione batch per Progetto non disponibile.


+ <% end %> + + +

— Esportazione Fondi di primo livello.

+ + <% if @fonds_select_options.length > 0 %> + <%= form_tag('/exports_batch/aeffondsnoancestry') do -%> + <%= label_tag("Seleziona i Fondi da esportare:") %> + <%= select_tag(:fond_id, options_for_select(@fonds_select_options), :multiple => true, :style => "width:30%") %> +
<%= submit_tag('Esporta') %>
+ <% end -%> + + <% else %> +

Non sono presenti Fondi di primo livello.
+ Esportazione batch dei Fondi non disponibile.


+ <% end %> + + +

— Esportazione di tutti i Fondi di primo livello.

+ + <%= form_tag('/exports_batch/aefallfondsnoancestry') do -%> + <%= label_tag("Verranno esportati tutti i Fondi di primo livello:") %> +
<%= submit_tag('Esporta') %>
+ <% end -%> + + +
+ +

Esportazione di Progetti in formato aef

+
+ +

— Esportazione di Progetti.

+ + <% if @project_select_options.length > 0 %> + <%= form_tag('/exports_batch/aefprojects') do -%> + <%= label_tag("Seleziona i Progetti da esportare:") %> + <%= select_tag(:project_id, options_for_select(@project_select_options), :multiple => true, :style => "width:30%") %> +
<%= submit_tag('Esporta') %>
+ <% end -%> + + <% else %> +

Non sono presenti schede Progetto collegate a complessi archivistici.
+ Esportazione batch dei Progetti non disponibile.


+ <% end %> + + +

— Esportazione di tutti i Progetti.

+ + <%= form_tag('/exports_batch/aefallprojects') do -%> + <%= label_tag("Verranno esportati tutti i Progetti:") %> +
<%= submit_tag('Esporta') %>
+ <% end -%> + + +
+ +

Esportazione di Soggetti Conservatori in formato aef

+
+ +

— Esportazione dei Conservatori associati ai Fondi di primo livello di un Progetto.

+ + <% if @project_select_options.length > 0 %> + <%= form_tag('/exports_batch/aefcustodiansproject') do -%> + <%= label_tag("Seleziona il Progetto:") %> + <%= select_tag(:project_id, options_for_select(@project_select_options), :multiple => false, :style => "width:30%") %> +
<%= submit_tag('Esporta') %>
+ <% end -%> + + <% else %> +

Non sono presenti schede Progetto collegate a complessi archivistici.
+ Esportazione batch per Progetto non disponibile.


+ <% end %> + + +

— Esportazione di Conservatori.

+ + <% if @custodians_select_options.length > 0 %> + <%= form_tag('/exports_batch/aefcustodians') do -%> + <%= label_tag("Seleziona i Conservatori da esportare:") %> + <%= select_tag(:custodian_id, options_for_select(@custodians_select_options), :multiple => true, :style => "width:30%") %> +
<%= submit_tag('Esporta') %>
+ <% end -%> + + <% else %> +

Non sono presenti Conservatori collegati a complessi archivistici.
+ Esportazione batch dei Conservatori non disponibile.


+ <% end %> + + +

— Esportazione di tutti i Conservatori.

+ + <%= form_tag('/exports_batch/aefallcustodians') do -%> + <%= label_tag("Verranno esportati tutti i Conservatori:") %> +
<%= submit_tag('Esporta') %>
+ <% end -%> + + +
+ +

Esportazione di Fondi in formato xml

+
+ +

— Esportazione di tutti i Fondi di primo livello di un Progetto.

+ + <% if @project_select_options.length > 0 %> + <%= form_tag('/exports_batch/xmlallfonds') do -%> + <%= label_tag("Seleziona il Progetto di cui esportare i Fondi:") %> + <%= select_tag(:project_id, options_for_select(@project_select_options), :multiple => false, :style => "width:30%") %> +
<%= submit_tag('Esporta') %>
+ <% end -%> + + <% else %> +

Non sono presenti schede Progetto collegate a complessi archivistici.
+ Esportazione batch per Progetto non disponibile.


+ <% end %> + + +

— Esportazione Fondi di primo livello.

+ + <% if @fonds_select_options.length > 0 %> + <%= form_tag('/exports_batch/xmlfondsnoancestry') do -%> + <%= label_tag("Seleziona i Fondi da esportare:") %> + <%= select_tag(:fond_id, options_for_select(@fonds_select_options), :multiple => true, :style => "width:30%") %> +
<%= submit_tag('Esporta') %>
+ <% end -%> + + <% else %> +

Non sono presenti Fondi di primo livello.
+ Esportazione batch dei Fondi non disponibile.


+ <% end %> + + +

— Esportazione di tutti i Fondi di primo livello.

+ + <%= form_tag('/exports_batch/xmlallfondsnoancestry') do -%> + <%= label_tag("Verranno esportati tutti i Fondi di primo livello:") %> +
<%= submit_tag('Esporta') %>
+ <% end -%> + + +
+ +

Esportazione di Fonti/Strumenti di ricerca in formato xml

+
+ +

— Esportazione delle Fonti associate ai Fondi di primo livello di un Progetto.

+ + <% if @project_select_options.length > 0 %> + <%= form_tag('/exports_batch/xmlsourcesproject') do -%> + <%= label_tag("Seleziona il Progetto:") %> + <%= select_tag(:project_id, options_for_select(@project_select_options), :multiple => false, :style => "width:30%") %> +
<%= submit_tag('Esporta') %>
+ <% end -%> + + <% else %> +

Non sono presenti schede Progetto collegate a Fondi di primo livello.
+ Esportazione batch per Progetto non disponibile.


+ <% end %> + + +

— Esportazione Fonti archivistiche e Strumenti di ricerca.

+ + <% if @sources_select_options.length > 0 %> + <%= form_tag('/exports_batch/xmlsources') do -%> + <%= label_tag("Seleziona le Fonti archivistiche e gli Strumenti da esportare:") %> + <%= select_tag(:source_id, options_for_select(@sources_select_options), :multiple => true, :style => "width:30%") %> +
<%= submit_tag('Esporta') %>
+ <% end -%> + + <% else %> +

Non sono presenti Fonti archivistiche o Strumenti di ricerca.
+ Esportazione batch delle Fonti non disponibile.


+ <% end %> + + +

— Esportazione di tutte le Fonti e gli Strumenti di ricerca.

+ + <%= form_tag('/exports_batch/xmlallsources') do -%> + <%= label_tag("Verranno esportate tutte le Fonti e gli Strumenti di ricerca:") %> +
<%= submit_tag('Esporta') %>
+ <% end -%> + +
+ +
+

Nota bene

+

Da questa sezione è possibile attivare l'esportazione in modalità batch delle diverse entità descritte nella specifica installazione di Archimista.
+ Si consiglia di ricorrere a questa funzionalità di export per eseguire l'esportazione di banche dati di dimensioni notevoli e in presenza di un numero cospicuo di oggetti digitali da gestire.

+

I file esportati verranno posizionati nella cartella:
+ <%= @export_folder %>
+ del sistema su cui è installato Archimista.

+

Si avvisa che non è prevista una notifica di segnalazione da parte del sistema dell'avvenuto completamento dell'export.

+
\ No newline at end of file diff --git a/app/views/fonds/_catheader.xml.builder b/app/views/fonds/_catheader.xml.builder new file mode 100644 index 0000000..9f84c70 --- /dev/null +++ b/app/views/fonds/_catheader.xml.builder @@ -0,0 +1,11 @@ +xml.catheader do + xml.systemId "#{PROVIDER}" + xml.contact do + xml.name "INGLOBA360" + xml.mail "account@ingloba360.it" + end + xml.filedesc do + xml.title "Export da Archimista a SAN" + xml.date DateTime.now + end +end \ No newline at end of file diff --git a/app/views/fonds/_ead_fonds.xml.builder b/app/views/fonds/_ead_fonds.xml.builder index 83ded68..745d59d 100644 --- a/app/views/fonds/_ead_fonds.xml.builder +++ b/app/views/fonds/_ead_fonds.xml.builder @@ -1,23 +1,230 @@ unless fonds.empty? + fond_first_levels = { + "archivio" => "fonds", + "fondo" => "fonds", + "complesso di fondi" => "recordgrp", + "iperfondo" => "recordgrp", + "subfondo" => "subfonds", + "sezione" => "subfonds", + "partizione" => "subfonds", + "sottopartizione" => "subfonds", + "parte" => "subfonds", + "serie" => "series", + "sottoserie" => "subseries", + "sottosottoserie" => "subseries", + "sottosezione" => "otherlevel", + "categoria" => "otherlevel", + "classe" => "otherlevel", + "sottoclasse" => "otherlevel", + "rubrica" => "otherlevel", + "voce" => "otherlevel", + "sottovoce" => "otherlevel", + "titolo" => "otherlevel", + "sottotitolo" => "otherlevel", + "articolo" => "otherlevel" + } + fonds.each do |fond| - level = "c#{fond.ancestry_depth.to_s.rjust(2,'0')}" - xml.tag!(level, {:otherlevel => "#{fond.fond_type}", :level => "otherlevel", :id => "ARCH#{fond.id}"}) do + ca_id_str = sprintf '%08d', fond.id + if !fond.fond_type.present? + tags = {:level => "otherlevel", :id => "CA-#{ca_id_str}"} + else + level = fond.fond_type + if (fond_first_levels[level] == "otherlevel") + tags = {:level => "otherlevel", :otherlevel => level, :id => "CA-#{ca_id_str}"} + else + tags = {:level => fond_first_levels[level], :id => "CA-#{ca_id_str}"} + end + end + xml.c tags do xml.did do - fond.fond_identifiers.each do |identifier| - xml.unitid identifier.identifier, { :encodinganalog => "1.1", :countrycode => "it", :repositorycode => "#{identifier.identifier_source}" } + xml.physdescstructured :physdescstructuredtype => "spaceoccupied", :coverage => "whole" do + xml.quantity fond.length.blank? ? "" : fond.length + xml.unittype fond.length.blank? ? "" : "ml" + if !fond.extent.blank? + xml.descriptivenote do + xml.p fond.extent + end + end + end + if (fond.ancestry_depth == 0) + fond_custodians = fond.custodians + if fond_custodians.count > 0 + xml.repository do + fond_custodians.each do |custodian| + id = custodian.custodian_identifiers.first + if id.nil? + sc_id_str = sprintf '%08d', custodian.id + xml.corpname :id => "SC-#{sc_id_str}" do + xml.part custodian.preferred_name.name + end + else + xml.corpname :identifier => id.identifier do + xml.part custodian.preferred_name.name + end + end + building = custodian.custodian_buildings.first + if !building.address.blank? + xml.address do + xml.addressline building.address + ", " + building.postcode + ", " + building.city + end + end + end + end + end + fond_creators = fond.creators + if fond_creators.count > 0 + xml.origination do + fond_creators.each do |creator| + id = creator.creator_identifiers.first + sp_id_str = sprintf '%08d', creator.id + case creator.creator_type + when 'C' + if id.nil? + xml.corpname :identifier => "SP-#{sp_id_str}" do + xml.part creator.preferred_name.name + end + else + xml.corpname :identifier => id.identifier do + xml.part creator.preferred_name.name + end + end + when 'P' + if id.nil? + xml.persname :identifier => "SP-#{sp_id_str}" do + xml.part creator.preferred_name.name + end + else + xml.persname :identifier => id.identifier do + xml.part creator.preferred_name.name + end + end + when 'F' + if id.nil? + xml.famname :identifier => "SP-#{sp_id_str}" do + xml.part creator.preferred_name.name + end + else + xml.famname :identifier => id.identifier do + xml.part creator.preferred_name.name + end + end + end + end + end + end + end + + fond.fond_identifiers.each do |id| + xml.unitid "CA-#{ca_id_str}", { :localtype => "#{fond.fond_type}", :repositorycode => "#{id.identifier}" } + end + + # Estensione 2018 + # Modifica + xml.unittitle fond.name, {:localtype => "Denominazione"} + other_names = fond.other_names + other_names.each do |on| + xml.unittitle on.name, {:localtype => "altreDenominazioni"} + end + + # Estensione 2018 + # Modifica + # Gestione delle date + periodo_data_secolare = [ + "inizio", + "fine", + "metà", + "prima metà", + "seconda metà", + "primo quarto", + "secondo quarto", + "terzo quarto", + "ultimo quarto" + ] + if fond.preferred_event.present? && fond.preferred_event.valid? + xml.unitdatestructured do + xml.dateset do + if (fond.preferred_event.start_date_from == fond.preferred_event.end_date_from) && (fond.preferred_event.start_date_to == fond.preferred_event.end_date_to) + if fond.preferred_event.start_date_from == fond.preferred_event.start_date_to + xml.datesingle fond.preferred_event.start_date_display, :standarddate => fond.preferred_event.start_date_from + else + xml.datesingle fond.preferred_event.start_date_display, :notbefore => fond.preferred_event.start_date_from, :notafter => fond.preferred_event.start_date_to + end + else + xml.daterange do + xml.fromdate fond.preferred_event.start_date_display, :standarddate => fond.preferred_event.start_date_from + xml.todate fond.preferred_event.end_date_display, :standarddate => fond.preferred_event.end_date_to + end + end + + xml.datesingle fond.preferred_event.note, {:localtype => "noteAllaData"} + end + end + end + end + if fond.access_condition.present? + xml.accessrestrict do + xml.p fond.access_condition_note end - xml.unittitle fond.name, {:encodinganalog => "1.2"} + end + if fond.history.present? + xml.custodhist do + xml.p fond.history + end + end + + # Estensione 2018 + # Modifica + xml.processinfo do + xml.p "Pubblicata" + end - xml.unitdate fond.preferred_event.try(:full_display_date), - {:normal => normalize_date_for_ead(fond.preferred_event)} if fond.preferred_event.present? && fond.preferred_event.valid? + # Estensione 2018 + # Aggiunta + # Compilatore della singola entità (compilatori - fond_editors) + fond_editors = fond.fond_editors + if (fond_editors.present?) + fond_editors_event_type = {"aggiornamento scheda" => "updated", "inserimento dati" => "created", + "integrazione successiva" => "updated", "prima redazione" => "created", + "revisione" => "revised", "rielaborazione" => "revised", "schedatura" => "created"} + xml.processinfo :localtype => "compilatori" do + fond_editors.each do |fe| + xml.processinfo :localtype => "compilatore" do + xml.p do + xml.persname do + xml.part fe.name, {:localtype => "compilatore"} + xml.part fe.qualifier, {:localtype => "qualifica"} + xml.part fond_editors_event_type[fe.editing_type], {:localtype => "tipoIntervento"} + end + xml.date fe.edited_at, {:localtype => "dataIntervento"} + end + end + end + end + end + + # Estensione 2018 + # Aggiunta + # Relazione con Tipologia Documentaria (profili documentari - document_forms) + fond_document_forms = fond.document_forms + if (fond_document_forms.present?) + xml.controlaccess do + fond_document_forms.each do |fdf| + xml.genreform do + xml.part fdf.name, { :localtype => "denominazione" } + xml.part fdf.description, { :localtype => "descrizione" } + xml.part fdf.note, { :localtype => "note" } + end + end + end + end - xml.physdesc do - xml.extent fond.extent, {:label => "consistenza"} unless fond.extent.blank? - xml.extent fond.length, {:label => "metri lineari"} unless fond.length.blank? + if fond.description.present? + xml.scopecontent do + xml.p fond.description end end - xml << render(:partial => "ead_units.xml", :locals => { :start_from => fond.ancestry_depth, :units => fond.units.all(:order => :sequence_number) }) - xml << render(:partial => "ead_fonds.xml", :locals => { :fonds => fond.children.all(:conditions => "id != #{fond.id}", :order => :sequence_number) }) + xml << render(:partial => "ead_fonds.xml", :locals => { :fonds => fond.children.where("id != #{fond.id} AND trashed = 0").order(:sequence_number) } ) end end end \ No newline at end of file diff --git a/app/views/fonds/_fond.xml.builder b/app/views/fonds/_fond.xml.builder new file mode 100644 index 0000000..c2ae099 --- /dev/null +++ b/app/views/fonds/_fond.xml.builder @@ -0,0 +1,77 @@ +xml.catRecord do + xml.catRecordHeader :type => "complesso archivistico" do + xml.id "CA-#{fond.id}" + xml.lastUpdate fond.updated_at.strftime("%Y-%m-%dT%H:%M:%S") + end + xml.catRecordBody do + xml.ead :xmlns => "http://san.mibac.it/ead-san/" do + xml.archdesc :otherlevel => fond.fond_type, :level => "otherlevel" do + xml.did do + xml.unitid "CA-#{fond.id}", :type => "#{metadata['PROVIDER_DL']}", :identifier => "#{FONDS_URL}/#{fond.id}" + xml.unittitle fond.name, :type => "principale" + + if fond.other_names.present? + fond.other_names.each do |other_name| + xml.unittitle other_name.name + end + end + if fond.preferred_event.present? + xml.unitdate fond.preferred_event.full_display_date, { + :datechar => "principale", + :normal => [fond.preferred_event.start_date_from.strftime("%Y%m%d"), fond.preferred_event.end_date_to.strftime("%Y%m%d")].uniq.join("/") + } + else + xml.unitdate "non indicata", :normal => "00000101", :datechar => "non indicata" + end + + xml.physdesc do + tmp_string = "" + if fond.length.present? + tmp_string += "Metri lineari: #{fond.length}. " + end + if fond.extent.present? + tmp_string += fond.extent.squish + end + extent = tmp_string.present? ? tmp_string : "non indicata" + xml.extent extent + end + + if fond.abstract.present? + xml.abstract fond.abstract, :langcode => "it_IT" + elsif fond.description.present? + xml.abstract truncate(fond.description, length: 1500, separator: ' '), :langcode => "it_IT" + end + + if fond.creators.present? + fond.creators.each do |creator| + xml.origination "SP-#{creator.id}" + end + end + + # OPTIMIZE: fare controllo preliminare su custodian: Fond.roots.unassigned_to_custodian + custodians = fond.root.custodians + if custodians.present? + xml.repository custodians[0].preferred_name.name, :label => "#{metadata['PROVIDER_DL']}", :id => "SC-#{custodians[0].id}" + end + end + + xml.processinfo fond.published == true ? "scheda pubblicata" : "non indicato" + + xml.relatedmaterial do + xml.archref "CA-#{fond.root.id}" + end + + if fond.sources.present? + fond.sources.each do |source| + if source.source_type_code == 2 + xml.otherfindaid do + xml.extref "SR-#{source.id}" + end + end + end + end + + end + end + end +end \ No newline at end of file diff --git a/app/views/fonds/_fond_ead.xml.builder b/app/views/fonds/_fond_ead.xml.builder new file mode 100644 index 0000000..590d0dc --- /dev/null +++ b/app/views/fonds/_fond_ead.xml.builder @@ -0,0 +1,277 @@ +xml.control :repositoryencoding => "iso15511", + :countryencoding => "iso3166-1", + :dateencoding => "iso8601", + :scriptencoding => "iso15924", + :langencoding => "iso639-2b", + :relatedencoding => "ISAD(G)" do + xml.recordid fond.name, {:instanceurl => "#{FONDS_URL}/#{fond.id}"} + xml.filedesc do + xml.titlestmt do + xml.titleproper fond.name, {:encodinganalog => "title"} + end + end + xml.maintenancestatus :value => "new" + xml.maintenanceagency do + xml.agencyname "#{PROVIDER}" + end + xml.languagedeclaration do + xml.language :langcode => "ita" + xml.script :scriptcode => "Italian" + end + xml.conventiondeclaration do + xml.citation "SAN" + end + xml.maintenancehistory do + xml.maintenanceevent do + xml.eventtype :value => "created" + xml.eventdatetime "" + xml.agenttype :value => "human" + xml.agent "" + end + end + + # Estensione 2018 + # Modifica + # E' il contenuto dei vecchi tag ead..relations.relation + # Eliminati i document_forms + # Relazioni con una scheda o citazione bibliografica (fonti - sources) + # scheda bibliografica (source_type_code = 1) + # fonte a corredo (source_type_code = 2) + # fonte archivistica (source_type_code = 3) + # fonte normativa (source_type_code = 4) + fond_sources = fond.sources + if fond_sources.present? + xml.sources do + fond_sources.each do |fond_source| + sr_id_str = sprintf '%08d', fond_source.id + xml.source :id => "SR-#{sr_id_str}", :href => "#{SOURCES_URL}/#{fond_source.id}", :linkrole => "URL" do + xml.sourceentry fond_source.title + end + end + end + end +end + +fond_first_levels = { + "archivio" => "fonds", + "fondo" => "fonds", + "complesso di fondi" => "recordgrp", + "iperfondo" => "recordgrp", + "subfondo" => "subfonds", + "sezione" => "subfonds", + "partizione" => "subfonds", + "sottopartizione" => "subfonds", + "parte" => "subfonds", + "serie" => "series", + "sottoserie" => "subseries", + "sottosottoserie" => "subseries", + "sottosezione" => "otherlevel", + "categoria" => "otherlevel", + "classe" => "otherlevel", + "sottoclasse" => "otherlevel", + "rubrica" => "otherlevel", + "voce" => "otherlevel", + "sottovoce" => "otherlevel", + "titolo" => "otherlevel", + "sottotitolo" => "otherlevel", + "articolo" => "otherlevel" +} +fond_second_levels = {"fascicolo" => "file", "unità" => "item"} + +ca_id_str = sprintf '%08d', fond.id +if !fond.fond_type.present? + tags = {:level => "fonds", :id => "CA-#{ca_id_str}"} +else + level = fond.fond_type + if (fond_first_levels[level] == "otherlevel") + tags = {:level => "otherlevel", :otherlevel => level, :id => "CA-#{ca_id_str}"} + else + tags = {:level => fond_first_levels[level], :id => "CA-#{ca_id_str}"} + end +end + +xml.archdesc tags do + xml.did do + xml.physdescstructured :physdescstructuredtype => "spaceoccupied", :coverage => "whole" do + xml.quantity fond.length.blank? ? "" : fond.length + xml.unittype fond.length.blank? ? "" : "ml" + if !fond.extent.blank? + xml.descriptivenote do + xml.p fond.extent + end + end + end + + fond_custodians = fond.custodians + if fond_custodians.count > 0 + xml.repository do + fond_custodians.each do |custodian| + id = custodian.custodian_identifiers.first + if id.nil? + sc_id_str = sprintf '%08d', custodian.id + xml.corpname :id => "SC-#{sc_id_str}" do + xml.part custodian.preferred_name.name + end + else + xml.corpname :identifier => id.identifier do + xml.part custodian.preferred_name.name + end + end + building = custodian.custodian_buildings.first + if !building.address.blank? + xml.address do + xml.addressline building.address + ", " + building.postcode + ", " + building.city + end + end + end + end + end + + fond_creators = fond.creators + if fond_creators.count > 0 + xml.origination do + fond_creators.each do |creator| + id = creator.creator_identifiers.first + sp_id_str = sprintf '%08d', creator.id + case creator.creator_type + when 'C' + if id.nil? + xml.corpname :identifier => "SP-#{sp_id_str}" do + xml.part creator.preferred_name.name + end + else + xml.corpname :identifier => id.identifier do + xml.part creator.preferred_name.name + end + end + when 'P' + if id.nil? + xml.persname :identifier => "SP-#{sp_id_str}" do + xml.part creator.preferred_name.name + end + else + xml.persname :identifier => id.identifier do + xml.part creator.preferred_name.name + end + end + when 'F' + if id.nil? + xml.famname :identifier => "SP-#{sp_id_str}" do + xml.part creator.preferred_name.name + end + else + xml.famname :identifier => id.identifier do + xml.part creator.preferred_name.name + end + end + end + end + end + end + + fond.fond_identifiers.each do |id| + xml.unitid "CA-#{ca_id_str}", { :localtype => "#{fond.fond_type}", :repositorycode => "#{id.identifier}" } + end + + # Estensione 2018 + # Modifica + xml.unittitle fond.name, {:localtype => "Denominazione"} + other_names = fond.other_names + other_names.each do |on| + xml.unittitle on.name, {:localtype => "altreDenominazioni"} + end + + # Estensione 2018 + # Modifica + # Gestione delle date + if fond.preferred_event.present? && fond.preferred_event.valid? + xml.unitdatestructured do + xml.dateset do + #datesingle + if fond.preferred_event.start_date_from == fond.preferred_event.end_date_from && fond.preferred_event.start_date_to == fond.preferred_event.end_date_to + if fond.preferred_event.start_date_from == fond.preferred_event.start_date_to + xml.datesingle fond.preferred_event.start_date_display, { :standarddate => fond.preferred_event.start_date_from }.reject{ |k,v| v.nil? } + else + xml.datesingle fond.preferred_event.start_date_display, { :notbefore => fond.preferred_event.start_date_from, :notafter => fond.preferred_event.start_date_to }.reject{ |k,v| v.nil? } + end + #daterange + else + xml.daterange do + xml.fromdate fond.preferred_event.start_date_display, { :standarddate => fond.preferred_event.start_date_from }.reject{ |k,v| v.nil? } + xml.todate fond.preferred_event.end_date_display, { :standarddate => fond.preferred_event.end_date_to }.reject{ |k,v| v.nil? } + end + end + + xml.datesingle fond.preferred_event.note, {:localtype => "noteAllaData"} + end + end + end + end + if fond.history.present? + xml.custodhist do + xml.p fond.history + end + end + if fond.description.present? + xml.scopecontent do + xml.p fond.description + end + end + if fond.access_condition.present? + xml.accessrestrict do + xml.p fond.access_condition_note + end + end + + # Estensione 2018 + # Modifica + xml.processinfo do + xml.p "Pubblicata" + end + + # Estensione 2018 + # Aggiunta + # Compilatore della singola entità (compilatori - fond_editors) + fond_editors = fond.fond_editors + if (fond_editors.present?) + fond_editors_event_type = {"aggiornamento scheda" => "updated", "inserimento dati" => "created", + "integrazione successiva" => "updated", "prima redazione" => "created", + "revisione" => "revised", "rielaborazione" => "revised", "schedatura" => "created"} + xml.processinfo :localtype => "compilatori" do + fond_editors.each do |fe| + xml.processinfo :localtype => "compilatore" do + xml.p do + xml.persname do + xml.part fe.name, {:localtype => "compilatore"} + xml.part fe.qualifier, {:localtype => "qualifica"} + xml.part fond_editors_event_type[fe.editing_type], {:localtype => "tipoIntervento"} + end + xml.date fe.edited_at, {:localtype => "dataIntervento"} + end + end + end + end + end + + # Estensione 2018 + # Aggiunta + # Relazione con Tipologia Documentaria (profili documentari - document_forms) + fond_document_forms = fond.document_forms + if (fond_document_forms.present?) + xml.controlaccess do + fond_document_forms.each do |fdf| + xml.genreform do + xml.part fdf.name, { :localtype => "denominazione" } + xml.part fdf.description, { :localtype => "descrizione" } + xml.part fdf.note, { :localtype => "note" } + end + end + end + end + + xml.dsc do + if fond.has_children? + xml << render(:partial => "ead_fonds.xml", :locals => { :fonds => fond.children.where("id != #{fond.id} AND trashed = 0").order(:sequence_number) } ) + end + end +end diff --git a/app/views/fonds/_fonds.xml.builder b/app/views/fonds/_fonds.xml.builder new file mode 100644 index 0000000..c2ad395 --- /dev/null +++ b/app/views/fonds/_fonds.xml.builder @@ -0,0 +1,21 @@ +xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" +xml.tag! "cat-import", { + :"xmlns" => "http://san.mibac.it/cat-import", + :"xmlns:eac-cpf" => "http://san.mibac.it/eac-san/", + :"xmlns:ead-complarc" => "http://san.mibac.it/ead-san/", + :"xmlns:ead-str" => "http://san.mibac.it/ricerca-san/", + :"xmlns:scons" => "http://san.mibac.it/scons-san/", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xmlns:xlink" => "http://www.w3.org/1999/xlink", + :"xsi:schemaLocation" => "http://san.mibac.it/cat-import http://www.san.beniculturali.it/tracciato/cat-import.xsd" +} do + + xml << render(:partial => "catheader.xml") + + xml.catListRecords do + records.each do |fond| + xml << render(:partial => "fond.xml", :locals => {:fond => fond, :metadata => metadata}) + end + end + +end \ No newline at end of file diff --git a/app/views/fonds/_fonds_ead.xml.builder b/app/views/fonds/_fonds_ead.xml.builder new file mode 100644 index 0000000..7698dcd --- /dev/null +++ b/app/views/fonds/_fonds_ead.xml.builder @@ -0,0 +1,12 @@ +xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" + +xml.ead :"xsi:schemaLocation" => "http://ead3.archivists.org/schema/ http://www.san.beniculturali.it/tracciato/ead3.xsd", + :"xmlns" => "http://ead3.archivists.org/schema/", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xmlns:xlink" => "http://www.w3.org/1999/xlink" do + + records.each do |fond| + xml << render(:partial => "fond_ead.xml", :locals => {:fond => fond}) + end + +end \ No newline at end of file diff --git a/app/views/fonds/_form.html.erb b/app/views/fonds/_form.html.erb index b5c25ea..f33019d 100644 --- a/app/views/fonds/_form.html.erb +++ b/app/views/fonds/_form.html.erb @@ -23,7 +23,7 @@ <%= link_to t('preview'), fond_path(@fond), :id => "fond-preview", :class => "span2 btn btn-mini" %>
- <% total_count = @fond.is_root? ? @fond.active_descendant_units_count : @fond.units_count %> + <% total_count = @fond.is_root? ? @fond.active_descendant_units_count : @fond.active_descendant_units_count_children %> <%= link_to "#{number_with_delimiter(total_count)} " + t('view_unit').downcase, fond_units_path(@fond) %> <%= "(totale del complesso)" if @fond.is_root? %> <%= link_to t('new_unit'), new_fond_unit_path(@fond), :class => 'btn btn-mini' %> diff --git a/app/views/fonds/_merge_with.html.erb b/app/views/fonds/_merge_with.html.erb index 2a4d683..7f1e25d 100644 --- a/app/views/fonds/_merge_with.html.erb +++ b/app/views/fonds/_merge_with.html.erb @@ -1,7 +1,7 @@ <%# OPTIMIZE: valutare se spostare questo js in fond-merge.js %> diff --git a/app/views/sources/show.xml.builder b/app/views/sources/show.xml.builder new file mode 100644 index 0000000..ba33df5 --- /dev/null +++ b/app/views/sources/show.xml.builder @@ -0,0 +1,67 @@ +xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" + xml.tag! "ead", { + :"xsi:schemaLocation" => "http://ead3.archivists.org/schema/ ead3.xsd", + :"xmlns" => "http://ead3.archivists.org/schema/", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance" + } do + xml.control do + xml.recordId "SR.#{@source.id}" + xml.filedesc do + xml.titlestmt do + xml.titleproper @source.title + if @source.author.present? + xml.author @source.author, :localtype => "Author" + end + if @source.editor.present? + xml.author @source.editor, :localtype => "Curator" + end + end + xml.publicationstmt do + xml.date @source.date_string, :normal => "AAAA" + end + if @source.abstract.present? + xml.notestmt do + xml.controlnote :localtype => "Notestoriche" do + xml.p @source.abstract + end + end + end + end + xml.maintenancestatus :value => "new" + xml.publicationtatus :value => "published" + xml.maintenanceagency do + xml.agencyname PROVIDER + end + xml.languagedeclaration do + xml.language :langcode => "ita" + xml.script :scriptcode => "Italiano" + end + xml.conventiondeclaration do + xml.citation PROVIDER + end + end + xml.archdesc :level => "otherlevel" do + xml.did do + xml.unitid "SR-#{@source.id}", :repositorycode => PROVIDER, :identifier => "SR-#{@source.id}" + end + xml.relations do + related_fonds = @source.fonds + related_fonds.each do |fond| + xml.relation :relationtype => "otherrelationtype", :otherrelationtype => "#{fond.fond_type}", :href => "#{FONDS_URL}/#{fond.id}" do + xml.relationentry "CA-#{fond.id}" + end + end + if @source.source_urls.present? + @source.source_urls.each do |source_url| + xml.relation :relationtype => "otherrelationtype", :otherrelationtype => "URL", :href => source_url.url do + if source_url.note.blank? + xml.relationentry source_url.url + else + xml.relationentry source_url.note + end + end + end + end + end + end +end diff --git a/app/views/units/_fe_cadastral.html.erb b/app/views/units/_fe_cadastral.html.erb new file mode 100644 index 0000000..cfe2f64 --- /dev/null +++ b/app/views/units/_fe_cadastral.html.erb @@ -0,0 +1,18 @@ +
+
+ <%= f.label :way_code, t('fe_way_code') %> + <%= f.number_field :way_code, :class =>"span2 fe_field" %> +
+
+ <%= f.label :cadastral_municipality, t('fe_cadastral_municipality') %> + <%= f.text_field :cadastral_municipality, :class =>"span3 fe_field" %> +
+
+ <%= f.label :municipality_code, t('fe_municipality_code') %> + <%= f.number_field :municipality_code, :class =>"span2 fe_field" %> +
+
+ <%= f.label :paper_code, t('fe_paper_code') %> + <%= f.number_field :paper_code, :class =>"span2 fe_field" %> +
+
diff --git a/app/views/units/_fe_context.html.erb b/app/views/units/_fe_context.html.erb new file mode 100644 index 0000000..0f847a3 --- /dev/null +++ b/app/views/units/_fe_context.html.erb @@ -0,0 +1,65 @@ +
+
+ <%= f.label :number, t('fe_number') %> + <%= f.number_field :number, :class =>"span4 fe_field" %> +
+
+ <%= f.label :sub_number, t('fe_sub_number') %> + <%= f.number_field :sub_number, :class =>"span4 fe_field" %> +
+
+ +
+
+ <%= f.label :classification, t('fe_classification') %> + <%= f.text_field :classification, :class =>"span6 fe_field" %> +
+
+ <%= link_to t('create_fe_classification'), '#', :id => 'create_fe_classification', :class => 'btn btn-small destroy_fsc' %> +
+
+ +
+
+ <%= f.label :applicant, t('fe_applicant') %> + <%= f.text_field :applicant, :class =>"span4 fe_field" %> +
+
+ <%= f.label :request, t('fe_request') %> + <%= f.text_field :request, :class =>"span4 fe_field" %> +
+
+ +
+
+ <%= f.label :license_number, t('fe_license_number') %> + <%= f.number_field :license_number, :class =>"span3 fe_field" %> +
+
+ <%= f.label :license_year, t('fe_license_year') %> + <%= f.number_field :license_year, :class =>"span3 fe_field" %> +
+
+ <%= f.label :license_date, t('fe_license_date') %> + <%= f.date_field :license_date, :class =>"span3 fe_field" %> +
+
+ +
+
+ <%= f.label :protocol_number, t('fe_protocol_number') %> + <%= f.number_field :protocol_number, :class =>"span3 fe_field" %> +
+
+ <%= f.label :habitability_number, t('fe_habitability_number') %> + <%= f.number_field :habitability_number, :class =>"span2 fe_field" %> +
+
+ <%= f.label :habitability_year, t('fe_habitability_year') %> + <%= f.number_field :habitability_year, :class =>"span1 fe_field" %> +
+
+ <%= f.label :habitability_date, t('fe_habitability_date') %> + <%= f.date_field :habitability_date, :class =>"span3 fe_field" %> +
+
\ No newline at end of file diff --git a/app/views/units/_fe_designer.html.erb b/app/views/units/_fe_designer.html.erb new file mode 100644 index 0000000..6a05584 --- /dev/null +++ b/app/views/units/_fe_designer.html.erb @@ -0,0 +1,11 @@ +
+
+ <%= f.label :designer_name, t('fe_designer_name') %> + <%= f.text_field :designer_name, :class =>"span3 fe_field" %> +
+
+ <%= f.label :designer_role, t('fe_designer_role') %> + <%= f.text_field :designer_role, :class =>"span3 fe_field" %> +
+
<%= f.check_box :_destroy %> <%= f.label :_destroy, t('destroy') %>
+
\ No newline at end of file diff --git a/app/views/units/_fe_fract_edil_parcel.html.erb b/app/views/units/_fe_fract_edil_parcel.html.erb new file mode 100644 index 0000000..b76c3c4 --- /dev/null +++ b/app/views/units/_fe_fract_edil_parcel.html.erb @@ -0,0 +1,11 @@ +
+
+ <%= f.label :fract_edil_parcel_number, t('fe_fract_edil_parcel_number') %> + <%= f.number_field :fract_edil_parcel_number, :class =>"span3 fe_field" %> +
+
+ <%= f.label :material_portion, t('fe_material_portion') %> + <%= f.number_field :material_portion, :class =>"span3 fe_field" %> +
+
<%= f.check_box :_destroy %> <%= f.label :_destroy, t('destroy') %>
+
\ No newline at end of file diff --git a/app/views/units/_fe_fract_land_parcel.html.erb b/app/views/units/_fe_fract_land_parcel.html.erb new file mode 100644 index 0000000..aa530ad --- /dev/null +++ b/app/views/units/_fe_fract_land_parcel.html.erb @@ -0,0 +1,11 @@ +
+
+ <%= f.label :fract_land_parcel_number, t('fe_fract_land_parcel_number') %> + <%= f.number_field :fract_land_parcel_number, :class =>"span3 fe_field" %> +
+
+ <%= f.label :edil_parcel_number, t('fe_edil_parcel_number') %> + <%= f.number_field :edil_parcel_number, :class =>"span3 fe_field" %> +
+
<%= f.check_box :_destroy %> <%= f.label :_destroy, t('destroy') %>
+
\ No newline at end of file diff --git a/app/views/units/_fe_identification.html.erb b/app/views/units/_fe_identification.html.erb new file mode 100644 index 0000000..4c8b840 --- /dev/null +++ b/app/views/units/_fe_identification.html.erb @@ -0,0 +1,21 @@ +
+
+ <%= f.label :code, t('fe_code') %> + <%= f.text_field :code, :class =>"span4 fe_field" %> +
+
+ <%= f.label :file_year, t('fe_file_year') %> + <%= f.number_field :file_year, :class =>"span4 fe_field" %> +
+
+ +
+
+ <%= f.label :category, t('fe_category') %> + <%= f.text_field :category, :class =>"span4 fe_field" %> +
+
+ <%= f.label :identification_class, t('fe_identification_class') %> + <%= f.text_field :identification_class, :class =>"span4 fe_field" %> +
+
\ No newline at end of file diff --git a/app/views/units/_fe_land_parcel.html.erb b/app/views/units/_fe_land_parcel.html.erb new file mode 100644 index 0000000..106a437 --- /dev/null +++ b/app/views/units/_fe_land_parcel.html.erb @@ -0,0 +1,7 @@ +
+
+ <%= f.label :land_parcel_number, t('fe_land_parcel_number') %> + <%= f.text_field :land_parcel_number, :class =>"span3 fe_field" %> +
+
<%= f.check_box :_destroy %> <%= f.label :_destroy, t('destroy') %>
+
\ No newline at end of file diff --git a/app/views/units/_fe_opera.html.erb b/app/views/units/_fe_opera.html.erb new file mode 100644 index 0000000..ea7cee8 --- /dev/null +++ b/app/views/units/_fe_opera.html.erb @@ -0,0 +1,35 @@ +
+
<%= f.check_box :is_present%> <%= f.label :is_present, t('fe_is_present') %>
+
+
+
+ <%= f.label :status, t('fe_status') %> + <%= terms_select(f, "fe_operas.status", {:include_blank => true}, :class => "span2 fe_field" )%> +
+
+ <%= f.label :building_name, t('fe_building_name') %> + <%= f.text_field :building_name, :class =>"span3 fe_field" %> +
+
+ <%= f.label :building_type, t('fe_building_type') %> + <%= f.text_field :building_type, :class =>"span3 fe_field" %> +
+
+
+
+ <%= f.label :place_name, t('fe_place_name') %> + <%= f.text_field :place_name, :class =>"span3 fe_field" %> +
+
+ <%= f.label :place_type, t('fe_place_type') %> + <%= f.text_field :place_type, :class =>"span3 fe_field" %> +
+
+ <%= f.label :house_number, t('fe_house_number') %> + <%= f.text_field :house_number, :class =>"span1 fe_field" %> +
+
+ <%= f.label :district, t('fe_district') %> + <%= f.text_field :district, :class =>"span2 fe_field" %> +
+
diff --git a/app/views/units/_form.html.erb b/app/views/units/_form.html.erb index 066a216..6b5ed29 100644 --- a/app/views/units/_form.html.erb +++ b/app/views/units/_form.html.erb @@ -3,12 +3,25 @@ <%= javascript_include_tag "relations" %> <%= javascript_include_tag "live_search" %> <%= javascript_include_tag "sources" %> + <%= javascript_include_tag "digit_number" %> <%# Upgrade 2.1.0 inizio %> <%= javascript_include_tag "units-sc" %> <%# Upgrade 2.1.0 fine %> <% end %> + + <%# Upgrade 2.0.0 inizio %> <%#= render :partial => "shared/generic_error_message", :object => @unit %> <%= render :partial => "shared/generic_error_message", object: @unit, as: "object" %> @@ -62,11 +75,14 @@ <%# Inserito label per flag published %>
<%= f.label :unit_type, t('unit_type') %>
+
<%= f.label :file_type, t('file_type'), {:id => "lbl_unit_fsc", :class => "fsc_field_label" } %>
<%= f.label :sc2_tsk, t('sc2_tsk'), {:id => "lbl_unit_sc2_tsk", :class => "sc2_field_label" } %>
<%= f.label :published, t('published') %>
<%= terms_select(f, "units.unit_type", {:include_blank => true}, :class => "span4" )%>
+
+ <%= terms_select(f, "units.file_type", {:include_blank => true}, :class => "span4 fsc_field" )%>
<%# Upgrade 2.2.0 inizio %> <%#= sc2_terms_select(f, "units.sc2_tsk", nil, {:include_blank => true, :id => "sc2_tsk", :selected => @unit.sc2_tsk}, :class => "span4 sc2_field") %> @@ -87,9 +103,40 @@
<%= f.text_field :title, :class => "span8" %>
<%= f.check_box :given_title %>
+
+
<%= f.label :fsc_name, t('fsc_name') %>
+
<%= f.label :fsc_surname, t('fsc_surname') %>
+
 
+
+
+
<%= f.text_field :fsc_name, :class => "span4 fsc_field" %>
+
<%= f.text_field :fsc_surname, :class => "span4 fsc_field" %>
+
+ <%= link_to t('create_fsc_title'), '#', :id => 'create_fsc_title', :class => 'btn btn-small' %> +
+
+
+ <% @fe_identifications = build_or_retrieve(f.object.fe_identifications) %> +
+

<%= t('fe_identification') %>

+ <%= f.fields_for :fe_identifications do |id_form| %> + <%= render :partial => "fe_identification", :locals => { :f => id_form } %> + <% end %> +
+
<%= render :partial => "events/form", :locals => {:entity_form => f, :events => @events} %> +
+ <% @fe_contexts = build_or_retrieve(f.object.fe_contexts) %> +
+

<%= t('fe_context') %>

+ <%= f.fields_for :fe_contexts do |id_form| %> + <%= render :partial => "fe_context", :locals => { :f => id_form } %> + <% end %> +
+
+ <%= f.label :content, t('content') %> <%= f.text_area :content, :class => "textile long-content span9" %> @@ -172,13 +219,87 @@ <% end %> <%# Upgrade 2.1.0 fine %> + + + +
+

<%= t('personal_fsc') %>

+ <%= javascript_tag do %> + window.fsc_types = <%= t('fsc_types').to_json.html_safe %> + <% end %> + + +
+ <% @fsc_organizations = build_or_retrieve(f.object.fsc_organizations) %> +
+ <%= f.fields_for :fsc_organizations do |id_form| %> + <%= render :partial => "fsc_organization", :locals => { :f => id_form } %> + <% end %> +

<%= add_child_link t('new_organization'), "unit_fsc_organizations" %>

+
+
+ +
+ <% @fsc_nationalities = build_or_retrieve(f.object.fsc_nationalities) %> +
+ <%= f.fields_for :fsc_nationalities do |id_form| %> + <%= render :partial => "fsc_nationality", :locals => { :f => id_form } %> + <% end %> +

<%= add_child_link t('new_nationality'), "unit_fsc_nationalities" %>

+
+
+ +
+ <% @fsc_codes = build_or_retrieve(f.object.fsc_codes) %> +
+ <%= f.fields_for :fsc_codes do |id_form| %> + <%= render :partial => "fsc_code", :locals => { :f => id_form } %> + <% end %> +

<%= add_child_link t('new_code'), "unit_fsc_codes" %>

+
+
+ +
+ <% @fsc_opens = build_or_retrieve(f.object.fsc_opens) %> +
+ <%= f.fields_for :fsc_opens do |id_form| %> + <%= render :partial => "fsc_open", :locals => { :f => id_form } %> + <% end %> +

<%= add_child_link t('new_open'), "unit_fsc_opens" %>

+
+
+ +
+ <% @fsc_closes = build_or_retrieve(f.object.fsc_closes) %> +
+ <%= f.fields_for :fsc_closes do |id_form| %> + <%= render :partial => "fsc_close", :locals => { :f => id_form } %> + <% end %> +

<%= add_child_link t('new_close'), "unit_fsc_closes" %>

+
+
+ +
+ +
+
+
+ + +

Segnature

<%= f.label :tmp_reference_number, t('tmp_reference_number') %>
<%= f.label :tmp_reference_string, t('tmp_reference_string') %>
-
<%= f.text_field :tmp_reference_number, :class => "span3" %>
+
<%= f.number_field :tmp_reference_number, :onkeypress=>"return isNumberKey(event)" , :class => "span3"%>
+ +
<%= f.text_field :tmp_reference_string, :class => "span6" %>
@@ -218,6 +339,80 @@
<%# Upgrade 2.1.0 inizio %>
+ +
+ <% @fe_operas = build_or_retrieve(f.object.fe_operas) %> +
+

<%= t('fe_opera') %>

+ <%= f.fields_for :fe_operas do |id_form| %> + <%= render :partial => "fe_opera", :locals => { :f => id_form } %> + <% end %> +
+
+ +
+ <% @fe_designers = build_or_retrieve(f.object.fe_designers) %> +
+

<%= t('fe_designer') %>

+ <%= f.fields_for :fe_designers do |id_form| %> + <%= render :partial => "fe_designer", :locals => { :f => id_form } %> + <% end %> +

<%= add_child_link t('new_fe_designer'), "unit_fe_designers" %>

+
+
+ +
+ <% @fe_cadastrals = build_or_retrieve(f.object.fe_cadastrals) %> +
+

<%= t('fe_cadastral') %>

+ <%= f.fields_for :fe_cadastrals do |id_form| %> + <%= render :partial => "fe_cadastral", :locals => { :f => id_form } %> + <% end %> +
+
+ +
+ <% @fe_land_parcels = build_or_retrieve(f.object.fe_land_parcels) %> +
+

+ <%= t('fe_land_parcel') %> +

+ <%= f.fields_for :fe_land_parcels do |id_form| %> + <%= render :partial => "fe_land_parcel", :locals => { :f => id_form } %> + <% end %> +

<%= add_child_link t('new_fe_land_parcel'), "unit_fe_land_parcels" %>

+
+
+ + +
+ <% @fe_fract_land_parcels = build_or_retrieve(f.object.fe_fract_land_parcels) %> +
+

+ <%= t('fe_fract_land_parcel') %> +

+ <%= f.fields_for :fe_fract_land_parcels do |id_form| %> + <%= render :partial => "fe_fract_land_parcel", :locals => { :f => id_form } %> + <% end %> +

<%= add_child_link t('new_fe_fract_land_parcel'), "unit_fe_fract_land_parcels" %>

+
+
+ +
+ <% @fe_fract_edil_parcels = build_or_retrieve(f.object.fe_fract_edil_parcels) %> +
+

+ <%= t('fe_fract_edil_parcel') %> +

+ <%= f.fields_for :fe_fract_edil_parcels do |id_form| %> + <%= render :partial => "fe_fract_edil_parcel", :locals => { :f => id_form } %> + <% end %> +

<%= add_child_link t('new_fe_fract_edil_parcel'), "unit_fe_fract_edil_parcels" %>

+
+
+ + +
<%= f.label :physical_type, t('physical_type') %>
@@ -480,7 +675,9 @@
+
+ <%# Upgrade 2.1.0 inizio %> <%= render :partial => 'sc2_openedvoc' %> @@ -489,3 +686,4 @@ <%# Upgrade 2.2.0 inizio %> <%= render :partial => 'create_unit_reference_number_options' %> <%# Upgrade 2.2.0 fine %> + diff --git a/app/views/units/_fsc_close.html.erb b/app/views/units/_fsc_close.html.erb new file mode 100644 index 0000000..22e997c --- /dev/null +++ b/app/views/units/_fsc_close.html.erb @@ -0,0 +1,7 @@ +
+
+ <%= f.label :close, t('fsc_close') %> + <%= f.text_field :close, { :class => "span3 fsc_field datepicker" } %> +
+
<%= f.check_box :_destroy %> <%= f.label :_destroy, t('destroy') %>
+
\ No newline at end of file diff --git a/app/views/units/_fsc_code.html.erb b/app/views/units/_fsc_code.html.erb new file mode 100644 index 0000000..99a39f1 --- /dev/null +++ b/app/views/units/_fsc_code.html.erb @@ -0,0 +1,7 @@ +
+
+ <%= f.label :code, t('fsc_code_type') %> + <%= f.text_field :code, :class =>"span4 fsc_field" %> +
+
<%= f.check_box :_destroy %> <%= f.label :_destroy, t('destroy') %>
+
\ No newline at end of file diff --git a/app/views/units/_fsc_nationality.html.erb b/app/views/units/_fsc_nationality.html.erb new file mode 100644 index 0000000..9047804 --- /dev/null +++ b/app/views/units/_fsc_nationality.html.erb @@ -0,0 +1,7 @@ +
+
+ <%= f.label :nationality, t('fsc_nationality') %> + <%= f.text_field :nationality, :class =>"span4 fsc_field" %> +
+
<%= f.check_box :_destroy %> <%= f.label :_destroy, t('destroy') %>
+
\ No newline at end of file diff --git a/app/views/units/_fsc_open.html.erb b/app/views/units/_fsc_open.html.erb new file mode 100644 index 0000000..ff6b653 --- /dev/null +++ b/app/views/units/_fsc_open.html.erb @@ -0,0 +1,7 @@ +
+
+ <%= f.label :open, t('fsc_open') %> + <%= f.text_field :open, { :class => "span3 fsc_field datepicker" } %> +
+
<%= f.check_box :_destroy %> <%= f.label :_destroy, t('destroy') %>
+
\ No newline at end of file diff --git a/app/views/units/_fsc_organization.html.erb b/app/views/units/_fsc_organization.html.erb new file mode 100644 index 0000000..0ae8ccb --- /dev/null +++ b/app/views/units/_fsc_organization.html.erb @@ -0,0 +1,7 @@ +
+
+ <%= f.label :organization, t('fsc_organization') %> + <%= f.text_field :organization, :class =>"span4 fsc_field" %> +
+
<%= f.check_box :_destroy %> <%= f.label :_destroy, t('destroy') %>
+
\ No newline at end of file diff --git a/app/views/units/_gridview_columns.html.erb b/app/views/units/_gridview_columns.html.erb index 01caa20..207c484 100644 --- a/app/views/units/_gridview_columns.html.erb +++ b/app/views/units/_gridview_columns.html.erb @@ -7,7 +7,7 @@ <%# TAI aggiunto = prima di form_tag %> <%= form_tag({:action => 'gridview'}, {:method => :post, :id => "select-columns-form", :class => "skip-prompt modal-form"}) do %>
    -
  • " style="display: none;"> +
  • " style="display: none;"> <%= check_box_tag "selected_attributes[]", "", :disabled => true %> <%= label_tag "selected_attributes", "attr_description" %>
  • diff --git a/app/views/units/_personal_fsc.html.erb b/app/views/units/_personal_fsc.html.erb new file mode 100644 index 0000000..ab8a683 --- /dev/null +++ b/app/views/units/_personal_fsc.html.erb @@ -0,0 +1,44 @@ +<%# Upgrade 2.1.0 inizio %> +
    + <%= javascript_tag do %> + window.I18n = <%= t('fsc_codes').to_json.html_safe %> + <% end %> +
    +
    + + <%= f.text_field :code, :class => "span3 fsc_field sc2_voc" %> +
    +
    + <%= f.label :fsc_opened_at, t('fsc_opened_at') %> + <%= f.text_field :fsc_opened_at, { :class => "span3 fsc_field datepicker" } %> +
    +
    + <%= f.label :fsc_closed_at, t('fsc_closed_at') %> + <%= f.text_field :fsc_closed_at, { :class => "span3 fsc_field datepicker" } %> +
    + +
    + +
    +
    + <%= f.label :nationality, t('fsc_nationality') %> + <%= f.text_field :nationality, :class =>"span4 fsc_field" %> +
    +
    + <%= f.label :organization, t('fsc_organization') %> + <%= f.text_field :organization, :class =>"span4 fsc_field" %> +
    +
    + +
    <%= f.check_box :_destroy %> <%= f.label :_destroy, t('destroy') %>
    +
    +
    + +
    +
    +
    +
    +<%# Upgrade 2.1.0 fine %> diff --git a/app/views/units/show.html.erb b/app/views/units/show.html.erb index bceecdf..8dacbff 100644 --- a/app/views/units/show.html.erb +++ b/app/views/units/show.html.erb @@ -25,6 +25,18 @@ <%= show_value(@unit.unit_type) %> <%# Upgrade 2.1.0 inizio %> + <% if @unit.file_type.present? %> + + <%= t('file_type') %> + +<%# Upgrade 2.2.0 inizio %> + <%#= show_value(@unit.sc2_tsk, "t") %> + <%= show_value(@unit.file_type, "t") %> +<%# Upgrade 2.2.0 fine %> + + + <% end %> +<%# Upgrade 2.1.0 fine %> <% if @unit.sc2_tsk.present? %> <%= t('sc2_tsk') %> @@ -36,7 +48,6 @@ <% end %> -<%# Upgrade 2.1.0 fine %> <%= t('title') %> <%= @unit.formatted_title %> @@ -433,7 +444,9 @@ <%# Upgrade 2.0.0 fine %>
    +
    +
diff --git a/config/initializers/metadata.rb b/config/initializers/metadata.rb index 1240ff7..87bdb82 100644 --- a/config/initializers/metadata.rb +++ b/config/initializers/metadata.rb @@ -1,17 +1,50 @@ -# Application metadata -#APP_NAME = "Archimista" -#APP_VERSION = "2.2.0" -#APP_STATUS = "" -#AEF_COMPATIBLE_VERSIONS = [110, 120, 121, 200, 210, 211, 220] -#APP_CREATOR = "Codex Società Cooperativa - Pavia" -#APP_EDITION = "server" # server | standalone | hub -#IM_ENABLED = DigitalObject.is_enabled? - # Application metadata APP_NAME = "Archimista" -APP_VERSION = "3.0.0" +APP_VERSION = "3.1.1" APP_STATUS = "" -AEF_COMPATIBLE_VERSIONS = [110, 120, 121, 200, 210, 211, 220, 300] +AEF_COMPATIBLE_VERSIONS = [110, 120, 121, 200, 210, 211, 220, 300, 301, 302, 310, 311] APP_CREATOR = "INGLOBA360 srl" APP_EDITION = "server" # server | standalone | hub -IM_ENABLED = DigitalObject.is_enabled? \ No newline at end of file +IM_ENABLED = DigitalObject.is_enabled? + +DEST_DIR = "." + +# Sistema aderente SAN. +PROVIDER = "ARC-ICAR" + +# Url base +BASE_URL = "http://archivista.icar.beniculturali.it" + +# Url base dei complessi archivistici. +FONDS_URL = "#{BASE_URL}/fonds" + +# Url base dei soggetti produttori. +CREATORS_URL = "#{BASE_URL}/creators" + +# Url base dei soggetti conservatori. +CUSTODIANS_URL = "#{BASE_URL}/custodians" + +# Url base delle fonti archivistiche. +SOURCES_URL = "#{BASE_URL}/sources" + +# Url base delle unità archivistiche. +#UNITS_URL = "#{BASE_URL}/units" + +# Url base delle unità archivistiche, relativa alla Url base dei complessi archivistici FONDS_URL +UNITS_URL = "units" + +# Url base degli oggetti digitali. +DIGITAL_OBJECTS_URL = "#{BASE_URL}/digital_objects" + +# Url base dei profili documentari. +DOCUMENT_FORMS_URL = "#{BASE_URL}/document_forms" + +# Url base dei profili istituzionali. +INSTITUTIONS_URL = "#{BASE_URL}/institutions" + +# ICAR-IMPORT dati statici +ICAR_IMPORT_SYSTEM_TITLE = "Archimista ICAR" +ICAR_IMPORT_CONTACT_MAIL = "email@archimista.it" +ICAR_IMPORT_FILE_DESC_TITLE = "Export ICAR-IMPORT" +ICAR_IMPORT_FILE_DESC_ABSTRACT = "Esportazione complesso archivistico." + diff --git a/config/initializers/pdfkit.rb b/config/initializers/pdfkit.rb index 61c8eb5..b0e55e9 100644 --- a/config/initializers/pdfkit.rb +++ b/config/initializers/pdfkit.rb @@ -7,7 +7,7 @@ end if osCurrent.downcase.start_with?("windows") if Rails.env.development? - config.wkhtmltopdf = 'S:/PortableApps/wkhtmltopdf/wkhtmltopdf.exe' + config.wkhtmltopdf = 'C:/wkhtmltox/bin/wkhtmltopdf.exe' else config.wkhtmltopdf = File.expand_path("../../wkhtmltopdf/wkhtmltopdf.exe", File.dirname(__FILE__)) end @@ -21,4 +21,6 @@ :disable_smart_shrinking => true, :encoding => "UTF-8" } + + config.verbose = true end diff --git a/config/locales/it.yml b/config/locales/it.yml index e9342a3..87d07b8 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -31,6 +31,7 @@ it: relationships_area: "Relazioni" sources_area: "Fonti" # "Bibliografia" headings_area: "Indici" + anagraphics_area: "Anagrafiche" other_information_area: "Altre informazioni" active: "attivo" places: "Toponimi" @@ -46,7 +47,6 @@ it: show_record: "Anteprima scheda" PU: "pubblico" PR: "privato" - AU: "altra denominazione principale" PA: "denominazione parallela" AC: "acronimo" OT: "altra denominazione" @@ -56,14 +56,14 @@ it: split_fond: "Dividi" count: creators: - one: "È stato trovato %{count} soggetto produttore." + one: "È stato trovato %{count} soggetto produttore." other: "Sono stati trovati %{count} soggetti produttori." custodians: - one: "È stato trovato %{count} soggetto conservatore." + one: "È stato trovato %{count} soggetto conservatore." other: "Sono stati trovati %{count} soggetti conservatori." projects: - one: "Il complesso archivistico è in relazione con %{count} progetto." - other: "Il complesso archivistico è in relazione con %{count} progetti." + one: "Il complesso archivistico è in relazione con %{count} progetto." + other: "Il complesso archivistico è in relazione con %{count} progetti." fonds: success: one: "Il complesso archivistico ha il campo "%{field}" compilato." @@ -72,22 +72,22 @@ it: one: "%{count} complesso archivistico su %{total} (%{percentage}) ha il campo "%{field}" vuoto." other: "%{count} complessi archivistici su %{total} (%{percentage}) hanno il campo "%{field}" vuoto." sources: - one: "È stato trovato %{count} complesso archivistico con relazione a fonti." + one: "È stato trovato %{count} complesso archivistico con relazione a fonti." other: "Sono stati trovati %{count} complessi archivistici con relazione a fonti." creator_history: success: "Il soggetto produttore ha il campo "%{field}" compilato." failure: "Il soggetto produttore non ha il campo "%{field}" compilato." creator_sources: success: - one: "Il soggetto produttore è in relazione a %{count} fonte." - other: "Il soggetto produttore è in relazione a %{count} fonti." + one: "Il soggetto produttore è in relazione a %{count} fonte." + other: "Il soggetto produttore è in relazione a %{count} fonti." failure: "Il soggetto produttore non presenta relazioni a fonti." units: success: - one: "Il complesso archivistico è collegato ad almeno una "%{field}"." + one: "Il complesso archivistico è collegato ad almeno una "%{field}"." other: "Tutti i %{count} complessi archivistici sono collegati ad almeno una "%{field}"." failure: - one: "%{count} complesso archivistico su %{total} (%{percentage}) è privo di "%{field}" collegate." + one: "%{count} complesso archivistico su %{total} (%{percentage}) è privo di "%{field}" collegate." other: "%{count} complessi archivistici su %{total} (%{percentage}) sono privi di "%{field}" collegate." time: formats: @@ -112,17 +112,17 @@ it: # activerecord.errors.messages models: unit: - not_matching_parent_and_fond: "Il complesso specificato non corrisponde all'unità di livello superiore" - not_matching_fond_and_root_fond: "Il complesso principale non è compatibile con il complesso di appartenenza" - not_allowed_ancestry_depth: "Non è possibile creare sottounità a questo livello" + not_matching_parent_and_fond: "Il complesso specificato non corrisponde all'unità di livello superiore" + not_matching_fond_and_root_fond: "Il complesso principale non è compatibile con il complesso di appartenenza" + not_allowed_ancestry_depth: "Non è possibile creare sottounità a questo livello" fond: - at_most_one_custodian: "Un complesso può avere un solo soggetto conservatore" + at_most_one_custodian: "Un complesso può avere un solo soggetto conservatore" # Upgrade 2.1.0 inizio group: attributes: short_name: - illegal_format: "Valore non valido. I caratteri validi sono: lettere (maiuscole o minuscole), numeri, \"-\", \"_\". Non è possibile inserire spazi e lettere accentate. Il primo carattere deve essere una lettera." - not_unique_value: "Il valore impostato non è univoco." + illegal_format: "Valore non valido. I caratteri validi sono: lettere (maiuscole o minuscole), numeri, \"-\", \"_\". Non è possibile inserire spazi e lettere accentate. Il primo carattere deve essere una lettera." + not_unique_value: "Il valore impostato non è univoco." too_long_value: "Il numero di caratteri inserito supera il massimo consentito (30)." # Upgrade 2.0.0 fine models: @@ -130,8 +130,8 @@ it: one: "Complesso archivistico" other: "Complessi archivistici" unit: - one: "Unità archivistica" - other: "Unità archivistiche" + one: "Unità archivistica" + other: "Unità archivistiche" creator: one: "Soggetto produttore" other: "Soggetti produttori" @@ -153,6 +153,9 @@ it: heading: one: "Indice" other: "Indici" + anagraphic: + one: "Anagrafica" + other: "Anagrafiche" user: one: "Utente" other: "Utenti" @@ -183,7 +186,7 @@ it: extent: "Consistenza archivistica" # Upgrade 2.2.0 fine length: "Metri lineari" - units_count: "Unità archivistiche" + units_count: "Unità archivistiche" arrangement_note: "Nota dell'archivista" related_materials: "Documentazione collegata" access_condition: "Condizione di accesso" @@ -307,4 +310,4 @@ it: # Upgrade 2.0.0 inizio will_paginate: page_gap: "…" -# Upgrade 2.0.0 fine +# Upgrade 2.0.0 fine \ No newline at end of file diff --git a/config/locales/views/anagraphics.yml b/config/locales/views/anagraphics.yml new file mode 100644 index 0000000..c93f299 --- /dev/null +++ b/config/locales/views/anagraphics.yml @@ -0,0 +1,52 @@ +en: + anagraphics: "Anagraphics" + listing_anagraphics: "Anagraphics list" + anagraphic_name: "Name" + anagraphic_surname: "Surname" + anagraphic_type: "Type" + anagraphic_dates: "Dates" + new_anagraphic: "New anagraphic" + edit_anagraphic: "Edit anagraphic" + link_anagraphic: "Link anagraphic" + import_anagraphic: "Import anagraphic" + create_anagraphic: "Create anagraphic" + link: "Link" # OPTIMIZE: può stare nelle chiavi generiche, solo verbo = azione + no_anagraphic: "No valid anagraphic found" + anagraphic_qualifier: "Qualifier" + geographic_anag: "Geographic" + person_anag: "Person" + family_anag: "Familys" + corporate_body_anag: "Corporate" + other_anag: "Other" + anagraphic_identifier: "Identifiers" + new_anagraphic_identifier: "New identifier" + anagraphic_start_date: "Born date" + anagraphic_start_date_place: "Born place" + anagraphic_end_date: "Death date" + anagraphic_end_date_place: "Death place" +it: + anagraphics: "Schede anagrafiche" + listing_anagraphics: "Lista anagrafiche" + anagraphic_name: "Nome" + anagraphic_surname: "Cognome" + anagraphic_type: "Tipologia" + anagraphic_dates: "Estremi cronologici" + new_anagraphic: "Nuova anagrafica" + edit_anagraphic: "Modifica anagrafica" + link_anagraphic: "Collega anagrafica" + import_anagraphic: "Importa anagrafiche" + create_anagraphic: "Crea scheda" + link: "Collega" + no_anagraphic: "Non sono presenti anagrafiche da importare." + anagraphic_qualifier: "Qualifica" + geographic_anag: "Toponimo" + person_anag: "Persona" + family_anag: "Famiglia" + corporate_body_anag: "Ente" + other_anag: "Altro" + anagraphic_identifier: "Identificativi" + new_anagraphic_identifier: "Nuovo identificativo" + anagraphic_start_date: "Data di nascita" + anagraphic_start_date_place: "Luogo di nascita" + anagraphic_end_date: "Data di morte" + anagraphic_end_date_place: "Luogo di morte" \ No newline at end of file diff --git a/config/locales/views/creators.yml b/config/locales/views/creators.yml index d2e71bc..5cec46e 100644 --- a/config/locales/views/creators.yml +++ b/config/locales/views/creators.yml @@ -12,6 +12,10 @@ en: authorized_name: "Authorized name" parallel_name: "Parallel name" acronym: "Acronym" + intestazione: "Intestazione" + patronimico: "Patronimico" + pseudonimo: "Pseudonimo/Alias" + soprannome: "Soprannome" other_names: "Other names" other_names: "Other name" residence: "Residence" @@ -67,6 +71,10 @@ it: authorized_name: "Altra denominazione principale" parallel_name: "Denominazione parallela" acronym: "Acronimo" + intestazione: "Intestazione" + patronimico: "Patronimico" + pseudonimo: "Pseudonimo/Alias" + soprannome: "Soprannome" other_names: "Altre denominazioni" other_name: "Altra denominazione" residence: "Sede" diff --git a/config/locales/views/custodians.yml b/config/locales/views/custodians.yml index 3801d37..93ddd67 100644 --- a/config/locales/views/custodians.yml +++ b/config/locales/views/custodians.yml @@ -29,6 +29,7 @@ en: fax: "Fax" email: "Email" web: "Website" + pec: "Pec" contact_note: "Note" buildings: "Buildings" custodian_identifiers: "Custodian identifiers" @@ -86,6 +87,7 @@ it: fax: "Fax" email: "Email" web: "Sito web" + pec: "Pec" contact_note: "Annotazioni" buildings: "Sedi" custodian_identifiers: "Codici identificativi" diff --git a/config/locales/views/fonds.yml b/config/locales/views/fonds.yml index 3341995..3a83924 100644 --- a/config/locales/views/fonds.yml +++ b/config/locales/views/fonds.yml @@ -80,7 +80,7 @@ en: it: trash: "Cestino" fond_description: "Contenuto" - new_unit: 'Nuova unità' + new_unit: 'Nuova unità' fonds: "Complessi archivistici" fond: "Complesso archivistico" listing_fonds: "Complessi archivistici" @@ -157,3 +157,4 @@ it: level: "Livello" fond_editors: "Compilatori" fond_editor: "Compilatore" + diff --git a/config/locales/views/personal_details.yml b/config/locales/views/personal_details.yml new file mode 100644 index 0000000..f179e1c --- /dev/null +++ b/config/locales/views/personal_details.yml @@ -0,0 +1,5 @@ +en: + personal_details: "Personal details" +it: + personal_details: "Schede anagrafiche" + \ No newline at end of file diff --git a/config/locales/views/units.yml b/config/locales/views/units.yml index 62095b5..1c2011d 100644 --- a/config/locales/views/units.yml +++ b/config/locales/views/units.yml @@ -203,6 +203,38 @@ en: sc2_misa: "Altezza" sc2_misl: "Larghezza" sc2_ort: "Orientamento" + fsc_name: "Name" + fsc_surname: "Surname" + fe_identification: "Identification area" + fe_code: "Code" + fe_file_year: "Year File" + fe_category: "Category" + fe_identification_class: "Class" + create_fsc_title: "Calculate" + personal_fsc: "Personal file" + new_organization: "Add organizzation" + new_code: "Add code" + new_open: "Add opening date" + new_close: "Add closing date" + new_nationality: "Add nationality" + new_fsc: "Add file" + fsc_codes: + a_hiring: "Hiring" + b_subscription: "Subscription" + c_opened_relationship_date: "Significant Date for people relationship opening with organization" + d_other_fsc: "Other" + fsc_code_type: "Code" + fsc_open: "File opening date" + fsc_close: "File closing date" + fsc_nationality: "Nationality" + fsc_organization: "Organization" + add_fsc: "Add" + fsc_types: + a_organization: "Organization" + b_nationality: "Nationality" + c_code: "Code" + d_opened_at: "Opened at" + e_closed_at: "Closed at" # Upgrade 2.1.0 fine it: units: "Unità archivistiche" @@ -286,6 +318,8 @@ it: file: "Fascicolo o altra unità complessa" item: "Unità documentaria" list: "Registro o altra unità rilegata" + personal_file: "Fascicolo personale" + building_file: "Fascicolo di edilizia" humidity: "Danni da umidità" flood: "Danni da alluvione" rodents: "Danni da roditori" @@ -337,7 +371,7 @@ it: cardboard: "Cartoncino" film: "Pellicola o altro supporto fotografico" other: "Altro" - view_unit: "Unità archivistiche collegate" + view_unit: "Unità archivistiche di primo livello collegate" fragile: "Fragile" funghi_e_batteri: "Funghi e batteri" strappi: "Strappi" @@ -372,6 +406,7 @@ it: confirm_export: "Sei sicuro di voler esportare le unità selezionate? Se si, seleziona il formato di esportazione." aef_export: "Esporta in formato aef" csv_export: "Esporta in formato csv" + file_type: "Tipologia fascicolo" # Upgrade 3.0.0 fine unit_extent: "Consistenza" units_sc2_tsk: @@ -415,5 +450,81 @@ it: sc2_misa: "Altezza" sc2_misl: "Larghezza" sc2_ort: "Orientamento" + fsc_name: "Nome" + fsc_surname: "Cognome" + fe_identification: "Area identificazione" + fe_code: "Codice" + fe_file_year: "Anno fascicolo" + fe_category: "Categoria" + fe_identification_class: "Classe" + fe_context: "Area dati di contesto" + fe_number: "Numero (pratica/fascicolo)" + fe_sub_number: "Numero fascicolo sub" + fe_classification: "Classificazione" + create_fe_classification: "Calcola" + fe_applicant: "Richiedente" + fe_request: "Oggetto" + fe_license_number: "Numero licenza" + fe_license_year: "Anno licenza" + fe_license_date: Data licenza" + fe_protocol_number: "Numero protocollo sezionale" + fe_habitability_number: "Numero abitabilità" + fe_habitability_year: "Anno" + fe_habitability_date: "Data abitabilità" + fe_opera: "Area dati relativi all'opera e alla localizzazione" + fe_is_present: "Fascicolo presente/mancante" + fe_status: "Status" + approved: "Approvato" + rejected: "Rifiutato" + fe_building_name: "Denominazione edificio" + fe_building_type: "Tipo edificio" + fe_place_name: "Nome luogo" + fe_place_type: "Tipo luogo" + fe_house_number: "Civico" + fe_district: "Quartiere" + fe_designer: "Progettista" + fe_designer_name: "Nome progettista" + fe_designer_role: "Ruolo progettista" + new_fe_designer: "Aggiungi progettista" + fe_cadastral: "Area dati catastali" + fe_way_code: "Codice via" + fe_cadastral_municipality: "Comune catastale" + fe_municipality_code: "N.ro comune catastale" + fe_paper_code: "Foglio" + fe_land_parcel: "Particella" + new_fe_land_parcel: "Aggiungi particella fondiaria" + fe_land_parcel_number: "Numero particella fondiaria" + fe_fract_land_parcel: "Frazionamento particella fondiaria" + new_fe_fract_land_parcel: "Aggiungi frazionamento particella fondiaria" + fe_fract_land_parcel_number: "N.ro frazionamento particella fondiaria" + fe_edil_parcel_number: "Numero particella edilizia" + fe_fract_edil_parcel: "Frazionamento particella edilizia" + new_fe_fract_edil_parcel: "Aggiungi frazionamento particella edilizia" + fe_fract_edil_parcel_number: "Numero frazionamento particella edilizia" + fe_material_portion: "Porzione materiale" + create_fsc_title: "Calcola" + personal_fsc: "Fascicolo personale" + new_organization: "Aggiungi organizzazione" + new_code: "Aggiungi codice" + new_open: "Aggiungi data apertura" + new_close: "Aggiungi data chiusura" + new_nationality: "Aggiungi nazionalità" + fsc_codes: + a_hiring: "Assunzione" + b_subscription: "Iscrizione" + c_opened_relationship_date: "Data significativa per l’apertura del rapporto della persona con l’organizzazione" + d_other_fsc: "Altro" + fsc_code_type: "Codice" + fsc_open: "Data apertura fascicolo" + fsc_close: "Data chiusura fascicolo" + fsc_nationality: "Nazionalità" + fsc_organization: "Organizzazione di appartenenza" + add_fsc: "Aggiungi" + fsc_types: + a_organization: "Organizzazione di appartenenza" + b_nationality: "Nazionalità" + c_code: "Codice" + d_opened_at: "Data apertura fascicolo" + e_closed_at: "Data chiusura fascicolo" # Upgrade 2.1.0 fine diff --git a/config/routes.rb b/config/routes.rb index 13f30ec..a1f6887 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -177,6 +177,21 @@ end end + resources :anagraphics do + collection do + get :import_csv + post :preview_csv + post :save_csv + get :list + get :modal_new + post :modal_create + get :modal_link + get :ajax_list + post :ajax_remove + post :ajax_link + end + end + resources :reports, :only => [:index] do member do get :dashboard @@ -217,11 +232,33 @@ resources :exports, :only => [:index] do collection do get :download -# Upgrade 2.2.0 inizio + get :xml + get :fonds_aef + get :units_ead + # Upgrade 2.2.0 inizio post :units -# Upgrade 2.2.0 fine + # Upgrade 2.2.0 fine end end + resources :exports_batch, :only => [:index] do + collection do + post :icarimport + post :aefallfonds + post :aeffondsnoancestry + post :aefallfondsnoancestry + post :aefprojects + post :aefallprojects + post :aefcustodiansproject + post :aefcustodians + post :aefallcustodians + post :xmlallfonds + post :xmlfondsnoancestry + post :xmlallfondsnoancestry + post :xmlsourcesproject + post :xmlsources + post :xmlallsources + end + end # Vocabolari resources :vocabularies, :only => [:index] diff --git a/db/migrate/20171214143317_add_file_type_to_units.rb b/db/migrate/20171214143317_add_file_type_to_units.rb new file mode 100644 index 0000000..8612cf5 --- /dev/null +++ b/db/migrate/20171214143317_add_file_type_to_units.rb @@ -0,0 +1,5 @@ +class AddFileTypeToUnits < ActiveRecord::Migration + def change + add_column :units, :file_type, :string + end +end diff --git a/db/migrate/20171215111723_create_anagraphics.rb b/db/migrate/20171215111723_create_anagraphics.rb new file mode 100644 index 0000000..15c00e4 --- /dev/null +++ b/db/migrate/20171215111723_create_anagraphics.rb @@ -0,0 +1,39 @@ +class CreateAnagraphics < ActiveRecord::Migration + def change + create_table :anagraphics do |t| + t.string "anagraphic_type", limit: 255 + t.string "name", limit: 255 + t.string "surname", limit: 255 + t.string "start_date_place", limit: 255 + t.date "start_date" + t.string "end_date_place", limit: 255 + t.date "end_date" + t.integer "group_id", limit: 4 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "anagraphics", ["db_source", "legacy_id"], name: "index_anagraphics_on_source_and_legacy_id", using: :btree + + create_table "rel_unit_anagraphics", force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.integer "anagraphic_id", limit: 4 + t.string "db_source", limit: 255 + t.string "legacy_unit_id", limit: 255 + t.string "legacy_anagraphic_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "rel_unit_anagraphics", ["db_source", "legacy_anagraphic_id"], name: "index_rel_unit_anagraphics_on_source_and_legacy_anagraphic_id", using: :btree + add_index "rel_unit_anagraphics", ["db_source", "legacy_unit_id"], name: "index_rel_unit_anagraphics_on_source_and_legacy_unit_id", using: :btree + add_index "rel_unit_anagraphics", ["anagraphic_id"], name: "index_rel_unit_anagraphics_on_anagraphic_id", using: :btree + add_index "rel_unit_anagraphics", ["unit_id"], name: "index_rel_unit_anagraphics_on_unit_id", using: :btree + + end +end + + + \ No newline at end of file diff --git a/db/migrate/20171220142010_add_fsc_fields_to_units.rb b/db/migrate/20171220142010_add_fsc_fields_to_units.rb new file mode 100644 index 0000000..74a1ad7 --- /dev/null +++ b/db/migrate/20171220142010_add_fsc_fields_to_units.rb @@ -0,0 +1,6 @@ +class AddFscFieldsToUnits < ActiveRecord::Migration + def change + add_column :units, :fsc_name, :string + add_column :units, :fsc_surname, :string + end +end diff --git a/db/migrate/20171220150101_create_personal_fsc.rb b/db/migrate/20171220150101_create_personal_fsc.rb new file mode 100644 index 0000000..c175710 --- /dev/null +++ b/db/migrate/20171220150101_create_personal_fsc.rb @@ -0,0 +1,19 @@ +class CreatePersonalFsc < ActiveRecord::Migration + def change + create_table :personal_fscs, force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.string "code", limit: 255 + t.date "fsc_opened_at" + t.date "fsc_closed_at" + t.string "nationality", limit: 255 + t.string "organization", limit: 255 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "personal_fscs", ["db_source", "legacy_id"], name: "index_personal_fscs_on_source_and_legacy_id", using: :btree + add_index "personal_fscs", ["unit_id"], name: "index_personal_fscs_on_unit_id", using: :btree + end +end \ No newline at end of file diff --git a/db/migrate/20180108161344_create_anag_identifiers.rb b/db/migrate/20180108161344_create_anag_identifiers.rb new file mode 100644 index 0000000..57c3d28 --- /dev/null +++ b/db/migrate/20180108161344_create_anag_identifiers.rb @@ -0,0 +1,17 @@ +class CreateAnagIdentifiers < ActiveRecord::Migration + def change + create_table :anag_identifiers do |t| + t.integer "anagraphic_id", limit: 4 + t.string "identifier", limit: 255 + t.string "qualifier", limit: 255 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "anag_identifiers", ["db_source", "legacy_id"], name: "index_anag_identifiers_on_source_and_legacy_id", using: :btree + add_index "anag_identifiers", ["anagraphic_id"], name: "index_anag_identifiers_on_anagraphic_id", using: :btree + + end +end diff --git a/db/migrate/20180122101943_fsc_code.rb b/db/migrate/20180122101943_fsc_code.rb new file mode 100644 index 0000000..cb1f787 --- /dev/null +++ b/db/migrate/20180122101943_fsc_code.rb @@ -0,0 +1,15 @@ +class FscCode < ActiveRecord::Migration + def change + create_table :fsc_codes, force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.string "code", limit: 255 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fsc_codes", ["db_source", "legacy_id"], name: "index_fsc_codes_on_source_and_legacy_id", using: :btree + add_index "fsc_codes", ["unit_id"], name: "index_fsc_codes_on_unit_id", using: :btree + end +end diff --git a/db/migrate/20180122102011_fsc_nationality.rb b/db/migrate/20180122102011_fsc_nationality.rb new file mode 100644 index 0000000..6e8f600 --- /dev/null +++ b/db/migrate/20180122102011_fsc_nationality.rb @@ -0,0 +1,15 @@ +class FscNationality < ActiveRecord::Migration + def change + create_table :fsc_nationalities, force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.string "nationality", limit: 255 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fsc_nationalities", ["db_source", "legacy_id"], name: "index_fsc_nationalities_on_source_and_legacy_id", using: :btree + add_index "fsc_nationalities", ["unit_id"], name: "index_fsc_nationalities_on_unit_id", using: :btree + end +end diff --git a/db/migrate/20180122102028_fsc_organization.rb b/db/migrate/20180122102028_fsc_organization.rb new file mode 100644 index 0000000..ec8e8e7 --- /dev/null +++ b/db/migrate/20180122102028_fsc_organization.rb @@ -0,0 +1,15 @@ +class FscOrganization < ActiveRecord::Migration + def change + create_table :fsc_organizations, force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.string "organization", limit: 255 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fsc_organizations", ["db_source", "legacy_id"], name: "index_fsc_organizations_on_source_and_legacy_id", using: :btree + add_index "fsc_organizations", ["unit_id"], name: "index_fsc_organizations_on_unit_id", using: :btree + end +end diff --git a/db/migrate/20180130115530_fsc_open.rb b/db/migrate/20180130115530_fsc_open.rb new file mode 100644 index 0000000..fb87565 --- /dev/null +++ b/db/migrate/20180130115530_fsc_open.rb @@ -0,0 +1,15 @@ +class FscOpen < ActiveRecord::Migration + def change + create_table :fsc_opens, force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.date "open" + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fsc_opens", ["db_source", "legacy_id"], name: "index_fsc_opens_on_source_and_legacy_id", using: :btree + add_index "fsc_opens", ["unit_id"], name: "index_fsc_opens_on_unit_id", using: :btree + end +end diff --git a/db/migrate/20180130115554_fsc_close.rb b/db/migrate/20180130115554_fsc_close.rb new file mode 100644 index 0000000..eaea603 --- /dev/null +++ b/db/migrate/20180130115554_fsc_close.rb @@ -0,0 +1,15 @@ +class FscClose < ActiveRecord::Migration + def change + create_table :fsc_closes, force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.date "close" + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fsc_closes", ["db_source", "legacy_id"], name: "index_fsc_closes_on_source_and_legacy_id", using: :btree + add_index "fsc_closes", ["unit_id"], name: "index_fsc_closes_on_unit_id", using: :btree + end +end diff --git a/db/migrate/20180509131111_fe_identification.rb b/db/migrate/20180509131111_fe_identification.rb new file mode 100644 index 0000000..1019be1 --- /dev/null +++ b/db/migrate/20180509131111_fe_identification.rb @@ -0,0 +1,18 @@ +class FeIdentification < ActiveRecord::Migration + def change + create_table :fe_identifications, force: :cascade do |t| + t.integer "unit_id" + t.string "code", limit: 255 + t.integer "file_year", limit: 4 + t.string "category", limit: 255 + t.string "identification_class", limit: 255 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fe_identifications", ["db_source", "legacy_id"], name: "index_fe_identifications_on_source_and_legacy_id", using: :btree + add_index "fe_identifications", ["unit_id"], name: "index_fe_identifications_on_unit_id", using: :btree + end +end diff --git a/db/migrate/20180509131337_fe_designer.rb b/db/migrate/20180509131337_fe_designer.rb new file mode 100644 index 0000000..e1319dd --- /dev/null +++ b/db/migrate/20180509131337_fe_designer.rb @@ -0,0 +1,16 @@ +class FeDesigner < ActiveRecord::Migration + def change + create_table :fe_designers, force: :cascade do |t| + t.integer "unit_id" + t.string "designer_name", limit: 255 + t.string "designer_role", limit: 255 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fe_designers", ["db_source", "legacy_id"], name: "index_fe_designers_on_source_and_legacy_id", using: :btree + add_index "fe_designers", ["unit_id"], name: "index_fe_designers_on_unit_id", using: :btree + end +end diff --git a/db/migrate/20180509131529_fe_land_parcel.rb b/db/migrate/20180509131529_fe_land_parcel.rb new file mode 100644 index 0000000..e2320b3 --- /dev/null +++ b/db/migrate/20180509131529_fe_land_parcel.rb @@ -0,0 +1,15 @@ +class FeLandParcel < ActiveRecord::Migration + def change + create_table :fe_land_parcels, force: :cascade do |t| + t.integer "unit_id" + t.string "land_parcel_number", limit: 255 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fe_land_parcels", ["db_source", "legacy_id"], name: "index_fe_land_parcels_on_source_and_legacy_id", using: :btree + add_index "fe_land_parcels", ["unit_id"], name: "index_fe_land_parcels_on_unit_id", using: :btree + end +end diff --git a/db/migrate/20180509131604_fe_fract_land_parcel.rb b/db/migrate/20180509131604_fe_fract_land_parcel.rb new file mode 100644 index 0000000..cfc9189 --- /dev/null +++ b/db/migrate/20180509131604_fe_fract_land_parcel.rb @@ -0,0 +1,16 @@ +class FeFractLandParcel < ActiveRecord::Migration + def change + create_table :fe_fract_land_parcels, force: :cascade do |t| + t.integer "unit_id" + t.integer "fract_land_parcel_number", limit: 4 + t.integer "edil_parcel_number", limit: 4 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fe_fract_land_parcels", ["db_source", "legacy_id"], name: "index_fe_fract_land_parcels_on_source_and_legacy_id", using: :btree + add_index "fe_fract_land_parcels", ["unit_id"], name: "index_fe_fract_land_parcels_on_unit_id", using: :btree + end +end diff --git a/db/migrate/20180509131631_fe_fract_edil_parcel.rb b/db/migrate/20180509131631_fe_fract_edil_parcel.rb new file mode 100644 index 0000000..0d50e25 --- /dev/null +++ b/db/migrate/20180509131631_fe_fract_edil_parcel.rb @@ -0,0 +1,16 @@ +class FeFractEdilParcel < ActiveRecord::Migration + def change + create_table :fe_fract_edil_parcels, force: :cascade do |t| + t.integer "unit_id" + t.integer "fract_edil_parcel_number", limit: 4 + t.integer "material_portion", limit: 4 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fe_fract_edil_parcels", ["db_source", "legacy_id"], name: "index_fe_fract_edil_parcels_on_source_and_legacy_id", using: :btree + add_index "fe_fract_edil_parcels", ["unit_id"], name: "index_fe_fract_edil_parcels_on_unit_id", using: :btree + end +end diff --git a/db/migrate/20180510144807_fe_context.rb b/db/migrate/20180510144807_fe_context.rb new file mode 100644 index 0000000..1be2667 --- /dev/null +++ b/db/migrate/20180510144807_fe_context.rb @@ -0,0 +1,26 @@ +class FeContext < ActiveRecord::Migration + def change + create_table :fe_contexts, force: :cascade do |t| + t.integer "unit_id" + t.integer "number", limit: 4 + t.integer "sub_number", limit: 4 + t.string "classification", limit: 255 + t.string "applicant", limit: 255 + t.string "request", limit: 255 + t.integer "license_number", limit: 4 + t.integer "license_year", limit: 4 + t.integer "protocol_number", limit: 4 + t.date "license_date" + t.integer "habitability_number", limit: 4 + t.integer "habitability_year", limit: 4 + t.date "habitability_date" + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fe_contexts", ["db_source", "legacy_id"], name: "index_fe_contexts_on_source_and_legacy_id", using: :btree + add_index "fe_contexts", ["unit_id"], name: "index_fe_contexts_on_unit_id", using: :btree + end +end diff --git a/db/migrate/20180510144814_fe_opera.rb b/db/migrate/20180510144814_fe_opera.rb new file mode 100644 index 0000000..f1c1f43 --- /dev/null +++ b/db/migrate/20180510144814_fe_opera.rb @@ -0,0 +1,22 @@ +class FeOpera < ActiveRecord::Migration + def change + create_table :fe_operas, force: :cascade do |t| + t.integer "unit_id" + t.boolean "is_present", limit: 1, default: false, null: false + t.string "status", limit: 10 + t.string "building_name", limit: 255 + t.string "building_type", limit: 255 + t.string "place_name", limit: 255 + t.string "place_type", limit: 255 + t.string "house_number", limit: 255 + t.string "district", limit: 255 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fe_operas", ["db_source", "legacy_id"], name: "index_fe_operas_on_source_and_legacy_id", using: :btree + add_index "fe_operas", ["unit_id"], name: "index_fe_operas_on_unit_id", using: :btree + end +end diff --git a/db/migrate/20180510144824_fe_cadastral.rb b/db/migrate/20180510144824_fe_cadastral.rb new file mode 100644 index 0000000..dc9288e --- /dev/null +++ b/db/migrate/20180510144824_fe_cadastral.rb @@ -0,0 +1,18 @@ +class FeCadastral < ActiveRecord::Migration + def change + create_table :fe_cadastrals, force: :cascade do |t| + t.integer "unit_id" + t.integer "way_code", limit: 4 + t.string "cadastral_municipality", limit: 255 + t.integer "municipality_code", limit: 4 + t.integer "paper_code", limit: 4 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fe_cadastrals", ["db_source", "legacy_id"], name: "index_fe_cadastrals_on_source_and_legacy_id", using: :btree + add_index "fe_cadastrals", ["unit_id"], name: "index_fe_cadastrals_on_unit_id", using: :btree + end +end diff --git a/db/migrate/20190913101326_update_headings.rb b/db/migrate/20190913101326_update_headings.rb new file mode 100644 index 0000000..50f63af --- /dev/null +++ b/db/migrate/20190913101326_update_headings.rb @@ -0,0 +1,8 @@ +class UpdateHeadings < ActiveRecord::Migration + def up + change_column :headings, :qualifier, :text, :limit => 16777215 + end + def down + change_column :headings, :qualifier, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191120152439_update_fonds.rb b/db/migrate/20191120152439_update_fonds.rb new file mode 100644 index 0000000..a781b77 --- /dev/null +++ b/db/migrate/20191120152439_update_fonds.rb @@ -0,0 +1,28 @@ +class UpdateFonds < ActiveRecord::Migration + def up + change_column :fonds, :name, :text, :limit => 16777215 + change_column :fonds, :extent, :text, :limit => 16777215 + change_column :fonds, :abstract, :text, :limit => 16777215 + change_column :fonds, :description, :text, :limit => 16777215 + change_column :fonds, :history, :text, :limit => 16777215 + change_column :fonds, :arrangement_note, :text, :limit => 16777215 + change_column :fonds, :related_materials, :text, :limit => 16777215 + change_column :fonds, :note, :text, :limit => 16777215 + change_column :fonds, :access_condition_note, :text, :limit => 16777215 + change_column :fonds, :use_condition_note, :text, :limit => 16777215 + change_column :fonds, :preservation_note, :text, :limit => 16777215 + end + def down + change_column :fonds, :name, :text, :limit => 16777215 + change_column :fonds, :extent, :text, :limit => 16777215 + change_column :fonds, :abstract, :text, :limit => 16777215 + change_column :fonds, :description, :text, :limit => 16777215 + change_column :fonds, :history, :text, :limit => 16777215 + change_column :fonds, :arrangement_note, :text, :limit => 16777215 + change_column :fonds, :related_materials, :text, :limit => 16777215 + change_column :fonds, :note, :text, :limit => 16777215 + change_column :fonds, :access_condition_note, :text, :limit => 16777215 + change_column :fonds, :use_condition_note, :text, :limit => 16777215 + change_column :fonds, :preservation_note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191121093705_update_fond_names.rb b/db/migrate/20191121093705_update_fond_names.rb new file mode 100644 index 0000000..6193023 --- /dev/null +++ b/db/migrate/20191121093705_update_fond_names.rb @@ -0,0 +1,10 @@ +class UpdateFondNames < ActiveRecord::Migration + def up + change_column :fond_names, :name, :text, :limit => 16777215 + change_column :fond_names, :note, :text, :limit => 16777215 + end + def down + change_column :fond_names, :name, :text, :limit => 16777215 + change_column :fond_names, :note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191121102409_update_fond_events.rb b/db/migrate/20191121102409_update_fond_events.rb new file mode 100644 index 0000000..0b8ebcd --- /dev/null +++ b/db/migrate/20191121102409_update_fond_events.rb @@ -0,0 +1,8 @@ +class UpdateFondEvents < ActiveRecord::Migration + def up + change_column :fond_events, :note, :text, :limit => 16777215 + end + def down + change_column :fond_events, :note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191121105837_update_fond_owners.rb b/db/migrate/20191121105837_update_fond_owners.rb new file mode 100644 index 0000000..00d2770 --- /dev/null +++ b/db/migrate/20191121105837_update_fond_owners.rb @@ -0,0 +1,8 @@ +class UpdateFondOwners < ActiveRecord::Migration + def up + change_column :fond_owners, :owner, :text, :limit => 16777215 + end + def down + change_column :fond_owners, :owner, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191121110829_update_fond_urls.rb b/db/migrate/20191121110829_update_fond_urls.rb new file mode 100644 index 0000000..589bc78 --- /dev/null +++ b/db/migrate/20191121110829_update_fond_urls.rb @@ -0,0 +1,8 @@ +class UpdateFondUrls < ActiveRecord::Migration + def up + change_column :fond_urls, :note, :text, :limit => 16777215 + end + def down + change_column :fond_urls, :note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191121111304_update_fond_identifiers.rb b/db/migrate/20191121111304_update_fond_identifiers.rb new file mode 100644 index 0000000..1bfbf18 --- /dev/null +++ b/db/migrate/20191121111304_update_fond_identifiers.rb @@ -0,0 +1,8 @@ +class UpdateFondIdentifiers < ActiveRecord::Migration + def up + change_column :fond_identifiers, :note, :text, :limit => 16777215 + end + def down + change_column :fond_identifiers, :note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191121130737_update_units.rb b/db/migrate/20191121130737_update_units.rb new file mode 100644 index 0000000..98a3460 --- /dev/null +++ b/db/migrate/20191121130737_update_units.rb @@ -0,0 +1,41 @@ +class UpdateUnits < ActiveRecord::Migration + def up + change_column :units, :title, :text, :limit => 16777215 + change_column :units, :content, :text, :limit => 16777215 + change_column :units, :extent, :text, :limit => 16777215 + change_column :units, :arrangement_note, :text, :limit => 16777215 + change_column :units, :related_materials, :text, :limit => 16777215 + change_column :units, :physical_description, :text, :limit => 16777215 + change_column :units, :preservation_note, :text, :limit => 16777215 + change_column :units, :restoration, :text, :limit => 16777215 + change_column :units, :note, :text, :limit => 16777215 + change_column :units, :access_condition_note, :text, :limit => 16777215 + change_column :units, :use_condition_note, :text, :limit => 16777215 + change_column :units, :tmp_reference_string, :text, :limit => 16777215 + change_column :units, :reference_number, :text, :limit => 16777215 + change_column :units, :fsc_name, :text, :limit => 16777215 + change_column :units, :fsc_surname, :text, :limit => 16777215 + change_column :units, :physical_container_type, :text, :limit => 16777215 + change_column :units, :physical_container_title, :text, :limit => 16777215 + change_column :units, :physical_container_number, :text, :limit => 16777215 + end + def down + change_column :units, :title, :text, :limit => 16777215 + change_column :units, :content, :text, :limit => 16777215 + change_column :units, :extent, :text, :limit => 16777215 + change_column :units, :arrangement_note, :text, :limit => 16777215 + change_column :units, :related_materials, :text, :limit => 16777215 + change_column :units, :physical_description, :text, :limit => 16777215 + change_column :units, :preservation_note, :text, :limit => 16777215 + change_column :units, :restoration, :text, :limit => 16777215 + change_column :units, :note, :text, :limit => 16777215 + change_column :units, :access_condition_note, :text, :limit => 16777215 + change_column :units, :use_condition_note, :text, :limit => 16777215 + change_column :units, :tmp_reference_string, :text, :limit => 16777215 + change_column :units, :reference_number, :text, :limit => 16777215 + change_column :units, :fsc_name, :text, :limit => 16777215 + change_column :units, :fsc_surname, :text, :limit => 16777215 + change_column :units, :physical_container_type, :text, :limit => 16777215 + change_column :units, :physical_container_number, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191121131948_update_unit_events.rb b/db/migrate/20191121131948_update_unit_events.rb new file mode 100644 index 0000000..e927c97 --- /dev/null +++ b/db/migrate/20191121131948_update_unit_events.rb @@ -0,0 +1,8 @@ +class UpdateUnitEvents < ActiveRecord::Migration + def up + change_column :unit_events, :note, :text, :limit => 16777215 + end + def down + change_column :unit_events, :note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191121143417_update_creators.rb b/db/migrate/20191121143417_update_creators.rb new file mode 100644 index 0000000..655a1ba --- /dev/null +++ b/db/migrate/20191121143417_update_creators.rb @@ -0,0 +1,14 @@ +class UpdateCreators < ActiveRecord::Migration + def up + change_column :creators, :abstract, :text, :limit => 16777215 + change_column :creators, :history, :text, :limit => 16777215 + change_column :creators, :note, :text, :limit => 16777215 + change_column :creators, :residence, :text, :limit => 16777215 + end + def down + change_column :creators, :abstract, :text, :limit => 16777215 + change_column :creators, :history, :text, :limit => 16777215 + change_column :creators, :note, :text, :limit => 16777215 + change_column :creators, :residence, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191121144940_update_creator_names.rb b/db/migrate/20191121144940_update_creator_names.rb new file mode 100644 index 0000000..d4dd4aa --- /dev/null +++ b/db/migrate/20191121144940_update_creator_names.rb @@ -0,0 +1,14 @@ +class UpdateCreatorNames < ActiveRecord::Migration + def up + change_column :creator_names, :name, :text, :limit => 16777215 + change_column :creator_names, :first_name, :text, :limit => 16777215 + change_column :creator_names, :last_name, :text, :limit => 16777215 + change_column :creator_names, :note, :text, :limit => 16777215 + end + def down + change_column :creator_names, :name, :text, :limit => 16777215 + change_column :creator_names, :first_name, :text, :limit => 16777215 + change_column :creator_names, :last_name, :text, :limit => 16777215 + change_column :creator_names, :note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191121150756_update_creator_activities.rb b/db/migrate/20191121150756_update_creator_activities.rb new file mode 100644 index 0000000..e1b8848 --- /dev/null +++ b/db/migrate/20191121150756_update_creator_activities.rb @@ -0,0 +1,10 @@ +class UpdateCreatorActivities < ActiveRecord::Migration + def up + change_column :creator_activities, :activity, :text, :limit => 16777215 + change_column :creator_activities, :note, :text, :limit => 16777215 + end + def down + change_column :creator_activities, :activity, :text, :limit => 16777215 + change_column :creator_activities, :note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191121152618_update_custodian_names.rb b/db/migrate/20191121152618_update_custodian_names.rb new file mode 100644 index 0000000..233b353 --- /dev/null +++ b/db/migrate/20191121152618_update_custodian_names.rb @@ -0,0 +1,10 @@ +class UpdateCustodianNames < ActiveRecord::Migration + def up + change_column :custodian_names, :name, :text, :limit => 16777215 + change_column :custodian_names, :note, :text, :limit => 16777215 + end + def down + change_column :custodian_names, :name, :text, :limit => 16777215 + change_column :custodian_names, :note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191121154751_update_custodians.rb b/db/migrate/20191121154751_update_custodians.rb new file mode 100644 index 0000000..7f80d68 --- /dev/null +++ b/db/migrate/20191121154751_update_custodians.rb @@ -0,0 +1,18 @@ +class UpdateCustodians < ActiveRecord::Migration + def up + change_column :custodians, :history, :text, :limit => 16777215 + change_column :custodians, :holdings, :text, :limit => 16777215 + change_column :custodians, :collecting_policies, :text, :limit => 16777215 + change_column :custodians, :administrative_structure, :text, :limit => 16777215 + change_column :custodians, :accessibility, :text, :limit => 16777215 + change_column :custodians, :services, :text, :limit => 16777215 + end + def down + change_column :custodians, :history, :text, :limit => 16777215 + change_column :custodians, :holdings, :text, :limit => 16777215 + change_column :custodians, :collecting_policies, :text, :limit => 16777215 + change_column :custodians, :administrative_structure, :text, :limit => 16777215 + change_column :custodians, :accessibility, :text, :limit => 16777215 + change_column :custodians, :services, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191122090252_update_custodian_contacts.rb b/db/migrate/20191122090252_update_custodian_contacts.rb new file mode 100644 index 0000000..938aae6 --- /dev/null +++ b/db/migrate/20191122090252_update_custodian_contacts.rb @@ -0,0 +1,8 @@ +class UpdateCustodianContacts < ActiveRecord::Migration + def up + change_column :custodian_contacts, :contact_note, :text, :limit => 16777215 + end + def down + change_column :custodian_contacts, :contact_note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191122090606_update_custodian_urls.rb b/db/migrate/20191122090606_update_custodian_urls.rb new file mode 100644 index 0000000..6e5956a --- /dev/null +++ b/db/migrate/20191122090606_update_custodian_urls.rb @@ -0,0 +1,8 @@ +class UpdateCustodianUrls < ActiveRecord::Migration + def up + change_column :custodian_urls, :note, :text, :limit => 16777215 + end + def down + change_column :custodian_urls, :note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191122090823_update_custodian_identifiers.rb b/db/migrate/20191122090823_update_custodian_identifiers.rb new file mode 100644 index 0000000..18708ae --- /dev/null +++ b/db/migrate/20191122090823_update_custodian_identifiers.rb @@ -0,0 +1,8 @@ +class UpdateCustodianIdentifiers < ActiveRecord::Migration + def up + change_column :custodian_identifiers, :note, :text, :limit => 16777215 + end + def down + change_column :custodian_identifiers, :note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191122092849_update_custodian_buildings.rb b/db/migrate/20191122092849_update_custodian_buildings.rb new file mode 100644 index 0000000..3304def --- /dev/null +++ b/db/migrate/20191122092849_update_custodian_buildings.rb @@ -0,0 +1,10 @@ +class UpdateCustodianBuildings < ActiveRecord::Migration + def up + change_column :custodian_buildings, :name, :text, :limit => 16777215 + change_column :custodian_buildings, :description, :text, :limit => 16777215 + end + def down + change_column :custodian_buildings, :name, :text, :limit => 16777215 + change_column :custodian_buildings, :description, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191122093947_update_institutions.rb b/db/migrate/20191122093947_update_institutions.rb new file mode 100644 index 0000000..35edc21 --- /dev/null +++ b/db/migrate/20191122093947_update_institutions.rb @@ -0,0 +1,12 @@ +class UpdateInstitutions < ActiveRecord::Migration + def up + change_column :institutions, :name, :text, :limit => 16777215 + change_column :institutions, :description, :text, :limit => 16777215 + change_column :institutions, :note, :text, :limit => 16777215 + end + def down + change_column :institutions, :name, :text, :limit => 16777215 + change_column :institutions, :description, :text, :limit => 16777215 + change_column :institutions, :note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191122094656_update_document_forms.rb b/db/migrate/20191122094656_update_document_forms.rb new file mode 100644 index 0000000..e71fc32 --- /dev/null +++ b/db/migrate/20191122094656_update_document_forms.rb @@ -0,0 +1,12 @@ +class UpdateDocumentForms < ActiveRecord::Migration + def up + change_column :document_forms, :name, :text, :limit => 16777215 + change_column :document_forms, :description, :text, :limit => 16777215 + change_column :document_forms, :note, :text, :limit => 16777215 + end + def down + change_column :document_forms, :name, :text, :limit => 16777215 + change_column :document_forms, :description, :text, :limit => 16777215 + change_column :document_forms, :note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191122095515_update_projects.rb b/db/migrate/20191122095515_update_projects.rb new file mode 100644 index 0000000..581edc1 --- /dev/null +++ b/db/migrate/20191122095515_update_projects.rb @@ -0,0 +1,12 @@ +class UpdateProjects < ActiveRecord::Migration + def up + change_column :projects, :name, :text, :limit => 16777215 + change_column :projects, :description, :text, :limit => 16777215 + change_column :projects, :note, :text, :limit => 16777215 + end + def down + change_column :projects, :name, :text, :limit => 16777215 + change_column :projects, :description, :text, :limit => 16777215 + change_column :projects, :note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191122095856_update_project_urls.rb b/db/migrate/20191122095856_update_project_urls.rb new file mode 100644 index 0000000..0cea411 --- /dev/null +++ b/db/migrate/20191122095856_update_project_urls.rb @@ -0,0 +1,8 @@ +class UpdateProjectUrls < ActiveRecord::Migration + def up + change_column :project_urls, :note, :text, :limit => 16777215 + end + def down + change_column :project_urls, :note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191122101544_update_sources.rb b/db/migrate/20191122101544_update_sources.rb new file mode 100644 index 0000000..8d49c00 --- /dev/null +++ b/db/migrate/20191122101544_update_sources.rb @@ -0,0 +1,26 @@ +class UpdateSources < ActiveRecord::Migration + def up + change_column :sources, :short_title, :text, :limit => 16777215 + change_column :sources, :title, :text, :limit => 16777215 + change_column :sources, :date_string, :text, :limit => 255 + change_column :sources, :abstract, :text, :limit => 16777215 + change_column :sources, :author, :text, :limit => 16777215 + change_column :sources, :editor, :text, :limit => 16777215 + change_column :sources, :place, :text, :limit => 16777215 + change_column :sources, :publisher, :text, :limit => 16777215 + change_column :sources, :related_item, :text, :limit => 16777215 + change_column :sources, :related_item_specs, :text, :limit => 16777215 + end + def down + change_column :sources, :short_title, :text, :limit => 16777215 + change_column :sources, :title, :text, :limit => 16777215 + change_column :sources, :date_string, :text, :limit => 255 + change_column :sources, :abstract, :text, :limit => 16777215 + change_column :sources, :author, :text, :limit => 16777215 + change_column :sources, :editor, :text, :limit => 16777215 + change_column :sources, :place, :text, :limit => 16777215 + change_column :sources, :publisher, :text, :limit => 16777215 + change_column :sources, :related_item, :text, :limit => 16777215 + change_column :sources, :related_item_specs, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191122103658_update_source_urls.rb b/db/migrate/20191122103658_update_source_urls.rb new file mode 100644 index 0000000..5de5a25 --- /dev/null +++ b/db/migrate/20191122103658_update_source_urls.rb @@ -0,0 +1,10 @@ +class UpdateSourceUrls < ActiveRecord::Migration + def up + change_column :source_urls, :url, :text, :limit => 65535 + change_column :source_urls, :note, :text, :limit => 16777215 + end + def down + change_column :source_urls, :url, :text, :limit => 65535 + change_column :source_urls, :note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191202092611_update_fond_editors.rb b/db/migrate/20191202092611_update_fond_editors.rb new file mode 100644 index 0000000..4f8d944 --- /dev/null +++ b/db/migrate/20191202092611_update_fond_editors.rb @@ -0,0 +1,10 @@ +class UpdateFondEditors < ActiveRecord::Migration + def up + change_column :fond_editors, :name, :text, :limit => 16777215 + change_column :fond_editors, :qualifier, :text, :limit => 16777215 + end + def down + change_column :fond_editors, :name, :text, :limit => 16777215 + change_column :fond_editors, :qualifier, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191202094446_update_creator_editors.rb b/db/migrate/20191202094446_update_creator_editors.rb new file mode 100644 index 0000000..bd165f7 --- /dev/null +++ b/db/migrate/20191202094446_update_creator_editors.rb @@ -0,0 +1,10 @@ +class UpdateCreatorEditors < ActiveRecord::Migration + def up + change_column :creator_editors, :name, :text, :limit => 16777215 + change_column :creator_editors, :qualifier, :text, :limit => 16777215 + end + def down + change_column :creator_editors, :name, :text, :limit => 16777215 + change_column :creator_editors, :qualifier, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191202095907_update_creator_events.rb b/db/migrate/20191202095907_update_creator_events.rb new file mode 100644 index 0000000..be7191f --- /dev/null +++ b/db/migrate/20191202095907_update_creator_events.rb @@ -0,0 +1,12 @@ +class UpdateCreatorEvents < ActiveRecord::Migration + def up + change_column :creator_events, :note, :text, :limit => 16777215 + change_column :creator_events, :start_date_place, :text, :limit => 16777215 + change_column :creator_events, :end_date_place, :text, :limit => 16777215 + end + def down + change_column :creator_events, :note, :text, :limit => 16777215 + change_column :creator_events, :start_date_place, :text, :limit => 16777215 + change_column :creator_events, :end_date_place, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191202100425_update_creator_legal_statuses.rb b/db/migrate/20191202100425_update_creator_legal_statuses.rb new file mode 100644 index 0000000..609694c --- /dev/null +++ b/db/migrate/20191202100425_update_creator_legal_statuses.rb @@ -0,0 +1,8 @@ +class UpdateCreatorLegalStatuses < ActiveRecord::Migration + def up + change_column :creator_legal_statuses, :note, :text, :limit => 16777215 + end + def down + change_column :creator_legal_statuses, :note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191202101559_update_creator_urls.rb b/db/migrate/20191202101559_update_creator_urls.rb new file mode 100644 index 0000000..da07f67 --- /dev/null +++ b/db/migrate/20191202101559_update_creator_urls.rb @@ -0,0 +1,10 @@ +class UpdateCreatorUrls < ActiveRecord::Migration +def up + change_column :creator_urls, :url, :text, :limit => 65535 + change_column :creator_urls, :note, :text, :limit => 16777215 + end + def down + change_column :creator_urls, :url, :text, :limit => 65535 + change_column :creator_urls, :note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191202111540_update_creator_identifiers.rb b/db/migrate/20191202111540_update_creator_identifiers.rb new file mode 100644 index 0000000..3ad20db --- /dev/null +++ b/db/migrate/20191202111540_update_creator_identifiers.rb @@ -0,0 +1,12 @@ +class UpdateCreatorIdentifiers < ActiveRecord::Migration + def up + change_column :creator_identifiers, :identifier, :text, :limit => 16777215 + change_column :creator_identifiers, :identifier_source, :text, :limit => 16777215 + change_column :creator_identifiers, :note, :text, :limit => 16777215 + end + def down + change_column :creator_identifiers, :identifier, :text, :limit => 16777215 + change_column :creator_identifiers, :identifier_source, :text, :limit => 16777215 + change_column :creator_identifiers, :note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191202134905_update_unit_urls.rb b/db/migrate/20191202134905_update_unit_urls.rb new file mode 100644 index 0000000..83a47fa --- /dev/null +++ b/db/migrate/20191202134905_update_unit_urls.rb @@ -0,0 +1,10 @@ +class UpdateUnitUrls < ActiveRecord::Migration +def up + change_column :unit_urls, :url, :text, :limit => 65535 + change_column :unit_urls, :note, :text, :limit => 16777215 + end + def down + change_column :unit_urls, :url, :text, :limit => 65535 + change_column :unit_urls, :note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191202135957_update_unit_identifiers.rb b/db/migrate/20191202135957_update_unit_identifiers.rb new file mode 100644 index 0000000..e000b6b --- /dev/null +++ b/db/migrate/20191202135957_update_unit_identifiers.rb @@ -0,0 +1,12 @@ +class UpdateUnitIdentifiers < ActiveRecord::Migration +def up + change_column :unit_identifiers, :identifier, :text, :limit => 16777215 + change_column :unit_identifiers, :identifier_source, :text, :limit => 16777215 + change_column :unit_identifiers, :note, :text, :limit => 16777215 + end + def down + change_column :unit_identifiers, :identifier, :text, :limit => 16777215 + change_column :unit_identifiers, :identifier_source, :text, :limit => 16777215 + change_column :unit_identifiers, :note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191202140523_update_unit_editors.rb b/db/migrate/20191202140523_update_unit_editors.rb new file mode 100644 index 0000000..0bda431 --- /dev/null +++ b/db/migrate/20191202140523_update_unit_editors.rb @@ -0,0 +1,10 @@ +class UpdateUnitEditors < ActiveRecord::Migration +def up + change_column :unit_editors, :name, :text, :limit => 16777215 + change_column :unit_editors, :qualifier, :text, :limit => 16777215 + end + def down + change_column :unit_editors, :name, :text, :limit => 16777215 + change_column :unit_editors, :qualifier, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191202144758_update_fsc_organization.rb b/db/migrate/20191202144758_update_fsc_organization.rb new file mode 100644 index 0000000..c752acc --- /dev/null +++ b/db/migrate/20191202144758_update_fsc_organization.rb @@ -0,0 +1,8 @@ +class UpdateFscOrganization < ActiveRecord::Migration +def up + change_column :fsc_organizations, :organization, :text, :limit => 16777215 + end + def down + change_column :fsc_organizations, :organization, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191202145045_update_fsc_nationalities.rb b/db/migrate/20191202145045_update_fsc_nationalities.rb new file mode 100644 index 0000000..153bc7f --- /dev/null +++ b/db/migrate/20191202145045_update_fsc_nationalities.rb @@ -0,0 +1,8 @@ +class UpdateFscNationalities < ActiveRecord::Migration +def up + change_column :fsc_nationalities, :nationality, :text, :limit => 16777215 + end + def down + change_column :fsc_nationalities, :nationality, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191202151409_update_unit_other_reference_numbers.rb b/db/migrate/20191202151409_update_unit_other_reference_numbers.rb new file mode 100644 index 0000000..2006074 --- /dev/null +++ b/db/migrate/20191202151409_update_unit_other_reference_numbers.rb @@ -0,0 +1,12 @@ +class UpdateUnitOtherReferenceNumbers < ActiveRecord::Migration +def up + change_column :unit_other_reference_numbers, :other_reference_number, :text, :limit => 16777215 + change_column :unit_other_reference_numbers, :qualifier, :text, :limit => 16777215 + change_column :unit_other_reference_numbers, :note, :text, :limit => 16777215 + end + def down + change_column :unit_other_reference_numbers, :other_reference_number, :text, :limit => 16777215 + change_column :unit_other_reference_numbers, :qualifier, :text, :limit => 16777215 + change_column :unit_other_reference_numbers, :note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191203083955_update_fe_identifications.rb b/db/migrate/20191203083955_update_fe_identifications.rb new file mode 100644 index 0000000..46a0390 --- /dev/null +++ b/db/migrate/20191203083955_update_fe_identifications.rb @@ -0,0 +1,12 @@ +class UpdateFeIdentifications < ActiveRecord::Migration +def up + change_column :fe_identifications, :code, :text, :limit => 16777215 + change_column :fe_identifications, :category, :text, :limit => 16777215 + change_column :fe_identifications, :identification_class, :text, :limit => 16777215 + end + def down + change_column :fe_identifications, :code, :text, :limit => 16777215 + change_column :fe_identifications, :category, :text, :limit => 16777215 + change_column :fe_identifications, :identification_class, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191203090509_update_fe_contexts.rb b/db/migrate/20191203090509_update_fe_contexts.rb new file mode 100644 index 0000000..02cf988 --- /dev/null +++ b/db/migrate/20191203090509_update_fe_contexts.rb @@ -0,0 +1,12 @@ +class UpdateFeContexts < ActiveRecord::Migration +def up + change_column :fe_contexts, :classification, :text, :limit => 16777215 + change_column :fe_contexts, :applicant, :text, :limit => 16777215 + change_column :fe_contexts, :request, :text, :limit => 16777215 + end + def down + change_column :fe_contexts, :classification, :text, :limit => 16777215 + change_column :fe_contexts, :applicant, :text, :limit => 16777215 + change_column :fe_contexts, :request, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191203092608_update_fe_operas.rb b/db/migrate/20191203092608_update_fe_operas.rb new file mode 100644 index 0000000..b6d2030 --- /dev/null +++ b/db/migrate/20191203092608_update_fe_operas.rb @@ -0,0 +1,16 @@ +class UpdateFeOperas < ActiveRecord::Migration +def up + change_column :fe_operas, :building_name, :text, :limit => 16777215 + change_column :fe_operas, :building_type, :text, :limit => 16777215 + change_column :fe_operas, :place_name, :text, :limit => 16777215 + change_column :fe_operas, :place_type, :text, :limit => 16777215 + change_column :fe_operas, :district, :text, :limit => 16777215 + end + def down + change_column :fe_operas, :building_name, :text, :limit => 16777215 + change_column :fe_operas, :building_type, :text, :limit => 16777215 + change_column :fe_operas, :place_name, :text, :limit => 16777215 + change_column :fe_operas, :place_type, :text, :limit => 16777215 + change_column :fe_operas, :district, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191203094002_update_fe_designers.rb b/db/migrate/20191203094002_update_fe_designers.rb new file mode 100644 index 0000000..d075543 --- /dev/null +++ b/db/migrate/20191203094002_update_fe_designers.rb @@ -0,0 +1,10 @@ +class UpdateFeDesigners < ActiveRecord::Migration +def up + change_column :fe_designers, :designer_name, :text, :limit => 16777215 + change_column :fe_designers, :designer_role, :text, :limit => 16777215 + end + def down + change_column :fe_designers, :designer_name, :text, :limit => 16777215 + change_column :fe_designers, :designer_role, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191203094501_update_fe_cadastrals.rb b/db/migrate/20191203094501_update_fe_cadastrals.rb new file mode 100644 index 0000000..8fb4c33 --- /dev/null +++ b/db/migrate/20191203094501_update_fe_cadastrals.rb @@ -0,0 +1,8 @@ +class UpdateFeCadastrals < ActiveRecord::Migration +def up + change_column :fe_cadastrals, :cadastral_municipality, :text, :limit => 16777215 + end + def down + change_column :fe_cadastrals, :cadastral_municipality, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191203095048_update_fe_land_parcels.rb b/db/migrate/20191203095048_update_fe_land_parcels.rb new file mode 100644 index 0000000..bf8dea8 --- /dev/null +++ b/db/migrate/20191203095048_update_fe_land_parcels.rb @@ -0,0 +1,8 @@ +class UpdateFeLandParcels < ActiveRecord::Migration +def up + change_column :fe_land_parcels, :land_parcel_number, :text, :limit => 16777215 + end + def down + change_column :fe_land_parcels, :land_parcel_number, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191203105439_update_sc2_textual_elements.rb b/db/migrate/20191203105439_update_sc2_textual_elements.rb new file mode 100644 index 0000000..6dfad91 --- /dev/null +++ b/db/migrate/20191203105439_update_sc2_textual_elements.rb @@ -0,0 +1,8 @@ +class UpdateSc2TextualElements < ActiveRecord::Migration +def up + change_column :sc2_textual_elements, :isri, :text, :limit => 16777215 + end + def down + change_column :sc2_textual_elements, :isri, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191203105728_update_sc2_visual_elements.rb b/db/migrate/20191203105728_update_sc2_visual_elements.rb new file mode 100644 index 0000000..91a68d5 --- /dev/null +++ b/db/migrate/20191203105728_update_sc2_visual_elements.rb @@ -0,0 +1,8 @@ +class UpdateSc2VisualElements < ActiveRecord::Migration +def up + change_column :sc2_visual_elements, :stmd, :text, :limit => 16777215 + end + def down + change_column :sc2_visual_elements, :stmd, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191203110608_update_sc2s.rb b/db/migrate/20191203110608_update_sc2s.rb new file mode 100644 index 0000000..26a9f16 --- /dev/null +++ b/db/migrate/20191203110608_update_sc2s.rb @@ -0,0 +1,12 @@ +class UpdateSc2s < ActiveRecord::Migration +def up + change_column :sc2s, :sgti, :text, :limit => 16777215 + change_column :sc2s, :cmmr, :text, :limit => 16777215 + change_column :sc2s, :lrc, :text, :limit => 16777215 + end + def down + change_column :sc2s, :sgti, :text, :limit => 16777215 + change_column :sc2s, :cmmr, :text, :limit => 16777215 + change_column :sc2s, :lrc, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191203110852_update_sc2_authors.rb b/db/migrate/20191203110852_update_sc2_authors.rb new file mode 100644 index 0000000..541f690 --- /dev/null +++ b/db/migrate/20191203110852_update_sc2_authors.rb @@ -0,0 +1,8 @@ +class UpdateSc2Authors < ActiveRecord::Migration +def up + change_column :sc2_authors, :autn, :text, :limit => 16777215 + end + def down + change_column :sc2_authors, :autn, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191203111527_update_sc2_commission_names.rb b/db/migrate/20191203111527_update_sc2_commission_names.rb new file mode 100644 index 0000000..779be24 --- /dev/null +++ b/db/migrate/20191203111527_update_sc2_commission_names.rb @@ -0,0 +1,8 @@ +class UpdateSc2CommissionNames < ActiveRecord::Migration +def up + change_column :sc2_commission_names, :cmmn, :text, :limit => 16777215 + end + def down + change_column :sc2_commission_names, :cmmn, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191203111907_update_sc2_commissions.rb b/db/migrate/20191203111907_update_sc2_commissions.rb new file mode 100644 index 0000000..f8f12ea --- /dev/null +++ b/db/migrate/20191203111907_update_sc2_commissions.rb @@ -0,0 +1,8 @@ +class UpdateSc2Commissions < ActiveRecord::Migration +def up + change_column :sc2_commissions, :cmmc, :text, :limit => 16777215 + end + def down + change_column :sc2_commissions, :cmmc, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20191206152223_update_langs.rb b/db/migrate/20191206152223_update_langs.rb new file mode 100644 index 0000000..2202797 --- /dev/null +++ b/db/migrate/20191206152223_update_langs.rb @@ -0,0 +1,10 @@ +class UpdateLangs < ActiveRecord::Migration + def up + Lang.update_all(active: 1) + Lang.where(it_name: "").update_all("it_name=en_name") + Lang.where(it_name: nil).update_all("it_name=en_name") + end + def down + Lang.update_all(active: 0) + end +end diff --git a/db/migrate/20200313083401_change_access_condition_to_fonds.rb b/db/migrate/20200313083401_change_access_condition_to_fonds.rb new file mode 100644 index 0000000..15850f1 --- /dev/null +++ b/db/migrate/20200313083401_change_access_condition_to_fonds.rb @@ -0,0 +1,6 @@ +class ChangeAccessConditionToFonds < ActiveRecord::Migration + def change + change_column :fonds, :access_condition, :text, :limit => 16777215 + change_column :fonds, :access_condition_note, :text, :limit => 16777215 + end +end diff --git a/db/migrate/20200316141358_update_qualify_to_custodian_names.rb b/db/migrate/20200316141358_update_qualify_to_custodian_names.rb new file mode 100644 index 0000000..1c571be --- /dev/null +++ b/db/migrate/20200316141358_update_qualify_to_custodian_names.rb @@ -0,0 +1,5 @@ +class UpdateQualifyToCustodianNames < ActiveRecord::Migration + def change + CustodianName.connection.execute("UPDATE custodian_names set qualifier='OT' where qualifier='AU'") + end +end diff --git a/db/migrate/20200316160622_update_qualify_to_creator_names.rb b/db/migrate/20200316160622_update_qualify_to_creator_names.rb new file mode 100644 index 0000000..165dca5 --- /dev/null +++ b/db/migrate/20200316160622_update_qualify_to_creator_names.rb @@ -0,0 +1,5 @@ +class UpdateQualifyToCreatorNames < ActiveRecord::Migration + def change + CreatorName.connection.execute("UPDATE creator_names set qualifier='OT' where qualifier='AU'") + end +end diff --git a/db/migrate/20200316163355_remove_au_qualify_from_terms.rb b/db/migrate/20200316163355_remove_au_qualify_from_terms.rb new file mode 100644 index 0000000..ebcbf07 --- /dev/null +++ b/db/migrate/20200316163355_remove_au_qualify_from_terms.rb @@ -0,0 +1,5 @@ +class RemoveAuQualifyFromTerms < ActiveRecord::Migration + def change + Term.connection.execute("DELETE FROM terms WHERE term_key='authorized_name' and term_value='AU'") + end +end diff --git a/db/migrate/20200320083311_add_pec_and_web_items_to_terms.rb b/db/migrate/20200320083311_add_pec_and_web_items_to_terms.rb new file mode 100644 index 0000000..a0e78cf --- /dev/null +++ b/db/migrate/20200320083311_add_pec_and_web_items_to_terms.rb @@ -0,0 +1,15 @@ +class AddPecAndWebItemsToTerms < ActiveRecord::Migration + def change + Term.connection.execute( + "insert into terms (vocabulary_id, position, term_key, term_value, created_at, updated_at) + select id, 4, 'pec', 'pec', SYSDATE(), SYSDATE() + from vocabularies + where name = 'custodian_contacts.contact_type'") + + Term.connection.execute( + "insert into terms (vocabulary_id, position, term_key, term_value, created_at, updated_at) + select id, 5, 'web', 'web', SYSDATE(), SYSDATE() + from vocabularies + where name = 'custodian_contacts.contact_type'") + end +end diff --git a/db/migrate/20200422153736_add_creator_qualifier_items_to_terms.rb b/db/migrate/20200422153736_add_creator_qualifier_items_to_terms.rb new file mode 100644 index 0000000..00670a3 --- /dev/null +++ b/db/migrate/20200422153736_add_creator_qualifier_items_to_terms.rb @@ -0,0 +1,27 @@ +class AddCreatorQualifierItemsToTerms < ActiveRecord::Migration + def change + Term.connection.execute( + "insert into terms (vocabulary_id, position, term_key, term_value, created_at, updated_at) + select id, 5, 'intestazione', 'IN', SYSDATE(), SYSDATE() + from vocabularies + where name = 'creator_names.qualifier'") + + Term.connection.execute( + "insert into terms (vocabulary_id, position, term_key, term_value, created_at, updated_at) + select id, 6, 'patronimico', 'PT', SYSDATE(), SYSDATE() + from vocabularies + where name = 'creator_names.qualifier'") + + Term.connection.execute( + "insert into terms (vocabulary_id, position, term_key, term_value, created_at, updated_at) + select id, 7, 'pseudonimo', 'AL', SYSDATE(), SYSDATE() + from vocabularies + where name = 'creator_names.qualifier'") + + Term.connection.execute( + "insert into terms (vocabulary_id, position, term_key, term_value, created_at, updated_at) + select id, 7, 'soprannome', 'SN', SYSDATE(), SYSDATE() + from vocabularies + where name = 'creator_names.qualifier'") + end +end diff --git a/db/migrate/20200430064258_update_headings_group_id.rb b/db/migrate/20200430064258_update_headings_group_id.rb new file mode 100644 index 0000000..9f36fdd --- /dev/null +++ b/db/migrate/20200430064258_update_headings_group_id.rb @@ -0,0 +1,13 @@ +class UpdateHeadingsGroupId < ActiveRecord::Migration + def up + change_column_default(:headings, :group_id, '1') + Term.connection.execute("UPDATE headings SET group_id = '1' WHERE ISNULL(group_id)") + end + + def down + change_column_default(:headings, :group_id, nil) + + # ATTENZIONE: quanto segue può coinvolgere più righe di quelle coinvolte nel metodo up + Term.connection.execute("UPDATE headings SET group_id = NULL WHERE group_id = '1'") + end +end diff --git a/db/migrate/20210115123212_remove_fascicolo_edilizia_from_terms.rb b/db/migrate/20210115123212_remove_fascicolo_edilizia_from_terms.rb new file mode 100644 index 0000000..03d0402 --- /dev/null +++ b/db/migrate/20210115123212_remove_fascicolo_edilizia_from_terms.rb @@ -0,0 +1,5 @@ +class RemoveFascicoloEdiliziaFromTerms < ActiveRecord::Migration + def change + Term.connection.execute("DELETE FROM terms WHERE vocabulary_id=28 and position=2 and term_key='building_file' and term_value='fascicolo di edilizia'") + end +end diff --git a/db/schema.rb b/db/schema.rb index a9866e0..ca6d4c4 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170510083213) do +ActiveRecord::Schema.define(version: 20210115123212) do create_table "activities", force: :cascade do |t| t.string "identifier", limit: 255 @@ -29,10 +29,40 @@ add_index "activities", ["db_source", "legacy_id"], name: "index_activities_on_source_and_legacy_id", using: :btree + create_table "anag_identifiers", force: :cascade do |t| + t.integer "anagraphic_id", limit: 4 + t.string "identifier", limit: 255 + t.string "qualifier", limit: 255 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "anag_identifiers", ["anagraphic_id"], name: "index_anag_identifiers_on_anagraphic_id", using: :btree + add_index "anag_identifiers", ["db_source", "legacy_id"], name: "index_anag_identifiers_on_source_and_legacy_id", using: :btree + + create_table "anagraphics", force: :cascade do |t| + t.string "anagraphic_type", limit: 255 + t.string "name", limit: 255 + t.string "surname", limit: 255 + t.string "start_date_place", limit: 255 + t.date "start_date" + t.string "end_date_place", limit: 255 + t.date "end_date" + t.integer "group_id", limit: 4 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "anagraphics", ["db_source", "legacy_id"], name: "index_anagraphics_on_source_and_legacy_id", using: :btree + create_table "creator_activities", force: :cascade do |t| t.integer "creator_id", limit: 4 - t.string "activity", limit: 255 - t.string "note", limit: 255 + t.text "activity", limit: 16777215 + t.text "note", limit: 16777215 t.string "db_source", limit: 255 t.string "legacy_id", limit: 255 t.datetime "created_at" @@ -57,8 +87,8 @@ create_table "creator_editors", force: :cascade do |t| t.integer "creator_id", limit: 4 - t.string "name", limit: 255 - t.string "qualifier", limit: 255 + t.text "name", limit: 16777215 + t.text "qualifier", limit: 16777215 t.string "editing_type", limit: 255 t.date "edited_at" t.string "db_source", limit: 255 @@ -74,14 +104,14 @@ t.integer "creator_id", limit: 4, null: false t.boolean "preferred", limit: 1, default: false t.boolean "is_valid", limit: 1, default: true, null: false - t.string "start_date_place", limit: 255 + t.text "start_date_place", limit: 16777215 t.string "start_date_spec", limit: 255 t.date "start_date_from" t.date "start_date_to" t.string "start_date_valid", limit: 255 t.string "start_date_format", limit: 255 t.string "start_date_display", limit: 255 - t.string "end_date_place", limit: 255 + t.text "end_date_place", limit: 16777215 t.string "end_date_spec", limit: 255 t.date "end_date_from" t.date "end_date_to" @@ -102,8 +132,8 @@ create_table "creator_identifiers", force: :cascade do |t| t.integer "creator_id", limit: 4 - t.string "identifier", limit: 255 - t.string "identifier_source", limit: 255 + t.text "identifier", limit: 16777215 + t.text "identifier_source", limit: 16777215 t.text "note", limit: 16777215 t.string "db_source", limit: 255 t.string "legacy_id", limit: 255 @@ -130,9 +160,9 @@ create_table "creator_names", force: :cascade do |t| t.integer "creator_id", limit: 4 t.boolean "preferred", limit: 1, default: false - t.string "name", limit: 255 - t.string "first_name", limit: 255 - t.string "last_name", limit: 255 + t.text "name", limit: 16777215 + t.text "first_name", limit: 16777215 + t.text "last_name", limit: 16777215 t.text "note", limit: 16777215 t.string "qualifier", limit: 255 t.string "patronymic", limit: 255 @@ -148,7 +178,7 @@ create_table "creator_urls", force: :cascade do |t| t.integer "creator_id", limit: 4 - t.string "url", limit: 255 + t.text "url", limit: 65535 t.text "note", limit: 16777215 t.integer "position", limit: 4 t.string "db_source", limit: 255 @@ -163,7 +193,7 @@ create_table "creators", force: :cascade do |t| t.string "creator_type", limit: 1 t.integer "creator_corporate_type_id", limit: 4 - t.string "residence", limit: 255 + t.text "residence", limit: 16777215 t.text "abstract", limit: 16777215 t.text "history", limit: 16777215 t.string "legal_status", limit: 255 @@ -186,7 +216,7 @@ create_table "custodian_buildings", force: :cascade do |t| t.integer "custodian_id", limit: 4 t.string "custodian_building_type", limit: 255 - t.string "name", limit: 255 + t.text "name", limit: 16777215 t.text "description", limit: 16777215 t.string "address", limit: 255 t.string "postcode", limit: 255 @@ -206,7 +236,7 @@ t.integer "custodian_id", limit: 4 t.string "contact", limit: 255 t.string "contact_type", limit: 255 - t.string "contact_note", limit: 255 + t.text "contact_note", limit: 16777215 t.string "db_source", limit: 255 t.string "legacy_id", limit: 255 t.datetime "created_at" @@ -248,7 +278,7 @@ create_table "custodian_names", force: :cascade do |t| t.integer "custodian_id", limit: 4 t.boolean "preferred", limit: 1, default: false - t.string "name", limit: 255 + t.text "name", limit: 16777215 t.string "qualifier", limit: 255 t.text "note", limit: 16777215 t.string "db_source", limit: 255 @@ -359,7 +389,7 @@ create_table "document_forms", force: :cascade do |t| t.string "identifier_source", limit: 255 t.string "identifier", limit: 255 - t.string "name", limit: 255 + t.text "name", limit: 16777215 t.text "description", limit: 16777215 t.integer "status", limit: 4 t.text "note", limit: 16777215 @@ -389,10 +419,133 @@ add_index "editors", ["db_source", "legacy_id"], name: "index_editors_on_source_and_legacy_id", using: :btree add_index "editors", ["group_id"], name: "index_editors_on_group_id", using: :btree + create_table "fe_cadastrals", force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.integer "way_code", limit: 4 + t.text "cadastral_municipality", limit: 16777215 + t.integer "municipality_code", limit: 4 + t.integer "paper_code", limit: 4 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fe_cadastrals", ["db_source", "legacy_id"], name: "index_fe_cadastrals_on_source_and_legacy_id", using: :btree + add_index "fe_cadastrals", ["unit_id"], name: "index_fe_cadastrals_on_unit_id", using: :btree + + create_table "fe_contexts", force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.integer "number", limit: 4 + t.integer "sub_number", limit: 4 + t.text "classification", limit: 16777215 + t.text "applicant", limit: 16777215 + t.text "request", limit: 16777215 + t.integer "license_number", limit: 4 + t.integer "license_year", limit: 4 + t.integer "protocol_number", limit: 4 + t.date "license_date" + t.integer "habitability_number", limit: 4 + t.integer "habitability_year", limit: 4 + t.date "habitability_date" + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fe_contexts", ["db_source", "legacy_id"], name: "index_fe_contexts_on_source_and_legacy_id", using: :btree + add_index "fe_contexts", ["unit_id"], name: "index_fe_contexts_on_unit_id", using: :btree + + create_table "fe_designers", force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.text "designer_name", limit: 16777215 + t.text "designer_role", limit: 16777215 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fe_designers", ["db_source", "legacy_id"], name: "index_fe_designers_on_source_and_legacy_id", using: :btree + add_index "fe_designers", ["unit_id"], name: "index_fe_designers_on_unit_id", using: :btree + + create_table "fe_fract_edil_parcels", force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.integer "fract_edil_parcel_number", limit: 4 + t.integer "material_portion", limit: 4 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fe_fract_edil_parcels", ["db_source", "legacy_id"], name: "index_fe_fract_edil_parcels_on_source_and_legacy_id", using: :btree + add_index "fe_fract_edil_parcels", ["unit_id"], name: "index_fe_fract_edil_parcels_on_unit_id", using: :btree + + create_table "fe_fract_land_parcels", force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.integer "fract_land_parcel_number", limit: 4 + t.integer "edil_parcel_number", limit: 4 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fe_fract_land_parcels", ["db_source", "legacy_id"], name: "index_fe_fract_land_parcels_on_source_and_legacy_id", using: :btree + add_index "fe_fract_land_parcels", ["unit_id"], name: "index_fe_fract_land_parcels_on_unit_id", using: :btree + + create_table "fe_identifications", force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.text "code", limit: 16777215 + t.integer "file_year", limit: 4 + t.text "category", limit: 16777215 + t.text "identification_class", limit: 16777215 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fe_identifications", ["db_source", "legacy_id"], name: "index_fe_identifications_on_source_and_legacy_id", using: :btree + add_index "fe_identifications", ["unit_id"], name: "index_fe_identifications_on_unit_id", using: :btree + + create_table "fe_land_parcels", force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.text "land_parcel_number", limit: 16777215 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fe_land_parcels", ["db_source", "legacy_id"], name: "index_fe_land_parcels_on_source_and_legacy_id", using: :btree + add_index "fe_land_parcels", ["unit_id"], name: "index_fe_land_parcels_on_unit_id", using: :btree + + create_table "fe_operas", force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.boolean "is_present", limit: 1, default: false, null: false + t.string "status", limit: 10 + t.text "building_name", limit: 16777215 + t.text "building_type", limit: 16777215 + t.text "place_name", limit: 16777215 + t.text "place_type", limit: 16777215 + t.string "house_number", limit: 255 + t.text "district", limit: 16777215 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fe_operas", ["db_source", "legacy_id"], name: "index_fe_operas_on_source_and_legacy_id", using: :btree + add_index "fe_operas", ["unit_id"], name: "index_fe_operas_on_unit_id", using: :btree + create_table "fond_editors", force: :cascade do |t| t.integer "fond_id", limit: 4 - t.string "name", limit: 255 - t.string "qualifier", limit: 255 + t.text "name", limit: 16777215 + t.text "qualifier", limit: 16777215 t.string "editing_type", limit: 255 t.date "edited_at" t.string "db_source", limit: 255 @@ -462,7 +615,7 @@ create_table "fond_names", force: :cascade do |t| t.integer "fond_id", limit: 4 - t.string "name", limit: 255 + t.text "name", limit: 16777215 t.string "qualifier", limit: 255 t.text "note", limit: 16777215 t.string "db_source", limit: 255 @@ -476,7 +629,7 @@ create_table "fond_owners", force: :cascade do |t| t.integer "fond_id", limit: 4 - t.string "owner", limit: 255 + t.text "owner", limit: 16777215 t.string "db_source", limit: 255 t.string "legacy_id", limit: 255 t.datetime "created_at" @@ -508,7 +661,7 @@ t.boolean "trashed", limit: 1, default: false, null: false t.integer "trashed_ancestor_id", limit: 4 t.integer "units_count", limit: 4, default: 0, null: false - t.string "name", limit: 255 + t.text "name", limit: 16777215 t.string "fond_type", limit: 255 t.float "length", limit: 24 t.text "extent", limit: 16777215 @@ -517,7 +670,7 @@ t.text "history", limit: 16777215 t.text "arrangement_note", limit: 16777215 t.text "related_materials", limit: 16777215 - t.string "access_condition", limit: 255 + t.text "access_condition", limit: 16777215 t.text "access_condition_note", limit: 16777215 t.string "use_condition", limit: 255 t.text "use_condition_note", limit: 16777215 @@ -542,6 +695,66 @@ add_index "fonds", ["db_source", "legacy_parent_id"], name: "index_fonds_on_source_and_legacy_parent_id", using: :btree add_index "fonds", ["group_id"], name: "index_fonds_on_group_id", using: :btree + create_table "fsc_closes", force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.date "close" + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fsc_closes", ["db_source", "legacy_id"], name: "index_fsc_closes_on_source_and_legacy_id", using: :btree + add_index "fsc_closes", ["unit_id"], name: "index_fsc_closes_on_unit_id", using: :btree + + create_table "fsc_codes", force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.string "code", limit: 255 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fsc_codes", ["db_source", "legacy_id"], name: "index_fsc_codes_on_source_and_legacy_id", using: :btree + add_index "fsc_codes", ["unit_id"], name: "index_fsc_codes_on_unit_id", using: :btree + + create_table "fsc_nationalities", force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.text "nationality", limit: 16777215 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fsc_nationalities", ["db_source", "legacy_id"], name: "index_fsc_nationalities_on_source_and_legacy_id", using: :btree + add_index "fsc_nationalities", ["unit_id"], name: "index_fsc_nationalities_on_unit_id", using: :btree + + create_table "fsc_opens", force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.date "open" + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fsc_opens", ["db_source", "legacy_id"], name: "index_fsc_opens_on_source_and_legacy_id", using: :btree + add_index "fsc_opens", ["unit_id"], name: "index_fsc_opens_on_unit_id", using: :btree + + create_table "fsc_organizations", force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.text "organization", limit: 16777215 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "fsc_organizations", ["db_source", "legacy_id"], name: "index_fsc_organizations_on_source_and_legacy_id", using: :btree + add_index "fsc_organizations", ["unit_id"], name: "index_fsc_organizations_on_unit_id", using: :btree + create_table "group_images", force: :cascade do |t| t.integer "related_group_id", limit: 4 t.string "type", limit: 255 @@ -580,8 +793,8 @@ t.string "heading_type", limit: 255 t.string "name", limit: 255 t.string "dates", limit: 255 - t.string "qualifier", limit: 255 - t.integer "group_id", limit: 4 + t.text "qualifier", limit: 16777215 + t.integer "group_id", limit: 4, default: 1 t.string "db_source", limit: 255 t.string "legacy_id", limit: 255 t.datetime "created_at" @@ -745,7 +958,7 @@ create_table "institutions", force: :cascade do |t| t.string "identifier", limit: 255 t.string "identifier_source", limit: 255 - t.string "name", limit: 255 + t.text "name", limit: 16777215 t.text "description", limit: 16777215 t.integer "status", limit: 4 t.text "note", limit: 16777215 @@ -773,6 +986,22 @@ t.datetime "updated_at" end + create_table "personal_fscs", force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.string "code", limit: 255 + t.date "fsc_opened_at" + t.date "fsc_closed_at" + t.string "nationality", limit: 255 + t.string "organization", limit: 255 + t.string "db_source", limit: 255 + t.string "legacy_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "personal_fscs", ["db_source", "legacy_id"], name: "index_personal_fscs_on_source_and_legacy_id", using: :btree + add_index "personal_fscs", ["unit_id"], name: "index_personal_fscs_on_unit_id", using: :btree + create_table "places", force: :cascade do |t| t.string "record_type", limit: 2 t.string "name", limit: 200 @@ -825,7 +1054,7 @@ create_table "projects", force: :cascade do |t| t.string "project_type", limit: 255 - t.string "name", limit: 255 + t.text "name", limit: 16777215 t.integer "start_year", limit: 4 t.integer "end_year", limit: 4 t.string "status", limit: 255 @@ -996,6 +1225,21 @@ add_index "rel_project_fonds", ["fond_id"], name: "index_rel_project_fonds_on_fond_id", using: :btree add_index "rel_project_fonds", ["project_id"], name: "index_rel_project_fonds_on_project_id", using: :btree + create_table "rel_unit_anagraphics", force: :cascade do |t| + t.integer "unit_id", limit: 4 + t.integer "anagraphic_id", limit: 4 + t.string "db_source", limit: 255 + t.string "legacy_unit_id", limit: 255 + t.string "legacy_anagraphic_id", limit: 255 + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "rel_unit_anagraphics", ["anagraphic_id"], name: "index_rel_unit_anagraphics_on_anagraphic_id", using: :btree + add_index "rel_unit_anagraphics", ["db_source", "legacy_anagraphic_id"], name: "index_rel_unit_anagraphics_on_source_and_legacy_anagraphic_id", using: :btree + add_index "rel_unit_anagraphics", ["db_source", "legacy_unit_id"], name: "index_rel_unit_anagraphics_on_source_and_legacy_unit_id", using: :btree + add_index "rel_unit_anagraphics", ["unit_id"], name: "index_rel_unit_anagraphics_on_unit_id", using: :btree + create_table "rel_unit_headings", force: :cascade do |t| t.integer "unit_id", limit: 4 t.integer "heading_id", limit: 4 @@ -1055,7 +1299,7 @@ create_table "sc2_authors", force: :cascade do |t| t.integer "unit_id", limit: 4 t.string "autr", limit: 50 - t.string "autn", limit: 150 + t.text "autn", limit: 16777215 t.string "auta", limit: 100 t.string "db_source", limit: 255 t.string "legacy_id", limit: 255 @@ -1070,7 +1314,7 @@ create_table "sc2_commission_names", force: :cascade do |t| t.integer "sc2_commission_id", limit: 4 - t.string "cmmn", limit: 70 + t.text "cmmn", limit: 16777215 t.string "db_source", limit: 255 t.string "legacy_id", limit: 255 t.datetime "created_at" @@ -1082,7 +1326,7 @@ create_table "sc2_commissions", force: :cascade do |t| t.integer "unit_id", limit: 4 - t.string "cmmc", limit: 100 + t.text "cmmc", limit: 16777215 t.string "db_source", limit: 255 t.string "legacy_id", limit: 255 t.datetime "created_at" @@ -1132,7 +1376,7 @@ create_table "sc2_textual_elements", force: :cascade do |t| t.integer "unit_id", limit: 4 - t.string "isri", limit: 2200 + t.text "isri", limit: 16777215 t.string "db_source", limit: 255 t.string "legacy_id", limit: 255 t.datetime "created_at" @@ -1144,7 +1388,7 @@ create_table "sc2_visual_elements", force: :cascade do |t| t.integer "unit_id", limit: 4 - t.string "stmd", limit: 500 + t.text "stmd", limit: 16777215 t.string "db_source", limit: 255 t.string "legacy_id", limit: 255 t.datetime "created_at" @@ -1164,9 +1408,9 @@ create_table "sc2s", force: :cascade do |t| t.integer "unit_id", limit: 4 - t.string "sgti", limit: 250 - t.string "cmmr", limit: 25 - t.string "lrc", limit: 250 + t.text "sgti", limit: 16777215 + t.text "cmmr", limit: 16777215 + t.text "lrc", limit: 16777215 t.string "lrd", limit: 50 t.string "mtce", limit: 250 t.string "sdtt", limit: 50 @@ -1195,7 +1439,7 @@ create_table "source_urls", force: :cascade do |t| t.integer "source_id", limit: 4 - t.string "url", limit: 255 + t.text "url", limit: 65535 t.text "note", limit: 16777215 t.integer "position", limit: 4 t.string "db_source", limit: 255 @@ -1211,16 +1455,16 @@ t.boolean "use_legacy", limit: 1, default: false t.integer "source_type_code", limit: 4 t.integer "source_subtype_code", limit: 4 - t.string "short_title", limit: 255 - t.string "author", limit: 255 + t.text "short_title", limit: 16777215 + t.text "author", limit: 16777215 t.text "title", limit: 16777215 - t.string "editor", limit: 255 - t.string "publisher", limit: 255 - t.string "place", limit: 255 + t.text "editor", limit: 16777215 + t.text "publisher", limit: 16777215 + t.text "place", limit: 16777215 t.integer "year", limit: 4, default: 0 - t.string "date_string", limit: 255 - t.string "related_item", limit: 255 - t.string "related_item_specs", limit: 255 + t.text "date_string", limit: 255 + t.text "related_item", limit: 16777215 + t.text "related_item_specs", limit: 16777215 t.text "abstract", limit: 16777215 t.string "identifier", limit: 255 t.boolean "finding_aid_published", limit: 1 @@ -1280,8 +1524,8 @@ create_table "unit_editors", force: :cascade do |t| t.integer "unit_id", limit: 4 - t.string "name", limit: 255 - t.string "qualifier", limit: 255 + t.text "name", limit: 16777215 + t.text "qualifier", limit: 16777215 t.string "editing_type", limit: 255 t.date "edited_at" t.string "db_source", limit: 255 @@ -1325,8 +1569,8 @@ create_table "unit_identifiers", force: :cascade do |t| t.integer "unit_id", limit: 4 - t.string "identifier", limit: 255 - t.string "identifier_source", limit: 255 + t.text "identifier", limit: 16777215 + t.text "identifier_source", limit: 16777215 t.text "note", limit: 16777215 t.string "db_source", limit: 255 t.string "legacy_id", limit: 255 @@ -1351,8 +1595,8 @@ create_table "unit_other_reference_numbers", force: :cascade do |t| t.integer "unit_id", limit: 4 - t.string "other_reference_number", limit: 255 - t.string "qualifier", limit: 255 + t.text "other_reference_number", limit: 16777215 + t.text "qualifier", limit: 16777215 t.text "note", limit: 16777215 t.string "db_source", limit: 255 t.string "legacy_id", limit: 255 @@ -1365,7 +1609,7 @@ create_table "unit_urls", force: :cascade do |t| t.integer "unit_id", limit: 4 - t.string "url", limit: 255 + t.text "url", limit: 65535 t.text "note", limit: 16777215 t.integer "position", limit: 4 t.string "db_source", limit: 255 @@ -1385,9 +1629,9 @@ t.string "ancestry", limit: 255 t.integer "ancestry_depth", limit: 4 t.string "tsk", limit: 5 - t.string "reference_number", limit: 255 + t.text "reference_number", limit: 16777215 t.integer "tmp_reference_number", limit: 4 - t.string "tmp_reference_string", limit: 255 + t.text "tmp_reference_string", limit: 16777215 t.text "title", limit: 16777215 t.boolean "given_title", limit: 1 t.integer "folder_number", limit: 4 @@ -1401,9 +1645,9 @@ t.text "related_materials", limit: 16777215 t.string "physical_type", limit: 255 t.text "physical_description", limit: 16777215 - t.string "physical_container_type", limit: 255 - t.string "physical_container_title", limit: 255 - t.string "physical_container_number", limit: 255 + t.text "physical_container_type", limit: 16777215 + t.text "physical_container_title", limit: 16777215 + t.text "physical_container_number", limit: 16777215 t.string "preservation", limit: 255 t.text "preservation_note", limit: 16777215 t.text "restoration", limit: 16777215 @@ -1424,8 +1668,11 @@ t.datetime "created_at" t.datetime "updated_at" t.string "sc2_tsk", limit: 10 - t.text "extent", limit: 65535 + t.text "extent", limit: 16777215 t.boolean "published", limit: 1, default: true + t.string "file_type", limit: 255 + t.text "fsc_name", limit: 16777215 + t.text "fsc_surname", limit: 16777215 end add_index "units", ["ancestry"], name: "index_units_on_ancestry", using: :btree diff --git a/db/seeds/langs.json b/db/seeds/langs.json index 68a1a17..447fe66 100644 --- a/db/seeds/langs.json +++ b/db/seeds/langs.json @@ -1,486 +1,486 @@ -{"code":"ara","code3t":"","code2":"ar","en_name":"Arabic","fr_name":"arabe","it_name":"Arabo","active":true,"position":null} -{"code":"heb","code3t":"","code2":"he","en_name":"Hebrew","fr_name":"hébreu","it_name":"Ebraico","active":true,"position":null} -{"code":"fre","code3t":"fra","code2":"fr","en_name":"French","fr_name":"français","it_name":"Francese","active":true,"position":null} -{"code":"ita","code3t":"","code2":"it","en_name":"Italian","fr_name":"italien","it_name":"Italiano","active":true,"position":null} -{"code":"lat","code3t":"","code2":"la","en_name":"Latin","fr_name":"latin","it_name":"Latino","active":true,"position":null} -{"code":"ger","code3t":"deu","code2":"de","en_name":"German","fr_name":"allemand","it_name":"Tedesco","active":true,"position":null} -{"code":"pms","code3t":"","code2":"","en_name":"Piedmontese","fr_name":"piémontais","it_name":"Piemontese","active":true,"position":null} -{"code":"aar","code3t":"","code2":"aa","en_name":"Afar","fr_name":"afar","it_name":"","active":false,"position":null} -{"code":"abk","code3t":"","code2":"ab","en_name":"Abkhazian","fr_name":"abkhaze","it_name":"","active":false,"position":null} -{"code":"ace","code3t":"","code2":"","en_name":"Achinese","fr_name":"aceh","it_name":"","active":false,"position":null} -{"code":"ach","code3t":"","code2":"","en_name":"Acoli","fr_name":"acoli","it_name":"","active":false,"position":null} -{"code":"ada","code3t":"","code2":"","en_name":"Adangme","fr_name":"adangme","it_name":"","active":false,"position":null} -{"code":"ady","code3t":"","code2":"","en_name":"\"Adyghe; Adygei\"","fr_name":"adyghé","it_name":"","active":false,"position":null} -{"code":"afa","code3t":"","code2":"","en_name":"Afro-Asiatic languages","fr_name":"afro-asiatiques, langues","it_name":"","active":false,"position":null} -{"code":"afh","code3t":"","code2":"","en_name":"Afrihili","fr_name":"afrihili","it_name":"","active":false,"position":null} -{"code":"afr","code3t":"","code2":"af","en_name":"Afrikaans","fr_name":"afrikaans","it_name":"","active":false,"position":null} -{"code":"ain","code3t":"","code2":"","en_name":"Ainu","fr_name":"aïnou","it_name":"","active":false,"position":null} -{"code":"aka","code3t":"","code2":"ak","en_name":"Akan","fr_name":"akan","it_name":"","active":false,"position":null} -{"code":"akk","code3t":"","code2":"","en_name":"Akkadian","fr_name":"akkadien","it_name":"","active":false,"position":null} -{"code":"alb","code3t":"sqi","code2":"sq","en_name":"Albanian","fr_name":"albanais","it_name":"","active":false,"position":null} -{"code":"ale","code3t":"","code2":"","en_name":"Aleut","fr_name":"aléoute","it_name":"","active":false,"position":null} -{"code":"alg","code3t":"","code2":"","en_name":"Algonquian languages","fr_name":"algonquines, langues","it_name":"","active":false,"position":null} -{"code":"alt","code3t":"","code2":"","en_name":"Southern Altai","fr_name":"altai du Sud","it_name":"","active":false,"position":null} -{"code":"amh","code3t":"","code2":"am","en_name":"Amharic","fr_name":"amharique","it_name":"","active":false,"position":null} -{"code":"ang","code3t":"","code2":"","en_name":"English, Old (ca.450-1100)","fr_name":"anglo-saxon (ca.450-1100)","it_name":"","active":false,"position":null} -{"code":"anp","code3t":"","code2":"","en_name":"Angika","fr_name":"angika","it_name":"","active":false,"position":null} -{"code":"apa","code3t":"","code2":"","en_name":"Apache languages","fr_name":"apaches, langues","it_name":"","active":false,"position":null} -{"code":"arc","code3t":"","code2":"","en_name":"\"Official Aramaic (700-300 BCE); Imperial Aramaic (700-300 BCE)\"","fr_name":"araméen d'empire (700-300 BCE)","it_name":"","active":false,"position":null} -{"code":"arg","code3t":"","code2":"an","en_name":"Aragonese","fr_name":"aragonais","it_name":"","active":false,"position":null} -{"code":"arm","code3t":"hye","code2":"hy","en_name":"Armenian","fr_name":"arménien","it_name":"","active":false,"position":null} -{"code":"arn","code3t":"","code2":"","en_name":"\"Mapudungun; Mapuche\"","fr_name":"\"mapudungun; mapuche; mapuce\"","it_name":"","active":false,"position":null} -{"code":"arp","code3t":"","code2":"","en_name":"Arapaho","fr_name":"arapaho","it_name":"","active":false,"position":null} -{"code":"art","code3t":"","code2":"","en_name":"Artificial languages","fr_name":"artificielles, langues","it_name":"","active":false,"position":null} -{"code":"arw","code3t":"","code2":"","en_name":"Arawak","fr_name":"arawak","it_name":"","active":false,"position":null} -{"code":"asm","code3t":"","code2":"as","en_name":"Assamese","fr_name":"assamais","it_name":"","active":false,"position":null} -{"code":"ast","code3t":"","code2":"","en_name":"\"Asturian; Bable; Leonese; Asturleonese\"","fr_name":"\"asturien; bable; léonais; asturoléonais\"","it_name":"","active":false,"position":null} -{"code":"ath","code3t":"","code2":"","en_name":"Athapascan languages","fr_name":"athapascanes, langues","it_name":"","active":false,"position":null} -{"code":"aus","code3t":"","code2":"","en_name":"Australian languages","fr_name":"australiennes, langues","it_name":"","active":false,"position":null} -{"code":"ava","code3t":"","code2":"av","en_name":"Avaric","fr_name":"avar","it_name":"","active":false,"position":null} -{"code":"ave","code3t":"","code2":"ae","en_name":"Avestan","fr_name":"avestique","it_name":"","active":false,"position":null} -{"code":"awa","code3t":"","code2":"","en_name":"Awadhi","fr_name":"awadhi","it_name":"","active":false,"position":null} -{"code":"aym","code3t":"","code2":"ay","en_name":"Aymara","fr_name":"aymara","it_name":"","active":false,"position":null} -{"code":"aze","code3t":"","code2":"az","en_name":"Azerbaijani","fr_name":"azéri","it_name":"","active":false,"position":null} -{"code":"bad","code3t":"","code2":"","en_name":"Banda languages","fr_name":"banda, langues","it_name":"","active":false,"position":null} -{"code":"bai","code3t":"","code2":"","en_name":"Bamileke languages","fr_name":"bamiléké, langues","it_name":"","active":false,"position":null} -{"code":"bak","code3t":"","code2":"ba","en_name":"Bashkir","fr_name":"bachkir","it_name":"","active":false,"position":null} -{"code":"bal","code3t":"","code2":"","en_name":"Baluchi","fr_name":"baloutchi","it_name":"","active":false,"position":null} -{"code":"bam","code3t":"","code2":"bm","en_name":"Bambara","fr_name":"bambara","it_name":"","active":false,"position":null} -{"code":"ban","code3t":"","code2":"","en_name":"Balinese","fr_name":"balinais","it_name":"","active":false,"position":null} -{"code":"baq","code3t":"eus","code2":"eu","en_name":"Basque","fr_name":"basque","it_name":"","active":false,"position":null} -{"code":"bas","code3t":"","code2":"","en_name":"Basa","fr_name":"basa","it_name":"","active":false,"position":null} -{"code":"bat","code3t":"","code2":"","en_name":"Baltic languages","fr_name":"baltes, langues","it_name":"","active":false,"position":null} -{"code":"bej","code3t":"","code2":"","en_name":"\"Beja; Bedawiyet\"","fr_name":"bedja","it_name":"","active":false,"position":null} -{"code":"bel","code3t":"","code2":"be","en_name":"Belarusian","fr_name":"biélorusse","it_name":"","active":false,"position":null} -{"code":"bem","code3t":"","code2":"","en_name":"Bemba","fr_name":"bemba","it_name":"","active":false,"position":null} -{"code":"ben","code3t":"","code2":"bn","en_name":"Bengali","fr_name":"bengali","it_name":"","active":false,"position":null} -{"code":"ber","code3t":"","code2":"","en_name":"Berber languages","fr_name":"berbères, langues","it_name":"","active":false,"position":null} -{"code":"bho","code3t":"","code2":"","en_name":"Bhojpuri","fr_name":"bhojpuri","it_name":"","active":false,"position":null} -{"code":"bih","code3t":"","code2":"bh","en_name":"Bihari languages","fr_name":"langues biharis","it_name":"","active":false,"position":null} -{"code":"bik","code3t":"","code2":"","en_name":"Bikol","fr_name":"bikol","it_name":"","active":false,"position":null} -{"code":"bin","code3t":"","code2":"","en_name":"\"Bini; Edo\"","fr_name":"\"bini; edo\"","it_name":"","active":false,"position":null} -{"code":"bis","code3t":"","code2":"bi","en_name":"Bislama","fr_name":"bichlamar","it_name":"","active":false,"position":null} -{"code":"bla","code3t":"","code2":"","en_name":"Siksika","fr_name":"blackfoot","it_name":"","active":false,"position":null} -{"code":"bnt","code3t":"","code2":"","en_name":"Bantu (Other)","fr_name":"bantoues, autres langues","it_name":"","active":false,"position":null} -{"code":"bos","code3t":"","code2":"bs","en_name":"Bosnian","fr_name":"bosniaque","it_name":"","active":false,"position":null} -{"code":"bra","code3t":"","code2":"","en_name":"Braj","fr_name":"braj","it_name":"","active":false,"position":null} -{"code":"bre","code3t":"","code2":"br","en_name":"Breton","fr_name":"breton","it_name":"","active":false,"position":null} -{"code":"btk","code3t":"","code2":"","en_name":"Batak languages","fr_name":"batak, langues","it_name":"","active":false,"position":null} -{"code":"bua","code3t":"","code2":"","en_name":"Buriat","fr_name":"bouriate","it_name":"","active":false,"position":null} -{"code":"bug","code3t":"","code2":"","en_name":"Buginese","fr_name":"bugi","it_name":"","active":false,"position":null} -{"code":"bul","code3t":"","code2":"bg","en_name":"Bulgarian","fr_name":"bulgare","it_name":"","active":false,"position":null} -{"code":"bur","code3t":"mya","code2":"my","en_name":"Burmese","fr_name":"birman","it_name":"","active":false,"position":null} -{"code":"byn","code3t":"","code2":"","en_name":"\"Blin; Bilin\"","fr_name":"\"blin; bilen\"","it_name":"","active":false,"position":null} -{"code":"cad","code3t":"","code2":"","en_name":"Caddo","fr_name":"caddo","it_name":"","active":false,"position":null} -{"code":"cai","code3t":"","code2":"","en_name":"Central American Indian languages","fr_name":"amérindiennes de L'Amérique centrale, langues","it_name":"","active":false,"position":null} -{"code":"car","code3t":"","code2":"","en_name":"Galibi Carib","fr_name":"\"karib; galibi; carib\"","it_name":"","active":false,"position":null} -{"code":"cat","code3t":"","code2":"ca","en_name":"\"Catalan; Valencian\"","fr_name":"\"catalan; valencien\"","it_name":"","active":false,"position":null} -{"code":"cau","code3t":"","code2":"","en_name":"Caucasian languages","fr_name":"caucasiennes, langues","it_name":"","active":false,"position":null} -{"code":"ceb","code3t":"","code2":"","en_name":"Cebuano","fr_name":"cebuano","it_name":"","active":false,"position":null} -{"code":"cel","code3t":"","code2":"","en_name":"Celtic languages","fr_name":"\"celtiques, langues; celtes, langues\"","it_name":"","active":false,"position":null} -{"code":"cha","code3t":"","code2":"ch","en_name":"Chamorro","fr_name":"chamorro","it_name":"","active":false,"position":null} -{"code":"chb","code3t":"","code2":"","en_name":"Chibcha","fr_name":"chibcha","it_name":"","active":false,"position":null} -{"code":"che","code3t":"","code2":"ce","en_name":"Chechen","fr_name":"tchétchène","it_name":"","active":false,"position":null} -{"code":"chg","code3t":"","code2":"","en_name":"Chagatai","fr_name":"djaghataï","it_name":"","active":false,"position":null} -{"code":"chi","code3t":"zho","code2":"zh","en_name":"Chinese","fr_name":"chinois","it_name":"","active":false,"position":null} -{"code":"chk","code3t":"","code2":"","en_name":"Chuukese","fr_name":"chuuk","it_name":"","active":false,"position":null} -{"code":"chm","code3t":"","code2":"","en_name":"Mari","fr_name":"mari","it_name":"","active":false,"position":null} -{"code":"chn","code3t":"","code2":"","en_name":"Chinook jargon","fr_name":"chinook, jargon","it_name":"","active":false,"position":null} -{"code":"cho","code3t":"","code2":"","en_name":"Choctaw","fr_name":"choctaw","it_name":"","active":false,"position":null} -{"code":"chp","code3t":"","code2":"","en_name":"\"Chipewyan; Dene Suline\"","fr_name":"chipewyan","it_name":"","active":false,"position":null} -{"code":"chr","code3t":"","code2":"","en_name":"Cherokee","fr_name":"cherokee","it_name":"","active":false,"position":null} -{"code":"chu","code3t":"","code2":"cu","en_name":"\"Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic\"","fr_name":"\"slavon d'église; vieux slave; slavon liturgique; vieux bulgare\"","it_name":"","active":false,"position":null} -{"code":"chv","code3t":"","code2":"cv","en_name":"Chuvash","fr_name":"tchouvache","it_name":"","active":false,"position":null} -{"code":"chy","code3t":"","code2":"","en_name":"Cheyenne","fr_name":"cheyenne","it_name":"","active":false,"position":null} -{"code":"cmc","code3t":"","code2":"","en_name":"Chamic languages","fr_name":"chames, langues","it_name":"","active":false,"position":null} -{"code":"cop","code3t":"","code2":"","en_name":"Coptic","fr_name":"copte","it_name":"","active":false,"position":null} -{"code":"cor","code3t":"","code2":"kw","en_name":"Cornish","fr_name":"cornique","it_name":"","active":false,"position":null} -{"code":"cos","code3t":"","code2":"co","en_name":"Corsican","fr_name":"corse","it_name":"","active":false,"position":null} -{"code":"cpe","code3t":"","code2":"","en_name":"Creoles and pidgins, English based","fr_name":"créoles et pidgins basés sur l'anglais","it_name":"","active":false,"position":null} -{"code":"cpf","code3t":"","code2":"","en_name":"Creoles and pidgins, French-based ","fr_name":"créoles et pidgins basés sur le français","it_name":"","active":false,"position":null} -{"code":"cpp","code3t":"","code2":"","en_name":"Creoles and pidgins, Portuguese-based ","fr_name":"créoles et pidgins basés sur le portugais","it_name":"","active":false,"position":null} -{"code":"cre","code3t":"","code2":"cr","en_name":"Cree","fr_name":"cree","it_name":"","active":false,"position":null} -{"code":"crh","code3t":"","code2":"","en_name":"\"Crimean Tatar; Crimean Turkish\"","fr_name":"tatar de Crimé","it_name":"","active":false,"position":null} -{"code":"crp","code3t":"","code2":"","en_name":"Creoles and pidgins ","fr_name":"créoles et pidgins","it_name":"","active":false,"position":null} -{"code":"csb","code3t":"","code2":"","en_name":"Kashubian","fr_name":"kachoube","it_name":"","active":false,"position":null} -{"code":"cus","code3t":"","code2":"","en_name":"Cushitic languages","fr_name":"couchitiques, langues","it_name":"","active":false,"position":null} -{"code":"cze","code3t":"ces","code2":"cs","en_name":"Czech","fr_name":"tchèque","it_name":"","active":false,"position":null} -{"code":"dak","code3t":"","code2":"","en_name":"Dakota","fr_name":"dakota","it_name":"","active":false,"position":null} -{"code":"dan","code3t":"","code2":"da","en_name":"Danish","fr_name":"danois","it_name":"","active":false,"position":null} -{"code":"dar","code3t":"","code2":"","en_name":"Dargwa","fr_name":"dargwa","it_name":"","active":false,"position":null} -{"code":"day","code3t":"","code2":"","en_name":"Land Dayak languages","fr_name":"dayak, langues","it_name":"","active":false,"position":null} -{"code":"del","code3t":"","code2":"","en_name":"Delaware","fr_name":"delaware","it_name":"","active":false,"position":null} -{"code":"den","code3t":"","code2":"","en_name":"Slave (Athapascan)","fr_name":"esclave (athapascan)","it_name":"","active":false,"position":null} -{"code":"dgr","code3t":"","code2":"","en_name":"Dogrib","fr_name":"dogrib","it_name":"","active":false,"position":null} -{"code":"din","code3t":"","code2":"","en_name":"Dinka","fr_name":"dinka","it_name":"","active":false,"position":null} -{"code":"div","code3t":"","code2":"dv","en_name":"\"Divehi; Dhivehi; Maldivian\"","fr_name":"maldivien","it_name":"","active":false,"position":null} -{"code":"doi","code3t":"","code2":"","en_name":"Dogri","fr_name":"dogri","it_name":"","active":false,"position":null} -{"code":"dra","code3t":"","code2":"","en_name":"Dravidian languages","fr_name":"dravidiennes, langues","it_name":"","active":false,"position":null} -{"code":"dsb","code3t":"","code2":"","en_name":"Lower Sorbian","fr_name":"bas-sorabe","it_name":"","active":false,"position":null} -{"code":"dua","code3t":"","code2":"","en_name":"Duala","fr_name":"douala","it_name":"","active":false,"position":null} -{"code":"dum","code3t":"","code2":"","en_name":"Dutch, Middle (ca.1050-1350)","fr_name":"néerlandais moyen (ca. 1050-1350)","it_name":"","active":false,"position":null} -{"code":"dut","code3t":"nld","code2":"nl","en_name":"\"Dutch; Flemish\"","fr_name":"\"néerlandais; flamand\"","it_name":"","active":false,"position":null} -{"code":"dyu","code3t":"","code2":"","en_name":"Dyula","fr_name":"dioula","it_name":"","active":false,"position":null} -{"code":"dzo","code3t":"","code2":"dz","en_name":"Dzongkha","fr_name":"dzongkha","it_name":"","active":false,"position":null} -{"code":"efi","code3t":"","code2":"","en_name":"Efik","fr_name":"efik","it_name":"","active":false,"position":null} -{"code":"egy","code3t":"","code2":"","en_name":"Egyptian (Ancient)","fr_name":"égyptien","it_name":"","active":false,"position":null} -{"code":"eka","code3t":"","code2":"","en_name":"Ekajuk","fr_name":"ekajuk","it_name":"","active":false,"position":null} -{"code":"elx","code3t":"","code2":"","en_name":"Elamite","fr_name":"élamite","it_name":"","active":false,"position":null} -{"code":"eng","code3t":"","code2":"en","en_name":"English","fr_name":"anglais","it_name":"Inglese","active":true,"position":null} -{"code":"enm","code3t":"","code2":"","en_name":"English, Middle (1100-1500)","fr_name":"anglais moyen (1100-1500)","it_name":"","active":false,"position":null} -{"code":"epo","code3t":"","code2":"eo","en_name":"Esperanto","fr_name":"espéranto","it_name":"","active":false,"position":null} -{"code":"est","code3t":"","code2":"et","en_name":"Estonian","fr_name":"estonien","it_name":"","active":false,"position":null} -{"code":"ewe","code3t":"","code2":"ee","en_name":"Ewe","fr_name":"éwé","it_name":"","active":false,"position":null} -{"code":"ewo","code3t":"","code2":"","en_name":"Ewondo","fr_name":"éwondo","it_name":"","active":false,"position":null} -{"code":"fan","code3t":"","code2":"","en_name":"Fang","fr_name":"fang","it_name":"","active":false,"position":null} -{"code":"fao","code3t":"","code2":"fo","en_name":"Faroese","fr_name":"féroïen","it_name":"","active":false,"position":null} -{"code":"fat","code3t":"","code2":"","en_name":"Fanti","fr_name":"fanti","it_name":"","active":false,"position":null} -{"code":"fij","code3t":"","code2":"fj","en_name":"Fijian","fr_name":"fidjien","it_name":"","active":false,"position":null} -{"code":"fil","code3t":"","code2":"","en_name":"\"Filipino; Pilipino\"","fr_name":"\"filipino; pilipino\"","it_name":"","active":false,"position":null} -{"code":"fin","code3t":"","code2":"fi","en_name":"Finnish","fr_name":"finnois","it_name":"","active":false,"position":null} -{"code":"fiu","code3t":"","code2":"","en_name":"Finno-Ugrian languages","fr_name":"finno-ougriennes, langues","it_name":"","active":false,"position":null} -{"code":"fon","code3t":"","code2":"","en_name":"Fon","fr_name":"fon","it_name":"","active":false,"position":null} -{"code":"frm","code3t":"","code2":"","en_name":"French, Middle (ca.1400-1600)","fr_name":"français moyen (1400-1600)","it_name":"","active":false,"position":null} -{"code":"fro","code3t":"","code2":"","en_name":"French, Old (842-ca.1400)","fr_name":"français ancien (842-ca.1400)","it_name":"","active":false,"position":null} -{"code":"frr","code3t":"","code2":"","en_name":"Northern Frisian","fr_name":"frison septentrional","it_name":"","active":false,"position":null} -{"code":"frs","code3t":"","code2":"","en_name":"Eastern Frisian","fr_name":"frison oriental","it_name":"","active":false,"position":null} -{"code":"fry","code3t":"","code2":"fy","en_name":"Western Frisian","fr_name":"frison occidental","it_name":"","active":false,"position":null} -{"code":"ful","code3t":"","code2":"ff","en_name":"Fulah","fr_name":"peul","it_name":"","active":false,"position":null} -{"code":"fur","code3t":"","code2":"","en_name":"Friulian","fr_name":"frioulan","it_name":"","active":false,"position":null} -{"code":"gaa","code3t":"","code2":"","en_name":"Ga","fr_name":"ga","it_name":"","active":false,"position":null} -{"code":"gay","code3t":"","code2":"","en_name":"Gayo","fr_name":"gayo","it_name":"","active":false,"position":null} -{"code":"gba","code3t":"","code2":"","en_name":"Gbaya","fr_name":"gbaya","it_name":"","active":false,"position":null} -{"code":"gem","code3t":"","code2":"","en_name":"Germanic languages","fr_name":"germaniques, langues","it_name":"Lingue germaniche","active":true,"position":null} -{"code":"geo","code3t":"kat","code2":"ka","en_name":"Georgian","fr_name":"géorgien","it_name":"","active":false,"position":null} -{"code":"gez","code3t":"","code2":"","en_name":"Geez","fr_name":"guèze","it_name":"","active":false,"position":null} -{"code":"gil","code3t":"","code2":"","en_name":"Gilbertese","fr_name":"kiribati","it_name":"","active":false,"position":null} -{"code":"gla","code3t":"","code2":"gd","en_name":"\"Gaelic; Scottish Gaelic\"","fr_name":"\"gaélique; gaélique écossais\"","it_name":"","active":false,"position":null} -{"code":"gle","code3t":"","code2":"ga","en_name":"Irish","fr_name":"irlandais","it_name":"","active":false,"position":null} -{"code":"glg","code3t":"","code2":"gl","en_name":"Galician","fr_name":"galicien","it_name":"","active":false,"position":null} -{"code":"glv","code3t":"","code2":"gv","en_name":"Manx","fr_name":"\"manx; mannois\"","it_name":"","active":false,"position":null} -{"code":"gmh","code3t":"","code2":"","en_name":"German, Middle High (ca.1050-1500)","fr_name":"allemand, moyen haut (ca. 1050-1500)","it_name":"","active":false,"position":null} -{"code":"goh","code3t":"","code2":"","en_name":"German, Old High (ca.750-1050)","fr_name":"allemand, vieux haut (ca. 750-1050)","it_name":"","active":false,"position":null} -{"code":"gon","code3t":"","code2":"","en_name":"Gondi","fr_name":"gond","it_name":"","active":false,"position":null} -{"code":"gor","code3t":"","code2":"","en_name":"Gorontalo","fr_name":"gorontalo","it_name":"","active":false,"position":null} -{"code":"got","code3t":"","code2":"","en_name":"Gothic","fr_name":"gothique","it_name":"","active":false,"position":null} -{"code":"grb","code3t":"","code2":"","en_name":"Grebo","fr_name":"grebo","it_name":"","active":false,"position":null} -{"code":"grc","code3t":"","code2":"","en_name":"Greek, Ancient (to 1453)","fr_name":"grec ancien (jusqu'à 1453)","it_name":"","active":false,"position":null} -{"code":"gre","code3t":"ell","code2":"el","en_name":"Greek, Modern (1453-)","fr_name":"grec moderne (après 1453)","it_name":"Greco Moderno (1453-)","active":true,"position":null} -{"code":"grn","code3t":"","code2":"gn","en_name":"Guarani","fr_name":"guarani","it_name":"","active":false,"position":null} -{"code":"gsw","code3t":"","code2":"","en_name":"\"Swiss German; Alemannic; Alsatian\"","fr_name":"\"suisse alémanique; alémanique; alsacien\"","it_name":"","active":false,"position":null} -{"code":"guj","code3t":"","code2":"gu","en_name":"Gujarati","fr_name":"goudjrati","it_name":"","active":false,"position":null} -{"code":"gwi","code3t":"","code2":"","en_name":"Gwich'in","fr_name":"gwich'in","it_name":"","active":false,"position":null} -{"code":"hai","code3t":"","code2":"","en_name":"Haida","fr_name":"haida","it_name":"","active":false,"position":null} -{"code":"hat","code3t":"","code2":"ht","en_name":"\"Haitian; Haitian Creole\"","fr_name":"\"haïtien; créole haïtien\"","it_name":"","active":false,"position":null} -{"code":"hau","code3t":"","code2":"ha","en_name":"Hausa","fr_name":"haoussa","it_name":"","active":false,"position":null} -{"code":"haw","code3t":"","code2":"","en_name":"Hawaiian","fr_name":"hawaïen","it_name":"","active":false,"position":null} -{"code":"her","code3t":"","code2":"hz","en_name":"Herero","fr_name":"herero","it_name":"","active":false,"position":null} -{"code":"hil","code3t":"","code2":"","en_name":"Hiligaynon","fr_name":"hiligaynon","it_name":"","active":false,"position":null} -{"code":"him","code3t":"","code2":"","en_name":"\"Himachali languages; Western Pahari languages\"","fr_name":"\"langues himachalis; langues paharis occidentales\"","it_name":"","active":false,"position":null} -{"code":"hin","code3t":"","code2":"hi","en_name":"Hindi","fr_name":"hindi","it_name":"","active":false,"position":null} -{"code":"hit","code3t":"","code2":"","en_name":"Hittite","fr_name":"hittite","it_name":"","active":false,"position":null} -{"code":"hmn","code3t":"","code2":"","en_name":"\"Hmong; Mong\"","fr_name":"hmong","it_name":"","active":false,"position":null} -{"code":"hmo","code3t":"","code2":"ho","en_name":"Hiri Motu","fr_name":"hiri motu","it_name":"","active":false,"position":null} -{"code":"hrv","code3t":"","code2":"hr","en_name":"Croatian","fr_name":"croate","it_name":"","active":false,"position":null} -{"code":"hsb","code3t":"","code2":"","en_name":"Upper Sorbian","fr_name":"haut-sorabe","it_name":"","active":false,"position":null} -{"code":"hun","code3t":"","code2":"hu","en_name":"Hungarian","fr_name":"hongrois","it_name":"Ungherese","active":true,"position":null} -{"code":"hup","code3t":"","code2":"","en_name":"Hupa","fr_name":"hupa","it_name":"","active":false,"position":null} -{"code":"iba","code3t":"","code2":"","en_name":"Iban","fr_name":"iban","it_name":"","active":false,"position":null} -{"code":"ibo","code3t":"","code2":"ig","en_name":"Igbo","fr_name":"igbo","it_name":"","active":false,"position":null} -{"code":"ice","code3t":"isl","code2":"is","en_name":"Icelandic","fr_name":"islandais","it_name":"","active":false,"position":null} -{"code":"ido","code3t":"","code2":"io","en_name":"Ido","fr_name":"ido","it_name":"","active":false,"position":null} -{"code":"iii","code3t":"","code2":"ii","en_name":"\"Sichuan Yi; Nuosu\"","fr_name":"yi de Sichuan","it_name":"","active":false,"position":null} -{"code":"ijo","code3t":"","code2":"","en_name":"Ijo languages","fr_name":"ijo, langues","it_name":"","active":false,"position":null} -{"code":"iku","code3t":"","code2":"iu","en_name":"Inuktitut","fr_name":"inuktitut","it_name":"","active":false,"position":null} -{"code":"ile","code3t":"","code2":"ie","en_name":"\"Interlingue; Occidental\"","fr_name":"interlingue","it_name":"","active":false,"position":null} -{"code":"ilo","code3t":"","code2":"","en_name":"Iloko","fr_name":"ilocano","it_name":"","active":false,"position":null} -{"code":"ina","code3t":"","code2":"ia","en_name":"Interlingua (International Auxiliary Language Association)","fr_name":"interlingua (langue auxiliaire internationale)","it_name":"","active":false,"position":null} -{"code":"inc","code3t":"","code2":"","en_name":"Indic languages","fr_name":"indo-aryennes, langues","it_name":"","active":false,"position":null} -{"code":"ind","code3t":"","code2":"id","en_name":"Indonesian","fr_name":"indonésien","it_name":"","active":false,"position":null} -{"code":"ine","code3t":"","code2":"","en_name":"Indo-European languages","fr_name":"indo-européennes, langues","it_name":"","active":false,"position":null} -{"code":"inh","code3t":"","code2":"","en_name":"Ingush","fr_name":"ingouche","it_name":"","active":false,"position":null} -{"code":"ipk","code3t":"","code2":"ik","en_name":"Inupiaq","fr_name":"inupiaq","it_name":"","active":false,"position":null} -{"code":"ira","code3t":"","code2":"","en_name":"Iranian languages","fr_name":"iraniennes, langues","it_name":"","active":false,"position":null} -{"code":"iro","code3t":"","code2":"","en_name":"Iroquoian languages","fr_name":"iroquoises, langues","it_name":"","active":false,"position":null} -{"code":"jav","code3t":"","code2":"jv","en_name":"Javanese","fr_name":"javanais","it_name":"","active":false,"position":null} -{"code":"jbo","code3t":"","code2":"","en_name":"Lojban","fr_name":"lojban","it_name":"","active":false,"position":null} -{"code":"jpn","code3t":"","code2":"ja","en_name":"Japanese","fr_name":"japonais","it_name":"","active":false,"position":null} -{"code":"jpr","code3t":"","code2":"","en_name":"Judeo-Persian","fr_name":"judéo-persan","it_name":"","active":false,"position":null} -{"code":"jrb","code3t":"","code2":"","en_name":"Judeo-Arabic","fr_name":"judéo-arabe","it_name":"","active":false,"position":null} -{"code":"kaa","code3t":"","code2":"","en_name":"Kara-Kalpak","fr_name":"karakalpak","it_name":"","active":false,"position":null} -{"code":"kab","code3t":"","code2":"","en_name":"Kabyle","fr_name":"kabyle","it_name":"","active":false,"position":null} -{"code":"kac","code3t":"","code2":"","en_name":"\"Kachin; Jingpho\"","fr_name":"\"kachin; jingpho\"","it_name":"","active":false,"position":null} -{"code":"kal","code3t":"","code2":"kl","en_name":"\"Kalaallisut; Greenlandic\"","fr_name":"groenlandais","it_name":"","active":false,"position":null} -{"code":"kam","code3t":"","code2":"","en_name":"Kamba","fr_name":"kamba","it_name":"","active":false,"position":null} -{"code":"kan","code3t":"","code2":"kn","en_name":"Kannada","fr_name":"kannada","it_name":"","active":false,"position":null} -{"code":"kar","code3t":"","code2":"","en_name":"Karen languages","fr_name":"karen, langues","it_name":"","active":false,"position":null} -{"code":"kas","code3t":"","code2":"ks","en_name":"Kashmiri","fr_name":"kashmiri","it_name":"","active":false,"position":null} -{"code":"kau","code3t":"","code2":"kr","en_name":"Kanuri","fr_name":"kanouri","it_name":"","active":false,"position":null} -{"code":"kaw","code3t":"","code2":"","en_name":"Kawi","fr_name":"kawi","it_name":"","active":false,"position":null} -{"code":"kaz","code3t":"","code2":"kk","en_name":"Kazakh","fr_name":"kazakh","it_name":"","active":false,"position":null} -{"code":"kbd","code3t":"","code2":"","en_name":"Kabardian","fr_name":"kabardien","it_name":"","active":false,"position":null} -{"code":"kha","code3t":"","code2":"","en_name":"Khasi","fr_name":"khasi","it_name":"","active":false,"position":null} -{"code":"khi","code3t":"","code2":"","en_name":"Khoisan languages","fr_name":"khoïsan, langues","it_name":"","active":false,"position":null} -{"code":"khm","code3t":"","code2":"km","en_name":"Central Khmer","fr_name":"khmer central","it_name":"","active":false,"position":null} -{"code":"kho","code3t":"","code2":"","en_name":"\"Khotanese; Sakan\"","fr_name":"\"khotanais; sakan\"","it_name":"","active":false,"position":null} -{"code":"kik","code3t":"","code2":"ki","en_name":"\"Kikuyu; Gikuyu\"","fr_name":"kikuyu","it_name":"","active":false,"position":null} -{"code":"kin","code3t":"","code2":"rw","en_name":"Kinyarwanda","fr_name":"rwanda","it_name":"","active":false,"position":null} -{"code":"kir","code3t":"","code2":"ky","en_name":"\"Kirghiz; Kyrgyz\"","fr_name":"kirghiz","it_name":"","active":false,"position":null} -{"code":"kmb","code3t":"","code2":"","en_name":"Kimbundu","fr_name":"kimbundu","it_name":"","active":false,"position":null} -{"code":"kok","code3t":"","code2":"","en_name":"Konkani","fr_name":"konkani","it_name":"","active":false,"position":null} -{"code":"kom","code3t":"","code2":"kv","en_name":"Komi","fr_name":"kom","it_name":"","active":false,"position":null} -{"code":"kon","code3t":"","code2":"kg","en_name":"Kongo","fr_name":"kongo","it_name":"","active":false,"position":null} -{"code":"kor","code3t":"","code2":"ko","en_name":"Korean","fr_name":"coréen","it_name":"","active":false,"position":null} -{"code":"kos","code3t":"","code2":"","en_name":"Kosraean","fr_name":"kosrae","it_name":"","active":false,"position":null} -{"code":"kpe","code3t":"","code2":"","en_name":"Kpelle","fr_name":"kpellé","it_name":"","active":false,"position":null} -{"code":"krc","code3t":"","code2":"","en_name":"Karachay-Balkar","fr_name":"karatchai balkar","it_name":"","active":false,"position":null} -{"code":"krl","code3t":"","code2":"","en_name":"Karelian","fr_name":"carélien","it_name":"","active":false,"position":null} -{"code":"kro","code3t":"","code2":"","en_name":"Kru languages","fr_name":"krou, langues","it_name":"","active":false,"position":null} -{"code":"kru","code3t":"","code2":"","en_name":"Kurukh","fr_name":"kurukh","it_name":"","active":false,"position":null} -{"code":"kua","code3t":"","code2":"kj","en_name":"\"Kuanyama; Kwanyama\"","fr_name":"\"kuanyama; kwanyama\"","it_name":"","active":false,"position":null} -{"code":"kum","code3t":"","code2":"","en_name":"Kumyk","fr_name":"koumyk","it_name":"","active":false,"position":null} -{"code":"kur","code3t":"","code2":"ku","en_name":"Kurdish","fr_name":"kurde","it_name":"","active":false,"position":null} -{"code":"kut","code3t":"","code2":"","en_name":"Kutenai","fr_name":"kutenai","it_name":"","active":false,"position":null} -{"code":"lad","code3t":"","code2":"","en_name":"Ladino","fr_name":"judéo-espagnol","it_name":"","active":false,"position":null} -{"code":"lah","code3t":"","code2":"","en_name":"Lahnda","fr_name":"lahnda","it_name":"","active":false,"position":null} -{"code":"lam","code3t":"","code2":"","en_name":"Lamba","fr_name":"lamba","it_name":"","active":false,"position":null} -{"code":"lao","code3t":"","code2":"lo","en_name":"Lao","fr_name":"lao","it_name":"","active":false,"position":null} -{"code":"lav","code3t":"","code2":"lv","en_name":"Latvian","fr_name":"letton","it_name":"","active":false,"position":null} -{"code":"lez","code3t":"","code2":"","en_name":"Lezghian","fr_name":"lezghien","it_name":"","active":false,"position":null} -{"code":"lim","code3t":"","code2":"li","en_name":"\"Limburgan; Limburger; Limburgish\"","fr_name":"limbourgeois","it_name":"","active":false,"position":null} -{"code":"lin","code3t":"","code2":"ln","en_name":"Lingala","fr_name":"lingala","it_name":"","active":false,"position":null} -{"code":"lit","code3t":"","code2":"lt","en_name":"Lithuanian","fr_name":"lituanien","it_name":"","active":false,"position":null} -{"code":"lol","code3t":"","code2":"","en_name":"Mongo","fr_name":"mongo","it_name":"","active":false,"position":null} -{"code":"loz","code3t":"","code2":"","en_name":"Lozi","fr_name":"lozi","it_name":"","active":false,"position":null} -{"code":"ltz","code3t":"","code2":"lb","en_name":"\"Luxembourgish; Letzeburgesch\"","fr_name":"luxembourgeois","it_name":"","active":false,"position":null} -{"code":"lua","code3t":"","code2":"","en_name":"Luba-Lulua","fr_name":"luba-lulua","it_name":"","active":false,"position":null} -{"code":"lub","code3t":"","code2":"lu","en_name":"Luba-Katanga","fr_name":"luba-katanga","it_name":"","active":false,"position":null} -{"code":"lug","code3t":"","code2":"lg","en_name":"Ganda","fr_name":"ganda","it_name":"","active":false,"position":null} -{"code":"lui","code3t":"","code2":"","en_name":"Luiseno","fr_name":"luiseno","it_name":"","active":false,"position":null} -{"code":"lun","code3t":"","code2":"","en_name":"Lunda","fr_name":"lunda","it_name":"","active":false,"position":null} -{"code":"luo","code3t":"","code2":"","en_name":"Luo (Kenya and Tanzania)","fr_name":"luo (Kenya et Tanzanie)","it_name":"","active":false,"position":null} -{"code":"lus","code3t":"","code2":"","en_name":"Lushai","fr_name":"lushai","it_name":"","active":false,"position":null} -{"code":"mac","code3t":"mkd","code2":"mk","en_name":"Macedonian","fr_name":"macédonien","it_name":"","active":false,"position":null} -{"code":"mad","code3t":"","code2":"","en_name":"Madurese","fr_name":"madourais","it_name":"","active":false,"position":null} -{"code":"mag","code3t":"","code2":"","en_name":"Magahi","fr_name":"magahi","it_name":"","active":false,"position":null} -{"code":"mah","code3t":"","code2":"mh","en_name":"Marshallese","fr_name":"marshall","it_name":"","active":false,"position":null} -{"code":"mai","code3t":"","code2":"","en_name":"Maithili","fr_name":"maithili","it_name":"","active":false,"position":null} -{"code":"mak","code3t":"","code2":"","en_name":"Makasar","fr_name":"makassar","it_name":"","active":false,"position":null} -{"code":"mal","code3t":"","code2":"ml","en_name":"Malayalam","fr_name":"malayalam","it_name":"","active":false,"position":null} -{"code":"man","code3t":"","code2":"","en_name":"Mandingo","fr_name":"mandingue","it_name":"","active":false,"position":null} -{"code":"mao","code3t":"mri","code2":"mi","en_name":"Maori","fr_name":"maori","it_name":"","active":false,"position":null} -{"code":"map","code3t":"","code2":"","en_name":"Austronesian languages","fr_name":"austronésiennes, langues","it_name":"","active":false,"position":null} -{"code":"mar","code3t":"","code2":"mr","en_name":"Marathi","fr_name":"marathe","it_name":"","active":false,"position":null} -{"code":"mas","code3t":"","code2":"","en_name":"Masai","fr_name":"massaï","it_name":"","active":false,"position":null} -{"code":"may","code3t":"msa","code2":"ms","en_name":"Malay","fr_name":"malais","it_name":"","active":false,"position":null} -{"code":"mdf","code3t":"","code2":"","en_name":"Moksha","fr_name":"moksa","it_name":"","active":false,"position":null} -{"code":"mdr","code3t":"","code2":"","en_name":"Mandar","fr_name":"mandar","it_name":"","active":false,"position":null} -{"code":"men","code3t":"","code2":"","en_name":"Mende","fr_name":"mendé","it_name":"","active":false,"position":null} -{"code":"mga","code3t":"","code2":"","en_name":"Irish, Middle (900-1200)","fr_name":"irlandais moyen (900-1200)","it_name":"","active":false,"position":null} -{"code":"mic","code3t":"","code2":"","en_name":"\"Mi'kmaq; Micmac\"","fr_name":"\"mi'kmaq; micmac\"","it_name":"","active":false,"position":null} -{"code":"min","code3t":"","code2":"","en_name":"Minangkabau","fr_name":"minangkabau","it_name":"","active":false,"position":null} -{"code":"mis","code3t":"","code2":"","en_name":"Uncoded languages","fr_name":"langues non codées","it_name":"","active":false,"position":null} -{"code":"mkh","code3t":"","code2":"","en_name":"Mon-Khmer languages","fr_name":"môn-khmer, langues","it_name":"","active":false,"position":null} -{"code":"mlg","code3t":"","code2":"mg","en_name":"Malagasy","fr_name":"malgache","it_name":"","active":false,"position":null} -{"code":"mlt","code3t":"","code2":"mt","en_name":"Maltese","fr_name":"maltais","it_name":"","active":false,"position":null} -{"code":"mnc","code3t":"","code2":"","en_name":"Manchu","fr_name":"mandchou","it_name":"","active":false,"position":null} -{"code":"mni","code3t":"","code2":"","en_name":"Manipuri","fr_name":"manipuri","it_name":"","active":false,"position":null} -{"code":"mno","code3t":"","code2":"","en_name":"Manobo languages","fr_name":"manobo, langues","it_name":"","active":false,"position":null} -{"code":"moh","code3t":"","code2":"","en_name":"Mohawk","fr_name":"mohawk","it_name":"","active":false,"position":null} -{"code":"mon","code3t":"","code2":"mn","en_name":"Mongolian","fr_name":"mongol","it_name":"","active":false,"position":null} -{"code":"mos","code3t":"","code2":"","en_name":"Mossi","fr_name":"moré","it_name":"","active":false,"position":null} -{"code":"mul","code3t":"","code2":"","en_name":"Multiple languages","fr_name":"multilingue","it_name":"","active":false,"position":null} -{"code":"mun","code3t":"","code2":"","en_name":"Munda languages","fr_name":"mounda, langues","it_name":"","active":false,"position":null} -{"code":"mus","code3t":"","code2":"","en_name":"Creek","fr_name":"muskogee","it_name":"","active":false,"position":null} -{"code":"mwl","code3t":"","code2":"","en_name":"Mirandese","fr_name":"mirandais","it_name":"","active":false,"position":null} -{"code":"mwr","code3t":"","code2":"","en_name":"Marwari","fr_name":"marvari","it_name":"","active":false,"position":null} -{"code":"myn","code3t":"","code2":"","en_name":"Mayan languages","fr_name":"maya, langues","it_name":"","active":false,"position":null} -{"code":"myv","code3t":"","code2":"","en_name":"Erzya","fr_name":"erza","it_name":"","active":false,"position":null} -{"code":"nah","code3t":"","code2":"","en_name":"Nahuatl languages","fr_name":"nahuatl, langues","it_name":"","active":false,"position":null} -{"code":"nai","code3t":"","code2":"","en_name":"North American Indian languages","fr_name":"nord-amérindiennes, langues","it_name":"","active":false,"position":null} -{"code":"nap","code3t":"","code2":"","en_name":"Neapolitan","fr_name":"napolitain","it_name":"","active":false,"position":null} -{"code":"nau","code3t":"","code2":"na","en_name":"Nauru","fr_name":"nauruan","it_name":"","active":false,"position":null} -{"code":"nav","code3t":"","code2":"nv","en_name":"\"Navajo; Navaho\"","fr_name":"navaho","it_name":"","active":false,"position":null} -{"code":"nbl","code3t":"","code2":"nr","en_name":"\"Ndebele, South; South Ndebele\"","fr_name":"ndébélé du Sud","it_name":"","active":false,"position":null} -{"code":"nde","code3t":"","code2":"nd","en_name":"\"Ndebele, North; North Ndebele\"","fr_name":"ndébélé du Nord","it_name":"","active":false,"position":null} -{"code":"ndo","code3t":"","code2":"ng","en_name":"Ndonga","fr_name":"ndonga","it_name":"","active":false,"position":null} -{"code":"nds","code3t":"","code2":"","en_name":"\"Low German; Low Saxon; German, Low; Saxon, Low\"","fr_name":"\"bas allemand; bas saxon; allemand, bas; saxon, bas\"","it_name":"","active":false,"position":null} -{"code":"nep","code3t":"","code2":"ne","en_name":"Nepali","fr_name":"népalais","it_name":"","active":false,"position":null} -{"code":"new","code3t":"","code2":"","en_name":"\"Nepal Bhasa; Newari\"","fr_name":"\"nepal bhasa; newari\"","it_name":"","active":false,"position":null} -{"code":"nia","code3t":"","code2":"","en_name":"Nias","fr_name":"nias","it_name":"","active":false,"position":null} -{"code":"nic","code3t":"","code2":"","en_name":"Niger-Kordofanian languages","fr_name":"nigéro-kordofaniennes, langues","it_name":"","active":false,"position":null} -{"code":"niu","code3t":"","code2":"","en_name":"Niuean","fr_name":"niué","it_name":"","active":false,"position":null} -{"code":"nno","code3t":"","code2":"nn","en_name":"\"Norwegian Nynorsk; Nynorsk, Norwegian\"","fr_name":"\"norvégien nynorsk; nynorsk, norvégien\"","it_name":"","active":false,"position":null} -{"code":"nob","code3t":"","code2":"nb","en_name":"\"Bokmål, Norwegian; Norwegian Bokmål\"","fr_name":"norvégien bokmål","it_name":"","active":false,"position":null} -{"code":"nog","code3t":"","code2":"","en_name":"Nogai","fr_name":"\"nogaï; nogay\"","it_name":"","active":false,"position":null} -{"code":"non","code3t":"","code2":"","en_name":"Norse, Old","fr_name":"norrois, vieux","it_name":"","active":false,"position":null} -{"code":"nor","code3t":"","code2":"no","en_name":"Norwegian","fr_name":"norvégien","it_name":"","active":false,"position":null} -{"code":"nqo","code3t":"","code2":"","en_name":"N'Ko","fr_name":"n'ko","it_name":"","active":false,"position":null} -{"code":"nso","code3t":"","code2":"","en_name":"\"Pedi; Sepedi; Northern Sotho\"","fr_name":"\"pedi; sepedi; sotho du Nord\"","it_name":"","active":false,"position":null} -{"code":"nub","code3t":"","code2":"","en_name":"Nubian languages","fr_name":"nubiennes, langues","it_name":"","active":false,"position":null} -{"code":"nwc","code3t":"","code2":"","en_name":"\"Classical Newari; Old Newari; Classical Nepal Bhasa\"","fr_name":"newari classique","it_name":"","active":false,"position":null} -{"code":"nya","code3t":"","code2":"ny","en_name":"\"Chichewa; Chewa; Nyanja\"","fr_name":"\"chichewa; chewa; nyanja\"","it_name":"","active":false,"position":null} -{"code":"nym","code3t":"","code2":"","en_name":"Nyamwezi","fr_name":"nyamwezi","it_name":"","active":false,"position":null} -{"code":"nyn","code3t":"","code2":"","en_name":"Nyankole","fr_name":"nyankolé","it_name":"","active":false,"position":null} -{"code":"nyo","code3t":"","code2":"","en_name":"Nyoro","fr_name":"nyoro","it_name":"","active":false,"position":null} -{"code":"nzi","code3t":"","code2":"","en_name":"Nzima","fr_name":"nzema","it_name":"","active":false,"position":null} -{"code":"oci","code3t":"","code2":"oc","en_name":"\"Occitan (post 1500); Provençal\"","fr_name":"\"occitan (après 1500); provençal\"","it_name":"","active":false,"position":null} -{"code":"oji","code3t":"","code2":"oj","en_name":"Ojibwa","fr_name":"ojibwa","it_name":"","active":false,"position":null} -{"code":"ori","code3t":"","code2":"or","en_name":"Oriya","fr_name":"oriya","it_name":"","active":false,"position":null} -{"code":"orm","code3t":"","code2":"om","en_name":"Oromo","fr_name":"galla","it_name":"","active":false,"position":null} -{"code":"osa","code3t":"","code2":"","en_name":"Osage","fr_name":"osage","it_name":"","active":false,"position":null} -{"code":"oss","code3t":"","code2":"os","en_name":"\"Ossetian; Ossetic\"","fr_name":"ossète","it_name":"","active":false,"position":null} -{"code":"ota","code3t":"","code2":"","en_name":"Turkish, Ottoman (1500-1928)","fr_name":"turc ottoman (1500-1928)","it_name":"","active":false,"position":null} -{"code":"oto","code3t":"","code2":"","en_name":"Otomian languages","fr_name":"otomi, langues","it_name":"","active":false,"position":null} -{"code":"paa","code3t":"","code2":"","en_name":"Papuan languages","fr_name":"papoues, langues","it_name":"","active":false,"position":null} -{"code":"pag","code3t":"","code2":"","en_name":"Pangasinan","fr_name":"pangasinan","it_name":"","active":false,"position":null} -{"code":"pal","code3t":"","code2":"","en_name":"Pahlavi","fr_name":"pahlavi","it_name":"","active":false,"position":null} -{"code":"pam","code3t":"","code2":"","en_name":"\"Pampanga; Kapampangan\"","fr_name":"pampangan","it_name":"","active":false,"position":null} -{"code":"pan","code3t":"","code2":"pa","en_name":"\"Panjabi; Punjabi\"","fr_name":"pendjabi","it_name":"","active":false,"position":null} -{"code":"pap","code3t":"","code2":"","en_name":"Papiamento","fr_name":"papiamento","it_name":"","active":false,"position":null} -{"code":"pau","code3t":"","code2":"","en_name":"Palauan","fr_name":"palau","it_name":"","active":false,"position":null} -{"code":"peo","code3t":"","code2":"","en_name":"Persian, Old (ca.600-400 B.C.)","fr_name":"perse, vieux (ca. 600-400 av. J.-C.)","it_name":"","active":false,"position":null} -{"code":"per","code3t":"fas","code2":"fa","en_name":"Persian","fr_name":"persan","it_name":"","active":false,"position":null} -{"code":"phi","code3t":"","code2":"","en_name":"Philippine languages","fr_name":"philippines, langues","it_name":"","active":false,"position":null} -{"code":"phn","code3t":"","code2":"","en_name":"Phoenician","fr_name":"phénicien","it_name":"","active":false,"position":null} -{"code":"pli","code3t":"","code2":"pi","en_name":"Pali","fr_name":"pali","it_name":"","active":false,"position":null} -{"code":"pol","code3t":"","code2":"pl","en_name":"Polish","fr_name":"polonais","it_name":"Polacco","active":true,"position":null} -{"code":"pon","code3t":"","code2":"","en_name":"Pohnpeian","fr_name":"pohnpei","it_name":"","active":false,"position":null} -{"code":"por","code3t":"","code2":"pt","en_name":"Portuguese","fr_name":"portugais","it_name":"Portoghese","active":true,"position":null} -{"code":"pra","code3t":"","code2":"","en_name":"Prakrit languages","fr_name":"prâkrit, langues","it_name":"","active":false,"position":null} -{"code":"pro","code3t":"","code2":"","en_name":"Provençal, Old (to 1500)","fr_name":"provençal ancien (jusqu'à 1500)","it_name":"","active":false,"position":null} -{"code":"pus","code3t":"","code2":"ps","en_name":"\"Pushto; Pashto\"","fr_name":"pachto","it_name":"","active":false,"position":null} -{"code":"qaa","code3t":"","code2":"","en_name":"Reserved for local use","fr_name":"réservée à l'usage local","it_name":"","active":false,"position":null} -{"code":"que","code3t":"","code2":"qu","en_name":"Quechua","fr_name":"quechua","it_name":"","active":false,"position":null} -{"code":"raj","code3t":"","code2":"","en_name":"Rajasthani","fr_name":"rajasthani","it_name":"","active":false,"position":null} -{"code":"rap","code3t":"","code2":"","en_name":"Rapanui","fr_name":"rapanui","it_name":"","active":false,"position":null} -{"code":"rar","code3t":"","code2":"","en_name":"\"Rarotongan; Cook Islands Maori\"","fr_name":"\"rarotonga; maori des îles Cook\"","it_name":"","active":false,"position":null} -{"code":"roa","code3t":"","code2":"","en_name":"Romance languages","fr_name":"romanes, langues","it_name":"","active":false,"position":null} -{"code":"roh","code3t":"","code2":"rm","en_name":"Romansh","fr_name":"romanche","it_name":"","active":false,"position":null} -{"code":"rom","code3t":"","code2":"","en_name":"Romany","fr_name":"tsigane","it_name":"","active":false,"position":null} -{"code":"rum","code3t":"ron","code2":"ro","en_name":"\"Romanian; Moldavian; Moldovan\"","fr_name":"\"roumain; moldave\"","it_name":"\"Romeno; Moldavo\"","active":true,"position":null} -{"code":"run","code3t":"","code2":"rn","en_name":"Rundi","fr_name":"rundi","it_name":"","active":false,"position":null} -{"code":"rup","code3t":"","code2":"","en_name":"\"Aromanian; Arumanian; Macedo-Romanian\"","fr_name":"\"aroumain; macédo-roumain\"","it_name":"","active":false,"position":null} -{"code":"rus","code3t":"","code2":"ru","en_name":"Russian","fr_name":"russe","it_name":"Russo","active":true,"position":null} -{"code":"sad","code3t":"","code2":"","en_name":"Sandawe","fr_name":"sandawe","it_name":"","active":false,"position":null} -{"code":"sag","code3t":"","code2":"sg","en_name":"Sango","fr_name":"sango","it_name":"","active":false,"position":null} -{"code":"sah","code3t":"","code2":"","en_name":"Yakut","fr_name":"iakoute","it_name":"","active":false,"position":null} -{"code":"sai","code3t":"","code2":"","en_name":"South American Indian (Other)","fr_name":"indiennes d'Amérique du Sud, autres langues","it_name":"","active":false,"position":null} -{"code":"sal","code3t":"","code2":"","en_name":"Salishan languages","fr_name":"salishennes, langues","it_name":"","active":false,"position":null} -{"code":"sam","code3t":"","code2":"","en_name":"Samaritan Aramaic","fr_name":"samaritain","it_name":"","active":false,"position":null} -{"code":"san","code3t":"","code2":"sa","en_name":"Sanskrit","fr_name":"sanskrit","it_name":"","active":false,"position":null} -{"code":"sas","code3t":"","code2":"","en_name":"Sasak","fr_name":"sasak","it_name":"","active":false,"position":null} -{"code":"sat","code3t":"","code2":"","en_name":"Santali","fr_name":"santal","it_name":"","active":false,"position":null} -{"code":"scn","code3t":"","code2":"","en_name":"Sicilian","fr_name":"sicilien","it_name":"","active":false,"position":null} -{"code":"sco","code3t":"","code2":"","en_name":"Scots","fr_name":"écossais","it_name":"","active":false,"position":null} -{"code":"sel","code3t":"","code2":"","en_name":"Selkup","fr_name":"selkoupe","it_name":"","active":false,"position":null} -{"code":"sem","code3t":"","code2":"","en_name":"Semitic languages","fr_name":"sémitiques, langues","it_name":"","active":false,"position":null} -{"code":"sga","code3t":"","code2":"","en_name":"Irish, Old (to 900)","fr_name":"irlandais ancien (jusqu'à 900)","it_name":"","active":false,"position":null} -{"code":"sgn","code3t":"","code2":"","en_name":"Sign Languages","fr_name":"langues des signes","it_name":"","active":false,"position":null} -{"code":"shn","code3t":"","code2":"","en_name":"Shan","fr_name":"chan","it_name":"","active":false,"position":null} -{"code":"sid","code3t":"","code2":"","en_name":"Sidamo","fr_name":"sidamo","it_name":"","active":false,"position":null} -{"code":"sin","code3t":"","code2":"si","en_name":"\"Sinhala; Sinhalese\"","fr_name":"singhalais","it_name":"","active":false,"position":null} -{"code":"sio","code3t":"","code2":"","en_name":"Siouan languages","fr_name":"sioux, langues","it_name":"","active":false,"position":null} -{"code":"sit","code3t":"","code2":"","en_name":"Sino-Tibetan languages","fr_name":"sino-tibétaines, langues","it_name":"","active":false,"position":null} -{"code":"sla","code3t":"","code2":"","en_name":"Slavic languages","fr_name":"slaves, langues","it_name":"","active":false,"position":null} -{"code":"slo","code3t":"slk","code2":"sk","en_name":"Slovak","fr_name":"slovaque","it_name":"","active":false,"position":null} -{"code":"slv","code3t":"","code2":"sl","en_name":"Slovenian","fr_name":"slovène","it_name":"","active":false,"position":null} -{"code":"sma","code3t":"","code2":"","en_name":"Southern Sami","fr_name":"sami du Sud","it_name":"","active":false,"position":null} -{"code":"sme","code3t":"","code2":"se","en_name":"Northern Sami","fr_name":"sami du Nord","it_name":"","active":false,"position":null} -{"code":"smi","code3t":"","code2":"","en_name":"Sami languages","fr_name":"sames, langues","it_name":"","active":false,"position":null} -{"code":"smj","code3t":"","code2":"","en_name":"Lule Sami","fr_name":"sami de Lule","it_name":"","active":false,"position":null} -{"code":"smn","code3t":"","code2":"","en_name":"Inari Sami","fr_name":"sami d'Inari","it_name":"","active":false,"position":null} -{"code":"smo","code3t":"","code2":"sm","en_name":"Samoan","fr_name":"samoan","it_name":"","active":false,"position":null} -{"code":"sms","code3t":"","code2":"","en_name":"Skolt Sami","fr_name":"sami skolt","it_name":"","active":false,"position":null} -{"code":"sna","code3t":"","code2":"sn","en_name":"Shona","fr_name":"shona","it_name":"","active":false,"position":null} -{"code":"snd","code3t":"","code2":"sd","en_name":"Sindhi","fr_name":"sindhi","it_name":"","active":false,"position":null} -{"code":"snk","code3t":"","code2":"","en_name":"Soninke","fr_name":"soninké","it_name":"","active":false,"position":null} -{"code":"sog","code3t":"","code2":"","en_name":"Sogdian","fr_name":"sogdien","it_name":"","active":false,"position":null} -{"code":"som","code3t":"","code2":"so","en_name":"Somali","fr_name":"somali","it_name":"","active":false,"position":null} -{"code":"son","code3t":"","code2":"","en_name":"Songhai languages","fr_name":"songhai, langues","it_name":"","active":false,"position":null} -{"code":"sot","code3t":"","code2":"st","en_name":"Sotho, Southern","fr_name":"sotho du Sud","it_name":"","active":false,"position":null} -{"code":"spa","code3t":"","code2":"es","en_name":"\"Spanish; Castilian\"","fr_name":"\"espagnol; castillan\"","it_name":"\"Spagnolo; Castigliano\"","active":false,"position":null} -{"code":"srd","code3t":"","code2":"sc","en_name":"Sardinian","fr_name":"sarde","it_name":"","active":false,"position":null} -{"code":"srn","code3t":"","code2":"","en_name":"Sranan Tongo","fr_name":"sranan tongo","it_name":"","active":false,"position":null} -{"code":"srp","code3t":"","code2":"sr","en_name":"Serbian","fr_name":"serbe","it_name":"","active":false,"position":null} -{"code":"srr","code3t":"","code2":"","en_name":"Serer","fr_name":"sérère","it_name":"","active":false,"position":null} -{"code":"ssa","code3t":"","code2":"","en_name":"Nilo-Saharan languages","fr_name":"nilo-sahariennes, langues","it_name":"","active":false,"position":null} -{"code":"ssw","code3t":"","code2":"ss","en_name":"Swati","fr_name":"swati","it_name":"","active":false,"position":null} -{"code":"suk","code3t":"","code2":"","en_name":"Sukuma","fr_name":"sukuma","it_name":"","active":false,"position":null} -{"code":"sun","code3t":"","code2":"su","en_name":"Sundanese","fr_name":"soundanais","it_name":"","active":false,"position":null} -{"code":"sus","code3t":"","code2":"","en_name":"Susu","fr_name":"soussou","it_name":"","active":false,"position":null} -{"code":"sux","code3t":"","code2":"","en_name":"Sumerian","fr_name":"sumérien","it_name":"","active":false,"position":null} -{"code":"swa","code3t":"","code2":"sw","en_name":"Swahili","fr_name":"swahili","it_name":"","active":false,"position":null} -{"code":"swe","code3t":"","code2":"sv","en_name":"Swedish","fr_name":"suédois","it_name":"","active":false,"position":null} -{"code":"syc","code3t":"","code2":"","en_name":"Classical Syriac","fr_name":"syriaque classique","it_name":"","active":false,"position":null} -{"code":"syr","code3t":"","code2":"","en_name":"Syriac","fr_name":"syriaque","it_name":"","active":false,"position":null} -{"code":"tah","code3t":"","code2":"ty","en_name":"Tahitian","fr_name":"tahitien","it_name":"","active":false,"position":null} -{"code":"tai","code3t":"","code2":"","en_name":"Tai languages","fr_name":"tai, langues","it_name":"","active":false,"position":null} -{"code":"tam","code3t":"","code2":"ta","en_name":"Tamil","fr_name":"tamoul","it_name":"","active":false,"position":null} -{"code":"tat","code3t":"","code2":"tt","en_name":"Tatar","fr_name":"tatar","it_name":"","active":false,"position":null} -{"code":"tel","code3t":"","code2":"te","en_name":"Telugu","fr_name":"télougou","it_name":"","active":false,"position":null} -{"code":"tem","code3t":"","code2":"","en_name":"Timne","fr_name":"temne","it_name":"","active":false,"position":null} -{"code":"ter","code3t":"","code2":"","en_name":"Tereno","fr_name":"tereno","it_name":"","active":false,"position":null} -{"code":"tet","code3t":"","code2":"","en_name":"Tetum","fr_name":"tetum","it_name":"","active":false,"position":null} -{"code":"tgk","code3t":"","code2":"tg","en_name":"Tajik","fr_name":"tadjik","it_name":"","active":false,"position":null} -{"code":"tgl","code3t":"","code2":"tl","en_name":"Tagalog","fr_name":"tagalog","it_name":"","active":false,"position":null} -{"code":"tha","code3t":"","code2":"th","en_name":"Thai","fr_name":"thaï","it_name":"","active":false,"position":null} -{"code":"tib","code3t":"bod","code2":"bo","en_name":"Tibetan","fr_name":"tibétain","it_name":"","active":false,"position":null} -{"code":"tig","code3t":"","code2":"","en_name":"Tigre","fr_name":"tigré","it_name":"","active":false,"position":null} -{"code":"tir","code3t":"","code2":"ti","en_name":"Tigrinya","fr_name":"tigrigna","it_name":"","active":false,"position":null} -{"code":"tiv","code3t":"","code2":"","en_name":"Tiv","fr_name":"tiv","it_name":"","active":false,"position":null} -{"code":"tkl","code3t":"","code2":"","en_name":"Tokelau","fr_name":"tokelau","it_name":"","active":false,"position":null} -{"code":"tlh","code3t":"","code2":"","en_name":"\"Klingon; tlhIngan-Hol\"","fr_name":"klingon","it_name":"","active":false,"position":null} -{"code":"tli","code3t":"","code2":"","en_name":"Tlingit","fr_name":"tlingit","it_name":"","active":false,"position":null} -{"code":"tmh","code3t":"","code2":"","en_name":"Tamashek","fr_name":"tamacheq","it_name":"","active":false,"position":null} -{"code":"tog","code3t":"","code2":"","en_name":"Tonga (Nyasa)","fr_name":"tonga (Nyasa)","it_name":"","active":false,"position":null} -{"code":"ton","code3t":"","code2":"to","en_name":"Tonga (Tonga Islands)","fr_name":"tongan (Îles Tonga)","it_name":"","active":false,"position":null} -{"code":"tpi","code3t":"","code2":"","en_name":"Tok Pisin","fr_name":"tok pisin","it_name":"","active":false,"position":null} -{"code":"tsi","code3t":"","code2":"","en_name":"Tsimshian","fr_name":"tsimshian","it_name":"","active":false,"position":null} -{"code":"tsn","code3t":"","code2":"tn","en_name":"Tswana","fr_name":"tswana","it_name":"","active":false,"position":null} -{"code":"tso","code3t":"","code2":"ts","en_name":"Tsonga","fr_name":"tsonga","it_name":"","active":false,"position":null} -{"code":"tuk","code3t":"","code2":"tk","en_name":"Turkmen","fr_name":"turkmène","it_name":"","active":false,"position":null} -{"code":"tum","code3t":"","code2":"","en_name":"Tumbuka","fr_name":"tumbuka","it_name":"","active":false,"position":null} -{"code":"tup","code3t":"","code2":"","en_name":"Tupi languages","fr_name":"tupi, langues","it_name":"","active":false,"position":null} -{"code":"tur","code3t":"","code2":"tr","en_name":"Turkish","fr_name":"turc","it_name":"Turco","active":true,"position":null} -{"code":"tut","code3t":"","code2":"","en_name":"Altaic languages","fr_name":"altaïques, langues","it_name":"","active":false,"position":null} -{"code":"tvl","code3t":"","code2":"","en_name":"Tuvalu","fr_name":"tuvalu","it_name":"","active":false,"position":null} -{"code":"twi","code3t":"","code2":"tw","en_name":"Twi","fr_name":"twi","it_name":"","active":false,"position":null} -{"code":"tyv","code3t":"","code2":"","en_name":"Tuvinian","fr_name":"touva","it_name":"","active":false,"position":null} -{"code":"udm","code3t":"","code2":"","en_name":"Udmurt","fr_name":"oudmourte","it_name":"","active":false,"position":null} -{"code":"uga","code3t":"","code2":"","en_name":"Ugaritic","fr_name":"ougaritique","it_name":"","active":false,"position":null} -{"code":"uig","code3t":"","code2":"ug","en_name":"\"Uighur; Uyghur\"","fr_name":"ouïgour","it_name":"","active":false,"position":null} -{"code":"ukr","code3t":"","code2":"uk","en_name":"Ukrainian","fr_name":"ukrainien","it_name":"","active":false,"position":null} -{"code":"umb","code3t":"","code2":"","en_name":"Umbundu","fr_name":"umbundu","it_name":"","active":false,"position":null} -{"code":"und","code3t":"","code2":"","en_name":"Undetermined","fr_name":"indéterminée","it_name":"","active":false,"position":null} -{"code":"urd","code3t":"","code2":"ur","en_name":"Urdu","fr_name":"ourdou","it_name":"","active":false,"position":null} -{"code":"uzb","code3t":"","code2":"uz","en_name":"Uzbek","fr_name":"ouszbek","it_name":"","active":false,"position":null} -{"code":"vai","code3t":"","code2":"","en_name":"Vai","fr_name":"vaï","it_name":"","active":false,"position":null} -{"code":"ven","code3t":"","code2":"ve","en_name":"Venda","fr_name":"venda","it_name":"","active":false,"position":null} -{"code":"vie","code3t":"","code2":"vi","en_name":"Vietnamese","fr_name":"vietnamien","it_name":"","active":false,"position":null} -{"code":"vol","code3t":"","code2":"vo","en_name":"Volapük","fr_name":"volapük","it_name":"","active":false,"position":null} -{"code":"vot","code3t":"","code2":"","en_name":"Votic","fr_name":"vote","it_name":"","active":false,"position":null} -{"code":"wak","code3t":"","code2":"","en_name":"Wakashan languages","fr_name":"wakashanes, langues","it_name":"","active":false,"position":null} -{"code":"wal","code3t":"","code2":"","en_name":"Walamo","fr_name":"walamo","it_name":"","active":false,"position":null} -{"code":"war","code3t":"","code2":"","en_name":"Waray","fr_name":"waray","it_name":"","active":false,"position":null} -{"code":"was","code3t":"","code2":"","en_name":"Washo","fr_name":"washo","it_name":"","active":false,"position":null} -{"code":"wel","code3t":"cym","code2":"cy","en_name":"Welsh","fr_name":"gallois","it_name":"","active":false,"position":null} -{"code":"wen","code3t":"","code2":"","en_name":"Sorbian languages","fr_name":"sorabes, langues","it_name":"","active":false,"position":null} -{"code":"wln","code3t":"","code2":"wa","en_name":"Walloon","fr_name":"wallon","it_name":"","active":false,"position":null} -{"code":"wol","code3t":"","code2":"wo","en_name":"Wolof","fr_name":"wolof","it_name":"","active":false,"position":null} -{"code":"xal","code3t":"","code2":"","en_name":"\"Kalmyk; Oirat\"","fr_name":"\"kalmouk; oïrat\"","it_name":"","active":false,"position":null} -{"code":"xho","code3t":"","code2":"xh","en_name":"Xhosa","fr_name":"xhosa","it_name":"","active":false,"position":null} -{"code":"yao","code3t":"","code2":"","en_name":"Yao","fr_name":"yao","it_name":"","active":false,"position":null} -{"code":"yap","code3t":"","code2":"","en_name":"Yapese","fr_name":"yapois","it_name":"","active":false,"position":null} -{"code":"yid","code3t":"","code2":"yi","en_name":"Yiddish","fr_name":"yiddish","it_name":"","active":false,"position":null} -{"code":"yor","code3t":"","code2":"yo","en_name":"Yoruba","fr_name":"yoruba","it_name":"","active":false,"position":null} -{"code":"ypk","code3t":"","code2":"","en_name":"Yupik languages","fr_name":"yupik, langues","it_name":"","active":false,"position":null} -{"code":"zap","code3t":"","code2":"","en_name":"Zapotec","fr_name":"zapotèque","it_name":"","active":false,"position":null} -{"code":"zbl","code3t":"","code2":"","en_name":"\"Blissymbols; Blissymbolics; Bliss\"","fr_name":"\"symboles Bliss; Bliss\"","it_name":"","active":false,"position":null} -{"code":"zen","code3t":"","code2":"","en_name":"Zenaga","fr_name":"zenaga","it_name":"","active":false,"position":null} -{"code":"zha","code3t":"","code2":"za","en_name":"\"Zhuang; Chuang\"","fr_name":"\"zhuang; chuang\"","it_name":"","active":false,"position":null} -{"code":"znd","code3t":"","code2":"","en_name":"Zande languages","fr_name":"zandé, langues","it_name":"","active":false,"position":null} -{"code":"zul","code3t":"","code2":"zu","en_name":"Zulu","fr_name":"zoulou","it_name":"","active":false,"position":null} -{"code":"zun","code3t":"","code2":"","en_name":"Zuni","fr_name":"zuni","it_name":"","active":false,"position":null} -{"code":"zxx","code3t":"","code2":"","en_name":"\"No linguistic content; Not applicable\"","fr_name":"\"pas de contenu linguistique; non applicable\"","it_name":"","active":false,"position":null} -{"code":"zza","code3t":"","code2":"","en_name":"\"Zaza; Dimili; Dimli; Kirdki; Kirmanjki; Zazaki\"","fr_name":"\"zaza; dimili; dimli; kirdki; kirmanjki; zazaki\"","it_name":"","active":false,"position":null} +{"code":"ara","code3t":"","code2":"ar","it_name":"Arabo","en_name":"Arabic","fr_name":"arabe","active":true,"position":null} +{"code":"heb","code3t":"","code2":"he","it_name":"Ebraico","en_name":"Hebrew","fr_name":"hébreu","active":true,"position":null} +{"code":"fre","code3t":"fra","code2":"fr","it_name":"Francese","en_name":"French","fr_name":"français","active":true,"position":null} +{"code":"ita","code3t":"","code2":"it","it_name":"Italiano","en_name":"Italian","fr_name":"italien","active":true,"position":null} +{"code":"lat","code3t":"","code2":"la","it_name":"Latino","en_name":"Latin","fr_name":"latin","active":true,"position":null} +{"code":"ger","code3t":"deu","code2":"de","it_name":"Tedesco","en_name":"German","fr_name":"allemand","active":true,"position":null} +{"code":"pms","code3t":"","code2":"","it_name":"Piemontese","en_name":"Piedmontese","fr_name":"piémontais","active":true,"position":null} +{"code":"aar","code3t":"","code2":"aa","it_name":"Afar","en_name":"Afar","fr_name":"afar","active":true,"position":null} +{"code":"abk","code3t":"","code2":"ab","it_name":"Abkhazian","en_name":"Abkhazian","fr_name":"abkhaze","active":true,"position":null} +{"code":"ace","code3t":"","code2":"","it_name":"Achinese","en_name":"Achinese","fr_name":"aceh","active":true,"position":null} +{"code":"ach","code3t":"","code2":"","it_name":"Acoli","en_name":"Acoli","fr_name":"acoli","active":true,"position":null} +{"code":"ada","code3t":"","code2":"","it_name":"Adangme","en_name":"Adangme","fr_name":"adangme","active":true,"position":null} +{"code":"ady","code3t":"","code2":"","it_name":"\"Adyghe; Adygei\"","en_name":"\"Adyghe; Adygei\"","fr_name":"adyghé","active":true,"position":null} +{"code":"afa","code3t":"","code2":"","it_name":"Afro-Asiatic languages","en_name":"Afro-Asiatic languages","fr_name":"afro-asiatiques, langues","active":true,"position":null} +{"code":"afh","code3t":"","code2":"","it_name":"Afrihili","en_name":"Afrihili","fr_name":"afrihili","active":true,"position":null} +{"code":"afr","code3t":"","code2":"af","it_name":"Afrikaans","en_name":"Afrikaans","fr_name":"afrikaans","active":true,"position":null} +{"code":"ain","code3t":"","code2":"","it_name":"Ainu","en_name":"Ainu","fr_name":"aïnou","active":true,"position":null} +{"code":"aka","code3t":"","code2":"ak","it_name":"Akan","en_name":"Akan","fr_name":"akan","active":true,"position":null} +{"code":"akk","code3t":"","code2":"","it_name":"Akkadian","en_name":"Akkadian","fr_name":"akkadien","active":true,"position":null} +{"code":"alb","code3t":"sqi","code2":"sq","it_name":"Albanian","en_name":"Albanian","fr_name":"albanais","active":true,"position":null} +{"code":"ale","code3t":"","code2":"","it_name":"Aleut","en_name":"Aleut","fr_name":"aléoute","active":true,"position":null} +{"code":"alg","code3t":"","code2":"","it_name":"Algonquian languages","en_name":"Algonquian languages","fr_name":"algonquines, langues","active":true,"position":null} +{"code":"alt","code3t":"","code2":"","it_name":"Southern Altai","en_name":"Southern Altai","fr_name":"altai du Sud","active":true,"position":null} +{"code":"amh","code3t":"","code2":"am","it_name":"Amharic","en_name":"Amharic","fr_name":"amharique","active":true,"position":null} +{"code":"ang","code3t":"","code2":"","it_name":"English, Old (ca.450-1100)","en_name":"English, Old (ca.450-1100)","fr_name":"anglo-saxon (ca.450-1100)","active":true,"position":null} +{"code":"anp","code3t":"","code2":"","it_name":"Angika","en_name":"Angika","fr_name":"angika","active":true,"position":null} +{"code":"apa","code3t":"","code2":"","it_name":"Apache languages","en_name":"Apache languages","fr_name":"apaches, langues","active":true,"position":null} +{"code":"arc","code3t":"","code2":"","it_name":"\"Official Aramaic (700-300 BCE); Imperial Aramaic (700-300 BCE)\"","en_name":"\"Official Aramaic (700-300 BCE); Imperial Aramaic (700-300 BCE)\"","fr_name":"araméen d'empire (700-300 BCE)","active":true,"position":null} +{"code":"arg","code3t":"","code2":"an","it_name":"Aragonese","en_name":"Aragonese","fr_name":"aragonais","active":true,"position":null} +{"code":"arm","code3t":"hye","code2":"hy","it_name":"Armenian","en_name":"Armenian","fr_name":"arménien","active":true,"position":null} +{"code":"arn","code3t":"","code2":"","it_name":"\"Mapudungun; Mapuche\"","en_name":"\"Mapudungun; Mapuche\"","fr_name":"\"mapudungun; mapuche; mapuce\"","active":true,"position":null} +{"code":"arp","code3t":"","code2":"","it_name":"Arapaho","en_name":"Arapaho","fr_name":"arapaho","active":true,"position":null} +{"code":"art","code3t":"","code2":"","it_name":"Artificial languages","en_name":"Artificial languages","fr_name":"artificielles, langues","active":true,"position":null} +{"code":"arw","code3t":"","code2":"","it_name":"Arawak","en_name":"Arawak","fr_name":"arawak","active":true,"position":null} +{"code":"asm","code3t":"","code2":"as","it_name":"Assamese","en_name":"Assamese","fr_name":"assamais","active":true,"position":null} +{"code":"ast","code3t":"","code2":"","it_name":"\"Asturian; Bable; Leonese; Asturleonese\"","en_name":"\"Asturian; Bable; Leonese; Asturleonese\"","fr_name":"\"asturien; bable; léonais; asturoléonais\"","active":true,"position":null} +{"code":"ath","code3t":"","code2":"","it_name":"Athapascan languages","en_name":"Athapascan languages","fr_name":"athapascanes, langues","active":true,"position":null} +{"code":"aus","code3t":"","code2":"","it_name":"Australian languages","en_name":"Australian languages","fr_name":"australiennes, langues","active":true,"position":null} +{"code":"ava","code3t":"","code2":"av","it_name":"Avaric","en_name":"Avaric","fr_name":"avar","active":true,"position":null} +{"code":"ave","code3t":"","code2":"ae","it_name":"Avestan","en_name":"Avestan","fr_name":"avestique","active":true,"position":null} +{"code":"awa","code3t":"","code2":"","it_name":"Awadhi","en_name":"Awadhi","fr_name":"awadhi","active":true,"position":null} +{"code":"aym","code3t":"","code2":"ay","it_name":"Aymara","en_name":"Aymara","fr_name":"aymara","active":true,"position":null} +{"code":"aze","code3t":"","code2":"az","it_name":"Azerbaijani","en_name":"Azerbaijani","fr_name":"azéri","active":true,"position":null} +{"code":"bad","code3t":"","code2":"","it_name":"Banda languages","en_name":"Banda languages","fr_name":"banda, langues","active":true,"position":null} +{"code":"bai","code3t":"","code2":"","it_name":"Bamileke languages","en_name":"Bamileke languages","fr_name":"bamiléké, langues","active":true,"position":null} +{"code":"bak","code3t":"","code2":"ba","it_name":"Bashkir","en_name":"Bashkir","fr_name":"bachkir","active":true,"position":null} +{"code":"bal","code3t":"","code2":"","it_name":"Baluchi","en_name":"Baluchi","fr_name":"baloutchi","active":true,"position":null} +{"code":"bam","code3t":"","code2":"bm","it_name":"Bambara","en_name":"Bambara","fr_name":"bambara","active":true,"position":null} +{"code":"ban","code3t":"","code2":"","it_name":"Balinese","en_name":"Balinese","fr_name":"balinais","active":true,"position":null} +{"code":"baq","code3t":"eus","code2":"eu","it_name":"Basque","en_name":"Basque","fr_name":"basque","active":true,"position":null} +{"code":"bas","code3t":"","code2":"","it_name":"Basa","en_name":"Basa","fr_name":"basa","active":true,"position":null} +{"code":"bat","code3t":"","code2":"","it_name":"Baltic languages","en_name":"Baltic languages","fr_name":"baltes, langues","active":true,"position":null} +{"code":"bej","code3t":"","code2":"","it_name":"\"Beja; Bedawiyet\"","en_name":"\"Beja; Bedawiyet\"","fr_name":"bedja","active":true,"position":null} +{"code":"bel","code3t":"","code2":"be","it_name":"Belarusian","en_name":"Belarusian","fr_name":"biélorusse","active":true,"position":null} +{"code":"bem","code3t":"","code2":"","it_name":"Bemba","en_name":"Bemba","fr_name":"bemba","active":true,"position":null} +{"code":"ben","code3t":"","code2":"bn","it_name":"Bengali","en_name":"Bengali","fr_name":"bengali","active":true,"position":null} +{"code":"ber","code3t":"","code2":"","it_name":"Berber languages","en_name":"Berber languages","fr_name":"berbères, langues","active":true,"position":null} +{"code":"bho","code3t":"","code2":"","it_name":"Bhojpuri","en_name":"Bhojpuri","fr_name":"bhojpuri","active":true,"position":null} +{"code":"bih","code3t":"","code2":"bh","it_name":"Bihari languages","en_name":"Bihari languages","fr_name":"langues biharis","active":true,"position":null} +{"code":"bik","code3t":"","code2":"","it_name":"Bikol","en_name":"Bikol","fr_name":"bikol","active":true,"position":null} +{"code":"bin","code3t":"","code2":"","it_name":"\"Bini; Edo\"","en_name":"\"Bini; Edo\"","fr_name":"\"bini; edo\"","active":true,"position":null} +{"code":"bis","code3t":"","code2":"bi","it_name":"Bislama","en_name":"Bislama","fr_name":"bichlamar","active":true,"position":null} +{"code":"bla","code3t":"","code2":"","it_name":"Siksika","en_name":"Siksika","fr_name":"blackfoot","active":true,"position":null} +{"code":"bnt","code3t":"","code2":"","it_name":"Bantu (Other)","en_name":"Bantu (Other)","fr_name":"bantoues, autres langues","active":true,"position":null} +{"code":"bos","code3t":"","code2":"bs","it_name":"Bosnian","en_name":"Bosnian","fr_name":"bosniaque","active":true,"position":null} +{"code":"bra","code3t":"","code2":"","it_name":"Braj","en_name":"Braj","fr_name":"braj","active":true,"position":null} +{"code":"bre","code3t":"","code2":"br","it_name":"Breton","en_name":"Breton","fr_name":"breton","active":true,"position":null} +{"code":"btk","code3t":"","code2":"","it_name":"Batak languages","en_name":"Batak languages","fr_name":"batak, langues","active":true,"position":null} +{"code":"bua","code3t":"","code2":"","it_name":"Buriat","en_name":"Buriat","fr_name":"bouriate","active":true,"position":null} +{"code":"bug","code3t":"","code2":"","it_name":"Buginese","en_name":"Buginese","fr_name":"bugi","active":true,"position":null} +{"code":"bul","code3t":"","code2":"bg","it_name":"Bulgarian","en_name":"Bulgarian","fr_name":"bulgare","active":true,"position":null} +{"code":"bur","code3t":"mya","code2":"my","it_name":"Burmese","en_name":"Burmese","fr_name":"birman","active":true,"position":null} +{"code":"byn","code3t":"","code2":"","it_name":"\"Blin; Bilin\"","en_name":"\"Blin; Bilin\"","fr_name":"\"blin; bilen\"","active":true,"position":null} +{"code":"cad","code3t":"","code2":"","it_name":"Caddo","en_name":"Caddo","fr_name":"caddo","active":true,"position":null} +{"code":"cai","code3t":"","code2":"","it_name":"Central American Indian languages","en_name":"Central American Indian languages","fr_name":"amérindiennes de L'Amérique centrale, langues","active":true,"position":null} +{"code":"car","code3t":"","code2":"","it_name":"Galibi Carib","en_name":"Galibi Carib","fr_name":"\"karib; galibi; carib\"","active":true,"position":null} +{"code":"cat","code3t":"","code2":"ca","it_name":"\"Catalan; Valencian\"","en_name":"\"Catalan; Valencian\"","fr_name":"\"catalan; valencien\"","active":true,"position":null} +{"code":"cau","code3t":"","code2":"","it_name":"Caucasian languages","en_name":"Caucasian languages","fr_name":"caucasiennes, langues","active":true,"position":null} +{"code":"ceb","code3t":"","code2":"","it_name":"Cebuano","en_name":"Cebuano","fr_name":"cebuano","active":true,"position":null} +{"code":"cel","code3t":"","code2":"","it_name":"Celtic languages","en_name":"Celtic languages","fr_name":"\"celtiques, langues; celtes, langues\"","active":true,"position":null} +{"code":"cha","code3t":"","code2":"ch","it_name":"Chamorro","en_name":"Chamorro","fr_name":"chamorro","active":true,"position":null} +{"code":"chb","code3t":"","code2":"","it_name":"Chibcha","en_name":"Chibcha","fr_name":"chibcha","active":true,"position":null} +{"code":"che","code3t":"","code2":"ce","it_name":"Chechen","en_name":"Chechen","fr_name":"tchétchène","active":true,"position":null} +{"code":"chg","code3t":"","code2":"","it_name":"Chagatai","en_name":"Chagatai","fr_name":"djaghataï","active":true,"position":null} +{"code":"chi","code3t":"zho","code2":"zh","it_name":"Chinese","en_name":"Chinese","fr_name":"chinois","active":true,"position":null} +{"code":"chk","code3t":"","code2":"","it_name":"Chuukese","en_name":"Chuukese","fr_name":"chuuk","active":true,"position":null} +{"code":"chm","code3t":"","code2":"","it_name":"Mari","en_name":"Mari","fr_name":"mari","active":true,"position":null} +{"code":"chn","code3t":"","code2":"","it_name":"Chinook jargon","en_name":"Chinook jargon","fr_name":"chinook, jargon","active":true,"position":null} +{"code":"cho","code3t":"","code2":"","it_name":"Choctaw","en_name":"Choctaw","fr_name":"choctaw","active":true,"position":null} +{"code":"chp","code3t":"","code2":"","it_name":"\"Chipewyan; Dene Suline\"","en_name":"\"Chipewyan; Dene Suline\"","fr_name":"chipewyan","active":true,"position":null} +{"code":"chr","code3t":"","code2":"","it_name":"Cherokee","en_name":"Cherokee","fr_name":"cherokee","active":true,"position":null} +{"code":"chu","code3t":"","code2":"cu","it_name":"\"Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic\"","en_name":"\"Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic\"","fr_name":"\"slavon d'église; vieux slave; slavon liturgique; vieux bulgare\"","active":true,"position":null} +{"code":"chv","code3t":"","code2":"cv","it_name":"Chuvash","en_name":"Chuvash","fr_name":"tchouvache","active":true,"position":null} +{"code":"chy","code3t":"","code2":"","it_name":"Cheyenne","en_name":"Cheyenne","fr_name":"cheyenne","active":true,"position":null} +{"code":"cmc","code3t":"","code2":"","it_name":"Chamic languages","en_name":"Chamic languages","fr_name":"chames, langues","active":true,"position":null} +{"code":"cop","code3t":"","code2":"","it_name":"Coptic","en_name":"Coptic","fr_name":"copte","active":true,"position":null} +{"code":"cor","code3t":"","code2":"kw","it_name":"Cornish","en_name":"Cornish","fr_name":"cornique","active":true,"position":null} +{"code":"cos","code3t":"","code2":"co","it_name":"Corsican","en_name":"Corsican","fr_name":"corse","active":true,"position":null} +{"code":"cpe","code3t":"","code2":"","it_name":"Creoles and pidgins, English based","en_name":"Creoles and pidgins, English based","fr_name":"créoles et pidgins basés sur l'anglais","active":true,"position":null} +{"code":"cpf","code3t":"","code2":"","it_name":"Creoles and pidgins, French-based ","en_name":"Creoles and pidgins, French-based ","fr_name":"créoles et pidgins basés sur le français","active":true,"position":null} +{"code":"cpp","code3t":"","code2":"","it_name":"Creoles and pidgins, Portuguese-based ","en_name":"Creoles and pidgins, Portuguese-based ","fr_name":"créoles et pidgins basés sur le portugais","active":true,"position":null} +{"code":"cre","code3t":"","code2":"cr","it_name":"Cree","en_name":"Cree","fr_name":"cree","active":true,"position":null} +{"code":"crh","code3t":"","code2":"","it_name":"\"Crimean Tatar; Crimean Turkish\"","en_name":"\"Crimean Tatar; Crimean Turkish\"","fr_name":"tatar de Crimé","active":true,"position":null} +{"code":"crp","code3t":"","code2":"","it_name":"Creoles and pidgins ","en_name":"Creoles and pidgins ","fr_name":"créoles et pidgins","active":true,"position":null} +{"code":"csb","code3t":"","code2":"","it_name":"Kashubian","en_name":"Kashubian","fr_name":"kachoube","active":true,"position":null} +{"code":"cus","code3t":"","code2":"","it_name":"Cushitic languages","en_name":"Cushitic languages","fr_name":"couchitiques, langues","active":true,"position":null} +{"code":"cze","code3t":"ces","code2":"cs","it_name":"Czech","en_name":"Czech","fr_name":"tchèque","active":true,"position":null} +{"code":"dak","code3t":"","code2":"","it_name":"Dakota","en_name":"Dakota","fr_name":"dakota","active":true,"position":null} +{"code":"dan","code3t":"","code2":"da","it_name":"Danish","en_name":"Danish","fr_name":"danois","active":true,"position":null} +{"code":"dar","code3t":"","code2":"","it_name":"Dargwa","en_name":"Dargwa","fr_name":"dargwa","active":true,"position":null} +{"code":"day","code3t":"","code2":"","it_name":"Land Dayak languages","en_name":"Land Dayak languages","fr_name":"dayak, langues","active":true,"position":null} +{"code":"del","code3t":"","code2":"","it_name":"Delaware","en_name":"Delaware","fr_name":"delaware","active":true,"position":null} +{"code":"den","code3t":"","code2":"","it_name":"Slave (Athapascan)","en_name":"Slave (Athapascan)","fr_name":"esclave (athapascan)","active":true,"position":null} +{"code":"dgr","code3t":"","code2":"","it_name":"Dogrib","en_name":"Dogrib","fr_name":"dogrib","active":true,"position":null} +{"code":"din","code3t":"","code2":"","it_name":"Dinka","en_name":"Dinka","fr_name":"dinka","active":true,"position":null} +{"code":"div","code3t":"","code2":"dv","it_name":"\"Divehi; Dhivehi; Maldivian\"","en_name":"\"Divehi; Dhivehi; Maldivian\"","fr_name":"maldivien","active":true,"position":null} +{"code":"doi","code3t":"","code2":"","it_name":"Dogri","en_name":"Dogri","fr_name":"dogri","active":true,"position":null} +{"code":"dra","code3t":"","code2":"","it_name":"Dravidian languages","en_name":"Dravidian languages","fr_name":"dravidiennes, langues","active":true,"position":null} +{"code":"dsb","code3t":"","code2":"","it_name":"Lower Sorbian","en_name":"Lower Sorbian","fr_name":"bas-sorabe","active":true,"position":null} +{"code":"dua","code3t":"","code2":"","it_name":"Duala","en_name":"Duala","fr_name":"douala","active":true,"position":null} +{"code":"dum","code3t":"","code2":"","it_name":"Dutch, Middle (ca.1050-1350)","en_name":"Dutch, Middle (ca.1050-1350)","fr_name":"néerlandais moyen (ca. 1050-1350)","active":true,"position":null} +{"code":"dut","code3t":"nld","code2":"nl","it_name":"\"Dutch; Flemish\"","en_name":"\"Dutch; Flemish\"","fr_name":"\"néerlandais; flamand\"","active":true,"position":null} +{"code":"dyu","code3t":"","code2":"","it_name":"Dyula","en_name":"Dyula","fr_name":"dioula","active":true,"position":null} +{"code":"dzo","code3t":"","code2":"dz","it_name":"Dzongkha","en_name":"Dzongkha","fr_name":"dzongkha","active":true,"position":null} +{"code":"efi","code3t":"","code2":"","it_name":"Efik","en_name":"Efik","fr_name":"efik","active":true,"position":null} +{"code":"egy","code3t":"","code2":"","it_name":"Egyptian (Ancient)","en_name":"Egyptian (Ancient)","fr_name":"égyptien","active":true,"position":null} +{"code":"eka","code3t":"","code2":"","it_name":"Ekajuk","en_name":"Ekajuk","fr_name":"ekajuk","active":true,"position":null} +{"code":"elx","code3t":"","code2":"","it_name":"Elamite","en_name":"Elamite","fr_name":"élamite","active":true,"position":null} +{"code":"eng","code3t":"","code2":"en","it_name":"English","en_name":"English","fr_name":"anglais","active":true,"position":null} +{"code":"enm","code3t":"","code2":"","it_name":"English, Middle (1100-1500)","en_name":"English, Middle (1100-1500)","fr_name":"anglais moyen (1100-1500)","active":true,"position":null} +{"code":"epo","code3t":"","code2":"eo","it_name":"Esperanto","en_name":"Esperanto","fr_name":"espéranto","active":true,"position":null} +{"code":"est","code3t":"","code2":"et","it_name":"Estonian","en_name":"Estonian","fr_name":"estonien","active":true,"position":null} +{"code":"ewe","code3t":"","code2":"ee","it_name":"Ewe","en_name":"Ewe","fr_name":"éwé","active":true,"position":null} +{"code":"ewo","code3t":"","code2":"","it_name":"Ewondo","en_name":"Ewondo","fr_name":"éwondo","active":true,"position":null} +{"code":"fan","code3t":"","code2":"","it_name":"Fang","en_name":"Fang","fr_name":"fang","active":true,"position":null} +{"code":"fao","code3t":"","code2":"fo","it_name":"Faroese","en_name":"Faroese","fr_name":"féroïen","active":true,"position":null} +{"code":"fat","code3t":"","code2":"","it_name":"Fanti","en_name":"Fanti","fr_name":"fanti","active":true,"position":null} +{"code":"fij","code3t":"","code2":"fj","it_name":"Fijian","en_name":"Fijian","fr_name":"fidjien","active":true,"position":null} +{"code":"fil","code3t":"","code2":"","it_name":"\"Filipino; Pilipino\"","en_name":"\"Filipino; Pilipino\"","fr_name":"\"filipino; pilipino\"","active":true,"position":null} +{"code":"fin","code3t":"","code2":"fi","it_name":"Finnish","en_name":"Finnish","fr_name":"finnois","active":true,"position":null} +{"code":"fiu","code3t":"","code2":"","it_name":"Finno-Ugrian languages","en_name":"Finno-Ugrian languages","fr_name":"finno-ougriennes, langues","active":true,"position":null} +{"code":"fon","code3t":"","code2":"","it_name":"Fon","en_name":"Fon","fr_name":"fon","active":true,"position":null} +{"code":"frm","code3t":"","code2":"","it_name":"French, Middle (ca.1400-1600)","en_name":"French, Middle (ca.1400-1600)","fr_name":"français moyen (1400-1600)","active":true,"position":null} +{"code":"fro","code3t":"","code2":"","it_name":"French, Old (842-ca.1400)","en_name":"French, Old (842-ca.1400)","fr_name":"français ancien (842-ca.1400)","active":true,"position":null} +{"code":"frr","code3t":"","code2":"","it_name":"Northern Frisian","en_name":"Northern Frisian","fr_name":"frison septentrional","active":true,"position":null} +{"code":"frs","code3t":"","code2":"","it_name":"Eastern Frisian","en_name":"Eastern Frisian","fr_name":"frison oriental","active":true,"position":null} +{"code":"fry","code3t":"","code2":"fy","it_name":"Western Frisian","en_name":"Western Frisian","fr_name":"frison occidental","active":true,"position":null} +{"code":"ful","code3t":"","code2":"ff","it_name":"Fulah","en_name":"Fulah","fr_name":"peul","active":true,"position":null} +{"code":"fur","code3t":"","code2":"","it_name":"Friulian","en_name":"Friulian","fr_name":"frioulan","active":true,"position":null} +{"code":"gaa","code3t":"","code2":"","it_name":"Ga","en_name":"Ga","fr_name":"ga","active":true,"position":null} +{"code":"gay","code3t":"","code2":"","it_name":"Gayo","en_name":"Gayo","fr_name":"gayo","active":true,"position":null} +{"code":"gba","code3t":"","code2":"","it_name":"Gbaya","en_name":"Gbaya","fr_name":"gbaya","active":true,"position":null} +{"code":"gem","code3t":"","code2":"","it_name":"Germanic languages","en_name":"Germanic languages","fr_name":"germaniques, langues","active":true,"position":null} +{"code":"geo","code3t":"kat","code2":"ka","it_name":"Georgian","en_name":"Georgian","fr_name":"géorgien","active":true,"position":null} +{"code":"gez","code3t":"","code2":"","it_name":"Geez","en_name":"Geez","fr_name":"guèze","active":true,"position":null} +{"code":"gil","code3t":"","code2":"","it_name":"Gilbertese","en_name":"Gilbertese","fr_name":"kiribati","active":true,"position":null} +{"code":"gla","code3t":"","code2":"gd","it_name":"\"Gaelic; Scottish Gaelic\"","en_name":"\"Gaelic; Scottish Gaelic\"","fr_name":"\"gaélique; gaélique écossais\"","active":true,"position":null} +{"code":"gle","code3t":"","code2":"ga","it_name":"Irish","en_name":"Irish","fr_name":"irlandais","active":true,"position":null} +{"code":"glg","code3t":"","code2":"gl","it_name":"Galician","en_name":"Galician","fr_name":"galicien","active":true,"position":null} +{"code":"glv","code3t":"","code2":"gv","it_name":"Manx","en_name":"Manx","fr_name":"\"manx; mannois\"","active":true,"position":null} +{"code":"gmh","code3t":"","code2":"","it_name":"German, Middle High (ca.1050-1500)","en_name":"German, Middle High (ca.1050-1500)","fr_name":"allemand, moyen haut (ca. 1050-1500)","active":true,"position":null} +{"code":"goh","code3t":"","code2":"","it_name":"German, Old High (ca.750-1050)","en_name":"German, Old High (ca.750-1050)","fr_name":"allemand, vieux haut (ca. 750-1050)","active":true,"position":null} +{"code":"gon","code3t":"","code2":"","it_name":"Gondi","en_name":"Gondi","fr_name":"gond","active":true,"position":null} +{"code":"gor","code3t":"","code2":"","it_name":"Gorontalo","en_name":"Gorontalo","fr_name":"gorontalo","active":true,"position":null} +{"code":"got","code3t":"","code2":"","it_name":"Gothic","en_name":"Gothic","fr_name":"gothique","active":true,"position":null} +{"code":"grb","code3t":"","code2":"","it_name":"Grebo","en_name":"Grebo","fr_name":"grebo","active":true,"position":null} +{"code":"grc","code3t":"","code2":"","it_name":"Greek, Ancient (to 1453)","en_name":"Greek, Ancient (to 1453)","fr_name":"grec ancien (jusqu'à 1453)","active":true,"position":null} +{"code":"gre","code3t":"ell","code2":"el","it_name":"Greek, Modern (1453-)","en_name":"Greek, Modern (1453-)","fr_name":"grec moderne (après 1453)","active":true,"position":null} +{"code":"grn","code3t":"","code2":"gn","it_name":"Guarani","en_name":"Guarani","fr_name":"guarani","active":true,"position":null} +{"code":"gsw","code3t":"","code2":"","it_name":"\"Swiss German; Alemannic; Alsatian\"","en_name":"\"Swiss German; Alemannic; Alsatian\"","fr_name":"\"suisse alémanique; alémanique; alsacien\"","active":true,"position":null} +{"code":"guj","code3t":"","code2":"gu","it_name":"Gujarati","en_name":"Gujarati","fr_name":"goudjrati","active":true,"position":null} +{"code":"gwi","code3t":"","code2":"","it_name":"Gwich'in","en_name":"Gwich'in","fr_name":"gwich'in","active":true,"position":null} +{"code":"hai","code3t":"","code2":"","it_name":"Haida","en_name":"Haida","fr_name":"haida","active":true,"position":null} +{"code":"hat","code3t":"","code2":"ht","it_name":"\"Haitian; Haitian Creole\"","en_name":"\"Haitian; Haitian Creole\"","fr_name":"\"haïtien; créole haïtien\"","active":true,"position":null} +{"code":"hau","code3t":"","code2":"ha","it_name":"Hausa","en_name":"Hausa","fr_name":"haoussa","active":true,"position":null} +{"code":"haw","code3t":"","code2":"","it_name":"Hawaiian","en_name":"Hawaiian","fr_name":"hawaïen","active":true,"position":null} +{"code":"her","code3t":"","code2":"hz","it_name":"Herero","en_name":"Herero","fr_name":"herero","active":true,"position":null} +{"code":"hil","code3t":"","code2":"","it_name":"Hiligaynon","en_name":"Hiligaynon","fr_name":"hiligaynon","active":true,"position":null} +{"code":"him","code3t":"","code2":"","it_name":"\"Himachali languages; Western Pahari languages\"","en_name":"\"Himachali languages; Western Pahari languages\"","fr_name":"\"langues himachalis; langues paharis occidentales\"","active":true,"position":null} +{"code":"hin","code3t":"","code2":"hi","it_name":"Hindi","en_name":"Hindi","fr_name":"hindi","active":true,"position":null} +{"code":"hit","code3t":"","code2":"","it_name":"Hittite","en_name":"Hittite","fr_name":"hittite","active":true,"position":null} +{"code":"hmn","code3t":"","code2":"","it_name":"\"Hmong; Mong\"","en_name":"\"Hmong; Mong\"","fr_name":"hmong","active":true,"position":null} +{"code":"hmo","code3t":"","code2":"ho","it_name":"Hiri Motu","en_name":"Hiri Motu","fr_name":"hiri motu","active":true,"position":null} +{"code":"hrv","code3t":"","code2":"hr","it_name":"Croatian","en_name":"Croatian","fr_name":"croate","active":true,"position":null} +{"code":"hsb","code3t":"","code2":"","it_name":"Upper Sorbian","en_name":"Upper Sorbian","fr_name":"haut-sorabe","active":true,"position":null} +{"code":"hun","code3t":"","code2":"hu","it_name":"Hungarian","en_name":"Hungarian","fr_name":"hongrois","active":true,"position":null} +{"code":"hup","code3t":"","code2":"","it_name":"Hupa","en_name":"Hupa","fr_name":"hupa","active":true,"position":null} +{"code":"iba","code3t":"","code2":"","it_name":"Iban","en_name":"Iban","fr_name":"iban","active":true,"position":null} +{"code":"ibo","code3t":"","code2":"ig","it_name":"Igbo","en_name":"Igbo","fr_name":"igbo","active":true,"position":null} +{"code":"ice","code3t":"isl","code2":"is","it_name":"Icelandic","en_name":"Icelandic","fr_name":"islandais","active":true,"position":null} +{"code":"ido","code3t":"","code2":"io","it_name":"Ido","en_name":"Ido","fr_name":"ido","active":true,"position":null} +{"code":"iii","code3t":"","code2":"ii","it_name":"\"Sichuan Yi; Nuosu\"","en_name":"\"Sichuan Yi; Nuosu\"","fr_name":"yi de Sichuan","active":true,"position":null} +{"code":"ijo","code3t":"","code2":"","it_name":"Ijo languages","en_name":"Ijo languages","fr_name":"ijo, langues","active":true,"position":null} +{"code":"iku","code3t":"","code2":"iu","it_name":"Inuktitut","en_name":"Inuktitut","fr_name":"inuktitut","active":true,"position":null} +{"code":"ile","code3t":"","code2":"ie","it_name":"\"Interlingue; Occidental\"","en_name":"\"Interlingue; Occidental\"","fr_name":"interlingue","active":true,"position":null} +{"code":"ilo","code3t":"","code2":"","it_name":"Iloko","en_name":"Iloko","fr_name":"ilocano","active":true,"position":null} +{"code":"ina","code3t":"","code2":"ia","it_name":"Interlingua (International Auxiliary Language Association)","en_name":"Interlingua (International Auxiliary Language Association)","fr_name":"interlingua (langue auxiliaire internationale)","active":true,"position":null} +{"code":"inc","code3t":"","code2":"","it_name":"Indic languages","en_name":"Indic languages","fr_name":"indo-aryennes, langues","active":true,"position":null} +{"code":"ind","code3t":"","code2":"id","it_name":"Indonesian","en_name":"Indonesian","fr_name":"indonésien","active":true,"position":null} +{"code":"ine","code3t":"","code2":"","it_name":"Indo-European languages","en_name":"Indo-European languages","fr_name":"indo-européennes, langues","active":true,"position":null} +{"code":"inh","code3t":"","code2":"","it_name":"Ingush","en_name":"Ingush","fr_name":"ingouche","active":true,"position":null} +{"code":"ipk","code3t":"","code2":"ik","it_name":"Inupiaq","en_name":"Inupiaq","fr_name":"inupiaq","active":true,"position":null} +{"code":"ira","code3t":"","code2":"","it_name":"Iranian languages","en_name":"Iranian languages","fr_name":"iraniennes, langues","active":true,"position":null} +{"code":"iro","code3t":"","code2":"","it_name":"Iroquoian languages","en_name":"Iroquoian languages","fr_name":"iroquoises, langues","active":true,"position":null} +{"code":"jav","code3t":"","code2":"jv","it_name":"Javanese","en_name":"Javanese","fr_name":"javanais","active":true,"position":null} +{"code":"jbo","code3t":"","code2":"","it_name":"Lojban","en_name":"Lojban","fr_name":"lojban","active":true,"position":null} +{"code":"jpn","code3t":"","code2":"ja","it_name":"Japanese","en_name":"Japanese","fr_name":"japonais","active":true,"position":null} +{"code":"jpr","code3t":"","code2":"","it_name":"Judeo-Persian","en_name":"Judeo-Persian","fr_name":"judéo-persan","active":true,"position":null} +{"code":"jrb","code3t":"","code2":"","it_name":"Judeo-Arabic","en_name":"Judeo-Arabic","fr_name":"judéo-arabe","active":true,"position":null} +{"code":"kaa","code3t":"","code2":"","it_name":"Kara-Kalpak","en_name":"Kara-Kalpak","fr_name":"karakalpak","active":true,"position":null} +{"code":"kab","code3t":"","code2":"","it_name":"Kabyle","en_name":"Kabyle","fr_name":"kabyle","active":true,"position":null} +{"code":"kac","code3t":"","code2":"","it_name":"\"Kachin; Jingpho\"","en_name":"\"Kachin; Jingpho\"","fr_name":"\"kachin; jingpho\"","active":true,"position":null} +{"code":"kal","code3t":"","code2":"kl","it_name":"\"Kalaallisut; Greenlandic\"","en_name":"\"Kalaallisut; Greenlandic\"","fr_name":"groenlandais","active":true,"position":null} +{"code":"kam","code3t":"","code2":"","it_name":"Kamba","en_name":"Kamba","fr_name":"kamba","active":true,"position":null} +{"code":"kan","code3t":"","code2":"kn","it_name":"Kannada","en_name":"Kannada","fr_name":"kannada","active":true,"position":null} +{"code":"kar","code3t":"","code2":"","it_name":"Karen languages","en_name":"Karen languages","fr_name":"karen, langues","active":true,"position":null} +{"code":"kas","code3t":"","code2":"ks","it_name":"Kashmiri","en_name":"Kashmiri","fr_name":"kashmiri","active":true,"position":null} +{"code":"kau","code3t":"","code2":"kr","it_name":"Kanuri","en_name":"Kanuri","fr_name":"kanouri","active":true,"position":null} +{"code":"kaw","code3t":"","code2":"","it_name":"Kawi","en_name":"Kawi","fr_name":"kawi","active":true,"position":null} +{"code":"kaz","code3t":"","code2":"kk","it_name":"Kazakh","en_name":"Kazakh","fr_name":"kazakh","active":true,"position":null} +{"code":"kbd","code3t":"","code2":"","it_name":"Kabardian","en_name":"Kabardian","fr_name":"kabardien","active":true,"position":null} +{"code":"kha","code3t":"","code2":"","it_name":"Khasi","en_name":"Khasi","fr_name":"khasi","active":true,"position":null} +{"code":"khi","code3t":"","code2":"","it_name":"Khoisan languages","en_name":"Khoisan languages","fr_name":"khoïsan, langues","active":true,"position":null} +{"code":"khm","code3t":"","code2":"km","it_name":"Central Khmer","en_name":"Central Khmer","fr_name":"khmer central","active":true,"position":null} +{"code":"kho","code3t":"","code2":"","it_name":"\"Khotanese; Sakan\"","en_name":"\"Khotanese; Sakan\"","fr_name":"\"khotanais; sakan\"","active":true,"position":null} +{"code":"kik","code3t":"","code2":"ki","it_name":"\"Kikuyu; Gikuyu\"","en_name":"\"Kikuyu; Gikuyu\"","fr_name":"kikuyu","active":true,"position":null} +{"code":"kin","code3t":"","code2":"rw","it_name":"Kinyarwanda","en_name":"Kinyarwanda","fr_name":"rwanda","active":true,"position":null} +{"code":"kir","code3t":"","code2":"ky","it_name":"\"Kirghiz; Kyrgyz\"","en_name":"\"Kirghiz; Kyrgyz\"","fr_name":"kirghiz","active":true,"position":null} +{"code":"kmb","code3t":"","code2":"","it_name":"Kimbundu","en_name":"Kimbundu","fr_name":"kimbundu","active":true,"position":null} +{"code":"kok","code3t":"","code2":"","it_name":"Konkani","en_name":"Konkani","fr_name":"konkani","active":true,"position":null} +{"code":"kom","code3t":"","code2":"kv","it_name":"Komi","en_name":"Komi","fr_name":"kom","active":true,"position":null} +{"code":"kon","code3t":"","code2":"kg","it_name":"Kongo","en_name":"Kongo","fr_name":"kongo","active":true,"position":null} +{"code":"kor","code3t":"","code2":"ko","it_name":"Korean","en_name":"Korean","fr_name":"coréen","active":true,"position":null} +{"code":"kos","code3t":"","code2":"","it_name":"Kosraean","en_name":"Kosraean","fr_name":"kosrae","active":true,"position":null} +{"code":"kpe","code3t":"","code2":"","it_name":"Kpelle","en_name":"Kpelle","fr_name":"kpellé","active":true,"position":null} +{"code":"krc","code3t":"","code2":"","it_name":"Karachay-Balkar","en_name":"Karachay-Balkar","fr_name":"karatchai balkar","active":true,"position":null} +{"code":"krl","code3t":"","code2":"","it_name":"Karelian","en_name":"Karelian","fr_name":"carélien","active":true,"position":null} +{"code":"kro","code3t":"","code2":"","it_name":"Kru languages","en_name":"Kru languages","fr_name":"krou, langues","active":true,"position":null} +{"code":"kru","code3t":"","code2":"","it_name":"Kurukh","en_name":"Kurukh","fr_name":"kurukh","active":true,"position":null} +{"code":"kua","code3t":"","code2":"kj","it_name":"\"Kuanyama; Kwanyama\"","en_name":"\"Kuanyama; Kwanyama\"","fr_name":"\"kuanyama; kwanyama\"","active":true,"position":null} +{"code":"kum","code3t":"","code2":"","it_name":"Kumyk","en_name":"Kumyk","fr_name":"koumyk","active":true,"position":null} +{"code":"kur","code3t":"","code2":"ku","it_name":"Kurdish","en_name":"Kurdish","fr_name":"kurde","active":true,"position":null} +{"code":"kut","code3t":"","code2":"","it_name":"Kutenai","en_name":"Kutenai","fr_name":"kutenai","active":true,"position":null} +{"code":"lad","code3t":"","code2":"","it_name":"Ladino","en_name":"Ladino","fr_name":"judéo-espagnol","active":true,"position":null} +{"code":"lah","code3t":"","code2":"","it_name":"Lahnda","en_name":"Lahnda","fr_name":"lahnda","active":true,"position":null} +{"code":"lam","code3t":"","code2":"","it_name":"Lamba","en_name":"Lamba","fr_name":"lamba","active":true,"position":null} +{"code":"lao","code3t":"","code2":"lo","it_name":"Lao","en_name":"Lao","fr_name":"lao","active":true,"position":null} +{"code":"lav","code3t":"","code2":"lv","it_name":"Latvian","en_name":"Latvian","fr_name":"letton","active":true,"position":null} +{"code":"lez","code3t":"","code2":"","it_name":"Lezghian","en_name":"Lezghian","fr_name":"lezghien","active":true,"position":null} +{"code":"lim","code3t":"","code2":"li","it_name":"\"Limburgan; Limburger; Limburgish\"","en_name":"\"Limburgan; Limburger; Limburgish\"","fr_name":"limbourgeois","active":true,"position":null} +{"code":"lin","code3t":"","code2":"ln","it_name":"Lingala","en_name":"Lingala","fr_name":"lingala","active":true,"position":null} +{"code":"lit","code3t":"","code2":"lt","it_name":"Lithuanian","en_name":"Lithuanian","fr_name":"lituanien","active":true,"position":null} +{"code":"lol","code3t":"","code2":"","it_name":"Mongo","en_name":"Mongo","fr_name":"mongo","active":true,"position":null} +{"code":"loz","code3t":"","code2":"","it_name":"Lozi","en_name":"Lozi","fr_name":"lozi","active":true,"position":null} +{"code":"ltz","code3t":"","code2":"lb","it_name":"\"Luxembourgish; Letzeburgesch\"","en_name":"\"Luxembourgish; Letzeburgesch\"","fr_name":"luxembourgeois","active":true,"position":null} +{"code":"lua","code3t":"","code2":"","it_name":"Luba-Lulua","en_name":"Luba-Lulua","fr_name":"luba-lulua","active":true,"position":null} +{"code":"lub","code3t":"","code2":"lu","it_name":"Luba-Katanga","en_name":"Luba-Katanga","fr_name":"luba-katanga","active":true,"position":null} +{"code":"lug","code3t":"","code2":"lg","it_name":"Ganda","en_name":"Ganda","fr_name":"ganda","active":true,"position":null} +{"code":"lui","code3t":"","code2":"","it_name":"Luiseno","en_name":"Luiseno","fr_name":"luiseno","active":true,"position":null} +{"code":"lun","code3t":"","code2":"","it_name":"Lunda","en_name":"Lunda","fr_name":"lunda","active":true,"position":null} +{"code":"luo","code3t":"","code2":"","it_name":"Luo (Kenya and Tanzania)","en_name":"Luo (Kenya and Tanzania)","fr_name":"luo (Kenya et Tanzanie)","active":true,"position":null} +{"code":"lus","code3t":"","code2":"","it_name":"Lushai","en_name":"Lushai","fr_name":"lushai","active":true,"position":null} +{"code":"mac","code3t":"mkd","code2":"mk","it_name":"Macedonian","en_name":"Macedonian","fr_name":"macédonien","active":true,"position":null} +{"code":"mad","code3t":"","code2":"","it_name":"Madurese","en_name":"Madurese","fr_name":"madourais","active":true,"position":null} +{"code":"mag","code3t":"","code2":"","it_name":"Magahi","en_name":"Magahi","fr_name":"magahi","active":true,"position":null} +{"code":"mah","code3t":"","code2":"mh","it_name":"Marshallese","en_name":"Marshallese","fr_name":"marshall","active":true,"position":null} +{"code":"mai","code3t":"","code2":"","it_name":"Maithili","en_name":"Maithili","fr_name":"maithili","active":true,"position":null} +{"code":"mak","code3t":"","code2":"","it_name":"Makasar","en_name":"Makasar","fr_name":"makassar","active":true,"position":null} +{"code":"mal","code3t":"","code2":"ml","it_name":"Malayalam","en_name":"Malayalam","fr_name":"malayalam","active":true,"position":null} +{"code":"man","code3t":"","code2":"","it_name":"Mandingo","en_name":"Mandingo","fr_name":"mandingue","active":true,"position":null} +{"code":"mao","code3t":"mri","code2":"mi","it_name":"Maori","en_name":"Maori","fr_name":"maori","active":true,"position":null} +{"code":"map","code3t":"","code2":"","it_name":"Austronesian languages","en_name":"Austronesian languages","fr_name":"austronésiennes, langues","active":true,"position":null} +{"code":"mar","code3t":"","code2":"mr","it_name":"Marathi","en_name":"Marathi","fr_name":"marathe","active":true,"position":null} +{"code":"mas","code3t":"","code2":"","it_name":"Masai","en_name":"Masai","fr_name":"massaï","active":true,"position":null} +{"code":"may","code3t":"msa","code2":"ms","it_name":"Malay","en_name":"Malay","fr_name":"malais","active":true,"position":null} +{"code":"mdf","code3t":"","code2":"","it_name":"Moksha","en_name":"Moksha","fr_name":"moksa","active":true,"position":null} +{"code":"mdr","code3t":"","code2":"","it_name":"Mandar","en_name":"Mandar","fr_name":"mandar","active":true,"position":null} +{"code":"men","code3t":"","code2":"","it_name":"Mende","en_name":"Mende","fr_name":"mendé","active":true,"position":null} +{"code":"mga","code3t":"","code2":"","it_name":"Irish, Middle (900-1200)","en_name":"Irish, Middle (900-1200)","fr_name":"irlandais moyen (900-1200)","active":true,"position":null} +{"code":"mic","code3t":"","code2":"","it_name":"\"Mi'kmaq; Micmac\"","en_name":"\"Mi'kmaq; Micmac\"","fr_name":"\"mi'kmaq; micmac\"","active":true,"position":null} +{"code":"min","code3t":"","code2":"","it_name":"Minangkabau","en_name":"Minangkabau","fr_name":"minangkabau","active":true,"position":null} +{"code":"mis","code3t":"","code2":"","it_name":"Uncoded languages","en_name":"Uncoded languages","fr_name":"langues non codées","active":true,"position":null} +{"code":"mkh","code3t":"","code2":"","it_name":"Mon-Khmer languages","en_name":"Mon-Khmer languages","fr_name":"môn-khmer, langues","active":true,"position":null} +{"code":"mlg","code3t":"","code2":"mg","it_name":"Malagasy","en_name":"Malagasy","fr_name":"malgache","active":true,"position":null} +{"code":"mlt","code3t":"","code2":"mt","it_name":"Maltese","en_name":"Maltese","fr_name":"maltais","active":true,"position":null} +{"code":"mnc","code3t":"","code2":"","it_name":"Manchu","en_name":"Manchu","fr_name":"mandchou","active":true,"position":null} +{"code":"mni","code3t":"","code2":"","it_name":"Manipuri","en_name":"Manipuri","fr_name":"manipuri","active":true,"position":null} +{"code":"mno","code3t":"","code2":"","it_name":"Manobo languages","en_name":"Manobo languages","fr_name":"manobo, langues","active":true,"position":null} +{"code":"moh","code3t":"","code2":"","it_name":"Mohawk","en_name":"Mohawk","fr_name":"mohawk","active":true,"position":null} +{"code":"mon","code3t":"","code2":"mn","it_name":"Mongolian","en_name":"Mongolian","fr_name":"mongol","active":true,"position":null} +{"code":"mos","code3t":"","code2":"","it_name":"Mossi","en_name":"Mossi","fr_name":"moré","active":true,"position":null} +{"code":"mul","code3t":"","code2":"","it_name":"Multiple languages","en_name":"Multiple languages","fr_name":"multilingue","active":true,"position":null} +{"code":"mun","code3t":"","code2":"","it_name":"Munda languages","en_name":"Munda languages","fr_name":"mounda, langues","active":true,"position":null} +{"code":"mus","code3t":"","code2":"","it_name":"Creek","en_name":"Creek","fr_name":"muskogee","active":true,"position":null} +{"code":"mwl","code3t":"","code2":"","it_name":"Mirandese","en_name":"Mirandese","fr_name":"mirandais","active":true,"position":null} +{"code":"mwr","code3t":"","code2":"","it_name":"Marwari","en_name":"Marwari","fr_name":"marvari","active":true,"position":null} +{"code":"myn","code3t":"","code2":"","it_name":"Mayan languages","en_name":"Mayan languages","fr_name":"maya, langues","active":true,"position":null} +{"code":"myv","code3t":"","code2":"","it_name":"Erzya","en_name":"Erzya","fr_name":"erza","active":true,"position":null} +{"code":"nah","code3t":"","code2":"","it_name":"Nahuatl languages","en_name":"Nahuatl languages","fr_name":"nahuatl, langues","active":true,"position":null} +{"code":"nai","code3t":"","code2":"","it_name":"North American Indian languages","en_name":"North American Indian languages","fr_name":"nord-amérindiennes, langues","active":true,"position":null} +{"code":"nap","code3t":"","code2":"","it_name":"Neapolitan","en_name":"Neapolitan","fr_name":"napolitain","active":true,"position":null} +{"code":"nau","code3t":"","code2":"na","it_name":"Nauru","en_name":"Nauru","fr_name":"nauruan","active":true,"position":null} +{"code":"nav","code3t":"","code2":"nv","it_name":"\"Navajo; Navaho\"","en_name":"\"Navajo; Navaho\"","fr_name":"navaho","active":true,"position":null} +{"code":"nbl","code3t":"","code2":"nr","it_name":"\"Ndebele, South; South Ndebele\"","en_name":"\"Ndebele, South; South Ndebele\"","fr_name":"ndébélé du Sud","active":true,"position":null} +{"code":"nde","code3t":"","code2":"nd","it_name":"\"Ndebele, North; North Ndebele\"","en_name":"\"Ndebele, North; North Ndebele\"","fr_name":"ndébélé du Nord","active":true,"position":null} +{"code":"ndo","code3t":"","code2":"ng","it_name":"Ndonga","en_name":"Ndonga","fr_name":"ndonga","active":true,"position":null} +{"code":"nds","code3t":"","code2":"","it_name":"\"Low German; Low Saxon; German, Low; Saxon, Low\"","en_name":"\"Low German; Low Saxon; German, Low; Saxon, Low\"","fr_name":"\"bas allemand; bas saxon; allemand, bas; saxon, bas\"","active":true,"position":null} +{"code":"nep","code3t":"","code2":"ne","it_name":"Nepali","en_name":"Nepali","fr_name":"népalais","active":true,"position":null} +{"code":"new","code3t":"","code2":"","it_name":"\"Nepal Bhasa; Newari\"","en_name":"\"Nepal Bhasa; Newari\"","fr_name":"\"nepal bhasa; newari\"","active":true,"position":null} +{"code":"nia","code3t":"","code2":"","it_name":"Nias","en_name":"Nias","fr_name":"nias","active":true,"position":null} +{"code":"nic","code3t":"","code2":"","it_name":"Niger-Kordofanian languages","en_name":"Niger-Kordofanian languages","fr_name":"nigéro-kordofaniennes, langues","active":true,"position":null} +{"code":"niu","code3t":"","code2":"","it_name":"Niuean","en_name":"Niuean","fr_name":"niué","active":true,"position":null} +{"code":"nno","code3t":"","code2":"nn","it_name":"\"Norwegian Nynorsk; Nynorsk, Norwegian\"","en_name":"\"Norwegian Nynorsk; Nynorsk, Norwegian\"","fr_name":"\"norvégien nynorsk; nynorsk, norvégien\"","active":true,"position":null} +{"code":"nob","code3t":"","code2":"nb","it_name":"\"Bokmål, Norwegian; Norwegian Bokmål\"","en_name":"\"Bokmål, Norwegian; Norwegian Bokmål\"","fr_name":"norvégien bokmål","active":true,"position":null} +{"code":"nog","code3t":"","code2":"","it_name":"Nogai","en_name":"Nogai","fr_name":"\"nogaï; nogay\"","active":true,"position":null} +{"code":"non","code3t":"","code2":"","it_name":"Norse, Old","en_name":"Norse, Old","fr_name":"norrois, vieux","active":true,"position":null} +{"code":"nor","code3t":"","code2":"no","it_name":"Norwegian","en_name":"Norwegian","fr_name":"norvégien","active":true,"position":null} +{"code":"nqo","code3t":"","code2":"","it_name":"N'Ko","en_name":"N'Ko","fr_name":"n'ko","active":true,"position":null} +{"code":"nso","code3t":"","code2":"","it_name":"\"Pedi; Sepedi; Northern Sotho\"","en_name":"\"Pedi; Sepedi; Northern Sotho\"","fr_name":"\"pedi; sepedi; sotho du Nord\"","active":true,"position":null} +{"code":"nub","code3t":"","code2":"","it_name":"Nubian languages","en_name":"Nubian languages","fr_name":"nubiennes, langues","active":true,"position":null} +{"code":"nwc","code3t":"","code2":"","it_name":"\"Classical Newari; Old Newari; Classical Nepal Bhasa\"","en_name":"\"Classical Newari; Old Newari; Classical Nepal Bhasa\"","fr_name":"newari classique","active":true,"position":null} +{"code":"nya","code3t":"","code2":"ny","it_name":"\"Chichewa; Chewa; Nyanja\"","en_name":"\"Chichewa; Chewa; Nyanja\"","fr_name":"\"chichewa; chewa; nyanja\"","active":true,"position":null} +{"code":"nym","code3t":"","code2":"","it_name":"Nyamwezi","en_name":"Nyamwezi","fr_name":"nyamwezi","active":true,"position":null} +{"code":"nyn","code3t":"","code2":"","it_name":"Nyankole","en_name":"Nyankole","fr_name":"nyankolé","active":true,"position":null} +{"code":"nyo","code3t":"","code2":"","it_name":"Nyoro","en_name":"Nyoro","fr_name":"nyoro","active":true,"position":null} +{"code":"nzi","code3t":"","code2":"","it_name":"Nzima","en_name":"Nzima","fr_name":"nzema","active":true,"position":null} +{"code":"oci","code3t":"","code2":"oc","it_name":"\"Occitan (post 1500); Provençal\"","en_name":"\"Occitan (post 1500); Provençal\"","fr_name":"\"occitan (après 1500); provençal\"","active":true,"position":null} +{"code":"oji","code3t":"","code2":"oj","it_name":"Ojibwa","en_name":"Ojibwa","fr_name":"ojibwa","active":true,"position":null} +{"code":"ori","code3t":"","code2":"or","it_name":"Oriya","en_name":"Oriya","fr_name":"oriya","active":true,"position":null} +{"code":"orm","code3t":"","code2":"om","it_name":"Oromo","en_name":"Oromo","fr_name":"galla","active":true,"position":null} +{"code":"osa","code3t":"","code2":"","it_name":"Osage","en_name":"Osage","fr_name":"osage","active":true,"position":null} +{"code":"oss","code3t":"","code2":"os","it_name":"\"Ossetian; Ossetic\"","en_name":"\"Ossetian; Ossetic\"","fr_name":"ossète","active":true,"position":null} +{"code":"ota","code3t":"","code2":"","it_name":"Turkish, Ottoman (1500-1928)","en_name":"Turkish, Ottoman (1500-1928)","fr_name":"turc ottoman (1500-1928)","active":true,"position":null} +{"code":"oto","code3t":"","code2":"","it_name":"Otomian languages","en_name":"Otomian languages","fr_name":"otomi, langues","active":true,"position":null} +{"code":"paa","code3t":"","code2":"","it_name":"Papuan languages","en_name":"Papuan languages","fr_name":"papoues, langues","active":true,"position":null} +{"code":"pag","code3t":"","code2":"","it_name":"Pangasinan","en_name":"Pangasinan","fr_name":"pangasinan","active":true,"position":null} +{"code":"pal","code3t":"","code2":"","it_name":"Pahlavi","en_name":"Pahlavi","fr_name":"pahlavi","active":true,"position":null} +{"code":"pam","code3t":"","code2":"","it_name":"\"Pampanga; Kapampangan\"","en_name":"\"Pampanga; Kapampangan\"","fr_name":"pampangan","active":true,"position":null} +{"code":"pan","code3t":"","code2":"pa","it_name":"\"Panjabi; Punjabi\"","en_name":"\"Panjabi; Punjabi\"","fr_name":"pendjabi","active":true,"position":null} +{"code":"pap","code3t":"","code2":"","it_name":"Papiamento","en_name":"Papiamento","fr_name":"papiamento","active":true,"position":null} +{"code":"pau","code3t":"","code2":"","it_name":"Palauan","en_name":"Palauan","fr_name":"palau","active":true,"position":null} +{"code":"peo","code3t":"","code2":"","it_name":"Persian, Old (ca.600-400 B.C.)","en_name":"Persian, Old (ca.600-400 B.C.)","fr_name":"perse, vieux (ca. 600-400 av. J.-C.)","active":true,"position":null} +{"code":"per","code3t":"fas","code2":"fa","it_name":"Persian","en_name":"Persian","fr_name":"persan","active":true,"position":null} +{"code":"phi","code3t":"","code2":"","it_name":"Philippine languages","en_name":"Philippine languages","fr_name":"philippines, langues","active":true,"position":null} +{"code":"phn","code3t":"","code2":"","it_name":"Phoenician","en_name":"Phoenician","fr_name":"phénicien","active":true,"position":null} +{"code":"pli","code3t":"","code2":"pi","it_name":"Pali","en_name":"Pali","fr_name":"pali","active":true,"position":null} +{"code":"pol","code3t":"","code2":"pl","it_name":"Polish","en_name":"Polish","fr_name":"polonais","active":true,"position":null} +{"code":"pon","code3t":"","code2":"","it_name":"Pohnpeian","en_name":"Pohnpeian","fr_name":"pohnpei","active":true,"position":null} +{"code":"por","code3t":"","code2":"pt","it_name":"Portuguese","en_name":"Portuguese","fr_name":"portugais","active":true,"position":null} +{"code":"pra","code3t":"","code2":"","it_name":"Prakrit languages","en_name":"Prakrit languages","fr_name":"prâkrit, langues","active":true,"position":null} +{"code":"pro","code3t":"","code2":"","it_name":"Provençal, Old (to 1500)","en_name":"Provençal, Old (to 1500)","fr_name":"provençal ancien (jusqu'à 1500)","active":true,"position":null} +{"code":"pus","code3t":"","code2":"ps","it_name":"\"Pushto; Pashto\"","en_name":"\"Pushto; Pashto\"","fr_name":"pachto","active":true,"position":null} +{"code":"qaa","code3t":"","code2":"","it_name":"Reserved for local use","en_name":"Reserved for local use","fr_name":"réservée à l'usage local","active":true,"position":null} +{"code":"que","code3t":"","code2":"qu","it_name":"Quechua","en_name":"Quechua","fr_name":"quechua","active":true,"position":null} +{"code":"raj","code3t":"","code2":"","it_name":"Rajasthani","en_name":"Rajasthani","fr_name":"rajasthani","active":true,"position":null} +{"code":"rap","code3t":"","code2":"","it_name":"Rapanui","en_name":"Rapanui","fr_name":"rapanui","active":true,"position":null} +{"code":"rar","code3t":"","code2":"","it_name":"\"Rarotongan; Cook Islands Maori\"","en_name":"\"Rarotongan; Cook Islands Maori\"","fr_name":"\"rarotonga; maori des îles Cook\"","active":true,"position":null} +{"code":"roa","code3t":"","code2":"","it_name":"Romance languages","en_name":"Romance languages","fr_name":"romanes, langues","active":true,"position":null} +{"code":"roh","code3t":"","code2":"rm","it_name":"Romansh","en_name":"Romansh","fr_name":"romanche","active":true,"position":null} +{"code":"rom","code3t":"","code2":"","it_name":"Romany","en_name":"Romany","fr_name":"tsigane","active":true,"position":null} +{"code":"rum","code3t":"ron","code2":"ro","it_name":"\"Romanian; Moldavian; Moldovan\"","en_name":"\"Romanian; Moldavian; Moldovan\"","fr_name":"\"roumain; moldave\"","active":true,"position":null} +{"code":"run","code3t":"","code2":"rn","it_name":"Rundi","en_name":"Rundi","fr_name":"rundi","active":true,"position":null} +{"code":"rup","code3t":"","code2":"","it_name":"\"Aromanian; Arumanian; Macedo-Romanian\"","en_name":"\"Aromanian; Arumanian; Macedo-Romanian\"","fr_name":"\"aroumain; macédo-roumain\"","active":true,"position":null} +{"code":"rus","code3t":"","code2":"ru","it_name":"Russian","en_name":"Russian","fr_name":"russe","active":true,"position":null} +{"code":"sad","code3t":"","code2":"","it_name":"Sandawe","en_name":"Sandawe","fr_name":"sandawe","active":true,"position":null} +{"code":"sag","code3t":"","code2":"sg","it_name":"Sango","en_name":"Sango","fr_name":"sango","active":true,"position":null} +{"code":"sah","code3t":"","code2":"","it_name":"Yakut","en_name":"Yakut","fr_name":"iakoute","active":true,"position":null} +{"code":"sai","code3t":"","code2":"","it_name":"South American Indian (Other)","en_name":"South American Indian (Other)","fr_name":"indiennes d'Amérique du Sud, autres langues","active":true,"position":null} +{"code":"sal","code3t":"","code2":"","it_name":"Salishan languages","en_name":"Salishan languages","fr_name":"salishennes, langues","active":true,"position":null} +{"code":"sam","code3t":"","code2":"","it_name":"Samaritan Aramaic","en_name":"Samaritan Aramaic","fr_name":"samaritain","active":true,"position":null} +{"code":"san","code3t":"","code2":"sa","it_name":"Sanskrit","en_name":"Sanskrit","fr_name":"sanskrit","active":true,"position":null} +{"code":"sas","code3t":"","code2":"","it_name":"Sasak","en_name":"Sasak","fr_name":"sasak","active":true,"position":null} +{"code":"sat","code3t":"","code2":"","it_name":"Santali","en_name":"Santali","fr_name":"santal","active":true,"position":null} +{"code":"scn","code3t":"","code2":"","it_name":"Sicilian","en_name":"Sicilian","fr_name":"sicilien","active":true,"position":null} +{"code":"sco","code3t":"","code2":"","it_name":"Scots","en_name":"Scots","fr_name":"écossais","active":true,"position":null} +{"code":"sel","code3t":"","code2":"","it_name":"Selkup","en_name":"Selkup","fr_name":"selkoupe","active":true,"position":null} +{"code":"sem","code3t":"","code2":"","it_name":"Semitic languages","en_name":"Semitic languages","fr_name":"sémitiques, langues","active":true,"position":null} +{"code":"sga","code3t":"","code2":"","it_name":"Irish, Old (to 900)","en_name":"Irish, Old (to 900)","fr_name":"irlandais ancien (jusqu'à 900)","active":true,"position":null} +{"code":"sgn","code3t":"","code2":"","it_name":"Sign Languages","en_name":"Sign Languages","fr_name":"langues des signes","active":true,"position":null} +{"code":"shn","code3t":"","code2":"","it_name":"Shan","en_name":"Shan","fr_name":"chan","active":true,"position":null} +{"code":"sid","code3t":"","code2":"","it_name":"Sidamo","en_name":"Sidamo","fr_name":"sidamo","active":true,"position":null} +{"code":"sin","code3t":"","code2":"si","it_name":"\"Sinhala; Sinhalese\"","en_name":"\"Sinhala; Sinhalese\"","fr_name":"singhalais","active":true,"position":null} +{"code":"sio","code3t":"","code2":"","it_name":"Siouan languages","en_name":"Siouan languages","fr_name":"sioux, langues","active":true,"position":null} +{"code":"sit","code3t":"","code2":"","it_name":"Sino-Tibetan languages","en_name":"Sino-Tibetan languages","fr_name":"sino-tibétaines, langues","active":true,"position":null} +{"code":"sla","code3t":"","code2":"","it_name":"Slavic languages","en_name":"Slavic languages","fr_name":"slaves, langues","active":true,"position":null} +{"code":"slo","code3t":"slk","code2":"sk","it_name":"Slovak","en_name":"Slovak","fr_name":"slovaque","active":true,"position":null} +{"code":"slv","code3t":"","code2":"sl","it_name":"Slovenian","en_name":"Slovenian","fr_name":"slovène","active":true,"position":null} +{"code":"sma","code3t":"","code2":"","it_name":"Southern Sami","en_name":"Southern Sami","fr_name":"sami du Sud","active":true,"position":null} +{"code":"sme","code3t":"","code2":"se","it_name":"Northern Sami","en_name":"Northern Sami","fr_name":"sami du Nord","active":true,"position":null} +{"code":"smi","code3t":"","code2":"","it_name":"Sami languages","en_name":"Sami languages","fr_name":"sames, langues","active":true,"position":null} +{"code":"smj","code3t":"","code2":"","it_name":"Lule Sami","en_name":"Lule Sami","fr_name":"sami de Lule","active":true,"position":null} +{"code":"smn","code3t":"","code2":"","it_name":"Inari Sami","en_name":"Inari Sami","fr_name":"sami d'Inari","active":true,"position":null} +{"code":"smo","code3t":"","code2":"sm","it_name":"Samoan","en_name":"Samoan","fr_name":"samoan","active":true,"position":null} +{"code":"sms","code3t":"","code2":"","it_name":"Skolt Sami","en_name":"Skolt Sami","fr_name":"sami skolt","active":true,"position":null} +{"code":"sna","code3t":"","code2":"sn","it_name":"Shona","en_name":"Shona","fr_name":"shona","active":true,"position":null} +{"code":"snd","code3t":"","code2":"sd","it_name":"Sindhi","en_name":"Sindhi","fr_name":"sindhi","active":true,"position":null} +{"code":"snk","code3t":"","code2":"","it_name":"Soninke","en_name":"Soninke","fr_name":"soninké","active":true,"position":null} +{"code":"sog","code3t":"","code2":"","it_name":"Sogdian","en_name":"Sogdian","fr_name":"sogdien","active":true,"position":null} +{"code":"som","code3t":"","code2":"so","it_name":"Somali","en_name":"Somali","fr_name":"somali","active":true,"position":null} +{"code":"son","code3t":"","code2":"","it_name":"Songhai languages","en_name":"Songhai languages","fr_name":"songhai, langues","active":true,"position":null} +{"code":"sot","code3t":"","code2":"st","it_name":"Sotho, Southern","en_name":"Sotho, Southern","fr_name":"sotho du Sud","active":true,"position":null} +{"code":"spa","code3t":"","code2":"es","it_name":"\"Spanish; Castilian\"","en_name":"\"Spanish; Castilian\"","fr_name":"\"espagnol; castillan\"","active":true,"position":null} +{"code":"srd","code3t":"","code2":"sc","it_name":"Sardinian","en_name":"Sardinian","fr_name":"sarde","active":true,"position":null} +{"code":"srn","code3t":"","code2":"","it_name":"Sranan Tongo","en_name":"Sranan Tongo","fr_name":"sranan tongo","active":true,"position":null} +{"code":"srp","code3t":"","code2":"sr","it_name":"Serbian","en_name":"Serbian","fr_name":"serbe","active":true,"position":null} +{"code":"srr","code3t":"","code2":"","it_name":"Serer","en_name":"Serer","fr_name":"sérère","active":true,"position":null} +{"code":"ssa","code3t":"","code2":"","it_name":"Nilo-Saharan languages","en_name":"Nilo-Saharan languages","fr_name":"nilo-sahariennes, langues","active":true,"position":null} +{"code":"ssw","code3t":"","code2":"ss","it_name":"Swati","en_name":"Swati","fr_name":"swati","active":true,"position":null} +{"code":"suk","code3t":"","code2":"","it_name":"Sukuma","en_name":"Sukuma","fr_name":"sukuma","active":true,"position":null} +{"code":"sun","code3t":"","code2":"su","it_name":"Sundanese","en_name":"Sundanese","fr_name":"soundanais","active":true,"position":null} +{"code":"sus","code3t":"","code2":"","it_name":"Susu","en_name":"Susu","fr_name":"soussou","active":true,"position":null} +{"code":"sux","code3t":"","code2":"","it_name":"Sumerian","en_name":"Sumerian","fr_name":"sumérien","active":true,"position":null} +{"code":"swa","code3t":"","code2":"sw","it_name":"Swahili","en_name":"Swahili","fr_name":"swahili","active":true,"position":null} +{"code":"swe","code3t":"","code2":"sv","it_name":"Swedish","en_name":"Swedish","fr_name":"suédois","active":true,"position":null} +{"code":"syc","code3t":"","code2":"","it_name":"Classical Syriac","en_name":"Classical Syriac","fr_name":"syriaque classique","active":true,"position":null} +{"code":"syr","code3t":"","code2":"","it_name":"Syriac","en_name":"Syriac","fr_name":"syriaque","active":true,"position":null} +{"code":"tah","code3t":"","code2":"ty","it_name":"Tahitian","en_name":"Tahitian","fr_name":"tahitien","active":true,"position":null} +{"code":"tai","code3t":"","code2":"","it_name":"Tai languages","en_name":"Tai languages","fr_name":"tai, langues","active":true,"position":null} +{"code":"tam","code3t":"","code2":"ta","it_name":"Tamil","en_name":"Tamil","fr_name":"tamoul","active":true,"position":null} +{"code":"tat","code3t":"","code2":"tt","it_name":"Tatar","en_name":"Tatar","fr_name":"tatar","active":true,"position":null} +{"code":"tel","code3t":"","code2":"te","it_name":"Telugu","en_name":"Telugu","fr_name":"télougou","active":true,"position":null} +{"code":"tem","code3t":"","code2":"","it_name":"Timne","en_name":"Timne","fr_name":"temne","active":true,"position":null} +{"code":"ter","code3t":"","code2":"","it_name":"Tereno","en_name":"Tereno","fr_name":"tereno","active":true,"position":null} +{"code":"tet","code3t":"","code2":"","it_name":"Tetum","en_name":"Tetum","fr_name":"tetum","active":true,"position":null} +{"code":"tgk","code3t":"","code2":"tg","it_name":"Tajik","en_name":"Tajik","fr_name":"tadjik","active":true,"position":null} +{"code":"tgl","code3t":"","code2":"tl","it_name":"Tagalog","en_name":"Tagalog","fr_name":"tagalog","active":true,"position":null} +{"code":"tha","code3t":"","code2":"th","it_name":"Thai","en_name":"Thai","fr_name":"thaï","active":true,"position":null} +{"code":"tib","code3t":"bod","code2":"bo","it_name":"Tibetan","en_name":"Tibetan","fr_name":"tibétain","active":true,"position":null} +{"code":"tig","code3t":"","code2":"","it_name":"Tigre","en_name":"Tigre","fr_name":"tigré","active":true,"position":null} +{"code":"tir","code3t":"","code2":"ti","it_name":"Tigrinya","en_name":"Tigrinya","fr_name":"tigrigna","active":true,"position":null} +{"code":"tiv","code3t":"","code2":"","it_name":"Tiv","en_name":"Tiv","fr_name":"tiv","active":true,"position":null} +{"code":"tkl","code3t":"","code2":"","it_name":"Tokelau","en_name":"Tokelau","fr_name":"tokelau","active":true,"position":null} +{"code":"tlh","code3t":"","code2":"","it_name":"\"Klingon; tlhIngan-Hol\"","en_name":"\"Klingon; tlhIngan-Hol\"","fr_name":"klingon","active":true,"position":null} +{"code":"tli","code3t":"","code2":"","it_name":"Tlingit","en_name":"Tlingit","fr_name":"tlingit","active":true,"position":null} +{"code":"tmh","code3t":"","code2":"","it_name":"Tamashek","en_name":"Tamashek","fr_name":"tamacheq","active":true,"position":null} +{"code":"tog","code3t":"","code2":"","it_name":"Tonga (Nyasa)","en_name":"Tonga (Nyasa)","fr_name":"tonga (Nyasa)","active":true,"position":null} +{"code":"ton","code3t":"","code2":"to","it_name":"Tonga (Tonga Islands)","en_name":"Tonga (Tonga Islands)","fr_name":"tongan (Îles Tonga)","active":true,"position":null} +{"code":"tpi","code3t":"","code2":"","it_name":"Tok Pisin","en_name":"Tok Pisin","fr_name":"tok pisin","active":true,"position":null} +{"code":"tsi","code3t":"","code2":"","it_name":"Tsimshian","en_name":"Tsimshian","fr_name":"tsimshian","active":true,"position":null} +{"code":"tsn","code3t":"","code2":"tn","it_name":"Tswana","en_name":"Tswana","fr_name":"tswana","active":true,"position":null} +{"code":"tso","code3t":"","code2":"ts","it_name":"Tsonga","en_name":"Tsonga","fr_name":"tsonga","active":true,"position":null} +{"code":"tuk","code3t":"","code2":"tk","it_name":"Turkmen","en_name":"Turkmen","fr_name":"turkmène","active":true,"position":null} +{"code":"tum","code3t":"","code2":"","it_name":"Tumbuka","en_name":"Tumbuka","fr_name":"tumbuka","active":true,"position":null} +{"code":"tup","code3t":"","code2":"","it_name":"Tupi languages","en_name":"Tupi languages","fr_name":"tupi, langues","active":true,"position":null} +{"code":"tur","code3t":"","code2":"tr","it_name":"Turkish","en_name":"Turkish","fr_name":"turc","active":true,"position":null} +{"code":"tut","code3t":"","code2":"","it_name":"Altaic languages","en_name":"Altaic languages","fr_name":"altaïques, langues","active":true,"position":null} +{"code":"tvl","code3t":"","code2":"","it_name":"Tuvalu","en_name":"Tuvalu","fr_name":"tuvalu","active":true,"position":null} +{"code":"twi","code3t":"","code2":"tw","it_name":"Twi","en_name":"Twi","fr_name":"twi","active":true,"position":null} +{"code":"tyv","code3t":"","code2":"","it_name":"Tuvinian","en_name":"Tuvinian","fr_name":"touva","active":true,"position":null} +{"code":"udm","code3t":"","code2":"","it_name":"Udmurt","en_name":"Udmurt","fr_name":"oudmourte","active":true,"position":null} +{"code":"uga","code3t":"","code2":"","it_name":"Ugaritic","en_name":"Ugaritic","fr_name":"ougaritique","active":true,"position":null} +{"code":"uig","code3t":"","code2":"ug","it_name":"\"Uighur; Uyghur\"","en_name":"\"Uighur; Uyghur\"","fr_name":"ouïgour","active":true,"position":null} +{"code":"ukr","code3t":"","code2":"uk","it_name":"Ukrainian","en_name":"Ukrainian","fr_name":"ukrainien","active":true,"position":null} +{"code":"umb","code3t":"","code2":"","it_name":"Umbundu","en_name":"Umbundu","fr_name":"umbundu","active":true,"position":null} +{"code":"und","code3t":"","code2":"","it_name":"Undetermined","en_name":"Undetermined","fr_name":"indéterminée","active":true,"position":null} +{"code":"urd","code3t":"","code2":"ur","it_name":"Urdu","en_name":"Urdu","fr_name":"ourdou","active":true,"position":null} +{"code":"uzb","code3t":"","code2":"uz","it_name":"Uzbek","en_name":"Uzbek","fr_name":"ouszbek","active":true,"position":null} +{"code":"vai","code3t":"","code2":"","it_name":"Vai","en_name":"Vai","fr_name":"vaï","active":true,"position":null} +{"code":"ven","code3t":"","code2":"ve","it_name":"Venda","en_name":"Venda","fr_name":"venda","active":true,"position":null} +{"code":"vie","code3t":"","code2":"vi","it_name":"Vietnamese","en_name":"Vietnamese","fr_name":"vietnamien","active":true,"position":null} +{"code":"vol","code3t":"","code2":"vo","it_name":"Volapük","en_name":"Volapük","fr_name":"volapük","active":true,"position":null} +{"code":"vot","code3t":"","code2":"","it_name":"Votic","en_name":"Votic","fr_name":"vote","active":true,"position":null} +{"code":"wak","code3t":"","code2":"","it_name":"Wakashan languages","en_name":"Wakashan languages","fr_name":"wakashanes, langues","active":true,"position":null} +{"code":"wal","code3t":"","code2":"","it_name":"Walamo","en_name":"Walamo","fr_name":"walamo","active":true,"position":null} +{"code":"war","code3t":"","code2":"","it_name":"Waray","en_name":"Waray","fr_name":"waray","active":true,"position":null} +{"code":"was","code3t":"","code2":"","it_name":"Washo","en_name":"Washo","fr_name":"washo","active":true,"position":null} +{"code":"wel","code3t":"cym","code2":"cy","it_name":"Welsh","en_name":"Welsh","fr_name":"gallois","active":true,"position":null} +{"code":"wen","code3t":"","code2":"","it_name":"Sorbian languages","en_name":"Sorbian languages","fr_name":"sorabes, langues","active":true,"position":null} +{"code":"wln","code3t":"","code2":"wa","it_name":"Walloon","en_name":"Walloon","fr_name":"wallon","active":true,"position":null} +{"code":"wol","code3t":"","code2":"wo","it_name":"Wolof","en_name":"Wolof","fr_name":"wolof","active":true,"position":null} +{"code":"xal","code3t":"","code2":"","it_name":"\"Kalmyk; Oirat\"","en_name":"\"Kalmyk; Oirat\"","fr_name":"\"kalmouk; oïrat\"","active":true,"position":null} +{"code":"xho","code3t":"","code2":"xh","it_name":"Xhosa","en_name":"Xhosa","fr_name":"xhosa","active":true,"position":null} +{"code":"yao","code3t":"","code2":"","it_name":"Yao","en_name":"Yao","fr_name":"yao","active":true,"position":null} +{"code":"yap","code3t":"","code2":"","it_name":"Yapese","en_name":"Yapese","fr_name":"yapois","active":true,"position":null} +{"code":"yid","code3t":"","code2":"yi","it_name":"Yiddish","en_name":"Yiddish","fr_name":"yiddish","active":true,"position":null} +{"code":"yor","code3t":"","code2":"yo","it_name":"Yoruba","en_name":"Yoruba","fr_name":"yoruba","active":true,"position":null} +{"code":"ypk","code3t":"","code2":"","it_name":"Yupik languages","en_name":"Yupik languages","fr_name":"yupik, langues","active":true,"position":null} +{"code":"zap","code3t":"","code2":"","it_name":"Zapotec","en_name":"Zapotec","fr_name":"zapotèque","active":true,"position":null} +{"code":"zbl","code3t":"","code2":"","it_name":"\"Blissymbols; Blissymbolics; Bliss\"","en_name":"\"Blissymbols; Blissymbolics; Bliss\"","fr_name":"\"symboles Bliss; Bliss\"","active":true,"position":null} +{"code":"zen","code3t":"","code2":"","it_name":"Zenaga","en_name":"Zenaga","fr_name":"zenaga","active":true,"position":null} +{"code":"zha","code3t":"","code2":"za","it_name":"\"Zhuang; Chuang\"","en_name":"\"Zhuang; Chuang\"","fr_name":"\"zhuang; chuang\"","active":true,"position":null} +{"code":"znd","code3t":"","code2":"","it_name":"Zande languages","en_name":"Zande languages","fr_name":"zandé, langues","active":true,"position":null} +{"code":"zul","code3t":"","code2":"zu","it_name":"Zulu","en_name":"Zulu","fr_name":"zoulou","active":true,"position":null} +{"code":"zun","code3t":"","code2":"","it_name":"Zuni","en_name":"Zuni","fr_name":"zuni","active":true,"position":null} +{"code":"zxx","code3t":"","code2":"","it_name":"\"No linguistic content; Not applicable\"","en_name":"\"No linguistic content; Not applicable\"","fr_name":"\"pas de contenu linguistique; non applicable\"","active":true,"position":null} +{"code":"zza","code3t":"","code2":"","it_name":"\"Zaza; Dimili; Dimli; Kirdki; Kirmanjki; Zazaki\"","en_name":"\"Zaza; Dimili; Dimli; Kirdki; Kirmanjki; Zazaki\"","fr_name":"\"zaza; dimili; dimli; kirdki; kirmanjki; zazaki\"","active":true,"position":null} diff --git a/db/seeds/sc2_terms.json b/db/seeds/sc2_terms.json index 2b4c33d..6054c57 100644 --- a/db/seeds/sc2_terms.json +++ b/db/seeds/sc2_terms.json @@ -501,3 +501,12 @@ {"sc2_vocabulary_id":9,"position":8,"term_key":"carta topografica","term_value":"carta topografica","term_scope":"CARS"} {"sc2_vocabulary_id":9,"position":9,"term_key":"mappa catastale","term_value":"mappa catastale","term_scope":"CARS"} {"sc2_vocabulary_id":9,"position":10,"term_key":"carta IGM","term_value":"carta IGM","term_scope":"CARS"} +{"sc2_vocabulary_id":10,"position":1,"term_key":"a_hiring","term_value":"Assunzione"} +{"sc2_vocabulary_id":10,"position":2,"term_key":"b_subscription","term_value":"Iscrizione"} +{"sc2_vocabulary_id":10,"position":3,"term_key":"c_opened_relationship_date","term_value":"Data significativa per l’apertura del rapporto della persona con l’organizzazione"} +{"sc2_vocabulary_id":10,"position":4,"term_key":"d_other_fsc","term_value":"Altro"} +{"sc2_vocabulary_id":11,"position":1,"term_key":"a_organization","term_value":"Organizzazione di appartenenza"} +{"sc2_vocabulary_id":11,"position":2,"term_key":"b_nationality","term_value":"Nazionalità"} +{"sc2_vocabulary_id":11,"position":3,"term_key":"c_code","term_value":"Codice"} +{"sc2_vocabulary_id":11,"position":4,"term_key":"d_opened_at","term_value":"Data apertura fascicolo"} +{"sc2_vocabulary_id":11,"position":5,"term_key":"e_closed_at","term_value":"Data chiusura fascicolo"} \ No newline at end of file diff --git a/db/seeds/sc2_vocabularies.json b/db/seeds/sc2_vocabularies.json index 4e94b06..7ba2cb0 100644 --- a/db/seeds/sc2_vocabularies.json +++ b/db/seeds/sc2_vocabularies.json @@ -7,3 +7,5 @@ {"name":"sc2_scales.sca"} {"name":"sc2.sdtt"} {"name":"sc2.sdts"} +{"name":"fsc.code"} +{"name":"fsc.field_type"} \ No newline at end of file diff --git a/db/seeds/terms.json b/db/seeds/terms.json index 8cda5c0..8e34336 100644 --- a/db/seeds/terms.json +++ b/db/seeds/terms.json @@ -1,166 +1,177 @@ -{"vocabulary_id":1,"position":1,"term_key":"corporate_body","term_value":"C"} -{"vocabulary_id":1,"position":2,"term_key":"person","term_value":"P"} -{"vocabulary_id":1,"position":3,"term_key":"family","term_value":"F"} -{"vocabulary_id":2,"position":1,"term_key":"authorized_name","term_value":"AU"} -{"vocabulary_id":2,"position":2,"term_key":"parallel_name","term_value":"PA"} -{"vocabulary_id":2,"position":3,"term_key":"acronym","term_value":"AC"} -{"vocabulary_id":2,"position":4,"term_key":"other_name","term_value":"OT"} -{"vocabulary_id":3,"position":1,"term_key":"public","term_value":"PU"} -{"vocabulary_id":3,"position":2,"term_key":"private","term_value":"PR"} -{"vocabulary_id":3,"position":3,"term_key":"ecclesiastic","term_value":"EC"} -{"vocabulary_id":3,"position":3,"term_key":"not_applicable","term_value":"NA"} -{"vocabulary_id":4,"position":1,"term_key":"tel","term_value":"tel"} -{"vocabulary_id":4,"position":2,"term_key":"fax","term_value":"fax"} -{"vocabulary_id":4,"position":3,"term_key":"email","term_value":"email"} -{"vocabulary_id":5,"position":2,"term_key":"riordino","term_value":"riordino"} -{"vocabulary_id":5,"position":3,"term_key":"recupero","term_value":"recupero"} -{"vocabulary_id":5,"position":1,"term_key":"censimento","term_value":"censimento"} -{"vocabulary_id":6,"position":1,"term_key":"in_corso","term_value":"in corso"} -{"vocabulary_id":6,"position":2,"term_key":"concluso","term_value":"concluso"} -{"vocabulary_id":8,"position":1,"term_key":"project_managers","term_value":"PM"} -{"vocabulary_id":8,"position":2,"term_key":"project_stakeholders","term_value":"PS"} -{"vocabulary_id":9,"position":1,"term_key":"archive","term_value":"archivio"} -{"vocabulary_id":9,"position":2,"term_key":"aggregate_fonds","term_value":"complesso di fondi"} -{"vocabulary_id":9,"position":3,"term_key":"iperfond","term_value":"iperfondo"} -{"vocabulary_id":9,"position":4,"term_key":"fond","term_value":"fondo"} -{"vocabulary_id":9,"position":5,"term_key":"subfond","term_value":"subfondo"} -{"vocabulary_id":9,"position":6,"term_key":"section","term_value":"sezione"} -{"vocabulary_id":9,"position":7,"term_key":"subsection","term_value":"sottosezione"} -{"vocabulary_id":9,"position":8,"term_key":"partition","term_value":"partizione"} -{"vocabulary_id":9,"position":9,"term_key":"subpartition","term_value":"sottopartizione"} -{"vocabulary_id":9,"position":10,"term_key":"series","term_value":"serie"} -{"vocabulary_id":9,"position":11,"term_key":"subseries","term_value":"sottoserie"} -{"vocabulary_id":9,"position":12,"term_key":"subsubsection","term_value":"sottosottoserie"} -{"vocabulary_id":9,"position":13,"term_key":"part","term_value":"parte"} -{"vocabulary_id":9,"position":14,"term_key":"category","term_value":"categoria"} -{"vocabulary_id":9,"position":15,"term_key":"class","term_value":"classe"} -{"vocabulary_id":9,"position":16,"term_key":"subclass","term_value":"sottoclasse"} -{"vocabulary_id":9,"position":17,"term_key":"rubric","term_value":"rubrica"} -{"vocabulary_id":9,"position":18,"term_key":"voice","term_value":"voce"} -{"vocabulary_id":9,"position":19,"term_key":"subvoice","term_value":"sottovoce"} -{"vocabulary_id":9,"position":20,"term_key":"title","term_value":"titolo"} -{"vocabulary_id":9,"position":21,"term_key":"subtitle","term_value":"sottotitolo"} -{"vocabulary_id":9,"position":22,"term_key":"article","term_value":"articolo"} -{"vocabulary_id":10,"position":1,"term_key":"excellent","term_value":"ottimo"} -{"vocabulary_id":10,"position":2,"term_key":"good","term_value":"buono"} -{"vocabulary_id":10,"position":3,"term_key":"discreet","term_value":"discreto"} -{"vocabulary_id":10,"position":4,"term_key":"mediocre","term_value":"mediocre"} -{"vocabulary_id":10,"position":5,"term_key":"bad","term_value":"cattivo"} -{"vocabulary_id":10,"position":6,"term_key":"very_bad","term_value":"pessimo"} -{"vocabulary_id":11,"position":1,"term_key":"public","term_value":"PU"} -{"vocabulary_id":11,"position":2,"term_key":"private","term_value":"PR"} -{"vocabulary_id":12,"position":1,"term_key":"excellent","term_value":"ottimo"} -{"vocabulary_id":12,"position":2,"term_key":"good","term_value":"buono"} -{"vocabulary_id":12,"position":3,"term_key":"discreet","term_value":"discreto"} -{"vocabulary_id":12,"position":4,"term_key":"mediocre","term_value":"mediocre"} -{"vocabulary_id":12,"position":5,"term_key":"bad","term_value":"cattivo"} -{"vocabulary_id":12,"position":6,"term_key":"very_bad","term_value":"pessimo"} -{"vocabulary_id":13,"position":1,"term_key":"list","term_value":"registro o altra unità rilegata"} -{"vocabulary_id":13,"position":2,"term_key":"file","term_value":"fascicolo o altra unità complessa"} -{"vocabulary_id":13,"position":3,"term_key":"item","term_value":"unità documentaria"} -{"vocabulary_id":14,"position":1,"term_key":"humidity","term_value":"danni da umidità"} -{"vocabulary_id":14,"position":2,"term_key":"flood","term_value":"danni da alluvione"} -{"vocabulary_id":14,"position":3,"term_key":"rodents","term_value":"danni da roditori"} -{"vocabulary_id":14,"position":4,"term_key":"insects","term_value":"danni da insetti"} -{"vocabulary_id":14,"position":5,"term_key":"fire","term_value":"danni da incendio"} -{"vocabulary_id":14,"position":6,"term_key":"laceration","term_value":"lacerazione"} -{"vocabulary_id":14,"position":7,"term_key":"stain","term_value":"macchia"} -{"vocabulary_id":14,"position":8,"term_key":"mutilation","term_value":"mutilazione"} -{"vocabulary_id":14,"position":9,"term_key":"perforation","term_value":"perforazione"} -{"vocabulary_id":14,"position":10,"term_key":"folds","term_value":"piegature"} -{"vocabulary_id":14,"position":11,"term_key":"discoloration","term_value":"scoloritura"} -{"vocabulary_id":14,"position":12,"term_key":"crease","term_value":"sgualcitura"} -{"vocabulary_id":14,"position":13,"term_key":"fragile","term_value":"fragilità del supporto"} -{"vocabulary_id":14,"position":14,"term_key":"funghi_e_batteri","term_value":"funghi e batteri"} -{"vocabulary_id":14,"position":15,"term_key":"strappi","term_value":"strappi"} -{"vocabulary_id":14,"position":16,"term_key":"fogli_staccati","term_value":"fogli staccati"} -{"vocabulary_id":14,"position":17,"term_key":"ingiallimento","term_value":"ingiallimento della carta"} -{"vocabulary_id":14,"position":18,"term_key":"lacune","term_value":"lacune"} -{"vocabulary_id":14,"position":19,"term_key":"sbiadimento","term_value":"sbiadimento"} -{"vocabulary_id":14,"position":20,"term_key":"dispersione","term_value":"dispersione"} -{"vocabulary_id":14,"position":21,"term_key":"acidita","term_value":"acidità"} -{"vocabulary_id":14,"position":22,"term_key":"usura","term_value":"usura"} -{"vocabulary_id":14,"position":23,"term_key":"rottura_cuciture","term_value":"rottura delle cuciture"} -{"vocabulary_id":15,"position":1,"term_key":"authorized_name","term_value":"AU"} -{"vocabulary_id":15,"position":2,"term_key":"parallel_name","term_value":"PA"} -{"vocabulary_id":15,"position":3,"term_key":"acronym","term_value":"AC"} -{"vocabulary_id":15,"position":4,"term_key":"other_name","term_value":"OT"} -{"vocabulary_id":16,"position":1,"term_key":"sede_legale","term_value":"sede legale"} -{"vocabulary_id":16,"position":2,"term_key":"deposito","term_value":"deposito"} -{"vocabulary_id":16,"position":3,"term_key":"deposito_alternativo","term_value":"deposito alternativo"} -{"vocabulary_id":16,"position":4,"term_key":"sede_decentrata","term_value":"sede decentrata"} -{"vocabulary_id":16,"position":5,"term_key":"sede_consultazione","term_value":"sede di consultazione"} -{"vocabulary_id":16,"position":6,"term_key":"sede_per_la_didattica","term_value":"sede per la didattica"} -{"vocabulary_id":17,"position":1,"term_key":"liberamente_accessibile","term_value":"liberamente accessibile"} -{"vocabulary_id":17,"position":2,"term_key":"accessibile_previa_autorizzazione","term_value":"accessibile previa autorizzazione"} -{"vocabulary_id":17,"position":3,"term_key":"non_consultabile","term_value":"non consultabile"} -{"vocabulary_id":17,"position":4,"term_key":"parzialmente_accessibile","term_value":"parzialmente accessibile"} -{"vocabulary_id":18,"position":1,"term_key":"libera","term_value":"libera"} -{"vocabulary_id":18,"position":2,"term_key":"consentita_per_uso_studio","term_value":"consentita per uso studio"} -{"vocabulary_id":18,"position":3,"term_key":"a_pagamento","term_value":"a pagamento"} -{"vocabulary_id":18,"position":4,"term_key":"negata","term_value":"negata"} -{"vocabulary_id":19,"position":1,"term_key":"liberamente_accessibile","term_value":"liberamente accessibile"} -{"vocabulary_id":19,"position":2,"term_key":"accessibile_previa_autorizzazione","term_value":"accessibile previa autorizzazione"} -{"vocabulary_id":19,"position":3,"term_key":"non_consultabile","term_value":"non consultabile"} -{"vocabulary_id":19,"position":4,"term_key":"parzialmente_accessibile","term_value":"parzialmente accessibile"} -{"vocabulary_id":20,"position":1,"term_key":"libera","term_value":"libera"} -{"vocabulary_id":20,"position":2,"term_key":"consentita_per_uso_studio","term_value":"consentita per uso studio"} -{"vocabulary_id":20,"position":3,"term_key":"a_pagamento","term_value":"a pagamento"} -{"vocabulary_id":20,"position":4,"term_key":"negata","term_value":"negata"} -{"vocabulary_id":21,"position":1,"term_key":"level_file","term_value":"unità"} -{"vocabulary_id":21,"position":2,"term_key":"level_subfile","term_value":"sottounità"} -{"vocabulary_id":21,"position":3,"term_key":"level_subsubfile","term_value":"sottosottounità"} -{"vocabulary_id":22,"position":1,"term_key":"album","term_value":"album"} -{"vocabulary_id":22,"position":2,"term_key":"busta","term_value":"busta"} -{"vocabulary_id":22,"position":3,"term_key":"cartella","term_value":"cartella"} -{"vocabulary_id":22,"position":4,"term_key":"faldone","term_value":"faldone"} -{"vocabulary_id":22,"position":5,"term_key":"fascicolo","term_value":"fascicolo"} -{"vocabulary_id":22,"position":6,"term_key":"filza","term_value":"filza"} -{"vocabulary_id":22,"position":7,"term_key":"foglio","term_value":"foglio"} -{"vocabulary_id":22,"position":8,"term_key":"manifesto","term_value":"manifesto"} -{"vocabulary_id":22,"position":9,"term_key":"mappa","term_value":"mappa"} -{"vocabulary_id":22,"position":10,"term_key":"mazzo","term_value":"mazzo"} -{"vocabulary_id":22,"position":11,"term_key":"opuscolo","term_value":"opuscolo"} -{"vocabulary_id":22,"position":12,"term_key":"pacco","term_value":"pacco"} -{"vocabulary_id":22,"position":13,"term_key":"plico","term_value":"plico"} -{"vocabulary_id":22,"position":14,"term_key":"quaderno","term_value":"quaderno"} -{"vocabulary_id":22,"position":15,"term_key":"registro","term_value":"registro"} -{"vocabulary_id":22,"position":16,"term_key":"rivista","term_value":"rivista"} -{"vocabulary_id":22,"position":17,"term_key":"rotolo","term_value":"rotolo"} -{"vocabulary_id":22,"position":18,"term_key":"scatola","term_value":"scatola"} -{"vocabulary_id":22,"position":19,"term_key":"scheda","term_value":"scheda"} -{"vocabulary_id":22,"position":20,"term_key":"taccuino","term_value":"taccuino"} -{"vocabulary_id":22,"position":21,"term_key":"volume","term_value":"volume"} -{"vocabulary_id":23,"position":1,"term_key":"paper","term_value":"carta"} -{"vocabulary_id":23,"position":2,"term_key":"parchment","term_value":"pergamena"} -{"vocabulary_id":23,"position":2,"term_key":"linen_paper","term_value":"carta telata"} -{"vocabulary_id":23,"position":3,"term_key":"cardboard","term_value":"cartoncino"} -{"vocabulary_id":23,"position":4,"term_key":"film","term_value":"pellicola"} -{"vocabulary_id":23,"position":5,"term_key":"other","term_value":"altro"} -{"vocabulary_id":24,"position":1,"term_key":"corporate_body","term_value":"Ente"} -{"vocabulary_id":24,"position":2,"term_key":"person","term_value":"Persona"} -{"vocabulary_id":24,"position":3,"term_key":"family","term_value":"Famiglia"} -{"vocabulary_id":24,"position":4,"term_key":"geographic","term_value":"Toponimo"} -{"vocabulary_id":24,"position":5,"term_key":"other","term_value":"Altro"} -{"vocabulary_id":25,"position":1,"term_key":"aggiornamento_scheda","term_value":"aggiornamento scheda"} -{"vocabulary_id":25,"position":2,"term_key":"inserimento_dati","term_value":"inserimento dati"} -{"vocabulary_id":25,"position":3,"term_key":"integrazione_successiva","term_value":"integrazione successiva"} -{"vocabulary_id":25,"position":4,"term_key":"prima_redazione","term_value":"prima redazione"} -{"vocabulary_id":25,"position":5,"term_key":"revisione","term_value":"revisione"} -{"vocabulary_id":25,"position":6,"term_key":"rielaborazione","term_value":"rielaborazione"} -{"vocabulary_id":25,"position":7,"term_key":"schedatura","term_value":"schedatura"} -{"vocabulary_id":26,"position":1,"term_key":"image","term_value":"immagine"} -{"vocabulary_id":26,"position":2,"term_key":"text","term_value":"testo"} -{"vocabulary_id":26,"position":3,"term_key":"audio","term_value":"audio"} -{"vocabulary_id":26,"position":4,"term_key":"video","term_value":"video"} -{"vocabulary_id":5,"position":4,"term_key":"elenchi","term_value":"elenchi"} -{"vocabulary_id":6,"position":3,"term_key":"revisione","term_value":"revisione"} -{"vocabulary_id":6,"position":4,"term_key":"pubblicato","term_value":"pubblicato"} -{"vocabulary_id":7,"position":1,"term_key":"responsabile_scientifico","term_value":"responsabile scientifico"} -{"vocabulary_id":7,"position":2,"term_key":"responsabile_operativo","term_value":"responsabile operativo"} -{"vocabulary_id":7,"position":3,"term_key":"coordinatore","term_value":"coordinatore"} -{"vocabulary_id":7,"position":4,"term_key":"schedatore","term_value":"schedatore"} -{"vocabulary_id":27,"position":1,"term_key":"finanziamento","term_value":"finanziamento"} -{"vocabulary_id":27,"position":2,"term_key":"realizzazione","term_value":"realizzazione"} -{"vocabulary_id":27,"position":3,"term_key":"promozione","term_value":"promozione"} -{"vocabulary_id":27,"position":4,"term_key":"coordinamento_operativo","term_value":"coordinamento operativo"} +{"vocabulary_id":1,"position":1,"term_key":"corporate_body","term_value":"C"} +{"vocabulary_id":1,"position":2,"term_key":"person","term_value":"P"} +{"vocabulary_id":1,"position":3,"term_key":"family","term_value":"F"} +{"vocabulary_id":2,"position":2,"term_key":"parallel_name","term_value":"PA"} +{"vocabulary_id":2,"position":3,"term_key":"acronym","term_value":"AC"} +{"vocabulary_id":2,"position":4,"term_key":"other_name","term_value":"OT"} +{"vocabulary_id":2,"position":5,"term_key":"intestazione","term_value":"IN"} +{"vocabulary_id":2,"position":6,"term_key":"patronimico","term_value":"PT"} +{"vocabulary_id":2,"position":7,"term_key":"pseudonimo","term_value":"AL"} +{"vocabulary_id":2,"position":8,"term_key":"soprannome","term_value":"SN"} +{"vocabulary_id":3,"position":1,"term_key":"public","term_value":"PU"} +{"vocabulary_id":3,"position":2,"term_key":"private","term_value":"PR"} +{"vocabulary_id":3,"position":3,"term_key":"ecclesiastic","term_value":"EC"} +{"vocabulary_id":3,"position":3,"term_key":"not_applicable","term_value":"NA"} +{"vocabulary_id":4,"position":1,"term_key":"tel","term_value":"tel"} +{"vocabulary_id":4,"position":2,"term_key":"fax","term_value":"fax"} +{"vocabulary_id":4,"position":3,"term_key":"email","term_value":"email"} +{"vocabulary_id":4,"position":4,"term_key":"pec","term_value":"pec"} +{"vocabulary_id":4,"position":5,"term_key":"web","term_value":"web"} +{"vocabulary_id":5,"position":2,"term_key":"riordino","term_value":"riordino"} +{"vocabulary_id":5,"position":3,"term_key":"recupero","term_value":"recupero"} +{"vocabulary_id":5,"position":1,"term_key":"censimento","term_value":"censimento"} +{"vocabulary_id":6,"position":1,"term_key":"in_corso","term_value":"in corso"} +{"vocabulary_id":6,"position":2,"term_key":"concluso","term_value":"concluso"} +{"vocabulary_id":8,"position":1,"term_key":"project_managers","term_value":"PM"} +{"vocabulary_id":8,"position":2,"term_key":"project_stakeholders","term_value":"PS"} +{"vocabulary_id":9,"position":1,"term_key":"archive","term_value":"archivio"} +{"vocabulary_id":9,"position":2,"term_key":"aggregate_fonds","term_value":"complesso di fondi"} +{"vocabulary_id":9,"position":3,"term_key":"iperfond","term_value":"iperfondo"} +{"vocabulary_id":9,"position":4,"term_key":"fond","term_value":"fondo"} +{"vocabulary_id":9,"position":5,"term_key":"subfond","term_value":"subfondo"} +{"vocabulary_id":9,"position":6,"term_key":"section","term_value":"sezione"} +{"vocabulary_id":9,"position":7,"term_key":"subsection","term_value":"sottosezione"} +{"vocabulary_id":9,"position":8,"term_key":"partition","term_value":"partizione"} +{"vocabulary_id":9,"position":9,"term_key":"subpartition","term_value":"sottopartizione"} +{"vocabulary_id":9,"position":10,"term_key":"series","term_value":"serie"} +{"vocabulary_id":9,"position":11,"term_key":"subseries","term_value":"sottoserie"} +{"vocabulary_id":9,"position":12,"term_key":"subsubsection","term_value":"sottosottoserie"} +{"vocabulary_id":9,"position":13,"term_key":"part","term_value":"parte"} +{"vocabulary_id":9,"position":14,"term_key":"category","term_value":"categoria"} +{"vocabulary_id":9,"position":15,"term_key":"class","term_value":"classe"} +{"vocabulary_id":9,"position":16,"term_key":"subclass","term_value":"sottoclasse"} +{"vocabulary_id":9,"position":17,"term_key":"rubric","term_value":"rubrica"} +{"vocabulary_id":9,"position":18,"term_key":"voice","term_value":"voce"} +{"vocabulary_id":9,"position":19,"term_key":"subvoice","term_value":"sottovoce"} +{"vocabulary_id":9,"position":20,"term_key":"title","term_value":"titolo"} +{"vocabulary_id":9,"position":21,"term_key":"subtitle","term_value":"sottotitolo"} +{"vocabulary_id":9,"position":22,"term_key":"article","term_value":"articolo"} +{"vocabulary_id":10,"position":1,"term_key":"excellent","term_value":"ottimo"} +{"vocabulary_id":10,"position":2,"term_key":"good","term_value":"buono"} +{"vocabulary_id":10,"position":3,"term_key":"discreet","term_value":"discreto"} +{"vocabulary_id":10,"position":4,"term_key":"mediocre","term_value":"mediocre"} +{"vocabulary_id":10,"position":5,"term_key":"bad","term_value":"cattivo"} +{"vocabulary_id":10,"position":6,"term_key":"very_bad","term_value":"pessimo"} +{"vocabulary_id":11,"position":1,"term_key":"public","term_value":"PU"} +{"vocabulary_id":11,"position":2,"term_key":"private","term_value":"PR"} +{"vocabulary_id":12,"position":1,"term_key":"excellent","term_value":"ottimo"} +{"vocabulary_id":12,"position":2,"term_key":"good","term_value":"buono"} +{"vocabulary_id":12,"position":3,"term_key":"discreet","term_value":"discreto"} +{"vocabulary_id":12,"position":4,"term_key":"mediocre","term_value":"mediocre"} +{"vocabulary_id":12,"position":5,"term_key":"bad","term_value":"cattivo"} +{"vocabulary_id":12,"position":6,"term_key":"very_bad","term_value":"pessimo"} +{"vocabulary_id":13,"position":1,"term_key":"list","term_value":"registro o altra unità rilegata"} +{"vocabulary_id":13,"position":2,"term_key":"file","term_value":"fascicolo o altra unità complessa"} +{"vocabulary_id":13,"position":3,"term_key":"item","term_value":"unità documentaria"} +{"vocabulary_id":14,"position":1,"term_key":"humidity","term_value":"danni da umidità"} +{"vocabulary_id":14,"position":2,"term_key":"flood","term_value":"danni da alluvione"} +{"vocabulary_id":14,"position":3,"term_key":"rodents","term_value":"danni da roditori"} +{"vocabulary_id":14,"position":4,"term_key":"insects","term_value":"danni da insetti"} +{"vocabulary_id":14,"position":5,"term_key":"fire","term_value":"danni da incendio"} +{"vocabulary_id":14,"position":6,"term_key":"laceration","term_value":"lacerazione"} +{"vocabulary_id":14,"position":7,"term_key":"stain","term_value":"macchia"} +{"vocabulary_id":14,"position":8,"term_key":"mutilation","term_value":"mutilazione"} +{"vocabulary_id":14,"position":9,"term_key":"perforation","term_value":"perforazione"} +{"vocabulary_id":14,"position":10,"term_key":"folds","term_value":"piegature"} +{"vocabulary_id":14,"position":11,"term_key":"discoloration","term_value":"scoloritura"} +{"vocabulary_id":14,"position":12,"term_key":"crease","term_value":"sgualcitura"} +{"vocabulary_id":14,"position":13,"term_key":"fragile","term_value":"fragilità del supporto"} +{"vocabulary_id":14,"position":14,"term_key":"funghi_e_batteri","term_value":"funghi e batteri"} +{"vocabulary_id":14,"position":15,"term_key":"strappi","term_value":"strappi"} +{"vocabulary_id":14,"position":16,"term_key":"fogli_staccati","term_value":"fogli staccati"} +{"vocabulary_id":14,"position":17,"term_key":"ingiallimento","term_value":"ingiallimento della carta"} +{"vocabulary_id":14,"position":18,"term_key":"lacune","term_value":"lacune"} +{"vocabulary_id":14,"position":19,"term_key":"sbiadimento","term_value":"sbiadimento"} +{"vocabulary_id":14,"position":20,"term_key":"dispersione","term_value":"dispersione"} +{"vocabulary_id":14,"position":21,"term_key":"acidita","term_value":"acidità"} +{"vocabulary_id":14,"position":22,"term_key":"usura","term_value":"usura"} +{"vocabulary_id":14,"position":23,"term_key":"rottura_cuciture","term_value":"rottura delle cuciture"} +{"vocabulary_id":15,"position":2,"term_key":"parallel_name","term_value":"PA"} +{"vocabulary_id":15,"position":3,"term_key":"acronym","term_value":"AC"} +{"vocabulary_id":15,"position":4,"term_key":"other_name","term_value":"OT"} +{"vocabulary_id":16,"position":1,"term_key":"sede_legale","term_value":"sede legale"} +{"vocabulary_id":16,"position":2,"term_key":"deposito","term_value":"deposito"} +{"vocabulary_id":16,"position":3,"term_key":"deposito_alternativo","term_value":"deposito alternativo"} +{"vocabulary_id":16,"position":4,"term_key":"sede_decentrata","term_value":"sede decentrata"} +{"vocabulary_id":16,"position":5,"term_key":"sede_consultazione","term_value":"sede di consultazione"} +{"vocabulary_id":16,"position":6,"term_key":"sede_per_la_didattica","term_value":"sede per la didattica"} +{"vocabulary_id":17,"position":1,"term_key":"liberamente_accessibile","term_value":"liberamente accessibile"} +{"vocabulary_id":17,"position":2,"term_key":"accessibile_previa_autorizzazione","term_value":"accessibile previa autorizzazione"} +{"vocabulary_id":17,"position":3,"term_key":"non_consultabile","term_value":"non consultabile"} +{"vocabulary_id":17,"position":4,"term_key":"parzialmente_accessibile","term_value":"parzialmente accessibile"} +{"vocabulary_id":18,"position":1,"term_key":"libera","term_value":"libera"} +{"vocabulary_id":18,"position":2,"term_key":"consentita_per_uso_studio","term_value":"consentita per uso studio"} +{"vocabulary_id":18,"position":3,"term_key":"a_pagamento","term_value":"a pagamento"} +{"vocabulary_id":18,"position":4,"term_key":"negata","term_value":"negata"} +{"vocabulary_id":19,"position":1,"term_key":"liberamente_accessibile","term_value":"liberamente accessibile"} +{"vocabulary_id":19,"position":2,"term_key":"accessibile_previa_autorizzazione","term_value":"accessibile previa autorizzazione"} +{"vocabulary_id":19,"position":3,"term_key":"non_consultabile","term_value":"non consultabile"} +{"vocabulary_id":19,"position":4,"term_key":"parzialmente_accessibile","term_value":"parzialmente accessibile"} +{"vocabulary_id":20,"position":1,"term_key":"libera","term_value":"libera"} +{"vocabulary_id":20,"position":2,"term_key":"consentita_per_uso_studio","term_value":"consentita per uso studio"} +{"vocabulary_id":20,"position":3,"term_key":"a_pagamento","term_value":"a pagamento"} +{"vocabulary_id":20,"position":4,"term_key":"negata","term_value":"negata"} +{"vocabulary_id":21,"position":1,"term_key":"level_file","term_value":"unità"} +{"vocabulary_id":21,"position":2,"term_key":"level_subfile","term_value":"sottounità"} +{"vocabulary_id":21,"position":3,"term_key":"level_subsubfile","term_value":"sottosottounità"} +{"vocabulary_id":22,"position":1,"term_key":"album","term_value":"album"} +{"vocabulary_id":22,"position":2,"term_key":"busta","term_value":"busta"} +{"vocabulary_id":22,"position":3,"term_key":"cartella","term_value":"cartella"} +{"vocabulary_id":22,"position":4,"term_key":"faldone","term_value":"faldone"} +{"vocabulary_id":22,"position":5,"term_key":"fascicolo","term_value":"fascicolo"} +{"vocabulary_id":22,"position":6,"term_key":"filza","term_value":"filza"} +{"vocabulary_id":22,"position":7,"term_key":"foglio","term_value":"foglio"} +{"vocabulary_id":22,"position":8,"term_key":"manifesto","term_value":"manifesto"} +{"vocabulary_id":22,"position":9,"term_key":"mappa","term_value":"mappa"} +{"vocabulary_id":22,"position":10,"term_key":"mazzo","term_value":"mazzo"} +{"vocabulary_id":22,"position":11,"term_key":"opuscolo","term_value":"opuscolo"} +{"vocabulary_id":22,"position":12,"term_key":"pacco","term_value":"pacco"} +{"vocabulary_id":22,"position":13,"term_key":"plico","term_value":"plico"} +{"vocabulary_id":22,"position":14,"term_key":"quaderno","term_value":"quaderno"} +{"vocabulary_id":22,"position":15,"term_key":"registro","term_value":"registro"} +{"vocabulary_id":22,"position":16,"term_key":"rivista","term_value":"rivista"} +{"vocabulary_id":22,"position":17,"term_key":"rotolo","term_value":"rotolo"} +{"vocabulary_id":22,"position":18,"term_key":"scatola","term_value":"scatola"} +{"vocabulary_id":22,"position":19,"term_key":"scheda","term_value":"scheda"} +{"vocabulary_id":22,"position":20,"term_key":"taccuino","term_value":"taccuino"} +{"vocabulary_id":22,"position":21,"term_key":"volume","term_value":"volume"} +{"vocabulary_id":23,"position":1,"term_key":"paper","term_value":"carta"} +{"vocabulary_id":23,"position":2,"term_key":"parchment","term_value":"pergamena"} +{"vocabulary_id":23,"position":2,"term_key":"linen_paper","term_value":"carta telata"} +{"vocabulary_id":23,"position":3,"term_key":"cardboard","term_value":"cartoncino"} +{"vocabulary_id":23,"position":4,"term_key":"film","term_value":"pellicola"} +{"vocabulary_id":23,"position":5,"term_key":"other","term_value":"altro"} +{"vocabulary_id":24,"position":1,"term_key":"corporate_body","term_value":"Ente"} +{"vocabulary_id":24,"position":2,"term_key":"person","term_value":"Persona"} +{"vocabulary_id":24,"position":3,"term_key":"family","term_value":"Famiglia"} +{"vocabulary_id":24,"position":4,"term_key":"geographic","term_value":"Toponimo"} +{"vocabulary_id":24,"position":5,"term_key":"other","term_value":"Altro"} +{"vocabulary_id":25,"position":1,"term_key":"aggiornamento_scheda","term_value":"aggiornamento scheda"} +{"vocabulary_id":25,"position":2,"term_key":"inserimento_dati","term_value":"inserimento dati"} +{"vocabulary_id":25,"position":3,"term_key":"integrazione_successiva","term_value":"integrazione successiva"} +{"vocabulary_id":25,"position":4,"term_key":"prima_redazione","term_value":"prima redazione"} +{"vocabulary_id":25,"position":5,"term_key":"revisione","term_value":"revisione"} +{"vocabulary_id":25,"position":6,"term_key":"rielaborazione","term_value":"rielaborazione"} +{"vocabulary_id":25,"position":7,"term_key":"schedatura","term_value":"schedatura"} +{"vocabulary_id":26,"position":1,"term_key":"image","term_value":"immagine"} +{"vocabulary_id":26,"position":2,"term_key":"text","term_value":"testo"} +{"vocabulary_id":26,"position":3,"term_key":"audio","term_value":"audio"} +{"vocabulary_id":26,"position":4,"term_key":"video","term_value":"video"} +{"vocabulary_id":5,"position":4,"term_key":"elenchi","term_value":"elenchi"} +{"vocabulary_id":6,"position":3,"term_key":"revisione","term_value":"revisione"} +{"vocabulary_id":6,"position":4,"term_key":"pubblicato","term_value":"pubblicato"} +{"vocabulary_id":7,"position":1,"term_key":"responsabile_scientifico","term_value":"responsabile scientifico"} +{"vocabulary_id":7,"position":2,"term_key":"responsabile_operativo","term_value":"responsabile operativo"} +{"vocabulary_id":7,"position":3,"term_key":"coordinatore","term_value":"coordinatore"} +{"vocabulary_id":7,"position":4,"term_key":"schedatore","term_value":"schedatore"} +{"vocabulary_id":27,"position":1,"term_key":"finanziamento","term_value":"finanziamento"} +{"vocabulary_id":27,"position":2,"term_key":"realizzazione","term_value":"realizzazione"} +{"vocabulary_id":27,"position":3,"term_key":"promozione","term_value":"promozione"} +{"vocabulary_id":27,"position":4,"term_key":"coordinamento_operativo","term_value":"coordinamento operativo"} +{"vocabulary_id":28,"position":1,"term_key":"personal_file","term_value":"fascicolo personale"} +{"vocabulary_id":29,"position":1,"term_key":"corporate_body_anag","term_value":"Ente"} +{"vocabulary_id":29,"position":2,"term_key":"person_anag","term_value":"Persona"} +{"vocabulary_id":29,"position":3,"term_key":"family_anag","term_value":"Famiglia"} +{"vocabulary_id":29,"position":4,"term_key":"geographic_anag","term_value":"Toponimo"} +{"vocabulary_id":30,"position":1,"term_key":"approved","term_value":"approved"} +{"vocabulary_id":30,"position":2,"term_key":"rejected","term_value":"rejected"} \ No newline at end of file diff --git a/db/seeds/vocabularies.json b/db/seeds/vocabularies.json index b0b9575..4a83534 100644 --- a/db/seeds/vocabularies.json +++ b/db/seeds/vocabularies.json @@ -25,3 +25,6 @@ {"name":"editors.editing_type"} {"name":"digital_objects.digital_object_type"} {"name":"project_stakeholders.qualifier"} +{"name":"units.file_type"} +{"name":"anagraphics.anagraphic_type"} +{"name":"fe_operas.status"} \ No newline at end of file diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 0000000..c5210ff --- /dev/null +++ b/docker/README.md @@ -0,0 +1,216 @@ +Applicazioni Archimista/Archivista Dockerizzate +=============================================== + +Manuale per l'installazione e l'uso su personal computer o server (host) delle applicazioni dockerizzate di Archimista e Archivista. + + +Installazione Docker Engine e Docker compose +-------------------------------------------- + +- Su sistemi Windows o Mac installare Docker Desktop seguendo le istruzioni di: + - https://docs.docker.com/desktop/ + +- Su sistemi Linux: + - Installare la versione più recente di Docker Engine seguendo le istruzioni di: + - https://docs.docker.com/engine/install/ + + - Installare la versione più recente di Docker Compose seguendo le istruzioni di: + - https://docs.docker.com/compose/install/ + + + +Verifica dell'installazione di Docker Engine +-------------------------------------------- + +In una finestra di terminale o prompt dei comandi + +- per verificare la versione di Docker Client e Docker Engine installate, digitare: + + docker version + + +- per verificare la versione di Docker Compose installata, digitare: + + docker compose version (Windows) + + docker-compose version (Linux) + + +NOTA BENE: la sintassi dei comandi Docker Compose differisce per sistemi Windows e Linux + + Per sistemi Windows il comando base è: + + docker compose + + mentre per sistemi Linux è: + + docker-compose + + negli esempi che seguono si userà la sintassi Windows che, per sistemi Linux, dovrà essere adattata come sopra indicato + + + +Verifica del corretto funzionamento del Docker Engine +----------------------------------------------------- + +In una finestra di terminale o prompt dei comandi digitare: + + docker run hello-world + + se le prime righe dell'output a terminale sono le seguenti: + + Hello from Docker! + This message shows that your installation appears to be working correctly. + + allora Docker funziona correttamente sulla vostra macchina + + + +Operazioni preliminari all'avio del progetto dockerizzato +--------------------------------------------------------- + +- creare sulla macchina host una directory in cui dovrà essere copiato il file yaml per l'avvio del progetto Archimista/Archivista dockerizzato + + Es: mkdir dockerarchimista + +- copiare il file docker-compose.yml nella cartella appena creata + +- nel terminale spostarsi nella cartella appena creata + + Es: cd dockerarchimista + + +NOTA BENE: TUTTE le operazioni di installazione, avvio, stop e rimozione del progetto dockerizzato di seguito descritte dovranno essere effettuate digitando comandi in una finestra di terminale o prompt dei comandi mentre ci si trova nella directory di cui sopra + + + +Primo avvio del progetto Archimista/Archivista dockerizzato +----------------------------------------------------------- + +nel terminale digitare: + + docker compose up -d + + +NOTA BENE: durante il primo avvio vengono scaricate le immagini del progetto da Docker Hub (https://hub.docker.com/u/icar2021), vengono inoltre creati i container per l'esecuzione delle immagini e i volumi (dischi virtuali) per la persistenza dei dati, vengono infine avviati i server web e MySQL + +È necessario attendere qualche minuto perché tutte le operazioni vengano completate + + + +Inizializzazione del Database di Archimista +------------------------------------------- + +Per inizializzare il Database di Archimista digitare: + + docker compose exec web rake db:reset + + +NOTA BENE: + +- l'inizializzazione del database comporta la perdita dei dati presenti nel databasee di Archimista + +- se durante l'inizializzazione si ottengono messaggi d'errore, fra cui: + + # + + è possibile che il server di Database MySQL non sia ancora pronto ad accettare connessioni, per cui è necessario attendere qualche minuto prima di riprovare con il comando di inizializzazione del Database + + + +Accesso ad Archimista e Archivista via web +------------------------------------------ + +NOTA BENE: per impostazione predefinita il progetto Archimista/Archimista dockerizzato usa, rispettivamente, le porte TCP 80 e 8080 per servire gli applicativi web di Archimista e Archivista. +Queste porte devono essere libere e disponibili sulla macchina host per il corretto avvio del progetto. + +Puntare un browser web al localhost della macchina che ospita il progetto dockerizzato alle URL: + +- per Archimista: + + http://localhost + +- per Archivista: + + http://localhost:8080 + + + +Stop dei container +------------------ + +Per fermare l'esecuzione dei container docker e dei server web e MySQL digitare: + + docker compose stop + + +NOTA BENE: allo spegnimento della macchina host i container vengono fermati automaticamente + + + +Avvio dei container +------------------- + +Per avviare i container fermi digitare: + + docker compose start + + +NOTA BENE: per impostazione predefinita i container vengono avviati automaticamente dal Docker Engine all'avvio della macchina host + + + +Stop e rimozione dei container +------------------------------ + +Per fermare i container ed eliminarli digitare: + + docker compose down + + +NOTA BENE: la rimozione dei container non comporta la perdita dei dati (es: dati nel database) presenti nei volumi di storage persistente, né comporta la rimozione delle immagini Docker dall'host + + + +Nuova creazione dei container dopo la rimozione +----------------------------------------------- + +Per ricreare i container dopo la loro rimozione digitare: + + docker compose up -d + + +NOTA BENE: se in precedenza vi erano dati nei volumi di storage persistenti e se i volumi di storage non sono stati rimossi, allora i dati saranno recuperati. + + + +Eliminazione dei volumi di storage persistente +---------------------------------------------- + +Per ottenere la lista dei volumi di storage usati dal progetto digitare: + + docker volume ls + +Per cancellare un volume: + + docker volume rm + +Esempio: + + docker volume ls + + DRIVER VOLUME NAME + local dockerarchimista_app_public + local dockerarchimista_db + + + docker volume rm dockerarchimista_app_public + + docker volume rm dockerarchimista_db + + +NOTA BENE: + +- l'eliminazione dei volumi di storage è possibile solo dopo aver rimosso i container che li usano + +- l'eliminazione dei volumi di storage comporta la PERDITA DEI DATI memorizzati in Archimista (es: dati nel Database, oggetti digitali) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100755 index 0000000..335023e --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,36 @@ +version: "3.7" +services: + db: + image: icar2021/mysql:5.7_archimista + restart: always + environment: + MYSQL_DATABASE: 'archimista' + MYSQL_ROOT_PASSWORD: 'archipass' + volumes: + - db:/var/lib/mysql + web: + image: icar2021/archimista_web:2021-06-20a + restart: always + command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" + volumes: + - app_public:/usr/src/app/public + ports: + - "80:3000" + depends_on: + - db + web2: + image: icar2021/archivista_web:2021-06-20a + restart: always + environment: + # URL to Digital Ojects Server + DIGIT_OBJ_HOST_URL: http://localhost + # URL to Group Images Server + GROUP_IMAGES_HOST_URL: http://localhost + command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" + ports: + - "8080:3000" + depends_on: + - db +volumes: + db: + app_public: diff --git a/lib/archidate/has_archidate/validations.rb b/lib/archidate/has_archidate/validations.rb index 73feea3..09e9948 100644 --- a/lib/archidate/has_archidate/validations.rb +++ b/lib/archidate/has_archidate/validations.rb @@ -3,13 +3,13 @@ module Validations def at_most_one_preferred_event if self.class.cardinality == 'n' && events.select{|event| event.preferred}.size > 1 - errors.add_to_base :more_than_one_preferred_event + errors[:base] << :more_than_one_preferred_event end end def presence_of_preferred_event_if_events_present if self.class.cardinality == 'n' && events.present? && events.none?(&:preferred?) - errors.add_to_base :no_preferred_event_if_events_present + errors[:base] << :no_preferred_event_if_events_present end end diff --git a/lib/archidate/validations.rb b/lib/archidate/validations.rb index 2cd22d0..b76aa23 100644 --- a/lib/archidate/validations.rb +++ b/lib/archidate/validations.rb @@ -62,7 +62,7 @@ def no_future_end_date end def no_intersection - errors.add :start_date_from, :intersection if different_bounds? && has_intersection? + errors.add :start_date_from, :intersection if false && different_bounds? && has_intersection? end def no_inversion diff --git a/lib/exporter/Configurazione_dl.rb b/lib/exporter/Configurazione_dl.rb new file mode 100644 index 0000000..ac73376 --- /dev/null +++ b/lib/exporter/Configurazione_dl.rb @@ -0,0 +1,13 @@ +PROVIDER_DL = "ARC-ICAR" + +DL_FOND_ID="448" +DL_CONSERVATORE = "san.cat.sogC.0000" +DL_HACONSERVATORE="san.cat.sogC.4980" +DL_REPOSITORYID="GGASI:IC0300014497" +DL_ABBR="GGASI:IC0300014497" +DL_CORPNAME="Archivio di Stato di Prato" +DL_HAPROGETTO ="san.cat.prjDgt.447" +DL_HACOMPLESSO ="san.cat.complArch.113436" +DL_UNITID ="DATINI:san.cat.complArch.113436" +DL_UNITTITLE ="Carteggio, Archivio di Stato di Prato, Datini, Fondaco di Avignone, Carteggio diretto al fondaco da Aigues Mortes a Valenza" + diff --git a/lib/exporter/views/anagraphics/_anagraphic_ead.xml.builder b/lib/exporter/views/anagraphics/_anagraphic_ead.xml.builder new file mode 100644 index 0000000..c074e7e --- /dev/null +++ b/lib/exporter/views/anagraphics/_anagraphic_ead.xml.builder @@ -0,0 +1,87 @@ +sa_id_str = sprintf '%08d', anagraphic.id + +xml.control do + xml.recordId "SA-#{sa_id_str}" + identifiers = anagraphic.anag_identifiers + if identifiers.present? + identifiers.each do |identifier| + xml.otherRecordId identifier.identifier, :localType => CGI.escape(identifier.qualifier) + end + end + xml.maintenanceStatus "new" + xml.publicationStatus "approved" + xml.maintenanceAgency do + xml.agencyName PROVIDER + end + xml.languageDeclaration do + xml.language "Italian", :languageCode => "ita" + xml.script "Italian", :scriptCode => "Ital" + end + xml.conventionDeclaration do + xml.citation "http://dati.san.beniculturali.it/SAN/TesauroSAN/Tipo_luogo_CPF" + end + xml.conventionDeclaration do + xml.citation "http://dati.san.beniculturali.it/SAN/TesauroSAN/natura_giuridica_ente" + end + xml.conventionDeclaration do + xml.citation "http://dati.san.beniculturali.it/SAN/TesauroSAN/sottotipologia_ente" + end + xml.conventionDeclaration do + xml.citation "ISO 639-2" + end + xml.conventionDeclaration do + xml.citation "ISO 8601" + end + xml.conventionDeclaration do + xml.citation "ISO 15924" + end + xml.conventionDeclaration do + xml.citation "NIERA" + end + xml.conventionDeclaration do + xml.citation "ISAAR(CPF)" + end + xml.maintenanceHistory do + xml.maintenanceEvent do + xml.eventType "created" + xml.eventDateTime "" + xml.agentType "human" + xml.agent "" + end + end +end +xml.cpfDescription do + xml.identity do + xml.entityId "SA-#{sa_id_str}", :localType => "" + xml.entityType "person" + xml.nameEntry do + xml.part anagraphic.name, :localType => "nome" + xml.part anagraphic.surname, :localType => "cognome" + end + end + xml.description do + xml.existDates do + xml.dateRange :localType => "Data di esistenza" do + if anagraphic.start_date.present? + xml.fromDate anagraphic.start_date, :standardDate => anagraphic.start_date.strftime("%Y-%m-%d") + elsif + xml.fromDate "?" + end + if anagraphic.end_date.present? + xml.toDate anagraphic.end_date, :standardDate => anagraphic.end_date.strftime("%Y-%m-%d") + elsif + xml.toDate "-", :standardDate => "2099-12-31" + end + end + end + xml.place do + xml.placeRole "TesauroSAN/luogo di nascita", :vocabularySource => "http://dati.san.beniculturali.it/SAN/TesauroSAN/Tipo_luogo_CPF" + xml.placeEntry anagraphic.start_date_place.present? ? anagraphic.start_date_place : "non indicata" + end + xml.place do + xml.placeRole "TesauroSAN/luogo di morte", :vocabularySource => "http://dati.san.beniculturali.it/SAN/TesauroSAN/Tipo_luogo_CPF" + xml.placeEntry anagraphic.end_date_place.present? ? anagraphic.end_date_place : "non indicata" + end + end +end + diff --git a/lib/exporter/views/anagraphics/anagraphics_ead.xml.builder b/lib/exporter/views/anagraphics/anagraphics_ead.xml.builder new file mode 100644 index 0000000..26c4392 --- /dev/null +++ b/lib/exporter/views/anagraphics/anagraphics_ead.xml.builder @@ -0,0 +1,14 @@ +if (defined?(is_icar_import)).nil? or is_icar_import != true + xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" +end +xml.tag! "eac-cpf", { + :"xsi:schemaLocation" => "urn:isbn:1-931666-33-4 http://eac.staatsbibliothek-berlin.de/schema/cpf.xsd", + :"xmlns" => "urn:isbn:1-931666-33-4", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xmlns:xs" => "http://www.w3.org/2001/XMLSchema", + :"xmlns:xlink" => "http://www.w3.org/1999/xlink" +} do + records.each do |anagraphic| + xml << render(:partial => "anagraphic_ead.xml", :locals => {:anagraphic => anagraphic}) + end +end diff --git a/lib/exporter/views/creators/_catheader.xml.builder b/lib/exporter/views/creators/_catheader.xml.builder new file mode 100644 index 0000000..9f84c70 --- /dev/null +++ b/lib/exporter/views/creators/_catheader.xml.builder @@ -0,0 +1,11 @@ +xml.catheader do + xml.systemId "#{PROVIDER}" + xml.contact do + xml.name "INGLOBA360" + xml.mail "account@ingloba360.it" + end + xml.filedesc do + xml.title "Export da Archimista a SAN" + xml.date DateTime.now + end +end \ No newline at end of file diff --git a/lib/exporter/views/creators/_creator.xml.builder b/lib/exporter/views/creators/_creator.xml.builder new file mode 100644 index 0000000..905ccc6 --- /dev/null +++ b/lib/exporter/views/creators/_creator.xml.builder @@ -0,0 +1,108 @@ +related_fonds = creator.fonds.where(["fond_id IN (?)", fond_ids]) +xml.catRecord do + xml.catRecordHeader :type => "soggetto produttore" do + xml.id "SP-#{creator.id}" + xml.lastUpdate creator.updated_at.strftime("%Y-%m-%dT%H:%M:%S") + end + xml.catRecordBody do + xml.tag! "eac-cpf", :xmlns => "http://san.mibac.it/eac-san/" do + xml.control do + xml.otherRecordId "SP-#{creator.id}", :localType => "#{metadata['PROVIDER_DL']}" + xml.maintenanceStatus "scheda pubblicata" + xml.sources do + xml.source :"xlink:href" => "#{CREATORS_URL}/#{creator.id}" + end + end + + types = {"C" => "corporateBody", "P" => "person", "F" => "family"} + entityType = types[creator.creator_type] + + xml.cpfDescription do + xml.identity do + xml.entityType entityType + xml.nameEntry do + xml.part creator.preferred_name.name + end + + # NOTA: non implementato 06: "Forma parallela nel caso di bilinguismo" + creator.other_names.each do |other_name| + xml.nameEntry :localType => "altradenominazione" do + xml.part other_name.name + end + end + end + + xml.description do + xml.existDates do + xml.dateSet do + + if creator.preferred_event.present? + if creator.preferred_event.start_date_from.nil? + c_start_date = "00000101" + else + c_start_date = creator.preferred_event.start_date_from.strftime("%Y%m%d") + end + + if creator.preferred_event.end_date_to.nil? + c_end_date = "99991231" + else + c_end_date = creator.preferred_event.end_date_to.strftime("%Y%m%d") + end + + xml.date creator.preferred_event.full_display_date, { + :localType => "date di esistenza", + :standardDate => [c_start_date, c_end_date].uniq.join("/") + } + else + xml.date "non indicata", :standardDate => "00000101/99991231", :localType => "date di esistenza" + end + end + end + + # TODO: Persone - indicare luoghi di nascita e morte ? + if entityType == "corporateBody" + xml.placeDates do + xml.placeDate do + xml.place creator.residence.present? ? creator.residence : "non indicata" + xml.descriptiveNote "sede" + end + end + end + + # TODO: Persone - indicare activities ? + if entityType == "corporateBody" && creator.creator_corporate_type.present? + xml.descriptiveEntries do + xml.descriptiveEntry do + xml.term creator.creator_corporate_type.corporate_type + xml.descriptiveNote "tipologia ente" + end + end + end + + if creator.abstract.present? + xml.biogHist do + xml.abstract creator.abstract + end + end + end + + xml.relations do + related_fonds.each do |fond| + xml.resourceRelation :resourceRelationType => "creatorOf" do + xml.relationEntry "CA-#{fond.id}" + end + end + + creator.rel_creator_creators.each do |rel| + xml.cpfRelation :localType => rel.creator_association_type.association_type do + xml.relationEntry "SP-#{rel.related_creator_id}" + end + end + end + + end + end + end +end + + diff --git a/lib/exporter/views/creators/_creator_ead.xml.builder b/lib/exporter/views/creators/_creator_ead.xml.builder new file mode 100644 index 0000000..559c9a2 --- /dev/null +++ b/lib/exporter/views/creators/_creator_ead.xml.builder @@ -0,0 +1,338 @@ +xml.control do + sc_id_str = sprintf '%08d', creator.id + xml.recordId "SP-#{sc_id_str}" + identifiers = creator.creator_identifiers + if identifiers.present? + identifiers.each do |identifier| + xml.otherRecordId identifier.identifier, :localType => CGI.escape(identifier.identifier_source) + end + end + xml.maintenanceStatus "new" + xml.publicationStatus "approved" + xml.maintenanceAgency do + xml.agencyName PROVIDER + end + xml.languageDeclaration do + xml.language "Italian", :languageCode => "ita" + xml.script "Italian", :scriptCode => "Ital" + end + xml.conventionDeclaration do + xml.citation "http://dati.san.beniculturali.it/SAN/TesauroSAN/Tipo_luogo_CPF" + end + xml.conventionDeclaration do + xml.citation "http://dati.san.beniculturali.it/SAN/TesauroSAN/natura_giuridica_ente" + end + xml.conventionDeclaration do + xml.citation "http://dati.san.beniculturali.it/SAN/TesauroSAN/sottotipologia_ente" + end + xml.conventionDeclaration do + xml.citation "ISO 639-2" + end + xml.conventionDeclaration do + xml.citation "ISO 8601" + end + xml.conventionDeclaration do + xml.citation "ISO 15924" + end + xml.conventionDeclaration do + xml.citation "NIERA" + end + xml.conventionDeclaration do + xml.citation "ISAAR(CPF)" + end + xml.maintenanceHistory do + xml.maintenanceEvent do + xml.eventType "created" + xml.eventDateTime "" + xml.agentType "human" + xml.agent "" + end + + editors = creator.creator_editors + if editors.present? + event_types = { + "aggiornamento scheda" => "updated", + "inserimento dati" => "created", + "integrazione successiva" => "updated", + "prima redazione" => "created", + "revisione" => "revised", + "rielaborazione" => "revised", + "schedatura" => "created" + } + editors.each do |editor| + xml.maintenanceEvent do + if editor.editing_type.present? + editing_type = editor.editing_type.downcase + event_type = event_types.key?(editing_type) ? event_types[editing_type] : "unknown" + else + event_type = "unknown" + end + + if editor.edited_at.present? + edited_at = editor.edited_at.strftime("%Y-%m-%dT%H:%M:%S") + end + + xml.eventType event_type + if !edited_at.nil? + xml.eventDateTime edited_at, :standardDateTime => edited_at + elsif + xml.eventDateTime "" + end + xml.agentType "human" + xml.agent editor.name + xml.eventDescription editor.qualifier + end + end + end + end +end +xml.cpfDescription do + creator_type = creator.creator_type.downcase + xml.identity :localType => "soggettoProduttore" do + types = {"c" => "corporateBody", "p" => "person", "f" => "family"} + entityType = types[creator_type] + xml.entityType entityType + case creator_type + when 'c' + parallel_names = Array.new + creator.other_names.each do |other_name| + if other_name.qualifier.downcase == "pa" + parallel_name = a = {'id' => other_name.id, 'name' => other_name.name, 'note' => other_name.note} + parallel_names << parallel_name + end + end + if parallel_names.empty? + xml.nameEntry do + xml.part creator.preferred_name.name + end + else + xml.nameEntryParallel do + xml.nameEntry do + xml.part creator.preferred_name.name + end + parallel_names.each do |parallel_name| + xml.nameEntry do + xml.part parallel_name['name'], :"xml:lang" => parallel_name['note'] + end + end + end + end + creator.other_names.each do |other_name| + qualifiers = {"au" => "altraDenominazione", "pa" => "parallela", "ac" => "altraDenominazione", "ot" => "altraDenominazione"} + qualifier = qualifiers.key?(other_name.qualifier.downcase) ? qualifiers[other_name.qualifier.downcase] : "altraDenominazione" + if qualifier == "parallela" + next + else + xml.nameEntry do + xml.part other_name.name, :localType => qualifier + end + end + end + when 'p' + xml.nameEntry do + xml.part creator.preferred_name.name, :localType => "denominazione" + end + creator.other_names.each do |other_name| + xml.nameEntry do + xml.part other_name.name, :localType => "altraDenominazione" + end + end + when 'f' + xml.nameEntry do + xml.part creator.preferred_name.name + end + creator.other_names.each do |other_name| + xml.nameEntry do + xml.part other_name.name, :localType => "altraDenominazione" + end + end + end + end + xml.description do + case creator_type + when 'c' + if creator.preferred_event.present? + xml.existDates do + xml.dateRange :localType => "Data di esistenza" do + if creator.preferred_event.start_date_format != "O" + xml.fromDate creator.preferred_event.start_date_display, :standardDate => creator.preferred_event.start_date_from.strftime("%Y-%m-%d") + else + xml.fromDate creator.preferred_event.start_date_display, :standardDate => "2099" + creator.preferred_event.start_date_from.strftime("-%m-%d") + end + if creator.preferred_event.end_date_format != "O" + xml.toDate creator.preferred_event.end_date_display, :standardDate => creator.preferred_event.end_date_to.strftime("%Y-%m-%d") + else + xml.toDate creator.preferred_event.end_date_display, :standardDate => "2099" + creator.preferred_event.end_date_to.strftime("-%m-%d") + end + end + if creator.preferred_event.note.present? + xml.descriptiveNote do + xml.p creator.preferred_event.note + end + end + end + end + xml.place do + xml.placeRole "TesauroSAN/sede", :vocabularySource => "http://dati.san.beniculturali.it/SAN/TesauroSAN/Tipo_luogo_CPF" + xml.placeEntry creator.residence.present? ? creator.residence : "non indicata" + end + xml.localDescription :localType => "tipologiaEnte" do + corporate_types = { + "stato" => "TesauroSAN/statali", + "regione" => "TesauroSAN/regione-regione_a_statuto_speciale_sp", + "ente pubblico territoriale" => "TesauroSAN/ente_territoriale_minore", + "ente funzionale territoriale" => "TesauroSAN/ente_territoriale_minore", + "ente economico / impresa" => "TesauroSAN/ente_economico-impresa-studio_professionale_sp", + "ente di credito, assicurativo, previdenziale" => "TesauroSAN/banca-istituto_di_credito-ente_assicurativo-ente_previdenziale", + "ente di assistenza e beneficenza" => "TesauroSAN/opera_pia-istituzione_ed_ente_assistenza_e_beneficenza_ospedale", + "ente sanitario" => "TesauroSAN/ente_sanitario-ente_servizi_alla_persona", + "ente di istruzione e ricerca" => "TesauroSAN/scuola-ente_di_istruzione", + "ente di cultura, ricreativo, sportivo, turistico" => "TesauroSAN/accademia_ente_di_cultura", + "partito politico, organizzazione sindacale" => "TesauroSAN/partito_e_movimento_politico-associazione_politica", + "ordine professionale, associazione di categoria" => "TesauroSAN/arte_ordine_collegio_associazione_di_categoria", + "ente e associazione della chiesa cattolica" => "TesauroSAN/ente_culto_cattolico-associazione_cattolica", + "ente e associazione di culto acattolico" => "TesauroSAN/ente_di_culto_acattolico-associazione_acattolica", + "preunitario" => "TesauroSAN/organo_e_ufficio_statale_centrale_del_periodo_preunitario", + "organo giudiziario" => "TesauroSAN/statali", + "organo periferico dello stato" => "TesauroSAN/organo_e_ufficio_statale_periferico_di_periodo_postunitario", + "ente ecclesiastico" => "TesauroSAN/corporazione_religiosa" + } + + if creator.creator_corporate_type.nil? + ente_type = "" + else + ente_type = creator.creator_corporate_type.corporate_type.downcase + end + + corporate_type = corporate_types.key?(ente_type) ? corporate_types[ente_type] : "altro" + xml.term corporate_type, :vocabularySource => "http://dati.san.beniculturali.it/SAN/TesauroSAN/sottotipologia_ente" + end + when 'p' + if creator.preferred_event.present? + xml.existDates do + xml.dateRange do + if creator.preferred_event.start_date_format != "O" + xml.fromDate creator.preferred_event.start_date_display, :standardDate => creator.preferred_event.start_date_from.strftime("%Y-%m-%d") + else + xml.fromDate creator.preferred_event.start_date_display, :standardDate => "2099" + creator.preferred_event.start_date_from.strftime("-%m-%d") + end + if creator.preferred_event.end_date_format != "O" + xml.toDate creator.preferred_event.end_date_display, :standardDate => creator.preferred_event.end_date_from.strftime("%Y-%m-%d") + else + xml.toDate creator.preferred_event.end_date_display, :standardDate => "2099" + creator.preferred_event.end_date_from.strftime("-%m-%d") + end + end + end + if creator.preferred_event.start_date_place.present? + xml.place do + xml.placeRole "TesauroSAN/luogo di nascita", :vocabularySource => "http://dati.san.beniculturali.it/SAN/TesauroSAN/Tipo_luogo_CPF" + xml.placeEntry creator.preferred_event.start_date_place.present? ? creator.preferred_event.start_date_place : "non indicata" + end + end + if creator.preferred_event.end_date_place.present? + xml.place do + xml.placeRole "TesauroSAN/luogo di morte", :vocabularySource => "http://dati.san.beniculturali.it/SAN/TesauroSAN/Tipo_luogo_CPF" + xml.placeEntry creator.preferred_event.end_date_place.present? ? creator.preferred_event.end_date_place : "non indicata" + end + end + end + when 'f' + xml.existDates do + if creator.preferred_event.present? + xml.dateRange do + if creator.preferred_event.start_date_format != "O" + xml.fromDate creator.preferred_event.start_date_display, :standardDate => creator.preferred_event.start_date_from.strftime("%Y-%m-%d") + else + xml.fromDate creator.preferred_event.start_date_display, :standardDate => "2099" + creator.preferred_event.start_date_from.strftime("-%m-%d") + end + if creator.preferred_event.end_date_format != "O" + xml.toDate creator.preferred_event.end_date_display, :standardDate => creator.preferred_event.end_date_to.strftime("%Y-%m-%d") + else + xml.toDate creator.preferred_event.end_date_display, :standardDate => "2099" + creator.preferred_event.end_date_to.strftime("-%m-%d") + end + end + else + xml.dateRange do + xml.fromDate "non indicata", :standardDate => "0000-01-01" + xml.toDate "non indicata", :standardDate => "2099-12-31" + end + end + end + xml.place do + xml.placeRole "TesauroSAN/sede", :vocabularySource => "http://dati.san.beniculturali.it/SAN/TesauroSAN/Tipo_luogo_CPF" + xml.placeEntry "non indicato", :vocabularySource => "http://dati.san.beniculturali.it/ASI" + end + end + if creator.creator_legal_statuses.present? + status = {"PU" => "Pubblico", "PR" => "Privato", "EC" => "Ecclesiastico", "NA" => "Non definito"} + legalStatuses = creator.creator_legal_statuses + xml.legalStatuses do + legalStatuses.each do |ls| + xml.legalStatus do + xml.term status[ls.legal_status] + end + end + end + end + if creator.history.present? + xml.biogHist do + xml.abstract creator.history + end + end + end + + xml.relations do + related_institutions = creator.rel_creator_institutions + if related_institutions.present? + related_institutions.each do |institution| + xml.cpfRelation :cpfRelationType => "hierarchical", :"xlink:href" => "#{INSTITUTIONS_URL}/#{institution.institution_id}" do + pi_id_str = sprintf '%08d', institution.id + xml.relationEntry "PI-#{pi_id_str}", :localType => "profiloIstituzionale" + end + end + end + + related_creators = creator.rel_creator_creators + if related_creators.present? + related_creators.each do |related_creator| + xml.cpfRelation :cpfRelationType => "associative", :"xlink:href" => "#{CREATORS_URL}/#{related_creator.related_creator_id}" do + sp_id_str = sprintf '%08d', related_creator.related_creator_id + xml.relationEntry "SP-#{sp_id_str}", :localType => "soggettoProduttore" + end + end + end + + related_fonds = creator.fonds.where(["fond_id IN (?)", fond_ids]) + if related_fonds.present? + related_fonds.each do |fond| + xml.resourceRelation :resourceRelationType => "creatorOf", :"xlink:href" => "#{FONDS_URL}/#{fond.id}" do + ca_id_str = sprintf '%08d', fond.id + xml.relationEntry "CA-#{ca_id_str}", :localType => "complesso" + end + end + end + + creator_sources = creator.sources + if creator_sources.present? + creator_sources.each do |creator_source| + if creator_source.source_type_code == 1 + localType = "BIBTEXT" + else + localType = "FONTETEXT" + end + xml.resourceRelation :resourceRelationType => "other", :"xlink:href" => "#{SOURCES_URL}/#{creator_source.id}" do + xml.relationEntry creator_source.title, :localType => localType + end + end + end + + related_urls = creator.creator_urls + if related_urls.present? + related_urls.each do |url| + xml.resourceRelation :resourceRelationType => "other", :"xlink:href" => url.url do + xml.relationEntry url.note, :localType => "URI" + end + end + end + end +end diff --git a/lib/exporter/views/creators/creators.xml.builder b/lib/exporter/views/creators/creators.xml.builder new file mode 100644 index 0000000..0232d91 --- /dev/null +++ b/lib/exporter/views/creators/creators.xml.builder @@ -0,0 +1,21 @@ +xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" +xml.tag! "cat-import", { + :"xmlns" => "http://san.mibac.it/cat-import", + :"xmlns:eac-cpf" => "http://san.mibac.it/eac-san/", + :"xmlns:ead-complarc" => "http://san.mibac.it/ead-san/", + :"xmlns:ead-str" => "http://san.mibac.it/ricerca-san/", + :"xmlns:scons" => "http://san.mibac.it/scons-san/", + :"xmlns:xlink" => "http://www.w3.org/1999/xlink", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xsi:schemaLocation" => "http://san.mibac.it/cat-import http://www.san.beniculturali.it/tracciato/cat-import.xsd" +} do + + xml << render(:partial => "catheader.xml") + + xml.catListRecords do + records.each do |creator| + xml << render(:partial => "creator.xml", :locals => {:creator => creator, :fond_ids => fond_ids, :metadata => metadata}) + end + end + +end \ No newline at end of file diff --git a/lib/exporter/views/creators/creators_ead.xml.builder b/lib/exporter/views/creators/creators_ead.xml.builder new file mode 100644 index 0000000..84a6f4f --- /dev/null +++ b/lib/exporter/views/creators/creators_ead.xml.builder @@ -0,0 +1,17 @@ +if (defined?(is_icar_import)).nil? or is_icar_import != true + xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" +end +xml.tag! "eac-cpf", { + :"xsi:schemaLocation" => "urn:isbn:1-931666-33-4 http://eac.staatsbibliothek-berlin.de/schema/cpf.xsd", + :"xmlns" => "urn:isbn:1-931666-33-4", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xmlns:xs" => "http://www.w3.org/2001/XMLSchema", + :"xmlns:xlink" => "http://www.w3.org/1999/xlink" +} do + if (defined?(fond_ids)).nil? + fond_ids = Fond.roots.order(:name).map(&:id) + end + records.each do |creator| + xml << render(:partial => "creator_ead.xml", :locals => {:creator => creator, :fond_ids => fond_ids}) + end +end diff --git a/lib/exporter/views/custodians/_catheader.xml.builder b/lib/exporter/views/custodians/_catheader.xml.builder new file mode 100644 index 0000000..9f84c70 --- /dev/null +++ b/lib/exporter/views/custodians/_catheader.xml.builder @@ -0,0 +1,11 @@ +xml.catheader do + xml.systemId "#{PROVIDER}" + xml.contact do + xml.name "INGLOBA360" + xml.mail "account@ingloba360.it" + end + xml.filedesc do + xml.title "Export da Archimista a SAN" + xml.date DateTime.now + end +end \ No newline at end of file diff --git a/lib/exporter/views/custodians/_custodian.xml.builder b/lib/exporter/views/custodians/_custodian.xml.builder new file mode 100644 index 0000000..48f1213 --- /dev/null +++ b/lib/exporter/views/custodians/_custodian.xml.builder @@ -0,0 +1,49 @@ +xml.catRecord do + xml.catRecordHeader :type => "soggetto conservatore" do + xml.id "SC-#{custodian.id}" + xml.lastUpdate custodian.updated_at.strftime("%Y-%m-%dT%H:%M:%S") + end + xml.catRecordBody do + xml.scons :xmlns => "http://san.mibac.it/scons-san/" do + + xml.formaautorizzata custodian.preferred_name.name + # NOTA: non implementato 06: "Forma parallela nel caso di bilinguismo" + + #acronimo = custodian.other_names.first(:conditions => "qualifier = 'AC'") + acronimo = custodian.other_names.where("qualifier = 'AC'").first + xml.acronimo acronimo.name if acronimo.present? + + xml.identifier :href => "#{CUSTODIANS_URL}/#{custodian.id}" do + xml.recordId "SC-#{custodian.id}" + xml.sistemaId "#{metadata['PROVIDER_DL']}" + end + + tipologia = custodian.custodian_type.present? ? custodian.custodian_type.custodian_type : "non indicata" + xml.tipologia tipologia + + # OPTIMIZE: schiacciare localizzazioni doppie ? + # Oppure considerare solo "sede legale" (custodian_headquarter) ? ma non sempre è compilato... + custodian.custodian_buildings.each do |building| + if building.city.present? + city = building.city.chomp(')').split('(') + xml.tag! "localizzazione", {:comune => city[0].strip, :provincia => city[1], :cap => building.postcode, :paese => building.country}, building.address + end + end + + custodian.custodian_urls.each do |url| + xml.sitoweb :href => url.url + end + + xml.servizi custodian.services if custodian.services.present? + xml.descrizione custodian.history if custodian.history.present? + + # FIXME: il campo SAN "altroaccesso" (come "orario") ha come limite 1024 caratteri. Archimista non ha limite. + # Il superamento del limite blocca l'importazione in SAN, d'altra parte non conviene troncare l'html. + # SELECT id, char_length(accessibility) FROM custodians ORDER BY char_length(accessibility) desc; + # Che fare ? Per ora non si rileva il dato. + xml.altroaccesso "" # textilize(custodian.accessibility) + xml.consultazione "" + + end + end +end diff --git a/lib/exporter/views/custodians/_custodian_ead.xml.builder b/lib/exporter/views/custodians/_custodian_ead.xml.builder new file mode 100644 index 0000000..965001f --- /dev/null +++ b/lib/exporter/views/custodians/_custodian_ead.xml.builder @@ -0,0 +1,137 @@ +xml.tag! "scons", { + :"xsi:schemaLocation" => "http://www.san.beniculturali.it/scons2 http://www.san.beniculturali.it/tracciato/scons2.xsd", + :"xmlns" => "http://www.san.beniculturali.it/scons2", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xmlns:xlink" => "http://www.w3.org/1999/xlink" +} do + editors = custodian.custodian_editors + if !editors.empty? + xml.info do + event_types = { + "aggiornamento scheda" => "modifica", + "inserimento dati" => "creazione", + "integrazione successiva" => "modifica", + "prima redazione" => "creazione", + "revisione" => "modifica", + "rielaborazione" => "modifica", + "schedatura" => "altro" + } + editors.each do |editor| + if editor.edited_at.present? + event_date = editor.edited_at.strftime("%Y-%m-%dT%H:%M:%S") + else + event_date = "" + end + xml.evento :dataEvento => event_date, :tipoEvento => event_types[editor.editing_type.downcase] do + xml.agente :tipo => "persona" do + xml.cognome editor.name + end + end + end + end + end + xml.identificativi do + xml.identificativosistema PROVIDER + id_str = sprintf '%08d', custodian.id + xml.identificativo "SC-#{id_str}", :tipo => PROVIDER, :href => "#{CUSTODIANS_URL}/#{custodian.id}" + if custodian.custodian_identifiers.present? + custodian.custodian_identifiers.each do |identifier| + xml.altroidentificativo identifier.identifier, :tipo => identifier.identifier_source + end + end + end + xml.denominazione custodian.preferred_name.name, :qualifica => "principale" + if custodian.other_names.present? + qualifiers = {"au" => "altraDenominazione", "pa" => "parallela", "ac" => "acronimo", "ot" => "altraDenominazione"} + custodian.other_names.each do |other_name| + qualifica = qualifiers[other_name.qualifier.downcase] + if (qualifica == "parallela") + if (other_name.note.nil? || other_name.note.empty? || (other_name.note.downcase.match(/(a-z){3}/) == nil)) + lingua = "nnn" + else + lingua = other_name.note.downcase + end + xml.denominazione other_name.name, :qualifica => qualifica, :lingua => lingua + else + xml.denominazione other_name.name, :qualifica => qualifica + end + end + end + custodian_types = { + "stato" => "TesauroSAN/archivio_di_Stato", + "regione" => "TesauroSAN/regione-regione_a_statuto_speciale_conservatore", + "ente pubblico territoriale" => "TesauroSAN/ente_territoriale", + "ente funzionale territoriale" => "TesauroSAN/ente_diverso", + "ente economico / impresa" => "TesauroSAN/ente_economico-impresa-studio_professionale_conservatore", + "ente di credito, assicurativo, previdenziale" => "TesauroSAN/istituto_di_credito", + "ente di assistenza e beneficenza" => "TesauroSAN/ente_di_assistenza-beneficenza-previdenza-servizi_alla_persona", + "ente sanitario" => "TesauroSAN/ente_sanitario", + "ente di istruzione e ricerca" => "TesauroSAN/ente_di_cultura-ente_di_ricerca", + "ente di cultura, ricreativo, sportivo, turistico" => "TesauroSAN/ente_ricreativo-sportivo-turistico_conservatore", + "partito politico, organizzazione sindacale" => "TesauroSAN/sindacato-organizzazione_sindacale_conservatore", + "ordine professionale, associazione di categoria" => "TesauroSAN/arte-ordine-collegio-associazione_di_categoria", + "ente e associazione della chiesa cattolica" => "TesauroSAN/ente_e_associazione_di_culto_cattolico", + "ente e associazione di culto acattolico" => "TesauroSAN/ente_e_associazione_di_culti_acattolici", + "persona o famiglia" => "TesauroSAN/persona-famiglia" + } + custodian_type = custodian.custodian_type.present? ? custodian_types[custodian.custodian_type.custodian_type.downcase] : "altro" + xml.tipologia custodian_type + xml.localizzazioni do + if custodian.legal_status == "PU" + privato = "N" + else + privato = "S" + end + custodian.custodian_buildings.each_with_index do |custodian_building, i| + if i == 0 + principale = "S" + else + principale = "N" + end + if custodian_building.custodian_building_type == "sede di consultazione" + consultazione = "S" + else + consultazione = "N" + end + xml.localizzazione :identificativo => custodian_building.id, :principale => principale, :consultazione => consultazione, :privato => privato do + xml.denominazione custodian_building.name + attributes = {:paese => "ITA", :comune => custodian_building.city} + if custodian_building.postcode.present? + attributes[:cap] = custodian_building.postcode + end + if custodian_building.address.present? + attributes[:denominazioneStradale] = custodian_building.address + end + xml.indirizzo attributes + if (i < 1) + if custodian.custodian_contacts.present? + contact_types = {"tel" => "telefono", "fax" => "fax", "email" => "mail"} + custodian.custodian_contacts.each do |custodian_contacts| + contact_type = custodian_contacts.contact_type? ? contact_types[custodian_contacts.contact_type.downcase] : "altro" + xml.contatto custodian_contacts.contact, :tipo => contact_type + end + end + xml.orario custodian.accessibility + end + end + end + end + xml.descrizione custodian.history + xml.servizi custodian.services + xml.relazioni do + custodian.custodian_urls.each do |custodian_url| + xml.relazione (custodian_url.note.present? ? custodian_url.note : custodian_url.url), :tipo => "URL", :href => custodian_url.url + end + custodian.sources.each do |source| + if (source.source_type.code == 1) + xml.relazione source.title, :tipo => "BIBTEXT", :href => "#{SOURCES_URL}/#{source.id}" + else + xml.relazione source.title, :tipo => "FONTETEXT", :href => "#{SOURCES_URL}/#{source.id}" + end + end + custodian.fonds.each do |fond| + fond_id_str = sprintf '%08d', fond.id + xml.relazione "CA-#{fond_id_str}", :tipo => "COMPL", :href => "#{FONDS_URL}/#{fond.id}" + end + end +end diff --git a/lib/exporter/views/custodians/custodians.xml.builder b/lib/exporter/views/custodians/custodians.xml.builder new file mode 100644 index 0000000..4d8aafd --- /dev/null +++ b/lib/exporter/views/custodians/custodians.xml.builder @@ -0,0 +1,21 @@ +xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" +xml.tag! "cat-import", { + :"xmlns" => "http://san.mibac.it/cat-import", + :"xmlns:eac-cpf" => "http://san.mibac.it/eac-san/", + :"xmlns:ead-complarc" => "http://san.mibac.it/ead-san/", + :"xmlns:ead-str" => "http://san.mibac.it/ricerca-san/", + :"xmlns:scons" => "http://san.mibac.it/scons-san/", + :"xmlns:xlink" => "http://www.w3.org/1999/xlink", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xsi:schemaLocation" => "http://san.mibac.it/cat-import http://www.san.beniculturali.it/tracciato/cat-import.xsd" +} do + + xml << render(:partial => "catheader.xml") + + xml.catListRecords do + records.each do |custodian| + xml << render(:partial => "custodian.xml", :locals => {:custodian => custodian, :metadata => metadata}) + end + end + +end \ No newline at end of file diff --git a/lib/exporter/views/custodians/custodians_ead.xml.builder b/lib/exporter/views/custodians/custodians_ead.xml.builder new file mode 100644 index 0000000..52d75e1 --- /dev/null +++ b/lib/exporter/views/custodians/custodians_ead.xml.builder @@ -0,0 +1,6 @@ +if (defined?(is_icar_import)).nil? or is_icar_import != true + xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" +end +records.each do |custodian| + xml << render(:partial => "custodian_ead.xml", :locals => {:custodian => custodian}) +end diff --git a/lib/exporter/views/digital_objects/_digital_object.xml.builder b/lib/exporter/views/digital_objects/_digital_object.xml.builder new file mode 100644 index 0000000..5a3b563 --- /dev/null +++ b/lib/exporter/views/digital_objects/_digital_object.xml.builder @@ -0,0 +1,150 @@ +xml.tag! "envelope:record" do + +xml.tag! "envelope:recordHeader", :DIRECTIVE => "UPSERT" do + xml.tag! "envelope:recordIdentifier", "#{metadata['PROVIDER_DL']}-UA-#{unit.id}" + xml.tag! "envelope:recordDatestamp", Time.now.strftime("%Y-%m-%dT%H:%M:%S") +end + +xml.tag! "envelope:recordBody" do + xml.tag! "mets:mets" do + + custodians = unit.fond.root.custodians + + xml.tag! "mets:metsHdr", { + :CREATEDATE => Time.now.strftime("%Y-%m-%dT%H:%M:%S"), + :LASTMODDATE => Time.now.strftime("%Y-%m-%dT%H:%M:%S"), + :RECORDSTATUS => "Complete" + } do + + xml.tag! "mets:agent", :TYPE => "ORGANIZATION", :ROLE => "CREATOR" do + xml.tag! "mets:name", metadata['PROVIDER_DL'] + end + + xml.tag! "mets:agent", :TYPE => "ORGANIZATION", :ROLE => "IPOWNER" do + xml.tag! "mets:name", custodians.present? ? custodians[0].preferred_name.name : metadata['PROVIDER_DL'] + end + + xml.tag! "mets:altRecordID", "#{metadata['PROVIDER_DL']}:UA-#{unit.id}", :TYPE => metadata['PROVIDER_DL'] + + end + + xml.tag! "mets:dmdSec", :GROUPID => "desc", :ID => "ead-context-001" do + xml.tag! "mets:mdWrap", :MIMETYPE => "text/xml", :LABEL => "Contesto", :MDTYPE => "EAD", :MDTYPEVERSION => "Arch" do + xml.tag! "mets:xmlData" do + xml.tag! "ead-context:ead" do + xml.tag! "ead-context:archdesc" do + xml.tag! "ead-context:did" do + xml.tag! "ead-context:unitid", "#{metadata['DL_UNITID']}" + xml.tag! "ead-context:unittitle", "#{metadata['DL_UNITTITLE']}" + if custodians.present? + xml.tag! "ead-context:repository", :id => "#{metadata['DL_REPOSITORYID']}" do + xml.tag! "ead-context:corpname", "#{metadata['DL_CORPNAME']}" + xml.tag! "ead-context:abbr", "#{metadata['DL_ABBR']}" + end + end + end + end + end + end + end + end + + xml.tag! "mets:dmdSec", :GROUPID => "desc", :ID => "ead-desc-001" do + xml.tag! "mets:mdWrap", :MIMETYPE => "text/xml", :LABEL => "Descrizione oggetto", :MDTYPE => "EAD", :MDTYPEVERSION => "Arch" do + xml.tag! "mets:xmlData" do + xml.tag! "ead:c" do + xml.tag! "ead:did" do + xml.tag! "ead:unitid", "#{metadata['PROVIDER_DL']}:UA-#{unit.id}" + xml.tag! "ead:unittitle", unit.title + if unit.content.present? + xml.tag! "ead:abstract", unit.content + else + xml.tag! "ead:abstract", "" + end + if unit.preferred_event.present? + xml.tag! "ead:unitdate", unit.preferred_event.full_display_date, { + :normal => [unit.preferred_event.start_date_from.strftime("%Y%m%d"), unit.preferred_event.end_date_to.strftime("%Y%m%d")].uniq.join("/"), + :datechar => "principale" + } + else + xml.tag! "ead:unitdate", "non indicata", :normal => "00000101", :datechar => "non indicata" + end + xml.tag! "ead:physdesc" do + xml.tag! "ead:genreform", unit.unit_type, :type => "tipologie documentarie" + end + lingue = unit.unit_langs + if lingue.present? + lingue.each do |l| + xml.tag! "ead:langmaterial" do + xml.tag! "ead:language", :langcode => l.code + end + end + end + end + xml.tag! "ead:dao", :"xlink:href" => "#{FONDS_URL}/#{unit.fond.id}/units/#{unit.id}" + end + end + end + end + + xml.tag! "mets:dmdSec", :ID => "rel" do + xml.tag! "mets:mdWrap", :MIMETYPE => "text/xml", :LABEL => "Relazioni SAN", :MDTYPE => "OTHER", :OTHERMDTYPE => "RDF" do + xml.tag! "mets:xmlData" do + xml.tag! "rdf:RDF" do + xml.tag! "rdf:Description", :"rdf:about" => "#{metadata['PROVIDER_DL']}:UA-#{unit.id}" do + xml.tag! "san-dl:haSistemaAderente", :"rdf:resource" => metadata['PROVIDER_DL'] + xml.tag! "san-dl:haProgettoDigitalizzazione", :"rdf:resource" => metadata['DL_HAPROGETTO'] + xml.tag! "san-dl:haConservatore", :"rdf:resource" => metadata['DL_HACONSERVATORE'] + xml.tag! "san-dl:haComplesso", :"rdf:resource" => metadata['DL_HACOMPLESSO'] + end + end + end + end + end + + xml.tag! "mets:amdSec" do + xml.tag! "mets:rightsMD", :ID => "amdRD001" do + xml.tag! "mets:mdWrap", :MIMETYPE => "text/xml", :LABEL => "Diritti oggetto digitale", :MDTYPE => "METSRIGHTS" do + xml.tag! "mets:xmlData" do + xml.tag! "metsrights:RightsDeclarationMD", :RIGHTSCATEGORY => "COPYRIGHTED" do + xml.tag! "metsrights:RightsHolder" do + xml.tag! "metsrights:RightsHolderName", custodians.present? ? custodians[0].preferred_name.name : metadata['PROVIDER_DL'] + end + end + end + end + end + + xml.tag! "mets:rightsMD", :ID => "amdRA001" do + xml.tag! "mets:mdWrap", :MIMETYPE => "text/xml", :LABEL => "Diritti oggetto analogico", :MDTYPE => "METSRIGHTS" do + xml.tag! "mets:xmlData" do + xml.tag! "metsrights:RightsDeclarationMD", :RIGHTSCATEGORY => "COPYRIGHTED" do + xml.tag! "metsrights:RightsHolder" do + xml.tag! "metsrights:RightsHolderName", custodians.present? ? custodians[0].preferred_name.name : metadata['PROVIDER_DL'] + end + end + end + end + end + end + + xml.tag! "mets:fileSec" do + dob = unit.digital_objects.all.order(:position).first + dob_id_str = sprintf '%08d', dob.id + xml.tag! "mets:fileGrp", :USE => "thumbnail image" do + xml.tag! "mets:file", :MIMETYPE => "image/jpeg", :ID => "OD-#{dob_id_str}" do + xml.tag! "mets:FLocat", :LOCTYPE => "URL", + :"xlink:href" => "#{DIGITAL_OBJECTS_URL}/#{dob.access_token}/thumb.jpg" + end + end + xml.tag! "mets:fileGrp", :USE => "reference image" do + xml.tag! "mets:file", :MIMETYPE => "image/jpeg", :ID => "OD-#{dob_id_str}" do + xml.tag! "mets:FLocat", :LOCTYPE => "URL", :"xlink:href" => "#{DIGITAL_OBJECTS_URL}/#{dob.access_token}/original.jpg" + end + end + end + + end +end + +end diff --git a/lib/exporter/views/digital_objects/digital_objects.xml.builder b/lib/exporter/views/digital_objects/digital_objects.xml.builder new file mode 100644 index 0000000..cf69b22 --- /dev/null +++ b/lib/exporter/views/digital_objects/digital_objects.xml.builder @@ -0,0 +1,27 @@ +xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" +xml.tag! "envelope:envelope", { + :"xmlns:ead" => "http://san.mibac.it/ead-san-objdig/", + :"xmlns:ead-context" => "http://san.mibac.it/ead-san-objdig/context", + :"xmlns:ead-noarch" => "http://san.mibac.it/ead-san-objdig-noarch/", + :"xmlns:envelope" => "http://san.beniculturali.it/envelope-san/", + :"xmlns:mets" => "http://san.mibac.it/mets-san/", + :"xmlns:metsrights" => "http://san.mibac.it/metsrights-lite/", + :"xmlns:mix" => "http://san.mibac.it/mix-lite/", + :"xmlns:rdf" => "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + :"xmlns:san-dl" => "http://mibac.it/san/dl#", + :"xmlns:xlink" => "http://www.w3.org/1999/xlink", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xsi:schemaLocation" => "http://san.beniculturali.it/envelope-san/ http://san.beniculturali.it/tracciato/envelope-san.xsd" +} do + + xml.tag! "envelope:header", :CREATED => Time.now.strftime("%Y-%m-%dT%H:%M:%S") do + xml.tag! "envelope:source", metadata['PROVIDER_DL'] + end + + xml.tag! "envelope:recordList" do + records.each do |unit| + xml << render(:partial => "digital_object.xml", :locals => {:unit => unit, :metadata => metadata}) + end + end + +end \ No newline at end of file diff --git a/lib/exporter/views/fonds/_catheader.xml.builder b/lib/exporter/views/fonds/_catheader.xml.builder new file mode 100644 index 0000000..9f84c70 --- /dev/null +++ b/lib/exporter/views/fonds/_catheader.xml.builder @@ -0,0 +1,11 @@ +xml.catheader do + xml.systemId "#{PROVIDER}" + xml.contact do + xml.name "INGLOBA360" + xml.mail "account@ingloba360.it" + end + xml.filedesc do + xml.title "Export da Archimista a SAN" + xml.date DateTime.now + end +end \ No newline at end of file diff --git a/lib/exporter/views/fonds/_ead_fonds.xml.builder b/lib/exporter/views/fonds/_ead_fonds.xml.builder new file mode 100644 index 0000000..0fc4ada --- /dev/null +++ b/lib/exporter/views/fonds/_ead_fonds.xml.builder @@ -0,0 +1,230 @@ +unless fonds.empty? + fond_first_levels = { + "archivio" => "fonds", + "fondo" => "fonds", + "complesso di fondi" => "recordgrp", + "iperfondo" => "recordgrp", + "subfondo" => "subfonds", + "sezione" => "subfonds", + "partizione" => "subfonds", + "sottopartizione" => "subfonds", + "parte" => "subfonds", + "serie" => "series", + "sottoserie" => "subseries", + "sottosottoserie" => "subseries", + "sottosezione" => "otherlevel", + "categoria" => "otherlevel", + "classe" => "otherlevel", + "sottoclasse" => "otherlevel", + "rubrica" => "otherlevel", + "voce" => "otherlevel", + "sottovoce" => "otherlevel", + "titolo" => "otherlevel", + "sottotitolo" => "otherlevel", + "articolo" => "otherlevel" + } + + fonds.each do |fond| + ca_id_str = sprintf '%08d', fond.id + if !fond.fond_type.present? + tags = {:level => "fonds", :id => "CA-#{ca_id_str}"} + else + level = fond.fond_type + if (fond_first_levels[level] == "otherlevel") + tags = {:level => "otherlevel", :otherlevel => level, :id => "CA-#{ca_id_str}"} + else + tags = {:level => fond_first_levels[level], :id => "CA-#{ca_id_str}"} + end + end + xml.c tags do + xml.did do + xml.physdescstructured :physdescstructuredtype => "spaceoccupied", :coverage => "whole" do + xml.quantity fond.length.blank? ? "" : fond.length + xml.unittype fond.length.blank? ? "" : "ml" + if !fond.extent.blank? + xml.descriptivenote do + xml.p fond.extent + end + end + end + if (fond.ancestry_depth == 0) + fond_custodians = fond.custodians + if fond_custodians.count > 0 + xml.repository do + fond_custodians.each do |custodian| + id = custodian.custodian_identifiers.first + if id.nil? + sc_id_str = sprintf '%08d', custodian.id + xml.corpname :id => "SC-#{sc_id_str}" do + xml.part custodian.preferred_name.name + end + else + xml.corpname :identifier => id.identifier do + xml.part custodian.preferred_name.name + end + end + building = custodian.custodian_buildings.first + if !building.address.blank? + xml.address do + xml.addressline building.address + ", " + building.postcode + ", " + building.city + end + end + end + end + end + fond_creators = fond.creators + if fond_creators.count > 0 + xml.origination do + fond_creators.each do |creator| + id = creator.creator_identifiers.first + sp_id_str = sprintf '%08d', creator.id + case creator.creator_type + when 'C' + if id.nil? + xml.corpname :identifier => "SP-#{sp_id_str}" do + xml.part creator.preferred_name.name + end + else + xml.corpname :identifier => id.identifier do + xml.part creator.preferred_name.name + end + end + when 'P' + if id.nil? + xml.persname :identifier => "SP-#{sp_id_str}" do + xml.part creator.preferred_name.name + end + else + xml.persname :identifier => id.identifier do + xml.part creator.preferred_name.name + end + end + when 'F' + if id.nil? + xml.famname :identifier => "SP-#{sp_id_str}" do + xml.part creator.preferred_name.name + end + else + xml.famname :identifier => id.identifier do + xml.part creator.preferred_name.name + end + end + end + end + end + end + end + + fond.fond_identifiers.each do |id| + xml.unitid "CA-#{ca_id_str}", { :localtype => "#{fond.fond_type}", :repositorycode => "#{id.identifier}" } + end + + # Estensione 2018 + # Modifica + xml.unittitle fond.name, {:localtype => "Denominazione"} + other_names = fond.other_names + other_names.each do |on| + xml.unittitle on.name, {:localtype => "altreDenominazioni"} + end + + # Estensione 2018 + # Modifica + # Gestione delle date + periodo_data_secolare = [ + "inizio", + "fine", + "metà", + "prima metà", + "seconda metà", + "primo quarto", + "secondo quarto", + "terzo quarto", + "ultimo quarto" + ] + if fond.preferred_event.present? && fond.preferred_event.valid? + xml.unitdatestructured do + xml.dateset do + if (fond.preferred_event.start_date_from == fond.preferred_event.end_date_from) && (fond.preferred_event.start_date_to == fond.preferred_event.end_date_to) + if fond.preferred_event.start_date_from == fond.preferred_event.start_date_to + xml.datesingle fond.preferred_event.start_date_display, :standarddate => fond.preferred_event.start_date_from + else + xml.datesingle fond.preferred_event.start_date_display, :notbefore => fond.preferred_event.start_date_from, :notafter => fond.preferred_event.start_date_to + end + else + xml.daterange do + xml.fromdate fond.preferred_event.start_date_display, :standarddate => fond.preferred_event.start_date_from + xml.todate fond.preferred_event.end_date_display, :standarddate => fond.preferred_event.end_date_to + end + end + + xml.datesingle fond.preferred_event.note, {:localtype => "noteAllaData"} + end + end + end + end + if fond.access_condition.present? + xml.accessrestrict do + xml.p fond.access_condition_note + end + end + if fond.history.present? + xml.custodhist do + xml.p fond.history + end + end + + # Estensione 2018 + # Modifica + xml.processinfo do + xml.p "Pubblicata" + end + + # Estensione 2018 + # Aggiunta + # Compilatore della singola entità (compilatori - fond_editors) + fond_editors = fond.fond_editors + if (fond_editors.present?) + fond_editors_event_type = {"aggiornamento scheda" => "updated", "inserimento dati" => "created", + "integrazione successiva" => "updated", "prima redazione" => "created", + "revisione" => "revised", "rielaborazione" => "revised", "schedatura" => "created"} + xml.processinfo :localtype => "compilatori" do + fond_editors.each do |fe| + xml.processinfo :localtype => "compilatore" do + xml.p do + xml.persname do + xml.part fe.name, {:localtype => "compilatore"} + xml.part fe.qualifier, {:localtype => "qualifica"} + xml.part fond_editors_event_type[fe.editing_type], {:localtype => "tipoIntervento"} + end + xml.date fe.edited_at, {:localtype => "dataIntervento"} + end + end + end + end + end + + # Estensione 2018 + # Aggiunta + # Relazione con Tipologia Documentaria (profili documentari - document_forms) + fond_document_forms = fond.document_forms + if (fond_document_forms.present?) + xml.controlaccess do + fond_document_forms.each do |fdf| + xml.genreform do + xml.part fdf.name, { :localtype => "denominazione" } + xml.part fdf.description, { :localtype => "descrizione" } + xml.part fdf.note, { :localtype => "note" } + end + end + end + end + + if fond.description.present? + xml.scopecontent do + xml.p fond.description + end + end + xml << render(:partial => "ead_fonds.xml", :locals => { :fonds => fond.children.where("id != #{fond.id} AND trashed = 0").order(:sequence_number) } ) + end + end +end \ No newline at end of file diff --git a/lib/exporter/views/fonds/_fond.xml.builder b/lib/exporter/views/fonds/_fond.xml.builder new file mode 100644 index 0000000..67871cd --- /dev/null +++ b/lib/exporter/views/fonds/_fond.xml.builder @@ -0,0 +1,76 @@ +xml.catRecord do + xml.catRecordHeader :type => "complesso archivistico" do + xml.id "CA-#{fond.id}" + xml.lastUpdate fond.updated_at.strftime("%Y-%m-%dT%H:%M:%S") + end + xml.catRecordBody do + xml.ead :xmlns => "http://san.mibac.it/ead-san/" do + xml.archdesc :otherlevel => fond.fond_type, :level => "otherlevel" do + xml.did do + xml.unitid "CA-#{fond.id}", :type => "#{metadata['PROVIDER_DL']}", :identifier => "#{FONDS_URL}/#{fond.id}" + xml.unittitle fond.name, :type => "principale" + + if fond.other_names.present? + fond.other_names.each do |other_name| + xml.unittitle other_name.name + end + end + if fond.preferred_event.present? + xml.unitdate fond.preferred_event.full_display_date, { + :datechar => "principale", + :normal => [fond.preferred_event.start_date_from.strftime("%Y%m%d"), fond.preferred_event.end_date_to.strftime("%Y%m%d")].uniq.join("/") + } + else + xml.unitdate "non indicata", :normal => "00000101", :datechar => "non indicata" + end + + xml.physdesc do + tmp_string = "" + if fond.length.present? + tmp_string += "Metri lineari: #{fond.length}. " + end + if fond.extent.present? + tmp_string += fond.extent.squish + end + extent = tmp_string.present? ? tmp_string : "non indicata" + xml.extent extent + end + + if fond.abstract.present? + xml.abstract fond.abstract, :langcode => "it_IT" + elsif fond.description.present? + xml.abstract truncate(fond.description, length: 1500, separator: ' '), :langcode => "it_IT" + end + + if fond.creators.present? + fond.creators.each do |creator| + xml.origination "SP-#{creator.id}" + end + end + + custodians = fond.root.custodians + if custodians.present? + xml.repository custodians[0].preferred_name.name, :label => "#{metadata['PROVIDER_DL']}", :id => "SC-#{custodians[0].id}" + end + end + + xml.processinfo fond.published == true ? "scheda pubblicata" : "non indicato" + + xml.relatedmaterial do + xml.archref "CA-#{fond.root.id}" + end + + if fond.sources.present? + fond.sources.each do |source| + if source.source_type_code == 2 + xml.otherfindaid do + xml.extref "SR-#{source.id}" + end + end + end + end + + end + end + end +end \ No newline at end of file diff --git a/lib/exporter/views/fonds/_fond_desc_child_ii.xml.builder b/lib/exporter/views/fonds/_fond_desc_child_ii.xml.builder new file mode 100644 index 0000000..abe6195 --- /dev/null +++ b/lib/exporter/views/fonds/_fond_desc_child_ii.xml.builder @@ -0,0 +1,22 @@ +view = ActionView::Base.new(views_path("units")) +fond.units.where(ancestry: nil).order(:sequence_number).each do |unit| + xml << view.render(:file => "unit_ii.xml.builder", :locals => { + :unit => unit, + :view => view + }) +end + +fond.children.each do |children| + fond_type = fond_types.key?(children.fond_type) ? fond_types[children.fond_type] : "fonds" + if fond_type == "otherlevel" + attributes = {:level => fond_type, :otherlevel => children.fond_type} + else + attributes = {:level => fond_type} + end + xml.c attributes do + xml << render(:partial => "fond_desc_ii.xml", :locals => { + :fond_types => fond_types, + :fond => children + }) + end +end diff --git a/lib/exporter/views/fonds/_fond_desc_ii.xml.builder b/lib/exporter/views/fonds/_fond_desc_ii.xml.builder new file mode 100644 index 0000000..89a137d --- /dev/null +++ b/lib/exporter/views/fonds/_fond_desc_ii.xml.builder @@ -0,0 +1,180 @@ +xml.did do + ca2_id_str = sprintf '%08d', fond.id + xml.unitid "CA-#{ca2_id_str}", :identifier => "CA-#{ca2_id_str}" + fond.fond_identifiers.each do |identifier| + xml.unitid identifier.identifier, :localtype => identifier.identifier_source, :identifier => identifier.identifier + end + + xml.unittitle fond.name, {:localtype => "denominazione"} + fond.other_names.each do |on| + xml.unittitle on.name, {:localtype => "altreDenominazioni"} + end + + xml.physdescstructured :physdescstructuredtype => "spaceoccupied", :coverage => "whole" do + xml.quantity fond.length.blank? ? "" : fond.length + xml.unittype fond.length.blank? ? "" : "ml" + if !fond.extent.blank? + xml.descriptivenote do + xml.p fond.extent + end + end + end + + fond_custodians = fond.custodians + if fond_custodians.count > 0 + xml.repository do + fond_custodians.each do |custodian| + id = custodian.custodian_identifiers.first + if id.nil? + sc_id_str = sprintf '%08d', custodian.id + xml.corpname :id => "SC-#{sc_id_str}" do + xml.part custodian.preferred_name.name + end + else + xml.corpname :identifier => id.identifier do + xml.part custodian.preferred_name.name + end + end + building = custodian.custodian_buildings.first + if !building.address.blank? + xml.address do + xml.addressline building.address + ", " + building.postcode + ", " + building.city + end + end + end + end + end + + fond_creators = fond.creators + if fond_creators.count > 0 + xml.origination do + fond_creators.each do |creator| + id = creator.creator_identifiers.first + sp_id_str = sprintf '%08d', creator.id + case creator.creator_type + when 'C' + if id.nil? + xml.corpname :identifier => "SP-#{sp_id_str}" do + xml.part creator.preferred_name.name + end + else + xml.corpname :identifier => id.identifier do + xml.part creator.preferred_name.name + end + end + when 'P' + if id.nil? + xml.persname :identifier => "SP-#{sp_id_str}" do + xml.part creator.preferred_name.name + end + else + xml.persname :identifier => id.identifier do + xml.part creator.preferred_name.name + end + end + when 'F' + if id.nil? + xml.famname :identifier => "SP-#{sp_id_str}" do + xml.part creator.preferred_name.name + end + else + xml.famname :identifier => id.identifier do + xml.part creator.preferred_name.name + end + end + end + end + end + end + + if fond.preferred_event.present? && fond.preferred_event.valid? + xml.unitdatestructured do + xml.dateset do + if fond.preferred_event.start_date_from == fond.preferred_event.end_date_from && fond.preferred_event.start_date_to == fond.preferred_event.end_date_to + #datesingle + if fond.preferred_event.start_date_from == fond.preferred_event.start_date_to + xml.datesingle fond.preferred_event.start_date_display, { :standarddate => fond.preferred_event.start_date_from }.reject{ |k,v| v.nil? } + else + xml.datesingle fond.preferred_event.start_date_display, { :notbefore => fond.preferred_event.start_date_from, :notafter => fond.preferred_event.start_date_to }.reject{ |k,v| v.nil? } + end + else + #daterange + xml.daterange do + xml.fromdate fond.preferred_event.start_date_display, { :standarddate => fond.preferred_event.start_date_from }.reject{ |k,v| v.nil? } + xml.todate fond.preferred_event.end_date_display, { :standarddate => fond.preferred_event.end_date_to }.reject{ |k,v| v.nil? } + end + end + + xml.datesingle fond.preferred_event.note, {:localtype => "noteAllaData"} + end + end + end +end + +if fond.history.present? + xml.custodhist do + xml.p fond.history + end +end +if fond.description.present? + xml.scopecontent do + xml.p fond.description + end +end +if fond.access_condition.present? + xml.accessrestrict do + xml.p fond.access_condition_note + end +end + +xml.processinfo do + xml.p "Pubblicata" +end + +fond_editors = fond.fond_editors +if (fond_editors.present?) + fond_editors_event_type = {"aggiornamento scheda" => "updated", "inserimento dati" => "created", + "integrazione successiva" => "updated", "prima redazione" => "created", + "revisione" => "revised", "rielaborazione" => "revised", "schedatura" => "created"} + xml.processinfo :localtype => "compilatori" do + fond_editors.each do |fe| + xml.processinfo :localtype => "compilatore" do + xml.p do + xml.persname do + xml.part fe.name, {:localtype => "compilatore"} + xml.part fe.qualifier, {:localtype => "qualifica"} + xml.part fond_editors_event_type[fe.editing_type], {:localtype => "tipoIntervento"} + end + xml.date fe.edited_at, {:localtype => "dataIntervento"} + end + end + end + end +end + +fond_document_forms = fond.document_forms +if (fond_document_forms.present?) + xml.controlaccess do + fond_document_forms.each do |fdf| + xml.genreform do + xml.part fdf.name, { :localtype => "denominazione" } + xml.part fdf.description, { :localtype => "descrizione" } + xml.part fdf.note, { :localtype => "note" } + end + end + end +end + +if fond == fond.root + xml.dsc do + xml << render(:partial => "fond_desc_child_ii.xml", :locals => { + :fond_types => fond_types, + :fond => fond + }) + end +else + xml << render(:partial => "fond_desc_child_ii.xml", :locals => { + :fond_types => fond_types, + :fond => fond + }) +end diff --git a/lib/exporter/views/fonds/_fond_ead.xml.builder b/lib/exporter/views/fonds/_fond_ead.xml.builder new file mode 100644 index 0000000..590d0dc --- /dev/null +++ b/lib/exporter/views/fonds/_fond_ead.xml.builder @@ -0,0 +1,277 @@ +xml.control :repositoryencoding => "iso15511", + :countryencoding => "iso3166-1", + :dateencoding => "iso8601", + :scriptencoding => "iso15924", + :langencoding => "iso639-2b", + :relatedencoding => "ISAD(G)" do + xml.recordid fond.name, {:instanceurl => "#{FONDS_URL}/#{fond.id}"} + xml.filedesc do + xml.titlestmt do + xml.titleproper fond.name, {:encodinganalog => "title"} + end + end + xml.maintenancestatus :value => "new" + xml.maintenanceagency do + xml.agencyname "#{PROVIDER}" + end + xml.languagedeclaration do + xml.language :langcode => "ita" + xml.script :scriptcode => "Italian" + end + xml.conventiondeclaration do + xml.citation "SAN" + end + xml.maintenancehistory do + xml.maintenanceevent do + xml.eventtype :value => "created" + xml.eventdatetime "" + xml.agenttype :value => "human" + xml.agent "" + end + end + + # Estensione 2018 + # Modifica + # E' il contenuto dei vecchi tag ead..relations.relation + # Eliminati i document_forms + # Relazioni con una scheda o citazione bibliografica (fonti - sources) + # scheda bibliografica (source_type_code = 1) + # fonte a corredo (source_type_code = 2) + # fonte archivistica (source_type_code = 3) + # fonte normativa (source_type_code = 4) + fond_sources = fond.sources + if fond_sources.present? + xml.sources do + fond_sources.each do |fond_source| + sr_id_str = sprintf '%08d', fond_source.id + xml.source :id => "SR-#{sr_id_str}", :href => "#{SOURCES_URL}/#{fond_source.id}", :linkrole => "URL" do + xml.sourceentry fond_source.title + end + end + end + end +end + +fond_first_levels = { + "archivio" => "fonds", + "fondo" => "fonds", + "complesso di fondi" => "recordgrp", + "iperfondo" => "recordgrp", + "subfondo" => "subfonds", + "sezione" => "subfonds", + "partizione" => "subfonds", + "sottopartizione" => "subfonds", + "parte" => "subfonds", + "serie" => "series", + "sottoserie" => "subseries", + "sottosottoserie" => "subseries", + "sottosezione" => "otherlevel", + "categoria" => "otherlevel", + "classe" => "otherlevel", + "sottoclasse" => "otherlevel", + "rubrica" => "otherlevel", + "voce" => "otherlevel", + "sottovoce" => "otherlevel", + "titolo" => "otherlevel", + "sottotitolo" => "otherlevel", + "articolo" => "otherlevel" +} +fond_second_levels = {"fascicolo" => "file", "unità" => "item"} + +ca_id_str = sprintf '%08d', fond.id +if !fond.fond_type.present? + tags = {:level => "fonds", :id => "CA-#{ca_id_str}"} +else + level = fond.fond_type + if (fond_first_levels[level] == "otherlevel") + tags = {:level => "otherlevel", :otherlevel => level, :id => "CA-#{ca_id_str}"} + else + tags = {:level => fond_first_levels[level], :id => "CA-#{ca_id_str}"} + end +end + +xml.archdesc tags do + xml.did do + xml.physdescstructured :physdescstructuredtype => "spaceoccupied", :coverage => "whole" do + xml.quantity fond.length.blank? ? "" : fond.length + xml.unittype fond.length.blank? ? "" : "ml" + if !fond.extent.blank? + xml.descriptivenote do + xml.p fond.extent + end + end + end + + fond_custodians = fond.custodians + if fond_custodians.count > 0 + xml.repository do + fond_custodians.each do |custodian| + id = custodian.custodian_identifiers.first + if id.nil? + sc_id_str = sprintf '%08d', custodian.id + xml.corpname :id => "SC-#{sc_id_str}" do + xml.part custodian.preferred_name.name + end + else + xml.corpname :identifier => id.identifier do + xml.part custodian.preferred_name.name + end + end + building = custodian.custodian_buildings.first + if !building.address.blank? + xml.address do + xml.addressline building.address + ", " + building.postcode + ", " + building.city + end + end + end + end + end + + fond_creators = fond.creators + if fond_creators.count > 0 + xml.origination do + fond_creators.each do |creator| + id = creator.creator_identifiers.first + sp_id_str = sprintf '%08d', creator.id + case creator.creator_type + when 'C' + if id.nil? + xml.corpname :identifier => "SP-#{sp_id_str}" do + xml.part creator.preferred_name.name + end + else + xml.corpname :identifier => id.identifier do + xml.part creator.preferred_name.name + end + end + when 'P' + if id.nil? + xml.persname :identifier => "SP-#{sp_id_str}" do + xml.part creator.preferred_name.name + end + else + xml.persname :identifier => id.identifier do + xml.part creator.preferred_name.name + end + end + when 'F' + if id.nil? + xml.famname :identifier => "SP-#{sp_id_str}" do + xml.part creator.preferred_name.name + end + else + xml.famname :identifier => id.identifier do + xml.part creator.preferred_name.name + end + end + end + end + end + end + + fond.fond_identifiers.each do |id| + xml.unitid "CA-#{ca_id_str}", { :localtype => "#{fond.fond_type}", :repositorycode => "#{id.identifier}" } + end + + # Estensione 2018 + # Modifica + xml.unittitle fond.name, {:localtype => "Denominazione"} + other_names = fond.other_names + other_names.each do |on| + xml.unittitle on.name, {:localtype => "altreDenominazioni"} + end + + # Estensione 2018 + # Modifica + # Gestione delle date + if fond.preferred_event.present? && fond.preferred_event.valid? + xml.unitdatestructured do + xml.dateset do + #datesingle + if fond.preferred_event.start_date_from == fond.preferred_event.end_date_from && fond.preferred_event.start_date_to == fond.preferred_event.end_date_to + if fond.preferred_event.start_date_from == fond.preferred_event.start_date_to + xml.datesingle fond.preferred_event.start_date_display, { :standarddate => fond.preferred_event.start_date_from }.reject{ |k,v| v.nil? } + else + xml.datesingle fond.preferred_event.start_date_display, { :notbefore => fond.preferred_event.start_date_from, :notafter => fond.preferred_event.start_date_to }.reject{ |k,v| v.nil? } + end + #daterange + else + xml.daterange do + xml.fromdate fond.preferred_event.start_date_display, { :standarddate => fond.preferred_event.start_date_from }.reject{ |k,v| v.nil? } + xml.todate fond.preferred_event.end_date_display, { :standarddate => fond.preferred_event.end_date_to }.reject{ |k,v| v.nil? } + end + end + + xml.datesingle fond.preferred_event.note, {:localtype => "noteAllaData"} + end + end + end + end + if fond.history.present? + xml.custodhist do + xml.p fond.history + end + end + if fond.description.present? + xml.scopecontent do + xml.p fond.description + end + end + if fond.access_condition.present? + xml.accessrestrict do + xml.p fond.access_condition_note + end + end + + # Estensione 2018 + # Modifica + xml.processinfo do + xml.p "Pubblicata" + end + + # Estensione 2018 + # Aggiunta + # Compilatore della singola entità (compilatori - fond_editors) + fond_editors = fond.fond_editors + if (fond_editors.present?) + fond_editors_event_type = {"aggiornamento scheda" => "updated", "inserimento dati" => "created", + "integrazione successiva" => "updated", "prima redazione" => "created", + "revisione" => "revised", "rielaborazione" => "revised", "schedatura" => "created"} + xml.processinfo :localtype => "compilatori" do + fond_editors.each do |fe| + xml.processinfo :localtype => "compilatore" do + xml.p do + xml.persname do + xml.part fe.name, {:localtype => "compilatore"} + xml.part fe.qualifier, {:localtype => "qualifica"} + xml.part fond_editors_event_type[fe.editing_type], {:localtype => "tipoIntervento"} + end + xml.date fe.edited_at, {:localtype => "dataIntervento"} + end + end + end + end + end + + # Estensione 2018 + # Aggiunta + # Relazione con Tipologia Documentaria (profili documentari - document_forms) + fond_document_forms = fond.document_forms + if (fond_document_forms.present?) + xml.controlaccess do + fond_document_forms.each do |fdf| + xml.genreform do + xml.part fdf.name, { :localtype => "denominazione" } + xml.part fdf.description, { :localtype => "descrizione" } + xml.part fdf.note, { :localtype => "note" } + end + end + end + end + + xml.dsc do + if fond.has_children? + xml << render(:partial => "ead_fonds.xml", :locals => { :fonds => fond.children.where("id != #{fond.id} AND trashed = 0").order(:sequence_number) } ) + end + end +end diff --git a/lib/exporter/views/fonds/_fond_parent_ii.xml.builder b/lib/exporter/views/fonds/_fond_parent_ii.xml.builder new file mode 100644 index 0000000..f0c29f2 --- /dev/null +++ b/lib/exporter/views/fonds/_fond_parent_ii.xml.builder @@ -0,0 +1,48 @@ +if parents_id.empty? + fond_type = fond_types.key?(fond.fond_type) ? fond_types[fond.fond_type] : "fonds" + if fond_type == "otherlevel" + attributes = {:level => fond_type, :otherlevel => fond.fond_type} + else + attributes = {:level => fond_type} + end + xml.c attributes do + xml << render(:partial => "fond_desc_ii.xml", :locals => { + :fond_types => fond_types, + :fond => fond + }) + end +else + parent_id = parents_id.first + if parent_id == fond.root.id.to_s + parents_id.shift() + + xml << render(:partial => "fond_parent_ii.xml", :locals => { + :parents_id => parents_id, + :fond_types => fond_types, + :fond => fond + }) + else + parent_fond = Fond.find(parent_id) + parents_id.shift() + + fond_type = fond_types.key?(parent_fond.fond_type) ? fond_types[parent_fond.fond_type] : "fonds" + if fond_type == "otherlevel" + attributes = {:level => fond_type, :otherlevel => parent_fond.fond_type} + else + attributes = {:level => fond_type} + end + xml.c attributes do + xml.did do + pfa_id_str = sprintf '%08d', parent_fond.id + xml.unitid "CA-#{pfa_id_str}", :identifier => "CA-#{pfa_id_str}" + xml.unittitle parent_fond.name, :localtype => "denominazione" + end + + xml << render(:partial => "fond_parent_ii.xml", :locals => { + :parents_id => parents_id, + :fond_types => fond_types, + :fond => fond + }) + end + end +end diff --git a/lib/exporter/views/fonds/fonds.xml.builder b/lib/exporter/views/fonds/fonds.xml.builder new file mode 100644 index 0000000..c2ad395 --- /dev/null +++ b/lib/exporter/views/fonds/fonds.xml.builder @@ -0,0 +1,21 @@ +xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" +xml.tag! "cat-import", { + :"xmlns" => "http://san.mibac.it/cat-import", + :"xmlns:eac-cpf" => "http://san.mibac.it/eac-san/", + :"xmlns:ead-complarc" => "http://san.mibac.it/ead-san/", + :"xmlns:ead-str" => "http://san.mibac.it/ricerca-san/", + :"xmlns:scons" => "http://san.mibac.it/scons-san/", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xmlns:xlink" => "http://www.w3.org/1999/xlink", + :"xsi:schemaLocation" => "http://san.mibac.it/cat-import http://www.san.beniculturali.it/tracciato/cat-import.xsd" +} do + + xml << render(:partial => "catheader.xml") + + xml.catListRecords do + records.each do |fond| + xml << render(:partial => "fond.xml", :locals => {:fond => fond, :metadata => metadata}) + end + end + +end \ No newline at end of file diff --git a/lib/exporter/views/fonds/fonds_ead.xml.builder b/lib/exporter/views/fonds/fonds_ead.xml.builder new file mode 100644 index 0000000..69f67bc --- /dev/null +++ b/lib/exporter/views/fonds/fonds_ead.xml.builder @@ -0,0 +1,12 @@ +xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" + +xml.ead :"xsi:schemaLocation" => "http://ead3.archivists.org/schema/ http://www.san.beniculturali.it/tracciato/ead3.xsd", + :"xmlns" => "http://ead3.archivists.org/schema/", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xmlns:xlink" => "http://www.w3.org/1999/xlink" do + + records.each do |fond| + xml << render(:partial => "fond_ead.xml", :locals => {:fond => fond}) + end + +end diff --git a/lib/exporter/views/fonds/fonds_ii.xml.builder b/lib/exporter/views/fonds/fonds_ii.xml.builder new file mode 100644 index 0000000..faf2d02 --- /dev/null +++ b/lib/exporter/views/fonds/fonds_ii.xml.builder @@ -0,0 +1,104 @@ +xml.ead :"xsi:schemaLocation" => "http://ead3.archivists.org/schema/ http://www.san.beniculturali.it/tracciato/ead3.xsd", + :"xmlns" => "http://ead3.archivists.org/schema/", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xmlns:xlink" => "http://www.w3.org/1999/xlink" do + + xml.control :repositoryencoding => "iso15511", + :countryencoding => "iso3166-1", + :dateencoding => "iso8601", + :scriptencoding => "iso15924", + :langencoding => "iso639-2b", + :relatedencoding => "ISAD(G)" do + xml.recordid fond.name, {:instanceurl => "#{FONDS_URL}/#{fond.id}"} + xml.filedesc do + xml.titlestmt do + xml.titleproper fond.name, {:encodinganalog => "title"} + end + end + xml.maintenancestatus :value => "new" + xml.maintenanceagency do + xml.agencyname "#{PROVIDER}" + end + xml.languagedeclaration do + xml.language :langcode => "ita" + xml.script :scriptcode => "Italian" + end + xml.conventiondeclaration do + xml.citation "SAN" + end + xml.maintenancehistory do + xml.maintenanceevent do + xml.eventtype :value => "created" + xml.eventdatetime "" + xml.agenttype :value => "human" + xml.agent "" + end + end + + fond_sources = fond.sources + if fond_sources.present? + xml.sources do + fond_sources.each do |fond_source| + sr_id_str = sprintf '%08d', fond_source.id + xml.source :id => "SR-#{sr_id_str}", :href => "#{SOURCES_URL}/#{fond_source.id}", :linkrole => "URL" do + xml.sourceentry fond_source.title + end + end + end + end + end + + fond_types = { + "archivio" => "fonds", + "complesso di fondi" => "recordgrp", + "iperfondo" => "recordgrp", + "fondo" => "fonds", + "subfondo" => "subfonds", + "sezione" => "subfonds", + "sottosezione" => "otherlevel", + "partizione" => "subfonds", + "sottopartizione" => "subfonds", + "serie" => "series", + "sottoserie" => "subseries", + "sottosottoserie" => "subseries", + "parte" => "subfonds", + "categoria" => "otherlevel", + "classe" => "otherlevel", + "sottoclasse" => "otherlevel", + "rubrica" => "otherlevel", + "voce" => "otherlevel", + "sottovoce" => "otherlevel", + "titolo" => "otherlevel", + "sottotitolo" => "otherlevel", + "articolo" => "otherlevel" + } + root_fond_type = fond_types.key?(fond.root.fond_type) ? fond_types[fond.root.fond_type] : "fonds" + if root_fond_type == "otherlevel" + attributes = {:level => root_fond_type, :otherlevel => root_fond.fond_type} + else + attributes = {:level => root_fond_type} + end + xml.archdesc attributes do + if fond.ancestry.nil? + xml << render(:partial => "fond_desc_ii.xml", :locals => { + :fond_types => fond_types, + :fond => fond + }) + else + xml.did do + rf_id_str = sprintf '%08d', fond.root.id + xml.unitid "CA-#{rf_id_str}", :identifier => "CA-#{rf_id_str}" + xml.unittitle fond.root.name, :localtype => "denominazione" + end + + xml.dsc do + parents_id = fond.ancestry.split("/") + xml << render(:partial => "fond_parent_ii.xml", :locals => { + :parents_id => parents_id, + :fond_types => fond_types, + :fond => fond + }) + end + end + end +end diff --git a/lib/exporter/views/icar-import/icar-import.xml.builder b/lib/exporter/views/icar-import/icar-import.xml.builder new file mode 100644 index 0000000..9965039 --- /dev/null +++ b/lib/exporter/views/icar-import/icar-import.xml.builder @@ -0,0 +1,144 @@ +xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" +xml.tag! "icar-import:icar-import", { + :"xmlns:xlink" => "http://www.w3.org/1999/xlink", + :"xmlns:icar-import" => "http://www.san.beniculturali.it/icar-import", + :"xmlns:dc" => "http://purl.org/dc/elements/1.1/", + :"xmlns:ead" => "http://ead3.archivists.org/schema/", + :"xmlns:scons" => "http://www.san.beniculturali.it/scons", + :"xmlns:eac-cpf" => "urn:isbn:1-931666-33-4", + :"xmlns:mets" => "http://www.loc.gov/METS/", + :"xmlns:metsrights" => "http://cosimo.stanford.edu/sdr/metsrights/", + :"xmlns:mix" => "http://www.loc.gov/mix/v20", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xsi:schemaLocation" => "http://www.san.beniculturali.it/icar-import http://www.san.beniculturali.it/tracciato/icar-import.xsd" +} do + datetime = Time.now.strftime("%Y-%m-%dT%H:%M:%S") + xml.tag! "icar-import:header" do + xml.tag! "icar-import:systemId", PROVIDER + xml.tag! "icar-import:systemTitle", ICAR_IMPORT_SYSTEM_TITLE + xml.tag! "icar-import:contact" do + xml.tag! "icar-import:mail", ICAR_IMPORT_CONTACT_MAIL + end + xml.tag! "icar-import:event", {:eventType => "creation", :eventDate => datetime} do + xml.tag! "icar-import:agent", {:agentType => "software"}, "Archimista" + end + xml.tag! "icar-import:fileDesc" do + xml.tag! "icar-import:title", ICAR_IMPORT_FILE_DESC_TITLE + xml.tag! "icar-import:abstract", ICAR_IMPORT_FILE_DESC_ABSTRACT + xml.tag! "icar-import:date", datetime + end + end + xml.tag! "icar-import:listRecords" do + #EAD3 (complessi archivistici, unità archivistiche) + xml.tag! "icar-import:record" do + xml.tag! "icar-import:recordHeader", {:action => "insert", :groupEad => "single", :type => "ead3"} do + ca_id_str = sprintf '%08d', fond.id + xml.tag! "icar-import:id", "CA-#{ca_id_str}" + xml.tag! "icar-import:lastUpdate", fond.updated_at.strftime("%Y-%m-%dT%H:%M:%S") + end + xml.tag! "icar-import:recordBody" do + view = ActionView::Base.new(views_path("fonds")) + xml << view.render(:file => "fonds_ii.xml.builder", :locals => {:fond => fond}) + end + end + + #complessi coinvolti nell'esportazione + fonds_id = Array.new + fonds_id.push(fond.id) + if fond.ancestry.nil? + query = "ancestry LIKE '#{fond.id}/%' OR ancestry = '#{fond.id}'" + else + query = "ancestry LIKE '#{fond.ancestry}/%' OR ancestry = '#{fond.ancestry}'" + end + children_ids = Fond.where(query).pluck(:id) + fonds_id = fonds_id + children_ids + + #unità coinvolte nell'esportazione + units_id = Unit.where(fond_id: fonds_id).pluck(:id) + + #SCONS2 (soggetti conservatori) + custodians = Custodian.where(id: RelCustodianFond.where(fond_id: fond.root_id).pluck(:custodian_id)) + # è possibile definire il conservatore solo a livello di fondo radice, quindi nella query si specifica solo fond.root_id + custodians.each do |custodian| + xml.tag! "icar-import:record" do + xml.tag! "icar-import:recordHeader", {:action => "insert", :groupEad => "single", :type => "scons"} do + sc_id_str = sprintf '%08d', custodian.id + xml.tag! "icar-import:id", "SC-#{sc_id_str}" + xml.tag! "icar-import:lastUpdate", custodian.updated_at.strftime("%Y-%m-%dT%H:%M:%S") + end + xml.tag! "icar-import:recordBody" do + view = ActionView::Base.new(views_path("custodians")) + xml << view.render(:file => "custodians_ead.xml.builder", :locals => {:records => [custodian], :is_icar_import => true}) + end + end + end + + #EAC-CPF (soggetti produttori) + creators = Creator.where(id: RelCreatorFond.where(fond_id: fonds_id).pluck(:creator_id)) + creators_id = Array.new + creators.each do |creator| + creators_id.push(creator.id) + + xml.tag! "icar-import:record" do + xml.tag! "icar-import:recordHeader", {:action => "insert", :groupEad => "single", :type => "eac-cpf"} do + sp_id_str = sprintf '%08d', creator.id + xml.tag! "icar-import:id", "SP-#{sp_id_str}" + xml.tag! "icar-import:lastUpdate", creator.updated_at.strftime("%Y-%m-%dT%H:%M:%S") + end + xml.tag! "icar-import:recordBody" do + view = ActionView::Base.new(views_path("creators")) + xml << view.render(:file => "creators_ead.xml.builder", :locals => {:records => [creator], :is_icar_import => true}) + end + end + end + + #EAC-CPF (profili istituzionali) + institutions = Institution.where(id: RelCreatorInstitution.where(creator_id: creators_id).pluck(:institution_id)) + institutions.each do |institution| + xml.tag! "icar-import:record" do + xml.tag! "icar-import:recordHeader", {:action => "insert", :groupEad => "single", :type => "eac-cpf"} do + pi_id_str = sprintf '%08d', institution.id + xml.tag! "icar-import:id", "PI-#{pi_id_str}" + xml.tag! "icar-import:lastUpdate", institution.updated_at.strftime("%Y-%m-%dT%H:%M:%S") + end + xml.tag! "icar-import:recordBody" do + view = ActionView::Base.new(views_path("institutions")) + xml << view.render(:file => "institutions_ead.xml.builder", :locals => {:records => [institution], :is_icar_import => true}) + end + end + end + + #EAC-CPF (schede anagrafiche) + anagraphics = Anagraphic.where(id: RelUnitAnagraphic.where(unit_id: units_id).pluck(:anagraphic_id)) + anagraphics.each do |anagraphic| + xml.tag! "icar-import:record" do + xml.tag! "icar-import:recordHeader", {:action => "insert", :groupEad => "single", :type => "eac-cpf"} do + sa_id_str = sprintf '%08d', anagraphic.id + xml.tag! "icar-import:id", "SA-#{sa_id_str}" + xml.tag! "icar-import:lastUpdate", anagraphic.updated_at.strftime("%Y-%m-%dT%H:%M:%S") + end + xml.tag! "icar-import:recordBody" do + view = ActionView::Base.new(views_path("anagraphics")) + xml << view.render(:file => "anagraphics_ead.xml.builder", :locals => {:records => [anagraphic], :is_icar_import => true}) + end + end + end + + #EAD3 (fonti archivistiche) + sources_id = RelFondSource.where(fond_id: fonds_id).pluck(:source_id) + sources = Source.where(id: sources_id) + sources.each do |source| + xml.tag! "icar-import:record" do + xml.tag! "icar-import:recordHeader", {:action => "insert", :groupEad => "single", :type => "ead3"} do + sr_id_str = sprintf '%08d', source.id + xml.tag! "icar-import:id", "SR-#{sr_id_str}" + xml.tag! "icar-import:lastUpdate", source.updated_at.strftime("%Y-%m-%dT%H:%M:%S") + end + xml.tag! "icar-import:recordBody" do + view = ActionView::Base.new(views_path("sources")) + xml << view.render(:file => "sources_ead.xml.builder", :locals => {:records => [source], :is_icar_import => true}) + end + end + end + end +end diff --git a/lib/exporter/views/institutions/_institution_ead.xml.builder b/lib/exporter/views/institutions/_institution_ead.xml.builder new file mode 100644 index 0000000..6300e9c --- /dev/null +++ b/lib/exporter/views/institutions/_institution_ead.xml.builder @@ -0,0 +1,111 @@ +xml.control do + pi_id_str = sprintf '%08d', institution.id + xml.recordId "PI-#{pi_id_str}" + xml.maintenanceStatus "new" + xml.publicationStatus "approved" + xml.maintenanceAgency do + xml.agencyName PROVIDER + end + xml.languageDeclaration do + xml.language "Italian", :languageCode => "ita" + xml.script "Italian", :scriptCode => "Ital" + end + xml.conventionDeclaration do + xml.citation "http://dati.san.beniculturali.it/SAN/TesauroSAN/Tipo_luogo_CPF" + end + xml.conventionDeclaration do + xml.citation "http://dati.san.beniculturali.it/SAN/TesauroSAN/natura_giuridica_ente" + end + xml.conventionDeclaration do + xml.citation "http://dati.san.beniculturali.it/SAN/TesauroSAN/sottotipologia_ente" + end + xml.conventionDeclaration do + xml.citation "ISO 639-2" + end + xml.conventionDeclaration do + xml.citation "ISO 8601" + end + xml.conventionDeclaration do + xml.citation "ISO 15924" + end + xml.conventionDeclaration do + xml.citation "NIERA" + end + xml.conventionDeclaration do + xml.citation "ISAAR(CPF)" + end + xml.maintenanceHistory do + xml.maintenanceEvent do + xml.eventType "created" + xml.eventDateTime "" + xml.agentType "human" + xml.agent "" + end + + editors = institution.institution_editors + if editors.present? + event_types = { + "aggiornamento scheda" => "updated", + "inserimento dati" => "created", + "integrazione successiva" => "updated", + "prima redazione" => "created", + "revisione" => "revised", + "rielaborazione" => "revised", + "schedatura" => "created" + } + editors.each do |editor| + xml.maintenanceEvent do + if editor.editing_type.present? + editing_type = editor.editing_type.downcase + event_type = event_types.key?(editing_type) ? event_types[editing_type] : "unknown" + else + event_type = "unknown" + end + + if editor.edited_at.present? + edited_at = editor.edited_at.strftime("%Y-%m-%dT%H:%M:%S") + end + + xml.eventType event_type + if !edited_at.nil? + xml.eventDateTime edited_at, :standardDateTime => edited_at + elsif + xml.eventDateTime "" + end + xml.agentType "human" + xml.agent editor.name + xml.eventDescription editor.qualifier + end + end + end + end +end +xml.cpfDescription do + xml.identity :localType => "profiloIstituzionale" do + xml.entityType "corporateBody" + xml.nameEntry do + xml.part institution.name + end + end + if institution.description.present? + xml.description do + xml.biogHist do + xml.abstract institution.description + end + end + end + + query = "SELECT * FROM creators sc WHERE sc.id IN (SELECT rci.creator_id FROM rel_creator_institutions rci WHERE rci.institution_id = #{institution.id});" + creators = Creator.find_by_sql(query) + if creators.present? + xml.relations do + creators.each do |creator| + xml.cpfRelation :cpfRelationType => "hierarchical", :"xlink:href" => "#{CREATORS_URL}/#{creator.id}" do + sp_id_str = sprintf '%08d', creator.id + xml.relationEntry "SP-#{sp_id_str}", :localType => "soggettoProduttore" + end + end + end + end +end + diff --git a/lib/exporter/views/institutions/institutions_ead.xml.builder b/lib/exporter/views/institutions/institutions_ead.xml.builder new file mode 100644 index 0000000..a48fe9f --- /dev/null +++ b/lib/exporter/views/institutions/institutions_ead.xml.builder @@ -0,0 +1,14 @@ +if (defined?(is_icar_import)).nil? or is_icar_import != true + xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" +end +xml.tag! "eac-cpf", { + :"xsi:schemaLocation" => "urn:isbn:1-931666-33-4 http://eac.staatsbibliothek-berlin.de/schema/cpf.xsd", + :"xmlns" => "urn:isbn:1-931666-33-4", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xmlns:xs" => "http://www.w3.org/2001/XMLSchema", + :"xmlns:xlink" => "http://www.w3.org/1999/xlink" +} do + records.each do |institution| + xml << render(:partial => "institution_ead.xml", :locals => {:institution => institution}) + end +end diff --git a/lib/exporter/views/sources/_catheader.xml.builder b/lib/exporter/views/sources/_catheader.xml.builder new file mode 100644 index 0000000..9f84c70 --- /dev/null +++ b/lib/exporter/views/sources/_catheader.xml.builder @@ -0,0 +1,11 @@ +xml.catheader do + xml.systemId "#{PROVIDER}" + xml.contact do + xml.name "INGLOBA360" + xml.mail "account@ingloba360.it" + end + xml.filedesc do + xml.title "Export da Archimista a SAN" + xml.date DateTime.now + end +end \ No newline at end of file diff --git a/lib/exporter/views/sources/_source.xml.builder b/lib/exporter/views/sources/_source.xml.builder new file mode 100644 index 0000000..b209d3c --- /dev/null +++ b/lib/exporter/views/sources/_source.xml.builder @@ -0,0 +1,65 @@ +related_fonds = source.fonds +xml.catRecord do + xml.catRecordHeader :type => "strumento di ricerca" do + xml.id "SR-#{source.id}" + xml.lastUpdate source.updated_at.strftime("%Y-%m-%dT%H:%M:%S") + end + xml.catRecordBody do + xml.ead :xmlns => "http://san.mibac.it/ricerca-san/" do + xml.eadheader do + url = source.source_urls.present? ? source.source_urls[0].url : "" + xml.eadid "SR-#{source.id}", :identifier => "#{metadata['PROVIDER_DL']}", :URL => url + + xml.filedesc do + + # OPTIMIZE: raffinare titolo (o abstract) di articoli di rivista e simili + xml.titlestmt do + xml.author source.author if source.author.present? + xml.titleproper source.title + end + + xml.publicationstmt do + xml.date source.date_string + xml.address source.place if source.place.present? + xml.publisher source.publisher if source.publisher.present? + end + + # OPTIMIZE: decidere se raccogliere altre info, oltre a abstract. Direi di no. + # "i sistemi di provenienza potranno far confluire in questo elemento, per un massimo di 1500 caratteri, + # informazioni di natura diversa: + # a) descrizione dello strumento di ricerca; e/o + # b) tipologia dello strumento; + # c) la parte del fondo cui lo strumento si riferisce; + # d) altre informazioni pertinenti." + + if source.abstract.present? + type = source.finding_aid_published? ? {:type => "edito"} : "" + xml.notestmt do + xml.note source.abstract, type + end + end + + if source.source_urls.present? + xml.editionstmt do + source.source_urls.each do |source_url| + xml.edition do + xml.extptr :href => source_url.url, :title => "link" + end + end + end + end + + end + end + + xml.archdesc do + xml.did do + related_fonds.each do |fond| + xml.unitid "CA-#{fond.id}" + end + end + end + end + end +end + diff --git a/lib/exporter/views/sources/_source_ead.xml.builder b/lib/exporter/views/sources/_source_ead.xml.builder new file mode 100644 index 0000000..c6926e9 --- /dev/null +++ b/lib/exporter/views/sources/_source_ead.xml.builder @@ -0,0 +1,143 @@ +first_fond_level = nil + +xml.control do + sr_id_str = sprintf '%08d', source.id + xml.recordid "SR-#{sr_id_str}" + + # Estensione 2018 + # Aggiunta + # Relazione con una URL + if source.source_urls.present? + source.source_urls.each do |source_url| + xml.representation source_url.note, :href => source_url.url + end + end + + xml.filedesc do + xml.titlestmt do + xml.titleproper source.title + if source.author.present? + xml.author source.author, :localtype => "Author" + end + if source.editor.present? + xml.author source.editor, :localtype => "Curator" + end + end + + # Estensione 2018 + # Aggiunta + # Tipologia, Edito + xml.editionstmt do + xml.edition source.source_type.source_type, :localtype => "typology" + if (source.source_type.source_type == "strumento di corredo" && source.finding_aid_published == 1) + xml.edition "si", :localtype => "published" + else + xml.edition "no", :localtype => "published" + end + end + + # Estensione 2018 + # Modifica + # Modificato il valore del tag date + # Aggiunti i sottotag publisher e address + xml.publicationstmt do + if source.year.present? + xml.date source.year, {:localtype => "singledate", :normal => "AAAA"} + end + xml.publisher source.editor + xml.address do + xml.addressline source.place + end + end + + if source.abstract.present? + xml.notestmt do + xml.controlnote :localtype => "Notestoriche" do + xml.p source.abstract + end + end + end + end + xml.maintenancestatus :value => "new" + xml.publicationstatus :value => "published" + xml.maintenanceagency do + xml.agencyname PROVIDER + end + xml.languagedeclaration do + xml.language :langcode => "ita" + xml.script :scriptcode => "Italiano" + end + xml.conventiondeclaration do + xml.citation PROVIDER + end + + # Estensione 2018 + # Aggiunta + # Relazione con un complesso archivistico + fond_first_levels = { + "archivio" => "fonds", + "complesso di fondi" => "recordgrp", + "iperfondo" => "recordgrp", + "fondo" => "fonds", + "subfondo" => "subfonds", + "sezione" => "subfonds", + "sottosezione" => "otherlevel", + "partizione" => "subfonds", + "sottopartizione" => "subfonds", + "serie" => "series", + "sottoserie" => "subseries", + "sottosottoserie" => "subseries", + "parte" => "subfonds", + "categoria" => "otherlevel", + "classe" => "otherlevel", + "sottoclasse" => "otherlevel", + "rubrica" => "otherlevel", + "voce" => "otherlevel", + "sottovoce" => "otherlevel", + "titolo" => "otherlevel", + "sottotitolo" => "otherlevel", + "articolo" => "otherlevel" + } + first_fond_level_set = false + related_fonds = source.fonds.order(:id) + if related_fonds.present? + related_fonds.each do |fond| + if first_fond_level_set == false + if fond.fond_type.empty? + first_fond_level = "fonds" + else + level = fond.fond_type + if fond_first_levels[level].nil? + first_fond_level = "otherlevel" + else + first_fond_level = fond_first_levels[level] + end + end + first_fond_level_set = true + end + xml.localcontrol :localtype => "complArchCollegato" do + ca_id_str = sprintf '%08d', fond.id + xml.term fond.name, :identifier => "CA-#{ca_id_str}" + end + end + end + + xml.maintenancehistory do + xml.maintenanceevent do + xml.eventtype :value => "created" + xml.eventdatetime "" + xml.agenttype :value => "human" + xml.agent "" + end + end +end + +# Estensione 2018 +# Modifica +# Tag vuoto con l'indicazione del livello del complesso collegato. Se sono presenti più complessi va indicato il livello del primo. +xml.archdesc :level => first_fond_level do + xml.did do + xml.unittitle + end +end + diff --git a/lib/exporter/views/sources/sources.xml.builder b/lib/exporter/views/sources/sources.xml.builder new file mode 100644 index 0000000..2893982 --- /dev/null +++ b/lib/exporter/views/sources/sources.xml.builder @@ -0,0 +1,21 @@ +xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" +xml.tag! "cat-import", { + :"xmlns" => "http://san.mibac.it/cat-import", + :"xmlns:eac-cpf" => "http://san.mibac.it/eac-san/", + :"xmlns:ead-complarc" => "http://san.mibac.it/ead-san/", + :"xmlns:ead-str" => "http://san.mibac.it/ricerca-san/", + :"xmlns:scons" => "http://san.mibac.it/scons-san/", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xmlns:xlink" => "http://www.w3.org/1999/xlink", + :"xsi:schemaLocation" => "http://san.mibac.it/cat-import http://www.san.beniculturali.it/tracciato/cat-import.xsd" +} do + + xml << render(:partial => "catheader.xml") + + xml.catListRecords do + records.each do |source| + xml << render(:partial => "source.xml", :locals => {:source => source, :fond_ids => fond_ids, :metadata => metadata}) + end + end + +end \ No newline at end of file diff --git a/lib/exporter/views/sources/sources_ead.xml.builder b/lib/exporter/views/sources/sources_ead.xml.builder new file mode 100644 index 0000000..86a783c --- /dev/null +++ b/lib/exporter/views/sources/sources_ead.xml.builder @@ -0,0 +1,13 @@ +if (defined?(is_icar_import)).nil? or is_icar_import != true + xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" +end +xml.tag! "ead", { + :"xsi:schemaLocation" => "http://ead3.archivists.org/schema/ http://www.san.beniculturali.it/tracciato/ead3.xsd", + :"xmlns" => "http://ead3.archivists.org/schema/", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xmlns:xlink" => "http://www.w3.org/1999/xlink" +} do + records.each do |source| + xml << render(:partial => "source_ead.xml", :locals => {:source => source}) + end +end diff --git a/lib/exporter/views/units/_unit_child_ead.xml.builder b/lib/exporter/views/units/_unit_child_ead.xml.builder new file mode 100644 index 0000000..313de19 --- /dev/null +++ b/lib/exporter/views/units/_unit_child_ead.xml.builder @@ -0,0 +1,36 @@ +xml.did do + cua_id_str = sprintf '%08d', unit.id + + xml.unitid "UA-#{cua_id_str}", :identifier => "UA-#{cua_id_str}" + xml.unittitle unit.name, :localtype => "denominazione" +end + +if unit.has_children? + child_units = unit.children.where("id != #{unit.id}").order(:sequence_number) + child_units.each do |child_unit| + child_unit_type = unit_types["base_types"].key?(child_unit.unit_type) ? unit_types["base_types"][child_unit.unit_type] : "" + if child_unit_type == "registro" + child_file_type = child_unit_type + else + child_file_type = unit_types["file_types"].key?(child_unit.file_type) ? unit_types["file_types"][child_unit.file_type] : nil + end + child_sc2_tsk = unit_types["sc2_tsks"].key?(child_unit.sc2_tsk) ? unit_types["sc2_tsks"][child_unit.sc2_tsk] : nil + + if child_file_type.nil? and child_sc2_tsk.nil? + attributes = {:level => child_unit_type} + else + if !child_file_type.nil? + otherlevel = child_file_type + else + otherlevel = child_sc2_tsk + end + attributes = {:level => "otherlevel", :otherlevel => otherlevel} + end + xml.c attributes do + xml << render(:partial => "unit_child_ead.xml", :locals => { + :unit => child_unit, + :unit_types => unit_types + }) + end + end +end diff --git a/lib/exporter/views/units/_unit_desc_ead.xml.builder b/lib/exporter/views/units/_unit_desc_ead.xml.builder new file mode 100644 index 0000000..9327ecd --- /dev/null +++ b/lib/exporter/views/units/_unit_desc_ead.xml.builder @@ -0,0 +1,28 @@ +unit_type = unit_types["base_types"].key?(unit.unit_type) ? unit_types["base_types"][unit.unit_type] : "" +if unit_type == "registro" + file_type = unit_type +else + file_type = unit_types["file_types"].key?(unit.file_type) ? unit_types["file_types"][unit.file_type] : nil +end +sc2_tsk = unit_types["sc2_tsks"].key?(unit.sc2_tsk) ? unit_types["sc2_tsks"][unit.sc2_tsk] : nil + +if file_type.nil? and sc2_tsk.nil? + if unit_type.empty? + unit_type = "otherlevel" + end + attributes = {:level => unit_type} +else + if !file_type.nil? + otherlevel = file_type + else + otherlevel = sc2_tsk + end + attributes = {:level => "otherlevel", :otherlevel => otherlevel} +end +xml.c attributes do + xml << render(:partial => "unit_desc_inside_ead.xml", :locals => { + :unit => unit, + :unit_types => unit_types, + :sequence_numbers => sequence_numbers + }) +end \ No newline at end of file diff --git a/lib/exporter/views/units/_unit_desc_inside_ead.xml.builder b/lib/exporter/views/units/_unit_desc_inside_ead.xml.builder new file mode 100644 index 0000000..9fd9441 --- /dev/null +++ b/lib/exporter/views/units/_unit_desc_inside_ead.xml.builder @@ -0,0 +1,676 @@ + sequence_number = sequence_numbers[unit.id] + + xml.did do + ua_id_str = sprintf '%08d', unit.id + xml.unitid "UA-#{ua_id_str}", :identifier => "UA-#{ua_id_str}" + xml.unitid sequence_number, :localtype => "numeroOrdinamento" + xml.unitid unit.tmp_reference_number, :localtype => "segnaturaProvvisoria", :label => "numero" + xml.unitid unit.tmp_reference_string, :localtype => "segnaturaProvvisoria", :label => "testo" + xml.unitid unit.folder_number, :localtype => "busta" + xml.unitid unit.file_number, :localtype => "numFascicolo" + xml.unitid unit.reference_number, :localtype => "segnaturaAttuale" + + if unit.unit_identifiers.present? + unit.unit_identifiers.each do |identifier| + xml.unitid identifier.identifier, :localtype => identifier.identifier_source, :identifier => identifier.identifier + end + end + + #fascicolo edilizio + if (unit.unit_type == "fascicolo o altra unità complessa") && (unit.file_type == "fascicolo di edilizia") + classificazione = "" + codice = "" + categoria = "" + classe = "" + fascicolo = "" + subfascicolo = "" + anno = "" + + contexts = unit.fe_contexts + if contexts.any? + ufc = contexts[0] + + classificazione = ufc.classification + fascicolo = ufc.number + subfascicolo = ufc.sub_number + end + + identifications = unit.fe_identifications + if contexts.any? + ufi = identifications[0] + + codice = ufi.code + categoria = ufi.category + classe = ufi.identification_class + anno = ufi.file_year + end + + xml.unitid classificazione, :localtype => "classificazione", :identifier => classificazione + xml.unitid codice, :localtype => "codice", :identifier => classificazione + xml.unitid categoria, :localtype => "categoria", :identifier => classificazione + xml.unitid classe, :localtype => "classe", :identifier => classificazione + xml.unitid fascicolo, :localtype => "fascicolo", :identifier => classificazione + xml.unitid subfascicolo, :localtype => "subfascicolo", :identifier => classificazione + xml.unitid anno, :localtype => "anno", :identifier => classificazione + end + xml.unittitle unit.name, :localtype => "denominazione" + + periodo_data_secolare = [ + "inizio", + "fine", + "metà", + "prima metà", + "seconda metà", + "primo quarto", + "secondo quarto", + "terzo quarto", + "ultimo quarto" + ] + if unit.preferred_event.present? && unit.preferred_event.valid? + xml.unitdatestructured do + xml.dateset do + if (unit.preferred_event.start_date_from == unit.preferred_event.end_date_from) && (unit.preferred_event.start_date_to == unit.preferred_event.end_date_to) + if unit.preferred_event.start_date_from == unit.preferred_event.start_date_to + xml.datesingle unit.preferred_event.start_date_display, :standarddate => unit.preferred_event.start_date_from + else + xml.datesingle unit.preferred_event.start_date_display, :notbefore => unit.preferred_event.start_date_from, :notafter => unit.preferred_event.start_date_to + end + else + xml.daterange do + xml.fromdate unit.preferred_event.start_date_display, :standarddate => unit.preferred_event.start_date_from + xml.todate unit.preferred_event.end_date_display, :standarddate => unit.preferred_event.end_date_from + end + end + + xml.datesingle unit.preferred_event.note, :localtype => "noteAllaData" + end + end + end + + xml.physdescstructured :physdescstructuredtype => "materialtype", :coverage => "whole" do + xml.quantity unit.extent + xml.unittype "" + xml.physfacet unit.medium, :localtype => "Supporto" + end + + if unit.physical_description.present? + xml.physdesc unit.physical_description + end + + if unit.sc2_scales.present? || unit.sc2_techniques.present? || ( + unit.sc2.present? && ( + unit.sc2.lrc.present? || unit.sc2.mtce.present? || unit.sc2.sdtt.present? || unit.sc2.misa.present? || unit.sc2.misl.present? + )) + xml.physdescstructured :physdescstructuredtype => "materialtype", :coverage => "whole" do + xml.quantity "" + xml.unittype "" + + if unit.sc2_techniques.present? + unit.sc2_techniques.each do |st| + xml.physfacet st.mtct, :localtype => "Tecnica" + end + end + + if unit.sc2.present? && unit.sc2.mtce.present? + xml.physfacet unit.sc2.mtce, :localtype => "Esecuzione" + end + + if unit.sc2_scales.present? + unit.sc2_scales.each do |sc| + xml.physfacet sc.sca, :localtype => "Scala" + end + end + + if unit.sc2.present? && unit.sc2.sdtt.present? + xml.physfacet unit.sc2.sdtt, :localtype => "Tiporappresentazione" + end + + if unit.sc2.present? && unit.sc2.misa.present? + xml.physfacet unit.sc2.misa, :localtype => "altezza" + end + + if unit.sc2.present? && unit.sc2.misl.present? + xml.physfacet unit.sc2.misl, :localtype => "larghezza" + end + + if unit.sc2.present? && unit.sc2.lrc.present? + xml.descriptivenote do + xml.p do + xml.geogname :localtype => "Luogorappresentato" do + xml.part unit.sc2.lrc + end + end + end + end + end + end + + if unit.physical_container_title.present? || unit.physical_container_type.present? || unit.physical_container_number.present? + xml.container unit.physical_container_title, :localtype => unit.physical_container_type, :containerid => unit.physical_container_number + end + + unit.digital_objects.each do |dob| + dobj_id_str = sprintf '%08d', dob.id + xml.dao :daotype => "derived", :linkrole => dob.asset_content_type, :id => "OD-#{dobj_id_str}", :href => "#{DIGITAL_OBJECTS_URL}/#{dob.access_token}/original.jpg" + end + end + + if !(unit.unit_type == "fascicolo o altra unità complessa") || !(unit.file_type == "fascicolo di edilizia") + if unit.content.present? + xml.scopecontent do + xml.p unit.content + end + end + end + + if unit.access_condition.present? + xml.accessrestrict do + xml.p unit.access_condition + end + end + if unit.access_condition_note.present? + xml.accessrestrict do + xml.p unit.access_condition_note + end + end + + if unit.use_condition.present? + xml.userestrict do + xml.p unit.use_condition + end + end + if unit.use_condition_note.present? + xml.userestrict do + xml.p unit.use_condition_note + end + end + + if unit.arrangement_note.present? + xml.processinfo :localtype => "notaDellArchivista" do + xml.p unit.arrangement_note + end + end + + editors = unit.unit_editors + if editors.length > 0 + xml.processinfo :localtype => "compilatori" do + event_types = { + "aggiornamento scheda" => "modifica", + "inserimento dati" => "inserimento", + "integrazione successiva" => "modifica", + "prima redazione" => "inserimento", + "revisione" => "modifica", + "rielaborazione" => "modifica", + "schedatura" => "inserimento" + } + editors.each do |editor| + xml.processinfo :localtype => "compilatore" do + xml.p do + xml.persname do + if editor.editing_type.present? + editing_type = editor.editing_type.downcase + event_type = event_types.key?(editing_type) ? event_types[editing_type] : "unknown" + else + event_type = "unknown" + end + xml.part event_type, :localtype => "tipoIntervento" + xml.part editor.name, :localtype => "compilatore" + xml.part editor.qualifier, :localtype => "qualifica" + end + dateTime = editor.edited_at.strftime("%Y-%m-%dT%H:%M:%S") #Time.now.strftime("%Y-%m-%dT%H:%M:%S") + xml.date dateTime, :localtype => "dataIntervento" + end + end + end + end + end + + if unit.unit_type.include? "unità documentaria" + sc2_textual_elements = unit.sc2_textual_elements + sc2_textual_elements.each do |ste| + xml.odd :localtype => "ElementiTestuali" do + xml.p ste.isri + end + end + + sc2_visual_elements = unit.sc2_visual_elements + sc2_visual_elements.each do |sve| + xml.odd :localtype => "ElementiFigurati" do + xml.p sve.stmd + end + end + + if unit.sc2.present? and unit.sc2.dpgf.present? + xml.odd :localtype => "NumeroTavola" do + xml.p unit.sc2.dpgf + end + end + + if unit.sc2.present? and unit.sc2.sgti.present? + xml.controlaccess do + xml.subject :localtype => "Soggetto" do + xml.part unit.sc2.sgti + end + + if unit.sc2_authors.present? + xml.name :relator => "Autore" do + unit.sc2_authors.each do |sca| + xml.part sca.autr.present? ? "" : sca.autr, :localtype => "Ruolo" + xml.part sca.auta.present? ? "" : sca.autn, :localtype => "Autore" + xml.part sca.autr.present? ? "" : sca.auta, :localtype => "DatiAnagrafici" + unit.sc2_attribution_reasons.each do |scar| + xml.part scar.autm.present? ? "" : scar.autm, :localtype => "Attribuzione" + end + end + end + end + + if unit.sc2_commissions.present? + xml.name :relator => "Committente" do + unit.sc2_commissions.each do |sc| + xml.part sc.cmmc.present? ? "" : sc.cmmc, :localtype => "notecommittenza" + if !unit.sc2.cmmr.present? + xml.part unit.sc2.cmmr, :localtype => "numerocommessa" + end + end + end + end + end + else + if unit.sc2_authors.present? + xml.controlaccess do + xml.name :relator => "Autore" do + unit.sc2_authors.each do |sca| + xml.part sca.autr.present? ? "" : sca.autr, :localtype => "Ruolo" + xml.part sca.auta.present? ? "" : sca.autn, :localtype => "Autore" + xml.part sca.autr.present? ? "" : sca.auta, :localtype => "DatiAnagrafici" + unit.sc2_attribution_reasons.each do |scar| + xml.part scar.autm.present? ? "" : scar.autm, :localtype => "Attribuzione" + end + end + end + + if unit.sc2_commissions.present? + xml.name :relator => "Committente" do + unit.sc2_commissions.each do |sc| + xml.part sc.cmmc.present? ? "" : sc.cmmc, :localtype => "notecommittenza" + if !unit.sc2.cmmr.present? + xml.part unit.sc2.cmmr, :localtype => "numerocommessa" + end + end + end + end + end + else + if unit.sc2_commissions.present? + xml.controlaccess do + xml.name :relator => "Committente" do + unit.sc2_commissions.each do |sc| + xml.part sc.cmmc.present? ? "" : sc.cmmc, :localtype => "notecommittenza" + if !unit.sc2.cmmr.present? + xml.part unit.sc2.cmmr, :localtype => "numerocommessa" + end + end + end + end + end + end + end + end + + relheadings = unit.headings + if relheadings.length > 0 + xml.controlaccess do + relheadings.each do |heading| + if heading.heading_type == "Persona" + xml.persname do + xml.part heading.name + if heading.dates.present? + xml.part heading.dates, :localtype => "estremiCronologici" + end + if heading.qualifier.present? + xml.part heading.qualifier, :localtype => "qualifica" + end + end + elsif heading.heading_type == "Famiglia" + xml.famname do + xml.part heading.name + if heading.dates.present? + xml.part heading.dates, :localtype => "estremiCronologici" + end + if heading.qualifier.present? + xml.part heading.qualifier, :localtype => "qualifica" + end + end + elsif heading.heading_type == "Ente" + xml.corpname do + xml.part heading.name + if heading.dates.present? + xml.part heading.dates, :localtype => "estremiCronologici" + end + if heading.qualifier.present? + xml.part heading.qualifier, :localtype => "qualifica" + end + end + elsif heading.heading_type == "Toponimo" + xml.geogname do + xml.part heading.name + if heading.dates.present? + xml.part heading.dates, :localtype => "estremiCronologici" + end + if heading.qualifier.present? + xml.part heading.qualifier, :localtype => "qualifica" + end + end + else + #"Altro" + xml.subject do + xml.part heading.name + if heading.dates.present? + xml.part heading.dates, :localtype => "estremiCronologici" + end + if heading.qualifier.present? + xml.part heading.qualifier, :localtype => "qualifica" + end + end + end + end + end + end + + xml.relations do + relunitsources = unit.sources + if relunitsources.present? + relunitsources.each do |source| + if source.source_type_code == 1 + relation_type = "BIBTEXT" + else + relation_type = "FONTETEXT" + end + xml.relation :relationtype => "otherrelationtype", :otherrelationtype => relation_type, :href => "#{SOURCES_URL}/#{source.id}" do + xml.relationentry source.title + end + end + end + + #xml.relation :relationtype => "otherrelationtype", :href => "#{UNITS_URL}/#{unit.id}", :otherrelationtype => "URL" do + xml.relation :relationtype => "otherrelationtype", :href => "#{FONDS_URL}/#{unit.fond_id}/#{UNITS_URL}/#{unit.id}", :otherrelationtype => "URL" do + xml.relationentry PROVIDER + end + reluniturls = unit.unit_urls + if reluniturls.present? + reluniturls.each do |ruu| + xml.relation :relationtype => "otherrelationtype", :href => ruu.url, :otherrelationtype => "URL" do + xml.relationentry ruu.note + end + end + end + + unit.anagraphics.each do |anagraphic| + xml.relation :relationtype => "otherrelationtype", :otherrelationtype => "INDICE" do + if anagraphic.name.present? and anagraphic.surname.present? + denominazione = "#{anagraphic.name} #{anagraphic.surname}" + elsif anagraphic.name.present? + denominazione = anagraphic.name + elsif anagraphic.surname.present? + denominazione = anagraphic.surname + else + denominazione = "" + end + sa_id_str = sprintf '%08d', anagraphic.id + + xml.relationentry denominazione, :localtype => "denominazione" + xml.relationentry "SA-#{sa_id_str}", :localtype => "identificativo" + end + end + + #entità padre: può essere un fondo o una unità + if unit.ancestry.nil? + entity_url = "#{FONDS_URL}/#{unit.fond_id}" + else + if unit.ancestry.include? "/" + entity_id = unit.ancestry.split('/').last + else + entity_id = unit.ancestry + end + entity_url = "#{UNITS_URL}/#{entity_id}" + end + xml.relation :relationtype => "resourcerelation" do + xml.relationentry entity_url, :localtype => "ComplArchSup" + end + + #fratello superiore + if sequence_number.present? && sequence_number[-1] != "1" + if sequence_number.include? "." + prec_sequence_number = Integer(sequence_number[-1]) - 1 + prec_sequence_number = "#{sequence_number[0..-2]}#{prec_sequence_number}" + else + prec_sequence_number = "#{Integer(sequence_number[-1]) - 1}" + end + entity_id = nil + sequence_numbers.each do |key, value| + if (value <=> prec_sequence_number) == 0 + entity_id = key + break + end + end + if !entity_id.nil? + entity_url = "#{UNITS_URL}/#{entity_id}" + + xml.relation :relationtype => "resourcerelation" do + xml.relationentry entity_url, :localtype => "ComplArchPrec" + end + end + end + end + + if (unit.unit_type == "fascicolo o altra unità complessa") && (unit.file_type == "fascicolo di edilizia") + is_fascicolo_edilizia = true + else + is_fascicolo_edilizia = false + end + contexts = unit.fe_contexts + fe_operas = unit.fe_operas + if fe_operas.present? || (is_fascicolo_edilizia && contexts.any? && unit.content.present?) + xml.relatedmaterial do + xml.archref do + #fascicolo edilizio + if is_fascicolo_edilizia + if contexts.any? + ufec = contexts[0] + + if unit.content.present? + xml.title do + xml.part unit.content, :localtype => "contenuto" + end + end + + if ufec.applicant.present? + xml.persname :relator => "richiedente" do + xml.part ufec.applicant + end + xml.genreform do + xml.part "Fascicolo richiesta licenza edilizia" + end + end + + if ufec.request.present? + xml.title do + xml.part ufec.request, :localtype => "oggettoLicenza" + end + end + + if ufec.license_number.present? + xml.num ufec.license_number, :localtype => "numeroLicenza" + end + + if ufec.license_year.present? + xml.date ufec.license_year, :localtype => "annoLicenza", :normal => "#{ufec.license_year}" + end + + if ufec.license_date.present? + xml.date ufec.license_date.strftime("%Y-%m-%d"), :localtype => "dataLicenza", :normal => "#{ufec.license_date.strftime("%Y%m%d")}" + end + + if ufec.protocol_number.present? + xml.num ufec.protocol_number, :localtype => "numeroProtocolloSezionale" + end + + if ufec.habitability_number.present? + xml.num ufec.habitability_number, :localtype => "numeroAbitabilita" + end + + if ufec.habitability_year.present? + xml.date ufec.habitability_year, :localtype => "annoAbitabilita", :normal => "#{ufec.habitability_year}" + end + + if ufec.habitability_date.present? + xml.date ufec.habitability_date.strftime("%Y-%m-%d"), :localtype => "dataAbitabilita", :normal => "#{ufec.habitability_date.strftime("%Y%m%d")}" + end + end + end + + if fe_operas.present? + fe_operas.each do |ufop| + if ufop.is_present + opera_present = "S" + opera_desc = "fascicoloPresente" + else + opera_present = "N" + opera_desc = "fascicoloMancante" + end + xml.abbr opera_present, :expan => opera_desc + + if ufop.status.present? + if ufop.status == "approved" + opera_status = "SI" + opera_status_desc = "approvato" + else + opera_status = "NO" + opera_status_desc = "respinto" + end + xml.abbr opera_status, :expan => opera_status_desc + end + + if ufop.building_name.present? + xml.subject do + xml.part ufop.building_name, :localtype => "denominazioneEdificio" + if ufop.building_type.present? + xml.part ufop.building_type, :localtype => "tipoEdificio" + end + end + end + + if unit.fe_designers.present? + unit.fe_designers.each do |ufd| + if ufd.designer_name.present? + xml.persname :relator => "progettista" do + xml.part ufd.designer_name + if ufd.designer_role.present? + xml.part ufd.designer_role, :localtype => "ruoloProgettista" + end + end + end + end + end + end + + fe_operas.each do |ufop| + dati_catastali = unit.fe_cadastrals + if ufop.place_name.present? + xml.geogname :relator => ufop.place_type do + xml.part ufop.place_name, :localtype => "nomeLuogo" + if ufop.house_number.present? + xml.part ufop.house_number, :localtype => "numeroCivico" + end + if ufop.district.present? + xml.part ufop.district, :localtype => "quartiere" + end + + if dati_catastali.present? + dati_catastali.each do |ufca| + if ufca.way_code.present? + xml.part ufca.way_code, :localtype => "codiceVia" + end + if ufca.cadastral_municipality.present? + xml.part ufca.cadastral_municipality, :localtype => "comuneCatastale" + end + if ufca.municipality_code.present? + xml.part ufca.municipality_code, :localtype => "numero" + end + end + end + end + end + + if dati_catastali.present? + dati_catastali.each do |ufca| + if ufca.paper_code.present? + xml.num ufca.paper_code, :localtype => "foglio" + end + end + end + if unit.fe_land_parcels.present? + unit.fe_land_parcels.each do |uflp| + xml.num uflp.land_parcel_number, :localtype => "numeroParticellaFondiaria" + end + + if unit.fe_fract_land_parcels.present? + unit.fe_fract_land_parcels.each do |ufflp| + xml.num ufflp.fract_land_parcel_number, :localtype => "numeroFrazionamentoParticellaFondiaria" + xml.num ufflp.edil_parcel_number, :localtype => "numeroParticellaEdilizia" + end + end + + if unit.fe_fract_edil_parcels.present? + unit.fe_fract_edil_parcels.each do |uffelp| + xml.num uffelp.fract_edil_parcel_number, :localtype => "numeroFrazionamentoParticellaEdilizia" + xml.num uffelp.material_portion, :localtype => "porzioneMateriale" + end + end + end + end + end + end + end + end + + if unit.related_materials.present? + xml.relatedmaterial :localtype => "documentazioneCollegata" do + xml.p unit.related_materials + end + end + + if unit.has_children? + child_units = unit.children.where("id != #{unit.id}").order(:sequence_number) + child_units.each do |child_unit| + child_unit_type = unit_types["base_types"].key?(child_unit.unit_type) ? unit_types["base_types"][child_unit.unit_type] : "" + if child_unit_type == "registro" + child_file_type = child_unit_type + else + child_file_type = unit_types["file_types"].key?(child_unit.file_type) ? unit_types["file_types"][child_unit.file_type] : nil + end + child_sc2_tsk = unit_types["sc2_tsks"].key?(child_unit.sc2_tsk) ? unit_types["sc2_tsks"][child_unit.sc2_tsk] : nil + + if child_file_type.nil? and child_sc2_tsk.nil? + if child_unit_type.empty? + child_unit_type = "otherlevel" + end + attributes = {:level => child_unit_type} + else + if !child_file_type.nil? + otherlevel = child_file_type + else + otherlevel = child_sc2_tsk + end + attributes = {:level => "otherlevel", :otherlevel => otherlevel} + end + xml.c attributes do + xml << render(:partial => "unit_child_ead.xml", :locals => { + :unit => child_unit, + :unit_types => unit_types, + :sequence_numbers => sequence_numbers + }) + end + end + end \ No newline at end of file diff --git a/lib/exporter/views/units/_unit_ead.xml.builder b/lib/exporter/views/units/_unit_ead.xml.builder new file mode 100644 index 0000000..82b4b2d --- /dev/null +++ b/lib/exporter/views/units/_unit_ead.xml.builder @@ -0,0 +1,118 @@ +root_fond = Fond.find(unit.root_fond_id) + +xml.control do + ua_id_str = sprintf '%08d', unit.id + xml.recordid "UA-#{ua_id_str}" + xml.filedesc do + xml.titlestmt do + xml.titleproper unit.name + end + end + xml.maintenancestatus :value => "new" + xml.maintenanceagency do + xml.agencyname "#{PROVIDER}" + end + if unit.unit_langs.present? + langs = unit.unit_langs + langs.each do |l| + xml.languagedeclaration do + xml.language :langcode => l.code + translation = Lang.where("code like ?", l.code) + xml.script :scriptcode => translation[0].en_name + end + end + else + xml.languagedeclaration do + xml.language :langcode => "ita" + xml.script :scriptcode => "Italian" + end + end + xml.conventiondeclaration do + xml.citation "SAN" + end + + xml.maintenancehistory do + xml.maintenanceevent do + xml.eventtype :value => "created" + xml.eventdatetime "" + xml.agenttype :value => "human" + xml.agent "" + end + + if root_fond.present? + fond_editors = root_fond.fond_editors + if fond_editors.present? + fond_editors_event_type = { + "aggiornamento scheda" => "updated", + "inserimento dati" => "created", + "integrazione successiva" => "updated", + "prima redazione" => "created", + "revisione" => "revised", + "rielaborazione" => "revised", + "schedatura" => "created" + } + fond_editors.each do |fe| + xml.maintenanceevent do + if fe.editing_type.present? + editing_type = fe.editing_type.downcase + event_type = fond_editors_event_type.key?(editing_type) ? fond_editors_event_type[editing_type] : "unknown" + else + event_type = "unknown" + end + if fe.edited_at.present? + edited_at = fe.edited_at.strftime("%Y-%m-%dT%H:%M:%S") + end + + xml.eventtype :value => event_type + if !edited_at.nil? + xml.eventdatetime edited_at, :standarddatetime => edited_at + elsif + xml.eventdatetime "" + end + xml.agenttype :value => "human" + xml.agent fe.name + xml.eventdescription fe.qualifier + end + end + end + end + end +end + +fond_types = { + "archivio" => "fonds", + "fondo" => "fonds", + "complesso di fondi" => "recordgrp", + "iperfondo" => "recordgrp", + "subfondo" => "subfonds", + "sezione" => "subfonds", + "partizione" => "subfonds", + "sottopartizione" => "subfonds", + "parte" => "subfonds", + "serie" => "series", + "sottoserie" => "subseries", + "sottosottoserie" => "subseries", + "sottosezione" => "otherlevel", + "categoria" => "otherlevel", + "classe" => "otherlevel", + "sottoclasse" => "otherlevel", + "rubrica" => "otherlevel", + "voce" => "otherlevel", + "sottovoce" => "otherlevel", + "titolo" => "otherlevel", + "sottotitolo" => "otherlevel", + "articolo" => "otherlevel" +} +root_fond_type = fond_types.key?(root_fond.fond_type) ? fond_types[root_fond.fond_type] : "fonds" +if root_fond_type == "otherlevel" + attributes = {:level => root_fond_type, :otherlevel => root_fond.fond_type} +else + attributes = {:level => root_fond_type} +end +xml.archdesc attributes do + xml << render(:partial => "unit_root_fond_archdesc_ead.xml", :locals => { + :unit => unit, + :root_fond => root_fond, + :fond_types => fond_types + }) +end \ No newline at end of file diff --git a/lib/exporter/views/units/_unit_fond_ead.xml.builder b/lib/exporter/views/units/_unit_fond_ead.xml.builder new file mode 100644 index 0000000..fbc62f4 --- /dev/null +++ b/lib/exporter/views/units/_unit_fond_ead.xml.builder @@ -0,0 +1,73 @@ +fond = fonds[0] +fond_type = fond_types.key?(fond.fond_type) ? fond_types[fond.fond_type] : "fonds" +ca_id_str = sprintf '%08d', fond.id + +fonds.shift() + +if fond_type == "otherlevel" + xml.c :level => fond_type, :otherlevel => fond.fond_type do + xml.did do + xml.unitid "CA-#{ca_id_str}", :identifier => "CA-#{ca_id_str}" + xml.unittitle fond.name, :localtype => "denominazione" + end + + if fonds.empty? + if unit.ancestry.nil? + xml << render(:partial => "unit_desc_ead.xml", :locals => { + :unit => unit, + :unit_types => unit_types, + :sequence_numbers => sequence_numbers + }) + else + parent_unit_ids = unit.ancestry.split("/") + xml << render(:partial => "unit_parent_ead.xml", :locals => { + :parent_unit_ids => parent_unit_ids, + :unit => unit, + :unit_types => unit_types, + :sequence_numbers => sequence_numbers + }) + end + else + xml << render(:partial => "unit_fond_ead.xml", :locals => { + :fonds => fonds, + :fond_types => fond_types, + :unit => unit, + :unit_types => unit_types, + :sequence_numbers => sequence_numbers + }) + end + end +else + xml.c :level => fond_type do + xml.did do + xml.unitid "CA-#{ca_id_str}", :identifier => "CA-#{ca_id_str}" + xml.unittitle fond.name, :localtype => "denominazione" + end + + if fonds.empty? + if unit.ancestry.nil? + xml << render(:partial => "unit_desc_ead.xml", :locals => { + :unit => unit, + :unit_types => unit_types, + :sequence_numbers => sequence_numbers + }) + else + parent_unit_ids = unit.ancestry.split("/") + xml << render(:partial => "unit_parent_ead.xml", :locals => { + :parent_unit_ids => parent_unit_ids, + :unit => unit, + :unit_types => unit_types, + :sequence_numbers => sequence_numbers + }) + end + else + xml << render(:partial => "unit_fond_ead.xml", :locals => { + :fonds => fonds, + :fond_types => fond_types, + :unit => unit, + :unit_types => unit_types, + :sequence_numbers => sequence_numbers + }) + end + end +end diff --git a/lib/exporter/views/units/_unit_parent_ead.xml.builder b/lib/exporter/views/units/_unit_parent_ead.xml.builder new file mode 100644 index 0000000..d02945e --- /dev/null +++ b/lib/exporter/views/units/_unit_parent_ead.xml.builder @@ -0,0 +1,67 @@ +parent_unit = Unit.find(parent_unit_ids[0]) + +parent_unit_ids.shift() + +parent_unit_type = unit_types["base_types"].key?(parent_unit.unit_type) ? unit_types["base_types"][parent_unit.unit_type] : "" +if parent_unit_type == "registro" + parent_file_type = parent_unit_type +else + parent_file_type = unit_types["file_types"].key?(parent_unit.file_type) ? unit_types["file_types"][parent_unit.file_type] : nil +end +parent_sc2_tsk = unit_types["sc2_tsks"].key?(parent_unit.sc2_tsk) ? unit_types["sc2_tsks"][parent_unit.sc2_tsk] : nil + +if parent_file_type.nil? and parent_sc2_tsk.nil? + if parent_unit_type.empty? + parent_unit_type = "otherlevel" + end + xml.c :level => parent_unit_type do + xml.did do + pua_id_str = sprintf '%08d', parent_unit.id + xml.unitid "CA-#{pua_id_str}", :identifier => "CA-#{pua_id_str}" + xml.unittitle parent_unit.name, :localtype => "denominazione" + end + + if parent_unit_ids.empty? + xml << render(:partial => "unit_desc_ead.xml", :locals => { + :unit => unit, + :unit_types => unit_types, + :sequence_numbers => sequence_numbers + }) + else + xml << render(:partial => "unit_parent_ead.xml", :locals => { + :parent_unit_ids => parent_unit_ids, + :unit_types => unit_types, + :sequence_numbers => sequence_numbers, + :unit => unit + }) + end + end +else + if !parent_file_type.nil? + otherlevel = parent_file_type + else + otherlevel = parent_sc2_tsk + end + xml.c :level => "otherlevel", :otherlevel => otherlevel do + xml.did do + pua_id_str = sprintf '%08d', parent_unit.id + xml.unitid "CA-#{pua_id_str}", :identifier => "CA-#{pua_id_str}" + xml.unittitle parent_unit.name, :localtype => "denominazione" + end + + if parent_unit_ids.empty? + xml << render(:partial => "unit_desc_ead.xml", :locals => { + :unit => unit, + :unit_types => unit_types, + :sequence_numbers => sequence_numbers + }) + else + xml << render(:partial => "unit_parent_ead.xml", :locals => { + :parent_unit_ids => parent_unit_ids, + :unit_types => unit_types, + :sequence_numbers => sequence_numbers, + :unit => unit + }) + end + end +end \ No newline at end of file diff --git a/lib/exporter/views/units/_unit_root_fond_archdesc_ead.xml.builder b/lib/exporter/views/units/_unit_root_fond_archdesc_ead.xml.builder new file mode 100644 index 0000000..51d4403 --- /dev/null +++ b/lib/exporter/views/units/_unit_root_fond_archdesc_ead.xml.builder @@ -0,0 +1,68 @@ +xml.did do + rf_id_str = sprintf '%08d', root_fond.id + xml.unitid "CA-#{rf_id_str}", :identifier => "CA-#{rf_id_str}" + xml.unittitle root_fond.name, :localtype => "denominazione" +end + +xml.dsc do + base_types = { + "fascicolo o altra unità complessa" => "file", + "unità documentaria" => "item", + "registro o altra unità rilegata" => "registro" + } + file_types = { + "fascicolo di edilizia" => "fascicolodiedilizia", + "fascicolo personale" => "fascicolopersonale" + } + sc2_tsks = { + "CARS" => "cartografiastorica", + "D" => "”disegnoartistico", + "DT" => "disegnotecnico", + "F" => "fotografia", + "S" => "stampa" + } + unit_types = { + "base_types" => base_types, + "file_types" => file_types, + "sc2_tsks" => sc2_tsks + } + sequence_numbers = Unit.display_sequence_numbers_of(Fond.find(unit.root_fond_id).root) + + if unit.root_fond_id == unit.fond_id + if unit.ancestry.nil? + xml << render(:partial => "unit_desc_ead.xml", :locals => { + :unit => unit, + :unit_types => unit_types, + :sequence_numbers => sequence_numbers + }) + elsif + parent_unit_ids = unit.ancestry.split("/") + xml << render(:partial => "unit_parent_ead.xml", :locals => { + :parent_unit_ids => parent_unit_ids, + :unit => unit, + :unit_types => unit_types, + :sequence_numbers => sequence_numbers + }) + end + else + fonds = Array.new + id = unit.fond_id + while !id.to_s.empty? + fond = Fond.find(id) + fonds.push(fond) + id = fond.ancestry + + if "#{fond.ancestry}" == "#{root_fond.id}" + break + end + end + + xml << render(:partial => "unit_fond_ead.xml", :locals => { + :fonds => fonds, + :fond_types => fond_types, + :unit => unit, + :unit_types => unit_types, + :sequence_numbers => sequence_numbers + }) + end +end diff --git a/lib/exporter/views/units/unit_ii.xml.builder b/lib/exporter/views/units/unit_ii.xml.builder new file mode 100644 index 0000000..bf06bf0 --- /dev/null +++ b/lib/exporter/views/units/unit_ii.xml.builder @@ -0,0 +1,690 @@ +base_types = { + "fascicolo o altra unità complessa" => "file", + "unità documentaria" => "item", + "registro o altra unità rilegata" => "registro" +} +file_types = { + "fascicolo di edilizia" => "fascicolodiedilizia", + "fascicolo personale" => "fascicolopersonale" +} +sc2_tsks = { + "CARS" => "cartografiastorica", + "D" => "disegnoartistico", + "DT" => "disegnotecnico", + "F" => "fotografia", + "S" => "stampa" +} +unit_types = { + "base_types" => base_types, + "file_types" => file_types, + "sc2_tsks" => sc2_tsks +} +unit_type = unit_types["base_types"].key?(unit.unit_type) ? unit_types["base_types"][unit.unit_type] : "" +if unit_type == "registro" + file_type = unit_type +else + file_type = unit_types["file_types"].key?(unit.file_type) ? unit_types["file_types"][unit.file_type] : nil +end +sc2_tsk = unit_types["sc2_tsks"].key?(unit.sc2_tsk) ? unit_types["sc2_tsks"][unit.sc2_tsk] : nil + +if file_type.nil? and sc2_tsk.nil? + attributes = {:level => unit_type} +else + if !file_type.nil? + otherlevel = file_type + else + otherlevel = sc2_tsk + end + attributes = {:level => "file", :otherlevel => otherlevel} +end +xml.c attributes do + sequence_numbers = Unit.display_sequence_numbers_of(Fond.find(unit.root_fond_id).root) + sequence_number = sequence_numbers[unit.id] + + xml.did do + ua_id_str = sprintf '%08d', unit.id + xml.unitid "UA-#{ua_id_str}", :identifier => "UA-#{ua_id_str}" + xml.unitid sequence_number, :localtype => "numeroOrdinamento" + xml.unitid unit.tmp_reference_number, :localtype => "segnaturaProvvisoria", :label => "numero" + xml.unitid unit.tmp_reference_string, :localtype => "segnaturaProvvisoria", :label => "testo" + xml.unitid unit.folder_number, :localtype => "busta" + xml.unitid unit.file_number, :localtype => "numFascicolo" + xml.unitid unit.reference_number, :localtype => "segnaturaAttuale" + + if unit.unit_identifiers.present? + unit.unit_identifiers.each do |identifier| + xml.unitid identifier.identifier, :localtype => identifier.identifier_source, :identifier => identifier.identifier + end + end + + #fascicolo edilizio + if (unit.unit_type == "fascicolo o altra unità complessa") && (unit.file_type == "fascicolo di edilizia") + classificazione = "" + codice = "" + categoria = "" + classe = "" + fascicolo = "" + subfascicolo = "" + anno = "" + + contexts = unit.fe_contexts + if contexts.any? + ufc = contexts[0] + + classificazione = ufc.classification + fascicolo = ufc.number + subfascicolo = ufc.sub_number + end + + identifications = unit.fe_identifications + if contexts.any? + ufi = identifications[0] + + codice = ufi.code + categoria = ufi.category + classe = ufi.identification_class + anno = ufi.file_year + end + + xml.unitid classificazione, :localtype => "classificazione", :identifier => classificazione + xml.unitid codice, :localtype => "codice", :identifier => classificazione + xml.unitid categoria, :localtype => "categoria", :identifier => classificazione + xml.unitid classe, :localtype => "classe", :identifier => classificazione + xml.unitid fascicolo, :localtype => "fascicolo", :identifier => classificazione + xml.unitid subfascicolo, :localtype => "subfascicolo", :identifier => classificazione + xml.unitid anno, :localtype => "anno", :identifier => classificazione + end + xml.unittitle unit.name, :localtype => "denominazione" + + periodo_data_secolare = [ + "inizio", + "fine", + "metà", + "prima metà", + "seconda metà", + "primo quarto", + "secondo quarto", + "terzo quarto", + "ultimo quarto" + ] + if unit.preferred_event.present? && unit.preferred_event.valid? + xml.unitdatestructured do + xml.dateset do + if (unit.preferred_event.start_date_from == unit.preferred_event.end_date_from) && (unit.preferred_event.start_date_to == unit.preferred_event.end_date_to) + if unit.preferred_event.start_date_from == unit.preferred_event.start_date_to + xml.datesingle unit.preferred_event.start_date_display, :standarddate => unit.preferred_event.start_date_from + else + xml.datesingle unit.preferred_event.start_date_display, :notbefore => unit.preferred_event.start_date_from, :notafter => unit.preferred_event.start_date_to + end + else + xml.daterange do + xml.fromdate unit.preferred_event.start_date_display, :standarddate => unit.preferred_event.start_date_from + xml.todate unit.preferred_event.end_date_display, :standarddate => unit.preferred_event.end_date_from + end + end + + xml.datesingle unit.preferred_event.note, :localtype => "noteAllaData" + end + end + end + + xml.physdescstructured :physdescstructuredtype => "materialtype", :coverage => "whole" do + xml.quantity unit.extent + xml.unittype "" + xml.physfacet unit.medium, :localtype => "Supporto" + end + + if unit.physical_description.present? + xml.physdesc unit.physical_description + end + + if unit.sc2_scales.present? || unit.sc2_techniques.present? || ( + unit.sc2.present? && ( + unit.sc2.lrc.present? || unit.sc2.mtce.present? || unit.sc2.sdtt.present? || unit.sc2.misa.present? || unit.sc2.misl.present? + )) + xml.physdescstructured :physdescstructuredtype => "materialtype", :coverage => "whole" do + xml.quantity "" + xml.unittype "" + + if unit.sc2_techniques.present? + unit.sc2_techniques.each do |st| + xml.physfacet st.mtct, :localtype => "Tecnica" + end + end + + if unit.sc2.present? && unit.sc2.mtce.present? + xml.physfacet unit.sc2.mtce, :localtype => "Esecuzione" + end + + if unit.sc2_scales.present? + unit.sc2_scales.each do |sc| + xml.physfacet sc.sca, :localtype => "Scala" + end + end + + if unit.sc2.present? && unit.sc2.sdtt.present? + xml.physfacet unit.sc2.sdtt, :localtype => "Tiporappresentazione" + end + + if unit.sc2.present? && unit.sc2.misa.present? + xml.physfacet unit.sc2.misa, :localtype => "altezza" + end + + if unit.sc2.present? && unit.sc2.misl.present? + xml.physfacet unit.sc2.misl, :localtype => "larghezza" + end + + if unit.sc2.present? && unit.sc2.lrc.present? + xml.descriptivenote do + xml.p do + xml.geogname :localtype => "Luogorappresentato" do + xml.part unit.sc2.lrc + end + end + end + end + end + end + + if unit.physical_container_title.present? || unit.physical_container_type.present? || unit.physical_container_number.present? + xml.container unit.physical_container_title, :localtype => unit.physical_container_type, :containerid => unit.physical_container_number + end + + unit.digital_objects.each do |dob| + dobj_id_str = sprintf '%08d', dob.id + #xml.dao :daotype => "derived", :linkrole => dob.asset_content_type, :id => "OD-#{dobj_id_str}", :href => "#{DIGITAL_OBJECTS_URL}/#{dob.access_token}/original.jpg" + dob_file_ext = dob.asset_file_name.split('.').last + xml.dao :daotype => "derived", :linkrole => dob.asset_content_type, :id => "OD-#{dobj_id_str}", :href => "#{dob.access_token}/original.#{dob_file_ext}" + end + end + + if !(unit.unit_type == "fascicolo o altra unità complessa") || !(unit.file_type == "fascicolo di edilizia") + if unit.content.present? + xml.scopecontent do + xml.p unit.content + end + end + end + + if unit.access_condition.present? + xml.accessrestrict do + xml.p unit.access_condition + end + end + if unit.access_condition_note.present? + xml.accessrestrict do + xml.p unit.access_condition_note + end + end + + if unit.use_condition.present? + xml.userestrict do + xml.p unit.use_condition + end + end + if unit.use_condition_note.present? + xml.userestrict do + xml.p unit.use_condition_note + end + end + + if unit.arrangement_note.present? + xml.processinfo :localtype => "notaDellArchivista" do + xml.p unit.arrangement_note + end + end + + editors = unit.unit_editors + if editors.length > 0 + xml.processinfo :localtype => "compilatori" do + event_types = { + "aggiornamento scheda" => "modifica", + "inserimento dati" => "inserimento", + "integrazione successiva" => "modifica", + "prima redazione" => "inserimento", + "revisione" => "modifica", + "rielaborazione" => "modifica", + "schedatura" => "inserimento" + } + editors.each do |editor| + xml.processinfo :localtype => "compilatore" do + xml.p do + xml.persname do + if editor.editing_type.present? + editing_type = editor.editing_type.downcase + event_type = event_types.key?(editing_type) ? event_types[editing_type] : "unknown" + else + event_type = "unknown" + end + xml.part event_type, :localtype => "tipoIntervento" + xml.part editor.name, :localtype => "compilatore" + xml.part editor.qualifier, :localtype => "qualifica" + end + dateTime = Time.now.strftime("%Y-%m-%dT%H:%M:%S") + xml.date dateTime, :localtype => "dataIntervento" + end + end + end + end + end + + if unit.unit_type.include? "unità documentaria" + sc2_textual_elements = unit.sc2_textual_elements + sc2_textual_elements.each do |ste| + xml.odd :localtype => "ElementiTestuali" do + xml.p ste.isri + end + end + + sc2_visual_elements = unit.sc2_visual_elements + sc2_visual_elements.each do |sve| + xml.odd :localtype => "ElementiFigurati" do + xml.p sve.stmd + end + end + + if unit.sc2.present? and unit.sc2.dpgf.present? + xml.odd :localtype => "NumeroTavola" do + xml.p unit.sc2.dpgf + end + end + + if unit.sc2.present? and unit.sc2.sgti.present? + xml.controlaccess do + xml.subject :localtype => "Soggetto" do + xml.part unit.sc2.sgti + end + + if unit.sc2_authors.present? + xml.name :relator => "Autore" do + unit.sc2_authors.each do |sca| + xml.part sca.autr.present? ? "" : sca.autr, :localtype => "Ruolo" + xml.part sca.auta.present? ? "" : sca.autn, :localtype => "Autore" + xml.part sca.autr.present? ? "" : sca.auta, :localtype => "DatiAnagrafici" + unit.sc2_attribution_reasons.each do |scar| + xml.part scar.autm.present? ? "" : scar.autm, :localtype => "Attribuzione" + end + end + end + end + + if unit.sc2_commissions.present? + xml.name :relator => "Committente" do + unit.sc2_commissions.each do |sc| + xml.part sc.cmmc.present? ? "" : sc.cmmc, :localtype => "notecommittenza" + if !unit.sc2.cmmr.present? + xml.part unit.sc2.cmmr, :localtype => "numerocommessa" + end + end + end + end + end + else + if unit.sc2_authors.present? + xml.controlaccess do + xml.name :relator => "Autore" do + unit.sc2_authors.each do |sca| + xml.part sca.autr.present? ? "" : sca.autr, :localtype => "Ruolo" + xml.part sca.auta.present? ? "" : sca.autn, :localtype => "Autore" + xml.part sca.autr.present? ? "" : sca.auta, :localtype => "DatiAnagrafici" + unit.sc2_attribution_reasons.each do |scar| + xml.part scar.autm.present? ? "" : scar.autm, :localtype => "Attribuzione" + end + end + end + + if unit.sc2_commissions.present? + xml.name :relator => "Committente" do + unit.sc2_commissions.each do |sc| + xml.part sc.cmmc.present? ? "" : sc.cmmc, :localtype => "notecommittenza" + if !unit.sc2.cmmr.present? + xml.part unit.sc2.cmmr, :localtype => "numerocommessa" + end + end + end + end + end + else + if unit.sc2_commissions.present? + xml.controlaccess do + xml.name :relator => "Committente" do + unit.sc2_commissions.each do |sc| + xml.part sc.cmmc.present? ? "" : sc.cmmc, :localtype => "notecommittenza" + if !unit.sc2.cmmr.present? + xml.part unit.sc2.cmmr, :localtype => "numerocommessa" + end + end + end + end + end + end + end + end + + relheadings = unit.headings + if relheadings.length > 0 + xml.controlaccess do + relheadings.each do |heading| + if heading.heading_type == "Persona" + xml.persname do + xml.part heading.name + if heading.dates.present? + xml.part heading.dates, :localtype => "estremiCronologici" + end + if heading.qualifier.present? + xml.part heading.qualifier, :localtype => "qualifica" + end + end + elsif heading.heading_type == "Famiglia" + xml.famname do + xml.part heading.name + if heading.dates.present? + xml.part heading.dates, :localtype => "estremiCronologici" + end + if heading.qualifier.present? + xml.part heading.qualifier, :localtype => "qualifica" + end + end + elsif heading.heading_type == "Ente" + xml.corpname do + xml.part heading.name + if heading.dates.present? + xml.part heading.dates, :localtype => "estremiCronologici" + end + if heading.qualifier.present? + xml.part heading.qualifier, :localtype => "qualifica" + end + end + elsif heading.heading_type == "Toponimo" + xml.geogname do + xml.part heading.name + if heading.dates.present? + xml.part heading.dates, :localtype => "estremiCronologici" + end + if heading.qualifier.present? + xml.part heading.qualifier, :localtype => "qualifica" + end + end + else + #"Altro" + xml.subject do + xml.part heading.name + if heading.dates.present? + xml.part heading.dates, :localtype => "estremiCronologici" + end + if heading.qualifier.present? + xml.part heading.qualifier, :localtype => "qualifica" + end + end + end + end + end + end + + xml.relations do + relunitsources = unit.sources + if relunitsources.present? + relunitsources.each do |source| + if source.source_type_code == 1 + relation_type = "BIBTEXT" + else + relation_type = "FONTETEXT" + end + xml.relation :relationtype => "otherrelationtype", :otherrelationtype => relation_type, :href => "#{SOURCES_URL}/#{source.id}" do + xml.relationentry source.title + end + end + end + + #xml.relation :relationtype => "otherrelationtype", :href => "#{UNITS_URL}/#{unit.id}", :otherrelationtype => "URL" do + xml.relation :relationtype => "otherrelationtype", :href => "#{FONDS_URL}/#{unit.fond_id}/#{UNITS_URL}/#{unit.id}", :otherrelationtype => "URL" do + xml.relationentry PROVIDER + end + reluniturls = unit.unit_urls + if reluniturls.present? + reluniturls.each do |ruu| + xml.relation :relationtype => "otherrelationtype", :href => ruu.url, :otherrelationtype => "URL" do + xml.relationentry ruu.note + end + end + end + + unit.anagraphics.each do |anagraphic| + xml.relation :relationtype => "otherrelationtype", :otherrelationtype => "INDICE" do + if anagraphic.name.present? and anagraphic.surname.present? + denominazione = "#{anagraphic.name} #{anagraphic.surname}" + elsif anagraphic.name.present? + denominazione = anagraphic.name + elsif anagraphic.surname.present? + denominazione = anagraphic.surname + else + denominazione = "" + end + sa_id_str = sprintf '%08d', anagraphic.id + + xml.relationentry denominazione, :localtype => "denominazione" + xml.relationentry "SA-#{sa_id_str}", :localtype => "identificativo" + end + end + + #entità padre: può essere un fondo o una unità + if unit.ancestry.nil? + entity_url = "#{FONDS_URL}/#{unit.fond_id}" + else + if unit.ancestry.include? "/" + entity_id = unit.ancestry.split('/').last + else + entity_id = unit.ancestry + end + entity_url = "#{UNITS_URL}/#{entity_id}" + end + xml.relation :relationtype => "resourcerelation" do + xml.relationentry entity_url, :localtype => "ComplArchSup" + end + + #fratello superiore + if sequence_number.present? && sequence_number[-1] != "1" + if sequence_number.include? "." + prec_sequence_number = Integer(sequence_number[-1]) - 1 + prec_sequence_number = "#{sequence_number[0..-2]}#{prec_sequence_number}" + else + prec_sequence_number = "#{Integer(sequence_number[-1]) - 1}" + end + entity_id = nil + sequence_numbers.each do |key, value| + if (value <=> prec_sequence_number) == 0 + entity_id = key + break + end + end + if !entity_id.nil? + entity_url = "#{UNITS_URL}/#{entity_id}" + + xml.relation :relationtype => "resourcerelation" do + xml.relationentry entity_url, :localtype => "ComplArchPrec" + end + end + end + end + + if (unit.unit_type == "fascicolo o altra unità complessa") && (unit.file_type == "fascicolo di edilizia") + is_fascicolo_edilizia = true + else + is_fascicolo_edilizia = false + end + contexts = unit.fe_contexts + fe_operas = unit.fe_operas + if fe_operas.present? || (is_fascicolo_edilizia && contexts.any? && unit.content.present?) + xml.relatedmaterial do + xml.archref do + #fascicolo edilizio + if is_fascicolo_edilizia + if contexts.any? + ufec = contexts[0] + + if unit.content.present? + xml.title do + xml.part unit.content, :localtype => "contenuto" + end + end + + if ufec.applicant.present? + xml.persname :relator => "richiedente" do + xml.part ufec.applicant + end + xml.genreform do + xml.part "Fascicolo richiesta licenza edilizia" + end + end + + if ufec.request.present? + xml.title do + xml.part ufec.request, :localtype => "oggettoLicenza" + end + end + + if ufec.license_number.present? + xml.num ufec.license_number, :localtype => "numeroLicenza" + end + + if ufec.license_year.present? + xml.date ufec.license_year, :localtype => "annoLicenza", :normal => "#{ufec.license_year}" + end + + if ufec.license_date.present? + xml.date ufec.license_date.strftime("%Y-%m-%d"), :localtype => "dataLicenza", :normal => "#{ufec.license_date.strftime("%Y%m%d")}" + end + + if ufec.protocol_number.present? + xml.num ufec.protocol_number, :localtype => "numeroProtocolloSezionale" + end + + if ufec.habitability_number.present? + xml.num ufec.habitability_number, :localtype => "numeroAbitabilita" + end + + if ufec.habitability_year.present? + xml.date ufec.habitability_year, :localtype => "annoAbitabilita", :normal => "#{ufec.habitability_year}" + end + + if ufec.habitability_date.present? + xml.date ufec.habitability_date.strftime("%Y-%m-%d"), :localtype => "dataAbitabilita", :normal => "#{ufec.habitability_date.strftime("%Y%m%d")}" + end + end + end + + if fe_operas.present? + fe_operas.each do |ufop| + if ufop.is_present + opera_present = "S" + opera_desc = "fascicoloPresente" + else + opera_present = "N" + opera_desc = "fascicoloMancante" + end + xml.abbr opera_present, :expan => opera_desc + + if ufop.status.present? + if ufop.status == "approved" + opera_status = "SI" + opera_status_desc = "approvato" + else + opera_status = "NO" + opera_status_desc = "respinto" + end + xml.abbr opera_status, :expan => opera_status_desc + end + + if ufop.building_name.present? + xml.subject do + xml.part ufop.building_name, :localtype => "denominazioneEdificio" + if ufop.building_type.present? + xml.part ufop.building_type, :localtype => "tipoEdificio" + end + end + end + + if unit.fe_designers.present? + unit.fe_designers.each do |ufd| + if ufd.designer_name.present? + xml.persname :relator => "progettista" do + xml.part ufd.designer_name + if ufd.designer_role.present? + xml.part ufd.designer_role, :localtype => "ruoloProgettista" + end + end + end + end + end + end + + fe_operas.each do |ufop| + dati_catastali = unit.fe_cadastrals + if ufop.place_name.present? + xml.geogname :relator => ufop.place_type do + xml.part ufop.place_name, :localtype => "nomeLuogo" + if ufop.house_number.present? + xml.part ufop.house_number, :localtype => "numeroCivico" + end + if ufop.district.present? + xml.part ufop.district, :localtype => "quartiere" + end + + if dati_catastali.present? + dati_catastali.each do |ufca| + if ufca.way_code.present? + xml.part ufca.way_code, :localtype => "codiceVia" + end + if ufca.cadastral_municipality.present? + xml.part ufca.cadastral_municipality, :localtype => "comuneCatastale" + end + if ufca.municipality_code.present? + xml.part ufca.municipality_code, :localtype => "numero" + end + end + end + end + end + + if dati_catastali.present? + dati_catastali.each do |ufca| + if ufca.paper_code.present? + xml.num ufca.paper_code, :localtype => "foglio" + end + end + end + if unit.fe_land_parcels.present? + unit.fe_land_parcels.each do |uflp| + xml.num uflp.land_parcel_number, :localtype => "numeroParticellaFondiaria" + end + + if unit.fe_fract_land_parcels.present? + unit.fe_fract_land_parcels.each do |ufflp| + xml.num ufflp.fract_land_parcel_number, :localtype => "numeroFrazionamentoParticellaFondiaria" + xml.num ufflp.edil_parcel_number, :localtype => "numeroParticellaEdilizia" + end + end + + if unit.fe_fract_edil_parcels.present? + unit.fe_fract_edil_parcels.each do |uffelp| + xml.num uffelp.fract_edil_parcel_number, :localtype => "numeroFrazionamentoParticellaEdilizia" + xml.num uffelp.material_portion, :localtype => "porzioneMateriale" + end + end + end + end + end + end + end + end + + if unit.related_materials.present? + xml.relatedmaterial :localtype => "documentazioneCollegata" do + xml.p unit.related_materials + end + end + + unit.children.each do |child| + xml << view.render(:file => "unit_ii.xml.builder", :locals => {:unit => child, :view => view}) + end +end diff --git a/lib/exporter/views/units/units_ead.xml.builder b/lib/exporter/views/units/units_ead.xml.builder new file mode 100644 index 0000000..b366605 --- /dev/null +++ b/lib/exporter/views/units/units_ead.xml.builder @@ -0,0 +1,11 @@ +xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8" + xml.tag! "ead", { + :"xsi:schemaLocation" => "http://ead3.archivists.org/schema/ http://www.san.beniculturali.it/tracciato/ead3.xsd", + :"xmlns" => "http://ead3.archivists.org/schema/", + :"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", + :"xmlns:xlink" => "http://www.w3.org/1999/xlink" + } do + records.each do |unit| + xml << render(:partial => "unit_ead.xml", :locals => {:unit => unit}) + end +end diff --git a/lib/report_support.rb b/lib/report_support.rb index 3b53e96..ff0d40e 100644 --- a/lib/report_support.rb +++ b/lib/report_support.rb @@ -591,7 +591,8 @@ def prv_html_print_field(dont_use_fld_captions, ai, caption_postfix, text) op_html = op_html + "" + ai.name_caption + caption_postfix + "" op_html = op_html + "

" end - op_html = op_html + textilize_with_entities(text) + #op_html = op_html + textilize_with_entities(text) + op_html = op_html + textilize_with_entities(text.gsub('b. ', 'b. ')) # bug fix: la stringa 'b. ' viene rimpiazzata con ''; causa: bug in textilize ? return op_html end diff --git a/lib/tasks/archimista_aef.rake b/lib/tasks/archimista_aef.rake new file mode 100644 index 0000000..17f3b35 --- /dev/null +++ b/lib/tasks/archimista_aef.rake @@ -0,0 +1,564 @@ +require 'zip' +require 'builder' + +TMP_AEF_EXPORTS = "#{Rails.root}/public/exports" + +namespace :aef do + + def get_rake_target_class_caption(target_class) + case target_class + when "fond" + caption = "export_complesso" + when "custodian" + caption = "export_conservatore" + when "project" + caption = "export_progetto" + when "unit" + caption = "export_unita" + else + caption = (target_class.nil? || target_class == "") ? "export" : "export_" + target_class + end + return caption + end + + def writeRakeEntries(entries, path, io) + entries.each { |e| + zipFilePath = path == "" ? e : File.join(path, e) + destZipFilePath = "public/digital_objects/" + zipFilePath + diskFilePath = File.join(@dir_digital, zipFilePath) + if File.directory?(diskFilePath) + io.mkdir(destZipFilePath) + subdir =Dir.entries(diskFilePath); subdir.delete("."); subdir.delete("..") + writeRakeEntries(subdir, zipFilePath, io) + else + if Dir.exists?(diskFilePath) + io.get_output_stream(destZipFilePath) { |f| f.puts(File.open(diskFilePath, "rb").read())} + elsif File.exists?(diskFilePath) + io.get_output_stream(destZipFilePath) { |f| f.puts(File.open(diskFilePath, "rb").read())} + else + next + end + end + } + end + + def create_rake_export_file + create_rake_data_file + create_rake_metadata_file + create_rake_aef_file + end + + def create_rake_metadata_file + puts "Generazione dei metadati in formato json ..." + metadata = Hash.new + metadata.store('version', APP_VERSION.gsub('.', '').to_i) + metadata.store('checksum', Digest::SHA256.file(@export.data_file).hexdigest) + metadata.store('date', Time.now) + metadata.store('producer', RbConfig::CONFIG['host']) + metadata.store('attached_entity', @export.target_class.capitalize) + metadata.store('mode', @export.mode) + File.open(@export.metadata_file, "w+") do |file| + file.write(metadata.to_json) + end + end + + def create_rake_aef_file + puts "Ultimazione pacchetto dati in formato aef ..." + files = {"metadata.json" => @export.metadata_file, "data.json" => @export.data_file} + @dir = TMP_AEF_EXPORTS + @dir.sub!(%r[/$],'') + @dir_digital = "#{Rails.root}/public/digital_objects" + @dir_digital.sub!(%r[/$],'') + include_digital_objects = @export.inc_digit + Zip::File.open(@export.dest_file, Zip::File::CREATE) do |zipfile| + files.each do |dst, src| + zipfile.add(dst, src) + end + if include_digital_objects == 'true' + fond_access_tokens = DigitalObject.select("access_token").where(:attachable_id => @export.fond_ids, :attachable_type => "Fond").map(&:access_token) + unit_access_tokens = DigitalObject.select("access_token").where(:attachable_id => @export.unit_ids, :attachable_type => "Unit").map(&:access_token) + entries = fond_access_tokens + unit_access_tokens + writeRakeEntries(entries, "", zipfile ) + end + end + files.each do |dst, src| + File.delete(src) if File.exist?(src) + end + puts "File creato: #{@export.dest_file}" + end + + def create_rake_data_file + puts "Generazione dei dati in formato json ..." + @export.fond_ids = Array.new + ActiveRecord::Base.include_root_in_json = true + case @export.target_class + when 'fond' + @export.fond_ids = Fond.subtree_of(@export.target_id).select(:id).order("sequence_number") + when 'custodian' + custodian = Custodian.select(:id).find(@export.target_id) + fonds = custodian.fonds.select(:fond_id) + fonds.each do |f| + tmp = Fond.subtree_of(f.fond_id).select(:id).order("sequence_number") + @export.fond_ids += tmp + end + when 'project' + project = Project.select(:id).find(@export.target_id) + fonds = project.fonds.select(:fond_id) + fonds.each do |f| + tmp = Fond.subtree_of(f.fond_id).select(:id).order("sequence_number") + @export.fond_ids += tmp + end + end + rake_fonds_and_units + rake_major_entities + rake_headings + rake_document_forms + rake_institutions + rake_sources + rake_digital_objects + end + + def rake_fonds_and_units + @export.unit_ids = Array.new + @export.fond_ids = @export.fond_ids.map(&:id).join(',') + fonds = Fond.where("id IN (#{@export.fond_ids})").includes([:units]).order("sequence_number") + + File.open(@export.data_file, "a") do |file| + fonds.each do |fond| + fond.legacy_id = fond.id + if fond.is_root? + fond.legacy_parent_id = nil + else + fond.legacy_parent_id = fond.parent_id.to_s + end + file.write(fond.to_json(:except => [:id, :ancestry, :group_id, :db_source, :created_by, :updated_by, :created_at, :updated_at]).gsub("\\r","")) + file.write("\r\n") + + fond.units.each do |unit| + unit.legacy_id = unit.id + unit.legacy_parent_unit_id = unit.is_root? ? nil : unit.parent_id.to_s + unit.legacy_root_fond_id = unit.root_fond_id + unit.legacy_parent_fond_id = unit.fond_id + file.write(unit.to_json(:except => [:id, :ancestry, :db_source, :created_by, :updated_by, :created_at, :updated_at]).gsub("\\r","")) + file.write("\r\n") + @export.unit_ids.push(unit.id) + end + end + + unless @export.fond_ids.empty? + @export.tables[:fonds].each do |table| + model = table.singularize.camelize.constantize + set = model.where("fond_id IN (#{@export.fond_ids})") + set.each do |e| + e.legacy_id = e.fond_id + file.write(e.to_json(:except => [:id, :db_source, :created_at, :updated_at])) + file.write("\r\n") + end + end + end + export_units_related_entities(file, @export.unit_ids, @export.tables[:units]) + end + end + + def rake_major_entities + entities = ['creator', 'custodian', 'project'] + File.open(@export.data_file, "a") do |file| + entities.each do |entity| + container = Array.new + relation = "rel_#{entity}_fond".camelize.constantize + model = entity.camelize.constantize + index = entity.pluralize.to_sym + set = relation.where("fond_id IN (#{@export.fond_ids})") + set.each do |rel| + container.push rel.send("#{entity}_id") + rel.legacy_fond_id = rel.fond_id + rel.send("legacy_#{entity}_id=", rel.send("#{entity}_id")) + file.write(rel.to_json(:except => [:id, :db_source, :fond_id, "#{entity}_id".to_sym, :created_at, :updated_at])) + file.write("\r\n") + end + + if entity == 'creator' + direct_creators = container.join(',') + unless direct_creators.blank? + set = RelCreatorCreator.where("creator_id IN (#{direct_creators}) OR related_creator_id IN (#{direct_creators})") + set.each do |rel| + rel.legacy_creator_id = rel.creator_id + rel.legacy_related_creator_id = rel.related_creator_id + file.write(rel.to_json(:except => [:id, :db_source, :creator_id, :related_creator_id, :created_at, :updated_at])) + file.write("\r\n") + container.push(rel.creator_id) + container.push(rel.related_creator_id) + end + end + end + + ids = container.uniq.join(',') + unless ids.blank? + set = model.where("id IN (#{ids})") + set.each do |ent| + ent.legacy_id = ent.id + file.write(ent.to_json(:except => [:id, :group_id, :db_source, :created_by, :updated_by, :created_at, :updated_at])) + file.write("\r\n") + end + + @export.tables[index].each do |table| + attached_model = table.singularize.camelize.constantize + set = attached_model.where("#{entity}_id IN (#{ids})") + set.each do |e| + e.legacy_id = e.send("#{entity}_id") + file.write(e.to_json(:except => [:id, :db_source, :created_at, :updated_at])) + file.write("\r\n") + end + end + end + @export.send("#{entity}_ids=", container.uniq) + end + end + end + + def rake_institutions + i = Array.new + unless @export.creator_ids.blank? + File.open(@export.data_file, "a") do |file| + set = RelCreatorInstitution.where("creator_id IN (#{@export.creator_ids.join(',')})") + set.each do |rel| + rel.legacy_creator_id = rel.creator_id + rel.legacy_institution_id = rel.institution_id + file.write(rel.to_json(:except => [:id, :db_source, :created_at, :updated_at])) + file.write("\r\n") + i.push(rel.institution_id) + end + + @export.institution_ids = i.uniq + unless @export.institution_ids.blank? + set = Institution.where("id IN (#{@export.institution_ids.join(',')})") + set.each do |institution| + institution.legacy_id = institution.id + file.write(institution.to_json(:except => [:id, :db_source, :group_id, :created_by, :updated_by, :created_at, :updated_at])) + file.write("\r\n") + end + + @export.tables[:institutions].each do |table| + model = table.singularize.camelize.constantize + set = model.where("institution_id IN (#{@export.institution_ids.join(',')})") + set.each do |e| + e.legacy_id = e.institution_id + file.write(e.to_json(:except => [:id, :db_source, :created_at, :updated_at])) + file.write("\r\n") + end + end + end + end + end + end + + def rake_headings + entities = ['fond', 'unit'] + container = Array.new + + File.open(@export.data_file, "a") do |file| + entities.each do |entity| + relation = "rel_#{entity}_heading".camelize.constantize + ids = @export.send("#{entity}_ids") + ids = ids.join(',') unless entity == 'fond' + unless ids.blank? + set = relation.where("#{entity}_id IN (#{ids})") +# Upgrade 2.0.0 fine + set.each do |rel| + rel.send("legacy_#{entity}_id=", rel.send("#{entity}_id")) + rel.legacy_heading_id = rel.heading_id + file.write(rel.to_json(:except => [:id, :db_source, :source_id, "#{entity}_id".to_sym, :created_at, :updated_at])) + file.write("\r\n") + container.push(rel.heading_id) + end + end + end + + headings = container.uniq.compact + unless headings.blank? + set = Heading.where("id IN (#{headings.join(',')})") + set.each do |heading| + heading.legacy_id = heading.id + file.write(heading.to_json(:except => [:id, :db_source, :group_id, :created_at, :updated_at])) + file.write("\r\n") + end + end + end + end + + def rake_document_forms + df = Array.new + File.open(@export.data_file, "a") do |file| + set = RelFondDocumentForm.where("fond_id IN (#{@export.fond_ids})") + set.each do |rel| + rel.legacy_fond_id = rel.fond_id + rel.legacy_document_form_id = rel.document_form_id + file.write(rel.to_json(:except => [:id, :db_source, :created_at, :updated_at])) + file.write("\r\n") + df.push(rel.document_form_id) + end + + @export.document_form_ids = df.uniq + unless @export.document_form_ids.blank? + set = DocumentForm.where("id IN (#{@export.document_form_ids.join(',')})") + set.each do |document_form| + document_form.legacy_id = document_form.id + file.write(document_form.to_json(:except => [:id, :db_source, :created_by, :updated_by, :group_id, :created_at, :updated_at])) + file.write("\r\n") + end + + @export.tables[:document_forms].each do |table| + model = table.singularize.camelize.constantize + set = model.where("document_form_id IN (#{@export.document_form_ids.join(',')})") + set.each do |e| + e.legacy_id = e.document_form_id + file.write(e.to_json(:except => [:id, :db_source, :created_at, :updated_at])) + file.write("\r\n") + end + end + end + end + end + + def rake_sources + entities = ['creator', 'custodian', 'fond', 'unit'] + container = Array.new + + File.open(@export.data_file, "a") do |file| + entities.each do |entity| + relation = "rel_#{entity}_source".camelize.constantize + ids = @export.send("#{entity}_ids") + ids = ids.join(',') unless entity == 'fond' + unless ids.blank? + set = relation.where("#{entity}_id IN (#{ids})") + set.each do |rel| + rel.send("legacy_#{entity}_id=", rel.send("#{entity}_id")) + rel.legacy_source_id = rel.source_id + file.write(rel.to_json(:except => [:id, :db_source, :source_id, "#{entity}_id".to_sym, :created_at, :updated_at])) + file.write("\r\n") + container.push(rel.source_id) + end + end + end + + @export.source_ids = container.uniq + unless @export.source_ids.blank? + set = Source.where("id IN (#{@export.source_ids.join(',')})") + set.each do |source| + source.legacy_id = source.id + file.write(source.to_json(:except => [:id, :db_source, :created_by, :updated_by, :group_id, :created_at, :updated_at])) + file.write("\r\n") + end + + @export.tables[:sources].each do |table| + model = table.singularize.camelize.constantize + set = model.where("source_id IN (#{@export.source_ids.join(',')})") + set.each do |e| + e.legacy_id = e.source_id + file.write(e.to_json(:except => [:id, :db_source, :created_at, :updated_at])) + file.write("\r\n") + end + end + end + end + end + + def rake_editors + File.open(@export.data_file, "a") do |file| + set = Editor.where("group_id = #{@export.group_id}") + set.each do |editor| + editor.legacy_id = editor.id + file.write(editor.to_json(:except => [:id, :db_source, :group_id, :created_at, :updated_at])) + file.write("\r\n") + end + end + end + + def rake_digital_objects + entities = { + 'Fond' => @export.fond_ids, + 'Unit' => @export.unit_ids, + 'Creator' => @export.creator_ids, + 'Custodian' => @export.custodian_ids, + 'Source' => @export.source_ids + } + File.open(@export.data_file, "a") do |file| + entities.each do |type, ids| + export_entity_related_digital_objects(file, type, ids) + end + end + end + + def export_units_related_entities(file, unit_ids, unit_related_tables) + sc2_attribution_reasons_ids = Array.new + sc2_commission_names_ids = Array.new + + unless unit_ids.empty? + unit_related_tables.each do |table| + model = table.singularize.camelize.constantize + set = model.where("unit_id IN (#{unit_ids.join(',')})") + set.each do |e| + e.legacy_id = e.unit_id + if (["sc2_authors","sc2_commissions"].include?(table)) then + e.legacy_current_id = e.id + if (table == "sc2_authors") then sc2_attribution_reasons_ids.push(e.id) end + if (table == "sc2_commissions") then sc2_commission_names_ids.push(e.id) end + end + file.write(e.to_json(:except => [:id, :db_source, :created_at, :updated_at])) + file.write("\r\n") + end + end + end + unless sc2_attribution_reasons_ids.empty? + set = Sc2AttributionReason.where("sc2_author_id IN (#{sc2_attribution_reasons_ids.join(',')})") + set.each do |e| + e.legacy_id = e.sc2_author_id + file.write(e.to_json(:except => [:id, :db_source, :created_at, :updated_at])) + file.write("\r\n") + end + end + unless sc2_commission_names_ids.empty? + set = Sc2CommissionName.where("sc2_commission_id IN (#{sc2_commission_names_ids.join(',')})") + set.each do |e| + e.legacy_id = e.sc2_commission_id + file.write(e.to_json(:except => [:id, :db_source, :created_at, :updated_at])) + file.write("\r\n") + end + end + end + + def export_entity_related_digital_objects(file, type, entity_ids) + unless entity_ids.blank? + entity_ids = entity_ids.join(',') unless type == 'Fond' + set = DigitalObject.where("attachable_id IN (#{entity_ids}) AND attachable_type = '#{type}'") + set.each do |digital_object| + digital_object.legacy_id = digital_object.attachable_id + file.write(digital_object.to_json(:except => [:id, :group_id, :db_source, :created_by, :updated_by, :created_at, :updated_at])) + file.write("\r\n") + end + end + end + + desc "Genera estrazioni aef con oggetti digitali relativi a: [fonds | projects | custodians]" + task :build_data, [:records, :query] => :environment do |t, args| + case args[:records] + when "fonds" + query = args[:query] + if query.blank? + puts "Query non inserita. Ripetere la procedura." + else + begin + puts "Estrazione dati aef relativi a complessi archivistici ..." + fond_root_ids = Fond.find_by_sql(query).map(&:id) + if fond_root_ids.empty? + puts "Estrazione dati terminata. Non ci sono fondi corrispondenti ai criteri selezionati." + else + i = 1 + fond_root_ids.each do |frid| + suffix = Time.now.strftime("%Y%m%d%H%M%S") + @export = Export.new + @export.target_id = frid + @export.target_class = "fond" + @export.mode = "full" + @export.metadata_file = TMP_AEF_EXPORTS + "/metadata-#{suffix}.json" + @export.data_file = TMP_AEF_EXPORTS + "/data-#{suffix}.json" + @export.dest_file = TMP_AEF_EXPORTS + "/archimista-#{get_rake_target_class_caption(@export.target_class)}-#{i}-#{suffix}.aef" + i += 1 + @export.inc_digit = 'true' + model = @export.target_class.singularize.camelize.constantize + entity = model.find(@export.target_id) + @export.group_id = entity.group_id + begin + create_rake_export_file + rescue Exception => e + puts "ERRORE: #{e.message}" + end + end + end + rescue Exception => e + puts "Eccezione #{e}" + end + puts "Estrazione dati terminata" + end + when "projects" + query = args[:query] + if query.blank? + puts "Query non inserita. Ripetere la procedura." + else + begin + puts "Estrazione dati aef relativi a progetti ..." + project_ids = Project.find_by_sql(query).map(&:id) + if project_ids.empty? + puts "Estrazione dati terminata. Non ci sono progetti corrispondenti ai criteri selezionati." + else + i = 1 + project_ids.each do |pid| + suffix = Time.now.strftime("%Y%m%d%H%M%S") + @export = Export.new + @export.target_id = pid + @export.target_class = "project" + @export.mode = "full" + @export.metadata_file = TMP_AEF_EXPORTS + "/metadata-#{suffix}.json" + @export.data_file = TMP_AEF_EXPORTS + "/data-#{suffix}.json" + @export.dest_file = TMP_AEF_EXPORTS + "/archimista-#{get_rake_target_class_caption(@export.target_class)}-#{i}-#{suffix}.aef" + i += 1 + @export.inc_digit = 'true' + model = @export.target_class.singularize.camelize.constantize + entity = model.find(@export.target_id) + @export.group_id = entity.group_id + begin + create_rake_export_file + rescue Exception => e + puts "ERRORE: #{e.message}" + end + puts "Estrazione dati terminata" + end + end + rescue Exception => e + puts "Eccezione #{e}" + end + end + when "custodians" + query = args[:query] + if query.blank? + puts "Query non inserita. Ripetere la procedura." + else + begin + puts "Estrazione dati aef relativi a soggetti conservatori ..." + custodian_ids = Custodian.find_by_sql(query).map(&:id) + if custodian_ids.empty? + puts "Estrazione dati terminata. Non ci sono soggetti conservatori corrispondenti ai criteri selezionati." + else + i = 1 + custodian_ids.each do |cid| + suffix = Time.now.strftime("%Y%m%d%H%M%S") + @export = Export.new + @export.target_id = cid + @export.target_class = "custodian" + @export.mode = "full" + @export.metadata_file = TMP_AEF_EXPORTS + "/metadata-#{suffix}.json" + @export.data_file = TMP_AEF_EXPORTS + "/data-#{suffix}.json" + @export.dest_file = TMP_AEF_EXPORTS + "/archimista-#{get_rake_target_class_caption(@export.target_class)}-#{i}-#{suffix}.aef" + i += 1 + @export.inc_digit = 'true' + model = @export.target_class.singularize.camelize.constantize + entity = model.find(@export.target_id) + @export.group_id = entity.group_id + begin + create_rake_export_file + rescue Exception => e + puts "ERRORE: #{e.message}" + end + puts "Estrazione dati terminata" + end + end + rescue Exception => e + puts "Eccezione #{e}" + end + end + else + puts "Argomento non valido.\nScegli tra [fonds | creators | custodians | sources]" + end + end + +end \ No newline at end of file diff --git a/lib/tasks/archimista_dobj.rake b/lib/tasks/archimista_dobj.rake new file mode 100644 index 0000000..511c4a3 --- /dev/null +++ b/lib/tasks/archimista_dobj.rake @@ -0,0 +1,70 @@ +ARCHIMISTA_TASKS_PATH = "#{Rails.root}/lib/tasks/" +ARCHIMISTA_DIGITAL_PATH = "#{Rails.root}/public/digital_objects/" + +namespace :dobj do + desc "Procedura di caricamento multiplo di oggetti digitali su entità archivistica" + task :upload => :environment do |t| + puts "Avvio procedura di caricamento multiplo di oggetti digitali su entità archivistica" + dobj_path = ARCHIMISTA_TASKS_PATH + "dobj.json" + if File.exist?(dobj_path) + dobj_objects = JSON.parse(File.read(dobj_path)) + dobj_objects.each do |dobj| + if dobj["type"].nil? || dobj["type"].empty? + puts "Inserire una tipologia \"type\" alla quale associare l'oggetto digitale tra le seguenti: Fond, Unit, Creator, Custodian, Source" + else + if ['Fond', 'Unit', 'Creator', 'Custodian', 'Source'].include? dobj["type"] + if dobj["id"].empty? || dobj["img_dir"].empty? || dobj["user_id"].empty? || dobj["group_id"].empty? + puts "Manca qualche variabile o hai inserito valori non accettati" + else + position = DigitalObject.where(attachable_id: dobj["id"], attachable_type: dobj["type"]).maximum(:position) + if position.nil? + position = 0 + end + puts "Gli oggetti digitali verranno caricati su entità di tipologia #{dobj["type"]} con id #{dobj["id"]}" + file_names = dobj["file_names"] + + file_names.each do |file| + complete_name_file = dobj["img_dir"] + file + puts "Caricamento del file: #{complete_name_file}" + position = position + 1 + title = File.basename(complete_name_file, ".*" ) + afn = File.basename(complete_name_file) + size = File.size(complete_name_file) + access_token = Digest::SHA1.hexdigest("#{afn}#{(Time.now.to_f * 1000).to_i}") + new_dir = ARCHIMISTA_DIGITAL_PATH + access_token + Dir.mkdir(new_dir, 0755) + + if File.extname(complete_name_file).include? ".pdf" + FileUtils.cp(complete_name_file, File.join(new_dir, "original.pdf")) + act = "application/pdf" + else + act = "image/jpeg" + ext = File.extname(complete_name_file) + FileUtils.cp(complete_name_file, File.join(new_dir, "original" + ext)) + + `convert "#{complete_name_file}" -resize 1280x1280 "#{new_dir}"/large#{ext}` + `convert "#{complete_name_file}" -resize 210x210 "#{new_dir}"/medium#{ext}` + `convert "#{complete_name_file}" -resize 130x130 "#{new_dir}"/thumb#{ext}` + end + + updated_time = Time.now.strftime('%Y-%m-%d %H:%M:%S') + + sql = "INSERT INTO digital_objects (attachable_type, attachable_id, position, title, description, access_token, asset_file_name, asset_content_type, asset_file_size, asset_updated_at, created_by, updated_by, group_id, created_at, updated_at) VALUES ('#{dobj["type"]}', #{dobj["id"]}, '#{position}', '#{title}', '#{title}', '#{access_token}', '#{afn}', '#{act}', #{size}, '#{updated_time}', #{dobj["user_id"]}, #{dobj["user_id"]}, #{dobj["group_id"]}, '#{updated_time}', '#{updated_time}')" + ActiveRecord::Base.connection.execute(sql) + end + + + puts "La procedura è stata completata, tutti i file digitali sono stati associati all'entità prescelta" + end + else + puts "La tipologia " + dobj["type"] + " non è tra quelle selezionabili: fond, unit, creator, custodian, source" + end + end + end + + + else + puts "Il file di configurazione " + dobj_path + " non esiste" + end + end +end \ No newline at end of file diff --git a/lib/tasks/archimista_ead.rake b/lib/tasks/archimista_ead.rake new file mode 100644 index 0000000..7b33fce --- /dev/null +++ b/lib/tasks/archimista_ead.rake @@ -0,0 +1,346 @@ +require File.join(File.dirname(__FILE__), "..", "exporter/Configurazione_dl.rb") +require 'zip' +require 'builder' + +TMP_RAKE_EAD_EXPORTS = "#{Rails.root}/public/exports" + +namespace :ead do + + def views_path(record) + File.join(File.dirname(__FILE__), "..", "exporter/views", record) + end + + def set_fonds + @fonds = Fond.roots.order(:name) + end + + def selected_fond_ids + set_fonds + fond_ids = @fonds.map(&:id) + end + + def stream_ead(records, ids = [], zip_file_name) + if records.present? + begin + file = "#{records.class.name.tableize}_ead.xml" + view = ActionView::Base.new(views_path(records.class.name.tableize)) + if records.class.name.tableize == 'creators' + data_file_name = TMP_RAKE_EAD_EXPORTS + "/sp-#{records.id}.xml" + file_name = "sp-#{records.id}.xml" + elsif records.class.name.tableize == 'institutions' + data_file_name = TMP_RAKE_EAD_EXPORTS + "/pi-#{records.id}.xml" + file_name = "pi-#{records.id}.xml" + elsif records.class.name.tableize == 'fonds' + data_file_name = TMP_RAKE_EAD_EXPORTS + "/ca-#{records.id}.xml" + file_name = "ca-#{records.id}.xml" + elsif records.class.name.tableize == 'custodians' + data_file_name = TMP_RAKE_EAD_EXPORTS + "/sc-#{records.id}.xml" + file_name = "sc-#{records.id}.xml" + elsif records.class.name.tableize == 'anagraphics' + data_file_name = TMP_RAKE_EAD_EXPORTS + "/sa-#{records.id}.xml" + file_name = "sa-#{records.id}.xml" + else + data_file_name = TMP_RAKE_EAD_EXPORTS + "/data-#{records.class.name.tableize}-#{records.id}.xml" + file_name = "data-#{records.class.name.tableize}-#{records.id}.xml" + end + + file_dest = File.new(data_file_name, 'w+') + xml = ::Builder::XmlMarkup.new(target: file_dest, :indent => 2) + xml = view.render(:file => "#{file}.builder", :locals => {:records => [records], :fond_ids => ids}) + File.open(file_dest, 'w+') { |f| f.write(xml) } + file_dest_path = file_dest.path + file_dest.close + + Zip::File.open(zip_file_name, Zip::File::CREATE) do |zipfile| + zipfile.add(file_name, file_dest_path) + end + + File.delete(TMP_RAKE_EAD_EXPORTS + "/" + file_name) if File.exist?(TMP_RAKE_EAD_EXPORTS + "/" + file_name) + rescue Exception => e + puts "Eccezione record #{records.id}: #{e}" + end + else + puts "Record non specificato" + end + end + + def build_icar_import(fond) + prefix = Time.now.strftime("%Y-%m-%d-%H-%M-%S-") + + zip_file_name = TMP_RAKE_EAD_EXPORTS + "/#{prefix}icar-import-#{fond.id}.zip" + File.delete(zip_file_name) if File.exist?(zip_file_name) + + file_name = "#{prefix}icar-import-#{fond.id}.xml" + data_file_name = TMP_RAKE_EAD_EXPORTS + "/" + file_name + file_dest = File.new(data_file_name, 'w+') + view = ActionView::Base.new(views_path("icar-import")) + xml = ::Builder::XmlMarkup.new(target: file_dest, :indent => 2) + digital_objects = Array.new + xml = view.render(:file => "icar-import.xml.builder", :locals => {:fond => fond}) + + xml_formatted = '' + require "rexml/document" + doc = REXML::Document.new(xml.to_s) + #formatter = REXML::Formatters::Pretty.new # Rimuove CR/LF + #formatter.compact = true # dai testi nelle Text Area + formatter = REXML::Formatters::Default.new + formatter.write(doc, xml_formatted) + + File.open(file_dest, 'w+') { |f| f.write(xml_formatted) } + Zip::File.open(zip_file_name, Zip::File::CREATE) do |zipfile| + zipfile.add(file_name, file_dest.path) + end + + begin + file_dest.close + File.delete(data_file_name) if File.exist?(data_file_name) + rescue Exception => e + puts "ECCEZIONE in archimista_ead.rake > build_icar_import: #{e.message}" + end + + #oggetti digitali + begin + fonds_id = Array.new + fonds_id.push(fond.id) + if fond.ancestry.nil? + query = "ancestry LIKE '#{fond.id}/%' OR ancestry = '#{fond.id}'" + else + query = "ancestry LIKE '#{fond.ancestry}/%' OR ancestry = '#{fond.ancestry}'" + end + children_ids = Fond.where(query).pluck(:id) + fonds_id = fonds_id + children_ids + unit_ids = Unit.where(fond_id: fonds_id).pluck(:id) + digital_objects = DigitalObject.where(attachable_id: unit_ids) + if !digital_objects.empty? + Zip::File.open(zip_file_name, false) do |zipfile| + digital_objects.each do |digital_object| + begin + dob_files = Dir.entries("#{Rails.root}/public/digital_objects/#{digital_object.access_token}").select {|f| !File.directory? f} + dob_files.each do |dob_file_name| + dob_file_path = "#{Rails.root}/public/digital_objects/#{digital_object.access_token}/#{dob_file_name}" + zipfile.add("#{digital_object.access_token}/#{dob_file_name}", dob_file_path) + end + rescue Exception => e + puts "ECCEZIONE nell'esportazione di un Oggetto Digitale: #{e.message}" + end + end + end + end + rescue Exception => e + puts "ECCEZIONE nell'esportazione di Oggetti Digitali: #{e.message}" + end + puts "Creazione file ICAR-IMPORT terminata." + end + + desc "Genera metadati EAD relativi a: [fonds | creators | institutions | custodians | sources | units | anagraphics | icar-import]" + task :build_xml, [:records, :query] => :environment do |t, args| + case args[:records] + when "fonds" + query = args[:query] + if query.blank? + puts "Query non inserita. Ripetere la procedura." + else + begin + @fonds = Fond.find_by_sql(query) + if @fonds.count > 0 + puts "Creazione file EAD contenente #{@fonds.count} complessi archivistici ..." + prefix = Time.now.strftime("%Y-%m-%d-%H-%M-%S-") + zip_file_name = TMP_RAKE_EAD_EXPORTS + "/" + prefix + "fonds.zip" + puts "... Attendere, creazione file in corso ..." + File.delete(zip_file_name) if File.exist?(zip_file_name) + @fonds.each do |f| + stream_ead(f, [], zip_file_name) + end + part_zips_count = Zip::File.split(zip_file_name, 1_152, false) + puts "File creato: #{zip_file_name}" + + Dir.glob("#{TMP_RAKE_EAD_EXPORTS}/ca-*.xml").each { |file| File.delete(file)} + else + puts "Nessun complesso archivistico trovato." + end + rescue Exception => e + puts "Eccezione #{e}" + end + end + when "creators" + query = args[:query] + if query.blank? + puts "Query non inserita. Ripetere la procedura." + else + begin + @creators = Creator.find_by_sql(query) + if @creators.count > 0 + puts "Creazione file EAC-CPF contenente #{@creators.count} soggetti produttori ..." + zip_file_name = TMP_RAKE_EAD_EXPORTS + "/creators.zip" + puts "... Attendere, creazione file in corso ..." + File.delete(zip_file_name) if File.exist?(zip_file_name) + @creators.each do |c| + stream_ead(c, selected_fond_ids, zip_file_name) + end + part_zips_count = Zip::File.split(zip_file_name, 1_152, false) + puts "File creato: #{zip_file_name}" + + Dir.glob("#{zip_file_name}.*").each { |file| File.delete(file)} + else + puts "Nessun soggetto produttore trovato." + end + rescue Exception => e + puts "Eccezione #{e}" + end + end + when "institutions" + query = args[:query] + if query.blank? + puts "Query non inserita. Ripetere la procedura." + else + begin + @institutions = Institution.find_by_sql(query) + if @institutions.count > 0 + puts "Creazione file EAC-CPF contenente #{@institutions.count} profili istituzionali ..." + zip_file_name = TMP_RAKE_EAD_EXPORTS + "/institutions.zip" + puts "... Attendere, creazione file in corso ..." + File.delete(zip_file_name) if File.exist?(zip_file_name) + @institutions.each do |c| + stream_ead(c, [], zip_file_name) + end + part_zips_count = Zip::File.split(zip_file_name, 1_152, false) + puts "File creato: #{zip_file_name}" + + Dir.glob("#{zip_file_name}.*").each { |file| File.delete(file)} + else + puts "Nessun profilo istituzionale trovato." + end + rescue Exception => e + puts "Eccezione #{e}" + end + end + when "custodians" + query = args[:query] + if query.blank? + puts "Query non inserita. Ripetere la procedura." + else + begin + @custodians = Custodian.find_by_sql(query) + if @custodians.count > 0 + puts "Creazione file SCONS contenente #{@custodians.count} soggetti conservatori ..." + zip_file_name = TMP_RAKE_EAD_EXPORTS + "/custodians.zip" + puts "... Attendere, creazione file in corso ..." + File.delete(zip_file_name) if File.exist?(zip_file_name) + @custodians.each do |c| + stream_ead(c, [], zip_file_name) + end + part_zips_count = Zip::File.split(zip_file_name, 1_152, false) + puts "File creato: #{zip_file_name}" + + Dir.glob("#{zip_file_name}.*").each { |file| File.delete(file)} + else + puts "Nessun soggetto conservatore trovato." + end + rescue Exception => e + puts "Eccezione #{e}" + end + end + when "sources" + query = args[:query] + if query.blank? + puts "Query non inserita. Ripetere la procedura." + else + begin + @sources = Source.find_by_sql(query) + if @sources.count > 0 + puts "Creazione file EAD contenente #{@sources.count} fonti / strumenti di ricerca ..." + prefix = Time.now.strftime("%Y-%m-%d-%H-%M-%S-") + zip_file_name = TMP_RAKE_EAD_EXPORTS + "/" + prefix + "sources.zip" + puts "... Attendere, creazione file in corso ..." + File.delete(zip_file_name) if File.exist?(zip_file_name) + @sources.each do |s| + stream_ead(s, [], zip_file_name) + end + part_zips_count = Zip::File.split(zip_file_name, 1_152, false) + puts "File creato: #{zip_file_name}" + + Dir.glob("#{zip_file_name}.*").each { |file| File.delete(file)} + else + puts "Nessuna fonte/strumento di ricerca trovato." + end + rescue Exception => e + puts "Eccezione #{e}" + end + end + when "units" + query = args[:query] + if query.blank? + puts "Query non inserita. Ripetere la procedura." + else + begin + @units = Unit.find_by_sql(query) + if @units.count > 0 + puts "Creazione file EAD contenente #{@units.count} unità archivistiche ..." + zip_file_name = TMP_RAKE_EAD_EXPORTS + "/units.zip" + puts "... Attendere, creazione file in corso ..." + File.delete(zip_file_name) if File.exist?(zip_file_name) + @units.each do |s| + stream_ead(s, [], zip_file_name) + end + part_zips_count = Zip::File.split(zip_file_name, 1_152, false) + puts "File creato: #{zip_file_name}" + + Dir.glob("#{zip_file_name}.*").each { |file| File.delete(file)} + else + puts "Nessuna unità archivistica trovata." + end + rescue Exception => e + puts "Eccezione #{e}" + end + end + when "anagraphics" + query = args[:query] + if query.blank? + puts "Query non inserita. Ripetere la procedura." + else + begin + @anagraphics = RelUnitAnagraphic.find_by_sql(query) + if @anagraphics.count > 0 + rua_list = Array.new + @anagraphics.each do |rel_unit_anagraphic| + if !rua_list.include?(rel_unit_anagraphic.anagraphic_id) + rua_list.push rel_unit_anagraphic.anagraphic_id + end + end + puts "Creazione file EAC-CPF contenente #{rua_list.count} schede anagrafiche ..." + zip_file_name = TMP_RAKE_EAD_EXPORTS + "/anagraphics.zip" + puts "... Attendere, creazione file in corso ..." + File.delete(zip_file_name) if File.exist?(zip_file_name) + rua_list.each do |anagraphic_id| + s = Anagraphic.find(anagraphic_id) + stream_ead(s, [], zip_file_name) + end + part_zips_count = Zip::File.split(zip_file_name, 1_152, false) + puts "File creato: #{zip_file_name}" + + Dir.glob("#{zip_file_name}.*").each { |file| File.delete(file)} + else + puts "Nessuna scheda anagrafica trovata." + end + rescue Exception => e + puts "Eccezione #{e}" + end + end + when "icar-import" + fond_id = args[:query] + if fond_id.blank? + puts "Id complesso archivistico non inserito. Ripetere la procedura." + else + begin + @fond = Fond.find(fond_id) + puts "Creazione file ICAR-IMPORT ..." + build_icar_import(@fond) + rescue Exception => e + puts "Eccezione #{e}" + end + end + else + puts "Argomento non valido.\nScegli tra [fonds | creators | institutions | custodians | sources | units | anagraphics | icar-import]" + end + end +end diff --git a/lib/tasks/archimista_import.rake b/lib/tasks/archimista_import.rake new file mode 100644 index 0000000..50d6b72 --- /dev/null +++ b/lib/tasks/archimista_import.rake @@ -0,0 +1,150 @@ +=begin + +Esegue l'importazione batch di file aef o in formato XML secondo i tracciati +EAD3, EAC-CPF, SCONS2, ICAR-IMPORT + +Lanciare nella console come segue: + + RAILS_ENV=production rake import[,] + +dove: + + è la username dell'utente Archimista con cui eseguire l'import + + + è il nome del file da importare che deve essere preventivamente + copiato nella cartella: #{Rails.root}/public/imports/batch_import/ + +Esempio: + + RAILS_ENV=production rake import["admin_archimista","Complesso.xml"] + +NB: non inserire spazi prima, dopo e tra i valori dei parametri + e + per evitare l'errore: "Don't know how to build task" + +=end +require File.join(File.dirname(__FILE__), "../../app/controllers", "application_controller.rb") +require File.join(File.dirname(__FILE__), "../../app/controllers", "imports_controller.rb") +require File.join(File.dirname(__FILE__), "../../config/initializers", "devise.rb") +require File.join(File.dirname(__FILE__), "../../app/models", "user.rb") +require File.join(File.dirname(__FILE__), "../../app/models", "rel_user_group.rb") +require File.join(File.dirname(__FILE__), "../../app/models", "digital_object.rb") +require File.join(File.dirname(__FILE__), "../../config/initializers", "metadata.rb") +require 'fileutils' +require 'active_record' + +task :default => [:import] + +DEBUG_MODE = false + +USO_DEL_TASK = "\n>>> Il task Esegue l'importazione batch di file aef o in formato XML\n secondo i tracciati EAD3, EAC-CPF, SCONS2, ICAR-IMPORT\n\n USO DEL TASK:\n RAILS_ENV=production rake import[,]\n\n Esempio:\n RAILS_ENV=production rake import[\"admin_archimista\",\"Complesso.xml\"]\n\n NB: il file da importare deve essere preventivamente copiato nella cartella:\n #{Rails.root}/public/imports/batch_import/" + +task :import, [:username, :import_filename] do |task, args| + + puts "\n> Esecuzione task di importazione" + + if DEBUG_MODE + puts "\n" + puts "+ Rails.root : #{Rails.root}" + puts "+ Rails.env : #{Rails.env}" + puts "+ Rails.logger.nil? : #{Rails.logger.nil?}" + puts "+ Rake file full path : #{__FILE__}" + puts "+ args[:username] : #{args[:username]}" + puts "+ args[:import_filename] : #{args[:import_filename]}" + end + + if Rails.logger.nil? + puts "\n>>> Rails.logger è NIL" + log_file_name = "#{Rails.env}.log" + Rails.logger = Logger.new("#{Rails.root}/log/#{log_file_name}") + puts "\n> Rails.logger sta ora loggando su #{log_file_name}" + Rails.logger.info "Inizio log del rake task #{__FILE__}" + end + + I18n.load_path += Dir[Rails.root.join('config', 'locales', '*.{rb,yml}')] + I18n.locale = :it + I18n.default_locale = :it + puts "\n> I18n.locale : #{I18n.locale}" + if DEBUG_MODE + puts "+ I18n.load_path : #{I18n.load_path}" + puts "+ I18n.t 'created_at' : #{I18n.t 'created_at'}" # test di traduzione + end + + db_config = Rails.application.config.database_configuration[Rails.env] + if DEBUG_MODE + puts "\n+ db_config: #{db_config}" + end + + ActiveRecord::Base.establish_connection(db_config) + ActiveRecord::Base.connection + + if ActiveRecord::Base.connected? + puts "\n> Connesso al Database" + else + puts "\n>>> NON CONNESSO AL DATABASE" + puts "\n>>> Task terminato." + exit + end + + username = args[:username] + if !username.nil? + username.strip! + else + username = "" + end + + if username == "" + puts USO_DEL_TASK + puts "\n>>> USERNAME DELL'UTENTE PER L'IMPORT NON SPECIFICATO" + puts "\n>>> Task terminato." + exit + end + + batch_import_user = User.where(username: username).first + if batch_import_user.present? + puts "\n> Utente per l'import trovato" + puts " Username: #{username}" + puts " ID : #{batch_import_user[:id]}" + puts " E-mail : #{batch_import_user[:email]}" + else + puts "\n>>> USERNAME DELL'UTENTE PER L'IMPORT NON TROVATO" + puts " Username: #{username}" + puts "\n>>> Task terminato." + exit + end + + batch_import_filename = args[:import_filename] + if !batch_import_filename.nil? + batch_import_filename.strip! + else + batch_import_filename = "" + end + + if batch_import_filename == "" + puts USO_DEL_TASK + puts "\n>>> NOME DEL FILE DA IMPORTARE NON SPECIFICATO" + puts "\n>>> Task terminato." + exit + end + + src_file = File.join(Rails.root, "public", "imports", "batch_import", batch_import_filename) + if !File.file?(src_file) + puts USO_DEL_TASK + puts "\n>>> FILE DA IMPORTARE NON TROVATO" + puts " Filename: #{batch_import_filename}" + puts "\n>>> Task terminato." + exit + end + + @imports_controller = ImportsController.new + @imports_controller.is_batch_import = true + @imports_controller.batch_import_user = batch_import_user + @imports_controller.batch_import_filename = batch_import_filename + + require File.join(File.dirname(__FILE__), "../../app/models", "import.rb") + + @imports_controller.new + @imports_controller.create + +end diff --git a/lib/tasks/archimista_san.rake b/lib/tasks/archimista_san.rake new file mode 100644 index 0000000..a12f134 --- /dev/null +++ b/lib/tasks/archimista_san.rake @@ -0,0 +1,191 @@ +require File.join(File.dirname(__FILE__), "..", "exporter/Configurazione_dl.rb") +require 'zip' +require 'builder' + +TMP_RAKE_EXPORTS = "#{Rails.root}/public/exports" + +namespace :san do + + def views_path(record) + File.join(File.dirname(__FILE__), "..", "exporter/views", record) + end + + def set_fonds + @fonds = Fond.roots.order(:name) + end + + def selected_fond_ids + set_fonds + fond_ids = @fonds.map(&:id) + end + + def stream(records, fond_ids = []) + if records.present? + file = "#{records[0].class.name.tableize}.xml" + dl_metadata = {'DL_FOND_ID' => DL_FOND_ID, 'PROVIDER_DL' => PROVIDER_DL, + 'DL_HACONSERVATORE' => DL_HACONSERVATORE, 'DL_REPOSITORYID' => DL_REPOSITORYID, + 'DL_ABBR' => DL_ABBR, 'DL_CORPNAME' => DL_CORPNAME, + 'DL_HAPROGETTO' => DL_HAPROGETTO, 'DL_HACOMPLESSO' => DL_HACOMPLESSO, + 'DL_UNITID' => DL_UNITID, 'DL_UNITTITLE' => DL_UNITTITLE + } + view = ActionView::Base.new(views_path(records[0].class.name.tableize)) + + data_file_name = TMP_RAKE_EXPORTS + "/" + file + + puts "... Attendere, creazione file in corso ..." + + file_dest = File.new(data_file_name, 'w+') + xml = ::Builder::XmlMarkup.new(target: file_dest, :indent => 2) + + xml = view.render(:file => "#{file}.builder", :locals => {:records => records, :fond_ids => fond_ids, :metadata => dl_metadata}) + File.open(file_dest, 'w+') { |f| f.write(xml) } + + zip_file_name = TMP_RAKE_EXPORTS + "/" + "#{records[0].class.name.tableize}.zip" + file_dest_path = file_dest.path + + File.delete(zip_file_name) if File.exist?(zip_file_name) + + Zip::File.open(zip_file_name, Zip::File::CREATE) do |zipfile| + zipfile.add(file, file_dest_path) + end + File.delete(data_file_name) if File.exist?(data_file_name) + part_zips_count = Zip::File.split(zip_file_name, 1_152, false) + + puts "File creato: #{zip_file_name}" + else + puts "Nessun risultato" + end + end + + def stream_mets(records) + if records.present? + file = "digital_objects.xml" + dl_metadata = {'DL_FOND_ID' => DL_FOND_ID, 'PROVIDER_DL' => PROVIDER_DL, + 'DL_HACONSERVATORE' => DL_HACONSERVATORE, 'DL_REPOSITORYID' => DL_REPOSITORYID, + 'DL_ABBR' => DL_ABBR, 'DL_CORPNAME' => DL_CORPNAME, + 'DL_HAPROGETTO' => DL_HAPROGETTO, 'DL_HACOMPLESSO' => DL_HACOMPLESSO, + 'DL_UNITID' => DL_UNITID, 'DL_UNITTITLE' => DL_UNITTITLE + } + + view = ActionView::Base.new(views_path("digital_objects")) + + data_file_name = TMP_RAKE_EXPORTS + "/" + file + + puts "... Attendere, creazione file in corso ..." + + file_dest = File.new(data_file_name, 'w+') + xml = ::Builder::XmlMarkup.new(target: file_dest, :indent => 2) + + xml = view.render(:file => "#{file}.builder", :locals => {:records => records, :metadata => dl_metadata}) + File.open(file_dest, 'w+') { |f| f.write(xml) } + + zip_file_name = TMP_RAKE_EXPORTS + "/" + "#{records[0].class.name.tableize}.zip" + file_dest_path = file_dest.path + + File.delete(zip_file_name) if File.exist?(zip_file_name) + + Zip::File.open(zip_file_name, Zip::File::CREATE) do |zipfile| + zipfile.add(file, file_dest_path) + end + + part_zips_count = Zip::File.split(zip_file_name, 1_152, false) + + puts "File creato: #{zip_file_name}" + else + puts "Nessun risultato" + end + end + + desc "Genera metadati CAT-SAN relativi a: [fonds | creators | custodians | sources]" + task :build_xml, [:records, :query] => :environment do |t, args| + case args[:records] + when "fonds" + query = args[:query] + if query.blank? + puts "Query non inserita. Ripetere la procedura." + else + begin + fondi = Fond.find_by_sql(query) + fond_ids = [] + fondi.each do |f| + fond_ids.push(f.id) + fond_children_ids = Fond.where("ancestry in (?) and ancestry_depth = 1", f.id).map(&:id) + fond_rel_creator_ids = RelCreatorFond.where("fond_id in (?)", f.id).map(&:creator_id) + fond_children_ids.each do |fci| + fond_children_rel_creator_ids = RelCreatorFond.where("fond_id in (?)", fci).map(&:creator_id) + fond_children_rel_creator_ids.each do |fcrci| + if !fond_rel_creator_ids.include? fcrci + fond_ids.push(fci) + break + end + end + end + end + @fonds = Fond.where("id in (?)", fond_ids) + puts "Creazione file CAT-SAN contenente #{@fonds.count} complessi archivistici ..." + stream(@fonds) + rescue Exception => e + puts "Eccezione #{e}" + end + end + when "creators" + query = args[:query] + if query.blank? + puts "Query non inserita. Ripetere la procedura." + else + begin + @creators = Creator.find_by_sql(query) + puts "Creazione file CAT-SAN contenente #{@creators.count} complessi archivistici ..." + stream(@creators, selected_fond_ids) + rescue Exception => e + puts "Eccezione #{e}" + end + end + when "custodians" + query = args[:query] + if query.blank? + puts "Query non inserita. Ripetere la procedura." + else + begin + @custodians = Custodian.find_by_sql(query) + puts "Creazione file CAT-SAN contenente #{@custodians.count} soggetti conservatori ..." + stream(@custodians) + rescue Exception => e + puts "Eccezione #{e}" + end + end + when "sources" + query = args[:query] + if query.blank? + puts "Query non inserita. Ripetere la procedura." + else + begin + @sources = Source.find_by_sql(query) + puts "Creazione file CAT-SAN contenente #{@sources.count} fonti / strumenti di ricerca ..." + stream(@sources, selected_fond_ids) + rescue Exception => e + puts "Eccezione #{e}" + end + end + else + puts "Argomento non valido.\nScegli tra [fonds | creators | custodians | sources]" + end + end + + desc "Genera metadati METS-SAN relativi a immagini di unità archivistiche, per singolo complesso di livello 1" + task :build_mets, [:query] => :environment do |t, args| + query = args[:query] + if query.blank? + puts "Query non inserita. Ripetere la procedura." + else + begin + @units = Unit.find_by_sql(query) + puts "Genero file METS-SAN con #{@units.count} unità ..." + stream_mets(@units) + rescue Exception => e + puts "Eccezione #{e}" + end + end + end + +end \ No newline at end of file diff --git a/lib/tasks/dobj.json b/lib/tasks/dobj.json new file mode 100644 index 0000000..a2fdf9e --- /dev/null +++ b/lib/tasks/dobj.json @@ -0,0 +1,110 @@ +[{ + "type": "Unit", + "id": "1", + "img_dir": "/public/test/", + "file_names" : [ + "hr.jpeg", + "p2.jpeg" + ], + "user_id": "1", + "group_id": "1" +}, +{ + "type": "Unit", + "id": "2", + "img_dir": "/public/test/", + "file_names" : [ + "hr.jpeg", + "p2.jpeg" + ], + "user_id": "1", + "group_id": "1" +}, +{ + "type": "Unit", + "id": "3", + "img_dir": "/public/test/", + "file_names" : [ + "hr.jpeg", + "p2.jpeg" + ], + "user_id": "1", + "group_id": "1" +}, +{ + "type": "Unit", + "id": "4", + "img_dir": "/public/test/", + "file_names" : [ + "hr.jpeg", + "p2.jpeg" + ], + "user_id": "1", + "group_id": "1" +}, +{ + "type": "Unit", + "id": "5", + "img_dir": "/public/test/", + "file_names" : [ + "hr.jpeg", + "p2.jpeg" + ], + "user_id": "1", + "group_id": "1" +}, +{ + "type": "Unit", + "id": "6", + "img_dir": "/public/test/", + "file_names" : [ + "hr.jpeg", + "p2.jpeg" + ], + "user_id": "1", + "group_id": "1" +}, +{ + "type": "Unit", + "id": "7", + "img_dir": "/public/test/", + "file_names" : [ + "hr.jpeg", + "p2.jpeg" + ], + "user_id": "1", + "group_id": "1" +}, +{ + "type": "Unit", + "id": "8", + "img_dir": "/public/test/", + "file_names" : [ + "hr.jpeg", + "p2.jpeg" + ], + "user_id": "1", + "group_id": "1" +}, +{ + "type": "Unit", + "id": "9", + "img_dir": "/public/test/", + "file_names" : [ + "hr.jpeg", + "p2.jpeg" + ], + "user_id": "1", + "group_id": "1" +}, +{ + "type": "Unit", + "id": "10", + "img_dir": "/public/test/", + "file_names" : [ + "hr.jpeg", + "p2.jpeg" + ], + "user_id": "1", + "group_id": "1" +}] \ No newline at end of file diff --git a/lib/tasks/repair.rake b/lib/tasks/repair.rake index 414d4b8..826883f 100644 --- a/lib/tasks/repair.rake +++ b/lib/tasks/repair.rake @@ -26,6 +26,7 @@ namespace :repair do "rel_project_fonds" => ["project_id", "fond_id"], "rel_unit_headings" => ["unit_id", "heading_id"], "rel_unit_sources" => ["unit_id", "source_id"], + "rel_unit_anagraphics" => ["unit_id", "anagraphic_id"] } tables.each do |table, foreign_keys| diff --git a/lib/tree_ext/acts_as_sequence/acts_as_external_sequence.rb b/lib/tree_ext/acts_as_sequence/acts_as_external_sequence.rb index e4e561e..50e6518 100644 --- a/lib/tree_ext/acts_as_sequence/acts_as_external_sequence.rb +++ b/lib/tree_ext/acts_as_sequence/acts_as_external_sequence.rb @@ -79,7 +79,7 @@ def acts_as_external_sequence(options={}) options.delete(:conditions) ) - where(conditions).merge(options) + where(conditions).joins(options[:joins] || '') } # Upgrade 2.0.0 fine diff --git a/public/assets/.gitignore b/public/assets/.gitignore index e69de29..5e7d273 100644 --- a/public/assets/.gitignore +++ b/public/assets/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore diff --git a/public/images/logo-lombardia.jpg b/public/images/logo-lombardia.jpg index eb28d8f..8ea89af 100644 Binary files a/public/images/logo-lombardia.jpg and b/public/images/logo-lombardia.jpg differ diff --git a/public/imports/.gitignore b/public/imports/.gitignore new file mode 100644 index 0000000..5e7d273 --- /dev/null +++ b/public/imports/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore diff --git a/public/javascripts/anagraphics.js b/public/javascripts/anagraphics.js new file mode 100644 index 0000000..582783f --- /dev/null +++ b/public/javascripts/anagraphics.js @@ -0,0 +1,125 @@ +$(document).ready(function () { + getAnagraphicList = function () { + var id = $("#anagraphic-list").attr('data-id'); + var controller = $("#anagraphic-list").attr('data-controller'); + $.get('/anagraphics/ajax_list', { + related_entity_id: id, + related_entity: controller + }).success(function (data) { + $("#anagraphic-list").html(data); + }); + return false; + }; + + getSelectedText = function (ids) { + var text = ''; + var len = ids.length; + for (var i = 0; i < len; i++) { + var element = $('#' + ids[i]); + if (element[0].tagName.toLowerCase() == "textarea" || element[0].tagName.toLowerCase() == "input") { + var input = document.getElementById(element.attr('id')); + var start = input.selectionStart; + var end = input.selectionEnd; + text = element.val().substring(start, end); + } else { + if (window.getSelection) { + text = window.getSelection(); + } else if (document.getSelection) { + text = document.getSelection(); + } else if (document.selection) { + text = document.selection.createRange().text; + } + } + if (text != '') break; + } + return text; + }; + + if ($("#anagraphic-list").length) { + getAnagraphicList(); + } + + + $("#add-anagraphic-modal").click(function (event) { + event.preventDefault(); + var id = $(this).attr('data-id'); + var controller = $(this).attr('data-controller'); + $.get('/anagraphics/modal_new', { + related_id: id, + related_controller: controller + }).success(function (data) { + $('#add-anagraphic-container').html(data); + $('#add-anagraphic-container #add-anagraphic-dialog').modal("show"); + text = getSelectedText(['unit_content']); + $('#anagraphic_name').val(text); + if (text != '') { + $("#create-anagraphic-btn").removeClass('disabled').prop('disabled', false); + } + }); + return false; + }); + + $("#link-anagraphic-modal").click(function (event) { + event.preventDefault(); + var id = $(this).attr('data-id'); + var controller = $(this).attr('data-controller'); + $.get('/anagraphics/modal_link', { + related_entity_id: id, + related_entity: controller + }).success(function (data) { + $('#link-anagraphic-container').html(data); + $('#link-anagraphic-container #link-anagraphic-dialog').modal("show"); + }); + return false; + }); + + $(document).delegate('#create-anagraphic-btn', 'click', function (event) { + $.post('/anagraphics/modal_create', $('#new_anagraphic').serialize(), function (data) { + if (data.status === "success") { + $('#add-anagraphic-dialog').modal("hide"); + getAnagraphicList(); + } else { + $("#anagraphic_form_error"). + html('
×' + data.msg + '.
'); + } + }, 'json'); + event.stopImmediatePropagation(); + }); + + $(document).delegate('#link-anagraphic-btn', 'click', function (event) { + $.post('/anagraphics/ajax_link', $('#link-anagraphic-form').serialize(), function (data) { + if (data.status === "success") { + $('#link-anagraphic-dialog').modal("hide"); + getAnagraphicList(); + } + }, 'json'); + event.stopImmediatePropagation(); + }); + + $(document).delegate(".anagraphic-remove", 'click', function (event) { + event.preventDefault(); + var anagraphic_id = $(this).attr('data-anagraphic_id'); + var related_entity_id = $(this).attr('data-related_entity_id'); + var related_entity = $(this).attr('data-related_entity'); + $.post('/anagraphics/ajax_remove', { + related_entity_id: related_entity_id, + related_entity: related_entity, + anagraphic_id: anagraphic_id + }).success(function (data) { + if (data.status == 'success') { + getAnagraphicList(); + } else { + alert(data.msg) + } + }, 'json'); + event.stopImmediatePropagation(); + }); + + $(document).delegate(":input[@name='anagraphic_id']", 'click', function () { + $("#link-anagraphic-btn").removeClass('disabled').prop('disabled', false); + }); + + $(document).delegate("#anagraphic_name", 'change', function () { + $("#create-anagraphic-btn").removeClass('disabled').prop('disabled', false); + }); +}); \ No newline at end of file diff --git a/public/javascripts/fonds-merge.js b/public/javascripts/fonds-merge.js index 49cb87b..ea550d3 100644 --- a/public/javascripts/fonds-merge.js +++ b/public/javascripts/fonds-merge.js @@ -1,28 +1,41 @@ $(document).ready(function () { $.jump_to_fonds = {}; - $(document).delegate(".merge", 'click', function () { var id = $(this).attr('data-id'); $.get('fonds/' + id + '/merge_with').success(function (data) { - + $('#merge-with-container').html(data); $('#merge-with-container #merge-fonds-modal').modal("show"); - + }); }); $(document).delegate("#fonds-list input[@name='new_root_id']", 'click', function (event) { - var target_value = event.target.value; - $.jump_to_fonds.tree = $("#jump-to-tree" + target_value); - $.jump_to_fonds.jump(target_value); + var id = $(this).val(); + + if($('#fondmerge-'+id).hasClass('open')){ + $('#fondmerge-'+id).removeClass('open'); + }else{ + $('.dropdown.divmerge').each(function () { + if ($(this).hasClass('open')) { + $(this).removeClass('open'); + } + }); + $('#fondmerge-'+id).addClass('open'); + + var target_value = event.target.value; + $.jump_to_fonds.tree = $("#jump-to-tree" + target_value); + $.jump_to_fonds.jump(target_value); + } + }); $.jump_to_fonds.tree_setup = function ($tree, root_id, current_node_id) { - var self, target_node_id; + var self, target_node_id, target_name; self = this; @@ -50,7 +63,8 @@ $(document).ready(function () { .delegate("li a", "click", function (event) { event.stopPropagation(); target_node_id = $(this).parent("li").attr('id').split('-').pop(); - $tree.trigger("node_selected.custom_jstree", target_node_id); + target_name = $(this)[0].innerText; + $tree.trigger("node_selected.custom_jstree", {target_node_id: target_node_id, target_name: target_name}); }) .delegate($tree, "click", function (event) { event.stopPropagation(); @@ -59,7 +73,7 @@ $(document).ready(function () { }; $.jump_to_fonds.jump = function (target_id) { - + var self, root_id, current_node_id, action; self = this; @@ -68,40 +82,25 @@ $.jump_to_fonds.jump = function (target_id) { root_id = target_id; current_node_id = target_id; action = self.tree.data('action'); - + self.tree_setup(self.tree, root_id, current_node_id); self.tree.bind("loaded.jstree", function (event, data) { $(this).jstree("open_all"); }); - self.tree.bind('node_selected.custom_jstree', function (event, target_node_id) { + self.tree.bind('node_selected.custom_jstree', function (event, target_node) { if (action === "gridview" ) { } else { $('.dropdown.divmerge').removeClass('open'); - $("input[name='choosen_root_id']").val(target_node_id); + $("input[name='choosen_root_id']").val(target_node.target_node_id); + $('#fonds-list input[name="new_root_id"]').parent().find(".sub-selected" ).text(""); + $('#fonds-list input[name="new_root_id"]:checked ').parent().find(".sub-selected" ).text(" - " + target_node.target_name); $("#confirm-merge").prop('disabled', false).removeClass('disabled'); } }); }; - - - $(document).delegate("#fonds-list input[@name='new_root_id']", 'click', function () { - var id = $(this).val(); - - if($('#fondmerge-'+id).hasClass('open')){ - $('#fondmerge-'+id).removeClass('open'); - }else{ - $('.dropdown.divmerge').each(function () { - if ($(this).hasClass('open')) { - $(this).removeClass('open'); - } - }); - $('#fondmerge-'+id).addClass('open'); - } - }); - $(document).delegate('.livesearch', 'click', function () { var id = $(this).find("input").val(); $('.livesearch').each(function () { diff --git a/public/javascripts/global.js b/public/javascripts/global.js index 4b82aac..d9a03da 100644 --- a/public/javascripts/global.js +++ b/public/javascripts/global.js @@ -265,6 +265,15 @@ $(document).ready(function() { $('#select_heading_group_modal').modal('hide'); } ); + $("#create_anagraphic").click( + function() + { + var group_id = $("#anagraphic_group_id").val(); + + window.location = "/anagraphics/new?group_id=" + group_id; + $('#select_anagraphic_group_modal').modal('hide'); + } + ); /* Upgrade 2.2.0 fine */ // EDITORS @@ -328,6 +337,143 @@ $(document).ready(function() { return false; }); + $('#create_fe_classification').click(function(){ + var classification = ""; + var first = true; + + if($('#unit_fe_identifications_attributes_0_code').val() != ""){ + classification = classification + $('#unit_fe_identifications_attributes_0_code').val(); + }else{ + alert("Il campo Identificativo non deve essere vuoto"); + return false; + } + + if($('#unit_fe_identifications_attributes_0_category').val() != ""){ + classification = classification + "-" + $('#unit_fe_identifications_attributes_0_category').val(); + first = false; + } + + if($('#unit_fe_identifications_attributes_0_identification_class').val() != ""){ + if(first === true){ + classification = classification + "-" + $('#unit_fe_identifications_attributes_0_identification_class').val(); + first = false; + }else{ + classification = classification + "." + $('#unit_fe_identifications_attributes_0_identification_class').val(); + } + } + + if($('#unit_fe_contexts_attributes_0_number').val() != ""){ + if(first === true){ + classification = classification + "-" + $('#unit_fe_contexts_attributes_0_number').val(); + first = false; + }else{ + classification = classification + "." + $('#unit_fe_contexts_attributes_0_number').val(); + } + } + + if($('#unit_fe_contexts_attributes_0_sub_number').val() != ""){ + if(first === true){ + classification = classification + "-" + $('#unit_fe_contexts_attributes_0_sub_number').val(); + first = false; + }else{ + classification = classification + "." + $('#unit_fe_contexts_attributes_0_sub_number').val(); + } + } + + if($('#unit_fe_identifications_attributes_0_file_year').val() != ""){ + if(first === true){ + classification = classification + "-" + $('#unit_fe_identifications_attributes_0_file_year').val(); + first = false; + }else{ + classification = classification + "." + $('#unit_fe_identifications_attributes_0_file_year').val(); + } + } + + $("#unit_fe_contexts_attributes_0_classification").attr("value", classification); + return false; + }); + + $('#create_fsc_title').click(function(){ + var start_date = ""; + var end_date = ""; + if($('#unit_events_attributes_0_start_date_format_y').prop("checked") && !$('#unit_events_attributes_0_start_date_format_c').prop("checked")){ + if($('#unit_events_attributes_0_start_date_from_day').val() != ""){ + start_date = start_date + $('#unit_events_attributes_0_start_date_from_day').val() + "-"; + }else{ + start_date = start_date + "?-"; + } + + if($('#unit_events_attributes_0_start_date_from_month').val() != ""){ + start_date = start_date + $('#unit_events_attributes_0_start_date_from_month').val() + "-"; + }else{ + start_date = start_date + "?-"; + } + + if($('#unit_events_attributes_0_start_date_from_year').val() != "anno..."){ + start_date = start_date + $('#unit_events_attributes_0_start_date_from_year').val(); + }else{ + start_date = start_date + "?"; + } + + }else{ + start_date = start_date + $("#unit_events_attributes_0_start_century option:selected").text(); + if($("#unit_events_attributes_0_start_century_interval option:selected").text() != "parte..."){ + start_date = start_date + " - " + $("#unit_events_attributes_0_start_century_interval option:selected").text(); + }else{ + start_date = start_date + " - ?"; + } + } + + if($('#unit_events_attributes_0_equal_bounds').prop("checked")){ + end_date = start_date; + }else{ + if($('#unit_events_attributes_0_end_date_format_y').prop("checked") && !$('#unit_events_attributes_0_end_date_format_c').prop("checked") + && !$('#unit_events_attributes_0_end_date_format_o').prop("checked") && !$('#unit_events_attributes_0_end_date_format_u').prop("checked")){ + + if($('#unit_events_attributes_0_end_date_from_day').val() != ""){ + end_date = end_date + $('#unit_events_attributes_0_end_date_from_day').val() + "-"; + }else{ + end_date = end_date + "?-"; + } + + if($('#unit_events_attributes_0_end_date_from_month').val() != ""){ + end_date = end_date + $('#unit_events_attributes_0_end_date_from_month').val() + "-"; + }else{ + end_date = end_date + "?-"; + } + + if($('#unit_events_attributes_0_end_date_from_year').val() != "anno..."){ + end_date = end_date + $('#unit_events_attributes_0_end_date_from_year').val(); + }else{ + end_date = end_date + "?"; + } + + }else if(!$('#unit_events_attributes_0_end_date_format_y').prop("checked") && $('#unit_events_attributes_0_end_date_format_c').prop("checked") + && !$('#unit_events_attributes_0_end_date_format_o').prop("checked") && !$('#unit_events_attributes_0_end_date_format_u').prop("checked")){ + + end_date = end_date + $("#unit_events_attributes_0_end_century option:selected").text(); + if($("#unit_events_attributes_0_end_century_interval option:selected").text() != "parte..."){ + end_date = end_date + " - " + $("#unit_events_attributes_0_end_century_interval option:selected").text(); + }else{ + end_date = end_date + " - ?"; + } + + }else if(!$('#unit_events_attributes_0_end_date_format_y').prop("checked") && !$('#unit_events_attributes_0_end_date_format_c').prop("checked") + && $('#unit_events_attributes_0_end_date_format_o').prop("checked") && !$('#unit_events_attributes_0_end_date_format_u').prop("checked")){ + + end_date = "31-12-9999"; + + }else if(!$('#unit_events_attributes_0_end_date_format_y').prop("checked") && !$('#unit_events_attributes_0_end_date_format_c').prop("checked") + && !$('#unit_events_attributes_0_end_date_format_o').prop("checked") && $('#unit_events_attributes_0_end_date_format_u').prop("checked")){ + + end_date = "?-?-?"; + } + } + + $("#unit_title").attr("value", $('#unit_fsc_surname').val() + ", " + $('#unit_fsc_name').val() + " [ " + start_date + " / " + end_date + " ]"); + return false; + }); + // SOURCES $('#source_source_type_code').change(function() { window.location = window.location.href.split('?')[0] + "?type=" + this.value; @@ -348,6 +494,10 @@ $(document).ready(function() { // OPTIMIZE: la funzione clone può essere estratta e condivisa come quella di autocomplete /* Upgrade 2.1.0 inizio */ $('form a.add_child').click( function() { add_child_click($(this)); } ); + + $(document).delegate('#new_anagraphic a.anag_child', 'click', function () { + add_child_click($(this)); + }); function add_child_click(jqCtl) { diff --git a/public/javascripts/imports-exports.js b/public/javascripts/imports-exports.js index d3ee47e..2752842 100644 --- a/public/javascripts/imports-exports.js +++ b/public/javascripts/imports-exports.js @@ -1,262 +1,511 @@ -$(document).ready(function () { - - $("#exports-fond-autocomplete").archimate_autocomplete_setup(); - - $("#exports-fond-name-autocomplete").autocomplete('option', 'select', function (event, ui) { - $("#exports-fond-name-autocomplete").attr("value", ui.item.value); - $("#exports-fond-id-autocomplete").attr("value", ui.item.id); - $("#exports-fond-choice").submit(); - return false; - }); - - $("#exports-custodian-autocomplete").archimate_autocomplete_setup(); - - $("#exports-custodian-name-autocomplete").autocomplete('option', 'select', function (event, ui) { - $("#exports-custodian-name-autocomplete").attr("value", ui.item.value); - $("#exports-custodian-id-autocomplete").attr("value", ui.item.id); - $("#exports-custodian-choice").submit(); - return false; - }); - - $("#exports-project-autocomplete").archimate_autocomplete_setup(); - - $("#exports-project-name-autocomplete").autocomplete('option', 'select', function (event, ui) { - $("#exports-project-name-autocomplete").attr("value", ui.item.value); - $("#exports-project-id-autocomplete").attr("value", ui.item.id); - $("#exports-project-choice").submit(); - return false; - }); - - $("#import-wait").submit(function () { - $.blockUI({ - message: 'Importazione in corso...' +$(document).ready(function() { + + $("#inc_san").click(function(event) { + if ($("#inc_san").is(":checked")) { + $("#inc_ead").attr('checked', false); + $("#inc_ead").attr("disabled", true); + $("#sources").removeClass('tab-xml'); + $("#creators").removeClass('tab-xml'); + } else { + $("#inc_ead").removeAttr("disabled"); + $("#sources").addClass('tab-xml'); + $("#creators").addClass('tab-xml'); + } }); - }); - $("#exports-fond-choice").submit(function (event) { - event.preventDefault(); - $.blockUI({ - message: 'Esportazione in corso...' + $("#inc_ead").click(function(event) { + if ($("#inc_ead").is(":checked")) { + $("#inc_digit").attr('checked', true); + $("#inc_digit").attr("disabled", true); + $("#inc_entities").attr('checked', true); + $("#inc_entities").attr('disabled', true); + $("#inc_san").attr('checked', false); + $("#inc_san").attr("disabled", true); + } else { + $("#inc_digit").attr('checked', false); + $("#inc_digit").attr("disabled", false); + $("#inc_entities").attr('checked', false); + $("#inc_entities").attr('disabled', false); + $("#inc_san").attr('checked', false); + $("#inc_san").attr("disabled", false); + } }); - $.ajax({ - url: '/exports.json', - data: { - target_id: $("#exports-fond-id-autocomplete").val(), - target_class: 'fond', - mode: 'full', -/* Upgrade 3.0.0 inizio */ - inc_digit: $("#inc_digit").is(":checked") -/* Upgrade 3.0.0 inizio */ - - }, - dataType: 'json', - success: function (data) { - var tokens, file, data_file, metadata_file; - $.unblockUI(); -/*codice senza file digitali da esportare -// tokens = data["export"]["dest_file"].split('/'); - tokens = data["dest_file"].split('/'); - - file = tokens[tokens.length - 1];*/ - - tokens = data["dest_file"].split('/'); - file = tokens[tokens.length - 1]; - - tokens = data["data_file"].split('/'); - data_file = tokens[tokens.length - 1]; - - tokens = data["metadata_file"].split('/'); - metadata_file = tokens[tokens.length - 1]; - -/* Upgrade 3.0.0 inizio */ - $("#inc_digit").prop('checked', false); -/* Upgrade 3.0.0 inizio */ - $(window.location).attr('href', "/exports/download?file=" + file); - }, - error: function(XMLHttpRequest, textStatus, errorThrown) { - alert("Errore nell'esportazione."); - $.unblockUI(); - } + + $("#exports-fond-autocomplete").archimate_autocomplete_setup(); + + $("#exports-fond-name-autocomplete").autocomplete('option', 'select', function(event, ui) { + $("#exports-fond-name-autocomplete").attr("value", ui.item.value); + $("#exports-fond-id-autocomplete").attr("value", ui.item.id); + $("#exports-fond-choice").submit(); + return false; + }); + + $("#exports-custodian-autocomplete").archimate_autocomplete_setup(); + + $("#exports-custodian-name-autocomplete").autocomplete('option', 'select', function(event, ui) { + $("#exports-custodian-name-autocomplete").attr("value", ui.item.value); + $("#exports-custodian-id-autocomplete").attr("value", ui.item.id); + $("#exports-custodian-choice").submit(); + return false; + }); + + $("#exports-project-autocomplete").archimate_autocomplete_setup(); + + $("#exports-project-name-autocomplete").autocomplete('option', 'select', function(event, ui) { + $("#exports-project-name-autocomplete").attr("value", ui.item.value); + $("#exports-project-id-autocomplete").attr("value", ui.item.id); + $("#exports-project-choice").submit(); + return false; }); - return false; - }); - $("#exports-custodian-choice").submit(function (event) { - event.preventDefault(); - $.blockUI({ - message: 'Esportazione in corso...' + /* UPDATE 3.0.1 ICAR Inizio*/ + + $("#exports-creator-autocomplete").archimate_autocomplete_setup(); + + $("#exports-creator-name-autocomplete").autocomplete('option', 'select', function(event, ui) { + $("#exports-creator-name-autocomplete").attr("value", ui.item.value); + $("#exports-creator-id-autocomplete").attr("value", ui.item.id); + $("#exports-creator-choice").submit(); + return false; }); - $.ajax({ - url: '/exports.json', - data: { - target_id: $("#exports-custodian-id-autocomplete").val(), - target_class: 'custodian', - mode: 'full', -/* Upgrade 3.0.0 inizio */ - inc_digit: $("#inc_digit").is(":checked") -/* Upgrade 3.0.0 inizio */ - - }, - dataType: 'json', - success: function (data) { - var tokens, file, data_file, metadata_file; - $.unblockUI(); -/* Codice senza file digitali da esportare -// tokens = data["export"]["dest_file"].split('/'); - tokens = data["dest_file"].split('/'); - file = tokens[tokens.length - 1];*/ - - tokens = data["dest_file"].split('/'); - file = tokens[tokens.length - 1]; - - tokens = data["data_file"].split('/'); - data_file = tokens[tokens.length - 1]; - - tokens = data["metadata_file"].split('/'); - metadata_file = tokens[tokens.length - 1]; - -/* Upgrade 3.0.0 inizio */ - $("#inc_digit").prop('checked', false); -/* Upgrade 3.0.0 inizio */ - - $(window.location).attr('href', "/exports/download?file=" + file); - }, - error: function(XMLHttpRequest, textStatus, errorThrown) { - alert("Errore nell'esportazione."); - $.unblockUI(); - } + + $("#exports-source-autocomplete").archimate_autocomplete_setup(); + + $("#exports-source-name-autocomplete").autocomplete('option', 'select', function(event, ui) { + $("#exports-source-name-autocomplete").attr("value", ui.item.value); + $("#exports-source-id-autocomplete").attr("value", ui.item.id); + $("#exports-source-choice").submit(); + return false; }); - return false; - }); - $("#exports-project-choice").submit(function (event) { - event.preventDefault(); - $.blockUI({ - message: 'Esportazione in corso...' + /* UPDATE 3.0.1 ICAR fine*/ + + $("#import-wait").submit(function() { + $.blockUI({ + message: 'Importazione in corso...' + }); }); - $.ajax({ - url: '/exports.json', - data: { - target_id: $("#exports-project-id-autocomplete").val(), - target_class: 'project', - mode: 'full', -/* Upgrade 3.0.0 inizio */ - inc_digit: $("#inc_digit").is(":checked") -/* Upgrade 3.0.0 inizio */ - - }, - dataType: 'json', - success: function (data) { - var tokens, file, data_file, metadata_file; - $.unblockUI(); -/* codice senza file digitali da esportare -// tokens = data["export"]["dest_file"].split('/'); - tokens = data["dest_file"].split('/'); - file = tokens[tokens.length - 1];*/ - - tokens = data["dest_file"].split('/'); - file = tokens[tokens.length - 1]; - - tokens = data["data_file"].split('/'); - data_file = tokens[tokens.length - 1]; - - tokens = data["metadata_file"].split('/'); - metadata_file = tokens[tokens.length - 1]; - -/* Upgrade 3.0.0 inizio */ - $("#inc_digit").prop('checked', false); -/* Upgrade 3.0.0 inizio */ - - $(window.location).attr('href', "/exports/download?file=" + file); - }, - error: function(XMLHttpRequest, textStatus, errorThrown) { - alert("Errore nell'esportazione."); - $.unblockUI(); - } + + $("#exports-fond-choice").submit(function(event) { + if ($("#inc_san").is(":checked") || $("#inc_ead").is(":checked")) { + data = { + "target_id": $("#exports-fond-id-autocomplete").val(), + "target_class": "fond", + "target_mode": "full", + "target_xml" : $("#inc_san").is(":checked") ? "san" : "ead" + }; + if (!$("#inc_entities").is(":checked")) { + data.target_mode = "not-full"; + } + export_xml(event, data); + return false; + } else { + event.preventDefault(); + $.blockUI({ + message: 'Esportazione in corso...' + }); + $.ajax({ + url: '/exports.json', + data: { + target_id: $("#exports-fond-id-autocomplete").val(), + target_class: 'fond', + mode: 'full', + /* Upgrade 3.0.0 inizio */ + inc_digit: $("#inc_digit").is(":checked") + /* Upgrade 3.0.0 inizio */ + + }, + dataType: 'json', + success: function(data) { + var tokens, file, data_file, metadata_file; + $.unblockUI(); + /*codice senza file digitali da esportare + // tokens = data["export"]["dest_file"].split('/'); + tokens = data["dest_file"].split('/'); + + file = tokens[tokens.length - 1];*/ + + tokens = data["dest_file"].split('/'); + file = tokens[tokens.length - 1]; + + tokens = data["data_file"].split('/'); + data_file = tokens[tokens.length - 1]; + + tokens = data["metadata_file"].split('/'); + metadata_file = tokens[tokens.length - 1]; + + /* Upgrade 3.0.0 inizio */ + $("#inc_digit").prop('checked', false); + /* Upgrade 3.0.0 inizio */ + $(window.location).attr('href', "/exports/download?file=" + file); + } + }); + return false; + } + }); - return false; - }); - $(".export-aef-wait").click(function (event) { - event.preventDefault(); - $.blockUI({ - message: 'Esportazione in corso...' + + + $("#exports-custodian-choice").submit(function(event) { + if ($("#inc_san").is(":checked") || $("#inc_ead").is(":checked")) { + data = { + "target_id": $("#exports-custodian-id-autocomplete").val(), + "target_class": "custodian", + "target_mode": "full", + "target_xml" : $("#inc_san").is(":checked") ? "san" : "ead" + }; + if (!$("#inc_entities").is(":checked")) { + data.target_mode = "not-full"; + } + export_xml(event, data); + return false; + } else { + event.preventDefault(); + $.blockUI({ + message: 'Esportazione in corso...' + }); + $.ajax({ + url: '/exports.json', + data: { + target_id: $("#exports-custodian-id-autocomplete").val(), + target_class: 'custodian', + mode: 'full', + /* Upgrade 3.0.0 inizio */ + inc_digit: $("#inc_digit").is(":checked") + /* Upgrade 3.0.0 inizio */ + + }, + dataType: 'json', + success: function(data) { + var tokens, file, data_file, metadata_file; + $.unblockUI(); + /* Codice senza file digitali da esportare + // tokens = data["export"]["dest_file"].split('/'); + tokens = data["dest_file"].split('/'); + file = tokens[tokens.length - 1];*/ + + tokens = data["dest_file"].split('/'); + file = tokens[tokens.length - 1]; + + tokens = data["data_file"].split('/'); + data_file = tokens[tokens.length - 1]; + + tokens = data["metadata_file"].split('/'); + metadata_file = tokens[tokens.length - 1]; + + /* Upgrade 3.0.0 inizio */ + $("#inc_digit").prop('checked', false); + /* Upgrade 3.0.0 inizio */ + + $(window.location).attr('href', "/exports/download?file=" + file); + } + }); + return false; + } + }); - $.ajax({ - url: '/exports.json', - data: { - target_id: $(this).attr('target-id'), - target_class: $(this).attr('target-class'), - mode: $(this).attr('target-mode'), -/* Upgrade 3.0.0 inizio */ - inc_digit: $("#inc_digit").is(":checked") -/* Upgrade 3.0.0 inizio */ - }, - dataType: 'json', - success: function (data) { - var tokens, file, data_file, metadata_file; - $.unblockUI(); -/* Upgrade 2.0.0 inizio */ -/* - tokens = data["export"]["dest_file"].split('/'); - file = tokens[tokens.length - 1]; - - tokens = data["export"]["data_file"].split('/'); - data_file = tokens[tokens.length - 1]; - - tokens = data["export"]["metadata_file"].split('/'); - metadata_file = tokens[tokens.length - 1]; -*/ - tokens = data["dest_file"].split('/'); - file = tokens[tokens.length - 1]; - - tokens = data["data_file"].split('/'); - data_file = tokens[tokens.length - 1]; - - tokens = data["metadata_file"].split('/'); - metadata_file = tokens[tokens.length - 1]; -/* Upgrade 2.0.0 fine */ -/* Upgrade 3.0.0 inizio */ - $("#inc_digit").prop('checked', false); -/* Upgrade 3.0.0 inizio */ - $(window.location).attr('href', "/exports/download?file=" + file + "&data=" + data_file + "&meta=" + metadata_file); - }, - error: function(XMLHttpRequest, textStatus, errorThrown) { - alert("Errore nell'esportazione."); - $.unblockUI(); - } + + + + $("#exports-project-choice").submit(function(event) { + event.preventDefault(); + $.blockUI({ + message: 'Esportazione in corso...' + }); + $.ajax({ + url: '/exports.json', + data: { + target_id: $("#exports-project-id-autocomplete").val(), + target_class: 'project', + mode: 'full', + /* Upgrade 3.0.0 inizio */ + inc_digit: $("#inc_digit").is(":checked") + /* Upgrade 3.0.0 inizio */ + + }, + dataType: 'json', + success: function(data) { + var tokens, file, data_file, metadata_file; + $.unblockUI(); + /* codice senza file digitali da esportare + // tokens = data["export"]["dest_file"].split('/'); + tokens = data["dest_file"].split('/'); + file = tokens[tokens.length - 1];*/ + + tokens = data["dest_file"].split('/'); + file = tokens[tokens.length - 1]; + + tokens = data["data_file"].split('/'); + data_file = tokens[tokens.length - 1]; + + tokens = data["metadata_file"].split('/'); + metadata_file = tokens[tokens.length - 1]; + + /* Upgrade 3.0.0 inizio */ + $("#inc_digit").prop('checked', false); + /* Upgrade 3.0.0 inizio */ + + $(window.location).attr('href', "/exports/download?file=" + file); + } + }); + return false; }); - return false; - }); - $(".delete-import").click(function () { - $("#confirm-delete-btn").attr("data-import-id", $(this).attr("data-import-id")); - $("#confirm-delete-import").modal("show"); - return false; - }); + $("#exports-creator-choice").submit(function(event) { + if ($("#inc_san").is(":checked") || $("#inc_ead").is(":checked")) { + data = { + "target_id": $("#exports-creator-id-autocomplete").val(), + "target_class": "creator", + "target_mode": "full", + "target_xml" : $("#inc_san").is(":checked") ? "san" : "ead" + }; + if (!$("#inc_entities").is(":checked")) { + /*$(this).attr('target-mode', 'not-full');*/ + data.target_mode = "not-full"; + } + export_xml(event, data); + return false; + } else { + /*data = {"target_id": $(this).attr('target-id'), + "target_class": $(this).attr('target-class'), + "target_mode": $(this).attr('target-mode') + }; + if(!$("#inc_entities").is(":checked")){ + data.target_mode = "not-full"; + } + + */ + export_aef(event, data); + return false; + } + + }); - $("#confirm-delete-btn").click(function () { - var id = $(this).attr("data-import-id"); - $('#confirm-delete-import').modal("hide"); + $("#exports-source-choice").submit(function(event) { + if ($("#inc_san").is(":checked") || $("#inc_ead").is(":checked")) { + data = { + "target_id": $("#exports-source-id-autocomplete").val(), + "target_class": "source", + "target_mode": "full", + "target_xml" : $("#inc_san").is(":checked") ? "san" : "ead" + }; + if (!$("#inc_entities").is(":checked")) { + /*$(this).attr('target-mode', 'not-full');*/ + data.target_mode = "not-full"; + } + export_xml(event, data); + return false; + } else { + /*data = {"target_id": $(this).attr('target-id'), + "target_class": $(this).attr('target-class'), + "target_mode": $(this).attr('target-mode') + };*/ + return false; + } - $.blockUI({ - message: 'Eliminazione in corso...' }); - $.ajax({ - type: "DELETE", - url: '/imports/' + id, - success: function (data) { - $.unblockUI(); - if (data.status === "success") { - location.reload(); + + $(".export-trigger-wait").click(function(event) { + if ($("#inc_san").is(":checked") || $("#inc_ead").is(":checked")) { + data = { + "target_id": $(this).attr('target-id'), + "target_class": $(this).attr('target-class'), + "target_mode": $(this).attr('target-mode'), + "target_xml" : $("#inc_san").is(":checked") ? "san" : "ead" + }; + if (!$("#inc_entities").is(":checked")) { + data.target_mode = "not-full"; + }else{ + data.target_mode = "full"; + } + export_xml(event, data); + return false; } else { - $("div.container").prepend('
×' + data.msg + '.
'); + export_aef(event, $(this)); + return false; } - } }); - }); - $('#export-tabs a:first').tab('show'); + function export_xml(event, obj) { + event.preventDefault(); + $.blockUI({ + message: 'Esportazione in corso...' + }); + $.ajax({ + url: '/exports/xml', + data: { + /* target_id: obj.attr('target-id'), + target_class: obj.attr('target-class'), + mode: obj.attr('target-mode'), + inc_digit: $("#inc_digit").is(":checked")*/ + target_id: obj.target_id, + target_class: obj.target_class, + mode: obj.target_mode, + inc_digit: $("#inc_digit").is(":checked"), + target_xml: obj.target_xml + }, + dataType: 'json', + success: function(data) { + var tokens, file, data_file, metadata_file; + $.unblockUI(); + + tokens = data["dest_file"].split('/'); + file = tokens[tokens.length - 1]; + + tokens = data["data_file"].split('/'); + data_file = tokens[tokens.length - 1]; + + tokens = data["metadata_file"].split('/'); + metadata_file = tokens[tokens.length - 1]; + + $(window.location).attr('href', "/exports/download?file=" + file + "&data=" + data_file); + }, + error: function(data) { + console.log(data); + $.unblockUI(); + } + }); + }; + + function export_aef(event, obj) { + event.preventDefault(); + $.blockUI({ + message: 'Esportazione in corso...' + }); + $.ajax({ + url: '/exports.json', + data: { + target_id: obj.attr('target-id'), + target_class: obj.attr('target-class'), + mode: obj.attr('target-mode'), + inc_digit: $("#inc_digit").is(":checked") + }, + dataType: 'json', + success: function(data) { + var tokens, file, data_file, metadata_file; + $.unblockUI(); + + tokens = data["dest_file"].split('/'); + file = tokens[tokens.length - 1]; + + tokens = data["data_file"].split('/'); + data_file = tokens[tokens.length - 1]; + + tokens = data["metadata_file"].split('/'); + metadata_file = tokens[tokens.length - 1]; + + $("#inc_digit").prop('checked', false); + $(window.location).attr('href', "/exports/download?file=" + file + "&data=" + data_file + "&meta=" + metadata_file); + }, + error: function(data) { + $.unblockUI(); + } + }); + }; + + + $(".export-aef-wait").click(function(event) { + event.preventDefault(); + $.blockUI({ + message: 'Esportazione in corso...' + }); + $.ajax({ + url: '/exports.json', + data: { + target_id: $(this).attr('target-id'), + target_class: $(this).attr('target-class'), + mode: $(this).attr('target-mode'), + /* Upgrade 3.0.0 inizio */ + inc_digit: $("#inc_digit").is(":checked") + /* Upgrade 3.0.0 inizio */ + }, + dataType: 'json', + success: function(data) { + var tokens, file, data_file, metadata_file; + $.unblockUI(); + /* Upgrade 2.0.0 inizio */ + /* + tokens = data["export"]["dest_file"].split('/'); + file = tokens[tokens.length - 1]; + + tokens = data["export"]["data_file"].split('/'); + data_file = tokens[tokens.length - 1]; + + tokens = data["export"]["metadata_file"].split('/'); + metadata_file = tokens[tokens.length - 1]; + */ + tokens = data["dest_file"].split('/'); + file = tokens[tokens.length - 1]; + + tokens = data["data_file"].split('/'); + data_file = tokens[tokens.length - 1]; + + tokens = data["metadata_file"].split('/'); + metadata_file = tokens[tokens.length - 1]; + /* Upgrade 2.0.0 fine */ + /* Upgrade 3.0.0 inizio */ + $("#inc_digit").prop('checked', false); + /* Upgrade 3.0.0 inizio */ + $(window.location).attr('href', "/exports/download?file=" + file + "&data=" + data_file + "&meta=" + metadata_file); + } + }); + return false; + }); + + $(".delete-import").click(function() { + $("#confirm-delete-btn").attr("data-import-id", $(this).attr("data-import-id")); + $("#confirm-delete-import").modal("show"); + return false; + }); + $("#confirm-delete-btn").click(function() { + var id = $(this).attr("data-import-id"); + $('#confirm-delete-import').modal("hide"); + + $.blockUI({ + message: 'Eliminazione in corso...' + }); + + $.ajax({ + type: "DELETE", + url: '/imports/' + id, + success: function(data) { + $.unblockUI(); + if (data.status === "success") { + location.reload(); + } else { + $("div.container").prepend('
×' + data.msg + '.
'); + } + } + }); + }); + + $('#export-tabs a:first').tab('show'); + + $('#export-tabs li a').click(function(event) { + $("#inc_digit").attr('checked', false); + $("#inc_digit").attr("disabled", false); + if ($(this).text().includes('Progetti')) { + $("#inc_ead").prop('checked', false); + $("#inc_ead").attr("disabled", true); + $("#inc_san").prop('checked', false); + $("#inc_san").attr("disabled", true); + $("#inc_entities").prop('checked', false); + $("#inc_entities").attr("disabled", true); + } else if ($(this).text().includes('Complessi')) { + $("#inc_ead").prop('checked', false); + $("#inc_ead").attr("disabled", false); + } else { + $("#inc_ead").prop('checked', false); + $("#inc_ead").attr("disabled", true); + $("#inc_san").prop('checked', false); + $("#inc_san").removeAttr("disabled"); + $("#inc_entities").prop('checked', false); + $("#inc_entities").removeAttr("disabled"); + $("#sources").addClass('tab-xml'); + $("#creators").addClass('tab-xml'); + } + }); }); \ No newline at end of file diff --git a/public/javascripts/jqGrid/jquery.jqGrid.min.js b/public/javascripts/jqGrid/jquery.jqGrid.min.js index 5e4f791..f04bb3f 100644 --- a/public/javascripts/jqGrid/jquery.jqGrid.min.js +++ b/public/javascripts/jqGrid/jquery.jqGrid.min.js @@ -1,12 +1,12 @@ -/* -* jqGrid 4.3.1 - jQuery Grid -* Copyright (c) 2008, Tony Tomov, tony@trirand.com -* Dual licensed under the MIT and GPL licenses -* http://www.opensource.org/licenses/mit-license.php -* http://www.gnu.org/licenses/gpl-2.0.html -* Date:2011-12-20 -* Modules: grid.base.js; jquery.fmatter.js; grid.custom.js; grid.common.js; grid.formedit.js; grid.filter.js; grid.inlinedit.js; grid.celledit.js; jqModal.js; jqDnR.js; grid.subgrid.js; grid.grouping.js; grid.treegrid.js; grid.import.js; JsonXml.js; grid.tbltogrid.js; grid.jqueryui.js; -*/ +/* +* jqGrid 4.3.1 - jQuery Grid +* Copyright (c) 2008, Tony Tomov, tony@trirand.com +* Dual licensed under the MIT and GPL licenses +* http://www.opensource.org/licenses/mit-license.php +* http://www.gnu.org/licenses/gpl-2.0.html +* Date:2011-12-20 +* Modules: grid.base.js; jquery.fmatter.js; grid.custom.js; grid.common.js; grid.formedit.js; grid.filter.js; grid.inlinedit.js; grid.celledit.js; jqModal.js; jqDnR.js; grid.subgrid.js; grid.grouping.js; grid.treegrid.js; grid.import.js; JsonXml.js; grid.tbltogrid.js; grid.jqueryui.js; +*/ /* jqGrid 4.3.1 - jQuery Grid Copyright (c) 2008, Tony Tomov, tony@trirand.com diff --git a/public/javascripts/livesearch_fondmerge.js b/public/javascripts/livesearch_fondmerge.js new file mode 100644 index 0000000..17e44e1 --- /dev/null +++ b/public/javascripts/livesearch_fondmerge.js @@ -0,0 +1,129 @@ +jQuery.fn.liveUpdateFondMerge = function (list, options) { + + var cache = {}, + settings = $.extend({ + 'url': '', + 'field': '', + 'targetClass': 'livesearch', + 'selectedClass': 'highlight', + 'group_id': { + group_id: -1 + }, + 'exclude': { + exclude: [] + } + }, options); + + /* private methods */ + + function fill(data) { + var items = []; + $.each(data, function (key, val) { + + var liHtml = '
  • '; + liHtml += '