A web shop solution for Plone
ftw.shop is a general purpose web shop product for Plone. It features item variations, an extensible checkout wizard, pluggable payment processors and optional SQLAlchemy storage.
ftw.shop supports Plone 4.x.
Basic shop functionality: Create a shop with categories and items, provide a shopping cart and checkout process guided by a wizard.
Manage Item variations (flavors).
Suppliers: Associate particular items or categories with a supplier that will be notified by email when those items are purchased.
Pluggable payment processors
Extensible checkout wizard: Add fields or whole steps to the checkout process.
Flexible mail templates for order confirmations, owner and supplier notifications.
Add ftw.shop to your buildout (or as dependency to a custom egg):
[buildout] parts = instance ... [instance] ... eggs += Plone ftw.shop
Install the ftw.shop:default profile in portal_setup.
Create your shop structure by adding Shop Categories
Add Shop Items to your Shop Categories
Add a Shopping Cart Portlet (to your Plone site root or Shop Categories)
After that, most configuration can be done through the “Shop configuration” control panel.
Continuous integration: https://jenkins.4teamwork.ch/search?q=ftw.shop
This package is released under GPL Version 2.
This package is copyright by 4teamwork.
ftw.shop is licensed under GNU General Public License, version 2.
Calculate and display price per item. [lknoepfel]
Drop plone 4.2 support (including python 2.6). [lknoepfel]
Sort items in cart by date added. [lknoepfel]
Fix upgrade step fix. [jone]
Fix upgrade step (dictionary changed size during iteration). [jone]
Show country in mails. [jone]
Made sku code searchable. [lknoepfel]
Enable decimal numbers for dimensions. [lknoepfel]
Enable different units for dimension entry and price. Eg. input an amount in g and display the price per kg. [lknoepfel]
Added dimensions to shopitems which can be specified by the user. [lknoepfel]
Moved comments field to the order review step. This allowes the user to add information he was not able to provide with the standard field. [lknoepfel]
The compact view is now the default view. The old default view has been removed because it didn’t work. [lknoepfel]
Make variations and unit searchable. [lknoepfel]
Drop support for Plone 4.1. [mbaechtold]
Use uid as the key for storing category ranks, not the category object itself. This makes the category ranks serializable and thus publishable for “ftw.publisher”. [mbaechtold]
Added unit to shop item. [lknoepfel]
Make variations a mapping when saving to the annotation storage. [raphael-s]
Fix hidden uid inputs. They had type=text too. [mathias.leimgruber]
Fix adjust styling for shopitem variation [elioschmutz]
Fixed variation js bug. [lknoepfel]
Fixed bug in edit variations where variations didn’t get activated. [lknoepfel]
Use a separate permission (ftw.shop: Assign shopping cart portlet) for the write permission of the shopping cart portlet. [mathias.leimgruber]
Consistently use resource directory instead of individually registered resources, and make resource URLs always absolute and based on portal_url. [erral]
Fix getting the uid in get_suppliers, if there are variations. [mathias.leimgruber]
Fill content-core slot instead of main slot in shopitem view. Fixes #10 [erral]
Some more translation fixes. [erral]
Added basque (eu) translation. [erral]
Validate email address in checkout form. [jone]
Set reply-to to customer for shop-owner and supplier mails. [jone]
Added Spanish translations. [Enny]
Fix variation-toplevel-group css. FF floats the table around the image. [mathias.leimgruber]
Fix payment processor lookup in checkout wizard. [mathias.leimgruber]
Fix adapter lookups in vocabularies. [mathias.leimgruber]
Fix get suppliers on shopitems with variations. [mathias.leimgruber]
Implement getting supplier recursively. [mathias.leimgruber]
Updated README / Installation instructions. [lgraf]
BugFix: It’s possible to have users wihtout a fullname: For example SystemUsers / ldap users. [mathias.leimgruber]
BugFix: If the fullname of a logged in user had umlauts the form was broken. :-) [mathias.leimgruber]
Eliminate all uses of the IShopRoot interface. Instead we use the navigation root to register views that are supposed to be shop-global. This will make ftw.shop work with subsites that are supposed to have “their own shop”. [lgraf]
Rebuild logic behind manage_categories view: Don’t search for categories to list downwards from shop root, but instead upwards from current context. This will only return contiguous shop category structures, and should therefore work nicely for setups with decentralized shop structures. [lgraf]
JS: Use POST method and explicitely disable caching for addtocart_ajax requests. [lgraf]
Make phone number in customer confirmation mail configurable and optional. [jone]
Automatically set the shop root on the portal upon new installation. #15 [jone]
Update German translations. [jone]
Make ShopCategory LinguaPlone aware. [buchi]
Make sure currency is included everywhere where a price is displayed. [lgraf]
Added image field to default ShopItem content type. [lgraf]
Fixed content-type header of ajax response when adding an item to the cart. [buchi]
Remove unused permission “ftw.shop: Add Order”. [jone]
Fixed evaluation of shopping cart portlet available() condition. [lgraf]
Fixed attribute selector syntax in shop.js. [lgraf]
Check enabled payment processors for availability before offering them. [lgraf]
Moved shopping cart functionality into its own adapter (IShoppingCart). [lgraf]
Dropped ‘newsletter’ field from checkout form. [lgraf]
Lawgiver support: map permissions. [jone]
Suppliers: fix address content types / formatting. [jone]
Shop item: use text/x-html-safe output format and only allow text/html input. [jone]
Plone 4.3 compatibility: fix imports. [jone]
Use DEFAULT_VAT_RATES in IShopConfiguration’s vat_rates. [mathias.leimgruber]
Display the shopitems image if the item has a image field. [Julian Infanger]
Fix category view so that it filters “None” references. [jone]
Allow multiple email addresses for supplier seperated by comma. [Julian Infanger]
Made sure supplier_mail template gets needed options [lgraf]
Improved styling for PaymentProcessor widget a bit [lgraf]
Made sure Order and CartItems classes inherit from Persistent [lgraf]
Properly setting default values when prefilling forms. This fixes a bug where people see other users data in checkout forms. [lgraf]
CSS fix for title field in checkout wizard [lgraf]
Added some Plone 3 compatibility fixes [lgraf]
Added test dependency on pyquery [lgraf]
Fixed invalid HTML in payment processor widget [lgraf]
Assigned Add Order permission to Manager role in rolemap.xml [lgraf]
Fixed bug where supplier and status filters weren’t initialized in OrderManager view [lgraf]
Added column title for vat_amount when exporting CSV [lgraf]
Fixed bug in calculation of VAT amount [lgraf]
Improved display of VAT (MwSt) [lgraf]
Changed default for IShippingAddress.used to False [lgraf]
Made order_review template not require the newsletter field [lgraf]
Using interfaces instead of portal_type to determine if context has shop items [lgraf]
Fixed type of default values for IShopConfiguration.var_rates [lgraf]
Listing items in ShopCategory based on IShopItem interface, not portal_type [lgraf]
Implemented calculation and display (in order_review) of VAT (MwSt) [lgraf]
Added fields and settings for VAT (MwSt) support [lgraf]
Implemented filtering by status in order_manager [lgraf]
Implemented UI for changing status or deleting several orders at once [lgraf]
Improved UI for cancelling orders in order_manager [lgraf]
Implemented pluggable status sets and option to manually change status of orders [lgraf]
Added option to display cart portlet only if there are items in the current folder / context [lgraf]
Allow multiple email addresses for supplier seperated by comma. [Julian Infanger]
Do not raise an AssertionError if the objects type is not ShopItem. [Julian Infanger]
Made ShopItem inherit from ATCTContent instead of ATDocument.
Avoid creating a session if there doesn’t exist one yet. Accessing REQUEST.SESSION causes a _ZopeID cookie to be created, therefore we use the browser_id_manager to check first if a session already exists.
Removed language specific subjects for order mails from settings and handle translation with i18n.
Cleaned up translations (fuzzy entries) [lgraf]
Avoid creating a session if there doesn’t exist one yet. Accessing REQUEST.SESSION causes a _ZopeID cookie to be created, therefore we use the browser_id_manager to check first if a session already exists. [lgraf]
Moved translations in plone domain from locales to i18n folder for Plone3 bbb [lgraf]
Made date parsing in order_manager more robust [lgraf]
Included jquery-ui-i18n.js and i18ned datepicker widget [lgraf]
Fixed manage_categories view for ShopRoot == portal [lgraf]
Eliminated unnecessary order ID column in order_manager view [lgraf]
Displaying item title as tooltip in order_manager [lgraf]
Minor styling fix [lgraf]
Fixed typo - sku_code -> skucode [lgraf]
Store sku_code in cart item instead of the key. [lgraf]
Removed Image and File from allowed_content_types for ShopCategory and ShopItems [lgraf]
Added show_price attribute to CartItems model [lgraf]
Plone 3 compatibility fixes (the builtin any and datetime.strptime don’t exist yet in Python 2.4) [lgraf]
Removed assertion that doesn’t hold true any more item.portal_type == ‘ShopItem’ - if SimpleLayout support is enabled, there’s also a type called ‘ShopItemBlock’ [lgraf]
Minor JS fix: Compatibility with jQuery 1.3 jq.delay() doesn’t exist yet in 1.3, so implement the same behavior using .animate() [lgraf]
Merged branch ‘plone3bbb’ (Register eventhandlers based on a zcml:condition=”have plone-4”) [lgraf]
Release history Release notifications | RSS feed
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.