Skip to content

Commit d3908c4

Browse files
committed
feature/aahq-11-user-profile-db-storage-and-readedit-route
1 parent 9aa80e3 commit d3908c4

File tree

7 files changed

+95
-37
lines changed

7 files changed

+95
-37
lines changed

src/users/admin.py

+23-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,14 @@ class TempleWebAdminUserChangeForm(forms.ModelForm):
1414

1515
class Meta:
1616
model = TempleWebUser
17-
fields = ["email", "password", "is_superuser"]
17+
fields = [
18+
"first_name",
19+
"last_name",
20+
"is_staff",
21+
"email",
22+
"password",
23+
"is_superuser",
24+
]
1825

1926

2027
class TempleWebUserAdmin(UserAdmin):
@@ -24,7 +31,21 @@ class TempleWebUserAdmin(UserAdmin):
2431
list_display = ["email", "is_superuser"]
2532
list_filter = ["is_superuser"]
2633

27-
fieldsets = [(None, {"fields": ["email", "password", "is_superuser"]})]
34+
fieldsets = [
35+
(
36+
None,
37+
{
38+
"fields": [
39+
"email",
40+
"password",
41+
"is_superuser",
42+
"first_name",
43+
"last_name",
44+
"is_staff",
45+
]
46+
},
47+
)
48+
]
2849

2950
add_fieldsets = [
3051
(

src/users/forms.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from django import forms
2-
from .models import TempleWebUser
2+
from .models import TempleWebUser, UserProfile
33
from django.core.exceptions import ValidationError
44

55

@@ -57,3 +57,9 @@ def clean_password2(self):
5757
if password1 and password2 and password1 != password2:
5858
raise ValidationError("Passwords don't match")
5959
return password2
60+
61+
62+
class UserProfileForm(forms.ModelForm):
63+
class Meta:
64+
model = UserProfile
65+
fields = ["profile_pic", "address", "profession", "whatsapp_number"]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Generated by Django 4.2.1 on 2023-12-29 23:22
2+
3+
from django.db import migrations, models
4+
import utils.images
5+
6+
7+
class Migration(migrations.Migration):
8+
dependencies = [
9+
("users", "0003_userprofile"),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name="userprofile",
15+
name="profile_pic",
16+
field=models.ImageField(
17+
blank=True, null=True, upload_to=utils.images.upload_image_to
18+
),
19+
),
20+
]

src/users/models.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def __str__(self):
2020

2121
class UserProfile(models.Model):
2222
user = models.OneToOneField(TempleWebUser, on_delete=models.CASCADE)
23-
profile_pic = models.ImageField(upload_to=upload_image_to)
23+
profile_pic = models.ImageField(upload_to=upload_image_to, null=True, blank=True)
2424
address = models.TextField(max_length=1024)
2525
profession = models.CharField(max_length=256)
2626
whatsapp_number = models.CharField(max_length=15)

src/users/templates/users/profile.html

+28-28
Original file line numberDiff line numberDiff line change
@@ -5,37 +5,37 @@
55

66
<!-- content -->
77

8-
{% block content %}
8+
{% block content %} {% load tailwind_filters %}
99

10-
<div class="bg-gray-100 h-screen flex items-center justify-center">
11-
<div class="max-w-md bg-white p-8 rounded shadow-md">
12-
<div class="flex items-center justify-center">
10+
<div class="flex bg-gray-100 justify-center items-center h-screen w-screen">
11+
<div
12+
class="w-full max-w-sm bg-white border border-gray-200 rounded-lg shadow dark:bg-gray-800 dark:border-gray-700 px-12 py-6"
13+
>
14+
<div class="flex flex-col items-center pb-10">
1315
<img
14-
src="https://placekitten.com/100/100"
15-
alt="User Avatar"
16-
class="w-16 h-16 rounded-full"
16+
class="w-24 h-24 mb-3 rounded-full shadow-lg"
17+
{% if user_profile.profile_pic %}
18+
src="{{user_profile.profile_pic.url}}"
19+
{% else %}
20+
src=""
21+
{% endif %}
22+
alt="User Profile Image"
1723
/>
18-
</div>
19-
20-
<div class="mt-4">
21-
<h1 class="text-2xl font-semibold">John Doe</h1>
22-
<p class="text-gray-500">Web Developer</p>
23-
</div>
24-
25-
<div class="mt-6">
26-
<h2 class="text-lg font-semibold">Contact Information</h2>
27-
<ul class="mt-2 text-gray-600">
28-
<li>Email: [email protected]</li>
29-
<li>Phone: +1 234 567 890</li>
30-
</ul>
31-
</div>
32-
33-
<div class="mt-6">
34-
<h2 class="text-lg font-semibold">About Me</h2>
35-
<p class="mt-2 text-gray-600">
36-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam in dui
37-
mauris.
38-
</p>
24+
<h5 class="mb-1 text-xl font-medium text-gray-900 dark:text-white">
25+
{{user.first_name}} {{user.last_name}}
26+
</h5>
27+
<span class="text-sm text-gray-500 dark:text-gray-400"
28+
>{{user.email}}</span
29+
>
30+
<form enctype="multipart/form-data" method="post">
31+
{% csrf_token %} {{ form | crispy}}
32+
<button
33+
type="submit"
34+
class="text-white bg-primary-700 hover:bg-primary-800 focus:ring-4 focus:outline-none focus:ring-primary-300 font-medium rounded-lg text-sm sm:w-auto px-5 py-2.5 text-center dark:bg-primary-600 dark:hover:bg-primary-700 dark:focus:ring-primary-800"
35+
>
36+
Save
37+
</button>
38+
</form>
3939
</div>
4040
</div>
4141
</div>

src/users/urls.py

-1
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,3 @@
1111
path("login/", views.login_view, name="login"),
1212
path("logout", views.logout_view, name="logout"),
1313
]
14-

src/users/views.py

+16-4
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from django.contrib.auth import get_user_model
55

66
from .models import TempleWebUser, UserProfile
7-
from .forms import UserRegistrationForm, UserLoginForm
7+
from .forms import UserRegistrationForm, UserLoginForm, UserProfileForm
88

99
from django.core.exceptions import ValidationError
1010
from django.contrib.auth.decorators import login_required
@@ -39,8 +39,21 @@ def logout_view(request: HttpRequest):
3939

4040

4141
@login_required(login_url="/users/login")
42-
def me_view(request: HttpRequest):
43-
return render(request, "users/profile.html", {"email": request.user.email})
42+
def me_view(request: HttpRequest, edit: str = "view"):
43+
user_profile, truth = UserProfile.objects.get_or_create(user=request.user)
44+
45+
if request.method == "POST":
46+
form = UserProfileForm(request.POST, request.FILES, instance=user_profile)
47+
if form.is_valid():
48+
form.save()
49+
else:
50+
user_profile, truth = UserProfile.objects.get_or_create(user=request.user)
51+
form = UserProfileForm(instance=user_profile)
52+
return render(
53+
request,
54+
"users/profile.html",
55+
{"form": form, "user": request.user, "user_profile": user_profile},
56+
)
4457

4558

4659
def register(request: HttpRequest):
@@ -62,7 +75,6 @@ def register(request: HttpRequest):
6275
)
6376
user_profile.save()
6477

65-
6678
login(request, user)
6779
return redirect("users:me_view")
6880
else:

0 commit comments

Comments
 (0)