Skip to content

Commit

Permalink
Enhance profile management with dynamic routing and comprehensive use…
Browse files Browse the repository at this point in the history
…r experience improvements

- Add username-based routing for profile-related views
- Implement dynamic base template selection for admin and non-admin contexts
- Improve pagination and search functionality in admin profile list
- Add dashboard-specific routing for profile management
- Enhance common data context with profile initialization checks
- Update iframe and profile management templates to support dynamic routing
  • Loading branch information
NagiPragalathan committed Feb 10, 2025
1 parent 81f3999 commit 8bb6901
Show file tree
Hide file tree
Showing 20 changed files with 754 additions and 89 deletions.
Binary file modified QuizApp/__pycache__/urls.cpython-312.pyc
Binary file not shown.
13 changes: 11 additions & 2 deletions QuizApp/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,20 +76,26 @@


profile =[
path('profile/profile_management', profile_management, name='profile_management'),
path('profile/profile_management/<str:username>', profile_management, name='profile_management'),
path('add_edit_user_profile', add_edit_user_profile, name='add_edit_user_profile'), # here we can create new user so this is first tab.
path('add_profile/<str:username>', add_profile, name='add_profile'),
path('add_profile/<str:username>/<int:dashboard>', add_profile, name='add_profile'),
path('add_contact_details/<str:username>', add_contact_details, name='add_contact_details'),
path('add_contact_details/<str:username>/<int:dashboard>', add_contact_details, name='add_contact_details'),
path('add_or_edit_address/<str:username>', add_or_edit_address, name='add_or_edit_address'),
path('add_or_edit_address/<str:username>/<int:dashboard>', add_or_edit_address, name='add_or_edit_address'),
path('add_or_edit_bio/<str:username>', add_or_edit_bio, name='add_or_edit_bio'),
path('add_or_edit_bio/<str:username>/<int:dashboard>', add_or_edit_bio, name='add_or_edit_bio'),
path('delete_image', delete_image, name='delete_image'),
path('add_gallery', add_gallery, name='add_gallery'),

]

connections = [
path('send_connection_request/<int:user_id>', send_connection_request, name='send_connection_request'),
path('accept_connection_request/<int:connection_id>', accept_connection_request, name='accept_connection_request'),
path('connections', connection_list, name='connections'),
path('connections/<str:username>', connection_list, name='connections'),
path('list_users', list_users, name='list_users'),
path('pending_request', pending_request, name='pending_request'),
path('incoming_requests', incoming_requests, name='incoming_requests'),
Expand All @@ -106,6 +112,7 @@
testimonial = [
path('menuOfTestimonial', menuOfTestimonial, name='menuOfTestimonial'),
path('incoming_testimonials', incoming_testimonials, name='incoming_testimonials'),
path('incoming_testimonials/<str:username>', incoming_testimonials, name='incoming_testimonials'),
path('list_requested_testimonials', list_requested_testimonials, name='list_requested_testimonials'),
path('list_inboxrequested_testimonials', list_inboxrequested_testimonials, name='list_inboxrequested_testimonials'),
path('give_testimonial/<int:receiver_id>', give_testimonial, name='give_testimonial'),
Expand Down Expand Up @@ -281,6 +288,7 @@
path('profile/list/', profile_list_view, name='profile-list'),
# URL for editing an existing profile
path('profile/edit/<int:pk>/', profile_view, name='profile-edit'),
path('profile/<str:username>/', view_profile, name='view_profile'),
]

training_sessions = [
Expand Down Expand Up @@ -323,7 +331,8 @@
]

iframe_url = [
path('iframe/<str:username>', iframe, name='iframe'),
path('iframe/<str:username>/', iframe, name='iframe'),
path('iframe/<str:username>/<int:dashboard>', iframe, name='iframe'),
path('email/', email, name='email'),
path('portal/', portal, name='portal'),
]
Expand Down
36 changes: 29 additions & 7 deletions base/admin_views/chapter/profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from base.models import MainProfile, ChapterName, Region, Chapter
from django.db.models import Q
from datetime import datetime
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

def profile_view(request, pk=None):
profile = None
Expand Down Expand Up @@ -70,6 +71,7 @@ def profile_list_view(request):
chapter_filter = request.GET.get('chapter', None)
region_filter = request.GET.get('region', None)
search_query = request.GET.get('search', '').strip()
search_field = request.GET.get('search_field', 'all') # New parameter for search field

# Apply chapter filter (manual filtering)
if chapter_filter:
Expand Down Expand Up @@ -102,21 +104,41 @@ def profile_list_view(request):
print(f"Error while filtering region: {e}", profile)
profiles = temp

# Apply search query filter (Django ORM way)
# Enhanced search query filter
if search_query:
profiles = profiles.filter(
Q(display_name__icontains=search_query) |
Q(first_name__icontains=search_query) |
Q(last_name__icontains=search_query)
)
if search_field == 'display_name':
profiles = profiles.filter(display_name__icontains=search_query)
elif search_field == 'first_name':
profiles = profiles.filter(first_name__icontains=search_query)
elif search_field == 'last_name':
profiles = profiles.filter(last_name__icontains=search_query)
elif search_field == 'username':
profiles = profiles.filter(user__username__icontains=search_query)
else: # 'all' or default case
profiles = profiles.filter(
Q(display_name__icontains=search_query) |
Q(first_name__icontains=search_query) |
Q(last_name__icontains=search_query) |
Q(user__username__icontains=search_query)
)

# Pagination
page = request.GET.get('page', 1)
paginator = Paginator(profiles, 20) # Show 10 profiles per page
try:
profiles = paginator.page(page)
except PageNotAnInteger:
profiles = paginator.page(1)
except EmptyPage:
profiles = paginator.page(paginator.num_pages)

# Render the filtered profiles
return render(request, "custom_admin/chapter/profile/profile_list.html", {
"profiles": profiles,
"chapters": chapters,
"chapter_names": chapter_names,
"regions": regions,
"search_query": search_query,
"search_field": search_field,
"chapter_filter": chapter_filter,
"region_filter": region_filter,
})
89 changes: 75 additions & 14 deletions base/views/Profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@ def is_admin_user(user):
return user.is_superuser or user.is_staff


def profile_management(request):
return render(request, 'Profile/profile_management.html')
def profile_management(request, username):
return render(request, 'Profile/profile_management.html', {'username': username})

def add_profile(request, username):

def add_profile(request, username, dashboard=0):
if request.method == 'POST':
user = User.objects.get(username=username)
title = request.POST.get('title', '')
Expand Down Expand Up @@ -82,6 +83,8 @@ def add_profile(request, username):
# Ensure `base_template` is always set correctly
is_admin = is_admin_user(request.user)
base_template = 'dummy_base_dont_remove_this_file.html' if is_admin else 'base.html'
if dashboard != 0:
base_template = 'dummy_base_dont_remove_this_file.html'

try:
if not is_admin:
Expand All @@ -99,8 +102,11 @@ def add_profile(request, username):
except MainProfile.DoesNotExist:
# Show error message if profile does not exist
messages.error(request, "Contact your admin to ask to initialize the main profile. Thanks.")
profile = MainProfile.objects.filter(user=request.user).first()
chapters = Chapter.objects.filter(name=profile.Chapter.id).first()
try:
profile = MainProfile.objects.filter(user=request.user).first()
chapters = Chapter.objects.filter(name=profile.Chapter.id).first()
except Exception as e:
chapters = ChapterName.objects.all()

return render(request, 'Profile/add_profile.html', {
'data': None,
Expand All @@ -112,7 +118,7 @@ def add_profile(request, username):
})


def add_contact_details(request, username):
def add_contact_details(request, username, dashboard=0):
if request.method == 'POST':
user = User.objects.get(username=username)
show_on_bni_public_websites = request.POST.get('show_on_bni_public_websites') == 'on'
Expand Down Expand Up @@ -180,7 +186,9 @@ def add_contact_details(request, username):

# Ensure base_template is always set
base_template = 'dummy_base_dont_remove_this_file.html' if is_admin_user(request.user) else 'base.html'

if dashboard != 0:
base_template = 'dummy_base_dont_remove_this_file.html'

return render(request, 'Profile/add_contact_details.html', {"initial_data": initial_data, "base_template": base_template})


Expand Down Expand Up @@ -227,9 +235,9 @@ def add_edit_user_profile(request):
user_profile.save()
messages.success(request, "New user profile created successfully.")

return redirect('add_edit_user_profile')
return redirect('iframe', username=username)

base_template = 'dummy_base_dont_remove_this_file.html' if is_admin_user(request.user) else 'base.html'
base_template = 'admin_base.html' if is_admin_user(request.user) else 'base.html'

return render(request, 'Profile/add_edit_user_profile.html', {
'user_profile': None if is_admin_user(request.user) else user_profile,
Expand All @@ -239,7 +247,7 @@ def add_edit_user_profile(request):


@login_required
def add_or_edit_address(request, username):
def add_or_edit_address(request, username, dashboard=0):
user = User.objects.get(username=username)
is_admin = is_admin_user(request.user)
print("user :", user)
Expand Down Expand Up @@ -293,6 +301,9 @@ def add_or_edit_address(request, username):

# Ensure base_template is always set
base_template = 'dummy_base_dont_remove_this_file.html' if is_admin else 'base.html'
if dashboard != 0:
base_template = 'dummy_base_dont_remove_this_file.html'


# Context dictionary
context = {
Expand All @@ -305,7 +316,7 @@ def add_or_edit_address(request, username):
return render(request, 'Profile/add_or_edit_address.html', context)


def add_or_edit_bio(request, username):
def add_or_edit_bio(request, username, dashboard=0):
user = User.objects.get(username=username)
try:
bio = Bio.objects.get(user=user)
Expand Down Expand Up @@ -359,8 +370,15 @@ def add_or_edit_bio(request, username):
)

return redirect('add_or_edit_bio', username=username)
base_template = 'dummy_base_dont_remove_this_file.html' if is_admin_user(request.user) else 'base.html'
if dashboard != 0:
base_template = 'dummy_base_dont_remove_this_file.html'

return render(request, 'Profile/add_or_edit_bio.html', {'bio': bio,
'base_template': base_template,
})


return render(request, 'Profile/add_or_edit_bio.html', {'bio': bio})

# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Gallery >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Expand All @@ -387,12 +405,55 @@ def delete_image(request):
return JsonResponse({'error': 'Invalid request'})


def iframe(request, username):
return render(request, 'iframe.html', {'username': username})
def iframe(request, username, dashboard=0):
if dashboard == 0:
return render(request, 'iframe.html', {'username': username,
'is_admin': is_admin_user(request.user),
'base_template': 'admin_base.html' if is_admin_user(request.user) else 'base.html'
})
else:
return render(request, 'iframe.html', {'username': username,
'is_admin': is_admin_user(request.user),
'base_template': 'dummy_base_dont_remove_this_file.html' if is_admin_user(request.user) else 'base.html'
})

def email(request):
return render(request, 'email.html')

def portal(request):
return render(request, 'portal.html')

def view_profile(request, username):
user = User.objects.get(username=username)
try:
user_profile = UserProfile.objects.get(user=user)
profile = MainProfile.objects.get(user=user)
contact_details = ContactDetails.objects.get(user=user)
address = Address.objects.get(user=user)
bio = Bio.objects.get(user=user)
gallery = Gallery.objects.filter(user=user)
except Exception as e:
print(e)
user_profile = None
profile = None
contact_details = None
address = None
bio = None
gallery = None

# Add these counts
connection_count = user.connections.count() if hasattr(user, 'connections') else 0
testimonial_count = user.received_testimonials.count() if hasattr(user, 'received_testimonials') else 0

return render(request, 'Profile/view_profile.html', {
'username': username,
'user_profile': user_profile,
'profile': profile,
'contact_details': contact_details,
'address': address,
'bio': bio,
'gallery': gallery,
'connection_count': connection_count,
'testimonial_count': testimonial_count,
})

9 changes: 6 additions & 3 deletions base/views/Testimonials.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,12 @@ def give_testimonial(request, receiver_id):
return render(request, 'testimonial/give_testimonial.html', {"receiver_id": receiver_id})


def incoming_testimonials(request):
# Retrieve the current user from the session or request.user if using Django's authentication system
current_user = request.user
def incoming_testimonials(request, username=None):
if username:
current_user = User.objects.get(username=username)
else:
current_user = request.user


for i in Testimonial.objects.all():
print(i.from_user.username, i.to_user.username)
Expand Down
Binary file modified base/views/__pycache__/common.cpython-312.pyc
Binary file not shown.
Binary file modified base/views/__pycache__/connections.cpython-312.pyc
Binary file not shown.
31 changes: 26 additions & 5 deletions base/views/common.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from django.shortcuts import render
from django.shortcuts import render, redirect
from base.models import CityData, Group, Connection, MainProfile, oneToOneMessage, Meeting, UserProfile, ChapterEducationUnit, TYFCB, ReferralSlip, Visitor
from base.models import CityData, Group, Connection, MainProfile, oneToOneMessage, Meeting, UserProfile, ChapterEducationUnit, TYFCB, ReferralSlip, Visitor, Bio, Address
from base.form.forms import CityDataForm
from django.contrib.auth.decorators import login_required
from django.db.models import Q
Expand Down Expand Up @@ -258,26 +258,47 @@ def common_data(request):
days_left_for_renewal = None # If renewal date is missing, return None
except AttributeError: # Catch errors only when profile is None or missing attributes
days_left_for_renewal = None


try:
main_profile = MainProfile.objects.get(user=current_user)
main_profile = 1
except MainProfile.DoesNotExist:
main_profile = 0

try:
bio = Bio.objects.get(user=current_user)
bio = 1
except Bio.DoesNotExist:
bio = 0

print(renewal_message, days_left_for_renewal)

is_admin = request.user.is_superuser or request.user.is_staff

context.update({
'usr_profile': profile,
'usr_name': usr_name,
'unseen_messages_count': unseen_messages_count,
'unseen_messages': unseen_messages_list,
'renewal_message': renewal_message, # Add renewal message to context
'days_left_for_renewal': days_left_for_renewal, # Add days left to context
'usr_img':usr_img
'usr_img':usr_img,
'main_profile': main_profile,
'bio': bio,
'is_admin': 1 if is_admin else 0
})
else:

context.update({
'usr_name': "No name",
'unseen_messages_count': 0,
'unseen_messages': [],
'unseen_messages': [],
'renewal_message': 0, # No renewal message for unauthenticated users
'days_left_for_renewal': 0, # No days left calculation for unauthenticated users
'usr_img': 'none'
'usr_img': 'none',
'main_profile': None,
'bio': None,
'is_admin': is_admin
})

return context
13 changes: 9 additions & 4 deletions base/views/connections.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,19 @@
from django.contrib import messages

@login_required
def connection_list(request):
def connection_list(request, username=None):
if username:
user = User.objects.get(username=username)
else:
user = request.user

connections = Connection.objects.filter(
(Q(user=request.user) | Q(connection=request.user)),
(Q(user=user) | Q(connection=user)),
status='accepted'
)

users = User.objects.filter(Q(id__in=connections.values('user')) | Q(id__in=connections.values('connection')))
profiles = MainProfile.objects.filter(user__in=users).exclude(user=request.user)
profiles = MainProfile.objects.filter(user__in=users).exclude(user=user)

return render(request, 'connections/connections.html', {'profiles': profiles})

Expand Down
Loading

0 comments on commit 8bb6901

Please sign in to comment.