用于管理订阅状态的django包

django-subscriptions的Python项目详细描述


django订阅

用于管理订阅状态和条款的django包。

PyPI versionCircleCI (all branches)Code style: blackPyPI - License

兼容性

  • 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方法中。

不能直接修改订阅状态。

当触发状态更改时,订阅将发布相关信号 以便相关方能够自己对国家的变化做出反应。

State Diagram

API

有三个主要的api组件。状态更改方法、信号/事件和 用于开始状态更改的触发器。

状态方法

MethodSource StatesTarget StateSignal Emitted
^{}ACTIVEEXPIRING^{}
^{}EXPIRINGACTIVE^{}
^{}ACTIVE,SUSPENDEDRENEWING^{}
^{}ACTIVE,RENEWING,ERRORACTIVE^{}
^{}RENEWING,ERRORSUSPENDED^{}
^{}ACTIVE,SUSPENDED,EXPIRING,ERRORENDED^{}
^{}RENEWINGERROR^{}

示例:

subscription.renew()只能在subscription.stateACTIVESUSPENDED时调用, 会导致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>

发布新版本

  1. 在pyproject.toml和src/subscriptions/init.py中增加版本号
  2. 提交并推送到主节点
  3. 从github,create a new release
  4. 使用步骤1中的版本号将版本命名为“v<;maj.minor.patch>;”。
  5. 发布发布
  6. 如果发行版成功构建,Circleci将发布新的包对pypi

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java共享首选项保存复选框操作   Android上的文本视图上的java Drop shadow   java在windows上将firebase添加到JavaFX   java Android MotionEvent指针索引混乱   java一些文本被添加到JavaScript的变量中   如何使用Java将十六进制转换为rgb?   java非服务JSP   java将侦听器添加到ArrayList   java在使用Scanner类获取输入时遇到问题   使用Mockito将非空列表作为参数进行匹配的java   java Liferay Maven Service Builder Portlet(开发者工作室)   如何在Java8中创建好的迭代   java JTable单元格不可编辑,但可单击   java决定Android应用程序的使用次数   java如何在没有ActiveX的情况下创建多个文件下载程序?   Java/Android,多类   JavaJSF外部链接   java[org.springframework.web.multipart.support.MissingServletRequestPartException:不存在所需的请求部分“image”]   java正则表达式选择直到字符串而不是子字符串