[Python-modules-commits] [django-sitetree] 01/06: New upstream version 1.9.0+dfsg

Michael Fladischer fladi at moszumanska.debian.org
Wed Dec 20 09:40:02 UTC 2017


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

fladi pushed a commit to branch debian/master
in repository django-sitetree.

commit 4f92b40f4b439df5c1d3c7295c3c7b3a48b11b9b
Author: Michael Fladischer <FladischerMichael at fladi.at>
Date:   Wed Dec 20 10:12:22 2017 +0100

    New upstream version 1.9.0+dfsg
---
 .travis.yml                                        |  12 +-
 AUTHORS                                            |   3 +
 CHANGELOG                                          |  10 +
 LICENSE                                            |   2 +-
 README.rst                                         |   5 +-
 docs/source/conf.py                                |   2 +-
 docs/source/index.rst                              |   2 +-
 docs/source/quickstart.rst                         |  14 +-
 docs/source/templatesmod.rst                       |  20 ++
 setup.py                                           |   2 -
 sitetree/__init__.py                               |   2 +-
 sitetree/admin.py                                  |  17 +-
 sitetree/forms.py                                  |   3 +-
 sitetree/locale/fr/LC_MESSAGES/django.mo           | Bin 0 -> 6228 bytes
 sitetree/locale/fr/LC_MESSAGES/django.po           | 261 +++++++++++++++++++++
 .../management/commands/sitetree_resync_apps.py    |   5 +-
 sitetree/management/commands/sitetreeload.py       |  14 +-
 sitetree/migrations/0001_initial.py                |   4 +-
 sitetree/models.py                                 |  15 +-
 sitetree/runtests.py                               |   4 +-
 sitetree/sitetreeapp.py                            |  38 +--
 sitetree/south_migrations/0001_initial.py          |  78 ------
 ...ccess_restricted__add_field_treeitem_access_.py |  80 -------
 ...003_auto__add_field_treeitem_access_loggedin.py |  64 -----
 .../0004_auto__add_field_tree_title.py             |  65 -----
 .../0005_auto__add_field_treeitem_access_guest.py  |  67 ------
 sitetree/south_migrations/__init__.py              |   0
 .../templates/sitetree/breadcrumbs_bootstrap4.html |  15 ++
 sitetree/templates/sitetree/menu_bootstrap4.html   |  13 +
 .../sitetree/menu_bootstrap4_dropdown.html         |   6 +
 .../sitetree/menu_bootstrap4_navpills-stacked.html |   8 +
 .../sitetree/menu_bootstrap4_navpills.html         |   8 +
 sitetree/tests/conftest.py                         |   6 +-
 sitetree/utils.py                                  |  28 +--
 tox.ini                                            |   5 +-
 35 files changed, 426 insertions(+), 452 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 59d8238..ad7ed2b 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -4,10 +4,10 @@ python:
   - 3.6
   - 3.5
   - 3.4
-  - 3.3
   - 2.7
 
 env:
+  - DJANGO="Django>=2.0,<2.1"
   - DJANGO="Django>=1.11,<1.12"
   - DJANGO="Django>=1.10,<1.11"
   - DJANGO="Django>=1.9,<1.10"
@@ -28,12 +28,8 @@ matrix:
    - python: 3.5
      env: DJANGO="Django>=1.7,<1.8"
 
-   - python: 3.3
-     env: DJANGO="Django>=1.11,<1.12"
-   - python: 3.3
-     env: DJANGO="Django>=1.10,<1.11"
-   - python: 3.3
-     env: DJANGO="Django>=1.9,<1.10"
-
+   - python: 2.7
+     env: DJANGO="Django>=2.0,<2.1"
+ 
 after_success:
   coveralls
diff --git a/AUTHORS b/AUTHORS
index eefafda..20dd53a 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -38,6 +38,8 @@ Sergey Maranchuk <https://github.com/slav0nic>
 Martey Dodoo <https://github.com/martey>
 Michał Suszko <https://github.com/msuszko>
 Piter Vergara <https://github.com/pitervergara>
+Chris Lamb <https://github.com/lamby>
+stop5 <https://github.com/stop5>
 
 
 Translators
@@ -49,3 +51,4 @@ German: Danilo Bargen <https://www.transifex.com/accounts/profile/gwrtheyrn/>
 Persian: Ali Javadi <https://www.transifex.com/accounts/profile/rohamn/>
 Spanish: Adrián López Calvo <https://www.transifex.com/accounts/profile/AdrianLC/>
 Norwegian: Eirik Krogstad <https://github.com/tangram>
+French: Jean Traullé <https://www.transifex.com/user/profile/jtraulle/>
diff --git a/CHANGELOG b/CHANGELOG
index 0c2b07b..072324b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,16 @@ django-sitetree changelog
 =========================
 
 
+v1.9.0
+------
++ Added Bootstrap 4 templates.
+* Dropped support for Python 2.6 and 3.3.
+* Dropped Django<1.7 related code.
++ Added basic Django 2.0 compatibility.
++ Added French translation.
+* Reduced number of SQL queries on item admin page (see #237)
+
+
 v1.8.0
 ------
 + IMPORTANT: i18n trees now support full lang names (e.g. de-ch, pt-br), update your i18n trees aliases.
diff --git a/LICENSE b/LICENSE
index 70e78b9..fe66d35 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2010-2016, django-sitetree project
+Copyright (c) 2010-2017, django-sitetree project
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without modification,
diff --git a/README.rst b/README.rst
index 6cfaab0..234fdc4 100644
--- a/README.rst
+++ b/README.rst
@@ -2,14 +2,11 @@ django-sitetree
 ===============
 http://github.com/idlesign/django-sitetree
 
-|release| |stats|  |lic| |ci| |coverage| |health|
+|release| |lic| |ci| |coverage| |health|
 
 .. |release| image:: https://img.shields.io/pypi/v/django-sitetree.svg
     :target: https://pypi.python.org/pypi/django-sitetree
 
-.. |stats| image:: https://img.shields.io/pypi/dm/django-sitetree.svg
-    :target: https://pypi.python.org/pypi/django-sitetree
-
 .. |lic| image:: https://img.shields.io/pypi/l/django-sitetree.svg
     :target: https://pypi.python.org/pypi/django-sitetree
 
diff --git a/docs/source/conf.py b/docs/source/conf.py
index aca3488..39fe1a2 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -42,7 +42,7 @@ master_doc = 'index'
 
 # General information about the project.
 project = u'django-sitetree'
-copyright = u'2011-2016, Igor \'idle sign\' Starikov'
+copyright = u'2011-2017, Igor \'idle sign\' Starikov'
 
 # The version info for the project you're documenting, acts as replacement for
 # |version| and |release|, also used in various other places throughout the
diff --git a/docs/source/index.rst b/docs/source/index.rst
index b19d4ee..66ce507 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -29,7 +29,7 @@ User access to certain sitetree items can be restricted to authenticated users o
 Requirements
 ------------
 
-1. Python 2.6+, 3.3+
+1. Python 2.7+, 3.4+
 2. Django 1.7+
 3. Auth Django contrib package
 4. Admin site Django contrib package (optional)
diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst
index e03c6df..51dfb53 100644
--- a/docs/source/quickstart.rst
+++ b/docs/source/quickstart.rst
@@ -5,19 +5,7 @@ Getting started
 2. Check that *django.core.context_processors.request* is added to TEMPLATE_CONTEXT_PROCESSORS in your settings file.
    For Django 1.8+: *django.template.context_processors.request* should be defined in ``TEMPLATES/OPTIONS/context_processors``.
 3. Check that *django.contrib.auth.context_processors.auth* is enabled in TEMPLATE_CONTEXT_PROCESSORS too.
-4. Run ``./manage.py syncdb`` to install sitetree tables into database (``./manage.py migrate`` for Django 1.7+).
-
-    .. warning::
-
-        Those, who are using South <1.0 for migrations with Django <1.7, add this into settings file:
-
-        .. code-block:: python
-
-            SOUTH_MIGRATION_MODULES = {
-                'sitetree': 'sitetree.south_migrations',
-            }
-
-
+4. Run ``./manage.py migrate`` to install sitetree tables into database.
 5. Go to Django Admin site and add some trees and tree items (see :ref:`Making tree <making-tree>` section).
 6. Add *{% load sitetree %}* tag to the top of a template.
 
diff --git a/docs/source/templatesmod.rst b/docs/source/templatesmod.rst
index 49020a8..882fb43 100644
--- a/docs/source/templatesmod.rst
+++ b/docs/source/templatesmod.rst
@@ -88,6 +88,10 @@ The following templates are bundled with SiteTree:
 
    The same as above but for Bootstrap version 3.
 
+ * `sitetree/breadcrumbs_bootstrap4.html`
+
+   The same as above but for Bootstrap version 4.
+
  * `sitetree/menu_bootstrap.html`
 
    This template can be used to construct *menu contents* for Bootstrap Navbar.
@@ -119,6 +123,10 @@ The following templates are bundled with SiteTree:
 
    The same as above but for Bootstrap version 3.
 
+  * `sitetree/menu_bootstrap4.html`
+
+   The same as above but for Bootstrap version 3.
+
  * `sitetree/menu_bootstrap_dropdown.html`
 
    One level deep dropdown menu.
@@ -127,6 +135,10 @@ The following templates are bundled with SiteTree:
 
    The same as above but for Bootstrap version 3.
 
+ * `sitetree/menu_bootstrap4_dropdown.html`
+
+   The same as above but for Bootstrap version 4.
+
  * `sitetree/menu_bootstrap_navlist.html`
 
    This template can be used to construct a Bootstrap Nav list.
@@ -139,10 +151,18 @@ The following templates are bundled with SiteTree:
 
    Constructs nav-pills Bootstrap 3 horizontal navigation.
 
+ * `sitetree/menu_bootstrap4_navpills.html`
+
+   The same as above but for Bootstrap version 4.
+
  * `sitetree/menu_bootstrap3_navpills-stacked.html`
 
    Constructs nav-pills Bootstrap 3 vertical navigation similar to navlist from Bootstrap 2.
 
+ * `sitetree/menu_bootstrap4_navpills-stacked.html`
+
+   The same as above but for Bootstrap version 4.
+
 
 You can find Bootstrap navigation elements examples at http://getbootstrap.com/components/
 
diff --git a/setup.py b/setup.py
index 4bc99df..b1ffd5e 100755
--- a/setup.py
+++ b/setup.py
@@ -37,10 +37,8 @@ setup(
         'Operating System :: OS Independent',
         'Programming Language :: Python',
         'Programming Language :: Python :: 2',
-        'Programming Language :: Python :: 2.6',
         'Programming Language :: Python :: 2.7',
         'Programming Language :: Python :: 3',
-        'Programming Language :: Python :: 3.3',
         'Programming Language :: Python :: 3.4',
         'Programming Language :: Python :: 3.5',
         'Programming Language :: Python :: 3.6',
diff --git a/sitetree/__init__.py b/sitetree/__init__.py
index fde7f45..d9cc825 100644
--- a/sitetree/__init__.py
+++ b/sitetree/__init__.py
@@ -1,4 +1,4 @@
-VERSION = (1, 8, 0)
+VERSION = (1, 9, 0)
 
 
 default_app_config = 'sitetree.config.SitetreeConfig'
\ No newline at end of file
diff --git a/sitetree/admin.py b/sitetree/admin.py
index 22f4505..7bb6b90 100644
--- a/sitetree/admin.py
+++ b/sitetree/admin.py
@@ -1,6 +1,9 @@
 from django.conf import settings as django_settings
 from django import VERSION as django_version
-from django.core.urlresolvers import get_urlconf, get_resolver
+try:
+    from django.urls import get_urlconf, get_resolver
+except ImportError:
+    from django.core.urlresolvers import get_urlconf, get_resolver
 from django.utils.translation import ugettext_lazy as _
 from django.utils import six
 from django.http import HttpResponseRedirect
@@ -109,6 +112,18 @@ class TreeItemAdmin(admin.ModelAdmin):
     change_form_template = 'admin/sitetree/treeitem/change_form.html'
     delete_confirmation_template = 'admin/sitetree/treeitem/delete_confirmation.html'
 
+    def formfield_for_manytomany(self, db_field, request=None, **kwargs):
+
+        # The same as for GroupAdmin
+        # Avoid a major performance hit resolving permission names which
+        # triggers a content_type load:
+        if db_field.name == 'access_permissions':
+            objects = db_field.remote_field.model.objects if DJANGO_POST_19 else db_field.rel.to.objects
+            qs = kwargs.get('queryset', objects)
+            kwargs['queryset'] = qs.select_related('content_type')
+
+        return super(TreeItemAdmin, self).formfield_for_manytomany(db_field, request=request, **kwargs)
+
     def response_add(self, request, obj, post_url_continue=None, **kwargs):
         """Redirects to the appropriate items' 'continue' page on item add.
 
diff --git a/sitetree/forms.py b/sitetree/forms.py
index 5f7b6bb..7d08cc1 100644
--- a/sitetree/forms.py
+++ b/sitetree/forms.py
@@ -22,4 +22,5 @@ class TreeItemForm(forms.Form):
 
         # autocomplete off - deals with Firefox form caching
         # https://bugzilla.mozilla.org/show_bug.cgi?id=46845
-        self.fields['tree_item'] = self.choice_field_class(tree, initial=tree_item, widget=forms.Select(attrs={'autocomplete': 'off'}))
+        self.fields['tree_item'] = self.choice_field_class(
+            tree, initial=tree_item, widget=forms.Select(attrs={'autocomplete': 'off'}))
diff --git a/sitetree/locale/fr/LC_MESSAGES/django.mo b/sitetree/locale/fr/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..c64f6fd
Binary files /dev/null and b/sitetree/locale/fr/LC_MESSAGES/django.mo differ
diff --git a/sitetree/locale/fr/LC_MESSAGES/django.po b/sitetree/locale/fr/LC_MESSAGES/django.po
new file mode 100644
index 0000000..ba87a6b
--- /dev/null
+++ b/sitetree/locale/fr/LC_MESSAGES/django.po
@@ -0,0 +1,261 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# Jean Traullé <jtraulle at gmail.com>, 2017
+msgid ""
+msgstr ""
+"Project-Id-Version: django-sitetree\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-09-25 22:11+0700\n"
+"PO-Revision-Date: 2017-11-19 09:34+0700\n"
+"Last-Translator: Igor 'idle sign' Starikov <idlesign at yandex.ru>\n"
+"Language-Team: French (http://www.transifex.com/idlesign/django-sitetree/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 2.0.4\n"
+
+#: admin.py:81
+msgid "Basic settings"
+msgstr "Paramètres basiques"
+
+#: admin.py:84
+msgid "Access settings"
+msgstr "Paramètres d'accès"
+
+#: admin.py:88
+msgid "Display settings"
+msgstr "Paramètres d'affichage"
+
+#: admin.py:92
+msgid "Additional settings"
+msgstr "Paramètres additionnels"
+
+#: admin.py:153
+msgid "You are seeing this warning because \"URL as Pattern\" option is active and pattern entered above seems to be invalid. Currently registered URL pattern names and parameters: "
+msgstr "Vous voyez cet avertissement car l'option \"URL comme Motif\" est active et que le motif saisi ci-dessus semble invalide. Noms et paramètres de motifs d'URL actuellement enregistrés :"
+
+#: admin.py:230
+msgid "Item's parent left unchanged. Item couldn't be parent to itself."
+msgstr "Parent de l'item inchangé. L'item ne peut être son propre parent."
+
+#: models.py:31 models.py:56 templates/admin/sitetree/tree/change_form.html:41
+msgid "Title"
+msgstr "Titre"
+
+#: models.py:31
+msgid "Site tree title for presentational purposes."
+msgstr "Titre de l'arborescence du site dans un but de présentation."
+
+#: models.py:32 models.py:62
+msgid "Alias"
+msgstr "Alias"
+
+#: models.py:32
+msgid "Short name to address site tree from templates.<br /><b>Note:</b> change with care."
+msgstr "Court nom permettant de récupérer l'arborescence depuis les gabarits.<br /><b>Note :</b> modifiez avec précaution."
+
+#: models.py:36 models.py:60
+msgid "Site Tree"
+msgstr "Arborescence"
+
+#: models.py:37
+msgid "Site Trees"
+msgstr "Arborescences"
+
+#: models.py:52
+msgid "Any"
+msgstr "N'importe quelle"
+
+#: models.py:53
+msgid "All"
+msgstr "Toutes"
+
+#: models.py:56
+msgid "Site tree item title. Can contain template variables E.g.: {{ mytitle }}."
+msgstr "Titre de l'item de l'arborescence. Peut contenir des variables de gabarit ex : {{ montitre }}."
+
+#: models.py:57
+msgid "Hint"
+msgstr "Indication"
+
+#: models.py:57
+msgid "Some additional information about this item that is used as a hint."
+msgstr "Une information additionnelle à propos de l'item utilisée comme une indication."
+
+#: models.py:58 templates/admin/sitetree/tree/change_form.html:42
+msgid "URL"
+msgstr "URL"
+
+#: models.py:58
+msgid "Exact URL or URL pattern (see \"Additional settings\") for this item."
+msgstr "URL exacte ou motif d'URL (voir \"Paramètres additionnels\") pour cet item."
+
+#: models.py:59
+msgid "URL as Pattern"
+msgstr "URL comme Motif"
+
+#: models.py:59
+msgid "Whether the given URL should be treated as a pattern.<br /><b>Note:</b> Refer to Django \"URL dispatcher\" documentation (e.g. \"Naming URL patterns\" part)."
+msgstr "L'URL donnée doit-elle être traitée comme un motif ?<br /><b>Note :</b> Se référer à la documentation Django sur la \"Distribution des URL\" (section des \"Groupes nommés\")."
+
+#: models.py:60
+msgid "Site tree this item belongs to."
+msgstr "Arborescence de site à laquelle cet item appartient."
+
+#: models.py:61 templates/admin/sitetree/tree/change_form.html:34
+msgid "Hidden"
+msgstr "Caché"
+
+#: models.py:61
+msgid "Whether to show this item in navigation."
+msgstr "Doit-on afficher cet item dans la navigation ?"
+
+#: models.py:62
+#, python-format
+msgid "Short name to address site tree item from a template.<br /><b>Reserved aliases:</b> \"%s\"."
+msgstr "Court nom permettant de récupérer l'item d'arborescence depuis un gabarit.<br /><b>Alias réservés :</b> \"%s\"."
+
+#: models.py:63
+msgid "Description"
+msgstr "Description"
+
+#: models.py:63
+msgid "Additional comments on this item."
+msgstr "Commentaires additionnels sur cet item."
+
+#: models.py:64
+msgid "Show in menu"
+msgstr "Afficher dans le menu"
+
+#: models.py:64
+msgid "Whether to show this item in a menu."
+msgstr "Doit-on afficher cet item dans un menu ?"
+
+#: models.py:65
+msgid "Show in breadcrumb path"
+msgstr "Afficher dans le fil d'ariane"
+
+#: models.py:65
+msgid "Whether to show this item in a breadcrumb path."
+msgstr "Doit-on afficher cet item dans un fil d'ariane ?"
+
+#: models.py:66
+msgid "Show in site tree"
+msgstr "Afficher dans l'arborescence du site"
+
+#: models.py:66
+msgid "Whether to show this item in a site tree."
+msgstr "Doit-on afficher cet item dans une arborescence de site ?"
+
+#: models.py:67
+msgid "Logged in only"
+msgstr "Connecté seulement"
+
+#: models.py:67
+msgid "Check it to grant access to this item to authenticated users only."
+msgstr "Cocher pour accorder l'accès à cet item uniquement aux utilisateurs identifiés."
+
+#: models.py:68 templates/admin/sitetree/tree/change_form.html:40
+msgid "Guests only"
+msgstr "Visiteurs uniquement"
+
+#: models.py:68
+msgid "Check it to grant access to this item to guests only."
+msgstr "Cocher pour accorder l'accès à cet item uniquement aux visiteurs."
+
+#: models.py:69
+msgid "Restrict access to permissions"
+msgstr "Restreindre l'accès aux permissions"
+
+#: models.py:69
+msgid "Check it to restrict user access to this item, using Django permissions system."
+msgstr "Cocher pour restreindre l'accès à cet item aux utilisateurs, en utilisant le système de permissions de Django."
+
+#: models.py:70
+msgid "Permissions granting access"
+msgstr "Autorisations d'accès"
+
+#: models.py:71
+msgid "Permissions interpretation"
+msgstr "Interprétation des permissions"
+
+#: models.py:71
+msgid "<b>Any</b> — user should have any of chosen permissions. <b>All</b> — user should have all chosen permissions."
+msgstr "<b>N'importe laquelle</b> — l'utilisateur doit disposer de l'une des autorisations choisies. <b>Toutes</b> — l'utilisateur doit disposer de toutes les autorisations choisies."
+
+#: models.py:74
+msgid "Parent"
+msgstr "Parent"
+
+#: models.py:74
+msgid "Parent site tree item."
+msgstr "Item parent dans l'arborescence de site."
+
+#: models.py:75 templates/admin/sitetree/tree/change_form.html:43
+msgid "Sort order"
+msgstr "Ordre de tri"
+
+#: models.py:75
+msgid "Item position among other site tree items under the same parent."
+msgstr "Position de l'item parmi d'autres items de l'arborescence sous le même parent."
+
+#: models.py:89
+msgid "Site Tree Item"
+msgstr "Item d'arborescence de site"
+
+#: models.py:90 templates/admin/sitetree/tree/change_form.html:17
+msgid "Site Tree Items"
+msgstr "Items d'arborescence de site"
+
+#: templates/admin/sitetree/tree/change_form.html:24
+msgid "Add Site Tree item"
+msgstr "Ajouter un item d'arborescence de site"
+
+#: templates/admin/sitetree/tree/change_form.html:35
+msgid "Menu"
+msgstr "Menu"
+
+#: templates/admin/sitetree/tree/change_form.html:36
+msgid "Breadcrumbs"
+msgstr "Fils d'ariane"
+
+#: templates/admin/sitetree/tree/change_form.html:37
+msgid "Tree"
+msgstr "Arborescence"
+
+#: templates/admin/sitetree/tree/change_form.html:38
+msgid "Restricted"
+msgstr "Restreint"
+
+#: templates/admin/sitetree/tree/change_form.html:39
+msgid "Users only"
+msgstr "Utilisateurs uniquement"
+
+#: templates/admin/sitetree/tree/tree.html:23
+msgid "Move up"
+msgstr "Déplacer vers le haut"
+
+#: templates/admin/sitetree/tree/tree.html:25
+msgid "Move down"
+msgstr "Déplacer vers le bas"
+
+#: templates/admin/sitetree/treeitem/breadcrumbs.html:5
+msgid "Home"
+msgstr "Accueil"
+
+#: templates/admin/sitetree/treeitem/breadcrumbs.html:11
+msgid "Delete"
+msgstr "Supprimer"
+
+#: templates/admin/sitetree/treeitem/breadcrumbs.html:15
+msgid "History"
+msgstr "Historique"
+
+#: templates/admin/sitetree/treeitem/breadcrumbs.html:17
+msgid "Add"
+msgstr "Ajouter"
diff --git a/sitetree/management/commands/sitetree_resync_apps.py b/sitetree/management/commands/sitetree_resync_apps.py
index 129bb01..df24ca2 100644
--- a/sitetree/management/commands/sitetree_resync_apps.py
+++ b/sitetree/management/commands/sitetree_resync_apps.py
@@ -63,6 +63,9 @@ class Command(BaseCommand):
                             item.save(using=using)
                             # Copy permissions to M2M field once `item`
                             # has been saved
-                            item.access_permissions = item.permissions
+                            if hasattr(item.access_permissions, 'set'):
+                                item.access_permissions.set(item.permissions)
+                            else:
+                                item.access_permissions = item.permissions
 
         Cache.reset()
diff --git a/sitetree/management/commands/sitetreeload.py b/sitetree/management/commands/sitetreeload.py
index 68b0df4..e31d624 100644
--- a/sitetree/management/commands/sitetreeload.py
+++ b/sitetree/management/commands/sitetreeload.py
@@ -1,21 +1,19 @@
-import sys
 from collections import defaultdict
 
+import sys
 from django import VERSION
 from django.core import serializers
+from django.core.exceptions import ObjectDoesNotExist
 from django.core.management.base import BaseCommand, CommandError
 from django.core.management.color import no_style
 from django.db import connections, router, transaction, DEFAULT_DB_ALIAS
-from django.core.exceptions import ObjectDoesNotExist
 
-from sitetree.utils import get_tree_model, get_tree_item_model
 from sitetree.compat import CommandOption, options_getter
-
+from sitetree.utils import get_tree_model, get_tree_item_model
 
 MODEL_TREE_CLASS = get_tree_model()
 MODEL_TREE_ITEM_CLASS = get_tree_item_model()
 
-VER_LESS_17 = VERSION < (1, 7)
 VER_LESS_18 = VERSION < (1, 8)
 
 
@@ -66,15 +64,9 @@ class Command(BaseCommand):
 
         self.style = no_style()
 
-        if VER_LESS_17:
-            transaction.commit_unless_managed(using=using)
-
         if VER_LESS_18:
             transaction.enter_transaction_management(using=using)
 
-        if VER_LESS_17:
-            transaction.managed(True, using=using)
-
         loaded_object_count = 0
 
         if mode == 'replace':
diff --git a/sitetree/migrations/0001_initial.py b/sitetree/migrations/0001_initial.py
index 0bcc7af..f957f4e 100644
--- a/sitetree/migrations/0001_initial.py
+++ b/sitetree/migrations/0001_initial.py
@@ -46,8 +46,8 @@ class Migration(migrations.Migration):
                 ('access_perm_type', models.IntegerField(default=1, help_text='<b>Any</b> — user should have any of chosen permissions. <b>All</b> — user should have all chosen permissions.', verbose_name='Permissions interpretation', choices=[(1, 'Any'), (2, 'All')])),
                 ('sort_order', models.IntegerField(default=0, help_text='Item position among other site tree items under the same parent.', verbose_name='Sort order', db_index=True)),
                 ('access_permissions', models.ManyToManyField(to='auth.Permission', verbose_name='Permissions granting access', blank=True)),
-                ('parent', models.ForeignKey(related_name='treeitem_parent', blank=True, to='sitetree.TreeItem', help_text='Parent site tree item.', null=True, verbose_name='Parent')),
-                ('tree', models.ForeignKey(related_name='treeitem_tree', verbose_name='Site Tree', to='sitetree.Tree', help_text='Site tree this item belongs to.')),
+                ('parent', models.ForeignKey(related_name='treeitem_parent', on_delete=models.CASCADE, blank=True, to='sitetree.TreeItem', help_text='Parent site tree item.', null=True, verbose_name='Parent')),
+                ('tree', models.ForeignKey(related_name='treeitem_tree', on_delete=models.CASCADE, verbose_name='Site Tree', to='sitetree.Tree', help_text='Site tree this item belongs to.')),
             ],
             options={
                 'abstract': False,
diff --git a/sitetree/models.py b/sitetree/models.py
index 7304b92..5987d63 100644
--- a/sitetree/models.py
+++ b/sitetree/models.py
@@ -1,18 +1,11 @@
-from django.db import models
-from django.conf import settings
 from django.contrib.auth.models import Permission
-from django.utils.translation import ugettext_lazy as _
+from django.db import models
 from django.utils.encoding import python_2_unicode_compatible
+from django.utils.translation import ugettext_lazy as _
 
 from .settings import MODEL_TREE, TREE_ITEMS_ALIASES
 
 
-# This allows South to handle our custom 'CharFieldNullable' field.
-if 'south' in settings.INSTALLED_APPS:
-    from south.modelsinspector import add_introspection_rules
-    add_introspection_rules([], ['^sitetree\.models\.CharFieldNullable'])
-
-
 class CharFieldNullable(models.CharField):
     """We use custom char field to put nulls in SiteTreeItem 'alias' field.
     That allows 'unique_together' directive in Meta to work properly, so
@@ -74,7 +67,7 @@ class TreeItemBase(models.Model):
                     '<b>Note:</b> Refer to Django "URL dispatcher" documentation (e.g. "Naming URL patterns" part).'),
         db_index=True, default=False)
     tree = models.ForeignKey(
-        MODEL_TREE, related_name='%(class)s_tree', verbose_name=_('Site Tree'),
+        MODEL_TREE, related_name='%(class)s_tree', on_delete=models.CASCADE, verbose_name=_('Site Tree'),
         help_text=_('Site tree this item belongs to.'), db_index=True)
     hidden = models.BooleanField(
         _('Hidden'), help_text=_('Whether to show this item in navigation.'), db_index=True, default=False)
@@ -118,7 +111,7 @@ class TreeItemBase(models.Model):
     # These two are for 'adjacency list' model.
     # This is the current approach of tree representation for sitetree.
     parent = models.ForeignKey(
-        'self', related_name='%(class)s_parent', verbose_name=_('Parent'),
+        'self', related_name='%(class)s_parent', on_delete=models.CASCADE, verbose_name=_('Parent'),
         help_text=_('Parent site tree item.'), db_index=True, null=True, blank=True)
     sort_order = models.IntegerField(
         _('Sort order'),
diff --git a/sitetree/runtests.py b/sitetree/runtests.py
index be464ba..0ff3aff 100755
--- a/sitetree/runtests.py
+++ b/sitetree/runtests.py
@@ -1,5 +1,7 @@
 #! /usr/bin/env python
 
+import sys
+
 if __name__ == '__main__':
     from pytest import main as pytest_main
-    pytest_main()
+    sys.exit(pytest_main())
diff --git a/sitetree/sitetreeapp.py b/sitetree/sitetreeapp.py
index dec2f89..8d0ffbb 100644
--- a/sitetree/sitetreeapp.py
+++ b/sitetree/sitetreeapp.py
@@ -1,32 +1,32 @@
 from __future__ import unicode_literals
+
 import warnings
 from collections import defaultdict
 from copy import deepcopy
-from threading import local
 from functools import partial
+from threading import local
 
-from django.conf import settings
 from django import VERSION
+from django.conf import settings
 from django.core.cache import cache
 from django.db.models import signals
-from django.utils import six
-from django.utils.http import urlquote
-from django.utils.translation import get_language
-from django.utils.encoding import python_2_unicode_compatible
-from django.template.loader import get_template
 from django.template.base import (
     FilterExpression, Lexer, Parser, Token, Variable, VariableDoesNotExist, TOKEN_BLOCK, UNKNOWN_SOURCE, TOKEN_TEXT,
     TOKEN_VAR, VARIABLE_TAG_START)
 from django.template.defaulttags import url as url_tag
+from django.template.loader import get_template
+from django.utils import six
+from django.utils.encoding import python_2_unicode_compatible
+from django.utils.http import urlquote
+from django.utils.translation import get_language
 
-from .utils import get_tree_model, get_tree_item_model, import_app_sitetree_module, generate_id_for
+from .exceptions import SiteTreeError
 from .settings import (
     ALIAS_TRUNK, ALIAS_THIS_CHILDREN, ALIAS_THIS_SIBLINGS, ALIAS_THIS_PARENT_SIBLINGS, ALIAS_THIS_ANCESTOR_CHILDREN,
     UNRESOLVED_ITEM_MARKER, RAISE_ITEMS_ERRORS_ON_DEBUG, CACHE_TIMEOUT)
-from .exceptions import SiteTreeError
-
+from .utils import get_tree_model, get_tree_item_model, import_app_sitetree_module, generate_id_for
 
-if False:  # For type hinting purposes.
+if False:  # pragma: nocover
     from django.template import Context
     from .models import TreeItemBase
 
@@ -59,7 +59,6 @@ _IDX_TPL = '%s|:|%s'
 _THREAD_LOCAL = local()
 _THREAD_SITETREE = 'sitetree'
 
-_URL_TAG_NEW_STYLE = VERSION >= (1, 5, 0)
 _CONTEXT_FLATTEN = VERSION >= (1, 11)
 
 _UNSET = set()  # Sentinel
@@ -608,7 +607,11 @@ class SiteTree(object):
             return None
 
         # urlquote is an attempt to support non-ascii in url.
-        current_url = urlquote(self.current_request.path)
+        current_url = self.current_request.path
+        if isinstance(current_url, str):
+            current_url = current_url.encode('UTF-8')
+        if current_url:
+            current_url = urlquote(current_url)
 
         for url_item, url in self._items_urls.items():
             # Iterate each as this dict may contains "current" items for various trees.
@@ -664,10 +667,8 @@ class SiteTree(object):
 
                 view_path = view_path[0].strip('"\' ')
 
-            if _URL_TAG_NEW_STYLE:
-                view_path = "'%s'" % view_path
+            url_pattern = "'%s' %s" % (view_path, ' '.join(all_arguments))
 
-            url_pattern = '%s %s' % (view_path, ' '.join(all_arguments))
         else:
             url_pattern = '%s' % sitetree_item.url
 
@@ -851,7 +852,10 @@ class SiteTree(object):
         :param Context context:
         :rtype: bool
         """
-        authenticated = self.current_request.user.is_authenticated()
+        if hasattr(self.current_request.user.is_authenticated, '__call__'):
+            authenticated = self.current_request.user.is_authenticated()
+        else:
+            authenticated = self.current_request.user.is_authenticated
 
         if item.access_loggedin and not authenticated:
             return False
diff --git a/sitetree/south_migrations/0001_initial.py b/sitetree/south_migrations/0001_initial.py
deleted file mode 100644
index 2badd9b..0000000
--- a/sitetree/south_migrations/0001_initial.py
+++ /dev/null
@@ -1,78 +0,0 @@
-# encoding: utf-8
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-class Migration(SchemaMigration):
-
-    def forwards(self, orm):
-        
-        # Adding model 'Tree'
-        db.create_table('sitetree_tree', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('alias', self.gf('django.db.models.fields.CharField')(unique=True, max_length=80, db_index=True)),
-        ))
-        db.send_create_signal('sitetree', ['Tree'])
-
-        # Adding model 'TreeItem'
-        db.create_table('sitetree_treeitem', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('title', self.gf('django.db.models.fields.CharField')(max_length=100)),
-            ('hint', self.gf('django.db.models.fields.CharField')(default='', max_length=200, blank=True)),
-            ('url', self.gf('django.db.models.fields.CharField')(max_length=200, db_index=True)),
-            ('urlaspattern', self.gf('django.db.models.fields.BooleanField')(default=False, db_index=True)),
-            ('tree', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['sitetree.Tree'])),
-            ('hidden', self.gf('django.db.models.fields.BooleanField')(default=False, db_index=True)),
-            ('alias', self.gf('sitetree.models.CharFieldNullable')(db_index=True, max_length=80, null=True, blank=True)),
-            ('description', self.gf('django.db.models.fields.TextField')(default='', blank=True)),
-            ('inmenu', self.gf('django.db.models.fields.BooleanField')(default=True, db_index=True)),
-            ('inbreadcrumbs', self.gf('django.db.models.fields.BooleanField')(default=True, db_index=True)),
-            ('insitetree', self.gf('django.db.models.fields.BooleanField')(default=True, db_index=True)),
-            ('parent', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['sitetree.TreeItem'], null=True, blank=True)),
-            ('sort_order', self.gf('django.db.models.fields.IntegerField')(default=0, db_index=True)),
-        ))
-        db.send_create_signal('sitetree', ['TreeItem'])
-
-        # Adding unique constraint on 'TreeItem', fields ['tree', 'alias']
-        db.create_unique('sitetree_treeitem', ['tree_id', 'alias'])
-
-
-    def backwards(self, orm):
-        
-        # Removing unique constraint on 'TreeItem', fields ['tree', 'alias']
-        db.delete_unique('sitetree_treeitem', ['tree_id', 'alias'])
-
-        # Deleting model 'Tree'
-        db.delete_table('sitetree_tree')
-
-        # Deleting model 'TreeItem'
-        db.delete_table('sitetree_treeitem')
-
-
-    models = {
-        'sitetree.tree': {
-            'Meta': {'object_name': 'Tree'},
-            'alias': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80', 'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
-        },
-        'sitetree.treeitem': {
-            'Meta': {'unique_together': "(('tree', 'alias'),)", 'object_name': 'TreeItem'},
-            'alias': ('sitetree.models.CharFieldNullable', [], {'db_index': 'True', 'max_length': '80', 'null': 'True', 'blank': 'True'}),
-            'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
-            'hidden': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
-            'hint': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '200', 'blank': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'inbreadcrumbs': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
-            'inmenu': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
-            'insitetree': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
-            'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sitetree.TreeItem']", 'null': 'True', 'blank': 'True'}),
-            'sort_order': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}),
-            'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
-            'tree': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sitetree.Tree']"}),
-            'url': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
-            'urlaspattern': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'})
-        }
-    }
-
-    complete_apps = ['sitetree']
diff --git a/sitetree/south_migrations/0002_auto__add_field_treeitem_access_restricted__add_field_treeitem_access_.py b/sitetree/south_migrations/0002_auto__add_field_treeitem_access_restricted__add_field_treeitem_access_.py
deleted file mode 100644
index fca77c2..0000000
--- a/sitetree/south_migrations/0002_auto__add_field_treeitem_access_restricted__add_field_treeitem_access_.py
+++ /dev/null
@@ -1,80 +0,0 @@
-# encoding: utf-8
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-class Migration(SchemaMigration):
-
-    def forwards(self, orm):
-        
-        # Adding field 'TreeItem.access_restricted'
-        db.add_column('sitetree_treeitem', 'access_restricted', self.gf('django.db.models.fields.BooleanField')(default=False, db_index=True), keep_default=False)
-
-        # Adding field 'TreeItem.access_perm_type'
-        db.add_column('sitetree_treeitem', 'access_perm_type', self.gf('django.db.models.fields.IntegerField')(default=1), keep_default=False)
-
-        # Adding M2M table for field access_permissions on 'TreeItem'
-        db.create_table('sitetree_treeitem_access_permissions', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('treeitem', models.ForeignKey(orm['sitetree.treeitem'], null=False)),
-            ('permission', models.ForeignKey(orm['auth.permission'], null=False))
-        ))
-        db.create_unique('sitetree_treeitem_access_permissions', ['treeitem_id', 'permission_id'])
-
-
-    def backwards(self, orm):
-        
-        # Deleting field 'TreeItem.access_restricted'
-        db.delete_column('sitetree_treeitem', 'access_restricted')
-
-        # Deleting field 'TreeItem.access_perm_type'
-        db.delete_column('sitetree_treeitem', 'access_perm_type')
-
-        # Removing M2M table for field access_permissions on 'TreeItem'
-        db.delete_table('sitetree_treeitem_access_permissions')
-
-
-    models = {
-        'auth.permission': {
-            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
-            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
-            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
-        },
-        'contenttypes.contenttype': {
-            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
-            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
-        },
-        'sitetree.tree': {
-            'Meta': {'object_name': 'Tree'},
-            'alias': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80', 'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
-        },
-        'sitetree.treeitem': {
-            'Meta': {'unique_together': "(('tree', 'alias'),)", 'object_name': 'TreeItem'},
-            'access_perm_type': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
-            'access_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
-            'access_restricted': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
-            'alias': ('sitetree.models.CharFieldNullable', [], {'db_index': 'True', 'max_length': '80', 'null': 'True', 'blank': 'True'}),
-            'description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
-            'hidden': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
-            'hint': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '200', 'blank': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'inbreadcrumbs': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
-            'inmenu': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
-            'insitetree': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
-            'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sitetree.TreeItem']", 'null': 'True', 'blank': 'True'}),
-            'sort_order': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}),
-            'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
-            'tree': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sitetree.Tree']"}),
-            'url': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}),
-            'urlaspattern': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'})
-        }
-    }
-
-    complete_apps = ['sitetree']
diff --git a/sitetree/south_migrations/0003_auto__add_field_treeitem_access_loggedin.py b/sitetree/south_migrations/0003_auto__add_field_treeitem_access_loggedin.py
deleted file mode 100644
index 6fe6d73..0000000
--- a/sitetree/south_migrations/0003_auto__add_field_treeitem_access_loggedin.py
+++ /dev/null
@@ -1,64 +0,0 @@
-# encoding: utf-8
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-class Migration(SchemaMigration):
... 382 lines suppressed ...

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



More information about the Python-modules-commits mailing list