Skip to content
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
2 changes: 2 additions & 0 deletions Hotails/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,6 @@
path('homepage/', views.homepage, name='homepage'),
path('logout/', views.logout_view, name='logout'),
path('about/', views.about, name='about'),
path('messages/', views.messages_view, name='messages'),
path('chat/<contact>', views.chat_view, name='chat'),
]
2 changes: 1 addition & 1 deletion main/templates/main/base_template.html
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
<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>
<li class="nav-item"><a class="nav-link text-white" href="/messages">Chats</a></li>
{% endif %}
<li class="nav-item"><a class="nav-link text-white" href="/about">About</a></li>
</ul>
Expand Down
12 changes: 12 additions & 0 deletions main/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@
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 daycare_home
import message.views


def index(request):
Expand All @@ -29,3 +31,13 @@ def about(request):
def logout_view(request):
logout(request)
return index(request)


@login_required()
def messages_view(request):
return message.views.messages(request)


@login_required()
def chat_view(request, contact):
return message.views.chat(request, contact)
80 changes: 80 additions & 0 deletions message/templates/chat.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
{% extends "main/base_template.html" %}
{% load static %}

{% block stylesheets %}
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" type="text/css" href="{% static 'css/chat.css' %}">
{% endblock %}

{% block content %}
<div class="chatcontainer">
<div class="messaging">
<div class="inbox_msg">
<div class="inbox_people">
<div class="headind_srch">
<div class="recent_heading">
<h4>Recent Chats</h4>
</div>
</div>
<div class="inbox_chat">
{% for contact in contacts %}
<a href="/chat/{{contact.id}}"><div class="chat_list">
<div class="chat_people">
{% if user == 'D' %}
<div class="chat_img"> <img src="{{contact.dog_picture_url}}" alt="nopic"> </div>
<div class="chat_ib">
<h5>{{ contact }}</h5>
</div>
{% else %}
<div class="chat_img"> <img src="{{contact.get_daycare_primary_image_url}}" alt="nopic"> </div>
<div class="chat_ib">
<h5>{{ contact.name }}</h5>
</div>
{% endif %}
</div>
</div>
</a>
{% endfor %}
</div>
</div>
<h3 class=" text-center">Chat with {{ contact_name }}</h3>
<div class="mesgs">
<div class="msg_history">
{% for msg in chat %}
{% if msg.author == user %}
<div class="outgoing_msg">
<div class="sent_msg">
<p>{{msg.text}}</p>
<span class="time_date">{{msg.date}}</span> </div>
</div>
{% else %}
<div class="incoming_msg">
{% if user == 'D' %}
<div class="incoming_msg_img"> <img src="{{dog_owner_picture}}" alt="nopic"> </div>
{% else %}
<div class="incoming_msg_img"> <img src="{{day_care_img}}" alt="nopic"> </div>
{% endif %}
<div class="received_msg">
<div class="received_withd_msg">
<p>{{ msg.text }}</p>
<span class="time_date">{{msg.date}}</span></div>
</div>
</div>
{% endif %}
{% endfor %}
</div>
<form method="POST">
{% csrf_token %}
<div class="type_msg">
<div class="input_msg_write">
<input type="text" name="msg_sent" class="write_msg" placeholder="Type a message" />
<button class="msg_send_btn" type="submit"><i class="fa fa-paper-plane-o" aria-hidden="true"></i></button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>

{% endblock %}
43 changes: 43 additions & 0 deletions message/templates/messages.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{% extends "main/base_template.html" %}
{% load static %}

{% block stylesheets %}
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" type="text/css" href="{% static 'css/chat.css' %}">
{% endblock %}

{% block content %}
<div class="chatcontainer">
<div class="messaging">
<div class="inbox_msg">
<div class="inbox_people">
<div class="headind_srch">
<div class="recent_heading">
<h4>Recent Chats</h4>
</div>
</div>
<div class="inbox_chat">
{% for contact in contacts %}
<a href="/chat/{{contact.id}}"><div class="chat_list">
<div class="chat_people">
{% if user == 'D' %}
<div class="chat_img"> <img src="{{contact.dog_picture_url}}" alt="nopic"> </div>
<div class="chat_ib">
<h5>{{ contact }}</h5>
</div>
{% else %}
<div class="chat_img"> <img src="{{contact.get_daycare_primary_image_url}}" alt="nopic"> </div>
<div class="chat_ib">
<h5>{{ contact.name }}</h5>
</div>
{% endif %}
</div>
</div>
</a>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
{% endblock %}
65 changes: 65 additions & 0 deletions message/test_html.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
from .models import Message
from daycare.models import DayCare
import pytest


@pytest.mark.django_db()
class TestMessagesPresentation:
def test_shown_only_relevant_contacts(self, client):
static_daycares = [daycare for daycare in DayCare.objects.all() if 'static' in daycare.user.username]
for daycare in static_daycares:
client.force_login(user=daycare.user)
response = client.get('/messages/')

assert response.status_code == 200
Comment thread
Yuval-Vino marked this conversation as resolved.

shown_contacts = response.context['contacts']
daycare_contacts = Message.get_all_daycare_contacts(daycare.id)
assert set(daycare_contacts) == set(shown_contacts)

client.logout()

def test_shown_only_relevant_message_in_chat(self, client):
static_daycares = [daycare for daycare in DayCare.objects.all() if 'static' in daycare.user.username]
for daycare in static_daycares:
client.force_login(user=daycare.user)
for contact in Message.get_all_daycare_contacts(daycare.id):
contact_id = str(contact.id)
response = client.get(f'/chat/{contact_id}'
)
assert response.status_code == 200

shown_chat = set(response.context['chat'])
relevant_chat = set(Message.get_chat_between_dogowner_daycare(contact_id, daycare.id))
assert shown_chat == relevant_chat
client.logout()

def test_send_new_message(self, client):
daycare = [daycare for daycare in DayCare.objects.all() if 'static' in daycare.user.username][1]
contact = Message.get_all_daycare_contacts(daycare.id)[0]
contact_id = str(contact.id)
client.force_login(user=daycare.user)
client.get(f'/chat/{contact_id}')

msg = {'msg_sent': "Test message!"}
client.post(f'/chat/{contact_id}', msg)

last_message_in_chat = Message.get_chat_between_dogowner_daycare(dogowner_id=contact_id,
daycare_id=daycare.id).last()
assert last_message_in_chat.text == "Test message!"

def test_cant_send_blank_message(self, client):
daycare = [daycare for daycare in DayCare.objects.all() if 'static' in daycare.user.username][1]
contact = Message.get_all_daycare_contacts(daycare.id)[0]
contact_id = str(contact.id)
client.force_login(user=daycare.user)
client.get(f'/chat/{contact_id}')

last_message_before_test = Message.get_chat_between_dogowner_daycare(dogowner_id=contact_id,
daycare_id=daycare.id).last()
msg = {'msg_sent': ""}
client.post(f'/chat/{contact_id}', msg)

last_message_after_test = Message.get_chat_between_dogowner_daycare(dogowner_id=contact_id,
daycare_id=daycare.id).last()
assert last_message_after_test == last_message_before_test
73 changes: 72 additions & 1 deletion message/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,74 @@
# from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from django.shortcuts import render

# Create your views here.
from dogowner.models import DogOwner
from daycare.models import DayCare
from message.models import Message
from message.models import AuthorOptions


@login_required()
def messages(request):
if DogOwner.objects.filter(user=request.user).exists():
user = DogOwner.objects.get(user=request.user)
contacts = get_dogowner_contacts_as_daycares(user.id)
user = AuthorOptions.DogOwner

else:
user = DayCare.objects.get(user=request.user)
contacts = get_daycare_contacts_as_dogowners(user.id)
user = AuthorOptions.DayCare

context = {
'contacts': contacts,
'user': user,
}
return render(request, 'messages.html', context)


@login_required()
def chat(request, contact_id):
if DogOwner.objects.filter(user=request.user).exists():
daycare = DayCare.objects.get(pk=contact_id)
dogowner = DogOwner.objects.get(user=request.user)
contact_name = daycare.name
contacts = get_dogowner_contacts_as_daycares(dogowner.id)
user = AuthorOptions.DogOwner

else:
daycare = DayCare.objects.get(user=request.user)
dogowner = DogOwner.objects.get(pk=contact_id)
contact_name = dogowner.first_name + " " + dogowner.last_name
contacts = get_daycare_contacts_as_dogowners(daycare.id)
user = AuthorOptions.DayCare

chat = Message.get_chat_between_dogowner_daycare(dogowner_id=dogowner.id, daycare_id=daycare.id)

if request.method == "POST":
msg = request.POST.get("msg_sent", "")
if msg != '':
Message.create(author=user, daycare_id=daycare, dogowner_id=dogowner, text=msg).save()

context = {
'chat': chat,
'user': user,
'contact_id': contact_id,
'contact_name': contact_name,
'contacts': contacts,
'dog_owner_picture': dogowner.dog_picture_url,
'day_care_img': daycare.get_daycare_primary_image_url
}
return render(request, 'chat.html', context)


def get_dogowner_contacts_as_daycares(dogowner_id):
user_contacts = Message.get_all_dogowner_contacts(dogowner_id)
contacts_id = [contact.id for contact in user_contacts]
return DayCare.objects.filter(pk__in=contacts_id)


def get_daycare_contacts_as_dogowners(daycare_id):
user_contacts = Message.get_all_daycare_contacts(daycare_id)
contacts_id = [contact.id for contact in user_contacts]
return DogOwner.objects.filter(pk__in=contacts_id)
Loading