summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chimere/actions.py2
-rw-r--r--chimere/feeds.py2
-rw-r--r--chimere/forms.py2
-rw-r--r--chimere/migrations/0001_initial.py54
-rw-r--r--chimere/migrations/0002_property_route.py2
-rw-r--r--chimere/migrations/0004_auto_20161117_1911.py4
-rw-r--r--chimere/models.py82
-rw-r--r--chimere/route.py4
-rw-r--r--chimere/templatetags/chimere_tags.py2
-rw-r--r--chimere/tests.py2
-rw-r--r--chimere/urls.py4
-rw-r--r--chimere/views.py6
-rw-r--r--chimere/widgets.py20
-rw-r--r--packages.debian4
-rw-r--r--requirements.txt38
-rw-r--r--settings.py18
16 files changed, 133 insertions, 113 deletions
diff --git a/chimere/actions.py b/chimere/actions.py
index 27614a1..392c5d3 100644
--- a/chimere/actions.py
+++ b/chimere/actions.py
@@ -21,8 +21,8 @@
Actions available in the main interface
"""
from django.conf import settings
-from django.core.urlresolvers import reverse, NoReverseMatch
from django.http import Http404
+from django.urls import reverse, NoReverseMatch
from django.utils.translation import ugettext_lazy as _
from chimere.models import Page, Area, AreaPages
diff --git a/chimere/feeds.py b/chimere/feeds.py
index 0d619d7..969a77b 100644
--- a/chimere/feeds.py
+++ b/chimere/feeds.py
@@ -24,8 +24,8 @@ from django.contrib.gis.geos import *
from django.contrib.gis.feeds import Feed
from django.contrib.syndication.views import FeedDoesNotExist
from django.core.exceptions import ObjectDoesNotExist
-from django.core.urlresolvers import reverse
from django.utils.translation import ugettext as _
+from django.urls import reverse
from django.shortcuts import get_object_or_404
diff --git a/chimere/forms.py b/chimere/forms.py
index 02dbf53..cc8661f 100644
--- a/chimere/forms.py
+++ b/chimere/forms.py
@@ -27,9 +27,9 @@ from django import forms
from django.conf import settings
from django.contrib.gis import forms as gis_forms
from django.core.exceptions import ImproperlyConfigured
-from django.core.urlresolvers import reverse
from django.db.models import Q
from django.forms.formsets import formset_factory
+from django.urls import reverse
from django.utils.translation import ugettext as _
from django.contrib.auth.models import User, Permission, ContentType
from django.core.mail import EmailMessage, BadHeaderError
diff --git a/chimere/migrations/0001_initial.py b/chimere/migrations/0001_initial.py
index 2122912..204442b 100644
--- a/chimere/migrations/0001_initial.py
+++ b/chimere/migrations/0001_initial.py
@@ -72,7 +72,7 @@ class Migration(migrations.Migration):
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)),
('order', models.IntegerField(verbose_name='Order')),
('default', models.NullBooleanField(verbose_name='Default layer')),
- ('area', models.ForeignKey(to='chimere.Area')),
+ ('area', models.ForeignKey(to='chimere.Area', on_delete=models.CASCADE)),
],
options={
'verbose_name': 'Layers',
@@ -233,7 +233,7 @@ class Migration(migrations.Migration):
('url', models.URLField(verbose_name='Url')),
('order', models.IntegerField(verbose_name='Order', default=1)),
('miniature', models.BooleanField(verbose_name='Display inside the description?', default=False)),
- ('marker', models.ForeignKey(related_name='multimedia_files', blank=True, null=True, to='chimere.Marker')),
+ ('marker', models.ForeignKey(related_name='multimedia_files', blank=True, null=True, to='chimere.Marker', on_delete=models.SET_NULL)),
],
options={
'verbose_name': 'Multimedia file',
@@ -303,7 +303,7 @@ class Migration(migrations.Migration):
('thumbnailfile_height', models.IntegerField(verbose_name='Thumbnail height', blank=True, null=True)),
('thumbnailfile_width', models.IntegerField(verbose_name='Thumbnail width', blank=True, null=True)),
('order', models.IntegerField(verbose_name='Order', default=1)),
- ('marker', models.ForeignKey(related_name='pictures', blank=True, null=True, to='chimere.Marker')),
+ ('marker', models.ForeignKey(related_name='pictures', blank=True, null=True, to='chimere.Marker', on_delete=models.SET_NULL)),
],
options={
'verbose_name': 'Picture file',
@@ -349,8 +349,8 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)),
('value', models.TextField(verbose_name='Value')),
- ('marker', models.ForeignKey(verbose_name='Point of interest', blank=True, null=True, to='chimere.Marker')),
- ('polygon', models.ForeignKey(verbose_name='Polygon', blank=True, null=True, to='chimere.Polygon')),
+ ('marker', models.ForeignKey(verbose_name='Point of interest', blank=True, null=True, to='chimere.Marker', on_delete=models.SET_NULL)),
+ ('polygon', models.ForeignKey(verbose_name='Polygon', blank=True, null=True, to='chimere.Polygon', on_delete=models.SET_NULL)),
],
options={
'verbose_name': 'Property',
@@ -379,7 +379,7 @@ class Migration(migrations.Migration):
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)),
('value', models.CharField(verbose_name='Value', max_length=150)),
('available', models.BooleanField(verbose_name='Available', default=True)),
- ('propertymodel', models.ForeignKey(verbose_name='Property model', related_name='choices', to='chimere.PropertyModel')),
+ ('propertymodel', models.ForeignKey(verbose_name='Property model', related_name='choices', to='chimere.PropertyModel', on_delete=models.CASCADE)),
],
options={
'verbose_name': 'Model property choice',
@@ -450,10 +450,10 @@ class Migration(migrations.Migration):
('keywords', models.TextField(verbose_name='Keywords', max_length=200, blank=True, null=True)),
('min_zoom', models.IntegerField(verbose_name='Minimum zoom for loading details', help_text='Optimization when too many data have to be displayed. Currently available only for route and polygon.', blank=True, null=True)),
('simplify_tolerance', models.FloatField(verbose_name='Simplify tolerance for lower zoom', help_text='Only relevant when Minimum zoom is set. Use the Douglas-Peucker algorythm to simplify the geometry when details is not alvailable. Adjust to your data volume and your performance need. 0.0003 is a good starting point. Note: typology is not preserved.', blank=True, null=True)),
- ('category', models.ForeignKey(verbose_name='Category', related_name='subcategories', to='chimere.Category')),
- ('color_theme', models.ForeignKey(verbose_name='Color theme', related_name='subcategories', blank=True, null=True, to='chimere.ColorTheme')),
- ('hover_icon', models.ForeignKey(verbose_name='Hover icon', related_name='subcat_hovered', blank=True, null=True, to='chimere.Icon')),
- ('icon', models.ForeignKey(verbose_name='Icon', to='chimere.Icon')),
+ ('category', models.ForeignKey(verbose_name='Category', related_name='subcategories', to='chimere.Category', on_delete=models.CASCADE)),
+ ('color_theme', models.ForeignKey(verbose_name='Color theme', related_name='subcategories', blank=True, null=True, to='chimere.ColorTheme', on_delete=models.SET_NULL)),
+ ('hover_icon', models.ForeignKey(verbose_name='Hover icon', related_name='subcat_hovered', blank=True, null=True, to='chimere.Icon', on_delete=models.SET_NULL)),
+ ('icon', models.ForeignKey(verbose_name='Icon', to='chimere.Icon', on_delete=models.PROTECT)),
],
options={
'verbose_name': 'Sub-category',
@@ -465,8 +465,8 @@ class Migration(migrations.Migration):
name='SubCategoryUserLimit',
fields=[
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)),
- ('subcategory', models.ForeignKey(related_name='limited_for_user', to='chimere.SubCategory')),
- ('user', models.ForeignKey(related_name='subcategory_limit_to', to=settings.AUTH_USER_MODEL)),
+ ('subcategory', models.ForeignKey(related_name='limited_for_user', to='chimere.SubCategory', on_delete=models.CASCADE)),
+ ('user', models.ForeignKey(related_name='subcategory_limit_to', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
],
options={
'verbose_name': 'Sub-category limit for user',
@@ -486,7 +486,7 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='route',
name='associated_file',
- field=models.ForeignKey(verbose_name='Associated file', blank=True, null=True, to='chimere.RouteFile'),
+ field=models.ForeignKey(verbose_name='Associated file', blank=True, null=True, to='chimere.RouteFile', on_delete=models.SET_NULL),
),
migrations.AddField(
model_name='route',
@@ -496,7 +496,7 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='route',
name='ref_item',
- field=models.ForeignKey(verbose_name='Reference route', related_name='submited_route', blank=True, null=True, to='chimere.Route'),
+ field=models.ForeignKey(verbose_name='Reference route', related_name='submited_route', blank=True, null=True, to='chimere.Route', on_delete=models.SET_NULL),
),
migrations.AddField(
model_name='propertymodel',
@@ -506,7 +506,7 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='property',
name='propertymodel',
- field=models.ForeignKey(verbose_name='Property model', to='chimere.PropertyModel'),
+ field=models.ForeignKey(verbose_name='Property model', to='chimere.PropertyModel', on_delete=models.CASCADE),
),
migrations.AddField(
model_name='polygon',
@@ -516,37 +516,37 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='polygon',
name='ref_item',
- field=models.ForeignKey(verbose_name='Reference polygon', related_name='submited_polygon', blank=True, null=True, to='chimere.Polygon'),
+ field=models.ForeignKey(verbose_name='Reference polygon', related_name='submited_polygon', blank=True, null=True, to='chimere.Polygon', on_delete=models.SET_NULL),
),
migrations.AddField(
model_name='picturefile',
name='polygon',
- field=models.ForeignKey(related_name='pictures', blank=True, null=True, to='chimere.Polygon'),
+ field=models.ForeignKey(related_name='pictures', blank=True, null=True, to='chimere.Polygon', on_delete=models.SET_NULL),
),
migrations.AddField(
model_name='picturefile',
name='route',
- field=models.ForeignKey(related_name='pictures', blank=True, null=True, to='chimere.Route'),
+ field=models.ForeignKey(related_name='pictures', blank=True, null=True, to='chimere.Route', on_delete=models.SET_NULL),
),
migrations.AddField(
model_name='multimediafile',
name='multimedia_type',
- field=models.ForeignKey(blank=True, null=True, to='chimere.MultimediaType'),
+ field=models.ForeignKey(blank=True, null=True, to='chimere.MultimediaType', on_delete=models.SET_NULL),
),
migrations.AddField(
model_name='multimediafile',
name='polygon',
- field=models.ForeignKey(related_name='multimedia_files', blank=True, null=True, to='chimere.Polygon'),
+ field=models.ForeignKey(related_name='multimedia_files', blank=True, null=True, to='chimere.Polygon', on_delete=models.SET_NULL),
),
migrations.AddField(
model_name='multimediafile',
name='route',
- field=models.ForeignKey(related_name='multimedia_files', blank=True, null=True, to='chimere.Route'),
+ field=models.ForeignKey(related_name='multimedia_files', blank=True, null=True, to='chimere.Route', on_delete=models.SET_NULL),
),
migrations.AddField(
model_name='multimediaextension',
name='multimedia_type',
- field=models.ForeignKey(verbose_name='Associated multimedia type', related_name='extensions', to='chimere.MultimediaType'),
+ field=models.ForeignKey(verbose_name='Associated multimedia type', related_name='extensions', to='chimere.MultimediaType', on_delete=models.CASCADE),
),
migrations.AddField(
model_name='marker',
@@ -556,17 +556,17 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='marker',
name='ref_item',
- field=models.ForeignKey(verbose_name='Reference marker', related_name='submited_marker', blank=True, null=True, to='chimere.Marker'),
+ field=models.ForeignKey(verbose_name='Reference marker', related_name='submited_marker', blank=True, null=True, to='chimere.Marker', on_delete=models.SET_NULL),
),
migrations.AddField(
model_name='importerkeycategories',
name='category',
- field=models.ForeignKey(verbose_name='Category', to='chimere.SubCategory'),
+ field=models.ForeignKey(verbose_name='Category', to='chimere.SubCategory', on_delete=models.CASCADE),
),
migrations.AddField(
model_name='importerkeycategories',
name='importer',
- field=models.ForeignKey(verbose_name='Importer', related_name='key_categories', to='chimere.Importer'),
+ field=models.ForeignKey(verbose_name='Importer', related_name='key_categories', to='chimere.Importer', on_delete=models.CASCADE),
),
migrations.AddField(
model_name='importer',
@@ -576,12 +576,12 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='color',
name='color_theme',
- field=models.ForeignKey(verbose_name='Color theme', to='chimere.ColorTheme'),
+ field=models.ForeignKey(verbose_name='Color theme', to='chimere.ColorTheme', on_delete=models.CASCADE),
),
migrations.AddField(
model_name='arealayers',
name='layer',
- field=models.ForeignKey(to='chimere.Layer'),
+ field=models.ForeignKey(to='chimere.Layer', on_delete=models.CASCADE),
),
migrations.AddField(
model_name='area',
diff --git a/chimere/migrations/0002_property_route.py b/chimere/migrations/0002_property_route.py
index 520537a..335b033 100644
--- a/chimere/migrations/0002_property_route.py
+++ b/chimere/migrations/0002_property_route.py
@@ -14,6 +14,6 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='property',
name='route',
- field=models.ForeignKey(to='chimere.Route', verbose_name='Route', null=True, blank=True),
+ field=models.ForeignKey(to='chimere.Route', verbose_name='Route', null=True, blank=True, on_delete=models.SET_NULL),
),
]
diff --git a/chimere/migrations/0004_auto_20161117_1911.py b/chimere/migrations/0004_auto_20161117_1911.py
index 100b2d6..e527b94 100644
--- a/chimere/migrations/0004_auto_20161117_1911.py
+++ b/chimere/migrations/0004_auto_20161117_1911.py
@@ -17,7 +17,7 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(primary_key=True, verbose_name='ID', auto_created=True, serialize=False)),
('order', models.IntegerField(verbose_name='Order')),
- ('area', models.ForeignKey(to='chimere.Area')),
+ ('area', models.ForeignKey(to='chimere.Area', on_delete=models.CASCADE)),
],
options={
'verbose_name': 'Area - Overlay',
@@ -46,7 +46,7 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='areaoverlays',
name='overlay',
- field=models.ForeignKey(to='chimere.Overlay'),
+ field=models.ForeignKey(to='chimere.Overlay', on_delete=models.CASCADE),
),
migrations.AddField(
model_name='area',
diff --git a/chimere/models.py b/chimere/models.py
index 2f8f792..a58a628 100644
--- a/chimere/models.py
+++ b/chimere/models.py
@@ -42,10 +42,10 @@ from django.contrib.postgres.search import SearchVectorField, SearchVector, \
SearchQuery, TrigramSimilarity
from django.core.files import File
from django.core.exceptions import ObjectDoesNotExist
-from django.core.urlresolvers import reverse, NoReverseMatch
from django.db.models import Q, Count
from django.db.models.signals import post_save, pre_save
from django.template import defaultfilters
+from django.urls import reverse, NoReverseMatch
from django.utils.translation import ugettext_lazy as _
from chimere.widgets import HiddenPointChooserWidget, PointField, RouteField, \
@@ -207,7 +207,7 @@ class Color(models.Model):
blank=True, null=True)
order = models.IntegerField(_("Order"))
color_theme = models.ForeignKey(ColorTheme, verbose_name=_("Color theme"),
- related_name='colors')
+ related_name='colors', on_delete=models.CASCADE)
class Meta:
ordering = ["order"]
@@ -275,7 +275,7 @@ class Icon(models.Model):
class SubCategory(models.Model):
category = models.ForeignKey(Category, verbose_name=_("Category"),
- related_name='subcategories')
+ related_name='subcategories', on_delete=models.CASCADE)
name = models.CharField(_("Name"), max_length=150)
available = models.BooleanField(_("Available"), default=True)
submission = models.BooleanField(_("Available for submission"),
@@ -288,19 +288,19 @@ class SubCategory(models.Model):
order = models.IntegerField(_("Order"), default=1000)
dated = models.BooleanField(_("Is dated"), default=False)
description = models.TextField(blank=True, null=True)
- icon = models.ForeignKey(Icon, verbose_name=_("Icon"))
+ icon = models.ForeignKey(Icon, verbose_name=_("Icon"), on_delete=models.CASCADE)
hover_icon = models.ForeignKey(
Icon, verbose_name=_("Hover icon"), blank=True, null=True,
- related_name='subcat_hovered')
+ related_name='subcat_hovered', on_delete=models.SET_NULL)
menu_icon = models.ForeignKey(
Icon, verbose_name=_("Menu icon"), blank=True, null=True,
- related_name='subcat_menu')
+ related_name='subcat_menu', on_delete=models.SET_NULL)
menu_icon_off = models.ForeignKey(
Icon, verbose_name=_("Menu icon off"), blank=True, null=True,
- related_name='subcat_menu_off')
+ related_name='subcat_menu_off', on_delete=models.SET_NULL)
color_theme = models.ForeignKey(
ColorTheme, verbose_name=_("Color theme"), blank=True, null=True,
- related_name='subcategories', help_text=_("For route and polygon"))
+ related_name='subcategories', help_text=_("For route and polygon"), on_delete=models.SET_NULL)
as_layer = models.BooleanField(_("Displayed in the layer menu"),
default=False)
weight_formula = models.TextField(_("Weight formula"), default="",
@@ -424,8 +424,8 @@ class SubCategoryUserLimit(models.Model):
Moderation limit for user by category
"""
subcategory = models.ForeignKey(
- SubCategory, related_name='limited_for_user')
- user = models.ForeignKey(User, related_name='subcategory_limit_to')
+ SubCategory, related_name='limited_for_user', on_delete=models.CASCADE)
+ user = models.ForeignKey(User, related_name='subcategory_limit_to', on_delete=models.CASCADE)
def __str__(self):
return "{} / {}".format(self.user, self.subcategory)
@@ -545,8 +545,8 @@ class ImporterKeyCategories(models.Model):
Association between key and categories
"""
importer = models.ForeignKey(Importer, verbose_name=_("Importer"),
- related_name='key_categories')
- category = models.ForeignKey(SubCategory, verbose_name=_("Category"))
+ related_name='key_categories', on_delete=models.CASCADE)
+ category = models.ForeignKey(SubCategory, verbose_name=_("Category"), on_delete=models.CASCADE)
key = models.CharField(_("Import key"), max_length=200)
class Meta:
@@ -1193,14 +1193,14 @@ class Marker(GeographicItem):
"""
ref_item = models.ForeignKey(
"Marker", blank=True, null=True, verbose_name=_("Reference marker"),
- related_name='submited_marker')
+ related_name='submited_marker', on_delete=models.SET_NULL)
point = PointField(_("Localisation"),
srid=settings.CHIMERE_EPSG_DISPLAY_PROJECTION)
available_date = models.DateTimeField(_("Available Date"), blank=True,
null=True) # used by feeds
is_front_page = models.NullBooleanField(_("Is front page"), blank=True,
null=True)
- objects = models.GeoManager()
+ objects = models.Manager()
geom_attr = 'point'
class Meta:
@@ -1387,7 +1387,7 @@ class Polygon(GeographicItem):
"""
ref_item = models.ForeignKey(
"Polygon", blank=True, null=True, verbose_name=_("Reference polygon"),
- related_name='submited_polygon')
+ related_name='submited_polygon', on_delete=models.SET_NULL)
polygon = PolygonField(
_("Polygon"), srid=settings.CHIMERE_EPSG_DISPLAY_PROJECTION)
picture = models.ImageField(
@@ -1401,7 +1401,7 @@ class Polygon(GeographicItem):
inner_color = models.CharField(
_("Inner color"), max_length=200,
help_text=_("HTML code/name"), blank=True, null=True)
- objects = models.GeoManager()
+ objects = models.Manager()
geom_attr = 'polygon'
json_color_keys = ['color', 'inner_color']
default_values = {'color': "#000",
@@ -1472,7 +1472,7 @@ class AggregatedPolygon(models.Model):
Database view for aggregated polygons
"""
polygon = models.MultiPolygonField()
- subcategory = models.ForeignKey(SubCategory)
+ subcategory = models.ForeignKey(SubCategory, on_delete=models.CASCADE)
status = models.CharField(_("Status"), max_length=1, choices=STATUS)
class Meta:
@@ -1568,7 +1568,7 @@ class MultimediaExtension(models.Model):
name = models.CharField(_("Extension name"), max_length=6)
multimedia_type = models.ForeignKey(
MultimediaType, verbose_name=_("Associated multimedia type"),
- related_name='extensions')
+ related_name='extensions', on_delete=models.CASCADE)
class Meta:
verbose_name = _("Multimedia extension")
@@ -1582,16 +1582,16 @@ class MultimediaFile(models.Model):
name = models.CharField(_("Name"), max_length=150)
url = models.URLField(_("Url"), max_length=200)
order = models.IntegerField(_("Order"), default=1)
- multimedia_type = models.ForeignKey(MultimediaType, blank=True, null=True)
+ multimedia_type = models.ForeignKey(MultimediaType, blank=True, null=True, on_delete=models.SET_NULL)
miniature = models.BooleanField(
_("Display inside the description?"),
default=settings.CHIMERE_MINIATURE_BY_DEFAULT)
marker = models.ForeignKey(Marker, related_name='multimedia_files',
- blank=True, null=True)
+ blank=True, null=True, on_delete=models.SET_NULL)
route = models.ForeignKey('Route', related_name='multimedia_files',
- blank=True, null=True)
+ blank=True, null=True, on_delete=models.SET_NULL)
polygon = models.ForeignKey(Polygon, related_name='multimedia_files',
- blank=True, null=True)
+ blank=True, null=True, on_delete=models.SET_NULL)
class Meta:
verbose_name = _("Multimedia file")
@@ -1666,11 +1666,11 @@ class PictureFile(models.Model):
blank=True, null=True)
order = models.IntegerField(_("Order"), default=1)
marker = models.ForeignKey(Marker, related_name='pictures', blank=True,
- null=True)
+ null=True, on_delete=models.SET_NULL)
route = models.ForeignKey('Route', related_name='pictures',
- blank=True, null=True)
+ blank=True, null=True, on_delete=models.SET_NULL)
polygon = models.ForeignKey(Polygon, related_name='pictures', blank=True,
- null=True)
+ null=True, on_delete=models.SET_NULL)
def __str__(self):
return self.name or ""
@@ -1835,11 +1835,11 @@ class Route(GeographicItem):
"""
ref_item = models.ForeignKey(
"Route", blank=True, null=True, verbose_name=_("Reference route"),
- related_name='submited_route')
+ related_name='submited_route', on_delete=models.SET_NULL)
route = RouteField(_("Route"),
srid=settings.CHIMERE_EPSG_DISPLAY_PROJECTION)
associated_file = models.ForeignKey(RouteFile, blank=True, null=True,
- verbose_name=_("Associated file"))
+ verbose_name=_("Associated file"), on_delete=models.SET_NULL)
picture = models.ImageField(
_("Image"), upload_to='upload', blank=True, null=True,
height_field='height', width_field='width')
@@ -1848,7 +1848,7 @@ class Route(GeographicItem):
color = models.CharField(
_("Color"), max_length=200, help_text=_("HTML code/name"),
blank=True, null=True)
- objects = models.GeoManager()
+ objects = models.Manager()
geom_attr = 'route'
json_color_keys = ['color']
default_values = {'color': '#000'}
@@ -1943,7 +1943,7 @@ class AggregatedRoute(models.Model):
Database view for aggregated routes
"""
route = models.MultiLineStringField()
- subcategory = models.ForeignKey(SubCategory)
+ subcategory = models.ForeignKey(SubCategory, on_delete=models.CASCADE)
status = models.CharField(_("Status"), max_length=1, choices=STATUS)
class Meta:
@@ -2180,7 +2180,7 @@ class Area(models.Model, SimpleArea):
_("Extra map definition"), blank=True, null=True,
help_text=_("Extra javascript script loaded for this area. "
"Carreful! To prevent breaking the map must be valid."))
- objects = models.GeoManager()
+ objects = models.Manager()
def __str__(self):
return self.name
@@ -2332,8 +2332,8 @@ def get_users_by_area(area):
class AreaLayers(models.Model):
- area = models.ForeignKey(Area)
- layer = models.ForeignKey(Layer)
+ area = models.ForeignKey(Area, on_delete=models.CASCADE)
+ layer = models.ForeignKey(Layer, on_delete=models.CASCADE)
order = models.IntegerField(_("Order"))
default = models.NullBooleanField(_("Default layer"))
@@ -2344,8 +2344,8 @@ class AreaLayers(models.Model):
class AreaOverlays(models.Model):
- area = models.ForeignKey(Area)
- overlay = models.ForeignKey(Overlay)
+ area = models.ForeignKey(Area, on_delete=models.CASCADE)
+ overlay = models.ForeignKey(Overlay, on_delete=models.CASCADE)
order = models.IntegerField(_("Order"))
class Meta:
@@ -2355,8 +2355,8 @@ class AreaOverlays(models.Model):
class AreaPages(models.Model):
- area = models.ForeignKey(Area)
- page = models.ForeignKey(Page)
+ area = models.ForeignKey(Area, on_delete=models.CASCADE)
+ page = models.ForeignKey(Page, on_delete=models.CASCADE)
order = models.IntegerField(_("Order"))
class Meta:
@@ -2443,7 +2443,7 @@ class PropertyModelChoice(models.Model):
Choices for property model
"""
propertymodel = models.ForeignKey(PropertyModel, related_name='choices',
- verbose_name=_("Property model"))
+ verbose_name=_("Property model"), on_delete=models.CASCADE)
value = models.CharField(_("Value"), max_length=150)
available = models.BooleanField(_("Available"), default=True)
@@ -2460,18 +2460,18 @@ class Property(models.Model):
"""
marker = models.ForeignKey(
Marker, verbose_name=_("Point of interest"), blank=True, null=True,
- related_name='properties'
+ related_name='properties', on_delete=models.SET_NULL
)
route = models.ForeignKey(
Route, verbose_name=_("Route"), blank=True, null=True,
- related_name='properties'
+ related_name='properties', on_delete=models.SET_NULL
)
polygon = models.ForeignKey(
Polygon, verbose_name=_("Polygon"), blank=True, null=True,
- related_name='properties'
+ related_name='properties', on_delete=models.SET_NULL
)
propertymodel = models.ForeignKey(PropertyModel,
- verbose_name=_("Property model"))
+ verbose_name=_("Property model"), on_delete=models.CASCADE)
value = models.TextField(_("Value"))
search_value = models.TextField(_("Search value"), blank=True, null=True,
help_text=_("Auto filled at save"))
diff --git a/chimere/route.py b/chimere/route.py
index f18fb37..569e9c2 100644
--- a/chimere/route.py
+++ b/chimere/route.py
@@ -30,7 +30,7 @@ import json
from bs4 import BeautifulSoup
from subprocess import Popen, PIPE
from django.contrib.gis.gdal import DataSource
-from django.contrib.gis.gdal.error import OGRException
+from django.contrib.gis.gdal.error import GDALException
from django.conf import settings
@@ -83,7 +83,7 @@ class RoutinoRouter(Router):
p.communicate()
try:
ds = DataSource(tmp_dir + 'shortest-track.gpx')
- except OGRException:
+ except GDALException:
return [], None, None
if not ds:
return [], None, None
diff --git a/chimere/templatetags/chimere_tags.py b/chimere/templatetags/chimere_tags.py
index 724ea2e..2feec1e 100644
--- a/chimere/templatetags/chimere_tags.py
+++ b/chimere/templatetags/chimere_tags.py
@@ -8,7 +8,7 @@ from logging import getLogger
from django import template
from django.conf import settings
from django.core.exceptions import ObjectDoesNotExist
-from django.core.urlresolvers import reverse
+from django.urls import reverse
from django.db.models import Q
from django.template import defaultfilters
from django.utils.translation import ugettext as _
diff --git a/chimere/tests.py b/chimere/tests.py
index 8339e41..71192e5 100644
--- a/chimere/tests.py
+++ b/chimere/tests.py
@@ -19,9 +19,9 @@ from django.conf import settings
from django.core import mail
from django.core.files import File
from django.core.management import call_command
-from django.core.urlresolvers import reverse
from django.template import Context
from django.test import TestCase
+from django.urls import reverse
from chimere.models import Area, Icon, Importer, Category, SubCategory, \
Marker, Route, News, SubCategoryUserLimit, Polygon, PropertyModel
diff --git a/chimere/urls.py b/chimere/urls.py
index a7d43e2..f32a04d 100644
--- a/chimere/urls.py
+++ b/chimere/urls.py
@@ -51,7 +51,7 @@ urlpatterns += staticfiles_urlpatterns()
urlpatterns += [
url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
- url(r'^admin/', include(admin.site.urls)),
+ url(r'^admin/', include(admin.site.urls[:2])),
url(r'^(?P<area_name>[a-zA-Z0-9_-]+/)?dyn.css$',
views.DynCSS.as_view(), name="dyn-css"),
url(r'^(?P<area_name>[a-zA-Z0-9_-]+/)?edit-marker/'
@@ -76,7 +76,7 @@ urlpatterns += [
views.editPolygon, name="editpolygon-item"),
url(r'^form-result/(?P<success>[a-zA-Z0-9_-]+)?',
views.form_result, name='form-result'),
- url(r'^', include('chimere.urls_chimere', namespace="chimere")),
+ url(r'^', include(('chimere.urls_chimere', "chimere"), "chimere")),
url(r'^(?P<area_name>[a-zA-Z0-9_-]+)?', views.index,
name="index"),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
diff --git a/chimere/views.py b/chimere/views.py
index 1b17189..b9f03f5 100644
--- a/chimere/views.py
+++ b/chimere/views.py
@@ -28,15 +28,15 @@ import re
from django.conf import settings
from django.contrib.gis.geos import GEOSGeometry, Polygon as GEOSPolygon
-from django.contrib.gis.gdal.error import OGRException
+from django.contrib.gis.gdal.error import GDALException
from django.contrib.gis.measure import D
from django.contrib.sites.shortcuts import get_current_site
from django.core.exceptions import ObjectDoesNotExist
-from django.core.urlresolvers import reverse
from django.db.models import Q
from django.http import HttpResponseRedirect, HttpResponse, Http404
from django.shortcuts import get_object_or_404, redirect, render
from django.template import defaultfilters
+from django.urls import reverse
from django.utils.http import urlquote
from django.utils.translation import ugettext as _
from django.views.generic import TemplateView, ListView, FormView
@@ -1204,7 +1204,7 @@ def route(request, area_name, lon1, lat1, lonlat_steps, lon2, lat2,
try:
route = GEOSGeometry(jsonencoder.encode(
jsondecoder.decode(jsons[0])['geometry']))
- except OGRException:
+ except GDALException:
return HttpResponse(_("Bad geometry"), status=500)
cats = models.SubCategory.objects.filter(routing_warn=True)
message = ''
diff --git a/chimere/widgets.py b/chimere/widgets.py
index 346e3cf..3ff42d4 100644
--- a/chimere/widgets.py
+++ b/chimere/widgets.py
@@ -28,13 +28,13 @@ from django.conf import settings
from django.contrib.gis import forms as gis_forms
from django.contrib.gis.db import models
from django.core.exceptions import ObjectDoesNotExist
-from django.core.urlresolvers import reverse
from django.forms.widgets import RadioSelect #, RadioFieldRenderer
from django.utils.html import conditional_escape, escape
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext as _
from django.forms.utils import flatatt
from django.template.loader import render_to_string
+from django.urls import reverse
if "tinymce" in settings.INSTALLED_APPS:
from tinymce.widgets import TinyMCE as Textarea
@@ -164,7 +164,7 @@ class ButtonRadioInput(RadioSelect):
' selected="selected"' if selected else '')
def render(self, name=None, value=None, attrs=None, choices=(),
- index=0):
+ index=0, renderer=None):
attrs = attrs or self.attrs
idx = ''
if 'id' in self.attrs:
@@ -290,7 +290,7 @@ class JQueryAutoComplete(forms.TextInput):
kwargs={'property_slug': self.slug})
return "'{}'".format(source)
- def render(self, name, value=None, attrs=None):
+ def render(self, name, value=None, attrs=None, renderer=None):
attrs_hidden = self.build_attrs(attrs, name=name)
attrs_select = self.build_attrs(attrs)
selected_value, rendered_value = "", ""
@@ -333,7 +333,7 @@ class NominatimWidget(forms.TextInput):
class Media:
js = ["%schimere/js/nominatim-widget.js" % settings.STATIC_URL]
- def render(self, name, value, attrs=None, area_name=''):
+ def render(self, name, value, attrs=None, area_name='', renderer=None):
dct = {'id': name, 'nominatim_url': settings.NOMINATIM_URL,
'label': _("Street, City, Country")}
@@ -456,7 +456,7 @@ class RouteChooserWidget(forms.TextInput):
js = BASE_JS
def render(self, name, value, attrs=None, area_name='', routefile_id=None,
- initialized=True):
+ initialized=True, renderer=None):
# bad initialization
if value == 'None':
value = ''
@@ -539,7 +539,7 @@ class AreaWidget(forms.TextInput):
pass
return upper_left_lat, upper_left_lon, lower_right_lat, lower_right_lon
- def render(self, name, value, attrs=None, initialized=True):
+ def render(self, name, value, attrs=None, initialized=True, renderer=None):
"""
Render a map
"""
@@ -602,7 +602,7 @@ class PolygonChooserWidget(forms.TextInput):
css = BASE_CSS
js = BASE_JS
- def render(self, name, value, attrs=None, area_name='', initialized=True):
+ def render(self, name, value, attrs=None, area_name='', initialized=True, renderer=None):
val = ''
if value:
val = str(value)
@@ -654,7 +654,7 @@ class ImportFiltrWidget(AreaWidget):
css = BASE_CSS
js = AREA_JS
- def render(self, name, value, attrs=None):
+ def render(self, name, value, attrs=None, renderer=None):
"""
Render a map
"""
@@ -739,8 +739,8 @@ class MultiSelectWidget(forms.SelectMultiple):
]
js = ['%sjquery/jquery.min.js' % settings.STATIC_URL] + EXTRA_JS
- def render(self, name, value, attrs=None):
- rendered = super(MultiSelectWidget, self).render(name, value, attrs)
+ def render(self, name, value, attrs=None, renderer=None):
+ rendered = super(MultiSelectWidget, self).render(name, value, attrs, renderer=renderer)
rendered += """<hr class='spacer'/><script type='text/javascript'>
var render_id_%(name)s = function(){
$("#id_%(name)s").chosen({placeholder_text_multiple: "%(title)s"});
diff --git a/packages.debian b/packages.debian
new file mode 100644
index 0000000..75befbd
--- /dev/null
+++ b/packages.debian
@@ -0,0 +1,4 @@
+# bookworm - python3-py3exiv2
+python3-django python3-overpy python3-bs4 python3-pil python3-lxml \
+python3-feedparser python3-icalendar python3-chardet \
+python3-gdal python3-tidylib python3-osmapi \ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index 97103b6..d0f9580 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,14 +1,28 @@
-django>=1.11,<1.11.99
-beautifulsoup4==4.5.3
-psycopg2
-Pillow==3.3
-lxml==3.4
+# -> bookworm
+# 3.2.19
+django==2.2.28
+# 4.11.2
+beautifulsoup4==4.9.3
+# 9.4.0
+pillow==8.1.2
+# 4.9.2
+lxml==4.6.3
+# 6.0.10
feedparser==5.2.1
-django-tinymce4-lite==1.7.1
-icalendar==3.8
-chardet==2.3
-py3exiv2>=0.2.1,<=0.4.0
-gdal>=2.1.0,<2.1.99
-osmapi==0.6.2
-PyTidyLib==0.3.1
+# 4.0.3
+icalendar==4.0.3
+# 5.1.0
+chardet==4.0.0
+# 3.6.2
+gdal>=3.2.2,<3.2.99
+# 3.1.0
+osmapi==1.3.0
+# 0.3.2
+PyTidyLib==0.3.2
+# 0.6
overpy==0.4
+
+# 0.7.2
+#py3exiv2>=0.2.1,<=0.4.0
+py3exiv2==0.7.2
+django-tinymce4-lite==1.7.1
diff --git a/settings.py b/settings.py
index bf7b6b0..027edf2 100644
--- a/settings.py
+++ b/settings.py
@@ -213,12 +213,13 @@ MEDIA_ROOT = ROOT_PATH + 'media/'
# Example: "http://media.lawrence.com"
MEDIA_URL = '/media/'
-MIDDLEWARE_CLASSES = [
- 'django.middleware.common.CommonMiddleware',
- 'django.contrib.sessions.middleware.SessionMiddleware',
- 'django.contrib.auth.middleware.AuthenticationMiddleware',
- 'django.contrib.messages.middleware.MessageMiddleware',
- 'django.middleware.csrf.CsrfViewMiddleware'
+MIDDLEWARE = [
+ "django.middleware.common.CommonMiddleware",
+ "django.contrib.sessions.middleware.SessionMiddleware",
+ "django.middleware.csrf.CsrfViewMiddleware",
+ "django.contrib.auth.middleware.AuthenticationMiddleware",
+ "django.contrib.messages.middleware.MessageMiddleware",
+ "django.middleware.locale.LocaleMiddleware",
]
TEMPLATES = [
@@ -246,11 +247,12 @@ INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.admin',
'django.contrib.contenttypes',
+ 'django.contrib.postgres',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.gis',
'django.contrib.staticfiles',
- 'django.contrib.postgres',
+ "django.contrib.messages",
]
# celery
@@ -366,7 +368,7 @@ if 'OSM_MOBILE_JS_URLS' not in globals():
if DEBUG_TOOLBAR:
global DEBUG_TOOLBAR_PANELS
global DEBUG_TOOLBAR_CONFIG
- MIDDLEWARE_CLASSES += ['debug_toolbar.middleware.DebugToolbarMiddleware']
+ MIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware']
INSTALLED_APPS += ['debug_toolbar']
DEBUG_TOOLBAR_PANELS = [
'debug_toolbar.panels.versions.VersionsPanel',