用于管理订阅状态的django包
django-subscriptions的Python项目详细描述
django订阅
用于管理订阅状态和条款的django包。
兼容性
- django:1.11和2.2(仅限LTS版本)
- Python:2.7和3.6+
其他django或python版本可以工作,但这完全是偶然的 除了那些版本之外,我们没有努力保持与其他版本的兼容性 上面列出了。
安装
$ pip install django-subscriptions
然后将以下程序包添加到设置中的INSTALLED_APPS
:
INSTALLED_APPS = [
...
"django_fsm_log",
"subscriptions.apps.SubscriptionsConfig",
...
]
当然,您需要运行迁移:
$ python manage.py migrate
您还需要设置触发器,可以用芹菜或 从管理任务运行。请参阅下面的Triggers部分。
设计
管理单个表中的订阅。推动事件(信号),以便 消费者可以完成订阅所需的实际工作,如计费。
订阅是围绕一个有限状态机模型构建的,其中状态和 允许的状态转换在模型上定义得很好。更新自 一种状态到另一种状态,用户调用订阅实例上的方法。这个 所有的副作用和作用都包含在state方法中。
不能直接修改订阅状态。
当触发状态更改时,订阅将发布相关信号 以便相关方能够自己对国家的变化做出反应。
API
有三个主要的api组件。状态更改方法、信号/事件和 用于开始状态更改的触发器。
状态方法
Method | Source States | Target State | Signal Emitted |
---|---|---|---|
^{ | ACTIVE | EXPIRING | ^{ |
^{ | EXPIRING | ACTIVE | ^{ |
^{ | ACTIVE,SUSPENDED | RENEWING | ^{ |
^{ | ACTIVE,RENEWING,ERROR | ACTIVE | ^{ |
^{ | RENEWING,ERROR | SUSPENDED | ^{ |
^{ | ACTIVE,SUSPENDED,EXPIRING,ERROR | ENDED | ^{ |
^{ | RENEWING | ERROR | ^{ |
示例:
subscription.renew()
只能在subscription.state
是ACTIVE
或SUSPENDED
时调用,
会导致subscription.state
进入RENEWING
状态。
触发器
有很多触发器用于在订阅成为
到期或过期。默认情况下,没有配置运行这些触发器。你可以
或者将它们作为自己进程的一部分调用,或者使用celery beat
执行
使用subscriptions.tasks
中提供的任务的触发器。
创建新订阅:
Subscription.objects.add_subscription(start_date, end_date, reference) -> Subscription
触发应续订的订阅:
Subscription.objects.trigger_renewals() -> int # number of renewals sent
触发即将过期的订阅:
Subscription.objects.trigger_expiring() -> int # number of expirations
已挂起的触发器订阅:
Subscription.objects.trigger_suspended() -> int # number of renewals
触发暂停时间超过timeout_hours
的订阅
结束(使用subscription.end
日期,而不是subscription.last_updated
):
Subscription.objects.trigger_suspended_timeout(timeout_hours=48) -> int # number of suspensions
触发处于续订状态的订阅超过timeout_hours
标记为错误(使用subscription.last_updated
确定超时):
Subscription.objects.trigger_stuck(timeout_hours=2) -> int # number of error subscriptions
任务
以下任务已定义但未计划:
subscriptions.tasks.trigger_renewals
subscriptions.tasks.trigger_expiring
subscriptions.tasks.trigger_suspended
subscriptions.tasks.trigger_suspended_timeout
subscriptions.tasks.trigger_stuck
如果要安排任务,请使用以下芹菜节拍配置:
# settings.py
CELERYBEAT_SCHEDULE = {
"subscriptions_renewals": {
"task": "subscriptions.tasks.trigger_renewals",
"schedule": crontab(hour=0, minute=10),
},
"subscriptions_expiring": {
"task": "subscriptions.tasks.trigger_expiring",
"schedule": crontab(hour=0, minute=15),
},
"subscriptions_suspended": {
"task": "subscriptions.tasks.trigger_suspended",
"schedule": crontab(hour="3,6,9", minute=30),
},
"subscriptions_suspended_timeout": {
"task": "subscriptions.tasks.trigger_suspended_timeout",
"schedule": crontab(hour=0, minute=40),
"kwargs": {"hours": 48},
},
"subscriptions_stuck": {
"task": "subscriptions.tasks.trigger_stuck",
"schedule": crontab(hour="*/2", minute=50),
"kwargs": {"hours": 2},
},
}
贡献
我们使用pre-commit <https://pre-commit.com/>
强制执行代码样式规则
在将它们提交到git之前在本地执行。一旦安装了预提交库
(可以通过PIP进行本地安装),只需安装挂钩即可:
pre-commit install -f --install-hooks
在生成服务器上执行相同的检查,因此跳过本地linting
(使用git commit --no-verify
)只会导致测试生成失败。
当前样式检查工具:
- 薄片8:Python绒线
- isort:python导入排序
- 黑色:python代码格式
注意:
You must have python3.6 available on your path, as it is required for some
of the hooks.
生成迁移
安装完所有依赖项后,可以生成所需的迁移文件 喜欢这样:
$ poetry run ipython migrate.py <nameofmigration>
发布新版本
- 在pyproject.toml和src/subscriptions/init.py中增加版本号
- 提交并推送到主节点
- 从github,create a new release
- 使用步骤1中的版本号将版本命名为“v<;maj.minor.patch>;”。
- 发布发布
- 如果发行版成功构建,Circleci将发布新的包对pypi