diff options
-rw-r--r-- | chimere/actions.py | 2 | ||||
-rw-r--r-- | chimere/feeds.py | 2 | ||||
-rw-r--r-- | chimere/forms.py | 2 | ||||
-rw-r--r-- | chimere/migrations/0001_initial.py | 54 | ||||
-rw-r--r-- | chimere/migrations/0002_property_route.py | 2 | ||||
-rw-r--r-- | chimere/migrations/0004_auto_20161117_1911.py | 4 | ||||
-rw-r--r-- | chimere/models.py | 82 | ||||
-rw-r--r-- | chimere/route.py | 4 | ||||
-rw-r--r-- | chimere/templatetags/chimere_tags.py | 2 | ||||
-rw-r--r-- | chimere/tests.py | 2 | ||||
-rw-r--r-- | chimere/urls.py | 4 | ||||
-rw-r--r-- | chimere/views.py | 6 | ||||
-rw-r--r-- | chimere/widgets.py | 20 | ||||
-rw-r--r-- | packages.debian | 4 | ||||
-rw-r--r-- | requirements.txt | 38 | ||||
-rw-r--r-- | settings.py | 18 |
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', |