本文整理汇总了Python中cartridge.shop.models.ProductVariation.option_fields方法的典型用法代码示例。如果您正苦于以下问题:Python ProductVariation.option_fields方法的具体用法?Python ProductVariation.option_fields怎么用?Python ProductVariation.option_fields使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类cartridge.shop.models.ProductVariation
的用法示例。
在下文中一共展示了ProductVariation.option_fields方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: cart_item_view
# 需要导入模块: from cartridge.shop.models import ProductVariation [as 别名]
# 或者: from cartridge.shop.models.ProductVariation import option_fields [as 别名]
def cart_item_view(request, template="shop/product.html", form_class=AddProductForm, extra_content=None, cart_id="", item_id=""):
cart = Cart.objects.filter(id=cart_id).first()
item = next(item for item in cart.items.iterator() if item.id == int(item_id))
published_products = Product.objects.published(for_user=request.user)
product = get_object_or_404(published_products, slug=item.url.split('/')[-1])
fields = [f.name for f in ProductVariation.option_fields()]
variations = product.variations.all()
variations_json = dumps([dict([(f, getattr(v, f))
for f in fields + ["sku", "image_id"]]) for v in variations])
variation = ProductVariation.objects.filter(sku=item.sku).first()
v_json = dict([(f, getattr(variation, f))
for f in fields + ["sku", "image_id"] if getattr(variation, f) is not None])
initial_data = dict(quantity=item.quantity, **v_json)
initial_data['embroidery_type'] = item.personalization.embroidery_type
initial_data['value'] = item.personalization.value
add_product_form = form_class(request.POST or None, product=product,
initial=initial_data, to_cart=False)
context = {
"product": product,
"editable_obj": product,
"images": product.images.all(),
"variations": variations,
"variations_json": variations_json,
"has_available_variations": any([v.has_price() for v in variations]),
"add_product_form": add_product_form,
"item": item
}
return render(request, template, context)
示例2: product
# 需要导入模块: from cartridge.shop.models import ProductVariation [as 别名]
# 或者: from cartridge.shop.models.ProductVariation import option_fields [as 别名]
def product(request, slug, template="shop/product.html"):
"""
Display a product - convert the product variations to JSON as well as
handling adding the product to either the cart or the wishlist.
"""
published_products = Product.objects.published(for_user=request.user)
product = get_object_or_404(published_products, slug=slug)
AddProductForm = get_add_product_form(product)
add_product_form = AddProductForm(initial={"quantity": 1})
if request.method == "POST":
to_cart = request.POST.get("add_wishlist") is None
add_product_form = AddProductForm(request.POST, to_cart=to_cart)
if add_product_form.is_valid():
if to_cart:
Cart.objects.from_request(request).add_item(
add_product_form.variation,
add_product_form.cleaned_data["quantity"])
info(request, _("Item added to cart"), fail_silently=True)
return HttpResponseRedirect(reverse("shop_cart"))
else:
skus = request.COOKIES.get("wishlist", "").split(",")
sku = add_product_form.variation.sku
if sku not in skus:
skus.append(sku)
info(request, _("Item added to wishlist"), fail_silently=True)
response = HttpResponseRedirect(reverse("shop_wishlist"))
set_cookie(response, "wishlist", ",".join(skus))
return response
variations = product.variations.all()
variations_json = simplejson.dumps([dict([(f, getattr(v, f)) for f in
["sku", "image_id"] + [f.name for f in ProductVariation.option_fields()]])
for v in variations])
return render_to_response(template, {"product": product, "variations_json":
variations_json, "variations": variations, "images": product.images.all(),
"add_product_form": add_product_form}, RequestContext(request))
示例3: variations_json
# 需要导入模块: from cartridge.shop.models import ProductVariation [as 别名]
# 或者: from cartridge.shop.models.ProductVariation import option_fields [as 别名]
def variations_json(variations):
"""
Gets variations including the num_in_stock attribute into json format.
"""
fields = [field.name for field in ProductVariation.option_fields()]
variations_json = dumps([dict([(field, str(getattr(variation, field))) if isinstance(getattr(variation, field), Decimal) else (field, getattr(variation, field))
for field in fields + ["sku", "image_id", "num_in_stock"]]) for variation in variations])
return variations_json
示例4: product
# 需要导入模块: from cartridge.shop.models import ProductVariation [as 别名]
# 或者: from cartridge.shop.models.ProductVariation import option_fields [as 别名]
def product(request, slug, template="shop/product.html",
form_class=AddProductForm, extra_context=None):
"""
Display a product - convert the product variations to JSON as well as
handling adding the product to either the cart or the wishlist.
"""
published_products = Product.objects.published(for_user=request.user)
product = get_object_or_404(published_products, slug=slug)
fields = [f.name for f in ProductVariation.option_fields()]
variations = product.variations.all()
variations_json = dumps([dict([(f, getattr(v, f))
for f in fields + ["sku", "image_id"]]) for v in variations])
to_cart = (request.method == "POST" and
request.POST.get("add_wishlist") is None)
initial_data = {}
if variations:
initial_data = dict([(f, getattr(variations[0], f)) for f in fields])
initial_data["quantity"] = 1
add_product_form = form_class(request.POST or None, product=product,
initial=initial_data, to_cart=to_cart)
if request.method == "POST":
if add_product_form.is_valid():
if to_cart:
quantity = add_product_form.cleaned_data["quantity"]
request.cart.add_item(add_product_form.variation, quantity)
recalculate_cart(request)
info(request, _("Item added to cart"))
return redirect("shop_cart")
else:
skus = request.wishlist
sku = add_product_form.variation.sku
if sku not in skus:
skus.append(sku)
info(request, _("Item added to wishlist"))
response = redirect("shop_wishlist")
set_cookie(response, "wishlist", ",".join(skus))
return response
related = []
if settings.SHOP_USE_RELATED_PRODUCTS:
related = product.related_products.published(for_user=request.user)
context = {
"product": product,
"editable_obj": product,
"images": product.images.all(),
"variations": variations,
"variations_json": variations_json,
"has_available_variations": any([v.has_price() for v in variations]),
"related_products": related,
"add_product_form": add_product_form
}
context.update(extra_context or {})
templates = [u"shop/%s.html" % str(product.slug), template]
# Check for a template matching the page's content model.
if getattr(product, 'content_model', None) is not None:
templates.insert(0, u"shop/products/%s.html" % product.content_model)
return TemplateResponse(request, templates, context)
示例5: _add_to_cart
# 需要导入模块: from cartridge.shop.models import ProductVariation [as 别名]
# 或者: from cartridge.shop.models.ProductVariation import option_fields [as 别名]
def _add_to_cart(self, variation, quantity):
"""
Given a variation, creates the dict for posting to the cart
form to add the variation, and posts it.
"""
field_names = [f.name for f in ProductVariation.option_fields()]
data = dict(list(zip(field_names, variation.options())))
data["quantity"] = quantity
self.client.post(variation.product.get_absolute_url(), data)
示例6: test_cart
# 需要导入模块: from cartridge.shop.models import ProductVariation [as 别名]
# 或者: from cartridge.shop.models.ProductVariation import option_fields [as 别名]
def test_cart(self):
"""
Test the cart object and cart add/remove forms.
"""
self._product.variations.all().delete()
self._product.variations.create_from_options(self._options)
variation = self._product.variations.all()[0]
variation.unit_price = TEST_PRICE
variation.num_in_stock = TEST_STOCK * 2
variation.save()
# Test initial cart.
cart = Cart.objects.from_request(self.client)
self.assertFalse(cart.has_items())
self.assertEqual(cart.total_quantity(), 0)
self.assertEqual(cart.total_price(), Decimal("0"))
# Add quantity and check stock levels / cart totals.
field_names = [f.name for f in ProductVariation.option_fields()]
data = dict(zip(field_names, variation.options()))
data["quantity"] = TEST_STOCK
self.client.post(self._product.get_absolute_url(), data)
cart = Cart.objects.from_request(self.client)
variation = self._product.variations.all()[0]
self.assertTrue(variation.has_stock(TEST_STOCK))
self.assertFalse(variation.has_stock(TEST_STOCK * 2))
self.assertTrue(cart.has_items())
self.assertEqual(cart.total_quantity(), TEST_STOCK)
self.assertEqual(cart.total_price(), TEST_PRICE * TEST_STOCK)
# Add remaining quantity and check again.
self.client.post(self._product.get_absolute_url(), data)
cart = Cart.objects.from_request(self.client)
variation = self._product.variations.all()[0]
self.assertFalse(variation.has_stock())
self.assertTrue(cart.has_items())
self.assertEqual(cart.total_quantity(), TEST_STOCK * 2)
self.assertEqual(cart.total_price(), TEST_PRICE * TEST_STOCK * 2)
# Remove from cart.
data = {"items-INITIAL_FORMS": 0, "items-TOTAL_FORMS": 0,
"update_cart": 1}
for i, item in enumerate(cart):
data["items-INITIAL_FORMS"] += 1
data["items-TOTAL_FORMS"] += 1
data["items-%s-id" % i] = item.id
data["items-%s-DELETE" % i] = "on"
self.client.post(reverse("shop_cart"), data)
cart = Cart.objects.from_request(self.client)
variation = self._product.variations.all()[0]
self.assertTrue(variation.has_stock(TEST_STOCK * 2))
self.assertFalse(cart.has_items())
self.assertEqual(cart.total_quantity(), 0)
self.assertEqual(cart.total_price(), Decimal("0"))
示例7: product
# 需要导入模块: from cartridge.shop.models import ProductVariation [as 别名]
# 或者: from cartridge.shop.models.ProductVariation import option_fields [as 别名]
def product(request, slug, template="shop/product.html"):
"""
Display a product - convert the product variations to JSON as well as
handling adding the product to either the cart or the wishlist.
"""
published_products = Product.objects.published(for_user=request.user)
product = get_object_or_404(published_products, slug=slug)
fields = [f.name for f in ProductVariation.option_fields()]
variations = product.variations.all()
variations_json = simplejson.dumps([dict([(f, getattr(v, f))
for f in fields + ["sku", "image_id"]])
for v in variations])
to_cart = (request.method == "POST" and
request.POST.get("add_wishlist") is None)
initial_data = {}
if variations:
initial_data = dict([(f, getattr(variations[0], f)) for f in fields])
initial_data["quantity"] = 1
add_product_form = AddProductForm(request.POST or None, product=product,
initial=initial_data, to_cart=to_cart)
if request.method == "POST":
if add_product_form.is_valid():
if to_cart:
quantity = add_product_form.cleaned_data["quantity"]
request.cart.add_item(add_product_form.variation, quantity)
recalculate_discount(request)
recalculate_billship_tax(request)
info(request, _("Item added to cart"))
return redirect("shop_cart")
else:
skus = request.wishlist
sku = add_product_form.variation.sku
if sku not in skus:
skus.append(sku)
info(request, _("Item added to wishlist"))
response = redirect("shop_wishlist")
set_cookie(response, "wishlist", ",".join(skus))
return response
context = {
"product": product,
"editable_obj": product,
"images": product.images.all(),
"variations": variations,
"variations_json": variations_json,
"has_available_variations": any([v.has_price() for v in variations]),
"related_products": product.related_products.published(
for_user=request.user),
"add_product_form": add_product_form
}
templates = [u"shop/%s.html" % unicode(product.slug), template]
return render(request, templates, context)
示例8: test_cart
# 需要导入模块: from cartridge.shop.models import ProductVariation [as 别名]
# 或者: from cartridge.shop.models.ProductVariation import option_fields [as 别名]
def test_cart(self):
"""
Test the cart object and cart add/remove forms.
"""
product_options = ProductOption.objects.as_fields()
self._product.variations.all().delete()
self._product.variations.create_from_options(product_options)
price = Decimal("20")
num_in_stock = 5
variation = self._product.variations.all()[0]
variation.unit_price = price
variation.num_in_stock = num_in_stock * 2
variation.save()
# Test initial cart.
cart = Cart.objects.from_request(self.client)
self.assertFalse(cart.has_items())
self.assertEqual(cart.total_quantity(), 0)
self.assertEqual(cart.total_price(), Decimal("0"))
# Add quantity and check stock levels / cart totals.
data = dict(zip([field.name for field in
ProductVariation.option_fields()], variation.options()))
data["quantity"] = num_in_stock
self.client.post(self._product.get_absolute_url(), data)
cart = Cart.objects.from_request(self.client)
variation = self._product.variations.all()[0]
self.assertTrue(variation.has_stock(num_in_stock))
self.assertFalse(variation.has_stock(num_in_stock * 2))
self.assertTrue(cart.has_items())
self.assertEqual(cart.total_quantity(), num_in_stock)
self.assertEqual(cart.total_price(), price * num_in_stock)
# Add remaining quantity and check again.
self.client.post(self._product.get_absolute_url(), data)
cart = Cart.objects.from_request(self.client)
variation = self._product.variations.all()[0]
self.assertFalse(variation.has_stock())
self.assertTrue(cart.has_items())
self.assertEqual(cart.total_quantity(), num_in_stock * 2)
self.assertEqual(cart.total_price(), price * num_in_stock * 2)
# Remove from cart.
for item in cart:
self.client.post(reverse("shop_cart"), {"item_id": item.id})
cart = Cart.objects.from_request(self.client)
variation = self._product.variations.all()[0]
self.assertTrue(variation.has_stock(num_in_stock * 2))
self.assertFalse(cart.has_items())
self.assertEqual(cart.total_quantity(), 0)
self.assertEqual(cart.total_price(), Decimal("0"))
示例9: __init__
# 需要导入模块: from cartridge.shop.models import ProductVariation [as 别名]
# 或者: from cartridge.shop.models.ProductVariation import option_fields [as 别名]
def __init__(self, *args, **kwargs):
"""
Handles adding a variation to the cart or wishlist.
When adding from the product page, the product is provided
from the view and a set of choice fields for all the
product options for this product's variations are added to
the form. When the form is validated, the selected options
are used to determine the chosen variation.
A ``to_cart`` boolean keyword arg is also given specifying
whether the product is being added to a cart or wishlist.
If a product is being added to the cart, then its stock
level is also validated.
When adding to the cart from the wishlist page, a sku is
given for the variation, so the creation of choice fields
is skipped.
"""
self._product = kwargs.pop("product", None)
self._to_cart = kwargs.pop("to_cart")
super(AddProductForm, self).__init__(*args, **kwargs)
# Adding from the wishlist with a sku, bail out.
if args[0] is not None and args[0].get("sku", None):
return
# Adding from the product page, remove the sku field
# and build the choice fields for the variations.
del self.fields["sku"]
option_fields = ProductVariation.option_fields()
if not option_fields:
return
option_names, option_labels = list(zip(*[(f.name, f.verbose_name)
for f in option_fields]))
option_values = list(zip(*self._product.variations.filter(
unit_price__isnull=False).values_list(*option_names)))
if option_values:
for i, name in enumerate(option_names):
values = [_f for _f in set(option_values[i]) if _f]
if values:
field = forms.ChoiceField(label=option_labels[i],
choices=make_choices(values))
self.fields[name] = field
if self._product.content_model == 'reservableproduct':
# ReservableProduct needs from/to dates and does not need quantity
self.fields["from_date"] = forms.DateField(input_formats=["%d.%m.%Y"], widget=forms.HiddenInput())
self.fields["to_date"] = forms.DateField(input_formats=["%d.%m.%Y"], widget=forms.HiddenInput())
self.fields["quantity"] = forms.IntegerField(min_value=1, initial=1, widget=forms.HiddenInput())
示例10: __init__
# 需要导入模块: from cartridge.shop.models import ProductVariation [as 别名]
# 或者: from cartridge.shop.models.ProductVariation import option_fields [as 别名]
def __init__(self, *args, **kwargs):
"""
Handles adding a variation to the cart or wishlist.
When adding from the product page, the product is provided
from the view and a set of choice fields for all the
product options for this product's variations are added to
the form. When the form is validated, the selected options
are used to determine the chosen variation.
A ``to_cart`` boolean keyword arg is also given specifying
whether the product is being added to a cart or wishlist.
If a product is being added to the cart, then its stock
level is also validated.
When adding to the cart from the wishlist page, a sku is
given for the variation, so the creation of choice fields
is skipped.
"""
self._product = kwargs.pop("product", None)
self._to_cart = kwargs.pop("to_cart")
super(AddProductForm, self).__init__(*args, **kwargs)
# Adding from the wishlist with a sku, bail out.
if args[0] is not None and args[0].get("sku", None):
return
# Adding from the product page, remove the sku field
# and build the choice fields for the variations.
del self.fields["sku"]
option_fields = ProductVariation.option_fields()
if not option_fields:
return
option_names, option_labels = zip(*[(f.name, f.verbose_name)
for f in option_fields])
option_values = zip(*self._product.variations.filter(
unit_price__isnull=False).values_list(*option_names))
if option_values:
for i, name in enumerate(option_names):
values = list(option_values[i])
try:
values.remove(None)
except ValueError:
pass
if values:
field = forms.ChoiceField(label=option_labels[i],
choices=make_choices(values))
self.fields[name] = field
示例11: __init__
# 需要导入模块: from cartridge.shop.models import ProductVariation [as 别名]
# 或者: from cartridge.shop.models.ProductVariation import option_fields [as 别名]
def __init__(self, *args, **kwargs):
"""
Create each ChoiceField for selecting from the product's variations.
"""
self._to_cart = kwargs.pop("to_cart", True)
super(AddProductForm, self).__init__(*args, **kwargs)
option_names, option_labels = zip(*[(f.name, f.verbose_name)
for f in ProductVariation.option_fields()])
option_values = zip(*product.variations.filter(
unit_price__isnull=False).values_list(*option_names))
if option_values:
for i, name in enumerate(option_names):
values = filter(None, set(option_values[i]))
if values:
field = forms.ChoiceField(label=option_labels[i],
choices=make_choices(values))
self.fields[name] = field
示例12: product
# 需要导入模块: from cartridge.shop.models import ProductVariation [as 别名]
# 或者: from cartridge.shop.models.ProductVariation import option_fields [as 别名]
def product(request, prod, template="shop/product.html",
form_class=AddProductForm):
#pdb.set_trace()
fields = [f.name for f in ProductVariation.option_fields()]
variations = prod.variations.all()
variations_json = dumps([dict([(f, getattr(v, f))
for f in fields + ["sku", "image_id"]]) for v in variations])
to_cart = (request.method == "POST" and
request.POST.get("add_wishlist") is None)
initial_data = {}
initial_data["quantity"] = 1
add_product_form = form_class(request.POST or None, product=prod,
initial=initial_data, to_cart=to_cart)
context = {
"variations": variations,
"add_product_form": add_product_form
}
return context
示例13: parse_description
# 需要导入模块: from cartridge.shop.models import ProductVariation [as 别名]
# 或者: from cartridge.shop.models.ProductVariation import option_fields [as 别名]
def parse_description(value, autoescape=True):
"""
Split product description to title and options to allow different styling.
Returns html with title and options in two lines with different classes:
'title' and 'options'.
"""
option_fields = ProductVariation.option_fields()
if option_fields:
first_option_label = option_fields[0].verbose_name
m = re.match(ur"(.*\w*)\s(%s.*)$" % first_option_label, value, re.I | re.U)
if m:
title = m.group(1)
options = m.group(2)
if autoescape:
esc = conditional_escape
else:
esc = lambda x: x
return mark_safe(
"<span class='title'>%s</span><br><span class='options'>%s</span>" % (esc(title), esc(options)))
else:
return value
示例14: product
# 需要导入模块: from cartridge.shop.models import ProductVariation [as 别名]
# 或者: from cartridge.shop.models.ProductVariation import option_fields [as 别名]
def product(request, slug, template="shop/product.html"):
"""
Display a product - convert the product variations to JSON as well as
handling adding the product to either the cart or the wishlist.
"""
published_products = Product.objects.published(for_user=request.user)
product = get_object_or_404(published_products, slug=slug)
to_cart = request.method == "POST" and request.POST.get("add_wishlist") is None
add_product_form = AddProductForm(request.POST or None, product=product, initial={"quantity": 1}, to_cart=to_cart)
if request.method == "POST":
if add_product_form.is_valid():
if to_cart:
quantity = add_product_form.cleaned_data["quantity"]
request.cart.add_item(add_product_form.variation, quantity)
recalculate_discount(request)
info(request, _("Item added to cart"))
return HttpResponseRedirect(reverse("shop_cart"))
else:
skus = request.wishlist
sku = add_product_form.variation.sku
if sku not in skus:
skus.append(sku)
info(request, _("Item added to wishlist"))
response = HttpResponseRedirect(reverse("shop_wishlist"))
set_cookie(response, "wishlist", ",".join(skus))
return response
fields = [f.name for f in ProductVariation.option_fields()]
fields += ["sku", "image_id"]
variations = product.variations.all()
variations_json = simplejson.dumps([dict([(f, getattr(v, f)) for f in fields]) for v in variations])
context = {
"product": product,
"images": product.images.all(),
"variations": variations,
"variations_json": variations_json,
"has_available_variations": any([v.has_price() for v in variations]),
"related": product.related_products.published(for_user=request.user),
"add_product_form": add_product_form,
}
return render_to_response(template, context, RequestContext(request))
示例15: test_order
# 需要导入模块: from cartridge.shop.models import ProductVariation [as 别名]
# 或者: from cartridge.shop.models.ProductVariation import option_fields [as 别名]
def test_order(self):
"""
Test that a completed order contains cart items and that
they're removed from stock.
"""
# Get a variation.
self._product.variations.all().delete()
self._product.variations.create_from_options(self._options)
variation = self._product.variations.all()[0]
variation.unit_price = TEST_PRICE
variation.num_in_stock = TEST_STOCK * 2
variation.save()
# Add to cart.
field_names = [f.name for f in ProductVariation.option_fields()]
data = dict(zip(field_names, variation.options()))
data["quantity"] = TEST_STOCK
self.client.post(self._product.get_absolute_url(), data)
cart = Cart.objects.from_request(self.client)
# Post order.
data = {"step": len(CHECKOUT_STEPS)}
self.client.post(reverse("shop_checkout"), data)
try:
order = Order.objects.from_request(self.client)
except Order.DoesNotExist:
self.fail("Couldn't create an order")
items = order.items.all()
variation = self._product.variations.all()[0]
self.assertEqual(cart.total_quantity(), 0)
self.assertEqual(len(items), 1)
self.assertEqual(items[0].sku, variation.sku)
self.assertEqual(items[0].quantity, TEST_STOCK)
self.assertEqual(variation.num_in_stock, TEST_STOCK)
self.assertEqual(order.item_total, TEST_PRICE * TEST_STOCK)