[Python-modules-commits] [python-django-extensions] 01/01: Convert from git-dpm to patches unapplied format

Brian May bam at moszumanska.debian.org
Tue Jul 4 21:30:14 UTC 2017


This is an automated email from the git hooks/post-receive script.

bam pushed a commit to branch debian/master
in repository python-django-extensions.

commit 1ecce7930fdbb43aff6cd5e6cd47f11789f4d883
Author: Brian May <bam at moszumanska.debian.org>
Date:   Tue Jul 4 21:30:13 2017 +0000

    Convert from git-dpm to patches unapplied format
---
 .pre-commit-config.yaml                            |  31 ---
 .travis.yml                                        |  60 +++--
 CHANGELOG.md                                       |  76 +-----
 Makefile                                           |   2 +-
 README.rst                                         |  16 +-
 debian/.git-dpm                                    |  11 -
 debian/gbp.conf                                    |   2 +
 django_extensions/__init__.py                      |   4 +-
 django_extensions/admin/__init__.py                |  38 ++-
 django_extensions/admin/filter.py                  |   6 +-
 django_extensions/admin/widgets.py                 |   7 +-
 django_extensions/compat.py                        | 214 +++++++++++++++-
 django_extensions/conf/app_template/forms.py.tmpl  |   2 +-
 django_extensions/conf/app_template/urls.py.tmpl   |   5 +-
 .../management/commands/sample.py.tmpl             |   5 +-
 .../templatetags/sample.py.tmpl                    |   1 +
 django_extensions/db/__init__.py                   |   1 +
 django_extensions/db/fields/__init__.py            |  96 +++++++-
 django_extensions/db/fields/encrypted.py           |  37 ++-
 django_extensions/db/fields/json.py                |  75 +++---
 django_extensions/db/models.py                     |  20 +-
 django_extensions/jobs/__init__.py                 |   1 +
 django_extensions/jobs/daily/__init__.py           |   1 +
 django_extensions/jobs/daily/cache_cleanup.py      |  10 +-
 django_extensions/jobs/daily/daily_cleanup.py      |   9 +-
 django_extensions/jobs/hourly/__init__.py          |   1 +
 django_extensions/jobs/minutely/__init__.py        |   1 +
 django_extensions/jobs/monthly/__init__.py         |   1 +
 django_extensions/jobs/weekly/__init__.py          |   1 +
 django_extensions/jobs/yearly/__init__.py          |   1 +
 django_extensions/logging/__init__.py              |   1 +
 django_extensions/logging/filters.py               |   2 +-
 django_extensions/management/__init__.py           |   1 +
 django_extensions/management/base.py               |   2 +-
 django_extensions/management/color.py              |  15 +-
 django_extensions/management/commands/__init__.py  |   1 +
 .../management/commands/admin_generator.py         |  66 +++--
 django_extensions/management/commands/clean_pyc.py |   5 +-
 .../management/commands/clear_cache.py             |   2 +-
 .../management/commands/compile_pyc.py             |   5 +-
 .../management/commands/create_app.py              |  39 ++-
 .../management/commands/create_command.py          |  54 ++--
 .../management/commands/create_jobs.py             |  12 +-
 .../management/commands/create_template_tags.py    |  12 +-
 .../management/commands/describe_form.py           |  15 +-
 .../management/commands/drop_test_database.py      |  18 +-
 .../management/commands/dumpscript.py              |  96 ++++++--
 .../management/commands/export_emails.py           |   8 +-
 .../management/commands/find_template.py           |  13 +-
 .../management/commands/generate_secret_key.py     |   5 +-
 .../management/commands/graph_models.py            |  20 +-
 .../management/commands/mail_debug.py              |   6 +-
 django_extensions/management/commands/notes.py     |   7 +-
 django_extensions/management/commands/passwd.py    |  24 +-
 .../management/commands/pipchecker.py              |   6 +-
 .../management/commands/print_settings.py          |  20 +-
 .../management/commands/print_user_for_session.py  |  28 ++-
 django_extensions/management/commands/reset_db.py  |  31 +--
 django_extensions/management/commands/runjob.py    |  27 +-
 django_extensions/management/commands/runjobs.py   |  40 +--
 .../management/commands/runprofileserver.py        |  59 ++++-
 django_extensions/management/commands/runscript.py |  72 +++---
 .../management/commands/runserver_plus.py          | 273 +++++++++++----------
 .../management/commands/set_default_site.py        |   6 +-
 .../management/commands/set_fake_emails.py         |   8 +-
 .../management/commands/set_fake_passwords.py      |   9 +-
 .../management/commands/shell_plus.py              |  45 ++--
 .../management/commands/show_template_tags.py      |  11 +-
 .../management/commands/show_templatetags.py       |   2 +-
 django_extensions/management/commands/show_urls.py |  13 +-
 django_extensions/management/commands/sqlcreate.py |   8 +-
 django_extensions/management/commands/sqldiff.py   |  70 ++++--
 django_extensions/management/commands/sqldsn.py    |   7 +-
 django_extensions/management/commands/sync_s3.py   |   8 +-
 django_extensions/management/commands/syncdata.py  |  32 ++-
 .../management/commands/unreferenced_files.py      |  16 +-
 .../management/commands/update_permissions.py      |  34 ++-
 .../management/commands/validate_templates.py      |  27 +-
 .../management/email_notifications.py              |   5 +-
 django_extensions/management/jobs.py               |   5 +-
 django_extensions/management/modelviz.py           |  41 +++-
 django_extensions/management/mysql.py              |   2 +-
 django_extensions/management/notebook_extension.py |   2 +-
 django_extensions/management/shells.py             |  55 +++--
 django_extensions/management/signals.py            |   2 +-
 django_extensions/management/technical_response.py |   2 +-
 django_extensions/management/utils.py              |   2 +-
 django_extensions/models.py                        |   1 +
 django_extensions/mongodb/__init__.py              |   1 +
 django_extensions/mongodb/fields/__init__.py       |   2 +-
 django_extensions/mongodb/fields/encrypted.py      |   2 +-
 django_extensions/mongodb/fields/json.py           |  11 +-
 django_extensions/mongodb/models.py                |  18 +-
 django_extensions/settings.py                      |   2 +-
 django_extensions/south_migrations/0001_empty.py   |  17 ++
 django_extensions/south_migrations/__init__.py     |   1 +
 .../django_extensions/css/jquery.autocomplete.css  |   2 +-
 .../static/django_extensions/js/jquery.bgiframe.js |  39 ---
 .../django_extensions/js/jquery.bgiframe.min.js    |  10 +
 django_extensions/templatetags/__init__.py         |   1 +
 django_extensions/templatetags/highlighting.py     |  11 +-
 django_extensions/templatetags/indent_text.py      |   5 +-
 django_extensions/templatetags/syntax_color.py     |   2 +-
 django_extensions/templatetags/truncate_letters.py |  13 +-
 django_extensions/templatetags/widont.py           |  17 +-
 django_extensions/utils/__init__.py                |   1 +
 django_extensions/utils/deprecation.py             |   8 -
 django_extensions/utils/dia2django.py              |   2 +-
 django_extensions/utils/text.py                    |  11 +-
 django_extensions/utils/validatingtemplatetags.py  |  51 ++--
 django_extensions/validators.py                    |   2 +-
 docs/admin_extensions.rst                          |   2 +-
 docs/command_extensions.rst                        |   7 +-
 docs/conf.py                                       |   4 +-
 docs/creating_release.txt                          |   1 +
 docs/field_extensions.rst                          |   3 -
 docs/index.rst                                     |   2 +-
 docs/runprofileserver.rst                          |  10 +-
 docs/runscript.rst                                 |  11 +-
 docs/runserver_plus.rst                            |  54 ++--
 docs/shell_plus.rst                                |  28 +--
 docs/validate_templates.rst                        |  12 +-
 setup.cfg                                          |   4 +-
 setup.py                                           |  14 +-
 tests/__init__.py                                  |  11 +-
 tests/management/__init__.py                       |   1 +
 tests/management/commands/__init__.py              |   1 +
 tests/management/commands/error_raising_command.py |   2 +-
 tests/management/test_modelviz.py                  |  28 ---
 tests/test_autoslug_fields.py                      |  18 +-
 tests/test_clean_pyc.py                            |   2 +-
 tests/test_color.py                                |  23 --
 tests/test_compat.py                               |  25 --
 tests/test_compile_pyc.py                          |   2 +-
 tests/test_create_command.py                       |  19 --
 tests/test_dumpscript.py                           |   2 +-
 tests/test_encrypted_fields.py                     |   7 +-
 tests/test_find_template.py                        |   2 +-
 tests/test_json_field.py                           |  86 +------
 tests/test_management_command.py                   |  99 +-------
 tests/test_models.py                               |   2 +-
 tests/test_randomchar_field.py                     |   2 +-
 tests/test_runscript.py                            |   9 +-
 tests/test_shortuuid_field.py                      |   2 +-
 tests/test_template_rendering.py                   |  16 --
 tests/test_templatetags.py                         |  11 +-
 tests/test_timestamped_model.py                    |   2 +-
 tests/test_uuid_field.py                           |   2 +-
 tests/testapp/__init__.py                          |   3 +-
 tests/testapp/apps.py                              |  11 +-
 tests/testapp/models.py                            |   2 +-
 tests/testapp/scripts/__init__.py                  |   1 +
 tests/testapp/scripts/sample_script.py             |   2 +-
 tests/testapp/settings.py                          |  22 +-
 tests/testapp/urls.py                              |  27 +-
 tests/testapp_with_no_models_file/__init__.py      |   0
 tests/testapp_with_no_models_file/admin.py         |   7 -
 tox.ini                                            |  14 +-
 158 files changed, 1534 insertions(+), 1443 deletions(-)

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
deleted file mode 100644
index 965cbfb..0000000
--- a/.pre-commit-config.yaml
+++ /dev/null
@@ -1,31 +0,0 @@
--   repo: git://github.com/pre-commit/pre-commit-hooks
-    sha: 493665a5fc24deb2204fc48b8398be77e6c9e5d5
-    hooks:
-    -   id: trailing-whitespace
-    -   id: check-added-large-files
-        args:
-        - --maxkb=128
-    -   id: check-ast
-    -   id: check-case-conflict
-    -   id: check-docstring-first
-    -   id: check-json
-    -   id: check-merge-conflict
-    -   id: check-xml
-    -   id: check-yaml
-    -   id: detect-private-key
-    -   id: end-of-file-fixer
-    -   id: fix-encoding-pragma
-    -   id: flake8
-    -   id: name-tests-test
-        args:
-        - --django
-        exclude: '^tests/testapp|^tests/management/'
--   repo: git://github.com/Lucas-C/pre-commit-hooks.git
-    sha: 0f5055d31f39ea3ac1f5335a0cca320200cd0c51
-    hooks:
-    -   id: forbid-crlf
--   repo: git://github.com/trbs/pre-commit-hooks-trbs.git
-    sha: c94ad5f83406a96b0750869e8930669af074975b
-    hooks:
-    -   id: forbid-executables
-        exclude: manage.py|setup.py
diff --git a/.travis.yml b/.travis.yml
index aa867a5..a1e7814 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,53 +1,49 @@
 language: python
 
 python:
-  - 3.5
+    - 3.5
 
 sudo: false
 
 env:
-  - TOX_ENV=py27-flake8
-  - TOX_ENV=py34-flake8
-  - TOX_ENV=py35-flake8
-  - TOX_ENV=precommit
-  - TOX_ENV=py27-dj18
-  - TOX_ENV=py27-dj19
-  - TOX_ENV=py27-dj110
-  - TOX_ENV=py27-djmaster
-  - TOX_ENV=py32-dj18
-  - TOX_ENV=py33-dj18
-  - TOX_ENV=py34-dj18
-  - TOX_ENV=py34-dj19
-  - TOX_ENV=py34-dj110
-  - TOX_ENV=py34-djmaster
-  - TOX_ENV=py35-dj18
-  - TOX_ENV=py35-dj19
-  - TOX_ENV=py35-dj110
-  - TOX_ENV=py35-djmaster
-  - TOX_ENV=pypy-dj18
-  - TOX_ENV=pypy-dj19
-  - TOX_ENV=pypy-dj110
-  - TOX_ENV=pypy-djmaster
-  # - TOX_ENV=pypy3-dj18
-  # - TOX_ENV=pypy3-dj19
-  # - TOX_ENV=pypy3-dj110
-  - TOX_ENV=pypy3-djmaster
+    - TOX_ENV=py27-flake8
+    - TOX_ENV=py34-flake8
+    - TOX_ENV=py35-flake8
+    - TOX_ENV=py27-dj16
+    - TOX_ENV=py32-dj16
+    - TOX_ENV=py33-dj16
+    - TOX_ENV=py34-dj16
+    - TOX_ENV=py27-dj17
+    - TOX_ENV=py27-dj18
+    - TOX_ENV=py27-dj19
+    - TOX_ENV=py27-djmaster
+    - TOX_ENV=py32-dj17
+    - TOX_ENV=py32-dj18
+    - TOX_ENV=py33-dj17
+    - TOX_ENV=py33-dj18
+    - TOX_ENV=py34-dj17
+    - TOX_ENV=py34-dj18
+    - TOX_ENV=py34-dj19
+    - TOX_ENV=py34-djmaster
+    - TOX_ENV=py35-dj19
+    - TOX_ENV=py35-djmaster
+    - TOX_ENV=pypy-dj17
+    - TOX_ENV=pypy-dj18
+    - TOX_ENV=pypy-djmaster
+    - TOX_ENV=pypy3-dj17
+    - TOX_ENV=pypy3-dj18
+    - TOX_ENV=pypy3-djmaster
 
 matrix:
   fast_finish: true
   allow_failures:
-    - env: TOX_ENV=py32-dj18
     - env: TOX_ENV=py35-djmaster
     - env: TOX_ENV=py34-djmaster
     - env: TOX_ENV=py27-djmaster
     - env: TOX_ENV=pypy-djmaster
-    # pypy3 is not >=3.4 compatible yet
-    # - env: TOX_ENV=pypy3-dj19
-    # - env: TOX_ENV=pypy3-dj110
     - env: TOX_ENV=pypy3-djmaster
 
 install:
-  # virtualenv<14.0.0 is for Python 3.2 compatibility
   - pip install "virtualenv<14.0.0" tox coveralls
 
 script:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fecd442..aa2158b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,78 +1,14 @@
 Changelog
 =========
 
-1.7.3
------
-
-Changes:
- - Fix: ForeignKeySearchInput, fix bug with constructing search_path urls
- - Docs: runscript, fix runscript example
- - Deprecation: JSONField, Django now includes JSONField our field is now deprecated
-
-
-1.7.2
------
-
-Changes:
- - Fix: passwd, Update passwd command up to Django>=1.8
- - Improvement: shell_plus, add settings.SHELL_PLUS_PRINT_SQL config option
- - Improvement: shell_plus, allow to specifies the connection file to use if using the --kernel option
-
-
-1.7.1
------
-
-Changes:
- - Fix: sqldiff, fix optional app_label arguments
- - Fix: runscript, remove args from command class
- - Doc: runscript, remove = from --script-args example
-
-
-1.7.0
------
-
-The "Letting go of the past" release.
-
-From this moment on Django Extensions requires version 1.8 or higher.
-A lot of work has been done to remove old backwards compatibility code and
-make sure that Django Extensions uses the current Django API's. This should
-result in better and easier to maintain code (and hopefully less bugs :).
-
-This release touches a lot of code if you have any issues please report them
-at https://github.com/django-extensions/django-extensions/issues
-
-We still need more tests to make sure we don't break people's projects when
-refactoring. If you have some spare time please contribute tests !
-
-Changes:
- - Cleanup: removing backwards compatibility hacks for (now) unsupported versions of Django
- - Cleanup: use six instead of home grown functions
- - Fix: AutoSlugField, allow_duplicates didn't set slug value to model instance
- - Fix: MongoDB fields, verbose_name on mongoengine fields does not seem to be supported
- - Fix: MongoDB fields, fix relative import problem with json.py
- - Improvement: Start using pre-commit
- - Improvement: syncdata, Replace custom transaction logic with transaction.atomic
- - Improvement: Django 1.10, use from_db_value instead of models.SubfieldBase
- - Improvement: print_user_session, support for non standard user model
- - Improvement: widont, tests to work with py2 and py3
- - Improvement: runserver_plus, prevent 2nd reload of debugger on runserver_plus
- - Improvement: runserver_plus, prevent killing the server when request.META values are evaluated
- - Improvement: reset_db, add argument to make closing sessions optional
- - Improvement: print_settings, Fix positional arguments
- - Improvement: runscript, migrate to argparse and add_arguments
- - Improvement: graph_models, do not rely on .models_module for inclusion in output
- - Improvement: jsonfield, fix issues with mutable default
- - Docs: Convert readthedocs links for their .org -> .io migration
-
-
 1.6.7
 -----
 
 Changes:
- - Fix: describe_form, fix No module named 'django.db.models.loading' error
- - Improvement: shell_plus,  Add a setting to prefix all models in an application #887
- - Improvement: pipchecker, check for requirements-{dev,prod}.txt as well
- - Docs: pipchecker, update documentation
+    - Fix: describe_form, fix No module named 'django.db.models.loading' error
+    - Improvement: shell_plus,  Add a setting to prefix all models in an application #887
+    - Improvement: pipchecker, check for requirements-{dev,prod}.txt as well
+    - Docs: pipchecker, update documentation
 
 1.6.6
 -----
@@ -337,7 +273,7 @@ Changes:
  - New: validators.py, NoControlCharactersValidator and NoWhitespaceValidator
  - New: EmailNotificationCommand class, email exceptions from Django Commands
  - Improvement: runserver_plus, enable threading by default and added --nothreading
- - Improvement: runscript, better detection when import error occured in script
+ - Improvement: runscript, better detection when import error occured in script 
  - Improvement: runscript, use EmailNotificationCommand class
  - Deprecation: deprecated UUIDField since Django 1.8 will have a native version.
  - Removed: completely remove support for automatically finding project root.
@@ -431,7 +367,7 @@ Changes:
 
 Changes:
  - Feature: shell_plus, add --kernel option to start as standalone IPython kernel
- - Feature: reset_db, Programatically determine PostGIS template
+ - Feature: reset_db, Programatically determine PostGIS template 
  - Feature: sqldiff, add support for PointField and MultiPolygonField
  - Test: renamed test app
  - Fix: runserver_plus, --print-sql for Django 1.7
diff --git a/Makefile b/Makefile
index e6c4a1e..1865c1a 100644
--- a/Makefile
+++ b/Makefile
@@ -29,7 +29,7 @@ clean-test:
 	rm -fr htmlcov/
 
 test:
-	python setup.py test --pytest-args="tests django_extensions --ds=tests.testapp.settings --cov=django_extensions"
+	python setup.py test --pytest-args="tests --ds=tests.testapp.settings --cov=django_extensions"
 
 coverage:
 	coverage run --source django_extensions setup.py test
diff --git a/README.rst b/README.rst
index a455ca1..f722439 100644
--- a/README.rst
+++ b/README.rst
@@ -5,7 +5,7 @@
 .. image:: https://img.shields.io/pypi/l/django-extensions.svg
    :target: https://raw.githubusercontent.com/django-extensions/django-extensions/master/LICENSE
 
-.. image:: https://secure.travis-ci.org/django-extensions/django-extensions.svg?branch=master
+.. image:: https://secure.travis-ci.org/django-extensions/django-extensions.png?branch=master
     :alt: Build Status
     :target: http://travis-ci.org/django-extensions/django-extensions
 
@@ -21,7 +21,7 @@
     :target: https://pypi.python.org/pypi/django-extensions/
     :alt: Supports Wheel format
 
-.. image:: https://coveralls.io/repos/django-extensions/django-extensions/badge.svg?branch=master
+.. image:: https://coveralls.io/repos/django-extensions/django-extensions/badge.png?branch=master
    :target: https://coveralls.io/r/django-extensions/django-extensions?branch=master
    :alt: Coverage
 
@@ -31,16 +31,16 @@ Django Extensions is a collection of custom extensions for the Django Framework.
 Getting Started
 ===============
 
-The easiest way to figure out what Django Extensions are all about is to watch the
-`excellent screencast by Eric Holscher`__ (`watch the video on vimeo`__). In a couple
-minutes Eric walks you through a half a dozen command extensions. There is also a
+The easiest way to figure out what Django Extensions are all about is to watch the 
+`excellent screencast by Eric Holscher`__ (`watch the video on vimeo`__). In a couple 
+minutes Eric walks you through a half a dozen command extensions. There is also a 
 `short screencast on GoDjango`__ to help show you even more.
 
 
 Requirements
 ============
 
-Django Extensions requires Django 1.8 or later.
+Django Extensions requires Django 1.6 or later.
 
 
 Getting It
@@ -62,7 +62,7 @@ If you want to install it from source, grab the git repository from GitHub and r
 Installing It
 =============
 
-To enable `django_extensions` in your project you need to add it to `INSTALLED_APPS` in your projects
+To enable `django_extensions` in your project you need to add it to `INSTALLED_APPS` in your projects 
 `settings.py` file::
 
     INSTALLED_APPS = (
@@ -112,7 +112,7 @@ Documentation
 
 You can view documentation online at:
 
-- https://django-extensions.readthedocs.io
+- http://django-extensions.readthedocs.org
 
 Or you can look at the docs/ directory in the repository.
 
diff --git a/debian/.git-dpm b/debian/.git-dpm
deleted file mode 100644
index f5cae6b..0000000
--- a/debian/.git-dpm
+++ /dev/null
@@ -1,11 +0,0 @@
-# see git-dpm(1) from git-dpm package
-9c9b80a1e42105f3ffaabaf337a459e6a802ddee
-9c9b80a1e42105f3ffaabaf337a459e6a802ddee
-6c5a19a5479a7f4c0db8c4cc709ec0ce6406b270
-6c5a19a5479a7f4c0db8c4cc709ec0ce6406b270
-python-django-extensions_1.7.4.orig.tar.gz
-b78d9f349415a0f3f442a06ea8d71d1fad84b799
-176156
-debianTag="debian/%e%v"
-patchedTag="patched/%e%v"
-upstreamTag="upstream/%e%u"
diff --git a/debian/gbp.conf b/debian/gbp.conf
new file mode 100644
index 0000000..3879982
--- /dev/null
+++ b/debian/gbp.conf
@@ -0,0 +1,2 @@
+[DEFAULT]
+debian-branch=debian/master
diff --git a/django_extensions/__init__.py b/django_extensions/__init__.py
index 92443a5..2500de0 100644
--- a/django_extensions/__init__.py
+++ b/django_extensions/__init__.py
@@ -1,5 +1,5 @@
-# -*- coding: utf-8 -*-
-VERSION = (1, 7, 4)
+# coding=utf-8
+VERSION = (1, 6, 7)
 
 # Dynamically calculate the version based on VERSION tuple
 if len(VERSION) > 2 and VERSION[2] is not None:
diff --git a/django_extensions/admin/__init__.py b/django_extensions/admin/__init__.py
index 4e25bb4..a147034 100644
--- a/django_extensions/admin/__init__.py
+++ b/django_extensions/admin/__init__.py
@@ -1,13 +1,12 @@
-# -*- coding: utf-8 -*-
+# coding=utf-8
 #
 # Autocomplete feature for admin panel
 #
 import six
 import operator
-from functools import update_wrapper
 from six.moves import reduce
 
-from django.apps import apps
+import django
 from django.http import HttpResponse, HttpResponseNotFound
 from django.conf import settings
 from django.db import models
@@ -18,6 +17,13 @@ from django.utils.text import get_text_list
 from django.contrib.admin import ModelAdmin
 
 from django_extensions.admin.widgets import ForeignKeySearchInput
+from django_extensions.compat import get_model_compat
+
+try:
+    from functools import update_wrapper
+    assert update_wrapper
+except ImportError:
+    from django.utils.functional import update_wrapper
 
 
 class ForeignKeyAutocompleteAdmin(ModelAdmin):
@@ -57,10 +63,25 @@ class ForeignKeyAutocompleteAdmin(ModelAdmin):
                 return self.admin_site.admin_view(view)(*args, **kwargs)
             return update_wrapper(wrapper, view)
 
-        return [
-            url(r'foreignkey_autocomplete/$', wrap(self.foreignkey_autocomplete),
-                name='%s_%s_autocomplete' % (self.model._meta.app_label, self.model._meta.model_name))
-        ] + super(ForeignKeyAutocompleteAdmin, self).get_urls()
+        # model._meta.module_name is deprecated in django version 1.7 and removed in django version 1.8.
+        # It is replaced by model._meta.model_name
+        if django.VERSION < (1, 7):
+            info = self.model._meta.app_label, self.model._meta.module_name
+        else:
+            info = self.model._meta.app_label, self.model._meta.model_name
+
+        _url = url(r'foreignkey_autocomplete/$', wrap(self.foreignkey_autocomplete), name='%s_%s_autocomplete' % info)
+
+        # django.conf.urls.patterns is deprecated in django version 1.9 and removed in django version 1.10.
+        # It is replaced by a simple Python list
+        if django.VERSION < (1, 9):
+            from django.conf.urls import patterns
+            urlpatterns = patterns('', _url)
+        else:
+            urlpatterns = [_url]
+
+        urlpatterns += super(ForeignKeyAutocompleteAdmin, self).get_urls()
+        return urlpatterns
 
     def foreignkey_autocomplete(self, request):
         """
@@ -93,7 +114,8 @@ class ForeignKeyAutocompleteAdmin(ModelAdmin):
                 else:
                     return "%s__icontains" % field_name
 
-            model = apps.get_model(app_label, model_name)
+            # As of Django 1.7 the 'get_model' method was moved to 'apps'
+            model = get_model_compat(app_label, model_name)
 
             queryset = model._default_manager.all()
             data = ''
diff --git a/django_extensions/admin/filter.py b/django_extensions/admin/filter.py
index 8af8eb5..571e235 100644
--- a/django_extensions/admin/filter.py
+++ b/django_extensions/admin/filter.py
@@ -2,7 +2,11 @@
 from __future__ import unicode_literals
 
 from django.contrib.admin import FieldListFilter
-from django.contrib.admin.utils import prepare_lookup_value
+try:
+    from django.contrib.admin.utils import prepare_lookup_value
+except ImportError:
+    # django < 1.7
+    from django.contrib.admin.util import prepare_lookup_value
 from django.utils.translation import ugettext_lazy as _
 
 
diff --git a/django_extensions/admin/widgets.py b/django_extensions/admin/widgets.py
index 969cc2b..c1e4676 100644
--- a/django_extensions/admin/widgets.py
+++ b/django_extensions/admin/widgets.py
@@ -1,6 +1,5 @@
-# -*- coding: utf-8 -*-
+# coding=utf-8
 import six
-from six.moves import urllib
 from django import forms
 from django.contrib.admin.sites import site
 from django.contrib.admin.widgets import ForeignKeyRawIdWidget
@@ -21,7 +20,7 @@ class ForeignKeySearchInput(ForeignKeyRawIdWidget):
     search_path = None
 
     def _media(self):
-        js_files = ['django_extensions/js/jquery.bgiframe.js',
+        js_files = ['django_extensions/js/jquery.bgiframe.min.js',
                     'django_extensions/js/jquery.ajaxQueue.js',
                     'django_extensions/js/jquery.autocomplete.js']
 
@@ -48,7 +47,7 @@ class ForeignKeySearchInput(ForeignKeyRawIdWidget):
         model_name = opts.object_name.lower()
         related_url = reverse('admin:%s_%s_changelist' % (app_label, model_name))
         if not self.search_path:
-            self.search_path = urllib.parse.urljoin(related_url, 'foreignkey_autocomplete/')
+            self.search_path = '%s/foreignkey_autocomplete/' % related_url
         params = self.url_parameters()
         if params:
             url = '?' + '&'.join(['%s=%s' % (k, v) for k, v in params.items()])
diff --git a/django_extensions/compat.py b/django_extensions/compat.py
index 94ff8bf..aef2cac 100644
--- a/django_extensions/compat.py
+++ b/django_extensions/compat.py
@@ -1,15 +1,170 @@
-# -*- coding: utf-8 -*-
+# coding=utf-8
 from __future__ import unicode_literals
 
-import importlib
+import sys
+from optparse import make_option
 import django
-
 from django.conf import settings
+from django.core.management.base import (BaseCommand, AppCommand, LabelCommand,
+                                         CommandError)
 
+# flake8: noqa
+
+#
+# Python compatibility
+#
+PY3 = sys.version_info[0] == 3
+OLD_PY2 = sys.version_info[:2] < (2, 7)
+
+if PY3:  # pragma: no cover
+    from io import StringIO
+    import importlib
+elif OLD_PY2:  # pragma: no cover
+    from cStringIO import StringIO
+    from django.utils import importlib
+else:  # pragma: no cover
+    from cStringIO import StringIO
+    import importlib
 
 #
 # Django compatibility
 #
+try:  # Django 1.5
+    from django.contrib.auth import get_user_model
+except ImportError:  # pragma: no cover
+    assert django.VERSION < (1, 5)
+    from django.contrib.auth.models import User
+    User.USERNAME_FIELD = "username"
+    User.get_username = lambda self: self.username
+
+    def get_user_model():
+        return User
+
+
+def list_apps():
+    try:
+        # django >= 1.7, to support AppConfig
+        from django.apps import apps
+    except ImportError:
+        # old way
+        return list(settings.INSTALLED_APPS)
+    else:
+        return [app.name for app in apps.get_app_configs()]
+
+
+def list_app_labels():
+    try:
+        # django >= 1.7, to support AppConfig
+        from django.apps import apps
+    except ImportError:
+        # old way
+        return [app.rsplit(".")[-1] for app in settings.INSTALLED_APPS]
+    else:
+        return [app.label for app in apps.get_app_configs()]
+
+
+def get_app(app_label):
+    try:
+        # django >= 1.7
+        from django.apps import apps
+    except ImportError:
+        from django.db import models
+        return models.get_app(app_label)
+    else:
+        return apps.get_app_config(app_label).models_module
+
+
+def get_apps():
+    try:
+        # django >= 1.7, to support AppConfig
+        from django.apps import apps
+    except ImportError:
+        from django.db import models
+        return models.get_apps()
+    else:
+        return [app.models_module for app in apps.get_app_configs() if app.models_module]
+
+
+def get_apps_from_cache():
+    try:
+        from django.apps import apps
+    except ImportError:
+        from django.db.models.loading import cache
+        return cache.get_apps()
+    else:
+        return [app.models_module for app in apps.get_app_configs() if app.models_module]
+
+
+def get_models_from_cache(app):
+    try:
+        from django.apps import apps
+    except ImportError:
+        from django.db.models.loading import cache
+        return cache.get_models(app)
+    else:
+        return apps.get_models(app)
+
+
+def get_app_models(app_labels=None):
+    if app_labels is None:
+        try:
+            # django >= 1.7, to support AppConfig
+            from django.apps import apps
+        except ImportError:
+            from django.db import models
+            return models.get_models(include_auto_created=True)
+        else:
+            return apps.get_models(include_auto_created=True)
+
+    if not isinstance(app_labels, (list, tuple, set)):
+        app_labels = [app_labels]
+
+    app_models = []
+    try:
+        # django >= 1.7, to support AppConfig
+        from django.apps import apps
+    except ImportError:
+        from django.db import models
+
+        try:
+            app_list = [models.get_app(app_label) for app_label in app_labels]
+        except (models.ImproperlyConfigured, ImportError) as e:
+            raise CommandError("%s. Are you sure your INSTALLED_APPS setting is correct?" % e)
+
+        for app in app_list:
+            app_models.extend(models.get_models(app, include_auto_created=True))
+    else:
+        for app_label in app_labels:
+            app_config = apps.get_app_config(app_label)
+            app_models.extend(app_config.get_models(include_auto_created=True))
+
+    return app_models
+
+
+def get_model_compat(app_label, model_name):
+    """Get a model on multiple Django versions."""
+    try:
+        # django >= 1.7
+        from django.apps import apps
+    except ImportError:
+        from django.db.models import get_model
+        return get_model(app_label, model_name)
+    else:
+        return apps.get_model(app_label, model_name)
+
+
+def get_models_for_app(app_label):
+    """Returns the models in the given app for an app label."""
+    try:
+        # django >= 1.7
+        from django.apps import apps
+    except ImportError:
+        from django.db.models import get_app, get_models
+        return get_models(get_app(app_label))
+    else:
+        return apps.get_app_config(app_label).get_models()
+
+
 def load_tag_library(libname):
     """Load a templatetag library on multiple Django versions.
 
@@ -42,13 +197,46 @@ def add_to_builtins_compat(name):
         engines['django'].engine.builtins.append(name)
 
 
-def get_template_setting(template_key, default=None):
-    """ Read template settings pre and post django 1.8 """
-    templates_var = getattr(settings, 'TEMPLATES', None)
-    if templates_var is not None and template_key in templates_var[0]:
-        return templates_var[0][template_key]
-    if template_key == 'DIRS':
-        pre18_template_key = 'TEMPLATES_%s' % template_key
-        value = getattr(settings, pre18_template_key, default)
-        return value
-    return default
+class ProxyParser(object):
+    """Faux parser object that will ferry our arguments into options."""
+
+    def __init__(self, command):
+        self.command = command
+
+    def add_argument(self, *args, **kwargs):
+        """Transform our argument into an option to append to self.option_list.
+
+        In argparse, "available specifiers [in help strings] include the
+        program name, %(prog)s and most keyword arguments to add_argument()".
+        However, optparse only mentions %default in the help string, and we
+        must alter the format to properly replace in optparse without error.
+        """
+        if 'help' in kwargs:
+            kwargs['help'] = kwargs['help'].replace('%(default)s', '%default')
+        self.command.option_list += (make_option(*args, **kwargs), )
+
+class CompatibilityBaseCommand(BaseCommand):
+    """Provides a compatibility between optparse and argparse transition.
+
+    Starting in Django 1.8, argparse is used. In Django 1.9, optparse support
+    will be removed.
+
+    For optparse, you append to the option_list class attribute.
+    For argparse, you must define add_arguments(self, parser).
+    BaseCommand uses the presence of option_list to decide what course to take.
+    """
+
+    def __init__(self, *args, **kwargs):
+        if django.VERSION < (1, 8) and hasattr(self, 'add_arguments'):
+            self.option_list = BaseCommand.option_list
+            parser = ProxyParser(self)
+            self.add_arguments(parser)
+        super(CompatibilityBaseCommand, self).__init__(*args, **kwargs)
+
+
+class CompatibilityAppCommand(AppCommand, CompatibilityBaseCommand):
+    """AppCommand is a BaseCommand sub-class without its own __init__."""
+
+
+class CompatibilityLabelCommand(LabelCommand, CompatibilityBaseCommand):
+    """LabelCommand is a BaseCommand sub-class without its own __init__."""
diff --git a/django_extensions/conf/app_template/forms.py.tmpl b/django_extensions/conf/app_template/forms.py.tmpl
index c3927a7..6b477f9 100644
--- a/django_extensions/conf/app_template/forms.py.tmpl
+++ b/django_extensions/conf/app_template/forms.py.tmpl
@@ -1,3 +1,3 @@
 from django import forms
 
-# place form definition here
+# place form definition here
\ No newline at end of file
diff --git a/django_extensions/conf/app_template/urls.py.tmpl b/django_extensions/conf/app_template/urls.py.tmpl
index 5122b7b..96ef53f 100644
--- a/django_extensions/conf/app_template/urls.py.tmpl
+++ b/django_extensions/conf/app_template/urls.py.tmpl
@@ -1,3 +1,6 @@
-from django.conf.urls import include, url
+try:
+    from django.conf.urls import *
+except ImportError:  # django < 1.4
+    from django.conf.urls.defaults import *
 
 # place app url patterns here
diff --git a/django_extensions/conf/command_template/management/commands/sample.py.tmpl b/django_extensions/conf/command_template/management/commands/sample.py.tmpl
index b82b95d..26e8cde 100644
--- a/django_extensions/conf/command_template/management/commands/sample.py.tmpl
+++ b/django_extensions/conf/command_template/management/commands/sample.py.tmpl
@@ -4,8 +4,5 @@ from django.core.management.base import {{ base_command }}
 class Command({{ base_command }}):
     help = "My shiny new management command."
 
-    def add_arguments(self, parser):
-        parser.add_argument('sample', nargs='+')
-
-    def handle(self, *args, **options):
+    def {{ handle_method }}:
         raise NotImplementedError()
diff --git a/django_extensions/conf/template_tags_template/templatetags/sample.py.tmpl b/django_extensions/conf/template_tags_template/templatetags/sample.py.tmpl
index 4bd3b15..d0b4881 100644
--- a/django_extensions/conf/template_tags_template/templatetags/sample.py.tmpl
+++ b/django_extensions/conf/template_tags_template/templatetags/sample.py.tmpl
@@ -1,3 +1,4 @@
 from django import template
 
 register = template.Library()
+
diff --git a/django_extensions/db/__init__.py b/django_extensions/db/__init__.py
index e69de29..9bad579 100644
--- a/django_extensions/db/__init__.py
+++ b/django_extensions/db/__init__.py
@@ -0,0 +1 @@
+# coding=utf-8
diff --git a/django_extensions/db/fields/__init__.py b/django_extensions/db/fields/__init__.py
index 0f71a10..438f78c 100644
--- a/django_extensions/db/fields/__init__.py
+++ b/django_extensions/db/fields/__init__.py
@@ -1,4 +1,4 @@
-# -*- coding: utf-8 -*-
+# coding=utf-8
 """
 Django Extensions additional model fields
 """
@@ -21,9 +21,20 @@ except ImportError:
 
 from django.core.exceptions import ImproperlyConfigured
 from django.db.models import DateTimeField, CharField, SlugField
-from django.template.defaultfilters import slugify
 from django.utils.crypto import get_random_string
-from django.utils.encoding import force_text
+from django.template.defaultfilters import slugify
+
+try:
+    from django.utils.timezone import now as datetime_now
+    assert datetime_now
+except ImportError:
+    import datetime
+    datetime_now = datetime.datetime.now
+
+try:
+    from django.utils.encoding import force_unicode  # NOQA
+except ImportError:
+    from django.utils.encoding import force_text as force_unicode  # NOQA
 
 
 MAX_UNIQUE_QUERY_ATTEMPTS = 100
@@ -37,10 +48,16 @@ class UniqueFieldMixin(object):
 
     @staticmethod
     def _get_fields(model_cls):
-        return [
-            (f, f.model if f.model != model_cls else None) for f in model_cls._meta.get_fields()
-            if not f.is_relation or f.one_to_one or (f.many_to_one and f.related_model)
-        ]
+        if hasattr(model_cls._meta, 'get_fields'):
+            # verbosity due to replacement of deprecated model_cls._meta.get_fields_with_model(),
+            # as explained here: https://docs.djangoproject.com/en/1.9/ref/models/meta/#migrating-from-the-old-api
+            return [
+                (f, f.model if f.model != model_cls else None) for f in model_cls._meta.get_fields()
+                if not f.is_relation or f.one_to_one or (f.many_to_one and f.related_model)
+            ]
+        else:
+            # prior to 1.9
+            return model_cls._meta.get_fields_with_model()
 
     def get_queryset(self, model_cls, slug_field):
         for field, model in self._get_fields(model_cls):
@@ -168,19 +185,33 @@ class AutoSlugField(UniqueFieldMixin, SlugField):
         original_slug = slug
 
         if self.allow_duplicates:
-            setattr(model_instance, self.attname, slug)
             return slug
 
         return super(AutoSlugField, self).find_unique(
             model_instance, slug_field, self.slug_generator(original_slug, start))
 
     def pre_save(self, model_instance, add):
-        value = force_text(self.create_slug(model_instance, add))
+        value = force_unicode(self.create_slug(model_instance, add))
         return value
 
     def get_internal_type(self):
         return "SlugField"
 
+    def south_field_triple(self):
+        """Returns a suitable description of this field for South."""
+        # We'll just introspect the _actual_ field.
+        from south.modelsinspector import introspector
+        field_class = '%s.AutoSlugField' % self.__module__
+        args, kwargs = introspector(self)
+        kwargs.update({
+            'populate_from': repr(self._populate_from),
+            'separator': repr(self.separator),
+            'overwrite': repr(self.overwrite),
+            'allow_duplicates': repr(self.allow_duplicates),
+        })
+        # That's our definition!
+        return field_class, args, kwargs
+
     def deconstruct(self):
... 5425 lines suppressed ...

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/python-django-extensions.git



More information about the Python-modules-commits mailing list