Skip to main content

Script di post-elaborazione

Un'esportazione CSV può passare da uno script Python scritto da te prima di diventare il file da scaricare. Serve quando il file deve avere una forma che la scelta delle colonne non basta a dare: nomi con la maiuscola, una nota accanto a certi valori, i tag divisi in più colonne.

Lo script gira isolato, senza rete, con limiti di tempo e memoria. Il risultato è responsabilità di chi lo scrive.

Dove si scrive

  • Nella finestra di esportazione: attiva Postprocessa l'export sotto le colonne. L'interruttore è disponibile solo con il formato CSV.
  • In un modello di esportazione, con lo stesso interruttore. Scegliendo il modello nella finestra di esportazione, lo script si carica insieme alle colonne. Se lo modifichi o lo spegni, la tendina passa a Modello personalizzato.

Spegnere l'interruttore esclude lo script senza cancellarne il testo.

L'esportazione conserva lo script con cui è partita, visibile nel dettaglio in Impostazioni > Esportazioni.

Come funziona

  1. Riseact genera il CSV.
  2. Lo script legge /work/input.csv e scrive /work/output.csv.
  3. output.csv diventa il file dell'esportazione; l'originale non viene conservato.
  4. Il numero di record mostrato è quello delle righe di output.csv, intestazione esclusa.

Se lo script fallisce, fallisce l'esportazione.

Il file di ingresso

  • UTF-8 con BOM, separato da virgole, intestazione nella prima riga. Aprilo con encoding="utf-8-sig" e newline="".
  • Le intestazioni sono le chiavi delle colonne (email, tags, donation amount), descritte nelle pagine di ogni esportazione.
  • I valori multipli, come i tag, sono separati da virgola nella stessa cella.

Il file di uscita

  • Scrivilo con encoding="utf-8-sig" perché Excel legga le lettere accentate.
  • Riseact non lo valida: scarichi quello che lo script scrive.
  • Se cambi nomi o valori delle colonne, il file potrebbe non essere più reimportabile.

Ambiente e limiti

InterpretePython 3.14, libreria standard
File/work, con l'export input.csv
ReteNessuna
Memoria128 MB, di cui circa 40 occupati dall'interprete
Tempo20 minuti
DiscoIl triplo del file di ingresso, minimo 10 MB
Outputprint va perso; lo stderr, traceback compreso, diventa il messaggio di errore

Lavora riga per riga: un'esportazione grande non sta in 128 MB, quindi niente list(reader). Se ti servono due passate, apri il file due volte.

Il tempo dello script si somma a quello dell'estrazione. Come riferimento, dividere i tag in colonne su un milione di righe richiede meno di un minuto.

Errori

  • Eccezione non gestita o sys.exit diverso da 0: l'esportazione fallisce e il dettaglio mostra la parte finale dello stderr, di solito il traceback con il numero di riga di /work/script.py.
  • Tempo o disco esauriti: lo script viene fermato e il dettaglio indica il limite superato.
  • output.csv mancante: l'esportazione fallisce.

L'email di esito segnala il fallimento ma non riporta l'errore, perché un traceback può contenere dati personali.

Prova lo script su pochi record, con una selezione manuale o un filtro stretto, prima di lanciarlo su tutto l'archivio.

Esempio: prima lettera maiuscola

Nell'esportazione sostenitori, nome, cognome e città con l'iniziale maiuscola. Il resto del valore non cambia: de luca diventa De luca.

import csv

COLUMNS = ["first name", "last name", "city"]


def capitalize(value):
    return value[:1].upper() + value[1:]


with open("/work/input.csv", encoding="utf-8-sig", newline="") as f, open(
    "/work/output.csv", "w", encoding="utf-8-sig", newline=""
) as out:
    reader = csv.DictReader(f)
    writer = csv.DictWriter(out, fieldnames=reader.fieldnames)
    writer.writeheader()
    for row in reader:
        for column in COLUMNS:
            row[column] = capitalize(row[column])
        writer.writerow(row)

Nelle esportazioni donazioni e pagamenti le stesse colonne si chiamano supporter first name, supporter last name e supporter city.

Esempio: nota su certi valori

Nell'esportazione donazioni, aggiunge (ricorrente) alla frequenza delle donazioni mensili e annuali.

import csv

COLUMN = "donation frequency"
NOTES = {
    "MONTHLY": " (ricorrente)",
    "ANNUALLY": " (ricorrente)",
}

with open("/work/input.csv", encoding="utf-8-sig", newline="") as f, open(
    "/work/output.csv", "w", encoding="utf-8-sig", newline=""
) as out:
    reader = csv.DictReader(f)
    writer = csv.DictWriter(out, fieldnames=reader.fieldnames)
    writer.writeheader()
    for row in reader:
        row[COLUMN] += NOTES.get(row[COLUMN], "")
        writer.writerow(row)

Da API

Le mutation supporterExportCreate, donationExportCreate e paymentExportCreate accettano lo script nell'argomento script, solo con format: CSV. exportModelCreate ed exportModelUpdate lo salvano nel campo script del modello. L'esportazione espone lo script nel campo script; se lo script fallisce, il codice di errore è SCRIPT_ERROR con il messaggio in errorMessage.


Fonte: https://dev.riseact.org/docs/exporters/script. Copia automatica da dev.riseact.org: non modificare qui, le modifiche vanno fatte sulla documentazione Docusaurus.