mirror of
https://github.com/Steffo99/sophon.git
synced 2024-12-22 06:44:21 +00:00
🎓 Review and improve all chapters so far
This commit is contained in:
parent
1ac4fcb7bd
commit
ffb4cab002
6 changed files with 243 additions and 254 deletions
|
@ -1,10 +1,11 @@
|
||||||
.. index::
|
.. index::
|
||||||
single: sinossi
|
pair: tesi; sinossi
|
||||||
single: abstract
|
|
||||||
|
|
||||||
Sinossi
|
Sinossi
|
||||||
*******
|
*******
|
||||||
|
|
||||||
La tesi descrive lo sviluppo di **Sophon**, software che permette a gruppi di ricerca di collaborare in sicurezza da remoto all'interno di ambienti `Jupyter` eseguiti sui server della loro organizzazione.
|
La tesi descrive lo sviluppo di **Sophon**, software che permette a gruppi di ricerca di collaborare in sicurezza da remoto all'interno di ambienti `Jupyter` eseguiti sui server della loro organizzazione.
|
||||||
|
|
||||||
.. image:: screenshot.png
|
.. figure:: screenshot.png
|
||||||
|
|
||||||
|
Cattura schermo dell'interfaccia grafica di Sophon.
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
.. index::
|
.. index::
|
||||||
single: introduzione
|
pair: tesi; introduzione
|
||||||
|
|
||||||
************
|
**********************
|
||||||
Introduzione
|
Introduzione alla tesi
|
||||||
************
|
**********************
|
||||||
|
|
||||||
Nel mondo della ricerca universitaria, è frequente la collaborazione tra più colleghi su uno stesso progetto, condividendo dati e materiale al fine di ottenere risultati più efficientemente.
|
Nel mondo della ricerca universitaria, è frequente la collaborazione tra più colleghi su uno stesso progetto, condividendo dati e materiale al fine di ottenere risultati più efficientemente.
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ Jupyter però ha alcuni problemi: è complesso da installare e mantenere, e non
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: obiettivo della tesi
|
pair: tesi; obiettivo
|
||||||
|
|
||||||
Obiettivo della tesi
|
Obiettivo della tesi
|
||||||
====================
|
====================
|
||||||
|
@ -28,7 +28,7 @@ L'obiettivo di questa tesi è quello di descrivere lo sviluppo dell'applicativo
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: struttura della tesi
|
pair: tesi; struttura
|
||||||
|
|
||||||
Struttura della tesi
|
Struttura della tesi
|
||||||
====================
|
====================
|
||||||
|
@ -40,7 +40,7 @@ Struttura della tesi
|
||||||
La tesi è strutturata nel seguente modo:
|
La tesi è strutturata nel seguente modo:
|
||||||
|
|
||||||
#. nel primo capitolo, :ref:`Sinossi`, viene descritto molto brevemente il progetto realizzato;
|
#. nel primo capitolo, :ref:`Sinossi`, viene descritto molto brevemente il progetto realizzato;
|
||||||
#. nel secondo capitolo, :ref:`Introduzione`, viene introdotto il contesto della tesi, la tesi stessa e i suoi contenuti;
|
#. nel secondo capitolo, :ref:`Introduzione alla tesi`, viene introdotto il contesto della tesi, la tesi stessa e i suoi contenuti;
|
||||||
#. nel terzo capitolo, :ref:`Ricerca collaborativa`, viene presentata in dettaglio la situazione attuale della ricerca collaborativa;
|
#. nel terzo capitolo, :ref:`Ricerca collaborativa`, viene presentata in dettaglio la situazione attuale della ricerca collaborativa;
|
||||||
#. nel quarto capitolo, :ref:`Progettazione`, viene descritta la progettazione avvenuta, entrando nei dettagli dei requisiti, della suddivisione in moduli e delle astrazioni create;
|
#. nel quarto capitolo, :ref:`Progettazione`, viene descritta la progettazione avvenuta, entrando nei dettagli dei requisiti, della suddivisione in moduli e delle astrazioni create;
|
||||||
#. nel quinto capitolo, :ref:`Implementazione`, vengono trattate le specifiche tecniche implementative del progetto;
|
#. nel quinto capitolo, :ref:`Implementazione`, vengono trattate le specifiche tecniche implementative del progetto;
|
||||||
|
|
|
@ -11,8 +11,7 @@ Mentre in passato a tale scopo venivano utilizzati quaderni di carta (detti anch
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: composizione tipografica
|
pair: sistemi; composizione tipografica
|
||||||
single: sistemi di composizione tipografica
|
|
||||||
|
|
||||||
Sistemi di composizione tipografica
|
Sistemi di composizione tipografica
|
||||||
===================================
|
===================================
|
||||||
|
@ -34,7 +33,7 @@ Un esempio di documento LaTeX :cite:`overleaf:learn30mins` è il seguente:
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: editor WYSIWYG
|
pair: editor; WYSIWYG
|
||||||
|
|
||||||
Editor WYSIWYG
|
Editor WYSIWYG
|
||||||
==============
|
==============
|
||||||
|
@ -53,7 +52,7 @@ Alcuni esempi moderni di editor :abbr:`WYSIWYG (What You See Is What You Get)` s
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: editor WYSIWYG; web-based
|
pair: editor; web-based
|
||||||
|
|
||||||
Web-based editor
|
Web-based editor
|
||||||
================
|
================
|
||||||
|
@ -72,8 +71,8 @@ Il più importante di questi editor è `Google Docs <https://docs.google.com/>`_
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: notebook computazionale
|
single: notebook; computazionali
|
||||||
single: celle
|
pair: notebook; celle
|
||||||
|
|
||||||
Notebook computazionali
|
Notebook computazionali
|
||||||
=======================
|
=======================
|
||||||
|
@ -109,16 +108,16 @@ Prende ispirazione dai `web-based editor <Web-based editor>`, permettendo agli u
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: Jupyter; parti di
|
pair: Jupyter; componenti
|
||||||
|
|
||||||
Parti di Jupyter
|
Componenti di Jupyter
|
||||||
----------------
|
---------------------
|
||||||
|
|
||||||
Jupyter è composto da 3 parti: un `kernel <Kernel Jupyter>`, un `server <server Jupyter>` e un `client <client Jupyter>`.
|
Jupyter è composto da 3 componenti: un `kernel <Kernel Jupyter>`, un `server <server Jupyter>` e un `client <client Jupyter>`.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: Jupyter; kernel
|
pair: Jupyter; kernel
|
||||||
single: IPython
|
single: IPython
|
||||||
|
|
||||||
Kernel Jupyter
|
Kernel Jupyter
|
||||||
|
@ -130,7 +129,7 @@ Per ogni linguaggio di programmazione che si desidera utilizzare nel notebook è
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: Jupyter; server
|
pair: Jupyter; server
|
||||||
|
|
||||||
Server Jupyter
|
Server Jupyter
|
||||||
^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^
|
||||||
|
@ -141,9 +140,9 @@ Il server ufficiale di Jupyter è `Jupyter Server <https://github.com/jupyter-se
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: Jupyter; client
|
pair: Jupyter; client
|
||||||
single: Jupyter; Notebook
|
single: Jupyter; Jupyter Notebook
|
||||||
single: Jupyter; Lab
|
single: Jupyter; JupyterLab
|
||||||
|
|
||||||
Client Jupyter
|
Client Jupyter
|
||||||
^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^
|
||||||
|
@ -154,7 +153,7 @@ Esistono due client ufficiali per Jupyter: il client di vecchia generazione `Jup
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: Jupyter; hosting
|
pair: Jupyter; hosting
|
||||||
|
|
||||||
Hosting di Jupyter
|
Hosting di Jupyter
|
||||||
------------------
|
------------------
|
||||||
|
@ -164,9 +163,6 @@ Essendo `server <server Jupyter>` e `client <client Jupyter>` separati, è possi
|
||||||
È possibile selezionare la macchina su cui eseguire il server in tre modi diversi, elencati nelle prossime sezioni, ciascuno con alcuni vantaggi e svantaggi.
|
È possibile selezionare la macchina su cui eseguire il server in tre modi diversi, elencati nelle prossime sezioni, ciascuno con alcuni vantaggi e svantaggi.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
|
||||||
single: Jupyter; hosting locale
|
|
||||||
|
|
||||||
Hosting locale
|
Hosting locale
|
||||||
^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
@ -180,7 +176,6 @@ In base al proprio sistema operativo, però, potrebbe risultare difficile da ins
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: Jupyter; come software-as-a-service
|
|
||||||
single: Google Colaboratory
|
single: Google Colaboratory
|
||||||
single: SageMaker Notebook
|
single: SageMaker Notebook
|
||||||
|
|
||||||
|
@ -197,8 +192,7 @@ In genere, però, Jupyter sulle piattaforme :abbr:`SaaS (Software as a Service)`
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: Jupyter; hosting on-premises
|
single: Jupyter; JupyterHub
|
||||||
single: Jupyter; Hub
|
|
||||||
|
|
||||||
Hosting on-premises
|
Hosting on-premises
|
||||||
^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
.. index::
|
.. index::
|
||||||
single: progettazione
|
pair: Sophon; progettazione
|
||||||
|
|
||||||
*************
|
***********************
|
||||||
Progettazione
|
Progettazione di Sophon
|
||||||
*************
|
***********************
|
||||||
|
|
||||||
Vista la situazione della `ricerca collaborativa <Ricerca collaborativa>`, si è ritenuto potesse essere utile sviluppare un'alternativa al `progetto JupyterHub <Hosting on-premises>`.
|
Vista la situazione della `ricerca collaborativa <Ricerca collaborativa>`, si è ritenuto potesse essere utile sviluppare un'alternativa al `progetto JupyterHub <Hosting on-premises>`.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: requisiti
|
pair: Sophon; requisiti del progetto
|
||||||
|
|
||||||
Requisiti
|
Requisiti del progetto
|
||||||
=========
|
======================
|
||||||
|
|
||||||
Si è stabilito che per essere un'alternativa valida, il progetto dovesse avere i seguenti requisiti:
|
Si è stabilito che per essere un'alternativa valida, il progetto dovesse avere i seguenti requisiti:
|
||||||
|
|
||||||
|
@ -28,8 +28,7 @@ Seguono descrizioni dettagliate dei requisiti elencati.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: requisiti; estendibilità
|
pair: requisiti; estendibilità
|
||||||
single: estendibilità
|
|
||||||
|
|
||||||
Estendibilità
|
Estendibilità
|
||||||
-------------
|
-------------
|
||||||
|
@ -42,8 +41,7 @@ Infine, il software deve esporre un'**interfaccia alla quale altri software este
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: requisiti; sicurezza
|
pair: requisiti; sicurezza
|
||||||
single: sicurezza
|
|
||||||
|
|
||||||
Sicurezza
|
Sicurezza
|
||||||
---------
|
---------
|
||||||
|
@ -58,8 +56,7 @@ Non si reputa nemmeno importante limitare le risorse utilizzate dai `notebook <n
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: requisiti; intuibilità
|
pair: requisiti; intuibilità
|
||||||
single: intuibilità
|
|
||||||
|
|
||||||
Intuibilità
|
Intuibilità
|
||||||
-----------
|
-----------
|
||||||
|
@ -72,8 +69,7 @@ In aggiunta, i **dettagli implementativi devono essere nascosti** all'utente, in
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: requisiti; personalizzabilità
|
pair: requisiti; personalizzabilità
|
||||||
single: personalizzabilità
|
|
||||||
|
|
||||||
Personalizzabilità
|
Personalizzabilità
|
||||||
------------------
|
------------------
|
||||||
|
@ -84,8 +80,7 @@ Inoltre, il software deve inoltre permettere all'amministratore di **personalizz
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: requisiti; possibilità di collaborazione
|
pair: requisiti; possibilità di collaborazione
|
||||||
single: possibilità di collaborazione
|
|
||||||
|
|
||||||
Possibilità di collaborazione
|
Possibilità di collaborazione
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
@ -96,8 +91,7 @@ Devono essere **facilitate le interazioni tra utenti**, al fine di ridurre error
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: requisiti; open source
|
pair: requisiti; open source
|
||||||
single: open source
|
|
||||||
|
|
||||||
Open source
|
Open source
|
||||||
-----------
|
-----------
|
||||||
|
@ -110,8 +104,7 @@ Tutte le **modifiche al codice sorgente devono essere rese disponibili agli uten
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: requisiti; responsività
|
pair: requisiti; responsività
|
||||||
single: responsività
|
|
||||||
|
|
||||||
Responsività
|
Responsività
|
||||||
------------
|
------------
|
||||||
|
@ -122,8 +115,7 @@ Pertanto, gli elementi dell'interfaccia devono essere disposti in modo che non e
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: requisiti; accessibilità
|
pair: requisiti; accessibilità
|
||||||
single: accessibilità
|
|
||||||
|
|
||||||
Accessibilità
|
Accessibilità
|
||||||
-------------
|
-------------
|
||||||
|
@ -136,8 +128,7 @@ Inoltre, i colori scelti per l'interfaccia grafica **devono essere chiari anche
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: separazione in moduli
|
pair: Sophon; separazione in moduli
|
||||||
single: modulo
|
|
||||||
|
|
||||||
Separazione in moduli
|
Separazione in moduli
|
||||||
=====================
|
=====================
|
||||||
|
@ -152,8 +143,8 @@ Per realizzare il requisito dell'`estendibilità <Estendibilità>`, si è scelto
|
||||||
.. index::
|
.. index::
|
||||||
pair: modulo; backend
|
pair: modulo; backend
|
||||||
|
|
||||||
Progetto del Modulo backend
|
Modulo backend
|
||||||
---------------------------
|
--------------
|
||||||
|
|
||||||
Il modulo backend consiste in una web :abbr:`API (application programming interface)` che si interfaccia con il database e i moduli Jupyter, permettendo un accesso controllato alle risorse del software.
|
Il modulo backend consiste in una web :abbr:`API (application programming interface)` che si interfaccia con il database e i moduli Jupyter, permettendo un accesso controllato alle risorse del software.
|
||||||
|
|
||||||
|
@ -214,17 +205,17 @@ Poetry è in grado di risolvere automaticamente alberi complessi di dipendenze,
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: Django
|
single: Django
|
||||||
single: Django; applicazione
|
pair: Django; app
|
||||||
single: Django; view
|
pair: Django; view
|
||||||
single: Django; function-based view
|
pair: Django; function-based view
|
||||||
single: Django; class-based view
|
pair: Django; class-based view
|
||||||
|
|
||||||
Django
|
Django
|
||||||
^^^^^^
|
^^^^^^
|
||||||
|
|
||||||
`Django <https://www.djangoproject.com/>`_ è un framework Python per lo sviluppo di siti web dinamici.
|
`Django <https://www.djangoproject.com/>`_ è un framework Python per lo sviluppo di siti web dinamici.
|
||||||
|
|
||||||
Fornisce una suite di strumenti che assistono nella creazione di siti di medie dimensioni, come un :abbr:`ORM (object-relational model)` per i database, una pagina di amministrazione integrata per la gestione dei contenuti del sito e un sistema di moduli scollegabili detti "applicazioni".
|
Fornisce una suite di strumenti che assistono nella creazione di siti di medie dimensioni, come un :abbr:`ORM (object-relational model)` per i database, una pagina di amministrazione integrata per la gestione dei contenuti del sito e un sistema di moduli scollegabili detti "app".
|
||||||
|
|
||||||
Le pagine restituite vengono definite attraverso funzioni, dette *function-based views*, o attraverso classi, dette *class-based views*, che ricevono in input la richiesta effettuata dall'utente ed restituscono in output la risposta HTTP da inoltrargli.
|
Le pagine restituite vengono definite attraverso funzioni, dette *function-based views*, o attraverso classi, dette *class-based views*, che ricevono in input la richiesta effettuata dall'utente ed restituscono in output la risposta HTTP da inoltrargli.
|
||||||
|
|
||||||
|
@ -233,9 +224,9 @@ Le pagine restituite vengono definite attraverso funzioni, dette *function-based
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: Django REST Framework
|
single: Django REST Framework
|
||||||
single: Django REST Framework; function-based API view
|
pair: Django REST Framework; function-based API view
|
||||||
single: Django REST Framework; class-based API view
|
pair: Django REST Framework; class-based API view
|
||||||
single: Django REST Framework; viewset
|
pair: Django REST Framework; viewset
|
||||||
|
|
||||||
Django REST Framework
|
Django REST Framework
|
||||||
^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -371,8 +362,8 @@ Non essendo immediatamente utilizzabile all'interno delle pagine web, deve esser
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: React
|
single: React
|
||||||
single: React; componente
|
pair: React; componente
|
||||||
single: React; hook
|
pair: React; hook
|
||||||
|
|
||||||
React
|
React
|
||||||
^^^^^
|
^^^^^
|
||||||
|
@ -411,7 +402,7 @@ FontAwesome
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: Bluelib
|
single: Bluelib
|
||||||
single: Bluelib; tema
|
pair: Bluelib; tema
|
||||||
|
|
||||||
Bluelib
|
Bluelib
|
||||||
^^^^^^^
|
^^^^^^^
|
||||||
|
@ -424,16 +415,25 @@ Si basa sul concetto di **pannelli**, sezioni di pagina separate dal resto trami
|
||||||
|
|
||||||
Fa ampio uso delle `CSS Custom Properties <https://developer.mozilla.org/en-US/docs/Web/CSS/--*>`_, permettendo lo sviluppo di vari *temi* con aspetto differente.
|
Fa ampio uso delle `CSS Custom Properties <https://developer.mozilla.org/en-US/docs/Web/CSS/--*>`_, permettendo lo sviluppo di vari *temi* con aspetto differente.
|
||||||
|
|
||||||
.. image:: bluelib_paper.png
|
.. figure:: bluelib_royalblue.png
|
||||||
:scale: 25%
|
|
||||||
.. image:: bluelib_royalblue.png
|
Il tema "Royal Blue" di Bluelib, da cui ha origine il nome.
|
||||||
:scale: 25%
|
|
||||||
.. image:: bluelib_sophon.png
|
.. figure:: bluelib_paper.png
|
||||||
:scale: 25%
|
|
||||||
.. image:: bluelib_hacker.png
|
Il tema "Sheet of Paper" di Bluelib, pensato per la stampa su carta.
|
||||||
:scale: 25%
|
|
||||||
.. image:: bluelib_amber.png
|
.. figure:: bluelib_sophon.png
|
||||||
:scale: 25%
|
|
||||||
|
Il tema "Sophon" di Bluelib, creato appositamente per questo progetto.
|
||||||
|
|
||||||
|
.. figure:: bluelib_hacker.png
|
||||||
|
|
||||||
|
Il tema "Hacker Terminal" di Bluelib, creato per testare la visualizzazione di caratteri monospace.
|
||||||
|
|
||||||
|
.. figure:: bluelib_amber.png
|
||||||
|
|
||||||
|
Il tema "Gestione Amber" di Bluelib, realizzato da Lorenzo Balugani.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
|
@ -483,9 +483,9 @@ In un'installazione predefinita di Sophon, il reverse proxying effettuato è dup
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: Apache HTTP server
|
single: Apache; HTTP server
|
||||||
single: httpd
|
single: httpd
|
||||||
single: apache2
|
single: Apache; apache2
|
||||||
|
|
||||||
Apache HTTP server
|
Apache HTTP server
|
||||||
^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -544,10 +544,8 @@ Docker
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: image
|
pair: Docker; image
|
||||||
single: immagine
|
pair: Docker; immagine
|
||||||
single: Docker; image
|
|
||||||
single: Docker; immagine
|
|
||||||
|
|
||||||
Immagini
|
Immagini
|
||||||
^^^^^^^^
|
^^^^^^^^
|
||||||
|
@ -560,8 +558,7 @@ Possono essere comparate a immagini di macchine virtuali con tanti "punti di rip
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: container
|
pair: Docker; container
|
||||||
single: Docker; container
|
|
||||||
|
|
||||||
Container
|
Container
|
||||||
^^^^^^^^^
|
^^^^^^^^^
|
||||||
|
@ -572,8 +569,7 @@ Sono l'equivalente di un'intera macchina virtuale, che può essere avviata o arr
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: network
|
pair: Docker; network
|
||||||
single: Docker; network
|
|
||||||
|
|
||||||
Network
|
Network
|
||||||
^^^^^^^
|
^^^^^^^
|
||||||
|
@ -586,8 +582,7 @@ Sono una versione più potente dei moduli di rete per macchine virtuali.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: volume
|
pair: Docker; volume
|
||||||
single: Docker; volume
|
|
||||||
|
|
||||||
Volumi
|
Volumi
|
||||||
^^^^^^
|
^^^^^^
|
||||||
|
@ -600,7 +595,7 @@ Sono il parallelo delle immagini disco delle macchine virtuali.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: Docker; Engine
|
pair: Docker; Engine
|
||||||
|
|
||||||
Docker Engine
|
Docker Engine
|
||||||
-------------
|
-------------
|
||||||
|
@ -611,7 +606,7 @@ Astrae la piattaforma su cui viene eseguito, in modo che tutte le immagini possa
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: Docker; Compose
|
pair: Docker; Compose
|
||||||
|
|
||||||
Docker Compose
|
Docker Compose
|
||||||
--------------
|
--------------
|
||||||
|
@ -653,20 +648,60 @@ Le applicazioni Compose sono definite all'interno di un file `YAML <https://it.w
|
||||||
- db
|
- db
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
|
||||||
single: entità
|
|
||||||
|
|
||||||
Entità
|
.. index::
|
||||||
======
|
single: controllo versione
|
||||||
|
single: version control system
|
||||||
|
single: vcs
|
||||||
|
|
||||||
|
Controllo versione
|
||||||
|
==================
|
||||||
|
|
||||||
|
Per assistere nello sviluppo del software si è deciso di utilizzare il sistema di controllo versione `Git` in ogni fase dello sviluppo del progetto.
|
||||||
|
|
||||||
|
Inoltre, per favorire lo sviluppo di una community `open source <Open source>` attorno a Sophon, si è deciso di pubblicare il progetto su `GitHub`, sotto la licenza `AGPL 3.0+`.
|
||||||
|
|
||||||
|
|
||||||
|
.. index::
|
||||||
|
single: Git
|
||||||
|
pair: Git; repository
|
||||||
|
pair: Git; commit
|
||||||
|
|
||||||
|
Git
|
||||||
|
---
|
||||||
|
|
||||||
|
`Git <https://git-scm.com/>`_ è un software di controllo versione, ovvero un software in grado di tenere traccia di modifiche effettuate su file, in modo da mantenerne uno storico, e permettere a più autori di lavorare in parallelo su documenti.
|
||||||
|
|
||||||
|
Inizialmente realizzato da Linus Torvalds per lo sviluppo del kernel Linux, ha preso velocemente piede in tutto il settore dello sviluppo software, diventando di fatto lo standard per lo sviluppo collaborativo di software.
|
||||||
|
|
||||||
|
Le cartelle di file tracciate da Git sono dette *repository*, mentre un blocco atomico di modifiche è detto *commit*.
|
||||||
|
|
||||||
|
|
||||||
|
.. index::
|
||||||
|
pair: Git; GitHub
|
||||||
|
|
||||||
|
GitHub
|
||||||
|
------
|
||||||
|
|
||||||
|
`GitHub <https://github.com/>`_ è un servizio web di Microsoft per l'hosting e la pubblicazione di repository Git.
|
||||||
|
|
||||||
|
Per ciascun repository sono messe a disposizione gratuitamente numerose funzionalità, quali un issue tracker, strumenti di code review e sistemi di automazione per lo sviluppo :cite:`github:features`.
|
||||||
|
|
||||||
|
|
||||||
|
.. index::
|
||||||
|
pair: Sophon; entità
|
||||||
|
|
||||||
|
Entità di Sophon
|
||||||
|
================
|
||||||
|
|
||||||
Al fine di definire più in dettaglio le operazioni che devono poter essere effettuate all'interno di Sophon, sono state definite delle *entità*, i tipi base con cui l'utente può interagire.
|
Al fine di definire più in dettaglio le operazioni che devono poter essere effettuate all'interno di Sophon, sono state definite delle *entità*, i tipi base con cui l'utente può interagire.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: istanza
|
pair: Sophon; istanza
|
||||||
|
|
||||||
Istanza
|
Istanza in Sophon
|
||||||
-------
|
-----------------
|
||||||
|
|
||||||
Un'*istanza* rappresenta un'**installazione di Sophon** effettuata su un server di un'istituzione di ricerca, come ad esempio un'Università.
|
Un'*istanza* rappresenta un'**installazione di Sophon** effettuata su un server di un'istituzione di ricerca, come ad esempio un'Università.
|
||||||
|
|
||||||
|
@ -683,10 +718,10 @@ Ciascuna istanza è accessibile tramite **uno specifico URL**, scelto dall'ammin
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: utente
|
pair: Sophon; utente
|
||||||
|
|
||||||
Utente
|
Utenti in Sophon
|
||||||
------
|
----------------
|
||||||
|
|
||||||
Un *utente* è una entità che interagisce con una specifica istanza Sophon: ad esempio, un utente potrebbe essere una persona fisica, oppure potrebbe essere un software di automazione che si interfaccia con Sophon.
|
Un *utente* è una entità che interagisce con una specifica istanza Sophon: ad esempio, un utente potrebbe essere una persona fisica, oppure potrebbe essere un software di automazione che si interfaccia con Sophon.
|
||||||
|
|
||||||
|
@ -694,11 +729,9 @@ La tabella viene creata automaticamente da Django all'interno di ogni applicazio
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: utente; super
|
pair: Sophon; superutente
|
||||||
single: utente; regolare
|
pair: Sophon; ospite
|
||||||
single: utente; ospite
|
pair: Sophon; livello di accesso
|
||||||
single: superutente
|
|
||||||
single: ospite
|
|
||||||
|
|
||||||
Livelli di accesso
|
Livelli di accesso
|
||||||
^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -716,10 +749,10 @@ Ospite
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: credenziali di accesso
|
pair: Sophon; credenziali di accesso
|
||||||
single: username
|
pair: Sophon; username
|
||||||
single: password
|
pair: Sophon; password
|
||||||
single: Single Sign-On
|
pair: Sophon; Single Sign-On
|
||||||
|
|
||||||
Credenziali di accesso
|
Credenziali di accesso
|
||||||
^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -730,27 +763,22 @@ Di default, le credenziali sono un **nome utente** e una **password**, ma è pos
|
||||||
|
|
||||||
.. warning::
|
.. warning::
|
||||||
|
|
||||||
Non avendo a disposizione sistemi di :abbr:`SSO (Single Sign-On)`, questa funzionalità non è stata testata.
|
Non avendo a disposizione sistemi di :abbr:`SSO (Single Sign-On)`, questa funzionalità non è stata testata, e potrebbe non funzionare.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: gruppo di ricerca
|
pair: Sophon; gruppo
|
||||||
|
|
||||||
Gruppo di ricerca
|
Gruppi di ricerca in Sophon
|
||||||
-----------------
|
---------------------------
|
||||||
|
|
||||||
Un *gruppo di ricerca* rappresenta un insieme di utenti che collaborano su uno o più progetti.
|
Un *gruppo di ricerca* rappresenta un insieme di utenti che collaborano su uno o più progetti.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
|
||||||
single: gruppo di ricerca; aperto
|
|
||||||
single: gruppo di ricerca; modalità manuale
|
|
||||||
single: gruppo di ricerca; membri
|
|
||||||
|
|
||||||
Membri e modalità di accesso
|
Membri e modalità di accesso
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Gli utenti dell':ref:`istanza` possono diventare *membri* dei gruppi di ricerca, con una delle seguenti modalità selezionate nelle impostazioni del gruppo:
|
Gli utenti dell'`istanza <Istanza di Sophon>` possono diventare *membri* dei gruppi di ricerca, con una delle seguenti modalità selezionate nelle impostazioni del gruppo:
|
||||||
|
|
||||||
- se il gruppo è *aperto*, allora qualsiasi utente potrà diventarne membro semplicemente **facendo richiesta** attraverso l'interfaccia web;
|
- se il gruppo è *aperto*, allora qualsiasi utente potrà diventarne membro semplicemente **facendo richiesta** attraverso l'interfaccia web;
|
||||||
- se il gruppo è in *modalità manuale*, allora nessun utente potrà richiedere di unirsi, e i membri saranno **selezionati manualmente** dal creatore del gruppo.
|
- se il gruppo è in *modalità manuale*, allora nessun utente potrà richiedere di unirsi, e i membri saranno **selezionati manualmente** dal creatore del gruppo.
|
||||||
|
@ -758,29 +786,20 @@ Gli utenti dell':ref:`istanza` possono diventare *membri* dei gruppi di ricerca,
|
||||||
In qualsiasi momento, i membri di un gruppo possono **lasciarlo** facendo apposita richiesta attraverso il frontend.
|
In qualsiasi momento, i membri di un gruppo possono **lasciarlo** facendo apposita richiesta attraverso il frontend.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
|
||||||
single: gruppo di ricerca; creazione
|
|
||||||
|
|
||||||
Creazione di nuovi gruppi
|
Creazione di nuovi gruppi
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Qualsiasi :ref:`utente` può **creare** gruppi di ricerca dall'interfaccia web.
|
Qualsiasi `utente <Utenti in Sophon>` può **creare** gruppi di ricerca dall'interfaccia web.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
|
||||||
single: gruppo di ricerca; modifica
|
|
||||||
|
|
||||||
Modifica di gruppi
|
Modifica di gruppi
|
||||||
^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Il creatore di un gruppo di ricerca è l'unico :ref:`utente` che può cambiarne **nome**, **descrizione**, **membri** e **modalità di accesso**.
|
Il creatore di un gruppo di ricerca è l'unico `utente <Utenti in Sophon>` che può cambiarne **nome**, **descrizione**, **membri** e **modalità di accesso**.
|
||||||
|
|
||||||
Lo *slug*, l'identificatore univoco del gruppo, non è modificabile successivamente alla creazione, in quanto verrà utilizzato all'interno degli URL, che devono essere immutabili.
|
Lo *slug*, l'identificatore univoco del gruppo, non è modificabile successivamente alla creazione, in quanto verrà utilizzato all'interno degli URL, che devono essere immutabili.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
|
||||||
single: gruppo di ricerca; eliminazione
|
|
||||||
|
|
||||||
Eliminazione di gruppi
|
Eliminazione di gruppi
|
||||||
^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
@ -792,19 +811,16 @@ Il creatore di un gruppo è l'unico utente in grado di **cancellare** il gruppo
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: progetto di ricerca
|
pair: Sophon; progetto
|
||||||
|
|
||||||
Progetto di ricerca
|
Progetti di ricerca in Sophon
|
||||||
-------------------
|
-----------------------------
|
||||||
|
|
||||||
Un *progetto di ricerca* rappresenta una **collezione di oggetti** relativa a un singolo argomento mantenuta da un :ref:`gruppo di ricerca`.
|
Un *progetto di ricerca* rappresenta una **collezione di oggetti** relativa a un singolo argomento mantenuta da un `gruppo di ricerca <Gruppi di ricerca in Sophon>`.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: progetto di ricerca; visibilità
|
single: Sophon; visibilità del progetto
|
||||||
single: progetto di ricerca; privato
|
|
||||||
single: progetto di ricerca; interno
|
|
||||||
single: progetto di ricerca; pubblico
|
|
||||||
|
|
||||||
Visibilità dei progetti
|
Visibilità dei progetti
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -812,44 +828,35 @@ Visibilità dei progetti
|
||||||
I progetti hanno tre diverse impostazioni di visibilità che regolano chi può visualizzarne i contenuti:
|
I progetti hanno tre diverse impostazioni di visibilità che regolano chi può visualizzarne i contenuti:
|
||||||
|
|
||||||
Progetto privato
|
Progetto privato
|
||||||
Il progetto è visibile solo ai membri del gruppo a cui appartiene il progetto.
|
Il progetto è visibile **solo ai membri del gruppo** a cui appartiene il progetto.
|
||||||
|
|
||||||
Progetto interno
|
Progetto interno
|
||||||
Il progetto è visibile solo agli :term:`utenti` dell'istanza, e non agli :term:`ospiti`.
|
Il progetto è visibile **solo agli utenti** dell'istanza, e non agli ospiti.
|
||||||
|
|
||||||
Progetto pubblico
|
Progetto pubblico
|
||||||
Il progetto è visibile a tutti.
|
Il progetto è visibile **a tutti**.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
|
||||||
single: progetto di ricerca; creazione
|
|
||||||
|
|
||||||
Creazione di nuovi progetti
|
Creazione di nuovi progetti
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Qualsiasi *membro* di un :ref:`gruppo di ricerca` può creare nuovi progetti.
|
Qualsiasi *membro* di un `gruppo di ricerca <Gruppi di ricerca in Sophon>` può creare nuovi progetti.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
|
||||||
single: progetto di ricerca; modifica
|
|
||||||
|
|
||||||
Modifica di progetti
|
Modifica di progetti
|
||||||
^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Qualsiasi *membro* di un :ref:`gruppo di ricerca` può modificare **nome**, **descrizione** dei progetti al suo interno.
|
Qualsiasi *membro* di un `gruppo di ricerca <Gruppi di ricerca in Sophon>` può modificare **nome**, **descrizione** dei progetti al suo interno.
|
||||||
|
|
||||||
Solo il *creatore del gruppo* può modificarne la **visibilità**, o **trasferire il progetto ad un altro gruppo**.
|
Solo il *creatore del gruppo* può modificarne la **visibilità**, o **trasferire il progetto ad un altro gruppo**.
|
||||||
|
|
||||||
Lo *slug*, l'identificatore univoco del progetto, non è modificabile successivamente alla creazione, in quanto è utilizzato all'interno degli URL, che devono essere immutabili.
|
Lo *slug*, l'identificatore univoco del progetto, non è modificabile successivamente alla creazione, in quanto è utilizzato all'interno degli URL, che devono essere immutabili.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
|
||||||
single: progetto di ricerca; eliminazione
|
|
||||||
|
|
||||||
Eliminazione di progetti
|
Eliminazione di progetti
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Qualsiasi *membro* di un :ref:`gruppo di ricerca` può eliminare i progetti al suo interno.
|
Qualsiasi *membro* di un `gruppo di ricerca <Gruppi di ricerca in Sophon>` può eliminare i progetti al suo interno.
|
||||||
|
|
||||||
.. danger::
|
.. danger::
|
||||||
|
|
||||||
|
@ -857,7 +864,7 @@ Qualsiasi *membro* di un :ref:`gruppo di ricerca` può eliminare i progetti al s
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: notebook (entità)
|
pair: Sophon; notebook
|
||||||
|
|
||||||
Notebook
|
Notebook
|
||||||
--------
|
--------
|
||||||
|
@ -865,18 +872,12 @@ Notebook
|
||||||
Un *notebook* rappresenta una **postazione di lavoro** che può essere allegata ad un :ref:`progetto di ricerca`.
|
Un *notebook* rappresenta una **postazione di lavoro** che può essere allegata ad un :ref:`progetto di ricerca`.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
|
||||||
single: notebook (entità); creazione
|
|
||||||
|
|
||||||
Creazione di nuovi notebook
|
Creazione di nuovi notebook
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Qualsiasi **membro** di un :ref:`gruppo di ricerca` può creare nuovi notebook all'interno di uno dei progetti del gruppo a cui appartiene.
|
Qualsiasi **membro** di un `gruppo di ricerca <Gruppi di ricerca in Sophon>` può creare nuovi notebook all'interno di uno dei progetti del gruppo a cui appartiene.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
|
||||||
single: notebook (entità); slug riservati
|
|
||||||
|
|
||||||
Slug riservati
|
Slug riservati
|
||||||
^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
@ -889,13 +890,11 @@ Un notebook non può avere come *slug* uno dei seguenti valori, in quanto riserv
|
||||||
* ``static``
|
* ``static``
|
||||||
* ``src``
|
* ``src``
|
||||||
|
|
||||||
In più, uno slug di un notebook non può iniziare o terminare con un trattino ``-``, in quanto risulterebbe in un URL non valido.
|
In più, uno slug di un notebook non può iniziare o terminare con un trattino ``-``, in quanto risulterebbe in un sottodominio non valido.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: notebook (entità); stato
|
pair: Sophon; stato del notebook
|
||||||
single: notebook (entità); avviato
|
|
||||||
single: notebook (entità); fermo
|
|
||||||
|
|
||||||
Stato del notebook
|
Stato del notebook
|
||||||
^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -911,17 +910,17 @@ Alla creazione, un notebook è *fermo*.
|
||||||
Avviare un notebook
|
Avviare un notebook
|
||||||
"""""""""""""""""""
|
"""""""""""""""""""
|
||||||
|
|
||||||
Un **membro** del :ref:`gruppo di ricerca` a cui appartiene il notebook può richiedere al server l'avvio di quest'ultimo, in modo da poterlo utilizzare successivamente.
|
Un **membro** del `gruppo di ricerca <Gruppi di ricerca in Sophon>` a cui appartiene il notebook può richiedere al server l'avvio di quest'ultimo, in modo da poterlo utilizzare successivamente.
|
||||||
|
|
||||||
|
|
||||||
Fermare un notebook
|
Fermare un notebook
|
||||||
"""""""""""""""""""
|
"""""""""""""""""""
|
||||||
|
|
||||||
Un **membro** del :ref:`gruppo di ricerca` a cui appartiene il notebook può richiedere al server l'arresto di quest'ultimo, salvando i dati e interrompendo la sessione di lavoro attualmente in corso.
|
Un **membro** del `gruppo di ricerca <Gruppi di ricerca in Sophon>` a cui appartiene il notebook può richiedere al server l'arresto di quest'ultimo, salvando i dati e interrompendo la sessione di lavoro attualmente in corso.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: notebook (entità); immagine
|
pair: Sophon; immagine
|
||||||
|
|
||||||
Immagine del notebook
|
Immagine del notebook
|
||||||
^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -933,24 +932,21 @@ Di default, l'immagine deve essere quella del `modulo Jupyter <Modulo Jupyter>`.
|
||||||
Le immagini ammesse devono esporre un server HTTP sulla porta 8080, su cui verrà fatto `reverse proxying <reverse proxy>` dal `modulo proxy <Modulo proxy>`.
|
Le immagini ammesse devono esporre un server HTTP sulla porta 8080, su cui verrà fatto `reverse proxying <reverse proxy>` dal `modulo proxy <Modulo proxy>`.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
|
||||||
single: notebook (entità); collegamento
|
|
||||||
|
|
||||||
Collegamento a un notebook
|
Collegamento a un notebook
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
I **membri** del :ref:`gruppo di ricerca` a cui appartiene il notebook possono connettersi ad un notebook **avviato** attraverso un URL segreto comunicatogli dal `modulo backend <Modulo backend>`.
|
I **membri** del `gruppo di ricerca <Gruppi di ricerca in Sophon>` a cui appartiene il notebook possono connettersi ad un notebook **avviato** attraverso un URL segreto comunicatogli dal `modulo backend <Modulo backend>`.
|
||||||
|
|
||||||
L'URL segreto è ottenuto inserendo come query parameter dell'URL del notebook il token di autenticazione di `Jupyter`.
|
L'URL segreto è ottenuto inserendo come query parameter dell'URL del notebook il token di autenticazione di `Jupyter`.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: notebook (entità); blocco
|
pair: Sophon; notebook bloccato
|
||||||
|
|
||||||
Blocco di un notebook
|
Blocco di un notebook
|
||||||
^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Qualsiasi **membro** del :ref:`gruppo di ricerca` a cui appartiene il notebook può *bloccarlo* per segnalare agli altri utenti che vi hanno accesso di non utilizzare quello specifico notebook.
|
Qualsiasi **membro** del `gruppo di ricerca <Gruppi di ricerca in Sophon>` a cui appartiene il notebook può *bloccarlo* per segnalare agli altri utenti che vi hanno accesso di non utilizzare quello specifico notebook.
|
||||||
|
|
||||||
Bloccare un notebook **rimuove dall'interfaccia web** i bottoni di interazione con esso per tutti gli utenti, tranne quello che ha richiesto il blocco.
|
Bloccare un notebook **rimuove dall'interfaccia web** i bottoni di interazione con esso per tutti gli utenti, tranne quello che ha richiesto il blocco.
|
||||||
|
|
||||||
|
@ -958,33 +954,27 @@ Bloccare un notebook **rimuove dall'interfaccia web** i bottoni di interazione c
|
||||||
|
|
||||||
Il blocco di un notebook **è solo estetico**, e non ha lo scopo di impedire agli utenti di interagire con il notebook, ma serve per indicare ai propri collaboratori che si stanno effettuando modifiche grandi che non permettono collaborazione sul notebook.
|
Il blocco di un notebook **è solo estetico**, e non ha lo scopo di impedire agli utenti di interagire con il notebook, ma serve per indicare ai propri collaboratori che si stanno effettuando modifiche grandi che non permettono collaborazione sul notebook.
|
||||||
|
|
||||||
Un notebook bloccato può essere sbloccato da qualsiasi **membro** del :ref:`gruppo di ricerca`; il membro che ha richiesto il blocco potrà sbloccarlo **immediatamente**, mentre agli altri membri è richiesto di confermare l'azione.
|
Un notebook bloccato può essere sbloccato da qualsiasi **membro** del `gruppo di ricerca <Gruppi di ricerca in Sophon>`; il membro che ha richiesto il blocco potrà sbloccarlo **immediatamente**, mentre agli altri membri è richiesto di confermare l'azione.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
|
||||||
single: notebook (entità); modifica
|
|
||||||
|
|
||||||
Modifica di un notebook
|
Modifica di un notebook
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Qualsiasi *membro* di un :ref:`gruppo di ricerca` può modificare **nome** e **immagine** dei notebook *fermi* al suo interno.
|
Qualsiasi *membro* di un `gruppo di ricerca <Gruppi di ricerca in Sophon>` può modificare **nome** e **immagine** dei notebook *fermi* al suo interno.
|
||||||
|
|
||||||
I notebook *avviati* non possono essere modificati.
|
I notebook *avviati* non possono essere modificati.
|
||||||
|
|
||||||
Lo *slug*, l'identificatore univoco del notebook, non è modificabile successivamente alla creazione, in quanto è utilizzato all'interno degli URL, che devono essere immutabili.
|
Lo *slug*, l'identificatore univoco del notebook, non è modificabile successivamente alla creazione, in quanto è utilizzato all'interno degli URL, che devono essere immutabili.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
|
||||||
single: notebook (entità); eliminazione
|
|
||||||
|
|
||||||
Eliminazione di un notebook
|
Eliminazione di un notebook
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Qualsiasi *membro* di un :ref:`gruppo di ricerca` può eliminare i notebook all'interno dei progetti del gruppo, a condizione che questi siano *fermi* e *non bloccati*.
|
Qualsiasi *membro* di un `gruppo di ricerca <Gruppi di ricerca in Sophon>` può eliminare i notebook all'interno dei progetti del gruppo, a condizione che questi siano *fermi* e *non bloccati*.
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
single: database
|
pair: Sophon; database
|
||||||
single: PostgreSQL
|
single: PostgreSQL
|
||||||
|
|
||||||
Database
|
Database
|
||||||
|
|
|
@ -1,61 +1,32 @@
|
||||||
.. index::
|
.. index::
|
||||||
single: implementazione
|
pair: Sophon; realizzazione
|
||||||
|
|
||||||
***************
|
***********************
|
||||||
Implementazione
|
Realizzazione di Sophon
|
||||||
***************
|
***********************
|
||||||
|
|
||||||
Ultimato il progetto, si è passati alla sua implementazione su calcolatore.
|
Terminato il progetto, si è passati a realizzarne una versione funzionante su calcolatore.
|
||||||
|
|
||||||
.. todo:: Create index
|
.. todo:: Inserire nell'indice tutte le sezioni.
|
||||||
|
|
||||||
.. todo:: Fix references
|
|
||||||
|
|
||||||
.. todo:: Add details
|
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
|
||||||
single: Git; repository
|
|
||||||
|
|
||||||
Repository Git
|
|
||||||
==============
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
|
||||||
single: Git
|
|
||||||
|
|
||||||
Git
|
|
||||||
---
|
|
||||||
|
|
||||||
|
|
||||||
GitHub
|
|
||||||
------
|
|
||||||
|
|
||||||
.. todo:: GitHub
|
|
||||||
|
|
||||||
|
|
||||||
.. index::
|
.. index::
|
||||||
pair: implementazione; backend
|
pair: implementazione; backend
|
||||||
|
|
||||||
Implementazione del modulo backend
|
Realizzazione del modulo backend
|
||||||
==================================
|
================================
|
||||||
.. default-domain:: py
|
.. default-domain:: py
|
||||||
|
|
||||||
.. todo:: Implementazione del modulo backend
|
Il modulo backend è stato realizzato come un package `Python` denominato ``sophon``, e poi `containerizzato <Containerizzazione del modulo backend>`, creando un'immagine `Docker` standalone.
|
||||||
|
|
||||||
|
|
||||||
Ambiente virtuale Python
|
|
||||||
------------------------
|
|
||||||
|
|
||||||
.. todo:: Ambiente virtuale Python
|
|
||||||
|
|
||||||
|
|
||||||
Il project Django
|
Il project Django
|
||||||
-----------------
|
-----------------
|
||||||
.. module:: sophon
|
.. module:: sophon
|
||||||
|
|
||||||
Il project del modulo aggiunge alla struttura base autogenerata da Django alcune funzionalità utili all'intero backend.
|
Il package è stato creato utilizzando l'utility ``startproject`` di Django, la quale crea una cartella di script `Python` con i quali partire per lo sviluppo di una nuovo software web.
|
||||||
|
|
||||||
|
La cartella generata è stata modificata significativamente: ne si è modificata la struttura in modo tale da trasformarla da un insieme di script a un vero e proprio modulo Python eseguibile e distribuibile, e si sono aggiunte nuove funzionalità di utilità generale all'applicazione, quali una `pagina di amministrazione personalizzata <Pagina di amministrazione personalizzata>`, il `caricamento dinamico delle impostazioni <Caricamento dinamico delle impostazioni>` e vari `miglioramenti all'autenticazione <Miglioramenti all'autenticazione>`
|
||||||
|
|
||||||
|
|
||||||
Pagina di amministrazione personalizzata
|
Pagina di amministrazione personalizzata
|
||||||
|
@ -91,11 +62,11 @@ Inoltre, il template predefinito viene sovrascritto da quello all'interno del fi
|
||||||
`.SophonAdminSite` è selezionata come classe predefinita per il sito di amministrazione.
|
`.SophonAdminSite` è selezionata come classe predefinita per il sito di amministrazione.
|
||||||
|
|
||||||
|
|
||||||
Impostazioni dinamiche
|
Caricamento dinamico delle impostazioni
|
||||||
^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
.. module:: sophon.settings
|
.. module:: sophon.settings
|
||||||
|
|
||||||
Il file di impostazioni viene modificato per **permettere la configurazione attraverso variabili di ambiente** invece che attraverso il file ``settings.py``, rendendo il deployment con Docker molto più semplice.
|
Il file di impostazioni viene modificato per **permettere la configurazione attraverso variabili di ambiente** invece che attraverso la modifica del file ``settings.py``, rendendo la `containerizzazione <Containerizzazione del modulo backend>` molto più semplice.
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
|
@ -117,8 +88,8 @@ Inoltre, viene configurato il modulo `logging` per emettere testo colorato di pi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Autenticazione migliorata
|
Miglioramenti all'autenticazione
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
.. module:: sophon.auth1
|
.. module:: sophon.auth1
|
||||||
|
|
||||||
La classe `rest_framework.authentication.TokenAuthentication` viene modificata per ottenere un comportamento conforme agli standard del web.
|
La classe `rest_framework.authentication.TokenAuthentication` viene modificata per ottenere un comportamento conforme agli standard del web.
|
||||||
|
@ -127,7 +98,7 @@ La classe `rest_framework.authentication.TokenAuthentication` viene modificata p
|
||||||
|
|
||||||
.. attribute:: keyword = "Bearer"
|
.. attribute:: keyword = "Bearer"
|
||||||
|
|
||||||
Si configura `rest_framework` per accettare header di autenticazione nella forma ``Bearer <token>``, invece che ``Token <token>``.
|
Si configura `rest_framework` per accettare header di autenticazione nella forma ``Bearer <token>``, invece che il default di `rest_framework` ``Token <token>``.
|
||||||
|
|
||||||
.. module:: sophon.auth2
|
.. module:: sophon.auth2
|
||||||
|
|
||||||
|
@ -142,8 +113,6 @@ La view `rest_framework.authtoken.views.ObtainAuthToken` viene estesa per aggiun
|
||||||
|
|
||||||
L'app Sophon Core
|
L'app Sophon Core
|
||||||
-----------------
|
-----------------
|
||||||
.. default-domain:: py
|
|
||||||
.. default-role:: obj
|
|
||||||
.. module:: sophon.core
|
.. module:: sophon.core
|
||||||
|
|
||||||
L'app `sophon.core` è l'app principale del progetto, e non può essere disattivata, in quanto dipendenza obbligatoria di tutte le altre app.
|
L'app `sophon.core` è l'app principale del progetto, e non può essere disattivata, in quanto dipendenza obbligatoria di tutte le altre app.
|
||||||
|
@ -164,7 +133,7 @@ Modello base astratto
|
||||||
^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
.. module:: sophon.core.models
|
.. module:: sophon.core.models
|
||||||
|
|
||||||
Viene estesa la classe astratta `django.db.models.Model` con funzioni per stabilire il livello di accesso di un utente all'oggetto e per generare automaticamente i `rest_framework.serializers.ModelSerializer` in base al livello di accesso.
|
Viene estesa la classe astratta `django.db.models.Model` con funzioni per stabilire il `livello di accesso` di un `utente <Utenti in Sophon>` all'oggetto e per generare automaticamente i `rest_framework.serializers.ModelSerializer` in base ad esso.
|
||||||
|
|
||||||
.. class:: SophonModel(django.db.models.Model)
|
.. class:: SophonModel(django.db.models.Model)
|
||||||
|
|
||||||
|
@ -204,7 +173,7 @@ Viene estesa la classe astratta `django.db.models.Model` con funzioni per stabil
|
||||||
Modello di autorizzazione astratto
|
Modello di autorizzazione astratto
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Viene definito un nuovo modello astratto, basato su `SophonModel`, che permette di determinare i permessi dell'utente in base alla sua appartenenza al gruppo a cui è collegato l'oggetto implementatore.
|
Viene definito un nuovo modello astratto, basato su `SophonModel`, che permette di determinare i permessi dell'`utente <Utenti in Sophon>` in base alla sua appartenenza al gruppo a cui è collegato l'oggetto implementatore.
|
||||||
|
|
||||||
.. class:: SophonGroupModel(SophonModel)
|
.. class:: SophonGroupModel(SophonModel)
|
||||||
|
|
||||||
|
@ -228,33 +197,33 @@ Viene definito un nuovo modello astratto, basato su `SophonModel`, che permette
|
||||||
|
|
||||||
.. class:: sophon.core.enums.SophonGroupAccess(enum.IntEnum)
|
.. class:: sophon.core.enums.SophonGroupAccess(enum.IntEnum)
|
||||||
|
|
||||||
Enumerazione che stabilisce il livello di autorità che un utente può avere all'interno di un gruppo.
|
Enumerazione che stabilisce il livello di autorità che un `utente <Utenti in Sophon>` può avere all'interno di un `gruppo di ricerca <Gruppi di ricerca in Sophon>`.
|
||||||
|
|
||||||
.. attribute:: NONE = 0
|
.. attribute:: NONE = 0
|
||||||
|
|
||||||
Utente :ref:`ospite`.
|
Ospite.
|
||||||
|
|
||||||
.. attribute:: REGISTERED = 10
|
.. attribute:: REGISTERED = 10
|
||||||
|
|
||||||
:ref:`Utente` registrato.
|
Utente registrato.
|
||||||
|
|
||||||
.. attribute:: MEMBER = 50
|
.. attribute:: MEMBER = 50
|
||||||
|
|
||||||
Membro del :ref:`gruppo di ricerca`.
|
Membro del gruppo al quale appartiene l'oggetto.
|
||||||
|
|
||||||
.. attribute:: OWNER = 100
|
.. attribute:: OWNER = 100
|
||||||
|
|
||||||
Creatore del :ref:`gruppo di ricerca`.
|
Creatore del gruppo al quale appartiene l'oggetto.
|
||||||
|
|
||||||
.. attribute:: SUPERUSER = 200
|
.. attribute:: SUPERUSER = 200
|
||||||
|
|
||||||
:ref:`Superutente` con privilegi universali.
|
Superutente con privilegi universali.
|
||||||
|
|
||||||
|
|
||||||
Modello dei dettagli dell'istanza
|
Modello dei dettagli dell'istanza
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Viene creato il modello che rappresenta i dettagli dell':ref:`istanza` Sophon.
|
Viene creato il modello che rappresenta i dettagli dell'`istanza di Sophon <Istanza di Sophon>`.
|
||||||
|
|
||||||
.. class:: SophonInstanceDetails(SophonModel)
|
.. class:: SophonInstanceDetails(SophonModel)
|
||||||
|
|
||||||
|
@ -265,39 +234,60 @@ Viene creato il modello che rappresenta i dettagli dell':ref:`istanza` Sophon.
|
||||||
L'istanza unica viene creata dalla migrazione ``0004_sophoninstancedetails.py``.
|
L'istanza unica viene creata dalla migrazione ``0004_sophoninstancedetails.py``.
|
||||||
|
|
||||||
.. attribute:: name: CharField
|
.. attribute:: name: CharField
|
||||||
|
|
||||||
|
Il titolo dell'istanza Sophon.
|
||||||
|
|
||||||
.. attribute:: description: TextField
|
.. attribute:: description: TextField
|
||||||
|
|
||||||
|
La descrizione dell'istanza Sophon, da visualizzare in un riquadro "A proposito dell'istanza".
|
||||||
|
|
||||||
.. attribute:: theme: CharField ["sophon", "paper", "royalblue", "hacker", "amber"]
|
.. attribute:: theme: CharField ["sophon", "paper", "royalblue", "hacker", "amber"]
|
||||||
|
|
||||||
|
Il tema `Bluelib` dell'istanza.
|
||||||
|
|
||||||
.. method:: version: str
|
.. method:: version: str
|
||||||
:property:
|
:property:
|
||||||
|
|
||||||
:returns: La versione installata del pacchetto `sophon`.
|
:returns: La versione installata del pacchetto :mod:`sophon`.
|
||||||
|
|
||||||
.. seealso::
|
|
||||||
|
|
||||||
:ref:`Sophon instance details` nella guida per l'amministratore.
|
|
||||||
|
|
||||||
|
|
||||||
Modello del gruppo di ricerca
|
Modello del gruppo di ricerca
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Viene creato il modello che rappresenta un :ref:`gruppo di ricerca`.
|
Viene creato il modello che rappresenta un :ref:`gruppo di ricerca <Gruppi di ricerca>`.
|
||||||
|
|
||||||
.. class:: ResearchGroup(SophonGroupModel)
|
.. class:: ResearchGroup(SophonGroupModel)
|
||||||
|
|
||||||
.. attribute:: slug: SlugField
|
.. attribute:: slug: SlugField
|
||||||
|
|
||||||
|
L'identificatore del gruppo di ricerca.
|
||||||
|
|
||||||
.. attribute:: name: CharField
|
.. attribute:: name: CharField
|
||||||
|
|
||||||
|
Il nome del gruppo di ricerca.
|
||||||
|
|
||||||
.. attribute:: description: TextField
|
.. attribute:: description: TextField
|
||||||
|
|
||||||
|
La descrizione del gruppo di ricerca, da visualizzare in un riquadro "A proposito del gruppo".
|
||||||
|
|
||||||
.. attribute:: members: ManyToManyField → django.contrib.auth.models.User
|
.. attribute:: members: ManyToManyField → django.contrib.auth.models.User
|
||||||
|
|
||||||
|
Elenco dei membri del gruppo. L'utente `.owner` è ignorato, in quanto è considerato sempre parte del gruppo.
|
||||||
|
|
||||||
.. attribute:: owner: ForeignKey → django.contrib.auth.models.User
|
.. attribute:: owner: ForeignKey → django.contrib.auth.models.User
|
||||||
|
|
||||||
|
Il creatore e proprietario del gruppo, con privilegi amministrativi.
|
||||||
|
|
||||||
.. attribute:: access: CharField ["MANUAL", "OPEN"]
|
.. attribute:: access: CharField ["MANUAL", "OPEN"]
|
||||||
|
|
||||||
|
La `modalità di accesso <Membri e modalità di accesso>` del gruppo.
|
||||||
|
|
||||||
|
|
||||||
Estensione ai permessi di Django
|
Estensione ai permessi di Django
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
.. module:: sophon.core.permissions
|
.. module:: sophon.core.permissions
|
||||||
|
|
||||||
I permessi di `rest_framework` vengono estesi con due nuove classi che utilizzano il :ref:`modello di autorizzazione` precedentemente definito.
|
I permessi di `rest_framework` vengono estesi con due nuove classi che utilizzano il `modello di autorizzazione astratto <Modello di autorizzazione astratto>` precedentemente definito.
|
||||||
|
|
||||||
.. class:: Edit(rest_framework.permissions.BasePermission)
|
.. class:: Edit(rest_framework.permissions.BasePermission)
|
||||||
|
|
||||||
|
@ -365,14 +355,20 @@ Vengono definiti tre viewset in grado di utilizzare i metodi aggiunti dalle clas
|
||||||
|
|
||||||
.. deprecated:: 0.1
|
.. deprecated:: 0.1
|
||||||
|
|
||||||
|
Metodo di `rest_framework` rimosso da Sophon.
|
||||||
|
|
||||||
.. method:: perform_update(self, serializer)
|
.. method:: perform_update(self, serializer)
|
||||||
|
|
||||||
.. deprecated:: 0.1
|
.. deprecated:: 0.1
|
||||||
|
|
||||||
|
Metodo di `rest_framework` rimosso da Sophon.
|
||||||
|
|
||||||
.. method:: perform_destroy(self, serializer)
|
.. method:: perform_destroy(self, serializer)
|
||||||
|
|
||||||
.. deprecated:: 0.1
|
.. deprecated:: 0.1
|
||||||
|
|
||||||
|
Metodo di `rest_framework` rimosso da Sophon.
|
||||||
|
|
||||||
.. method:: hook_create(self, serializer) -> dict[str, typing.Any]
|
.. method:: hook_create(self, serializer) -> dict[str, typing.Any]
|
||||||
|
|
||||||
Funzione chiamata durante l'esecuzione dell'azione di creazione oggetto ``create``.
|
Funzione chiamata durante l'esecuzione dell'azione di creazione oggetto ``create``.
|
||||||
|
|
|
@ -85,4 +85,12 @@ docker:volumes,
|
||||||
title = {Use volumes},
|
title = {Use volumes},
|
||||||
howpublished = {https://web.archive.org/web/20211121172749/https://docs.docker.com/storage/volumes/},
|
howpublished = {https://web.archive.org/web/20211121172749/https://docs.docker.com/storage/volumes/},
|
||||||
note = {Accessed: 2021-11-21},
|
note = {Accessed: 2021-11-21},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@misc{
|
||||||
|
github:features,
|
||||||
|
author = {GitHub},
|
||||||
|
title = {Features},
|
||||||
|
howpublished = {https://web.archive.org/web/20211124034005/https://github.com/features},
|
||||||
|
note = {Accessed: 2021-11-24},
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue