summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--python-django-tools.spec1601
-rw-r--r--sources1
3 files changed, 1603 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..84eb7f5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/django-tools-0.54.0.tar.gz
diff --git a/python-django-tools.spec b/python-django-tools.spec
new file mode 100644
index 0000000..f9a0245
--- /dev/null
+++ b/python-django-tools.spec
@@ -0,0 +1,1601 @@
+%global _empty_manifest_terminate_build 0
+Name: python-django-tools
+Version: 0.54.0
+Release: 1
+Summary: miscellaneous tools for Django based projects
+License: GPL-3.0-or-later
+URL: https://github.com/jedie/django-tools/
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/a5/43/8479c7e30a5bf6ddbc3c84aec45ec5a31b10e312e2c5a97524f9f287a7a9/django-tools-0.54.0.tar.gz
+BuildArch: noarch
+
+Requires: python3-bleach
+Requires: python3-bx_py_utils
+Requires: python3-django
+Requires: python3-icdiff
+Requires: python3-pprintpp
+
+%description
+```
+### SetRequestDebugMiddleware
+middleware to add debug bool attribute to request object.
+More info: [./debug/README.creole](https://github.com/jedie/django-tools/blob/master/django_tools/debug/README.creole)
+### TracebackLogMiddleware
+Put traceback in log by call [logging.exception()](https://docs.python.org/3/library/logging.html#logging.Logger.exception) on `process_exception()`
+Activate with:
+```
+MIDDLEWARE_CLASSES = (
+ 'django_tools.middlewares.TracebackLogMiddleware.TracebackLogMiddleware',
+)
+```
+### FnMatchIps() - Unix shell-style wildcards in INTERNAL_IPS / ALLOWED_HOSTS
+settings.py e.g.:
+```
+from django_tools.settings_utils import FnMatchIps
+INTERNAL_IPS = FnMatchIps(["127.0.0.1", "::1", "192.168.*.*", "10.0.*.*"])
+ALLOWED_HOSTS = FnMatchIps(["127.0.0.1", "::1", "192.168.*.*", "10.0.*.*"])
+```
+### StdoutStderrBuffer()
+redirect stdout + stderr to a string buffer. e.g.:
+```
+from django_tools.unittest_utils.stdout_redirect import StdoutStderrBuffer
+with StdoutStderrBuffer() as buffer:
+ print("foo")
+output = buffer.get_output() # contains "foo\n"
+```
+### Management commands
+#### permission_info
+List all permissions for one django user.
+(Needs `'django_tools'` in INSTALLED_APPS)
+e.g.:
+```
+$ ./manage.py permission_info
+No username given!
+All existing users are:
+foo, bar, john, doe
+$ ./manage.py permission_info foo
+All permissions for user 'test_editor':
+ is_active : yes
+ is_staff : yes
+ is_superuser : no
+[*] admin.add_logentry
+[*] admin.change_logentry
+[*] admin.delete_logentry
+[ ] auth.add_group
+[ ] auth.add_permission
+[ ] auth.add_user
+```
+#### logging_info
+Shows a list of all loggers and marks which ones are configured in settings.LOGGING:
+```
+$ ./manage.py logging_info
+```
+#### nice_diffsettings
+Similar to django 'diffsettings', but used pretty-printed representation:
+```
+$ ./manage.py nice_diffsettings
+```
+#### database_info
+Just display some information about the used database and connections:
+```
+$ ./manage.py database_info
+```
+#### list_models
+Just list all existing models in app_label.ModelName format. Useful to use this in 'dumpdata' etc:
+```
+$ ./manage.py list_models
+```
+### ..all others…
+There exist many miscellaneous stuff. Look in the source, luke!
+## Backwards-incompatible changes
+Old changes archived in git history here:
+* [>=v0.47](https://github.com/jedie/django-tools/tree/v0.49.0#backwards-incompatible-changes)
+* [>=v0.35](https://github.com/jedie/django-tools/tree/v0.35.0#backwards-incompatible-changes)
+### v0.51
+All Selenium helper are deprecated, please migrate to [Playwright](https://playwright.dev/python/) ;)
+### v0.50
+Removed old selenium helper function, [deprecated since v0.43](https://github.com/jedie/django-tools/tree/v0.43.0#v043)
+Make all Selenium web driver instances persistent for the complete test run session.
+This speedup tests and fixed some bugs in Selenium.
+This result in the same browser/webdriver settings for all test classes!
+## Django compatibility
+| django-tools | django version | python |
+| ---------------- | -------------- | --------------- |
+| >= v0.52.0 | 3.2, 4.0, 4.1 | 3.8, 3.9, 3.10 |
+| >= v0.50.0 | 2.2, 3.2, 4.0 | 3.8, 3.9, 3.10 |
+| >= v0.49.0 | 2.2, 3.1, 3.2 | 3.7, 3.8, 3.9 |
+| >= v0.47.0 | 2.2, 3.0, 3.1 | >= 3.6, pypy3 |
+| >= v0.39 | 1.11, 2.0 | 3.5, 3.6, pypy3 |
+| >= v0.38.1 | 1.8, 1.11 | 3.5, 3.6, pypy3 |
+| >= v0.38.0 | 1.8, 1.11 | 3.5, 3.6 |
+| >= v0.37.0 | 1.8, 1.11 | 3.4, 3.5 |
+| >= v0.33.0 | 1.8, 1.11 | 2.7, 3.4, 3.5 |
+| v0.30.1-v0.32.14 | 1.8, 1.9, 1.10 | 2.7, 3.4, 3.5 |
+| v0.30 | 1.8, 1.9 | 2.7, 3.4 |
+| v0.29 | 1.6 - 1.8 | 2.7, 3.4 |
+| v0.26 | <=1.6 | |
+| v0.25 | <=1.4 | |
+(See also combinations for [tox in pyproject.toml](https://github.com/jedie/django-tools/blob/master/pyproject.toml))
+## history
+* *dev* - [compare v0.54.0...main](https://github.com/jedie/django-tools/compare/v0.54.0...main)
+ * TBC
+* [v0.54.0 - 15.09.2022](https://github.com/jedie/django-tools/compare/v0.53.0...v0.54.0)
+ * Run [safety](https://github.com/pyupio/safety) in CI pipeline.
+ * NEW: `SyslogHandler` for easy logging to `syslog`
+ * Replace creole README with markdown
+* [v0.53.0 - 18.08.2022](https://github.com/jedie/django-tools/compare/v0.52.0...v0.53.0)
+ * NEW: `MassContextManagerBase`, `DenyStdWrite` + Updated: `StdoutStderrBuffer`
+ * Enhance `run_testserver` command
+ * Small test project setup updates
+* [v0.52.0 - 17.08.2022](https://github.com/jedie/django-tools/compare/v0.51.0...v0.52.0)
+ * Move `run_testserver` management command from `django_tools_test_app` to `django_tools` and polish it.
+ * Restrict `AlwaysLoggedInAsSuperUserMiddleware` to the admin.
+ * Test with Django 3.2, 4.0 and 4.1
+* [v0.51.0 - 26.07.2022](https://github.com/jedie/django-tools/compare/v0.50.0...v0.51.0)
+ * NEW: `check_editor_config()` to check editor config and line length in projects
+ * DEPRECATE all Selenium helper, please migrate to Playwright ;)
+ * NEW: [Playwright](https://playwright.dev/python/) base Unittest class and login helper
+* [v0.50.0 - 29.05.2022](https://github.com/jedie/django-tools/compare/v0.49.0...v0.50.0)
+ * Rename git "master" branch to "main"
+ * Use [webdriver-manager](https://github.com/SergeyPirogov/webdriver_manager) to setup selenium web drivers
+ * CHANGE: Now all web driver instances are cached and reused for the complete test run!
+ * Use [darker](https://github.com/akaihola/darker) for code formatting
+ * Update test matrix: Add Python 3.10 and Django v4.0 (remove Python 3.7 and Django 3.1)
+* v0.49.0 - 22.11.2021 - [compare v0.48.3...v0.49.0](https://github.com/jedie/django-tools/compare/v0.48.3...v0.49.0)
+ * NEW: `VersionProtectBaseModel` - Protect a model against overwriting a newer entry with an older one, by adding a auto increment version number.
+ * NEW: `AlwaysLoggedInAsSuperUserMiddleware` useful for local dev server run to auto login into Django Admin
+ * Enhance Selenium test helpers and [fix #21: Set chrome accept_languages in headless mode](https://github.com/jedie/django-tools/issues/21)
+ * Update project: Tests, code-style etc.
+* v0.48.3 - 20.12.2020 - [compare v0.47.2...v0.48.3](https://github.com/jedie/django-tools/compare/v0.47.2...v0.48.3)
+ * NEW: `ImageDummy().in_memory_image_file()` useful for e.g.: POST a image upload via Django's test client
+* v0.48.2 - 06.12.2020 - [compare v0.47.1...v0.48.2](https://github.com/jedie/django-tools/compare/v0.47.1...v0.48.2)
+ * Bugfix "Serve User Media File": Create tokens via migrations and handle if tokens not exists
+* v0.48.1 - 06.12.2020 - [compare v0.47.0...v0.48.1](https://github.com/jedie/django-tools/compare/v0.47.0...v0.48.1)
+ * Add migration file to "Serve User Media File"
+* v0.48.0 - 06.12.2020 - [compare v0.47.0...v0.48.0](https://github.com/jedie/django-tools/compare/v0.47.0...v0.48.0)
+ * NEW: "Serve User Media File" reuseable app
+ * NEW: django_tools.unittest_utils.signals.SignalsContextManager
+ * Update `installed_apps_utils.get_filtered_apps()` and support app config entries in `settings.INSTALLED_APPS`
+* v0.47.0 - 26.11.2020 - [compare v0.46.1...v0.47.0](https://github.com/jedie/django-tools/compare/v0.46.1...v0.47.0)
+ * updates for newer django versions
+ * NEW: assert_warnings(), assert_no_warnings() and assert_in_logs()
+ * remove broken LoggingBuffer()
+ * update project setup, fix tests and pipelines
+* v0.46.1 - 19.02.2020 - [compare v0.46.0...v0.46.1](https://github.com/jedie/django-tools/compare/v0.46.0...v0.46.1)
+ * less restricted dependency specification
+ * NEW: `"django_tools.middlewares.LogHeaders.LogRequestHeadersMiddleware"`
+ * SeleniumChromiumTestCase: set "accept_languages" and disable "headless" mode, see also: [https://github.com/jedie/django-tools/issues/21](https://github.com/jedie/django-tools/issues/21)
+* v0.46.0 - 13.02.2020 - [compare v0.45.3...v0.46.0](https://github.com/jedie/django-tools/compare/v0.45.3...v0.46.0)
+ * `dynamic_site` was removed. Please use e.g.: [django-hosts](https://github.com/jazzband/django-hosts)
+ * modernize project setup and use `poetry`
+ * remove `lxml` decency by using [bleach](https://github.com/mozilla/bleach) for `html_utils.html2text`
+ * update code and code style
+* v0.45.3 - 25.08.2019 - [compare v0.45.2...v0.45.3](https://github.com/jedie/django-tools/compare/v0.45.2...v0.45.3)
+ * Add `excepted_exit_code` to `django_tools.unittest_utils.django_command.DjangoCommandMixin` to it's possible to test errors in manage commands
+* v0.45.2 - 26.06.2019 - [compare v0.45.1...v0.45.2](https://github.com/jedie/django-tools/compare/v0.45.1...v0.45.2)
+ * NEW: `django_tools.log_utils.throttle_admin_email_handler.ThrottledAdminEmailHandler`
+* v0.45.1 - 03.04.2019 - [compare v0.45.0...v0.45.1](https://github.com/jedie/django-tools/compare/v0.45.0...v0.45.1)
+ * Bugfix ValueError in `django_tools.unittest_utils.email.print_mailbox`
+* v0.45.0 - 01.04.2019 - [compare v0.44.2...v0.45.0](https://github.com/jedie/django-tools/compare/v0.44.2...v0.45.0)
+ * NEW: `OverwriteFileSystemStorage` with backup functionality
+ * NEW: `print_exc_plus()` - traceback with a listing of all the local variables
+ * NEW: `assert_pformat_equal` with `pprintpp` and `icdiff`
+ * NEW: `assert_filenames_and_content`
+* v0.44.2 - 02.01.2019 - [compare v0.44.1...v0.44.2](https://github.com/jedie/django-tools/compare/v0.44.1...v0.44.2)
+ * Handle errors like: [https://github.com/andymccurdy/redis-py/issues/995](https://github.com/andymccurdy/redis-py/issues/995)
+* v0.44.1 - 02.01.2019 - [compare v0.44.0...v0.44.1](https://github.com/jedie/django-tools/compare/v0.44.0...v0.44.1)
+ * `LoggingBuffer`: Don't deactivate existing log handler, just append the buffer handler.
+* v0.44.0 - 13.12.2018 - [compare v0.43.2...v0.44.0](https://github.com/jedie/django-tools/compare/v0.43.2...v0.44.0)
+ * NEW: `django_file = ImageDummy().create_django_file_info_image(text="")` e.g.: for attach to `models.ImageField()`
+ * Make `mockup.ImageDummy()` usable even if django-filer is not installed.
+ * `mockup.ImageDummy()` default image format changed from png to jpeg
+ * Cleanup: remove old, since v0.35 deprecated mockup image API
+* v0.43.2 - 11.12.2018 - [compare v0.43.1...v0.43.2](https://github.com/jedie/django-tools/compare/v0.43.1...v0.43.2)
+ * Bugfix Selenium refactor: Use the class with the same functionality if old usage places are used.
+* v0.43.1 - 11.12.2018 - [compare v0.43.0...v0.43.1](https://github.com/jedie/django-tools/compare/v0.43.0...v0.43.1)
+ * Bugfix: Selenium test cases: clear `window.localStorage` after test run
+* v0.43.0 - 11.12.2018 - [compare v0.42.4...v0.43.0](https://github.com/jedie/django-tools/compare/v0.42.4...v0.43.0)
+ * Refactor selenium helpers
+ * Split selenium test cases: with and without Django StaticLiveServerTestCase
+ * NEW: Selenium helper to access `window.localStorage`
+* v0.42.4 - 12.10.2018 - [compare v0.42.3...v0.42.4](https://github.com/jedie/django-tools/compare/v0.42.3...v0.42.4)
+ * Add `request` object to `TestUserMixin.login()` (needed for e.g.: django-axes auth backend)
+* v0.42.3 - 10.10.2018 - [compare v0.42.2...v0.42.3](https://github.com/jedie/django-tools/compare/v0.42.2...v0.42.3)
+ * NEW: * `assertments.assert_is_dir`, `assertments.assert_is_file`, `assertments.assert_path_not_exists`
+* v0.42.2 - 18.09.2018 - [compare v0.42.1...v0.42.2](https://github.com/jedie/django-tools/compare/v0.42.1...v0.42.2)
+ * NEW: `assert_installed_apps()` - Check entries in settings.INSTALLED_APPS
+* v0.42.1 - 17.09.2018 - [compare v0.42.0...v0.42.1](https://github.com/jedie/django-tools/compare/v0.42.0...v0.42.1)
+ * NEW: `django_tools.unittest_utils.assertments.assert_language_code` - Check if given language_code is in settings.LANGUAGES
+* v0.42.0 - 07.09.2018 - [compare v0.41.0...v0.42.0](https://github.com/jedie/django-tools/compare/v0.41.0...v0.42.0)
+ * remove all celery stuff
+ * NEW: `$ ./manage.py logging_info` Shows a list of all loggers and marks which ones are configured in settings.LOGGING
+ * manage commands `list_models` and `nice_diffsettings` are moved from seperate apps
+* v0.41.0 - 28.08.2018 - [compare v0.40.6...v0.41.0](https://github.com/jedie/django-tools/compare/v0.40.6...v0.41.0)
+ * NEW: `unittest_utils/assertments.py` with some common assert functions
+ * Remove `@task_always_eager()` decorator
+* v0.40.6 - 28.08.2018 - [compare v0.40.5...v0.40.6](https://github.com/jedie/django-tools/compare/v0.40.5...v0.40.6)
+ * Bugfix `@task_always_eager()` decorator
+* v0.40.5 - 27.08.2018 - [compare v0.40.4...v0.40.5](https://github.com/jedie/django-tools/compare/v0.40.4...v0.40.5)
+ * Bugfix `DjangoCommandMixin.call_manage_py()`: Use the given `manage.py` filename
+* v0.40.4 - 21.08.2018 - [compare v0.40.3...v0.40.4](https://github.com/jedie/django-tools/compare/v0.40.3...v0.40.4)
+ * NEW: `django_tools.debug.delay` to simulate longer processing time by set a delay via GET parameter (see above)
+* v0.40.3 - 18.07.2018 - [compare v0.40.2...v0.40.3](https://github.com/jedie/django-tools/compare/v0.40.2...v0.40.3)
+ * Enhance selenium test cases:
+ * NEW: `assert_visible_by_id()`
+ * NEW: `assert_clickable_by_id()`
+ * NEW: `assert_clickable_by_xpath()`
+ * add `desired_capabilities` to firefox and chrome test cases
+ * enable logging in chrome test case
+ * NEW: `assert_in_browser_log()` in chrome test case
+* v0.40.2 - 04.07.2018 - [compare v0.40.1...v0.40.2](https://github.com/jedie/django-tools/compare/v0.40.1...v0.40.2)
+ * Bugfix selenium Test Case if driver is None
+ * Bugfix django compatibility
+* v0.40.1 - 28.06.2018 - [compare v0.40.0...v0.40.1](https://github.com/jedie/django-tools/compare/v0.40.0...v0.40.1)
+ * Bugfix selenium test case if executable can't be found.
+* v0.40.0 - 15.06.2018 - [compare v0.39.6...v0.40.0](https://github.com/jedie/django-tools/compare/v0.39.6...v0.40.0)
+ * NEW: selenium chrome and firefox test cases in `django_tools.unittest_utils.selenium_utils`
+ * Fix test project and add `run_test_project_dev_server.sh` for easy test
+ * Fixing tests
+* v0.39.6 - 04.05.2018 - [compare v0.39.5...v0.39.6](https://github.com/jedie/django-tools/compare/v0.39.5...v0.39.6)
+ * Enhance model instance unittest code generator
+* v0.39.5 - 24.04.2018 - [compare v0.39.4...v0.39.5](https://github.com/jedie/django-tools/compare/v0.39.4...v0.39.5)
+ * NEW: Model instance unittest code generator (see above)
+* v0.39.4 - 06.04.2018 - [compare v0.39.3...v0.39.4](https://github.com/jedie/django-tools/compare/v0.39.3...v0.39.4)
+ * NEW: `django_tools.unittest_utils.logging_utils.FilterAndLogWarnings` and `django_tools.unittest_utils.logging_utils.CutPathnameLogRecordFactory`
+* v0.39.3 - 22.03.2018 - [compare v0.39.2...v0.39.3](https://github.com/jedie/django-tools/compare/v0.39.2...v0.39.3)
+ * `django_tools.permissions.get_filtered_permissions` has new keyword argument: `exclude_actions`
+* v0.39.2 - 22.03.2018 - [compare v0.39.1...v0.39.2](https://github.com/jedie/django-tools/compare/v0.39.1...v0.39.2)
+ * NEW: `django_tools.parler_utils.parler_fixtures.ParlerDummyGenerator`
+ * NEW: `django_tools.fixture_tools.languages.iter_languages`
+* v0.39.1 - 19.03.2018 - [compare v0.39.0...v0.39.1](https://github.com/jedie/django-tools/compare/v0.39.0...v0.39.1)
+ * NEW: `django_tools.unittest_utils.email.print_mailbox()`
+ * minor updates
+* v0.39.0 - 02.03.2018 - [compare v0.38.9...v0.39.0](https://github.com/jedie/django-tools/compare/v0.38.9...v0.39.0)
+ * NEW: Isolated Filesystem decorator / context manager
+ * Backwards-incompatible change: file renamed `django_tools/unittest_utils/{celery.py => celery_utils.py`}
+ * Skip run test with Django 1.8 and run tests with Django 1.11 and 2.0
+* v0.38.9 - 05.02.2018 - [compare v0.38.8...v0.38.9](https://github.com/jedie/django-tools/compare/v0.38.8...v0.38.9)
+ * lowering log level on missing permissions from "error" to "debug"
+* v0.38.8 - 05.02.2018 - [compare v0.38.7...v0.38.8](https://github.com/jedie/django-tools/compare/v0.38.7...v0.38.8)
+ * send mail: use from celery import shared_task instead of djcelery_transactions
+* v0.38.7 - 15.01.2018 - [compare v0.38.6...v0.38.7](https://github.com/jedie/django-tools/compare/v0.38.6...v0.38.7)
+ * Add missing arguments (like "attachments", "cc" etc.) to `django_tools.mail.send_mail.SendMailCelery`
+* v0.38.6 - 10.01.2018 - [compare v0.38.4...v0.38.5](https://github.com/jedie/django-tools/compare/v0.38.4...v0.38.5)
+ * NEW: `./manage.py clear_cache`
+ * Display POST data in browser debug (`django_tools.unittest_utils.BrowserDebug.debug_response`)
+* v0.38.5 - 02.01.2018 - [compare v0.38.4...v0.38.5](https://github.com/jedie/django-tools/compare/v0.38.4...v0.38.5)
+ * NEW: Helper to assert django message framework output in unittests:
+ * `BaseUnittestCase.get_messages()`: return a list of all messages
+ * `BaseTestCase.assertMessages()`: compare messages
+ * `BaseTestCase.assertResponse()`: has new keyword argument `messages`
+ * NEW: `BaseUnittestCase.assert_exception_startswith()`
+* v0.38.4 - 28.12.2017 - [compare v0.38.3...v0.38.4](https://github.com/jedie/django-tools/compare/v0.38.3...v0.38.4)
+ * Bugfix attach user group on existing user in: `django_tools.unittest_utils.user.get_or_create_user`
+* v0.38.3 - 28.12.2017 - [compare v0.38.2...v0.38.3](https://github.com/jedie/django-tools/compare/v0.38.2...v0.38.3)
+ * Bugfix: `unittest_utils.user.get_or_create_group` also removes obsolete permissions, too.
+* v0.38.2 - 27.12.2017 - [compare v0.38.1...v0.38.2](https://github.com/jedie/django-tools/compare/v0.38.1...v0.38.2)
+ * NEW: `./manage.py update_permissions`
+* v0.38.1 - 21.12.2017 - [compare v0.38.0...v0.38.1](https://github.com/jedie/django-tools/compare/v0.38.0...v0.38.1)
+ * refactor travis/tox/pytest/coverage stuff
+ * Tests can be run via `python3 setup.py tox` and/or `python3 setup.py test`
+ * Test also with pypy3 on Travis CI.
+* v0.38.0 - 19.12.2017 - [compare v0.37.0...v0.38.0](https://github.com/jedie/django-tools/compare/v0.37.0...v0.38.0)
+ * NEW: `django_tools.unittest_utils.user.get_or_create_group`
+ * NEW: `django_tools.unittest_utils.user.get_or_create_user`
+ * NEW: `django_tools.unittest_utils.user.get_or_create_user_and_group`
+ * NEW: `BaseUnittestCase.get_admin_change_url()` and `BaseUnittestCase.get_admin_add_url()`
+ * NEW: `BaseUnittestCase.assert_startswith()` and `BaseUnittestCase.assert_endswith()`
+* v0.37.0 - 11.12.2017 - [compare v0.36.0...v0.37.0](https://github.com/jedie/django-tools/compare/v0.36.0...v0.37.0)
+ * Skip official support for python v2 (remove from text matrix)
+ * NEW: `./manage.py permission_info`: Display a list of all permissions for one django user
+ * NEW: `django_tools.permissions.get_filtered_permissions()` and `django_tools.permissions.pprint_filtered_permissions()`
+ * `django_tools.settings_utils.InternalIps` was renamed to `FnMatchIps` and can be also used for **ALLOWED_HOSTS**
+ * Bugfix/Enhance permission helpers
+* v0.36.0 - 20.11.2017 - [compare v0.35.0...v0.36.0](https://github.com/jedie/django-tools/compare/v0.35.0...v0.36.0)
+ * NEW: `./manage.py database_info`
+ * Bugfix: **ModelPermissionMixin**
+ * Dynamic Sites is no longer maintained and tests are deactivated. It's currently not compatible with all django versions.
+* v0.35.0 - 26.09.2017 - [compare v0.34.0...v0.35.0](https://github.com/jedie/django-tools/compare/v0.34.0...v0.35.0)
+ * CHANGE: The dummy image generation function in `django_tools.unittest_utils.mockup` has a new API.
+* v0.34.0 - 18.09.2017 - [compare v0.33.0...v0.34.0](https://github.com/jedie/django-tools/compare/v0.33.0...v0.34.0)
+ * CHANGE: The test usernames changed and spaces was replace with underscores e.g.: "staff test user" -> "staff_test_user"
+ * Bugfix in mockup.create_pil_image: Created images has wrong sizes
+* v0.33.0 - 11.07.2017 - [compare v0.32.14...v0.33.0](https://github.com/jedie/django-tools/compare/v0.32.14...v0.33.0)
+ * Run tests only against Django v1.8 TLS and v1.11 TLS
+ * For Django 1.11: Add support for new-style middleware - contributed by benkonrath
+ * NEW: `django_tools.utils.request.create_fake_request()` for easier create a faked request object with `RequestFactory`
+ * NEW: `django_tools.utils.html_utils.html2text()` - Strip HTML tags with lxml Cleaner + Django 'strip_tags'
+* v0.32.14 - 14.06.2017 - [compare v0.32.13...v0.32.14](https://github.com/jedie/django-tools/compare/v0.32.13...v0.32.14)
+ * Bugfix for Python 2: `mock` backport package is needed and added to `setup.install_requires`
+* v0.32.13 - 24.05.2017 - [compare v0.32.12...v0.32.13](https://github.com/jedie/django-tools/compare/v0.32.12...v0.32.13)
+ * remove some warnings
+* v0.32.12 - 04.05.2017 - [compare v0.32.11...v0.32.12](https://github.com/jedie/django-tools/compare/v0.32.11...v0.32.12)
+ * NEW: `self.assertIn_dedent()` in `django_tools.unittest_utils.unittest_base.BaseUnittestCase`
+* v0.32.11 - 02.05.2017 - [compare v0.32.10...v0.32.11](https://github.com/jedie/django-tools/compare/v0.32.10...v0.32.11)
+ * Fix PyPi package mistake (`.tar.gz` archive contains `.tox` ;)
+* v0.32.10 - 02.05.2017 - [compare v0.32.9...v0.32.10](https://github.com/jedie/django-tools/compare/v0.32.9...v0.32.10)
+ * NEW: `django_tools.mail` to send text+html mails (see above)
+* v0.32.9 - 21.03.2017 - [compare v0.32.8...v0.32.9](https://github.com/jedie/django-tools/compare/v0.32.8...v0.32.9)
+ * Bugfix `DebugCacheLoader` if TemplateDoesNotExist was raised
+* v0.32.8 - 16.03.2017 - [compare v0.32.7...v0.32.8](https://github.com/jedie/django-tools/compare/v0.32.7...v0.32.8)
+ * NEW: `django_tools.template.loader.DebugCacheLoader` to add template name as html comments
+ * Change temp filename in BrowserDebug and use `django_tools_browserdebug_` prefix
+ * Bugfix in `django_tools.middlewares.ThreadLocal.ThreadLocalMiddleware`
+* v0.32.7 - 10.03.2017 - [compare v0.32.6...v0.32.7](https://github.com/jedie/django-tools/compare/v0.32.6...v0.32.7)
+ * NEW: `django_tools.permissions` - helper for setup permissions
+ * NEW: `/unittest_utils/user.py` - helper for creating users (needfull in unittests)
+* v0.32.6 - 22.02.2017 - [compare v0.32.5...v0.32.6](https://github.com/jedie/django-tools/compare/v0.32.5...v0.32.6)
+* `@task_always_eager()` decorator will set `CELERY_EAGER_PROPAGATES_EXCEPTIONS=True`, too.
+* v0.32.5 - 10.02.2017 - [compare v0.32.4...v0.32.5](https://github.com/jedie/django-tools/compare/v0.32.4...v0.32.5)
+ * NEW: Add `template_name` (optional) to `self.assertResponse()` (check with `assertTemplateUsed()`)
+* v0.32.4 - 01.02.2017 - [compare v0.32.3...v0.32.4](https://github.com/jedie/django-tools/compare/v0.32.3...v0.32.4)
+* Fix: Set "is_active" for created test users
+* v0.32.3 - 25.01.2017 - [compare v0.32.2...v0.32.3](https://github.com/jedie/django-tools/compare/v0.32.2...v0.32.3)
+ * Fix UnicodeDecodeError in BrowserDebug
+ * NEW: `@set_string_if_invalid()` decorator
+ * NEW: `@task_always_eager()` decorator
+* v0.32.2 - 13.01.2017 - [compare v0.32.1...v0.32.2](https://github.com/jedie/django-tools/compare/v0.32.1...v0.32.2)
+ * NEW: django_tools.utils.url.GetDict
+* v0.32.1 - 29.12.2016 - [compare v0.32.0...v0.32.1](https://github.com/jedie/django-tools/compare/v0.32.0...v0.32.1)
+ * NEW: TracebackLogMiddleware
+* v0.32.0 - 19.12.2016 - [compare v0.31.0...v0.32.0](https://github.com/jedie/django-tools/compare/v0.31.0...v0.32.0)
+ * NEW: Management commands: 'nice_diffsettings', 'list_models'
+ * NEW: @display_admin_error to display silent errors in ModelAdmin.list_display callables.
+ * NEW: django_tools.template.render.render_template_file
+ * use [pytest-django](https://pypi.python.org/pypi/pytest-django)
+ * remove outdated stuff: See 'Backwards-incompatible changes' above.
+* v0.31.0 - 03.11.2016 - [compare v0.30.4...v0.31.0](https://github.com/jedie/django-tools/compare/v0.30.4...v0.31.0)
+ * add Mockup utils to create dummy PIL/django-filer images with Text (see above)
+ * move tests into `/django_tools_tests/`
+* v0.30.4 - 27.10.2016 - [compare v0.30.2...v0.30.4](https://github.com/jedie/django-tools/compare/v0.30.2...v0.30.4)
+ * add DjangoCommandMixin
+* v0.30.2 - 05.10.2016 - [compare v0.30.1...v0.30.2](https://github.com/jedie/django-tools/compare/v0.30.1...v0.30.2)
+ * Bugfix Python 2 compatibility
+* v0.30.1 - 26.08.2016 - [compare v0.30.0...v0.30.1](https://github.com/jedie/django-tools/compare/v0.30.0...v0.30.1)
+ * add: `django_tools.unittest_utils.disable_migrations.DisableMigrations` (see above)
+ * run tests also with django v1.10 and Python 3.5
+ * use tox
+* v0.30.0 - 27.04.2016 - [compare v0.29.5...v0.30.0](https://github.com/jedie/django-tools/compare/v0.29.5...v0.30.0)
+ * Django 1.9 and Python 3 support contributed by [naegelyd](https://github.com/jedie/django-tools/pull/9)
+* v0.29.4 and v0.29.5 - 10.08.2015 - [compare v0.29.3...v0.29.5](https://github.com/jedie/django-tools/compare/v0.29.3...v0.29.5)
+ * Some bugfixes for django 1.6 support
+* v0.29.3 - 10.08.2015 - [compare v0.29.2...v0.29.3](https://github.com/jedie/django-tools/compare/v0.29.2...v0.29.3)
+ * Clear ThreadLocal request atttribute after response is processed (contributed by Lucas Wiman)
+* v0.29.2 - 19.06.2015 - [compare v0.29.1...v0.29.2](https://github.com/jedie/django-tools/compare/v0.29.1...v0.29.2)
+ * Bugfix in unittest_utils.selenium_utils.selenium2fakes_response
+ * assertResponse used assertContains from django
+ * Add QueryLogMiddleware (TODO: add tests)
+* v0.29.1 - 17.06.2015 - [compare v0.29.0...v0.29.1](https://github.com/jedie/django-tools/compare/v0.29.0...v0.29.1)
+ * Bugfixes for Py2 and Py3
+ * add StdoutStderrBuffer()
+* v0.29.0 - 09.06.2015 - [compare v0.26.0...v0.29.0](https://github.com/jedie/django-tools/compare/v0.26.0...v0.29.0)
+ * WIP: Refactor unittests (DocTests must be updated for Py3 and more unittests must be written to cover all)
+ * catch more directory traversal attacks in BaseFilesystemBrowser (and merge code parts)
+ * Bugfix for "django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet." if using **UpdateInfoBaseModel**
+ * Bugfixes in **dynamic_site** for django 1.7
+ * add: [django_tools.settings_utils.InternalIps](https://github.com/jedie/django-tools/blob/master/django_tools/settings_utils.py)
+* v0.28.0 - 12.02.2015 - [compare v0.26.0...v0.28.0](https://github.com/jedie/django-tools/compare/v0.26.0...v0.28.0)
+ * Work-a-round for import loops
+ * (new Version number, because of PyPi stress)
+* v0.26.0 - 11.02.2015 - [compare v0.25.1...v0.26.0](https://github.com/jedie/django-tools/compare/v0.25.1...v0.26.0)
+ * Updates for Django 1.6 and Python 3
+* v0.25.1 - 18.11.2013
+ * Bugfix: Fall back to "UTF-8" if server send no encoding info
+* v0.25.0 - 28.08.2012
+ * Rename **cache.clear()** in SmoothCacheBackends to **cache.smooth_update()**, so that reset timestamp is independ from clear the cache.
+* v0.24.10 - 24.08.2012
+ * Add **SmoothCacheBackends**: [./cache/README.creole](https://github.com/jedie/django-tools/blob/master/django_tools/cache/README.creole)
+* v0.24.9 - 24.08.2012
+ * Bugfix in per-site cache middleware: set inital count values to None, if counting is disabled.
+* v0.24.8 - 24.08.2012
+ * Enhanced **per-site cache middleware**: [./cache/README.creole](https://github.com/jedie/django-tools/blob/master/django_tools/cache/README.creole)
+ * Add **SetRequestDebugMiddleware**: [./debug/README.creole](https://github.com/jedie/django-tools/blob/master/django_tools/debug/README.creole)
+* v0.24.7 - 21.08.2012
+ * Add the **per-site cache middleware** (see above)
+ * Add **import lib helper**: [./utils/importlib.py](https://github.com/jedie/django-tools/blob/master/django_tools/utils/importlib.py)
+* v0.24.6 - 21.08.2012
+ * Add the **filemanager library** (see above)
+* v0.24.5 - 06.08.2012
+ * Add **Print SQL Queries** context manager. (see above)
+* v0.24.4 - 26.07.2012
+ * remove date from version string, cause of side-effects e.g.: user clone the repo and has the filter not installed
+* v0.24.3 - 25.07.2012
+ * "Hardcode" the version string date attachment via [gitattribute filter script](https://github.com/jedie/python-code-snippets/tree/master/CodeSnippets/git) to fix [a reported issues](https://github.com/jedie/django-tools/issues/1) with [pip requirements file bug](https://github.com/pypa/pip/issues/145).
+* v0.24.2 - 10.07.2012
+ * Split [UpdateInfoBaseModel()](https://github.com/jedie/django-tools/blob/master/django_tools/models.py): So you can only set "createtime", "lastupdatetime" or "createby", "lastupdateby" or both types (This is backwards compatible)
+* v0.24.1 - 12.06.2012
+ * Bugfix: UsergroupsModelField() and add unittests for it
+ * Add "normal users" in UsergroupsModelField()
+ * New: Add create_user() and create_testusers() to BaseTestCase
+ * Add a test project for the unittests. TODO: use this for all tests
+* v0.24.0 - 04.06.2012
+ * [Don't use auto_now_add and auto_now in UpdateInfoBaseModel](https://github.com/jedie/django-tools/commit/a3cf1f7b2e9dbe4964306f4793c74f1782f8b2ea)
+ * Bugfix in [UsergroupsModelField](https://github.com/jedie/django-tools/blob/master/django_tools/limit_to_usergroups.py)
+* v0.23.1
+ * [Dynamic Site](https://github.com/jedie/django-tools/tree/main/django_tools/dynamic_site#dynamic-site-id) would be only initialised if settings.USE_DYNAMIC_SITE_MIDDLEWARE = True
+* v0.23.0
+ * Use cryptographic signing tools from django 1.4 in django_tools.utils.client_storage
+* v0.22.0
+ * Add [static_path.py](https://github.com/jedie/django-tools/blob/master/django_tools/fields/static_path.py) thats used settings.STATIC_ROOT.
+ * The old [media_path.py](https://github.com/jedie/django-tools/blob/master/django_tools/fields/media_path.py) which used settings.MEDIA_ROOT is deprecated and will be removed in the future.
+ * auto_add_check_unique_together() can use settings.DATABASES["default"]["ENGINE"], too.
+* v0.21.1
+ * Bugfixes in [Dynamic Site](https://github.com/jedie/django-tools/tree/main/django_tools/dynamic_site#dynamic-site-id).
+* 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.)
+* v0.20.1
+ * New: [debug_csrf_failure()](https://github.com/jedie/django-tools/blob/master/django_tools/views/csrf.py) to display the normal debug page and not the minimal csrf debug page.
+* v0.20.0
+ * Add experimental [DynamicSiteMiddleware](https://github.com/jedie/django-tools/blob/master/django_tools/middlewares/DynamicSite.py), please test it and give feedback.
+* v0.19.6
+ * Add some south introspection rules for LanguageCodeModelField and jQueryTagModelField
+ * fallback if message for anonymous user can't created, because django.contrib.messages middleware not used.
+ * Bugfix in django_tools.utils.messages.StackInfoStorage
+* v0.19.5
+ * Add [http://bugs.python.org/file22767/hp_fix.diff](http://bugs.python.org/file22767/hp_fix.diff) for [https://github.com/gregmuellegger/django/issues/1](https://github.com/gregmuellegger/django/issues/1)
+* v0.19.4
+ * Bugfix for PyPy in local_sync_cache get_cache_information(): sys.getsizeof() not implemented on PyPy
+ * Bugfix in template.filters.chmod_symbol()
+ * Nicer solution for template.filters.human_duration()
+* v0.19.3
+ * Add support for https in utils/http.py
+* v0.19.2
+ * Bugfix in utils/http.py timeout work-a-round
+* v0.19.1
+ * utils/http.py changes:
+ * Use a better solution, see:
+ * Add timeout and add a work-a-round for Python < 2.6
+* v0.19.0
+ * NEW: Add utils/http.py with helpers to get a webpage via http GET in unicode
+ * Change README from textile to creole ;)
+* v0.18.2
+ * Bugfix: Add missing template in pypi package
+* v0.18.0
+ * NEW: Add DOM compare from Gregor Müllegger GSoC work into unittest utils.
+* v0.17.1
+ * Bugfix in “limit_to_usergroups”: Make choices “lazy”: Don’t access the database in _init_
+* v0.17
+ * Add the script “upgrade_virtualenv.py”
+ * Add “limit_to_usergroups”
+ * Add “local sync cache”
+ * Add models.UpdateInfoBaseModel
+ * Update decorators.render_to
+ * render_to pass keyword arguments to render_to_response() (e.g.: mimetype=“text/plain”)
+ * new argument “skip_fail” in get_filtered_apps(): If True: raise excaption if app is not importable
+* v0.16.4
+ * Bugfix: `get_db_prep_save() got an unexpected keyword argument 'connection’` when save a SignSeparatedModelField()
+* v0.16.3
+ * Update BrowserDebug: Use response.templates instead of response.template and make output nicer
+* v0.16.2
+ * Merge stack info code and display better stack info on browser debug page
+* v0.16.1
+ * Update django_tools.utils.messages.StackInfoStorage for django code changes.
+* v0.16.0
+ * NEW: path model field (check if direcotry exist)
+* v0.15.0
+ * NEW: Add a flexible URL field (own validator, model- and form-field)
+* v0.14.1
+ * Bugfix: make path in MediaPathModelField relativ (remove slashes)
+* v0.14
+ * NEW: django-tagging addon: Display existing tags under a tag field
+* v0.13
+ * Bugfix UnicodeEncodeError in Browser debug
+* v0.12
+ * NEW: django_tools.utils.messages.failsafe_message
+* v0.11
+ * NEW: Store data in a secure cookie, see: utils/client_storage.py
+* v0.10.1
+ * New: Display used templates in unittest BrowserDebug
+ * Bugfix: catch if last usermessages exist
+* v0.10.0
+ * NEW: utils around django messages, see: /django_tools/utils/messages.py
+* v0.9.1
+ * Bugfix: database column was not created: don’t overwrite get_internal_type()
+* v0.9
+ * New: stuff in /django_tools/fields/
+ * see also backwards-incompatible changes, above!
+* v0.8.2
+ * New: widgets.SelectMediaPath(): Select a sub directory in settings.MEDIA_ROOT
+ * New: fields.SignSeparatedField()
+* v0.8.1
+ * Add “no_args” keyword argument to installed_apps_utils.get_filtered_apps()
+* v0.8.0
+ * Add model LanguageCode field and form LanguageCode field in Accept-Language header format (RFC 2616)
+* v0.7.0
+ * Add decorators.py
+* v0.6.0
+ * Add forms_utils.LimitManyToManyFields, crosspost: [http://www.djangosnippets.org/snippets/1691/](http://www.djangosnippets.org/snippets/1691/)
+* v0.5.0
+ * Add template/filters.py from PyLucid v0.8.x
+* v0.4.0
+ * Add experimental “warn_invalid_template_vars”
+* v0.3.1
+ * Bugfix: Exclude the instance if it was saved in the past.
+* v0.3.0
+ * Add utils.installed_apps_utils
+* v0.2.0
+ * Add models_utils, see: [http://www.jensdiemer.de/_command/118/blog/detail/67/](http://www.jensdiemer.de/_command/118/blog/detail/67/) (de)
+* v0.1.0
+ * first version cut out from PyLucid CMS – [http://www.pylucid.org](http://www.pylucid.org)
+## links
+| Homepage | [https://github.com/jedie/django-tools](https://github.com/jedie/django-tools) |
+| PyPi | [https://pypi.python.org/pypi/django-tools/](https://pypi.python.org/pypi/django-tools/) |
+## donation
+* [paypal.me/JensDiemer](https://www.paypal.me/JensDiemer)
+* [Flattr This!](https://flattr.com/submit/auto?uid=jedie&url=https%3A%2F%2Fgithub.com%2Fjedie%2Fdjango-tools%2F)
+* Send [Bitcoins](https://www.bitcoin.org/) to [1823RZ5Md1Q2X5aSXRC5LRPcYdveCiVX6F](https://blockexplorer.com/address/1823RZ5Md1Q2X5aSXRC5LRPcYdveCiVX6F)
+
+%package -n python3-django-tools
+Summary: miscellaneous tools for Django based projects
+Provides: python-django-tools
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-django-tools
+```
+### SetRequestDebugMiddleware
+middleware to add debug bool attribute to request object.
+More info: [./debug/README.creole](https://github.com/jedie/django-tools/blob/master/django_tools/debug/README.creole)
+### TracebackLogMiddleware
+Put traceback in log by call [logging.exception()](https://docs.python.org/3/library/logging.html#logging.Logger.exception) on `process_exception()`
+Activate with:
+```
+MIDDLEWARE_CLASSES = (
+ 'django_tools.middlewares.TracebackLogMiddleware.TracebackLogMiddleware',
+)
+```
+### FnMatchIps() - Unix shell-style wildcards in INTERNAL_IPS / ALLOWED_HOSTS
+settings.py e.g.:
+```
+from django_tools.settings_utils import FnMatchIps
+INTERNAL_IPS = FnMatchIps(["127.0.0.1", "::1", "192.168.*.*", "10.0.*.*"])
+ALLOWED_HOSTS = FnMatchIps(["127.0.0.1", "::1", "192.168.*.*", "10.0.*.*"])
+```
+### StdoutStderrBuffer()
+redirect stdout + stderr to a string buffer. e.g.:
+```
+from django_tools.unittest_utils.stdout_redirect import StdoutStderrBuffer
+with StdoutStderrBuffer() as buffer:
+ print("foo")
+output = buffer.get_output() # contains "foo\n"
+```
+### Management commands
+#### permission_info
+List all permissions for one django user.
+(Needs `'django_tools'` in INSTALLED_APPS)
+e.g.:
+```
+$ ./manage.py permission_info
+No username given!
+All existing users are:
+foo, bar, john, doe
+$ ./manage.py permission_info foo
+All permissions for user 'test_editor':
+ is_active : yes
+ is_staff : yes
+ is_superuser : no
+[*] admin.add_logentry
+[*] admin.change_logentry
+[*] admin.delete_logentry
+[ ] auth.add_group
+[ ] auth.add_permission
+[ ] auth.add_user
+```
+#### logging_info
+Shows a list of all loggers and marks which ones are configured in settings.LOGGING:
+```
+$ ./manage.py logging_info
+```
+#### nice_diffsettings
+Similar to django 'diffsettings', but used pretty-printed representation:
+```
+$ ./manage.py nice_diffsettings
+```
+#### database_info
+Just display some information about the used database and connections:
+```
+$ ./manage.py database_info
+```
+#### list_models
+Just list all existing models in app_label.ModelName format. Useful to use this in 'dumpdata' etc:
+```
+$ ./manage.py list_models
+```
+### ..all others…
+There exist many miscellaneous stuff. Look in the source, luke!
+## Backwards-incompatible changes
+Old changes archived in git history here:
+* [>=v0.47](https://github.com/jedie/django-tools/tree/v0.49.0#backwards-incompatible-changes)
+* [>=v0.35](https://github.com/jedie/django-tools/tree/v0.35.0#backwards-incompatible-changes)
+### v0.51
+All Selenium helper are deprecated, please migrate to [Playwright](https://playwright.dev/python/) ;)
+### v0.50
+Removed old selenium helper function, [deprecated since v0.43](https://github.com/jedie/django-tools/tree/v0.43.0#v043)
+Make all Selenium web driver instances persistent for the complete test run session.
+This speedup tests and fixed some bugs in Selenium.
+This result in the same browser/webdriver settings for all test classes!
+## Django compatibility
+| django-tools | django version | python |
+| ---------------- | -------------- | --------------- |
+| >= v0.52.0 | 3.2, 4.0, 4.1 | 3.8, 3.9, 3.10 |
+| >= v0.50.0 | 2.2, 3.2, 4.0 | 3.8, 3.9, 3.10 |
+| >= v0.49.0 | 2.2, 3.1, 3.2 | 3.7, 3.8, 3.9 |
+| >= v0.47.0 | 2.2, 3.0, 3.1 | >= 3.6, pypy3 |
+| >= v0.39 | 1.11, 2.0 | 3.5, 3.6, pypy3 |
+| >= v0.38.1 | 1.8, 1.11 | 3.5, 3.6, pypy3 |
+| >= v0.38.0 | 1.8, 1.11 | 3.5, 3.6 |
+| >= v0.37.0 | 1.8, 1.11 | 3.4, 3.5 |
+| >= v0.33.0 | 1.8, 1.11 | 2.7, 3.4, 3.5 |
+| v0.30.1-v0.32.14 | 1.8, 1.9, 1.10 | 2.7, 3.4, 3.5 |
+| v0.30 | 1.8, 1.9 | 2.7, 3.4 |
+| v0.29 | 1.6 - 1.8 | 2.7, 3.4 |
+| v0.26 | <=1.6 | |
+| v0.25 | <=1.4 | |
+(See also combinations for [tox in pyproject.toml](https://github.com/jedie/django-tools/blob/master/pyproject.toml))
+## history
+* *dev* - [compare v0.54.0...main](https://github.com/jedie/django-tools/compare/v0.54.0...main)
+ * TBC
+* [v0.54.0 - 15.09.2022](https://github.com/jedie/django-tools/compare/v0.53.0...v0.54.0)
+ * Run [safety](https://github.com/pyupio/safety) in CI pipeline.
+ * NEW: `SyslogHandler` for easy logging to `syslog`
+ * Replace creole README with markdown
+* [v0.53.0 - 18.08.2022](https://github.com/jedie/django-tools/compare/v0.52.0...v0.53.0)
+ * NEW: `MassContextManagerBase`, `DenyStdWrite` + Updated: `StdoutStderrBuffer`
+ * Enhance `run_testserver` command
+ * Small test project setup updates
+* [v0.52.0 - 17.08.2022](https://github.com/jedie/django-tools/compare/v0.51.0...v0.52.0)
+ * Move `run_testserver` management command from `django_tools_test_app` to `django_tools` and polish it.
+ * Restrict `AlwaysLoggedInAsSuperUserMiddleware` to the admin.
+ * Test with Django 3.2, 4.0 and 4.1
+* [v0.51.0 - 26.07.2022](https://github.com/jedie/django-tools/compare/v0.50.0...v0.51.0)
+ * NEW: `check_editor_config()` to check editor config and line length in projects
+ * DEPRECATE all Selenium helper, please migrate to Playwright ;)
+ * NEW: [Playwright](https://playwright.dev/python/) base Unittest class and login helper
+* [v0.50.0 - 29.05.2022](https://github.com/jedie/django-tools/compare/v0.49.0...v0.50.0)
+ * Rename git "master" branch to "main"
+ * Use [webdriver-manager](https://github.com/SergeyPirogov/webdriver_manager) to setup selenium web drivers
+ * CHANGE: Now all web driver instances are cached and reused for the complete test run!
+ * Use [darker](https://github.com/akaihola/darker) for code formatting
+ * Update test matrix: Add Python 3.10 and Django v4.0 (remove Python 3.7 and Django 3.1)
+* v0.49.0 - 22.11.2021 - [compare v0.48.3...v0.49.0](https://github.com/jedie/django-tools/compare/v0.48.3...v0.49.0)
+ * NEW: `VersionProtectBaseModel` - Protect a model against overwriting a newer entry with an older one, by adding a auto increment version number.
+ * NEW: `AlwaysLoggedInAsSuperUserMiddleware` useful for local dev server run to auto login into Django Admin
+ * Enhance Selenium test helpers and [fix #21: Set chrome accept_languages in headless mode](https://github.com/jedie/django-tools/issues/21)
+ * Update project: Tests, code-style etc.
+* v0.48.3 - 20.12.2020 - [compare v0.47.2...v0.48.3](https://github.com/jedie/django-tools/compare/v0.47.2...v0.48.3)
+ * NEW: `ImageDummy().in_memory_image_file()` useful for e.g.: POST a image upload via Django's test client
+* v0.48.2 - 06.12.2020 - [compare v0.47.1...v0.48.2](https://github.com/jedie/django-tools/compare/v0.47.1...v0.48.2)
+ * Bugfix "Serve User Media File": Create tokens via migrations and handle if tokens not exists
+* v0.48.1 - 06.12.2020 - [compare v0.47.0...v0.48.1](https://github.com/jedie/django-tools/compare/v0.47.0...v0.48.1)
+ * Add migration file to "Serve User Media File"
+* v0.48.0 - 06.12.2020 - [compare v0.47.0...v0.48.0](https://github.com/jedie/django-tools/compare/v0.47.0...v0.48.0)
+ * NEW: "Serve User Media File" reuseable app
+ * NEW: django_tools.unittest_utils.signals.SignalsContextManager
+ * Update `installed_apps_utils.get_filtered_apps()` and support app config entries in `settings.INSTALLED_APPS`
+* v0.47.0 - 26.11.2020 - [compare v0.46.1...v0.47.0](https://github.com/jedie/django-tools/compare/v0.46.1...v0.47.0)
+ * updates for newer django versions
+ * NEW: assert_warnings(), assert_no_warnings() and assert_in_logs()
+ * remove broken LoggingBuffer()
+ * update project setup, fix tests and pipelines
+* v0.46.1 - 19.02.2020 - [compare v0.46.0...v0.46.1](https://github.com/jedie/django-tools/compare/v0.46.0...v0.46.1)
+ * less restricted dependency specification
+ * NEW: `"django_tools.middlewares.LogHeaders.LogRequestHeadersMiddleware"`
+ * SeleniumChromiumTestCase: set "accept_languages" and disable "headless" mode, see also: [https://github.com/jedie/django-tools/issues/21](https://github.com/jedie/django-tools/issues/21)
+* v0.46.0 - 13.02.2020 - [compare v0.45.3...v0.46.0](https://github.com/jedie/django-tools/compare/v0.45.3...v0.46.0)
+ * `dynamic_site` was removed. Please use e.g.: [django-hosts](https://github.com/jazzband/django-hosts)
+ * modernize project setup and use `poetry`
+ * remove `lxml` decency by using [bleach](https://github.com/mozilla/bleach) for `html_utils.html2text`
+ * update code and code style
+* v0.45.3 - 25.08.2019 - [compare v0.45.2...v0.45.3](https://github.com/jedie/django-tools/compare/v0.45.2...v0.45.3)
+ * Add `excepted_exit_code` to `django_tools.unittest_utils.django_command.DjangoCommandMixin` to it's possible to test errors in manage commands
+* v0.45.2 - 26.06.2019 - [compare v0.45.1...v0.45.2](https://github.com/jedie/django-tools/compare/v0.45.1...v0.45.2)
+ * NEW: `django_tools.log_utils.throttle_admin_email_handler.ThrottledAdminEmailHandler`
+* v0.45.1 - 03.04.2019 - [compare v0.45.0...v0.45.1](https://github.com/jedie/django-tools/compare/v0.45.0...v0.45.1)
+ * Bugfix ValueError in `django_tools.unittest_utils.email.print_mailbox`
+* v0.45.0 - 01.04.2019 - [compare v0.44.2...v0.45.0](https://github.com/jedie/django-tools/compare/v0.44.2...v0.45.0)
+ * NEW: `OverwriteFileSystemStorage` with backup functionality
+ * NEW: `print_exc_plus()` - traceback with a listing of all the local variables
+ * NEW: `assert_pformat_equal` with `pprintpp` and `icdiff`
+ * NEW: `assert_filenames_and_content`
+* v0.44.2 - 02.01.2019 - [compare v0.44.1...v0.44.2](https://github.com/jedie/django-tools/compare/v0.44.1...v0.44.2)
+ * Handle errors like: [https://github.com/andymccurdy/redis-py/issues/995](https://github.com/andymccurdy/redis-py/issues/995)
+* v0.44.1 - 02.01.2019 - [compare v0.44.0...v0.44.1](https://github.com/jedie/django-tools/compare/v0.44.0...v0.44.1)
+ * `LoggingBuffer`: Don't deactivate existing log handler, just append the buffer handler.
+* v0.44.0 - 13.12.2018 - [compare v0.43.2...v0.44.0](https://github.com/jedie/django-tools/compare/v0.43.2...v0.44.0)
+ * NEW: `django_file = ImageDummy().create_django_file_info_image(text="")` e.g.: for attach to `models.ImageField()`
+ * Make `mockup.ImageDummy()` usable even if django-filer is not installed.
+ * `mockup.ImageDummy()` default image format changed from png to jpeg
+ * Cleanup: remove old, since v0.35 deprecated mockup image API
+* v0.43.2 - 11.12.2018 - [compare v0.43.1...v0.43.2](https://github.com/jedie/django-tools/compare/v0.43.1...v0.43.2)
+ * Bugfix Selenium refactor: Use the class with the same functionality if old usage places are used.
+* v0.43.1 - 11.12.2018 - [compare v0.43.0...v0.43.1](https://github.com/jedie/django-tools/compare/v0.43.0...v0.43.1)
+ * Bugfix: Selenium test cases: clear `window.localStorage` after test run
+* v0.43.0 - 11.12.2018 - [compare v0.42.4...v0.43.0](https://github.com/jedie/django-tools/compare/v0.42.4...v0.43.0)
+ * Refactor selenium helpers
+ * Split selenium test cases: with and without Django StaticLiveServerTestCase
+ * NEW: Selenium helper to access `window.localStorage`
+* v0.42.4 - 12.10.2018 - [compare v0.42.3...v0.42.4](https://github.com/jedie/django-tools/compare/v0.42.3...v0.42.4)
+ * Add `request` object to `TestUserMixin.login()` (needed for e.g.: django-axes auth backend)
+* v0.42.3 - 10.10.2018 - [compare v0.42.2...v0.42.3](https://github.com/jedie/django-tools/compare/v0.42.2...v0.42.3)
+ * NEW: * `assertments.assert_is_dir`, `assertments.assert_is_file`, `assertments.assert_path_not_exists`
+* v0.42.2 - 18.09.2018 - [compare v0.42.1...v0.42.2](https://github.com/jedie/django-tools/compare/v0.42.1...v0.42.2)
+ * NEW: `assert_installed_apps()` - Check entries in settings.INSTALLED_APPS
+* v0.42.1 - 17.09.2018 - [compare v0.42.0...v0.42.1](https://github.com/jedie/django-tools/compare/v0.42.0...v0.42.1)
+ * NEW: `django_tools.unittest_utils.assertments.assert_language_code` - Check if given language_code is in settings.LANGUAGES
+* v0.42.0 - 07.09.2018 - [compare v0.41.0...v0.42.0](https://github.com/jedie/django-tools/compare/v0.41.0...v0.42.0)
+ * remove all celery stuff
+ * NEW: `$ ./manage.py logging_info` Shows a list of all loggers and marks which ones are configured in settings.LOGGING
+ * manage commands `list_models` and `nice_diffsettings` are moved from seperate apps
+* v0.41.0 - 28.08.2018 - [compare v0.40.6...v0.41.0](https://github.com/jedie/django-tools/compare/v0.40.6...v0.41.0)
+ * NEW: `unittest_utils/assertments.py` with some common assert functions
+ * Remove `@task_always_eager()` decorator
+* v0.40.6 - 28.08.2018 - [compare v0.40.5...v0.40.6](https://github.com/jedie/django-tools/compare/v0.40.5...v0.40.6)
+ * Bugfix `@task_always_eager()` decorator
+* v0.40.5 - 27.08.2018 - [compare v0.40.4...v0.40.5](https://github.com/jedie/django-tools/compare/v0.40.4...v0.40.5)
+ * Bugfix `DjangoCommandMixin.call_manage_py()`: Use the given `manage.py` filename
+* v0.40.4 - 21.08.2018 - [compare v0.40.3...v0.40.4](https://github.com/jedie/django-tools/compare/v0.40.3...v0.40.4)
+ * NEW: `django_tools.debug.delay` to simulate longer processing time by set a delay via GET parameter (see above)
+* v0.40.3 - 18.07.2018 - [compare v0.40.2...v0.40.3](https://github.com/jedie/django-tools/compare/v0.40.2...v0.40.3)
+ * Enhance selenium test cases:
+ * NEW: `assert_visible_by_id()`
+ * NEW: `assert_clickable_by_id()`
+ * NEW: `assert_clickable_by_xpath()`
+ * add `desired_capabilities` to firefox and chrome test cases
+ * enable logging in chrome test case
+ * NEW: `assert_in_browser_log()` in chrome test case
+* v0.40.2 - 04.07.2018 - [compare v0.40.1...v0.40.2](https://github.com/jedie/django-tools/compare/v0.40.1...v0.40.2)
+ * Bugfix selenium Test Case if driver is None
+ * Bugfix django compatibility
+* v0.40.1 - 28.06.2018 - [compare v0.40.0...v0.40.1](https://github.com/jedie/django-tools/compare/v0.40.0...v0.40.1)
+ * Bugfix selenium test case if executable can't be found.
+* v0.40.0 - 15.06.2018 - [compare v0.39.6...v0.40.0](https://github.com/jedie/django-tools/compare/v0.39.6...v0.40.0)
+ * NEW: selenium chrome and firefox test cases in `django_tools.unittest_utils.selenium_utils`
+ * Fix test project and add `run_test_project_dev_server.sh` for easy test
+ * Fixing tests
+* v0.39.6 - 04.05.2018 - [compare v0.39.5...v0.39.6](https://github.com/jedie/django-tools/compare/v0.39.5...v0.39.6)
+ * Enhance model instance unittest code generator
+* v0.39.5 - 24.04.2018 - [compare v0.39.4...v0.39.5](https://github.com/jedie/django-tools/compare/v0.39.4...v0.39.5)
+ * NEW: Model instance unittest code generator (see above)
+* v0.39.4 - 06.04.2018 - [compare v0.39.3...v0.39.4](https://github.com/jedie/django-tools/compare/v0.39.3...v0.39.4)
+ * NEW: `django_tools.unittest_utils.logging_utils.FilterAndLogWarnings` and `django_tools.unittest_utils.logging_utils.CutPathnameLogRecordFactory`
+* v0.39.3 - 22.03.2018 - [compare v0.39.2...v0.39.3](https://github.com/jedie/django-tools/compare/v0.39.2...v0.39.3)
+ * `django_tools.permissions.get_filtered_permissions` has new keyword argument: `exclude_actions`
+* v0.39.2 - 22.03.2018 - [compare v0.39.1...v0.39.2](https://github.com/jedie/django-tools/compare/v0.39.1...v0.39.2)
+ * NEW: `django_tools.parler_utils.parler_fixtures.ParlerDummyGenerator`
+ * NEW: `django_tools.fixture_tools.languages.iter_languages`
+* v0.39.1 - 19.03.2018 - [compare v0.39.0...v0.39.1](https://github.com/jedie/django-tools/compare/v0.39.0...v0.39.1)
+ * NEW: `django_tools.unittest_utils.email.print_mailbox()`
+ * minor updates
+* v0.39.0 - 02.03.2018 - [compare v0.38.9...v0.39.0](https://github.com/jedie/django-tools/compare/v0.38.9...v0.39.0)
+ * NEW: Isolated Filesystem decorator / context manager
+ * Backwards-incompatible change: file renamed `django_tools/unittest_utils/{celery.py => celery_utils.py`}
+ * Skip run test with Django 1.8 and run tests with Django 1.11 and 2.0
+* v0.38.9 - 05.02.2018 - [compare v0.38.8...v0.38.9](https://github.com/jedie/django-tools/compare/v0.38.8...v0.38.9)
+ * lowering log level on missing permissions from "error" to "debug"
+* v0.38.8 - 05.02.2018 - [compare v0.38.7...v0.38.8](https://github.com/jedie/django-tools/compare/v0.38.7...v0.38.8)
+ * send mail: use from celery import shared_task instead of djcelery_transactions
+* v0.38.7 - 15.01.2018 - [compare v0.38.6...v0.38.7](https://github.com/jedie/django-tools/compare/v0.38.6...v0.38.7)
+ * Add missing arguments (like "attachments", "cc" etc.) to `django_tools.mail.send_mail.SendMailCelery`
+* v0.38.6 - 10.01.2018 - [compare v0.38.4...v0.38.5](https://github.com/jedie/django-tools/compare/v0.38.4...v0.38.5)
+ * NEW: `./manage.py clear_cache`
+ * Display POST data in browser debug (`django_tools.unittest_utils.BrowserDebug.debug_response`)
+* v0.38.5 - 02.01.2018 - [compare v0.38.4...v0.38.5](https://github.com/jedie/django-tools/compare/v0.38.4...v0.38.5)
+ * NEW: Helper to assert django message framework output in unittests:
+ * `BaseUnittestCase.get_messages()`: return a list of all messages
+ * `BaseTestCase.assertMessages()`: compare messages
+ * `BaseTestCase.assertResponse()`: has new keyword argument `messages`
+ * NEW: `BaseUnittestCase.assert_exception_startswith()`
+* v0.38.4 - 28.12.2017 - [compare v0.38.3...v0.38.4](https://github.com/jedie/django-tools/compare/v0.38.3...v0.38.4)
+ * Bugfix attach user group on existing user in: `django_tools.unittest_utils.user.get_or_create_user`
+* v0.38.3 - 28.12.2017 - [compare v0.38.2...v0.38.3](https://github.com/jedie/django-tools/compare/v0.38.2...v0.38.3)
+ * Bugfix: `unittest_utils.user.get_or_create_group` also removes obsolete permissions, too.
+* v0.38.2 - 27.12.2017 - [compare v0.38.1...v0.38.2](https://github.com/jedie/django-tools/compare/v0.38.1...v0.38.2)
+ * NEW: `./manage.py update_permissions`
+* v0.38.1 - 21.12.2017 - [compare v0.38.0...v0.38.1](https://github.com/jedie/django-tools/compare/v0.38.0...v0.38.1)
+ * refactor travis/tox/pytest/coverage stuff
+ * Tests can be run via `python3 setup.py tox` and/or `python3 setup.py test`
+ * Test also with pypy3 on Travis CI.
+* v0.38.0 - 19.12.2017 - [compare v0.37.0...v0.38.0](https://github.com/jedie/django-tools/compare/v0.37.0...v0.38.0)
+ * NEW: `django_tools.unittest_utils.user.get_or_create_group`
+ * NEW: `django_tools.unittest_utils.user.get_or_create_user`
+ * NEW: `django_tools.unittest_utils.user.get_or_create_user_and_group`
+ * NEW: `BaseUnittestCase.get_admin_change_url()` and `BaseUnittestCase.get_admin_add_url()`
+ * NEW: `BaseUnittestCase.assert_startswith()` and `BaseUnittestCase.assert_endswith()`
+* v0.37.0 - 11.12.2017 - [compare v0.36.0...v0.37.0](https://github.com/jedie/django-tools/compare/v0.36.0...v0.37.0)
+ * Skip official support for python v2 (remove from text matrix)
+ * NEW: `./manage.py permission_info`: Display a list of all permissions for one django user
+ * NEW: `django_tools.permissions.get_filtered_permissions()` and `django_tools.permissions.pprint_filtered_permissions()`
+ * `django_tools.settings_utils.InternalIps` was renamed to `FnMatchIps` and can be also used for **ALLOWED_HOSTS**
+ * Bugfix/Enhance permission helpers
+* v0.36.0 - 20.11.2017 - [compare v0.35.0...v0.36.0](https://github.com/jedie/django-tools/compare/v0.35.0...v0.36.0)
+ * NEW: `./manage.py database_info`
+ * Bugfix: **ModelPermissionMixin**
+ * Dynamic Sites is no longer maintained and tests are deactivated. It's currently not compatible with all django versions.
+* v0.35.0 - 26.09.2017 - [compare v0.34.0...v0.35.0](https://github.com/jedie/django-tools/compare/v0.34.0...v0.35.0)
+ * CHANGE: The dummy image generation function in `django_tools.unittest_utils.mockup` has a new API.
+* v0.34.0 - 18.09.2017 - [compare v0.33.0...v0.34.0](https://github.com/jedie/django-tools/compare/v0.33.0...v0.34.0)
+ * CHANGE: The test usernames changed and spaces was replace with underscores e.g.: "staff test user" -> "staff_test_user"
+ * Bugfix in mockup.create_pil_image: Created images has wrong sizes
+* v0.33.0 - 11.07.2017 - [compare v0.32.14...v0.33.0](https://github.com/jedie/django-tools/compare/v0.32.14...v0.33.0)
+ * Run tests only against Django v1.8 TLS and v1.11 TLS
+ * For Django 1.11: Add support for new-style middleware - contributed by benkonrath
+ * NEW: `django_tools.utils.request.create_fake_request()` for easier create a faked request object with `RequestFactory`
+ * NEW: `django_tools.utils.html_utils.html2text()` - Strip HTML tags with lxml Cleaner + Django 'strip_tags'
+* v0.32.14 - 14.06.2017 - [compare v0.32.13...v0.32.14](https://github.com/jedie/django-tools/compare/v0.32.13...v0.32.14)
+ * Bugfix for Python 2: `mock` backport package is needed and added to `setup.install_requires`
+* v0.32.13 - 24.05.2017 - [compare v0.32.12...v0.32.13](https://github.com/jedie/django-tools/compare/v0.32.12...v0.32.13)
+ * remove some warnings
+* v0.32.12 - 04.05.2017 - [compare v0.32.11...v0.32.12](https://github.com/jedie/django-tools/compare/v0.32.11...v0.32.12)
+ * NEW: `self.assertIn_dedent()` in `django_tools.unittest_utils.unittest_base.BaseUnittestCase`
+* v0.32.11 - 02.05.2017 - [compare v0.32.10...v0.32.11](https://github.com/jedie/django-tools/compare/v0.32.10...v0.32.11)
+ * Fix PyPi package mistake (`.tar.gz` archive contains `.tox` ;)
+* v0.32.10 - 02.05.2017 - [compare v0.32.9...v0.32.10](https://github.com/jedie/django-tools/compare/v0.32.9...v0.32.10)
+ * NEW: `django_tools.mail` to send text+html mails (see above)
+* v0.32.9 - 21.03.2017 - [compare v0.32.8...v0.32.9](https://github.com/jedie/django-tools/compare/v0.32.8...v0.32.9)
+ * Bugfix `DebugCacheLoader` if TemplateDoesNotExist was raised
+* v0.32.8 - 16.03.2017 - [compare v0.32.7...v0.32.8](https://github.com/jedie/django-tools/compare/v0.32.7...v0.32.8)
+ * NEW: `django_tools.template.loader.DebugCacheLoader` to add template name as html comments
+ * Change temp filename in BrowserDebug and use `django_tools_browserdebug_` prefix
+ * Bugfix in `django_tools.middlewares.ThreadLocal.ThreadLocalMiddleware`
+* v0.32.7 - 10.03.2017 - [compare v0.32.6...v0.32.7](https://github.com/jedie/django-tools/compare/v0.32.6...v0.32.7)
+ * NEW: `django_tools.permissions` - helper for setup permissions
+ * NEW: `/unittest_utils/user.py` - helper for creating users (needfull in unittests)
+* v0.32.6 - 22.02.2017 - [compare v0.32.5...v0.32.6](https://github.com/jedie/django-tools/compare/v0.32.5...v0.32.6)
+* `@task_always_eager()` decorator will set `CELERY_EAGER_PROPAGATES_EXCEPTIONS=True`, too.
+* v0.32.5 - 10.02.2017 - [compare v0.32.4...v0.32.5](https://github.com/jedie/django-tools/compare/v0.32.4...v0.32.5)
+ * NEW: Add `template_name` (optional) to `self.assertResponse()` (check with `assertTemplateUsed()`)
+* v0.32.4 - 01.02.2017 - [compare v0.32.3...v0.32.4](https://github.com/jedie/django-tools/compare/v0.32.3...v0.32.4)
+* Fix: Set "is_active" for created test users
+* v0.32.3 - 25.01.2017 - [compare v0.32.2...v0.32.3](https://github.com/jedie/django-tools/compare/v0.32.2...v0.32.3)
+ * Fix UnicodeDecodeError in BrowserDebug
+ * NEW: `@set_string_if_invalid()` decorator
+ * NEW: `@task_always_eager()` decorator
+* v0.32.2 - 13.01.2017 - [compare v0.32.1...v0.32.2](https://github.com/jedie/django-tools/compare/v0.32.1...v0.32.2)
+ * NEW: django_tools.utils.url.GetDict
+* v0.32.1 - 29.12.2016 - [compare v0.32.0...v0.32.1](https://github.com/jedie/django-tools/compare/v0.32.0...v0.32.1)
+ * NEW: TracebackLogMiddleware
+* v0.32.0 - 19.12.2016 - [compare v0.31.0...v0.32.0](https://github.com/jedie/django-tools/compare/v0.31.0...v0.32.0)
+ * NEW: Management commands: 'nice_diffsettings', 'list_models'
+ * NEW: @display_admin_error to display silent errors in ModelAdmin.list_display callables.
+ * NEW: django_tools.template.render.render_template_file
+ * use [pytest-django](https://pypi.python.org/pypi/pytest-django)
+ * remove outdated stuff: See 'Backwards-incompatible changes' above.
+* v0.31.0 - 03.11.2016 - [compare v0.30.4...v0.31.0](https://github.com/jedie/django-tools/compare/v0.30.4...v0.31.0)
+ * add Mockup utils to create dummy PIL/django-filer images with Text (see above)
+ * move tests into `/django_tools_tests/`
+* v0.30.4 - 27.10.2016 - [compare v0.30.2...v0.30.4](https://github.com/jedie/django-tools/compare/v0.30.2...v0.30.4)
+ * add DjangoCommandMixin
+* v0.30.2 - 05.10.2016 - [compare v0.30.1...v0.30.2](https://github.com/jedie/django-tools/compare/v0.30.1...v0.30.2)
+ * Bugfix Python 2 compatibility
+* v0.30.1 - 26.08.2016 - [compare v0.30.0...v0.30.1](https://github.com/jedie/django-tools/compare/v0.30.0...v0.30.1)
+ * add: `django_tools.unittest_utils.disable_migrations.DisableMigrations` (see above)
+ * run tests also with django v1.10 and Python 3.5
+ * use tox
+* v0.30.0 - 27.04.2016 - [compare v0.29.5...v0.30.0](https://github.com/jedie/django-tools/compare/v0.29.5...v0.30.0)
+ * Django 1.9 and Python 3 support contributed by [naegelyd](https://github.com/jedie/django-tools/pull/9)
+* v0.29.4 and v0.29.5 - 10.08.2015 - [compare v0.29.3...v0.29.5](https://github.com/jedie/django-tools/compare/v0.29.3...v0.29.5)
+ * Some bugfixes for django 1.6 support
+* v0.29.3 - 10.08.2015 - [compare v0.29.2...v0.29.3](https://github.com/jedie/django-tools/compare/v0.29.2...v0.29.3)
+ * Clear ThreadLocal request atttribute after response is processed (contributed by Lucas Wiman)
+* v0.29.2 - 19.06.2015 - [compare v0.29.1...v0.29.2](https://github.com/jedie/django-tools/compare/v0.29.1...v0.29.2)
+ * Bugfix in unittest_utils.selenium_utils.selenium2fakes_response
+ * assertResponse used assertContains from django
+ * Add QueryLogMiddleware (TODO: add tests)
+* v0.29.1 - 17.06.2015 - [compare v0.29.0...v0.29.1](https://github.com/jedie/django-tools/compare/v0.29.0...v0.29.1)
+ * Bugfixes for Py2 and Py3
+ * add StdoutStderrBuffer()
+* v0.29.0 - 09.06.2015 - [compare v0.26.0...v0.29.0](https://github.com/jedie/django-tools/compare/v0.26.0...v0.29.0)
+ * WIP: Refactor unittests (DocTests must be updated for Py3 and more unittests must be written to cover all)
+ * catch more directory traversal attacks in BaseFilesystemBrowser (and merge code parts)
+ * Bugfix for "django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet." if using **UpdateInfoBaseModel**
+ * Bugfixes in **dynamic_site** for django 1.7
+ * add: [django_tools.settings_utils.InternalIps](https://github.com/jedie/django-tools/blob/master/django_tools/settings_utils.py)
+* v0.28.0 - 12.02.2015 - [compare v0.26.0...v0.28.0](https://github.com/jedie/django-tools/compare/v0.26.0...v0.28.0)
+ * Work-a-round for import loops
+ * (new Version number, because of PyPi stress)
+* v0.26.0 - 11.02.2015 - [compare v0.25.1...v0.26.0](https://github.com/jedie/django-tools/compare/v0.25.1...v0.26.0)
+ * Updates for Django 1.6 and Python 3
+* v0.25.1 - 18.11.2013
+ * Bugfix: Fall back to "UTF-8" if server send no encoding info
+* v0.25.0 - 28.08.2012
+ * Rename **cache.clear()** in SmoothCacheBackends to **cache.smooth_update()**, so that reset timestamp is independ from clear the cache.
+* v0.24.10 - 24.08.2012
+ * Add **SmoothCacheBackends**: [./cache/README.creole](https://github.com/jedie/django-tools/blob/master/django_tools/cache/README.creole)
+* v0.24.9 - 24.08.2012
+ * Bugfix in per-site cache middleware: set inital count values to None, if counting is disabled.
+* v0.24.8 - 24.08.2012
+ * Enhanced **per-site cache middleware**: [./cache/README.creole](https://github.com/jedie/django-tools/blob/master/django_tools/cache/README.creole)
+ * Add **SetRequestDebugMiddleware**: [./debug/README.creole](https://github.com/jedie/django-tools/blob/master/django_tools/debug/README.creole)
+* v0.24.7 - 21.08.2012
+ * Add the **per-site cache middleware** (see above)
+ * Add **import lib helper**: [./utils/importlib.py](https://github.com/jedie/django-tools/blob/master/django_tools/utils/importlib.py)
+* v0.24.6 - 21.08.2012
+ * Add the **filemanager library** (see above)
+* v0.24.5 - 06.08.2012
+ * Add **Print SQL Queries** context manager. (see above)
+* v0.24.4 - 26.07.2012
+ * remove date from version string, cause of side-effects e.g.: user clone the repo and has the filter not installed
+* v0.24.3 - 25.07.2012
+ * "Hardcode" the version string date attachment via [gitattribute filter script](https://github.com/jedie/python-code-snippets/tree/master/CodeSnippets/git) to fix [a reported issues](https://github.com/jedie/django-tools/issues/1) with [pip requirements file bug](https://github.com/pypa/pip/issues/145).
+* v0.24.2 - 10.07.2012
+ * Split [UpdateInfoBaseModel()](https://github.com/jedie/django-tools/blob/master/django_tools/models.py): So you can only set "createtime", "lastupdatetime" or "createby", "lastupdateby" or both types (This is backwards compatible)
+* v0.24.1 - 12.06.2012
+ * Bugfix: UsergroupsModelField() and add unittests for it
+ * Add "normal users" in UsergroupsModelField()
+ * New: Add create_user() and create_testusers() to BaseTestCase
+ * Add a test project for the unittests. TODO: use this for all tests
+* v0.24.0 - 04.06.2012
+ * [Don't use auto_now_add and auto_now in UpdateInfoBaseModel](https://github.com/jedie/django-tools/commit/a3cf1f7b2e9dbe4964306f4793c74f1782f8b2ea)
+ * Bugfix in [UsergroupsModelField](https://github.com/jedie/django-tools/blob/master/django_tools/limit_to_usergroups.py)
+* v0.23.1
+ * [Dynamic Site](https://github.com/jedie/django-tools/tree/main/django_tools/dynamic_site#dynamic-site-id) would be only initialised if settings.USE_DYNAMIC_SITE_MIDDLEWARE = True
+* v0.23.0
+ * Use cryptographic signing tools from django 1.4 in django_tools.utils.client_storage
+* v0.22.0
+ * Add [static_path.py](https://github.com/jedie/django-tools/blob/master/django_tools/fields/static_path.py) thats used settings.STATIC_ROOT.
+ * The old [media_path.py](https://github.com/jedie/django-tools/blob/master/django_tools/fields/media_path.py) which used settings.MEDIA_ROOT is deprecated and will be removed in the future.
+ * auto_add_check_unique_together() can use settings.DATABASES["default"]["ENGINE"], too.
+* v0.21.1
+ * Bugfixes in [Dynamic Site](https://github.com/jedie/django-tools/tree/main/django_tools/dynamic_site#dynamic-site-id).
+* 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.)
+* v0.20.1
+ * New: [debug_csrf_failure()](https://github.com/jedie/django-tools/blob/master/django_tools/views/csrf.py) to display the normal debug page and not the minimal csrf debug page.
+* v0.20.0
+ * Add experimental [DynamicSiteMiddleware](https://github.com/jedie/django-tools/blob/master/django_tools/middlewares/DynamicSite.py), please test it and give feedback.
+* v0.19.6
+ * Add some south introspection rules for LanguageCodeModelField and jQueryTagModelField
+ * fallback if message for anonymous user can't created, because django.contrib.messages middleware not used.
+ * Bugfix in django_tools.utils.messages.StackInfoStorage
+* v0.19.5
+ * Add [http://bugs.python.org/file22767/hp_fix.diff](http://bugs.python.org/file22767/hp_fix.diff) for [https://github.com/gregmuellegger/django/issues/1](https://github.com/gregmuellegger/django/issues/1)
+* v0.19.4
+ * Bugfix for PyPy in local_sync_cache get_cache_information(): sys.getsizeof() not implemented on PyPy
+ * Bugfix in template.filters.chmod_symbol()
+ * Nicer solution for template.filters.human_duration()
+* v0.19.3
+ * Add support for https in utils/http.py
+* v0.19.2
+ * Bugfix in utils/http.py timeout work-a-round
+* v0.19.1
+ * utils/http.py changes:
+ * Use a better solution, see:
+ * Add timeout and add a work-a-round for Python < 2.6
+* v0.19.0
+ * NEW: Add utils/http.py with helpers to get a webpage via http GET in unicode
+ * Change README from textile to creole ;)
+* v0.18.2
+ * Bugfix: Add missing template in pypi package
+* v0.18.0
+ * NEW: Add DOM compare from Gregor Müllegger GSoC work into unittest utils.
+* v0.17.1
+ * Bugfix in “limit_to_usergroups”: Make choices “lazy”: Don’t access the database in _init_
+* v0.17
+ * Add the script “upgrade_virtualenv.py”
+ * Add “limit_to_usergroups”
+ * Add “local sync cache”
+ * Add models.UpdateInfoBaseModel
+ * Update decorators.render_to
+ * render_to pass keyword arguments to render_to_response() (e.g.: mimetype=“text/plain”)
+ * new argument “skip_fail” in get_filtered_apps(): If True: raise excaption if app is not importable
+* v0.16.4
+ * Bugfix: `get_db_prep_save() got an unexpected keyword argument 'connection’` when save a SignSeparatedModelField()
+* v0.16.3
+ * Update BrowserDebug: Use response.templates instead of response.template and make output nicer
+* v0.16.2
+ * Merge stack info code and display better stack info on browser debug page
+* v0.16.1
+ * Update django_tools.utils.messages.StackInfoStorage for django code changes.
+* v0.16.0
+ * NEW: path model field (check if direcotry exist)
+* v0.15.0
+ * NEW: Add a flexible URL field (own validator, model- and form-field)
+* v0.14.1
+ * Bugfix: make path in MediaPathModelField relativ (remove slashes)
+* v0.14
+ * NEW: django-tagging addon: Display existing tags under a tag field
+* v0.13
+ * Bugfix UnicodeEncodeError in Browser debug
+* v0.12
+ * NEW: django_tools.utils.messages.failsafe_message
+* v0.11
+ * NEW: Store data in a secure cookie, see: utils/client_storage.py
+* v0.10.1
+ * New: Display used templates in unittest BrowserDebug
+ * Bugfix: catch if last usermessages exist
+* v0.10.0
+ * NEW: utils around django messages, see: /django_tools/utils/messages.py
+* v0.9.1
+ * Bugfix: database column was not created: don’t overwrite get_internal_type()
+* v0.9
+ * New: stuff in /django_tools/fields/
+ * see also backwards-incompatible changes, above!
+* v0.8.2
+ * New: widgets.SelectMediaPath(): Select a sub directory in settings.MEDIA_ROOT
+ * New: fields.SignSeparatedField()
+* v0.8.1
+ * Add “no_args” keyword argument to installed_apps_utils.get_filtered_apps()
+* v0.8.0
+ * Add model LanguageCode field and form LanguageCode field in Accept-Language header format (RFC 2616)
+* v0.7.0
+ * Add decorators.py
+* v0.6.0
+ * Add forms_utils.LimitManyToManyFields, crosspost: [http://www.djangosnippets.org/snippets/1691/](http://www.djangosnippets.org/snippets/1691/)
+* v0.5.0
+ * Add template/filters.py from PyLucid v0.8.x
+* v0.4.0
+ * Add experimental “warn_invalid_template_vars”
+* v0.3.1
+ * Bugfix: Exclude the instance if it was saved in the past.
+* v0.3.0
+ * Add utils.installed_apps_utils
+* v0.2.0
+ * Add models_utils, see: [http://www.jensdiemer.de/_command/118/blog/detail/67/](http://www.jensdiemer.de/_command/118/blog/detail/67/) (de)
+* v0.1.0
+ * first version cut out from PyLucid CMS – [http://www.pylucid.org](http://www.pylucid.org)
+## links
+| Homepage | [https://github.com/jedie/django-tools](https://github.com/jedie/django-tools) |
+| PyPi | [https://pypi.python.org/pypi/django-tools/](https://pypi.python.org/pypi/django-tools/) |
+## donation
+* [paypal.me/JensDiemer](https://www.paypal.me/JensDiemer)
+* [Flattr This!](https://flattr.com/submit/auto?uid=jedie&url=https%3A%2F%2Fgithub.com%2Fjedie%2Fdjango-tools%2F)
+* Send [Bitcoins](https://www.bitcoin.org/) to [1823RZ5Md1Q2X5aSXRC5LRPcYdveCiVX6F](https://blockexplorer.com/address/1823RZ5Md1Q2X5aSXRC5LRPcYdveCiVX6F)
+
+%package help
+Summary: Development documents and examples for django-tools
+Provides: python3-django-tools-doc
+%description help
+```
+### SetRequestDebugMiddleware
+middleware to add debug bool attribute to request object.
+More info: [./debug/README.creole](https://github.com/jedie/django-tools/blob/master/django_tools/debug/README.creole)
+### TracebackLogMiddleware
+Put traceback in log by call [logging.exception()](https://docs.python.org/3/library/logging.html#logging.Logger.exception) on `process_exception()`
+Activate with:
+```
+MIDDLEWARE_CLASSES = (
+ 'django_tools.middlewares.TracebackLogMiddleware.TracebackLogMiddleware',
+)
+```
+### FnMatchIps() - Unix shell-style wildcards in INTERNAL_IPS / ALLOWED_HOSTS
+settings.py e.g.:
+```
+from django_tools.settings_utils import FnMatchIps
+INTERNAL_IPS = FnMatchIps(["127.0.0.1", "::1", "192.168.*.*", "10.0.*.*"])
+ALLOWED_HOSTS = FnMatchIps(["127.0.0.1", "::1", "192.168.*.*", "10.0.*.*"])
+```
+### StdoutStderrBuffer()
+redirect stdout + stderr to a string buffer. e.g.:
+```
+from django_tools.unittest_utils.stdout_redirect import StdoutStderrBuffer
+with StdoutStderrBuffer() as buffer:
+ print("foo")
+output = buffer.get_output() # contains "foo\n"
+```
+### Management commands
+#### permission_info
+List all permissions for one django user.
+(Needs `'django_tools'` in INSTALLED_APPS)
+e.g.:
+```
+$ ./manage.py permission_info
+No username given!
+All existing users are:
+foo, bar, john, doe
+$ ./manage.py permission_info foo
+All permissions for user 'test_editor':
+ is_active : yes
+ is_staff : yes
+ is_superuser : no
+[*] admin.add_logentry
+[*] admin.change_logentry
+[*] admin.delete_logentry
+[ ] auth.add_group
+[ ] auth.add_permission
+[ ] auth.add_user
+```
+#### logging_info
+Shows a list of all loggers and marks which ones are configured in settings.LOGGING:
+```
+$ ./manage.py logging_info
+```
+#### nice_diffsettings
+Similar to django 'diffsettings', but used pretty-printed representation:
+```
+$ ./manage.py nice_diffsettings
+```
+#### database_info
+Just display some information about the used database and connections:
+```
+$ ./manage.py database_info
+```
+#### list_models
+Just list all existing models in app_label.ModelName format. Useful to use this in 'dumpdata' etc:
+```
+$ ./manage.py list_models
+```
+### ..all others…
+There exist many miscellaneous stuff. Look in the source, luke!
+## Backwards-incompatible changes
+Old changes archived in git history here:
+* [>=v0.47](https://github.com/jedie/django-tools/tree/v0.49.0#backwards-incompatible-changes)
+* [>=v0.35](https://github.com/jedie/django-tools/tree/v0.35.0#backwards-incompatible-changes)
+### v0.51
+All Selenium helper are deprecated, please migrate to [Playwright](https://playwright.dev/python/) ;)
+### v0.50
+Removed old selenium helper function, [deprecated since v0.43](https://github.com/jedie/django-tools/tree/v0.43.0#v043)
+Make all Selenium web driver instances persistent for the complete test run session.
+This speedup tests and fixed some bugs in Selenium.
+This result in the same browser/webdriver settings for all test classes!
+## Django compatibility
+| django-tools | django version | python |
+| ---------------- | -------------- | --------------- |
+| >= v0.52.0 | 3.2, 4.0, 4.1 | 3.8, 3.9, 3.10 |
+| >= v0.50.0 | 2.2, 3.2, 4.0 | 3.8, 3.9, 3.10 |
+| >= v0.49.0 | 2.2, 3.1, 3.2 | 3.7, 3.8, 3.9 |
+| >= v0.47.0 | 2.2, 3.0, 3.1 | >= 3.6, pypy3 |
+| >= v0.39 | 1.11, 2.0 | 3.5, 3.6, pypy3 |
+| >= v0.38.1 | 1.8, 1.11 | 3.5, 3.6, pypy3 |
+| >= v0.38.0 | 1.8, 1.11 | 3.5, 3.6 |
+| >= v0.37.0 | 1.8, 1.11 | 3.4, 3.5 |
+| >= v0.33.0 | 1.8, 1.11 | 2.7, 3.4, 3.5 |
+| v0.30.1-v0.32.14 | 1.8, 1.9, 1.10 | 2.7, 3.4, 3.5 |
+| v0.30 | 1.8, 1.9 | 2.7, 3.4 |
+| v0.29 | 1.6 - 1.8 | 2.7, 3.4 |
+| v0.26 | <=1.6 | |
+| v0.25 | <=1.4 | |
+(See also combinations for [tox in pyproject.toml](https://github.com/jedie/django-tools/blob/master/pyproject.toml))
+## history
+* *dev* - [compare v0.54.0...main](https://github.com/jedie/django-tools/compare/v0.54.0...main)
+ * TBC
+* [v0.54.0 - 15.09.2022](https://github.com/jedie/django-tools/compare/v0.53.0...v0.54.0)
+ * Run [safety](https://github.com/pyupio/safety) in CI pipeline.
+ * NEW: `SyslogHandler` for easy logging to `syslog`
+ * Replace creole README with markdown
+* [v0.53.0 - 18.08.2022](https://github.com/jedie/django-tools/compare/v0.52.0...v0.53.0)
+ * NEW: `MassContextManagerBase`, `DenyStdWrite` + Updated: `StdoutStderrBuffer`
+ * Enhance `run_testserver` command
+ * Small test project setup updates
+* [v0.52.0 - 17.08.2022](https://github.com/jedie/django-tools/compare/v0.51.0...v0.52.0)
+ * Move `run_testserver` management command from `django_tools_test_app` to `django_tools` and polish it.
+ * Restrict `AlwaysLoggedInAsSuperUserMiddleware` to the admin.
+ * Test with Django 3.2, 4.0 and 4.1
+* [v0.51.0 - 26.07.2022](https://github.com/jedie/django-tools/compare/v0.50.0...v0.51.0)
+ * NEW: `check_editor_config()` to check editor config and line length in projects
+ * DEPRECATE all Selenium helper, please migrate to Playwright ;)
+ * NEW: [Playwright](https://playwright.dev/python/) base Unittest class and login helper
+* [v0.50.0 - 29.05.2022](https://github.com/jedie/django-tools/compare/v0.49.0...v0.50.0)
+ * Rename git "master" branch to "main"
+ * Use [webdriver-manager](https://github.com/SergeyPirogov/webdriver_manager) to setup selenium web drivers
+ * CHANGE: Now all web driver instances are cached and reused for the complete test run!
+ * Use [darker](https://github.com/akaihola/darker) for code formatting
+ * Update test matrix: Add Python 3.10 and Django v4.0 (remove Python 3.7 and Django 3.1)
+* v0.49.0 - 22.11.2021 - [compare v0.48.3...v0.49.0](https://github.com/jedie/django-tools/compare/v0.48.3...v0.49.0)
+ * NEW: `VersionProtectBaseModel` - Protect a model against overwriting a newer entry with an older one, by adding a auto increment version number.
+ * NEW: `AlwaysLoggedInAsSuperUserMiddleware` useful for local dev server run to auto login into Django Admin
+ * Enhance Selenium test helpers and [fix #21: Set chrome accept_languages in headless mode](https://github.com/jedie/django-tools/issues/21)
+ * Update project: Tests, code-style etc.
+* v0.48.3 - 20.12.2020 - [compare v0.47.2...v0.48.3](https://github.com/jedie/django-tools/compare/v0.47.2...v0.48.3)
+ * NEW: `ImageDummy().in_memory_image_file()` useful for e.g.: POST a image upload via Django's test client
+* v0.48.2 - 06.12.2020 - [compare v0.47.1...v0.48.2](https://github.com/jedie/django-tools/compare/v0.47.1...v0.48.2)
+ * Bugfix "Serve User Media File": Create tokens via migrations and handle if tokens not exists
+* v0.48.1 - 06.12.2020 - [compare v0.47.0...v0.48.1](https://github.com/jedie/django-tools/compare/v0.47.0...v0.48.1)
+ * Add migration file to "Serve User Media File"
+* v0.48.0 - 06.12.2020 - [compare v0.47.0...v0.48.0](https://github.com/jedie/django-tools/compare/v0.47.0...v0.48.0)
+ * NEW: "Serve User Media File" reuseable app
+ * NEW: django_tools.unittest_utils.signals.SignalsContextManager
+ * Update `installed_apps_utils.get_filtered_apps()` and support app config entries in `settings.INSTALLED_APPS`
+* v0.47.0 - 26.11.2020 - [compare v0.46.1...v0.47.0](https://github.com/jedie/django-tools/compare/v0.46.1...v0.47.0)
+ * updates for newer django versions
+ * NEW: assert_warnings(), assert_no_warnings() and assert_in_logs()
+ * remove broken LoggingBuffer()
+ * update project setup, fix tests and pipelines
+* v0.46.1 - 19.02.2020 - [compare v0.46.0...v0.46.1](https://github.com/jedie/django-tools/compare/v0.46.0...v0.46.1)
+ * less restricted dependency specification
+ * NEW: `"django_tools.middlewares.LogHeaders.LogRequestHeadersMiddleware"`
+ * SeleniumChromiumTestCase: set "accept_languages" and disable "headless" mode, see also: [https://github.com/jedie/django-tools/issues/21](https://github.com/jedie/django-tools/issues/21)
+* v0.46.0 - 13.02.2020 - [compare v0.45.3...v0.46.0](https://github.com/jedie/django-tools/compare/v0.45.3...v0.46.0)
+ * `dynamic_site` was removed. Please use e.g.: [django-hosts](https://github.com/jazzband/django-hosts)
+ * modernize project setup and use `poetry`
+ * remove `lxml` decency by using [bleach](https://github.com/mozilla/bleach) for `html_utils.html2text`
+ * update code and code style
+* v0.45.3 - 25.08.2019 - [compare v0.45.2...v0.45.3](https://github.com/jedie/django-tools/compare/v0.45.2...v0.45.3)
+ * Add `excepted_exit_code` to `django_tools.unittest_utils.django_command.DjangoCommandMixin` to it's possible to test errors in manage commands
+* v0.45.2 - 26.06.2019 - [compare v0.45.1...v0.45.2](https://github.com/jedie/django-tools/compare/v0.45.1...v0.45.2)
+ * NEW: `django_tools.log_utils.throttle_admin_email_handler.ThrottledAdminEmailHandler`
+* v0.45.1 - 03.04.2019 - [compare v0.45.0...v0.45.1](https://github.com/jedie/django-tools/compare/v0.45.0...v0.45.1)
+ * Bugfix ValueError in `django_tools.unittest_utils.email.print_mailbox`
+* v0.45.0 - 01.04.2019 - [compare v0.44.2...v0.45.0](https://github.com/jedie/django-tools/compare/v0.44.2...v0.45.0)
+ * NEW: `OverwriteFileSystemStorage` with backup functionality
+ * NEW: `print_exc_plus()` - traceback with a listing of all the local variables
+ * NEW: `assert_pformat_equal` with `pprintpp` and `icdiff`
+ * NEW: `assert_filenames_and_content`
+* v0.44.2 - 02.01.2019 - [compare v0.44.1...v0.44.2](https://github.com/jedie/django-tools/compare/v0.44.1...v0.44.2)
+ * Handle errors like: [https://github.com/andymccurdy/redis-py/issues/995](https://github.com/andymccurdy/redis-py/issues/995)
+* v0.44.1 - 02.01.2019 - [compare v0.44.0...v0.44.1](https://github.com/jedie/django-tools/compare/v0.44.0...v0.44.1)
+ * `LoggingBuffer`: Don't deactivate existing log handler, just append the buffer handler.
+* v0.44.0 - 13.12.2018 - [compare v0.43.2...v0.44.0](https://github.com/jedie/django-tools/compare/v0.43.2...v0.44.0)
+ * NEW: `django_file = ImageDummy().create_django_file_info_image(text="")` e.g.: for attach to `models.ImageField()`
+ * Make `mockup.ImageDummy()` usable even if django-filer is not installed.
+ * `mockup.ImageDummy()` default image format changed from png to jpeg
+ * Cleanup: remove old, since v0.35 deprecated mockup image API
+* v0.43.2 - 11.12.2018 - [compare v0.43.1...v0.43.2](https://github.com/jedie/django-tools/compare/v0.43.1...v0.43.2)
+ * Bugfix Selenium refactor: Use the class with the same functionality if old usage places are used.
+* v0.43.1 - 11.12.2018 - [compare v0.43.0...v0.43.1](https://github.com/jedie/django-tools/compare/v0.43.0...v0.43.1)
+ * Bugfix: Selenium test cases: clear `window.localStorage` after test run
+* v0.43.0 - 11.12.2018 - [compare v0.42.4...v0.43.0](https://github.com/jedie/django-tools/compare/v0.42.4...v0.43.0)
+ * Refactor selenium helpers
+ * Split selenium test cases: with and without Django StaticLiveServerTestCase
+ * NEW: Selenium helper to access `window.localStorage`
+* v0.42.4 - 12.10.2018 - [compare v0.42.3...v0.42.4](https://github.com/jedie/django-tools/compare/v0.42.3...v0.42.4)
+ * Add `request` object to `TestUserMixin.login()` (needed for e.g.: django-axes auth backend)
+* v0.42.3 - 10.10.2018 - [compare v0.42.2...v0.42.3](https://github.com/jedie/django-tools/compare/v0.42.2...v0.42.3)
+ * NEW: * `assertments.assert_is_dir`, `assertments.assert_is_file`, `assertments.assert_path_not_exists`
+* v0.42.2 - 18.09.2018 - [compare v0.42.1...v0.42.2](https://github.com/jedie/django-tools/compare/v0.42.1...v0.42.2)
+ * NEW: `assert_installed_apps()` - Check entries in settings.INSTALLED_APPS
+* v0.42.1 - 17.09.2018 - [compare v0.42.0...v0.42.1](https://github.com/jedie/django-tools/compare/v0.42.0...v0.42.1)
+ * NEW: `django_tools.unittest_utils.assertments.assert_language_code` - Check if given language_code is in settings.LANGUAGES
+* v0.42.0 - 07.09.2018 - [compare v0.41.0...v0.42.0](https://github.com/jedie/django-tools/compare/v0.41.0...v0.42.0)
+ * remove all celery stuff
+ * NEW: `$ ./manage.py logging_info` Shows a list of all loggers and marks which ones are configured in settings.LOGGING
+ * manage commands `list_models` and `nice_diffsettings` are moved from seperate apps
+* v0.41.0 - 28.08.2018 - [compare v0.40.6...v0.41.0](https://github.com/jedie/django-tools/compare/v0.40.6...v0.41.0)
+ * NEW: `unittest_utils/assertments.py` with some common assert functions
+ * Remove `@task_always_eager()` decorator
+* v0.40.6 - 28.08.2018 - [compare v0.40.5...v0.40.6](https://github.com/jedie/django-tools/compare/v0.40.5...v0.40.6)
+ * Bugfix `@task_always_eager()` decorator
+* v0.40.5 - 27.08.2018 - [compare v0.40.4...v0.40.5](https://github.com/jedie/django-tools/compare/v0.40.4...v0.40.5)
+ * Bugfix `DjangoCommandMixin.call_manage_py()`: Use the given `manage.py` filename
+* v0.40.4 - 21.08.2018 - [compare v0.40.3...v0.40.4](https://github.com/jedie/django-tools/compare/v0.40.3...v0.40.4)
+ * NEW: `django_tools.debug.delay` to simulate longer processing time by set a delay via GET parameter (see above)
+* v0.40.3 - 18.07.2018 - [compare v0.40.2...v0.40.3](https://github.com/jedie/django-tools/compare/v0.40.2...v0.40.3)
+ * Enhance selenium test cases:
+ * NEW: `assert_visible_by_id()`
+ * NEW: `assert_clickable_by_id()`
+ * NEW: `assert_clickable_by_xpath()`
+ * add `desired_capabilities` to firefox and chrome test cases
+ * enable logging in chrome test case
+ * NEW: `assert_in_browser_log()` in chrome test case
+* v0.40.2 - 04.07.2018 - [compare v0.40.1...v0.40.2](https://github.com/jedie/django-tools/compare/v0.40.1...v0.40.2)
+ * Bugfix selenium Test Case if driver is None
+ * Bugfix django compatibility
+* v0.40.1 - 28.06.2018 - [compare v0.40.0...v0.40.1](https://github.com/jedie/django-tools/compare/v0.40.0...v0.40.1)
+ * Bugfix selenium test case if executable can't be found.
+* v0.40.0 - 15.06.2018 - [compare v0.39.6...v0.40.0](https://github.com/jedie/django-tools/compare/v0.39.6...v0.40.0)
+ * NEW: selenium chrome and firefox test cases in `django_tools.unittest_utils.selenium_utils`
+ * Fix test project and add `run_test_project_dev_server.sh` for easy test
+ * Fixing tests
+* v0.39.6 - 04.05.2018 - [compare v0.39.5...v0.39.6](https://github.com/jedie/django-tools/compare/v0.39.5...v0.39.6)
+ * Enhance model instance unittest code generator
+* v0.39.5 - 24.04.2018 - [compare v0.39.4...v0.39.5](https://github.com/jedie/django-tools/compare/v0.39.4...v0.39.5)
+ * NEW: Model instance unittest code generator (see above)
+* v0.39.4 - 06.04.2018 - [compare v0.39.3...v0.39.4](https://github.com/jedie/django-tools/compare/v0.39.3...v0.39.4)
+ * NEW: `django_tools.unittest_utils.logging_utils.FilterAndLogWarnings` and `django_tools.unittest_utils.logging_utils.CutPathnameLogRecordFactory`
+* v0.39.3 - 22.03.2018 - [compare v0.39.2...v0.39.3](https://github.com/jedie/django-tools/compare/v0.39.2...v0.39.3)
+ * `django_tools.permissions.get_filtered_permissions` has new keyword argument: `exclude_actions`
+* v0.39.2 - 22.03.2018 - [compare v0.39.1...v0.39.2](https://github.com/jedie/django-tools/compare/v0.39.1...v0.39.2)
+ * NEW: `django_tools.parler_utils.parler_fixtures.ParlerDummyGenerator`
+ * NEW: `django_tools.fixture_tools.languages.iter_languages`
+* v0.39.1 - 19.03.2018 - [compare v0.39.0...v0.39.1](https://github.com/jedie/django-tools/compare/v0.39.0...v0.39.1)
+ * NEW: `django_tools.unittest_utils.email.print_mailbox()`
+ * minor updates
+* v0.39.0 - 02.03.2018 - [compare v0.38.9...v0.39.0](https://github.com/jedie/django-tools/compare/v0.38.9...v0.39.0)
+ * NEW: Isolated Filesystem decorator / context manager
+ * Backwards-incompatible change: file renamed `django_tools/unittest_utils/{celery.py => celery_utils.py`}
+ * Skip run test with Django 1.8 and run tests with Django 1.11 and 2.0
+* v0.38.9 - 05.02.2018 - [compare v0.38.8...v0.38.9](https://github.com/jedie/django-tools/compare/v0.38.8...v0.38.9)
+ * lowering log level on missing permissions from "error" to "debug"
+* v0.38.8 - 05.02.2018 - [compare v0.38.7...v0.38.8](https://github.com/jedie/django-tools/compare/v0.38.7...v0.38.8)
+ * send mail: use from celery import shared_task instead of djcelery_transactions
+* v0.38.7 - 15.01.2018 - [compare v0.38.6...v0.38.7](https://github.com/jedie/django-tools/compare/v0.38.6...v0.38.7)
+ * Add missing arguments (like "attachments", "cc" etc.) to `django_tools.mail.send_mail.SendMailCelery`
+* v0.38.6 - 10.01.2018 - [compare v0.38.4...v0.38.5](https://github.com/jedie/django-tools/compare/v0.38.4...v0.38.5)
+ * NEW: `./manage.py clear_cache`
+ * Display POST data in browser debug (`django_tools.unittest_utils.BrowserDebug.debug_response`)
+* v0.38.5 - 02.01.2018 - [compare v0.38.4...v0.38.5](https://github.com/jedie/django-tools/compare/v0.38.4...v0.38.5)
+ * NEW: Helper to assert django message framework output in unittests:
+ * `BaseUnittestCase.get_messages()`: return a list of all messages
+ * `BaseTestCase.assertMessages()`: compare messages
+ * `BaseTestCase.assertResponse()`: has new keyword argument `messages`
+ * NEW: `BaseUnittestCase.assert_exception_startswith()`
+* v0.38.4 - 28.12.2017 - [compare v0.38.3...v0.38.4](https://github.com/jedie/django-tools/compare/v0.38.3...v0.38.4)
+ * Bugfix attach user group on existing user in: `django_tools.unittest_utils.user.get_or_create_user`
+* v0.38.3 - 28.12.2017 - [compare v0.38.2...v0.38.3](https://github.com/jedie/django-tools/compare/v0.38.2...v0.38.3)
+ * Bugfix: `unittest_utils.user.get_or_create_group` also removes obsolete permissions, too.
+* v0.38.2 - 27.12.2017 - [compare v0.38.1...v0.38.2](https://github.com/jedie/django-tools/compare/v0.38.1...v0.38.2)
+ * NEW: `./manage.py update_permissions`
+* v0.38.1 - 21.12.2017 - [compare v0.38.0...v0.38.1](https://github.com/jedie/django-tools/compare/v0.38.0...v0.38.1)
+ * refactor travis/tox/pytest/coverage stuff
+ * Tests can be run via `python3 setup.py tox` and/or `python3 setup.py test`
+ * Test also with pypy3 on Travis CI.
+* v0.38.0 - 19.12.2017 - [compare v0.37.0...v0.38.0](https://github.com/jedie/django-tools/compare/v0.37.0...v0.38.0)
+ * NEW: `django_tools.unittest_utils.user.get_or_create_group`
+ * NEW: `django_tools.unittest_utils.user.get_or_create_user`
+ * NEW: `django_tools.unittest_utils.user.get_or_create_user_and_group`
+ * NEW: `BaseUnittestCase.get_admin_change_url()` and `BaseUnittestCase.get_admin_add_url()`
+ * NEW: `BaseUnittestCase.assert_startswith()` and `BaseUnittestCase.assert_endswith()`
+* v0.37.0 - 11.12.2017 - [compare v0.36.0...v0.37.0](https://github.com/jedie/django-tools/compare/v0.36.0...v0.37.0)
+ * Skip official support for python v2 (remove from text matrix)
+ * NEW: `./manage.py permission_info`: Display a list of all permissions for one django user
+ * NEW: `django_tools.permissions.get_filtered_permissions()` and `django_tools.permissions.pprint_filtered_permissions()`
+ * `django_tools.settings_utils.InternalIps` was renamed to `FnMatchIps` and can be also used for **ALLOWED_HOSTS**
+ * Bugfix/Enhance permission helpers
+* v0.36.0 - 20.11.2017 - [compare v0.35.0...v0.36.0](https://github.com/jedie/django-tools/compare/v0.35.0...v0.36.0)
+ * NEW: `./manage.py database_info`
+ * Bugfix: **ModelPermissionMixin**
+ * Dynamic Sites is no longer maintained and tests are deactivated. It's currently not compatible with all django versions.
+* v0.35.0 - 26.09.2017 - [compare v0.34.0...v0.35.0](https://github.com/jedie/django-tools/compare/v0.34.0...v0.35.0)
+ * CHANGE: The dummy image generation function in `django_tools.unittest_utils.mockup` has a new API.
+* v0.34.0 - 18.09.2017 - [compare v0.33.0...v0.34.0](https://github.com/jedie/django-tools/compare/v0.33.0...v0.34.0)
+ * CHANGE: The test usernames changed and spaces was replace with underscores e.g.: "staff test user" -> "staff_test_user"
+ * Bugfix in mockup.create_pil_image: Created images has wrong sizes
+* v0.33.0 - 11.07.2017 - [compare v0.32.14...v0.33.0](https://github.com/jedie/django-tools/compare/v0.32.14...v0.33.0)
+ * Run tests only against Django v1.8 TLS and v1.11 TLS
+ * For Django 1.11: Add support for new-style middleware - contributed by benkonrath
+ * NEW: `django_tools.utils.request.create_fake_request()` for easier create a faked request object with `RequestFactory`
+ * NEW: `django_tools.utils.html_utils.html2text()` - Strip HTML tags with lxml Cleaner + Django 'strip_tags'
+* v0.32.14 - 14.06.2017 - [compare v0.32.13...v0.32.14](https://github.com/jedie/django-tools/compare/v0.32.13...v0.32.14)
+ * Bugfix for Python 2: `mock` backport package is needed and added to `setup.install_requires`
+* v0.32.13 - 24.05.2017 - [compare v0.32.12...v0.32.13](https://github.com/jedie/django-tools/compare/v0.32.12...v0.32.13)
+ * remove some warnings
+* v0.32.12 - 04.05.2017 - [compare v0.32.11...v0.32.12](https://github.com/jedie/django-tools/compare/v0.32.11...v0.32.12)
+ * NEW: `self.assertIn_dedent()` in `django_tools.unittest_utils.unittest_base.BaseUnittestCase`
+* v0.32.11 - 02.05.2017 - [compare v0.32.10...v0.32.11](https://github.com/jedie/django-tools/compare/v0.32.10...v0.32.11)
+ * Fix PyPi package mistake (`.tar.gz` archive contains `.tox` ;)
+* v0.32.10 - 02.05.2017 - [compare v0.32.9...v0.32.10](https://github.com/jedie/django-tools/compare/v0.32.9...v0.32.10)
+ * NEW: `django_tools.mail` to send text+html mails (see above)
+* v0.32.9 - 21.03.2017 - [compare v0.32.8...v0.32.9](https://github.com/jedie/django-tools/compare/v0.32.8...v0.32.9)
+ * Bugfix `DebugCacheLoader` if TemplateDoesNotExist was raised
+* v0.32.8 - 16.03.2017 - [compare v0.32.7...v0.32.8](https://github.com/jedie/django-tools/compare/v0.32.7...v0.32.8)
+ * NEW: `django_tools.template.loader.DebugCacheLoader` to add template name as html comments
+ * Change temp filename in BrowserDebug and use `django_tools_browserdebug_` prefix
+ * Bugfix in `django_tools.middlewares.ThreadLocal.ThreadLocalMiddleware`
+* v0.32.7 - 10.03.2017 - [compare v0.32.6...v0.32.7](https://github.com/jedie/django-tools/compare/v0.32.6...v0.32.7)
+ * NEW: `django_tools.permissions` - helper for setup permissions
+ * NEW: `/unittest_utils/user.py` - helper for creating users (needfull in unittests)
+* v0.32.6 - 22.02.2017 - [compare v0.32.5...v0.32.6](https://github.com/jedie/django-tools/compare/v0.32.5...v0.32.6)
+* `@task_always_eager()` decorator will set `CELERY_EAGER_PROPAGATES_EXCEPTIONS=True`, too.
+* v0.32.5 - 10.02.2017 - [compare v0.32.4...v0.32.5](https://github.com/jedie/django-tools/compare/v0.32.4...v0.32.5)
+ * NEW: Add `template_name` (optional) to `self.assertResponse()` (check with `assertTemplateUsed()`)
+* v0.32.4 - 01.02.2017 - [compare v0.32.3...v0.32.4](https://github.com/jedie/django-tools/compare/v0.32.3...v0.32.4)
+* Fix: Set "is_active" for created test users
+* v0.32.3 - 25.01.2017 - [compare v0.32.2...v0.32.3](https://github.com/jedie/django-tools/compare/v0.32.2...v0.32.3)
+ * Fix UnicodeDecodeError in BrowserDebug
+ * NEW: `@set_string_if_invalid()` decorator
+ * NEW: `@task_always_eager()` decorator
+* v0.32.2 - 13.01.2017 - [compare v0.32.1...v0.32.2](https://github.com/jedie/django-tools/compare/v0.32.1...v0.32.2)
+ * NEW: django_tools.utils.url.GetDict
+* v0.32.1 - 29.12.2016 - [compare v0.32.0...v0.32.1](https://github.com/jedie/django-tools/compare/v0.32.0...v0.32.1)
+ * NEW: TracebackLogMiddleware
+* v0.32.0 - 19.12.2016 - [compare v0.31.0...v0.32.0](https://github.com/jedie/django-tools/compare/v0.31.0...v0.32.0)
+ * NEW: Management commands: 'nice_diffsettings', 'list_models'
+ * NEW: @display_admin_error to display silent errors in ModelAdmin.list_display callables.
+ * NEW: django_tools.template.render.render_template_file
+ * use [pytest-django](https://pypi.python.org/pypi/pytest-django)
+ * remove outdated stuff: See 'Backwards-incompatible changes' above.
+* v0.31.0 - 03.11.2016 - [compare v0.30.4...v0.31.0](https://github.com/jedie/django-tools/compare/v0.30.4...v0.31.0)
+ * add Mockup utils to create dummy PIL/django-filer images with Text (see above)
+ * move tests into `/django_tools_tests/`
+* v0.30.4 - 27.10.2016 - [compare v0.30.2...v0.30.4](https://github.com/jedie/django-tools/compare/v0.30.2...v0.30.4)
+ * add DjangoCommandMixin
+* v0.30.2 - 05.10.2016 - [compare v0.30.1...v0.30.2](https://github.com/jedie/django-tools/compare/v0.30.1...v0.30.2)
+ * Bugfix Python 2 compatibility
+* v0.30.1 - 26.08.2016 - [compare v0.30.0...v0.30.1](https://github.com/jedie/django-tools/compare/v0.30.0...v0.30.1)
+ * add: `django_tools.unittest_utils.disable_migrations.DisableMigrations` (see above)
+ * run tests also with django v1.10 and Python 3.5
+ * use tox
+* v0.30.0 - 27.04.2016 - [compare v0.29.5...v0.30.0](https://github.com/jedie/django-tools/compare/v0.29.5...v0.30.0)
+ * Django 1.9 and Python 3 support contributed by [naegelyd](https://github.com/jedie/django-tools/pull/9)
+* v0.29.4 and v0.29.5 - 10.08.2015 - [compare v0.29.3...v0.29.5](https://github.com/jedie/django-tools/compare/v0.29.3...v0.29.5)
+ * Some bugfixes for django 1.6 support
+* v0.29.3 - 10.08.2015 - [compare v0.29.2...v0.29.3](https://github.com/jedie/django-tools/compare/v0.29.2...v0.29.3)
+ * Clear ThreadLocal request atttribute after response is processed (contributed by Lucas Wiman)
+* v0.29.2 - 19.06.2015 - [compare v0.29.1...v0.29.2](https://github.com/jedie/django-tools/compare/v0.29.1...v0.29.2)
+ * Bugfix in unittest_utils.selenium_utils.selenium2fakes_response
+ * assertResponse used assertContains from django
+ * Add QueryLogMiddleware (TODO: add tests)
+* v0.29.1 - 17.06.2015 - [compare v0.29.0...v0.29.1](https://github.com/jedie/django-tools/compare/v0.29.0...v0.29.1)
+ * Bugfixes for Py2 and Py3
+ * add StdoutStderrBuffer()
+* v0.29.0 - 09.06.2015 - [compare v0.26.0...v0.29.0](https://github.com/jedie/django-tools/compare/v0.26.0...v0.29.0)
+ * WIP: Refactor unittests (DocTests must be updated for Py3 and more unittests must be written to cover all)
+ * catch more directory traversal attacks in BaseFilesystemBrowser (and merge code parts)
+ * Bugfix for "django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet." if using **UpdateInfoBaseModel**
+ * Bugfixes in **dynamic_site** for django 1.7
+ * add: [django_tools.settings_utils.InternalIps](https://github.com/jedie/django-tools/blob/master/django_tools/settings_utils.py)
+* v0.28.0 - 12.02.2015 - [compare v0.26.0...v0.28.0](https://github.com/jedie/django-tools/compare/v0.26.0...v0.28.0)
+ * Work-a-round for import loops
+ * (new Version number, because of PyPi stress)
+* v0.26.0 - 11.02.2015 - [compare v0.25.1...v0.26.0](https://github.com/jedie/django-tools/compare/v0.25.1...v0.26.0)
+ * Updates for Django 1.6 and Python 3
+* v0.25.1 - 18.11.2013
+ * Bugfix: Fall back to "UTF-8" if server send no encoding info
+* v0.25.0 - 28.08.2012
+ * Rename **cache.clear()** in SmoothCacheBackends to **cache.smooth_update()**, so that reset timestamp is independ from clear the cache.
+* v0.24.10 - 24.08.2012
+ * Add **SmoothCacheBackends**: [./cache/README.creole](https://github.com/jedie/django-tools/blob/master/django_tools/cache/README.creole)
+* v0.24.9 - 24.08.2012
+ * Bugfix in per-site cache middleware: set inital count values to None, if counting is disabled.
+* v0.24.8 - 24.08.2012
+ * Enhanced **per-site cache middleware**: [./cache/README.creole](https://github.com/jedie/django-tools/blob/master/django_tools/cache/README.creole)
+ * Add **SetRequestDebugMiddleware**: [./debug/README.creole](https://github.com/jedie/django-tools/blob/master/django_tools/debug/README.creole)
+* v0.24.7 - 21.08.2012
+ * Add the **per-site cache middleware** (see above)
+ * Add **import lib helper**: [./utils/importlib.py](https://github.com/jedie/django-tools/blob/master/django_tools/utils/importlib.py)
+* v0.24.6 - 21.08.2012
+ * Add the **filemanager library** (see above)
+* v0.24.5 - 06.08.2012
+ * Add **Print SQL Queries** context manager. (see above)
+* v0.24.4 - 26.07.2012
+ * remove date from version string, cause of side-effects e.g.: user clone the repo and has the filter not installed
+* v0.24.3 - 25.07.2012
+ * "Hardcode" the version string date attachment via [gitattribute filter script](https://github.com/jedie/python-code-snippets/tree/master/CodeSnippets/git) to fix [a reported issues](https://github.com/jedie/django-tools/issues/1) with [pip requirements file bug](https://github.com/pypa/pip/issues/145).
+* v0.24.2 - 10.07.2012
+ * Split [UpdateInfoBaseModel()](https://github.com/jedie/django-tools/blob/master/django_tools/models.py): So you can only set "createtime", "lastupdatetime" or "createby", "lastupdateby" or both types (This is backwards compatible)
+* v0.24.1 - 12.06.2012
+ * Bugfix: UsergroupsModelField() and add unittests for it
+ * Add "normal users" in UsergroupsModelField()
+ * New: Add create_user() and create_testusers() to BaseTestCase
+ * Add a test project for the unittests. TODO: use this for all tests
+* v0.24.0 - 04.06.2012
+ * [Don't use auto_now_add and auto_now in UpdateInfoBaseModel](https://github.com/jedie/django-tools/commit/a3cf1f7b2e9dbe4964306f4793c74f1782f8b2ea)
+ * Bugfix in [UsergroupsModelField](https://github.com/jedie/django-tools/blob/master/django_tools/limit_to_usergroups.py)
+* v0.23.1
+ * [Dynamic Site](https://github.com/jedie/django-tools/tree/main/django_tools/dynamic_site#dynamic-site-id) would be only initialised if settings.USE_DYNAMIC_SITE_MIDDLEWARE = True
+* v0.23.0
+ * Use cryptographic signing tools from django 1.4 in django_tools.utils.client_storage
+* v0.22.0
+ * Add [static_path.py](https://github.com/jedie/django-tools/blob/master/django_tools/fields/static_path.py) thats used settings.STATIC_ROOT.
+ * The old [media_path.py](https://github.com/jedie/django-tools/blob/master/django_tools/fields/media_path.py) which used settings.MEDIA_ROOT is deprecated and will be removed in the future.
+ * auto_add_check_unique_together() can use settings.DATABASES["default"]["ENGINE"], too.
+* v0.21.1
+ * Bugfixes in [Dynamic Site](https://github.com/jedie/django-tools/tree/main/django_tools/dynamic_site#dynamic-site-id).
+* 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.)
+* v0.20.1
+ * New: [debug_csrf_failure()](https://github.com/jedie/django-tools/blob/master/django_tools/views/csrf.py) to display the normal debug page and not the minimal csrf debug page.
+* v0.20.0
+ * Add experimental [DynamicSiteMiddleware](https://github.com/jedie/django-tools/blob/master/django_tools/middlewares/DynamicSite.py), please test it and give feedback.
+* v0.19.6
+ * Add some south introspection rules for LanguageCodeModelField and jQueryTagModelField
+ * fallback if message for anonymous user can't created, because django.contrib.messages middleware not used.
+ * Bugfix in django_tools.utils.messages.StackInfoStorage
+* v0.19.5
+ * Add [http://bugs.python.org/file22767/hp_fix.diff](http://bugs.python.org/file22767/hp_fix.diff) for [https://github.com/gregmuellegger/django/issues/1](https://github.com/gregmuellegger/django/issues/1)
+* v0.19.4
+ * Bugfix for PyPy in local_sync_cache get_cache_information(): sys.getsizeof() not implemented on PyPy
+ * Bugfix in template.filters.chmod_symbol()
+ * Nicer solution for template.filters.human_duration()
+* v0.19.3
+ * Add support for https in utils/http.py
+* v0.19.2
+ * Bugfix in utils/http.py timeout work-a-round
+* v0.19.1
+ * utils/http.py changes:
+ * Use a better solution, see:
+ * Add timeout and add a work-a-round for Python < 2.6
+* v0.19.0
+ * NEW: Add utils/http.py with helpers to get a webpage via http GET in unicode
+ * Change README from textile to creole ;)
+* v0.18.2
+ * Bugfix: Add missing template in pypi package
+* v0.18.0
+ * NEW: Add DOM compare from Gregor Müllegger GSoC work into unittest utils.
+* v0.17.1
+ * Bugfix in “limit_to_usergroups”: Make choices “lazy”: Don’t access the database in _init_
+* v0.17
+ * Add the script “upgrade_virtualenv.py”
+ * Add “limit_to_usergroups”
+ * Add “local sync cache”
+ * Add models.UpdateInfoBaseModel
+ * Update decorators.render_to
+ * render_to pass keyword arguments to render_to_response() (e.g.: mimetype=“text/plain”)
+ * new argument “skip_fail” in get_filtered_apps(): If True: raise excaption if app is not importable
+* v0.16.4
+ * Bugfix: `get_db_prep_save() got an unexpected keyword argument 'connection’` when save a SignSeparatedModelField()
+* v0.16.3
+ * Update BrowserDebug: Use response.templates instead of response.template and make output nicer
+* v0.16.2
+ * Merge stack info code and display better stack info on browser debug page
+* v0.16.1
+ * Update django_tools.utils.messages.StackInfoStorage for django code changes.
+* v0.16.0
+ * NEW: path model field (check if direcotry exist)
+* v0.15.0
+ * NEW: Add a flexible URL field (own validator, model- and form-field)
+* v0.14.1
+ * Bugfix: make path in MediaPathModelField relativ (remove slashes)
+* v0.14
+ * NEW: django-tagging addon: Display existing tags under a tag field
+* v0.13
+ * Bugfix UnicodeEncodeError in Browser debug
+* v0.12
+ * NEW: django_tools.utils.messages.failsafe_message
+* v0.11
+ * NEW: Store data in a secure cookie, see: utils/client_storage.py
+* v0.10.1
+ * New: Display used templates in unittest BrowserDebug
+ * Bugfix: catch if last usermessages exist
+* v0.10.0
+ * NEW: utils around django messages, see: /django_tools/utils/messages.py
+* v0.9.1
+ * Bugfix: database column was not created: don’t overwrite get_internal_type()
+* v0.9
+ * New: stuff in /django_tools/fields/
+ * see also backwards-incompatible changes, above!
+* v0.8.2
+ * New: widgets.SelectMediaPath(): Select a sub directory in settings.MEDIA_ROOT
+ * New: fields.SignSeparatedField()
+* v0.8.1
+ * Add “no_args” keyword argument to installed_apps_utils.get_filtered_apps()
+* v0.8.0
+ * Add model LanguageCode field and form LanguageCode field in Accept-Language header format (RFC 2616)
+* v0.7.0
+ * Add decorators.py
+* v0.6.0
+ * Add forms_utils.LimitManyToManyFields, crosspost: [http://www.djangosnippets.org/snippets/1691/](http://www.djangosnippets.org/snippets/1691/)
+* v0.5.0
+ * Add template/filters.py from PyLucid v0.8.x
+* v0.4.0
+ * Add experimental “warn_invalid_template_vars”
+* v0.3.1
+ * Bugfix: Exclude the instance if it was saved in the past.
+* v0.3.0
+ * Add utils.installed_apps_utils
+* v0.2.0
+ * Add models_utils, see: [http://www.jensdiemer.de/_command/118/blog/detail/67/](http://www.jensdiemer.de/_command/118/blog/detail/67/) (de)
+* v0.1.0
+ * first version cut out from PyLucid CMS – [http://www.pylucid.org](http://www.pylucid.org)
+## links
+| Homepage | [https://github.com/jedie/django-tools](https://github.com/jedie/django-tools) |
+| PyPi | [https://pypi.python.org/pypi/django-tools/](https://pypi.python.org/pypi/django-tools/) |
+## donation
+* [paypal.me/JensDiemer](https://www.paypal.me/JensDiemer)
+* [Flattr This!](https://flattr.com/submit/auto?uid=jedie&url=https%3A%2F%2Fgithub.com%2Fjedie%2Fdjango-tools%2F)
+* Send [Bitcoins](https://www.bitcoin.org/) to [1823RZ5Md1Q2X5aSXRC5LRPcYdveCiVX6F](https://blockexplorer.com/address/1823RZ5Md1Q2X5aSXRC5LRPcYdveCiVX6F)
+
+%prep
+%autosetup -n django-tools-0.54.0
+
+%build
+%py3_build
+
+%install
+%py3_install
+install -d -m755 %{buildroot}/%{_pkgdocdir}
+if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
+if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
+if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
+if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
+pushd %{buildroot}
+if [ -d usr/lib ]; then
+ find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/lib64 ]; then
+ find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/bin ]; then
+ find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/sbin ]; then
+ find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+touch doclist.lst
+if [ -d usr/share/man ]; then
+ find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
+fi
+popd
+mv %{buildroot}/filelist.lst .
+mv %{buildroot}/doclist.lst .
+
+%files -n python3-django-tools -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Tue Apr 11 2023 Python_Bot <Python_Bot@openeuler.org> - 0.54.0-1
+- Package Spec generated
diff --git a/sources b/sources
new file mode 100644
index 0000000..7e33639
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+6ceee38364024d8344c6078b829190ee django-tools-0.54.0.tar.gz