Skip to content

Commit 5ee94b3

Browse files
committed
updated each app
1 parent 1f4da62 commit 5ee94b3

36 files changed

+1464
-616
lines changed

fitness/admin.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,19 @@
11
from django.contrib import admin
2+
from .models import (
3+
FrequentlyAskedQuestion,
4+
TopSearch,
5+
)
26

3-
# Register your models here.
7+
8+
class FAQAdmin(admin.ModelAdmin):
9+
list_display = ['id', 'title', 'date']
10+
search_fields = ['title', 'content']
11+
12+
13+
class TopSearchAdmin(admin.ModelAdmin):
14+
list_display = ['name', 'search_count']
15+
search_fields = ['name']
16+
17+
18+
admin.site.register(FrequentlyAskedQuestion, FAQAdmin)
19+
admin.site.register(TopSearch, TopSearchAdmin)

fitness/forms.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,2 @@
11
# forms.py
22
import django.forms as forms
3-
from .models import FitnessGoal
4-
5-
6-
class FitnessGoalsForm(forms.Form):
7-
8-
class Meta:
9-
model = FitnessGoal
10-
fields = "__all__"
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Generated by Django 4.2.7 on 2024-05-03 10:46
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('fitness', '0001_initial'),
10+
]
11+
12+
operations = [
13+
migrations.CreateModel(
14+
name='FrequentlyAskedQuestion',
15+
fields=[
16+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
17+
('title', models.CharField(max_length=500)),
18+
('content', models.TextField()),
19+
('date', models.DateField(auto_now=True)),
20+
],
21+
),
22+
migrations.CreateModel(
23+
name='TopSearch',
24+
fields=[
25+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
26+
('name', models.CharField(max_length=500, null=True)),
27+
('search_count', models.IntegerField(default=0)),
28+
],
29+
),
30+
]
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Generated by Django 4.2.7 on 2024-05-04 03:40
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('fitness', '0002_frequentlyaskedquestion_topsearch'),
10+
]
11+
12+
operations = [
13+
migrations.DeleteModel(
14+
name='FitnessGoal',
15+
),
16+
]

fitness/models.py

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,18 @@
11
from django.db import models
2-
from user.models import CustomUser
32

4-
PHYSICAL_ACTIVITY_CHOICES = (
5-
('LO', "low"),
6-
('MO', "Moderate"),
7-
('HI', "high"),
8-
)
93

10-
DIETARY_PREFERENCES_CHOICES =(
11-
('BD', "Balanced Diet"),
12-
('PRD', "Protein Diet"),
13-
('VD', "Vegetarian Diet"),
14-
('MD', "Mediterranean Diet"),
15-
('GFD', "Gluten-Free Diet"),
16-
('LCD', "Low Carb Diet"),
17-
('PDD', "Plant-Based Diet"),
18-
('PD', "Paleo Diet"),
19-
('LFD', "Low Fat Diet"),
20-
)
4+
class TopSearch(models.Model):
5+
name = models.CharField(max_length=500, null=True)
6+
search_count = models.IntegerField(default=0)
217

8+
def __str__(self):
9+
return f'{self.name} - Searches: {self.search_count}'
2210

23-
class FitnessGoal(models.Model):
24-
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, blank=False, null=True)
25-
fitness_goals = models.CharField(max_length=100)
26-
medical_history = models.TextField(max_length=100)
27-
physical_activity_level = models.CharField(max_length=100)
28-
dietary_preferences = models.CharField(max_length=100)
11+
12+
class FrequentlyAskedQuestion(models.Model):
13+
title = models.CharField(max_length=500)
14+
content = models.TextField()
15+
date = models.DateField(auto_now=True, auto_now_add=False)
16+
17+
def __str__(self):
18+
return self.title

fitness/urls.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
from django.urls import path
2-
from .views import index_view, personization_data
2+
from .views import index_view, search_view, faq_views
33

44
app_name = "fitness"
55

66
urlpatterns = [
77
path("", index_view, name="index"),
8-
path("personalize/", index_view, name="personalize"),
8+
path("search/", search_view, name="search"),
9+
path("faqs/", faq_views, name="faqs"),
910
]

fitness/utils.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import pandas as pd
2+
from sklearn.metrics.pairwise import cosine_similarity
3+
from sklearn.preprocessing import OneHotEncoder, MultiLabelBinarizer
4+
5+
6+
class RecommendationSystem:
7+
def __init__(self, df):
8+
self.df = df
9+
10+
def collaborative_filtering(self, user_id, num_recommendations=5):
11+
user_profile = self.df.loc[self.df['User ID'] == user_id]
12+
13+
# Extract relevant features for collaborative filtering
14+
user_features = user_profile[['Primary Fitness Goal', 'Physical Activity Level']]
15+
all_features = self.df[['Primary Fitness Goal', 'Physical Activity Level']]
16+
17+
# Concatenate user features with all features
18+
concatenated_features = pd.concat([user_features, all_features])
19+
20+
# Encode categorical variables
21+
encoder = OneHotEncoder(drop='first', handle_unknown='ignore')
22+
encoded_features = encoder.fit_transform(concatenated_features)
23+
24+
# Split encoded features back into user and all features
25+
user_features_encoded = encoded_features[:1]
26+
all_features_encoded = encoded_features[1:]
27+
28+
# Compute similarity between the target user and all users
29+
similarities = cosine_similarity(user_features_encoded, all_features_encoded)[0]
30+
31+
# Find most similar users
32+
similar_users_indices = similarities.argsort()[::-1][1:] # Exclude the target user
33+
similar_users = self.df.iloc[similar_users_indices]
34+
35+
# Generate recommendations based on similar users' preferences
36+
recommendations = {
37+
'Nutritional Preferences': similar_users['Nutritional Preferences'].tolist()[:num_recommendations],
38+
'Fitness Environment': similar_users['Fitness Environment'].tolist()[:num_recommendations]
39+
}
40+
return recommendations
41+
42+
def content_based_filtering(self, user_id, num_recommendations=5):
43+
user_profile = self.df.loc[self.df['User ID'] == user_id]
44+
45+
# Extract user preferences
46+
user_preferences = user_profile[['Primary Fitness Goal', 'Physical Activity Level', 'Nutritional Preferences', 'Fitness Environment', 'Time Commitment']]
47+
48+
# Extract item features
49+
item_features = self.df[['Primary Fitness Goal', 'Physical Activity Level', 'Nutritional Preferences', 'Fitness Environment', 'Time Commitment']]
50+
51+
# Encode user preferences
52+
mlb = MultiLabelBinarizer()
53+
user_features_encoded = mlb.fit_transform(user_preferences.values)
54+
55+
# Encode item features
56+
item_features_encoded = mlb.transform(item_features.values)
57+
58+
# Compute similarity between items and user preferences
59+
similarities = cosine_similarity(user_features_encoded, item_features_encoded)
60+
61+
# Sort items based on similarity and recommend top ones
62+
similar_items_indices = similarities.argsort()[0][::-1]
63+
recommendations = {
64+
'Fitness Environment': self.df.iloc[similar_items_indices]['Fitness Environment'].tolist()[:num_recommendations],
65+
'Nutritional Preferences': self.df.iloc[similar_items_indices]['Nutritional Preferences'].tolist()[:num_recommendations],
66+
}
67+
68+
return recommendations

fitness/views.py

Lines changed: 89 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
from django.shortcuts import render, redirect
2-
from .forms import FitnessGoalsForm
3-
from blog.models import BlogPost
4-
from product.models import Product
1+
from django.shortcuts import render
52
from operator import attrgetter
6-
#from blog.utils import get_blog_queryset, get_category_queryset, get_blog_category_queryset
7-
"""from operator import attrgetter
8-
from blog.models import BlogPost, Category, Comment
3+
from django.db.models import Q
4+
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
5+
from operator import attrgetter
6+
from product.models import Product, Tag
7+
from blog.models import BlogPost, Category
8+
from .models import TopSearch, FrequentlyAskedQuestion
99

10-
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator"""
1110

1211
def index_view(request):
1312
all_post = sorted(BlogPost.objects.all(), key=attrgetter('date_updated'), reverse=True)
@@ -20,45 +19,106 @@ def index_view(request):
2019
return render(request, "fitness/index.html", context)
2120

2221

23-
def personization_data(request):
24-
if request.method == 'POST':
25-
form = FitnessGoalsForm(request.POST)
26-
if form.is_valid():
27-
form.save()
28-
return redirect('fitness:personization')
29-
else:
30-
form = FitnessGoalsForm()
31-
return render(request, 'fitness/personization.html', {'form': form})
22+
# SEARCH POST FUNCTION
23+
def get_product_queryset(query=None):
24+
queryset = []
25+
queries = query.split(" ")
26+
for q in queries:
27+
product = Product.objects.all().filter(
28+
Q(name__icontains=q) |
29+
Q(price__icontains=q) |
30+
Q(tag__tag_name__icontains=q) |
31+
Q(description__icontains=q)
32+
).distinct()
33+
for products in product:
34+
queryset.append(products)
35+
return list(set(queryset))
36+
37+
def get_blog_queryset(query=None):
38+
queryset = []
39+
queries = query.split(" ")
40+
for q in queries:
41+
post = BlogPost.objects.all().filter(
42+
Q(title__icontains=q) |
43+
Q(category__category_name__icontains=q) |
44+
Q(body__icontains=q)
45+
).distinct()
46+
for post in post:
47+
queryset.append(post)
48+
return list(set(queryset))
49+
50+
51+
def get_faq_queryset(query=None):
52+
queryset = []
53+
queries = query.split(" ")
54+
for q in queries:
55+
service = FrequentlyAskedQuestion.objects.all().filter(
56+
Q(title__icontains=q) |
57+
Q(content__icontains=q)
58+
).distinct()
59+
for services in service:
60+
queryset.append(services)
61+
return list(set(queryset))
62+
3263

33-
"""
3464
def search_view(request):
3565
context = {}
3666

3767
query = ""
3868
if request.GET:
3969
query = request.GET.get('q')
4070
context['query'] = str(query)
41-
42-
posts = sorted(get_blog_queryset(query), key=attrgetter('date_updated'), reverse=True)
71+
72+
top_search, created = TopSearch.objects.get_or_create(name=query)
73+
top_search.search_count += 1
74+
top_search.save()
75+
76+
product = sorted(get_product_queryset(query), key=attrgetter('date_updated'), reverse=True)
77+
post = sorted(get_blog_queryset(query), key=attrgetter('date_updated'), reverse=True)
4378

4479
# Pagination
45-
POSTS_PER_PAGE = 6
80+
POSTS_PER_PAGE = 9
4681
page = request.GET.get('page', 1)
47-
post_paginator = Paginator(posts, POSTS_PER_PAGE)
82+
product_paginator = Paginator(product, POSTS_PER_PAGE)
83+
post_paginator = Paginator(product, POSTS_PER_PAGE)
4884

4985
try:
50-
posts = post_paginator.page(page)
86+
product = product_paginator.page(page)
87+
post = post_paginator.page(page)
5188
except PageNotAnInteger:
52-
posts = post_paginator.page(POSTS_PER_PAGE)
89+
product = product_paginator.page(POSTS_PER_PAGE)
90+
post = post_paginator.page(POSTS_PER_PAGE)
5391
except EmptyPage:
54-
posts = post_paginator.page(post_paginator.num_pages)
92+
product = product_paginator.page(product_paginator.num_pages)
93+
post = post_paginator.page(post_paginator.num_pages)
5594

56-
category = get_category_queryset(query)
95+
faq = get_faq_queryset(query)
96+
97+
#search result couter
98+
"""if product:
99+
for items in product:
100+
search_result, _ = ProductSearch.objects.get_or_create(product=items)
101+
search_result.search_count += 1
102+
search_result.save()
103+
if post:
104+
for items in post:
105+
search_result, created = CleanServiceSearch.objects.get_or_create(post=items)
106+
search_result.search_count += 1
107+
search_result.save()"""
57108

58109
context = {
59-
'all_post': posts,
60-
'category':category,
110+
'all_product': product,
111+
'post': post,
112+
'faq_content': faq,
61113
'query': query,
114+
'top_search': TopSearch.objects.all()[:6]
62115
}
63116
return render(request, 'fitness/search.html', context)
64-
"""
117+
118+
119+
def faq_views(request):
120+
context = {
121+
'faq': True,
122+
'faq_content': FrequentlyAskedQuestion.objects.all(),
123+
}
124+
return render(request, "fitness/faqs.html", context)

0 commit comments

Comments
 (0)