Skip to content
Open
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
3 changes: 2 additions & 1 deletion buy_together/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,6 @@
path('products/', include('product.urls')),
path('suppliers/', include('supplier.urls')),
path('client/', include('client.urls')),
path('ordered_product/', include('ordered_product.urls'))
path('ordered_product/', include('ordered_product.urls')),
path('supplier_product/', include('supplier_product.urls', namespace='supplier_product')),
]
6 changes: 4 additions & 2 deletions static/css/suppliers.css
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@ body{
}

.container-A{
background-color: rgb(229, 127, 2);
background-color: rgb(34, 214, 234);
height: 500px;
width:20%
overflow-y: scroll;
position: relative;
width: 25%;
}

.container-B{background-color: brown;
Expand Down
69 changes: 56 additions & 13 deletions supplier/tests/test_supplier_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@
from django.contrib.auth.models import User
from supplier.models import Supplier
from supplier.views import action_display_all_products, get_supplier
from supplier.views import get_product_by_name_and_supplier, action_search_product
from supplier.views import get_product_by_name_and_supplier, action_search_product, show_deliveries
from django.test import RequestFactory
from supplier import views
from supplier_product.models import SupplierProduct
from product.models import Product
from delivery_location.models import DeliveryLocation


@pytest.fixture
Expand Down Expand Up @@ -130,40 +131,82 @@ def test_get_product_return_none(request_searched_product_mock,
@pytest.mark.django_db()
def test_searched_product_with_data(get_request_with_data,
render_mock,
saved_supplier_product0):
response = action_search_product(get_request_with_data, saved_supplier_product0)
saved_supplier_product0, saved_supplier0):

context = show_deliveries(saved_supplier0)
response = action_search_product(get_request_with_data, saved_supplier_product0, context)
assert response == render_mock.return_value

data = {'supplier_products': saved_supplier_product0}
# data = {'supplier_products': saved_supplier_product0}
context['supplier_products'] = saved_supplier_product0
assert render_mock.call_args_list == [
call(get_request_with_data, 'supplier/suppliers.html', data)
call(get_request_with_data, 'supplier/suppliers.html', context)
]


@pytest.mark.django_db()
def test_searched_product_without_data(get_request_with_data,
render_mock,
messages_mock):
response = action_search_product(get_request_with_data, None)
messages_mock, saved_supplier0):
context = show_deliveries(saved_supplier0)
response = action_search_product(get_request_with_data, None, context)
assert response == render_mock.return_value
messages_mock.info.assert_called_with(
get_request_with_data, 'Product Not Found'
)
assert render_mock.call_args_list == [
call(get_request_with_data, 'supplier/suppliers.html')
call(get_request_with_data, 'supplier/suppliers.html', context)
]


@pytest.mark.django_db()
def test_action_display_all_products(get_request,
saved_supplier0,
render_mock,
saved_supplier_product0,
saved_supplier_product1):
response = action_display_all_products(get_request, saved_supplier0)
render_mock):
context = show_deliveries(saved_supplier0)
response = action_display_all_products(get_request, saved_supplier0, context)
assert response == render_mock.return_value

data = set(SupplierProduct.objects.filter(user_name=saved_supplier0))
context['supplier_products'] = data
assert render_mock.call_args_list == [
call(get_request, 'supplier/suppliers.html', {'supplier_products': data})
call(get_request, 'supplier/suppliers.html', context)
]


@pytest.mark.django_db()
def test_supplier_deliveries(client, delivery_location0):
delivery_location0.add_delivery_location()
client.force_login(user=delivery_location0.user_name.supplier_account)
response = client.get('/suppliers/')
assert list(response.context['supplier_deliveries']) == [delivery_location0]


@pytest.mark.django_db()
def test_create_delivery(client, saved_supplier0):
client.force_login(user=saved_supplier0.supplier_account)
response = client.get('/suppliers/?location=tel+aviv&date=2023-01-18&add=Add')
assert len(DeliveryLocation.objects.filter(user_name=saved_supplier0)) != 0
assert response.status_code == 302
assert client.get('/suppliers/').status_code == 200


@pytest.mark.django_db()
def test_show_deliveries_with_no_deliveries(client, saved_supplier0):
client.force_login(user=saved_supplier0.supplier_account)
response = client.get('/suppliers/')
assert len(DeliveryLocation.objects.filter(user_name=saved_supplier0)) == 0
assert response.status_code == 200
assert len(list(response.context['supplier_deliveries'])) == 0
assert response.context['message'] == "You don't have any deliveries yet"


@pytest.mark.django_db()
def test_remove_delivery(client, saved_supplier0):
client.force_login(user=saved_supplier0.supplier_account)
client.get('/suppliers/?location=tel+aviv&date=2023-01-18&add=Add')
assert len(DeliveryLocation.objects.filter(user_name=saved_supplier0)) != 0
response = client.get('/suppliers/?location=tel+aviv&date=2023-01-18&delete=Delete')
assert len(DeliveryLocation.objects.filter(user_name=saved_supplier0)) == 0
assert response.status_code == 302
assert client.get('/suppliers/').status_code == 200
54 changes: 47 additions & 7 deletions supplier/views.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
from django.shortcuts import render
from supplier.models import Supplier
from delivery_location.models import DeliveryLocation
from django.contrib.auth.decorators import user_passes_test
from supplier_product.models import SupplierProduct
from product.models import Product
from django.contrib import messages
from django.shortcuts import redirect


def get_supplier(user):
Expand All @@ -24,23 +26,61 @@ def get_product_by_name_and_supplier(request, supplier):
return None


def action_search_product(request, supplier_product):
def action_search_product(request, supplier_product, context):
if supplier_product:
return render(request, 'supplier/suppliers.html', {'supplier_products': supplier_product})
context['supplier_products'] = supplier_product
return render(request, 'supplier/suppliers.html', context)
else:
messages.info(request, 'Product Not Found')
return render(request, 'supplier/suppliers.html')
return render(request, 'supplier/suppliers.html', context)


def action_display_all_products(request, supplier):
def action_display_all_products(request, supplier, context):
data = set(SupplierProduct.objects.filter(user_name=supplier))
return render(request, 'supplier/suppliers.html', {'supplier_products': data})
context['supplier_products'] = data
return render(request, 'supplier/suppliers.html', context)


@user_passes_test(get_supplier, login_url='Not allowed')
def suppliers_page(request):
supplier = get_supplier(request.user)
context = show_deliveries(supplier)

if 'add' in request.GET:
location = request.GET['location'].capitalize()
date = request.GET['date']
create_delivery(supplier, location, date)
return redirect('/suppliers/')

if 'delete' in request.GET:
location = request.GET['location']
date = request.GET['date']
remove_delivery(supplier, location, date)
return redirect('/suppliers/')

if 'searched_product' in request.GET:
return action_search_product(request, get_product_by_name_and_supplier(request, supplier))
return action_search_product(request, get_product_by_name_and_supplier(request, supplier), context)

return action_display_all_products(request, supplier, context)


def show_deliveries(supplier):
supplier_deliveries = DeliveryLocation.objects.filter(user_name=supplier)
message = ''
if len(supplier_deliveries) == 0:
message = "You don't have any deliveries yet"
return {'message': message, 'supplier_deliveries': supplier_deliveries}


def create_delivery(supplier, location, date):
delivery = DeliveryLocation.objects.filter(user_name=supplier, location__icontains=location, date=date).first()
if delivery is not None:
return

DeliveryLocation(user_name=supplier, location=location, date=date).add_delivery_location()


return action_display_all_products(request, supplier)
def remove_delivery(supplier, location, date):
delivery = DeliveryLocation.objects.filter(user_name=supplier, location__icontains=location, date=date).first()
if delivery is not None:
delivery.remove_delivery_location()
28 changes: 28 additions & 0 deletions supplier_product/test_views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from django.test import Client
from django.urls import reverse
from .models import SupplierProduct
import pytest


@pytest.mark.django_db()
def test_increase_quantity(saved_supplier_product0):
supplier_product = saved_supplier_product0
client = Client()
n = 3
response = client.get(
reverse('supplier_product:increase_quantity', kwargs={'id': supplier_product.supplier_product_id, 'n': n}))
updated_product = SupplierProduct.objects.get(supplier_product_id=supplier_product.supplier_product_id)
assert updated_product.quantity == supplier_product.quantity + n
assert response.status_code == 302


@pytest.mark.django_db()
def test_decrease_quantity(saved_supplier_product0):
supplier_product = saved_supplier_product0
client = Client()
n = 3
response = client.get(
reverse('supplier_product:decrease_quantity', kwargs={'id': supplier_product.supplier_product_id, 'n': n}))
updated_product = SupplierProduct.objects.get(supplier_product_id=supplier_product.supplier_product_id)
assert updated_product.quantity == supplier_product.quantity - n
assert response.status_code == 302
9 changes: 9 additions & 0 deletions supplier_product/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from django.urls import path
from . import views


app_name = 'supplier_product'
urlpatterns = [
path('increase_quantity/<int:id>/<int:n>/', views.increase_quantity, name='increase_quantity'),
path('decrease_quantity/<int:id>/<int:n>/', views.decrease_quantity, name='decrease_quantity'),
]
39 changes: 39 additions & 0 deletions supplier_product/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
from django.shortcuts import redirect
from supplier_product.models import SupplierProduct
from django.template.exceptions import TemplateDoesNotExist
from django.http import HttpResponse
from django.db.models import F


def increase_quantity(request, id, n):
SupplierProduct.objects.filter(supplier_product_id=id).update(quantity=F('quantity')+n)
try:
product = SupplierProduct.objects.get(supplier_product_id=id)
except SupplierProduct.DoesNotExist:
raise HttpResponse("Product does not exist")
context = {'product': product}
try:
return redirect(request.META.get('HTTP_REFERER', '/'), context)
except TemplateDoesNotExist:
return HttpResponse("Template not found")


def decrease_quantity(request, id, n):
try:
product = SupplierProduct.objects.get(supplier_product_id=id)
except SupplierProduct.DoesNotExist:
raise HttpResponse("Product does not exist")
context = {'product': product}
if product.quantity > n:
SupplierProduct.objects.filter(supplier_product_id=id).update(quantity=F('quantity')-n)
else:
try:
context = {'product': product}
return redirect(request.META.get('HTTP_REFERER', '/'), context)
except TemplateDoesNotExist:
return HttpResponse("Template not found")
try:
context = {'product': product}
return redirect(request.META.get('HTTP_REFERER', '/'), context)
except TemplateDoesNotExist:
return HttpResponse("Template not found")
30 changes: 28 additions & 2 deletions templates/supplier/suppliers.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,29 @@
{% include 'buy_together_app/help_parts/nav.html' %}

<div class="container">
<div class="container-A d-flex justify-content-center">
<dov> here will be something</p>
<div class="container-A justify-content-center" style="background-color: rgb(34, 214, 234);;">
<p style="font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif; margin-left: 60px">
{% if not supplier_deliveries %}
<p style="color: #000; font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif; left: 10px; position: relative; left: 8px;">{{message}}</p>
{% else %}
<ul style="font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;">
{% for delivery in supplier_deliveries %}
<li>
Location: {{delivery.location}}<br>
Date: {{delivery.date}}<br><br>
</li>
{% endfor %}
</ul>
{% endif %}
</p>
<form method = "get" style="font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif; margin-left: 30px;">
<input id="enter_location" type="text" placeholder="Enter location" required name="location"><br>
<input id="add_date" type="date" placeholder="Add date" required name="date">
<p>
<input type="submit" value="Add" name="add" style="color: green;">
<input type="submit" value="Delete" name="delete" style="color: red;">
</p>
</form>
</div>
<div class="container-B">

Expand Down Expand Up @@ -53,7 +74,12 @@
</button>
</form>
</div>

<div class="container_A d-flex justify-content-center">
<p> here will be something</p>
</div> -->

</div>
</div>
</body>

Expand Down