[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