跳转到主要内容

一个可重用的应用程序,用于使用Django创建自己的徽章引擎

项目描述

此Django应用程序可以帮助您在网站上创建自己的徽章系统。

它已在Ulule上使用,以创建我们自己的徽章机制

安装

$ pip install django-badgify

用法

badgify 添加到您的 INSTALLED_APPS 中的 settings.py

INSTALLED_APPS = (
    # ...
    'badgify',
)

同步数据库

$ python manage.py migrate badgify

在您的Django应用程序中创建一个 badgify_recipes.py 文件

$ cd path/to/your/django/app
$ touch badgify_recipes.py

打开此文件,并导入 badgify.recipe.BaseRecipe 类和 badgify 模块

from badgify.recipe import BaseRecipe
import badgify

创建和注册您的食谱类

class PythonLoverRecipe(BaseRecipe):
    pass


class JSLoverRecipe(BaseRecipe):
    pass


# Per class
badgify.register(PythonLoverRecipe)
badgify.register(JSLoverRecipe)

# All at once in a list
badgify.register([PythonLoverRecipe, JSLoverRecipe])

食谱类必须实现

  • name 类属性

    徽章名称(人性化)。

  • image 属性

    徽章图像/标志作为文件对象。

食谱类可以实现

  • slug 类属性

    徽章slug(用于内部和URL)。如果没有提供,将根据徽章名称自动生成。

  • description 类属性

    徽章描述(简短)。如果没有提供,值为空。

  • user_ids 属性

    QuerySet 返回可能获得奖励的用户ID。您必须返回一个 QuerySet 而不是一个简单的Python列表或元组。您可以使用 values_list('id', flat=True)

  • db_read 类属性

    执行读取查询的数据库别名。默认为 django.db.DEFAULT_DB_ALIAS

  • batch_size 类属性

    一次创建多少个 Award 对象。默认为 BADGIFY_BATCH_SIZE500)。

示例

from django.contrib.staticfiles.storage import staticfiles_storage

from badgify.recipe import BaseRecipe
import badgify

from .models import MyCustomUser


class PythonLoverRecipe(BaseRecipe):
    """
    People loving Python.
    """
    name = 'Python Lover'
    slug = 'python-lover'
    description = 'People loving Python programming language'

    @property
    def image(self):
        return staticfiles_storage.open('python-lover.png')

    @property
    def user_ids(self):
        return (MyCustomUser.objects.filter(love_python=True)
                                    .values_list('id', flat=True))


class JSLoverRecipe(BaseRecipe):
    """
    People loving JS.
    """
    name = 'JS Lover'
    slug = 'js-lover'
    description = 'People loving JS programming language'

    @property
    def image(self):
        return staticfiles_storage.open('js-lover.png')

    @property
    def user_ids(self):
        return (MyCustomUser.objects.filter(love_js=True)
                                    .values_list('id', flat=True))


class JavaLoverRecipe(BaseRecipe):
    """
    People loving Java.
    """
    name = 'Java Lover'
    slug = 'java-lover'
    description = 'People loving Java programming language'

    @property
    def image(self):
        return staticfiles_storage.open('java-lover.png')


badgify.register([
    PythonLoverRecipe,
    JSLoverRecipe,
    JavaLoverRecipe,
])

一旦实现并注册了您的食谱类,您就可以调用以下可用的命令

# Create badges from recipes
$ python manage.py badgify_sync badges

# Update badges from recipes
$ python manage.py badgify_sync badges --update

# Create awards
$ python manage.py badgify_sync awards

# Create awards bypassing signals (improve performances)
$ python manage.py badgify_sync awards --disable-signals

# Only create awards for "python" badge
$ python manage.py badgify_sync awards --badges python

# Only create awards for "python" and "go" badges
$ python manage.py badgify_sync awards --badges "python go"

# Create awards for all badges, except "php"
$ python manage.py badgify_sync awards --exclude-badges php

# Create awards for all badges, except "php" and "java"
$ python manage.py badgify_sync awards --exclude-badges "php java"

# Denormalize Badge.users.count() into Badge.users_count field
$ python manage.py badgify_sync counts

# Only denormalize counts for "python" badge
$ python manage.py badgify_sync counts --badges python

# Denormalize counts for all badges, except "php"
$ python manage.py badgify_sync counts --exclude-badges php

# Denormalize counts for all badges, except "php" and "java"
$ python manage.py badgify_sync counts --exclude-badges "php java"

# Typical workflow for best performances
$ python manage.py badgify_sync badges
$ python manage.py badgify_sync awards --disable-signals
$ python manage.py badgify_sync counts

# WARNING: if you delete awards to start again with a fresh table
# don't forget to update Badge.users_count field. Or use this command:
$ python manage.py badgify_reset

# Typical workflow for best performances if you want to recompute awards
$ python manage.py badgify_reset
$ python manage.py badgify_sync awards --disable-signals
$ python manage.py badgify_sync counts

模板标签

badgify_badges

接受两个可选参数

  • user:一个 User 对象

  • username:一个 User 用户名

如果没有参数,则显示所有徽章。否则,显示给定用户的徽章。

{% load badgify_tags %}

{% badgify_badges as badges %}
{% badgify_badges username="johndoe" as badges %}
{% badgify_badges user=user as badges %}

{% for badge in badges %}
    {{ badge.name }}
{% endfor %}

视图

django-badgify 提供了两个视图

  • badgify.views.BadgifyListView:以分页列表的形式显示所有徽章

  • badgify.views.BadgifyDetailView:显示特定徽章的获奖用户分页列表

此应用程序不包含模板。它允许您根据自己的喜好实现模板(请参阅示例项目)。

要包含这两个视图,请包含提供的 badgify.urls

# -*- coding: utf-8 -*-
from django.conf.urls import include, url

urlpatterns = [
    # Your other includes
    url(r'^badges/', include('badgify.urls')),
]

请参阅示例项目以获取更多详细信息。

自定义模型

django-badgify 允许您为 BadgeAward 模型定义自己的模型类。这对于国际化内容(例如:支持 django-transmetta)、添加自定义字段、方法或属性非常有用。

您的模型必须继承自 badgify.models.base 模型类

# yourapp.models

from badgify.models import base


class Badge(base.Badge):
    # you own fields / logic here
    class Meta(base.Badge.Meta):
        abstract = False


class Award(base.Award):
    # you own fields / logic here
    class Meta(base.Award.Meta):
        abstract = False

然后在您的 settings.py 模块中告诉应用程序使用它们而不是默认的

# yourapp.settings

BADGIFY_BADGE_MODEL = 'yourapp.models.Badge'
BADGIFY_AWARD_MODEL = 'yourapp.models.Award'

设置

您可以通过在 settings.py 模块中定义设置来更改应用程序的行为。

所有应用程序设置都以 BADGIFY_ 为前缀。

BADGIFY_BADGE_IMAGE_UPLOAD_ROOT

Badge 模型 ImageField 的根路径。

BADGIFY_BADGE_IMAGE_UPLOAD_URL

Badge 模型 ImageField 的URL。

BADGIFY_BADGE_IMAGE_UPLOAD_STORAGE

您自己的 django.core.files.storage 存储实例。

BADGIFY_BADGE_LIST_VIEW_PAGINATE_BY

徽章列表页面显示的徽章数量。

BADGIFY_BADGE_DETAIL_VIEW_PAGINATE_BY

徽章详情页面显示的获奖用户数量。

BADGIFY_BADGE_MODEL

您的具体 Badge 模型类作为模块路径。

例如:yourapp.models.Badge

BADGIFY_AWARD_MODEL

您的具体 Award 模型类作为模块路径。

例如:yourapp.models.Award

BADGIFY_BATCH_SIZE

一次创建的最大 Award 对象数量。

默认为 500

贡献

# Don't have pip?
$ sudo easy_install pip

# Don't already have virtualenv?
$ sudo pip install virtualenv

# Clone and install dependencies
$ git clone https://github.com/ulule/django-badgify.git
$ cd django-badgify
$ make install

# Launch tests
$ make test

# Launch example project
$ make create_fixtures
$ make serve

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分发

django-badgify-0.6.0.tar.gz (27.6 kB 查看哈希)

上传时间

支持者