{ "info": { "author": "Andrey Fedoseev", "author_email": "andrey.fedoseev@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Framework :: Django", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Topic :: Internet :: WWW/HTTP" ], "description": "========================\ndjango-asset-definitions\n========================\n\n.. image:: https://circleci.com/gh/andreyfedoseev/django-asset-definitions.svg?style=shield\n :target: https://circleci.com/gh/andreyfedoseev/django-asset-definitions\n :alt: Build Status\n\n.. image:: https://codecov.io/github/andreyfedoseev/django-asset-definitions/coverage.svg?branch=master\n :target: https://codecov.io/github/andreyfedoseev/django-asset-definitions?branch=master\n :alt: Code Coverage\n\nAsset definitions are collections of static files (JavaScript, CSS) defined in Python code and (re)used in Django views\nand templates.\n\nAn example of asset definition is ``Media`` class that you can\n`define in Django forms `_.\n\n``django-asset-definitions`` aim to extend the application of asset definitions beyond forms and use them as the main\nway to describe and organize JavaScript and CSS files.\n\nInstallation\n============\n\n.. code-block:: sh\n\n pip install django-asset-definitions\n\n\nUsage\n=====\n\nDefine:\n-------\n\n.. code-block:: python\n\n import asset_definitions\n\n my_media = asset_definitions.Media(\n js=(\n \"media.js\",\n \"\"\"\"\"\",\n ),\n css={\n \"all\": (\n \"media.css\",\n ),\n }\n )\n\nCombine:\n--------\n\n.. code-block:: python\n\n extended_media = my_media + asset_definitions.Media(\n js=(\"extension.js\", )\n )\n\n\nDefine in views:\n----------------\n\n.. code-block:: python\n\n import asset_definitions\n\n class MyView(asset_definitions.MediaDefiningView, ...):\n\n class Media:\n js=(\n \"media.js\",\n ),\n css={\n \"all\": (\n \"media.css\",\n ),\n }\n\n ...\n\nForm media is added to view media automatically:\n\n.. code-block:: python\n\n import asset_definitions\n from django.views.generic import FormView\n\n class MyFormView(asset_definitions.MediaDefiningView, FormView):\n ...\n\nUse in templates:\n-----------------\n\n.. code-block:: django\n\n {{ view.media.render }}\n\nOr:\n\n.. code-block:: django\n\n {{ view.media.js.render }}\n {{ view.media.css.render }}\n\n\nSee an extended example below.\n\n\n``asset_definitions.Media`` and ``django.forms.Media``\n======================================================\n\n1. ``asset_definitions.Media`` provides the same API as ``django.forms.Media``. In fact, it is inherited from\n ``django.forms.Media``.\n2. It is safe to combine ``asset_definitions.Media`` with ``django.forms.Media``.\n3. ``asset_definitions.Media`` objects are lazy. If two or more instances of ``asset_definitions.Media`` are combined\n together the result is computed only when media is rendered. It is safe to use ``reverse_lazy()`` with\n ``asset_definitions.Media``. It is important if you define your assets on module level.\n4. ``Media`` class in ``MediaDefiningView`` does not support ``extend`` option. To add to the media defined in parent\n view class you should override ``get_media`` method and use ``super(MyView, self).get_media()``.\n\nExample:\n========\n\n``myapp/urls.py``:\n\n.. code-block:: python\n\n urlpatterns = (\n url(\"/\", MyView.as_view()),\n url(\"/global-variables.js\", global_js_variables, name=\"global_js_variables\"),\n )\n\n\n``myapp/views.py``:\n\n.. code-block:: python\n\n import asset_definitions\n from . import assets\n\n\n class MyView(assets_definition.MediaDefiningView, TemplateView):\n\n template_name = \"template.html\"\n\n class Media:\n js = (\"media.js\", )\n css = {\"all\": (\"media.css\", media)\n\n def get_media():\n return (\n assets.global_js_variables +\n assets.jquery +\n super(MyView, self).get_media()\n )\n\n def global_js_variables(request):\n js_content = 'const CURRENT_USER=\"{}\";'.format(request.user)\n return HttpResponse(js_content, content_type=\"application/javascript\")\n\n``myapp/assets.py``:\n\n.. code-block:: python\n\n import asset_definitions\n from django.core import urlresolvers\n\n\n global_js_variables = asset_definition.Media(\n js=urlresolvers.reverse_lazy(\"global_js_variables\"),\n )\n\n\n jquery = asset_definitions.Media(\n js=\"jquery.js\"\n )\n\n\n``myapp/templates/template.html``:\n\n.. code-block:: django\n\n \n \n {{ view.media.css.render }}\n \n \n ...\n {{ view.media.js.render }}\n \n \n\n\n\n\n=======\nChanges\n=======\n\n0.3\n===\n\n - Add Django 2.0 compatibility\n - Extract ``MediaDefiningClass`` base class from ``MediaDefiningView``\n\n0.2\n===\n\n - Specify different requirements in ``setup.py`` based on the current Python version\n - Allow to use inline JavaScript in media definitions (wrap with ``