diff --git a/.gitignore b/.gitignore index 4eb44fa..1f5d6d8 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,9 @@ var/ .installed.cfg *.egg +# SQLite +*.sqlite3 + # Installer logs pip-log.txt pip-delete-this-directory.txt diff --git a/orders/managers.py b/orders/managers.py new file mode 100644 index 0000000..ac25744 --- /dev/null +++ b/orders/managers.py @@ -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 diff --git a/orders/migrations/0002_auto_20141013_1240.py b/orders/migrations/0002_auto_20141013_1240.py new file mode 100644 index 0000000..f10a89b --- /dev/null +++ b/orders/migrations/0002_auto_20141013_1240.py @@ -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')]), + ), + ] diff --git a/orders/models.py b/orders/models.py index aeb40f6..6db306f 100644 --- a/orders/models.py +++ b/orders/models.py @@ -1,5 +1,6 @@ from django.db import models +from .managers import OrderManager class Order(models.Model): FCM = 'FCM' @@ -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' @@ -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) \ No newline at end of file + quantity = models.PositiveIntegerField(default=1) diff --git a/orders/tests.py b/orders/tests.py index a3ea841..8b8223f 100644 --- a/orders/tests.py +++ b/orders/tests.py @@ -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) \ No newline at end of file + 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) diff --git a/settings.py b/settings.py index 7bc4f56..2e4788e 100644 --- a/settings.py +++ b/settings.py @@ -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'