{"id":13469294,"url":"https://github.com/jedie/django-tools","last_synced_at":"2025-04-05T04:12:04.720Z","repository":{"id":876867,"uuid":"619591","full_name":"jedie/django-tools","owner":"jedie","description":"miscellaneous django tools","archived":false,"fork":false,"pushed_at":"2024-09-04T00:38:47.000Z","size":1979,"stargazers_count":132,"open_issues_count":5,"forks_count":31,"subscribers_count":10,"default_branch":"main","last_synced_at":"2025-03-29T03:06:24.553Z","etag":null,"topics":["django","helpers","python"],"latest_commit_sha":null,"homepage":"http://pypi.python.org/pypi/django-tools/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jedie.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null}},"created_at":"2010-04-20T13:56:14.000Z","updated_at":"2025-01-27T13:57:34.000Z","dependencies_parsed_at":"2023-02-19T00:01:46.761Z","dependency_job_id":"fdb99a28-8b96-4c60-a709-0dd9a9738299","html_url":"https://github.com/jedie/django-tools","commit_stats":{"total_commits":910,"total_committers":10,"mean_commits":91.0,"dds":0.09890109890109888,"last_synced_commit":"62cac0dd5c0baf7728e091bd8ce17f04ed82cecd"},"previous_names":[],"tags_count":104,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jedie%2Fdjango-tools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jedie%2Fdjango-tools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jedie%2Fdjango-tools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jedie%2Fdjango-tools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jedie","download_url":"https://codeload.github.com/jedie/django-tools/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247284951,"owners_count":20913704,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["django","helpers","python"],"created_at":"2024-07-31T15:01:32.207Z","updated_at":"2025-04-05T04:12:04.698Z","avatar_url":"https://github.com/jedie.png","language":"Python","funding_links":["https://www.paypal.me/JensDiemer"],"categories":["Python"],"sub_categories":[],"readme":"![django-tools](https://raw.githubusercontent.com/jedie/django-tools/master/logo/logo.svg \"django-tools\")\n\nMiscellaneous tools for django.\n\nLook also at the siblings project: [django-cms-tools](https://github.com/jedie/django-cms-tools) (Tools/helpers around Django-CMS).\n\n| ![PyPi](https://img.shields.io/pypi/v/django-tools?label=django-tools%20%40%20PyPi \"PyPi\")                                             | [https://pypi.python.org/pypi/django-tools/](https://pypi.python.org/pypi/django-tools/) |\n| ![Build Status on github](https://github.com/jedie/django-tools/workflows/test/badge.svg?branch=main \"Build Status on github\")         | [github.com/jedie/django-tools/actions](https://github.com/jedie/django-tools/actions)   |\n| ![Coverage Status on codecov.io](https://codecov.io/gh/jedie/django-tools/branch/main/graph/badge.svg \"Coverage Status on codecov.io\") | [codecov.io/gh/jedie/django-tools](https://codecov.io/gh/jedie/django-tools)             |\n| ![Coverage Status on coveralls.io](https://coveralls.io/repos/jedie/django-tools/badge.svg \"Coverage Status on coveralls.io\")          | [coveralls.io/r/jedie/django-tools](https://coveralls.io/r/jedie/django-tools)           |\n\n![Python Versions](https://img.shields.io/pypi/pyversions/django-tools \"Python Versions\")\n![License](https://img.shields.io/pypi/l/django-tools \"License\")\n\n(Logo contributed by [@reallinfo](https://github.com/reallinfo) see [#16](https://github.com/jedie/django-tools/pull/16))\n\n## try-out\n\ne.g.:\n```\n~$ git clone https://github.com/jedie/django-tools.git\n~$ cd django-tools/\n~/django-tools$ ./manage.py\n```\n\n## existing stuff\n\n### Serve User Media File\n\nServe `settings.MEDIA_ROOT` files only for allowed users.\n\nSee separate README here: [django_tools/serve_media_app](https://github.com/jedie/django-tools/tree/main/django_tools/serve_media_app)\n\n### Mode Version Protect\n\nProtect a model against overwriting a newer entry with an older one, by adding a auto increment version number.\n\nSee separate README here: [django_tools/model_version_protect](https://github.com/jedie/django-tools/tree/main/django_tools/model_version_protect)\n\n### OverwriteFileSystemStorage\n\nA django filesystem storage that will overwrite existing files and can create backups, if content changed.\nusage:\n```\nclass ExampleModel(models.Model):\n    foo_file = models.FileField(\n        storage=OverwriteFileSystemStorage(create_backups=True)\n    )\n    bar_image = models.ImageField(\n        storage=OverwriteFileSystemStorage(create_backups=False)\n    )\n```\n\nBackup made by appending a suffix and sequential number, e.g.:\n\n\n* source....: foo.bar\n* backup 1..: foo.bar.bak\n* backup 2..: foo.bar.bak0\n* backup 3..: foo.bar.bak1\n\nBackup files are only made if file content changed. But at least one time!\n\n### Django Logging utils\n\nPut this into your settings, e.g.:\n```\nfrom django_tools.unittest_utils.logging_utils import CutPathnameLogRecordFactory, FilterAndLogWarnings\n\n# Filter warnings and pipe them to logging system\n# Warnings of external packages are displayed only once and only the file path.\nwarnings.showwarning = FilterAndLogWarnings()\n\n# Adds 'cut_path' attribute on log record. So '%(cut_path)s' can be used in log formatter.\nlogging.setLogRecordFactory(CutPathnameLogRecordFactory(max_length=50))\n\nLOGGING = {\n    # ...\n    'formatters': {\n        'verbose': {\n            'format': '%(levelname)8s %(cut_path)s:%(lineno)-3s %(message)s'\n        },\n    },\n    # ...\n}\n```\n\n(Activate warnings by, e.g.: `export PYTHONWARNINGS=all`)\n\n#### ThrottledAdminEmailHandler\n\n[ThrottledAdminEmailHandler](https://github.com/jedie/django-tools/blob/master/django_tools/log_utils/throttle_admin_email_handler.py) works similar as the origin [django.utils.log.AdminEmailHandler](https://docs.djangoproject.com/en/1.11/topics/logging/#django.utils.log.AdminEmailHandler)\nbut is will throttle the number of mails that can be send in a time range.\nusage e.g.:\n```\nLOGGING = {\n    # ...\n    \"handlers\": {\n        \"mail_admins\": {\n            \"level\": \"ERROR\",\n            \"class\": \"django_tools.log_utils.throttle_admin_email_handler.ThrottledAdminEmailHandler\",\n            \"formatter\": \"email\",\n            \"min_delay_sec\": 20, # \u003c\u003c -- skip mails in this time range\n        },\n        # ...\n    },\n    # ...\n}\n```\n\n### django_tools.template.loader.DebugCacheLoader\n\nInsert template name as html comments, e.g.:\n```\n\u003c!-- START 'foo/bar.html' --\u003e\n...\n\u003c!-- END 'foo/bar.html' --\u003e\n```\n\nTo use this, you must add **django_tools.template.loader.DebugCacheLoader** as template loader.\n\ne.g.: Activate it only in DEBUG mode:\n```\nif DEBUG:\n    TEMPLATES[0][\"OPTIONS\"][\"loaders\"] = [\n        (\n            \"django_tools.template.loader.DebugCacheLoader\", (\n                'django.template.loaders.filesystem.Loader',\n                'django.template.loaders.app_directories.Loader',\n            )\n        )\n    ]\n```\n\n### send text+html mails\n\nA helper class to send text+html mails used the django template library.\n\nYou need two template files, e.g.:\n\n\n* [mail_test.txt](https://github.com/jedie/django-tools/blob/master/django_tools_test_project/django_tools_test_app/templates/mail_test.txt)\n* [mail_test.html](https://github.com/jedie/django-tools/blob/master/django_tools_test_project/django_tools_test_app/templates/mail_test.html)\n\nYou have to specify the template file like this: `template_base=\"mail_test.{ext}\"`\n\nSend via Celery task:\n```\n# settings.py\nSEND_MAIL_CELERY_TASK_NAME=\"mail:send_task\"\n\nfrom django_tools.mail.send_mail import SendMailCelery\nSendMailCelery(\n    template_base=\"mail_test.{ext}\",\n    mail_context={\"foo\": \"first\", \"bar\": \"second\"},\n    subject=\"Only a test\",\n    recipient_list=\"foo@bar.tld\"\n).send()\n```\n\nSend without Celery:\n```\nfrom django_tools.mail.send_mail import SendMail\nSendMail(\n    template_base=\"mail_test.{ext}\",\n    mail_context={\"foo\": \"first\", \"bar\": \"second\"},\n    subject=\"Only a test\",\n    recipient_list=\"foo@bar.tld\"\n).send()\n```\n\nSee also the existing unittests:\n\n\n* [django_tools_tests/test_email.py](https://github.com/jedie/django-tools/blob/master/django_tools_tests/test_email.py)\n\n### Delay tools\n\nSometimes you want to simulate when processing takes a little longer.\nThere exists `django_tools.debug.delay.SessionDelay` and `django_tools.debug.delay.CacheDelay` for this.\nThe usage will create logging entries and user messages, if user is authenticated.\n\nMore info in seperate [django_tools/debug/README.creole](https://github.com/jedie/django-tools/blob/master/django_tools/debug/README.creole) file.\n\n### Filemanager library\n\nLibrary for building django application like filemanager, gallery etc.\n\nmore info, read [./filemanager/README.creole](https://github.com/jedie/django-tools/blob/master/django_tools/filemanager/README.creole)\n\n### per-site cache middleware\n\nSimilar to [django UpdateCacheMiddleware and FetchFromCacheMiddleware](https://docs.djangoproject.com/en/1.4/topics/cache/#the-per-site-cache),\nbut has some enhancements: ['per site cache' in ./cache/README.creole](https://github.com/jedie/django-tools/blob/master/django_tools/cache/README.creole#per-site-cache-middleware)\n\n### smooth cache backends\n\nSame as django cache backends, but adds `cache.smooth_update()` to clears the cache smoothly depend on the current system load.\nmore info in: ['smooth cache backends' in ./cache/README.creole](https://github.com/jedie/django-tools/blob/master/django_tools/cache/README.creole#smooth-cache-backends)\n\n### local sync cache\n\nKeep a local dict in a multi-threaded environment up-to-date. Usefull for cache dicts.\nMore info, read DocString in [./local_sync_cache/local_sync_cache.py](https://github.com/jedie/django-tools/blob/master/django_tools/local_sync_cache/local_sync_cache.py).\n\n### threadlocals middleware\n\nFor getting request object anywhere, use [./middlewares/ThreadLocal.py](https://github.com/jedie/django-tools/blob/master/django_tools/middlewares/ThreadLocal.py)\n\n### Dynamic SITE_ID middleware\n\nNote: Currently not maintained! TODO: Fix unittests for all python/django version\n\nSet settings.SITE_ID dynamically with a middleware base on the current request domain name.\nDomain name alias can be specify as a simple string or as a regular expression.\n\nmore info, read [./dynamic_site/README.creole](https://github.com/jedie/django-tools/blob/master/django_tools/dynamic_site/README.creole).\n\n### StackInfoStorage\n\nMessage storage like LegacyFallbackStorage, except, every message would have a stack info, witch is helpful, for debugging.\nStack info would only be added, if settings DEBUG or MESSAGE_DEBUG is on.\nTo use it, put this into your settings:\n```\nMESSAGE_STORAGE = \"django_tools.utils.messages.StackInfoStorage\"\n```\n\nMore info, read DocString in [./utils/messages.py](https://github.com/jedie/django-tools/blob/master/django_tools/utils/messages.py).\n\n### limit to usergroups\n\nLimit something with only one field, by selecting:\n\n\n* anonymous users\n* staff users\n* superusers\n* ..all existing user groups..\n\nMore info, read DocString in [./limit_to_usergroups.py](https://github.com/jedie/django-tools/blob/master/django_tools/limit_to_usergroups.py)\n\n### permission helpers\n\nSee [django_tools.permissions](https://github.com/jedie/django-tools/blob/master/django_tools/permissions.py)\nand unittests: [django_tools_tests.test_permissions](https://github.com/jedie/django-tools/blob/master/django_tools_tests/test_permissions.py)\n\n### form/model fields\n\n\n* [Directory field](https://github.com/jedie/django-tools/blob/master/django_tools/fields/directory.py) - check if exist and if in a defined base path\n* [language code field with validator](https://github.com/jedie/django-tools/blob/master/django_tools/fields/language_code.py)\n* [Media Path field](https://github.com/jedie/django-tools/blob/master/django_tools/fields/media_path.py) browse existign path to select and validate input\n* [sign seperated form/model field](https://github.com/jedie/django-tools/blob/master/django_tools/fields/sign_separated.py) e.g. comma seperated field\n* [static path field](https://github.com/jedie/django-tools/blob/master/django_tools/fields/static_path.py)\n* [url field](https://github.com/jedie/django-tools/blob/master/django_tools/fields/url.py) A flexible version of the original django form URLField\n\n## unittests helpers\n\n### Selenium Test Cases\n\nThere are Firefox and Chromium test cases, with and without django StaticLiveServerTestCase!\n\nChromium + StaticLiveServer example:\n```\nfrom django_tools.selenium.chromedriver import chromium_available\nfrom django_tools.selenium.django import SeleniumChromiumStaticLiveServerTestCase\n\n@unittest.skipUnless(chromium_available(), \"Skip because Chromium is not available!\")\nclass ExampleChromiumTests(SeleniumChromiumStaticLiveServerTestCase):\n    def test_admin_login_page(self):\n        self.driver.get(self.live_server_url + \"/admin/login/\")\n        self.assert_equal_page_title(\"Log in | Django site admin\")\n        self.assert_in_page_source('\u003cform action=\"/admin/login/\" method=\"post\" id=\"login-form\"\u003e')\n        self.assert_no_javascript_alert()\n```\n\nFirefox + StaticLiveServer example:\n```\nfrom django_tools.selenium.django import SeleniumFirefoxStaticLiveServerTestCase\nfrom django_tools.selenium.geckodriver import firefox_available\n\n@unittest.skipUnless(firefox_available(), \"Skip because Firefox is not available!\")\nclass ExampleFirefoxTests(SeleniumFirefoxStaticLiveServerTestCase):\n    def test_admin_login_page(self):\n        self.driver.get(self.live_server_url + \"/admin/login/\")\n        self.assert_equal_page_title(\"Log in | Django site admin\")\n        self.assert_in_page_source('\u003cform action=\"/admin/login/\" method=\"post\" id=\"login-form\"\u003e')\n        self.assert_no_javascript_alert()\n```\n\nTest cases without StaticLiveServer:\n```\nfrom django_tools.selenium.chromedriver import SeleniumChromiumTestCase\nfrom django_tools.selenium.geckodriver import SeleniumFirefoxTestCase\n```\n\nSee also existing unitests here:\n\n\n* [/django_tools/django_tools_tests/test_unittest_selenium.py](https://github.com/jedie/django-tools/blob/master/django_tools/django_tools_tests/test_unittest_selenium.py)\n\n#### Setup Web Drivers\n\nSelenium test cases needs the browser and the web driver.\n\n`SeleniumChromiumTestCase` and `SeleniumFirefoxTestCase` will automaticly install the web driver via [webdriver-manager](https://github.com/SergeyPirogov/webdriver_manager)\n\nThere is a small CLI (called `django_tools_selenium`) to check / install the web drivers, e.g.:\n```\n~/django-tools$ poetry run django_tools_selenium install\n~/django-tools$ poetry run django_tools_selenium info\n```\n\n### Mockup utils\n\nCreate dummy PIL/django-filer images with Text, see:\n\n\n* [/django_tools/unittest_utils/mockup.py](https://github.com/jedie/django-tools/blob/master/django_tools/unittest_utils/mockup.py)\n\nusage/tests:\n\n\n* [/django_tools_tests/test_mockup.py](https://github.com/jedie/django-tools/blob/master/django_tools_tests/test_mockup.py)\n\n### Model instance unittest code generator\n\nGenerate unittest code skeletons from existing model instance. You can use this feature as django manage command or as admin action.\n\nUsage as management command, e.g.:\n```\n$ ./manage.py generate_model_test_code auth.\n...\n#\n# pk:1 from auth.User \u003cclass 'django.contrib.auth.models.User'\u003e\n#\nuser = User.objects.create(\n    password='pbkdf2_sha256$36000$ybRfVQDOPQ9F$jwmgc5UsqRQSXxJs/NrZeTLguieUSSZfaSZbMmC+L5w=', # CharField, String (up to 128)\n    last_login=datetime.datetime(2018, 4, 24, 8, 27, 49, 578107, tzinfo=\u003cUTC\u003e), # DateTimeField, Date (with time)\n    is_superuser=True, # BooleanField, Boolean (Either True or False)\n    username='test', # CharField, String (up to 150)\n    first_name='', # CharField, String (up to 30)\n    last_name='', # CharField, String (up to 30)\n    email='', # CharField, Email address\n    is_staff=True, # BooleanField, Boolean (Either True or False)\n    is_active=True, # BooleanField, Boolean (Either True or False)\n    date_joined=datetime.datetime(2018, 3, 6, 17, 15, 50, 93136, tzinfo=\u003cUTC\u003e), # DateTimeField, Date (with time)\n)\n...\n```\n\n### create users\n\n[/unittest_utils/user.py](https://github.com/jedie/django-tools/blob/master/django_tools/unittest_utils/user.py):\n\n\n* `django_tools.unittest_utils.user.create_user()` - create users, get_super_user\n* `django_tools.unittest_utils.user.get_super_user()` - get the first existing superuser\n\n### Isolated Filesystem decorator / context manager\n\n[django_tools.unittest_utils.isolated_filesystem.isolated_filesystem](https://github.com/jedie/django-tools/blob/master/django_tools/unittest_utils/isolated_filesystem.py) acts as either a decorator or a context manager.\nUseful to for tests that will create files/directories in current work dir, it does this:\n\n\n* create a new temp directory\n* change the current working directory to the temp directory\n* after exit:\n* Delete an entire temp directory tree\n\nusage e.g.:\n```\nfrom django_tools.unittest_utils.isolated_filesystem import isolated_filesystem\n\nwith isolated_filesystem(prefix=\"temp_dir_prefix\"):\n    open(\"foo.txt\", \"w\").write(\"bar\")\n```\n\n### BaseUnittestCase\n\n**django_tools.unittest_utils.unittest_base.BaseUnittestCase** contains some low-level assert methods:\n\n\n* assertEqual_dedent()\n\nNote: assert methods will be migrated to: `django_tools.unittest_utils.assertments` in the future!\n\n_django_tools.unittest_utils.tempdir_ contains **TempDir**, a Context Manager Class:\n```\nwith TempDir(prefix=\"foo_\") as tempfolder:\n    # create a file:\n    open(os.path.join(tempfolder, \"bar\"), \"w\").close()\n\n# the created temp folder was deleted with shutil.rmtree()\n```\n\nusage/tests:\n\n\n* [/django_tools_tests/test_unittest_utils.py](https://github.com/jedie/django-tools/blob/master/django_tools_tests/test_unittest_utils.py)\n\n### DjangoCommandMixin\n\nHelper to run shell commands. e.g.: \"./manage.py cms check\" in unittests.\n\nusage/tests:\n\n\n* [/django_tools_tests/test_unittest_django_command.py](https://github.com/jedie/django-tools/blob/master/django_tools_tests/test_unittest_django_command.py)\n\n### DOM compare in unittests\n\nThe Problem:\nYou can’t easy check if e.g. some form input fields are in the response,\nbecause the form rendering use a dict for storing all html attributes.\nSo, the ordering of form field attributes are not sorted and varied.\n\nThe Solution:\nYou need to parse the response content into a DOM tree and compare nodes.\n\nWe add the great work of Gregor Müllegger at his GSoC 2011 form-rendering branch.\nYou will have the following assert methods inherit from: django_tools.unittest_utils.unittest_base.BaseTestCase\n\n\n* self.assertHTMLEqual() – for compare two HTML DOM trees\n* self.assertDOM() – for check if nodes in response or not.\n* self.assertContains() – Check if ond node occurs 'count’ times in response\n\nMore info and examples in [./django_tools_tests/test_dom_asserts.py](https://github.com/jedie/django-tools/blob/master/django_tools/django_tools_tests/test_dom_asserts.py)\n\n### @set_string_if_invalid() decorator\n\nHelper to check if there are missing template tags by set temporary `'string_if_invalid'`, see: [https://docs.djangoproject.com/en/1.8/ref/templates/api/#invalid-template-variables](https://docs.djangoproject.com/en/1.8/ref/templates/api/#invalid-template-variables)\n\nUsage, e.g.:\n```\nfrom django.test import SimpleTestCase\nfrom django_tools.unittest_utils.template import TEMPLATE_INVALID_PREFIX, set_string_if_invalid\n\n@set_string_if_invalid()\nclass TestMyTemplate(SimpleTestCase):\n    def test_valid_tag(self):\n        response = self.client.get('/foo/bar/')\n        self.assertNotIn(TEMPLATE_INVALID_PREFIX, response.content)\n```\n\nYou can also decorate the test method ;)\n\n### unittest_utils/signals.py\n\n\n* `SignalsContextManager` connect/disconnet signal callbacks via with statement\n\n### unittest_utils/assertments.py\n\nThe file contains some common assert functions:\n\n\n* `assert_startswith` - Check if test starts with prefix.\n* `assert_endswith` - Check if text ends with suffix.\n* `assert_locmem_mail_backend` - Check if current email backend is the In-memory backend.\n* {{{assert_language_code() - Check if given language_code is in settings.LANGUAGES\n* `assert_installed_apps()` - Check entries in settings.INSTALLED_APPS\n* `assert_is_dir` - Check if given path is a directory\n* `assert_is_file` - Check if given path is a file\n* `assert_path_not_exists` - Check if given path doesn't exists\n\n### Speedup tests\n\nSpeedup test run start by disable migrations, e.g.:\n```\nfrom django_tools.unittest_utils.disable_migrations import DisableMigrations\nMIGRATION_MODULES = DisableMigrations()\n```\n\n### small tools\n\n#### debug_csrf_failure()\n\nDisplay the normal debug page and not the minimal csrf debug page.\nMore info in DocString here: [django_tools/views/csrf.py](https://github.com/jedie/django-tools/blob/master/django_tools/views/csrf.py)\n\n#### import lib helper\n\nadditional helper to the existing `importlib`\nmore info in the sourcecode: [./utils/importlib.py](https://github.com/jedie/django-tools/blob/master/django_tools/utils/importlib.py)\n\n#### http utils\n\nPimped HttpRequest to get some more information about a request.\nMore info in DocString here: [django_tools/utils/http.py](https://github.com/jedie/django-tools/blob/master/django_tools/utils/http.py)\n\n#### @display_admin_error\n\nDeveloper helper to display silent errors in ModelAdmin.list_display callables.\nSee: **display_admin_error** in [decorators.py](https://github.com/jedie/django-tools/blob/master/django_tools/decorators.py)\n\n### upgrade virtualenv\n\nA simple commandline script that calls `pip install —-upgrade XY` for every package thats installed in a virtualenv.\nSimply copy/symlink it into the root directory of your virtualenv and start it.\n\n**Note:**[Seems that this solution can't observe editables right.](https://github.com/pypa/pip/issues/319)\n\nTo use it, without installing django-tools:\n```\n~/$ cd goto/your_env\n.../your_env/$ wget https://github.com/jedie/django-tools/raw/master/django_tools/upgrade_virtualenv.py\n.../your_env/$ chmod +x upgrade_virtualenv.py\n.../your_env/$ ./upgrade_virtualenv.py\n```\n\nThis script will be obsolete, if [pip has a own upgrade command](https://github.com/pypa/pip/issues/59).\n\n### django_tools.utils.url.GetDict\n\nSimilar to origin django.http.QueryDict but:\n\n\n* urlencode() doesn't add \"=\" to empty values: \"?empty\" instead of \"?empty=\"\n* always mutable\n* output will be sorted (easier for tests ;)\n\nMore info, see tests: [django_tools_tests/test_utils_url.py](https://github.com/jedie/django-tools/blob/master/django_tools_tests/test_utils_url.py)\n\n#### SignedCookieStorage\n\nStore information in signed Cookies, use **django.core.signing**.\nSo the cookie data can't be manipulated from the client.\nSources/examples:\n\n\n* [/django_tools/utils/client_storage.py](https://github.com/jedie/django-tools/blob/master/django_tools/utils/client_storage.py)\n* [/django_tools_tests/test_signed_cookie.py](https://github.com/jedie/django-tools/blob/master/django_tools_tests/test_signed_cookie.py)\n\n### Print SQL Queries\n\nPrint the used SQL queries via context manager.\n\nusage e.g.:\n```\nfrom django_tools.unittest_utils.print_sql import PrintQueries\n\n# e.g. use in unittests:\nclass MyTests(TestCase):\n    def test_foobar(self):\n        with PrintQueries(\"Create object\"):\n            FooBar.objects.create(\"name\"=foo)\n\n# e.g. use in views:\ndef my_view(request):\n    with PrintQueries(\"Create object\"):\n        FooBar.objects.create(\"name\"=foo)\n```\n\nthe output is like:\n```\n_______________________________________________________________________________\n *** Create object ***\n1 - INSERT INTO \"foobar\" (\"name\")\n    VALUES (foo)\n-------------------------------------------------------------------------------\n```\n\n### SetRequestDebugMiddleware\n\nmiddleware to add debug bool attribute to request object.\nMore info: [./debug/README.creole](https://github.com/jedie/django-tools/blob/master/django_tools/debug/README.creole)\n\n### TracebackLogMiddleware\n\nPut traceback in log by call [logging.exception()](https://docs.python.org/3/library/logging.html#logging.Logger.exception) on `process_exception()`\nActivate with:\n```\nMIDDLEWARE_CLASSES = (\n    ...\n    'django_tools.middlewares.TracebackLogMiddleware.TracebackLogMiddleware',\n    ...\n)\n```\n\n### FnMatchIps() - Unix shell-style wildcards in INTERNAL_IPS / ALLOWED_HOSTS\n\nsettings.py e.g.:\n```\nfrom django_tools.settings_utils import FnMatchIps\n\nINTERNAL_IPS = FnMatchIps([\"127.0.0.1\", \"::1\", \"192.168.*.*\", \"10.0.*.*\"])\nALLOWED_HOSTS = FnMatchIps([\"127.0.0.1\", \"::1\", \"192.168.*.*\", \"10.0.*.*\"])\n```\n\n### StdoutStderrBuffer()\n\nredirect stdout + stderr to a string buffer. e.g.:\n```\nfrom django_tools.unittest_utils.stdout_redirect import StdoutStderrBuffer\n\nwith StdoutStderrBuffer() as buffer:\n    print(\"foo\")\noutput = buffer.get_output() # contains \"foo\\n\"\n```\n\n### Management commands\n\n#### permission_info\n\nList all permissions for one django user.\n(Needs `'django_tools'` in INSTALLED_APPS)\n\ne.g.:\n```\n$ ./manage.py permission_info\nNo username given!\n\nAll existing users are:\nfoo, bar, john, doe\n\n$ ./manage.py permission_info foo\nAll permissions for user 'test_editor':\n\tis_active    : yes\n\tis_staff     : yes\n\tis_superuser : no\n[*] admin.add_logentry\n[*] admin.change_logentry\n[*] admin.delete_logentry\n[ ] auth.add_group\n[ ] auth.add_permission\n[ ] auth.add_user\n...\n```\n\n#### logging_info\n\nShows a list of all loggers and marks which ones are configured in settings.LOGGING:\n```\n$ ./manage.py logging_info\n```\n\n#### nice_diffsettings\n\nSimilar to django 'diffsettings', but used pretty-printed representation:\n```\n$ ./manage.py nice_diffsettings\n```\n\n#### database_info\n\nJust display some information about the used database and connections:\n```\n$ ./manage.py database_info\n```\n\n#### list_models\n\nJust list all existing models in app_label.ModelName format. Useful to use this in 'dumpdata' etc:\n```\n$ ./manage.py list_models\n```\n\n### ..all others…\n\nThere exist many miscellaneous stuff. Look in the source, luke!\n\n## Backwards-incompatible changes\n\nOld changes archived in git history here:\n\n\n* [\u003e=v0.47](https://github.com/jedie/django-tools/tree/v0.49.0#backwards-incompatible-changes)\n* [\u003e=v0.35](https://github.com/jedie/django-tools/tree/v0.35.0#backwards-incompatible-changes)\n\n### v0.51\n\nAll Selenium helper are deprecated, please migrate to [Playwright](https://playwright.dev/python/) ;)\n\n### v0.50\n\nRemoved old selenium helper function, [deprecated since v0.43](https://github.com/jedie/django-tools/tree/v0.43.0#v043)\n\nMake all Selenium web driver instances persistent for the complete test run session.\nThis speedup tests and fixed some bugs in Selenium.\n\nThis result in the same browser/webdriver settings for all test classes!\n\n### v0.55\n\nMove supported Django/Python min. versions to:\n* Django 4.1, 4.2, 5.1\n* Python 3.11, 3.12\n\n\n## Django compatibility\n\n| django-tools     | django version | python          |\n|------------------|----------------|-----------------|\n| \u003e= v0.56.0       | 4.1, 4.2, 5.1  | 3.11, 3.12      |\n| \u003e= v0.52.0       | 3.2, 4.0, 4.1  | 3.8, 3.9, 3.10  |\n| \u003e= v0.50.0       | 2.2, 3.2, 4.0  | 3.8, 3.9, 3.10  |\n| \u003e= v0.49.0       | 2.2, 3.1, 3.2  | 3.7, 3.8, 3.9   |\n| \u003e= v0.47.0       | 2.2, 3.0, 3.1  | \u003e= 3.6, pypy3   |\n| \u003e= v0.39         | 1.11, 2.0      | 3.5, 3.6, pypy3 |\n| \u003e= v0.38.1       | 1.8, 1.11      | 3.5, 3.6, pypy3 |\n| \u003e= v0.38.0       | 1.8, 1.11      | 3.5, 3.6        |\n| \u003e= v0.37.0       | 1.8, 1.11      | 3.4, 3.5        |\n| \u003e= v0.33.0       | 1.8, 1.11      | 2.7, 3.4, 3.5   |\n| v0.30.1-v0.32.14 | 1.8, 1.9, 1.10 | 2.7, 3.4, 3.5   |\n| v0.30            | 1.8, 1.9       | 2.7, 3.4        |\n| v0.29            | 1.6 - 1.8      | 2.7, 3.4        |\n| v0.26            | \u003c=1.6          |                 |\n| v0.25            | \u003c=1.4          |                 |\n\n(See also combinations for [tox in pyproject.toml](https://github.com/jedie/django-tools/blob/master/pyproject.toml))\n\n## history\n\n[comment]: \u003c\u003e (✂✂✂ auto generated history start ✂✂✂)\n\n* [v0.56.2](https://github.com/jedie/django-tools/compare/v0.56.1...v0.56.2)\n  * 2024-08-25 - Bugfix: Remove empty package that shadows existing codes\n* [v0.56.1](https://github.com/jedie/django-tools/compare/v0.56.0...v0.56.1)\n  * 2024-08-25 - Use typeguard in tests\n  * 2024-08-25 - Use cli_base update-readme-history\n  * 2024-08-25 - Update via manageprojects\n* [v0.56.0](https://github.com/jedie/django-tools/compare/v0.54.0...v0.56.0)\n  * 2024-08-25 - Bugfix local test run with a real terminal ;)\n  * 2024-08-25 - Fix CI\n  * 2023-04-10 - Upgrade: use managed-django-projec, Remove deprecations, update supported versions\n* [v0.54.0](https://github.com/jedie/django-tools/compare/v0.53.0...v0.54.0)\n  * 2022-09-15 - Bugfix version check\n  * 2022-08-23 - Replace README.creole with README.md\n  * 2022-08-26 - Run safety check in CI\n  * 2022-08-25 - NEW: SyslogHandler for easy logging to syslog\n\n\u003cdetails\u003e\u003csummary\u003eExpand older history entries ...\u003c/summary\u003e\n\n* [v0.53.0](https://github.com/jedie/django-tools/compare/v0.52.0...v0.53.0)\n  * 2022-08-18 - v0.53.0\n  * 2022-08-18 - fix readme\n  * 2022-08-18 - Fix tests\n  * 2022-08-18 - order and clean run server kwargs\n  * 2022-08-18 - fix gitignore\n  * 2022-08-18 - fix tox run\n  * 2022-08-18 - Bugfix Python 3.8 support\n  * 2022-08-18 - polish run_testserver command\n  * 2022-08-18 - update test project settings\n  * 2022-08-18 - Fix \"database_info\" command and pprint to self.stdout stream\n  * 2022-08-18 - Fix manage.sh by set \"local\" settings\n  * 2022-08-18 - run-server: do not make stderr output -\u003e use style\n  * 2022-08-18 - NEW: MassContextManagerBase, DenyStdWrite + Updated: StdoutStderrBuffer\n* [v0.52.0](https://github.com/jedie/django-tools/compare/v0.51.0...v0.52.0)\n  * 2022-08-17 - code cleanup\n  * 2022-08-17 - Restrict `AlwaysLoggedInAsSuperUserMiddleware` to the admin.\n  * 2022-08-17 - Move `run_testserver` management command from `django_tools_test_app` to `django_tools` and polish it.\n  * 2022-07-02 - speedup CI\n  * 2022-08-16 - fix tox and CI\n  * 2022-08-16 - Update requirements\n  * 2022-08-12 - Test with Django 3.2, 4.0 and 4.1\n  * 2022-08-12 - fix code style\n* [v0.51.0](https://github.com/jedie/django-tools/compare/v0.50.0...v0.51.0)\n  * 2022-07-26 - NEW: check_editor_config() + release as v0.51.0\n  * 2022-07-26 - fix wrong editor config\n  * 2022-07-26 - Add fancy icons to README\n  * 2022-07-15 - Update requirements\n  * 2022-07-02 - NEW: Playwright base Unittest class and login helper\n  * 2022-07-02 - DEPRECATE all Selenium helper\n  * 2022-07-02 - use: codecov/codecov-action@v2\n* [v0.50.0](https://github.com/jedie/django-tools/compare/v0.49.0...v0.50.0)\n  * 2022-05-29 - Update requirements\n  * 2022-05-29 - fix Makefile\n  * 2022-05-16 - replace assert_html_snapshot with assert_html_response_snapshot\n  * 2022-05-16 - fix code style\n  * 2022-04-15 - Update pythonapp.yml\n  * 2022-02-05 - Enable console log output in *.log file\n  * 2022-02-05 - Refactor selenium helper and use webdriver-manager to setup the webdriver\n  * 2022-02-05 - Update publish.py\n  * 2022-02-05 - lower max line length to 100\n  * 2022-02-05 - Remove linting in github actions, because it's done via pytest plugins\n  * 2022-01-30 - Update README\n  * 2022-01-30 - Expand tests with Python 3.10 and Django 4.0\n  * 2022-01-30 - Use darker as code formatter\n  * 2022-01-13 - Fix github actions\n  * 2022-01-13 - Apply flynt run\n  * 2022-01-13 - Move flynt settings into pyproject.toml\n* [v0.49.0](https://github.com/jedie/django-tools/compare/v0.48.3...v0.49.0)\n  * 2021-11-22 - Refactor selenium helper:\n  * 2021-11-22 - log the found executable\n  * 2021-11-22 - Remove w3c change\n  * 2021-11-22 - change webdriver local to 'en_US.UTF-8'\n  * 2021-11-22 - Fix #21 Set chrome accept_languages in headless mode\n  * 2021-11-21 - fix test\n  * 2021-11-20 - NEW: Model Version Protect\n  * 2021-11-21 - Update selenium test helper\n  * 2021-11-21 - update README\n  * 2021-11-21 - refactor CI\n  * 2021-11-21 - Remove Python 3.6\n  * 2021-11-21 - Update pythonapp.yml\n  * 2021-11-21 - Refactor settings and move all project test files\n  * 2021-11-21 - update project urls.py\n  * 2021-11-21 - remove migration tests\n  * 2021-11-21 - Pass current envrionment in call_manage_py()\n  * 2021-11-20 - Bugfix test project\n  * 2021-11-21 - NEW: AlwaysLoggedInAsSuperUserMiddleware\n  * 2021-11-21 - Update README and check if \"make\" help always up2date\n  * 2021-11-21 - Fix code style and make targets for this\n  * 2021-11-21 - Update Makefile\n  * 2021-11-21 - Refactor selenium test helpers\n  * 2021-11-21 - code style\n  * 2021-11-21 - copy DesiredCapabilities dict\n  * 2021-11-21 - Fix make \"lint\" + \"fix-code-style\" and run fixing by tests\n  * 2021-11-20 - Bugfix selenium chrome tests on github\n  * 2021-11-20 - Bugfix tests: remove aboslute path from snapshots\n  * 2021-11-20 - try to install chromedriver and geckodriver via seleniumbase in CI\n  * 2021-11-20 - fix typo in log message\n  * 2021-11-20 - Django update: smart_text() -\u003e smart_str()\n  * 2021-11-20 - use snapshot tests\n  * 2021-11-20 - sync README\n  * 2021-11-20 - Add \"bx_py_utils\" and use snapshot in tests\n  * 2021-11-20 - Update README.creole\n  * 2021-11-20 - Update tests\n  * 2021-11-20 - Bugfix isolated_filesystem: It doesn't work as class decorator!\n  * 2021-11-20 - Modernize the test project\n  * 2021-11-20 - Update test\n  * 2021-11-20 - Add poetry.lock and update requirements\n  * 2021-11-20 - move tests\n* [v0.48.3](https://github.com/jedie/django-tools/compare/v0.48.2...v0.48.3)\n  * 2020-12-20 - NEW: ImageDummy().in_memory_image_file() useful for e.g.: POST a image upload via Django's test client\n* [v0.48.2](https://github.com/jedie/django-tools/compare/v0.48.1...v0.48.2)\n  * 2020-12-06 - relase as v0.48.2\n  * 2020-12-06 - test 0.48.2rc2\n  * 2020-12-06 - Handle if user token not exists\n  * 2020-12-06 - change \"serve_media_app\" migration: Create UserMediaTokenModel for existing users\n* [v0.48.1](https://github.com/jedie/django-tools/compare/v0.48.0...v0.48.1)\n  * 2020-12-06 - add .../serve_media_app/migrations/0001_initial.py\n  * 2020-12-06 - add ./manage.sh helper\n* [v0.48.0](https://github.com/jedie/django-tools/compare/v0.47.0...v0.48.0)\n  * 2020-12-06 - fist 'fix-code-style' then 'pytest'\n  * 2020-12-06 - fix code style\n  * 2020-12-06 - update README\n  * 2020-12-06 - fix and update tests\n  * 2020-12-06 - Add more info in logging output\n  * 2020-12-06 - Add a note to \"pytest-randomly\"\n  * 2020-12-06 - Support app config entries in get_filtered_apps()\n  * 2020-12-06 - bugfix test project urls setup\n  * 2020-11-27 - Update README.md\n  * 2020-11-27 - NEW: \"Serve User Media File\" reuseable app\n  * 2020-11-27 - NEW: django_tools.unittest_utils.signals.SignalsContextManager\n  * 2020-11-27 - Change `ImageDummy` and make `text` optional\n* [v0.47.0](https://github.com/jedie/django-tools/compare/v0.46.1...v0.47.0)\n  * 2020-11-26 - code style\n  * 2020-11-26 - fix test setup and github actions\n  * 2020-11-26 - update AUTHORS\n  * 2020-11-26 - update .gitignore\n  * 2020-11-26 - Update README and set v0.47.dev0\n  * 2020-11-26 - expand tox envlist, bugfix coverage settings and pytest call\n  * 2020-11-26 - fix DjangoCommandMixin\n  * 2020-11-26 - remove LoggingBuffer and update tests\n  * 2020-11-26 - NEW: assert_in_logs()\n  * 2020-11-26 - remove warnings check (Because of warnings from external apps)\n  * 2020-11-26 - force_text -\u003e force_str\n  * 2020-11-26 - NEW: assert_warnings() and assert_no_warnings()\n  * 2020-11-26 - fix test_set_env()\n  * 2020-11-26 - use os.environ.setdefault\n  * 2020-11-26 - ugettext -\u003e gettext\n  * 2020-11-26 - remove assertment\n  * 2020-11-26 - Update some django imports for new django version\n  * 2020-11-26 - update test_update_rst_readme()\n  * 2020-11-26 - update pyproject.toml and move some external meta config files\n  * 2020-11-05 - Disable fail-fast\n  * 2020-11-05 - Fix broken UTs\n  * 2020-11-05 - Ignore non-test files\n  * 2020-11-05 - Ignore doctest import errors\n  * 2020-11-05 - Fix two import errors\n  * 2020-11-05 - Fix version compare\n  * 2020-09-06 - CHORE: Add django 3.1 compatibility\n  * 2020-11-05 - Trigger test job on pull_request event\n  * 2020-11-05 - Fix broken UT due to deprecated options of pytest\n  * 2020-07-04 - use f-strings\n  * 2020-07-04 - render_to_response() -\u003e render()\n  * 2020-07-04 - update README.rst\n  * 2020-07-04 - add github action badge\n  * 2020-07-04 - Add \"make update\"\n  * 2020-07-04 - Update README.creole\n  * 2019-04-03 - Add files via upload\n  * 2019-04-03 - Delete logo_white.png\n  * 2019-04-03 - Delete logo_black.png\n  * 2019-04-03 - Delete logo.png\n* [v0.46.1](https://github.com/jedie/django-tools/compare/v0.46.0...v0.46.1)\n  * 2020-02-19 - Fix manage tests\n  * 2020-02-19 - fixup! use shutil.which() in SeleniumChromiumTestCase()\n  * 2020-02-19 - set \"accept_languages\" and disable \"headless\" mode\n  * 2020-02-19 - use shutil.which() in SeleniumChromiumTestCase()\n  * 2020-02-19 - NEW: \"django_tools.middlewares.LogHeaders.LogRequestHeadersMiddleware\"\n  * 2020-02-19 - bugfix running test project dev. server\n  * 2020-02-19 - merge code by using test code from poetry-publish\n  * 2020-02-19 - less restricted dependency specification\n* [v0.46.0](https://github.com/jedie/django-tools/compare/v0.45.3...v0.46.0)\n  * 2020-02-13 - update README and release as v0.46.0\n  * 2020-02-13 - work-a-round for failed test on github...\n  * 2020-02-13 - WIP: Fix github CI\n  * 2020-02-13 - +django_tools_tests/test_project_setup.py\n  * 2020-02-13 - don't publish if README is not up-to-date\n  * 2020-02-13 - use tox-gh-actions on github CI\n  * 2020-02-13 - enable linting on CI\n  * 2020-02-13 - fix code style\n  * 2020-02-13 - code cleanup: remove six stuff\n  * 2020-02-13 - apply code style\n  * 2020-02-13 - update Makefile\n  * 2020-02-13 - apply pyupgrade\n  * 2020-02-13 - update tests\n  * 2020-02-13 - Bugfix: Don't set settings.MEDIA_ROOT in DocTest\n  * 2020-02-13 - use f-strings\n  * 2020-02-13 - update selenium test\n  * 2020-02-13 - update test setup\n  * 2020-02-13 - remove \"dynamic_site\"\n  * 2020-02-12 - WIP: use poetry\n  * 2020-02-12 - remove lxml and use bleach.clean() in html2text()\n  * 2020-02-12 - Update requirements-dev.txt\n* [v0.45.3](https://github.com/jedie/django-tools/compare/v0.45.2...v0.45.3)\n  * 2019-08-25 - release v0.45.3\n  * 2019-08-25 - Add \"excepted_exit_code\" into DjangoCommandMixin methods\n* [v0.45.2](https://github.com/jedie/django-tools/compare/v0.45.1...v0.45.2)\n  * 2019-06-25 - update test settings: MIDDLEWARE_CLASSES -\u003e MIDDLEWARE\n  * 2019-06-25 - add: ThrottledAdminEmailHandler\n  * 2019-06-13 - Bugfix wrong BaseUnittestCase.assertEqual_dedent() refactoring\n* [v0.45.1](https://github.com/jedie/django-tools/compare/v0.45.0...v0.45.1)\n  * 2019-04-03 - Bugfix print_mailbox if attachment is MIMEImage instance\n  * 2019-04-01 - code cleanup\n* [v0.45.0](https://github.com/jedie/django-tools/compare/v0.44.2...v0.45.0)\n  * 2019-04-01 - __version__ = \"0.45.0\"\n  * 2019-04-01 - Update README.creole\n  * 2019-04-01 - bugfix: str() needed for python 3.5\n  * 2019-04-01 - +=== OverwriteFileSystemStorage\n  * 2019-04-01 - move \"assert_equal_dedent\" and \"assert_in_dedent\"\n  * 2019-03-30 - use assert_pformat_equal for assertEqual_dedent, too\n  * 2019-03-30 - only code formatting with black\n  * 2019-03-30 - NEW: OverwriteFileSystemStorage\n  * 2019-03-30 - new: assert_pformat_equal\n  * 2019-03-30 - use python-colorlog\n  * 2019-03-26 - NEW: {{{print_exc_plus()}}} - traceback with a listing of all the local variables\n  * 2019-02-21 - Update email.py\n  * 2019-02-21 - handle attachments/alternatives in unittest_utils.email.print_mailbox\n* [v0.44.2](https://github.com/jedie/django-tools/compare/v0.44.1...v0.44.2)\n  * 2019-01-02 - typo in docstring\n  * 2019-01-02 - only code formatting\n  * 2019-01-02 - work-a-round for: https://github.com/andymccurdy/redis-py/issues/995\n  * 2019-01-02 - python3 + code formatting\n* [v0.44.1](https://github.com/jedie/django-tools/compare/v0.44.0...v0.44.1)\n  * 2019-01-02 - only code formatting\n  * 2019-01-02 - Don't deactivate existing log handler, just append the buffer handler.\n* [v0.44.0](https://github.com/jedie/django-tools/compare/v0.43.2...v0.44.0)\n  * 2018-12-13 - NEW: {{{django_file = ImageDummy().create_django_file_info_image(text=\"\")}}}\n  * 2018-12-13 - mockup.ImageDummy: remove old API + make it useable without django-filer\n* [v0.43.2](https://github.com/jedie/django-tools/compare/v0.43.1...v0.43.2)\n  * 2018-12-11 - Bugfix Selenium refactor: Use the class with the same functionality if old usage places are used.\n* [v0.43.1](https://github.com/jedie/django-tools/compare/v0.43.0...v0.43.1)\n  * 2018-12-11 - v0.43.1 - Bugfix: Selenium test cases: clear window.localStorage after test run\n* [v0.43.0](https://github.com/jedie/django-tools/compare/v0.42.4...v0.43.0)\n  * 2018-12-11 - NEW: Selenium helper to access window.localStorage\n  * 2018-12-11 - Split selenium test cases: with and without Django StaticLiveServerTestCase\n  * 2018-12-11 - only code cleanup\n  * 2018-12-11 - bugfix test_filter_and_log_warnings_create_warning()\n  * 2018-12-11 - move selenium helpers\n  * 2018-12-11 - add DeprecationWarning decorators\n* [v0.42.4](https://github.com/jedie/django-tools/compare/v0.42.3...v0.42.4)\n  * 2018-10-12 - bugfix: Some auth backends needs request object (e.g.: django-axes)\n  * 2018-10-12 - only code cleanup\n* [v0.42.3](https://github.com/jedie/django-tools/compare/v0.42.2...v0.42.3)\n  * 2018-10-10 - v0.42.3\n  * 2018-10-10 - update old tests\n  * 2018-10-10 - ADD: assert is dir/file and assert_path_not_exists\n* [v0.42.2](https://github.com/jedie/django-tools/compare/v0.42.1...v0.42.2)\n  * 2018-09-18 - NEW: assert_installed_apps() - Check entries in settings.INSTALLED_APPS\n  * 2018-09-18 - +DeprecationWarning\n* [v0.42.1](https://github.com/jedie/django-tools/compare/v0.42.0...v0.42.1)\n  * 2018-09-17 - release v0.42.1\n  * 2018-09-17 - NEW: django_tools.unittest_utils.assertments.assert_language_code\n* [v0.42.0](https://github.com/jedie/django-tools/compare/v0.41.0...v0.42.0)\n  * 2018-09-07 - update tests\n  * 2018-09-07 - v0.42.0\n  * 2018-09-07 - move manage commands \"list_models\" and \"nice_diffsettings\"\n  * 2018-09-07 - update README\n  * 2018-09-07 - remove old Backwards-incompatible changes entries from README\n  * 2018-09-07 - bugfix email tests\n  * 2018-09-07 - remove all celery helper\n  * 2018-09-06 - Create logging_info.py\n  * 2018-09-05 - +print_celery_info()\n  * 2018-09-05 - fixup! check if task runs async by check if returned obj is AsyncResult\n  * 2018-09-05 - default change to not eager mode\n  * 2018-09-05 - check if task runs async by check if returned obj is AsyncResult\n  * 2018-09-05 - test_task() -\u003e on_message_test_task()\n  * 2018-09-05 - use async_result.wait() with timeout as work-a-round for: https://github.com/celery/celery/issues/5034\n  * 2018-09-05 - +note about https://github.com/celery/celery/issues/5034\n  * 2018-09-05 - work-a-round for https://github.com/celery/celery/issues/5033\n  * 2018-09-05 - WIP: celery task unittest helpers\n  * 2018-09-05 - pluggy\u003e0.7 for https://github.com/pytest-dev/pytest/issues/3753\n* [v0.41.0](https://github.com/jedie/django-tools/compare/v0.40.6...v0.41.0)\n  * 2018-08-28 - v0.41.0\n  * 2018-08-28 - update test project and tests\n  * 2018-08-28 - add test assertments\n  * 2018-08-28 - remove obsolete tests\n  * 2018-08-28 - NEW: unittest_utils/assertments.py\n  * 2018-08-28 - remove the @task_always_eager() decorator.\n* [v0.40.6](https://github.com/jedie/django-tools/compare/v0.40.5...v0.40.6)\n  * 2018-08-28 - v0.40.6\n  * 2018-08-28 - code style update\n  * 2018-08-28 - Bugfix @task_always_eager() decorator\n* [v0.40.5](https://github.com/jedie/django-tools/compare/v0.40.4...v0.40.5)\n  * 2018-08-27 - release 0.40.5\n  * 2018-08-27 - Bugfix: Use given manage.py filename\n* [v0.40.4](https://github.com/jedie/django-tools/compare/v0.40.3...v0.40.4)\n  * 2018-08-21 - release v0.40.4\n  * 2018-08-21 - +test default value +test delete value\n  * 2018-08-21 - Update README.creole\n  * 2018-08-21 - NEW: django_tools.debug.delay\n* [v0.40.3](https://github.com/jedie/django-tools/compare/v0.40.2...v0.40.3)\n  * 2018-07-18 - update README\n  * 2018-07-18 - enhance selenium test cases\n* [v0.40.2](https://github.com/jedie/django-tools/compare/v0.40.1...v0.40.2)\n  * 2018-07-04 - release v0.40.2\n  * 2018-07-04 - Fix tests, see: https://travis-ci.org/jedie/django-tools/jobs/400136378\n  * 2018-07-04 - Skip own selenium tests, if driver not available\n  * 2018-07-04 - Bugfix selenium Test Case if driver is None\n  * 2018-07-04 - code cleanup\n  * 2018-07-04 - add yapf style config\n  * 2018-07-04 - Update for django API change\n* [v0.40.1](https://github.com/jedie/django-tools/compare/v0.40.0...v0.40.1)\n  * 2018-06-28 - Bugfix selenium test case if executable can't be found.\n  * 2018-06-18 - Add django bug ticket links, too.\n* [v0.40.0](https://github.com/jedie/django-tools/compare/v0.39.6...v0.40.0)\n  * 2018-06-14 - +== try-out\n  * 2018-06-14 - setup django requirements\n  * 2018-06-14 - add example code into README\n  * 2018-06-14 - +chromium_available() and firefox_available()\n  * 2018-06-14 - update DocTests\n  * 2018-06-14 - typo in \"executable\"\n  * 2018-06-14 - try without \"MOZ_HEADLESS=1\" because \"headless\" set here:\n  * 2018-06-14 - cleanup\n  * 2018-06-14 - fixup! fix travis CI: install geckodriver\n  * 2018-06-14 - fix travis CI: install geckodriver\n  * 2018-06-14 - fixup! try to fix travis and chromedriver\n  * 2018-06-14 - +SeleniumFirefoxTestCase and more docs\n  * 2018-06-14 - try to fix travis and chromedriver\n  * 2018-06-13 - fixup! try to find the webdriver executeable\n  * 2018-06-13 - try to find the webdriver executeable\n  * 2018-06-13 - +django-debug-toolbar\n  * 2018-06-13 - Add selenium test cases, fix test project and tests\n  * 2018-06-13 - just add admindocs and flatpages into test project settings\n  * 2018-06-13 - better error messages\n* [v0.39.6](https://github.com/jedie/django-tools/compare/v0.39.5...v0.39.6)\n  * 2018-05-04 - README\n  * 2018-05-04 - Don't hide Autofields\n  * 2018-05-04 - code style cleanup\n* [v0.39.5](https://github.com/jedie/django-tools/compare/v0.39.4...v0.39.5)\n  * 2018-04-24 - +nargs=\"?\"\n  * 2018-04-24 - yield sorted\n  * 2018-04-24 - we add \"admin_tools\"\n  * 2018-04-24 - Update README.creole\n  * 2018-04-24 - NEW: Model unittest code generator as admin action and manage command\n  * 2018-04-24 - update pytest and use new --new-first\n  * 2018-04-06 - clarify what CutPathnameLogRecordFactory does\n* [v0.39.4](https://github.com/jedie/django-tools/compare/v0.39.3...v0.39.4)\n  * 2018-04-06 - NEW: FilterAndLogWarnings and CutPathnameLogRecordFactory\n* [v0.39.3](https://github.com/jedie/django-tools/compare/v0.39.2...v0.39.3)\n  * 2018-03-22 - add kwarg 'exclude_actions' to get_filtered_permissions\n* [v0.39.2](https://github.com/jedie/django-tools/compare/v0.39.1...v0.39.2)\n  * 2018-03-22 - NEW: ParlerDummyGenerator + iter_languages\n* [v0.39.1](https://github.com/jedie/django-tools/compare/v0.39.0...v0.39.1)\n  * 2018-03-19 - ignore 'pypy3-django111' failure\n  * 2018-03-19 - remove obsolete code\n  * 2018-03-19 - return result from SendMailCelery().send()\n  * 2018-03-19 - +test_SendMailCelery_more_mails()\n  * 2018-03-19 - +django_tools.unittest_utils.email.print_mailbox()\n  * 2018-03-11 - Update setup.py\n* [v0.39.0](https://github.com/jedie/django-tools/compare/v0.38.9...v0.39.0)\n  * 2018-03-02 - run tests with django 2.0 instead of django 1.8\n  * 2018-03-02 - Bugfix for python \u003c=3.5\n  * 2018-03-02 - django_tools/unittest_utils/{celery.py =\u003e celery_utils.py}\n  * 2018-03-02 - update history\n  * 2018-03-02 - +Isolated Filesystem decorator / context manager\n  * 2018-02-19 - +.pytest_cache\n  * 2018-02-19 - update tests\n  * 2018-02-19 - remove Py2 stuff\n* [v0.38.9](https://github.com/jedie/django-tools/compare/v0.38.8...v0.38.9)\n  * 2018-02-05 - lowering log level \"error\" -\u003e \"debug\" on missing permissions\n* [v0.38.8](https://github.com/jedie/django-tools/compare/v0.38.7...v0.38.8)\n  * 2018-02-05 - release v0.38.8\n  * 2018-02-05 - bugfix compare link\n  * 2018-02-05 - use from celery import shared_task instead of djcelery_transactions\n  * 2018-02-05 - +skip_missing_interpreters = True\n  * 2018-01-19 - better error message if app label not found in get_filtered_permissions()\n* [v0.38.7](https://github.com/jedie/django-tools/compare/v0.38.6...v0.38.7)\n  * 2018-01-15 - Add missing arguments (like \"attachments\", \"cc\" etc.) to SendMailCelery\n* [v0.38.6](https://github.com/jedie/django-tools/compare/v0.38.5...v0.38.6)\n  * 2018-01-08 - update README\n  * 2018-01-08 - add POST data to browser debug\n  * 2018-01-08 - better sort\n  * 2018-01-08 - remove duplicate entries from template list\n  * 2018-01-03 - +./manage.py clear_cache\n* [v0.38.5](https://github.com/jedie/django-tools/compare/v0.38.4...v0.38.5)\n  * 2018-01-02 - +test_wrong_messages()\n  * 2018-01-02 - NEW: assertMessages()\n* [v0.38.4](https://github.com/jedie/django-tools/compare/v0.38.3...v0.38.4)\n  * 2017-12-28 - Bugfix attach user group on existing user\n* [v0.38.3](https://github.com/jedie/django-tools/compare/v0.38.2...v0.38.3)\n  * 2017-12-28 - remove permissions, too\n* [v0.38.2](https://github.com/jedie/django-tools/compare/v0.38.1...v0.38.2)\n  * 2017-12-27 - add: ./manage.py update_permissions\n  * 2017-12-27 - +Helper to start pytest with arguments\n  * 2017-12-27 - use log.exception() if permission not found\n* [v0.38.1](https://github.com/jedie/django-tools/compare/v0.38.0...v0.38.1)\n  * 2017-12-21 - Update setup.py\n  * 2017-12-20 - + coveralls\n  * 2017-12-20 - cleanup\n  * 2017-12-20 - use pypy3 ans -tox-travis\n  * 2017-12-20 - refactor travis/tox/pytest\n  * 2017-12-20 - don't test with unsupported django versions\n  * 2017-12-20 - update travis/tox config and try to tests with more django versions\n  * 2017-12-20 - Fix Tests, see:\n  * 2017-12-20 - Update .travis.yml\n* [v0.38.0](https://github.com/jedie/django-tools/compare/v0.37.0...v0.38.0)\n  * 2017-12-19 - use python3\n  * 2017-12-19 - +test_get_or_create_user_and_group()\n  * 2017-12-19 - test with python 3.5 and 3.6\n  * 2017-12-19 - update README\n  * 2017-12-19 - work-around for https://github.com/travis-ci/travis-ci/issues/4794\n  * 2017-12-19 - split user and group creation code\n  * 2017-12-19 - +get_or_create_user_and_group()\n  * 2017-12-14 - +BaseUnittestCase.get_admin_add_url()\n  * 2017-12-13 - Bugfix tests\n  * 2017-12-13 - NEW: BaseUnittestCase.get_admin_change_url()\n  * 2017-12-13 - if print_filtered_html: print used template\n  * 2017-12-12 - NEW: BaseUnittestCase.assert_startswith() and BaseUnittestCase.assert_endswith()\n* [v0.37.0](https://github.com/jedie/django-tools/compare/v0.36.0...v0.37.0)\n  * 2017-12-08 - +print_filtered_html\n  * 2017-12-08 - add \"dir\" agument to debug_response()\n  * 2017-12-07 - unify permission sort\n  * 2017-12-07 - Use always the permission format from user.has_perm(): \"\u003cappname\u003e.\u003ccodename\u003e\"\n  * 2017-12-07 - NEW: get_filtered_permissions() and pprint_filtered_permissions()\n  * 2017-12-05 - Bugfix TypeError: expected string or bytes-like object\n  * 2017-12-05 - Bugfix ALLOWED_HOSTS support\n  * 2017-12-05 - Add tests for django_tools.settings_utils.FnMatchIps\n  * 2017-12-05 - rename InternalIps to FnMatchIps and make it useable for ALLOWED_HOSTS, too.\n  * 2017-12-04 - Add DocString\n  * 2017-12-04 - Skip official support for python v2 (remove from text matrix)\n  * 2017-12-04 - Don't test with django 2.0, yet.\n  * 2017-12-04 - fixup! +on_delete\n  * 2017-12-04 - +on_delete\n  * 2017-12-04 - refactor test user stuff\n  * 2017-12-01 - NEW: ./manage.py permission_info\n  * 2017-11-22 - Bugfix Py2\n  * 2017-11-22 - update README\n  * 2017-11-22 - create coverage html report\n  * 2017-11-22 - bugfix/enhance permission stuff\n  * 2017-11-22 - work-a-round for sqlite\n  * 2017-11-22 - Raise AssertionError in DEBUG mode if permission doesn't exists\n* [v0.36.0](https://github.com/jedie/django-tools/compare/v0.35.0...v0.36.0)\n  * 2017-11-20 - +author_email\n  * 2017-11-20 - Call also \"./setup.py check\"\n  * 2017-11-20 - raise error also if \"publish\" command runs\n  * 2017-11-20 - update \"./setup.py publish\" code\n  * 2017-11-20 - Update README.creole\n  * 2017-11-20 - Bugfix ModelPermissionMixin and add tests\n  * 2017-11-20 - Bugfix DocTests\n  * 2017-11-17 - completely deactivate dynamic site tests, see:\n  * 2017-11-17 - Bugfix TestUserFixtures() compare\n  * 2017-11-17 - Bugfix TestPermissions, see:\n  * 2017-11-17 - unify path before assertment, see:\n  * 2017-11-17 - fixup! Bugfix \"database_info\" test\n  * 2017-11-17 - Bugfix \"database_info\" test\n  * 2017-11-17 - display qslite module/lib version, too.\n  * 2017-11-17 - add codecov.io badge\n  * 2017-11-17 - +DocString tip\n  * 2017-11-17 - mark \"Dynamic SITE_ID middleware\" as unmaintained\n  * 2017-11-17 - Update .travis.yml\n  * 2017-10-20 - NEW: \"database_info\" manage command\n  * 2017-10-06 - Bugfix 'module' object has no attribute 'getLogRecordFactory' for Python \u003c v3.2\n  * 2017-10-06 - bugfix: https://travis-ci.org/jedie/django-tools/jobs/284216389\n  * 2017-10-06 - try to fix dynamic site by clean cache?!?\n  * 2017-10-06 - ADD: django_tools.unittest_utils.user.user_fixtures()\n  * 2017-10-06 - nicer log output\n  * 2017-10-04 - Bugfix ImageDummy.draw_centered_text() if text is multiline :(\n  * 2017-09-28 - \"migrate --list\" was removed in django 1.10\n  * 2017-09-28 - add some basic tests\n  * 2017-09-28 - add isort config\n  * 2017-09-28 - bugfix editorconfig: double config\n* [v0.35.0](https://github.com/jedie/django-tools/compare/v0.34.0...v0.35.0)\n  * 2017-09-26 - Refactor mockup picture creation\n* [v0.34.0](https://github.com/jedie/django-tools/compare/v0.33.0...v0.34.0)\n  * 2017-08-21 - Bugfix in mockup.create_pil_image: Created images has wrong sizes ;)\n  * 2017-08-17 - Use django_tools.unittest_utils.user.create_user()\n  * 2017-08-17 - Create test user via UserCreationForm to verify values\n  * 2017-08-08 - Bugfix: usernames should not contain spaces ;)\n* [v0.33.0](https://github.com/jedie/django-tools/compare/v0.32.14...v0.33.0)\n  * 2017-07-11 - Update render_template_file() for Django v1.11\n  * 2017-07-11 - fix travis\n  * 2017-07-11 - Run tests only against Django 1.8TLS and 1.11TLS\n  * 2017-07-11 - README, AUTHORS and set version to v0.32.15\n  * 2017-07-07 - Add support for new-style middleware.\n  * 2017-07-03 - NEW: django_tools.utils.request.create_fake_request()\n  * 2017-07-03 - +install_requires \"lxml\"\n  * 2017-06-30 - NEW: django_tools.utils.html_utils.html2text()\n  * 2017-06-22 - Bugfix ModelPermissionMixin and add example to DocString\n  * 2017-06-21 - WIP: ModelPermissionMixin\n* [v0.32.14](https://github.com/jedie/django-tools/compare/v0.32.13...v0.32.14)\n  * 2017-06-14 - installed by setup.py\n  * 2017-06-14 - for Python 2 'mock\" backport is needed ;)\n* [v0.32.13](https://github.com/jedie/django-tools/compare/v0.32.12...v0.32.13)\n  * 2017-05-24 - add used requirements files ;)\n  * 2017-05-24 - update editorconfig\n  * 2017-05-24 - remove some test run warnings and cleanup\n* [v0.32.12](https://github.com/jedie/django-tools/compare/v0.32.11...v0.32.12)\n  * 2017-05-04 - +unicode_literals\n  * 2017-05-04 - fix tests for Python 2\n  * 2017-05-04 - NEW: self.assertIn_dedent()\n* [v0.32.11](https://github.com/jedie/django-tools/compare/v0.32.10...v0.32.11)\n  * 2017-05-02 - refactor\n* [v0.32.10](https://github.com/jedie/django-tools/compare/v0.32.9...v0.32.10)\n  * 2017-05-02 - remove old PyDev configs\n  * 2017-05-02 - move __version__\n  * 2017-05-02 - cleanup README\n  * 2017-05-02 - Update README.creole\n  * 2017-05-02 - assert that manage.py is executeable\n  * 2017-05-02 - update meta files\n  * 2017-05-02 - +django_tools.mail\n  * 2017-04-25 - It's a IndexError if no user exists ;)\n  * 2017-03-23 - add README\n* [v0.32.9](https://github.com/jedie/django-tools/compare/v0.32.8...v0.32.9)\n  * 2017-03-21 - bugfxi test: exclude line number ;)\n  * 2017-03-21 - add \"template doesn't exists\" test\n  * 2017-03-21 - fixup! Bugfix if TemplateDoesNotExist was raised\n  * 2017-03-21 - Bugfix if TemplateDoesNotExist was raised\n* [v0.32.8](https://github.com/jedie/django-tools/compare/v0.32.7...v0.32.8)\n  * 2017-03-16 - bugfix: remove request after exception\n  * 2017-03-16 - +=== django_tools.template.loader.DebugCacheLoader\n  * 2017-03-16 - fix unittests\n  * 2017-03-16 - don't set max. version number\n  * 2017-03-16 - cleanup\n  * 2017-03-16 - Add debug template loader that add template name as html comment\n  * 2017-03-15 - update temp file prefix and cleanup\n* [v0.32.7](https://github.com/jedie/django-tools/compare/v0.32.6...v0.32.7)\n  * 2017-03-10 - + django_tools.permissions\n  * 2017-03-10 - cleanup\n  * 2017-03-06 - Use: unittest_utils.user.create_user() in tests\n  * 2017-03-03 - +=== create users\n  * 2017-03-03 - NEW: django_tools.unittest_utils.user\n* [v0.32.6](https://github.com/jedie/django-tools/compare/v0.32.5...v0.32.6)\n  * 2017-02-22 - set CELERY_EAGER_PROPAGATES_EXCEPTIONS=True, too\n* [v0.32.5](https://github.com/jedie/django-tools/compare/v0.32.4...v0.32.5)\n  * 2017-02-10 - Add 'template_name' to 'assertResponse'\n  * 2017-02-10 - add assertResponse() test\n* [v0.32.4](https://github.com/jedie/django-tools/compare/v0.32.3...v0.32.4)\n  * 2017-02-01 - test \"create users\"\n  * 2017-02-01 - Bugfix: set active flag on test users\n  * 2017-01-25 - Doesn't work in every case, but has been worked, see:\n* [v0.32.3](https://github.com/jedie/django-tools/compare/v0.32.2...v0.32.3)\n  * 2017-01-25 - just a helper to start pytest\n  * 2017-01-25 - +@task_always_eager() decorator\n  * 2017-01-25 - django-filer v1.2.6 was released\n  * 2017-01-25 - fix import error with python v2\n  * 2017-01-25 - ADD unittest helper '@task_always_eager()'\n  * 2017-01-25 - fix tests\n  * 2017-01-25 - refactor TemplateInvalidMixin to @set_string_if_invalid() decorator\n  * 2017-01-25 - +TemplateInvalidMixin\n  * 2017-01-25 - NEW: TemplateInvalidMixin\n  * 2017-01-19 - Fix UnicodeDecodeError in BrowserDebug\n* [v0.32.2](https://github.com/jedie/django-tools/compare/v0.32.1...v0.32.2)\n  * 2017-01-13 - link to testfile\n  * 2017-01-13 - NEW: django_tools.utils.url.GetDict\n* [v0.32.1](https://github.com/jedie/django-tools/compare/v0.32.0...v0.32.1)\n  * 2016-12-29 - +TracebackLogMiddleware\n* [v0.32.0](https://github.com/jedie/django-tools/compare/v0.31.0...v0.32.0)\n  * 2016-12-19 - NEW: django_tools.template.render.render_template_file\n  * 2016-12-19 - typo\n  * 2016-12-09 - whitespace cleanup\n  * 2016-12-09 - + @display_admin_error\n  * 2016-12-08 - change to app_label.ModelName format\n  * 2016-12-08 - +manage commands: nice_diffsettings \u0026 list_models\n  * 2016-12-08 - +cov\n  * 2016-12-08 - update tests\n  * 2016-12-08 - run pytest\n  * 2016-12-08 - remove doctest + cleanup\n  * 2016-12-08 - move doctests to unittests\n  * 2016-12-08 - remove outdated stuff\n  * 2016-12-07 - about pytest\n  * 2016-12-07 - WIP: use pytest-django\n* [v0.31.0](https://github.com/jedie/django-tools/compare/v0.30.4...v0.31.0)\n  * 2016-11-03 - move tests\n  * 2016-11-03 - work-a-round for https://github.com/divio/django-filer/issues/899\n  * 2016-11-03 - Update .travis.yml\n  * 2016-11-03 - fix test: domain name provided is not valid according to RFC 1034/1035\n  * 2016-11-03 - add Mockup utils to create dummy PIL/django-filer images with Text\n  * 2016-10-28 - fix tests:\n* [v0.30.4](https://github.com/jedie/django-tools/compare/v0.30.3...v0.30.4)\n  * 2016-10-27 - enhance DjangoCommandMixin:\n* [v0.30.3](https://github.com/jedie/django-tools/compare/v0.30.2...v0.30.3)\n  * 2016-10-27 - +requirements-dev.txt\n  * 2016-10-27 - +.../django-tools $ tox\n  * 2016-10-27 - +DjangoCommandMixin\n  * 2016-10-27 - +django_tools.unittest_utils.django_command\n* [v0.30.2](https://github.com/jedie/django-tools/compare/v0.30.1...v0.30.2)\n  * 2016-10-05 - Bugfix Python 2 compatibility\n  * 2016-09-13 - Update language classifiers to show python 3 support.\n* [v0.30.1](https://github.com/jedie/django-tools/compare/v0.30.0...v0.30.1)\n  * 2016-08-26 - allways coverage\n  * 2016-08-26 - update README\n  * 2016-08-26 - fix unittests for django v1.10\n  * 2016-08-26 - fix tox/travis settings\n  * 2016-08-26 - use tox in travis\n  * 2016-08-26 - v0.30.1 add 'DisableMigrations'\n* [v0.30.0](https://github.com/jedie/django-tools/compare/v0.29.5...v0.30.0)\n  * 2016-04-27 - v0.30.0\n  * 2016-04-27 - update from:\n  * 2016-04-27 - add naegelyd\n  * 2016-04-04 - Remove unused django.utils.unittest import\n  * 2016-04-04 - Revert \"Add flake8 to the local and Travis CI test process\"\n  * 2016-04-04 - Use ranges for Django versions in tox file\n  * 2016-04-02 - Add Python 3.4 to the tox envlist\n  * 2016-04-02 - Make sure setUpClass and tearDownClass call super methods\n  * 2016-04-02 - Update SQL test for Django 1.9\n  * 2016-04-02 - Use Python's importlib instead of Django's\n  * 2016-04-02 - Use Django 1.9 compatible cache accessor\n  * 2016-04-02 - Just use Python's logging module instead of django.utils.log\n  * 2016-04-02 - Ignore the raw_input reference in flake8\n  * 2016-04-02 - Only reference raw_input when using Python 2\n  * 2016-04-02 - Use Python 3 compatible open() to open file for write\n  * 2016-04-02 - Use Python 3 compatible sort kwarg\n  * 2016-04-01 - Update version to 0.30.0\n  * 2016-04-01 - Add flake8 to the local and Travis CI test process\n  * 2016-04-01 - Redirect both stdout and stderror like warning message says\n  * 2016-04-01 - Limit supported Django versions to 1.8 and 1.9\n  * 2016-04-01 - Fix filemanage subdir test\n  * 2016-04-01 - Construct the absolute URL from the base and rest URLs\n  * 2016-04-01 - Remove unnecessary assignment of rest_path\n  * 2016-04-01 - Use  module instead of /Users/donald/Sites/django-tools for group name retrieval\n  * 2016-04-01 - Fix and remove broken BaseFilesystemBrowser tests\n  * 2016-04-01 - Use self.absolute_path instead of missing self.abs_path\n  * 2016-04-01 - Add tox file\n  * 2016-04-01 - Add coverage_html to .gitignore\n  * 2016-04-01 - Ignore PyDev IDE files\n  * 2016-02-29 - Update README.creole\n* [v0.29.5](https://github.com/jedie/django-tools/compare/v0.29.4...v0.29.5)\n  * 2015-08-11 - +@python_2_unicode_compatible\n* [v0.29.4](https://github.com/jedie/django-tools/compare/v0.29.3...v0.29.4)\n  * 2015-08-11 - update from:\n  * 2015-08-11 - --source=django_tools\n  * 2015-08-11 - remove debug print\n  * 2015-08-10 - TODO: all should work!\n  * 2015-08-10 - Speedup tests\n  * 2015-08-10 - Don't mixin SimpleTestCase\n  * 2015-08-10 - simpler solution to run tests\n  * 2015-08-10 - http://docs.travis-ci.com/user/migrating-from-legacy/\n  * 2015-08-10 - Skip test in django 1.6\n  * 2015-08-10 - turn off logging in unittests\n  * 2015-08-10 - Install latest minor release of django\n  * 2015-08-10 - upgrade pip and see which django version will be installed\n  * 2015-08-10 - Bugfix for:\n  * 2015-08-10 - Fix some unittests imports for django 1.6\n  * 2015-08-10 - bugfix import for older django version and cleanup\n  * 2015-08-10 - country code will be change\n  * 2015-08-10 - run tests with django 1.6, too\n  * 2015-08-10 - update utils.http for older django versions and add unittests\n  * 2015-08-10 - bugfix running test in older django versions\n  * 2015-08-10 - Bugfix for older django version\n  * 2015-08-10 - remove old google links\n* [v0.29.3](https://github.com/jedie/django-tools/compare/v0.29.2...v0.29.3)\n  * 2015-08-08 - Clean up spelling and grammar\n  * 2015-08-08 - Add myself to authors for https://github.com/jedie/django-tools/pull/7\n  * 2015-08-07 - Fix weird capitalization in test name\n  * 2015-08-07 - Fix bytes to str conversion for python 3 compatibility\n  * 2015-08-07 - Bump version to reflect changed behavior\n  * 2015-08-07 - Fix failing tests by removing the _thread_locals.request variable when the response is processed\n  * 2015-08-07 - Add failing test for when exceptions are raised in the view\n  * 2015-08-07 - Add failing test that _thread_locals.current_request is cleared after request-response cycle completes\n  * 2015-08-07 - Correct typos in documentation\n  * 2015-07-02 - +donation\n  * 2015-06-19 - code cleanup\n* [v0.29.2](https://github.com/jedie/django-tools/compare/v0.29.1...v0.29.2)\n  * 2015-06-19 - release v0.29.2\n  * 2015-06-19 - doesn't help in every cases :(\n  * 2015-06-17 - add QueryLogMiddleware - TODO: test it!\n  * 2015-06-17 - use existing assertContains / assertNotContains\n  * 2015-06-17 - typo in docstring\n  * 2015-06-17 - Check if user exist and raise helpfull message\n  * 2015-06-17 - 0.29.2.dev0\n  * 2015-06-17 - render nicer\n* [v0.29.1](https://github.com/jedie/django-tools/compare/v0.29.0...v0.29.1)\n  * 2015-06-17 - add StdoutStderrBuffer() to README and release as v0.29.1\n  * 2015-06-17 - add links to github compare views\n  * 2015-06-16 - bugfix for Py2 and Py3\n  * 2015-06-16 - Bugfix if django 1.8 is used: SELECT COUNT(%s) AS...\n  * 2015-06-16 - Use CaptureQueriesContext in PrintQueries and add unittest\n  * 2015-06-16 - accept running subset of unittests\n  * 2015-06-16 - +example\n  * 2015-06-10 - use twine to upload\n  * 2015-06-10 - WIP: use 'twine' for upload to PyPi\n  * 2015-06-10 - add StdoutStderrBuffer()\n  * 2015-06-10 - remove obsolete code\n* [v0.29.0](https://github.com/jedie/django-tools/compare/v0.26.1...v0.29.0)\n  * 2015-06-08 - temporary: deactivate DocTests\n  * 2015-06-08 - remove non ASCII\n  * 2015-06-08 - fix doctest for py2\n  * 2015-06-08 - works in Py2 and Py3\n  * 2015-06-08 - remove unused DocTests (unittests exists)\n  * 2015-06-08 - run DocTests, too. But currently with unittest.expectedFailure()\n  * 2015-06-08 - use ExistingDirValidator in BaseFilesystemBrowser\n  * 2015-06-08 - +BaseUnittestCase and +TempDir\n  * 2015-06-08 - Bugfix imports\n  * 2015-06-08 - Bugfix for Py2\n  * 2015-06-08 - +SignedCookieStorage in README\n  * 2015-06-08 - ClientCookieStorage -\u003e SignedCookieStorage\n  * 2015-06-08 - TestGetFilteredApps\n  * 2015-06-08 - catch more directory traversal attacks in BaseFilesystemBrowser\n  * 2015-06-08 - Bugfix missing import\n  * 2015-06-08 - +repo_token\n  * 2015-06-08 - WIP: refactor tests\n  * 2015-06-08 - WIP: travis, coveralls, landscape\n  * 2015-06-08 - update .gitignore\n  * 2015-03-27 - add InternalIps() - Unix shell-style wildcards in INTERNAL_IPS\n  * 2015-03-04 - Bugfixes in **dynamic_site** for django 1.7\n  * 2015-02-19 - add SECRET_KEY for unittests\n  * 2015-02-19 - Bugfix for \"django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.\" if using **UpdateInfoBaseModel**\n  * 2015-02-12 - new Version number, because of PyPi stress\n* [v0.26.1](https://github.com/jedie/django-tools/compare/v0.26.0...v0.26.1)\n  * 2015-02-12 - Work-a-round for import loops\n* [v0.26.0](https://github.com/jedie/django-tools/compare/v0.25.0...v0.26.0)\n  * 2015-02-11 - relase as v0.26.0\n  * 2015-02-11 - some Python 2 vs 3 compatiblity fixes\n  * 2015-02-11 - log only an error, instead of raise AssertionError\n  * 2014-10-02 - WIP: Just run 2to3\n  * 2014-10-02 - \"Django\u003e=1.5,\u003c1.8\"\n  * 2014-10-02 - WIP: Just add __future__ import\n  * 2014-10-02 - update setup.py\n  * 2014-04-14 - Update models.py\n  * 2013-11-18 - update README\n  * 2013-11-18 - fallback to \"utf-8\" if no encoding given\n  * 2013-11-12 - Update README.creole\n  * 2013-07-23 - from django.conf.urls.defaults import... -\u003e from django.conf.urls import...\n  * 2013-07-19 - add requires \"Django\u003e=1.5,\u003c1.6\" in setup.py\n  * 2013-07-19 - Update URLValidator2 for django 1.5: verify_exists was removed with https://github.com/django/django/commit/9ed6e08ff99c18710c0e4875f827235f04c89d76\n  * 2013-07-19 - move/add logging info into README\n  * 2012-10-23 - correct README\n  * 2012-10-23 - Better example\n  * 2012-08-31 - wrong url\n  * 2012-08-31 - update DocString\n  * 2012-08-31 - split contact info\n* [v0.25.0](https://github.com/jedie/django-tools/compare/v0.24.10...v0.25.0)\n  * 2012-08-28 - v0.25 - SmoothCacheBackends API changed: Rename **cache.clear()** to **cache.smooth_update()**\n* [v0.24.10](https://github.com/jedie/django-tools/compare/v0.24.8...v0.24.10)\n  * 2012-08-24 - v0.24.10: * add SmoothCacheBackends * set AutoUpdateFileBasedCache as deprecated\n  * 2012-08-24 - disable logging as default\n  * 2012-08-24 - Better solution if cache entry doesn't exists.\n  * 2012-08-24 - disable debug\n  * 2012-08-24 - revert to saver method\n* [v0.24.8](https://github.com/jedie/django-tools/compare/v0.24.6...v0.24.8)\n  * 2012-08-24 - release v0.24.8\n  * 2012-08-23 - no released, yet.\n  * 2012-08-23 - Store some startus information about the cache usage.\n  * 2012-08-22 - v0.24.8.pre: Add **SetRequestDebugMiddleware**\n  * 2012-08-21 - * Add per-site cache middleware * Add import lib helper\n* [v0.24.6](https://github.com/jedie/django-tools/compare/v0.20.0...v0.24.6)\n  * 2012-08-21 - Move filemanager library from PyLucid: https://github.com/jedie/PyLucid/tree/d825cf73c8bb0005ff3a00721a5dae9c595c2420/pylucid_project/filemanager\n  * 2012-08-07 - Update README.creole\n  * 2012-08-06 - Add **Print SQL Queries** context manager.\n  * 2012-07-26 - add some dates in changelist\n  * 2012-07-26 - remove date from version string cause of side-effects e.g.: user clone the repo and has the filter not installed\n  * 2012-07-26 - ignore error, if date not exists\n  * 2012-07-25 - * \"hardcode\" the committer date in version number * see: https://github.com/jedie/django-tools/issues/1\n  * 2012-07-10 - Split UpdateInfoBaseModel(): So you can only set \"createtime\", \"lastupdatetime\" or \"createby\", \"lastupdateby\" or both types\n  * 2012-06-26 - we use it in PyLucid CMS. Add notes about limitations.\n  * 2012-06-12 - * Add unittests for limit_to_usergroups * Add a test project. TODO: use this for all tests\n  * 2012-06-12 - Add create_user() and create_testusers() to BaseTestCase\n  * 2012-06-12 - Add normal users in UsergroupsModelField()\n  * 2012-06-12 - Bugfix in UsergroupsModelField()\n  * 2012-06-04 - Bugfix: wrong variable name :(\n  * 2012-05-31 - start v0.24\n  * 2012-05-31 - Don't use auto_now_add and auto_now\n  * 2012-05-31 - * Update DocStrings * Add info: SQLite supports UNIQUE since 2.0 (from 2001) * Use new settings.DATABASES scheme first\n  * 2012-05-14 - update link (for ReSt)\n  * 2012-05-09 - * Do initial stuff only if settings.USE_DYNAMIC_SITE_MIDDLEWARE == True * Give better feedback, if FALLBACK_SITE_ID doesn't exists.\n  * 2012-05-03 - v0.23.0 - Use cryptographic signing tools from django 1.4 in django_tools.utils.client_storage\n  * 2012-04-24 - TODO: Use https://docs.djangoproject.com/en/1.4/topics/signing/ !\n  * 2012-04-24 - \"soc2011 form-rendering\" si merged in django v1.4: assertContains() -\u003e https://docs.djangoproject.com/en/1.4/topics/testing/#django.test.TestCase.assertContains assertHTMLEqual() -\u003e https://docs.djangoproject.com/en/1.4/topics/testing/#django.test.SimpleTestCase.assertHTMLEqual\n  * 2012-04-24 - add change info from https://github.com/jedie/django-tools/commit/9e984e09399644371a8e489b360a2ff8f83bd267\n  * 2012-04-24 - * v0.22.0 ** Add static_path.py thats used settings.STATIC_ROOT. ** The old media_path.py which used settings.MEDIA_ROOT is deprecated and will be removed in the future.\n  * 2012-04-23 - support django old and new DATABASE settings syntax\n  * 2012-01-25 - Update readme examples\n  * 2012-01-25 - Bugfixes in Dynamic Site\n  * 2012-01-24 - small readme update\n  * 2012-01-24 - Update readme\n  * 2012-01-24 - * v0.21.0beta ** New: site alias function ** refractory 'DynamicSiteMiddleware' to a own app (**Backwards-incompatible change:** change your settings if you use the old DynamicSiteMiddleware.)\n  * 2012-01-24 - add PyDev project file, for easier import in eclipse/aptana studio\n  * 2012-01-09 - Add **untestet** and experimental \\\"auto update\\\" cache backend. Discuss in german here: http://www.python-forum.de/viewtopic.php?f=7\u0026t=28227\n  * 2012-01-06 - Update README/Version string\n  * 2012-01-06 - NEW: debug_csrf_failure(): Display the normal debug page and not the minimal csrf debug page.\n  * 2012-01-04 - better solution in example.\n  * 2012-01-04 - * Bugfix for fallback ID: os environment variables are always strings * enable logging in unittests * add notes about unittests\n  * 2012-01-02 - miss spell\n* [v0.20.0](https://github.com/jedie/django-tools/compare/caeaaf4...v0.20.0)\n  * 2012-01-02 - set version to v0.20.0\n  * 2012-01-02 - Add DynamicSiteMiddleware to README\n  * 2012-01-02 - use logging\n  * 2012-01-02 - * Middleware must be activated with settings.USE_DYNAMIC_SITE_MIDDLEWARE = True * deactivate debug prints * code cleanup\n  * 2012-01-01 - code cleanup\n  * 2011-12-29 - NEW: Dynamic SITE ID - experimental, yet!\n  * 2011-10-09 - cleanup\n  * 2011-10-09 - Add middlewares/ThreadLocal.py\n  * 2011-09-26 - Add south introspection rules\n  * 2011-09-26 - Bugfix in django_tools.utils.messages.StackInfoStorage\n  * 2011-09-23 - Add some south introspection rules for LanguageCodeModelField and jQueryTagModelField\n  * 2011-09-13 - fallback if message for anonymous user can't created, because django.contrib.messages middleware not used.\n  * 2011-09-07 - Add http://bugs.python.org/file22767/hp_fix.diff for https://github.com/gregmuellegger/django/issues/1\n  * 2011-09-12 - bugfix\n  * 2011-09-06 - relase as v0.19.4\n  * 2011-09-06 - Nicer solution for template.filters.human_duration()\n  * 2011-09-06 - Bugfix in template.filters.chmod_symbol()\n  * 2011-08-31 - changes since python-creole 0.8.1, see: https://code.google.com/p/python-creole/wiki/UseInSetup\n  * 2011-08-30 - update README\n  * 2011-08-26 - Better solution for setup.long_description since python-creole v0.8, more info: https://code.google.com/p/python-creole/wiki/UseInSetup\n  * 2011-08-26 - UnicodeEncodeError running pip install (which runs './setup.py egg_info')\n  * 2011-08-15 - add example import\n  * 2011-08-15 - Bugfix for PyPy in local_sync_cache get_cache_information(): sys.getsizeof() not implemented on PyPy\n  * 2011-08-10 - v0.19.3 - Add support for https in utils/http.py\n  * 2011-08-10 - missing socket import and typo\n  * 2011-08-10 - Use timeout and add a work-a-round for Python \u003c 2.6\n  * 2011-08-10 - Better solution, see: http://www.python-forum.de/viewtopic.php?p=204899#p204899 (de)\n  * 2011-08-09 - add PyPi url\n  * 2011-08-09 - cleanup readme\n  * 2011-08-09 - change version to 0.19.0\n  * 2011-08-09 - Change README from textile to creole ;)\n  * 2011-08-09 - NEW: Add utils/http.py with helpers to get a webpage via http GET in unicode\n  * 2011-08-09 - merge rules\n  * 2011-08-08 - Disable default stdout logging in \\\"runserver\\\" mode and make the check easier.\n  * 2011-07-14 - spell error :(\n  * 2011-07-14 - Bugfix: Add missing template in pypi package\n  * 2011-07-13 - * Warn user for https://github.com/pypa/pip/issues/319 * user must explicit continue if pip is outdated\n  * 2011-07-12 - Check if pip it out-dated.\n  * 2011-07-12 - turn dry-run into a commandline options and add --verbose and --log options\n  * 2011-07-12 - add \\\"dry-run\\\" mode\n  * 2011-07-12 - some nicer output\n  * 2011-07-12 - Don't activate virtualenv: Check on start, if env activated.\n  * 2011-07-12 - v0.18 - Add DOM compare in unittests from the gread work of Gregor Müllegger at his GSoC 2011 form-rendering branch: https://github.com/gregmuellegger/django/tree/soc2011/form-rendering\n  * 2011-07-12 - Bugfix: Don't escape twice\n  * 2011-07-11 - escape html code in traceback.\n  * 2011-07-08 - Bugfix in \\\"limit_to_usergroups\\\": Make choices \\\"lazy\\\": Don't access the database in __init__\n  * 2011-07-08 - textile typo ;)\n  * 2011-07-08 - add some info to README\n  * 2011-07-08 - remove \\\"pre\\\" from version -\u003e relase this version\n  * 2011-07-08 - Add the script \\\"upgrade_virtualenv.py\\\", see also: https://github.com/pypa/pip/issues/59\n  * 2011-07-06 - Don't check if it's int() try to convert to int() (e.g.: We get a 'long' back from MySQL)\n  * 2011-07-06 - Bugfix in has_permission()\n  * 2011-07-06 - Add \\\"Limit to usergroups\\\".\n  * 2011-07-06 - Add some counters to LocalSyncCache and a pformat_cache_information() function.\n  * 2011-07-05 - Add get_cache_information() (used in PyLucid)\n  * 2011-07-05 - better logging example\n  * 2011-07-05 - * Add documentation for \\\"Local sync cache\\\" * Use own cache backend, if exists * Store the last clear() time and restore it in django cache, if not exists * add some logging output\n  * 2011-07-04 - Add \\\"local sync cache\\\"\n  * 2011-06-30 - new argument \\\"skip_fail\\\" in get_filtered_apps(): If True: raise excaption if app is not importable\n  * 2011-06-30 - render_to pass keyword arguments to render_to_response() (e.g.: mimetype=\\\"text/plain\\\")\n  * 2011-06-15 - Don't use the first argument as request. Check all arguments. So @render_to is useable in classes, too. (Needs more tests)\n  * 2011-06-14 - * Add models.UpdateInfoBaseModel * Update decorators.render_to\n  * 2011-05-17 - for tests\n  * 2011-05-17 - change version string\n  * 2011-05-17 - v0.16.4 ** Bugfix: \\\"\\\"\\\"get_db_prep_save() got an unexpected keyword argument 'connection'\\\"\\\"\\\" when save a SignSeparatedModelField()\n  * 2011-05-16 - v0.16.3 ** Update BrowserDebug: Use response.templates instead of response.template and make output nicer\n  * 2011-04-11 - add it right\n  * 2011-04-11 - bugfix: add error message\n  * 2011-04-11 - Merge stack info code and display better stack info on browser debug page\n  * 2011-04-11 - Update django_tools.utils.messages.StackInfoStorage for django code changes.\n  * 2011-03-04 - v0.16.0 - NEW: path model field (check if direcotry exist) TODO: 1. Needs more tests! 2. implement the widget\n  * 2011-02-25 - v0.15.0 ** NEW: Add a flexible URL field (own validator, model- and form-field)\n  * 2010-12-21 - v0.14.1 -\u003e Bugfix: make path in MediaPathModelField relativ (remove slashes)\n  * 2010-12-08 - v0.14 - NEW: django-tagging addon: Display existing tags under a tag field\n  * 2010-12-08 - cleanup DocString\n  * 2010-11-22 - Add complete settings into browser debug page.\n  * 2010-09-30 - Bugfix UnicodeEncodeError in Browser debug\n  * 2010-09-28 - catch errors in setup.py\n  * 2010-09-16 - include README.textile in MANIFEST.in Thanks Sridhar Ratna for reporting it: http://code.google.com/p/django-tools/issues/detail?id=3\n  * 2010-09-14 - display user messages in browser debug\n  * 2010-09-14 - * NEW: django_tools.utils.messages.failsafe_message * catch if MEDIA_ROOT is not accessable * add commit timestamp to version string\n  * 2010-09-14 - diable debug print's by default\n  * 2010-08-25 - NEW: Store data in a secure cookie, see: utils/client_storage.py\n  * 2010-08-24 - use pformat for listing templates\n  * 2010-08-24 - change version string to v0.10.1\n  * 2010-08-24 - bugfix if templates doesn't exist\n  * 2010-08-24 - Display used templates in unittest BrowserDebug\n  * 2010-08-24 - catch if last message doesn't exist\n  * 2010-07-08 - display debug info\n  * 2010-07-02 - chmod +x update.sh\n  * 2010-07-02 - add update.sh an info to README\n  * 2010-07-01 - add utils around django messages\n  * 2010-06-18 - Bugfix: database column was not created: don't overwrite get_internal_type()\n  * 2010-06-18 - change README filename\n  * 2010-06-18 - * v0.9 ** New: stuff in /django_tools/fields/ ** see also backwards-incompatible changes, above!\n  * 2010-06-16 - remove os.walk followlinks argument (it's new in python 2.6)\n  * 2010-06-15 - New: django_tools.widgets.SelectMediaPath(): Select a sub directory in settings.MEDIA_ROOT and new: SignSeparatedField\n  * 2010-06-15 - Add \"no_args\" keyword argument to installed_apps_utils.get_filtered_apps()\n  * 2010-04-09 - mere some unittest code and add more infos.\n  * 2010-04-01 - info print: don't display same fileinfo again.\n  * 2010-04-01 - bugfix in info print: add flush() method.\n  * 2010-03-31 - * add: BaseTestCase.add_user_permissions() * better error message, if test usertype is wrong\n  * 2010-03-25 -  * Add model LanguageCode field and form LanguageCode field in Accept-Language header format (RFC 2616)  * rename dir \"unittest\" to \"unittest_utils\"  * Change version scheme\n  * 2010-03-17 - use absolute path to AUTHORS and README\n  * 2010-03-05 - Add decorators.py\n  * 2009-11-25 -  * human_duration(): add hours  * Add DocTest\n  * 2009-08-20 - v0.6.0 - Add forms_utils.LimitManyToManyFields, crosspost: http://www.djangosnippets.org/snippets/1691/\n  * 2009-08-18 - - v0.5.0\n  * 2009-08-10 - remove settings import: Better if info print used in settings himself ;)\n  * 2009-08-10 -  * add: assertStatusCode(): assert response status code, if wrong, do a browser traceback.  * add: assertRedirect(): assert than response is a redirect to the right destination, if wrong, do a browser traceback.\n  * 2009-08-05 - add url to exception message\n  * 2009-07-14 - update version info + history\n  * 2009-07-14 - add usage example.\n  * 2009-07-14 - add experimental \"warn_invalid_template_vars\"\n  * 2009-07-14 - add get_filtered_apps(): Filter settings.INSTALLED_APPS and create a list of all Apps witch can resolve the given url \u003eresolve_url\u003c\n  * 2009-07-14 - Bugfix: Exclude the instance if it was saved in the past.\n  * 2009-07-14 - simpler browser_traceback\n  * 2009-07-13 - skip check, if a necessary field is missing.\n  * 2009-07-13 - Add models_utils, see: http://www.jensdiemer.de/_command/118/blog/detail/67/ (de)\n  * 2009-06-18 - add get_current_user()\n  * 2009-06-17 - add threadlocals middleware\n  * 2009-06-17 - Add info_print:\n  * 2009-06-16 - add \"SlowerDevServer\": Simple slow down the django developer server. The middleware insert in every 200 response a time.sleep\n  * 2009-05-27 - Bugfix: use smart_str in assertResponse (encoding errors e.g.: running in terminal)\n  * 2009-05-14 - add missing __init__.py ;)\n  * 2009-05-14 - template render tools\n  * 2009-05-12 - add \"_headers\" to response info list\n  * 2009-05-07 - Use normal unittest.TestCase and add direct_run() function.\n  * 2009-05-07 - add __init__.py\n  * 2009-05-07 - rename directory\n  * 2009-05-07 -  * add unittest stuff from http://code.google.com/p/django-dbpreferences/  * add initial stuff\n\n\u003c/details\u003e\n\n\n[comment]: \u003c\u003e (✂✂✂ auto generated history end ✂✂✂)\n\n## links\n\n| Homepage | [https://github.com/jedie/django-tools](https://github.com/jedie/django-tools)           |\n| PyPi     | [https://pypi.python.org/pypi/django-tools/](https://pypi.python.org/pypi/django-tools/) |\n\n## donation\n\n\n* [paypal.me/JensDiemer](https://www.paypal.me/JensDiemer)\n* [Flattr This!](https://flattr.com/submit/auto?uid=jedie\u0026url=https%3A%2F%2Fgithub.com%2Fjedie%2Fdjango-tools%2F)\n* Send [Bitcoins](https://www.bitcoin.org/) to [1823RZ5Md1Q2X5aSXRC5LRPcYdveCiVX6F](https://blockexplorer.com/address/1823RZ5Md1Q2X5aSXRC5LRPcYdveCiVX6F)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjedie%2Fdjango-tools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjedie%2Fdjango-tools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjedie%2Fdjango-tools/lists"}