Context
Volem poder fer campanyes Poweremail directament a partir d'un llistat d'emails, sense haver de partir d'un model de negoci ni d'un filtre/domain.
El cas d'us principal es un CSV amb columnes:
email;language
persona@example.com;ca_ES
persona2@example.com;es_ES
Avui poweremail_campaign esta orientat a:
- seleccionar una
poweremail.templates
- aplicar un
domain sobre el model de la template
- crear
poweremail.campaign.line amb ref cap al registre origen
- generar correus amb
poweremail.templates.generate_mail(template_id, record_id)
Per reduir risc i evitar canvis al core gisce/poweremail, el disseny preferent es mantenir aquest contracte i implementar el mode CSV amb un objecte dummy propi de poweremail-modules.
Decisio de disseny
La campanya CSV no ha de ser "sense objecte" a nivell de Poweremail core. Ha de tenir un model origen simple i controlat, per exemple poweremail.campaign.recipient, amb un registre per destinatari importat.
Aixo permet:
- reutilitzar
poweremail.templates.generate_mail(template_id, record_id) sense tocar gisce/poweremail
- fer que la template CSV apunti a
poweremail.campaign.recipient com a template.object_name.model
- usar expressions de template normals sobre
${object.email}, ${object.language} i camps equivalents
- crear
poweremail.campaign.line.ref amb una referencia real i consistent al dummy object
- mantenir callbacks, progres, batch i
poweremail.campaign.line dins el flux existent
- auditar cada destinatari importat amb estat, error i mail generat
El model dummy ha de viure en aquest repo, lligat a la campanya, i ha de representar nomes el destinatari de campanya. No ha de crear partners, adreces, casos CRM ni cap altre objecte de negoci.
Notes tecniques validades al codi actual
Fitxers rellevants:
poweremail_campaign/poweremail_campaign.py
poweremail_campaign/poweremail_campaign_line.py
poweremail_campaign/wizard/wizard_poweremail_campaign.py
gisce/poweremail/poweremail_template.py
Punts a tenir en compte:
update_linies_campanya esborra les linies existents i les recalcula a partir de campaign.domain sobre template.model_int_name; el mode CSV necessita una entrada separada i confirmacions clares per no destruir imports previs accidentalment.
send_mail_from_line llegeix line.ref, n'extreu l'id i crida generate_mail(template, id_aux). Amb dummy object, aquesta part pot continuar igual si ref apunta a poweremail.campaign.recipient,<id>.
get_value i generate_mail_sync del core renderitzen contra template.object_name.model; per tant el dummy object encaixa millor que un mode objectless per aquesta primera versio.
List Related Objects actualment obre el model de la template i els ids extrets de les linies. En mode CSV ha d'obrir els destinataris dummy o una vista de linies/destinataris preparada, no objectes de negoci.
- La resolucio de company/from account del core pot intentar derivar
company_id o company del registre origen; el dummy recipient ha de definir com es resol aquest punt o deixar-lo a configuracio de template/compte.
partner_event, reports/adjunts i callbacks de negoci han de quedar desactivats o documentats com a no suportats en templates CSV mentre no hi hagi una regla segura.
Modes de campanya
- Campanya basada en objectes: comportament actual amb template + model + domain.
- Campanya basada en destinataris CSV: CSV d'emails + idioma que crea registres dummy de destinatari i linies de campanya referenciant aquests registres.
Cal fer visible el mode de campanya al formulari i protegir els botons/accions que nomes tenen sentit en un mode concret.
Model dummy proposat
poweremail.campaign.recipient hauria de tenir, com a minim:
campaign_id
email
language
csv_line_number
state o validation_state
log / error accionable
normalized_email o hash/clau normalitzada per detectar duplicats
campaign_line_id o relacio clara amb la linia creada, si ajuda a navegacio/auditoria
mail_id o camp related si cal mostrar rapidament el mail generat
- camps tecnics d'import: data/import batch/source filename si es vol auditar la carrega
Estats suggerits:
draft / importat pendent de validacio
valid
invalid
duplicate
line_created
sending_error si es vol propagar l'error de generacio/enviament
Flux funcional proposat
- Crear campanya i seleccionar mode: objectes o CSV.
- En mode CSV, seleccionar una template que apunti al model dummy
poweremail.campaign.recipient.
- Importar CSV amb separador
; i capcalera minima email;language.
- Prevalidar sense crear linies definitives:
- total de files
- valides
- invalides
- duplicades
- resum per idioma
- errors amb numero de linia
- Confirmar la creacio o substitucio de destinataris/linies.
- Crear/actualitzar recipients dummy i
poweremail.campaign.line amb ref = poweremail.campaign.recipient,<id>.
- Revisar destinataris i linies.
- Enviar amb el flux actual de batch/progres.
Validacions necessaries
- Email obligatori i amb format minimament valid.
- Idioma opcional o obligatori a decidir, pero si ve informat ha d'existir a
res.lang.
- Capcalera CSV exacta o tolerant de forma explicita, pero no ambigus.
- Separador
;.
- Columnes de mes o de menys amb error accionable.
- Linies buides ignorades o reportades de forma consistent.
- Emails repetits dins el CSV.
- Duplicats contra destinataris ja importats a la mateixa campanya.
- Respectar
distinct_mails si esta activat.
- Marcar duplicats amb estat visible, per exemple
avoid_duplicate a la linia i/o duplicate al recipient.
- No esborrar linies ni destinataris existents sense confirmacio clara, especialment per imports repetits.
Usabilitat i control
- Previsualitzacio abans de crear linies.
- Mostrar errors d'import amb numero de linia i missatge accionable.
- Poder descarregar o copiar un resum d'errors.
- Mostrar a la linia de campanya el destinatari i idioma encara que el
ref apunti al dummy object.
- En mode CSV,
List Related Objects hauria d'obrir els destinataris dummy o una vista equivalent pensada per revisar el CSV.
- Afegir filtres o agrupacions utils a destinataris/linies: estat, idioma, duplicat, error, email generat.
- Evitar botons confusos segons mode:
Filter Objects i Create Lines actuals nomes per mode objectes/domain.
- Import/prevalidacio CSV nomes per mode destinataris CSV.
- Mantenir progressos de creacio/enviament coherents amb linies directes.
Integracio amb gisce/poweremail
No es necessari tocar gisce/poweremail per l'abast inicial si el model dummy es prou complet per fer de template.object_name.model.
La issue complementaria gisce/poweremail#217 queda com a alternativa futura/no bloquejant per si mes endavant es vol suportar generacio realment sense objecte. Per aquesta issue, el criteri preferent es no dependre d'aquest canvi.
Limitacions que cal deixar clares en aquesta primera versio:
- Les templates CSV han d'estar pensades per al model dummy.
- No s'han d'usar reports/adjunts que depenguin d'un objecte de negoci que no existeix.
partner_event i callbacks de negoci no haurien d'aplicar en campanyes CSV tret que es defineixi explicitament un comportament segur.
- Company/from account s'ha de resoldre per configuracio de template/campanya, no derivant-la d'un objecte de negoci excepte si el dummy model incorpora un camp controlat per fer-ho.
Criteris d'acceptacio
- Es pot crear una campanya de destinataris directes important un CSV
email;language.
- La importacio informa clarament files valides, invalides i duplicades abans de generar linies.
- Les files valides creen destinataris dummy i linies de campanya amb
ref consistent.
- Les linies creades mostren email, idioma, estat, log/error i mail generat si existeix.
- L'enviament per batch funciona igual que en campanyes actuals.
distinct_mails evita enviaments duplicats en aquest mode.
- El mode basat en objectes i domain continua funcionant igual.
- Les accions de UI que depenen d'objectes queden adaptades o protegides en campanyes CSV.
- La relacio amb
gisce/poweremail#217 queda documentada com a futura/no bloquejant.
Tests esperats
- Import CSV valid.
- Error de capcalera/format.
- Columnes sobrants o faltants.
- Linies buides.
- Email invalid.
- Idioma invalid.
- Duplicats dins el CSV.
- Duplicats amb
distinct_mails activat.
- Creacio de dummy recipients.
- Creacio de
poweremail.campaign.line.ref contra el dummy recipient.
- Generacio/enviament amb template sobre
${object.email} i ${object.language}.
- Regressio del mode actual basat en
domain.
- Proteccio o comportament de
List Related Objects en mode CSV.
Fora d'abast inicial recomanat
- Personalitzacio massiva amb columnes arbitraries mes enlla de
email i language.
- Segmentacio/filtres avancats sobre el CSV.
- Baixes/subscripcions i gestio legal de consentiment, tret que ja existeixi un model corporatiu clar on integrar-ho.
- Crear partners, adreces o objectes ERP a partir del CSV.
- Canviar el contracte base de
gisce/poweremail.templates.
- Implementar generacio realment sense objecte origen al core
gisce/poweremail.
Context
Volem poder fer campanyes Poweremail directament a partir d'un llistat d'emails, sense haver de partir d'un model de negoci ni d'un filtre/domain.
El cas d'us principal es un CSV amb columnes:
email;language persona@example.com;ca_ES persona2@example.com;es_ESAvui
poweremail_campaignesta orientat a:poweremail.templatesdomainsobre el model de la templatepoweremail.campaign.lineambrefcap al registre origenpoweremail.templates.generate_mail(template_id, record_id)Per reduir risc i evitar canvis al core
gisce/poweremail, el disseny preferent es mantenir aquest contracte i implementar el mode CSV amb un objecte dummy propi depoweremail-modules.Decisio de disseny
La campanya CSV no ha de ser "sense objecte" a nivell de Poweremail core. Ha de tenir un model origen simple i controlat, per exemple
poweremail.campaign.recipient, amb un registre per destinatari importat.Aixo permet:
poweremail.templates.generate_mail(template_id, record_id)sense tocargisce/poweremailpoweremail.campaign.recipientcom atemplate.object_name.model${object.email},${object.language}i camps equivalentspoweremail.campaign.line.refamb una referencia real i consistent al dummy objectpoweremail.campaign.linedins el flux existentEl model dummy ha de viure en aquest repo, lligat a la campanya, i ha de representar nomes el destinatari de campanya. No ha de crear partners, adreces, casos CRM ni cap altre objecte de negoci.
Notes tecniques validades al codi actual
Fitxers rellevants:
poweremail_campaign/poweremail_campaign.pypoweremail_campaign/poweremail_campaign_line.pypoweremail_campaign/wizard/wizard_poweremail_campaign.pygisce/poweremail/poweremail_template.pyPunts a tenir en compte:
update_linies_campanyaesborra les linies existents i les recalcula a partir decampaign.domainsobretemplate.model_int_name; el mode CSV necessita una entrada separada i confirmacions clares per no destruir imports previs accidentalment.send_mail_from_linellegeixline.ref, n'extreu l'id i cridagenerate_mail(template, id_aux). Amb dummy object, aquesta part pot continuar igual sirefapunta apoweremail.campaign.recipient,<id>.get_valueigenerate_mail_syncdel core renderitzen contratemplate.object_name.model; per tant el dummy object encaixa millor que un mode objectless per aquesta primera versio.List Related Objectsactualment obre el model de la template i els ids extrets de les linies. En mode CSV ha d'obrir els destinataris dummy o una vista de linies/destinataris preparada, no objectes de negoci.company_idocompanydel registre origen; el dummy recipient ha de definir com es resol aquest punt o deixar-lo a configuracio de template/compte.partner_event, reports/adjunts i callbacks de negoci han de quedar desactivats o documentats com a no suportats en templates CSV mentre no hi hagi una regla segura.Modes de campanya
Cal fer visible el mode de campanya al formulari i protegir els botons/accions que nomes tenen sentit en un mode concret.
Model dummy proposat
poweremail.campaign.recipienthauria de tenir, com a minim:campaign_idemaillanguagecsv_line_numberstateovalidation_statelog/ error accionablenormalized_emailo hash/clau normalitzada per detectar duplicatscampaign_line_ido relacio clara amb la linia creada, si ajuda a navegacio/auditoriamail_ido camp related si cal mostrar rapidament el mail generatEstats suggerits:
draft/ importat pendent de validaciovalidinvalidduplicateline_createdsending_errorsi es vol propagar l'error de generacio/enviamentFlux funcional proposat
poweremail.campaign.recipient.;i capcalera minimaemail;language.poweremail.campaign.lineambref = poweremail.campaign.recipient,<id>.Validacions necessaries
res.lang.;.distinct_mailssi esta activat.avoid_duplicatea la linia i/oduplicateal recipient.Usabilitat i control
refapunti al dummy object.List Related Objectshauria d'obrir els destinataris dummy o una vista equivalent pensada per revisar el CSV.Filter ObjectsiCreate Linesactuals nomes per mode objectes/domain.Integracio amb
gisce/poweremailNo es necessari tocar
gisce/poweremailper l'abast inicial si el model dummy es prou complet per fer detemplate.object_name.model.La issue complementaria
gisce/poweremail#217queda com a alternativa futura/no bloquejant per si mes endavant es vol suportar generacio realment sense objecte. Per aquesta issue, el criteri preferent es no dependre d'aquest canvi.Limitacions que cal deixar clares en aquesta primera versio:
partner_eventi callbacks de negoci no haurien d'aplicar en campanyes CSV tret que es defineixi explicitament un comportament segur.Criteris d'acceptacio
email;language.refconsistent.distinct_mailsevita enviaments duplicats en aquest mode.gisce/poweremail#217queda documentada com a futura/no bloquejant.Tests esperats
distinct_mailsactivat.poweremail.campaign.line.refcontra el dummy recipient.${object.email}i${object.language}.domain.List Related Objectsen mode CSV.Fora d'abast inicial recomanat
emaililanguage.gisce/poweremail.templates.gisce/poweremail.