zope和Python项目的核心电子商务功能
项目描述
此软件包包含getpaid框架的核心功能。
变更
0.9.2 (2011-07-06)
使用getSite从订单工作流程转换处理程序中获取商店,而不是尝试从购物车项之一中获取。[davisagli]
删除显然损坏的产品和目录模块。[davisagli]
依赖于zope.intid而不是zope.app.intid。[davisagli]
0.9.1 (2010-06-29)
使税收可翻译,重建并同步翻译文件,更新德语翻译[fRiSi]
0.9.0 (2010-05-18)
防止将定期行项目添加到包含非定期项目的购物车中,反之亦然。[jesses, alext]
修复“验证”的拼写。[cewing]
向ShoppingCart添加了is_recurring方法,以检查购物车是否包含定期行项目。[davisagli]
修复OrderManager的isValid方法中的异常处理。[davisagli]
为订单添加renewal_date索引。[jpg.rcom]
添加IRecurringPaymentContent接口。[jpg.rcom]
更新IRecurringLineItem以指定interval和total_occurrences属性,而不是period。[jpg.rcom]
0.8.0 (2010-04-07)
调整导入以支持Zope 2.12,并移除对Zope 2.9的支持。[davisagli]
0.7.5 (2009-07-07)
添加运输和账单组织
0.7.4 (2009-05-12)
添加对可变金额捐赠的支持
允许在购物车上进行注释
0.7.3 (2009-03-13)
更新葡萄牙语翻译[rafaelcrocha]
0.7.2 (2008-12-30)
添加2个修复(当你使用运输系统时)
为order.shipments提供一个默认值,因为它从未设置过任何其他东西,并且你不能访问你的订单
修复了计算总金额的方式,以便我们有浮点数[lucielejard]
0.7.1 (2008-11-24)
在订单列表视图中持久化和添加了卡上姓名和卡手机号码[ctxlken]
将处理器事务ID和信用卡最后4位数字持久化到ZODB。还修改了order-summary.pt以呈现这两个字段。[ctxlken]
添加:添加了一些缺失的意大利语翻译[bruno.ripa]
更新getpaid.po并与所有.po同步。添加日语地区[cjj.ifpeople]
添加:缺失的意大利语翻译[bruno.ripa]
0.7 (2008-08-29)
将构建文件和通用文本文档添加到项目根目录。[cjj.ifpeople]
删除setup.cfg
更新txt文件,以便在pypi上使用reStructuredText
详细文档
GetPaid中的订单管理
GetPaid的核心功能表示为订单管理系统。
创建订单
>>> from getpaid.core.order import Order >>> order = Order()
购物车和行项目
订单由行项目组成。行项目可以来自各种来源,内容空间应付款项、礼品券等。即我们可能想要购买的一切
>>> from getpaid.core.item import LineItem >>> item = LineItem()
让我们为行项目设置一些预期属性。这里唯一的系统不变量是当引用购买相同项目时,item_id应该是唯一的
>>> item.item_id = "event-devtalk-2007-1" >>> item.name = "Event Registration" >>> item.cost = 25.00 >>> item.quantity = 5 >>> item.description = "Development Talk"
行项目存储在行项目容器中,如购物车或运输
>>> from getpaid.core.cart import ShoppingCart >>> cart = ShoppingCart() >>> cart[ item.item_id ] = item
我们可以询问购物车它有多少个项目
>>> cart.size() 5
让我们将我们的购物车附加到订单上
>>> order.shopping_cart = cart
现在我们可以询问订单,其总价格
>>> from decimal import Decimal >>> order.getSubTotalPrice() == Decimal("125.0") True
[在这里讨论产品和应付款项?]
客户信息
我们需要一些额外的信息才能成功处理订单
>>> from getpaid.core import payment >>> bill_address = payment.BillingAddress() >>> bill_address.bill_first_line = '1418 W Street NW' >>> bill_address.bill_city = 'Washington' >>> bill_address.bill_state = "DC" >>> bill_address.bill_country = "US" >>> bill_address.bill_postal_code = '20009' >>> >>> >>> contact_info = payment.ContactInformation() >>> >>> order.contact_information = contact_info >>> order.billing_address = bill_address
如果我们不需要向用户运输任何东西,则可以省略设置邮寄地址。
检查和分类
当我们创建一个订单时,一个订阅订单创建事件的订单检查组件有机会查看订单的所有内容并修改它。默认检查器将添加额外的标记接口到订单中,根据其内容将其分类为可运输订单、捐赠订单等。基于这些标记接口和相应的组件注册,我们可以专门针对特定订单的工作流程、支付处理进行订单的适配。
>>> try: ... from zope.lifecycleevent import ObjectCreatedEvent ... except ImportError: ... from zope.app.event.objectevent import ObjectCreatedEvent >>> from zope.event import notify >>> notify( ObjectCreatedEvent( order )) >>>
财务工作流程
财务工作流程
支付处理器集成
我们实现了支持多种不同服务的支付处理器集成,并且是工作流驱动的。我们将工作流事件分发给一个多适配器,该适配器的上下文是订单和工作流。
订单上的一个公共支付处理器集成属性是支付处理器ID,它与支付处理器适配器注册的名称相对应。
需要注意的是,存在几种异步支付处理器的变体,它们还需要相应的结账用户界面支持,以及回调URL端点,这些内容超出了本示例的范围。这些doctest示例需要同步处理器API。
管理订单集合
查询订单
对订单进行报告
我们使用工作流来模拟财务和履行的订单生命周期。我们可以通过接口对订单进行内省以进行分类,并适应适当的流程。因此,我们可以从同一个订单管理系统支持在线和基于运费的订单。并支持虚拟交付和运输生命周期。我们利用hurry.workflow来实现我们的工作流,一个好处是可以通过事件订阅者使这个生命周期可观察。
行项目存储在行项目容器中,如购物车或运输。行项目基于某些唯一属性(如uid或产品SKU)在容器中是唯一的。
getpaid内部将工作流更改分发给适当的订单支付处理器。
因为我们可以异步处理工作流,所以我们可以在与其他系统的同步/集成方面做得很好。
订单既有财务工作流也有履约工作流,这取决于其包含的项目。财务工作流模拟了诸如订单的信用卡授权、捕获/收费等问题。
工作流测试
让我们首先创建一个订单对象来操作
>>> from getpaid.core.order import Order >>> testorder = Order()
现在我们将测试订单工作流...
在触发“创建”转换之前,我们还没有财务和履约的工作流状态
>>> state = testorder.fulfillment_state >>> print state None>>> state = testorder.finance_state >>> print state None
在财务工作流中触发“创建”转换应使我们处于“审查”状态
>>> testorder.finance_workflow.fireTransition('create') >>> state = testorder.finance_state >>> print state REVIEWING
触发更多转换以测试财务工作流。
>>> testorder.finance_workflow.fireTransition('authorize') >>> state = testorder.finance_state >>> print state CHARGEABLE>>> testorder.finance_workflow.fireTransition('charge-chargeable') >>> state = testorder.finance_state >>> print state CHARGING
在履约工作流中触发“创建”转换应使我们处于“审查”状态
>>> testorder.fulfillment_workflow.fireTransition('create') >>> state = testorder.fulfillment_state >>> print state NEW
测试已交付订单的履约工作流。我们需要重新转换testorder对象,因为我们无法从DELIVERED状态返回。
>>> testorder = Order() >>> testorder.fulfillment_workflow.fireTransition('create') >>> state = testorder.fulfillment_state >>> print state NEW>>> testorder.fulfillment_workflow.fireTransition('process-order') >>> state = testorder.fulfillment_state >>> print state PROCESSING>>> testorder.fulfillment_workflow.fireTransition('deliver-processing-order') >>> state = testorder.fulfillment_state >>> print state DELIVERED
测试已取消订单的履约工作流。我们需要重新转换testorder对象,因为我们无法从DELIVERED状态返回。
>>> testorder2 = Order()>>> testorder2.fulfillment_workflow.fireTransition('create') >>> state = testorder2.fulfillment_state >>> print state NEW>>> testorder2.fulfillment_workflow.fireTransition('process-order') >>> state = testorder2.fulfillment_state >>> print state PROCESSING>>> testorder2.fulfillment_workflow.fireTransition('cancel-order') >>> state = testorder2.fulfillment_state >>> print state WILL_NOT_DELIVER
订单ID管理
每个订单都需要一个ID,它对唯一性和不可猜测性有强烈的要求。你可以通过调用newOrderId()来获取一个新的、不可猜测的ID,并保证其唯一性。
>>> from zope import component >>> from getpaid.core import interfaces >>> from getpaid.core.order import Order >>> order_manager = component.getUtility( interfaces.IOrderManager ) >>> order = Order() >>> order.order_id = order_manager.newOrderId() >>> order_manager.store( order )
现在订单已存储,无论调用多少次newOrderId都不会返回相同的ID。我真的可以测试唯一性和不可猜测性吗?
>>> for i in xrange(10000): ... assert(order_manager.newOrderId() != order.order_id)
但另一方面,我可以测试如果我用与现有订单相同的ID创建订单,事情将会失败
>>> new_order = Order() >>> new_order.order_id = order.order_id >>> try: ... order_manager.store( new_order ) ... except Exception, e: ... if e.__class__.__name__ in ('KeyError', 'DuplicationError'): ... print 'duplicate' duplicate
下载
项目详情
getpaid.core-0.9.2.zip 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 949152ae3dfa6b74cad02a59c6eefb6d7fd07642204afa8f755e40ee7eb41cd1 |
|
MD5 | 0c1a87424cdd782fc3388851c736d8e3 |
|
BLAKE2b-256 | 84e823df3f9adb25fbd5bd81228849b58cfbc8a3f3b52b6bd2954279a231554a |