1
Fork 0
mirror of https://github.com/pds-nest/nest.git synced 2024-11-25 06:24:19 +00:00

Merge branch 'main' of zero.ryg.one:nest/g2-progetto

This commit is contained in:
Annielated 2021-05-29 15:31:56 +02:00
commit eda61c54ce
20 changed files with 163 additions and 58 deletions

View file

@ -470,6 +470,13 @@ Questa statistica è stata generata dal prof. Marcello Missiroli con
.. _Gitinspector: https://github.com/ejwa/gitinspector .. _Gitinspector: https://github.com/ejwa/gitinspector
Sprint Retrospective
--------------------
- :download:`Sprint 0 Retrospective <sprint-0_retrospective.pdf>`
Sprint review Sprint review
------------- -------------

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View file

@ -0,0 +1,16 @@
# Valutazione ScrumMaster debito tecnico
>La valutazione del debito tecnico effettuata da SonarQube è
>relativa principalmente al backend, poiché lanalisi del progetto
>sarebbe stata troppo dispendiosa a causa dellelevato 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 nellimplementazione ha permesso al team [**N.E.S.T.**]
>di diminuire il debito tecnico, questo è avvenuto grazie
>alladozione del modello architetturale REST che ha migliorato
>esponenzialmente il tempo di risposta delle richieste e la
>leggibilità del codice.

View file

@ -1,11 +1,6 @@
Sprint 1: 19 Apr - 02 Mag Sprint 1: 19 Apr - 02 Mag
========================= =========================
.. todo::
Inserire informazioni generali sullo sprint, come inizio e fine.
Consegna Consegna
-------- --------
@ -17,25 +12,47 @@ La seguente documentazione è stata fornita dal cliente durante questo sprint:
Goal 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 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à Registro attività
@ -488,12 +505,17 @@ Questa statistica è stata generata dal prof. Marcello Missiroli con
Sprint retrospective Sprint retrospective
-------------------- --------------------
- :download:`Sprint 1 Retrospective <1-retrospective.pdf>`
Sprint review 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>`

View file

@ -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.

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

View file

@ -1,11 +1,6 @@
Sprint 2: 03 Mag - 16 Mag Sprint 2: 03 Mag - 16 Mag
========================= =========================
.. todo::
Inserire informazioni generali sullo sprint, come inizio e fine.
Consegna Consegna
-------- --------
@ -16,26 +11,47 @@ La seguente documentazione è stata fornita dal cliente durante questo sprint:
Goal 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 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à Registro attività
@ -423,9 +439,14 @@ Questa statistica è stata generata dal prof. Marcello Missiroli con
.. _Gitinspector: https://github.com/ejwa/gitinspector .. _Gitinspector: https://github.com/ejwa/gitinspector
Sprint retrospective
--------------------
- :download:`Sprint 2 Retrospective <RetrospectiveSprint2.pdf>`
Sprint review 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

View file

@ -1,11 +1,6 @@
Sprint 3: 17 Mag - 30 Mag Sprint 3: 17 Mag - 30 Mag
========================= =========================
.. todo::
Inserire informazioni generali sullo sprint, come inizio e fine.
Consegna Consegna
-------- --------
@ -18,25 +13,52 @@ La seguente documentazione è stata fornita dal cliente durante questo sprint:
Goal 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 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à Registro attività
@ -346,6 +368,9 @@ Retrospettiva finale
Schermata finale di SonarQube 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

Binary file not shown.

View file

@ -2,6 +2,7 @@ from datetime import datetime, timedelta
from nest_backend.database import * from nest_backend.database import *
from .authentication import authenticate from .authentication import authenticate
import smtplib import smtplib
import tweepy as tw
def is_repo_alert_triggered(repository_id): def is_repo_alert_triggered(repository_id):
@ -36,7 +37,7 @@ def is_repo_alert_triggered(repository_id):
ext.session.commit() ext.session.commit()
print("alert triggered") print("alert triggered")
alerts_triggered.append(alert) alerts_triggered.append(alert)
send_notification_email(alert) #send_notification_email(alert)
send_notification_tweet(alert) send_notification_tweet(alert)
@ -48,14 +49,11 @@ def send_notification_email(alert):
conditions_string = conditions_string[:-1] conditions_string = conditions_string[:-1]
smtpObj = None smtpObj = None
try: try:
smtpObj = smtplib.SMTP('localhost') with smtplib.SMTP(host='localhost') as smtpObj:
smtpObj.sendmail("alert@nest.com", owner_repo.email, "Alert triggered") smtpObj.sendmail("alert@nest.com", owner_repo.email, "Alert triggered")
print("Successfully sent email") print("Successfully sent email")
except smtplib.SMTPException: except smtplib.SMTPException:
print("Error: unable to send email") print("Error: unable to send email")
finally:
if smtpObj is not None:
smtpObj.close()
def send_notification_tweet(alert): def send_notification_tweet(alert):
@ -65,7 +63,10 @@ def send_notification_tweet(alert):
conditions_string += condition.condition.content + ',' conditions_string += condition.condition.content + ','
conditions_string = conditions_string[:-1] conditions_string = conditions_string[:-1]
print(conditions_string) print(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}") 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__ = ( __all__ = (

View file

@ -19,6 +19,12 @@ def search_repo_conditions(repository_id):
print(f"Searching tweets from repo: {repo.name}") print(f"Searching tweets from repo: {repo.name}")
evaluation_mode = repo.evaluation_mode 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() conditions_type = dict()
# Dividing condition into condition types # Dividing condition into condition types
@ -54,8 +60,8 @@ def search_repo_conditions(repository_id):
for condition_content in conditions_type[ConditionType.coordinates]: for condition_content in conditions_type[ConditionType.coordinates]:
coordinates_tweet = condition_content.content.split() coordinates_tweet = condition_content.content.split()
coordinates_string = coordinates_tweet[2] + "," + coordinates_tweet[3] + "," + str(float(coordinates_tweet[1])/1000) + "km" coordinates_string = coordinates_tweet[2] + "," + coordinates_tweet[3] + "," + str(float(coordinates_tweet[1])/1000) + "km"
print(coordinates_string) print(f"Le coordinate di questa condizione sono: {coordinates_string}")
for tweet in tw.Cursor(method=api.search, q="", geocode=coordinates_string).items(10): 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(): if not Tweet.query.filter_by(snowflake=str(tweet.id)).all():
image_url_list = '' image_url_list = ''
if 'media' in tweet.entities.keys(): if 'media' in tweet.entities.keys():
@ -92,17 +98,17 @@ def search_repo_conditions(repository_id):
queryString += ("since:" + condition_content.content[2:] + " " + queryConjunction + " ") queryString += ("since:" + condition_content.content[2:] + " " + queryConjunction + " ")
# End of query string # End of query string
queryString = queryString[:-len(queryConjunction) - 1] queryString = queryString[:-len(queryConjunction) - 1]
print(queryString) print(f"La stringa di query finale e':{queryString}")
if evaluation_mode == ConditionMode.all_or: if evaluation_mode == ConditionMode.all_or:
if queryString != "": 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) 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: 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) 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: for tweet in tweetsFound:
if not Tweet.query.filter_by(snowflake=str(tweet.id)).all(): if not Tweet.query.filter_by(snowflake=str(tweet.id)).all():
image_url_list = '' image_url_list = ''