From 7ae1e298868e91b5fb2f2a0effccbbaaeb7ad107 Mon Sep 17 00:00:00 2001 From: C1nde Date: Mon, 13 Oct 2014 16:39:37 +0400 Subject: [PATCH 1/8] fixed db --- .gitignore | 3 +++ settings.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) 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/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' From 9017a31935ce80ba1e7520d0cbed55839217343c Mon Sep 17 00:00:00 2001 From: C1nde Date: Mon, 13 Oct 2014 16:40:34 +0400 Subject: [PATCH 2/8] uppercase PRIORITY --- orders/models.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/orders/models.py b/orders/models.py index aeb40f6..8beb978 100644 --- a/orders/models.py +++ b/orders/models.py @@ -27,7 +27,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) From 8d91b9516494a6c02b580a2656d0718d6560a738 Mon Sep 17 00:00:00 2001 From: C1nde Date: Mon, 13 Oct 2014 16:40:57 +0400 Subject: [PATCH 3/8] missed migration --- orders/migrations/0002_auto_20141013_1240.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 orders/migrations/0002_auto_20141013_1240.py 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')]), + ), + ] From ec537cae4b9be97aadf3ad99c76908793c26a262 Mon Sep 17 00:00:00 2001 From: C1nde Date: Mon, 13 Oct 2014 17:14:40 +0400 Subject: [PATCH 4/8] first test --- orders/managers.py | 16 ++++++++++++++++ orders/models.py | 3 +++ orders/tests.py | 6 ++++-- 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 orders/managers.py diff --git a/orders/managers.py b/orders/managers.py new file mode 100644 index 0000000..d543b13 --- /dev/null +++ b/orders/managers.py @@ -0,0 +1,16 @@ +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 diff --git a/orders/models.py b/orders/models.py index 8beb978..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' diff --git a/orders/tests.py b/orders/tests.py index a3ea841..6b99344 100644 --- a/orders/tests.py +++ b/orders/tests.py @@ -9,7 +9,9 @@ class OrderOrderingTestCase(TestCase): fixtures = ['test_orders.json'] def test_orders_are_split_by_shipping_method(self): - #fcm, pri = Order.split_by_shipping_method() + fcm, pri = Order.objects.split_by_shipping_method() + fcm = [model.pk for model in fcm] + pri = [model.pk for model in pri] self.assertEqual(results.fcm, fcm) self.assertEqual(results.pri, pri) @@ -25,4 +27,4 @@ def test_single_orders_are_sorted(self): 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 + self.assertEqual(results.not_xxl, not_xxl) From 18f661ab27647754e6aa1b2213da9c318057373f Mon Sep 17 00:00:00 2001 From: C1nde Date: Mon, 13 Oct 2014 17:29:30 +0400 Subject: [PATCH 5/8] second test --- orders/managers.py | 11 +++++++++++ orders/tests.py | 4 +++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/orders/managers.py b/orders/managers.py index d543b13..01aa977 100644 --- a/orders/managers.py +++ b/orders/managers.py @@ -14,3 +14,14 @@ def split_by_shipping_method(self): 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 diff --git a/orders/tests.py b/orders/tests.py index 6b99344..14a2b88 100644 --- a/orders/tests.py +++ b/orders/tests.py @@ -16,7 +16,9 @@ def test_orders_are_split_by_shipping_method(self): self.assertEqual(results.pri, pri) def test_orders_are_split_by_single_and_multiple(self): - #singles, multiples = Order.split_by_single_and_multiple() + singles, multiples = Order.objects.split_by_single_and_multiple() + singles = [model.pk for model in singles] + multiples = [model.pk for model in multiples] self.assertEqual(results.singles, singles) self.assertEqual(results.multiples, multiples) From 3cd4310435b5de84ca58fb764dd5ceb9108e2a73 Mon Sep 17 00:00:00 2001 From: C1nde Date: Mon, 13 Oct 2014 18:48:06 +0400 Subject: [PATCH 6/8] third test --- orders/managers.py | 4 ++++ orders/tests.py | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/orders/managers.py b/orders/managers.py index 01aa977..b939094 100644 --- a/orders/managers.py +++ b/orders/managers.py @@ -25,3 +25,7 @@ def split_by_single_and_multiple(self): 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]) diff --git a/orders/tests.py b/orders/tests.py index 14a2b88..cb49150 100644 --- a/orders/tests.py +++ b/orders/tests.py @@ -23,8 +23,10 @@ def test_orders_are_split_by_single_and_multiple(self): self.assertEqual(results.multiples, 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() From e31b2cd976fbc1c1e6bf02f3869062f3b9cd9997 Mon Sep 17 00:00:00 2001 From: C1nde Date: Mon, 13 Oct 2014 18:53:34 +0400 Subject: [PATCH 7/8] fourth test --- orders/managers.py | 12 ++++++++++++ orders/tests.py | 4 +++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/orders/managers.py b/orders/managers.py index b939094..ac25744 100644 --- a/orders/managers.py +++ b/orders/managers.py @@ -29,3 +29,15 @@ def split_by_single_and_multiple(self): 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/tests.py b/orders/tests.py index cb49150..61050e8 100644 --- a/orders/tests.py +++ b/orders/tests.py @@ -29,6 +29,8 @@ def test_single_orders_are_sorted(self): 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() + xxl, not_xxl = Order.objects.orders_split_by_xxl_and_not() + xxl = [model.pk for model in xxl] + not_xxl = [model.pk for model in not_xxl] self.assertEqual(results.xxl, xxl) self.assertEqual(results.not_xxl, not_xxl) From abac50c91c235ca7fcdae0ef9767e68f79992e34 Mon Sep 17 00:00:00 2001 From: C1nde Date: Mon, 13 Oct 2014 19:02:11 +0400 Subject: [PATCH 8/8] tests refactoring --- orders/tests.py | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/orders/tests.py b/orders/tests.py index 61050e8..8b8223f 100644 --- a/orders/tests.py +++ b/orders/tests.py @@ -2,35 +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.objects.split_by_shipping_method() - fcm = [model.pk for model in fcm] - pri = [model.pk for model in pri] - self.assertEqual(results.fcm, fcm) - self.assertEqual(results.pri, pri) + 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.objects.split_by_single_and_multiple() - singles = [model.pk for model in singles] - multiples = [model.pk for model in multiples] - self.assertEqual(results.singles, singles) - self.assertEqual(results.multiples, multiples) + 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.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.objects.orders_split_by_xxl_and_not() - xxl = [model.pk for model in xxl] - not_xxl = [model.pk for model in not_xxl] - self.assertEqual(results.xxl, xxl) - self.assertEqual(results.not_xxl, not_xxl) + 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)