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 @@ + + + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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