From 2d2bb2a6999348f84f25612045aa64224af004e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Bogda=C5=82?= Date: Mon, 2 Nov 2015 19:22:22 +0100 Subject: [PATCH] Use python 3.5 and get rid of warnings --- .travis.yml | 19 +++- Dockerfile | 2 +- runtime.txt | 2 +- saleor/cart/test_cart.py | 2 +- saleor/checkout/__init__.py | 153 ------------------------------- saleor/checkout/core.py | 153 +++++++++++++++++++++++++++++++ saleor/checkout/test_checkout.py | 8 +- saleor/checkout/views.py | 2 +- saleor/order/__init__.py | 46 ---------- saleor/order/utils.py | 47 ++++++++++ saleor/order/views.py | 2 +- tox.ini | 5 +- 12 files changed, 227 insertions(+), 214 deletions(-) create mode 100644 saleor/checkout/core.py create mode 100644 saleor/order/utils.py diff --git a/.travis.yml b/.travis.yml index c8f84a47a18..6629246b653 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,15 +6,28 @@ script: - tox env: - TOXENV=py27-django18 + - TOXENV=py27-django19 - TOXENV=py27-django_master - - TOXENV=py33-django18 - - TOXENV=py33-django_master - TOXENV=py34-django18 + - TOXENV=py34-django19 - TOXENV=py34-django_master + - TOXENV=py35-django18 + - TOXENV=py35-django19 + - TOXENV=py35-django_master matrix: allow_failures: + - env: TOXENV=py27-django19 - env: TOXENV=py27-django_master - - env: TOXENV=py33-django_master + - env: TOXENV=py34-django19 - env: TOXENV=py34-django_master + - env: TOXENV=py35-django19 + - env: TOXENV=py35-django_master after_success: - codecov +addons: + apt: + sources: + - deadsnakes + packages: + - python3.5 + - python3.5-dev diff --git a/Dockerfile b/Dockerfile index 750c64f193a..ecfdd6414ee 100755 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.4 +FROM python:3.5 ENV PYTHONUNBUFFERED 1 RUN \ diff --git a/runtime.txt b/runtime.txt index 1dc44e8efea..8f76fd10425 100644 --- a/runtime.txt +++ b/runtime.txt @@ -1 +1 @@ -python-3.4.2 \ No newline at end of file +python-3.5.0 \ No newline at end of file diff --git a/saleor/cart/test_cart.py b/saleor/cart/test_cart.py index 3c30ee4d262..3fb079dd66e 100755 --- a/saleor/cart/test_cart.py +++ b/saleor/cart/test_cart.py @@ -14,7 +14,7 @@ from .forms import ReplaceCartLineForm, ReplaceCartLineFormSet from ..cart.utils import ( contains_unavailable_products, remove_unavailable_products) -from ..checkout import Checkout +from ..checkout.core import Checkout from ..checkout.views import details as checkout_details from ..product.models import (ProductVariant, Product) diff --git a/saleor/checkout/__init__.py b/saleor/checkout/__init__.py index 66938608baf..e69de29bb2d 100644 --- a/saleor/checkout/__init__.py +++ b/saleor/checkout/__init__.py @@ -1,153 +0,0 @@ -from collections import defaultdict - -from django.conf import settings -from prices import Price -from satchless.process import ProcessManager - -from .steps import BillingAddressStep, ShippingStep, SummaryStep -from ..cart import Cart -from ..core import analytics -from ..order.models import Order -from ..userprofile.models import Address - -STORAGE_SESSION_KEY = 'checkout_storage' - - -class CheckoutStorage(defaultdict): - - modified = False - - def __init__(self, *args, **kwargs): - super(CheckoutStorage, self).__init__(dict, *args, **kwargs) - - -class Checkout(ProcessManager): - - items = None - groups = None - billing = None - steps = None - - def __init__(self, request): - self.request = request - self.groups = [] - self.steps = [] - self.items = [] - try: - self.storage = CheckoutStorage( - request.session[STORAGE_SESSION_KEY]) - except KeyError: - self.storage = CheckoutStorage() - self.cart = Cart.for_session_cart(request.cart, - discounts=request.discounts) - self.generate_steps(self.cart) - - def __iter__(self): - return iter(self.steps) - - def generate_steps(self, cart): - self.cart = cart - self.billing = BillingAddressStep( - self.request, self.get_storage('billing')) - self.steps.append(self.billing) - if self.is_shipping_required(): - self.shipping = ShippingStep( - self.request, self.get_storage('shipping'), - self.cart, billing_address=self.billing_address) - self.steps.append(self.shipping) - else: - self.shipping = None - summary_step = SummaryStep( - self.request, self.get_storage('summary'), checkout=self) - self.steps.append(summary_step) - - @property - def anonymous_user_email(self): - storage = self.get_storage('billing') - return storage.get('anonymous_user_email') - - @anonymous_user_email.setter - def anonymous_user_email(self, email): - storage = self.get_storage('billing') - storage['anonymous_user_email'] = email - - @anonymous_user_email.deleter - def anonymous_user_email(self): - storage = self.get_storage('billing') - storage['anonymous_user_email'] = '' - - @property - def billing_address(self): - storage = self.get_storage('billing') - address_data = storage.get('address', {}) - return Address(**address_data) - - @billing_address.setter - def billing_address(self, address): - storage = self.get_storage('billing') - storage['address'] = address.as_data() - - @billing_address.deleter - def billing_address(self): - storage = self.get_storage('billing') - storage['address'] = None - - @property - def shipping_address(self): - storage = self.get_storage('shipping') - address_data = storage.get('address', {}) - return Address(**address_data) - - @shipping_address.setter - def shipping_address(self, address): - storage = self.get_storage('shipping') - storage['address'] = address.as_data() - - @shipping_address.deleter - def shipping_address(self): - storage = self.get_storage('shipping') - storage['address'] = None - - def get_storage(self, name): - return self.storage[name] - - def get_total(self, **kwargs): - zero = Price(0, currency=settings.DEFAULT_CURRENCY) - total = sum( - (total_with_delivery - for delivery, delivery_cost, total_with_delivery - in self.get_deliveries(**kwargs)), - zero) - return total - - def save(self): - self.request.session[STORAGE_SESSION_KEY] = dict(self.storage) - - def clear_storage(self): - del self.request.session[STORAGE_SESSION_KEY] - self.cart.clear() - - def is_shipping_required(self): - return self.cart.is_shipping_required() - - def get_deliveries(self, **kwargs): - for partition in self.cart.partition(): - if self.shipping: - delivery_cost = self.shipping.delivery_method.get_delivery_total( - partition) - else: - delivery_cost = Price(0, currency=settings.DEFAULT_CURRENCY) - total_with_delivery = partition.get_total(**kwargs) + delivery_cost - yield partition, delivery_cost, total_with_delivery - - def create_order(self): - order = Order() - if self.request.user.is_authenticated(): - order.user = self.request.user - for step in self.steps: - step.add_to_order(order) - if self.request.user.is_authenticated(): - order.anonymous_user_email = '' - order.tracking_client_id = analytics.get_client_id(self.request) - order.save() - return order diff --git a/saleor/checkout/core.py b/saleor/checkout/core.py new file mode 100644 index 00000000000..66938608baf --- /dev/null +++ b/saleor/checkout/core.py @@ -0,0 +1,153 @@ +from collections import defaultdict + +from django.conf import settings +from prices import Price +from satchless.process import ProcessManager + +from .steps import BillingAddressStep, ShippingStep, SummaryStep +from ..cart import Cart +from ..core import analytics +from ..order.models import Order +from ..userprofile.models import Address + +STORAGE_SESSION_KEY = 'checkout_storage' + + +class CheckoutStorage(defaultdict): + + modified = False + + def __init__(self, *args, **kwargs): + super(CheckoutStorage, self).__init__(dict, *args, **kwargs) + + +class Checkout(ProcessManager): + + items = None + groups = None + billing = None + steps = None + + def __init__(self, request): + self.request = request + self.groups = [] + self.steps = [] + self.items = [] + try: + self.storage = CheckoutStorage( + request.session[STORAGE_SESSION_KEY]) + except KeyError: + self.storage = CheckoutStorage() + self.cart = Cart.for_session_cart(request.cart, + discounts=request.discounts) + self.generate_steps(self.cart) + + def __iter__(self): + return iter(self.steps) + + def generate_steps(self, cart): + self.cart = cart + self.billing = BillingAddressStep( + self.request, self.get_storage('billing')) + self.steps.append(self.billing) + if self.is_shipping_required(): + self.shipping = ShippingStep( + self.request, self.get_storage('shipping'), + self.cart, billing_address=self.billing_address) + self.steps.append(self.shipping) + else: + self.shipping = None + summary_step = SummaryStep( + self.request, self.get_storage('summary'), checkout=self) + self.steps.append(summary_step) + + @property + def anonymous_user_email(self): + storage = self.get_storage('billing') + return storage.get('anonymous_user_email') + + @anonymous_user_email.setter + def anonymous_user_email(self, email): + storage = self.get_storage('billing') + storage['anonymous_user_email'] = email + + @anonymous_user_email.deleter + def anonymous_user_email(self): + storage = self.get_storage('billing') + storage['anonymous_user_email'] = '' + + @property + def billing_address(self): + storage = self.get_storage('billing') + address_data = storage.get('address', {}) + return Address(**address_data) + + @billing_address.setter + def billing_address(self, address): + storage = self.get_storage('billing') + storage['address'] = address.as_data() + + @billing_address.deleter + def billing_address(self): + storage = self.get_storage('billing') + storage['address'] = None + + @property + def shipping_address(self): + storage = self.get_storage('shipping') + address_data = storage.get('address', {}) + return Address(**address_data) + + @shipping_address.setter + def shipping_address(self, address): + storage = self.get_storage('shipping') + storage['address'] = address.as_data() + + @shipping_address.deleter + def shipping_address(self): + storage = self.get_storage('shipping') + storage['address'] = None + + def get_storage(self, name): + return self.storage[name] + + def get_total(self, **kwargs): + zero = Price(0, currency=settings.DEFAULT_CURRENCY) + total = sum( + (total_with_delivery + for delivery, delivery_cost, total_with_delivery + in self.get_deliveries(**kwargs)), + zero) + return total + + def save(self): + self.request.session[STORAGE_SESSION_KEY] = dict(self.storage) + + def clear_storage(self): + del self.request.session[STORAGE_SESSION_KEY] + self.cart.clear() + + def is_shipping_required(self): + return self.cart.is_shipping_required() + + def get_deliveries(self, **kwargs): + for partition in self.cart.partition(): + if self.shipping: + delivery_cost = self.shipping.delivery_method.get_delivery_total( + partition) + else: + delivery_cost = Price(0, currency=settings.DEFAULT_CURRENCY) + total_with_delivery = partition.get_total(**kwargs) + delivery_cost + yield partition, delivery_cost, total_with_delivery + + def create_order(self): + order = Order() + if self.request.user.is_authenticated(): + order.user = self.request.user + for step in self.steps: + step.add_to_order(order) + if self.request.user.is_authenticated(): + order.anonymous_user_email = '' + order.tracking_client_id = analytics.get_client_id(self.request) + order.save() + return order diff --git a/saleor/checkout/test_checkout.py b/saleor/checkout/test_checkout.py index 3cb4b4c6222..f4f2ca6fc14 100644 --- a/saleor/checkout/test_checkout.py +++ b/saleor/checkout/test_checkout.py @@ -1,10 +1,8 @@ from django.contrib.auth.models import AnonymousUser -from django.test import TestCase -from mock import MagicMock, patch +from mock import MagicMock -from . import BillingAddressStep, ShippingStep -from ..checkout import STORAGE_SESSION_KEY -from ..checkout.steps import BaseAddressStep +from ..checkout.core import STORAGE_SESSION_KEY +from ..checkout.steps import BaseAddressStep, BillingAddressStep, ShippingStep from ..userprofile.models import Address NEW_ADDRESS = { diff --git a/saleor/checkout/views.py b/saleor/checkout/views.py index 68125c9f95b..ce9829332a9 100644 --- a/saleor/checkout/views.py +++ b/saleor/checkout/views.py @@ -1,7 +1,7 @@ from django.http.response import Http404 from django.shortcuts import redirect -from . import Checkout +from .core import Checkout from ..cart import Cart from ..cart.utils import contains_unavailable_products diff --git a/saleor/order/__init__.py b/saleor/order/__init__.py index 780a2bc88cd..e69de29bb2d 100644 --- a/saleor/order/__init__.py +++ b/saleor/order/__init__.py @@ -1,46 +0,0 @@ -import logging - -from payments.signals import status_changed -from django.dispatch import receiver -from django.shortcuts import get_object_or_404, redirect -from functools import wraps - -from .models import Order -from ..core import analytics - - -logger = logging.getLogger(__name__) - -def check_order_status(func): - @wraps(func) - def decorator(*args, **kwargs): - token = kwargs.pop('token') - order = get_object_or_404(Order, token=token) - if order.is_fully_paid(): - return redirect('order:details', token=order.token) - kwargs['order'] = order - return func(*args, **kwargs) - - return decorator - - -@receiver(status_changed) -def order_status_change(sender, instance, **kwargs): - order = instance.order - if order.is_fully_paid(): - order.change_status('fully-paid') - instance.send_confirmation_email() - try: - analytics.report_order(order.tracking_client_id, order) - except Exception: - # Analytics failing should not abort the checkout flow - logger.exception('Recording order in analytics failed') - - -def get_ip(request): - ip = request.META.get("HTTP_X_FORWARDED_FOR", None) - if ip: - ip = ip.split(", ")[0] - else: - ip = request.META.get("REMOTE_ADDR", "") - return ip diff --git a/saleor/order/utils.py b/saleor/order/utils.py new file mode 100644 index 00000000000..2c12616eff7 --- /dev/null +++ b/saleor/order/utils.py @@ -0,0 +1,47 @@ +import logging + +from payments.signals import status_changed +from django.dispatch import receiver +from django.shortcuts import get_object_or_404, redirect +from functools import wraps + +from .models import Order +from ..core import analytics + + +logger = logging.getLogger(__name__) + + +def check_order_status(func): + @wraps(func) + def decorator(*args, **kwargs): + token = kwargs.pop('token') + order = get_object_or_404(Order, token=token) + if order.is_fully_paid(): + return redirect('order:details', token=order.token) + kwargs['order'] = order + return func(*args, **kwargs) + + return decorator + + +@receiver(status_changed) +def order_status_change(sender, instance, **kwargs): + order = instance.order + if order.is_fully_paid(): + order.change_status('fully-paid') + instance.send_confirmation_email() + try: + analytics.report_order(order.tracking_client_id, order) + except Exception: + # Analytics failing should not abort the checkout flow + logger.exception('Recording order in analytics failed') + + +def get_ip(request): + ip = request.META.get("HTTP_X_FORWARDED_FOR", None) + if ip: + ip = ip.split(", ")[0] + else: + ip = request.META.get("REMOTE_ADDR", "") + return ip diff --git a/saleor/order/views.py b/saleor/order/views.py index 43caeb66ff9..00ef306305c 100644 --- a/saleor/order/views.py +++ b/saleor/order/views.py @@ -9,9 +9,9 @@ from django.template.response import TemplateResponse from payments import RedirectNeeded -from . import check_order_status, get_ip from .forms import PaymentDeleteForm, PaymentMethodsForm from .models import Order, Payment +from .utils import check_order_status, get_ip logger = logging.getLogger(__name__) diff --git a/tox.ini b/tox.ini index 38947fcc0cc..eb87857de98 100644 --- a/tox.ini +++ b/tox.ini @@ -1,9 +1,10 @@ [tox] -envlist = py{27,33,34}-django{18,_master} +envlist = py{27,34,35}-django{18,19,_master} [testenv] deps = - django18: django>=1.8,<1.9 + django18: django>=1.8,<1.9a0 + django19: django>=1.9a1,<1.10a0 django_master: https://github.com/django/django/archive/master.tar.gz mock==1.3.0 purl>=0.4.1