用于管理订阅状态的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 Spinner选定值未上载到firebase数据库   java如何通过bukkit中的配置添加消息?   java在SharedReference中保存列表的泛型类型   javascript Java小程序未定义   swt在Java中构建控制台应用程序   java OAuth同意屏幕没有突然显示,没有错误?   java webview选择文件安卓不工作   java Spring boot JPA如何从同一连接添加多个数据库?   java JDBC DB2驱动程序计时器线程处于阻塞状态   java我在vscode中运行flatter时看到一个错误在phone中运行应用程序somone能否帮助我plz   Java:生成JSON:如何避免生成不完整的JSON   java Date compareTo()方法始终返回1   当使用Junit runner运行测试时,java Spring自动连线失败   java Android/Sockets如何将信息从主UI线程发送到socket线程?   java Android内存声明全局变量   java如何在JBoss中拥有多个具有相同JNDI名称的数据源?   python在Java中嵌入CPython时,为什么会挂起?   java如何提供深度模拟对象?   java“find:smallint,expected:integer”Hibernate对informix数据库的验证在短时间内失败