diff --git a/setup.py b/setup.py
index 3c9b981..01cbea1 100644
--- a/setup.py
+++ b/setup.py
@@ -57,8 +57,11 @@
"z3c.jbot",
"plone.api>=1.8.4",
"plone.app.dexterity",
- "redturtle.volto>=5.0.0",
"collective.volto.blocksfield",
+ "collective.venue[geolocation]",
+ "redturtle.volto",
+ "plone.restapi",
+ "collective.taxonomy",
],
extras_require={
"test": [
diff --git a/src/iosanita/contenttypes/behaviors/additional_help_infos.py b/src/iosanita/contenttypes/behaviors/additional_help_infos.py
index b89c9ef..021c33d 100644
--- a/src/iosanita/contenttypes/behaviors/additional_help_infos.py
+++ b/src/iosanita/contenttypes/behaviors/additional_help_infos.py
@@ -1,5 +1,7 @@
# -*- coding: utf-8 -*-
from iosanita.contenttypes import _
+from collective.volto.blocksfield.field import BlocksField
+from plone.app.dexterity import textindexer
from plone.autoform.interfaces import IFormFieldProvider
from plone.dexterity.interfaces import IDexterityContent
from plone.supermodel import model
@@ -9,11 +11,9 @@
from zope import schema
-# TODO: valutare se aggiungere 'box_aiuto', in alcuni CT e' obbligatorio
-# e bisognerebbe metterlo unifrme per tutti in barba alle linee guida
@provider(IFormFieldProvider)
class IAdditionalHelpInfos(model.Schema):
- ulteriori_informazioni = schema.TextLine(
+ ulteriori_informazioni = BlocksField(
title=_("ulteriori_informazioni", default="Ulteriori informazioni"),
description=_(
"ulteriori_informazioni_help",
@@ -28,6 +28,8 @@ class IAdditionalHelpInfos(model.Schema):
fields=["ulteriori_informazioni"],
)
+ textindexer.searchable("ulteriori_informazioni")
+
@implementer(IAdditionalHelpInfos)
@adapter(IDexterityContent)
diff --git a/src/iosanita/contenttypes/behaviors/address.py b/src/iosanita/contenttypes/behaviors/address.py
new file mode 100644
index 0000000..8c89bfc
--- /dev/null
+++ b/src/iosanita/contenttypes/behaviors/address.py
@@ -0,0 +1,99 @@
+# -*- coding: utf-8 -*-
+from collective.address.behaviors import IAddress
+from iosanita.contenttypes import _
+from plone.app.dexterity import textindexer
+from plone.autoform.interfaces import IFormFieldProvider
+from plone.dexterity.interfaces import IDexterityContent
+from plone.supermodel import model
+from zope import schema
+from zope.component import adapter
+from zope.interface import implementer
+from zope.interface import provider
+
+
+class IAddressNomeSede(model.Schema):
+ nome_sede = schema.TextLine(
+ title=_("nome_sede", default="Nome sede"),
+ description=_(
+ "help_nome_sede",
+ default="Inserisci il nome della "
+ "sede, se non è presente tra i Luoghi del sito.",
+ ),
+ required=False,
+ )
+ textindexer.searchable("nome_sede")
+
+
+class IAddressLocal(model.Schema):
+ """ """
+
+ quartiere = schema.TextLine(
+ title=_("quartiere", default="Quartiere"),
+ description=_("help_quartiere", default=""),
+ required=False,
+ )
+
+ circoscrizione = schema.TextLine(
+ title=_("circoscrizione", default="Circoscrizione"),
+ description=_("help_circoscrizione", default=""),
+ required=False,
+ )
+
+ # searchabletext indexer
+ textindexer.searchable("quartiere")
+ textindexer.searchable("circoscrizione")
+
+
+@provider(IFormFieldProvider)
+class IAddressVenue(IAddress, IAddressLocal):
+ """"""
+
+ model.fieldset(
+ "dove",
+ label=_("dove_label", default="Dove"),
+ fields=[
+ "street",
+ "zip_code",
+ "city",
+ "quartiere",
+ "circoscrizione",
+ "country",
+ ],
+ )
+
+
+@provider(IFormFieldProvider)
+class IAddressEvent(IAddress, IAddressNomeSede, IAddressLocal):
+ """"""
+
+ model.fieldset(
+ "luogo",
+ label=_("luogo_label", default="Luogo"),
+ fields=[
+ "nome_sede",
+ "street",
+ "zip_code",
+ "city",
+ "quartiere",
+ "circoscrizione",
+ "country",
+ ],
+ )
+
+
+@implementer(IAddressVenue)
+@adapter(IDexterityContent)
+class AddressVenue(object):
+ """ """
+
+ def __init__(self, context):
+ self.context = context
+
+
+@implementer(IAddressEvent)
+@adapter(IDexterityContent)
+class AddressEvent(object):
+ """ """
+
+ def __init__(self, context):
+ self.context = context
diff --git a/src/iosanita/contenttypes/behaviors/argomenti.py b/src/iosanita/contenttypes/behaviors/argomenti.py
index 672ac8b..4b76829 100644
--- a/src/iosanita/contenttypes/behaviors/argomenti.py
+++ b/src/iosanita/contenttypes/behaviors/argomenti.py
@@ -1,9 +1,11 @@
# -*- coding: utf-8 -*-
from iosanita.contenttypes import _
+from plone.app.contenttypes.interfaces import IEvent
from plone.app.dexterity import textindexer
from plone.app.z3cform.widget import RelatedItemsFieldWidget
from plone.autoform import directives as form
from plone.autoform.interfaces import IFormFieldProvider
+from plone.dexterity.interfaces import IDexterityContent
from plone.supermodel import model
from z3c.relationfield.schema import RelationChoice
from z3c.relationfield.schema import RelationList
@@ -74,6 +76,26 @@ class IArgomenti(IArgomentiSchema):
)
+@provider(IFormFieldProvider)
+class IArgomentiEvento(IArgomentiSchema):
+ """ """
+
+ tassonomia_argomenti = RelationList(
+ title=_("tassonomia_argomenti_label", default="Argomenti"),
+ description=_(
+ "tassonomia_argomenti_help",
+ default="Seleziona una lista di argomenti d'interesse per questo"
+ " contenuto.",
+ ),
+ value_type=RelationChoice(
+ title=_("Argomenti correlati"),
+ vocabulary="plone.app.vocabularies.Catalog",
+ ),
+ required=True,
+ default=[],
+ )
+
+
@implementer(IArgomenti)
@adapter(IDexterityContent)
class Argomenti(object):
@@ -81,3 +103,12 @@ class Argomenti(object):
def __init__(self, context):
self.context = context
+
+
+@implementer(IArgomentiEvento)
+@adapter(IEvent)
+class ArgomentiEvento(object):
+ """"""
+
+ def __init__(self, context):
+ self.context = context
diff --git a/src/iosanita/contenttypes/behaviors/configure.zcml b/src/iosanita/contenttypes/behaviors/configure.zcml
index b7ade4c..3f7348c 100644
--- a/src/iosanita/contenttypes/behaviors/configure.zcml
+++ b/src/iosanita/contenttypes/behaviors/configure.zcml
@@ -9,6 +9,16 @@
file="meta.zcml"
/>
+
+
+
+
+
+
+
+
+
+
diff --git a/src/iosanita/contenttypes/behaviors/contatti.py b/src/iosanita/contenttypes/behaviors/contatti.py
index 6650542..fb666a2 100644
--- a/src/iosanita/contenttypes/behaviors/contatti.py
+++ b/src/iosanita/contenttypes/behaviors/contatti.py
@@ -22,11 +22,25 @@ class IContattiStep(model.Schema):
description=_(
"contact_info_help",
default="I contatti per questo step.",
+ )
+ )
+
+
+class IContattiEvent(model.Schema):
+ contact_info = RelationList(
+ title=_(
+ "contact_info_label",
+ default="Punti di contatto",
+ ),
+ description=_(
+ "contact_info_help",
+ default="Relazione con i punti di contatto dell'evento.",
),
required=True,
default=[],
value_type=RelationChoice(
title=_("Contatti"),
+ title=_("Punti di contatto"),
vocabulary="plone.app.vocabularies.Catalog",
),
)
@@ -48,6 +62,13 @@ class IContattiStep(model.Schema):
@implementer(IContattiStep)
@adapter(IStep)
class ContattiStep(object):
+ def __init__(self, context):
+ self.context = context
+
+
+@implementer(IContattiEvent)
+@adapter(IContattiEvent)
+class ContattiEvent(object):
""" """
def __init__(self, context):
diff --git a/src/iosanita/contenttypes/behaviors/evento.py b/src/iosanita/contenttypes/behaviors/evento.py
new file mode 100644
index 0000000..d72ab80
--- /dev/null
+++ b/src/iosanita/contenttypes/behaviors/evento.py
@@ -0,0 +1,267 @@
+# -*- coding: utf-8 -*-
+from collective.volto.blocksfield.field import BlocksField
+from iosanita.contenttypes import _
+from plone.app.dexterity import textindexer
+from plone.app.z3cform.widget import RelatedItemsFieldWidget
+from plone.autoform import directives as form
+from plone.autoform.interfaces import IFormFieldProvider
+from plone.dexterity.interfaces import IDexterityContent
+from plone.supermodel import model
+from z3c.relationfield.schema import RelationChoice
+from z3c.relationfield.schema import RelationList
+from zope import schema
+from zope.component import adapter
+from zope.interface import implementer
+from zope.interface import provider
+
+
+@provider(IFormFieldProvider)
+class IEvento(model.Schema):
+ """Marker inteerface for content type Evento"""
+
+ sottotitolo = schema.TextLine(
+ title=_("sottotitolo_label", default="Sottotitolo"),
+ description=_(
+ "sottotitolo_help",
+ default="Indica un eventuale sottotitolo/titolo alternativo.",
+ ),
+ required=False,
+ )
+
+ descrizione_estesa = BlocksField(
+ title=_("descrizione_estesa", default="Descrizione estesa"),
+ required=True,
+ description=_(
+ "descrizione_estesa_help",
+ default="Descrizione dettagliata e completa.",
+ ),
+ )
+
+ descrizione_destinatari = BlocksField(
+ title=_("a_chi_si_rivolge_label", default="A chi è rivolto"),
+ required=True,
+ description=_(
+ "a_chi_si_rivolge_help",
+ default="Descrizione testuale dei principali destinatari dell'Evento",
+ ),
+ )
+
+ orari = BlocksField(
+ title=_("orari", default="Informazioni sugli orari"),
+ required=False,
+ description=_(
+ "orari_help",
+ default="Informazioni sugli orari di svolgimento dell'evento.",
+ ),
+ )
+
+ prezzo = BlocksField(
+ title=_("prezzo", default="Costo"),
+ required=True,
+ description=_(
+ "prezzo_help",
+ default="Eventuale costo dell'evento (se ci sono uno o più biglietti), "
+ "con link all'acquisto se disponibile",
+ ),
+ )
+
+ # campi presenti nelle vecchie grafiche che abbiamo deciso di continuare a mostrare
+ organizzato_da_interno = RelationList(
+ title=_("organizzato_da_interno_label", default="Organizzato da"),
+ default=[],
+ value_type=RelationChoice(vocabulary="plone.app.vocabularies.Catalog"),
+ required=False,
+ description=_(
+ "organizzato_da_interno_help",
+ default="Se l'evento è organizzato direttamente dal comune,"
+ " indicare l'ufficio/ente organizzatore. I dati di contatto "
+ "verranno presi direttamente dall'ufficio selezionato. Se l'evento"
+ " non è organizzato direttamente dal comune, o si vogliono "
+ "sovrascrivere alcuni dati di contatto, utilizzare i seguenti campi.", # noqa
+ ),
+ )
+ organizzato_da_esterno = BlocksField(
+ title=_("organizzato_da_esterno_label", default="Organizzatore"),
+ required=False,
+ description=_(
+ "organizzato_da_esterno_help",
+ default="Se l'evento non è organizzato direttamente dal comune oppure ha anche un organizzatore esterno," # noqa
+ " indicare il nome del contatto.",
+ ),
+ )
+
+ # campi aggiunti con il pnrr
+ patrocinato_da = BlocksField(
+ title=_("patrocinato_da_label", default="Patrocinato da"),
+ required=False,
+ description=_(
+ "patrocinato_da_help",
+ default="Indicare l'ente che supporta l'evento, se presente.",
+ ),
+ )
+
+ persone_amministrazione = RelationList(
+ title=_("parteciperanno_label", default="Parteciperanno (Persone)"),
+ required=False,
+ default=[],
+ value_type=RelationChoice(vocabulary="plone.app.vocabularies.Catalog"),
+ description=_(
+ "parteciperanno_help",
+ default="Link a persone dell'amministrazione che interverranno all'evento",
+ ),
+ )
+
+ chi_partecipa = BlocksField(
+ title=_("chi_partecipa_label", default="Parteciperanno"),
+ required=True,
+ description=_(
+ "chi_partecipa_help",
+ default="Descrizione testuale dei principali partecipanti.",
+ ),
+ )
+
+ evento_genitore = RelationList(
+ title="Evento genitore",
+ default=[],
+ description=_(
+ "evento_genitore_help",
+ default='Un evento può essere parte di un altro evento definito come "genitore"',
+ ),
+ value_type=RelationChoice(
+ title=_("Event"), vocabulary="plone.app.vocabularies.Catalog"
+ ),
+ required=False,
+ )
+
+ appuntamenti = RelationList(
+ title="Appuntamenti",
+ default=[],
+ description=_(
+ "appuntamenti_help",
+ default="Link agli eventi figlio (solo se l'evento in questione è evento genitore).",
+ ),
+ value_type=RelationChoice(
+ title=_("Event"), vocabulary="plone.app.vocabularies.Catalog"
+ ),
+ required=False,
+ )
+
+ dove_rivolgersi = RelationList(
+ title="Dove rivolgersi",
+ default=[],
+ required=True,
+ description=_(
+ "dove_rivolgersi_help",
+ default="Link all'eventuale scheda della struttura dell'ASL in cui si svolge l'evento.",
+ ),
+ value_type=RelationChoice(
+ title=_("Struttura"), vocabulary="plone.app.vocabularies.Catalog"
+ ),
+ )
+
+ a_chi_si_rivolge = BlocksField(
+ title=_("a_chi_si_rivolge_label", default="A chi è rivolto"),
+ required=True,
+ description=_(
+ "a_chi_si_rivolge_help",
+ default="A chi si rivolge questo servizio.",
+ ),
+ )
+
+ documenti_correlati = RelationList(
+ title="Documenti correlati",
+ default=[],
+ required=True,
+ description=_(
+ "documenti_correlati_help",
+ default="Link alle schede documenti e allegati di supporto all'evento. Per poter scaricare direttamente un file occorre inserirlo all'interno della cartella 'Allegati'.",
+ ),
+ value_type=RelationChoice(
+ title=_("Documento"), vocabulary="plone.app.vocabularies.Catalog"
+ ),
+ )
+
+ eventi_correlati = RelationList(
+ title="Eventi correlati",
+ default=[],
+ required=True,
+ description=_(
+ "eventi_correlati_help", default="Seleziona gli eventi correlati."
+ ),
+ value_type=RelationChoice(
+ title=_("Event"), vocabulary="plone.app.vocabularies.Catalog"
+ ),
+ )
+
+ # custom widgets
+
+ form.widget(
+ "organizzato_da_interno",
+ RelatedItemsFieldWidget,
+ vocabulary="plone.app.vocabularies.Catalog",
+ pattern_options={
+ "selectableTypes": ["Persona", "UnitaOrganizzativa", "Servizio"],
+ },
+ )
+ form.widget(
+ "persone_amministrazione",
+ RelatedItemsFieldWidget,
+ vocabulary="plone.app.vocabularies.Catalog",
+ pattern_options={
+ "selectableTypes": ["Persona"],
+ },
+ )
+
+ # custom fieldsets and order
+ form.order_before(sottotitolo="ILeadImageBehavior.image")
+
+ model.fieldset(
+ "cose",
+ label=_("cose_label", default="Cos'è"),
+ fields=[
+ "descrizione_estesa",
+ "descrizione_destinatari",
+ "persone_amministrazione",
+ ],
+ )
+ model.fieldset(
+ "date_e_orari",
+ label=_("date_e_orari_label", default="Date e orari"),
+ fields=["orari"],
+ )
+ model.fieldset("costi", label=_("costi_label", default="Costi"), fields=["prezzo"])
+ model.fieldset(
+ "contatti",
+ label=_("contatti_label", default="Contatti"),
+ fields=[
+ "organizzato_da_interno",
+ "organizzato_da_esterno",
+ "patrocinato_da",
+ ],
+ )
+ model.fieldset(
+ "partecipanti",
+ label=_("partecipanti_label", default="Chi partecipa"),
+ fields=["chi_partecipa"],
+ )
+ model.fieldset(
+ "categorization",
+ label=_("evento_genitore_label", default="Categorizzazione"),
+ fields=["evento_genitore"],
+ )
+ model.fieldset(
+ "categorization",
+ label=_("appuntamenti_label", default="Categorizzazione"),
+ fields=["appuntamenti"],
+ )
+
+ textindexer.searchable("descrizione_estesa")
+
+
+@implementer(IEvento)
+@adapter(IDexterityContent)
+class Evento(object):
+ """ """
+
+ def __init__(self, context):
+ self.context = context
diff --git a/src/iosanita/contenttypes/behaviors/geolocation.py b/src/iosanita/contenttypes/behaviors/geolocation.py
new file mode 100644
index 0000000..dfd45fa
--- /dev/null
+++ b/src/iosanita/contenttypes/behaviors/geolocation.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+from collective.geolocationbehavior.geolocation import IGeolocatable
+from iosanita.contenttypes import _
+from plone.autoform.interfaces import IFormFieldProvider
+from plone.dexterity.interfaces import IDexterityContent
+from plone.supermodel import model
+from zope.component import adapter
+from zope.interface import implementer
+from zope.interface import provider
+
+
+@provider(IFormFieldProvider)
+class IGeolocatableEvent(IGeolocatable):
+ model.fieldset(
+ "luogo",
+ label=_("luogo_label", default="Luogo"),
+ fields=["geolocation"],
+ )
+
+
+@implementer(IGeolocatableEvent)
+@adapter(IDexterityContent)
+class GeolocatableEvent(object):
+ """ """
+
+ def __init__(self, context):
+ self.context = context
diff --git a/src/iosanita/contenttypes/behaviors/strutture_correlate.py b/src/iosanita/contenttypes/behaviors/strutture_correlate.py
new file mode 100644
index 0000000..96a5a83
--- /dev/null
+++ b/src/iosanita/contenttypes/behaviors/strutture_correlate.py
@@ -0,0 +1,53 @@
+# -*- coding: utf-8 -*-
+from iosanita.contenttypes import _
+from plone.app.z3cform.widget import RelatedItemsFieldWidget
+from plone.autoform import directives as form
+from plone.autoform.interfaces import IFormFieldProvider
+from plone.dexterity.interfaces import IDexterityContent
+from plone.supermodel import model
+from z3c.relationfield.schema import RelationChoice
+from z3c.relationfield.schema import RelationList
+from zope.component import adapter
+from zope.interface import implementer
+from zope.interface import provider
+
+
+@provider(IFormFieldProvider)
+class IStruttureCorrelate(model.Schema):
+ strutture_correlate = RelationList(
+ title="Strutture correlate",
+ default=[],
+ value_type=RelationChoice(
+ title=_("Struttura correlata"),
+ vocabulary="plone.app.vocabularies.Catalog",
+ ),
+ required=False,
+ missing_value=(),
+ description=_(
+ "strutture_correlate_help",
+ default="Seleziona la lista delle strutture correlate.",
+ ),
+ )
+ form.widget(
+ "strutture_correlate",
+ RelatedItemsFieldWidget,
+ vocabulary="plone.app.vocabularies.Catalog",
+ pattern_options={
+ "selectableTypes": ["UnitaOrganizzativa"],
+ },
+ )
+
+ model.fieldset(
+ "luogo",
+ label=_("luogo_label", default="Luogo"),
+ fields=["strutture_correlate"],
+ )
+
+
+@implementer(IStruttureCorrelate)
+@adapter(IDexterityContent)
+class StruttureCorrelate(object):
+ """ """
+
+ def __init__(self, context):
+ self.context = context
diff --git a/src/iosanita/contenttypes/configure.zcml b/src/iosanita/contenttypes/configure.zcml
index 6790592..66e3fac 100644
--- a/src/iosanita/contenttypes/configure.zcml
+++ b/src/iosanita/contenttypes/configure.zcml
@@ -10,7 +10,6 @@
-
diff --git a/src/iosanita/contenttypes/content/evento.py b/src/iosanita/contenttypes/content/evento.py
new file mode 100644
index 0000000..2fe6214
--- /dev/null
+++ b/src/iosanita/contenttypes/content/evento.py
@@ -0,0 +1,9 @@
+# -*- coding: utf-8 -*-
+from plone.dexterity.content import Container
+from plone.event.interfaces import IEvent
+from zope.interface import implementer
+
+
+@implementer(IEvent)
+class Event(Container):
+ """ """
diff --git a/src/iosanita/contenttypes/interfaces.py b/src/iosanita/contenttypes/interfaces.py
deleted file mode 100644
index bc3dc28..0000000
--- a/src/iosanita/contenttypes/interfaces.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# -*- coding: utf-8 -*-
-"""Module where all interfaces, events and exceptions live."""
-
-from zope.publisher.interfaces.browser import IDefaultBrowserLayer
-
-
-class IIosanitaContenttypesLayer(IDefaultBrowserLayer):
- """Marker interface that defines a browser layer."""
diff --git a/src/iosanita/contenttypes/permissions.zcml b/src/iosanita/contenttypes/permissions.zcml
index ea2eee5..1d0d6a9 100644
--- a/src/iosanita/contenttypes/permissions.zcml
+++ b/src/iosanita/contenttypes/permissions.zcml
@@ -5,6 +5,8 @@
>
+
+
+
diff --git a/src/iosanita/contenttypes/profiles/behaviors/taxonomies/tipologia_evento.cfg b/src/iosanita/contenttypes/profiles/behaviors/taxonomies/tipologia_evento.cfg
new file mode 100644
index 0000000..ae23182
--- /dev/null
+++ b/src/iosanita/contenttypes/profiles/behaviors/taxonomies/tipologia_evento.cfg
@@ -0,0 +1,11 @@
+[taxonomy]
+name = tipologia_evento
+title = Tipo di evento
+description = Il sistema di gestione contenuti basato su React
+default_language = it
+field_title = Tipo di evento
+field_description = Seleziona la tipologia dell'evento
+field_prefix =
+taxonomy_fieldset = default
+is_single_select = true
+is_required = true
diff --git a/src/iosanita/contenttypes/profiles/behaviors/taxonomies/tipologia_evento.xml b/src/iosanita/contenttypes/profiles/behaviors/taxonomies/tipologia_evento.xml
new file mode 100644
index 0000000..3f160aa
--- /dev/null
+++ b/src/iosanita/contenttypes/profiles/behaviors/taxonomies/tipologia_evento.xml
@@ -0,0 +1,92 @@
+
+
+
+ Tipo di evento
+
+ tipologia_evento
+
+ evento_di_formazione
+
+ Evento di formazione
+
+
+ scuola_estiva_invernale
+
+ Scuola estiva/invernale
+
+
+
+ webinar
+
+ Webinar
+
+
+
+ seminario
+
+ Seminario
+
+
+
+ laboratorio
+
+ Laboratorio
+
+
+
+ presentazione_libro
+
+ Presentazione libro
+
+
+
+ corso
+
+ Corso
+
+
+
+
+ conferenza_summit
+
+ Conferenza e Summit
+
+
+ convegno
+
+ Convegno
+
+
+
+ vertice
+
+ Vertice
+
+
+
+ congresso
+
+ Congresso
+
+
+
+
+ giornata_informativa
+
+ Giornata informativa
+
+
+ giornata_aperta
+
+ Giornata aperta
+
+
+
+
+
diff --git a/src/iosanita/contenttypes/profiles/behaviors/taxonomies/tipologia_target.cfg b/src/iosanita/contenttypes/profiles/behaviors/taxonomies/tipologia_target.cfg
new file mode 100644
index 0000000..f091804
--- /dev/null
+++ b/src/iosanita/contenttypes/profiles/behaviors/taxonomies/tipologia_target.cfg
@@ -0,0 +1,11 @@
+[taxonomy]
+name = tipologia_target
+title = Target
+description = Il sistema di gestione contenuti basato su React
+default_language = it
+field_title = Target
+field_description = Seleziona il target
+field_prefix =
+taxonomy_fieldset = default
+is_single_select = true
+is_required = false
diff --git a/src/iosanita/contenttypes/profiles/behaviors/taxonomies/tipologia_target.xml b/src/iosanita/contenttypes/profiles/behaviors/taxonomies/tipologia_target.xml
new file mode 100644
index 0000000..481f840
--- /dev/null
+++ b/src/iosanita/contenttypes/profiles/behaviors/taxonomies/tipologia_target.xml
@@ -0,0 +1,56 @@
+
+
+
+ Target
+
+ target
+
+ persone
+
+ Persone
+
+
+ bambini
+
+ Bambini
+
+
+
+ adoescenti
+
+ Adolescenti
+
+
+
+
+ Entità
+
+ Entitàt
+
+
+ imprese
+
+ Imprese
+
+
+
+ scuole
+
+ Scuole
+
+
+
+ congresso
+
+ Congresso
+
+
+
+
+
diff --git a/src/iosanita/contenttypes/profiles/default/metadata.xml b/src/iosanita/contenttypes/profiles/default/metadata.xml
index 3fcf1da..5ca96e0 100644
--- a/src/iosanita/contenttypes/profiles/default/metadata.xml
+++ b/src/iosanita/contenttypes/profiles/default/metadata.xml
@@ -3,5 +3,8 @@
1000
+ profile-plone.restapi:default
+ profile-collective.taxonomy:default
+ profile-collective.venue:default
diff --git a/src/iosanita/contenttypes/profiles/default/rolemap.xml b/src/iosanita/contenttypes/profiles/default/rolemap.xml
index be8a3ac..8ff0b18 100644
--- a/src/iosanita/contenttypes/profiles/default/rolemap.xml
+++ b/src/iosanita/contenttypes/profiles/default/rolemap.xml
@@ -12,11 +12,20 @@
+
+
+
+
+
+
diff --git a/src/iosanita/contenttypes/profiles/default/types/Event.xml b/src/iosanita/contenttypes/profiles/default/types/Event.xml
new file mode 100644
index 0000000..b7c3393
--- /dev/null
+++ b/src/iosanita/contenttypes/profiles/default/types/Event.xml
@@ -0,0 +1,68 @@
+
+
diff --git a/test_plone60.cfg b/test_plone60.cfg
index 0988c88..7d9d30c 100644
--- a/test_plone60.cfg
+++ b/test_plone60.cfg
@@ -17,12 +17,27 @@ cmarkgfm = 2024.1.14
coverage = 7.5.4
i18ndude = 6.2.0
keyring = 25.2.1
+# Added by buildout at 2024-07-03 11:55:13.835262
+build = 1.2.1
+cmarkgfm = 2024.1.14
+collective.geolocationbehavior = 1.7.2
+collective.venue = 4.1
+coverage = 7.5.4
+geographiclib = 2.0
+geopy = 2.4.1
+i18ndude = 6.2.0
+keyring = 25.2.1
+kitconcept.seo = 2.1.0
markdown-it-py = 3.0.0
mdurl = 0.1.2
nh3 = 0.2.17
pkginfo = 1.10.0
pyproject-hooks = 1.1.0
readme-renderer = 43.0
+plone.formwidget.geolocation = 3.0.6
+pyproject-hooks = 1.1.0
+readme-renderer = 43.0
+redturtle.volto = 5.4.9
requests-toolbelt = 1.0.0
rfc3986 = 2.0.0
rich = 13.7.1
@@ -34,6 +49,22 @@ zest.releaser = 9.2.0
# jaraco.context==5.3.0
backports.tarfile = 1.2.0
+# Required by:
+# collective.venue==4.1
+collective.address = 1.6
+
+# Required by:
+# redturtle.volto==5.4.9
+collective.purgebyid = 1.2.2
+
+# Required by:
+# redturtle.volto==5.4.9
+collective.volto.cookieconsent = 1.1.1
+
+# Required by:
+# redturtle.volto==5.4.9
+collective.volto.gdprcookie = 1.0.3
+
# Required by:
# keyring==25.2.1
jaraco.classes = 3.4.0
@@ -76,3 +107,25 @@ collective.volto.gdprcookie = 1.0.3
# Required by:
# iosanita.contenttypes==2.0.0.dev0
collective.volto.blocksfield = 2.0.0
+# collective.address==1.6
+pycountry = 24.6.1
+
+# Required by:
+# iosanita.contenttypes==2.0.0.dev0
+z3c.jbot = 2.0
+
+# Added by buildout at 2024-07-03 11:55:59.594145
+
+# Required by:
+# iosanita.contenttypes==2.0.0.dev0
+collective.volto.blocksfield = 2.0.0
+
+# Added by buildout at 2024-07-03 12:28:31.637588
+
+# Required by:
+# eea.api.taxonomy==1.5
+collective.taxonomy = 3.1.1
+
+# Required by:
+# iosanita.contenttypes==2.0.0.dev0
+eea.api.taxonomy = 1.5