django-badgify, 使用 Django 创建你自己的徽章引擎的可以重用应用程序

分享于 

11分钟阅读

GitHub

  繁體 雙語
A reusable application to create your own badge engine using Django
  • 源代码名称:django-badgify
  • 源代码网址:http://www.github.com/ulule/django-badgify
  • django-badgify源代码文档
  • django-badgify源代码下载
  • Git URL:
    git://www.github.com/ulule/django-badgify.git
    Git Clone代码到本地:
    git clone http://www.github.com/ulule/django-badgify
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/ulule/django-badgify
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    badgify

    这个 Django 应用程序将帮助你在你的网站上创建自己的徽章系统。

    它已经在 Ulule 上使用,创建了我们自己的 badge机制。

    Build Status

    安装

    $ pip install django-badgify

    用法

    settings.py 中将 badgify 添加到 INSTALLED_APPS:

    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 BaseRecipeimport badgify

    创建和 register的配方类:

    classPythonLoverRecipe(BaseRecipe):
     passclassJSLoverRecipe(BaseRecipe):
     pass# Per classbadgify.register(PythonLoverRecipe)
    badgify.register(JSLoverRecipe)# All at once in a listbadgify.register([PythonLoverRecipe, JSLoverRecipe])

    recipe类必须实现:

    • name 类属性标记名称( 人性化)。
    • image 属性将标记图像/logo 作为文件对象。

    recipe类可以实现:

    • 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_SIZE ( 500 )。

    例如:

    from django.contrib.staticfiles.storage import staticfiles_storagefrom badgify.recipe import BaseRecipeimport badgifyfrom. models import MyCustomUserclassPythonLoverRecipe(BaseRecipe):
     """ People loving Python.""" name ='Python Lover' slug ='python-lover' description ='People loving Python programming language'@propertydefimage(self):
     return staticfiles_storage.open('python-lover.png')
     @propertydefuser_ids(self):
     return (MyCustomUser.objects.filter(love_python=True)
    . values_list('id', flat=True))classJSLoverRecipe(BaseRecipe):
     """ People loving JS.""" name ='JS Lover' slug ='js-lover' description ='People loving JS programming language'@propertydefimage(self):
     return staticfiles_storage.open('js-lover.png')
     @propertydefuser_ids(self):
     return (MyCustomUser.objects.filter(love_js=True)
    . values_list('id', flat=True))classJavaLoverRecipe(BaseRecipe):
     """ People loving Java.""" name ='Java Lover' slug ='java-lover' description ='People loving Java programming language'@propertydefimage(self):
     return staticfiles_storage.open('java-lover.png')
    badgify.register([
     PythonLoverRecipe,
     JSLoverRecipe,
     JavaLoverRecipe,
    ])

    实现并注册了recipe类之后,你可以调用可用的命令波纹管:

    # 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

    Templatetags

    badgify_badges

    接受两个可选参数:

    • user: user 对象
    • username: user 用户名

    不带任何参数,显示所有徽章。 否则,由给定用户颁发的徽章。

    {%loadbadgify_tags%}{%badgify_badgesasbadges%}{%badgify_badgesusername="johndoe"asbadges%}{%badgify_badgesuser=userasbadges%}{%forbadgeinbadges%} {{ badge.name }}{%endfor%}

    视图

    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')),
    ]

    有关更多详细信息,请参见示例项目。

    自定义模型

    英镑让你为 BadgeAward 模型定义自己的模型类。 这对于 i18n 素材非常有用( 例如: transmetta支持),添加自定义字段,方法或者属性。

    你的模型必须从 badgify.models.base 模型类继承:

    # yourapp.modelsfrom badgify.models import baseclassBadge(base.Badge):
     # you own fields/logic hereclassMeta(base.Badge.Meta):
     abstract =FalseclassAward(base.Award):
     # you own fields/logic hereclassMeta(base.Award.Meta):
     abstract =False

    然后告诉应用程序在 settings.py 模块中使用它们来代替默认的应用程序:

    # yourapp.settingsBADGIFY_BADGE_MODEL='yourapp.models.Badge'BADGIFY_AWARD_MODEL='yourapp.models.Award'

    设置

    你可以通过在 settings.py 模块中定义设置来altere的行为。

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

    BADGIFY_BADGE_IMAGE_UPLOAD_ROOT

    Badge 模型 ImageField的root 路径。

    BADGIFY_BADGE_IMAGE_UPLOAD_URL

    URL Badge 模型 ImageField

    BADGIFY_BADGE_IMAGE_UPLOAD_STORAGE

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

    BADGIFY_BADGE_LIST_VIEW_PAGINATE_BY

    要在badge列表list显示的徽章数量。

    BADGIFY_BADGE_DETAIL_VIEW_PAGINATE_BY

    badge详细信息页面上显示的定标用户数。

    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

    兼容性

    • python 2.7: Django 1.9,1.10
    • python 3.4: Django 1.9,1.10
    • python 3.5: Django 1.9,1.10

    reusable  Badge  
    相关文章