[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