Skip to content

Commit

Permalink
Adding user picture and username to navbar.
Browse files Browse the repository at this point in the history
When the user is logged into Hotails, they'll see their profile picture,
and their username in every page on Hotails on the navbar.
If the dog owner / daycare doesn't have any profile picture, a default
one will be presented.

Signed-off-by: Ofir Matasas <[email protected]>
Signed-off-by: tamirmatok <[email protected]>
  • Loading branch information
tamirmatok authored and OfirMatasas committed May 16, 2022
1 parent c1051cb commit a3efce7
Show file tree
Hide file tree
Showing 15 changed files with 136 additions and 36,775 deletions.
1 change: 1 addition & 0 deletions Hotails/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'main.context_processors.navbar_extras'
],
},
},
Expand Down
11 changes: 8 additions & 3 deletions conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@
from review.models import Review


DOG_OWNER_FIXTURE_PROFILE_PICTURE_URL = "https://www.akc.org/wp-content/uploads/2019/06/Bohemian-Shepherd.1.jpg"
DAYCARE_FIXTURE_PROFILE_PICTURE_URL_1 = "../../static/images/daycare_image_test_01.jpeg"
DAYCARE_FIXTURE_PROFILE_PICTURE_URL_2 = "../../static/images/daycare_image_test_02.jpeg"


@pytest.fixture
def create_order():
return Order.create(dog_owner_id=DogOwner.objects.get(id=1),
Expand Down Expand Up @@ -60,7 +65,7 @@ def create_dog_owner_user():
last_name='USER',
phone_number=1234567890,
dog_race='lavrador',
dog_picture_url="https://www.akc.org/wp-content/uploads/2019/06/Bohemian-Shepherd.1.jpg",
dog_picture_url=DOG_OWNER_FIXTURE_PROFILE_PICTURE_URL,
dog_age=10,
dog_weight=6,
dog_gender='M'
Expand Down Expand Up @@ -90,12 +95,12 @@ def create_daycare_user(daycare_data):

@pytest.fixture
def create_image1(create_daycare_user):
return Image.create(url="../../static/images/daycare_image_test_01.jpeg", daycare_id=create_daycare_user)
return Image.create(url=DAYCARE_FIXTURE_PROFILE_PICTURE_URL_1, daycare_id=create_daycare_user)


@pytest.fixture
def create_image2(create_daycare_user):
return Image.create(url="../../static/images/daycare_image_test_02.jpeg", daycare_id=create_daycare_user)
return Image.create(url=DAYCARE_FIXTURE_PROFILE_PICTURE_URL_2, daycare_id=create_daycare_user)


@pytest.fixture
Expand Down
5 changes: 4 additions & 1 deletion daycare/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
from django.core.exceptions import ObjectDoesNotExist


DAYCARE_DEFAULT_PICTURE_URL = "../../static/images/daycare-default-profile-image.jpeg"


class DayCare(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, default=None, blank=True, null=False, editable=True)
name = models.CharField(max_length=20, blank=True, unique=True, validators=[MaxLengthValidator])
Expand Down Expand Up @@ -53,7 +56,7 @@ def get_daycare_primary_image_url(self):
daycare_images = Image.get_images_by_daycare_id(daycare_id=self.id)
if daycare_images is not None and daycare_images.first() is not None:
return daycare_images.first().url
return "../../static/images/daycare-default-profile-image.jpeg"
return DAYCARE_DEFAULT_PICTURE_URL


class Image(models.Model):
Expand Down
13 changes: 6 additions & 7 deletions daycare/test_image.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import pytest
from .models import DayCare
from .models import Image
from django.core.exceptions import ValidationError

DEFAULT_DAYCARE_PROFILE_URL = "../../static/images/daycare-default-profile-image.jpeg"
from conftest import DAYCARE_FIXTURE_PROFILE_PICTURE_URL_1
from .models import DayCare, Image, DAYCARE_DEFAULT_PICTURE_URL
from django.core.exceptions import ValidationError


@pytest.mark.django_db()
Expand All @@ -25,9 +24,9 @@ def test_image_creation_with_invalid_image_url(self, create_daycare_user):

def test_daycare_has_customized_profile_image(self, create_image1, create_image2, create_daycare_user):
daycare_profile_image = create_daycare_user.get_daycare_primary_image_url()
assert daycare_profile_image != DEFAULT_DAYCARE_PROFILE_URL
assert daycare_profile_image is not None
assert daycare_profile_image != DAYCARE_DEFAULT_PICTURE_URL
assert daycare_profile_image == DAYCARE_FIXTURE_PROFILE_PICTURE_URL_1

def test_daycare_has_default_profile_image_when_no_customized_picture_was_found(self, create_daycare_user):
daycare_profile_image = create_daycare_user.get_daycare_primary_image_url()
assert daycare_profile_image == DEFAULT_DAYCARE_PROFILE_URL
assert daycare_profile_image == DAYCARE_DEFAULT_PICTURE_URL
7 changes: 6 additions & 1 deletion dogowner/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
from .validators import ValidateDogOwner, MaxLength


DOG_OWNER_DEFAULT_PROFILE_PICTURE_URL = "../../static/images/dog-owner-default-profile-picture.jpeg"


class Gender(models.TextChoices):
Male = 'M', 'Male'
Female = 'F', 'Female'
Expand Down Expand Up @@ -32,7 +35,6 @@ def create(email, username, password, dog_name,
first_name, last_name, phone_number,
dog_race, dog_picture_url, dog_age,
dog_weight, dog_gender):

ValidateDogOwner(email, username, password, dog_name,
first_name, last_name, phone_number,
dog_race, dog_picture_url, dog_age,
Expand All @@ -56,3 +58,6 @@ def create(email, username, password, dog_name,
new_dog_owner.user.save()
new_dog_owner.save()
return new_dog_owner

def get_dog_owner_profile_image_url(self):
return self.dog_picture_url if self.dog_picture_url else DOG_OWNER_DEFAULT_PROFILE_PICTURE_URL
12 changes: 11 additions & 1 deletion dogowner/test_dog_owner.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from .models import DogOwner
from conftest import DOG_OWNER_FIXTURE_PROFILE_PICTURE_URL
from .models import DogOwner, DOG_OWNER_DEFAULT_PROFILE_PICTURE_URL
from django.contrib.auth.models import User
from django.core.exceptions import ValidationError
from .validators import MaxLength
Expand Down Expand Up @@ -163,3 +164,12 @@ def test_dog_owner_user_creation_with_url_not_an_image(self):
dog_picture_url="https://www.not/an/image.com",
dog_age=10, dog_weight=6, dog_gender='M'
)

def test_dogowner_has_customized_profile_image(self, create_dog_owner_user):
dogowner_profile_image = create_dog_owner_user.get_dog_owner_profile_image_url()
assert dogowner_profile_image == DOG_OWNER_FIXTURE_PROFILE_PICTURE_URL

def test_dogowner_has_default_profile_image(self, create_dog_owner_user):
create_dog_owner_user.dog_picture_url = None
dogowner_profile_image = create_dog_owner_user.get_dog_owner_profile_image_url()
assert dogowner_profile_image == DOG_OWNER_DEFAULT_PROFILE_PICTURE_URL
21 changes: 21 additions & 0 deletions main/context_processors.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from daycare.models import DayCare
from dogowner.models import DogOwner


def navbar_extras(request):
navbar_picture_url = navbar_name = None
if request.user.is_authenticated:
if DogOwner.objects.filter(user=request.user).exists():
dog_owner = DogOwner.objects.filter(user=request.user).first()
navbar_name = dog_owner.__str__()
navbar_picture_url = dog_owner.get_dog_owner_profile_image_url()
else:
daycare = DayCare.objects.filter(user=request.user).first()
navbar_name = daycare.name
navbar_picture_url = daycare.get_daycare_primary_image_url()

context = {
'navbar_picture_url': navbar_picture_url,
'navbar_name': navbar_name,
}
return context
43 changes: 25 additions & 18 deletions main/templates/main/base_template.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,36 +12,43 @@
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
<link rel="stylesheet" href="{% static 'css/navbar.css' %}">
{% block stylesheets %}
{% endblock %}
</head>
<header>
<nav class="navbar navbar-expand-lg navbar-light bg-dark">
<nav class="navbar navbar-expand-lg navbar-light bg-dark" style="padding: 0 10px 0 10px;">
<a class="navbar-brand" href="..\">
<img src="..\..\..\static\images\Hotails-logo-smaller.png" style="width:50px; height:50px;" class="d-inline-block align-top" loading="lazy"></a>
<button class="navbar-toggler" type="button" data-target="#navbarText"
aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
</button>
<ul class="navbar-nav mr-auto">
{% if request.user.is_authenticated %}
<img src="{% static 'images/Hotails-logo-smaller.png' %}" style="width:50px; height:50px;" class="d-inline-block align-top" loading="lazy">
</a>
<button class="navbar-toggler" type="button" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation"></button>
<ul class="navbar-nav mr-auto">
{% if request.user.is_authenticated %}
<li class="nav-item"><a class="nav-link text-white" href="/profile">Profile</a></li>
<li class="nav-item"><a class="nav-link text-white" href="">Orders</a></li>
<li class="nav-item"><a class="nav-link text-white" href="">Search</a></li>
<li class="nav-item"><a class="nav-link text-white" href="">Chats</a></li>
{% endif %}
<li class="nav-item"><a class="nav-link text-white" href="/about">About</a></li>
</ul>
<li class="nav-item"><a class="nav-link text-white" href="">Orders</a></li>
<li class="nav-item"><a class="nav-link text-white" href="">Search</a></li>
<li class="nav-item"><a class="nav-link text-white" href="">Chats</a></li>
{% endif %}
<li class="nav-item"><a class="nav-link text-white" href="/about">About</a></li>
</ul>
{% if request.user.is_authenticated %}
<ul class="nav navbar-nav navbar-right">
<li class="nav-item"><a class="nav-link text-white" style="font-size:1.3rem" href="/logout">Logout</a></li>
<li class="nav-item"><img src="{{ navbar_picture_url }}" alt="{{ name }} image" class="navbar-profile-img"></li>
<li class="nav-item">
<span id="welcomeMsg">Welcome, {{ navbar_name }}!</span><a class="nav-link" id="logoutHref" href="/logout">Logout</a>
</li>
</ul>
{% endif %}
</nav>
</header>

<body>
{% block content %}
{% endblock %}
<div class="row">
<div class="col-12 col-lg-12">
{% block content %}
{% endblock %}
</div>
</div>

</body>

</html>
</html>
23 changes: 22 additions & 1 deletion main/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,4 +76,25 @@ def test_dog_owner_homepage_is_visible_for_dog_owner(self, client, create_dog_ow
client.force_login(user=create_dog_owner_user.user)
response = client.get("/homepage/")
assert response.status_code == 200
assert list(response.context['daycares']) == list(DayCare.objects.all())
list_of_daycares_from_response = list(response.context['daycares'])
list_of_all_daycares = list(DayCare.objects.all())
assert list_of_daycares_from_response == list_of_all_daycares


@pytest.mark.django_db
class TestNavbarView:
def test_navbar_getting_dog_owner_nickname_and_profile_picture(self, client, create_dog_owner_user):
client.force_login(user=create_dog_owner_user.user)
response = client.get("/homepage/")
dog_owner_picture_url = create_dog_owner_user.dog_picture_url
assert response.context['navbar_picture_url'] == dog_owner_picture_url
dog_owner_name = create_dog_owner_user.__str__()
assert response.context['navbar_name'] == dog_owner_name

def test_navbar_getting_daycare_nickname_and_profile_picture(self, client, create_daycare_user):
client.force_login(user=create_daycare_user.user)
response = client.get("/homepage/")
daycare_name = create_daycare_user.name
assert response.context['navbar_name'] == daycare_name
daycare_primary_image_url = create_daycare_user.get_daycare_primary_image_url()
assert response.context['navbar_picture_url'] == daycare_primary_image_url
5 changes: 3 additions & 2 deletions static/CSS/dog_owner_homepage.css
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@
.row
{
height: 30rem;
width: 120rem;
margin-left: 200px;
width: auto;
margin-left: auto;
margin-right: auto;
}

.card
Expand Down
29 changes: 29 additions & 0 deletions static/CSS/navbar.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
header ul li {
font-size: 1.1rem;
}

.navbar-profile-img
{
border-radius: 50%;
height: 2.5rem;
width: 2.5rem;
}

#welcomeMsg {
padding-left:10px;
padding-bottom:0;
margin-top:5px;
color:#FFF;
float:left;
}

#logoutHref {
background-color:#1e1e1e;
border-radius:12px;
color:#E19512;
font-weight:bold;
float:right;
padding: 5px 10px 5px 10px;
font-size:1rem;
margin:1px 0 0 20px;
}
Loading

0 comments on commit a3efce7

Please sign in to comment.