Skip to content

Commit 8368e58

Browse files
author
Aman Goyal
committed
emergecy commit
1 parent c53a4e4 commit 8368e58

File tree

8 files changed

+301
-34
lines changed

8 files changed

+301
-34
lines changed

blog/templates/blog/base.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
<!-- Navbar Right Side -->
3737
<div class="navbar-nav">
3838
{% if user.is_authenticated %}
39-
<a class="nav-item nav-link" href="{% url 'blog-post-user' user.username %}"><b>{{ user.first_name|title }}</b></a>
39+
<a class="nav-item nav-link" href="{% url 'user-profile' user.username %}"><b>{{ user.first_name|title }}</b></a>
4040
<a class="nav-item nav-link" href="{% url 'blog-post-create' %}">New Post</a>
4141
<a class="nav-item nav-link" href="{% url 'users-logout' %}"> Logout </a>
4242

blog/tests.py

+163-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,165 @@
11
from django.test import TestCase
2+
from django.contrib.auth import get_user_model
3+
from django.urls import reverse
24

3-
# Create your tests here.
5+
from .models import Post
6+
7+
8+
class HomePageTest(TestCase):
9+
def test_home_page_status_code(self):
10+
response = self.client.get('/')
11+
self.assertEqual(response.status_code, 200)
12+
13+
14+
class PostModelTest(TestCase):
15+
def setUp(self):
16+
self.testuser = get_user_model().objects.create(
17+
18+
username='testuser',
19+
first_name='test_first_name',
20+
last_name='test_last_name',
21+
)
22+
23+
self.post = Post.objects.create(
24+
title='test title',
25+
content='test content',
26+
author=self.testuser
27+
)
28+
29+
def test_post_content(self):
30+
post = Post.objects.get(id=1)
31+
user = get_user_model().objects.get(username='testuser')
32+
response = self.client.get(
33+
reverse('blog-post-user', kwargs={'username': user.username}))
34+
35+
exp_title = 'test title'
36+
exp_content = 'test content'
37+
exp_author = user
38+
39+
self.assertEqual(exp_title, post.title)
40+
self.assertEqual(exp_content, post.content)
41+
self.assertEqual(exp_author, post.author)
42+
43+
44+
class UserProfileListViewTest(TestCase):
45+
def setUp(self):
46+
self.testuser = get_user_model().objects.create(
47+
48+
username='testuser',
49+
first_name='test_first_name',
50+
last_name='test_last_name',
51+
)
52+
53+
self.post = Post.objects.create(
54+
title='test title',
55+
content='test content',
56+
author=self.testuser
57+
)
58+
59+
def test_view_url_by_name(self):
60+
self.user = get_user_model().objects.get(username='testuser')
61+
response = self.client.get(
62+
reverse('blog-post-user', kwargs={'username': self.user.username})
63+
)
64+
self.assertEqual(response.status_code, 200)
65+
66+
def test_template_used(self):
67+
user = get_user_model().objects.get(username='testuser')
68+
response = self.client.get(
69+
reverse('blog-post-user', kwargs={'username': user.username})
70+
)
71+
self.assertTemplateUsed(response, 'blog/profile_post_list.html')
72+
73+
74+
class PostListViewTest(TestCase):
75+
76+
def test_veiw_url_by_name_and_page_exist(self):
77+
response = self.client.get(reverse('blog-home'))
78+
self.assertEqual(response.status_code, 200)
79+
80+
def test_template_used(self):
81+
response = self.client.get(reverse('blog-home'))
82+
self.assertTemplateUsed(response, 'blog/home.html')
83+
84+
85+
class PostDetailViewTest(TestCase):
86+
87+
def setUp(self):
88+
self.testuser = get_user_model().objects.create(
89+
90+
username='testuser',
91+
first_name='test_first_name',
92+
last_name='test_last_name',
93+
)
94+
self.post = Post.objects.create(
95+
title='test title',
96+
content='test content',
97+
author=self.testuser
98+
)
99+
100+
def test_view_url_by_name_and_template_used(self):
101+
user = get_user_model().objects.get(username='testuser')
102+
post = Post.objects.get(author=user)
103+
user = get_user_model().objects.get(username='testuser')
104+
response = self.client.get(
105+
reverse('blog-post-detail', kwargs={'pk': post.id})
106+
)
107+
self.assertEqual(response.status_code, 200)
108+
self.assertTemplateUsed(response, 'blog/post_detail.html')
109+
110+
111+
class PostCreateViewTest(TestCase):
112+
def setUP(self):
113+
self.testuser = get_user_model().objects.create(
114+
115+
username='testuser',
116+
first_name='test_first_name',
117+
last_name='test_last_name',
118+
password='password'
119+
)
120+
self.post = Post.objects.create(
121+
title='test title',
122+
content='test content',
123+
author=self.testuser
124+
)
125+
'''
126+
TODO
127+
'''
128+
# def test_post_create_redirect_without_login(self):
129+
# self.testuser = get_user_model().objects.create(
130+
# email='[email protected]',
131+
# username='testuser',
132+
# first_name='test_first_name',
133+
# last_name='test_last_name',
134+
# password='passaman'
135+
# )
136+
# response = self.client.post(
137+
# reverse('blog-post-create'),
138+
# {
139+
# 'title':'new_title',
140+
# 'content':'new_content'
141+
# }
142+
# )
143+
# self.assertEqual(response.status_code, 200)
144+
145+
146+
# def test_view_url_by_name_and_page_exist(self):
147+
# response = self.client.get(reverse('blog-post-create'))
148+
# self.assertEqual(response, 200)
149+
150+
# def test_template_used(self):
151+
# response = self.client.get(reverse('blog-post-create'))
152+
# self.assertTemplateUsed(response, 'blog/post_form.html')
153+
154+
155+
# class PostUpdateTest(TestCase):
156+
'''
157+
TODO: complete this and delete veiw
158+
'''
159+
# def test_view_url_by_name_and_page_exist(self):
160+
# response = self.client.get(reverse('blog-post-create'))
161+
# self.assertEqual(response, 200)
162+
163+
# def test_template_used(self):
164+
# response = self.client.get(reverse('blog-post-create'))
165+
# self.assertTemplateUsed(response, 'blog/post_form.html')

media/profile_pics/download.png

4.78 KB
Loading

users/admin.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from django.contrib.auth.admin import UserAdmin
33

44
from .forms import UserCreationForm, UserChangeForm
5-
from .models import User, Profile
5+
from .models import User, Profile, Follow
66
# Register your models here.
77
class UserAdmin(UserAdmin):
88
add_form = UserCreationForm
@@ -27,4 +27,5 @@ class UserAdmin(UserAdmin):
2727

2828

2929
admin.site.register(User, UserAdmin)
30-
admin.site.register(Profile)
30+
admin.site.register(Profile)
31+
admin.site.register(Follow)

users/models.py

+71-28
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,17 @@
33
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
44
from django.utils import timezone
55
from django.conf import settings
6+
from django.urls import reverse
67

78
# UserManager imports
89
from django.contrib.auth.base_user import BaseUserManager
910

1011
# Common Imports
11-
from django.utils.translation import gettext_lazy as _
12+
from django.utils.translation import gettext_lazy as _
13+
1214

1315
class UserManager(BaseUserManager):
14-
def create_user(self, email, username, first_name, last_name,password=None):
16+
def create_user(self, email, username, first_name, last_name, password=None):
1517
if not email:
1618
raise ValueError('Must have Email')
1719
if not username:
@@ -20,50 +22,54 @@ def create_user(self, email, username, first_name, last_name,password=None):
2022
raise ValueError('Must have first_name')
2123
if not last_name:
2224
raise ValueError('Must have last name')
23-
24-
user = self.model(
25-
email = self.normalize_email(email),
26-
username = username,
27-
first_name = first_name,
28-
last_name = last_name,
25+
26+
user = self.model(
27+
email=self.normalize_email(email),
28+
username=username,
29+
first_name=first_name,
30+
last_name=last_name,
2931
)
3032
user.set_password(password)
3133
user.save(using=self._db)
3234
return user
3335

3436
def create_superuser(self, email, username, first_name, last_name, password=None):
3537

36-
user = self.create_user(
37-
email = email,
38-
username = username,
39-
first_name = first_name,
40-
last_name = last_name,
41-
password = password,
38+
user = self.create_user(
39+
email=email,
40+
username=username,
41+
first_name=first_name,
42+
last_name=last_name,
43+
password=password,
4244
)
4345
user.is_active = True
4446
user.is_staff = True
4547
user.is_admin = True
4648
user.is_superuser = True
4749
user.save(using=self._db)
4850

49-
return user
51+
return user
52+
5053

5154
class User(AbstractBaseUser):
52-
55+
5356
# compulsory fields
54-
email = models.EmailField(max_length=255,unique=True)
55-
username = models.CharField(unique=True, max_length=255, null=True, blank=False)
56-
first_name = models.CharField(unique=False, max_length=255, null=True, blank=False, verbose_name='First Name')
57-
last_name = models.CharField(unique=False, max_length=255, null=True, blank=False, verbose_name='Last Name')
58-
57+
email = models.EmailField(max_length=255, unique=True)
58+
username = models.CharField(
59+
unique=True, max_length=255, null=True, blank=False)
60+
first_name = models.CharField(
61+
unique=False, max_length=255, null=True, blank=False, verbose_name='First Name')
62+
last_name = models.CharField(
63+
unique=False, max_length=255, null=True, blank=False, verbose_name='Last Name')
64+
5965
date_joined = models.DateTimeField(default=timezone.now)
6066

61-
is_staff = models.BooleanField(default=False)
62-
is_admin = models.BooleanField(default=False)
67+
is_staff = models.BooleanField(default=False)
68+
is_admin = models.BooleanField(default=False)
6369
is_superuser = models.BooleanField(default=False)
64-
is_active = models.BooleanField(default=True)
70+
is_active = models.BooleanField(default=True)
6571

66-
USERNAME_FIELD = 'email'
72+
USERNAME_FIELD = 'email'
6773
REQUIRED_FIELDS = ['first_name', 'last_name', 'username']
6874

6975
objects = UserManager()
@@ -73,13 +79,50 @@ def __str__(self):
7379

7480
def has_perm(self, perm, obj=None):
7581
return True
76-
82+
7783
def has_module_perms(self, app_label):
7884
return self.is_admin
7985

86+
8087
class Profile(models.Model):
81-
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
88+
user = models.OneToOneField(
89+
settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
8290
image = models.ImageField(default='default.jpg', upload_to='profile_pics')
8391

92+
93+
'''
94+
explanation:
95+
user : me
96+
97+
is_following: it is the collection of profile I follow
98+
followed_by : it is the collection of profile following me,
99+
100+
followers: it is the collection of profiles following me, my followers
101+
follows : it is the collection of profile I follow
102+
103+
follows = is_following, followers =
104+
'''
105+
106+
isfollowing = models.ManyToManyField('Profile', blank=True, related_name='followers')
107+
followedby = models.ManyToManyField('Profile', blank=True, related_name='follows')
108+
109+
def __str__(self):
110+
return f'{self.user.username} Profile'
111+
112+
def get_absolute_url(self):
113+
return reverse('blog-post-user', kwargs={'username': self.user.username})
114+
115+
116+
class Follow(models.Model):
117+
to_user = models.ForeignKey(
118+
settings.AUTH_USER_MODEL, related_name='request_from_users', on_delete=models.CASCADE)
119+
from_user = models.ForeignKey(
120+
settings.AUTH_USER_MODEL, related_name='request_to_users', on_delete=models.CASCADE)
121+
84122
def __str__(self):
85-
return f'{self.user.username} Profile'
123+
return f'From { self.from_user } to {self.to_user}'
124+
125+
# from django.contrib.auth import get_user_model
126+
# >>> from users.models import Profile
127+
# >>> from users.models import FriendRequest
128+
# >>> User = get_user_model()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<form class="form" method="POST" action="{% url 'users-profile-follow' %}">
2+
{% csrf_token %}
3+
<input type="hidden" name="username" value="{% if username %}{{ username }} {% endif %}">
4+
<button type="submit" >Follow</button>
5+
</form>

users/urls.py

+4
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,8 @@
77
path('login/', auth_views.LoginView.as_view(template_name='users/login.html'), name='users-login'),
88
path('logout/', auth_views.LogoutView.as_view(template_name='users/logout.html'), name='users-logout'),
99
path('profile/edit/', views.profile_edit, name='users-profile-edit'),
10+
path('profile/<str:username>', views.user_profile_page, name='user-profile'),
11+
path('profile/follow/<int:id>', views.follow_user, name='users-profile-follow'),
12+
path('profile/unfollow/<int:id>', views.unfollow_user, name='users-profile-unfollow'),
13+
1014
]

0 commit comments

Comments
 (0)