Skip to content

Commit

Permalink
Merge pull request #64 from ErezCohenn/main_daycare
Browse files Browse the repository at this point in the history
Adding Homepage for daycare user
  • Loading branch information
ErezCohenn authored May 3, 2022
2 parents 3a78ab0 + be3677f commit 37eed5b
Show file tree
Hide file tree
Showing 7 changed files with 201 additions and 8 deletions.
2 changes: 1 addition & 1 deletion daycare/conftest.py → conftest.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import pytest
from .models import DayCare, Image
from daycare.models import DayCare, Image


@pytest.fixture
Expand Down
132 changes: 132 additions & 0 deletions daycare/templates/daycare/daycare-homepage.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
{% extends "main/base_template.html" %}

{% block stylesheets %}
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.0/css/all.css"
integrity="sha384-lZN37f5QGtY3VHgisS14W3ExzMWZxybE1SJSEsQp9S+oqd12jhcu+A56Ebc1zFSJ" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
<style>
/* Make the image fully responsive */
.img {
float: left;
width: 100px;
height: 100px;
object-fit:cover;
}
</style>
{% endblock %}

{% block content %}
<div class="card mb-2">
<div class="row row-cols-md-2">
<div class="col-md-7">
<hr>
<div class="mt-5 mb-5">
<h5> <i class="fas fa-user"></i> Hello {{ daycare.name }}</h5>
<h6>This is where you can manage your daycare.
<br> You will be able:</h6>
<p class="text-muted"># Manage your booking schedule</p>
<p class="text-muted"># Set filters of approved dogs and services you provide</p>
<p class="text-muted"># Read / write reviews of dog owners and their dogs</p>
<p class="text-muted"># Chat with dog owners</p>
</div>
<hr>
<div class="mt-5">
<h5>Have a look at your reviews</h5>
<table class="table table-hover table-bordered table-responsive">
<thead class="table-dark">
<tr>
<th scope="col">#</th>
<th scope="col">Name</th>
<th scope="col">Date</th>
<th scope="col">Review</th>
<th scope="col">Rating</th>
</tr>
</thead>
<tbody>
{% for review in reviews %}
<tr>
<th scope="row">{{ forloop.counter }}</th>
<td>{{ review.dogowner_id }}</td>
<td>{{ review.creation_date }}</td>
<td>{{ review.review }}</td>
<td>{{ review.rating }}</td>
</tr>
{% endfor %}
</tbody>
</table>

</div>
</div>
<div class="col-md-5">
<div class="card h-100">
<ul class="nav nav-pills" id="myTab" role="tablist">
<li class="nav-item">
<a class="nav-link active" id="apt-tab-{{daycare.id}}" data-toggle="tab"
href="#apt-{{daycare.id}}" role="tab" aria-controls="apt-{{daycare.id}}"
aria-selected="true">Daycare Profile Details</a>
</li>
</ul>

<div class="tab-content" id="card-tab-content">
<div class="tab-pane fade show active" id="apt-{{daycare.id}}" role="tabpanel"
aria-labelledby="apt-tab-{{daycare.id}}">

<div id="imageSlides" class="carousel slide" data-ride="carousel">
<!-- Indicators -->
<ul class="carousel-indicators">
{% for image in images %}
{% if forloop.counter == 1 %}
<li data-target="#imageSlides" data-slide-to={{image.id}} class="active"></li>
{% else %}
<li data-target="#imageSlides" data-slide-to={{image.id}}></li>
{% endif %}
{% endfor%}
</ul>


<!-- The slideshow -->
<div class="carousel-inner">
{% for image in images %}
{% if forloop.counter == 1 %}
<div class="carousel-item active">
<img src={{image.url}} class="img-fluid" width="900" height="400">
</div>
{% else %}
<div class="carousel-item">
<img src={{image.url}} class="img-fluid" width="900" height="400">
</div>
{% endif %}
{% endfor %}
</div>

<!-- Left and right controls -->
<a class="carousel-control-prev" href="#imageSlides" data-slide="prev">
<span class="carousel-control-prev-icon"></span>
</a>
<a class="carousel-control-next" href="#imageSlides" data-slide="next">
<span class="carousel-control-next-icon"></span>
</a>
</div>
<div class="card-body">
<h5 class="card-title">{{daycare.address}}, {{daycare.city}}</h5>
<br>
<h6><i class="fas fa-dog"></i> Capacity: {{daycare.capacity}}
<br>
<br>
<i class="fas fa-coins"></i> Price: {{daycare.price_per_day}}
</h6>
<br>
<h6><strong>About</strong></h6>
<p class="card-text">{{daycare.description}}</p>
</div>
</div>
</div>
</div>
</div>

</div>
</div>

{% endblock %}
26 changes: 26 additions & 0 deletions daycare/test_daycare.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
from .models import DayCare
from django.core.exceptions import ValidationError
from django.contrib.auth.models import User
from .models import Image
import random
from review.models import Review


@pytest.mark.django_db()
Expand Down Expand Up @@ -61,3 +64,26 @@ def test_daycare_user_creation_with_same_user_name(self, create_daycare_user):
DayCare.create(username='testUser01', email="[email protected]", password='pass123', name='daycare',
description='new description', price_per_day=10, capacity=50,
area='north', city='haifa', address='new address')

def test_daycare_redirected_homepage_after_login(self, client, create_daycare_user):
client.force_login(user=create_daycare_user.user)
response = client.get('/')
assert response.status_code == 302
assert response['Location'] == '/homepage/'

def test_relevant_daycare_homepage_with_static_data(self, client, create_daycare_user):
dayCare = random.choice([daycare for daycare in DayCare.objects.all() if 'static' in daycare.user.username])
client.force_login(user=dayCare.user)

response = client.get('/homepage/')

daycare_shown_in_homepage = response.context['daycare']
assert daycare_shown_in_homepage == dayCare

images_shown_in_homepage = set(response.context['images'])
daycare_images = set(Image.get_images_by_daycare_id(daycare_id=dayCare.id))
assert images_shown_in_homepage == daycare_images

reviews_shown_in_homepage = set(response.context['reviews'])
daycare_reviews = set(Review.get_review_by_daycare_id(daycare_id=dayCare.id))
assert reviews_shown_in_homepage == daycare_reviews
16 changes: 14 additions & 2 deletions daycare/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
# from django.shortcuts import render
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from .models import Image
from review.models import Review

# Create your views here.

@login_required(login_url='login')
def daycare_home(request):
context = {
'daycare': request.user.daycare,
'reviews': Review.get_review_by_daycare_id(request.user.daycare.id),
'images': Image.get_images_by_daycare_id(request.user.daycare.id)
}

return render(request, 'daycare/daycare-homepage.html', context)
2 changes: 1 addition & 1 deletion main/templates/main/base_template.html
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
</button>
<ul class="navbar-nav mr-auto">
{% if request.user.is_authenticated %}
<li class="nav-item"><a class="nav-link text-white" href="">Profile</a></li>
<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>
Expand Down
22 changes: 20 additions & 2 deletions main/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,24 @@ def test_invalid_login_dog_owner_user_info(self, client):
response = client.post('/login/', form, follow=True)
assert response.wsgi_request.user.is_anonymous

def test_valid_login_daycare_user_info(self, client, create_daycare_user):
previous_logged_user = client.get('/').wsgi_request.user
form = {'username': 'testuser01',
'password': 'pass',
}

response = client.post('/login/', form, follow=True)
current_log_user = response.wsgi_request.user
assert current_log_user == create_daycare_user.user
assert previous_logged_user != current_log_user

def test_invalid_login_daycare_user_info(self, client):
form = {'username': "[email protected]",
'password': "incorrect",
}
response = client.post('/login/', form, follow=True)
assert response.wsgi_request.user.is_anonymous

def test_block_logged_user_from_login_page(self, client, create_dog_owner_user):
client.force_login(user=create_dog_owner_user.user)
response = client.get("/login/")
Expand All @@ -75,8 +93,8 @@ def test_root_entrypoint_redirection_unlogged_user(self, client):
assert response.status_code == 302
assert response['Location'] == '/login/'

def test_root_entrypoint_redirection_logged_user(self, client, create_dog_owner_user):
client.force_login(user=create_dog_owner_user.user)
def test_root_entrypoint_redirection_logged_daycare_user(self, client, create_daycare_user):
client.force_login(user=create_daycare_user.user)
response = client.get("/")
assert response.status_code == 302
assert response['Location'] == '/homepage/'
Expand Down
9 changes: 7 additions & 2 deletions main/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,23 @@
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.views import daycare_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 render(request, 'main/homepage.html')
elif DayCare.objects.filter(user=request.user).exists():
return daycare_home(request)


def about(request):
Expand Down

0 comments on commit 37eed5b

Please sign in to comment.