Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding homepage for dog owner #67

Merged
merged 1 commit into from
May 4, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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):
OfirMatasas marked this conversation as resolved.
Show resolved Hide resolved
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
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)
OfirMatasas marked this conversation as resolved.
Show resolved Hide resolved
8 changes: 8 additions & 0 deletions main/tests.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import pytest
from daycare.models import DayCare


@pytest.mark.django_db
Expand Down Expand Up @@ -64,8 +65,15 @@ def test_root_entrypoint_redirection_logged_daycare_user(self, client, create_da
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 list(response.context['daycares']) == list(DayCare.objects.all())
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I want this PR merged ASAP, so please open a ticket to: assign both sides of the assertion equation to variables, then assert between the variables. it will improve the readability of the test.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Opened #104

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'),
]
5 changes: 3 additions & 2 deletions main/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
from django.contrib.auth import logout
from daycare.models import DayCare
from dogowner.models import DogOwner
from daycare.models import DayCare
from dogowner.views import dog_owner_home
from daycare.views import daycare_home


Expand All @@ -16,7 +17,7 @@ def index(request):
@login_required()
def homepage(request):
if DogOwner.objects.filter(user=request.user).exists():
OfirMatasas marked this conversation as resolved.
Show resolved Hide resolved
return render(request, 'main/homepage.html')
return dog_owner_home(request)
elif DayCare.objects.filter(user=request.user).exists():
return daycare_home(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.