From 32e67cf60d4e954289e7ffa2fd16d2da102b89bc Mon Sep 17 00:00:00 2001 From: Max_McVay Date: Wed, 10 May 2023 11:47:16 -0700 Subject: [PATCH] Added ordering of the shoes based on user form, first time logged in, will be redirected to fill out the form -- DOES NOT WORK FULLY --- data/ShoeExpert/ShoeExpert/urls.py | 2 +- data/ShoeExpert/app1/forms.py | 20 +++++++++ data/ShoeExpert/app1/models.py | 6 +++ data/ShoeExpert/app1/views.py | 43 +++++++++++++++++-- .../ShoeExpert/templates/app1/navigation.html | 4 +- 5 files changed, 70 insertions(+), 5 deletions(-) diff --git a/data/ShoeExpert/ShoeExpert/urls.py b/data/ShoeExpert/ShoeExpert/urls.py index fb88584..ef90ec5 100644 --- a/data/ShoeExpert/ShoeExpert/urls.py +++ b/data/ShoeExpert/ShoeExpert/urls.py @@ -25,7 +25,7 @@ path('join/', app1_views.join), path('login/', app1_views.user_login), path('logout/', app1_views.user_logout), - #path('blog/', app1_views.blog) + path('shoe_pref/', app1_views.shoe_pref), ] for url_path in Url_Paths: diff --git a/data/ShoeExpert/app1/forms.py b/data/ShoeExpert/app1/forms.py index 5830ced..8326dbd 100644 --- a/data/ShoeExpert/app1/forms.py +++ b/data/ShoeExpert/app1/forms.py @@ -15,3 +15,23 @@ class Meta(): class LoginForm(forms.Form): username = forms.CharField() password = forms.CharField(widget=forms.PasswordInput()) + +class ShoePreferenceForm(forms.Form): + CHOICES = [ + ('Approach', 'Approach'), + ('Basketball', 'Basketball'), + ('Climbing', 'Climbing'), + ('Cross Fit', 'Cross Fit'), + ('Football', 'Football'), + ('Golf', 'Golf'), + ('Hiking', 'Hiking'), + ('Running', 'Running'), + ('Sneaker', 'Sneaker'), + ('Soccer', 'Soccer'), + ('Tennis', 'Tennis'), + ('Track', 'Track'), + ('Trail', 'Trail'), + ('Training', 'Training'), + ('Walking', 'Walking'), + ] + preference = forms.MultipleChoiceField(choices=CHOICES, widget=forms.CheckboxSelectMultiple) diff --git a/data/ShoeExpert/app1/models.py b/data/ShoeExpert/app1/models.py index 918cd19..efb2e23 100644 --- a/data/ShoeExpert/app1/models.py +++ b/data/ShoeExpert/app1/models.py @@ -1,5 +1,6 @@ from aggregate import Url_Paths from django.db import models +from django.contrib.auth.models import User, AbstractUser # Create your models here. @@ -15,3 +16,8 @@ def create_shoe_model(url_path: Url_Paths): for url_path in Url_Paths: create_shoe_model(url_path) + +class UserPreference(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE) + shoe_type = models.CharField(max_length=50) + has_logged_in_before = models.BooleanField(default=False) diff --git a/data/ShoeExpert/app1/views.py b/data/ShoeExpert/app1/views.py index 0980f64..b499ed5 100644 --- a/data/ShoeExpert/app1/views.py +++ b/data/ShoeExpert/app1/views.py @@ -1,6 +1,6 @@ from aggregate import Url_Paths -from app1.forms import JoinForm, LoginForm -from django.contrib.auth import authenticate, login, logout +from app1.forms import JoinForm, LoginForm, ShoePreferenceForm +from django.contrib.auth import authenticate, login, logout, get_user_model from django.contrib.auth.decorators import login_required from django.core.paginator import Paginator from django.http import HttpResponse @@ -59,9 +59,23 @@ def join(request): return render(request, 'app1/join.html', page_data) + @login_required(login_url='/login/') def home(request): context_list = [] + user = request.user + if user.is_authenticated and not user.has_logged_in_before: + user.has_logged_in_before = True + user.save() + form = ShoePreferenceForm(request.POST or None) + if request.method == 'POST': + if form.is_valid(): + request.session['user_preference'] = form.cleaned_data.get('preference') + # Redirect to the home page to display the updated preferences + return redirect('home') + return render(request, 'app1/shoe_pref.html', { 'form': form }) + + user_preference = request.session.get('user_preference', None) for url_path in Url_Paths: tmp_dict = {} tmp_dict['shoes'] = globals()[url_path.name.capitalize()].objects.all().order_by('?')[:3] @@ -71,10 +85,22 @@ def home(request): tmp_dict['fields'] = [] for column in url_path.get_django_available_columns(): tmp_dict['headers'].append(url_path.get_column_name(column)) - tmp_dict['fields'].append(url_path.get_column_name(column, attribute = True)) + tmp_dict['fields'].append(url_path.get_column_name(column, attribute=True)) + + # Reorder the shoes based on user preference + if user_preference and user_preference in tmp_dict['fields']: + field_index = tmp_dict['fields'].index(user_preference) + shoes_with_pref = tmp_dict['shoes'].order_by('-' + user_preference) + shoes_without_pref = tmp_dict['shoes'].exclude(**{user_preference + '__isnull': True}) + tmp_dict['shoes'] = list(shoes_with_pref) + list(shoes_without_pref) + del tmp_dict['fields'][field_index] + tmp_dict['fields'] = [user_preference] + tmp_dict['fields'] + context_list.append(tmp_dict) + return render(request, 'app1/home.html', { 'context_list': context_list }) + @login_required(login_url='/login/') def generic_shoe(request, url_path): page_sizes = [5, 10, 15, 20, 30, 40, 50] @@ -111,3 +137,14 @@ def about(request): @login_required(login_url='/login/') def blog(request): return render(request, 'app1/blog.html') + +def shoe_pref(request): + if request.method == 'POST': + form = ShoePreferenceForm(request.POST) + if form.is_valid(): + user_preference = form.cleaned_data.get('preference') + request.session['user_preference'] = user_preference + return redirect('home') + else: + form = ShoePreferenceForm() + return render(request, 'app1/shoe_pref.html', { 'form': form }) diff --git a/data/ShoeExpert/templates/app1/navigation.html b/data/ShoeExpert/templates/app1/navigation.html index 92478fb..d693739 100644 --- a/data/ShoeExpert/templates/app1/navigation.html +++ b/data/ShoeExpert/templates/app1/navigation.html @@ -8,7 +8,9 @@