There's been some recent discussion in a django-users thread[1] about
the impending end-of-life of Django 1.6, which in turn will mean
end-of-life for Django supported on Python 2.6. In addition, the
end-of-life of the current LTS release, Django 1.4, will mean
end-of-life for Django supported on Python 2.5. The following is a
draft of a proposal based on ideas raised in that thread; it should be
considered pre-DEP status, to be elevated to a DEP submission if there
is sufficient support.
Abstract
--------
The support process for older versions of Django is changed, as
follows:
* Official support for older versions of Django from the Django core
team will continue to end at the scheduled times (i.e., upon release
of a new minor version for non-LTS releases, at end of advertised
support lifetime for LTS releases).
* Unofficial support, by persons willing to volunteer their time, will
be permitted through a secondary code repository existing solely to
provide this support.
* As the official end-of-life of each Django version approaches, the
Django core team will solicit proposals and volunteers to provide
unofficial support for that version past its official end-of-life,
and select maintainer(s) from amongst those volunteers. This support
will be known as "community maintenance".
Rationale
---------
For the past five years, Django has been in the process of deprecating
support for older 2.x release of Python, as part of a plan to move
Django toward, first, compatibility with both Python 2 and Python 3
(completed as of Django 1.6), and ultimately with only Python 3 (in a
future, to-be-determined, release).
The timeline for this was as follows:
* May 2010: Django 1.2 instituted a minimum Python version of 2.4.
* March 2011: Django 1.3 was the final release to support Python 2.4.
* March 2012: Django 1.4 (LTS) raised the minimum Python version to
2.5, and was the final release to support Python 2.5.
* February 2013: Django 1.5 raised the minimum Python version to 2.6.
* November 2013: Django 1.6 was the final release to support Python
2.6.
* September 2014: Django 1.7 raised the minimum Python version to 2.7.
* Late Q1/early Q2 2015: Django 1.4 and Django 1.6 will reach
end-of-life (the former on a scheduled date, the latter upon the
release of Django 1.8).
While this process was necessary to achieve at least a minimum of
Python 2.6 (the lowest version enabling compatibility with Python 2
and Python 3 in a single codebase) and ultimately a minimum of Python
2.7 (the only Python 2.x release still receiving upstream security
support), and while moving Django in the direction of Python 3 is an
absolute necessity for the future of the framework, this has had an
effect on some users of Django who are effectively locked in to now-
or soon-to-be-unsupported versions of Python by their choice of
operating system and associated support contract.
In particular, the impending end-of-life of Django 1.6, the final
release which supported Python 2.6, is poised to cut off support for
users of products like Red Hat Enterprise Linux, who may be locked to
Python 2.6 and thus unable to use a supported version of Django past
1.6 end-of-life (these users continue to receive security support for
Python itself from the operating-system vendor, who provides such
support on their behalf even after official upstream support has
ended; no such support appears to be provided, at this time, for
Django).
Although these users are not a majority of Django's users, they are
still a significant group, and simply ending their ability to use
Django is likely to be an unacceptable option. But the Django core
team cannot and will not extend the official support lifetimes of
older Django releases; the additional maintenance burden is beyond
that which can be borne, and would impede the future development of
Django.
This is not the first time in Django's history that a significant
minority of users have been affected by backwards-incompatible
releases. Prior to Django 1.0, the large incompatibility of the
"magic-removal" branch, merged shortly before the release of Django
0.95, left some users effectively stranded with large already-existing
codebases that could not be quickly migrated.
During that time period, the Django core team allowed, on an
unofficial volunteer basis, continuing bugfix and security support to
be provided by interested parties for an extended period of time past
the official end-of-life of Django 0.91. This support was conducted
solely through commits to Django's (at the time Subversion)
repository, and never through issuing additional releases in an
end-of-life'd release series.
This experiment in unofficial support was successful overall; many
high-visibility installations of Django were able to migrate to
post-"magic-removal" versions of Django at the best pace they could
manage, while still being assured of necessary support for security
and crashing/data-loss issues on their existing installations as they
did so.
With the similar situation caused by the impending end-of-life of
Django 1.6, it seems appropriate to once again extend the option of
unofficial, community-based extended support as a measure to assist
such installations of Django during the time they will require to
migrate to a more recent Python or Django version.
Details
-------
Starting with Django 1.6, each time a minor (i.e., X.Y) release series
of Django is nearing its end-of-life, a three-phase process will
begin.
In the first phase, the Django core team will post publicly that a
release series of Django is near end-of-life, and will issue a call
for discussion on the possibility of extended community support for
the soon-to-EOL release series. If, in the opinion of the core team,
the resulting discussion produces convincing arguments for the
necessity of such support, the process will move to the second phase.
In the second phase, which only occurs following a decision by the
core team that extended community support is neeed, there will be a
public solicitation for volunteers to provide such support. Any
interested person may volunteer. Members of the Django core team are
as eligible as anyone else, but will need to take care to
differentiate this role from their work on officially-supported
releases.
The core team will then choose from among the volunteers at least one,
but preferably two or more, people -- herafter known as "community
maintainers" -- who will be given commit access to a repository for
community maintenance purposes. Community maintainers will be advised
prior to acceptance that this indicates a commitment on their part to
be vigilant and active in maintaining the relevant branch of Django,
and if any community maintainer declines or later fails to honor that
commitment (either by notifying the core team of an inability, or in
the core team's determination), the core team will solicit additional
volunteers. If no suitable persons can be found to act as community
maintainers, end-of-life will occur as normal, and no extended
community support will exist. Persons who later wish to remedy this by
becomimg community maintainers will be advised to contact the
django-developers list to initiate that process.
In the third phase, the community maintainers will, on their own
initiative, provide ongoing support, in the form of fixing security
and crashing/data-loss issues, in the relevant branch of Django in the
repository to which they are granted access. They will *not* become
members of the core team simply by virtue of their status as community
maintainers, and will *not* be granted access to any additional
repositories as a result of their status.
However, community maintainers will, at the discretion of the core
team, be included in pre-disclosure discussion of security issues, and
provided with sufficient details to backport security patches into, or
develop security patches for, their branches. Maintaining such
communications with community maintainers shall be the responsibiltiy
of the current Django Fellow or Django release manager, as
appropriate.
Concerns for discussion
-----------------------
There are several potential areas in this proposal which will require
discussion and ironing out of details prior to full
implementation. They are as follows.
Differentiating unofficial and official support
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Community maintainers will need to work in a repository other than the
primary Django development repository[2]. This is both to avoid
confusion between official and unofficial support, and because it is
not possible, in git, to give commit access to only a specific branch
or portion of a repository, and community maintainers will not (as
noted above) become committers on Django as a result of being
community maintainers.
However, the community maintenance repository should still be
somewhere under the Django organzation on GitHub, both for visibility
and for ease of administration. The exact location and name of the
repository, and its access-rights policies, will need to be decided
prior to commencing use by community maintainers.
Ensuring active work by community maintainers
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Although the Django core team will not be providing direct support for
community-maintained versions, some level of oversight will be needed
to ensure community maintainers are keeping up with their
commitments. Primarily this will consist of ensuring that community
maintainers have security patches ready to commit, and applied to
their branches, at the same time as affected supported versions in the
primary Django repository, but it may be useful to develop a stronger
metric for ensuring community maintenance lives up to its goals.
Coordinating security disclosure
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The Django core team has historically treated knowledge of security
issues with the utmost discretion, keeping details restricted to as
few people and entities as possible until the moment of public
disclosure.
Community maintainers will necessarily need to be aware of potential
security issues in the versions of Django they maintain, and may also
need access to security-reporting functionality for issues present in
their versions of Django but not in later, officially-supported
versions.
The core team will need to develop a plan for keeping community
maintainers appropriately in the loop while maintaining the currently
small, trusted circle of knowledge of security issues.
Warning users about unsupported Python versions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The primary use case for community maintenance is to allow extended
unofficial support for Django on Python versions which
officially-supported releases of Django no longer run on, particularly
Python 2.6. But Python 2.6 itself is also unsupported officially by
the Python core team; it is and has been past end-of-life for quite
some time.
As such, the only safe way to use Python 2.6 -- which does have known
security issues discovered past its end-of-life -- is when the Python
version itself is also receiving third-party support. Typically only a
handful of large enterprise operating-system vendors are willing to
provide such support, so only users who are customers of such vendors
will be able to safely use community-maintained versions of Django.
Large and loud warnings will be necessary on community-maintained
versions of Django, indicating to potential users that they should
*not* stay on a community-maintained version unless they are also
using an officially-supported version of Python, or are customers of
an operating-system vendor which backports security patches into its
supplied version of Python.
References
----------
[1]
https://groups.google.com/forum/#!topic/django-users/B74QJaqA0b4[2]
https://github.com/django/django/