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: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ var/
.installed.cfg
*.egg

# SQLite
*.sqlite3

# Installer logs
pip-log.txt
pip-delete-this-directory.txt
Expand Down
43 changes: 43 additions & 0 deletions orders/managers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
from django.db import models


class OrderManager(models.Manager):
"""
Custom manager for Order model
"""
def split_by_shipping_method(self):
fcm = []
pri = []
for model in self.get_queryset().all():
if model.shipping_method == self.model.FCM:
fcm.append(model)
elif model.shipping_method == self.model.PRI:
pri.append(model)
return fcm, pri

def split_by_single_and_multiple(self):
singles = []
multiples = []
all_orders = self.get_queryset().annotate(models.Count('items')).all()
for order in all_orders:
if order.items__count == 1:
singles.append(order)
elif order.items__count > 0:
multiples.append(order)
return singles, multiples

def single_orders_are_sorted(self):
orders = self.get_queryset().annotate(models.Count('items')).filter(items__count=1).select_related('items')
return sorted(orders, key=lambda order: order.items.first().PRIORITY[order.items.first().product])

def orders_split_by_xxl_and_not(self):
orders = self.get_queryset().annotate(models.Count('items')).filter(items__count__gt=1).select_related('items')
xxl = []
not_xxl = []
for order in orders:
if "XXL" in order.items.values_list('product', flat=True):
xxl.append(order)
else:
not_xxl.append(order)

return xxl, not_xxl
19 changes: 19 additions & 0 deletions orders/migrations/0002_auto_20141013_1240.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations


class Migration(migrations.Migration):

dependencies = [
('orders', '0001_initial'),
]

operations = [
migrations.AlterField(
model_name='orderitem',
name='product',
field=models.CharField(max_length=100, choices=[(b'XS', b'Extra Small Tee'), (b'S', b'Small Tee'), (b'M', b'Medium Tee'), (b'L', b'Large Tee'), (b'XL', b'Extra Large Tee'), (b'XXL', b'Double Extra Large Tee')]),
),
]
8 changes: 6 additions & 2 deletions orders/models.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from django.db import models

from .managers import OrderManager

class Order(models.Model):
FCM = 'FCM'
Expand All @@ -11,6 +12,8 @@ class Order(models.Model):
shipping_method = models.CharField(max_length=100, choices=SHIPPING_CHOICES)
date_completed = models.DateTimeField()

objects = OrderManager()


class OrderItem(models.Model):
XS = 'XS'
Expand All @@ -27,7 +30,8 @@ class OrderItem(models.Model):
('XL', 'Extra Large Tee'),
('XXL', 'Double Extra Large Tee'),
)
priority = {'XS': 0, 'S': 1, 'M': 2, 'L': 3, 'XL': 4, 'XXL': 5}
PRIORITY = {'XS': 0, 'S': 1, 'M': 2, 'L': 3, 'XL': 4, 'XXL': 5}

order = models.ForeignKey(Order, related_name='items')
product = models.CharField(max_length=100, choices=PRODUCT_CHOICES)
quantity = models.PositiveIntegerField(default=1)
quantity = models.PositiveIntegerField(default=1)
36 changes: 23 additions & 13 deletions orders/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,37 @@

from orders.models import Order, OrderItem

import results


class OrderOrderingTestCase(TestCase):
fixtures = ['test_orders.json']

def test_orders_are_split_by_shipping_method(self):
#fcm, pri = Order.split_by_shipping_method()
self.assertEqual(results.fcm, fcm)
self.assertEqual(results.pri, pri)
fcm, pri = Order.objects.split_by_shipping_method()
all_fcm = all([order.shipping_method == Order.FCM for order in fcm])
all_pri = all([order.shipping_method == Order.PRI for order in pri])

self.assertTrue(all_fcm)
self.assertTrue(all_pri)

def test_orders_are_split_by_single_and_multiple(self):
#singles, multiples = Order.split_by_single_and_multiple()
self.assertEqual(results.singles, singles)
self.assertEqual(results.multiples, multiples)
singles, multiples = Order.objects.split_by_single_and_multiple()
all_singles = all([order.items.count() == 1 for order in singles])
all_multiples = all([order.items.count() >= 2 for order in multiples])

self.assertTrue(all_singles)
self.assertTrue(all_multiples)

def test_single_orders_are_sorted(self):
#single_sorted_orders = Order.single_orders_are_sorted()
self.assertEqual(results.single_sorted_orders, single_sorted_orders)
single_sorted_orders = Order.objects.single_orders_are_sorted()
items_sizes = [order.items.first().product for order in single_sorted_orders]
ordered_right = all([OrderItem.PRIORITY[items_sizes[number]] <= OrderItem.PRIORITY[size] for number, size in enumerate(items_sizes[1:])])

self.assertTrue(ordered_right)

def test_multiple_orders_are_split_by_xxl_and_not(self):
#xxl, not_xxl = Order.orders_split_by_xxl_and_not()
self.assertEqual(results.xxl, xxl)
self.assertEqual(results.not_xxl, not_xxl)
xxl, not_xxl = Order.objects.orders_split_by_xxl_and_not()
all_xxl = all(["XXL" in order.items.values_list('product', flat=True) for order in xxl])
all_not_xxl = all(["XXL" not in order.items.values_list('product', flat=True) for order in not_xxl])

self.assertTrue(all_xxl)
self.assertTrue(all_not_xxl)
2 changes: 1 addition & 1 deletion settings.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import os

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
BASE_DIR = os.path.dirname(__file__)

SECRET_KEY = 'lw4yxsx_!!!e-)saya7*bo1vr1!fn^r*lbb3=uz(-l@#pw)ass'

Expand Down