Changelog
=========

This document describes changes between past releases. For information about
future releases, check `milestones`_ and :doc:`/about/vision`.


2.1.1 (2020-01-14)
------------------

- Fix missing function parameter. (#152)


2.1 (2020-01-13)
----------------

- Add a SignedFileSystemStorage that signs file URLs for clients. (#151)


2.0 (2020-01-07)
----------------

- Drop support for Python 2.7.
- Add black and isort.


1.10 (2020-01-07)
-----------------

- Introduced support from Django 1.11, 2.2 and 3.0.
- Drop support of Django 1.5, 1.6, 1.7, 1.8, 1.9, 1.10, 2.0 and 2.1


1.9 (2016-03-15)
----------------

- Feature #112 - Introduced support of Django 1.9.

- Feature #113 - Introduced support of Python 3.5.

- Feature #116 - ``HTTPFile`` has ``content_type`` property. It makes
  ``HTTPDownloadView`` proxy ``Content-Type`` header from remote location.


1.8 (2015-07-20)
----------------

Bugfixes.

- Bugfix #103 - ``PathDownloadView.get_file()`` makes a single call to
  ``PathDownloadView.get_file()`` (was doing it twice).

- Bugfix #104 - Pass numeric timestamp to Django's ``was_modified_since()``
  (was passing a datetime).


1.7 (2015-06-13)
----------------

Bugfixes.

- Bugfix #87 - Filenames with commas are now supported. In download responses,
  filename is now surrounded by double quotes.

- Bugfix #97 - ``HTTPFile`` proxies bytes as ``BytesIteratorIO`` (was undecoded
  urllib3 file object). ``StringIteratorIO`` has been split into
  ``TextIteratorIO`` and ``BytesIteratorIO``. ``StringIteratorIO`` is
  deprecated but kept for backward compatibility as an alias for
  ``TextIteratorIO``.

- Bugfix #92 - Run demo using ``make demo runserver`` (was broken).

- Feature #99 - Tox runs project's tests with Python 2.7, 3.3 and 3.4, and with
  Django 1.5 to 1.8.

- Refactoring #98 - Refreshed development environment: packaging, Tox and
  Sphinx.


1.6 (2014-03-03)
----------------

Python 3 support, development environment refactoring.

- Feature #46: introduced support for Python>=3.3.

- Feature #80: added documentation about "how to serve a file inline VS how to
  serve a file as attachment". Improved documentation of views' base options
  inherited from ``DownloadMixin``.

- Feature #74: the Makefile in project's repository no longer creates a
  virtualenv. Developers setup the environment as they like, i.e. using
  virtualenv, virtualenvwrapper or whatever. Tests are run with tox.


1.5 (2013-11-29)
----------------

X-Sendfile support and helpers to migrate for `django-sendfile`.

- Feature #2 - Introduced support of Lighttpd's x-Sendfile.

- Feature #36 - Introduced support of Apache's mod_xsendfile.

- Feature #41 - ``django_downloadview.sendfile`` is a port of
  `django-sendfile`'s ``sendfile`` function. The documentation contains notes
  about migrating from `django-sendfile` to `django-downloadview`.


1.4 (2013-11-24)
----------------

Bugfixes and documentation features.

- Bugfix #43 - ``ObjectDownloadView`` returns HTTP 404 if model instance's file
  field is empty (was HTTP 500).

- Bugfix #7 - Special characters in file names (``Content-Disposition`` header)
  are urlencoded. An US-ASCII fallback is also provided.

- Feature #10 - `django-downloadview` is registered on djangopackages.com.

- Feature #65 - INSTALL documentation shows "known good set" (KGS) of versions,
  i.e. versions that have been used in test environment.


1.3 (2013-11-08)
----------------

Big refactoring around middleware configuration, API readability and
documentation.

- Bugfix #57 - ``PathDownloadView`` opens files in binary mode (was text mode).

- Bugfix #48 - Fixed ``basename`` assertion in ``assert_download_response``:
  checks ``Content-Disposition`` header.

- Bugfix #49 - Fixed ``content`` assertion in ``assert_download_response``:
  checks only response's ``streaming_content`` attribute.

- Bugfix #60 - ``VirtualFile.__iter__`` uses ``force_bytes()`` to support both
  "text-mode" and "binary-mode" content.
  See https://code.djangoproject.com/ticket/21321

- Feature #50 - Introduced ``django_downloadview.DownloadDispatcherMiddleware``
  that iterates over a list of configurable download middlewares. Allows to
  plug several download middlewares with different configurations.

  This middleware is mostly dedicated to internal usage. It is used by
  ``SmartDownloadMiddleware`` described below.

- Feature #42 - Documentation shows how to stream generated content (yield).
  Introduced ``django_downloadview.StringIteratorIO``.

- Refactoring #51 - Dropped support of Python 2.6

- Refactoring #25 - Introduced ``django_downloadview.SmartDownloadMiddleware``
  which allows to setup multiple optimization rules for one backend.

  Deprecates the following settings related to previous single-and-global
  middleware:

  * ``NGINX_DOWNLOAD_MIDDLEWARE_MEDIA_ROOT``
  * ``NGINX_DOWNLOAD_MIDDLEWARE_MEDIA_URL``
  * ``NGINX_DOWNLOAD_MIDDLEWARE_EXPIRES``
  * ``NGINX_DOWNLOAD_MIDDLEWARE_WITH_BUFFERING``
  * ``NGINX_DOWNLOAD_MIDDLEWARE_LIMIT_RATE``

- Refactoring #52 - ObjectDownloadView now inherits from SingleObjectMixin and
  BaseDownloadView (was DownloadMixin and BaseDetailView).
  Simplified DownloadMixin.render_to_response() signature.

- Refactoring #40 - Documentation includes examples from demo project.

- Refactoring #39 - Documentation focuses on usage, rather than API. Improved
  narrative documentation.

- Refactoring #53 - Added base classes in ``django_downloadview.middlewares``,
  such as ``ProxiedDownloadMiddleware``.

- Refactoring #54 - Expose most Python API directly in `django_downloadview`
  package. Simplifies ``import`` statements in client applications.
  Splitted nginx module in a package.

- Added unit tests, improved code coverage.


1.2 (2013-05-28)
----------------

Bugfixes and documentation improvements.

- Bugfix #26 - Prevented computation of virtual file's size, unless the file
  wrapper implements was_modified_since() method.

- Bugfix #34 - Improved support of files that do not implement modification
  time.

- Bugfix #35 - Fixed README conversion from reStructuredText to HTML (PyPI).


1.1 (2013-04-11)
----------------

Various improvements.
Contains **backward incompatible changes.**

- Added HTTPDownloadView to proxy to arbitrary URL.

- Added VirtualDownloadView to support files living in memory.

- Using StreamingHttpResponse introduced with Django 1.5. Makes Django 1.5 a
  requirement!

- Added ``django_downloadview.test.assert_download_response`` utility.

- Download views and response now use file wrappers. Most logic around file
  attributes, formerly in views, moved to wrappers.

- Replaced DownloadView by PathDownloadView and StorageDownloadView. Use the
  right one depending on the use case.


1.0 (2012-12-04)
----------------

- Introduced optimizations for Nginx X-Accel: a middleware and a decorator
- Introduced generic views: DownloadView and ObjectDownloadView
- Initialized project


.. rubric:: Notes & references

.. target-notes::

.. _`milestones`: https://github.com/benoitbryon/django-downloadview/milestones
