Badges app for Django
Project description
Badge app for Django.
Installation
$ pip install django-badgify
Usage
Add badgify to your INSTALLED_APPS in settings.py:
INSTALLED_APPS = (
# ...
'badgify',
)
Synchronize the database:
$ python manage.py syncdb
$ python manage.py migrate
Create a badgify_recipes.py file in your Django application:
$ cd path/to/your/django/app
$ touch badgify_recipes.py
Open this file and import badgify.recipe.BaseRecipe class and badgify module:
from badgify.recipe import BaseRecipe
import badgify
Create and register your recipe classes:
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])
A recipe class must implement:
- name class attribute
The badge name (humanized).
- image property
The badge image/logo as a file object.
A recipe class may implement:
- slug class attribute
The badge slug (used internally and in URLs). If not provided, it will be auto-generated based on the badge name.
- description class attribute
The badge description (short). It not provided, value will be blank.
- user_ids property
QuerySet returning User IDs likely to be awarded. You must return a QuerySet and not just a Python list or tuple. You can use values_list('id', flat=True).
- db_read class attribute
The database alias on which to perform read queries. Defaults to django.db.DEFAULT_DB_ALIAS.
- batch_size class attribute
How many Award objects to create at once. Defaults to BADGIFY_BATCH_SIZE (500).
Example:
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 = 'JS Lover'
slug = 'js-lover'
description = 'People loving JS programming language'
@property
def image(self):
return staticfiles_storage.open('js-lover.png')
badgify.register([
PythonLoverRecipe,
JSLoverRecipe,
JavaLoverRecipe,
])
Once you have implemented and registered your recipe classes, you can invoke available commands bellow:
# 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
Custom Models
django-badgify lets you define your own model classes for Badge and Award models. That can be pretty useful for i18n stuff (example: django-transmetta support), adding custom fields, methods or properties.
Your models must inherit from badgify.models.base model classes:
# 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
Then tell the application to use them in place of default ones in your settings.py module:
# yourapp.settings
BADGIFY_BADGE_MODEL = 'yourapp.models.Badge'
BADGIFY_AWARD_MODEL = 'yourapp.models.Award'
Settings
You can altere the application behavior by defining settings in your settings.py module. All application settings are prefixed with BADGIFY_.
- BADGIFY_BADGE_IMAGE_UPLOAD_ROOT
The root path for Badge model ImageField.
- BADGIFY_BADGE_IMAGE_UPLOAD_URL
The URL Badge model ImageField.
- BADGIFY_BADGE_IMAGE_UPLOAD_STORAGE
Your own django.core.files.storage storage instance.
- BADGIFY_BADGE_LIST_VIEW_PAGINATE_BY
Number of badges to display on the badge list page.
- BADGIFY_BADGE_DETAIL_VIEW_PAGINATE_BY
Number of awarded users to display on the badge detail page.
- BADGIFY_BADGE_MODEL
Your own concrete Badge model class as module path. Example: yourapp.models.Badge.
- BADGIFY_AWARD_MODEL
Your own concrete Award model class as module path. Example: yourapp.models.Award.
- BADGIFY_BATCH_SIZE
Maximum number of Award objects to create at once. Defaults to 500.
Development
Installation
Install VirtualBox and Vagrant.
Then, let’s go:
$ git clone https://github.com/ulule/django-badgify.git
$ cd django-badgify
$ vagrant up & vagrant ssh
$ cd /vagrant
$ make install
$ source .venv/bin/activate
Example
Run the example project:
$ vagrant ssh
$ cd /vagrant
$ source .venv/bin/activate
$ make example
Tests
Execute the test suite:
$ vagrant ssh
$ cd /vagrant
$ tox
Compatibility
This package is compatible with:
python2.6, django1.5
python2.6, django1.6
python2.7, django1.5
python2.7, django1.6
python2.7, django1.7
python3.3, django1.5
python3.3, django1.6
python3.3, django1.7
python3.4, django1.5
python3.4, django1.6
python3.4, django1.7
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file django-badgify-0.1.0.tar.gz
.
File metadata
- Download URL: django-badgify-0.1.0.tar.gz
- Upload date:
- Size: 24.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | bd267662b637e1db1ac50caf8553d8f2168037f36d402b445f0839fbab9de87a |
|
MD5 | 0d6ccb06a3b162b6abb4996f72099eed |
|
BLAKE2b-256 | d5ec123e5a88da27310dcb14ed0fbf5f06d94cd8f6d93ee1f7a5abfa09b20a8b |