{ "info": { "author": "Gilles Fabio", "author_email": "gilles.fabio@gmail.com", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Framework :: Django", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Utilities" ], "description": "django-badgify\n==============\n\nThis Django application will help you to create your own badge system on your website.\n\nIt has been used on `Ulule `_ to create our own `badge mechanism `_.\n\n.. image:: https://secure.travis-ci.org/ulule/django-badgify.png?branch=master\n :alt: Build Status\n :target: http://travis-ci.org/ulule/django-badgify\n\nInstallation\n------------\n\n.. code-block:: bash\n\n $ pip install django-badgify\n\nUsage\n-----\n\nAdd ``badgify`` to your ``INSTALLED_APPS`` in ``settings.py``:\n\n.. code-block:: python\n\n INSTALLED_APPS = (\n # ...\n 'badgify',\n )\n\nSynchronize the database:\n\n.. code-block:: bash\n\n $ python manage.py migrate badgify\n\nCreate a ``badgify_recipes.py`` file in your Django application:\n\n.. code-block:: bash\n\n $ cd path/to/your/django/app\n $ touch badgify_recipes.py\n\nOpen this file and import `badgify.recipe.BaseRecipe` class and `badgify` module:\n\n.. code-block:: python\n\n from badgify.recipe import BaseRecipe\n import badgify\n\nCreate and register your recipe classes:\n\n.. code-block:: python\n\n class PythonLoverRecipe(BaseRecipe):\n pass\n\n\n class JSLoverRecipe(BaseRecipe):\n pass\n\n\n # Per class\n badgify.register(PythonLoverRecipe)\n badgify.register(JSLoverRecipe)\n\n # All at once in a list\n badgify.register([PythonLoverRecipe, JSLoverRecipe])\n\nA recipe class must implement:\n\n* ``name`` class attribute\n The badge name (humanized).\n\n* ``image`` property\n The badge image/logo as a file object.\n\nA recipe class may implement:\n\n* ``slug`` class attribute\n The badge slug (used internally and in URLs).\n If not provided, it will be auto-generated based on the badge name.\n\n* ``description`` class attribute\n The badge description (short).\n It not provided, value will be blank.\n\n* ``user_ids`` property\n ``QuerySet`` returning User IDs likely to be awarded. You must return a\n ``QuerySet`` and not just a Python list or tuple. You can use\n ``values_list('id', flat=True)``.\n\n* ``db_read`` class attribute\n The database alias on which to perform read queries.\n Defaults to ``django.db.DEFAULT_DB_ALIAS``.\n\n* ``batch_size`` class attribute\n How many ``Award`` objects to create at once.\n Defaults to ``BADGIFY_BATCH_SIZE`` (``500``).\n\nExample:\n\n.. code-block:: python\n\n from django.contrib.staticfiles.storage import staticfiles_storage\n\n from badgify.recipe import BaseRecipe\n import badgify\n\n from .models import MyCustomUser\n\n\n class PythonLoverRecipe(BaseRecipe):\n \"\"\"\n People loving Python.\n \"\"\"\n name = 'Python Lover'\n slug = 'python-lover'\n description = 'People loving Python programming language'\n\n @property\n def image(self):\n return staticfiles_storage.open('python-lover.png')\n\n @property\n def user_ids(self):\n return (MyCustomUser.objects.filter(love_python=True)\n .values_list('id', flat=True))\n\n\n class JSLoverRecipe(BaseRecipe):\n \"\"\"\n People loving JS.\n \"\"\"\n name = 'JS Lover'\n slug = 'js-lover'\n description = 'People loving JS programming language'\n\n @property\n def image(self):\n return staticfiles_storage.open('js-lover.png')\n\n @property\n def user_ids(self):\n return (MyCustomUser.objects.filter(love_js=True)\n .values_list('id', flat=True))\n\n\n class JavaLoverRecipe(BaseRecipe):\n \"\"\"\n People loving Java.\n \"\"\"\n name = 'Java Lover'\n slug = 'java-lover'\n description = 'People loving Java programming language'\n\n @property\n def image(self):\n return staticfiles_storage.open('java-lover.png')\n\n\n badgify.register([\n PythonLoverRecipe,\n JSLoverRecipe,\n JavaLoverRecipe,\n ])\n\nOnce you have implemented and registered your recipe classes, you can invoke\navailable commands bellow:\n\n.. code-block:: bash\n\n # Create badges from recipes\n $ python manage.py badgify_sync badges\n\n # Update badges from recipes\n $ python manage.py badgify_sync badges --update\n\n # Create awards\n $ python manage.py badgify_sync awards\n\n # Create awards bypassing signals (improve performances)\n $ python manage.py badgify_sync awards --disable-signals\n\n # Only create awards for \"python\" badge\n $ python manage.py badgify_sync awards --badges python\n\n # Only create awards for \"python\" and \"go\" badges\n $ python manage.py badgify_sync awards --badges \"python go\"\n\n # Create awards for all badges, except \"php\"\n $ python manage.py badgify_sync awards --exclude-badges php\n\n # Create awards for all badges, except \"php\" and \"java\"\n $ python manage.py badgify_sync awards --exclude-badges \"php java\"\n\n # Denormalize Badge.users.count() into Badge.users_count field\n $ python manage.py badgify_sync counts\n\n # Only denormalize counts for \"python\" badge\n $ python manage.py badgify_sync counts --badges python\n\n # Denormalize counts for all badges, except \"php\"\n $ python manage.py badgify_sync counts --exclude-badges php\n\n # Denormalize counts for all badges, except \"php\" and \"java\"\n $ python manage.py badgify_sync counts --exclude-badges \"php java\"\n\n # Typical workflow for best performances\n $ python manage.py badgify_sync badges\n $ python manage.py badgify_sync awards --disable-signals\n $ python manage.py badgify_sync counts\n\n # WARNING: if you delete awards to start again with a fresh table\n # don't forget to update Badge.users_count field. Or use this command:\n $ python manage.py badgify_reset\n\n # Typical workflow for best performances if you want to recompute awards\n $ python manage.py badgify_reset\n $ python manage.py badgify_sync awards --disable-signals\n $ python manage.py badgify_sync counts\n\nTemplatetags\n------------\n\nbadgify_badges\n..............\n\nTakes two optional arguments:\n\n* ``user``: a ``User`` object\n* ``username``: a ``User`` username\n\nWithout any argument, displays all badges. Otherwise, badges awarded by the given user.\n\n.. code-block:: html+django\n\n {% load badgify_tags %}\n\n {% badgify_badges as badges %}\n {% badgify_badges username=\"johndoe\" as badges %}\n {% badgify_badges user=user as badges %}\n\n {% for badge in badges %}\n {{ badge.name }}\n {% endfor %}\n\nViews\n-----\n\n**django-badgify** provides two views:\n\n* ``badgify.views.BadgifyListView``: displays all badges as paginated list\n* ``badgify.views.BadgifyDetailView``: displays awarded users as paginated list for a given badge\n\nThis application does not include templates. It lets you implement\ntemplates as you like (see example project).\n\nTo include these two views, include the provided ``badgify.urls``:\n\n.. code-block:: python\n\n # -*- coding: utf-8 -*-\n from django.conf.urls import include, url\n\n urlpatterns = [\n # Your other includes\n url(r'^badges/', include('badgify.urls')),\n ]\n\nSee example project for more details.\n\nCustom Models\n-------------\n\n**django-badgify** lets you define your own model classes for ``Badge`` and ``Award``\nmodels. That can be pretty useful for i18n stuff\n(example: `django-transmetta `_ support),\nadding custom fields, methods or properties.\n\nYour models must inherit from ``badgify.models.base`` model classes:\n\n.. code-block:: python\n\n # yourapp.models\n\n from badgify.models import base\n\n\n class Badge(base.Badge):\n # you own fields / logic here\n class Meta(base.Badge.Meta):\n abstract = False\n\n\n class Award(base.Award):\n # you own fields / logic here\n class Meta(base.Award.Meta):\n abstract = False\n\n\nThen tell the application to use them in place of default ones in your ``settings.py`` module:\n\n.. code-block:: python\n\n # yourapp.settings\n\n BADGIFY_BADGE_MODEL = 'yourapp.models.Badge'\n BADGIFY_AWARD_MODEL = 'yourapp.models.Award'\n\nSettings\n--------\n\nYou can altere the application behavior by defining settings in your ``settings.py``\nmodule.\n\nAll application settings are prefixed with ``BADGIFY_``.\n\n``BADGIFY_BADGE_IMAGE_UPLOAD_ROOT``\n...................................\n\nThe root path for ``Badge`` model ``ImageField``.\n\n``BADGIFY_BADGE_IMAGE_UPLOAD_URL``\n..................................\n\nThe URL ``Badge`` model ``ImageField``.\n\n``BADGIFY_BADGE_IMAGE_UPLOAD_STORAGE``\n......................................\n\nYour own ``django.core.files.storage`` storage instance.\n\n``BADGIFY_BADGE_LIST_VIEW_PAGINATE_BY``\n.......................................\n\nNumber of badges to display on the badge list page.\n\n``BADGIFY_BADGE_DETAIL_VIEW_PAGINATE_BY``\n.........................................\n\nNumber of awarded users to display on the badge detail page.\n\n``BADGIFY_BADGE_MODEL``\n.......................\n\nYour own concrete ``Badge`` model class as module path.\n\nExample: ``yourapp.models.Badge``.\n\n``BADGIFY_AWARD_MODEL``\n.......................\n\nYour own concrete ``Award`` model class as module path.\n\nExample: ``yourapp.models.Award``.\n\n``BADGIFY_BATCH_SIZE``\n......................\n\nMaximum number of ``Award`` objects to create at once.\n\nDefaults to ``500``.\n\nContribute\n----------\n\n.. code-block:: bash\n\n # Don't have pip?\n $ sudo easy_install pip\n\n # Don't already have virtualenv?\n $ sudo pip install virtualenv\n\n # Clone and install dependencies\n $ git clone https://github.com/ulule/django-badgify.git\n $ cd django-badgify\n $ make install\n\n # Launch tests\n $ make test\n\n # Launch example project\n $ make create_fixtures\n $ make serve\n\nCompatibility\n-------------\n\n- python 2.7: Django 1.9, 1.10\n- Python 3.4: Django 1.9, 1.10\n- Python 3.5: Django 1.9, 1.10\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/ulule/django-badgify", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "django-badgify-lab", "package_url": "https://pypi.org/project/django-badgify-lab/", "platform": "", "project_url": "https://pypi.org/project/django-badgify-lab/", "project_urls": { "Homepage": "http://github.com/ulule/django-badgify" }, "release_url": "https://pypi.org/project/django-badgify-lab/0.2.0/", "requires_dist": null, "requires_python": "", "summary": "A reusable application to create your own badge engine using Django", "version": "0.2.0" }, "last_serial": 3141207, "releases": { "0.1.5": [ { "comment_text": "", "digests": { "md5": "2e1cb755509f945572387f1dc1fb53d3", "sha256": "86faca8fd18280fb2cf3b0cfce13b01a8844e65529c5dca85db7605c415c9e24" }, "downloads": -1, "filename": "django_badgify_lab-0.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "2e1cb755509f945572387f1dc1fb53d3", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 41041, "upload_time": "2015-06-19T18:10:01", "url": "https://files.pythonhosted.org/packages/51/b1/88e2213685eb76edc3bf3b1f27a47da6a43da4500d17bda02b584af91cbf/django_badgify_lab-0.1.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "13ab14ca74193a3c1acf5b3e36073f79", "sha256": "203cb0a17c9fa0c8482a1fd8f11be137e7fc65eb9a4d0f60d592ebef3fa54100" }, "downloads": -1, "filename": "django-badgify-lab-0.1.5.tar.gz", "has_sig": false, "md5_digest": "13ab14ca74193a3c1acf5b3e36073f79", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25858, "upload_time": "2015-06-19T18:09:58", "url": "https://files.pythonhosted.org/packages/22/25/7404eec29562f98ecb710e8e47faa8180e8b3fc8372046a3b81a0b6bf1f6/django-badgify-lab-0.1.5.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "92f52f7ce23d6ff42c7c3deaeeb456db", "sha256": "830514cc96cb48bbabcd74e7553d270124ccbef89b0c0858a6b51ca5e3c2a110" }, "downloads": -1, "filename": "django_badgify_lab-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "92f52f7ce23d6ff42c7c3deaeeb456db", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 38422, "upload_time": "2017-09-01T18:45:32", "url": "https://files.pythonhosted.org/packages/fa/a2/da63bfb7e66eb9a90e4e9c71239d98ea82db3b893a364ca865b0d8f56560/django_badgify_lab-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "abb44d4f741856dce4e70afd4741a697", "sha256": "fdbd75862dd85621928ee4a78accc2333213d613a0cf154a4e08f455f2378836" }, "downloads": -1, "filename": "django-badgify-lab-0.2.0.tar.gz", "has_sig": false, "md5_digest": "abb44d4f741856dce4e70afd4741a697", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25607, "upload_time": "2017-09-01T18:45:30", "url": "https://files.pythonhosted.org/packages/f9/b4/807955e321e5ac2ec7346caaaec98c2478f39b1248219c2a10441bd2d3f3/django-badgify-lab-0.2.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "92f52f7ce23d6ff42c7c3deaeeb456db", "sha256": "830514cc96cb48bbabcd74e7553d270124ccbef89b0c0858a6b51ca5e3c2a110" }, "downloads": -1, "filename": "django_badgify_lab-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "92f52f7ce23d6ff42c7c3deaeeb456db", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 38422, "upload_time": "2017-09-01T18:45:32", "url": "https://files.pythonhosted.org/packages/fa/a2/da63bfb7e66eb9a90e4e9c71239d98ea82db3b893a364ca865b0d8f56560/django_badgify_lab-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "abb44d4f741856dce4e70afd4741a697", "sha256": "fdbd75862dd85621928ee4a78accc2333213d613a0cf154a4e08f455f2378836" }, "downloads": -1, "filename": "django-badgify-lab-0.2.0.tar.gz", "has_sig": false, "md5_digest": "abb44d4f741856dce4e70afd4741a697", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25607, "upload_time": "2017-09-01T18:45:30", "url": "https://files.pythonhosted.org/packages/f9/b4/807955e321e5ac2ec7346caaaec98c2478f39b1248219c2a10441bd2d3f3/django-badgify-lab-0.2.0.tar.gz" } ] }