Example #1
11
from django.views import generic
from django.db.models import get_model
from django.http import HttpResponseRedirect
from django.contrib import messages
from django.core.urlresolvers import reverse

from oscar.apps.dashboard.catalogue import forms
from oscar.core.loading import get_classes
ProductForm, StockRecordForm, StockAlertSearchForm, ProductCategoryFormSet, ProductImageFormSet = get_classes(
    'dashboard.catalogue.forms', ('ProductForm', 'StockRecordForm',
                                  'StockAlertSearchForm',
                                  'ProductCategoryFormSet',
                                  'ProductImageFormSet'))
Product = get_model('catalogue', 'Product')
ProductCategory = get_model('catalogue', 'ProductCategory')
ProductClass = get_model('catalogue', 'ProductClass')
StockRecord = get_model('partner', 'StockRecord')
StockAlert = get_model('partner', 'StockAlert')


class ProductListView(generic.ListView):
    template_name = 'dashboard/catalogue/product_list.html'
    model = Product
    context_object_name = 'products'
    form_class = forms.ProductSearchForm
    base_description = 'Products'
    paginate_by = 20

    def get_context_data(self, **kwargs):
        ctx = super(ProductListView, self).get_context_data(**kwargs)
        ctx['product_classes'] = ProductClass.objects.all()
Example #2
0
 def test_load_formsets_mixed_destination(self):
     BaseBasketLineFormSet, BasketLineForm = get_classes(
         'basket.forms', ('BaseBasketLineFormSet', 'BasketLineForm'))
     self.assertEqual('oscar.apps.basket.formsets', BaseBasketLineFormSet.__module__)
     self.assertEqual('oscar.apps.basket.forms', BasketLineForm.__module__)
     StockRecordForm, StockRecordFormSet = get_classes(
         'dashboard.catalogue.forms', ('StockRecordForm', 'StockRecordFormSet')
     )
     self.assertEqual('oscar.apps.dashboard.catalogue.forms', StockRecordForm.__module__)
     OrderedProductForm, OrderedProductFormSet = get_classes(
         'dashboard.promotions.forms', ('OrderedProductForm', 'OrderedProductFormSet')
     )
     self.assertEqual('oscar.apps.dashboard.promotions.forms', OrderedProductForm.__module__)
     self.assertTrue(isinstance(OrderedProductFormSet().forms[0], OrderedProductForm))
     LineFormset, WishListLineForm = get_classes('wishlists.forms', ('LineFormset', 'WishListLineForm'))
     self.assertEqual('oscar.apps.wishlists.forms', WishListLineForm.__module__)
     self.assertTrue(isinstance(LineFormset(instance=self.wishlist).forms[0], WishListLineForm))
Example #3
0
 def test_loading_classes_with_root_app(self):
     import tests._site.shipping
     path = dirname(dirname(tests._site.shipping.__file__))
     with temporary_python_path([path]):
         self.installed_apps[
             self.installed_apps.index('tests._site.shipping')] = 'shipping'
         with override_settings(INSTALLED_APPS=self.installed_apps):
             (Free,) = get_classes('shipping.methods', ('Free',))
             self.assertEqual('shipping.methods', Free.__module__)
Example #4
0
from oscar.core.loading import get_class, get_classes
OrderReportGenerator = get_class('order.reports', 'OrderReportGenerator')
ProductReportGenerator, UserReportGenerator \
    = get_classes('analytics.reports', ['ProductReportGenerator',
                                        'UserReportGenerator'])
OpenBasketReportGenerator, SubmittedBasketReportGenerator \
    = get_classes('basket.reports', ['OpenBasketReportGenerator',
                                     'SubmittedBasketReportGenerator'])
OfferReportGenerator = get_class('offer.reports', 'OfferReportGenerator')
VoucherReportGenerator = get_class('voucher.reports', 'VoucherReportGenerator')


class GeneratorRepository(object):

    generators = [OrderReportGenerator,
                  ProductReportGenerator,
                  UserReportGenerator,
                  OpenBasketReportGenerator,
                  SubmittedBasketReportGenerator,
                  VoucherReportGenerator,
                  OfferReportGenerator]

    def get_report_generators(self):
        return self.generators

    def get_generator(self, code):
        for generator in self.generators:
            if generator.code == code:
                return generator
        return None
Example #5
0
from django.views import generic
from django.db.models import get_model
from django.http import HttpResponseRedirect
from django.contrib import messages
from django.core.urlresolvers import reverse

from oscar.apps.dashboard.catalogue import forms
from oscar.core.loading import get_classes

ProductForm, StockRecordForm, StockAlertSearchForm, ProductCategoryFormSet, ProductImageFormSet = get_classes(
    'dashboard.catalogue.forms',
    ('ProductForm', 'StockRecordForm', 'StockAlertSearchForm',
     'ProductCategoryFormSet', 'ProductImageFormSet'))
Product = get_model('catalogue', 'Product')
ProductCategory = get_model('catalogue', 'ProductCategory')
ProductClass = get_model('catalogue', 'ProductClass')
StockRecord = get_model('partner', 'StockRecord')
StockAlert = get_model('partner', 'StockAlert')


class ProductListView(generic.ListView):
    template_name = 'dashboard/catalogue/product_list.html'
    model = Product
    context_object_name = 'products'
    form_class = forms.ProductSearchForm
    base_description = 'Products'
    paginate_by = 20

    def get_context_data(self, **kwargs):
        ctx = super(ProductListView, self).get_context_data(**kwargs)
        ctx['product_classes'] = ProductClass.objects.all()
Example #6
0
import os
from datetime import datetime
from decimal import Decimal as D

from django.db.transaction import atomic
from django.utils.translation import ugettext_lazy as _

from oscar.apps.catalogue.categories import create_from_breadcrumbs
from oscar.core.compat import UnicodeCSVReader
from oscar.core.loading import get_class, get_classes

ImportingError = get_class('partner.exceptions', 'ImportingError')
Partner, StockRecord = get_classes('partner.models', ['Partner',
                                                      'StockRecord'])
ProductClass, Product, Category, ProductCategory = get_classes(
    'catalogue.models', ('ProductClass', 'Product', 'Category',
                         'ProductCategory'))


class CatalogueImporter(object):
    """
    CSV product importer used to built sandbox. Might not work very well
    for anything else.
    """

    _flush = False

    def __init__(self, logger, delimiter=",", flush=False):
        self.logger = logger
        self._delimiter = delimiter
        self._flush = flush
Example #7
0
from django.core.urlresolvers import reverse, resolve
from django.http import HttpResponseRedirect, Http404, HttpResponse
from django.views.generic import FormView, View
from django.utils.translation import ugettext_lazy as _
from django.core.exceptions import ObjectDoesNotExist
from django import shortcuts
from extra_views import ModelFormSetView

from oscar.core import ajax
from oscar.apps.basket import signals
from oscar.core.loading import get_class, get_classes, get_model
Applicator = get_class('offer.utils', 'Applicator')
(BasketLineFormSet, BasketLineForm, AddToBasketForm, BasketVoucherForm,
 SavedLineFormSet, SavedLineForm) \
    = get_classes('basket.forms', ('BasketLineFormSet', 'BasketLineForm',
                                   'AddToBasketForm', 'BasketVoucherForm',
                                   'SavedLineFormSet', 'SavedLineForm'))
Repository = get_class('shipping.repository', ('Repository'))
OrderTotalCalculator = get_class(
    'checkout.calculators', 'OrderTotalCalculator')


def get_messages(basket, offers_before, offers_after,
                 include_buttons=True):
    """
    Return the messages about offer changes
    """
    # Look for changes in offers
    offers_lost = set(offers_before.keys()).difference(
        set(offers_after.keys()))
    offers_gained = set(offers_after.keys()).difference(
Example #8
0
    ObjectDoesNotExist, MultipleObjectsReturned, PermissionDenied)
from django.core.urlresolvers import reverse
from django.db.models import get_model
from django.http import Http404, HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.views.generic import (ListView, CreateView, UpdateView, DeleteView,
                                  View, FormView)
from django.utils.translation import ugettext_lazy as _

from oscar.apps.customer.mixins import PageTitleMixin
from oscar.core.loading import get_classes

WishList = get_model('wishlists', 'WishList')
Line = get_model('wishlists', 'Line')
Product = get_model('catalogue', 'Product')
WishListForm, LineFormset = get_classes('wishlists.forms',
                                        ['WishListForm', 'LineFormset'])


class WishListListView(PageTitleMixin, ListView):
    context_object_name = active_tab = "wishlists"
    template_name = 'customer/wishlists/wishlists_list.html'
    page_title = _('Wish Lists')

    def get_queryset(self):
        return self.request.user.wishlists.all()


class WishListDetailView(PageTitleMixin, FormView):
    """
    This view acts as a DetailView for a wish list and allows updating the
    quantities of products.
Example #9
0
import logging

from django.http import Http404, HttpResponseRedirect, HttpResponseBadRequest
from django.core.urlresolvers import reverse
from django.contrib import messages
from django.contrib.auth import login
from django.db.models import get_model
from django.utils.translation import ugettext as _
from django.views.generic import DetailView, TemplateView, FormView, \
                                 DeleteView, UpdateView, CreateView

from oscar.apps.shipping.methods import NoShippingRequired
from oscar.core.loading import get_class, get_classes

ShippingAddressForm, GatewayForm = get_classes('checkout.forms', ['ShippingAddressForm', 'GatewayForm'])
OrderTotalCalculator = get_class('checkout.calculators', 'OrderTotalCalculator')
CheckoutSessionData = get_class('checkout.utils', 'CheckoutSessionData')
pre_payment, post_payment = get_classes('checkout.signals', ['pre_payment', 'post_payment'])
OrderNumberGenerator, OrderCreator = get_classes('order.utils', ['OrderNumberGenerator', 'OrderCreator'])
UserAddressForm = get_class('address.forms', 'UserAddressForm')
Repository = get_class('shipping.repository', 'Repository')
AccountAuthView = get_class('customer.views', 'AccountAuthView')
RedirectRequired, UnableToTakePayment, PaymentError = get_classes(
    'payment.exceptions', ['RedirectRequired', 'UnableToTakePayment', 'PaymentError'])
UnableToPlaceOrder = get_class('order.exceptions', 'UnableToPlaceOrder')
OrderPlacementMixin = get_class('checkout.mixins', 'OrderPlacementMixin')
CheckoutSessionMixin = get_class('checkout.session', 'CheckoutSessionMixin')

Order = get_model('order', 'Order')
ShippingAddress = get_model('order', 'ShippingAddress')
CommunicationEvent = get_model('order', 'CommunicationEvent')
Example #10
0
from oscar.core.loading import get_model
from django.http import HttpResponseRedirect, Http404, HttpResponse
from django.views.generic import FormView, View
from django.utils.translation import ugettext_lazy as _
from django.core.exceptions import ObjectDoesNotExist

from extra_views import ModelFormSetView
from oscar.core.compat import urlparse
from oscar.core import ajax
from oscar.apps.basket import signals
from oscar.core.loading import get_class, get_classes
Applicator = get_class('offer.utils', 'Applicator')
(BasketLineFormSet, BasketLineForm, AddToBasketForm, BasketVoucherForm,
 SavedLineFormSet, SavedLineForm, ProductSelectionForm) \
    = get_classes('basket.forms', ('BasketLineFormSet', 'BasketLineForm',
                                   'AddToBasketForm', 'BasketVoucherForm',
                                   'SavedLineFormSet', 'SavedLineForm',
                                   'ProductSelectionForm'))
Repository = get_class('shipping.repository', ('Repository'))
OrderTotalCalculator = get_class('checkout.calculators',
                                 'OrderTotalCalculator')


def get_messages(basket, offers_before, offers_after, include_buttons=True):
    """
    Return the messages about offer changes
    """
    # Look for changes in offers
    offers_lost = set(offers_before.keys()).difference(set(
        offers_after.keys()))
    offers_gained = set(offers_after.keys()).difference(
        set(offers_before.keys()))
Example #11
0
from django.dispatch import receiver
from django.db.models.signals import post_save

from oscar.core.loading import get_classes
StockRecord, StockAlert = get_classes('partner.models', ('StockRecord', 'StockAlert'))


@receiver(post_save, sender=StockRecord)
def update_stock_alerts(sender, instance, created, **kwargs):
    """
    Update low-stock alerts
    """
    if created or kwargs.get('raw', False):
        return
    stockrecord = instance
    try:
        alert = StockAlert.objects.get(stockrecord=stockrecord,
                                       status=StockAlert.OPEN)
    except StockAlert.DoesNotExist:
        alert = None

    if stockrecord.is_below_threshold and not alert:
        StockAlert.objects.create(stockrecord=stockrecord,
                                  threshold=stockrecord.low_stock_threshold)
    elif not stockrecord.is_below_threshold and alert:
        alert.close()
Example #12
0
from __future__ import unicode_literals

from decimal import Decimal as D

from django.test import TestCase
from django.test.client import Client
from django.urls import reverse
from django.utils.encoding import force_text
from mock import Mock, patch
from oscar.apps.basket.models import Basket
from oscar.apps.order.models import Order
from oscar.core.loading import get_classes
from oscar.test.factories import create_product
from purl import URL

Partner, StockRecord = get_classes('partner.models',
                                   ('Partner', 'StockRecord'))

(ProductClass, Product, ProductAttribute, ProductAttributeValue) = get_classes(
    'catalogue.models',
    ('ProductClass', 'Product', 'ProductAttribute', 'ProductAttributeValue'))


class MockedPayPalTests(TestCase):
    fixtures = ['countries.json']
    response_body = None

    def setUp(self):
        self.client = Client()
        with patch('requests.post') as post:
            self.patch_http_post(post)
            self.perform_action()
Example #13
0
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.utils.translation import ugettext_lazy as _
from django.template.loader import render_to_string
from django.views import generic

from oscar.apps.customer.utils import normalise_email
from oscar.apps.dashboard.partners.forms import UserEmailForm, ExistingUserForm, NewUserForm
from oscar.core.loading import get_classes
from oscar.core.compat import get_user_model
from oscar.views import sort_queryset

User = get_user_model()
Partner = get_model('partner', 'Partner')
PartnerSearchForm, PartnerCreateForm, PartnerAddressForm = get_classes(
    'dashboard.partners.forms',
    ['PartnerSearchForm', 'PartnerCreateForm', 'PartnerAddressForm'])


class PartnerListView(generic.ListView):
    model = Partner
    context_object_name = 'partners'
    template_name = 'dashboard/partners/partner_list.html'
    form_class = PartnerSearchForm

    def get_queryset(self):
        qs = self.model._default_manager.all()
        qs = sort_queryset(qs, self.request, ['name'])

        self.description = _("All partners")
Example #14
0
from django.core import exceptions
from django.db import models
from django.db.models.query import Q
from django.template.defaultfilters import date as date_filter
from django.urls import reverse
from django.utils.functional import cached_property
from django.utils.timezone import get_current_timezone, now
from django.utils.translation import gettext_lazy as _

from oscar.core.compat import AUTH_USER_MODEL
from oscar.core.loading import get_class, get_classes, get_model
from oscar.models import fields
from oscar.templatetags.currency_filters import currency

ActiveOfferManager, BrowsableRangeManager \
    = get_classes('offer.managers', ['ActiveOfferManager', 'BrowsableRangeManager'])
ZERO_DISCOUNT = get_class('offer.results', 'ZERO_DISCOUNT')
load_proxy, unit_price = get_classes('offer.utils', ['load_proxy', 'unit_price'])


# 基本报价
class BaseOfferMixin(models.Model):
    class Meta:
        abstract = True

    def proxy(self):
        """
        Return the proxy model
        返回代理模型
        """
        klassmap = self.proxy_map
Example #15
0
from django.forms.models import BaseModelFormSet, modelformset_factory

from oscar.core.loading import get_classes, get_model

Line = get_model('basket', 'line')
BasketLineForm, SavedLineForm = get_classes('basket.forms', ['BasketLineForm', 'SavedLineForm'])


class BaseBasketLineFormSet(BaseModelFormSet):

    def __init__(self, strategy, *args, **kwargs):
        self.strategy = strategy
        super().__init__(*args, **kwargs)

    def _construct_form(self, i, **kwargs):
        return super()._construct_form(
            i, strategy=self.strategy, **kwargs)

    def _should_delete_form(self, form):
        """
        Quantity of zero is treated as if the user checked the DELETE checkbox,
        which results in the basket line being deleted
        零的数量被处理为用户检查删除复选框,这会导致购物篮行被删除。
        """
        if super()._should_delete_form(form):
            return True
        if self.can_delete and 'quantity' in form.cleaned_data:
            return form.cleaned_data['quantity'] == 0


BasketLineFormSet = modelformset_factory(
Example #16
0
from django.test import TestCase
from django.urls import reverse

from oscar.core.loading import get_classes
from oscar.test.testcases import WebTestCase

from oscar_promotions import models
from oscar_promotions.dashboard import forms

RawHTML, PagePromotion = get_classes('oscar_promotions.models',
                                     ['RawHTML', 'PagePromotion'])


class ViewTests(WebTestCase):
    is_staff = True

    def test_pages_exist(self):
        urls = [
            reverse('dashboard:promotion-list'),
            reverse('dashboard:promotion-create-rawhtml'),
            reverse('dashboard:promotion-create-singleproduct'),
            reverse('dashboard:promotion-create-image'),
        ]
        for url in urls:
            self.assertIsOk(self.get(url))

    def test_create_redirects(self):
        base_url = reverse('dashboard:promotion-create-redirect')
        types = ['rawhtml', 'singleproduct', 'image']
        for p_type in types:
            url = '%s?promotion_type=%s' % (base_url, p_type)
Example #17
0
from django.utils.translation import ugettext_lazy as _
from django.template.loader import render_to_string
from django.views import generic

from oscar.apps.customer.utils import normalise_email
from oscar.core.loading import get_classes, get_model
from oscar.core.compat import get_user_model
from oscar.views import sort_queryset

User = get_user_model()
Partner = get_model('partner', 'Partner')
(
    PartnerSearchForm, PartnerCreateForm, PartnerAddressForm,
    NewUserForm, UserEmailForm, ExistingUserForm
) = get_classes(
    'dashboard.partners.forms',
    ['PartnerSearchForm', 'PartnerCreateForm', 'PartnerAddressForm',
     'NewUserForm', 'UserEmailForm', 'ExistingUserForm'])


class PartnerListView(generic.ListView):
    model = Partner
    context_object_name = 'partners'
    template_name = 'dashboard/partners/partner_list.html'
    form_class = PartnerSearchForm

    def get_queryset(self):
        qs = self.model._default_manager.all()
        qs = sort_queryset(qs, self.request, ['name'])

        self.description = _("All partners")
Example #18
0
from django.db.models import Q
from django.shortcuts import redirect
from django.utils.translation import ugettext_lazy as _
from django.views.generic import (
    DeleteView, DetailView, FormView, ListView, UpdateView)
from django.views.generic.detail import SingleObjectMixin
from django.views.generic.edit import FormMixin
from django_tables2 import SingleTableView

from oscar.apps.customer.utils import normalise_email
from oscar.core.compat import get_user_model
from oscar.core.loading import get_class, get_classes, get_model
from oscar.views.generic import BulkEditMixin

UserSearchForm, ProductAlertSearchForm, ProductAlertUpdateForm = get_classes(
    'dashboard.users.forms', ('UserSearchForm', 'ProductAlertSearchForm',
                              'ProductAlertUpdateForm'))
PasswordResetForm = get_class('customer.forms', 'PasswordResetForm')
UserTable = get_class('dashboard.users.tables', 'UserTable')
ProductAlert = get_model('customer', 'ProductAlert')
User = get_user_model()


class IndexView(BulkEditMixin, FormMixin, SingleTableView):
    template_name = 'dashboard/users/index.html'
    table_pagination = True
    model = User
    actions = ('make_active', 'make_inactive', )
    form_class = UserSearchForm
    table_class = UserTable
    context_table_name = 'users'
Example #19
0
from django.db.models import Q, get_model
from django.contrib import messages
from django.utils.translation import ugettext_lazy as _
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.views.generic import ListView, DetailView, DeleteView, UpdateView
from oscar.apps.customer.utils import normalise_email

from oscar.views.generic import BulkEditMixin
from oscar.core.compat import get_user_model
from oscar.core.loading import get_classes

UserSearchForm, ProductAlertSearchForm, ProductAlertUpdateForm = get_classes(
    "dashboard.users.forms", ("UserSearchForm", "ProductAlertSearchForm", "ProductAlertUpdateForm")
)
ProductAlert = get_model("customer", "ProductAlert")
User = get_user_model()


class IndexView(BulkEditMixin, ListView):
    template_name = "dashboard/users/index.html"
    paginate_by = 25
    model = User
    actions = ("make_active", "make_inactive")
    current_view = "dashboard:users-index"
    form_class = UserSearchForm
    desc_template = _("%(main_filter)s %(email_filter)s %(name_filter)s")
    description = ""

    def get_queryset(self):
        queryset = self.model.objects.all().order_by("-date_joined")
Example #20
0
from django.views import generic
from django.contrib.contenttypes.models import ContentType
from django.utils.translation import ugettext_lazy as _
from django.core.urlresolvers import reverse
from django.contrib import messages
from django.http import HttpResponseRedirect
from django.db.models import Count
from django.shortcuts import HttpResponse

from oscar.core.loading import get_classes
from oscar.apps.promotions.conf import PROMOTION_CLASSES, PROMOTION_POSITIONS

SingleProduct, RawHTML, Image, MultiImage, \
    AutomaticProductList, PagePromotion, \
    HandPickedProductList = get_classes('promotions.models',
    ['SingleProduct', 'RawHTML', 'Image', 'MultiImage', 'AutomaticProductList',
     'PagePromotion', 'HandPickedProductList'])
SelectForm, RawHTMLForm, PagePromotionForm, HandPickedProductListForm, OrderedProductFormSet = get_classes(
    'dashboard.promotions.forms', [
        'PromotionTypeSelectForm', 'RawHTMLForm', 'PagePromotionForm',
        'HandPickedProductListForm', 'OrderedProductFormSet'
    ])


class ListView(generic.TemplateView):
    template_name = 'dashboard/promotions/promotion_list.html'

    def get_context_data(self):
        # Need to load all promotions of all types and chain them together
        # no pagination required for now.
        data = []
Example #21
0
 ProductClassSelectForm,
 ProductSearchForm,
 ProductClassForm,
 CategoryForm,
 StockRecordFormSet,
 StockAlertSearchForm,
 ProductCategoryFormSet,
 ProductImageFormSet,
 ProductRecommendationFormSet,
 ProductAttributesFormSet) \
    = get_classes('dashboard.catalogue.forms',
                  ('ProductForm',
                   'ProductClassSelectForm',
                   'ProductSearchForm',
                   'ProductClassForm',
                   'CategoryForm',
                   'StockRecordFormSet',
                   'StockAlertSearchForm',
                   'ProductCategoryFormSet',
                   'ProductImageFormSet',
                   'ProductRecommendationFormSet',
                   'ProductAttributesFormSet'))
ProductTable, CategoryTable \
    = get_classes('dashboard.catalogue.tables',
                  ('ProductTable', 'CategoryTable'))
Product = get_model('catalogue', 'Product')
Category = get_model('catalogue', 'Category')
ProductImage = get_model('catalogue', 'ProductImage')
ProductCategory = get_model('catalogue', 'ProductCategory')
ProductClass = get_model('catalogue', 'ProductClass')
StockRecord = get_model('partner', 'StockRecord')
StockAlert = get_model('partner', 'StockAlert')
 def test_raise_exception_when_bad_appname_used(self):
     with self.assertRaises(AppNotFoundError):
         get_classes('fridge.models', ('Product', 'Category'))
Example #23
0
from django.utils.encoding import python_2_unicode_compatible
from django.utils.functional import cached_property
from django.utils.html import strip_tags
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import get_language, pgettext_lazy
from treebeard.mp_tree import MP_Node

from oscar.core.compat import user_is_anonymous, user_is_authenticated
from oscar.core.loading import get_class, get_classes, get_model
from oscar.core.utils import slugify
from oscar.core.validators import non_python_keyword
from oscar.models.fields import AutoSlugField, NullCharField
from oscar.models.fields.slugfield import SlugField

ProductManager, BrowsableProductManager = get_classes(
    'catalogue.managers', ['ProductManager', 'BrowsableProductManager'])
ProductAttributesContainer = get_class(
    'catalogue.product_attributes', 'ProductAttributesContainer')
Selector = get_class('partner.strategy', 'Selector')


@python_2_unicode_compatible
class AbstractProductClass(models.Model):
    """
    Used for defining options and attributes for a subset of products.
    E.g. Books, DVDs and Toys. A product can only belong to one product class.

    At least one product class must be created when setting up a new
    Oscar deployment.

    Not necessarily equivalent to top-level categories but usually will be.
 def test_loading_class_which_is_not_defined_in_local_module(self):
     with override_settings(INSTALLED_APPS=self.installed_apps):
         (FixedPrice, ) = get_classes('shipping.methods', ('FixedPrice', ))
         self.assertEqual('oscar.apps.shipping.methods',
                          FixedPrice.__module__)
Example #25
0
from decimal import Decimal as D

from django.utils.translation import gettext_lazy as _

from oscar.core.loading import get_class, get_classes, get_model
from oscar.templatetags.currency_filters import currency

Benefit = get_model('offer', 'Benefit')
BasketDiscount, SHIPPING_DISCOUNT, ZERO_DISCOUNT = get_classes('offer.results', [
    'BasketDiscount', 'SHIPPING_DISCOUNT', 'ZERO_DISCOUNT'])
CoverageCondition, ValueCondition = get_classes('offer.conditions', ['CoverageCondition', 'ValueCondition'])
range_anchor = get_class('offer.utils', 'range_anchor')

__all__ = [
    'PercentageDiscountBenefit', 'AbsoluteDiscountBenefit', 'FixedPriceBenefit',
    'ShippingBenefit', 'MultibuyDiscountBenefit',
    'ShippingAbsoluteDiscountBenefit', 'ShippingFixedPriceBenefit',
    'ShippingPercentageDiscountBenefit',
]


def apply_discount(line, discount, quantity, offer=None):
    """
    Apply a given discount to the passed basket
    """
    line.discount(discount, quantity, incl_tax=False, offer=offer)


class PercentageDiscountBenefit(Benefit):
    """
    An offer benefit that gives a percentage discount
 def test_loading_class_from_module_not_defined_in_local_app(self):
     with override_settings(INSTALLED_APPS=self.installed_apps):
         (Repository, ) = get_classes('shipping.repository',
                                      ('Repository', ))
         self.assertEqual('oscar.apps.shipping.repository',
                          Repository.__module__)
Example #27
0
from oscar.core.loading import get_class, get_classes, get_model
from oscar.views.generic import ObjectLookupView

(ProductForm,
 ProductClassSelectForm,
 ProductSearchForm,
 ProductClassForm,
 CategoryForm,
 StockAlertSearchForm,
 AttributeOptionGroupForm,
 OptionForm) \
    = get_classes('dashboard.catalogue.forms',
                  ('ProductForm',
                   'ProductClassSelectForm',
                   'ProductSearchForm',
                   'ProductClassForm',
                   'CategoryForm',
                   'StockAlertSearchForm',
                   'AttributeOptionGroupForm',
                   'OptionForm'))
(StockRecordFormSet,
 ProductCategoryFormSet,
 ProductImageFormSet,
 ProductRecommendationFormSet,
 ProductAttributesFormSet,
 AttributeOptionFormSet) \
    = get_classes('dashboard.catalogue.formsets',
                  ('StockRecordFormSet',
                   'ProductCategoryFormSet',
                   'ProductImageFormSet',
                   'ProductRecommendationFormSet',
Example #28
0
 def test_loading_class_which_is_not_defined_in_local_module(self):
     with patch_settings(INSTALLED_APPS=self.installed_apps):
         (FixedPrice,) = get_classes('shipping.methods', ('FixedPrice',))
         self.assertEqual('oscar.apps.shipping.methods', FixedPrice.__module__)
Example #29
0
from oscar.apps.catalogue.abstract_models import AbstractProduct
from oscar.core.loading import get_classes
from django.conf import settings

StockRecord, Partner = get_classes('partner.models', ('StockRecord', 'Partner'))


# here we override the core oscar Product model
class Product(AbstractProduct):
    
    # the 2 main modification we are doing are:
    # 1. add properties for cost_price and num_in_stock
    # 2. add a function allowing to set those values
    # both these modifications will be used in the product edit form
    
    @property
    def cost_price(self):
        # oscar has the prices and stock in a stockrecord model
        # in this case, we just use the first stockrecord, always
        if self.has_stockrecords:
            return self.stockrecords.first().cost_price
        else:
            return 0

    @property
    def num_in_stock(self):
        if self.has_stockrecords:
            return self.stockrecords.first().num_in_stock
        else:
            return 0
    
Example #30
0
 def test_loading_classes_defined_in_both_local_and_oscar_modules(self):
     with patch_settings(INSTALLED_APPS=self.installed_apps):
         (Free, FixedPrice) = get_classes('shipping.methods', ('Free', 'FixedPrice'))
         self.assertEqual('tests.site.shipping.methods', Free.__module__)
         self.assertEqual('oscar.apps.shipping.methods', FixedPrice.__module__)
Example #31
0
import json
from django.core.exceptions import (
    ObjectDoesNotExist,  PermissionDenied)
from django.core.urlresolvers import reverse
from django.http import Http404, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.views.generic import (View, FormView)
from rest_framework.views import APIView

from oscar.core.loading import get_class, get_classes, get_model
from oscar.core.utils import redirect_to_referrer

WishList = get_model('wishlists', 'WishList')
WishLine = get_model('wishlists', 'Line')
Product = get_model('catalogue', 'Product')
WishListForm, LineFormset = get_classes('wishlists.forms',
                                        ['WishListForm', 'LineFormset'])
PageTitleMixin = get_class('customer.mixins', 'PageTitleMixin')

wishlist_title = u'我的关注'

class MyFavListView(APIView):

    def get(self, request, *args, **kwargs):
        user = request.user
        tpl = 'customer/wishlists/myfav.html'

        wishlist = WishList.objects.filter(owner__pk=user.pk).first()
        if not wishlist:
            wishlist = WishList(owner=user)
            wishlist.save()
            myfav = []
Example #32
0
ProductCategory = get_model('catalogue', 'ProductCategory')
ProductImage = get_model('catalogue', 'ProductImage')
ProductRecommendation = get_model('catalogue', 'ProductRecommendation')
AttributeOptionGroup = get_model('catalogue', 'AttributeOptionGroup')
AttributeOption = get_model('catalogue', 'AttributeOption')

(StockRecordForm,
 ProductCategoryForm,
 ProductImageForm,
 ProductRecommendationForm,
 ProductAttributesForm,
 AttributeOptionForm) = \
    get_classes('dashboard.catalogue.forms',
                ('StockRecordForm',
                 'ProductCategoryForm',
                 'ProductImageForm',
                 'ProductRecommendationForm',
                 'ProductAttributesForm',
                 'AttributeOptionForm'))

BaseStockRecordFormSet = inlineformset_factory(Product,
                                               StockRecord,
                                               form=StockRecordForm,
                                               extra=1,
                                               max_num=1)


class StockRecordFormSet(BaseStockRecordFormSet):
    def __init__(self, product_class, user, *args, **kwargs):
        self.user = user
        self.require_user_stockrecord = False  #not user.is_staff
Example #33
0
 def test_loading_class_from_module_not_defined_in_local_app(self):
     with patch_settings(INSTALLED_APPS=self.installed_apps):
         (Repository,) = get_classes('shipping.repository', ('Repository',))
         self.assertEqual('oscar.apps.shipping.repository', Repository.__module__)
Example #34
0
from django.utils import six
from django.utils.encoding import python_2_unicode_compatible
from django.utils.functional import cached_property
from django.utils.html import strip_tags
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import get_language, pgettext_lazy
from treebeard.mp_tree import MP_Node

from oscar.core.loading import get_class, get_classes, get_model
from oscar.core.utils import slugify
from oscar.core.validators import non_python_keyword
from oscar.models.fields import AutoSlugField, NullCharField
from oscar.models.fields.slugfield import SlugField

ProductManager, BrowsableProductManager = get_classes(
    'catalogue.managers', ['ProductManager', 'BrowsableProductManager'])
ProductAttributesContainer = get_class('catalogue.product_attributes',
                                       'ProductAttributesContainer')
Selector = get_class('partner.strategy', 'Selector')


@python_2_unicode_compatible
class AbstractProductClass(models.Model):
    """
    Used for defining options and attributes for a subset of products.
    E.g. Books, DVDs and Toys. A product can only belong to one product class.

    At least one product class must be created when setting up a new
    Oscar deployment.

    Not necessarily equivalent to top-level categories but usually will be.
Example #35
0
import re, copy

from oscar.core.loading import get_class, get_classes
from oscar.apps.catalogue.categories import create_from_breadcrumbs

"""
You can replace these with regular imports, but make sure you reference
the correct version (i.e. if you forked the app, use your local version)
"""
ProductClass, Product, Category, ProductCategory = get_classes('catalogue.models',
    ('ProductClass', 'Product', 'Category', 'ProductCategory'))

class MatchCategories(object):
    """
    The large convoluted class is a helper class to match a Product
    to a ProductCategory. It is specific to our needs, and likely 
    to change heavily as our store evolves.
    """
    def __init__(self,  description=None, target_group=None, product_type=None,):
        if description is not None:
            self.description = description
        
        if target_group is not None:
            self.target_group = target_group
        else:
            self.target_group = self.find_target_group()
            
        if product_type is not None:
            self.product_type = product_type
        else:
            self.product_type = self.find_product_type()
Example #36
0
from django.urls import reverse
from django.utils.http import is_safe_url
from django.utils.translation import gettext_lazy as _
from django.views.generic import FormView, View
from extra_views import ModelFormSetView

from oscar.apps.basket.signals import (basket_addition, voucher_addition,
                                       voucher_removal)
from oscar.core import ajax
from oscar.core.loading import get_class, get_classes, get_model
from oscar.core.utils import redirect_to_referrer, safe_referrer

Applicator = get_class('offer.applicator', 'Applicator')
(BasketLineForm, AddToBasketForm, BasketVoucherForm,
 SavedLineForm) = get_classes('basket.forms',
                              ('BasketLineForm', 'AddToBasketForm',
                               'BasketVoucherForm', 'SavedLineForm'))
BasketLineFormSet, SavedLineFormSet = get_classes(
    'basket.formsets', ('BasketLineFormSet', 'SavedLineFormSet'))
Repository = get_class('shipping.repository', 'Repository')

OrderTotalCalculator = get_class('checkout.calculators',
                                 'OrderTotalCalculator')
BasketMessageGenerator = get_class('basket.utils', 'BasketMessageGenerator')


class BasketView(ModelFormSetView):
    model = get_model('basket', 'Line')
    basket_model = get_model('basket', 'Basket')
    formset_class = BasketLineFormSet
    form_class = BasketLineForm
Example #37
0
from oscar.core.loading import get_class, get_classes

Applicator = get_class("offer.utils", "Applicator")
(
    BasketLineForm,
    AddToBasketForm,
    BasketVoucherForm,
    SavedLineFormSet,
    SavedLineForm,
    ProductSelectionForm,
) = get_classes(
    "basket.forms",
    (
        "BasketLineForm",
        "AddToBasketForm",
        "BasketVoucherForm",
        "SavedLineFormSet",
        "SavedLineForm",
        "ProductSelectionForm",
    ),
)
Repository = get_class("shipping.repository", ("Repository"))


def get_messages(basket, offers_before, offers_after, include_buttons=True):
    """
    Return the messages about offer changes
    """
    # Look for changes in offers
    offers_lost = set(offers_before.keys()).difference(set(offers_after.keys()))
    offers_gained = set(offers_after.keys()).difference(set(offers_before.keys()))
Example #38
0
from django.conf import settings
from django.contrib import messages
from django.shortcuts import get_object_or_404, redirect
from django.utils.translation import gettext_lazy as _
from django.views.generic import CreateView, DetailView, ListView, View

from oscar.apps.catalogue.reviews.signals import review_added
from oscar.core.loading import get_classes, get_model
from oscar.core.utils import redirect_to_referrer

ProductReviewForm, VoteForm, SortReviewsForm = get_classes(
    'catalogue.reviews.forms',
    ['ProductReviewForm', 'VoteForm', 'SortReviewsForm'])

Vote = get_model('reviews', 'vote')
ProductReview = get_model('reviews', 'ProductReview')
Product = get_model('catalogue', 'product')


class CreateProductReview(CreateView):
    template_name = "oscar/catalogue/reviews/review_form.html"
    model = ProductReview
    product_model = Product
    form_class = ProductReviewForm
    view_signal = review_added

    def dispatch(self, request, *args, **kwargs):
        self.product = get_object_or_404(self.product_model,
                                         pk=kwargs['product_pk'],
                                         is_public=True)
        # check permission to leave review
Example #39
0
from oscar.core.loading import get_class, get_classes
from oscar.core.compat import get_user_model


from oscar.apps.checkout.views import PaymentMethodView as corePaymentMethodView
from oscar.apps.checkout.views import PaymentDetailsView as corePaymentDetailsView
from oscar.apps.checkout.views import ThankYouView as coreThankYouView

from robokassa.facade import robokassa_redirect

from apps.shipping.methods import Pickup
from apps.shipping.repository import Repository


RedirectRequired, UnableToTakePayment, PaymentError = get_classes(
            'payment.exceptions', ['RedirectRequired', 'UnableToTakePayment', 
                'PaymentError'])

Dispatcher = get_class('customer.utils', 'Dispatcher')
CommunicationEventType = get_model('customer', 'CommunicationEventType')
Order = get_model('order', 'Order')
SourceType = get_model('payment', 'SourceType')
Source = get_model('payment', 'Source')
CheckoutSessionData = get_class('checkout.utils', 'CheckoutSessionData')
# defered payment codes - коды офлайновых способов оплаты, нал, через банк, по счету
DeferedPaymentCodes = ('cash_payment', 'sbrf_slip', 'invoice_payment')
RedirectPaymentCodes = ('robokassa',)
RemotePaymentCodes = ('sbrf_slip', 'invoice_payment', 'robokassa')


User = get_user_model()
Example #40
0
from django.test.utils import override_settings
from django.core.urlresolvers import reverse
from django.conf import settings
from django.utils.importlib import import_module

from oscar.core.compat import get_user_model
from oscar.core.loading import get_class, get_classes, get_model
from oscar.test.testcases import WebTestCase
from oscar.test import factories
from . import CheckoutMixin

GatewayForm = get_class('checkout.forms', 'GatewayForm')
CheckoutSessionData = get_class('checkout.utils', 'CheckoutSessionData')
RedirectRequired, UnableToTakePayment, PaymentError = get_classes(
    'payment.exceptions',
    ['RedirectRequired', 'UnableToTakePayment', 'PaymentError'])
UnableToPlaceOrder = get_class('order.exceptions', 'UnableToPlaceOrder')

Basket = get_model('basket', 'Basket')
Order = get_model('order', 'Order')
User = get_user_model()

# Python 3 compat
try:
    from imp import reload
except ImportError:
    pass

REDIRECT_PATH = re.compile(u"url=http://localhost:80(.*)\"")
from django.test import TestCase

from oscar.apps.dashboard.promotions import forms
from oscar.core.loading import get_classes

RawHTML, PagePromotion = get_classes('promotions.models', ['RawHTML', 'PagePromotion'])


class TestPagePromotionForm(TestCase):

    def test_page_promotion_has_fields(self):
        promotion = RawHTML()
        promotion.save()
        instance = PagePromotion(content_object=promotion)
        data = {'position': 'page', 'page_url': '/'}
        form = forms.PagePromotionForm(data=data, instance=instance)
        self.assertTrue(form.is_valid())
        page_promotion = form.save()
        self.assertEqual(page_promotion.page_url, '/')
Example #42
0
from django import forms
from django.conf import settings
from django.utils.translation import ugettext_lazy as _

from oscar.apps.promotions.conf import PROMOTION_CLASSES
from oscar.core.loading import get_class, get_classes
from oscar.forms.fields import ExtendedURLField

HandPickedProductList, RawHTML, SingleProduct, PagePromotion, OrderedProduct \
    = get_classes('promotions.models',
                  ['HandPickedProductList', 'RawHTML', 'SingleProduct',
                   'PagePromotion', 'OrderedProduct'])
ProductSelect = get_class('dashboard.catalogue.widgets', 'ProductSelect')


class PromotionTypeSelectForm(forms.Form):
    choices = []
    for klass in PROMOTION_CLASSES:
        choices.append((klass.classname(), klass._meta.verbose_name))
    promotion_type = forms.ChoiceField(choices=tuple(choices),
                                       label=_("Promotion type"))


class RawHTMLForm(forms.ModelForm):
    class Meta:
        model = RawHTML
        fields = ['name', 'body']

    def __init__(self, *args, **kwargs):
        super(RawHTMLForm, self).__init__(*args, **kwargs)
        self.fields['body'].widget.attrs['class'] = "no-widget-init"
Example #43
0
import logging

from django import http
from django.contrib import messages
from django.contrib.auth import login
from django.core.urlresolvers import reverse, reverse_lazy
from django.utils.translation import ugettext as _
from django.views import generic

from oscar.core.loading import get_model
from oscar.apps.shipping.methods import NoShippingRequired
from oscar.core.loading import get_class, get_classes
from . import signals

ShippingAddressForm, GatewayForm \
    = get_classes('checkout.forms', ['ShippingAddressForm', 'GatewayForm'])
OrderCreator = get_class('order.utils', 'OrderCreator')
UserAddressForm = get_class('address.forms', 'UserAddressForm')
Repository = get_class('shipping.repository', 'Repository')
AccountAuthView = get_class('customer.views', 'AccountAuthView')
RedirectRequired, UnableToTakePayment, PaymentError \
    = get_classes('payment.exceptions', ['RedirectRequired',
                                         'UnableToTakePayment',
                                         'PaymentError'])
UnableToPlaceOrder = get_class('order.exceptions', 'UnableToPlaceOrder')
OrderPlacementMixin = get_class('checkout.mixins', 'OrderPlacementMixin')
CheckoutSessionMixin = get_class('checkout.session', 'CheckoutSessionMixin')

Order = get_model('order', 'Order')
ShippingAddress = get_model('order', 'ShippingAddress')
CommunicationEvent = get_model('order', 'CommunicationEvent')
Example #44
0
from oscar.views.generic import ObjectLookupView

(ProductForm,
 ProductClassSelectForm,
 ProductSearchForm,
 CategoryForm,
 StockRecordFormSet,
 StockAlertSearchForm,
 ProductCategoryFormSet,
 ProductImageFormSet,
 ProductRecommendationFormSet) \
    = get_classes('dashboard.catalogue.forms',
                  ('ProductForm',
                   'ProductClassSelectForm',
                   'ProductSearchForm',
                   'CategoryForm',
                   'StockRecordFormSet',
                   'StockAlertSearchForm',
                   'ProductCategoryFormSet',
                   'ProductImageFormSet',
                   'ProductRecommendationFormSet'))
Product = get_model('catalogue', 'Product')
Category = get_model('catalogue', 'Category')
ProductImage = get_model('catalogue', 'ProductImage')
ProductCategory = get_model('catalogue', 'ProductCategory')
ProductClass = get_model('catalogue', 'ProductClass')
StockRecord = get_model('partner', 'StockRecord')
StockAlert = get_model('partner', 'StockAlert')
Partner = get_model('partner', 'Partner')


def filter_products(queryset, user):
Example #45
0
Product = get_model('catalogue', 'Product')
ProductClass = get_model('catalogue', 'ProductClass')
ProductAttribute = get_model('catalogue', 'ProductAttribute')
Category = get_model('catalogue', 'Category')
StockRecord = get_model('partner', 'StockRecord')
ProductCategory = get_model('catalogue', 'ProductCategory')
ProductImage = get_model('catalogue', 'ProductImage')
ProductRecommendation = get_model('catalogue', 'ProductRecommendation')
AttributeOptionGroup = get_model('catalogue', 'AttributeOptionGroup')
AttributeOption = get_model('catalogue', 'AttributeOption')
Option = get_model('catalogue', 'Option')
ProductSelect = get_class('dashboard.catalogue.widgets', 'ProductSelect')
(RelatedFieldWidgetWrapper,
 RelatedMultipleFieldWidgetWrapper) = get_classes('dashboard.widgets',
                                                  ('RelatedFieldWidgetWrapper',
                                                   'RelatedMultipleFieldWidgetWrapper'))

CategoryForm = movenodeform_factory(
    Category,
    fields=['name', 'description', 'image'])


class ProductClassSelectForm(forms.Form):
    """
    Form which is used before creating a product to select it's product class
    """

    product_class = forms.ModelChoiceField(
        label=_("Create a new product of type"),
        empty_label=_("-- Choose type --"),
Example #46
0
from django.dispatch import receiver
from django.db.models.signals import post_save

from oscar.core.loading import get_classes
StockRecord, StockAlert = get_classes('partner.models',
                                      ('StockRecord', 'StockAlert'))


@receiver(post_save, sender=StockRecord)
def update_stock_alerts(sender, instance, created, **kwargs):
    """
    Update low-stock alerts
    """
    if created:
        return
    stockrecord = instance
    try:
        alert = StockAlert.objects.get(stockrecord=stockrecord,
                                       status=StockAlert.OPEN)
    except StockAlert.DoesNotExist:
        alert = None

    if stockrecord.is_below_threshold and not alert:
        StockAlert.objects.create(stockrecord=stockrecord,
                                  threshold=stockrecord.low_stock_threshold)
    elif not stockrecord.is_below_threshold and alert:
        alert.close()
Example #47
0
from django.conf import settings
from django.contrib import messages
from django.shortcuts import get_object_or_404, redirect
from django.utils.translation import gettext_lazy as _
from django.views.generic import CreateView, DetailView, ListView, View

from oscar.apps.catalogue.reviews.signals import review_added
from oscar.core.loading import get_classes, get_model
from oscar.core.utils import redirect_to_referrer

ProductReviewForm, VoteForm, SortReviewsForm = get_classes(
    'catalogue.reviews.forms',
    ['ProductReviewForm', 'VoteForm', 'SortReviewsForm'])

Vote = get_model('reviews', 'vote')
ProductReview = get_model('reviews', 'ProductReview')
Product = get_model('catalogue', 'product')


class CreateProductReview(CreateView):
    template_name = "oscar/catalogue/reviews/review_form.html"
    model = ProductReview
    product_model = Product
    form_class = ProductReviewForm
    view_signal = review_added

    def dispatch(self, request, *args, **kwargs):
        self.product = get_object_or_404(
            self.product_model, pk=kwargs['product_pk'])
        # check permission to leave review
        if not self.product.is_review_permitted(request.user):
Example #48
0
import os
from decimal import Decimal as D

from django.db.transaction import atomic
from django.utils.translation import ugettext_lazy as _

from oscar.apps.catalogue.categories import create_from_breadcrumbs
from oscar.core.compat import UnicodeCSVReader
from oscar.core.loading import get_class, get_classes

ImportingError = get_class('partner.exceptions', 'ImportingError')
Partner, StockRecord = get_classes('partner.models',
                                   ['Partner', 'StockRecord'])
ProductClass, Product, Category, ProductCategory = get_classes(
    'catalogue.models',
    ('ProductClass', 'Product', 'Category', 'ProductCategory'))


class CatalogueImporter(object):
    """
    CSV product importer used to built sandbox. Might not work very well
    for anything else.
    """

    _flush = False

    def __init__(self, logger, delimiter=",", flush=False):
        self.logger = logger
        self._delimiter = delimiter
        self._flush = flush
Example #49
0
from django import forms
from django.forms.models import inlineformset_factory
from django.utils.translation import ugettext_lazy as _

from oscar.forms.fields import ExtendedURLField
from oscar.core.loading import get_classes
from oscar.apps.promotions.conf import PROMOTION_CLASSES, PROMOTION_POSITIONS

RawHTML, SingleProduct, PagePromotion, HandPickedProductList, OrderedProduct = get_classes('promotions.models', 
    ['RawHTML', 'SingleProduct', 'PagePromotion', 'HandPickedProductList',
     'OrderedProduct'])


class PromotionTypeSelectForm(forms.Form):
    choices = []
    for klass in PROMOTION_CLASSES:
        choices.append((klass.classname(), klass._type))
    promotion_type = forms.ChoiceField(choices=tuple(choices))


class RawHTMLForm(forms.ModelForm):
    class Meta:
        model = RawHTML
        exclude = ('display_type',)


class HandPickedProductListForm(forms.ModelForm):
    class Meta:
        model = HandPickedProductList
        exclude = ('products',)
Example #50
0
from django.shortcuts import render
from django.conf import settings
from django.core.files import File
from oscar.core.loading import get_class, get_classes
from PIL import Image
from apps.designer.models import TshirtSKU

ProductClass, Product, Category, ProductCategory = get_classes(
    'catalogue.models',
    ('ProductClass', 'Product', 'Category', 'ProductCategory'))
ProductImage, ProductAttribute, ProductAttributeValue, AttributeOption = get_classes(
    'catalogue.models', ('ProductImage', 'ProductAttribute',
                         'ProductAttributeValue', 'AttributeOption'))

Partner, StockRecord = get_classes('partner.models',
                                   ('Partner', 'StockRecord'))


def home(request):
    if request.method == 'GET':
        return render(request, 'home.html')


def create(request):
    context_dict = {}
    if request.method == 'POST':

        img_src = request.POST.get('imagesrc')
        img_idx = img_src.find('base64')
        img_data = img_src[img_idx + 7:].decode("base64")
        img_file = open("./public/photo.png", "wb")
Example #51
0
from urlparse import urlparse
from django.contrib import messages
from django.core.urlresolvers import reverse, resolve
from django.db.models import get_model
from django.http import HttpResponseRedirect, Http404
from django.views.generic import FormView, View
from django.utils.translation import ugettext_lazy as _
from django.core.exceptions import ObjectDoesNotExist

from extra_views import ModelFormSetView
from oscar.apps.basket.signals import basket_addition, voucher_addition
from oscar.core.loading import get_class, get_classes
Applicator = get_class('offer.utils', 'Applicator')
BasketLineForm, AddToBasketForm, BasketVoucherForm, \
        SavedLineFormSet, SavedLineForm, ProductSelectionForm = get_classes(
            'basket.forms', ('BasketLineForm', 'AddToBasketForm',
                             'BasketVoucherForm', 'SavedLineFormSet',
                             'SavedLineForm', 'ProductSelectionForm'))
Repository = get_class('shipping.repository', ('Repository'))


def apply_messages(offers_before, request, default_msg=None):
    """
    Set flash messages triggered by changes to the basket
    """
    # Re-apply offers to see if any new ones are now available
    Applicator().apply(request, request.basket)
    offers_after = request.basket.get_discount_offers()

    # Look for changes in offers
    offers_lost = set(offers_before.keys()).difference(
        set(offers_after.keys()))
Example #52
0
from django.http import HttpResponseRedirect
from django.shortcuts import HttpResponse, get_object_or_404
from django.template.loader import render_to_string
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ungettext
from django.views.generic import (
    CreateView, DeleteView, ListView, UpdateView, View)

from oscar.core.loading import get_classes, get_model
from oscar.views.generic import BulkEditMixin

Range = get_model('offer', 'Range')
RangeProduct = get_model('offer', 'RangeProduct')
RangeProductFileUpload = get_model('offer', 'RangeProductFileUpload')
Product = get_model('catalogue', 'Product')
RangeForm, RangeProductForm = get_classes('dashboard.ranges.forms',
                                          ['RangeForm', 'RangeProductForm'])


class RangeListView(ListView):
    model = Range
    context_object_name = 'ranges'
    template_name = 'dashboard/ranges/range_list.html'


class RangeCreateView(CreateView):
    model = Range
    template_name = 'dashboard/ranges/range_form.html'
    form_class = RangeForm

    def get_success_url(self):
        if 'action' in self.request.POST:
Example #53
0
from django.contrib.contenttypes.models import ContentType
from django.utils.translation import ugettext_lazy as _
from django.core.urlresolvers import reverse
from django.conf import settings
from django.contrib import messages
from django.http import HttpResponseRedirect
from django.db.models import Count
from django.shortcuts import HttpResponse

from oscar.core.loading import get_classes
from oscar.apps.promotions.conf import PROMOTION_CLASSES

SingleProduct, RawHTML, Image, MultiImage, AutomaticProductList, \
    PagePromotion, HandPickedProductList \
    = get_classes('promotions.models',
                  ['SingleProduct', 'RawHTML', 'Image', 'MultiImage',
                   'AutomaticProductList', 'PagePromotion',
                   'HandPickedProductList'])
SelectForm, RawHTMLForm, PagePromotionForm, HandPickedProductListForm, \
    SingleProductForm, OrderedProductFormSet \
    = get_classes('dashboard.promotions.forms',
                  ['PromotionTypeSelectForm', 'RawHTMLForm',
                   'PagePromotionForm', 'HandPickedProductListForm',
                   'SingleProductForm', 'OrderedProductFormSet'])


class ListView(generic.TemplateView):
    template_name = 'dashboard/promotions/promotion_list.html'

    def get_context_data(self):
        # Need to load all promotions of all types and chain them together
        # no pagination required for now.
Example #54
0
from django.http import HttpResponseRedirect, Http404
from django.contrib import messages
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth import logout as auth_logout, login as auth_login
from django.contrib.auth.forms import PasswordChangeForm
from django.contrib.sites.models import get_current_site
from django.conf import settings
from oscar.core.loading import get_model

from oscar.views.generic import PostActionMixin
from oscar.apps.customer.utils import get_password_reset_url
from oscar.core.loading import get_class, get_profile_class, get_classes
from oscar.core.compat import get_user_model
from . import signals

PageTitleMixin, RegisterUserMixin = get_classes(
    'customer.mixins', ['PageTitleMixin', 'RegisterUserMixin'])
Dispatcher = get_class('customer.utils', 'Dispatcher')
EmailAuthenticationForm, EmailUserCreationForm, OrderSearchForm = get_classes(
    'customer.forms', ['EmailAuthenticationForm', 'EmailUserCreationForm',
                       'OrderSearchForm'])
ProfileForm, ConfirmPasswordForm = get_classes(
    'customer.forms', ['ProfileForm', 'ConfirmPasswordForm'])
UserAddressForm = get_class('address.forms', 'UserAddressForm')
Order = get_model('order', 'Order')
Line = get_model('basket', 'Line')
Basket = get_model('basket', 'Basket')
UserAddress = get_model('address', 'UserAddress')
Email = get_model('customer', 'Email')
UserAddress = get_model('address', 'UserAddress')
ProductAlert = get_model('customer', 'ProductAlert')
CommunicationEventType = get_model('customer', 'CommunicationEventType')
Example #55
0
from django.db.models import Q, get_model
from django.contrib import messages
from django.utils.translation import ugettext_lazy as _
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.views.generic import ListView, DetailView, DeleteView, \
    UpdateView, FormView
from django.views.generic.detail import SingleObjectMixin
from oscar.apps.customer.utils import normalise_email

from oscar.views.generic import BulkEditMixin
from oscar.core.compat import get_user_model
from oscar.core.loading import get_class, get_classes

UserSearchForm, ProductAlertSearchForm, ProductAlertUpdateForm = get_classes(
    'dashboard.users.forms', ('UserSearchForm', 'ProductAlertSearchForm',
                              'ProductAlertUpdateForm'))
PasswordResetForm = get_class('customer.forms', 'PasswordResetForm')
ProductAlert = get_model('customer', 'ProductAlert')
User = get_user_model()


class IndexView(BulkEditMixin, ListView):
    template_name = 'dashboard/users/index.html'
    paginate_by = 25
    model = User
    actions = ('make_active', 'make_inactive', )
    current_view = 'dashboard:users-index'
    form_class = UserSearchForm
    desc_template = _('%(main_filter)s %(email_filter)s %(name_filter)s')
    description = ''
Example #56
0
from django.urls import reverse, reverse_lazy
from django.utils.translation import ugettext_lazy as _
from django.views import generic

from oscar.apps.customer.utils import normalise_email
from oscar.core.compat import get_user_model
from oscar.core.loading import get_classes, get_model
from oscar.views import sort_queryset

User = get_user_model()
Partner = get_model('partner', 'Partner')
(
    PartnerSearchForm, PartnerCreateForm, PartnerAddressForm,
    NewUserForm, UserEmailForm, ExistingUserForm
) = get_classes(
    'dashboard.partners.forms',
    ['PartnerSearchForm', 'PartnerCreateForm', 'PartnerAddressForm',
     'NewUserForm', 'UserEmailForm', 'ExistingUserForm'])


class PartnerListView(generic.ListView):
    model = Partner
    context_object_name = 'partners'
    template_name = 'dashboard/partners/partner_list.html'
    form_class = PartnerSearchForm

    def get_queryset(self):
        qs = self.model._default_manager.all()
        qs = sort_queryset(qs, self.request, ['name'])

        self.description = _("All partners")
Example #57
0
import os
from django.views.generic import (ListView, DeleteView, CreateView, UpdateView)
from django.utils.translation import ungettext, ugettext_lazy as _
from django.db.models.loading import get_model
from django.core.urlresolvers import reverse
from django.contrib import messages
from django.shortcuts import get_object_or_404
from django.http import HttpResponseRedirect
from django.conf import settings

from oscar.views.generic import BulkEditMixin
from oscar.core.loading import get_classes

Range = get_model('offer', 'Range')
Product = get_model('catalogue', 'Product')
RangeForm, RangeProductForm = get_classes('dashboard.ranges.forms',
                                          ['RangeForm', 'RangeProductForm'])

RangeProductFileUpload = get_model('ranges', 'RangeProductFileUpload')


class RangeListView(ListView):
    model = Range
    context_object_name = 'ranges'
    template_name = 'dashboard/ranges/range_list.html'


class RangeCreateView(CreateView):
    model = Range
    template_name = 'dashboard/ranges/range_form.html'
    form_class = RangeForm
Example #58
0
 def test_loading_class_defined_in_local_module(self):
     with override_settings(INSTALLED_APPS=self.installed_apps):
         (Free, ) = get_classes('shipping.methods', ('Free', ))
         self.assertEqual('tests._site.apps.shipping.methods',
                          Free.__module__)
Example #59
0
from django.utils.translation import ugettext_lazy as _

from oscar.core.loading import get_classes

(ProductForm,
 ProductSearchForm,
 CategoryForm,
 StockRecordForm,
 StockAlertSearchForm,
 ProductCategoryFormSet,
 ProductImageFormSet,
 ProductRecommendationFormSet) = get_classes('dashboard.catalogue.forms',
                                    ('ProductForm',
                                     'ProductSearchForm',
                                     'CategoryForm',
                                     'StockRecordForm',
                                     'StockAlertSearchForm',
                                     'ProductCategoryFormSet',
                                     'ProductImageFormSet',
                                     'ProductRecommendationFormSet'))
Product = get_model('catalogue', 'Product')
Category = get_model('catalogue', 'Category')
ProductImage = get_model('catalogue', 'ProductImage')
ProductCategory = get_model('catalogue', 'ProductCategory')
ProductClass = get_model('catalogue', 'ProductClass')
StockRecord = get_model('partner', 'StockRecord')
StockAlert = get_model('partner', 'StockAlert')


class ProductListView(generic.ListView):
    template_name = 'dashboard/catalogue/product_list.html'
Example #60
0
 def test_load_oscar_classes_correctly(self):
     Product, Category = get_classes('catalogue.models',
                                     ('Product', 'Category'))
     self.assertEqual('oscar.apps.catalogue.models', Product.__module__)
     self.assertEqual('oscar.apps.catalogue.models', Category.__module__)