核心模块-工具

Core.utils.gen_uuid()[源代码]

生成一个UUID对象。

返回:一个UUID对象
返回类型:UUID
作者:杜佑宸 <youchen.du@gmail.com>
class Core.utils.DynamicHashPath(base='uploads', use_date=True, hasher_cls=<built-in function openssl_md5>)[源代码]

用于动态控制 FileField 字段 upload_to 上传路径 文件名会追加特征码, 多次相同文件名不同内容的上传不会覆盖以前上传文件

作者:

杜佑宸 <youchen.du@gmail.com>

参数:
  • base (str) – 上传路径的公共前缀 默认值: uploads
  • use_date (bool) – 是否在公共前缀后使用日期进行路径划分, 如: uploads/2017/11/17
  • hasher_clshashlib 中的某个哈希函数构造器, 如无必要请勿修改, 默认值: hashlib.md5
deconstruct(obj)

Returns a 3-tuple of class import path, positional arguments, and keyword arguments.

Core.utils.transition(field, source, target, conditions=None, permission=None, name=None)[源代码]

用于控制工作流状态转移的方法装饰器

参数:
  • field – 进行状态转移的字段名称
  • source – 起始状态, 使用’*’表示任意状态
  • target – 目标状态, 完成对应操作后转入状态
  • conditions(可选) – 进行该状态转移所需的额外条件, 默认跳过该检查, 若为’bool’类型, 则在检查 时直接返回该值, 若为函数, 则在检查时接收一个参数’request’并返回其调用结果, 否则不允许操作
  • permission(可选) – 进行该状态转移所需的权限, 默认跳过该检查, 若为’bool’类型,则在检查时直 接返回该值, 若为’str’类型, 则根据’user.has_perm’进行判断, 若为函数, 则在检 查时接收一个参数’request’并返回其调用结果, 否则不允许操作
  • name(可选) – 设置该字段在向前台进行渲染时的名称, 默认为方法名

Example

from Core.utils import transition

class Example(models.Model):
    status = models.IntegerField(verbose_name='状态',
                                 choices=REVIEW_STATUS_CHOICES,
                                 default=REVIEW_STATUS_DEFAULT)

    @transition(field='status', source='*', target=REVIEW_STATUS_PASS)
    def review_pass(self, request):
        # Do some relavent actions
        # status will be updated and saved automatically
        pass
Raises:
  • PermissionDenied – 当操作权限检查失败后抛出
  • ValidationError – 当前置状态或额外条件检查失败后抛出
作者:

杜佑宸 <youchen.du@gmail.com>

class Core.utils.TransitionMeta[源代码]

用于向Model对象添加自动生成当前状态下可选操作方法的元类

该元类将自动向实例添加一个实例方法 actions, 该方法接收一个参数 request, 返回当前实例下所有使用 transition 装饰的当前可用操作目标结果,该元类主要 为向前台提供当前可用操作提供服务。

Example

from Core.utils.fsm import TransitionMeta

class Example(models.Model, metaclass=TransitionMeta):
    status = models.IntegerField(verbose_name='状态',
                                 choices=REVIEW_STATUS_CHOICES,
                                 default=REVIEW_STATUS_DEFAULT)

    @transition(field='status', source='*', target=REVIEW_STATUS_PASS)
    def review_pass(self, request):
        # Do some relavent actions
        # status will be updated and saved automatically
        pass
class Core.utils.TransitionSerializerMixin(instance=None, data=<class 'rest_framework.fields.empty'>, **kwargs)[源代码]

用于向Serializer对象添加额外字段 actions 的Mixin组件,配合其他相关组件使用

Example

from Core.utils.fsm import TransitionSerializerMixin as TSMixin

class ProductSerializer(TSMixin, serializers.ModelSerializer):
    documents = serializers.PrimaryKeyRelatedField(many=True,
                                                   read_only=True)

    class Meta:
        model = Product
        fields = '__all__'
        read_only_fields = ('name',)