Skip to content

Commit

Permalink
Creating dog owner homepage
Browse files Browse the repository at this point in the history
When the dog owner is logged in to Hotails, or when the home is pressed
via navbar, All the daycares in the database will be shown to the dog
owner on its homepage, with the possibility to check their profile.
If the 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
ErezCohenn authored and tamirmatok committed May 2, 2022
1 parent 3a78ab0 commit 2f16f00
Show file tree
Hide file tree
Showing 10 changed files with 141 additions and 21 deletions.
9 changes: 7 additions & 2 deletions daycare/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,7 @@ def create(email, username, password, name, description, price_per_day, capacity
validate_max_length(address, 50, "address")
validate_price(price_per_day)

new_daycare = DayCare(user=User.objects.create_user(email=email, username=username, password=password,
),
new_daycare = DayCare(user=User.objects.create_user(email=email, username=username, password=password),
name=name, description=description, price_per_day=price_per_day,
capacity=capacity, area=area, city=city, address=address)

Expand All @@ -50,6 +49,12 @@ def create(email, username, password, name, description, price_per_day, capacity

return new_daycare

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"


class Image(models.Model):
url = models.CharField(max_length=1000)
Expand Down
11 changes: 11 additions & 0 deletions daycare/test_image.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
from .models import Image
from django.core.exceptions import ValidationError

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


@pytest.mark.django_db()
class TestImageModel:
Expand All @@ -20,3 +22,12 @@ def test_image_creation_with_invalid_image_url(self, create_daycare_user):
with pytest.raises(ValidationError,
match="Invalid URL image - URL should end with \'.gif\', \'.png\', \'.jpg\' or \'.jpeg\'."):
Image.create(url="NOT_VALID_URL", daycare_id=DayCare.objects.get(id=create_daycare_user.id))

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

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
8 changes: 6 additions & 2 deletions daycare/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# from django.shortcuts import render
from django.shortcuts import render
from django.contrib.auth.decorators import login_required

# Create your views here.

@login_required()
def day_care_home(request):
return render(request, 'main/homepage.html')
26 changes: 26 additions & 0 deletions dogowner/templates/dogowner/dog_owner_homepage.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{% extends "main/base_template.html" %}
{% load static %}

{% block stylesheets %}
<link rel="stylesheet" href="{% static 'CSS/dog_owner_homepage.css' %}">
{% endblock %}

{% block content %}
<div class="row row-cols-1 g-3 cards">
<div style="display: flex; flex-direction: row; flex-wrap: wrap">
{% for daycare in daycares %}
<div class="card">
<img src="{{ daycare.get_daycare_primary_image_url }}" alt="{{ daycare.name }} image" class="card-img-top">
<div class="card-body">
<div style="display: flex; flex-direction: row">
<h5 class="card-title">{{ daycare.name }}</h5>
</div>
<p class="card-text">{{ daycare.description | truncatechars:250 }}</p>
<a href="/daycare/{{ daycare.id }}" class="btn btn-primary">Daycare Profile</a>
</div>
</div>
{% endfor %}
</div>
</div>

{% endblock %}
12 changes: 10 additions & 2 deletions dogowner/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
# from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from daycare.models import DayCare

# Create your views here.

@login_required()
def dog_owner_home(request):
context = {
'daycares': DayCare.objects.all(),
}
return render(request, 'dogowner/dog_owner_homepage.html', context)
37 changes: 24 additions & 13 deletions main/tests.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
import pytest
from daycare.models import DayCare
from dogowner.models import DogOwner


@pytest.fixture
def create_dog_owner_user():
return DogOwner.create(email='[email protected]',
username='dogOwnerUser01',
password='password123',
dog_name='dog name',
first_name='test',
last_name='user',
phone_number=1234567890,
dog_race='dog race',
dog_picture_url='https://www.google.com/user1.jpg',
dog_age=4,
dog_weight=2,
dog_gender='M'
)
return DogOwner.create(email='[email protected]', username='dogOwnerUser01', password='password123',
dog_name='dog name', first_name='test', last_name='user', phone_number=1234567890,
dog_race='dog race', dog_picture_url='https://www.google.com/user1.jpg',
dog_age=4, dog_weight=2, dog_gender='M')


@pytest.fixture
def create_daycare_user():
return DayCare.create(email="[email protected]", username="testuser01", password="pass", name="Puppies",
description="This is the first daycare test", price_per_day=10,
capacity=50, area="Merkaz", city="Tel-Aviv", address="The best street 5")


@pytest.mark.django_db
Expand Down Expand Up @@ -82,8 +81,20 @@ def test_root_entrypoint_redirection_logged_user(self, client, create_dog_owner_
assert response['Location'] == '/homepage/'


@pytest.mark.django_db
class TestHomepageView:
def test_unlogged_user_access_to_homepage(self, client):
response = client.get("/homepage/")
assert response.status_code == 302
assert response['Location'] == '/login/?next=/homepage/'

def test_dog_owner_homepage_is_visible_for_dog_owner(self, client, create_dog_owner_user):
client.force_login(user=create_dog_owner_user.user)
response = client.get("/homepage/")
assert response.status_code == 200
assert response.context['daycares']

def test_day_care_homepage_is_visible_for_day_care(self, client, create_daycare_user):
client.force_login(user=create_daycare_user.user)
response = client.get("/homepage/")
assert response.status_code == 200
7 changes: 7 additions & 0 deletions main/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from django.urls import path
from . import views

urlpatterns = [
path('', views.homepage, name='homepage'),
path('about/', views.about, name='about'),
]
11 changes: 9 additions & 2 deletions main/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,25 @@
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
from django.contrib.auth import logout
from dogowner.models import DogOwner
from daycare.models import DayCare
from dogowner.views import dog_owner_home
from daycare.views import day_care_home


def index(request):
if request.user.is_authenticated:
return redirect(to='homepage')

return redirect(to='login')


@login_required()
def homepage(request):
return render(request, 'main/homepage.html')
if DogOwner.objects.filter(user=request.user).exists():
return dog_owner_home(request)

elif DayCare.objects.filter(user=request.user).exists():
return day_care_home(request)


def about(request):
Expand Down
41 changes: 41 additions & 0 deletions static/CSS/dog_owner_homepage.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
.cards
{
display: flex;
flex-direction: row;
flex-wrap: wrap;
margin-left: 50px;
justify-content: center;
align-items: center;
}

.row
{
height: 30rem;
width: 120rem;
margin-left: 200px;
}

.card
{
width: 18.5%;
height: 30rem;
margin: 60px 60px 0 60px;
max-width: 100%;
}

.card-body
{
display: flex;
flex-direction: column;
}

.card-body .btn
{
margin-right: 50%;
margin-top: auto;
}

.card-img-top
{
height: 200px;
}
Binary file added static/images/daycare-default-profile-image.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 2f16f00

Please sign in to comment.