design.plone.iocittadino


Namedesign.plone.iocittadino JSON
Version 1.0.0b9 PyPI version JSON
download
home_pagehttps://gitlab.com/redturtle/io-comune/design.plone.iocittadino
SummaryAn add-on for Plone
upload_time2024-03-12 13:25:51
maintainer
docs_urlNone
authorRedTurtle
requires_python>=3.7
licenseGPL version 2
keywords python plone cms
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            .. This README is meant for consumption by humans and pypi. Pypi can render rst files so please do not use Sphinx features.
   If you want to learn more about writing documentation, please check out: http://docs.plone.org/about/documentation_styleguide.html
   This text does not appear on pypi or github. It is a comment.

.. image:: https://gitlab.com/redturtle/io-comune/design.plone.iocittadino/badges/master/coverage.svg

.. image:: https://gitlab.com/redturtle/io-comune/design.plone.iocittadino/badges/master/pipeline.svg

.. image:: https://gitlab.com/redturtle/io-comune/design.plone.iocittadino/-/badges/release.svg


============
Io-Cittadino
============

Io-Cittadino è un add-on per l'ecosistema Io-Comune per gestire i servizi online di un ente.

Funzionamento
=============

E' presente un nuovo content-type "Modello Pratica" che serve a definire appunto il modello di una pratica per un determinato servizio online offerto.

E' integrato nel frontend con un form builder per permettere alla redazione di creare i campi che servono.

Nomenclatura
------------

Modello Pratica = Content-Type che contiene il modello del form da compilare per l'utente.
Form = Elenco dei campi necessari per richiedere un determinato servizio online, definito nell'oggetto Modello Pratica. E' quello che i cittadini andranno a compilare per le richieste.
Pratica = Form compilato e salvato da parte dell'utente. Ogni Pratica ha un proprio codice identificativo che permetterà all'utente di consultarla e modificarla.

Salvataggio dati
================

Lo storage dei dati è basato su plone.souper, ma può essere facilmente sostituito con altri storage (ad esempio postgresql) semplicemente
registrando un adapter specifico.

Ogni volta che un utente compila il form, viene salvata una nuova entry in nello storage con i dati del form e una serie di dati accessori.


Restapi endpoints Pratica
=========================

Creazione nuova Pratica
-----------------------

Endpoint da chiamare sulla radice che accetta solamente chiamate in `POST`.

Solo gli utenti autenticati possono chiamare questo endpoint.

Campi obbligatori:

- **form**: Summary del modello pratica
- **data**: I dati compilati dall'utente.

Campi opzionali:

- **assigned_to**: Utente a cui è assegnata la Pratica.
- **state**: Stato di revisione della Pratica.

Gli unici stati possibili sono `draft` e `ongoing`. Vedi paragrafo dedicato agli stati, per maggiori informazioni.

Se lo stato è `draft`, i dati possono anche essere vuoti.

Ogni altro campo passato all'endpoint verrà scartato e non salvato nella Pratica.

Esempio::

    > curl -i -X POST http://nohost/plone/@pratica -H "Accept: application/json" -H "Content-Type: application/json" --data-raw '{"form_id": "xxx", "data": {...}}' --user admin:secret


Esempio di risposta (codice di risposta: `200``)::

    {"item_id": 123456}


Modifica Pratica
----------------

Endpoint da chiamare sulla radice del sito che accetta solamente chiamate in `PATCH`.

E' necessario passare anche il **item_id** di riferimento di una pratica.

Solo gli utenti autenticati possono chiamare questo endpoint.

Solamente gli utenti con un determinato permesso (*design.plone.iocittadino: Manage Pratica*) possono modificare le Pratiche create da altri utenti.

Campi:

- **data**: I dati compilati dall'utente (obbligatorio solamente per la pratica in stato draft o quando si fa il salvataggio finale).
- **assigned_to**: Utente a cui è assegnata la Pratica (non obbligatorio).
- **state**: Stato di revisione della Pratica (non obbligatorio).

Gli unici stati possibili sono `draft` e `ongoing`. Vedi paragrafo dedicato agli stati, per maggiori informazioni.

Non è possibile modificare una pratica dopo che va in stato `ongoing`.

Esempio::

    > curl -i -X PATCH http://nohost/plone/@pratica/123456 -H "Accept: application/json" -H "Content-Type: application/json" --data-raw '{"data": {...}}' --user admin:secret

Se la modifica ha esito positivo, il codice di risposta è `204` (OK senza dati).

Cancellazione Pratica
---------------------

Endpoint da chiamare sulla radice del sito che accetta chiamate in `DELETE`.

E' necessario passare anche il **item_id** di riferimento.

Solo gli utenti autenticati possono chiamare questo endpoint.

Solamente gli utenti con un determinato permesso (*design.plone.iocittadino: Manage Pratica*) possono cancellare le Pratiche create da altri utenti.

Esempio::

    > curl -i -X DELETE http://nohost/plone/@pratica/123456 -H "Accept: application/json" -H "Content-Type: application/json" --user admin:secret

Se la cancellazione ha esito positivo, il codice di risposta è `204` (OK senza dati).

Dettaglio Pratica
-----------------

Endpoint da chiamare sulla radice del sito che accetta chiamate in `GET`.

Se si passa un **item_id** di riferimento, ritorna i dati della pratica di riferimento.
Se non gli si passa nessun valore, allora vengono ritornati una serie di dati di default dell'utente per pre-popolare i campi del form.

Solo gli utenti autenticati possono chiamare questo endpoint.

Solamente gli utenti con un determinato permesso (*design.plone.iocittadino: Manage Pratica*) possono consultare le Pratiche create da altri utenti.

Esempio::

    > curl -i -X GET http://nohost/plone/@pratica/123456 -H "Accept: application/json" -H "Content-Type: application/json" --user admin:secret


Esempio di risposta senza parametri (codice di risposta: `200``)::

    {
        'data': {"email": "", "fullname": "", "id": "admin"},
    }


Esempio di risposta con parametri (codice di risposta: `200``)::

    {
        'creation_date': '2022-12-15T14:23:35',
        'data': { survey js form data in JSON fromat },
        'form': { ModelloPratica serialized to JSON summary},
        'item_id': 817407564,
        'state': 'foo',
        'userid': 'admin',
        'email': 'email'
        'next_steps': [{"days_number": "3", "title": "Presa in gestione"}],
        'assigned_to': 'pratica_manager'
        'has_report': true
        'servizi_collegati': ['<service uid>', '<service uid>'],
        'ufficio': { '<Uffico serialized to JSON summary>' },
        'messages': ['<Serialized to JSON Summary message>',]

    }


Di default nel campo `form` non viene ritornato lo schema, ma se serve, basta appendere alla request "show_schema=1"::

    > curl -i -X GET http://nohost/plone/@pratica/123456?show_schema=1 -H "Accept: application/json" -H "Content-Type: application/json" --user admin:secret

Elenco di Pratiche
------------------

Endpoint da chiamare sulla radice del sito che accetta chiamate in `GET`.

Ritorna una lista di pratiche filtrate in base ai parametri di ricerca passati.

Solo gli utenti autenticati possono chiamare questo endpoint.

Solamente gli utenti con un determinato permesso (*design.plone.iocittadino: Manage Pratica*) possono accedere alle Pratiche create da altri utenti.

Esempio p avere tutte le Pratiche (quindi senza nessun filtro)::

    > curl -i -X GET http://nohost/plone/@pratiche -H "Accept: application/json" -H "Content-Type: application/json" --user admin:secret

Esempio per avere solo le Pratiche di un singolo utente (quindi con un filtro impostato)::

    > curl -i -X GET http://nohost/plone/@pratiche?userid=foo -H "Accept: application/json" -H "Content-Type: application/json" --user admin:secret

Esempio di risposta (codice di risposta: `200``)::

    {
        "@id": "http://nohost/plone/@pratiche",
        "items": [
            {
                'creation_date': '2022-12-15T14:23:35',
                'data': { survey js form data in JSON fromat },
                'form': { ModelloPratica serialized to JSON summary},
                'item_id': 817407564,
                'state': 'foo',
                'userid': 'admin',
                'email': 'email'
                'next_steps': [{"days_number": "3", "title": "Presa in gestione"}],
                'assigned_to': 'pratica_manager'
                'has_report': true
                'servizi_collegati': ['<service uid>', '<service uid>'],
                'ufficio': { Uffico serialized to JSON summary }
                'messages': ['<Serialized to JSON Summary message>',]

            },
            {
                'creation_date': '2022-12-15T14:23:35',
                'data': { survey js form data in JSON fromat },
                'form': { ModelloPratica serialized to JSON summary},
                'item_id': 817407564,
                'state': 'foo',
                'userid': 'admin',
                'email': 'email'
                'next_steps': [{"days_number": "3", "title": "Presa in gestione"}],
                'assigned_to': 'pratica_manager'
                'has_report': true
                'servizi_collegati': ['<service uid>', '<service uid>'],
                'ufficio': { Uffico serialized to JSON summary },
                'messages': ['<Serialized to JSON Summary message>',]

            }
        ],
        "items_total": 2,
        "services": [
            ...
        ]
    }


Cambio stato pratica
--------------------

Endpoint da chiamare sulla radice del sito che accetta chiamate in `POST`.

E' necessario passare anche il **item_id** di riferimento nell'url.

Solo gli utenti autenticati possono chiamare questo endpoint.

Solamente gli utenti con un determinato permesso (*design.plone.iocittadino: Manage Pratica*) possono consultare le Pratiche create da altri utenti.

Esempio::

    > curl -i -X POST http://nohost/plone/@pratica-workflow/123456 -H "Accept: application/json" -H "Content-Type: application/json" --data-raw '{"state": "foo"}' --user admin:secret


Se il cambio di stato ha esito positivo, il codice di risposta è `204` (OK senza dati).


Stati della pratica
===================

E' stato creato un workflow semplificato per le Pratiche, per determinare lo stato di avanzamento dei lavori:

- Bozza (*draft*): stato iniziale quando l'utente dal form sceglie di salvare una bozza della Pratica che sta compilando, finché non è completata. Dallo stato **Bozza** è possibile andare allo stato **In corso**. Non è possibile ritornare allo stato bozza in nessun modo.
- In corso (*ongoing*): stato a cui si arriva dopo la bozza, o come stato iniziale quando l'utente compila il form senza passare per la bozza. Da questo stato, è possibile andare allo stato **Sospeso** o **Concluso**.
- Sospeso (*suspended*): stato in cui si richiede un'azione da parte dell'utente o dalla Pubblica Amministrazione. Da questo stato è possibile tornare indietro allo stato **In corso** o andare allo stato **Concluso**.
- Concluso (*completed*): stato finale della Pratica che ha completato l'iter di gestione. Una Pratica conclusa non può più cambiare stato.
- Annullato (*canceled*): stato finale della Pratica che è stata annullata. Una Pratica annullata non può più cambiare stato.

Restapi endpoints Messaggio
===========================

Creazione nuovo Messaggio
-------------------------

Endpoint da chiamare sulla radice che accetta solamente chiamate in `POST`.

Solo gli utenti autenticati possono chiamare questo endpoint.

Campi obbligatori:

- **pratica_id**: id della pratica legata.
- **message**: Il messaggio compilato dall'utente.

Campi opzionali:

- **state**: Stato di revisione del Messaggio.
- **notify_on_email**: Notifica l'utente che il messaggio è stato creato. Default: `true`

L'unico stato possibile `pending`. Vedi paragrafo dedicato agli stati, per maggiori informazioni.

Ogni altro campo passato all'endpoint verrà scartato e non salvato nel messaggio.

Esempio::

    > curl -i -X POST http://nohost/plone/@message -H "Accept: application/json" -H "Content-Type: application/json" --data-raw '{"pratica_id": "xxx", "message": "message"}' --user admin:secret


Esempio di risposta (codice di risposta: `200``)::

    {"item_id": 123456}

Esempio del messaggio con dei file allegati::
    > curl -i -X POST http://nohost/plone/@message -H "Accept: application/json" -H "Content-Type: application/json" --user admin:secret --data-raw
      '{
        "pratica_id": "xxx",
        "message": "message",
        "attachments": [{"filename": "Attacment.txt", "filestream": "b64 encoded file string"}]
        }'


Modifica Messaggio
------------------

Non implementato

Cancellazione Messaggio
-----------------------

Endpoint da chiamare sulla radice del sito che accetta chiamate in `DELETE`.

E' necessario passare anche il **item_id** di riferimento.

Solo gli utenti autenticati possono chiamare questo endpoint.

Solamente gli utenti con un determinato permesso (*design.plone.iocittadino: Manage Message*) possono cancellare i messaggi creati da altri utenti.

Esempio::

    > curl -i -X DELETE http://nohost/plone/@message/123456 -H "Accept: application/json" -H "Content-Type: application/json" --user admin:secret

Se la cancellazione ha esito positivo, il codice di risposta è `204` (OK senza dati).

Dettaglio Messaggio
-------------------

Endpoint da chiamare sulla radice del sito che accetta chiamate in `GET`.

E' necessario passare anche il **item_id** di riferimento.

Solo gli utenti autenticati possono chiamare questo endpoint.

Solamente gli utenti con un determinato permesso (*design.plone.iocittadino: Manage Message*) possono consultare i messaggi creati da altri utenti.

Esempio::

    > curl -i -X GET http://nohost/plone/@message/123456 -H "Accept: application/json" -H "Content-Type: application/json" --user admin:secret


Esempio di risposta (codice di risposta: `200``)::

    {
        'date': '2022-12-15T14:23:35',
        'message': 'a message',
        'pratica': { Related pratica serialized to JSON summary },
        'item_id': 817407564,
        'state': 'foo',
        'userid': 'admin',
        'attachments':
            [
                {
                    'filename': "attachment.txt",
                    'download_url': "http://nohost/plone/@message/123456/@@download/3d5e2b0e896a4607a2129c882eee73f0"
                },
                ...
            ]
    }

Elenco dei Messaggi
-------------------

Endpoint da chiamare sulla radice del sito che accetta chiamate in `GET`.

Ritorna una lista di pratiche filtrate in base ai parametri di ricerca passati.

Solo gli utenti autenticati possono chiamare questo endpoint.

Solamente gli utenti con un determinato permesso (*design.plone.iocittadino: Manage Message*) possono accedere ai messaggi create da altri utenti.

Esempio p avere tutti i Messaggi (quindi senza nessun filtro)::

    > curl -i -X GET http://nohost/plone/@messages -H "Accept: application/json" -H "Content-Type: application/json" --user admin:secret

Esempio per avere solo i messaggi di un singolo utente (quindi con un filtro impostato)::

    > curl -i -X GET http://nohost/plone/@messages?userid=foo -H "Accept: application/json" -H "Content-Type: application/json" --user admin:secret

Esempio di risposta (codice di risposta: `200``)::

    {
        "@id": "http://nohost/plone/@messages",
        "items": [
            {
                'date': '2022-12-15T14:23:35',
                'message': 'a message',
                'item_id': 817407564,
                'pratica': { Related pratica serialized to JSON summary },
                'state': 'foo',
                'userid': 'foo',
                'attachments':
                    [
                        {
                            'name': "attachment.txt",
                            'url': "http://nohost/plone/@message/123455/@@download/1/attachment.txt"
                        },
                        ...
                    ]
            },
            {
                'date': '2022-12-15T14:24:35',
                'message': 'a mssage',
                'item_id': 817407564,
                'pratica': { Related pratica serialized to JSON summary },
                'state': 'foo',
                'userid': 'foo',
                'attachments':
                [
                    {
                        'name': "attachment.txt",
                        'url': "http://nohost/plone/@message/123456/@@download/1/attachment.txt"
                    },
                    ...
                ]
            }
        ],
        "items_total": 2,
    }


Cambio stato Messaggio
----------------------

Endpoint da chiamare sulla radice del sito che accetta chiamate in `GET`.

E' necessario passare anche il **item_id** di riferimento.

Solo gli utenti autenticati possono chiamare questo endpoint.

Solamente gli utenti con un determinato permesso (*design.plone.iocittadino: Manage Message*) possono consultare i Messaggi create da altri utenti.

Esempio::

    > curl -i -X POST http://nohost/plone/@message-workflow/123456 -H "Accept: application/json" -H "Content-Type: application/json" --data-raw '{"state": "foo"}' --user admin:secret


Se il cambio di stato ha esito positivo, il codice di risposta è `204` (OK senza dati).


Stati del Messaggio
===================

E' stato creato un workflow semplificato per le Pratiche, per determinare lo stato di avanzamento dei lavori:

- Creato (*pending*): stato iniziale quando il messaggio è stato creato **Inviato**
- Inviato (*sent*): stato indica che il messaggio è stato inviato **Visualizzato**
- Visualizzato (*seen*): stato finale dopo che il messaggio è stato visualizzato al cliente

Operatori pratiche
==================

In fase di installazione, viene creato un nuovo gruppo "*Operatori pratiche*" in cui andranno inseriti gli utenti che
si occuperanno della gestione delle pratiche.

Questo gruppo ha un permesso speciale "*Gestore Pratiche*" che gli permette di gestire le pratiche appunto.

@operatori_pratica endpoint
---------------------------

Endpoint per permettere di avere la lista degli utenti inseriti nel gruppo (senza avere i permessi di leggere i membri dei gruppi Plone).

Esempio di chiamata::

    > curl -i -X GET http://localhost:8080/Plone/++api++/@operatori_pratica --user admin:secret

E la risposta è qualcosa del genere::

    {
        "@id": "http://localhost:8080/Plone/@groups/operatori_pratiche",
        "items": [
            {
                "label": "John Doe",
                "value": "jdoe"
            }
        ],
        "items_total": 1
    }

Estensione della pratica
========================
Tramite un sistema di utility è possibile estendere sia i field della pratica che
i campi tornati nel serializer della pratica.

Per estendere i field della pratica è necessario registrare un'utility tipo::

    @interface.implementer(IPraticaStoreFieldsExtender)
    class FieldExtender(object):
        @property
        def fields(self):
            return {
                "new_field_a": {"required": False},
                "new_field_b": {"required": False},
                "new_field_c": {"required": False},
            }

Per estendere il serializer è necessario registrare un'utility tipo::

    @interface.implementer(IPraticaStoreSerializerExtender)
    class ExtendsPraticaSerializer(object):
        def get_fields(self, pratica):
            return {
                "new_field_a": "A_value",
                "new_field_b": "B_value",
                "new_field_c": "C_value",
            }

La stessa identica cosa è possibile per i messaggi, registrando utility fatte
alla stessa identica maniera per le interfacce IMessageStoreFieldsExtender e
IMessageStoreSerializerExtender; c'è inoltre un'interfaccia
IMessageStoreSerializerSummaryExtender utile per estendere il serializer dell
summary.


Traduzioni
==========

Questo prodotto è stato tradotto in:

- Inglese
- Italiano

Report PDF
==========

E' possibile reperire il report della pratica in pdf chiamando la vista **@@pratica_report** sulla radice del sito.

Parametri::

    - **item_id**: l'id della pratica

Solo gli utenti autenticati possono chiamare questa vista.

Solamente gli utenti con un determinato permesso (*design.plone.iocittadino: Manage Pratica*) possono consultare le pratiche create da altri utenti.


Installazione
=============

Per installare design.plone.iocittadino basta aggiungere il prodotto nel buildout::

    [buildout]

    ...

    eggs =
        design.plone.iocittadino


e poi eseguire il comando ``bin/buildout``.

Il prodotto va poi installato da pannello di controllo.

Il prodotto richiede installazione del pacchetto `wkhtmltopdff`

Autori
======

Questo prodotto è stato sviluppato da RedTurtle Technology.

.. image:: http://www.redturtle.net/redturtle_banner.png
   :alt: RedTurtle Technology Site
   :target: http://www.redturtle.net/


Licenza
-------

Questo prodotto è sotto la licenza GPLv2.


Contributors
============

- RedTurtle, sviluppo@redturtle.it


Changelog
=========

1.0.0b9 (2024-03-12)
--------------------

- Aggiunto modo per aggiungere campi al messaggio e al suo summary serializer
  registrando delle utility per interfacce predefinite
  [lucabel]
- Aggiunto campi precompilabili (idCard, expirationDate, countyOfBirth, 
  placeOfBirthName, placeOfBirth, placeOfBirthIstatCode)
  [lucabel]



1.0.0b8 (2024-03-05)
--------------------
- Aggiunto modo per aggiungere campi al messaggio e al suo serializer registrando
  delle utility per interfacce predefinite
  [lucabel]

1.0.0b7 (unreleased)
--------------------

- Fix the PDF Report + new survey field type added to pdf generation: radiogroup
  [folix-01]
- Fix: #49945 l'areaopeartore va in errore se il modello pratica è stato cancellato
  (Aggiunto workaround per non mandare in errore, serve però che i dati siano in qualche modo
  recuperabili anche se il modello è stato eliminato)
  [mamico]
- Aggiunto modo per aggiungere campi alla pratica e al suo serializer registrando
  delle utility per interfacce predefinite
  [lucabel]

1.0.0b6 (2023-10-25)
--------------------

- Allow users to retrieve their own messages also if ModelloPratica is private.
  [cekk]


1.0.0b5 (2023-08-31)
--------------------
- Manage blobs as a storage field
  [folix-01]
- Use named form fields as user's onceonly data
  [folix-01]
- next_steps non definito == non iterable
  [mamico]

- allegati messaggi sono blob nello storage soup
  [mamico]

- allegati nei messaggi
  [folix-01]

- monkey patch per c.mailfromfield per mandare
  inviare messaggi quando si inviano mail associati a prenotazioni
  [mamico]


1.0.0b4 (2023-06-16)
--------------------

- Add title to message serializer.
  [folix-01]


1.0.0b3 (2023-06-16)
--------------------

- Add pratica_model from model on create
  [mamico]


1.0.0b2 (2023-06-16)
--------------------

- Add possibility to relate message to the object.
  [folix-01]

1.0.0b1 (2023-05-18)
--------------------

- Nothing changed yet.


1.0.0a29 (2023-05-03)
---------------------

- Add list of unique services in @pratiche endpoint.
  [cekk]
- Handle missing pratica in message serializer.
  [cekk]

1.0.0a28 (2023-04-28)
---------------------

- Add profile (*demo_contents*) that loads a set of example contents.
  [cekk]
- Create message on pratica creation instead of mail sending.
  [roman.kysil]
- Disallow multiple pratica creation for the same Model.
  [cekk]
- Optionally send model schema in Pratica serializer.
  [cekk]
- Improve pratica_id checks on Message and soup getter.
  [cekk]
- Create user store to store onceonly fields.
  [cekk]

1.0.0a27 (2023-03-21)
---------------------

- Add domain to translation messages.
  [roman.kysil]


1.0.0a26 (2023-03-21)
---------------------

- Raise Unauthorized if anonymous can serializer ModelloPratica even if it's published.
  [cekk]
- Remove group serializer customization, and add a new endpoint (@operatori_pratica) to get list of group members.
  [cekk]


1.0.0a25 (2023-03-20)
---------------------

- Remove pdb.
  [roman.kysil]


1.0.0a24 (2023-03-20)
---------------------

- Fix translations.
  [roman.kysil]


1.0.0a23 (2023-03-20)
---------------------

- Update locales.
  [roman.kysil]


1.0.0a22 (2023-03-20)
---------------------

- Update locales.
  [roman.kysil]


1.0.0a21 (2023-03-20)
---------------------

- Fixed transtations.
  [roman.kysil]


1.0.0a20 (2023-03-20)
---------------------

- Update locales
  [roman.kysil]

1.0.0a110 (2023-03-20)
----------------------

- Fix pratica transition notify.
  [roman.kysil]


1.0.0a19 (2023-03-17)
---------------------

- Fix csrf for endpoints.
  [cekk]

1.0.0a18 (2023-03-17)
---------------------

- Add pratica.has_report field to serializer
  [roman.kysil]
- Add translations.
  [cekk]
- Fix update Pratica logic.
  [cekk]


1.0.0a17 (2023-03-17)
---------------------

- Do not delete pratica if it's not in draft state.
  [cekk]


1.0.0a16 (2023-03-17)
---------------------

- Handle nonexitent pdf record on pratica.
  [roman.kysil]


1.0.0a15 (2023-03-16)
---------------------

- Add pdf extension to pratica report files.
  [roman.kysil]


1.0.0a14 (2023-03-16)
---------------------

- Remove unused serializer for next_steps.
  [cekk]
- Add available_states to pratica serializer.
  [cekk]
- Change pratica report generation technique (moved to frontend)
  [roman.kysil]

1.0.0a13 (2023-03-15)
---------------------

- Fix wrong release.
  [cekk]

1.0.0a12 (2023-03-14)
---------------------

- Fix sort users in groups endpoint.
  [cekk]

1.0.0a11 (2023-03-10)
---------------------

- Create Operatori pratiche group on install.
  [cekk]
- Customize @groups endpoint to show also fullnames.
  [cekk]
- Add new field for pratica: assigned_to.
  [cekk]


1.0.0a10 (2023-03-01)
---------------------

- Fix pratica_report view and expose the download url in restapi endpoints.
  [cekk]

1.0.0a9 (2023-03-01)
--------------------

- Fix email send process and template.
  [cekk]

1.0.0a8 (2023-03-01)
--------------------

- Change field from Int to TextString.
  [cekk]


1.0.0a5 (2023-02-27)
--------------------

- Nothing changed yet.


1.0.0a4 (2023-02-20)
--------------------

- Nothing changed yet.


1.0.0a3 (2023-01-24)
--------------------

- Nothing changed yet.


1.0.0a2 (2023-01-24)
--------------------

- Nothing changed yet.


1.0.0a1 (2023-01-24)
--------------------

- Initial release.
  []

            

Raw data

            {
    "_id": null,
    "home_page": "https://gitlab.com/redturtle/io-comune/design.plone.iocittadino",
    "name": "design.plone.iocittadino",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": "",
    "keywords": "Python Plone CMS",
    "author": "RedTurtle",
    "author_email": "sviluppo@redturtle.it",
    "download_url": "https://files.pythonhosted.org/packages/af/30/a9f059b238825003d94b64633afd36ae9957d6bb47226df7f67fc566f2bb/design.plone.iocittadino-1.0.0b9.tar.gz",
    "platform": null,
    "description": ".. This README is meant for consumption by humans and pypi. Pypi can render rst files so please do not use Sphinx features.\n   If you want to learn more about writing documentation, please check out: http://docs.plone.org/about/documentation_styleguide.html\n   This text does not appear on pypi or github. It is a comment.\n\n.. image:: https://gitlab.com/redturtle/io-comune/design.plone.iocittadino/badges/master/coverage.svg\n\n.. image:: https://gitlab.com/redturtle/io-comune/design.plone.iocittadino/badges/master/pipeline.svg\n\n.. image:: https://gitlab.com/redturtle/io-comune/design.plone.iocittadino/-/badges/release.svg\n\n\n============\nIo-Cittadino\n============\n\nIo-Cittadino \u00e8 un add-on per l'ecosistema Io-Comune per gestire i servizi online di un ente.\n\nFunzionamento\n=============\n\nE' presente un nuovo content-type \"Modello Pratica\" che serve a definire appunto il modello di una pratica per un determinato servizio online offerto.\n\nE' integrato nel frontend con un form builder per permettere alla redazione di creare i campi che servono.\n\nNomenclatura\n------------\n\nModello Pratica = Content-Type che contiene il modello del form da compilare per l'utente.\nForm = Elenco dei campi necessari per richiedere un determinato servizio online, definito nell'oggetto Modello Pratica. E' quello che i cittadini andranno a compilare per le richieste.\nPratica = Form compilato e salvato da parte dell'utente. Ogni Pratica ha un proprio codice identificativo che permetter\u00e0 all'utente di consultarla e modificarla.\n\nSalvataggio dati\n================\n\nLo storage dei dati \u00e8 basato su plone.souper, ma pu\u00f2 essere facilmente sostituito con altri storage (ad esempio postgresql) semplicemente\nregistrando un adapter specifico.\n\nOgni volta che un utente compila il form, viene salvata una nuova entry in nello storage con i dati del form e una serie di dati accessori.\n\n\nRestapi endpoints Pratica\n=========================\n\nCreazione nuova Pratica\n-----------------------\n\nEndpoint da chiamare sulla radice che accetta solamente chiamate in `POST`.\n\nSolo gli utenti autenticati possono chiamare questo endpoint.\n\nCampi obbligatori:\n\n- **form**: Summary del modello pratica\n- **data**: I dati compilati dall'utente.\n\nCampi opzionali:\n\n- **assigned_to**: Utente a cui \u00e8 assegnata la Pratica.\n- **state**: Stato di revisione della Pratica.\n\nGli unici stati possibili sono `draft` e `ongoing`. Vedi paragrafo dedicato agli stati, per maggiori informazioni.\n\nSe lo stato \u00e8 `draft`, i dati possono anche essere vuoti.\n\nOgni altro campo passato all'endpoint verr\u00e0 scartato e non salvato nella Pratica.\n\nEsempio::\n\n    > curl -i -X POST http://nohost/plone/@pratica -H \"Accept: application/json\" -H \"Content-Type: application/json\" --data-raw '{\"form_id\": \"xxx\", \"data\": {...}}' --user admin:secret\n\n\nEsempio di risposta (codice di risposta: `200``)::\n\n    {\"item_id\": 123456}\n\n\nModifica Pratica\n----------------\n\nEndpoint da chiamare sulla radice del sito che accetta solamente chiamate in `PATCH`.\n\nE' necessario passare anche il **item_id** di riferimento di una pratica.\n\nSolo gli utenti autenticati possono chiamare questo endpoint.\n\nSolamente gli utenti con un determinato permesso (*design.plone.iocittadino: Manage Pratica*) possono modificare le Pratiche create da altri utenti.\n\nCampi:\n\n- **data**: I dati compilati dall'utente (obbligatorio solamente per la pratica in stato draft o quando si fa il salvataggio finale).\n- **assigned_to**: Utente a cui \u00e8 assegnata la Pratica (non obbligatorio).\n- **state**: Stato di revisione della Pratica (non obbligatorio).\n\nGli unici stati possibili sono `draft` e `ongoing`. Vedi paragrafo dedicato agli stati, per maggiori informazioni.\n\nNon \u00e8 possibile modificare una pratica dopo che va in stato `ongoing`.\n\nEsempio::\n\n    > curl -i -X PATCH http://nohost/plone/@pratica/123456 -H \"Accept: application/json\" -H \"Content-Type: application/json\" --data-raw '{\"data\": {...}}' --user admin:secret\n\nSe la modifica ha esito positivo, il codice di risposta \u00e8 `204` (OK senza dati).\n\nCancellazione Pratica\n---------------------\n\nEndpoint da chiamare sulla radice del sito che accetta chiamate in `DELETE`.\n\nE' necessario passare anche il **item_id** di riferimento.\n\nSolo gli utenti autenticati possono chiamare questo endpoint.\n\nSolamente gli utenti con un determinato permesso (*design.plone.iocittadino: Manage Pratica*) possono cancellare le Pratiche create da altri utenti.\n\nEsempio::\n\n    > curl -i -X DELETE http://nohost/plone/@pratica/123456 -H \"Accept: application/json\" -H \"Content-Type: application/json\" --user admin:secret\n\nSe la cancellazione ha esito positivo, il codice di risposta \u00e8 `204` (OK senza dati).\n\nDettaglio Pratica\n-----------------\n\nEndpoint da chiamare sulla radice del sito che accetta chiamate in `GET`.\n\nSe si passa un **item_id** di riferimento, ritorna i dati della pratica di riferimento.\nSe non gli si passa nessun valore, allora vengono ritornati una serie di dati di default dell'utente per pre-popolare i campi del form.\n\nSolo gli utenti autenticati possono chiamare questo endpoint.\n\nSolamente gli utenti con un determinato permesso (*design.plone.iocittadino: Manage Pratica*) possono consultare le Pratiche create da altri utenti.\n\nEsempio::\n\n    > curl -i -X GET http://nohost/plone/@pratica/123456 -H \"Accept: application/json\" -H \"Content-Type: application/json\" --user admin:secret\n\n\nEsempio di risposta senza parametri (codice di risposta: `200``)::\n\n    {\n        'data': {\"email\": \"\", \"fullname\": \"\", \"id\": \"admin\"},\n    }\n\n\nEsempio di risposta con parametri (codice di risposta: `200``)::\n\n    {\n        'creation_date': '2022-12-15T14:23:35',\n        'data': { survey js form data in JSON fromat },\n        'form': { ModelloPratica serialized to JSON summary},\n        'item_id': 817407564,\n        'state': 'foo',\n        'userid': 'admin',\n        'email': 'email'\n        'next_steps': [{\"days_number\": \"3\", \"title\": \"Presa in gestione\"}],\n        'assigned_to': 'pratica_manager'\n        'has_report': true\n        'servizi_collegati': ['<service uid>', '<service uid>'],\n        'ufficio': { '<Uffico serialized to JSON summary>' },\n        'messages': ['<Serialized to JSON Summary message>',]\n\n    }\n\n\nDi default nel campo `form` non viene ritornato lo schema, ma se serve, basta appendere alla request \"show_schema=1\"::\n\n    > curl -i -X GET http://nohost/plone/@pratica/123456?show_schema=1 -H \"Accept: application/json\" -H \"Content-Type: application/json\" --user admin:secret\n\nElenco di Pratiche\n------------------\n\nEndpoint da chiamare sulla radice del sito che accetta chiamate in `GET`.\n\nRitorna una lista di pratiche filtrate in base ai parametri di ricerca passati.\n\nSolo gli utenti autenticati possono chiamare questo endpoint.\n\nSolamente gli utenti con un determinato permesso (*design.plone.iocittadino: Manage Pratica*) possono accedere alle Pratiche create da altri utenti.\n\nEsempio p avere tutte le Pratiche (quindi senza nessun filtro)::\n\n    > curl -i -X GET http://nohost/plone/@pratiche -H \"Accept: application/json\" -H \"Content-Type: application/json\" --user admin:secret\n\nEsempio per avere solo le Pratiche di un singolo utente (quindi con un filtro impostato)::\n\n    > curl -i -X GET http://nohost/plone/@pratiche?userid=foo -H \"Accept: application/json\" -H \"Content-Type: application/json\" --user admin:secret\n\nEsempio di risposta (codice di risposta: `200``)::\n\n    {\n        \"@id\": \"http://nohost/plone/@pratiche\",\n        \"items\": [\n            {\n                'creation_date': '2022-12-15T14:23:35',\n                'data': { survey js form data in JSON fromat },\n                'form': { ModelloPratica serialized to JSON summary},\n                'item_id': 817407564,\n                'state': 'foo',\n                'userid': 'admin',\n                'email': 'email'\n                'next_steps': [{\"days_number\": \"3\", \"title\": \"Presa in gestione\"}],\n                'assigned_to': 'pratica_manager'\n                'has_report': true\n                'servizi_collegati': ['<service uid>', '<service uid>'],\n                'ufficio': { Uffico serialized to JSON summary }\n                'messages': ['<Serialized to JSON Summary message>',]\n\n            },\n            {\n                'creation_date': '2022-12-15T14:23:35',\n                'data': { survey js form data in JSON fromat },\n                'form': { ModelloPratica serialized to JSON summary},\n                'item_id': 817407564,\n                'state': 'foo',\n                'userid': 'admin',\n                'email': 'email'\n                'next_steps': [{\"days_number\": \"3\", \"title\": \"Presa in gestione\"}],\n                'assigned_to': 'pratica_manager'\n                'has_report': true\n                'servizi_collegati': ['<service uid>', '<service uid>'],\n                'ufficio': { Uffico serialized to JSON summary },\n                'messages': ['<Serialized to JSON Summary message>',]\n\n            }\n        ],\n        \"items_total\": 2,\n        \"services\": [\n            ...\n        ]\n    }\n\n\nCambio stato pratica\n--------------------\n\nEndpoint da chiamare sulla radice del sito che accetta chiamate in `POST`.\n\nE' necessario passare anche il **item_id** di riferimento nell'url.\n\nSolo gli utenti autenticati possono chiamare questo endpoint.\n\nSolamente gli utenti con un determinato permesso (*design.plone.iocittadino: Manage Pratica*) possono consultare le Pratiche create da altri utenti.\n\nEsempio::\n\n    > curl -i -X POST http://nohost/plone/@pratica-workflow/123456 -H \"Accept: application/json\" -H \"Content-Type: application/json\" --data-raw '{\"state\": \"foo\"}' --user admin:secret\n\n\nSe il cambio di stato ha esito positivo, il codice di risposta \u00e8 `204` (OK senza dati).\n\n\nStati della pratica\n===================\n\nE' stato creato un workflow semplificato per le Pratiche, per determinare lo stato di avanzamento dei lavori:\n\n- Bozza (*draft*): stato iniziale quando l'utente dal form sceglie di salvare una bozza della Pratica che sta compilando, finch\u00e9 non \u00e8 completata. Dallo stato **Bozza** \u00e8 possibile andare allo stato **In corso**. Non \u00e8 possibile ritornare allo stato bozza in nessun modo.\n- In corso (*ongoing*): stato a cui si arriva dopo la bozza, o come stato iniziale quando l'utente compila il form senza passare per la bozza. Da questo stato, \u00e8 possibile andare allo stato **Sospeso** o **Concluso**.\n- Sospeso (*suspended*): stato in cui si richiede un'azione da parte dell'utente o dalla Pubblica Amministrazione. Da questo stato \u00e8 possibile tornare indietro allo stato **In corso** o andare allo stato **Concluso**.\n- Concluso (*completed*): stato finale della Pratica che ha completato l'iter di gestione. Una Pratica conclusa non pu\u00f2 pi\u00f9 cambiare stato.\n- Annullato (*canceled*): stato finale della Pratica che \u00e8 stata annullata. Una Pratica annullata non pu\u00f2 pi\u00f9 cambiare stato.\n\nRestapi endpoints Messaggio\n===========================\n\nCreazione nuovo Messaggio\n-------------------------\n\nEndpoint da chiamare sulla radice che accetta solamente chiamate in `POST`.\n\nSolo gli utenti autenticati possono chiamare questo endpoint.\n\nCampi obbligatori:\n\n- **pratica_id**: id della pratica legata.\n- **message**: Il messaggio compilato dall'utente.\n\nCampi opzionali:\n\n- **state**: Stato di revisione del Messaggio.\n- **notify_on_email**: Notifica l'utente che il messaggio \u00e8 stato creato. Default: `true`\n\nL'unico stato possibile `pending`. Vedi paragrafo dedicato agli stati, per maggiori informazioni.\n\nOgni altro campo passato all'endpoint verr\u00e0 scartato e non salvato nel messaggio.\n\nEsempio::\n\n    > curl -i -X POST http://nohost/plone/@message -H \"Accept: application/json\" -H \"Content-Type: application/json\" --data-raw '{\"pratica_id\": \"xxx\", \"message\": \"message\"}' --user admin:secret\n\n\nEsempio di risposta (codice di risposta: `200``)::\n\n    {\"item_id\": 123456}\n\nEsempio del messaggio con dei file allegati::\n    > curl -i -X POST http://nohost/plone/@message -H \"Accept: application/json\" -H \"Content-Type: application/json\" --user admin:secret --data-raw\n      '{\n        \"pratica_id\": \"xxx\",\n        \"message\": \"message\",\n        \"attachments\": [{\"filename\": \"Attacment.txt\", \"filestream\": \"b64 encoded file string\"}]\n        }'\n\n\nModifica Messaggio\n------------------\n\nNon implementato\n\nCancellazione Messaggio\n-----------------------\n\nEndpoint da chiamare sulla radice del sito che accetta chiamate in `DELETE`.\n\nE' necessario passare anche il **item_id** di riferimento.\n\nSolo gli utenti autenticati possono chiamare questo endpoint.\n\nSolamente gli utenti con un determinato permesso (*design.plone.iocittadino: Manage Message*) possono cancellare i messaggi creati da altri utenti.\n\nEsempio::\n\n    > curl -i -X DELETE http://nohost/plone/@message/123456 -H \"Accept: application/json\" -H \"Content-Type: application/json\" --user admin:secret\n\nSe la cancellazione ha esito positivo, il codice di risposta \u00e8 `204` (OK senza dati).\n\nDettaglio Messaggio\n-------------------\n\nEndpoint da chiamare sulla radice del sito che accetta chiamate in `GET`.\n\nE' necessario passare anche il **item_id** di riferimento.\n\nSolo gli utenti autenticati possono chiamare questo endpoint.\n\nSolamente gli utenti con un determinato permesso (*design.plone.iocittadino: Manage Message*) possono consultare i messaggi creati da altri utenti.\n\nEsempio::\n\n    > curl -i -X GET http://nohost/plone/@message/123456 -H \"Accept: application/json\" -H \"Content-Type: application/json\" --user admin:secret\n\n\nEsempio di risposta (codice di risposta: `200``)::\n\n    {\n        'date': '2022-12-15T14:23:35',\n        'message': 'a message',\n        'pratica': { Related pratica serialized to JSON summary },\n        'item_id': 817407564,\n        'state': 'foo',\n        'userid': 'admin',\n        'attachments':\n            [\n                {\n                    'filename': \"attachment.txt\",\n                    'download_url': \"http://nohost/plone/@message/123456/@@download/3d5e2b0e896a4607a2129c882eee73f0\"\n                },\n                ...\n            ]\n    }\n\nElenco dei Messaggi\n-------------------\n\nEndpoint da chiamare sulla radice del sito che accetta chiamate in `GET`.\n\nRitorna una lista di pratiche filtrate in base ai parametri di ricerca passati.\n\nSolo gli utenti autenticati possono chiamare questo endpoint.\n\nSolamente gli utenti con un determinato permesso (*design.plone.iocittadino: Manage Message*) possono accedere ai messaggi create da altri utenti.\n\nEsempio p avere tutti i Messaggi (quindi senza nessun filtro)::\n\n    > curl -i -X GET http://nohost/plone/@messages -H \"Accept: application/json\" -H \"Content-Type: application/json\" --user admin:secret\n\nEsempio per avere solo i messaggi di un singolo utente (quindi con un filtro impostato)::\n\n    > curl -i -X GET http://nohost/plone/@messages?userid=foo -H \"Accept: application/json\" -H \"Content-Type: application/json\" --user admin:secret\n\nEsempio di risposta (codice di risposta: `200``)::\n\n    {\n        \"@id\": \"http://nohost/plone/@messages\",\n        \"items\": [\n            {\n                'date': '2022-12-15T14:23:35',\n                'message': 'a message',\n                'item_id': 817407564,\n                'pratica': { Related pratica serialized to JSON summary },\n                'state': 'foo',\n                'userid': 'foo',\n                'attachments':\n                    [\n                        {\n                            'name': \"attachment.txt\",\n                            'url': \"http://nohost/plone/@message/123455/@@download/1/attachment.txt\"\n                        },\n                        ...\n                    ]\n            },\n            {\n                'date': '2022-12-15T14:24:35',\n                'message': 'a mssage',\n                'item_id': 817407564,\n                'pratica': { Related pratica serialized to JSON summary },\n                'state': 'foo',\n                'userid': 'foo',\n                'attachments':\n                [\n                    {\n                        'name': \"attachment.txt\",\n                        'url': \"http://nohost/plone/@message/123456/@@download/1/attachment.txt\"\n                    },\n                    ...\n                ]\n            }\n        ],\n        \"items_total\": 2,\n    }\n\n\nCambio stato Messaggio\n----------------------\n\nEndpoint da chiamare sulla radice del sito che accetta chiamate in `GET`.\n\nE' necessario passare anche il **item_id** di riferimento.\n\nSolo gli utenti autenticati possono chiamare questo endpoint.\n\nSolamente gli utenti con un determinato permesso (*design.plone.iocittadino: Manage Message*) possono consultare i Messaggi create da altri utenti.\n\nEsempio::\n\n    > curl -i -X POST http://nohost/plone/@message-workflow/123456 -H \"Accept: application/json\" -H \"Content-Type: application/json\" --data-raw '{\"state\": \"foo\"}' --user admin:secret\n\n\nSe il cambio di stato ha esito positivo, il codice di risposta \u00e8 `204` (OK senza dati).\n\n\nStati del Messaggio\n===================\n\nE' stato creato un workflow semplificato per le Pratiche, per determinare lo stato di avanzamento dei lavori:\n\n- Creato (*pending*): stato iniziale quando il messaggio \u00e8 stato creato **Inviato**\n- Inviato (*sent*): stato indica che il messaggio \u00e8 stato inviato **Visualizzato**\n- Visualizzato (*seen*): stato finale dopo che il messaggio \u00e8 stato visualizzato al cliente\n\nOperatori pratiche\n==================\n\nIn fase di installazione, viene creato un nuovo gruppo \"*Operatori pratiche*\" in cui andranno inseriti gli utenti che\nsi occuperanno della gestione delle pratiche.\n\nQuesto gruppo ha un permesso speciale \"*Gestore Pratiche*\" che gli permette di gestire le pratiche appunto.\n\n@operatori_pratica endpoint\n---------------------------\n\nEndpoint per permettere di avere la lista degli utenti inseriti nel gruppo (senza avere i permessi di leggere i membri dei gruppi Plone).\n\nEsempio di chiamata::\n\n    > curl -i -X GET http://localhost:8080/Plone/++api++/@operatori_pratica --user admin:secret\n\nE la risposta \u00e8 qualcosa del genere::\n\n    {\n        \"@id\": \"http://localhost:8080/Plone/@groups/operatori_pratiche\",\n        \"items\": [\n            {\n                \"label\": \"John Doe\",\n                \"value\": \"jdoe\"\n            }\n        ],\n        \"items_total\": 1\n    }\n\nEstensione della pratica\n========================\nTramite un sistema di utility \u00e8 possibile estendere sia i field della pratica che\ni campi tornati nel serializer della pratica.\n\nPer estendere i field della pratica \u00e8 necessario registrare un'utility tipo::\n\n    @interface.implementer(IPraticaStoreFieldsExtender)\n    class FieldExtender(object):\n        @property\n        def fields(self):\n            return {\n                \"new_field_a\": {\"required\": False},\n                \"new_field_b\": {\"required\": False},\n                \"new_field_c\": {\"required\": False},\n            }\n\nPer estendere il serializer \u00e8 necessario registrare un'utility tipo::\n\n    @interface.implementer(IPraticaStoreSerializerExtender)\n    class ExtendsPraticaSerializer(object):\n        def get_fields(self, pratica):\n            return {\n                \"new_field_a\": \"A_value\",\n                \"new_field_b\": \"B_value\",\n                \"new_field_c\": \"C_value\",\n            }\n\nLa stessa identica cosa \u00e8 possibile per i messaggi, registrando utility fatte\nalla stessa identica maniera per le interfacce IMessageStoreFieldsExtender e\nIMessageStoreSerializerExtender; c'\u00e8 inoltre un'interfaccia\nIMessageStoreSerializerSummaryExtender utile per estendere il serializer dell\nsummary.\n\n\nTraduzioni\n==========\n\nQuesto prodotto \u00e8 stato tradotto in:\n\n- Inglese\n- Italiano\n\nReport PDF\n==========\n\nE' possibile reperire il report della pratica in pdf chiamando la vista **@@pratica_report** sulla radice del sito.\n\nParametri::\n\n    - **item_id**: l'id della pratica\n\nSolo gli utenti autenticati possono chiamare questa vista.\n\nSolamente gli utenti con un determinato permesso (*design.plone.iocittadino: Manage Pratica*) possono consultare le pratiche create da altri utenti.\n\n\nInstallazione\n=============\n\nPer installare design.plone.iocittadino basta aggiungere il prodotto nel buildout::\n\n    [buildout]\n\n    ...\n\n    eggs =\n        design.plone.iocittadino\n\n\ne poi eseguire il comando ``bin/buildout``.\n\nIl prodotto va poi installato da pannello di controllo.\n\nIl prodotto richiede installazione del pacchetto `wkhtmltopdff`\n\nAutori\n======\n\nQuesto prodotto \u00e8 stato sviluppato da RedTurtle Technology.\n\n.. image:: http://www.redturtle.net/redturtle_banner.png\n   :alt: RedTurtle Technology Site\n   :target: http://www.redturtle.net/\n\n\nLicenza\n-------\n\nQuesto prodotto \u00e8 sotto la licenza GPLv2.\n\n\nContributors\n============\n\n- RedTurtle, sviluppo@redturtle.it\n\n\nChangelog\n=========\n\n1.0.0b9 (2024-03-12)\n--------------------\n\n- Aggiunto modo per aggiungere campi al messaggio e al suo summary serializer\n  registrando delle utility per interfacce predefinite\n  [lucabel]\n- Aggiunto campi precompilabili (idCard, expirationDate, countyOfBirth, \n  placeOfBirthName, placeOfBirth, placeOfBirthIstatCode)\n  [lucabel]\n\n\n\n1.0.0b8 (2024-03-05)\n--------------------\n- Aggiunto modo per aggiungere campi al messaggio e al suo serializer registrando\n  delle utility per interfacce predefinite\n  [lucabel]\n\n1.0.0b7 (unreleased)\n--------------------\n\n- Fix the PDF Report + new survey field type added to pdf generation: radiogroup\n  [folix-01]\n- Fix: #49945 l'areaopeartore va in errore se il modello pratica \u00e8 stato cancellato\n  (Aggiunto workaround per non mandare in errore, serve per\u00f2 che i dati siano in qualche modo\n  recuperabili anche se il modello \u00e8 stato eliminato)\n  [mamico]\n- Aggiunto modo per aggiungere campi alla pratica e al suo serializer registrando\n  delle utility per interfacce predefinite\n  [lucabel]\n\n1.0.0b6 (2023-10-25)\n--------------------\n\n- Allow users to retrieve their own messages also if ModelloPratica is private.\n  [cekk]\n\n\n1.0.0b5 (2023-08-31)\n--------------------\n- Manage blobs as a storage field\n  [folix-01]\n- Use named form fields as user's onceonly data\n  [folix-01]\n- next_steps non definito == non iterable\n  [mamico]\n\n- allegati messaggi sono blob nello storage soup\n  [mamico]\n\n- allegati nei messaggi\n  [folix-01]\n\n- monkey patch per c.mailfromfield per mandare\n  inviare messaggi quando si inviano mail associati a prenotazioni\n  [mamico]\n\n\n1.0.0b4 (2023-06-16)\n--------------------\n\n- Add title to message serializer.\n  [folix-01]\n\n\n1.0.0b3 (2023-06-16)\n--------------------\n\n- Add pratica_model from model on create\n  [mamico]\n\n\n1.0.0b2 (2023-06-16)\n--------------------\n\n- Add possibility to relate message to the object.\n  [folix-01]\n\n1.0.0b1 (2023-05-18)\n--------------------\n\n- Nothing changed yet.\n\n\n1.0.0a29 (2023-05-03)\n---------------------\n\n- Add list of unique services in @pratiche endpoint.\n  [cekk]\n- Handle missing pratica in message serializer.\n  [cekk]\n\n1.0.0a28 (2023-04-28)\n---------------------\n\n- Add profile (*demo_contents*) that loads a set of example contents.\n  [cekk]\n- Create message on pratica creation instead of mail sending.\n  [roman.kysil]\n- Disallow multiple pratica creation for the same Model.\n  [cekk]\n- Optionally send model schema in Pratica serializer.\n  [cekk]\n- Improve pratica_id checks on Message and soup getter.\n  [cekk]\n- Create user store to store onceonly fields.\n  [cekk]\n\n1.0.0a27 (2023-03-21)\n---------------------\n\n- Add domain to translation messages.\n  [roman.kysil]\n\n\n1.0.0a26 (2023-03-21)\n---------------------\n\n- Raise Unauthorized if anonymous can serializer ModelloPratica even if it's published.\n  [cekk]\n- Remove group serializer customization, and add a new endpoint (@operatori_pratica) to get list of group members.\n  [cekk]\n\n\n1.0.0a25 (2023-03-20)\n---------------------\n\n- Remove pdb.\n  [roman.kysil]\n\n\n1.0.0a24 (2023-03-20)\n---------------------\n\n- Fix translations.\n  [roman.kysil]\n\n\n1.0.0a23 (2023-03-20)\n---------------------\n\n- Update locales.\n  [roman.kysil]\n\n\n1.0.0a22 (2023-03-20)\n---------------------\n\n- Update locales.\n  [roman.kysil]\n\n\n1.0.0a21 (2023-03-20)\n---------------------\n\n- Fixed transtations.\n  [roman.kysil]\n\n\n1.0.0a20 (2023-03-20)\n---------------------\n\n- Update locales\n  [roman.kysil]\n\n1.0.0a110 (2023-03-20)\n----------------------\n\n- Fix pratica transition notify.\n  [roman.kysil]\n\n\n1.0.0a19 (2023-03-17)\n---------------------\n\n- Fix csrf for endpoints.\n  [cekk]\n\n1.0.0a18 (2023-03-17)\n---------------------\n\n- Add pratica.has_report field to serializer\n  [roman.kysil]\n- Add translations.\n  [cekk]\n- Fix update Pratica logic.\n  [cekk]\n\n\n1.0.0a17 (2023-03-17)\n---------------------\n\n- Do not delete pratica if it's not in draft state.\n  [cekk]\n\n\n1.0.0a16 (2023-03-17)\n---------------------\n\n- Handle nonexitent pdf record on pratica.\n  [roman.kysil]\n\n\n1.0.0a15 (2023-03-16)\n---------------------\n\n- Add pdf extension to pratica report files.\n  [roman.kysil]\n\n\n1.0.0a14 (2023-03-16)\n---------------------\n\n- Remove unused serializer for next_steps.\n  [cekk]\n- Add available_states to pratica serializer.\n  [cekk]\n- Change pratica report generation technique (moved to frontend)\n  [roman.kysil]\n\n1.0.0a13 (2023-03-15)\n---------------------\n\n- Fix wrong release.\n  [cekk]\n\n1.0.0a12 (2023-03-14)\n---------------------\n\n- Fix sort users in groups endpoint.\n  [cekk]\n\n1.0.0a11 (2023-03-10)\n---------------------\n\n- Create Operatori pratiche group on install.\n  [cekk]\n- Customize @groups endpoint to show also fullnames.\n  [cekk]\n- Add new field for pratica: assigned_to.\n  [cekk]\n\n\n1.0.0a10 (2023-03-01)\n---------------------\n\n- Fix pratica_report view and expose the download url in restapi endpoints.\n  [cekk]\n\n1.0.0a9 (2023-03-01)\n--------------------\n\n- Fix email send process and template.\n  [cekk]\n\n1.0.0a8 (2023-03-01)\n--------------------\n\n- Change field from Int to TextString.\n  [cekk]\n\n\n1.0.0a5 (2023-02-27)\n--------------------\n\n- Nothing changed yet.\n\n\n1.0.0a4 (2023-02-20)\n--------------------\n\n- Nothing changed yet.\n\n\n1.0.0a3 (2023-01-24)\n--------------------\n\n- Nothing changed yet.\n\n\n1.0.0a2 (2023-01-24)\n--------------------\n\n- Nothing changed yet.\n\n\n1.0.0a1 (2023-01-24)\n--------------------\n\n- Initial release.\n  []\n",
    "bugtrack_url": null,
    "license": "GPL version 2",
    "summary": "An add-on for Plone",
    "version": "1.0.0b9",
    "project_urls": {
        "Homepage": "https://gitlab.com/redturtle/io-comune/design.plone.iocittadino"
    },
    "split_keywords": [
        "python",
        "plone",
        "cms"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "675f3beadc088ac0774e6ba912d153ea9f08a5de626e3b0d971023bc84472fe5",
                "md5": "4a9faaeb0e7e923eb31ec5643c0bf89a",
                "sha256": "f8fa466cd4f84d06b36d5a724a3bc076b178893ffbf9023eec7ea388a2e3f344"
            },
            "downloads": -1,
            "filename": "design.plone.iocittadino-1.0.0b9-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "4a9faaeb0e7e923eb31ec5643c0bf89a",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 202452,
            "upload_time": "2024-03-12T13:25:49",
            "upload_time_iso_8601": "2024-03-12T13:25:49.371354Z",
            "url": "https://files.pythonhosted.org/packages/67/5f/3beadc088ac0774e6ba912d153ea9f08a5de626e3b0d971023bc84472fe5/design.plone.iocittadino-1.0.0b9-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "af30a9f059b238825003d94b64633afd36ae9957d6bb47226df7f67fc566f2bb",
                "md5": "4b5005cd5326d2185b9de3d6a0e6566c",
                "sha256": "3492d67380af9a2d6b6f6de78e880fcdd54ccb9c09437bc32adc084dd30ed28c"
            },
            "downloads": -1,
            "filename": "design.plone.iocittadino-1.0.0b9.tar.gz",
            "has_sig": false,
            "md5_digest": "4b5005cd5326d2185b9de3d6a0e6566c",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 138832,
            "upload_time": "2024-03-12T13:25:51",
            "upload_time_iso_8601": "2024-03-12T13:25:51.751312Z",
            "url": "https://files.pythonhosted.org/packages/af/30/a9f059b238825003d94b64633afd36ae9957d6bb47226df7f67fc566f2bb/design.plone.iocittadino-1.0.0b9.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-03-12 13:25:51",
    "github": false,
    "gitlab": true,
    "bitbucket": false,
    "codeberg": false,
    "gitlab_user": "redturtle",
    "gitlab_project": "io-comune",
    "lcname": "design.plone.iocittadino"
}
        
Elapsed time: 0.31783s