1
Fork 0
mirror of https://github.com/pds-nest/nest.git synced 2025-02-16 12:43:58 +00:00

Merge remote-tracking branch 'origin/main'

This commit is contained in:
g.minoccari 2021-05-18 15:17:00 +02:00
commit 79427d6b96
126 changed files with 48737 additions and 719 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
docs/build/doctrees/meta/index.doctree vendored Normal file

Binary file not shown.

View file

@ -1,4 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 697fdcf2a865ef95bc825235d33ec5a4
config: 1567c588e515e4bb5e7b4b124607e7dc
tags: 645f666f9bcd5a90fca523b33c5a78b7

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

View file

@ -1,2 +1,4 @@
``nest_crawler`` - Crawler in Python
====================================
.. automodule:: nest_crawler

View file

@ -0,0 +1,20 @@
Feedback ricevuto dal cliente
=============================
Documenti
---------
- :download:`Descrizione iniziale del prodotto <0-initial.pdf>`
Consegna degli Sprint
---------------------
.. todo::
Aggiungere i documenti degli sprint mancanti!
- :download:`Sprint 0 <0-sprint-requirements.pdf>`
- :download:`Sprint 1`
- :download:`Sprint 2`
- :download:`Sprint 3`

View file

@ -0,0 +1,792 @@
Registro attività
=================
.. todo::
Mettere titoli personali uguali in tutti gli sprint per consistenza.
Sprint 0
--------
Riunioni collettive
^^^^^^^^^^^^^^^^^^^
.. list-table::
:header-rows: 1
* - Data
- Ora
- Durata
- Attività
* - 2021-04-08
- 20:45
- 1h
- Analisi documento di specifiche
* - 2021-04-09
- 14:15
- 35m
- Intervista con il cliente
* - 2021-04-09
- 15:00
- 1h
- Resoconto intervista
* - 2021-04-11
- 15:03
- 2h 39m
- Documentazione e planning poker
* - 2021-04-15
- 18:15
- 52m
- Documentazione
* - 2021-04-17
- 15:05
- 4h
- Documentazione e partita a Scrumble
Attività individuali
^^^^^^^^^^^^^^^^^^^^
Stefano Goldoni - Product Owner
"""""""""""""""""""""""""""""""
.. list-table::
:header-rows: 1
* - Data
- Durata
- Attività
* - 2021-04-08
- 1.0h
- user stories
* - 2021-04-09
- 1.0h
- epic
* - 2021-04-10
- 0.5h
- use cases
* - 2021-04-11
- 0.5h
- use cases
* - 2021-04-14
- 0.5h
- documentazione SRS
* - 2021-04-15
- 0.5h
- documentazione SRS
* - 2021-04-17
- 1.5h
- diagrammi di attività
Flavia Cocca - Scrum Master
"""""""""""""""""""""""""""
.. list-table::
:header-rows: 1
* - Data
- Durata
- Attività
* - 2021-04-08
- 2.5h
- brainstorming Ui
* - 2021-04-10
- 2.0h
- creazione frame in figma con relativo css
* - 2021-04-11
- 1.5h
- mockup UI con relativo css (creazione componenti)
* - 2021-04-12
- 1.5h
- mockup UI con relativo css (creazione componenti)
* - 2021-04-14
- 3.0h
- mockup UI con relativo css (creazione pagine)
* - 2021-04-15
- 2.0h
- mockup UI con relativo css (creazioni pagine)
* - 2021-04-16
- 2.0h
- ultimi ritocchi UI
* - 2021-04-17
- 0.5h
- Stesura documentazione partita scrumble
Chiara Calzolari - UI/UX Designer
"""""""""""""""""""""""""""""""""
.. list-table::
:header-rows: 1
* - Data
- Durata
- Attività
* - 2021-04-09
- 2.5h
- Brainstorming UI
* - 2021-04-10
- 1.5h
- mockup UI con relativo css (dashboard ed elenco repositories)
* - 2021-04-11
- 1.0h
- mockup UI con relativo css (settings)
* - 2021-04-11
- 0.5h
- Prima versione del logo
* - 2021-04-12
- 3.0h
- mockup UI con relativo css (creazione componenti, light/dark mode)
* - 2021-04-13
- 1.0h
- mockup UI con relativo css (alerts)
* - 2021-04-15
- 1.0h
- Versione definitiva del logo
* - 2021-04-16
- 0.5h
- mockup UI con relativo css (Notifications e Share)
* - 2021-04-17
- 1.0h
- Documentazione Mockup
* - 2021-04-17
- 0.5h
- Doppiaggio video di presentazione
Stefano Pigozzi - Frontend Developer & Sysadmin
"""""""""""""""""""""""""""""""""""""""""""""""
.. todo:: Compilare con i dati di Toggl!
Sprint 1
--------
Riunioni collettive
^^^^^^^^^^^^^^^^^^^
.. list-table::
:header-rows: 1
* - Data
- Ora
- Durata
- Attività
* - 2021-05-01
- 15:30
- 2h
- backlog grooming session
Attività individuali
^^^^^^^^^^^^^^^^^^^^
Stefano Goldoni - Product Owner
"""""""""""""""""""""""""""""""
.. list-table::
:header-rows: 1
* - Data
- Durata
- Attività
* - 2021-04-20
- 0.5h
- analisi test
* - 2021-04-20
- 1.5h
- scrittura test cases
* - 2021-04-26
- 0.5h
- predisposizione progetto in locale per il test
* - 2021-04-26
- 2.0h
- metodi di test login e creazione utente
* - 2021-04-28
- 2.0h
- metodi ti test
* - 2021-04-29
- 2.0h
- metodi di test
* - 2021-04-30
- 2.0h
- metodi di test backend
* - 2021-05-01
- 1.0h
- test frontend
* - 2021-05-01
- 1.0h
- test backend in pair programming
* - 2021-05-02
- 1.0h
- documentazione
* - 2021-05-02
- 2.5h
- test backend
Giovanni Anniballi - Tester
"""""""""""""""""""""""""""
Per il lavoro di testing è stata utilizzata anche la tecnica del Pair Programming, grazie ad un plugin dell'IDE utilizzato.
.. list-table::
:header-rows: 1
* - Data
- Durata
- Attività
* - 2021-04-22
- 0.5h
- Riunione con il team
* - 2021-04-23
- 1.0h
- Studio struttura del backend
* - 2021-04-24
- 1.5h
- Studio del backend, volto a capire il funzionamento delle varie API
* - 2021-04-26
- 2.0h
- Testing login e retrieval dei dati inerenti a tutti gli utenti registrati
* - 2021-04-27
- 1.0h
- Testing creazione user
* - 2021-04-28
- 2.0h
- Test cancellazione utente e ritorno dei dati inerenti a quellutente
* - 2021-04-29
- 1.5h
- Test modica utenti e creazione della prima repository
* - 2021-04-30
- 2.0h
- Testing ritorno di tutte le repository di proprietà dellutente loggato, ritorno delle info inerenti alla repository specificata
* - 2021-05-01
- 3.0h
- Riunione con il team per sprint review e sprint retrospective(2h). Testing modifica ed eliminazione di una repository (nome, stato)
* - 2021-05-02
- 2.0h
- Testing del frontend tramite UI, controllo generale dei test già effettuati.
Giorgio Minoccari - Sviluppatore Backend
""""""""""""""""""""""""""""""""""""""""
Durante lo sprint ho principalmente svolto sviluppo e test riguardo alla API di twitter, in modo da poter effettuare chiamate efficenti e non venire limitati dal sito riguardo alle richieste effettuate.
.. list-table::
:header-rows: 1
* - Data
- Durata
- Attività
* - 2021-04-21
- 1.0h
- Primi test riguardo autenticazione Oauth per API twitter
* - 2021-04-23
- 1.5h
- Autenticazione funzionante
* - 2021-04-24
- 0.5h
- Test su ricerche generali con parole chiave
* - 2021-04-26
- 1.0h
- Test su ricerche geolocalizzate
* - 2021-04-27
- 1.0h
- Definizione di entita' di esempio nei database per provare funzioni legate ad esse
* - 2021-04-28
- 2.0h
- Definizione di funzioni per l'aggregazione di condizioni di diverso tipo per la ricerca di tweet tramite API
* - 2021-04-29
- 1.0h
- Refactor codice scritto fino a quel momento, eliminazione di dati inutili
* - 2021-05-01
- 1.0h
- Implementazioni di analisi su termini e hashtag restituiti dall'API
* - 2021-05-02
- 1.0h
- Test di chiamata alle funzioni di ricerca a partire da repository con condizioni complesse aggregate
Lorenzo Balugani - Developer
""""""""""""""""""""""""""""
.. list-table::
:header-rows: 1
* - Data
- Durata
- Attività
* - 2021-04-21
- 2.0h
- Implementazione Base di Dati
* - 2021-04-22
- 2.0h
- Login, creazione utenti
* - 2021-04-25
- 1.0h
- Rimozione utenti, CORS, Creazione repo
* - 2021-04-25
- 3.0h
- Altre funzioni API
* - 2021-04-26
- 0.5h
- Standardizzazione output json
* - 2021-04-26
- 1.0h
- Documentazione
* - 2021-04-27
- 0.5h
- Aggiunto supporto al modulo explorer, fix
* - 2021-04-28
- 0.5h
- Bugfixing
* - 2021-04-29
- 1.0h
- Gestione migliorata errori
* - 2021-04-29
- 1.0h
- Refactoring
* - 2021-05-02
- 1.0h
- Bugfixing
FLavia Cocca - Scrum Master
"""""""""""""""""""""""""""
.. list-table::
:header-rows: 1
* - Data
- Durata
- Attività
* - 2021-04-27
- 1.0h
- modifica mockup UI
* - 2021-04-28
- 1.0h
- Organizzazione Sprint retrospective
* - 2021-04-30
- 1.0h
- modifica mockup UI
* - 2021-05-01
- 2.0h
- Riunione con il team per sprint review e sprint retrospective
* - 2021-05-02
- 3.0h
- Stesura documenti Sprint1(debito tecnico e relazione sprint retrospective), realizzazione video Sprint1 review
Chiara Calzolari - UI Designer
""""""""""""""""""""""""""""""
.. list-table::
:header-rows: 1
* - Data
- Durata
- Attività
* - 2021-04-26
- 3.0h
- Configurazione ambiente di sviluppo
* - 2021-04-27
- 1.0h
- modifica mockup UI (adeguamento al JS)
* - 2021-04-29
- 2.0h
- modifica mockup UI (Manage users)
* - 2021-05-01
- 0.5h
- Ultimi ritocchi al mockup UI
Stefano Pigozzi - Frontend Developer
""""""""""""""""""""""""""""""""""""
.. todo:: Compilare con i dati di Toggl!
Sprint 2
--------
Riunioni collettive
^^^^^^^^^^^^^^^^^^^
.. list-table::
:header-rows: 1
* - Data
- Ora
- Durata
- Attività
* - 2021-05-14
- 10:00
- 1.0h
- Sprint Retrospective session
Attività individuali
^^^^^^^^^^^^^^^^^^^^
Chiara Calzolari - UI Designer
""""""""""""""""""""""""""""""
.. list-table::
:header-rows: 2
* - Data
- Durata
- Attività
* -
- 11.0h
- Totale
* - 2021-05-03
- 1.0h
- Testing frontend e segnalazione issues
* - 2021-05-03
- 1.0h
- Modifica mockup UI (Dashboard repository)
* - 2021-05-04
- 1.0h
- Modifica mockup UI (adeguamento al JS)
* - 2021-05-10
- 3.0h
- Configurazione ambiente di sviluppo
* - 2021-05-11
- 1.5h
- Modifica UI (traduzione in Italiano)
* - 2021-05-12
- 0.5h
- Modifica UI (traduzione in Italiano)
* - 2021-05-14
- 3.0h
- Realizzazione video demo sprint 2
Stefano Goldoni - Product Owner & Tester
""""""""""""""""""""""""""""""""""""""""
.. list-table::
:header-rows: 2
* - Data
- Durata
- Attività
* -
- 16.0h
- Totale
* - 2021-05-04
- 1.0h
- preparazione backlog sprint 2
* - 2021-05-10
- 3.0h
- test sprint 2
* - 2021-05-11
- 2.5h
- test utenti e repository
* - 2021-05-12
- 2.0h
- test repository
* - 2021-05-13
- 2.5h
- test repository
* - 2021-05-14
- 3.0h
- test conditions
* - 2021-05-15
- 2.0h
- test conditions + sonarqube scanner
Lorenzo Balugani - DB & Backend Developer
"""""""""""""""""""""""""""""""""""""""""
.. list-table::
:header-rows: 2
* - Data
- Durata
- Attività
* -
- 19.0h
- Totale
* - 2021-05-05
- 4.0h
- Setup di swagger, documentazione
* - 2021-05-06
- 4.0h
- Documentazione, sviluppo
* - 2021-05-07
- 3.0h
- Alert, documentazione
* - 2021-05-10
- 2.0h
- Alert Put, bugfixing
* - 2021-05-11
- 3.0h
- Bugfixing, sviluppo
* - 2021-05-12
- 3.0h
- Risolti issue pubblicati su Taiga
* - 2021-05-13
- 1.0h
- Bugfixing
* - 2021-05-14
- 1.0h
- Bugfixing
Stefano Pigozzi - Sysadmin & Frontend Developer
"""""""""""""""""""""""""""""""""""""""""""""""
.. list-table::
:header-rows: 2
* - Data
- Durata
- Attività
* -
- 27.5h
- Totale
* - 2021-05-05
- 0.40h
- Riunione
* - 2021-05-05
- 0.21h
- Documentazione
* - 2021-05-06
- 0.09h
- Sviluppo
* - 2021-05-06
- 0.03h
- Configurazione Taiga
* - 2021-05-06
- 0.11h
- Documentazione
* - 2021-05-06
- 0.09h
- Riunione
* - 2021-05-06
- 0.20h
- Documentazione
* - 2021-05-06
- 0.39h
- Sviluppo
* - 2021-05-06
- 0.15h
- Riunione
* - 2021-05-06
- 1.04h
- Riunione
* - 2021-05-07
- 1.47h
- Sviluppo
* - 2021-05-07
- 0.17h
- Sviluppo
* - 2021-05-07
- 0.34h
- Sviluppo
* - 2021-05-07
- 0.34h
- Project management
* - 2021-05-07
- 2.44h
- Sviluppo
* - 2021-05-08
- 0.13h
- Sviluppo
* - 2021-05-08
- 0.29h
- Sviluppo
* - 2021-05-08
- 0.18h
- Sviluppo
* - 2021-05-10
- 1.00h
- Sviluppo
* - 2021-05-10
- 1.15h
- Configurazione GitLab
* - 2021-05-10
- 0.25h
- Sviluppo
* - 2021-05-10
- 0.39h
- Sviluppo
* - 2021-05-11
- 0.25h
- Bugfixing
* - 2021-05-11
- 3.57h
- Sviluppo
* - 2021-05-11
- 1.45h
- Sviluppo
* - 2021-05-12
- 0.10h
- Sviluppo
* - 2021-05-12
- 1.51h
- Sviluppo
* - 2021-05-13
- 1.00h
- Sviluppo
* - 2021-05-13
- 1.20h
- Sviluppo
* - 2021-05-14
- 0.20h
- Sviluppo
* - 2021-05-15
- 3.17h
- Documentazione
Flavia Cocca - Scrum Master & UI Designer
"""""""""""""""""""""""""""""""""""""""""
.. list-table::
:header-rows: 2
* - Data
- Durata
- Attività
* -
- 16.0h
- Totale
* - 2021-05-04
- 0.5h
- Riunione per con PO, nuovo backlog
* - 2021-05-05
- 1.0h
- Riunione
* - 2021-05-07
- 3.0h
- Refactoring test
* - 2021-05-08
- 2.0h
- Refactoring test
* - 2021-05-09
- 3.0h
- Nuovi test
* - 2021-05-11
- 2.5h
- Discussione test e risoluzione di alcune issue
* - 2021-05-13
- 1.0h
- Bugfixing
* - 2021-05-14
- 1.0h
- Sprint Retrospective
* - 2021-05-15
- 2.0h
- Documentazione
Giovanni Anniballi - Tester
"""""""""""""""""""""""""""
.. list-table::
:header-rows: 2
* - Data
- Durata
- Attività
* -
- 17.0h
- Totale
* - 2021-05-04
- 0.5h
- Incontro con SM e PO per valutare quali US andranno nello sprint2
* - 2021-05-05
- 1.0h
- Incontro con il team
* - 2021-05-07
- 2.0h
- Refactoring tests sugli user e primi utilizzi delle fixtures
* - 2021-05-08
- 2.0h
- Completamento test users
* - 2021-05-10
- 1.0h
- Ulteriori approcci (fallimentari) al coverage di SonarQube
* - 2021-05-11
- 2.0h
- Discussione sui test e correzioni bug
* - 2021-05-12
- 1.0h
- Test repository
* - 2021-05-13
- 1.0h
- Generazione coverage pytest e setting sonarqube (riuscito!)
* - 2021-05-14
- 4.0h
- Sprint review e retrospettiva, conclusione test repository
* - 2021-05-15
- 2.5h
- generazione nuovo coverage e fix a sonarqube 2h, fix piccoli bug segnalati da sonarqube 0.5h
Giorgio Minoccari - Analyst & Backend Developer
"""""""""""""""""""""""""""""""""""""""""""""""
.. list-table::
:header-rows: 2
* - Data
- Durata
- Attività
* -
- 10.0h
- Totale
* - 2021-05-04
- 0.5h
- Aggiunta della condizione sull'utente
* - 2021-05-10
- 2.0h
- Tentativo di inserimento delle query con place_id
* - 2021-05-11
- 1.5h
- Test per passare alla versione 2.0 delle API
* - 2021-05-12
- 1.0h
- Ritorno alla versione 1.1 perche' lascia disponibili le query sulla geolocalizzazione gratuitamente
* - 2021-05-14
- 5.0h
- Integrazione e inserimento dei tweet catturati nel database
Sprint 3
--------
.. todo::
Compilare il registro attività dello sprint 3.

View file

@ -0,0 +1,20 @@
Statistiche di Gitinspector
===========================
Queste statistiche sono state generate dal prof. Missiroli con `Gitinspector <https://github.com/ejwa/gitinspector>`_.
.. note::
Le statistiche probabilmente sono molto inaccurate, in quanto Gitinspector sembra tenere conto anche delle directory
contenenti file vendored, come ``docs/build``.
.. todo::
Aggiungere le statistiche degli sprint mancanti!
- :download:`Sprint 0 <0-stats.html>`
- :download:`Sprint 1 <1-stats.html>`
- :download:`Sprint 2 (codice) <2-stats.html>`
- :download:`Sprint 2 (documentazione) <2D-stats.html>`
- :download:`Sprint 3 (codice) <3-stats.html>`
- :download:`Sprint 3 (documentazione) <3D-stats.html>`

View file

@ -0,0 +1,20 @@
Statistiche di Gitinspector
===========================
Queste statistiche sono state generate dal prof. Missiroli con `Gitinspector <https://github.com/ejwa/gitinspector>`_.
.. note::
Le statistiche probabilmente sono molto inaccurate, in quanto Gitinspector sembra tenere conto anche delle directory
contenenti file vendored, come ``docs/build``.
.. todo::
Aggiungere le statistiche degli sprint mancanti!
- :download:`Sprint 0 <0-stats.html>`
- :download:`Sprint 1 <1-stats.html>`
- :download:`Sprint 2 (codice) <2-stats.html>`
- :download:`Sprint 2 (documentazione) <2D-stats.html>`
- :download:`Sprint 3 (codice) <3-stats.html>`
- :download:`Sprint 3 (documentazione) <3D-stats.html>`

View file

@ -0,0 +1,3 @@
Strumenti utilizzati
====================

View file

@ -5,12 +5,29 @@ Benvenuto alla documentazione di N.E.S.T.!
.. toctree::
:maxdepth: 2
:caption: Manuale
:caption: Manuale utente
about/index
installation/index
.. toctree::
:maxdepth: 2
:caption: Guida sviluppatore
meta/index
.. toctree::
:maxdepth: 2
:caption: Compendio del progetto
development/client/index
development/stats/index
development/log
development/tools
.. toctree::
:caption: Documentazione autogenerata

View file

@ -79,7 +79,7 @@ Per creare il database PostgreSQL, si esegua:
Creare un file di configurazione per il backend
-----------------------------------------------
Il backend usa un file di configurazione per impostare certe variabili.
Il backend usa un file di configurazione per impostare alcune variabili.
Si crei un nuovo file nella working directory del progetto denominato ``config.py``:
@ -113,7 +113,7 @@ Le dipendenze Python sono gestite da *Poetry*, e possono essere installate con:
Poetry creerà automaticamente un `venv <https://docs.python.org/3/library/venv.html>`_ e vi installerà all'interno tutti
i pacchetti necessari all'esecuzione del backend e del crawler di N.E.S.T. .
**Segnatevi il nome** del venv creato da Poetry, in quanto sarà necessario per
**Si suggerisce di ricordare il nome del venv creato da Poetry**, in quanto sarà necessario per
:ref:`Creare un servizio SystemD per il backend`:
.. code-block:: console

View file

@ -0,0 +1,84 @@
Meta-documentazione
===================
La documentazione è scritta in `reStructuredText <https://docutils.sourceforge.io/rst.html>`_, ed è generata con
`Sphinx <https://www.sphinx-doc.org/en/master/>`_.
I dati relativi alla documentazione si trovano nella directory standard ``/docs``;
in particolare, le sorgenti reStructuredText si trovano in ``/docs/source``,
mentre l'ultima versione compilata si trova in ``/docs/build``.
Questa struttura permetterebbe l'integrazione con lo strumento di "Continuous Documentation"
`ReadTheDocs <https://readthedocs.com/>`_, qualora il progetto fosse ospitato su GitHub o disponessimo di una licenza
almeno `Basic <https://readthedocs.com/pricing/>`_.
Compilazione con IntelliJ IDEA
------------------------------
È possibile compilare manualmente la documentazione con IntelliJ IDEA.
Su sistemi Linux, è disponibile la Run Configuration ``Docs``, che compilerà la versione HTML della documentazione se
eseguita.
.. image:: docsRunConfig.png
Compilazione con GNU Make
-------------------------
È possibile compilare manualmente la documentazione con GNU Make.
Come prima cosa, è necessario :ref:`Installare le dipendenze Python` del progetto:
.. code-block:: console
user:g2-progetto$ poetry install
Poi, si entri all'interno del virtual environment:
.. code-block:: console
user:g2-progetto$ poetry shell
Una volta all'interno del venv, si entri nella cartella della documentazione:
.. code-block:: console
user:g2-progetto$ cd docs
Infine, si esegua il target ``html`` del Makefile:
.. code-block:: console
user:g2-progetto/docs$ make html
Compilazione con Windows Powershell
-----------------------------------
È possibile compilare manualmente la documentazione con Windows Powershell.
Come prima cosa, è necessario :ref:`Installare le dipendenze Python` del progetto:
.. code-block:: doscon
g2-progetto> poetry install
Poi, si entri all'interno del virtual environment:
.. code-block:: doscon
g2-progetto> poetry shell
Una volta all'interno del venv, si entri nella cartella della documentazione:
.. code-block:: doscon
g2-progetto> cd docs
Infine, si esegua lo script ``make.bat`` con il parametro ``html``:
.. code-block:: doscon
g2-progetto/docs> make html

View file

@ -50,7 +50,7 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<div class="wy-side-nav-search" style="background: #3B7097" >
@ -85,11 +85,15 @@
<p class="caption"><span class="caption-text">Manuale</span></p>
<p class="caption"><span class="caption-text">Manuale utente</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">Il progetto</a></li>
<li class="toctree-l1"><a class="reference internal" href="../installation/index.html">Installazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Guida sviluppatore</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../meta/index.html">Meta-documentazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Documentazione autogenerata</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../backend/index.html"><code class="docutils literal notranslate"><span class="pre">nest_backend</span></code> - Web API in Python</a></li>

View file

@ -40,7 +40,7 @@
<link rel="index" title="Indice" href="../genindex.html" />
<link rel="search" title="Cerca" href="../search.html" />
<link rel="next" title="nest_crawler - Crawler in Python" href="../crawler/index.html" />
<link rel="prev" title="Installazione" href="../installation/index.html" />
<link rel="prev" title="Strumenti utilizzati" href="../development/tools.html" />
</head>
<body class="wy-body-for-nav">
@ -50,7 +50,7 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<div class="wy-side-nav-search" style="background: #3B7097" >
@ -85,11 +85,22 @@
<p class="caption"><span class="caption-text">Manuale</span></p>
<p class="caption"><span class="caption-text">Manuale utente</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../about/index.html">Il progetto</a></li>
<li class="toctree-l1"><a class="reference internal" href="../installation/index.html">Installazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Guida sviluppatore</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../meta/index.html">Meta-documentazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Compendio del progetto</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../development/client/index.html">Feedback ricevuto dal cliente</a></li>
<li class="toctree-l1"><a class="reference internal" href="../development/stats/index.html">Statistiche di Gitinspector</a></li>
<li class="toctree-l1"><a class="reference internal" href="../development/log.html">Registro attività</a></li>
<li class="toctree-l1"><a class="reference internal" href="../development/tools.html">Strumenti utilizzati</a></li>
</ul>
<p class="caption"><span class="caption-text">Documentazione autogenerata</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#"><code class="docutils literal notranslate"><span class="pre">nest_backend</span></code> - Web API in Python</a><ul>
@ -224,8 +235,9 @@ It is required by Flask-JWT, and shouldnt be used alone.
<dl class="py function">
<dt id="nest_backend.gestione.json_error">
<code class="sig-prename descclassname"><span class="pre">nest_backend.gestione.</span></code><code class="sig-name descname"><span class="pre">json_error</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">msg</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#nest_backend.gestione.json_error" title="Link a questa definizione"></a></dt>
<code class="sig-prename descclassname"><span class="pre">nest_backend.gestione.</span></code><code class="sig-name descname"><span class="pre">json_error</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">msg</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">code</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'errorUnknownError'</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#nest_backend.gestione.json_error" title="Link a questa definizione"></a></dt>
<dd><p>Returns an error in json format
:param code: the code of the error according to the spec.
:param msg: the error message.
:return: a json formatted string.</p>
</dd></dl>
@ -284,6 +296,11 @@ It is required by Flask-JWT, and shouldnt be used alone.
<code class="sig-name descname"><span class="pre">window_size</span></code><a class="headerlink" href="#nest_backend.database.tables.Alert.window_size" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="nest_backend.database.tables.Alert.evaluation_mode">
<code class="sig-name descname"><span class="pre">evaluation_mode</span></code><a class="headerlink" href="#nest_backend.database.tables.Alert.evaluation_mode" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="nest_backend.database.tables.Alert.repository_id">
<code class="sig-name descname"><span class="pre">repository_id</span></code><a class="headerlink" href="#nest_backend.database.tables.Alert.repository_id" title="Link a questa definizione"></a></dt>
@ -300,8 +317,8 @@ It is required by Flask-JWT, and shouldnt be used alone.
<dd></dd></dl>
<dl class="py attribute">
<dt id="nest_backend.database.tables.Alert.operations">
<code class="sig-name descname"><span class="pre">operations</span></code><a class="headerlink" href="#nest_backend.database.tables.Alert.operations" title="Link a questa definizione"></a></dt>
<dt id="nest_backend.database.tables.Alert.conditions">
<code class="sig-name descname"><span class="pre">conditions</span></code><a class="headerlink" href="#nest_backend.database.tables.Alert.conditions" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py method">
@ -361,100 +378,6 @@ for example, any mapped columns or relationships.</p>
</dd></dl>
<dl class="py class">
<dt id="nest_backend.database.tables.BoolOperation">
<em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">nest_backend.database.tables.</span></code><code class="sig-name descname"><span class="pre">BoolOperation</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#nest_backend.database.tables.BoolOperation" title="Link a questa definizione"></a></dt>
<dd><blockquote>
<div><p>Basi: <code class="xref py py-class docutils literal notranslate"><span class="pre">sqlalchemy.orm.decl_api.Model</span></code></p>
</div></blockquote>
<dl class="py attribute">
<dt id="nest_backend.database.tables.BoolOperation.id">
<code class="sig-name descname"><span class="pre">id</span></code><a class="headerlink" href="#nest_backend.database.tables.BoolOperation.id" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="nest_backend.database.tables.BoolOperation.operation">
<code class="sig-name descname"><span class="pre">operation</span></code><a class="headerlink" href="#nest_backend.database.tables.BoolOperation.operation" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="nest_backend.database.tables.BoolOperation.is_root">
<code class="sig-name descname"><span class="pre">is_root</span></code><a class="headerlink" href="#nest_backend.database.tables.BoolOperation.is_root" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="nest_backend.database.tables.BoolOperation.condition_id">
<code class="sig-name descname"><span class="pre">condition_id</span></code><a class="headerlink" href="#nest_backend.database.tables.BoolOperation.condition_id" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="nest_backend.database.tables.BoolOperation.node_1_id">
<code class="sig-name descname"><span class="pre">node_1_id</span></code><a class="headerlink" href="#nest_backend.database.tables.BoolOperation.node_1_id" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="nest_backend.database.tables.BoolOperation.node_2_id">
<code class="sig-name descname"><span class="pre">node_2_id</span></code><a class="headerlink" href="#nest_backend.database.tables.BoolOperation.node_2_id" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="nest_backend.database.tables.BoolOperation.alert_id">
<code class="sig-name descname"><span class="pre">alert_id</span></code><a class="headerlink" href="#nest_backend.database.tables.BoolOperation.alert_id" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="nest_backend.database.tables.BoolOperation.condition">
<code class="sig-name descname"><span class="pre">condition</span></code><a class="headerlink" href="#nest_backend.database.tables.BoolOperation.condition" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="nest_backend.database.tables.BoolOperation.node_1">
<code class="sig-name descname"><span class="pre">node_1</span></code><a class="headerlink" href="#nest_backend.database.tables.BoolOperation.node_1" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="nest_backend.database.tables.BoolOperation.node_2">
<code class="sig-name descname"><span class="pre">node_2</span></code><a class="headerlink" href="#nest_backend.database.tables.BoolOperation.node_2" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="nest_backend.database.tables.BoolOperation.alert">
<code class="sig-name descname"><span class="pre">alert</span></code><a class="headerlink" href="#nest_backend.database.tables.BoolOperation.alert" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt id="nest_backend.database.tables.BoolOperation.to_json">
<code class="sig-name descname"><span class="pre">to_json</span></code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#nest_backend.database.tables.BoolOperation.to_json" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt id="nest_backend.database.tables.BoolOperation.get_chain_ids">
<code class="sig-name descname"><span class="pre">get_chain_ids</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">lista</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#nest_backend.database.tables.BoolOperation.get_chain_ids" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt id="nest_backend.database.tables.BoolOperation.__init__">
<code class="sig-name descname"><span class="pre">__init__</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#nest_backend.database.tables.BoolOperation.__init__" title="Link a questa definizione"></a></dt>
<dd><p>A simple constructor that allows initialization from kwargs.</p>
<p>Sets attributes on the constructed instance using the names and
values in <code class="docutils literal notranslate"><span class="pre">kwargs</span></code>.</p>
<p>Only keys that are present as
attributes of the instances class are allowed. These could be,
for example, any mapped columns or relationships.</p>
</dd></dl>
<dl class="py attribute">
<dt id="nest_backend.database.tables.BoolOperation.father_1">
<code class="sig-name descname"><span class="pre">father_1</span></code><a class="headerlink" href="#nest_backend.database.tables.BoolOperation.father_1" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="nest_backend.database.tables.BoolOperation.father_2">
<code class="sig-name descname"><span class="pre">father_2</span></code><a class="headerlink" href="#nest_backend.database.tables.BoolOperation.father_2" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
</dd></dl>
<dl class="py class">
<dt id="nest_backend.database.tables.Composed">
<em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">nest_backend.database.tables.</span></code><code class="sig-name descname"><span class="pre">Composed</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#nest_backend.database.tables.Composed" title="Link a questa definizione"></a></dt>
@ -531,8 +454,8 @@ for example, any mapped columns or relationships.</p>
<dd></dd></dl>
<dl class="py attribute">
<dt id="nest_backend.database.tables.Condition.operations">
<code class="sig-name descname"><span class="pre">operations</span></code><a class="headerlink" href="#nest_backend.database.tables.Condition.operations" title="Link a questa definizione"></a></dt>
<dt id="nest_backend.database.tables.Condition.alerts">
<code class="sig-name descname"><span class="pre">alerts</span></code><a class="headerlink" href="#nest_backend.database.tables.Condition.alerts" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py method">
@ -838,6 +761,45 @@ for example, any mapped columns or relationships.</p>
</dd></dl>
<dl class="py class">
<dt id="nest_backend.database.tables.MadeOf">
<em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">nest_backend.database.tables.</span></code><code class="sig-name descname"><span class="pre">MadeOf</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#nest_backend.database.tables.MadeOf" title="Link a questa definizione"></a></dt>
<dd><blockquote>
<div><p>Basi: <code class="xref py py-class docutils literal notranslate"><span class="pre">sqlalchemy.orm.decl_api.Model</span></code></p>
</div></blockquote>
<dl class="py attribute">
<dt id="nest_backend.database.tables.MadeOf.aid">
<code class="sig-name descname"><span class="pre">aid</span></code><a class="headerlink" href="#nest_backend.database.tables.MadeOf.aid" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="nest_backend.database.tables.MadeOf.cid">
<code class="sig-name descname"><span class="pre">cid</span></code><a class="headerlink" href="#nest_backend.database.tables.MadeOf.cid" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="nest_backend.database.tables.MadeOf.alert">
<code class="sig-name descname"><span class="pre">alert</span></code><a class="headerlink" href="#nest_backend.database.tables.MadeOf.alert" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py attribute">
<dt id="nest_backend.database.tables.MadeOf.condition">
<code class="sig-name descname"><span class="pre">condition</span></code><a class="headerlink" href="#nest_backend.database.tables.MadeOf.condition" title="Link a questa definizione"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt id="nest_backend.database.tables.MadeOf.__init__">
<code class="sig-name descname"><span class="pre">__init__</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#nest_backend.database.tables.MadeOf.__init__" title="Link a questa definizione"></a></dt>
<dd><p>A simple constructor that allows initialization from kwargs.</p>
<p>Sets attributes on the constructed instance using the names and
values in <code class="docutils literal notranslate"><span class="pre">kwargs</span></code>.</p>
<p>Only keys that are present as
attributes of the instances class are allowed. These could be,
for example, any mapped columns or relationships.</p>
</dd></dl>
</dd></dl>
<dl class="py class">
<dt id="nest_backend.database.tables.ConditionType">
<em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">nest_backend.database.tables.</span></code><code class="sig-name descname"><span class="pre">ConditionType</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">value</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#nest_backend.database.tables.ConditionType" title="Link a questa definizione"></a></dt>
@ -925,7 +887,7 @@ GitLab</a> .</p>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../crawler/index.html" class="btn btn-neutral float-right" title="nest_crawler - Crawler in Python" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
<a href="../installation/index.html" class="btn btn-neutral float-left" title="Installazione" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="../development/tools.html" class="btn btn-neutral float-left" title="Strumenti utilizzati" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
</div>
<hr/>

View file

@ -50,7 +50,7 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<div class="wy-side-nav-search" style="background: #3B7097" >
@ -85,11 +85,15 @@
<p class="caption"><span class="caption-text">Manuale</span></p>
<p class="caption"><span class="caption-text">Manuale utente</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../about/index.html">Il progetto</a></li>
<li class="toctree-l1"><a class="reference internal" href="../installation/index.html">Installazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Guida sviluppatore</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../meta/index.html">Meta-documentazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Documentazione autogenerata</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../backend/index.html"><code class="docutils literal notranslate"><span class="pre">nest_backend</span></code> - Web API in Python</a></li>
@ -162,8 +166,8 @@
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="nest-crawler-crawler-in-python">
<h1><code class="docutils literal notranslate"><span class="pre">nest_crawler</span></code> - Crawler in Python<a class="headerlink" href="#nest-crawler-crawler-in-python" title="Link a questa intestazione"></a></h1>
<div class="section" id="module-nest_crawler">
<span id="nest-crawler-crawler-in-python"></span><h1><code class="docutils literal notranslate"><span class="pre">nest_crawler</span></code> - Crawler in Python<a class="headerlink" href="#module-nest_crawler" title="Link a questa intestazione"></a></h1>
</div>

View file

@ -0,0 +1,251 @@
<!DOCTYPE html>
<html class="writer-html5" lang="it" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Feedback ricevuto dal cliente &mdash; N.E.S.T. 0.1.0 documentazione</title>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<!--[if lt IE 9]>
<script src="../../_static/js/html5shiv.min.js"></script>
<![endif]-->
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/translations.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<link rel="index" title="Indice" href="../../genindex.html" />
<link rel="search" title="Cerca" href="../../search.html" />
<link rel="next" title="Statistiche di Gitinspector" href="../stats/index.html" />
<link rel="prev" title="Meta-documentazione" href="../../meta/index.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" style="background: #3B7097" >
<a href="../../index.html" class="icon icon-home"> N.E.S.T.
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">Manuale utente</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../about/index.html">Il progetto</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../installation/index.html">Installazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Guida sviluppatore</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../meta/index.html">Meta-documentazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Compendio del progetto</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">Feedback ricevuto dal cliente</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#documenti">Documenti</a></li>
<li class="toctree-l2"><a class="reference internal" href="#consegna-degli-sprint">Consegna degli Sprint</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../stats/index.html">Statistiche di Gitinspector</a></li>
<li class="toctree-l1"><a class="reference internal" href="../log.html">Registro attività</a></li>
<li class="toctree-l1"><a class="reference internal" href="../tools.html">Strumenti utilizzati</a></li>
</ul>
<p class="caption"><span class="caption-text">Documentazione autogenerata</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../backend/index.html"><code class="docutils literal notranslate"><span class="pre">nest_backend</span></code> - Web API in Python</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../crawler/index.html"><code class="docutils literal notranslate"><span class="pre">nest_crawler</span></code> - Crawler in Python</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../frontend/index.html"><code class="docutils literal notranslate"><span class="pre">nest_frontend</span></code> - Interfaccia utente in React</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">N.E.S.T.</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html" class="icon icon-home"></a> &raquo;</li>
<li>Feedback ricevuto dal cliente</li>
<li class="wy-breadcrumbs-aside">
<a href="../../_sources/development/client/index.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="feedback-ricevuto-dal-cliente">
<h1>Feedback ricevuto dal cliente<a class="headerlink" href="#feedback-ricevuto-dal-cliente" title="Link a questa intestazione"></a></h1>
<div class="section" id="documenti">
<h2>Documenti<a class="headerlink" href="#documenti" title="Link a questa intestazione"></a></h2>
<ul class="simple">
<li><p><a class="reference download internal" download="" href="../../_downloads/df66d1639f4dab62e4bb25a03b3731e0/0-initial.pdf"><code class="xref download docutils literal notranslate"><span class="pre">Descrizione</span> <span class="pre">iniziale</span> <span class="pre">del</span> <span class="pre">prodotto</span></code></a></p></li>
</ul>
</div>
<div class="section" id="consegna-degli-sprint">
<h2>Consegna degli Sprint<a class="headerlink" href="#consegna-degli-sprint" title="Link a questa intestazione"></a></h2>
<div class="admonition-todo admonition" id="id1">
<p class="admonition-title">Da fare</p>
<p>Aggiungere i documenti degli sprint mancanti!</p>
</div>
<ul class="simple">
<li><p><a class="reference download internal" download="" href="../../_downloads/48457f6bb878a8cc02104058e6103abb/0-sprint-requirements.pdf"><code class="xref download docutils literal notranslate"><span class="pre">Sprint</span> <span class="pre">0</span></code></a></p></li>
<li><p><code class="xref download docutils literal notranslate"><span class="pre">Sprint</span> <span class="pre">1</span></code></p></li>
<li><p><code class="xref download docutils literal notranslate"><span class="pre">Sprint</span> <span class="pre">2</span></code></p></li>
<li><p><code class="xref download docutils literal notranslate"><span class="pre">Sprint</span> <span class="pre">3</span></code></p></li>
</ul>
</div>
</div>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../stats/index.html" class="btn btn-neutral float-right" title="Statistiche di Gitinspector" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
<a href="../../meta/index.html" class="btn btn-neutral float-left" title="Meta-documentazione" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<p>
&#169; Copyright 2021, Gruppo 2.
</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

1339
docs/build/html/development/log.html vendored Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,238 @@
<!DOCTYPE html>
<html class="writer-html5" lang="it" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Statistiche di Gitinspector &mdash; N.E.S.T. 0.1.0 documentazione</title>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<!--[if lt IE 9]>
<script src="../../_static/js/html5shiv.min.js"></script>
<![endif]-->
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/translations.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<link rel="index" title="Indice" href="../../genindex.html" />
<link rel="search" title="Cerca" href="../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" style="background: #3B7097" >
<a href="../../index.html" class="icon icon-home"> N.E.S.T.
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">Manuale utente</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../about/index.html">Il progetto</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../installation/index.html">Installazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Guida sviluppatore</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../meta/index.html">Meta-documentazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Compendio del progetto</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../client/index.html">Feedback ricevuto dal cliente</a></li>
<li class="toctree-l1"><a class="reference internal" href="../tools.html">Strumenti utilizzati</a></li>
</ul>
<p class="caption"><span class="caption-text">Documentazione autogenerata</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../backend/index.html"><code class="docutils literal notranslate"><span class="pre">nest_backend</span></code> - Web API in Python</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../crawler/index.html"><code class="docutils literal notranslate"><span class="pre">nest_crawler</span></code> - Crawler in Python</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../frontend/index.html"><code class="docutils literal notranslate"><span class="pre">nest_frontend</span></code> - Interfaccia utente in React</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">N.E.S.T.</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html" class="icon icon-home"></a> &raquo;</li>
<li>Statistiche di Gitinspector</li>
<li class="wy-breadcrumbs-aside">
<a href="../../_sources/development/statistics/index.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="statistiche-di-gitinspector">
<h1>Statistiche di Gitinspector<a class="headerlink" href="#statistiche-di-gitinspector" title="Link a questa intestazione"></a></h1>
<p>Queste statistiche sono state generate dal prof. Missiroli con <a class="reference external" href="https://github.com/ejwa/gitinspector">Gitinspector</a>.</p>
<div class="admonition note">
<p class="admonition-title">Nota</p>
<p>Le statistiche probabilmente sono molto inaccurate, in quanto Gitinspector sembra tenere conto anche delle directory
contenenti file vendored, come <code class="docutils literal notranslate"><span class="pre">docs/build</span></code>.</p>
</div>
<div class="admonition-todo admonition" id="id1">
<p class="admonition-title">Da fare</p>
<p>Aggiungere le statistiche degli sprint mancanti!</p>
</div>
<ul class="simple">
<li><p><a class="reference download internal" download="" href="../../_downloads/4831934cb757201fe067c48df43a74ea/0-stats.html"><code class="xref download docutils literal notranslate"><span class="pre">Sprint</span> <span class="pre">0</span></code></a></p></li>
<li><p><a class="reference download internal" download="" href="../../_downloads/8305c312d79edd3a41456dc3da1e0045/1-stats.html"><code class="xref download docutils literal notranslate"><span class="pre">Sprint</span> <span class="pre">1</span></code></a></p></li>
<li><p><a class="reference download internal" download="" href="../../_downloads/802f4a69bcab50834f865f69f714efe6/2-stats.html"><code class="xref download docutils literal notranslate"><span class="pre">Sprint</span> <span class="pre">2</span> <span class="pre">(codice)</span></code></a></p></li>
<li><p><a class="reference download internal" download="" href="../../_downloads/ad524590ef981c41310736536fcd2a4e/2D-stats.html"><code class="xref download docutils literal notranslate"><span class="pre">Sprint</span> <span class="pre">2</span> <span class="pre">(documentazione)</span></code></a></p></li>
<li><p><code class="xref download docutils literal notranslate"><span class="pre">Sprint</span> <span class="pre">3</span> <span class="pre">(codice)</span></code></p></li>
<li><p><code class="xref download docutils literal notranslate"><span class="pre">Sprint</span> <span class="pre">3</span> <span class="pre">(documentazione)</span></code></p></li>
</ul>
</div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&#169; Copyright 2021, Gruppo 2.
</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View file

@ -0,0 +1,246 @@
<!DOCTYPE html>
<html class="writer-html5" lang="it" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Statistiche di Gitinspector &mdash; N.E.S.T. 0.1.0 documentazione</title>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<!--[if lt IE 9]>
<script src="../../_static/js/html5shiv.min.js"></script>
<![endif]-->
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/translations.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<link rel="index" title="Indice" href="../../genindex.html" />
<link rel="search" title="Cerca" href="../../search.html" />
<link rel="next" title="Registro attività" href="../log.html" />
<link rel="prev" title="Feedback ricevuto dal cliente" href="../client/index.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" style="background: #3B7097" >
<a href="../../index.html" class="icon icon-home"> N.E.S.T.
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">Manuale utente</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../about/index.html">Il progetto</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../installation/index.html">Installazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Guida sviluppatore</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../meta/index.html">Meta-documentazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Compendio del progetto</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../client/index.html">Feedback ricevuto dal cliente</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Statistiche di Gitinspector</a></li>
<li class="toctree-l1"><a class="reference internal" href="../log.html">Registro attività</a></li>
<li class="toctree-l1"><a class="reference internal" href="../tools.html">Strumenti utilizzati</a></li>
</ul>
<p class="caption"><span class="caption-text">Documentazione autogenerata</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../backend/index.html"><code class="docutils literal notranslate"><span class="pre">nest_backend</span></code> - Web API in Python</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../crawler/index.html"><code class="docutils literal notranslate"><span class="pre">nest_crawler</span></code> - Crawler in Python</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../frontend/index.html"><code class="docutils literal notranslate"><span class="pre">nest_frontend</span></code> - Interfaccia utente in React</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">N.E.S.T.</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html" class="icon icon-home"></a> &raquo;</li>
<li>Statistiche di Gitinspector</li>
<li class="wy-breadcrumbs-aside">
<a href="../../_sources/development/stats/index.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="statistiche-di-gitinspector">
<h1>Statistiche di Gitinspector<a class="headerlink" href="#statistiche-di-gitinspector" title="Link a questa intestazione"></a></h1>
<p>Queste statistiche sono state generate dal prof. Missiroli con <a class="reference external" href="https://github.com/ejwa/gitinspector">Gitinspector</a>.</p>
<div class="admonition note">
<p class="admonition-title">Nota</p>
<p>Le statistiche probabilmente sono molto inaccurate, in quanto Gitinspector sembra tenere conto anche delle directory
contenenti file vendored, come <code class="docutils literal notranslate"><span class="pre">docs/build</span></code>.</p>
</div>
<div class="admonition-todo admonition" id="id1">
<p class="admonition-title">Da fare</p>
<p>Aggiungere le statistiche degli sprint mancanti!</p>
</div>
<ul class="simple">
<li><p><a class="reference download internal" download="" href="../../_downloads/cc3ed6448c65c54a6e3382427b715150/0-stats.html"><code class="xref download docutils literal notranslate"><span class="pre">Sprint</span> <span class="pre">0</span></code></a></p></li>
<li><p><a class="reference download internal" download="" href="../../_downloads/80aefca42623a1197bc9ca4609efd23d/1-stats.html"><code class="xref download docutils literal notranslate"><span class="pre">Sprint</span> <span class="pre">1</span></code></a></p></li>
<li><p><a class="reference download internal" download="" href="../../_downloads/affcb0b1c0baa178e323ddea9edec3b5/2-stats.html"><code class="xref download docutils literal notranslate"><span class="pre">Sprint</span> <span class="pre">2</span> <span class="pre">(codice)</span></code></a></p></li>
<li><p><a class="reference download internal" download="" href="../../_downloads/4d0db5ecfa1dc71c9c67f8ec40e90078/2D-stats.html"><code class="xref download docutils literal notranslate"><span class="pre">Sprint</span> <span class="pre">2</span> <span class="pre">(documentazione)</span></code></a></p></li>
<li><p><code class="xref download docutils literal notranslate"><span class="pre">Sprint</span> <span class="pre">3</span> <span class="pre">(codice)</span></code></p></li>
<li><p><code class="xref download docutils literal notranslate"><span class="pre">Sprint</span> <span class="pre">3</span> <span class="pre">(documentazione)</span></code></p></li>
</ul>
</div>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../log.html" class="btn btn-neutral float-right" title="Registro attività" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
<a href="../client/index.html" class="btn btn-neutral float-left" title="Feedback ricevuto dal cliente" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<p>
&#169; Copyright 2021, Gruppo 2.
</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

225
docs/build/html/development/tools.html vendored Normal file
View file

@ -0,0 +1,225 @@
<!DOCTYPE html>
<html class="writer-html5" lang="it" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Strumenti utilizzati &mdash; N.E.S.T. 0.1.0 documentazione</title>
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<!--[if lt IE 9]>
<script src="../_static/js/html5shiv.min.js"></script>
<![endif]-->
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/translations.js"></script>
<script type="text/javascript" src="../_static/js/theme.js"></script>
<link rel="index" title="Indice" href="../genindex.html" />
<link rel="search" title="Cerca" href="../search.html" />
<link rel="next" title="nest_backend - Web API in Python" href="../backend/index.html" />
<link rel="prev" title="Meta-documentazione" href="../meta/index.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" style="background: #3B7097" >
<a href="../index.html" class="icon icon-home"> N.E.S.T.
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">Manuale utente</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../about/index.html">Il progetto</a></li>
<li class="toctree-l1"><a class="reference internal" href="../installation/index.html">Installazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Guida sviluppatore</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../meta/index.html">Meta-documentazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Compendio del progetto</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">Strumenti utilizzati</a></li>
</ul>
<p class="caption"><span class="caption-text">Documentazione autogenerata</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../backend/index.html"><code class="docutils literal notranslate"><span class="pre">nest_backend</span></code> - Web API in Python</a></li>
<li class="toctree-l1"><a class="reference internal" href="../crawler/index.html"><code class="docutils literal notranslate"><span class="pre">nest_crawler</span></code> - Crawler in Python</a></li>
<li class="toctree-l1"><a class="reference internal" href="../frontend/index.html"><code class="docutils literal notranslate"><span class="pre">nest_frontend</span></code> - Interfaccia utente in React</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">N.E.S.T.</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html" class="icon icon-home"></a> &raquo;</li>
<li>Strumenti utilizzati</li>
<li class="wy-breadcrumbs-aside">
<a href="../_sources/development/tools.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="strumenti-utilizzati">
<h1>Strumenti utilizzati<a class="headerlink" href="#strumenti-utilizzati" title="Link a questa intestazione"></a></h1>
</div>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../backend/index.html" class="btn btn-neutral float-right" title="nest_backend - Web API in Python" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
<a href="../meta/index.html" class="btn btn-neutral float-left" title="Meta-documentazione" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<p>
&#169; Copyright 2021, Gruppo 2.
</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View file

@ -49,7 +49,7 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<div class="wy-side-nav-search" style="background: #3B7097" >
@ -84,11 +84,15 @@
<p class="caption"><span class="caption-text">Manuale</span></p>
<p class="caption"><span class="caption-text">Manuale utente</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../about/index.html">Il progetto</a></li>
<li class="toctree-l1"><a class="reference internal" href="../installation/index.html">Installazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Guida sviluppatore</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../meta/index.html">Meta-documentazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Documentazione autogenerata</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../backend/index.html"><code class="docutils literal notranslate"><span class="pre">nest_backend</span></code> - Web API in Python</a></li>

View file

@ -48,7 +48,7 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<div class="wy-side-nav-search" style="background: #3B7097" >
@ -83,11 +83,22 @@
<p class="caption"><span class="caption-text">Manuale</span></p>
<p class="caption"><span class="caption-text">Manuale utente</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="about/index.html">Il progetto</a></li>
<li class="toctree-l1"><a class="reference internal" href="installation/index.html">Installazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Guida sviluppatore</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="meta/index.html">Meta-documentazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Compendio del progetto</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="development/client/index.html">Feedback ricevuto dal cliente</a></li>
<li class="toctree-l1"><a class="reference internal" href="development/stats/index.html">Statistiche di Gitinspector</a></li>
<li class="toctree-l1"><a class="reference internal" href="development/log.html">Registro attività</a></li>
<li class="toctree-l1"><a class="reference internal" href="development/tools.html">Strumenti utilizzati</a></li>
</ul>
<p class="caption"><span class="caption-text">Documentazione autogenerata</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="backend/index.html"><code class="docutils literal notranslate"><span class="pre">nest_backend</span></code> - Web API in Python</a></li>
@ -164,7 +175,6 @@
<div class="genindex-jumpbox">
<a href="#_"><strong>_</strong></a>
| <a href="#A"><strong>A</strong></a>
| <a href="#B"><strong>B</strong></a>
| <a href="#C"><strong>C</strong></a>
| <a href="#E"><strong>E</strong></a>
| <a href="#F"><strong>F</strong></a>
@ -191,14 +201,14 @@
<ul>
<li><a href="backend/index.html#nest_backend.database.tables.Authorization.__init__">(nest_backend.database.tables.Authorization metodo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.BoolOperation.__init__">(nest_backend.database.tables.BoolOperation metodo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.Composed.__init__">(nest_backend.database.tables.Composed metodo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.Condition.__init__">(nest_backend.database.tables.Condition metodo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.Contains.__init__">(nest_backend.database.tables.Contains metodo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.MadeOf.__init__">(nest_backend.database.tables.MadeOf metodo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.Notification.__init__">(nest_backend.database.tables.Notification metodo)</a>
</li>
@ -216,23 +226,25 @@
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="backend/index.html#nest_backend.gestione.admin_or_403">admin_or_403() (nel modulo nest_backend.gestione)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.MadeOf.aid">aid (nest_backend.database.tables.MadeOf attributo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.Alert">Alert (classe in nest_backend.database.tables)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.BoolOperation.alert">alert (nest_backend.database.tables.BoolOperation attributo)</a>
<li><a href="backend/index.html#nest_backend.database.tables.MadeOf.alert">alert (nest_backend.database.tables.MadeOf attributo)</a>
<ul>
<li><a href="backend/index.html#nest_backend.database.tables.Notification.alert">(nest_backend.database.tables.Notification attributo)</a>
</li>
</ul></li>
<li><a href="backend/index.html#nest_backend.database.tables.BoolOperation.alert_id">alert_id (nest_backend.database.tables.BoolOperation attributo)</a>
<li><a href="backend/index.html#nest_backend.database.tables.Notification.alert_id">alert_id (nest_backend.database.tables.Notification attributo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.Condition.alerts">alerts (nest_backend.database.tables.Condition attributo)</a>
<ul>
<li><a href="backend/index.html#nest_backend.database.tables.Notification.alert_id">(nest_backend.database.tables.Notification attributo)</a>
<li><a href="backend/index.html#nest_backend.database.tables.Repository.alerts">(nest_backend.database.tables.Repository attributo)</a>
</li>
</ul></li>
<li><a href="backend/index.html#nest_backend.database.tables.Repository.alerts">alerts (nest_backend.database.tables.Repository attributo)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="backend/index.html#nest_backend.database.tables.ConditionMode.all_and">all_and (nest_backend.database.tables.ConditionMode attributo)</a>
@ -254,38 +266,34 @@
</ul></td>
</tr></table>
<h2 id="B">B</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="backend/index.html#nest_backend.database.tables.BoolOperation">BoolOperation (classe in nest_backend.database.tables)</a>
</li>
</ul></td>
</tr></table>
<h2 id="C">C</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="backend/index.html#nest_backend.database.tables.Contains.cid">cid (nest_backend.database.tables.Contains attributo)</a>
<ul>
<li><a href="backend/index.html#nest_backend.database.tables.MadeOf.cid">(nest_backend.database.tables.MadeOf attributo)</a>
</li>
</ul></li>
<li><a href="backend/index.html#nest_backend.database.tables.Composed">Composed (classe in nest_backend.database.tables)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.Condition">Condition (classe in nest_backend.database.tables)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.BoolOperation.condition">condition (nest_backend.database.tables.BoolOperation attributo)</a>
<li><a href="backend/index.html#nest_backend.database.tables.Contains.condition">condition (nest_backend.database.tables.Contains attributo)</a>
<ul>
<li><a href="backend/index.html#nest_backend.database.tables.Contains.condition">(nest_backend.database.tables.Contains attributo)</a>
<li><a href="backend/index.html#nest_backend.database.tables.MadeOf.condition">(nest_backend.database.tables.MadeOf attributo)</a>
</li>
</ul></li>
<li><a href="backend/index.html#nest_backend.database.tables.BoolOperation.condition_id">condition_id (nest_backend.database.tables.BoolOperation attributo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.ConditionMode">ConditionMode (classe in nest_backend.database.tables)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="backend/index.html#nest_backend.database.tables.Repository.conditions">conditions (nest_backend.database.tables.Repository attributo)</a>
<li><a href="backend/index.html#nest_backend.database.tables.Alert.conditions">conditions (nest_backend.database.tables.Alert attributo)</a>
<ul>
<li><a href="backend/index.html#nest_backend.database.tables.Repository.conditions">(nest_backend.database.tables.Repository attributo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.Tweet.conditions">(nest_backend.database.tables.Tweet attributo)</a>
</li>
</ul></li>
@ -313,26 +321,24 @@
<li><a href="backend/index.html#nest_backend.database.tables.User.email">(nest_backend.database.tables.User attributo)</a>
</li>
</ul></li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="backend/index.html#nest_backend.database.tables.Repository.end">end (nest_backend.database.tables.Repository attributo)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="backend/index.html#nest_backend.gestione.error_handler">error_handler() (nel modulo nest_backend.gestione)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.Repository.evaluation_mode">evaluation_mode (nest_backend.database.tables.Repository attributo)</a>
<li><a href="backend/index.html#nest_backend.database.tables.Alert.evaluation_mode">evaluation_mode (nest_backend.database.tables.Alert attributo)</a>
<ul>
<li><a href="backend/index.html#nest_backend.database.tables.Repository.evaluation_mode">(nest_backend.database.tables.Repository attributo)</a>
</li>
</ul></li>
</ul></td>
</tr></table>
<h2 id="F">F</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="backend/index.html#nest_backend.database.tables.BoolOperation.father_1">father_1 (nest_backend.database.tables.BoolOperation attributo)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="backend/index.html#nest_backend.database.tables.BoolOperation.father_2">father_2 (nest_backend.database.tables.BoolOperation attributo)</a>
</li>
<li><a href="backend/index.html#nest_backend.gestione.find_user">find_user() (nel modulo nest_backend.gestione)</a>
</li>
</ul></td>
@ -342,10 +348,6 @@
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="backend/index.html#nest_backend.gestione.gen_password">gen_password() (nel modulo nest_backend.gestione)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="backend/index.html#nest_backend.database.tables.BoolOperation.get_chain_ids">get_chain_ids() (nest_backend.database.tables.BoolOperation metodo)</a>
</li>
</ul></td>
</tr></table>
@ -368,8 +370,6 @@
<li><a href="backend/index.html#nest_backend.database.tables.Alert.id">id (nest_backend.database.tables.Alert attributo)</a>
<ul>
<li><a href="backend/index.html#nest_backend.database.tables.BoolOperation.id">(nest_backend.database.tables.BoolOperation attributo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.Condition.id">(nest_backend.database.tables.Condition attributo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.Notification.id">(nest_backend.database.tables.Notification attributo)</a>
@ -384,8 +384,6 @@
<li><a href="backend/index.html#nest_backend.database.tables.Tweet.insert_time">insert_time (nest_backend.database.tables.Tweet attributo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.Repository.is_active">is_active (nest_backend.database.tables.Repository attributo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.BoolOperation.is_root">is_root (nest_backend.database.tables.BoolOperation attributo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.User.isAdmin">isAdmin (nest_backend.database.tables.User attributo)</a>
</li>
@ -425,6 +423,8 @@
<h2 id="M">M</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="backend/index.html#nest_backend.database.tables.MadeOf">MadeOf (classe in nest_backend.database.tables)</a>
</li>
<li>
modulo
@ -438,6 +438,8 @@
<li><a href="backend/index.html#module-nest_backend.database.tables">nest_backend.database.tables</a>
</li>
<li><a href="backend/index.html#module-nest_backend.gestione">nest_backend.gestione</a>
</li>
<li><a href="crawler/index.html#module-nest_crawler">nest_crawler</a>
</li>
</ul></li>
</ul></td>
@ -473,6 +475,8 @@
<li><a href="backend/index.html#module-nest_backend.database.base">modulo</a>
</li>
</ul></li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li>
nest_backend.database.tables
@ -480,8 +484,6 @@
<li><a href="backend/index.html#module-nest_backend.database.tables">modulo</a>
</li>
</ul></li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li>
nest_backend.gestione
@ -489,14 +491,13 @@
<li><a href="backend/index.html#module-nest_backend.gestione">modulo</a>
</li>
</ul></li>
<li><a href="backend/index.html#nest_backend.database.tables.BoolOperation.node_1">node_1 (nest_backend.database.tables.BoolOperation attributo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.BoolOperation.node_1_id">node_1_id (nest_backend.database.tables.BoolOperation attributo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.BoolOperation.node_2">node_2 (nest_backend.database.tables.BoolOperation attributo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.BoolOperation.node_2_id">node_2_id (nest_backend.database.tables.BoolOperation attributo)</a>
<li>
nest_crawler
<ul>
<li><a href="crawler/index.html#module-nest_crawler">modulo</a>
</li>
</ul></li>
<li><a href="backend/index.html#nest_backend.database.tables.Notification">Notification (classe in nest_backend.database.tables)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.Alert.notifications">notifications (nest_backend.database.tables.Alert attributo)</a>
@ -507,20 +508,12 @@
<h2 id="O">O</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="backend/index.html#nest_backend.database.tables.BoolOperation.operation">operation (nest_backend.database.tables.BoolOperation attributo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.Alert.operations">operations (nest_backend.database.tables.Alert attributo)</a>
<ul>
<li><a href="backend/index.html#nest_backend.database.tables.Condition.operations">(nest_backend.database.tables.Condition attributo)</a>
</li>
</ul></li>
<li><a href="backend/index.html#nest_backend.database.tables.OperationType">OperationType (classe in nest_backend.database.tables)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.Notification.ora">ora (nest_backend.database.tables.Notification attributo)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="backend/index.html#nest_backend.database.tables.Notification.ora">ora (nest_backend.database.tables.Notification attributo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.Repository.owner">owner (nest_backend.database.tables.Repository attributo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.Repository.owner_id">owner_id (nest_backend.database.tables.Repository attributo)</a>
@ -610,8 +603,6 @@
<li><a href="backend/index.html#nest_backend.database.tables.Alert.to_json">to_json() (nest_backend.database.tables.Alert metodo)</a>
<ul>
<li><a href="backend/index.html#nest_backend.database.tables.BoolOperation.to_json">(nest_backend.database.tables.BoolOperation metodo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.Condition.to_json">(nest_backend.database.tables.Condition metodo)</a>
</li>
<li><a href="backend/index.html#nest_backend.database.tables.Notification.to_json">(nest_backend.database.tables.Notification metodo)</a>

View file

@ -49,7 +49,7 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<div class="wy-side-nav-search" style="background: #3B7097" >
@ -84,11 +84,22 @@
<p class="caption"><span class="caption-text">Manuale</span></p>
<p class="caption"><span class="caption-text">Manuale utente</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="about/index.html">Il progetto</a></li>
<li class="toctree-l1"><a class="reference internal" href="installation/index.html">Installazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Guida sviluppatore</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="meta/index.html">Meta-documentazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Compendio del progetto</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="development/client/index.html">Feedback ricevuto dal cliente</a></li>
<li class="toctree-l1"><a class="reference internal" href="development/stats/index.html">Statistiche di Gitinspector</a></li>
<li class="toctree-l1"><a class="reference internal" href="development/log.html">Registro attività</a></li>
<li class="toctree-l1"><a class="reference internal" href="development/tools.html">Strumenti utilizzati</a></li>
</ul>
<p class="caption"><span class="caption-text">Documentazione autogenerata</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="backend/index.html"><code class="docutils literal notranslate"><span class="pre">nest_backend</span></code> - Web API in Python</a></li>
@ -165,7 +176,7 @@
<h1>N.E.S.T.<a class="headerlink" href="#n-e-s-t" title="Link a questa intestazione"></a></h1>
<p>Benvenuto alla documentazione di N.E.S.T.!</p>
<div class="toctree-wrapper compound">
<p class="caption"><span class="caption-text">Manuale</span></p>
<p class="caption"><span class="caption-text">Manuale utente</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="about/index.html">Il progetto</a></li>
<li class="toctree-l1"><a class="reference internal" href="installation/index.html">Installazione</a><ul>
@ -186,6 +197,36 @@
</ul>
</div>
<div class="toctree-wrapper compound">
<p class="caption"><span class="caption-text">Guida sviluppatore</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="meta/index.html">Meta-documentazione</a><ul>
<li class="toctree-l2"><a class="reference internal" href="meta/index.html#compilazione-con-intellij-idea">Compilazione con IntelliJ IDEA</a></li>
<li class="toctree-l2"><a class="reference internal" href="meta/index.html#compilazione-con-gnu-make">Compilazione con GNU Make</a></li>
<li class="toctree-l2"><a class="reference internal" href="meta/index.html#compilazione-con-windows-powershell">Compilazione con Windows Powershell</a></li>
</ul>
</li>
</ul>
</div>
<div class="toctree-wrapper compound">
<p class="caption"><span class="caption-text">Compendio del progetto</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="development/client/index.html">Feedback ricevuto dal cliente</a><ul>
<li class="toctree-l2"><a class="reference internal" href="development/client/index.html#documenti">Documenti</a></li>
<li class="toctree-l2"><a class="reference internal" href="development/client/index.html#consegna-degli-sprint">Consegna degli Sprint</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="development/stats/index.html">Statistiche di Gitinspector</a></li>
<li class="toctree-l1"><a class="reference internal" href="development/log.html">Registro attività</a><ul>
<li class="toctree-l2"><a class="reference internal" href="development/log.html#sprint-0">Sprint 0</a></li>
<li class="toctree-l2"><a class="reference internal" href="development/log.html#sprint-1">Sprint 1</a></li>
<li class="toctree-l2"><a class="reference internal" href="development/log.html#sprint-2">Sprint 2</a></li>
<li class="toctree-l2"><a class="reference internal" href="development/log.html#sprint-3">Sprint 3</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="development/tools.html">Strumenti utilizzati</a></li>
</ul>
</div>
<div class="toctree-wrapper compound">
<p class="caption"><span class="caption-text">Documentazione autogenerata</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="backend/index.html"><code class="docutils literal notranslate"><span class="pre">nest_backend</span></code> - Web API in Python</a><ul>

View file

@ -39,7 +39,7 @@
<link rel="index" title="Indice" href="../genindex.html" />
<link rel="search" title="Cerca" href="../search.html" />
<link rel="next" title="nest_backend - Web API in Python" href="../backend/index.html" />
<link rel="next" title="Meta-documentazione" href="../meta/index.html" />
<link rel="prev" title="Il progetto" href="../about/index.html" />
</head>
@ -50,7 +50,7 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<div class="wy-side-nav-search" style="background: #3B7097" >
@ -85,7 +85,7 @@
<p class="caption"><span class="caption-text">Manuale</span></p>
<p class="caption"><span class="caption-text">Manuale utente</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../about/index.html">Il progetto</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Installazione</a><ul>
@ -104,6 +104,10 @@
</ul>
</li>
</ul>
<p class="caption"><span class="caption-text">Guida sviluppatore</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../meta/index.html">Meta-documentazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Documentazione autogenerata</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../backend/index.html"><code class="docutils literal notranslate"><span class="pre">nest_backend</span></code> - Web API in Python</a></li>
@ -236,7 +240,7 @@ Si veda il manuale di <a class="reference external" href="https://linux.die.net/
</div>
<div class="section" id="creare-un-file-di-configurazione-per-il-backend">
<h2>Creare un file di configurazione per il backend<a class="headerlink" href="#creare-un-file-di-configurazione-per-il-backend" title="Link a questa intestazione"></a></h2>
<p>Il backend usa un file di configurazione per impostare certe variabili.</p>
<p>Il backend usa un file di configurazione per impostare alcune variabili.</p>
<p>Si crei un nuovo file nella working directory del progetto denominato <code class="docutils literal notranslate"><span class="pre">config.py</span></code>:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">nest:~/g2-progetto$ </span>vim config.py
</pre></div>
@ -261,8 +265,8 @@ Si veda il manuale di <a class="reference external" href="https://linux.die.net/
</div>
<p>Poetry creerà automaticamente un <a class="reference external" href="https://docs.python.org/3/library/venv.html">venv</a> e vi installerà allinterno tutti
i pacchetti necessari allesecuzione del backend e del crawler di N.E.S.T. .</p>
<p><strong>Segnatevi il nome</strong> del venv creato da Poetry, in quanto sarà necessario per
<span class="xref std std-ref">Creare un servizio SystemD per il backend</span>:</p>
<p><strong>Si suggerisce di ricordare il nome del venv creato da Poetry</strong>, in quanto sarà necessario per
<a class="reference internal" href="#creare-un-servizio-systemd-per-il-backend"><span class="std std-ref">Creare un servizio SystemD per il backend</span></a>:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">Creating virtualenv nest-7C2fm2VD-py3.9 in /srv/nest/.cache/pypoetry/virtualenvs</span>
</pre></div>
</div>
@ -452,7 +456,7 @@ esempio da adattare al proprio setup:</p>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../backend/index.html" class="btn btn-neutral float-right" title="nest_backend - Web API in Python" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
<a href="../meta/index.html" class="btn btn-neutral float-right" title="Meta-documentazione" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
<a href="../about/index.html" class="btn btn-neutral float-left" title="Il progetto" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
</div>

281
docs/build/html/meta/index.html vendored Normal file
View file

@ -0,0 +1,281 @@
<!DOCTYPE html>
<html class="writer-html5" lang="it" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Meta-documentazione &mdash; N.E.S.T. 0.1.0 documentazione</title>
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<!--[if lt IE 9]>
<script src="../_static/js/html5shiv.min.js"></script>
<![endif]-->
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/translations.js"></script>
<script type="text/javascript" src="../_static/js/theme.js"></script>
<link rel="index" title="Indice" href="../genindex.html" />
<link rel="search" title="Cerca" href="../search.html" />
<link rel="next" title="nest_backend - Web API in Python" href="../backend/index.html" />
<link rel="prev" title="Installazione" href="../installation/index.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" style="background: #3B7097" >
<a href="../index.html" class="icon icon-home"> N.E.S.T.
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">Manuale utente</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../about/index.html">Il progetto</a></li>
<li class="toctree-l1"><a class="reference internal" href="../installation/index.html">Installazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Guida sviluppatore</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">Meta-documentazione</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#compilazione-con-intellij-idea">Compilazione con IntelliJ IDEA</a></li>
<li class="toctree-l2"><a class="reference internal" href="#compilazione-con-gnu-make">Compilazione con GNU Make</a></li>
<li class="toctree-l2"><a class="reference internal" href="#compilazione-con-windows-powershell">Compilazione con Windows Powershell</a></li>
</ul>
</li>
</ul>
<p class="caption"><span class="caption-text">Documentazione autogenerata</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../backend/index.html"><code class="docutils literal notranslate"><span class="pre">nest_backend</span></code> - Web API in Python</a></li>
<li class="toctree-l1"><a class="reference internal" href="../crawler/index.html"><code class="docutils literal notranslate"><span class="pre">nest_crawler</span></code> - Crawler in Python</a></li>
<li class="toctree-l1"><a class="reference internal" href="../frontend/index.html"><code class="docutils literal notranslate"><span class="pre">nest_frontend</span></code> - Interfaccia utente in React</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">N.E.S.T.</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html" class="icon icon-home"></a> &raquo;</li>
<li>Meta-documentazione</li>
<li class="wy-breadcrumbs-aside">
<a href="../_sources/meta/index.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="meta-documentazione">
<h1>Meta-documentazione<a class="headerlink" href="#meta-documentazione" title="Link a questa intestazione"></a></h1>
<p>La documentazione è scritta in <a class="reference external" href="https://docutils.sourceforge.io/rst.html">reStructuredText</a>, ed è generata con
<a class="reference external" href="https://www.sphinx-doc.org/en/master/">Sphinx</a>.</p>
<p>I dati relativi alla documentazione si trovano nella directory standard <code class="docutils literal notranslate"><span class="pre">/docs</span></code>;
in particolare, le sorgenti reStructuredText si trovano in <code class="docutils literal notranslate"><span class="pre">/docs/source</span></code>,
mentre lultima versione compilata si trova in <code class="docutils literal notranslate"><span class="pre">/docs/build</span></code>.</p>
<p>Questa struttura permetterebbe lintegrazione con lo strumento di «Continuous Documentation»
<a class="reference external" href="https://readthedocs.com/">ReadTheDocs</a>, qualora il progetto fosse ospitato su GitHub o disponessimo di una licenza
almeno <a class="reference external" href="https://readthedocs.com/pricing/">Basic</a>.</p>
<div class="section" id="compilazione-con-intellij-idea">
<h2>Compilazione con IntelliJ IDEA<a class="headerlink" href="#compilazione-con-intellij-idea" title="Link a questa intestazione"></a></h2>
<p>È possibile compilare manualmente la documentazione con IntelliJ IDEA.</p>
<p>Su sistemi Linux, è disponibile la Run Configuration <code class="docutils literal notranslate"><span class="pre">Docs</span></code>, che compilerà la versione HTML della documentazione se
eseguita.</p>
<img alt="../_images/docsRunConfig.png" src="../_images/docsRunConfig.png" />
</div>
<div class="section" id="compilazione-con-gnu-make">
<h2>Compilazione con GNU Make<a class="headerlink" href="#compilazione-con-gnu-make" title="Link a questa intestazione"></a></h2>
<p>È possibile compilare manualmente la documentazione con GNU Make.</p>
<p>Come prima cosa, è necessario <a class="reference internal" href="../installation/index.html#installare-le-dipendenze-python"><span class="std std-ref">Installare le dipendenze Python</span></a> del progetto:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">user:g2-progetto$ </span>poetry install
</pre></div>
</div>
<p>Poi, si entri allinterno del virtual environment:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">user:g2-progetto$ </span>poetry shell
</pre></div>
</div>
<p>Una volta allinterno del venv, si entri nella cartella della documentazione:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">user:g2-progetto$ </span><span class="nb">cd</span> docs
</pre></div>
</div>
<p>Infine, si esegua il target <code class="docutils literal notranslate"><span class="pre">html</span></code> del Makefile:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">user:g2-progetto/docs$ </span>make html
</pre></div>
</div>
</div>
<div class="section" id="compilazione-con-windows-powershell">
<h2>Compilazione con Windows Powershell<a class="headerlink" href="#compilazione-con-windows-powershell" title="Link a questa intestazione"></a></h2>
<p>È possibile compilare manualmente la documentazione con Windows Powershell.</p>
<p>Come prima cosa, è necessario <a class="reference internal" href="../installation/index.html#installare-le-dipendenze-python"><span class="std std-ref">Installare le dipendenze Python</span></a> del progetto:</p>
<div class="highlight-doscon notranslate"><div class="highlight"><pre><span></span><span class="gp">g2-progetto&gt;</span> poetry install
</pre></div>
</div>
<p>Poi, si entri allinterno del virtual environment:</p>
<div class="highlight-doscon notranslate"><div class="highlight"><pre><span></span><span class="gp">g2-progetto&gt;</span> poetry shell
</pre></div>
</div>
<p>Una volta allinterno del venv, si entri nella cartella della documentazione:</p>
<div class="highlight-doscon notranslate"><div class="highlight"><pre><span></span><span class="gp">g2-progetto&gt;</span> <span class="k">cd</span> docs
</pre></div>
</div>
<p>Infine, si esegua lo script <code class="docutils literal notranslate"><span class="pre">make.bat</span></code> con il parametro <code class="docutils literal notranslate"><span class="pre">html</span></code>:</p>
<div class="highlight-doscon notranslate"><div class="highlight"><pre><span></span><span class="gp">g2-progetto/docs&gt;</span> make html
</pre></div>
</div>
</div>
</div>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../backend/index.html" class="btn btn-neutral float-right" title="nest_backend - Web API in Python" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
<a href="../installation/index.html" class="btn btn-neutral float-left" title="Installazione" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<p>
&#169; Copyright 2021, Gruppo 2.
</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

Binary file not shown.

View file

@ -51,7 +51,7 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<div class="wy-side-nav-search" style="background: #3B7097" >
@ -86,11 +86,22 @@
<p class="caption"><span class="caption-text">Manuale</span></p>
<p class="caption"><span class="caption-text">Manuale utente</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="about/index.html">Il progetto</a></li>
<li class="toctree-l1"><a class="reference internal" href="installation/index.html">Installazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Guida sviluppatore</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="meta/index.html">Meta-documentazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Compendio del progetto</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="development/client/index.html">Feedback ricevuto dal cliente</a></li>
<li class="toctree-l1"><a class="reference internal" href="development/stats/index.html">Statistiche di Gitinspector</a></li>
<li class="toctree-l1"><a class="reference internal" href="development/log.html">Registro attività</a></li>
<li class="toctree-l1"><a class="reference internal" href="development/tools.html">Strumenti utilizzati</a></li>
</ul>
<p class="caption"><span class="caption-text">Documentazione autogenerata</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="backend/index.html"><code class="docutils literal notranslate"><span class="pre">nest_backend</span></code> - Web API in Python</a></li>
@ -196,6 +207,11 @@
<td>&#160;&#160;&#160;
<a href="backend/index.html#module-nest_backend.gestione"><code class="xref">nest_backend.gestione</code></a></td><td>
<em></em></td></tr>
<tr>
<td></td>
<td>
<a href="crawler/index.html#module-nest_crawler"><code class="xref">nest_crawler</code></a></td><td>
<em></em></td></tr>
</table>

View file

@ -51,7 +51,7 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<div class="wy-side-nav-search" style="background: #3B7097" >
@ -86,11 +86,22 @@
<p class="caption"><span class="caption-text">Manuale</span></p>
<p class="caption"><span class="caption-text">Manuale utente</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="about/index.html">Il progetto</a></li>
<li class="toctree-l1"><a class="reference internal" href="installation/index.html">Installazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Guida sviluppatore</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="meta/index.html">Meta-documentazione</a></li>
</ul>
<p class="caption"><span class="caption-text">Compendio del progetto</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="development/client/index.html">Feedback ricevuto dal cliente</a></li>
<li class="toctree-l1"><a class="reference internal" href="development/stats/index.html">Statistiche di Gitinspector</a></li>
<li class="toctree-l1"><a class="reference internal" href="development/log.html">Registro attività</a></li>
<li class="toctree-l1"><a class="reference internal" href="development/tools.html">Strumenti utilizzati</a></li>
</ul>
<p class="caption"><span class="caption-text">Documentazione autogenerata</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="backend/index.html"><code class="docutils literal notranslate"><span class="pre">nest_backend</span></code> - Web API in Python</a></li>

File diff suppressed because one or more lines are too long

View file

@ -32,7 +32,8 @@ release = '0.1.0'
extensions = [
"sphinx.ext.autodoc",
"sphinx.ext.intersphinx",
'sphinx.ext.todo',
"sphinx.ext.todo",
"sphinx.ext.autosectionlabel",
]
# Add any paths that contain templates here, relative to this directory.
@ -63,12 +64,18 @@ nitpicky = True
# a list of builtin themes.
html_theme = 'sphinx_rtd_theme'
html_theme_options = {
"style_nav_header_background": "#3B7097"
}
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# -- Intersphinx options -----------------------------------------------------
intersphinx_mapping = {

View file

@ -1,2 +1,4 @@
``nest_crawler`` - Crawler in Python
====================================
.. automodule:: nest_crawler

Binary file not shown.

View file

@ -0,0 +1,20 @@
Feedback ricevuto dal cliente
=============================
Documenti
---------
- :download:`Descrizione iniziale del prodotto <0-initial.pdf>`
Consegna degli Sprint
---------------------
.. todo::
Aggiungere i documenti degli sprint mancanti!
- :download:`Sprint 0 <0-sprint-requirements.pdf>`
- :download:`Sprint 1`
- :download:`Sprint 2`
- :download:`Sprint 3`

View file

@ -0,0 +1,792 @@
Registro attività
=================
.. todo::
Mettere titoli personali uguali in tutti gli sprint per consistenza.
Sprint 0
--------
Riunioni collettive
^^^^^^^^^^^^^^^^^^^
.. list-table::
:header-rows: 1
* - Data
- Ora
- Durata
- Attività
* - 2021-04-08
- 20:45
- 1h
- Analisi documento di specifiche
* - 2021-04-09
- 14:15
- 35m
- Intervista con il cliente
* - 2021-04-09
- 15:00
- 1h
- Resoconto intervista
* - 2021-04-11
- 15:03
- 2h 39m
- Documentazione e planning poker
* - 2021-04-15
- 18:15
- 52m
- Documentazione
* - 2021-04-17
- 15:05
- 4h
- Documentazione e partita a Scrumble
Attività individuali
^^^^^^^^^^^^^^^^^^^^
Stefano Goldoni - Product Owner
"""""""""""""""""""""""""""""""
.. list-table::
:header-rows: 1
* - Data
- Durata
- Attività
* - 2021-04-08
- 1.0h
- user stories
* - 2021-04-09
- 1.0h
- epic
* - 2021-04-10
- 0.5h
- use cases
* - 2021-04-11
- 0.5h
- use cases
* - 2021-04-14
- 0.5h
- documentazione SRS
* - 2021-04-15
- 0.5h
- documentazione SRS
* - 2021-04-17
- 1.5h
- diagrammi di attività
Flavia Cocca - Scrum Master
"""""""""""""""""""""""""""
.. list-table::
:header-rows: 1
* - Data
- Durata
- Attività
* - 2021-04-08
- 2.5h
- brainstorming Ui
* - 2021-04-10
- 2.0h
- creazione frame in figma con relativo css
* - 2021-04-11
- 1.5h
- mockup UI con relativo css (creazione componenti)
* - 2021-04-12
- 1.5h
- mockup UI con relativo css (creazione componenti)
* - 2021-04-14
- 3.0h
- mockup UI con relativo css (creazione pagine)
* - 2021-04-15
- 2.0h
- mockup UI con relativo css (creazioni pagine)
* - 2021-04-16
- 2.0h
- ultimi ritocchi UI
* - 2021-04-17
- 0.5h
- Stesura documentazione partita scrumble
Chiara Calzolari - UI/UX Designer
"""""""""""""""""""""""""""""""""
.. list-table::
:header-rows: 1
* - Data
- Durata
- Attività
* - 2021-04-09
- 2.5h
- Brainstorming UI
* - 2021-04-10
- 1.5h
- mockup UI con relativo css (dashboard ed elenco repositories)
* - 2021-04-11
- 1.0h
- mockup UI con relativo css (settings)
* - 2021-04-11
- 0.5h
- Prima versione del logo
* - 2021-04-12
- 3.0h
- mockup UI con relativo css (creazione componenti, light/dark mode)
* - 2021-04-13
- 1.0h
- mockup UI con relativo css (alerts)
* - 2021-04-15
- 1.0h
- Versione definitiva del logo
* - 2021-04-16
- 0.5h
- mockup UI con relativo css (Notifications e Share)
* - 2021-04-17
- 1.0h
- Documentazione Mockup
* - 2021-04-17
- 0.5h
- Doppiaggio video di presentazione
Stefano Pigozzi - Frontend Developer & Sysadmin
"""""""""""""""""""""""""""""""""""""""""""""""
.. todo:: Compilare con i dati di Toggl!
Sprint 1
--------
Riunioni collettive
^^^^^^^^^^^^^^^^^^^
.. list-table::
:header-rows: 1
* - Data
- Ora
- Durata
- Attività
* - 2021-05-01
- 15:30
- 2h
- backlog grooming session
Attività individuali
^^^^^^^^^^^^^^^^^^^^
Stefano Goldoni - Product Owner
"""""""""""""""""""""""""""""""
.. list-table::
:header-rows: 1
* - Data
- Durata
- Attività
* - 2021-04-20
- 0.5h
- analisi test
* - 2021-04-20
- 1.5h
- scrittura test cases
* - 2021-04-26
- 0.5h
- predisposizione progetto in locale per il test
* - 2021-04-26
- 2.0h
- metodi di test login e creazione utente
* - 2021-04-28
- 2.0h
- metodi ti test
* - 2021-04-29
- 2.0h
- metodi di test
* - 2021-04-30
- 2.0h
- metodi di test backend
* - 2021-05-01
- 1.0h
- test frontend
* - 2021-05-01
- 1.0h
- test backend in pair programming
* - 2021-05-02
- 1.0h
- documentazione
* - 2021-05-02
- 2.5h
- test backend
Giovanni Anniballi - Tester
"""""""""""""""""""""""""""
Per il lavoro di testing è stata utilizzata anche la tecnica del Pair Programming, grazie ad un plugin dell'IDE utilizzato.
.. list-table::
:header-rows: 1
* - Data
- Durata
- Attività
* - 2021-04-22
- 0.5h
- Riunione con il team
* - 2021-04-23
- 1.0h
- Studio struttura del backend
* - 2021-04-24
- 1.5h
- Studio del backend, volto a capire il funzionamento delle varie API
* - 2021-04-26
- 2.0h
- Testing login e retrieval dei dati inerenti a tutti gli utenti registrati
* - 2021-04-27
- 1.0h
- Testing creazione user
* - 2021-04-28
- 2.0h
- Test cancellazione utente e ritorno dei dati inerenti a quellutente
* - 2021-04-29
- 1.5h
- Test modica utenti e creazione della prima repository
* - 2021-04-30
- 2.0h
- Testing ritorno di tutte le repository di proprietà dellutente loggato, ritorno delle info inerenti alla repository specificata
* - 2021-05-01
- 3.0h
- Riunione con il team per sprint review e sprint retrospective(2h). Testing modifica ed eliminazione di una repository (nome, stato)
* - 2021-05-02
- 2.0h
- Testing del frontend tramite UI, controllo generale dei test già effettuati.
Giorgio Minoccari - Sviluppatore Backend
""""""""""""""""""""""""""""""""""""""""
Durante lo sprint ho principalmente svolto sviluppo e test riguardo alla API di twitter, in modo da poter effettuare chiamate efficenti e non venire limitati dal sito riguardo alle richieste effettuate.
.. list-table::
:header-rows: 1
* - Data
- Durata
- Attività
* - 2021-04-21
- 1.0h
- Primi test riguardo autenticazione Oauth per API twitter
* - 2021-04-23
- 1.5h
- Autenticazione funzionante
* - 2021-04-24
- 0.5h
- Test su ricerche generali con parole chiave
* - 2021-04-26
- 1.0h
- Test su ricerche geolocalizzate
* - 2021-04-27
- 1.0h
- Definizione di entita' di esempio nei database per provare funzioni legate ad esse
* - 2021-04-28
- 2.0h
- Definizione di funzioni per l'aggregazione di condizioni di diverso tipo per la ricerca di tweet tramite API
* - 2021-04-29
- 1.0h
- Refactor codice scritto fino a quel momento, eliminazione di dati inutili
* - 2021-05-01
- 1.0h
- Implementazioni di analisi su termini e hashtag restituiti dall'API
* - 2021-05-02
- 1.0h
- Test di chiamata alle funzioni di ricerca a partire da repository con condizioni complesse aggregate
Lorenzo Balugani - Developer
""""""""""""""""""""""""""""
.. list-table::
:header-rows: 1
* - Data
- Durata
- Attività
* - 2021-04-21
- 2.0h
- Implementazione Base di Dati
* - 2021-04-22
- 2.0h
- Login, creazione utenti
* - 2021-04-25
- 1.0h
- Rimozione utenti, CORS, Creazione repo
* - 2021-04-25
- 3.0h
- Altre funzioni API
* - 2021-04-26
- 0.5h
- Standardizzazione output json
* - 2021-04-26
- 1.0h
- Documentazione
* - 2021-04-27
- 0.5h
- Aggiunto supporto al modulo explorer, fix
* - 2021-04-28
- 0.5h
- Bugfixing
* - 2021-04-29
- 1.0h
- Gestione migliorata errori
* - 2021-04-29
- 1.0h
- Refactoring
* - 2021-05-02
- 1.0h
- Bugfixing
FLavia Cocca - Scrum Master
"""""""""""""""""""""""""""
.. list-table::
:header-rows: 1
* - Data
- Durata
- Attività
* - 2021-04-27
- 1.0h
- modifica mockup UI
* - 2021-04-28
- 1.0h
- Organizzazione Sprint retrospective
* - 2021-04-30
- 1.0h
- modifica mockup UI
* - 2021-05-01
- 2.0h
- Riunione con il team per sprint review e sprint retrospective
* - 2021-05-02
- 3.0h
- Stesura documenti Sprint1(debito tecnico e relazione sprint retrospective), realizzazione video Sprint1 review
Chiara Calzolari - UI Designer
""""""""""""""""""""""""""""""
.. list-table::
:header-rows: 1
* - Data
- Durata
- Attività
* - 2021-04-26
- 3.0h
- Configurazione ambiente di sviluppo
* - 2021-04-27
- 1.0h
- modifica mockup UI (adeguamento al JS)
* - 2021-04-29
- 2.0h
- modifica mockup UI (Manage users)
* - 2021-05-01
- 0.5h
- Ultimi ritocchi al mockup UI
Stefano Pigozzi - Frontend Developer
""""""""""""""""""""""""""""""""""""
.. todo:: Compilare con i dati di Toggl!
Sprint 2
--------
Riunioni collettive
^^^^^^^^^^^^^^^^^^^
.. list-table::
:header-rows: 1
* - Data
- Ora
- Durata
- Attività
* - 2021-05-14
- 10:00
- 1.0h
- Sprint Retrospective session
Attività individuali
^^^^^^^^^^^^^^^^^^^^
Chiara Calzolari - UI Designer
""""""""""""""""""""""""""""""
.. list-table::
:header-rows: 2
* - Data
- Durata
- Attività
* -
- 11.0h
- Totale
* - 2021-05-03
- 1.0h
- Testing frontend e segnalazione issues
* - 2021-05-03
- 1.0h
- Modifica mockup UI (Dashboard repository)
* - 2021-05-04
- 1.0h
- Modifica mockup UI (adeguamento al JS)
* - 2021-05-10
- 3.0h
- Configurazione ambiente di sviluppo
* - 2021-05-11
- 1.5h
- Modifica UI (traduzione in Italiano)
* - 2021-05-12
- 0.5h
- Modifica UI (traduzione in Italiano)
* - 2021-05-14
- 3.0h
- Realizzazione video demo sprint 2
Stefano Goldoni - Product Owner & Tester
""""""""""""""""""""""""""""""""""""""""
.. list-table::
:header-rows: 2
* - Data
- Durata
- Attività
* -
- 16.0h
- Totale
* - 2021-05-04
- 1.0h
- preparazione backlog sprint 2
* - 2021-05-10
- 3.0h
- test sprint 2
* - 2021-05-11
- 2.5h
- test utenti e repository
* - 2021-05-12
- 2.0h
- test repository
* - 2021-05-13
- 2.5h
- test repository
* - 2021-05-14
- 3.0h
- test conditions
* - 2021-05-15
- 2.0h
- test conditions + sonarqube scanner
Lorenzo Balugani - DB & Backend Developer
"""""""""""""""""""""""""""""""""""""""""
.. list-table::
:header-rows: 2
* - Data
- Durata
- Attività
* -
- 19.0h
- Totale
* - 2021-05-05
- 4.0h
- Setup di swagger, documentazione
* - 2021-05-06
- 4.0h
- Documentazione, sviluppo
* - 2021-05-07
- 3.0h
- Alert, documentazione
* - 2021-05-10
- 2.0h
- Alert Put, bugfixing
* - 2021-05-11
- 3.0h
- Bugfixing, sviluppo
* - 2021-05-12
- 3.0h
- Risolti issue pubblicati su Taiga
* - 2021-05-13
- 1.0h
- Bugfixing
* - 2021-05-14
- 1.0h
- Bugfixing
Stefano Pigozzi - Sysadmin & Frontend Developer
"""""""""""""""""""""""""""""""""""""""""""""""
.. list-table::
:header-rows: 2
* - Data
- Durata
- Attività
* -
- 27.5h
- Totale
* - 2021-05-05
- 0.40h
- Riunione
* - 2021-05-05
- 0.21h
- Documentazione
* - 2021-05-06
- 0.09h
- Sviluppo
* - 2021-05-06
- 0.03h
- Configurazione Taiga
* - 2021-05-06
- 0.11h
- Documentazione
* - 2021-05-06
- 0.09h
- Riunione
* - 2021-05-06
- 0.20h
- Documentazione
* - 2021-05-06
- 0.39h
- Sviluppo
* - 2021-05-06
- 0.15h
- Riunione
* - 2021-05-06
- 1.04h
- Riunione
* - 2021-05-07
- 1.47h
- Sviluppo
* - 2021-05-07
- 0.17h
- Sviluppo
* - 2021-05-07
- 0.34h
- Sviluppo
* - 2021-05-07
- 0.34h
- Project management
* - 2021-05-07
- 2.44h
- Sviluppo
* - 2021-05-08
- 0.13h
- Sviluppo
* - 2021-05-08
- 0.29h
- Sviluppo
* - 2021-05-08
- 0.18h
- Sviluppo
* - 2021-05-10
- 1.00h
- Sviluppo
* - 2021-05-10
- 1.15h
- Configurazione GitLab
* - 2021-05-10
- 0.25h
- Sviluppo
* - 2021-05-10
- 0.39h
- Sviluppo
* - 2021-05-11
- 0.25h
- Bugfixing
* - 2021-05-11
- 3.57h
- Sviluppo
* - 2021-05-11
- 1.45h
- Sviluppo
* - 2021-05-12
- 0.10h
- Sviluppo
* - 2021-05-12
- 1.51h
- Sviluppo
* - 2021-05-13
- 1.00h
- Sviluppo
* - 2021-05-13
- 1.20h
- Sviluppo
* - 2021-05-14
- 0.20h
- Sviluppo
* - 2021-05-15
- 3.17h
- Documentazione
Flavia Cocca - Scrum Master & UI Designer
"""""""""""""""""""""""""""""""""""""""""
.. list-table::
:header-rows: 2
* - Data
- Durata
- Attività
* -
- 16.0h
- Totale
* - 2021-05-04
- 0.5h
- Riunione per con PO, nuovo backlog
* - 2021-05-05
- 1.0h
- Riunione
* - 2021-05-07
- 3.0h
- Refactoring test
* - 2021-05-08
- 2.0h
- Refactoring test
* - 2021-05-09
- 3.0h
- Nuovi test
* - 2021-05-11
- 2.5h
- Discussione test e risoluzione di alcune issue
* - 2021-05-13
- 1.0h
- Bugfixing
* - 2021-05-14
- 1.0h
- Sprint Retrospective
* - 2021-05-15
- 2.0h
- Documentazione
Giovanni Anniballi - Tester
"""""""""""""""""""""""""""
.. list-table::
:header-rows: 2
* - Data
- Durata
- Attività
* -
- 17.0h
- Totale
* - 2021-05-04
- 0.5h
- Incontro con SM e PO per valutare quali US andranno nello sprint2
* - 2021-05-05
- 1.0h
- Incontro con il team
* - 2021-05-07
- 2.0h
- Refactoring tests sugli user e primi utilizzi delle fixtures
* - 2021-05-08
- 2.0h
- Completamento test users
* - 2021-05-10
- 1.0h
- Ulteriori approcci (fallimentari) al coverage di SonarQube
* - 2021-05-11
- 2.0h
- Discussione sui test e correzioni bug
* - 2021-05-12
- 1.0h
- Test repository
* - 2021-05-13
- 1.0h
- Generazione coverage pytest e setting sonarqube (riuscito!)
* - 2021-05-14
- 4.0h
- Sprint review e retrospettiva, conclusione test repository
* - 2021-05-15
- 2.5h
- generazione nuovo coverage e fix a sonarqube 2h, fix piccoli bug segnalati da sonarqube 0.5h
Giorgio Minoccari - Analyst & Backend Developer
"""""""""""""""""""""""""""""""""""""""""""""""
.. list-table::
:header-rows: 2
* - Data
- Durata
- Attività
* -
- 10.0h
- Totale
* - 2021-05-04
- 0.5h
- Aggiunta della condizione sull'utente
* - 2021-05-10
- 2.0h
- Tentativo di inserimento delle query con place_id
* - 2021-05-11
- 1.5h
- Test per passare alla versione 2.0 delle API
* - 2021-05-12
- 1.0h
- Ritorno alla versione 1.1 perche' lascia disponibili le query sulla geolocalizzazione gratuitamente
* - 2021-05-14
- 5.0h
- Integrazione e inserimento dei tweet catturati nel database
Sprint 3
--------
.. todo::
Compilare il registro attività dello sprint 3.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,20 @@
Statistiche di Gitinspector
===========================
Queste statistiche sono state generate dal prof. Missiroli con `Gitinspector <https://github.com/ejwa/gitinspector>`_.
.. note::
Le statistiche probabilmente sono molto inaccurate, in quanto Gitinspector sembra tenere conto anche delle directory
contenenti file vendored, come ``docs/build``.
.. todo::
Aggiungere le statistiche degli sprint mancanti!
- :download:`Sprint 0 <0-stats.html>`
- :download:`Sprint 1 <1-stats.html>`
- :download:`Sprint 2 (codice) <2-stats.html>`
- :download:`Sprint 2 (documentazione) <2D-stats.html>`
- :download:`Sprint 3 (codice) <3-stats.html>`
- :download:`Sprint 3 (documentazione) <3D-stats.html>`

View file

@ -0,0 +1,3 @@
Strumenti utilizzati
====================

View file

@ -5,12 +5,29 @@ Benvenuto alla documentazione di N.E.S.T.!
.. toctree::
:maxdepth: 2
:caption: Manuale
:caption: Manuale utente
about/index
installation/index
.. toctree::
:maxdepth: 2
:caption: Guida sviluppatore
meta/index
.. toctree::
:maxdepth: 2
:caption: Compendio del progetto
development/client/index
development/stats/index
development/log
development/tools
.. toctree::
:caption: Documentazione autogenerata

View file

@ -113,8 +113,8 @@ Le dipendenze Python sono gestite da *Poetry*, e possono essere installate con:
Poetry creerà automaticamente un `venv <https://docs.python.org/3/library/venv.html>`_ e vi installerà all'interno tutti
i pacchetti necessari all'esecuzione del backend e del crawler di N.E.S.T. .
**Segnatevi il nome** del venv creato da Poetry, in quanto sarà necessario per
:ref:`creare un servizio SystemD per il backend`:
**Si suggerisce di ricordare il nome del venv creato da Poetry**, in quanto sarà necessario per
:ref:`Creare un servizio SystemD per il backend`:
.. code-block:: console

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

View file

@ -0,0 +1,84 @@
Meta-documentazione
===================
La documentazione è scritta in `reStructuredText <https://docutils.sourceforge.io/rst.html>`_, ed è generata con
`Sphinx <https://www.sphinx-doc.org/en/master/>`_.
I dati relativi alla documentazione si trovano nella directory standard ``/docs``;
in particolare, le sorgenti reStructuredText si trovano in ``/docs/source``,
mentre l'ultima versione compilata si trova in ``/docs/build``.
Questa struttura permetterebbe l'integrazione con lo strumento di "Continuous Documentation"
`ReadTheDocs <https://readthedocs.com/>`_, qualora il progetto fosse ospitato su GitHub o disponessimo di una licenza
almeno `Basic <https://readthedocs.com/pricing/>`_.
Compilazione con IntelliJ IDEA
------------------------------
È possibile compilare manualmente la documentazione con IntelliJ IDEA.
Su sistemi Linux, è disponibile la Run Configuration ``Docs``, che compilerà la versione HTML della documentazione se
eseguita.
.. image:: docsRunConfig.png
Compilazione con GNU Make
-------------------------
È possibile compilare manualmente la documentazione con GNU Make.
Come prima cosa, è necessario :ref:`Installare le dipendenze Python` del progetto:
.. code-block:: console
user:g2-progetto$ poetry install
Poi, si entri all'interno del virtual environment:
.. code-block:: console
user:g2-progetto$ poetry shell
Una volta all'interno del venv, si entri nella cartella della documentazione:
.. code-block:: console
user:g2-progetto$ cd docs
Infine, si esegua il target ``html`` del Makefile:
.. code-block:: console
user:g2-progetto/docs$ make html
Compilazione con Windows Powershell
-----------------------------------
È possibile compilare manualmente la documentazione con Windows Powershell.
Come prima cosa, è necessario :ref:`Installare le dipendenze Python` del progetto:
.. code-block:: doscon
g2-progetto> poetry install
Poi, si entri all'interno del virtual environment:
.. code-block:: doscon
g2-progetto> poetry shell
Una volta all'interno del venv, si entri nella cartella della documentazione:
.. code-block:: doscon
g2-progetto> cd docs
Infine, si esegua lo script ``make.bat`` con il parametro ``html``:
.. code-block:: doscon
g2-progetto/docs> make html

View file

@ -1,4 +0,0 @@
# Checklists
Le checklist con tutte le cose da fare (relative a Progetto del Software, non al prodotto) ad ogni Sprint saranno
disponibili qui.

View file

@ -0,0 +1,17 @@
217 Stefano Pigozzi <256895@studenti.unimore.it>
59 Lorenzo Balugani <lorenzo.balugani@gmail.com>
54 stefanogoldoni <stefanogoldoni@gmail.com>
26 Annielated <giovannianniballi@hotmail.com>
24 Flavia Cocca <253218@studenti.unimore.it>
17 Stefano Pigozzi <me@steffo.eu>
13 Stefano Goldoni <280712@studenti.unimore.it>
12 Giovanni Anniballi <253150@studenti.unimore.it>
11 Chiara Calzolari <258727@studenti.unimore.it>
10 g.minoccari <g.minoccari@gmail.com>
9 Lorenzo Balugani <256867@studenti.unimore.it>
5 FlaviaC-uni <80752618+FlaviaC-uni@users.noreply.github.com>
5 Giorgio Minoccari <261807@studenti.unimore.it>
4 Nemesis <lorenzo.balugani@gmail.com>
3 @uni-chiara <258727@studenti.unimore.it>
3 Prof. Missiroli (home) <prof.missiroli@gmail.com>
2 Marcello Missiroli <mmissiroli@unimore.it>

View file

@ -1,8 +0,0 @@
# Guida per sphinx
- Crea la cartella docs
- Entra nella cartella docs
- sphinx-quickstart --ext-autodoc
- Segui la procedura
- Modifica l'rst aggiungendo "modules" sotto la struttura ad albero e modifica config.py in modo che il path faccia
riferimento alla parent directory
- make html

View file

@ -1,13 +1,3 @@
# Log riunioni collettive dello Sprint 0
| Data | Ora | Durata | Attività |
|------|-----|--------|----------|
| 2021-04-08 | 20:45 | 1h | Analisi documento di specifiche |
| 2021-04-09 | 14:15 | 35m | Intervista con il cliente |
| 2021-04-09 | 15:00 | 1h | Resoconto intervista |
| 2021-04-11 | 15:03 | 2h 39m | Documentazione e planning poker |
| 2021-04-15 | 18:15 | 52m | Documentazione |
| 2021-04-17 | 15:05 | 4h | Documentazione e partita a Scrumble |
# Log attività individuali dello Sprint 0

View file

@ -21,6 +21,7 @@ class InputLoginSchema(Schema):
class ErrorSchema(Schema):
result = fields.String(description="Contains a string that informs if the procedure was successful.")
msg = fields.String(description="Contains a description of the error.")
code = fields.String(description="Error code")
class SuccesSchema(Schema):
@ -93,6 +94,9 @@ class CreateAlert(Schema):
name = fields.String(description="The name of the alert.")
limit = fields.Integer(description="The number of tweets in a time window.")
window_size = fields.Integer(description="The size of the time window.")
repository_id = fields.Integer(description="The id of the related repository.")
evaluation_mode = fields.Integer(description="How the conditions have to be evaluated.")
conditions = fields.Nested(ConditionSchema, many=True)
class Operations(Schema):
@ -117,8 +121,8 @@ class Alert(Schema):
limit = fields.Integer(description="The number of tweets in a time window.")
window_size = fields.Integer(description="The size of the time window.")
repository_id = fields.Integer(description="The id of the related repository.")
operations = fields.Nested(Operations, many=True)
root_operation = fields.Nested(Operations, many=False)
evaluation_mode = fields.Integer(description="How the conditions have to be evaluated.")
conditions = fields.Nested(ConditionSchema, many=True)
notifications = fields.Nested(Notification, many=True)

View file

@ -3,6 +3,7 @@ This module defines the Alert database class.
"""
from ..base import ext
from .Enums import ConditionMode
class Alert(ext.Model):
@ -11,12 +12,13 @@ class Alert(ext.Model):
name = ext.Column(ext.String, nullable=False)
limit = ext.Column(ext.Integer, nullable=False)
window_size = ext.Column(ext.Integer, nullable=False)
evaluation_mode = ext.Column(ext.Enum(ConditionMode), nullable=False, default=ConditionMode.all_or)
# Foreign Keys
repository_id = ext.Column(ext.Integer, ext.ForeignKey("repository.id", ondelete="CASCADE"), nullable=False)
# Relationships
repository = ext.relationship("Repository", back_populates="alerts")
notifications = ext.relationship("Notification", back_populates="alert")
operations = ext.relationship("BoolOperation", back_populates="alert")
conditions = ext.relationship("MadeOf", back_populates="alert")
def to_json(self):
return {
@ -25,8 +27,7 @@ class Alert(ext.Model):
'window_size': self.window_size,
'limit': self.limit,
'repository_id': self.repository_id,
'evaluation_mode': self.evaluation_mode.value,
'notifications': [notification.to_json() for notification in self.notifications],
'operations': [operation.to_json() for operation in self.operations],
'root_operation': [operation.to_json() for operation in self.operations if operation.is_root == True][
0] if self.operations else None
'conditions': [c.condition.to_json() for c in self.conditions]
}

View file

@ -1,45 +0,0 @@
"""
This module defines the BoolOperation database class.
"""
from ..base import ext
from .Enums import OperationType
from sqlalchemy.orm import backref
class BoolOperation(ext.Model):
__tablename__ = "bool_operation"
id = ext.Column(ext.Integer, primary_key=True)
operation = ext.Column(ext.Enum(OperationType), nullable=False)
is_root = ext.Column(ext.Boolean, default=False, nullable=False)
# Foreign Keys
condition_id = ext.Column(ext.Integer, ext.ForeignKey("condition.id"))
node_1_id = ext.Column(ext.Integer, ext.ForeignKey("bool_operation.id", ondelete="SET NULL"))
node_2_id = ext.Column(ext.Integer, ext.ForeignKey("bool_operation.id", ondelete="SET NULL"))
alert_id = ext.Column(ext.Integer, ext.ForeignKey("alert.id", ondelete="CASCADE"))
# Relationships
condition = ext.relationship("Condition", back_populates="operations")
node_1 = ext.relationship("BoolOperation", primaryjoin=("bool_operation.c.node_1_id==bool_operation.c.id"),
remote_side="BoolOperation.id", backref=backref("father_1", uselist=False))
node_2 = ext.relationship("BoolOperation", primaryjoin=("bool_operation.c.node_2_id==bool_operation.c.id"),
remote_side="BoolOperation.id", backref=backref("father_2", uselist=False))
alert = ext.relationship("Alert", back_populates="operations")
def to_json(self):
return {"id": self.id,
"operation": self.operation,
"is_root": self.is_root,
"alert_id": self.alert_id,
"condition": self.condition.to_json() if self.condition else None,
"node_1": self.node_1.to_json() if self.node_1 else None,
"node_2": self.node_2.to_json() if self.node_2 else None
}
def get_chain_ids(self, lista):
if self.id in lista:
# Loop detected!
return -1
lista.append(self.id)
self.node_1.get_chain_ids(lista)
self.node_1.get_chain_ids(lista)

View file

@ -16,7 +16,7 @@ class Condition(ext.Model):
# Relationships
repository = ext.relationship("Repository", back_populates="conditions")
tweets = ext.relationship("Contains", back_populates="condition")
operations = ext.relationship("BoolOperation", back_populates="condition")
alerts = ext.relationship("MadeOf", back_populates="condition")
def to_json(self):
return {

View file

@ -0,0 +1,14 @@
"""
This module defines the MadeOf database class.
"""
from ..base import ext
class MadeOf(ext.Model):
__tablename__ = "made_of"
aid = ext.Column(ext.Integer, ext.ForeignKey("alert.id", ondelete="CASCADE"), primary_key=True)
cid = ext.Column(ext.Integer, ext.ForeignKey("condition.id"), primary_key=True)
# Relationships
alert = ext.relationship("Alert", back_populates="conditions")
condition = ext.relationship("Condition", back_populates="alerts")

View file

@ -4,7 +4,6 @@ This module contains all database classes.
from .Alert import Alert
from .Authorization import Authorization
from .BoolOperation import BoolOperation
from .Composed import Composed
from .Condition import Condition
from .Contains import Contains
@ -12,4 +11,5 @@ from .Notification import Notification
from .Repository import Repository
from .Tweet import Tweet
from .User import User
from .MadeOf import MadeOf
from .Enums import ConditionType, OperationType, ConditionMode

27
nest_backend/errors.py Normal file
View file

@ -0,0 +1,27 @@
# User errors
USER_NOT_FOUND = "errorUserNotFound" # Could not find user
USER_WRONG_CREDENTIALS = "errorUserWrongCredentials" # User has given incorrect pair of credentials
USER_NOT_AUTHORIZED = "errorUserNotAuthorized" # User is not authorized to proceed
USER_NOT_ADMIN = "errorUserNotAdmin" # User is not an admin
USER_PREVENT_SEPPUKU = "errorUserPreventSeppuku" # User cannot delete himself
USER_DELETION_ERROR = "errorDeletionError" # Something is preventing the deletion of the user
# Generic
GENERIC_NOT_FOUND = "errorNotFound" # Generic 404
GENERIC_MISSING_FIELDS = "errorMissingFields" # Generic 400
GENERIC_ALREADY_EXISTS = "errorAlreadyExists" # Generic primary key error
GENERIC_ENUM_INVALID = "errorEnumInvalid" # The given integer is not a valid one
GENERIC_UFO = "errorUnknownError" # The classic 'the hell is this' error
GENERIC_NO_JSON = "errorNoJson" # No JSON was given
# Repository
REPOSITORY_NOT_FOUND = "errorRepositoryNotFound" # Repository not found
REPOSITORY_NOT_OWNER = "errorRepositoryNotOwner" # The user is not the repository owner
REPOSITORY_DEPENDENCY_FAILURE = "errorRepositoryDepencencyFailure" # Something is preventing the repo to go away
# Conditions
CONDITION_NOT_FOUND = "errorConditionNotFound" # Condition not found.
# Alerts
ALERT_NOT_FOUND = "errorAlertNotFound" # Alert not found
ALERT_NO_NAME = "errorAlertNoName" # Missing name entry
ALERT_NO_LIMIT = "errorAlertNoLimit" # Missing limit entry
ALERT_NO_WINDOW = "errorAlertNoWindow" # Missing window entry
ALERT_NO_EVALUATION = "errorAlertNoEvaluation" # Missing evalmode entry
ALERT_DELETION_FAILURE = "errorAlertDeletionFailure" # Error while deleting alerts

View file

@ -8,6 +8,7 @@ import functools
from flask_jwt_extended import get_jwt_identity
from flask import jsonify
from re import sub
from .errors import GENERIC_UFO
__all__ = ["authenticate", "identity", "gen_password", "find_user", "admin_or_403",
"repository_auth", "json_request_authorizer", "json_error",
@ -84,13 +85,14 @@ def repository_auth(f):
return func
def json_error(msg):
def json_error(msg, code=GENERIC_UFO):
"""
Returns an error in json format
:param code: the code of the error according to the spec.
:param msg: the error message.
:return: a json formatted string.
"""
return jsonify({"result": "failure", 'msg': msg})
return jsonify({"result": "failure", 'msg': msg, 'code':code})
def json_success(data):

View file

@ -4,6 +4,7 @@ from flask_jwt_extended import jwt_required, get_jwt_identity
from nest_backend.gestione import *
from flask_cors import cross_origin
import datetime
from nest_backend.errors import *
@cross_origin()
@ -113,16 +114,14 @@ def page_alert(aid):
"""
user = find_user(get_jwt_identity())
alert = Alert.query.filter_by(id=aid).first()
if alert.repository_id not in user.owner_of:
return json_error("The user is not authorized."), 403
if not alert:
return json_error("Could not find alert."), 404
return json_error("Could not find alert.", ALERT_NOT_FOUND), 404
if alert.repository not in [a.repository for a in user.authorizations] + user.owner_of:
return json_error("You are not authorized to proceed."), 403
return json_error("You are not authorized to proceed.", USER_NOT_AUTHORIZED), 403
if request.method == "GET":
return json_success(alert.to_json()), 200
if alert.repository not in user.owner_of:
return json_error("You are not authorized to proceed."), 403
return json_error("You are not authorized to proceed.", REPOSITORY_NOT_OWNER), 403
if request.method == "PATCH":
if 'name' in request.json:
alert.name = request.json['name']
@ -130,6 +129,13 @@ def page_alert(aid):
alert.limit = request.json['limit']
if 'window_size' in request.json:
alert.window_size = request.json['window_size']
if 'evaluation_mode' in request.json:
try:
alert.evaluation_mode = ConditionMode(request.json['evaluation_mode'])
except KeyError:
return json_error("Unknown `type` specified.", GENERIC_ENUM_INVALID), 400
except Exception as e:
return json_error("Unknown error:" + str(e), GENERIC_UFO), 400
ext.session.commit()
return json_success(alert.to_json()), 204
elif request.method == "DELETE":
@ -137,88 +143,38 @@ def page_alert(aid):
ext.session.delete(alert)
ext.session.commit()
except Exception:
return json_error("Something went wrong while deleting alert."), 500
return json_error("Something went wrong while deleting alert.", ALERT_DELETION_FAILURE), 500
return json_success("Deletion completed."), 204
elif request.method == "PUT":
if not json_request_authorizer(request.json, alert):
return json_error("Missing one or more parameters in repository json."), 400
return json_error("Missing one or more parameters in repository json.", GENERIC_MISSING_FIELDS), 400
alert.limit = request.json['limit']
alert.name = request.json['name']
alert.window_size = request.json['window_size']
root_id = alert.to_json()['root_operation']['id']
root = BoolOperation.filter_by(id=root_id).first()
if not root:
return json_error("Could not find original root element."), 404
# No longer used chain element deletion
l = []
bool_list = root.get_chains_ids(l)
for element in alert.operations:
if element.id not in bool_list:
if element.id == root.id:
root = None
ext.session.delete(element)
if (mode := request.json.get("evaluation_mode")) is not None:
try:
alert.evaluation_mode = ConditionMode(mode)
except KeyError:
return json_error("Unknown `type` specified.", GENERIC_ENUM_INVALID), 400
except Exception as e:
return json_error("Unknown error:" + str(e), GENERIC_UFO), 400
if request.json['conditions'] is not None:
# Possibile vulnearabilità! Un utente potrebbe aggiungere conditions non del suo repo!
for c in request.json['conditions']:
if c['id'] not in alert.repository.conditions:
return json_error("Stop! You violated the law!", USER_NOT_AUTHORIZED), 403
# Wow very pythonic so much wow
# Obtain list of no longer needed connections
to_be_deleted = [c.cid for c in alert.conditions if
c.cid not in [json['id'] for json in request.json['conditions']]]
# RIP AND TEAR UNTIL ITS DONE
for elem in to_be_deleted:
conn = MadeOf.query.filter_by(cid=elem, aid=alert.id).first()
if conn:
ext.session.delete(conn)
ext.session.commit()
for c in request.json['conditions']:
conn = MadeOf(cid=c['id'], aid=alert.id)
ext.session.add(conn)
ext.session.commit()
if request.json['root-operation'].get('id'): # If an alternative root is already present.
new_root_test = BoolOperation.filter_by(id=request.json['root_operation']['id']).first()
if new_root_test and new_root_test != root:
new_root_test.is_root = True
ext.session.commit()
else: # If the alternative root needs to be brand-new.
condition_id = None
if request.json['root_operation'].get('condition'): # Is the new alternative connected to a condition?
if not Condition.query.filter_by(id=request.json['root_operation']['condition']['id'],
repository_id=alert.repository_id).first():
return json_error("One of the provided IDs is incorrect."), 404
condition_id = request.json['root_operation']['condition']['id']
if (type_ := request.json['root-operation']['operation']) is not None:
try:
type_ = OperationType(type_)
except KeyError:
return json_error("Unknown `operation` specified."), 400
root = BoolOperation(operation=type_, is_root=True, alert_id=aid, condition_id=condition_id)
ext.session.add(root)
ext.session.commit()
root = BoolOperation.filter_by(id=request.json['root_operation']['id']).first()
try:
recursion(root, ext, request.json['root_operation'])
except FileNotFoundError:
return json_error("One of the provided IDs is incorrect"), 404
except KeyError:
return json_error("Unknown field specified."), 400
return json_success(alert.to_json()), 200
def create_node(node, ext, json, id):
# Check if the node already exists
id_1 = json[f'node_{id}']['id']
if id_1:
node_1 = BoolOperation.query.filter_by(id=id_1).first()
if not node_1:
raise FileNotFoundError
else:
# The node is new.
condition_id = None
if json[f'node_{id}'].get('condition'):
condition = Condition.query.filter_by(
id=json[f'node_{id}']['condition']['id']).filter(
Condition.repository_id == node.alert.repository_id).first()
if not condition:
raise FileNotFoundError
condition_id = condition.id
if (type_ := json[f'node_{id}']['operation']) is not None:
type_ = OperationType(type_)
else:
raise FileNotFoundError
# Create new node
node_1 = BoolOperation(operation=type_, is_root=False, condition_id=condition_id, alert_id=node.alert_id)
ext.session.add(node_1)
ext.session.commit()
# Recursion goes brr
recursion(node_1, ext, json['node_1'])
def recursion(node, ext, json):
if json.get('node_1'): # Create node 1
create_node(node, ext, json, 1)
if json.get('node_2'): # Create node 2
create_node(node, ext, json, 2)

View file

@ -3,6 +3,7 @@ from nest_backend.database import *
from flask_jwt_extended import jwt_required, get_jwt_identity
from nest_backend.gestione import *
from flask_cors import cross_origin
from nest_backend.errors import *
@cross_origin()
@ -69,24 +70,41 @@ def page_repository_alerts(rid):
repository = Repository.query.filter_by(id=rid).first()
if not repository:
return json_error("Could not find repository"), 404
return json_error("Could not find repository", REPOSITORY_NOT_FOUND), 404
user = find_user(get_jwt_identity())
if user.email != repository.owner_id:
return json_error("You are not authorized."), 403
return json_error("You are not authorized.", REPOSITORY_NOT_OWNER), 403
if request.method == "GET":
return json_success([alert.to_json() for alert in repository.alerts])
if request.method == "POST":
if 'name' not in request.json:
return json_error("Missing name."), 400
return json_error("Missing name.", ALERT_NO_NAME), 400
if 'limit' not in request.json:
return json_error('Missing limit'), 400
return json_error('Missing limit', ALERT_NO_LIMIT), 400
if 'window_size' not in request.json:
return json_error('Missing window size'), 400
return json_error('Missing window size', ALERT_NO_WINDOW), 400
if (mode := request.json.get("evaluation_mode")) is not None:
try:
mode = ConditionMode(mode)
except KeyError:
return json_error("Unknown `type` specified.", GENERIC_ENUM_INVALID), 400
except Exception as e:
return json_error("Unknown error:" + str(e), GENERIC_UFO), 400
else:
return json_error("Evaluation mode was not provided.", ALERT_NO_EVALUATION), 400
alert = Alert(name=request.json['name'], limit=request.json['limit'], window_size=request.json['window_size'],
repository_id=rid)
repository_id=rid, evaluation_mode=mode)
ext.session.add(alert)
ext.session.commit()
if request.json['conditions'] is not None:
for condition in request.json['conditions']:
c = Condition.query.filter_by(id=condition['id']).first()
if not c:
return json_error("Could not locate condition.", CONDITION_NOT_FOUND), 404
conn = MadeOf(aid=alert.id, cid=c.id)
ext.session.add(conn)
ext.session.commit()
return json_success(alert.to_json()), 201

View file

@ -3,6 +3,7 @@ from nest_backend.database import *
from flask_jwt_extended import jwt_required, get_jwt_identity
from nest_backend.gestione import *
from flask_cors import cross_origin
from nest_backend.errors import *
@cross_origin()
@ -106,25 +107,25 @@ def page_condition(cid):
condition = Condition.query.filter_by(id=cid).first()
user = find_user(get_jwt_identity())
if not condition:
return json_error("Could not find the condition."), 404
return json_error("Could not find the condition.", CONDITION_NOT_FOUND), 404
if condition.repository not in [a.repository for a in user.authorizations] + user.owner_of and not user.isAdmin:
return json_error("You lack the authorization to proceed, pal."), 403
return json_error("You lack the authorization to proceed, pal.", USER_NOT_AUTHORIZED), 403
if request.method == "GET":
return json_success(condition.to_json()), 200
if condition.repository not in user.owner_of and not user.isAdmin:
return json_error("You lack the authorization to proceed, pal."), 403
return json_error("You lack the authorization to proceed, pal.", USER_NOT_AUTHORIZED), 403
if request.method == "PATCH":
if request.json is None:
return json_error("Missing json content."), 400
return json_error("Missing json content.", GENERIC_NO_JSON), 400
if (type_ := request.json.get("type")) is not None:
try:
type_ = ConditionType(type_)
condition.type = type_
except KeyError:
return json_error("Unknown `type` specified."), 400
return json_error("Unknown `type` specified.", GENERIC_ENUM_INVALID), 400
except Exception as e:
return json_error("Unknown error:" + str(e)), 400
return json_error("Unknown error:" + str(e), GENERIC_UFO), 400
if content := request.json.get("content"):
condition.content = content

View file

@ -5,6 +5,7 @@ from nest_backend.gestione import repository_auth, json_error, json_success, Con
from nest_backend.database import ext
from flask_cors import cross_origin
from nest_backend.gestione import hashtag_validator
from nest_backend.errors import *
@cross_origin()
@ -74,34 +75,34 @@ def page_repository_conditions(rid):
repository = Repository.query.filter_by(id=rid).first()
if not repository:
return json_error("Could not find repository"), 404
return json_error("Could not find repository", REPOSITORY_NOT_FOUND), 404
user = find_user(get_jwt_identity())
if user.email != repository.owner_id:
return json_error("You are not authorized."), 403
return json_error("You are not authorized.", REPOSITORY_NOT_OWNER), 403
if request.method == "GET":
try:
return json_success([u.to_json() for u in repository.conditions])
except Exception as e:
return json_error("Unknown error:" + str(e)), 400
return json_error("Unknown error:" + str(e), GENERIC_UFO), 400
if request.method == "POST":
if request.json is None:
return json_error("Missing json content."), 400
return json_error("Missing json content.", GENERIC_NO_JSON), 400
if (type_ := request.json.get("type")) is None:
return json_error("Missing `type` parameter."), 400
return json_error("Missing `type` parameter.", GENERIC_MISSING_FIELDS), 400
try:
type_ = ConditionType(type_)
except KeyError:
return json_error("Unknown `type` specified."), 400
return json_error("Unknown `type` specified.", GENERIC_ENUM_INVALID), 400
except Exception as e:
return json_error("Unknown error: " + str(e)), 400
if not (content := request.json.get("content")):
return json_error("Missing `content` parameter."), 400
return json_error("Missing `content` parameter.", GENERIC_MISSING_FIELDS), 400
if type_ == ConditionType.hashtag:
content = hashtag_validator(content)
condition = Condition(content=content, type=type_, repository_id=rid)

View file

@ -4,6 +4,7 @@ from flask_jwt_extended import jwt_required, get_jwt_identity
from nest_backend.gestione import *
import datetime
from flask_cors import cross_origin
from nest_backend.errors import *
@cross_origin()
@ -75,23 +76,27 @@ def page_repositories():
# Users will be tolerated if they change parameters they're not supposed to touch. We'll ignore them for now.
if not request.json.get("name") or not request.json.get("conditions") or not str(
request.json.get("evaluation_mode")):
return json_error("Missing arguments."), 400
return json_error("Missing arguments.", GENERIC_MISSING_FIELDS), 400
name = request.json.get("name")
try:
evaluation_mode = ConditionMode(request.json['evaluation_mode'])
except: # KeyError
return json_error("Unknown `type` specified."), 400
except KeyError:
return json_error("Unknown `type` specified.", GENERIC_ENUM_INVALID), 400
repository = Repository(name=name, owner_id=user.email, is_active=False, evaluation_mode=evaluation_mode)
ext.session.add(repository)
ext.session.commit()
ids = [c['id'] for c in request.json['conditions'] if c['id']]
conditions = [c for c in repository.conditions if c.id not in [a['id'] for a in request.json['conditions'] if
a['id'] in [b.id for b in repository.conditions]]]
for c in conditions:
ext.session.delete(c)
ext.session.commit()
# Create brand new conditions
for c in request.json['conditions']:
if not c['id']:
try:
type_ = ConditionType(c['type'])
except KeyError:
return json_error("Unknown `type` specified."), 400
return json_error("Unknown `type` specified.", GENERIC_ENUM_INVALID), 400
ext.session.add(Condition(type=type_, content=c['content'], repository_id=repository.id))
ext.session.commit()
repository.is_active = True

View file

@ -4,7 +4,7 @@ from flask_jwt_extended import jwt_required, get_jwt_identity
from nest_backend.gestione import *
from flask_cors import cross_origin
import datetime
from nest_backend.errors import *
@cross_origin()
@ -156,12 +156,12 @@ def page_repository(rid):
user = find_user(get_jwt_identity())
repository = Repository.query.filter_by(id=rid).first()
if not repository:
return json_error("Could not find repository."), 404
return json_error("Could not find repository.", REPOSITORY_NOT_FOUND), 404
if request.method == "GET":
return json_success(repository.to_json()), 200
elif request.method == "PATCH":
if repository.owner_id != user.email:
return json_error("You are not the owner of this repository."), 403
return json_error("You are not the owner of this repository.", REPOSITORY_NOT_OWNER), 403
if 'name' in request.json:
repository.name = request.json['name']
if 'close' in request.json and not repository.end and repository.is_active:
@ -173,28 +173,28 @@ def page_repository(rid):
try:
evaluation_mode = ConditionMode(request.json['evaluation_mode'])
except KeyError:
return json_error("Unknown `type` specified."), 400
return json_error("Unknown `type` specified.", GENERIC_ENUM_INVALID), 400
repository.evaluation_mode = evaluation_mode
ext.session.commit()
return json_success(repository.to_json()), 204
elif request.method == "DELETE":
if repository.owner_id != user.email and not user.isAdmin:
return json_error("You are not the owner of this repository."), 403
return json_error("You are not the owner of this repository.", REPOSITORY_NOT_OWNER), 403
try:
ext.session.delete(repository)
ext.session.commit()
except Exception as e:
ext.session.rollback()
return json_error("Cant delete repository because of dependencies."), 500
return json_error("Cant delete repository because of dependencies.", REPOSITORY_DEPENDENCY_FAILURE), 500
return json_success("Success"), 204
elif request.method == "PUT":
if not json_request_authorizer(request.json, repository):
return json_error("Missing one or more parameters in repository json."), 400
return json_error("Missing one or more parameters in repository json.", GENERIC_MISSING_FIELDS), 400
# Users will be tolerated if they change parameters they're not supposed to touch. We'll ignore them for now.
try:
evaluation_mode = ConditionMode(request.json['evaluation_mode'])
except KeyError:
return json_error("Unknown `type` specified."), 400
return json_error("Unknown `type` specified.", GENERIC_ENUM_INVALID), 400
repository.evaluation_mode = evaluation_mode
repository.name = request.json['name']
repository.is_active = request.json['is_active']
@ -210,7 +210,7 @@ def page_repository(rid):
try:
type_ = ConditionType(c['type'])
except KeyError:
return json_error("Unknown `type` specified."), 400
return json_error("Unknown `type` specified.", GENERIC_ENUM_INVALID), 400
content = c['content']
if type_ == ConditionType.hashtag:
content = hashtag_validator(content)

View file

@ -5,6 +5,7 @@ from nest_backend.gestione import repository_auth, json_error, json_success, Con
from nest_backend.database import ext
from flask_cors import cross_origin
from nest_backend.gestione import hashtag_validator
from nest_backend.errors import *
@cross_origin()
@ -44,11 +45,11 @@ def page_repository_tweets(rid):
repository = Repository.query.filter_by(id=rid).first()
if not repository:
return json_error("Could not find repository"), 404
return json_error("Could not find repository", REPOSITORY_NOT_FOUND), 404
user = find_user(get_jwt_identity())
if user.email != repository.owner_id:
return json_error("You are not authorized."), 403
if user.email != repository.owner_id and user.email not in [a.email for a in Repository.authorizations]:
return json_error("You are not authorized.", USER_NOT_AUTHORIZED), 403
if request.method == "GET":
return json_success([t.tweet.to_json() for t in repository.tweets])

View file

@ -4,6 +4,7 @@ from nest_backend.gestione import *
from flask_jwt_extended import create_access_token
from flask_cors import cross_origin
from datetime import timedelta, datetime
from nest_backend.errors import *
@cross_origin()
@ -42,4 +43,4 @@ def page_login():
access_token = create_access_token(identity=email, expires_delta=delta)
user = find_user(email)
return json_success({"access_token": access_token, 'user': user.to_json(), "expiration": expiration}), 201
return json_error("Bad username or password."), 401
return json_error("Bad username or password.", USER_WRONG_CREDENTIALS), 401

View file

@ -3,6 +3,7 @@ from nest_backend.database import *
from flask_jwt_extended import jwt_required, get_jwt_identity
from nest_backend.gestione import *
from flask_cors import cross_origin
from nest_backend.errors import *
@cross_origin()
@ -117,26 +118,26 @@ def page_user(email):
user = find_user(get_jwt_identity())
target = find_user(email)
if not target:
return json_error("Could not locate the user."), 404
return json_error("Could not locate the user.", USER_NOT_FOUND), 404
if request.method == "GET":
if not email == user.email and not user.isAdmin:
return json_error("Thou art not authorized."), 403
return json_error("Thou art not authorized.", USER_NOT_AUTHORIZED), 403
return json_success(target.to_json())
elif request.method == "DELETE":
if not user.isAdmin:
return json_error("User is not admin."), 403
return json_error("User is not admin.", USER_NOT_ADMIN), 403
if user == target:
return json_error("The user cant delete himself. Its a sin."), 406
return json_error("The user cant delete himself. Its a sin.", USER_PREVENT_SEPPUKU), 406
ext.session.delete(target)
try:
ext.session.commit()
except Exception:
ext.session.rollback()
return json_error("Could not delete the user."), 500
return json_error("Could not delete the user.", USER_DELETION_ERROR), 500
return json_success(""), 204 # "The user has been deleted."
elif request.method == "PATCH":
if not email == user.email and not user.isAdmin:
return json_error("Thou art not authorized."), 403
return json_error("Thou art not authorized.", USER_NOT_AUTHORIZED), 403
target = find_user(email)
if request.json.get("username"):
target.username = request.json.get("username")

View file

@ -3,6 +3,7 @@ from nest_backend.database import *
from flask_jwt_extended import jwt_required, get_jwt_identity
from nest_backend.gestione import *
from flask_cors import cross_origin
from nest_backend.errors import *
@cross_origin()
@ -65,16 +66,16 @@ def page_users():
user = find_user(get_jwt_identity())
if request.method == "GET":
if not user.isAdmin:
return json_error("User is not admin. Thou art not authorized"), 403
return json_error("User is not admin. Thou art not authorized", USER_NOT_ADMIN), 403
users = User.query.all()
return json_success([user.to_json() for user in users]), 200
if request.method == "POST":
if not user.isAdmin:
return json_error("User is not admin. Thou art not authorized."), 403
return json_error("User is not admin. Thou art not authorized.", USER_NOT_ADMIN), 403
if not request.json.get("email") or not request.json.get("password") or not request.json.get("username"):
return json_error("Missing required fields."), 400
return json_error("Missing required fields.", GENERIC_MISSING_FIELDS), 400
if User.query.filter_by(email=request.json.get("email")).first():
return json_error("User already exists."), 406
return json_error("User already exists.", GENERIC_ALREADY_EXISTS), 406
new_user = User(email=request.json.get("email"), password=gen_password(request.json.get("password")),
username=request.json.get("username"))
ext.session.add(new_user)

View file

@ -5,6 +5,7 @@ import GlobalTheme from "./components/providers/GlobalTheme"
import GlobalServer from "./components/providers/GlobalServer"
import GlobalUser from "./components/providers/GlobalUser"
import PageSwitcher from "./PageSwitcher"
import GlobalLanguage from "./components/providers/GlobalLanguage"
/**
@ -15,16 +16,18 @@ import PageSwitcher from "./PageSwitcher"
*/
export default function App() {
return (
<GlobalServer>
<GlobalUser>
<GlobalTheme>
<BrowserRouter>
<Layout>
<PageSwitcher/>
</Layout>
</BrowserRouter>
</GlobalTheme>
</GlobalUser>
</GlobalServer>
<GlobalLanguage>
<GlobalServer>
<GlobalUser>
<GlobalTheme>
<BrowserRouter>
<Layout>
<PageSwitcher/>
</Layout>
</BrowserRouter>
</GlobalTheme>
</GlobalUser>
</GlobalServer>
</GlobalLanguage>
)
}

View file

@ -1,10 +1,11 @@
// Link.react.test.js
import React from 'react'
import '@testing-library/jest-dom/extend-expect'
import { render, screen } from '@testing-library/react'
import React from "react"
import "@testing-library/jest-dom/extend-expect"
import { render, screen } from "@testing-library/react"
import App from "./App"
test('App renders without exploding', () => {
test("App renders without exploding", () => {
render(<App/>)
expect(screen.getByRole("main")).toBeVisible()
});
})

View file

@ -0,0 +1,214 @@
/**
* All strings contained in the app should be present in this dict.
*
* If a key is missing in a language, the italian one is displayed instead.
*
* Define format strings as in C#:
* ```js
* "Raggio di {number} km"
* "{number} km radius"
* ```
*/
export default {
// 🇮🇹
it: {
appName: "N.E.S.T.",
appFullName: "Noi Estraiamo Statistiche Tweet",
server: "Scegli un server",
baseURL: "Base URL",
notLoggedIn: "Accesso non effettuato",
login: "Accedi",
email: "Email",
passwd: "Password",
dashboard: "Dashboard",
searchBy: "Ricerca per",
byZone: "area",
byHashtag: "hashtag",
byUser: "utente",
byTimePeriod: "arco di tempo",
timeBefore: "Prima",
timeAfter: "Dopo",
conditions: "Condizioni",
createRepo: "Crea repository",
repoName: "Nome repository",
request: "Richiedi",
filterOR: "Almeno una cond.",
filterAND: "Tutte le cond.",
rollback: "Annulla modifiche",
save: "Salva modifiche",
wordcloud: "Wordcloud",
repositories: "Repositories",
repoMenu: "Menu repository",
menuActive: "Le tue repository attive",
menuArchived: "Le tue repository archiviate",
emptyMenu: "Non c'è nulla qui",
delete: "Elimina",
archive: "Archivia",
edit: "Modifica",
created: "Creata",
archived: "Archiviata",
alerts: "Allarmi",
alertTitle: "I tuoi allarmi",
alertCreate: "Crea un allarme",
settings: "Impostazioni",
loggedInTitle: "Accesso effettuato",
loggedInOn: "Al momento hai effettuato l'accesso su",
loggedInAs: "come",
logout: "Esci",
switchTheme: "Cambia tema",
darkMode: "Scuro",
lightMode: "Chiaro",
alertSettings: "Impostazioni allarmi",
changeEmail: "Cambia il tuo indirizzo email",
changePasswd: "Cambia la tua password",
users: "Utenti",
manageUsers: "Gestisci utenti",
userList: "Elenco utenti",
userCreate: "Crea nuovo utente",
userName: "Username",
create: "Crea",
type: "Tipo",
admin: "Amministratore",
user: "Utente",
},
// 🇬🇧
en: {
appName: "N.E.S.T.",
appFullName: "We Extract Statistics from Tweets",
server: "Choose a server",
baseURL: "Base URL",
notLoggedIn: "Not logged in",
login: "Login",
email: "Email",
passwd: "Password",
dashboard: "Dashboard",
searchBy: "Search by",
byZone: "zone",
byHashtag: "hashtag",
byUser: "user",
byTimePeriod: "time period",
timeBefore: "Before",
timeAfter: "After",
conditions: "Conditions",
createRepo: "Create repository",
repoName: "Repository name",
request: "Request",
filterOR: "At least one cond.",
filterAND: "Every cond.",
rollback: "Rollback changes",
save: "Save changes",
wordcloud: "Wordcloud",
repositories: "Repositories",
repoMenu: "Repositories menu",
menuActive: "Your active repositories",
menuArchived: "Your archived repositories",
emptyMenu: "There's nothing here",
delete: "Delete",
archive: "Archive",
edit: "Edit",
created: "Created",
archived: "Archived",
alerts: "Alerts",
alertTitle: "Your alerts",
alertCreate: "Create a new alert",
settings: "Settings",
loggedInTitle: "Logged in",
loggedInOn: "You are currently logged in at",
loggedInAs: "as",
logout: "Logout",
switchTheme: "Switch theme",
darkMode: "Dark",
lightMode: "Light",
alertSettings: "Alert settings",
changeEmail: "Change your email address",
changePasswd: "Change your password",
users: "Users",
manageUsers: "Manage users",
userList: "User list",
userCreate: "Create new user",
userName: "Username",
create: "Create",
type: "Type",
admin: "Admin",
user: "User",
},
// 🇫🇮
fi: {
appName: "N.E.S.T.",
appFullName: "Poimimme Twiittien Tilastot",
server: "Valitse palvelin",
baseURL: "Perus-URL",
notLoggedIn: "Ei kirjautunut sisään",
login: "Kirjaudu sisään",
email: "Sähköposti",
passwd: "Salasana",
dashboard: "Kojelauta",
searchBy: "Haku ",
byZone: "vyöhykkeen mukaan",
byHashtag: "hashtagin mukaan",
byUser: "käyttäjän mukaan",
byTimePeriod: "aikajakson mukaan",
timeBefore: "Ennen",
timeAfter: "Jälkeen",
conditions: "Ehdot",
createRepo: "Luo arkisto",
repoName: "Arkiston nimi",
request: "Pyydä",
filterOR: "Vähintään yksi ehto",
filterAND: "Kaikki ehdot",
rollback: "Peruuta muutokset",
save: "Tallenna muutokset",
wordcloud: "Sanapilvi",
repositories: "Arkistot",
repoMenu: "Arkistot-valikko",
menuActive: "Aktiiviset arkistosi",
menuArchived: "Arkistoidut arkistosi",
emptyMenu: "Täällä ei ole mitään",
delete: "Poista",
archive: "Arkistoi",
edit: "Muokkaa",
created: "Luotu",
archived: "Arkisto",
alerts: "Hälytykset",
alertTitle: "Hälytyksesi",
alertCreate: "Luo uusi hälytys",
settings: "Asetukset",
loggedInTitle: "Kirjautunut sisään",
loggedInOn: "Olet tällä hetkellä kirjautuneena sisään",
loggedInAs: "nimellä",
logout: "Kirjaudu ulos",
switchTheme: "Vaihda teema",
darkMode: "Tumma",
lightMode: "Selkeä",
alertSettings: "Hälytysasetukset",
changeEmail: "Vaihda sähköpostiosoitteesi",
changePasswd: "Vaihda salasanasi",
users: "Käyttäjät",
manageUsers: "Käyttäjien hallinta",
userList: "Käyttäjäluettelo",
userCreate: "Luo uusi käyttäjä",
userName: "Käyttäjätunnus",
create: "Luo",
type: "Tyyppi",
admin: "Ylläpitäjä",
user: "Käyttäjä",
},
}

View file

@ -1,4 +1,4 @@
import React, { useState } from "react"
import React, { useContext, useState } from "react"
import BoxFull from "../base/BoxFull"
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"
import { faClock, faPlus } from "@fortawesome/free-solid-svg-icons"
@ -10,6 +10,7 @@ import useRepositoryEditor from "../../hooks/useRepositoryEditor"
import ButtonToggleBeforeAfter from "./ButtonToggleBeforeAfter"
import Condition from "../../utils/Condition"
import convertToLocalISODate from "../../utils/convertToLocalISODate"
import ContextLanguage from "../../contexts/ContextLanguage"
const INVALID_USER_CHARACTERS = /[^0-9TZ:+-]/g
@ -27,6 +28,7 @@ export default function BoxConditionDatetime({ ...props }) {
const [datetime, setDatetime] = useState("")
const [ba, setBa] = useState(false)
const { addCondition } = useRepositoryEditor()
const { strings } = useContext(ContextLanguage)
const onInputChange = event => {
let text = event.target.value
@ -50,7 +52,18 @@ export default function BoxConditionDatetime({ ...props }) {
}
return (
<BoxFull header={<span>Ricerca per <FontAwesomeIcon icon={faClock}/> arco di tempo</span>} {...props}>
<BoxFull
header={
<span>
{strings.searchBy}
&nbsp;
<FontAwesomeIcon icon={faClock}/>
&nbsp;
{strings.byTimePeriod}
</span>
}
{...props}
>
<FormInline onSubmit={onButtonClick}>
<ButtonToggleBeforeAfter onUpdate={setBa}/>
<InputWithIcon

View file

@ -1,4 +1,4 @@
import React, { useState } from "react"
import React, { useContext, useState } from "react"
import BoxFull from "../base/BoxFull"
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"
import { faHashtag, faPlus } from "@fortawesome/free-solid-svg-icons"
@ -8,6 +8,7 @@ import Style from "./BoxConditionHashtag.module.css"
import ButtonIconOnly from "../base/ButtonIconOnly"
import useRepositoryEditor from "../../hooks/useRepositoryEditor"
import Condition from "../../utils/Condition"
import ContextLanguage from "../../contexts/ContextLanguage"
// Official hashtag regex from https://stackoverflow.com/a/22490853/4334568
// noinspection RegExpAnonymousGroup,LongLine
@ -25,6 +26,7 @@ const INVALID_HASHTAG_CHARACTERS = /([^a-z0-9_\u00c0-\u00d6\u00d8-\u00f6\u00f8-\
export default function BoxConditionHashtag({ ...props }) {
const [hashtag, setHashtag] = useState("")
const { addCondition } = useRepositoryEditor()
const { strings } = useContext(ContextLanguage)
const onInputChange = event => {
let text = event.target.value
@ -41,7 +43,18 @@ export default function BoxConditionHashtag({ ...props }) {
}
return (
<BoxFull header={<span>Ricerca per <FontAwesomeIcon icon={faHashtag}/> hashtag</span>} {...props}>
<BoxFull
header={
<span>
{strings.searchBy}
&nbsp;
<FontAwesomeIcon icon={faHashtag}/>
&nbsp;
{strings.byHashtag}
</span>
}
{...props}
>
<FormInline onSubmit={onButtonClick}>
<InputWithIcon
className={Style.Input}

View file

@ -1,4 +1,4 @@
import React, { useCallback, useEffect, useState } from "react"
import React, { useCallback, useContext, useEffect, useState } from "react"
import BoxFull from "../base/BoxFull"
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"
import { faMapPin, faPlus } from "@fortawesome/free-solid-svg-icons"
@ -7,6 +7,7 @@ import ButtonIconOnly from "../base/ButtonIconOnly"
import { MapContainer, TileLayer } from "react-leaflet"
import useRepositoryEditor from "../../hooks/useRepositoryEditor"
import Condition from "../../utils/Condition"
import ContextLanguage from "../../contexts/ContextLanguage"
const STARTING_POSITION = { lat: 41.89309, lng: 12.48289 }
@ -53,6 +54,7 @@ export default function BoxConditionMap({ ...props }) {
const [zoom, setZoom] = useState(STARTING_ZOOM)
const [map, setMap] = useState(null)
const { addCondition } = useRepositoryEditor()
const { strings } = useContext(ContextLanguage)
const onMove = useCallback(
() => {
@ -99,7 +101,13 @@ export default function BoxConditionMap({ ...props }) {
return (
<BoxFull
header={
<span>Ricerca per <FontAwesomeIcon icon={faMapPin}/> area</span>
<span>
{strings.searchBy}
&nbsp;
<FontAwesomeIcon icon={faMapPin}/>
&nbsp;
{strings.byZone}
</span>
}
childrenClassName={Style.BoxConditionMapContents}
{...props}

View file

@ -1,4 +1,4 @@
import React, { useState } from "react"
import React, { useContext, useState } from "react"
import BoxFull from "../base/BoxFull"
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"
import { faAt, faPlus } from "@fortawesome/free-solid-svg-icons"
@ -8,6 +8,7 @@ import Style from "./BoxConditionUser.module.css"
import ButtonIconOnly from "../base/ButtonIconOnly"
import useRepositoryEditor from "../../hooks/useRepositoryEditor"
import Condition from "../../utils/Condition"
import ContextLanguage from "../../contexts/ContextLanguage"
const INVALID_USER_CHARACTERS = /[^a-zA-Z0-9]/g
@ -24,6 +25,7 @@ const INVALID_USER_CHARACTERS = /[^a-zA-Z0-9]/g
export default function BoxConditionUser({ ...props }) {
const [user, setUser] = useState("")
const { addCondition } = useRepositoryEditor()
const { strings } = useContext(ContextLanguage)
const onInputChange = event => {
let text = event.target.value
@ -40,7 +42,18 @@ export default function BoxConditionUser({ ...props }) {
}
return (
<BoxFull header={<span>Ricerca per <FontAwesomeIcon icon={faAt}/> utente</span>} {...props}>
<BoxFull
header={
<span>
{strings.searchBy}
&nbsp;
<FontAwesomeIcon icon={faAt}/>
&nbsp;
{strings.byUser}
</span>
}
{...props}
>
<FormInline onSubmit={onButtonClick}>
<InputWithIcon
className={Style.Input}

View file

@ -1,7 +1,8 @@
import React from "react"
import React, { useContext } from "react"
import BoxFull from "../base/BoxFull"
import ConditionBadge from "./ConditionBadge"
import useRepositoryEditor from "../../hooks/useRepositoryEditor"
import ContextLanguage from "../../contexts/ContextLanguage"
/**
@ -13,11 +14,12 @@ import useRepositoryEditor from "../../hooks/useRepositoryEditor"
*/
export default function BoxConditions({ ...props }) {
const { conditions } = useRepositoryEditor()
const { strings } = useContext(ContextLanguage)
const badges = conditions.map((cond, pos) => <ConditionBadge key={pos} {...cond}/>)
return (
<BoxFull header={"Condizioni"} {...props}>
<BoxFull header={strings.conditions} {...props}>
{badges}
</BoxFull>
)

View file

@ -7,6 +7,7 @@ import ContextUser from "../../contexts/ContextUser"
import { useHistory } from "react-router"
import Style from "./BoxLoggedIn.module.css"
import CurrentServer from "./CurrentServer"
import ContextLanguage from "../../contexts/ContextLanguage"
/**
@ -19,12 +20,13 @@ import CurrentServer from "./CurrentServer"
export default function BoxLoggedIn({ ...props }) {
const { logout } = useContext(ContextUser)
const history = useHistory()
const { strings } = useContext(ContextLanguage)
return (
<BoxFull header={"Effettuato l'accesso"} {...props}>
<BoxFull header={strings.loggedInTitle} {...props}>
<div className={Style.BoxLoggedInContents}>
<div>
Al momento hai effettuato l'accesso su <CurrentServer/> come <LoggedInUser/>.
{strings.loggedInOn} <CurrentServer/> {strings.loggedInAs} <LoggedInUser/>.
</div>
<div>
<Button
@ -32,7 +34,7 @@ export default function BoxLoggedIn({ ...props }) {
logout()
history.push("/login")
}} icon={faSignOutAlt}
>Esci</Button>
>{strings.logout}</Button>
</div>
</div>
</BoxFull>

View file

@ -8,6 +8,7 @@ import FormButton from "../base/formparts/FormButton"
import ContextUser from "../../contexts/ContextUser"
import { useHistory } from "react-router"
import FormAlert from "../base/formparts/FormAlert"
import ContextLanguage from "../../contexts/ContextLanguage"
/**
@ -24,6 +25,7 @@ export default function BoxLogin({ ...props }) {
const [error, setError] = useState(null)
const { login } = useContext(ContextUser)
const history = useHistory()
const { strings } = useContext(ContextLanguage)
const doLogin = async () => {
if(working) {
@ -44,9 +46,9 @@ export default function BoxLogin({ ...props }) {
}
return (
<BoxFull header={"Accedi"} {...props}>
<BoxFull header={strings.login} {...props}>
<FormLabelled>
<FormLabel text={"Email"} htmlFor={"login-email"}>
<FormLabel text={strings.email} htmlFor={"login-email"}>
<InputWithIcon
id={"login-email"}
name={"login-email"}
@ -56,7 +58,7 @@ export default function BoxLogin({ ...props }) {
icon={faEnvelope}
/>
</FormLabel>
<FormLabel text={"Password"} htmlFor={"login-password"}>
<FormLabel text={strings.passwd} htmlFor={"login-password"}>
<InputWithIcon
id={"login-password"}
name={"login-password"}
@ -77,7 +79,7 @@ export default function BoxLogin({ ...props }) {
color={"Green"}
disabled={working}
>
Accedi
{strings.login}
</FormButton>
</FormLabelled>
</BoxFull>

View file

@ -4,6 +4,7 @@ import { faFolderOpen } from "@fortawesome/free-solid-svg-icons"
import ContextUser from "../../contexts/ContextUser"
import Loading from "../base/Loading"
import BoxFullScrollable from "../base/BoxFullScrollable"
import ContextLanguage from "../../contexts/ContextLanguage"
/**
@ -25,13 +26,14 @@ export default function BoxRepositoriesActive({
...props
}) {
const { user } = useContext(ContextUser)
const { strings } = useContext(ContextLanguage)
let contents
if(repositories === null) {
contents = <Loading/>
}
else if(repositories.length === 0) {
contents = <i>Non c'è nulla qui.</i>
contents = <i>{strings.emptyMenu}.</i>
}
else {
contents = repositories.map(repo => (
@ -50,7 +52,7 @@ export default function BoxRepositoriesActive({
}
return (
<BoxFullScrollable header={"Repository attivi"} {...props}>
<BoxFullScrollable header={strings.menuActive} {...props}>
{contents}
</BoxFullScrollable>
)

View file

@ -4,6 +4,7 @@ import { faFolderOpen } from "@fortawesome/free-solid-svg-icons"
import ContextUser from "../../contexts/ContextUser"
import Loading from "../base/Loading"
import BoxFullScrollable from "../base/BoxFullScrollable"
import ContextLanguage from "../../contexts/ContextLanguage"
/**
@ -25,13 +26,14 @@ export default function BoxRepositoriesArchived({
...props
}) {
const { user } = useContext(ContextUser)
const { strings } = useContext(ContextLanguage)
let contents
if(repositories === null) {
contents = <Loading/>
}
else if(repositories.length === 0) {
contents = <i>Non c'è nulla qui.</i>
contents = <i>{strings.emptyMenu}.</i>
}
else {
contents = repositories.map(repo => (
@ -50,7 +52,7 @@ export default function BoxRepositoriesArchived({
}
return (
<BoxFullScrollable header={"Repository archiviati"} {...props}>
<BoxFullScrollable header={strings.menuArchived} {...props}>
{contents}
</BoxFullScrollable>
)

View file

@ -1,4 +1,4 @@
import React from "react"
import React, { useContext } from "react"
import BoxFull from "../base/BoxFull"
import FormLabelled from "../base/FormLabelled"
import FormLabel from "../base/formparts/FormLabel"
@ -10,16 +10,18 @@ import useRepositoryEditor from "../../hooks/useRepositoryEditor"
import FormAlert from "../base/formparts/FormAlert"
import goToOnSuccess from "../../utils/goToOnSuccess"
import { useHistory } from "react-router"
import ContextLanguage from "../../contexts/ContextLanguage"
/**
* A {@link BoxFull} allowing the user to save the changes made in the current {@link RepositoryEditor}.
*
* @param props
* @param running - If a request is running, disabling the buttons.
* @param props - Additional props to pass to the box.
* @returns {JSX.Element}
* @constructor
*/
export default function BoxRepositoryCreate({ ...props }) {
export default function BoxRepositoryCreate({ running, ...props }) {
const {
id,
evaluationMode,
@ -32,16 +34,17 @@ export default function BoxRepositoryCreate({ ...props }) {
} = useRepositoryEditor()
const history = useHistory()
const { strings } = useContext(ContextLanguage)
return (
<BoxFull header={"Crea repository"} {...props}>
<BoxFull header={strings.createRepo} {...props}>
<FormLabelled
onSubmit={e => {
e.preventDefault()
save()
}}
>
<FormLabel htmlFor={"repo-name"} text={"Nome repository"}>
<FormLabel htmlFor={"repo-name"} text={strings.repoName}>
<InputWithIcon
id={"repo-name"}
icon={faFolder}
@ -49,14 +52,14 @@ export default function BoxRepositoryCreate({ ...props }) {
onChange={e => setName(e.target.value)}
/>
</FormLabel>
<FormLabel htmlFor={"filter-mode"} text={"Richiedi"}>
<FormLabel htmlFor={"filter-mode"} text={strings.request}>
<label>
<Radio
name={"filter-mode"}
onChange={() => setEvaluationMode(0)}
checked={evaluationMode === 0}
/>
Almeno una cond.
{strings.filterOR}
</label>
&nbsp;
<label>
@ -65,7 +68,7 @@ export default function BoxRepositoryCreate({ ...props }) {
onChange={() => setEvaluationMode(1)}
checked={evaluationMode === 1}
/>
Tutte le cond.
{strings.filterAND}
</label>
</FormLabel>
{error ?
@ -80,16 +83,18 @@ export default function BoxRepositoryCreate({ ...props }) {
icon={faBackward}
color={"Red"}
onClick={() => revert()}
disabled={running}
>
Annulla modifiche
{strings.rollback}
</Button>
<Button
style={{ "gridColumn": "2" }}
icon={faPencilAlt}
color={"Green"}
onClick={_ => goToOnSuccess(save, history, "/repositories")()}
disabled={running}
>
Salva modifiche
{strings.save}
</Button>
</>
:
@ -98,8 +103,9 @@ export default function BoxRepositoryCreate({ ...props }) {
icon={faPlus}
color={"Green"}
onClick={_ => goToOnSuccess(save, history, "/repositories")()}
disabled={running}
>
Crea repository
{strings.createRepo}
</Button>
}

Some files were not shown because too many files have changed in this diff Show more