Skip to content

Commit 0c70662

Browse files
Added comments for views.py
1 parent 27994fa commit 0c70662

File tree

8 files changed

+353
-194
lines changed

8 files changed

+353
-194
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
# Directories #
1212
##################
1313
/venv
14+
pugliaeventi/engine/data
1415

1516
# Packages #
1617
############
@@ -38,3 +39,5 @@
3839
.Trashes
3940
ehthumbs.db
4041
Thumbs.db
42+
43+

.idea/workspace.xml

+246-188
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

engine/lightfm_pugliaeventi.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def find_recommendations(user, model, data):
2727
n_users, n_items = data['train'].shape
2828

2929
# places the user already rated
30-
known_positives = data['item_labels'][data['train'].tocsr()[user].indices]
30+
# known_positives = data['item_labels'][data['train'].tocsr()[user].indices]
3131

3232
# movies our model predicts they will like
3333

File renamed without changes.

pugliaeventi/views.py

+17
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,23 @@
66
from recommender_webapp.models import Mood, Rating
77

88

9+
"""
10+
Pagina principale:
11+
La view, prima di procedere con la visualizzazione della pagina principale, verifica il numero di rating effettuati
12+
dall'utente. In questa prima versione, il rating consiste nell'aggiunta di un luogo al proprio profilo, senza un rate
13+
numerico. Dato che LightFM implementa un modello implicito, non è necessario un rate numerico. Se il numero di rating
14+
è inferiore al numero di rating necessari per la configurazione del profilo, significa che l'utente non ha ancora
15+
concluso la procedura di configurazione. In tal caso, l'utente viene reindirizzato alla pagina della configurazione
16+
del profilo. In caso contrario, si procede con la visualizzazione della pagina principale.
17+
La pagina principale consente di visualizzare i posti raccomandati in base al mood (angry, joyful, sad), alla
18+
companionship (withFriends oppure alone), alla distanza in KM e alla presenza di eventi. Questi sono i filtri presenti
19+
nel form. Per ricevere le raccomandazioni viene utilizzato il metodo find_recommendations del modulo lightfm_manager.
20+
L'ID utente utilizzato da LightFM, e quindi passato al metodo find_recommendations, è una stringa che si costituisce
21+
delle seguenti componenti: (ID utente in Django incrementato di 100) + ID mood + ID companionship. Ad esempio, se l'id
22+
utente in django è 4, l'ID mood è 2 e l'ID companionship è 1 allora la stringa rappresentante l'utente è: 10421. L'id
23+
utente di django viene sommato a 100 in quanto gli utenti da 1 a 100 sono già presenti nel dataset di LightFM (vedi
24+
data/users.csv e ratings_train.csv)
25+
"""
926
@csrf_protect
1027
def index(request):
1128
context = {}

recommender_webapp/backend.py

Whitespace-only changes.

recommender_webapp/initializer.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
from recommender_webapp.common.data_loader import DataLoader
22

3-
data_loader = DataLoader()
3+
data_loader = DataLoader()

recommender_webapp/views.py

+85-4
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33

44
from django.contrib.auth import authenticate, login, logout
55
from django.shortcuts import render, redirect
6-
7-
# Create your views here.
86
from django.views.decorators.csrf import csrf_protect
97

108
from recommender_webapp.common import lightfm_manager, constant
@@ -13,6 +11,13 @@
1311
from recommender_webapp.models import Comune, Distanza, Place, Mood, Companionship, Rating, User, Profile, Event
1412

1513

14+
"""
15+
Login:
16+
La view permette l'autenticazione dell'utente. Successivamente all'autenticazione, viene verificato il numero di rating
17+
effettuati dall'utente. Se quest'ultimo risulta essere inferiore al numero di rating necessari per effettuare la
18+
configurazione del profilo, allora l'utente viene reindirizzato alla pagina della configurazione. In caso contrario,
19+
viene reindirizzato alla pagina principale.
20+
"""
1621
@csrf_protect
1722
def user_login(request):
1823
if request.POST:
@@ -36,11 +41,23 @@ def user_login(request):
3641
return render(request, '404.html')
3742

3843

44+
"""
45+
Logout:
46+
La view permette il logout dell'utente. Successivamente al logout si viene reindirizzati alla pagina principale.
47+
"""
3948
def user_logout(request):
4049
logout(request)
4150
return redirect('/')
4251

4352

53+
"""
54+
Signup:
55+
La view permette la registrazione di un nuovo utente. All'utente standard di Django, vengono linkate ulteriori
56+
informazioni, racchiuse all'interno del model Profile, tra cui la città. In fase di signup è essenziale che l'utente
57+
fornisca la sua città (location). La location è importante per poter recuperare i posti nelle vicinanze in fase di
58+
configurazione del profilo utente e poter effettuare post-filtering sulle raccomandazioni fornite da LightFM. Al
59+
termine della procedura di signup, l'utente viene reindirizzato alla pagina principale.
60+
"""
4461
@csrf_protect
4562
def user_signup(request):
4663
user_form = UserRegisterForm(request.POST or None)
@@ -69,6 +86,26 @@ def user_signup(request):
6986
return render(request, "signup.html", context)
7087

7188

89+
"""
90+
Configurazione del profilo utente:
91+
La view, prima di procedere con la visualizzazione della pagina di configurazione del profilo utente, verifica il
92+
numero di rating effettuati dall'utente. Se quest'ultimo risulta essere inferiore al numero di rating necessari per la
93+
configurazione del profilo utente, allora l'utente non ha ancora concluso la procedura di configurazione, per cui viene
94+
calcolata la percentuale di completamento della procedura. In caso contrario, la procedura è stata completata, quindi
95+
viene aggiornato il campo first_configuration presente nella tabella del profilo utente e si viene reindirizzati alla
96+
pagina principale.
97+
In questa prima versione del sistema, i contesti considerati sono 6, dati dalla combinazione delle variabili mood
98+
(angry, joyful, sad) e companionship (withFriends, alone). Per ciascun contesto, l'utente deve scegliere 3 luoghi,
99+
necessari per costruire il suo profilo utente e fornirgli raccomandazioni. Di volta in volta, l'utente ha la
100+
possibilità di scegliere tra quelli che sono i luoghi a lui più vicini (range di 10KM).
101+
IMPORTANTE: in questa prima versione del sistema, per ciascun contesto l'utente seleziona posti differenti, cioè un
102+
luogo non può essere selezionato in più contesti. Infatti, di volta in volta vengono restituiti i luoghi non ancora
103+
selezionati. Questa scelta è stata effettuata per meglio verificare i risultati restituiti da LightFM, dato che si
104+
tratta di un modello implicito (quindi non considera i rate forniti dall'utente, piuttosto sfrutta le features dei luoghi).
105+
Ciò non toglie che la procedura può essere impostata per consentire all'utente di scegliere il medesimo luogo in
106+
contesti differenti (ed è sensato, dato che una persona potrebbe preferire un luogo etichettato come MANGIARE e BERE,
107+
sia in un contesto JOYFUL-WITHFRIENDS, sia in un contesto ANGRY_WITHFRIENDS)
108+
"""
72109
def profile_configuration(request):
73110
if request.user.is_authenticated:
74111

@@ -150,6 +187,14 @@ def profile_configuration(request):
150187
return render(request, "profile_configuration.html", context)
151188

152189

190+
"""
191+
Selezione di un luogo durante la procedura di configurazione del profilo utente:
192+
La view consente l'aggiunta di un luogo al proprio profilo utente, considerando il mood e la companionship.
193+
In questa prima versione del sistema l'utente non fornisce un rate numerico al luogo in quanto LightFM implementa un
194+
modello implicito, per cui non si basa sui punteggi forniti dall'utente. Ciò non toglie che il campo rating contenente
195+
il punteggio potrebbe essere utile in futuro. In questo caso, viene assegnato un rating di default. In seguito l'utente
196+
viene reindirizzato alla pagina della configurazione del profilo.
197+
"""
153198
def add_rating_config(request, place_id, mood, companionship):
154199
if request.user.is_authenticated:
155200

@@ -165,6 +210,10 @@ def add_rating_config(request, place_id, mood, companionship):
165210
return redirect('/')
166211

167212

213+
"""
214+
Visualizzazione dei luoghi vicini all'utente:
215+
La view consente la visualizzazione dei luoghi vicini all'utente in un range di km che può essere di 5 oppure 10 KM.
216+
"""
168217
def close_places(request):
169218
context = {}
170219
close_places = []
@@ -203,6 +252,11 @@ def close_places(request):
203252
return render(request, 'places.html', context)
204253

205254

255+
"""
256+
Visualizzazione dei luoghi del profilo utente, per ciacun contesto:
257+
La view consente la visualizzazione dei luoghi appartenenti al proprio profilo utente, cioè i luoghi selezionati per
258+
ciascun contesto (in questo caso i 6 contesti generati dalle combinazioni di Mood e Companionship).
259+
"""
206260
def my_places(request):
207261
context = {}
208262
my_places = []
@@ -230,6 +284,25 @@ def my_places(request):
230284
return render(request, 'my_places.html', context)
231285

232286

287+
"""
288+
Visualizzazione dei dettagli di un luogo:
289+
La view consente di visualizzare i dettagli di un luogo ed eventualmente aggiungerlo al proprio profilo utente. In
290+
questa prima versione del sistema l'aggiunta del luogo al proprio profilo utente, specificando Mood e Companionship, è
291+
possibile solo se non è stato aggiunto in precedenza con qualche altro contesto. Tuttavia, questo non vieta che la
292+
procedura descritta nel seguente metodo possa essere impostata per aggiungere il luogo ad un contesto nonostante sia
293+
stato già aggiunto in altri contesti (ad esempio, un utente che preferisce un luogo sia nel contesto Joyful e
294+
WithFriends, sia nel contesto Angry e WithFriends).
295+
Quando un utente decide di aggiungere un luogo al proprio profilo sotto un contesto specifico, è necessario fornire tale
296+
informazione anche al modello di LightFM. In tal caso non è necessario ricalcolare il modello, ma è sufficiente
297+
fornire la relazione aggiuntiva (ID UTENTE - ID LUOGO). Il metodo responsabile di questa operazione è add_rating del
298+
modulo lightfm_manager.
299+
L'ID utente utilizzato da LightFM, e quindi passato al metodo add_rating, è una stringa che si costituisce
300+
delle seguenti componenti: (ID utente in Django incrementato di 100) + ID mood + ID companionship. Ad esempio, se l'id
301+
utente in django è 4, l'ID mood è 2 e l'ID companionship è 1 allora la stringa rappresentante l'utente è: 10421. L'id
302+
utente di django viene sommato a 100 in quanto gli utenti da 1 a 100 sono già presenti nel dataset di LightFM (vedi
303+
data/users.csv e ratings_train.csv).
304+
Inoltre, la seguente view fornisce anche informazioni su eventuali eventi che si svolgeranno nel luogo in questione.
305+
"""
233306
def place_details(request, place_id):
234307
context = {}
235308
if request.user.is_authenticated:
@@ -282,6 +355,10 @@ def place_details(request, place_id):
282355
return render(request, 'place.html', context)
283356

284357

358+
"""
359+
Visualizzazione dei dettagli su un evento:
360+
La view consente di visualizzare i dettagli di un evento, come il nome, la location, le etichette ed informazioni varie.
361+
"""
285362
def event_details(request, event_id):
286363
context = {}
287364
if request.user.is_authenticated:
@@ -297,6 +374,12 @@ def event_details(request, event_id):
297374
return render(request, 'event.html', context)
298375

299376

377+
"""
378+
Visualizzazione del profilo utente:
379+
La view consente di visualizzare il proprio profilo utente ed eventualmente effettuare modifiche. All'interno del
380+
relativo template è stato inserito il button "Link to Myrror", che potrebbe essere utile in futuro per prelevare le
381+
informazioni sul profilo utente utilizzando le api di Myrror.
382+
"""
300383
def user_profile(request):
301384

302385
context = {
@@ -309,8 +392,6 @@ def user_profile(request):
309392
instance = Profile.objects.get(user=request.user)
310393
full_profile_form = FullProfileForm(request.POST or None, instance=instance)
311394
context['form'] = full_profile_form
312-
# initial_mood = (Mood.joyful.name, Mood.joyful.value)
313-
# search_rec_form.fields['mood'].initial = initial_mood
314395

315396
if full_profile_form.is_valid():
316397
location = full_profile_form.cleaned_data.get('location')

0 commit comments

Comments
 (0)