Merge branch 'main' of zero.ryg.one:nest/g2-progetto
|
@ -470,6 +470,13 @@ Questa statistica è stata generata dal prof. Marcello Missiroli con
|
|||
.. _Gitinspector: https://github.com/ejwa/gitinspector
|
||||
|
||||
|
||||
Sprint Retrospective
|
||||
--------------------
|
||||
|
||||
|
||||
- :download:`Sprint 0 Retrospective <sprint-0_retrospective.pdf>`
|
||||
|
||||
|
||||
Sprint review
|
||||
-------------
|
||||
|
||||
|
|
BIN
docs/source/development/sprint0/sprint-0_retrospective.pdf
Normal file
BIN
docs/source/development/sprint1/BacklogSprint1.png
Normal file
After Width: | Height: | Size: 438 KiB |
BIN
docs/source/development/sprint1/Chart1.png
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
docs/source/development/sprint1/Sprint1Task.png
Normal file
After Width: | Height: | Size: 13 KiB |
|
@ -0,0 +1,16 @@
|
|||
# Valutazione ScrumMaster debito tecnico
|
||||
|
||||
>La valutazione del debito tecnico effettuata da SonarQube è
|
||||
>relativa principalmente al backend, poiché l’analisi del progetto
|
||||
>sarebbe stata troppo dispendiosa a causa dell’elevato numero di
|
||||
>file presente nella cartella /frontend.
|
||||
|
||||
>Per quanto riguarda il backend invece il debito tecnico riscontrato
|
||||
> è minore del 5% come si può verificare dal grado A attestato da
|
||||
>SonarQube.
|
||||
|
||||
>Un punto chiave nell’implementazione ha permesso al team [**N.E.S.T.**]
|
||||
>di diminuire il debito tecnico, questo è avvenuto grazie
|
||||
>all’adozione del modello architetturale REST che ha migliorato
|
||||
>esponenzialmente il tempo di risposta delle richieste e la
|
||||
>leggibilità del codice.
|
|
@ -1,11 +1,6 @@
|
|||
Sprint 1: 19 Apr - 02 Mag
|
||||
=========================
|
||||
|
||||
.. todo::
|
||||
|
||||
Inserire informazioni generali sullo sprint, come inizio e fine.
|
||||
|
||||
|
||||
Consegna
|
||||
--------
|
||||
|
||||
|
@ -17,25 +12,47 @@ La seguente documentazione è stata fornita dal cliente durante questo sprint:
|
|||
Goal
|
||||
----
|
||||
|
||||
.. todo::
|
||||
Il **goal** per questo sprint è stato costruire una codebase facilmente mantenibile e modulare, che potesse accomodare grossi
|
||||
cambiamenti nei sottomoduli senza impattare gli altri:
|
||||
|
||||
Inserire qui lo sprint goal.
|
||||
- Dal punto di vista del **backend**: l'obiettivo è stato predisporre la struttura del database e creare le api calls per illogin degli utenti e la creazione dei repository
|
||||
- Dal punto di vista del **frontend**: creare la struttura con le componenti importate da figma e implementare le schermate principali
|
||||
|
||||
Tutto ciò è visibile dai task completati:
|
||||
|
||||
.. image:: Sprint1Task.png
|
||||
:width: 400
|
||||
|
||||
Backlog
|
||||
-------
|
||||
|
||||
.. todo::
|
||||
.. image:: BacklogSprint1.png
|
||||
:width: 400
|
||||
|
||||
Mostrare qui lo sprint backlog di Taiga.
|
||||
**Burndown Chart**
|
||||
|
||||
.. image:: Chart1.png
|
||||
:width: 600
|
||||
|
||||
|
||||
Definition of done
|
||||
Definition of Ready
|
||||
------------------
|
||||
|
||||
.. todo::
|
||||
Il team ha definito lo stato di Ready di una User Story in base ai seguenti criteri:
|
||||
* La User Story è stata compresa ed accettata da tutti i membri
|
||||
* I tester hanno confermato la possibilità di poterla testare
|
||||
* Il Product Owner ha la visione necessaria per definirne la priorità
|
||||
* Il Team è in grado di stimarla
|
||||
* La User Story è indipendente o dipendente da altre a priorità maggiore
|
||||
|
||||
Inserire qui la definition of done dello sprint.
|
||||
Definition of Done
|
||||
------------------
|
||||
|
||||
La definizione di Done è stata concordata da tutto il team con il Product Owner, ed è stata così definita:
|
||||
* Sviluppo completo della funzionalità richiesta
|
||||
* Definizione e superamento dei test
|
||||
* Bozza della documentazione della funzionalità
|
||||
* Merge dei sorgenti nel branch ‘Main’ di GitLab
|
||||
|
||||
|
||||
Registro attività
|
||||
|
@ -488,12 +505,17 @@ Questa statistica è stata generata dal prof. Marcello Missiroli con
|
|||
|
||||
Sprint retrospective
|
||||
--------------------
|
||||
|
||||
- :download:`Sprint 1 Retrospective <1-retrospective.pdf>`
|
||||
|
||||
Sprint review
|
||||
-------------
|
||||
|
||||
.. todo::
|
||||
Il video di sprint review è disponibile al seguente link:
|
||||
|
||||
Inserire un link alla sprint review.
|
||||
- https://drive.google.com/drive/folders/1dsis_cGCRnVgZAkZjEVIZKt4NndkycaF?usp=sharing
|
||||
|
||||
|
||||
Artefatti
|
||||
---------
|
||||
- :download:`Valutazion SM Debito Tecnico <ValutazioneSMDebitoTecnico.md>`
|
||||
- :download:`Valutazione PO User Stories <valutazionePO__US_realizzate_o_rifiutate.md>`
|
|
@ -0,0 +1,7 @@
|
|||
Durante questo sprint non sono state ristimate le US in quanto non sono emerse al termine dello sprint0 valutazioni che lo rendessero necessario, di conseguenza non sono state neanche rivalutate le priorità.
|
||||
Come product Owner ho individuato come criterio di accettazione l'esito positivo dei test, anche per il fatto che i test sono presenti in ogni US.
|
||||
Durante lo sviluppo di questo primo sprint sono ovviamente emerse delle issue che sono state tracciate su taiga.
|
||||
Una di queste, la #101 "L'API non è interamente REST" ha portato ad un refactoring di una parte del codice del backend, del frontend e naturalmente anche delle procedure di test, che erano già state abbozzate. La modifica comunque si è rilevata essere necessaria per rispondere appieno alle struttura tipica dei metodi REST.
|
||||
Altre issue sono state inserite ma possono essere sistemate nello sprint successivo in quanto non influiscono sul funzionamento atteso in questo primo sprint.
|
||||
|
||||
Un leggero ritardo sullo sviluppo del frontend non consente di chiudere alcune US, che verranno chiuse e testate nel prossimo sprint.
|
BIN
docs/source/development/sprint2/BacklogSprint2.PNG
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
docs/source/development/sprint2/Chart2.png
Normal file
After Width: | Height: | Size: 74 KiB |
BIN
docs/source/development/sprint2/RetrospectiveSprint2.pdf
Normal file
BIN
docs/source/development/sprint2/Sprint2Task.png
Normal file
After Width: | Height: | Size: 52 KiB |
|
@ -1,11 +1,6 @@
|
|||
Sprint 2: 03 Mag - 16 Mag
|
||||
=========================
|
||||
|
||||
.. todo::
|
||||
|
||||
Inserire informazioni generali sullo sprint, come inizio e fine.
|
||||
|
||||
|
||||
Consegna
|
||||
--------
|
||||
|
||||
|
@ -16,26 +11,47 @@ La seguente documentazione è stata fornita dal cliente durante questo sprint:
|
|||
|
||||
Goal
|
||||
----
|
||||
Il **goal** del secondo sprint è stato la creazione, cancellazione e modifica dei repository, ovvero permettere agli utenti
|
||||
di creare repo partendo da una ricerca che rispetta determinate condizioni.
|
||||
|
||||
.. todo::
|
||||
Tutto ciò è visibile dai task completati:
|
||||
|
||||
.. image:: Sprint2Task.png
|
||||
:width: 390
|
||||
|
||||
Inserire qui lo sprint goal.
|
||||
|
||||
|
||||
Backlog
|
||||
-------
|
||||
|
||||
.. todo::
|
||||
.. image:: BacklogSprint2.png
|
||||
:width: 400
|
||||
|
||||
Mostrare qui lo sprint backlog di Taiga.
|
||||
**Burndown Chart**
|
||||
|
||||
.. image:: Chart2.png
|
||||
:width: 600
|
||||
|
||||
|
||||
Definition of done
|
||||
Definition of Ready
|
||||
------------------
|
||||
|
||||
.. todo::
|
||||
Il team ha definito lo stato di Ready di una User Story in base ai seguenti criteri:
|
||||
* La User Story è stata compresa ed accettata da tutti i membri
|
||||
* I tester hanno confermato la possibilità di poterla testare
|
||||
* Il Product Owner ha la visione necessaria per definirne la priorità
|
||||
* Il Team è in grado di stimarla
|
||||
* La User Story è indipendente o dipendente da altre a priorità maggiore
|
||||
|
||||
Definition of Done
|
||||
------------------
|
||||
|
||||
La definizione di Done è stata concordata da tutto il team con il Product Owner, ed è stata così definita:
|
||||
* Sviluppo completo della funzionalità richiesta
|
||||
* Definizione e superamento dei test
|
||||
* Bozza della documentazione della funzionalità
|
||||
* Merge dei sorgenti nel branch ‘Main’ di GitLab
|
||||
|
||||
Inserire qui la definition of done dello sprint.
|
||||
|
||||
|
||||
Registro attività
|
||||
|
@ -423,9 +439,14 @@ Questa statistica è stata generata dal prof. Marcello Missiroli con
|
|||
.. _Gitinspector: https://github.com/ejwa/gitinspector
|
||||
|
||||
|
||||
Sprint retrospective
|
||||
--------------------
|
||||
- :download:`Sprint 2 Retrospective <RetrospectiveSprint2.pdf>`
|
||||
|
||||
|
||||
Sprint review
|
||||
-------------
|
||||
|
||||
.. todo::
|
||||
Il video di sprint review è disponibile al seguente link:
|
||||
|
||||
Inserire un link alla sprint review.
|
||||
- https://drive.google.com/file/d/1x1kub-bpVJrwmGrn5LLU8ecqcbxFaoKg/view?usp=sharing
|
||||
|
|
BIN
docs/source/development/sprint3/Backlog3.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
docs/source/development/sprint3/Chart3.png
Normal file
After Width: | Height: | Size: 75 KiB |
BIN
docs/source/development/sprint3/Task3.png
Normal file
After Width: | Height: | Size: 37 KiB |
|
@ -1,11 +1,6 @@
|
|||
Sprint 3: 17 Mag - 30 Mag
|
||||
=========================
|
||||
|
||||
.. todo::
|
||||
|
||||
Inserire informazioni generali sullo sprint, come inizio e fine.
|
||||
|
||||
|
||||
Consegna
|
||||
--------
|
||||
|
||||
|
@ -18,25 +13,52 @@ La seguente documentazione è stata fornita dal cliente durante questo sprint:
|
|||
Goal
|
||||
----
|
||||
|
||||
.. todo::
|
||||
Il **goal** del terzo Sprint è stato far funzionare il crawler, gli alert e completare tutte i task rimanenti.
|
||||
|
||||
Tutto ciò è visibile dai task completati:
|
||||
|
||||
.. image:: Task3.png
|
||||
:width: 400
|
||||
|
||||
Grooming session
|
||||
----------------
|
||||
|
||||
Sono state definite le nuove User Stories da inserire nel progetto sulla base delle nuove richieste pervenute dal cliente: analisi statistica più dettagliata, postare su Twitter, traduzione dell'interfaccia in inglese.
|
||||
La richiesta relativa alle ricerche basate sulla geolocalizzazione, come già comunicato al cliente, non è stata inserita per motivi tecnici legati alle features delle API 1.1 che non permettono di eseguire query sui campi di posizione geografica.
|
||||
Le nuove User Stories sono state valutate tramite il metodo dello Scrum Poker, durante il quale ogni membro ha espresso la sua valutazione.
|
||||
Tutte le nuove richieste sono state accettate dal Product Owner e sono pronte ad essere inserite nello sprint di sviluppo in partenza.
|
||||
|
||||
Inserire qui lo sprint goal.
|
||||
|
||||
|
||||
Backlog
|
||||
-------
|
||||
.. image:: Backlog3.png
|
||||
:width: 400
|
||||
|
||||
.. todo::
|
||||
**Burndown Chart**
|
||||
|
||||
Mostrare qui lo sprint backlog di Taiga.
|
||||
.. image:: Chart3.png
|
||||
:width: 600
|
||||
|
||||
|
||||
Definition of done
|
||||
Definition of Ready
|
||||
------------------
|
||||
|
||||
.. todo::
|
||||
Il team ha definito lo stato di Ready di una User Story in base ai seguenti criteri:
|
||||
* La User Story è stata compresa ed accettata da tutti i membri
|
||||
* I tester hanno confermato la possibilità di poterla testare
|
||||
* Il Product Owner ha la visione necessaria per definirne la priorità
|
||||
* Il Team è in grado di stimarla
|
||||
* La User Story è indipendente o dipendente da altre a priorità maggiore
|
||||
|
||||
Inserire qui la definition of done dello sprint.
|
||||
Definition of Done
|
||||
------------------
|
||||
|
||||
La definizione di Done è stata concordata da tutto il team con il Product Owner, ed è stata così definita:
|
||||
* Sviluppo completo della funzionalità richiesta
|
||||
* Definizione e superamento dei test
|
||||
* Bozza della documentazione della funzionalità
|
||||
* Merge dei sorgenti nel branch ‘Main’ di GitLab
|
||||
|
||||
|
||||
Registro attività
|
||||
|
@ -346,6 +368,9 @@ Retrospettiva finale
|
|||
Schermata finale di SonarQube
|
||||
-----------------------------
|
||||
|
||||
.. todo::
|
||||
- :download:`Schermata finale Sonarqube <sonarqube.pdf>`
|
||||
|
||||
Inserire qui uno screenshot della schermata finale di SonarQube.
|
||||
Demo
|
||||
----
|
||||
|
||||
- https://drive.google.com/file/d/15o70Ffe51CNj8LTKHC9dGiqRVnbv9UpZ/view?usp=sharing
|
||||
|
|
BIN
docs/source/development/sprint3/sonarqube.pdf
Normal file
|
@ -2,6 +2,7 @@ from datetime import datetime, timedelta
|
|||
from nest_backend.database import *
|
||||
from .authentication import authenticate
|
||||
import smtplib
|
||||
import tweepy as tw
|
||||
|
||||
|
||||
def is_repo_alert_triggered(repository_id):
|
||||
|
@ -36,7 +37,7 @@ def is_repo_alert_triggered(repository_id):
|
|||
ext.session.commit()
|
||||
print("alert triggered")
|
||||
alerts_triggered.append(alert)
|
||||
send_notification_email(alert)
|
||||
#send_notification_email(alert)
|
||||
send_notification_tweet(alert)
|
||||
|
||||
|
||||
|
@ -48,14 +49,11 @@ def send_notification_email(alert):
|
|||
conditions_string = conditions_string[:-1]
|
||||
smtpObj = None
|
||||
try:
|
||||
smtpObj = smtplib.SMTP('localhost')
|
||||
smtpObj.sendmail("alert@nest.com", owner_repo.email, "Alert triggered")
|
||||
print("Successfully sent email")
|
||||
with smtplib.SMTP(host='localhost') as smtpObj:
|
||||
smtpObj.sendmail("alert@nest.com", owner_repo.email, "Alert triggered")
|
||||
print("Successfully sent email")
|
||||
except smtplib.SMTPException:
|
||||
print("Error: unable to send email")
|
||||
finally:
|
||||
if smtpObj is not None:
|
||||
smtpObj.close()
|
||||
|
||||
|
||||
def send_notification_tweet(alert):
|
||||
|
@ -65,7 +63,10 @@ def send_notification_tweet(alert):
|
|||
conditions_string += condition.condition.content + ','
|
||||
conditions_string = conditions_string[:-1]
|
||||
print(conditions_string)
|
||||
api.update_status(f"L'alert {alert.name} è stato attivato! C'è stato un incremento di popolarità negli argomenti di ricerca {conditions_string}")
|
||||
try:
|
||||
api.update_status(f"L'alert {alert.name} è stato attivato! C'è stato un incremento di popolarità negli argomenti di ricerca {conditions_string}")
|
||||
except tw.errors.Forbidden:
|
||||
print("Il tweet e' gia' stato pubblicato")
|
||||
|
||||
|
||||
__all__ = (
|
||||
|
|
|
@ -19,6 +19,12 @@ def search_repo_conditions(repository_id):
|
|||
|
||||
print(f"Searching tweets from repo: {repo.name}")
|
||||
evaluation_mode = repo.evaluation_mode
|
||||
|
||||
# tweets_repo = [tweet.tweet for tweet in repo.tweets]
|
||||
# tweets_repo.sort(key=lambda x: x.snowflake)
|
||||
#
|
||||
# latest_tweet_id = int(tweets_repo[-1].snowflake) if len(tweets_repo) > 0 else 0
|
||||
|
||||
conditions_type = dict()
|
||||
|
||||
# Dividing condition into condition types
|
||||
|
@ -54,8 +60,8 @@ def search_repo_conditions(repository_id):
|
|||
for condition_content in conditions_type[ConditionType.coordinates]:
|
||||
coordinates_tweet = condition_content.content.split()
|
||||
coordinates_string = coordinates_tweet[2] + "," + coordinates_tweet[3] + "," + str(float(coordinates_tweet[1])/1000) + "km"
|
||||
print(coordinates_string)
|
||||
for tweet in tw.Cursor(method=api.search, q="", geocode=coordinates_string).items(10):
|
||||
print(f"Le coordinate di questa condizione sono: {coordinates_string}")
|
||||
for tweet in tw.Cursor(method=api.search, q="", geocode=coordinates_string).items(100):
|
||||
if not Tweet.query.filter_by(snowflake=str(tweet.id)).all():
|
||||
image_url_list = ''
|
||||
if 'media' in tweet.entities.keys():
|
||||
|
@ -92,17 +98,17 @@ def search_repo_conditions(repository_id):
|
|||
queryString += ("since:" + condition_content.content[2:] + " " + queryConjunction + " ")
|
||||
# End of query string
|
||||
queryString = queryString[:-len(queryConjunction) - 1]
|
||||
print(queryString)
|
||||
print(f"La stringa di query finale e':{queryString}")
|
||||
|
||||
if evaluation_mode == ConditionMode.all_or:
|
||||
if queryString != "":
|
||||
for tweet in tw.Cursor(method=api.search, q=queryString).items(10):
|
||||
for tweet in tw.Cursor(method=api.search, q=queryString).items(100):
|
||||
tweetsFound.append(tweet)
|
||||
print(tweet.user.name + ' : ' + tweet.text + ' : ' + tweet.geo if tweet.geo is not None else '')
|
||||
print(tweet.user.name + ' : ' + tweet.text + ' : ' + (tweet.geo if tweet.geo is not None else ''))
|
||||
elif evaluation_mode == ConditionMode.all_and:
|
||||
for tweet in tw.Cursor(method=api.search, q=queryString, geocode=coordinates_string).items(10):
|
||||
for tweet in tw.Cursor(method=api.search, q=queryString, geocode=coordinates_string).items(100):
|
||||
tweetsFound.append(tweet)
|
||||
print(tweet.user.name + ' : ' + tweet.text + ' : ' + str(tweet.geo))
|
||||
print(tweet.user.name + ' : ' + tweet.text + ' : ' + (tweet.geo if tweet.geo is not None else ''))
|
||||
for tweet in tweetsFound:
|
||||
if not Tweet.query.filter_by(snowflake=str(tweet.id)).all():
|
||||
image_url_list = ''
|
||||
|
|