Commit b7fd20df authored by Xiaowu Zhang's avatar Xiaowu Zhang

erp5_advanced_ecommerce: improvements

support promotional code

display nicely
parent 010d4a6b
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_folders_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Copy_or_Move_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Delete_objects_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>shop</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Shop</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_folders_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Copy_or_Move_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Delete_objects_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>discounted</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Discounted</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_folders_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Copy_or_Move_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Delete_objects_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>coupon</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Coupon</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -3,11 +3,12 @@ ...@@ -3,11 +3,12 @@
minimal_quantity python: getattr(supply_line, 'additional_service_min_quantity', None); minimal_quantity python: getattr(supply_line, 'additional_service_min_quantity', None);
"> ">
<tal:block tal:condition="python: additional_service is not None"> <tal:block tal:condition="python: additional_service is not None">
<label tal:content='python: additional_service.getDescription()'></label> <label tal:content='python: additional_service.getTranslatedDescription()'></label>
<div class="input" style="display: inline-block;"> <div class="input" style="display: inline-block;">
<input name="field_your_additional_service_quantity" <input name="field_your_additional_service_quantity"
tal:attributes='min python: minimal_quantity; tal:attributes='min python: minimal_quantity;
value python: minimal_quantity;'> value python: minimal_quantity;'>
<p style="display: inline;" tal:content='python: additional_service.getQuantityUnitTranslatedTitle()'></p>
</div> </div>
</tal:block> </tal:block>
</tal:block> </tal:block>
\ No newline at end of file
price_currency_value = context.getWebSiteValue().WebSite_getShoppingCartDefaultCurrency() web_site = context.REQUEST.get('current_web_site', context.getWebSiteValue())
return context.portal_catalog( price_currency_value = web_site.WebSite_getShoppingCartDefaultCurrency()
portal_type='Sale Supply Line', variation = context.REQUEST.get('variation', None)
resource_relative_url = context.getRelativeUrl(),
price_currency_relative_url = price_currency_value.getRelativeUrl(), if not variation or (context.getRelativeUrl() not in variation):
limit=1)[0] result = context.portal_catalog(
portal_type='Sale Supply Line',
resource_relative_url = context.getRelativeUrl(),
price_currency_relative_url = price_currency_value.getRelativeUrl(),
limit=1)
else:
result = context.portal_catalog(
portal_type='Sale Supply Cell',
variation_relative_url = variation,
resource_relative_url = context.getRelativeUrl(),
price_currency_relative_url = price_currency_value.getRelativeUrl(),
limit=1)
if result:
return result[0]
return None
...@@ -30,6 +30,28 @@ if form_id is not None: ...@@ -30,6 +30,28 @@ if form_id is not None:
return form(request) return form(request)
session_id = request.get('session_id', None) session_id = request.get('session_id', None)
promotional_code = request.get('field_your_promotional_code', None)
# get category like size and variation
category = request.form.get('field_variation_box_your_category', '')
if category:
[base_category, category] = category.split('/', 1)
variation = request.form.get('field_variation_box_your_variation', None)
keep_items = {}
if variation:
keep_items['variation'] = variation
if context.getPortalType() == 'Product':
redirect_view = "Resource_viewAsShop"
else:
redirect_view = "view"
if promotional_code:
sale_trade_condition = context.WebSection_getPromotionalCodeTrade(promotional_code)
if not sale_trade_condition:
keep_items['portal_status_message'] = context.Base_translateString("Invalide Promotional Code.")
return context.Base_redirect(redirect_view, keep_items=keep_items)
if session_id in [None, '']: if session_id in [None, '']:
# Rely on cookies information # Rely on cookies information
session_id = request.cookies.get('session_id', None) session_id = request.cookies.get('session_id', None)
...@@ -39,17 +61,13 @@ if session_id in [None, '']: ...@@ -39,17 +61,13 @@ if session_id in [None, '']:
now = DateTime() now = DateTime()
session_id = context.Base_generateSessionID(max_long=20) session_id = context.Base_generateSessionID(max_long=20)
expire_timeout_days = 90 expire_timeout_days = 90
request.RESPONSE.setCookie('session_id', session_id, request.RESPONSE.setCookie('session_id', session_id,
expires=(now + expire_timeout_days).rfc822(), path='/') expires=(now + expire_timeout_days).rfc822(), path='/')
request.set('session_id', session_id) request.set('session_id', session_id)
shopping_cart = context.SaleOrder_getShoppingCart() shopping_cart = context.SaleOrder_getShoppingCart()
shopping_cart_items = context.SaleOrder_getShoppingCartItemList() shopping_cart_items = context.SaleOrder_getShoppingCartItemList()
# get category like size and variation
category = request.form.get('field_variation_box_your_category', '')
if category:
[base_category, category] = category.split('/', 1)
variation = request.form.get('field_variation_box_your_variation', None)
## check if we don't have already such a resource in cart ## check if we don't have already such a resource in cart
line_found=False line_found=False
for order_line in shopping_cart_items: for order_line in shopping_cart_items:
...@@ -102,7 +120,8 @@ if not line_found: ...@@ -102,7 +120,8 @@ if not line_found:
# set aggregate so we know it's who's additional service # set aggregate so we know it's who's additional service
additional_order_line.setAggregate(variation or context.getRelativeUrl()) additional_order_line.setAggregate(variation or context.getRelativeUrl())
context.WebSection_updateShoppingCartTradeCondition(shopping_cart, None) shopping_cart.edit(promotional_code=promotional_code)
context.WebSection_updateShoppingCartTradeCondition(shopping_cart, None, promotional_code=promotional_code)
context.getPortalObject().portal_sessions[session_id].update(shopping_cart=shopping_cart) context.getPortalObject().portal_sessions[session_id].update(shopping_cart=shopping_cart)
if checkout: if checkout:
...@@ -111,13 +130,8 @@ if checkout: ...@@ -111,13 +130,8 @@ if checkout:
return website.cart.Base_redirect("", return website.cart.Base_redirect("",
keep_items={'portal_status_message':context.Base_translateString("Added to cart.")}) keep_items={'portal_status_message':context.Base_translateString("Added to cart.")})
keep_items = {
'portal_status_message':context.Base_translateString("Added to cart.")} keep_items['portal_status_message'] = context.Base_translateString("Added to cart.")
if variation:
keep_items['variation'] = variation context.Base_redirect(redirect_view,
if( context.getPortalType() == 'Product'):
context.Base_redirect('Resource_viewAsShop',
keep_items=keep_items)
else:
context.Base_redirect('view',
keep_items=keep_items) keep_items=keep_items)
...@@ -20,7 +20,7 @@ if currency == 'EUR': ...@@ -20,7 +20,7 @@ if currency == 'EUR':
elif currency == 'CNY': elif currency == 'CNY':
currency = '¥' currency = '¥'
output = """%s<br /><br />""" % (title.upper(),) output = """%s<br /><br />""" % (title,)
#if old_price is not None and price != old_price: #if old_price is not None and price != old_price:
# output += """<span class="new_price">%s %s</span>""" % (price, currency) # output += """<span class="new_price">%s %s</span>""" % (price, currency)
......
supply = context.Product_getSaleSupplyLine()
if supply:
return getattr(supply, 'base_price')
return None
"""
#this search all supply, too slow
return context.getPrice(supply_path_type=["Sale Supply Line", "Sale Supply Cell"], return context.getPrice(supply_path_type=["Sale Supply Line", "Sale Supply Cell"],
context=context.Resource_getPriceCalculationDefaultContext()) context=context.Resource_getPriceCalculationDefaultContext())
"""
...@@ -108,6 +108,7 @@ ...@@ -108,6 +108,7 @@
<string>my_price</string> <string>my_price</string>
<string>my_old_price</string> <string>my_old_price</string>
<string>your_additional_service</string> <string>your_additional_service</string>
<string>your_promotional_code</string>
</list> </list>
</value> </value>
</item> </item>
......
"""
This will return all Products that have set product_line='shipping'. XXX
Such products are used for shipping purposes i.e. they can not be sold.
"""
portal = context.getPortalObject()
only_small_product = False
if only_small_product:
shipping_product_line_category_uid = portal.portal_categories.product_line.shipping.ship_small_product.getUid()
else:
shipping_product_line_category_uid = [x.getUid() for x in portal.portal_categories.product_line.shipping.contentValues() if x.getId() != 'ship_small_product']
return [r.getObject() for r in portal.portal_catalog(
limit=10,
product_line_uid=shipping_product_line_category_uid,
portal_type=portal.getPortalResourceTypeList())]
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_Change_Python_Scripts_Permission</string> </key>
<value>
<list>
<string>Manager</string>
</list>
</value>
</item>
<item>
<key> <string>_Change_bindings_Permission</string> </key>
<value>
<list>
<string>Manager</string>
</list>
</value>
</item>
<item>
<key> <string>_Change_cache_settings_Permission</string> </key>
<value>
<list>
<string>Manager</string>
</list>
</value>
</item>
<item>
<key> <string>_Change_permissions_Permission</string> </key>
<value>
<list>
<string>Manager</string>
</list>
</value>
</item>
<item>
<key> <string>_Change_proxy_roles_Permission</string> </key>
<value>
<list>
<string>Manager</string>
</list>
</value>
</item>
<item>
<key> <string>_Copy_or_Move_Permission</string> </key>
<value>
<list>
<string>Manager</string>
</list>
</value>
</item>
<item>
<key> <string>_Delete_objects_Permission</string> </key>
<value>
<list>
<string>Manager</string>
</list>
</value>
</item>
<item>
<key> <string>_Manage_WebDAV_Locks_Permission</string> </key>
<value>
<list>
<string>Manager</string>
</list>
</value>
</item>
<item>
<key> <string>_Manage_properties_Permission</string> </key>
<value>
<list>
<string>Manager</string>
</list>
</value>
</item>
<item>
<key> <string>_Take_ownership_Permission</string> </key>
<value>
<list>
<string>Manager</string>
</list>
</value>
</item>
<item>
<key> <string>_Undo_changes_Permission</string> </key>
<value>
<list>
<string>Manager</string>
</list>
</value>
</item>
<item>
<key> <string>_View_History_Permission</string> </key>
<value>
<list>
<string>Manager</string>
</list>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<list>
<string>Manager</string>
</list>
</value>
</item>
<item>
<key> <string>_View_management_screens_Permission</string> </key>
<value>
<list>
<string>Manager</string>
</list>
</value>
</item>
<item>
<key> <string>_WebDAV_Lock_items_Permission</string> </key>
<value>
<list>
<string>Manager</string>
</list>
</value>
</item>
<item>
<key> <string>_WebDAV_Unlock_items_Permission</string> </key>
<value>
<list>
<string>Manager</string>
</list>
</value>
</item>
<item>
<key> <string>_WebDAV_access_Permission</string> </key>
<value>
<list>
<string>Manager</string>
</list>
</value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>_proxy_roles</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>SaleOrder_getAvailableShippingResourceList</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Get list of available shipping methods</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
return 0 return round(sum([i.getTotalPrice() for i in context.getAggregatedAmountList(rounding=True) if "base_amount/shop/discounted/coupon" in i.getBaseApplicationList()]), 2)
"""
return round(sum([i.getTotalPrice() for i in context.getAggregatedAmountList(rounding=True)
if "base_amount/loyalty_program/discount" in i.getBaseApplicationList() or "base_amount/loyalty_program/coupon" in i.getBaseApplicationList()]), 2)
"""
if promotional_code:
trade_condition_reference = "%s-%s" % (context.restrictedTraverse(context.WebSection_getDefaultTradeCondition()).getReference(), promotional_code)
sale_trade_condition = context.portal_catalog(
portal_type='Sale Trade Condition',
reference=trade_condition_reference,
validation_state=('published','validated'),
limit=1,
sort_on=(('version', 'descending'),))
if sale_trade_condition:
return sale_trade_condition[0]
return None
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>promotional_code</string> </value>
</item>
<item>
<key> <string>_proxy_roles</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>WebSection_getPromotionalCodeTrade</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
""" """
Update Trade Condition with the appropriated Trade Condition. Update Trade Condition with the appropriated Trade Condition.
""" """
shopping_cart.setSpecialise(context.WebSection_getDefaultTradeCondition()) if promotional_code:
trade_condition = context.WebSection_getPromotionalCodeTrade(promotional_code)
if trade_condition:
shopping_cart.setSpecialiseValue(trade_condition)
else:
if not shopping_cart.getSpecialise():
shopping_cart.setSpecialise(context.WebSection_getDefaultTradeCondition())
portal = context.getPortalObject() portal = context.getPortalObject()
portal.portal_sessions[container.REQUEST['session_id']].update(shopping_cart=shopping_cart) portal.portal_sessions[container.REQUEST['session_id']].update(shopping_cart=shopping_cart)
return return
......
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
</item> </item>
<item> <item>
<key> <string>_params</string> </key> <key> <string>_params</string> </key>
<value> <string>shopping_cart, payment_mode, preserve=False</string> </value> <value> <string>shopping_cart, payment_mode, promotional_code=None, preserve=False</string> </value>
</item> </item>
<item> <item>
<key> <string>_proxy_roles</string> </key> <key> <string>_proxy_roles</string> </key>
......
...@@ -363,7 +363,7 @@ border:1px solid #000; ...@@ -363,7 +363,7 @@ border:1px solid #000;
.cyan {background: #00FFFF} .cyan {background: #00FFFF}
.choice_box{margin-left: 20px; margin-top:30px;} .choice_box{margin-left: 20px; margin-top:30px;}
.choice_box input[type="text"] {width:30px; .choice_box input[type="text"] {
border:1px solid #000; border:1px solid #000;
height: 17px; height: 17px;
padding:2px;} padding:2px;}
......
...@@ -89,7 +89,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ...@@ -89,7 +89,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
</tal:block--> </tal:block-->
<div class="clear"></div> <div class="clear"></div>
<div class="choice_box"> <div class="choice_box">
<tal:block tal:define="field nocall:form/your_additional_service">
<tal:block metal:use-macro="field_render" />
</tal:block>
<br>
<tal:block tal:define="field nocall:form/your_promotional_code">
<tal:block metal:use-macro="field_render" />
</tal:block>
<br>
<tal:block tal:define="field nocall:form/variation_box"> <tal:block tal:define="field nocall:form/variation_box">
<tal:block metal:use-macro="field_render" /> <tal:block metal:use-macro="field_render" />
</tal:block> </tal:block>
...@@ -98,9 +105,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ...@@ -98,9 +105,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
<br/> <br/>
<!--tal:block tal:define="is_unavailable python: here.Resource_getInventoryStatus(request.get('variation', None)) == 'UNAVAILABLE'"--> <!--tal:block tal:define="is_unavailable python: here.Resource_getInventoryStatus(request.get('variation', None)) == 'UNAVAILABLE'"-->
<tal:block tal:define="field nocall:form/your_additional_service">
<tal:block metal:use-macro="field_render" />
</tal:block>
<tal:block tal:define="field nocall:form/your_buy_quantity"> <tal:block tal:define="field nocall:form/your_buy_quantity">
<tal:block metal:use-macro="field_render" /> <tal:block metal:use-macro="field_render" />
......
portal_categories/base_amount/shop
portal_categories/base_amount/shop/**
portal_categories/role/client/shop portal_categories/role/client/shop
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment