From 77b6580fe769e06877cb484dfb311548b58f4ba5 Mon Sep 17 00:00:00 2001 From: afabiani Date: Tue, 14 Jan 2020 15:22:48 +0100 Subject: [PATCH] - Bump to Python 3 --- .gitignore | 4 + .travis.yml | 27 ++--- geonode/api/api.py | 6 +- geonode/api/resourcebase_api.py | 2 +- geonode/api/tests.py | 2 +- .../migrations/0031_auto_20200114_1651.py | 20 ++++ .../migrations/0032_auto_20200115_1121.py | 34 ++++++ .../migrations/0033_auto_20200115_1145.py | 17 +++ geonode/base/migrations/24_initial.py | 27 +++-- geonode/base/migrations/24_to_26.py | 8 +- geonode/base/migrations/26_to_27.py | 2 +- geonode/base/models.py | 89 ++++++++++----- geonode/base/populate_test_data.py | 2 +- geonode/base/templatetags/base_tags.py | 10 +- geonode/base/tests.py | 4 - geonode/catalogue/metadataxsl/models.py | 2 +- geonode/catalogue/tests.py | 2 +- geonode/catalogue/views.py | 4 +- geonode/decorators.py | 2 +- geonode/documents/forms.py | 6 +- geonode/documents/migrations/24_initial.py | 5 +- .../25_add_documentresourcelink_table.py | 4 +- geonode/documents/models.py | 11 +- geonode/documents/tests.py | 18 +-- geonode/documents/views.py | 4 +- geonode/favorite/models.py | 7 +- geonode/favorite/tests.py | 2 +- geonode/favorite/utils.py | 2 +- geonode/favorite/views.py | 2 +- geonode/geoserver/context_processors.py | 2 +- geonode/geoserver/createlayer/tests.py | 2 +- geonode/geoserver/helpers.py | 11 +- geonode/geoserver/ows.py | 2 +- geonode/geoserver/tests/integration.py | 2 +- geonode/geoserver/tests/test_server.py | 4 +- geonode/geoserver/upload.py | 2 +- geonode/geoserver/views.py | 10 +- .../migrations/0028_auto_20200114_1651.py | 20 ++++ .../migrations/0029_auto_20200115_1121.py | 18 +++ geonode/groups/migrations/24_initial.py | 14 ++- geonode/groups/models.py | 32 +++--- geonode/groups/tests.py | 4 +- geonode/groups/views.py | 4 +- geonode/invitations/views.py | 2 +- geonode/layers/forms.py | 12 +- .../layers/migrations/0029_layer_service.py | 2 +- geonode/layers/migrations/24_initial.py | 14 ++- geonode/layers/models.py | 43 ++++--- geonode/layers/tests.py | 104 +++++++++-------- geonode/layers/utils.py | 6 +- geonode/layers/views.py | 4 +- geonode/maps/migrations/24_initial.py | 9 +- geonode/maps/models.py | 18 ++- geonode/maps/qgis_server_views.py | 4 +- geonode/maps/tests.py | 2 +- geonode/maps/views.py | 10 +- geonode/monitoring/middleware.py | 8 +- .../migrations/0001_monitoring_init.py | 22 ++-- .../migrations/0004_monitoring_metric_type.py | 9 +- .../migrations/0005_monitoring_ows_service.py | 7 +- .../0008_monitoring_notifications_check.py | 14 +-- .../monitoring/migrations/0010_metric_unit.py | 3 +- .../migrations/0011_notification_def.py | 8 +- .../migrations/0012_notifications_service.py | 3 +- .../migrations/0014_notifications_emails.py | 5 +- .../0015_notification_grace_period.py | 3 +- .../0019_notification_check_def_link.py | 3 +- .../migrations/0029_auto_20200115_1121.py | 18 +++ geonode/monitoring/models.py | 106 ++++++++++++------ geonode/monitoring/tests/integration.py | 82 +++++++------- geonode/monitoring/views.py | 10 +- geonode/people/adapters.py | 2 +- .../migrations/0027_auto_20200114_1651.py | 31 +++++ .../migrations/0028_auto_20200115_1121.py | 18 +++ geonode/people/models.py | 8 +- geonode/people/signals.py | 2 +- .../templatetags/socialaccount_extra.py | 8 +- geonode/people/tests.py | 2 +- geonode/people/views.py | 2 +- geonode/proxy/templatetags/proxy_lib_tags.py | 2 +- geonode/proxy/tests.py | 2 +- geonode/qgis_server/context_processors.py | 2 +- geonode/qgis_server/helpers.py | 2 +- geonode/qgis_server/middleware.py | 9 ++ .../qgis_server/migrations/0001_initial.py | 2 +- .../migrations/0002_qgisservermap.py | 2 +- .../migrations/0003_auto_20170727_0509.py | 3 +- .../migrations/0004_auto_20170805_0223.py | 3 +- .../migrations/0005_auto_20170823_0341.py | 3 +- geonode/qgis_server/models.py | 6 +- geonode/qgis_server/signals.py | 2 +- geonode/qgis_server/tests/test_helpers.py | 2 +- geonode/qgis_server/tests/test_views.py | 2 +- geonode/qgis_server/views.py | 2 +- geonode/security/middleware.py | 23 +++- geonode/security/models.py | 44 ++++---- geonode/security/tests.py | 6 +- geonode/security/utils.py | 14 +-- .../services/migrations/0025_harvestjob.py | 2 +- .../migrations/0026_auto_20171130_0600.py | 2 +- .../migrations/0030_auto_20200115_1121.py | 17 +++ geonode/services/migrations/24_initial.py | 16 +-- geonode/services/models.py | 14 ++- geonode/services/serviceprocessors/base.py | 2 +- geonode/services/serviceprocessors/wms.py | 2 +- geonode/services/tests.py | 2 +- geonode/services/views.py | 2 +- geonode/settings.py | 34 +++--- geonode/tests/integration.py | 2 +- geonode/tests/smoke.py | 2 +- geonode/tests/utils.py | 5 +- .../migrations/0010_auto_20200115_1121.py | 18 +++ geonode/themes/models.py | 10 +- geonode/upload/migrations/24_initial.py | 6 +- geonode/upload/models.py | 21 ++-- geonode/upload/tests/test_settings.py | 12 +- geonode/upload/upload.py | 5 +- geonode/upload/utils.py | 2 +- geonode/upload/views.py | 4 +- geonode/urls.py | 14 +-- geonode/utils.py | 6 +- geonode/views.py | 8 +- pavement.py | 12 +- requirements.txt | 39 ++++--- setup.py | 4 +- 125 files changed, 910 insertions(+), 540 deletions(-) create mode 100644 geonode/base/migrations/0031_auto_20200114_1651.py create mode 100644 geonode/base/migrations/0032_auto_20200115_1121.py create mode 100644 geonode/base/migrations/0033_auto_20200115_1145.py create mode 100644 geonode/groups/migrations/0028_auto_20200114_1651.py create mode 100644 geonode/groups/migrations/0029_auto_20200115_1121.py create mode 100644 geonode/monitoring/migrations/0029_auto_20200115_1121.py create mode 100644 geonode/people/migrations/0027_auto_20200114_1651.py create mode 100644 geonode/people/migrations/0028_auto_20200115_1121.py create mode 100644 geonode/services/migrations/0030_auto_20200115_1121.py create mode 100644 geonode/themes/migrations/0010_auto_20200115_1121.py diff --git a/.gitignore b/.gitignore index ace730351b9..02ba7bc2887 100644 --- a/.gitignore +++ b/.gitignore @@ -92,3 +92,7 @@ scripts/spcgeonode/_volume_* /geonode/test_settings.py /geonode/static/yarn.lock + +/geonode/development.db-journal + +/output.bin diff --git a/.travis.yml b/.travis.yml index cedf51c1582..97524ab245b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ sudo: required language: python -dist: xenial +dist: bionic cache: pip: true @@ -28,7 +28,7 @@ matrix: fast_finish: true include: - name: "GeoServer-backend Core Modules Smoke Tests" - python: 2.7 + python: 3.6 virtualenv: system_site_packages: true env: @@ -42,7 +42,7 @@ matrix: MONITORING_ENABLED: 'False' SESSION_EXPIRED_CONTROL_ENABLED: 'True' - name: "GeoServer-backend Contrib Apps Smoke Tests" - python: 2.7 + python: 3.6 virtualenv: system_site_packages: true env: @@ -56,7 +56,7 @@ matrix: MONITORING_ENABLED: 'False' SESSION_EXPIRED_CONTROL_ENABLED: 'True' - name: "GeoServer-backend Integration Tests" - python: 2.7 + python: 3.6 virtualenv: system_site_packages: true env: @@ -78,7 +78,7 @@ matrix: SESSION_EXPIRED_CONTROL_ENABLED: 'True' CELERY_ALWAYS_EAGER: 'True' - name: "GeoServer-backend Integration GeoServer Tests" - python: 2.7 + python: 3.6 virtualenv: system_site_packages: true env: @@ -100,7 +100,7 @@ matrix: SESSION_EXPIRED_CONTROL_ENABLED: 'True' CELERY_ALWAYS_EAGER: 'True' - name: "GeoServer-backend Integration Upload Tests" - python: 2.7 + python: 3.6 virtualenv: system_site_packages: true env: @@ -122,7 +122,7 @@ matrix: SESSION_EXPIRED_CONTROL_ENABLED: 'True' CELERY_ALWAYS_EAGER: 'True' - name: "GeoServer-backend Integration Monitoring Tests" - python: 2.7 + python: 3.6 virtualenv: system_site_packages: true env: @@ -144,7 +144,7 @@ matrix: SESSION_EXPIRED_CONTROL_ENABLED: 'True' CELERY_ALWAYS_EAGER: 'True' - name: "GeoServer-backend Integration CSW Tests" - python: 2.7 + python: 3.6 virtualenv: system_site_packages: true env: @@ -159,7 +159,7 @@ matrix: SESSION_EXPIRED_CONTROL_ENABLED: 'True' CELERY_ALWAYS_EAGER: 'True' - name: "GeoServer-backend Integration BDD Tests" - python: 2.7 + python: 3.6 virtualenv: system_site_packages: true env: @@ -176,7 +176,7 @@ matrix: SESSION_EXPIRED_CONTROL_ENABLED: 'True' CELERY_ALWAYS_EAGER: 'True' - name: "QGis Server-backend Core Modules Smoke Tests" - python: 2.7 + python: 3.6 virtualenv: system_site_packages: true env: @@ -195,7 +195,7 @@ matrix: SESSION_EXPIRED_CONTROL_ENABLED: 'True' CELERY_ALWAYS_EAGER: 'True' - name: "QGis Server-backend Contrib Apps Smoke Tests" - python: 2.7 + python: 3.6 virtualenv: system_site_packages: true env: @@ -214,7 +214,7 @@ matrix: SESSION_EXPIRED_CONTROL_ENABLED: 'True' CELERY_ALWAYS_EAGER: 'True' - name: "QGis Server-backend Integration Tests" - python: 2.7 + python: 3.6 virtualenv: system_site_packages: true env: @@ -245,9 +245,6 @@ matrix: branches: only: - master - - 2.10.2 - - 2.10.1 - - 2.10.x before_install: - if [ "$TEST_RUN_SELENIUM" = "True" ]; then diff --git a/geonode/api/api.py b/geonode/api/api.py index 1327e24714a..9aadb524c18 100644 --- a/geonode/api/api.py +++ b/geonode/api/api.py @@ -25,7 +25,7 @@ from django.conf.urls import url from django.contrib.auth import get_user_model from django.contrib.auth.models import Group -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.contenttypes.models import ContentType from django.conf import settings from django.db.models import Count @@ -374,7 +374,7 @@ def apply_filters(self, request, applicable_filters): applicable_filters) filtered = semi_filtered - if not user.is_authenticated() or user.is_anonymous: + if not user.is_authenticated or user.is_anonymous: filtered = semi_filtered.exclude(groupprofile__access='private') elif not user.is_superuser: groups_member_of = user.group_list_all() @@ -453,7 +453,7 @@ def apply_filters(self, request, applicable_filters): def dehydrate_email(self, bundle): email = '' - if bundle.request.user.is_authenticated(): + if bundle.request.user.is_authenticated: email = bundle.obj.email return email diff --git a/geonode/api/resourcebase_api.py b/geonode/api/resourcebase_api.py index da4c5a6e9e6..cd7c1818bde 100644 --- a/geonode/api/resourcebase_api.py +++ b/geonode/api/resourcebase_api.py @@ -20,7 +20,7 @@ import json import re -from django.core.urlresolvers import resolve +from django.urls import resolve from django.db.models import Q from django.http import HttpResponse from django.conf import settings diff --git a/geonode/api/tests.py b/geonode/api/tests.py index 4f2a9eac868..90198afdc91 100644 --- a/geonode/api/tests.py +++ b/geonode/api/tests.py @@ -20,7 +20,7 @@ from django.conf import settings from datetime import datetime, timedelta from django.contrib.auth import get_user_model -from django.core.urlresolvers import reverse +from django.urls import reverse from tastypie.test import ResourceTestCaseMixin from django.contrib.auth.models import Group from geonode.decorators import on_ogc_backend diff --git a/geonode/base/migrations/0031_auto_20200114_1651.py b/geonode/base/migrations/0031_auto_20200114_1651.py new file mode 100644 index 00000000000..4e39c5e580e --- /dev/null +++ b/geonode/base/migrations/0031_auto_20200114_1651.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.27 on 2020-01-14 16:51 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0030_resourcebase_created'), + ] + + operations = [ + migrations.AlterField( + model_name='resourcebase', + name='language', + field=models.CharField(choices=[('abk', 'Abkhazian'), ('aar', 'Afar'), ('afr', 'Afrikaans'), ('amh', 'Amharic'), ('ara', 'Arabic'), ('asm', 'Assamese'), ('aym', 'Aymara'), ('aze', 'Azerbaijani'), ('bak', 'Bashkir'), ('ben', 'Bengali'), ('bih', 'Bihari'), ('bis', 'Bislama'), ('bre', 'Breton'), ('bul', 'Bulgarian'), ('bel', 'Byelorussian'), ('cat', 'Catalan'), ('chi', 'Chinese'), ('cos', 'Corsican'), ('dan', 'Danish'), ('dzo', 'Dzongkha'), ('eng', 'English'), ('fra', 'French'), ('epo', 'Esperanto'), ('est', 'Estonian'), ('fao', 'Faroese'), ('fij', 'Fijian'), ('fin', 'Finnish'), ('fry', 'Frisian'), ('glg', 'Gallegan'), ('ger', 'German'), ('gre', 'Greek'), ('kal', 'Greenlandic'), ('grn', 'Guarani'), ('guj', 'Gujarati'), ('hau', 'Hausa'), ('heb', 'Hebrew'), ('hin', 'Hindi'), ('hun', 'Hungarian'), ('ind', 'Indonesian'), ('ina', 'Interlingua (International Auxiliary language Association)'), ('iku', 'Inuktitut'), ('ipk', 'Inupiak'), ('ita', 'Italian'), ('jpn', 'Japanese'), ('kan', 'Kannada'), ('kas', 'Kashmiri'), ('kaz', 'Kazakh'), ('khm', 'Khmer'), ('kin', 'Kinyarwanda'), ('kir', 'Kirghiz'), ('kor', 'Korean'), ('kur', 'Kurdish'), ('oci', "Langue d 'Oc (post 1500)"), ('lao', 'Lao'), ('lat', 'Latin'), ('lav', 'Latvian'), ('lin', 'Lingala'), ('lit', 'Lithuanian'), ('mlg', 'Malagasy'), ('mlt', 'Maltese'), ('mar', 'Marathi'), ('mol', 'Moldavian'), ('mon', 'Mongolian'), ('nau', 'Nauru'), ('nep', 'Nepali'), ('nor', 'Norwegian'), ('ori', 'Oriya'), ('orm', 'Oromo'), ('pan', 'Panjabi'), ('pol', 'Polish'), ('por', 'Portuguese'), ('pus', 'Pushto'), ('que', 'Quechua'), ('roh', 'Rhaeto-Romance'), ('run', 'Rundi'), ('rus', 'Russian'), ('smo', 'Samoan'), ('sag', 'Sango'), ('san', 'Sanskrit'), ('scr', 'Serbo-Croatian'), ('sna', 'Shona'), ('snd', 'Sindhi'), ('sin', 'Singhalese'), ('ssw', 'Siswant'), ('slv', 'Slovenian'), ('som', 'Somali'), ('sot', 'Sotho'), ('spa', 'Spanish'), ('sun', 'Sudanese'), ('swa', 'Swahili'), ('tgl', 'Tagalog'), ('tgk', 'Tajik'), ('tam', 'Tamil'), ('tat', 'Tatar'), ('tel', 'Telugu'), ('tha', 'Thai'), ('tir', 'Tigrinya'), ('tog', 'Tonga (Nyasa)'), ('tso', 'Tsonga'), ('tsn', 'Tswana'), ('tur', 'Turkish'), ('tuk', 'Turkmen'), ('twi', 'Twi'), ('uig', 'Uighur'), ('ukr', 'Ukrainian'), ('urd', 'Urdu'), ('uzb', 'Uzbek'), ('vie', 'Vietnamese'), ('vol', 'Volapük'), ('wol', 'Wolof'), ('xho', 'Xhosa'), ('yid', 'Yiddish'), ('yor', 'Yoruba'), ('zha', 'Zhuang'), ('zul', 'Zulu')], default='eng', help_text='language used within the dataset', max_length=3, verbose_name='language'), + ), + ] diff --git a/geonode/base/migrations/0032_auto_20200115_1121.py b/geonode/base/migrations/0032_auto_20200115_1121.py new file mode 100644 index 00000000000..38fb9d9bd48 --- /dev/null +++ b/geonode/base/migrations/0032_auto_20200115_1121.py @@ -0,0 +1,34 @@ +# Generated by Django 2.2.9 on 2020-01-15 11:21 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0031_auto_20200114_1651'), + ] + + operations = [ + migrations.AlterField( + model_name='curatedthumbnail', + name='resource', + field=models.OneToOneField(on_delete='CASCASE', to='base.ResourceBase'), + ), + migrations.AlterField( + model_name='resourcebase', + name='category', + field=models.ForeignKey(blank=True, help_text='high-level geographic data thematic classification to assist in the grouping and search of available geographic data sets.', limit_choices_to=models.Q(is_choice=True), null=True, on_delete=django.db.models.deletion.CASCADE, to='base.TopicCategory'), + ), + migrations.AlterField( + model_name='resourcebase', + name='restriction_code_type', + field=models.ForeignKey(blank=True, help_text='limitation(s) placed upon the access or use of the data.', limit_choices_to=models.Q(is_choice=True), null=True, on_delete=django.db.models.deletion.CASCADE, to='base.RestrictionCodeType', verbose_name='restrictions'), + ), + migrations.AlterField( + model_name='resourcebase', + name='spatial_representation_type', + field=models.ForeignKey(blank=True, help_text='method used to represent geographic information in the dataset.', limit_choices_to=models.Q(is_choice=True), null=True, on_delete=django.db.models.deletion.CASCADE, to='base.SpatialRepresentationType', verbose_name='spatial representation type'), + ), + ] diff --git a/geonode/base/migrations/0033_auto_20200115_1145.py b/geonode/base/migrations/0033_auto_20200115_1145.py new file mode 100644 index 00000000000..c794b49089f --- /dev/null +++ b/geonode/base/migrations/0033_auto_20200115_1145.py @@ -0,0 +1,17 @@ +# Generated by Django 2.2.9 on 2020-01-15 11:45 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0032_auto_20200115_1121'), + ] + + operations = [ + migrations.AlterModelOptions( + name='resourcebase', + options={'permissions': (('change_resourcebase_permissions', 'Can change resource permissions'), ('download_resourcebase', 'Can download resource'), ('publish_resourcebase', 'Can publish resource'), ('change_resourcebase_metadata', 'Can change resource metadata'))}, + ), + ] diff --git a/geonode/base/migrations/24_initial.py b/geonode/base/migrations/24_initial.py index 19997826df1..958ffcd92a3 100644 --- a/geonode/base/migrations/24_initial.py +++ b/geonode/base/migrations/24_initial.py @@ -23,7 +23,7 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('role', models.CharField(help_text='function performed by the responsible party', max_length=255, choices=[('author', 'party who authored the resource'), ('processor', 'party who has processed the data in a manner such that the resource has been modified'), ('publisher', 'party who published the resource'), ('custodian', 'party that accepts accountability and responsibility for the data and ensures appropriate care and maintenance of the resource'), ('pointOfContact', 'party who can be contacted for acquiring knowledge about or acquisition of the resource'), ('distributor', 'party who distributes the resource'), ('user', 'party who uses the resource'), ('resourceProvider', 'party that supplies the resource'), ('originator', 'party who created the resource'), ('owner', 'party that owns the resource'), ('principalInvestigator', 'key party responsible for gathering information and conducting research')])), - ('contact', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('contact', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -67,7 +67,8 @@ class Migration(migrations.Migration): ('rght', models.PositiveIntegerField(editable=False, db_index=True)), ('tree_id', models.PositiveIntegerField(editable=False, db_index=True)), ('level', models.PositiveIntegerField(editable=False, db_index=True)), - ('parent', mptt.fields.TreeForeignKey(related_name='children', blank=True, to='base.Region', null=True)), + ('parent', mptt.fields.TreeForeignKey(related_name='children', + on_delete=models.CASCADE, blank=True, to='base.Region', null=True)), ], options={ 'ordering': ('name',), @@ -170,7 +171,8 @@ class Migration(migrations.Migration): migrations.AddField( model_name='resourcebase', name='category', - field=models.ForeignKey(blank=True, to='base.TopicCategory', help_text='high-level geographic data thematic classification to assist in the grouping and search of available geographic data sets.', null=True), + field=models.ForeignKey(blank=True, on_delete=models.CASCADE, to='base.TopicCategory', + help_text='high-level geographic data thematic classification to assist in the grouping and search of available geographic data sets.', null=True), ), migrations.AddField( model_name='resourcebase', @@ -180,17 +182,20 @@ class Migration(migrations.Migration): migrations.AddField( model_name='resourcebase', name='license', - field=models.ForeignKey(blank=True, to='base.License', help_text='license of the dataset', null=True, verbose_name='License'), + field=models.ForeignKey(blank=True, on_delete=models.CASCADE, to='base.License', + help_text='license of the dataset', null=True, verbose_name='License'), ), migrations.AddField( model_name='resourcebase', name='owner', - field=models.ForeignKey(related_name='owned_resource', verbose_name='Owner', blank=True, to=settings.AUTH_USER_MODEL, null=True), + field=models.ForeignKey(related_name='owned_resource', on_delete=models.CASCADE, + verbose_name='Owner', blank=True, to=settings.AUTH_USER_MODEL, null=True), ), migrations.AddField( model_name='resourcebase', name='polymorphic_ctype', - field=models.ForeignKey(related_name='polymorphic_base.resourcebase_set+', editable=False, to='contenttypes.ContentType', null=True), + field=models.ForeignKey(related_name='polymorphic_base.resourcebase_set+', + on_delete=models.CASCADE, editable=False, to='contenttypes.ContentType', null=True), ), migrations.AddField( model_name='resourcebase', @@ -200,22 +205,24 @@ class Migration(migrations.Migration): migrations.AddField( model_name='resourcebase', name='restriction_code_type', - field=models.ForeignKey(blank=True, to='base.RestrictionCodeType', help_text='limitation(s) placed upon the access or use of the data.', null=True, verbose_name='restrictions'), + field=models.ForeignKey(blank=True, on_delete=models.CASCADE, to='base.RestrictionCodeType', + help_text='limitation(s) placed upon the access or use of the data.', null=True, verbose_name='restrictions'), ), migrations.AddField( model_name='resourcebase', name='spatial_representation_type', - field=models.ForeignKey(blank=True, to='base.SpatialRepresentationType', help_text='method used to represent geographic information in the dataset.', null=True, verbose_name='spatial representation type'), + field=models.ForeignKey(blank=True, on_delete=models.CASCADE, to='base.SpatialRepresentationType', + help_text='method used to represent geographic information in the dataset.', null=True, verbose_name='spatial representation type'), ), migrations.AddField( model_name='link', name='resource', - field=models.ForeignKey(blank=True, to='base.ResourceBase', null=True), + field=models.ForeignKey(blank=True, on_delete=models.CASCADE, to='base.ResourceBase', null=True), ), migrations.AddField( model_name='contactrole', name='resource', - field=models.ForeignKey(blank=True, to='base.ResourceBase', null=True), + field=models.ForeignKey(blank=True, on_delete=models.CASCADE, to='base.ResourceBase', null=True), ), migrations.AlterUniqueTogether( name='contactrole', diff --git a/geonode/base/migrations/24_to_26.py b/geonode/base/migrations/24_to_26.py index 15f1c509f43..afcf06b11f5 100644 --- a/geonode/base/migrations/24_to_26.py +++ b/geonode/base/migrations/24_to_26.py @@ -48,8 +48,8 @@ class Migration(migrations.Migration): name='TaggedContentItem', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('content_object', models.ForeignKey(to='base.ResourceBase')), - ('tag', models.ForeignKey(related_name='keywords', to='base.HierarchicalKeyword')), + ('content_object', models.ForeignKey(to='base.ResourceBase', on_delete=models.CASCADE)), + ('tag', models.ForeignKey(related_name='keywords', to='base.HierarchicalKeyword', on_delete=models.CASCADE)), ], options={ 'abstract': False, @@ -76,7 +76,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('about', models.CharField(max_length=255, null=True, blank=True)), ('alt_label', models.CharField(default='', max_length=255, null=True, blank=True)), - ('thesaurus', models.ForeignKey(related_name='thesaurus', to='base.Thesaurus')), + ('thesaurus', models.ForeignKey(related_name='thesaurus', to='base.Thesaurus', on_delete=models.CASCADE)), ], options={ 'ordering': ('alt_label',), @@ -89,7 +89,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('lang', models.CharField(max_length=3)), ('label', models.CharField(max_length=255)), - ('keyword', models.ForeignKey(related_name='keyword', to='base.ThesaurusKeyword')), + ('keyword', models.ForeignKey(related_name='keyword', to='base.ThesaurusKeyword', on_delete=models.CASCADE)), ], options={ 'ordering': ('keyword', 'lang'), diff --git a/geonode/base/migrations/26_to_27.py b/geonode/base/migrations/26_to_27.py index 2d48a5e3e71..d8acd62daa2 100644 --- a/geonode/base/migrations/26_to_27.py +++ b/geonode/base/migrations/26_to_27.py @@ -19,7 +19,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='resourcebase', name='group', - field=models.ForeignKey(blank=True, to='auth.Group', null=True), + field=models.ForeignKey(blank=True, to='auth.Group', null=True, on_delete=models.CASCADE), ), migrations.AddField( diff --git a/geonode/base/models.py b/geonode/base/models.py index 443b2077518..08a7132698c 100644 --- a/geonode/base/models.py +++ b/geonode/base/models.py @@ -81,8 +81,8 @@ class ContactRole(models.Model): """ ContactRole is an intermediate model to bind Profiles as Contacts to Resources and apply roles. """ - resource = models.ForeignKey('ResourceBase', blank=True, null=True) - contact = models.ForeignKey(settings.AUTH_USER_MODEL) + resource = models.ForeignKey('ResourceBase', blank=True, null=True, on_delete=models.CASCADE) + contact = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) role = models.CharField( choices=ROLE_VALUES, max_length=255, @@ -139,8 +139,11 @@ class TopicCategory(models.Model): is_choice = models.BooleanField(default=True) fa_class = models.CharField(max_length=64, default='fa-times') + def __str__(self): + return self.gn_description + def __unicode__(self): - return "{0}".format(self.gn_description) + return u"{0}".format(self.__str__()) class Meta: ordering = ("identifier",) @@ -159,9 +162,12 @@ class SpatialRepresentationType(models.Model): gn_description = models.CharField('GeoNode description', max_length=255) is_choice = models.BooleanField(default=True) - def __unicode__(self): + def __str__(self): return "{0}".format(self.gn_description) + def __unicode__(self): + return u"{0}".format(self.__str__()) + class Meta: ordering = ("identifier",) verbose_name_plural = 'Metadata Spatial Representation Types' @@ -181,6 +187,7 @@ class Region(MPTTModel): 'self', null=True, blank=True, + on_delete=models.CASCADE, related_name='children') # Save bbox values in the database. @@ -213,6 +220,9 @@ class Region(MPTTModel): default='EPSG:4326') def __unicode__(self): + return u"{0}".format(self.__str__()) + + def __str__(self): return "{0}".format(self.name) @property @@ -262,6 +272,9 @@ class RestrictionCodeType(models.Model): is_choice = models.BooleanField(default=True) def __unicode__(self): + return u"{0}".format(self.__str__()) + + def __str__(self): return "{0}".format(self.gn_description) class Meta: @@ -291,6 +304,9 @@ class License(models.Model): license_text = models.TextField(null=True, blank=True) def __unicode__(self): + return u"{0}".format(self.__str__()) + + def __str__(self): return "{0}".format(self.name) @property @@ -380,8 +396,8 @@ def dump_bulk_tree(cls, parent=None, keep_ids=True): class TaggedContentItem(ItemBase): - content_object = models.ForeignKey('ResourceBase') - tag = models.ForeignKey('HierarchicalKeyword', related_name='keywords') + content_object = models.ForeignKey('ResourceBase', on_delete=models.CASCADE) + tag = models.ForeignKey('HierarchicalKeyword', related_name='keywords', on_delete=models.CASCADE) # see https://github.com/alex/django-taggit/issues/101 @classmethod @@ -442,6 +458,9 @@ class Thesaurus(models.Model): slug = models.CharField(max_length=64, default='') def __unicode__(self): + return u"{0}".format(self.__str__()) + + def __str__(self): return "{0}".format(self.identifier) class Meta: @@ -460,9 +479,12 @@ class ThesaurusKeywordLabel(models.Model): label = models.CharField(max_length=255) # note = models.CharField(max_length=511) - keyword = models.ForeignKey('ThesaurusKeyword', related_name='keyword') + keyword = models.ForeignKey('ThesaurusKeyword', related_name='keyword', on_delete=models.CASCADE) def __unicode__(self): + return u"{0}".format(self.__str__()) + + def __str__(self): return "{0}".format(self.label) class Meta: @@ -484,9 +506,12 @@ class ThesaurusKeyword(models.Model): null=True, blank=True) - thesaurus = models.ForeignKey('Thesaurus', related_name='thesaurus') + thesaurus = models.ForeignKey('Thesaurus', related_name='thesaurus', on_delete=models.CASCADE) def __unicode__(self): + return u"{0}".format(self.__str__()) + + def __str__(self): return "{0}".format(self.alt_label) @property @@ -569,7 +594,8 @@ class ResourceBase(PolymorphicModel, PermissionLevelMixin, ItemBase): blank=True, null=True, related_name='owned_resource', - verbose_name=_("Owner")) + verbose_name=_("Owner"), + on_delete=models.CASCADE) contacts = models.ManyToManyField( settings.AUTH_USER_MODEL, through='ContactRole') @@ -634,8 +660,8 @@ class ResourceBase(PolymorphicModel, PermissionLevelMixin, ItemBase): help_text=restriction_code_type_help_text, null=True, blank=True, - limit_choices_to=Q( - is_choice=True)) + on_delete=models.CASCADE, + limit_choices_to=Q(is_choice=True)) constraints_other = models.TextField( _('restrictions other'), @@ -645,7 +671,8 @@ class ResourceBase(PolymorphicModel, PermissionLevelMixin, ItemBase): license = models.ForeignKey(License, null=True, blank=True, verbose_name=_("License"), - help_text=license_help_text) + help_text=license_help_text, + on_delete=models.CASCADE) language = models.CharField( _('language'), max_length=3, @@ -657,16 +684,16 @@ class ResourceBase(PolymorphicModel, PermissionLevelMixin, ItemBase): TopicCategory, null=True, blank=True, - limit_choices_to=Q( - is_choice=True), + on_delete=models.CASCADE, + limit_choices_to=Q(is_choice=True), help_text=category_help_text) spatial_representation_type = models.ForeignKey( SpatialRepresentationType, null=True, blank=True, - limit_choices_to=Q( - is_choice=True), + on_delete=models.CASCADE, + limit_choices_to=Q(is_choice=True), verbose_name=_("spatial representation type"), help_text=spatial_representation_type_help_text) @@ -696,7 +723,7 @@ class ResourceBase(PolymorphicModel, PermissionLevelMixin, ItemBase): null=True, help_text=data_quality_statement_help_text) - group = models.ForeignKey(Group, null=True, blank=True) + group = models.ForeignKey(Group, null=True, blank=True, on_delete=models.CASCADE) # Section 9 # see metadata_author property definition below @@ -792,6 +819,9 @@ class ResourceBase(PolymorphicModel, PermissionLevelMixin, ItemBase): last_updated = models.DateTimeField(auto_now=True) def __unicode__(self): + return u"{0}".format(self.__str__()) + + def __str__(self): return "{0}".format(self.title) # fields controlling security state @@ -1342,7 +1372,7 @@ class Meta: # custom permissions, # add, change and delete are standard in django-guardian permissions = ( - ('view_resourcebase', 'Can view resource'), + # ('view_resourcebase', 'Can view resource'), ('change_resourcebase_permissions', 'Can change resource permissions'), ('download_resourcebase', 'Can download resource'), ('publish_resourcebase', 'Can publish resource'), @@ -1389,7 +1419,7 @@ class Link(models.Model): * OGC:WFS: for WFS service links * OGC:WCS: for WCS service links """ - resource = models.ForeignKey(ResourceBase, blank=True, null=True) + resource = models.ForeignKey(ResourceBase, blank=True, null=True, on_delete=models.CASCADE) extension = models.CharField( max_length=255, help_text=_('For example "kml"')) @@ -1405,6 +1435,9 @@ class Link(models.Model): objects = LinkManager() def __unicode__(self): + return u"{0}".format(self.__str__()) + + def __str__(self): return "{0} link".format(self.link_type) @@ -1418,10 +1451,10 @@ class MenuPlaceholder(models.Model): ) def __unicode__(self): - return "{0}".format(self.name) + return u"{0}".format(self.__str__()) def __str__(self): - return self.name + return "{0}".format(self.name) class Menu(models.Model): @@ -1441,10 +1474,10 @@ class Menu(models.Model): ) def __unicode__(self): - return "{0}".format(self.title) + return u"{0}".format(self.__str__()) def __str__(self): - return self.title + return "{0}".format(self.title) class Meta: unique_together = ( @@ -1463,8 +1496,8 @@ class MenuItem(models.Model): ) menu = models.ForeignKey( to='Menu', - on_delete=models.CASCADE, - null=False + null=False, + on_delete=models.CASCADE ) order = models.IntegerField( null=False @@ -1477,10 +1510,10 @@ class MenuItem(models.Model): ) def __unicode__(self): - return "{0}".format(self.title) + return u"{0}".format(self.__str__()) def __str__(self): - return self.title + return "{0}".format(self.title) class Meta: unique_together = ( @@ -1491,7 +1524,7 @@ class Meta: class CuratedThumbnail(models.Model): - resource = models.OneToOneField(ResourceBase) + resource = models.OneToOneField(ResourceBase, on_delete="CASCASE") img = models.ImageField(upload_to='curated_thumbs') # TOD read thumb size from settings img_thumbnail = ImageSpecField(source='img', diff --git a/geonode/base/populate_test_data.py b/geonode/base/populate_test_data.py index d9d3534a433..be2d35fcd73 100644 --- a/geonode/base/populate_test_data.py +++ b/geonode/base/populate_test_data.py @@ -50,7 +50,7 @@ 'GIF87a\x01\x00\x01\x00\x80\x01\x00\x00\x00\x00ccc,\x00' '\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;' ) -f = SimpleUploadedFile('test_img_file.gif', imgfile.read(), 'image/gif') +f = SimpleUploadedFile('test_img_file.gif', imgfile.read().encode("UTF-8"), 'image/gif') def all_public(): diff --git a/geonode/base/templatetags/base_tags.py b/geonode/base/templatetags/base_tags.py index 4280f5fa82c..11dc8eff3d6 100644 --- a/geonode/base/templatetags/base_tags.py +++ b/geonode/base/templatetags/base_tags.py @@ -50,13 +50,13 @@ } -@register.assignment_tag +@register.simple_tag def num_ratings(obj): ct = ContentType.objects.get_for_model(obj) return len(Rating.objects.filter(object_id=obj.pk, content_type=ct)) -@register.assignment_tag(takes_context=True) +@register.simple_tag(takes_context=True) def facets(context): request = context['request'] title_filter = request.GET.get('title__icontains', '') @@ -284,13 +284,13 @@ def get_facet_title(value): return value -@register.assignment_tag(takes_context=True) +@register.simple_tag(takes_context=True) def get_current_path(context): request = context['request'] return request.get_full_path() -@register.assignment_tag(takes_context=True) +@register.simple_tag(takes_context=True) def get_context_resourcetype(context): c_path = get_current_path(context) resource_types = ['layers', 'maps', 'documents', 'search', 'people', @@ -309,7 +309,7 @@ def fullurl(context, url): return r.build_absolute_uri(url) -@register.assignment_tag +@register.simple_tag def get_menu(placeholder_name): menus = { m: MenuItem.objects.filter(menu=m) diff --git a/geonode/base/tests.py b/geonode/base/tests.py index 5c3a07e3152..980c33c1fe9 100644 --- a/geonode/base/tests.py +++ b/geonode/base/tests.py @@ -18,7 +18,6 @@ # ######################################################################### -import sys import os from geonode.tests.base import GeoNodeBaseTestSupport @@ -27,9 +26,6 @@ ) from django.template import Template, Context -reload(sys) -sys.setdefaultencoding('utf-8') - class ThumbnailTests(GeoNodeBaseTestSupport): diff --git a/geonode/catalogue/metadataxsl/models.py b/geonode/catalogue/metadataxsl/models.py index 305eb933993..483601f86c9 100644 --- a/geonode/catalogue/metadataxsl/models.py +++ b/geonode/catalogue/metadataxsl/models.py @@ -25,7 +25,7 @@ from urlparse import urljoin from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse from django.db.models import signals from geonode.base.models import Link diff --git a/geonode/catalogue/tests.py b/geonode/catalogue/tests.py index bcf16109a4d..30cf680067f 100644 --- a/geonode/catalogue/tests.py +++ b/geonode/catalogue/tests.py @@ -21,7 +21,7 @@ from geonode.tests.base import GeoNodeBaseTestSupport import json -from django.core.urlresolvers import reverse +from django.urls import reverse from geonode.base.models import ResourceBase from geonode.catalogue import get_catalogue diff --git a/geonode/catalogue/views.py b/geonode/catalogue/views.py index e2dac91cf97..038b9ec2ea5 100644 --- a/geonode/catalogue/views.py +++ b/geonode/catalogue/views.py @@ -96,7 +96,7 @@ def csw_global_dispatch(request): for e in authorized_ids)) + ")" authorized_layers_filter = "id IN " + authorized_layers mdict['repository']['filter'] += " AND " + authorized_layers_filter - if request.user and request.user.is_authenticated(): + if request.user and request.user.is_authenticated: mdict['repository']['filter'] = "({}) OR ({})".format(mdict['repository']['filter'], authorized_layers_filter) else: @@ -114,7 +114,7 @@ def csw_global_dispatch(request): if not is_admin and settings.GROUP_PRIVATE_RESOURCES: groups_ids = [] - if request.user and request.user.is_authenticated(): + if request.user and request.user.is_authenticated: for group in request.user.groups.all(): groups_ids.append(group.id) group_list_all = [] diff --git a/geonode/decorators.py b/geonode/decorators.py index f0b54b4bb1d..66a2875c646 100644 --- a/geonode/decorators.py +++ b/geonode/decorators.py @@ -178,7 +178,7 @@ def logged_in_or_apiauth(): def view_decorator(func): def wrapper(request, *args, **kwargs): return view_or_apiauth(func, request, - lambda u: u.is_authenticated(), + lambda u: u.is_authenticated, *args, **kwargs) return wrapper diff --git a/geonode/documents/forms.py b/geonode/documents/forms.py index 5328739da67..57d529f3aad 100644 --- a/geonode/documents/forms.py +++ b/geonode/documents/forms.py @@ -106,9 +106,9 @@ class Meta(ResourceBaseForm.Meta): class DocumentDescriptionForm(forms.Form): - title = forms.CharField(300) - abstract = forms.CharField(2000, widget=forms.Textarea, required=False) - keywords = forms.CharField(500, required=False) + title = forms.CharField(max_length=300) + abstract = forms.CharField(max_length=2000, widget=forms.Textarea, required=False) + keywords = forms.CharField(max_length=500, required=False) class DocumentReplaceForm(forms.ModelForm): diff --git a/geonode/documents/migrations/24_initial.py b/geonode/documents/migrations/24_initial.py index 7d5bd9184b5..c6febeba855 100644 --- a/geonode/documents/migrations/24_initial.py +++ b/geonode/documents/migrations/24_initial.py @@ -15,7 +15,8 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Document', fields=[ - ('resourcebase_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='base.ResourceBase')), + ('resourcebase_ptr', models.OneToOneField(parent_link=True, on_delete=models.CASCADE, + auto_created=True, primary_key=True, serialize=False, to='base.ResourceBase')), ('title_en', models.CharField(help_text='name by which the cited resource is known', max_length=255, null=True, verbose_name='title')), ('abstract_en', models.TextField(help_text='brief narrative summary of the content of the resource(s)', null=True, verbose_name='abstract', blank=True)), ('purpose_en', models.TextField(help_text='summary of the intentions with which the resource(s) was developed', null=True, verbose_name='purpose', blank=True)), @@ -27,7 +28,7 @@ class Migration(migrations.Migration): ('extension', models.CharField(max_length=128, null=True, blank=True)), ('doc_type', models.CharField(max_length=128, null=True, blank=True)), ('doc_url', models.URLField(help_text='The URL of the document if it is external.', max_length=255, null=True, verbose_name='URL', blank=True)), - ('content_type', models.ForeignKey(blank=True, to='contenttypes.ContentType', null=True)), + ('content_type', models.ForeignKey(blank=True, to='contenttypes.ContentType', on_delete=models.CASCADE, null=True)), ], options={ 'abstract': False, diff --git a/geonode/documents/migrations/25_add_documentresourcelink_table.py b/geonode/documents/migrations/25_add_documentresourcelink_table.py index f4d576e144a..118c5a76a28 100644 --- a/geonode/documents/migrations/25_add_documentresourcelink_table.py +++ b/geonode/documents/migrations/25_add_documentresourcelink_table.py @@ -17,12 +17,12 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('object_id', models.PositiveIntegerField()), - ('content_type', models.ForeignKey(to='contenttypes.ContentType')), + ('content_type', models.ForeignKey(to='contenttypes.ContentType', on_delete=models.CASCADE)), ], ), migrations.AddField( model_name='documentresourcelink', name='document', - field=models.ForeignKey(related_name='links', to='documents.Document'), + field=models.ForeignKey(related_name='links', to='documents.Document', on_delete=models.CASCADE), ), ] diff --git a/geonode/documents/models.py b/geonode/documents/models.py index d4bfa840a39..ffac588f3ea 100644 --- a/geonode/documents/models.py +++ b/geonode/documents/models.py @@ -32,7 +32,7 @@ from django.conf import settings from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.staticfiles import finders from django.utils.translation import ugettext_lazy as _ @@ -72,7 +72,10 @@ class Document(ResourceBase): verbose_name=_('URL')) def __unicode__(self): - return self.title + return u"{0}".format(self.__str__()) + + def __str__(self): + return "{0}".format(self.title) def get_absolute_url(self): return reverse('document_detail', args=(self.id,)) @@ -106,10 +109,10 @@ class Meta(ResourceBase.Meta): class DocumentResourceLink(models.Model): # relation to the document model - document = models.ForeignKey(Document, related_name='links') + document = models.ForeignKey(Document, related_name='links', on_delete=models.CASCADE) # relation to the resource model - content_type = models.ForeignKey(ContentType) + content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() resource = GenericForeignKey('content_type', 'object_id') diff --git a/geonode/documents/tests.py b/geonode/documents/tests.py index f8cb9781715..56a6a3ebe26 100644 --- a/geonode/documents/tests.py +++ b/geonode/documents/tests.py @@ -34,7 +34,7 @@ from django.core.files.uploadedfile import SimpleUploadedFile from django.contrib.auth import get_user_model from django.contrib.contenttypes.models import ContentType -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth.models import Group from geonode.base.models import License, Region @@ -66,7 +66,7 @@ def setUp(self): super(DocumentsTest, self).setUp() create_models('map') self.imgfile = io.BytesIO( - b'GIF87a\x01\x00\x01\x00\x80\x01\x00\x00\x00\x00ccc,\x00' + 'GIF87a\x01\x00\x01\x00\x80\x01\x00\x00\x00\x00ccc,\x00' '\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;') self.anonymous_user = get_anonymous_user() @@ -75,7 +75,7 @@ def test_create_document_with_no_rel(self): f = SimpleUploadedFile( 'test_img_file.gif', - self.imgfile.read(), + self.imgfile.read().encode("UTF-8"), 'image/gif') superuser = get_user_model().objects.get(pk=2) @@ -90,7 +90,7 @@ def test_create_document_with_rel(self): """Tests the creation of a document with no a map related""" f = SimpleUploadedFile( 'test_img_file.gif', - self.imgfile.read(), + self.imgfile.read().encode("UTF-8"), 'image/gif') superuser = get_user_model().objects.get(pk=2) @@ -193,7 +193,7 @@ def test_upload_document_form(self): file_data = { 'doc_file': SimpleUploadedFile( 'test_img_file.gif', - self.imgfile.read(), + self.imgfile.read().encode("UTF-8"), 'image/gif')} form = DocumentCreateForm(form_data, file_data) self.assertTrue(form.is_valid()) @@ -247,7 +247,7 @@ def test_document_isuploaded(self): f = SimpleUploadedFile( 'test_img_file.gif', - self.imgfile.read(), + self.imgfile.read().encode("UTF-8"), 'image/gif') m = Map.objects.all()[0] @@ -298,7 +298,7 @@ def test_ajax_document_permissions(self): # Setup some document names to work with f = SimpleUploadedFile( 'test_img_file.gif', - self.imgfile.read(), + self.imgfile.read().encode("UTF-8"), 'image/gif') superuser = get_user_model().objects.get(pk=2) @@ -562,7 +562,7 @@ def setUp(self): create_models('layer') self.test_file = io.BytesIO( - b'GIF87a\x01\x00\x01\x00\x80\x01\x00\x00\x00\x00ccc,\x00' + 'GIF87a\x01\x00\x01\x00\x80\x01\x00\x00\x00\x00ccc,\x00' '\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;' ) @@ -570,7 +570,7 @@ def test_create_document_with_links(self): """Tests the creation of document links.""" f = SimpleUploadedFile( 'test_img_file.gif', - self.test_file.read(), + self.test_file.read().encode("UTF-8"), 'image/gif' ) diff --git a/geonode/documents/views.py b/geonode/documents/views.py index 44f39636de6..a103b357c91 100644 --- a/geonode/documents/views.py +++ b/geonode/documents/views.py @@ -32,7 +32,7 @@ from django.utils.translation import ugettext as _ from django.contrib.auth.decorators import login_required from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse from django.core.exceptions import PermissionDenied from django.core.files.storage import default_storage from django.core.files.base import ContentFile @@ -156,7 +156,7 @@ def document_detail(request, docid): except BaseException: logger.error("Exif extraction failed.") - if request.user.is_authenticated(): + if request.user.is_authenticated: if getattr(settings, 'FAVORITE_ENABLED', False): from geonode.favorite.utils import get_favorite_info context_dict["favorite_info"] = get_favorite_info(request.user, document) diff --git a/geonode/favorite/models.py b/geonode/favorite/models.py index 626075aa423..de68f5f9d23 100644 --- a/geonode/favorite/models.py +++ b/geonode/favorite/models.py @@ -89,8 +89,8 @@ def create_favorite(self, content_object, user): class Favorite(models.Model): - user = models.ForeignKey(settings.AUTH_USER_MODEL) - content_type = models.ForeignKey(ContentType) + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) + content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type', 'object_id') @@ -104,6 +104,9 @@ class Meta: unique_together = (('user', 'content_type', 'object_id'),) def __unicode__(self): + return u"{0}".format(self.__str__()) + + def __str__(self): if self.content_object: return "Favorite: {}, {}, {}".format( self.content_object.title, self.content_type, self.user) diff --git a/geonode/favorite/tests.py b/geonode/favorite/tests.py index 0abd401d228..8a37ed24be3 100644 --- a/geonode/favorite/tests.py +++ b/geonode/favorite/tests.py @@ -24,7 +24,7 @@ from django.contrib.auth import get_user_model from django.contrib.contenttypes.models import ContentType -from django.core.urlresolvers import reverse +from django.urls import reverse from django.db.models import Max from .models import Favorite diff --git a/geonode/favorite/utils.py b/geonode/favorite/utils.py index 615e2567db1..3d0946e827d 100644 --- a/geonode/favorite/utils.py +++ b/geonode/favorite/utils.py @@ -18,7 +18,7 @@ # ######################################################################### -from django.core.urlresolvers import reverse +from django.urls import reverse from . import models diff --git a/geonode/favorite/views.py b/geonode/favorite/views.py index b89b107429c..6ff3a156c5b 100644 --- a/geonode/favorite/views.py +++ b/geonode/favorite/views.py @@ -23,7 +23,7 @@ from django.conf import settings from django.contrib.auth.decorators import login_required from django.core.exceptions import ObjectDoesNotExist -from django.core.urlresolvers import reverse +from django.urls import reverse from django.http import HttpResponse from django.shortcuts import get_object_or_404 from django.shortcuts import render diff --git a/geonode/geoserver/context_processors.py b/geonode/geoserver/context_processors.py index 1afe40a45dd..ec410b36e13 100644 --- a/geonode/geoserver/context_processors.py +++ b/geonode/geoserver/context_processors.py @@ -19,7 +19,7 @@ ######################################################################### from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse from geonode.geoserver.helpers import ogc_server_settings diff --git a/geonode/geoserver/createlayer/tests.py b/geonode/geoserver/createlayer/tests.py index d117608fd4d..5937e2cdc83 100644 --- a/geonode/geoserver/createlayer/tests.py +++ b/geonode/geoserver/createlayer/tests.py @@ -24,7 +24,7 @@ import dj_database_url from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse from geonode import geoserver from geonode import GeoNodeException diff --git a/geonode/geoserver/helpers.py b/geonode/geoserver/helpers.py index ae93ab130b2..30094a867dc 100755 --- a/geonode/geoserver/helpers.py +++ b/geonode/geoserver/helpers.py @@ -806,7 +806,7 @@ def gs_slurp( layer.delete() output['stats']['deleted'] += 1 status = "delete_succeeded" - except Exception as e: + except Exception: status = "delete_failed" finally: from .signals import geoserver_pre_delete @@ -1108,7 +1108,7 @@ def set_styles(layer, gs_catalog): # Remove duplicates style_set = list(dict.fromkeys(style_set)) - layer.styles = style_set + layer.styles.set(style_set) # Update default style to database to_update = { @@ -1238,7 +1238,7 @@ def cleanup(name, uuid): """ try: Layer.objects.get(name=name) - except Layer.DoesNotExist as e: + except Layer.DoesNotExist: pass else: msg = ('Not doing any cleanup because the layer %s exists in the ' @@ -1520,7 +1520,10 @@ def netloc(self): return urlsplit(self.LOCATION).netloc def __unicode__(self): - return self.alias + return u"{0}".format(self.__str__()) + + def __str__(self): + return "{0}".format(self.alias) class OGC_Servers_Handler(object): diff --git a/geonode/geoserver/ows.py b/geonode/geoserver/ows.py index 2edf8cb4e0d..3846c14d8d2 100644 --- a/geonode/geoserver/ows.py +++ b/geonode/geoserver/ows.py @@ -21,7 +21,7 @@ import logging from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils.translation import ugettext as _ try: from urllib.parse import urlencode, urljoin diff --git a/geonode/geoserver/tests/integration.py b/geonode/geoserver/tests/integration.py index 20ac3cbab0d..19f669748d1 100644 --- a/geonode/geoserver/tests/integration.py +++ b/geonode/geoserver/tests/integration.py @@ -37,7 +37,7 @@ from django.conf import settings from django.test.utils import override_settings -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth import get_user_model from geonode import geoserver diff --git a/geonode/geoserver/tests/test_server.py b/geonode/geoserver/tests/test_server.py index fd0dd82386a..d2ea47e754a 100644 --- a/geonode/geoserver/tests/test_server.py +++ b/geonode/geoserver/tests/test_server.py @@ -28,7 +28,7 @@ from os.path import basename, splitext from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth import get_user_model from django.test.utils import override_settings @@ -938,7 +938,7 @@ def test_ogc_server_defaults(self): # Testing OWS endpoints from urlparse import urljoin - from django.core.urlresolvers import reverse + from django.urls import reverse from ..ows import _wcs_get_capabilities, _wfs_get_capabilities, _wms_get_capabilities wcs = _wcs_get_capabilities() logger.debug(wcs) diff --git a/geonode/geoserver/upload.py b/geonode/geoserver/upload.py index d51d4159dcd..bb50fdb851c 100644 --- a/geonode/geoserver/upload.py +++ b/geonode/geoserver/upload.py @@ -73,7 +73,7 @@ def geoserver_upload( try: store = get_store(cat, name, workspace=workspace) - except geoserver.catalog.FailedRequestError as e: + except geoserver.catalog.FailedRequestError: # There is no store, ergo the road is clear pass else: diff --git a/geonode/geoserver/views.py b/geonode/geoserver/views.py index f372607c4d2..a494674b51b 100644 --- a/geonode/geoserver/views.py +++ b/geonode/geoserver/views.py @@ -41,7 +41,7 @@ from django.contrib.auth.decorators import user_passes_test from django.contrib.auth import get_user_model from django.contrib.auth.decorators import login_required -from django.core.urlresolvers import reverse +from django.urls import reverse from django.template.loader import get_template from django.utils.datastructures import MultiValueDictKeyError from django.utils.translation import ugettext as _ @@ -442,7 +442,7 @@ def geoserver_proxy(request, # or not on session # @dismissed - # if not request.user.is_authenticated(): + # if not request.user.is_authenticated: # return HttpResponse( # "You must be logged in to access GeoServer", # content_type="text/plain", @@ -588,7 +588,7 @@ def resolve_user(request): 'superuser': superuser, } - if acl_user and acl_user.is_authenticated(): + if acl_user and acl_user.is_authenticated: resp['fullname'] = acl_user.get_full_name() resp['email'] = acl_user.email return HttpResponse(json.dumps(resp), content_type="application/json") @@ -655,9 +655,9 @@ def layer_acls(request): 'ro': list(read_only), 'name': acl_user.username, 'is_superuser': acl_user.is_superuser, - 'is_anonymous': acl_user.is_anonymous(), + 'is_anonymous': acl_user.is_anonymous, } - if acl_user.is_authenticated(): + if acl_user.is_authenticated: result['fullname'] = acl_user.get_full_name() result['email'] = acl_user.email diff --git a/geonode/groups/migrations/0028_auto_20200114_1651.py b/geonode/groups/migrations/0028_auto_20200114_1651.py new file mode 100644 index 00000000000..2fc7f9c0642 --- /dev/null +++ b/geonode/groups/migrations/0028_auto_20200114_1651.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.27 on 2020-01-14 16:51 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('groups', '0027_auto_20180105_1631_squashed_0028_auto_20180606_1543'), + ] + + operations = [ + migrations.AlterField( + model_name='groupprofile', + name='access', + field=models.CharField(choices=[('public', 'Public'), ('public-invite', 'Public (invite-only)'), ('private', 'Private')], default="public'", help_text='Public: Any registered user can view and join a public group.
Public (invite-only):Any registered user can view the group. Only invited users can join.
Private: Registered users cannot see any details about the group, including membership. Only invited users can join.', max_length=15, verbose_name='Access'), + ), + ] diff --git a/geonode/groups/migrations/0029_auto_20200115_1121.py b/geonode/groups/migrations/0029_auto_20200115_1121.py new file mode 100644 index 00000000000..46a97b800d8 --- /dev/null +++ b/geonode/groups/migrations/0029_auto_20200115_1121.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.9 on 2020-01-15 11:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('groups', '0028_auto_20200114_1651'), + ] + + operations = [ + migrations.AlterField( + model_name='groupprofile', + name='group', + field=models.OneToOneField(on_delete='CASCASE', to='auth.Group'), + ), + ] diff --git a/geonode/groups/migrations/24_initial.py b/geonode/groups/migrations/24_initial.py index 41cadbeea14..113d5f563de 100644 --- a/geonode/groups/migrations/24_initial.py +++ b/geonode/groups/migrations/24_initial.py @@ -26,7 +26,8 @@ class Migration(migrations.Migration): ('role', models.CharField(max_length=10, choices=[('manager', 'Manager'), ('member', 'Member')])), ('state', models.CharField(default='sent', max_length=10, choices=[('sent', 'Sent'), ('accepted', 'Accepted'), ('declined', 'Declined')])), ('created', models.DateTimeField(default=now)), - ('from_user', models.ForeignKey(related_name='pg_invitations_sent', to=settings.AUTH_USER_MODEL)), + ('from_user', models.ForeignKey(related_name='pg_invitations_sent', + to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -48,29 +49,30 @@ class Migration(migrations.Migration): ('email', models.EmailField(help_text='Email used to contact one or all group members, such as a mailing list, shared email, or exchange group.', max_length=254, null=True, verbose_name='Email', blank=True)), ('access', models.CharField(default=b"public'", help_text='Public: Any registered user can view and join a public group.
Public (invite-only):Any registered user can view the group. Only invited users can join.
Private: Registered users cannot see any details about the group, including membership. Only invited users can join.', max_length=15, verbose_name='Access', choices=[('public', 'Public'), ('public-invite', 'Public (invite-only)'), ('private', 'Private')])), ('last_modified', models.DateTimeField(auto_now=True)), - ('group', models.OneToOneField(to='auth.Group')), + ('group', models.OneToOneField(to='auth.Group', on_delete=models.CASCADE)), ('keywords', taggit.managers.TaggableManager(to='taggit.Tag', through='taggit.TaggedItem', blank=True, help_text='A space or comma-separated list of keywords', verbose_name='Keywords')), ], ), migrations.AddField( model_name='groupmember', name='group', - field=models.ForeignKey(to='groups.GroupProfile'), + field=models.ForeignKey(to='groups.GroupProfile', on_delete=models.CASCADE), ), migrations.AddField( model_name='groupmember', name='user', - field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE), ), migrations.AddField( model_name='groupinvitation', name='group', - field=models.ForeignKey(related_name='invitations', to='groups.GroupProfile'), + field=models.ForeignKey(related_name='invitations', to='groups.GroupProfile', on_delete=models.CASCADE), ), migrations.AddField( model_name='groupinvitation', name='user', - field=models.ForeignKey(related_name='pg_invitations_received', to=settings.AUTH_USER_MODEL, null=True), + field=models.ForeignKey(related_name='pg_invitations_received', + to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True), ), migrations.AlterUniqueTogether( name='groupinvitation', diff --git a/geonode/groups/models.py b/geonode/groups/models.py index 3444567db75..4c266e18d0c 100644 --- a/geonode/groups/models.py +++ b/geonode/groups/models.py @@ -20,7 +20,7 @@ import logging from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth.models import Group from django.contrib.auth import get_user_model from django.db import models @@ -45,8 +45,10 @@ class Meta: verbose_name_plural = _('Group Categories') def __unicode__(self): - # return 'Category: {}'.format(self.name.encode('utf-8')) - return self.name.encode('utf-8') + return u"{0}".format(self.__str__()) + + def __str__(self): + return "{0}".format(self.name) def get_absolute_url(self): return reverse('group_category_detail', args=(self.slug,)) @@ -74,7 +76,7 @@ class GroupProfile(models.Model): email_help_text = _('Email used to contact one or all group members, ' 'such as a mailing list, shared email, or exchange group.') - group = models.OneToOneField(Group) + group = models.OneToOneField(Group, on_delete="CASCASE") title = models.CharField(_('Title'), max_length=50) slug = models.SlugField(unique=True) logo = models.ImageField(_('Logo'), upload_to="people_group", blank=True) @@ -112,14 +114,17 @@ def groups_for_user(cls, user): """ Returns the groups that user is a member of. If the user is a superuser, all groups are returned. """ - if user.is_authenticated(): + if user.is_authenticated: if user.is_superuser: return cls.objects.all() return cls.objects.filter(groupmember__user=user) return [] def __unicode__(self): - return self.title + return u"{0}".format(self.__str__()) + + def __str__(self): + return "{0}".format(self.title) def keyword_list(self): """ @@ -161,24 +166,24 @@ def get_managers(self): flat=True))) def user_is_member(self, user): - if not user.is_authenticated(): + if not user.is_authenticated: return False elif user.is_superuser: return True return user.id in self.member_queryset().values_list("user", flat=True) def user_is_role(self, user, role): - if not user.is_authenticated(): + if not user.is_authenticated: return False elif user.is_superuser: return True return self.member_queryset().filter(user=user, role=role).exists() def can_view(self, user): - if user.is_superuser and user.is_authenticated(): + if user.is_superuser and user.is_authenticated: return True if self.access == "private": - return user.is_authenticated() and self.user_is_member(user) + return user.is_authenticated and self.user_is_member(user) else: return True @@ -201,9 +206,8 @@ def leave(self, user, **kwargs): else: logger.warning("The invited user \"{0}\" is not a member".format(user.username)) - @models.permalink def get_absolute_url(self): - return ('group_detail', (), {'slug': self.slug}) + return reverse('group_detail', args=[self.slug, self.version_number]) @property def class_name(self): @@ -214,8 +218,8 @@ class GroupMember(models.Model): MANAGER = "manager" MEMBER = "member" - group = models.ForeignKey(GroupProfile) - user = models.ForeignKey(settings.AUTH_USER_MODEL) + group = models.ForeignKey(GroupProfile, on_delete=models.CASCADE) + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) role = models.CharField(max_length=10, choices=[ (MANAGER, _("Manager")), (MEMBER, _("Member")), diff --git a/geonode/groups/tests.py b/geonode/groups/tests.py index f3ac0379bd4..5982850c506 100644 --- a/geonode/groups/tests.py +++ b/geonode/groups/tests.py @@ -26,7 +26,7 @@ from django.contrib.auth import get_user_model from django.contrib.auth.models import Group from django.core.files.uploadedfile import SimpleUploadedFile -from django.core.urlresolvers import reverse +from django.urls import reverse from django.test import override_settings from django.conf import settings @@ -751,7 +751,7 @@ def test_group_logo_is_present_on_list_view(self): slug="test", description="test", access="public", - logo=SimpleUploadedFile("dummy-file.jpg", b"dummy contents") + logo=SimpleUploadedFile("dummy-file.jpg", "dummy contents".encode("UTF-8")) ) test_profile.save() response = self.client.get( diff --git a/geonode/groups/views.py b/geonode/groups/views.py index 27efc783ed0..6a731887a87 100644 --- a/geonode/groups/views.py +++ b/geonode/groups/views.py @@ -23,7 +23,7 @@ from actstream.models import Action from django.contrib.auth import get_user_model from django.contrib.auth.decorators import login_required -from django.core.urlresolvers import reverse +from django.urls import reverse from django.http import ( Http404, HttpResponseForbidden, @@ -313,7 +313,7 @@ def get_queryset(self): if self.q: qs = qs.filter(title__icontains=self.q) - if not user.is_authenticated() or user.is_anonymous: + if not user.is_authenticated or user.is_anonymous: qs = qs.exclude(access='private') elif not user.is_superuser: groups_member_of = user.group_list_all() diff --git a/geonode/invitations/views.py b/geonode/invitations/views.py index 8c615a1e628..c676b7c547d 100644 --- a/geonode/invitations/views.py +++ b/geonode/invitations/views.py @@ -23,7 +23,7 @@ try: from django.urls import reverse except ImportError: - from django.core.urlresolvers import reverse + from django.urls import reverse from django.utils import timezone from django.utils.translation import ugettext as _ from django.contrib.auth.decorators import login_required diff --git a/geonode/layers/forms.py b/geonode/layers/forms.py index c1d7e72b01d..8392a96f07d 100644 --- a/geonode/layers/forms.py +++ b/geonode/layers/forms.py @@ -248,12 +248,12 @@ class NewLayerUploadForm(LayerUploadForm): class LayerDescriptionForm(forms.Form): - title = forms.CharField(300) - abstract = forms.CharField(2000, widget=forms.Textarea, required=False) - supplemental_information = forms.CharField(2000, widget=forms.Textarea, required=False) - data_quality_statement = forms.CharField(2000, widget=forms.Textarea, required=False) - purpose = forms.CharField(500, required=False) - keywords = forms.CharField(500, required=False) + title = forms.CharField(max_length=300, required=True) + abstract = forms.CharField(max_length=2000, widget=forms.Textarea, required=False) + supplemental_information = forms.CharField(max_length=2000, widget=forms.Textarea, required=False) + data_quality_statement = forms.CharField(max_length=2000, widget=forms.Textarea, required=False) + purpose = forms.CharField(max_length=500, required=False) + keywords = forms.CharField(max_length=500, required=False) class LayerAttributeForm(forms.ModelForm): diff --git a/geonode/layers/migrations/0029_layer_service.py b/geonode/layers/migrations/0029_layer_service.py index 99859623e7f..78c7d02d66f 100644 --- a/geonode/layers/migrations/0029_layer_service.py +++ b/geonode/layers/migrations/0029_layer_service.py @@ -15,6 +15,6 @@ class Migration(migrations.Migration): migrations.AddField( model_name='layer', name='service', - field=models.ForeignKey(blank=True, to='services.Service', null=True), + field=models.ForeignKey(blank=True, on_delete=models.CASCADE, to='services.Service', null=True), ), ] diff --git a/geonode/layers/migrations/24_initial.py b/geonode/layers/migrations/24_initial.py index 03c177e4152..a6c76e88bb8 100644 --- a/geonode/layers/migrations/24_initial.py +++ b/geonode/layers/migrations/24_initial.py @@ -40,7 +40,8 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Layer', fields=[ - ('resourcebase_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='base.ResourceBase')), + ('resourcebase_ptr', models.OneToOneField(parent_link=True, on_delete=models.CASCADE, + auto_created=True, primary_key=True, serialize=False, to='base.ResourceBase')), ('title_en', models.CharField(help_text='name by which the cited resource is known', max_length=255, null=True, verbose_name='title')), ('abstract_en', models.TextField(help_text='brief narrative summary of the content of the resource(s)', null=True, verbose_name='abstract', blank=True)), ('purpose_en', models.TextField(help_text='summary of the intentions with which the resource(s) was developed', null=True, verbose_name='purpose', blank=True)), @@ -89,19 +90,20 @@ class Migration(migrations.Migration): ('error', models.TextField(null=True, blank=True)), ('traceback', models.TextField(null=True, blank=True)), ('context', models.TextField(null=True, blank=True)), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), ], ), migrations.AddField( model_name='layerfile', name='upload_session', - field=models.ForeignKey(to='layers.UploadSession'), + field=models.ForeignKey(to='layers.UploadSession', on_delete=models.CASCADE), ), migrations.AddField( model_name='layer', name='default_style', - field=models.ForeignKey(related_name='layer_default_style', blank=True, to='layers.Style', null=True), + field=models.ForeignKey(related_name='layer_default_style', blank=True, + on_delete=models.CASCADE, to='layers.Style', null=True), ), migrations.AddField( model_name='layer', @@ -111,11 +113,11 @@ class Migration(migrations.Migration): migrations.AddField( model_name='layer', name='upload_session', - field=models.ForeignKey(blank=True, to='layers.UploadSession', null=True), + field=models.ForeignKey(blank=True, on_delete=models.CASCADE, to='layers.UploadSession', null=True), ), migrations.AddField( model_name='attribute', name='layer', - field=models.ForeignKey(related_name='attribute_set', to='layers.Layer'), + field=models.ForeignKey(related_name='attribute_set', on_delete=models.CASCADE, to='layers.Layer'), ), ] diff --git a/geonode/layers/models.py b/geonode/layers/models.py index 2840cc64ab4..ec9dd5ee3bc 100644 --- a/geonode/layers/models.py +++ b/geonode/layers/models.py @@ -27,7 +27,7 @@ from django.conf import settings from django.utils.timezone import now from django.utils.translation import ugettext_lazy as _ -from django.core.urlresolvers import reverse +from django.urls import reverse from django.core.files.storage import FileSystemStorage from geonode.base.models import ResourceBase, ResourceBaseManager, resourcebase_post_save from geonode.people.utils import get_valid_user @@ -81,10 +81,10 @@ class Style(models.Model, PermissionLevelMixin): workspace = models.CharField(max_length=255, null=True, blank=True) def __unicode__(self): - return u"%s" % self.name + return u"{0}".format(self.__str__()) def __str__(self): - return self.__unicode__().encode('utf-8') + return "{0}".format(self.name) def absolute_url(self): if self.sld_url: @@ -152,11 +152,11 @@ class Layer(ResourceBase): null=True, blank=True) styles = models.ManyToManyField(Style, related_name='layer_styles') - remote_service = models.ForeignKey("services.Service", null=True, blank=True) + remote_service = models.ForeignKey("services.Service", null=True, blank=True, on_delete=models.CASCADE) charset = models.CharField(max_length=255, default='UTF-8') - upload_session = models.ForeignKey('UploadSession', blank=True, null=True) + upload_session = models.ForeignKey('UploadSession', blank=True, null=True, on_delete=models.CASCADE) def is_vector(self): return self.storeType == 'dataStore' @@ -274,16 +274,10 @@ def attribute_config(self): return cfg def __unicode__(self): - return u"{0}".format(self.alternate) - # if self.alternate is not None: - # return "%s Layer" % self.service_typename.encode('utf-8') - # elif self.name is not None: - # return "%s Layer" % self.name - # else: - # return "Unamed Layer" + return u"{0}".format(self.__str__()) def __str__(self): - return self.__unicode__().encode('utf-8') + return "{0}".format(self.alternate) class Meta: # custom permissions, @@ -331,9 +325,9 @@ class UploadSession(models.Model): """Helper class to keep track of uploads. """ - resource = models.ForeignKey(ResourceBase, blank=True, null=True) + resource = models.ForeignKey(ResourceBase, blank=True, null=True, on_delete=models.CASCADE) date = models.DateTimeField(auto_now=True) - user = models.ForeignKey(settings.AUTH_USER_MODEL) + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) processed = models.BooleanField(default=False) error = models.TextField(blank=True, null=True) traceback = models.TextField(blank=True, null=True) @@ -342,23 +336,23 @@ class UploadSession(models.Model): def successful(self): return self.processed and self.errors is None - def __unicode__(self): + def __str__(self): _s = "[Upload session-id: {}]".format(self.id) try: _s += " - {}".format(self.resource.title) except BaseException: pass - return u"{0}".format(_s) + return "{0}".format(_s) - def __str__(self): - return self.__unicode__().encode('utf-8') + def __unicode__(self): + return u"{0}".format(self.__str__()) class LayerFile(models.Model): """Helper class to store original files. """ - upload_session = models.ForeignKey(UploadSession) + upload_session = models.ForeignKey(UploadSession, on_delete=models.CASCADE) name = models.CharField(max_length=255) base = models.BooleanField(default=False) file = models.FileField( @@ -392,6 +386,7 @@ class Attribute(models.Model): blank=False, null=False, unique=False, + on_delete=models.CASCADE, related_name='attribute_set') attribute = models.CharField( _('attribute name'), @@ -491,9 +486,13 @@ class Attribute(models.Model): objects = AttributeManager() + def __str__(self): + return "{0}".format( + self.attribute_label.encode( + "utf-8", "replace") if self.attribute_label else self.attribute.encode("utf-8", "replace")) + def __unicode__(self): - return "%s" % self.attribute_label.encode( - "utf-8", "replace") if self.attribute_label else self.attribute.encode("utf-8", "replace") + return u"{0}".format(self.__str__()) def unique_values_as_list(self): return self.unique_values.split(',') diff --git a/geonode/layers/tests.py b/geonode/layers/tests.py index 35f0bf06572..9c99b0abf6f 100644 --- a/geonode/layers/tests.py +++ b/geonode/layers/tests.py @@ -34,7 +34,7 @@ from django.core.files.uploadedfile import SimpleUploadedFile from django.forms import ValidationError from django.contrib.contenttypes.models import ContentType -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth.models import Group from django.db.models import Count @@ -416,82 +416,82 @@ def test_get_valid_user(self): def testShapefileValidation(self): files = dict( - base_file=SimpleUploadedFile('foo.shp', ' '), - shx_file=SimpleUploadedFile('foo.shx', ' '), - dbf_file=SimpleUploadedFile('foo.dbf', ' '), - prj_file=SimpleUploadedFile('foo.prj', ' ')) + base_file=SimpleUploadedFile('foo.shp', ' '.encode("UTF-8")), + shx_file=SimpleUploadedFile('foo.shx', ' '.encode("UTF-8")), + dbf_file=SimpleUploadedFile('foo.dbf', ' '.encode("UTF-8")), + prj_file=SimpleUploadedFile('foo.prj', ' '.encode("UTF-8"))) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) files = dict( - base_file=SimpleUploadedFile('foo.SHP', ' '), - shx_file=SimpleUploadedFile('foo.SHX', ' '), - dbf_file=SimpleUploadedFile('foo.DBF', ' '), - prj_file=SimpleUploadedFile('foo.PRJ', ' ')) + base_file=SimpleUploadedFile('foo.SHP', ' '.encode("UTF-8")), + shx_file=SimpleUploadedFile('foo.SHX', ' '.encode("UTF-8")), + dbf_file=SimpleUploadedFile('foo.DBF', ' '.encode("UTF-8")), + prj_file=SimpleUploadedFile('foo.PRJ', ' '.encode("UTF-8"))) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) files = dict( - base_file=SimpleUploadedFile('foo.SHP', ' '), - shx_file=SimpleUploadedFile('foo.shx', ' '), - dbf_file=SimpleUploadedFile('foo.dbf', ' ')) + base_file=SimpleUploadedFile('foo.SHP', ' '.encode("UTF-8")), + shx_file=SimpleUploadedFile('foo.shx', ' '.encode("UTF-8")), + dbf_file=SimpleUploadedFile('foo.dbf', ' '.encode("UTF-8"))) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) files = dict( - base_file=SimpleUploadedFile('foo.SHP', ' '), - shx_file=SimpleUploadedFile('foo.shx', ' '), - dbf_file=SimpleUploadedFile('foo.dbf', ' '), - prj_file=SimpleUploadedFile('foo.PRJ', ' ')) + base_file=SimpleUploadedFile('foo.SHP', ' '.encode("UTF-8")), + shx_file=SimpleUploadedFile('foo.shx', ' '.encode("UTF-8")), + dbf_file=SimpleUploadedFile('foo.dbf', ' '.encode("UTF-8")), + prj_file=SimpleUploadedFile('foo.PRJ', ' '.encode("UTF-8"))) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) files = dict( - base_file=SimpleUploadedFile('foo.SHP', ' '), - shx_file=SimpleUploadedFile('bar.shx', ' '), - dbf_file=SimpleUploadedFile('bar.dbf', ' '), - prj_file=SimpleUploadedFile('bar.PRJ', ' ')) + base_file=SimpleUploadedFile('foo.SHP', ' '.encode("UTF-8")), + shx_file=SimpleUploadedFile('bar.shx', ' '.encode("UTF-8")), + dbf_file=SimpleUploadedFile('bar.dbf', ' '.encode("UTF-8")), + prj_file=SimpleUploadedFile('bar.PRJ', ' '.encode("UTF-8"))) self.assertFalse(LayerUploadForm(dict(), files).is_valid()) files = dict( - base_file=SimpleUploadedFile('foo.shp', ' '), - dbf_file=SimpleUploadedFile('foo.dbf', ' '), - prj_file=SimpleUploadedFile('foo.PRJ', ' ')) + base_file=SimpleUploadedFile('foo.shp', ' '.encode("UTF-8")), + dbf_file=SimpleUploadedFile('foo.dbf', ' '.encode("UTF-8")), + prj_file=SimpleUploadedFile('foo.PRJ', ' '.encode("UTF-8"))) self.assertFalse(LayerUploadForm(dict(), files).is_valid()) files = dict( - base_file=SimpleUploadedFile('foo.txt', ' '), - shx_file=SimpleUploadedFile('foo.shx', ' '), - dbf_file=SimpleUploadedFile('foo.sld', ' '), - prj_file=SimpleUploadedFile('foo.prj', ' ')) + base_file=SimpleUploadedFile('foo.txt', ' '.encode("UTF-8")), + shx_file=SimpleUploadedFile('foo.shx', ' '.encode("UTF-8")), + dbf_file=SimpleUploadedFile('foo.sld', ' '.encode("UTF-8")), + prj_file=SimpleUploadedFile('foo.prj', ' '.encode("UTF-8"))) self.assertFalse(LayerUploadForm(dict(), files).is_valid()) def testGeoTiffValidation(self): - files = dict(base_file=SimpleUploadedFile('foo.tif', ' ')) + files = dict(base_file=SimpleUploadedFile('foo.tif', ' '.encode("UTF-8"))) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) - files = dict(base_file=SimpleUploadedFile('foo.TIF', ' ')) + files = dict(base_file=SimpleUploadedFile('foo.TIF', ' '.encode("UTF-8"))) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) - files = dict(base_file=SimpleUploadedFile('foo.tiff', ' ')) + files = dict(base_file=SimpleUploadedFile('foo.tiff', ' '.encode("UTF-8"))) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) - files = dict(base_file=SimpleUploadedFile('foo.TIF', ' ')) + files = dict(base_file=SimpleUploadedFile('foo.TIF', ' '.encode("UTF-8"))) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) - files = dict(base_file=SimpleUploadedFile('foo.geotif', ' ')) + files = dict(base_file=SimpleUploadedFile('foo.geotif', ' '.encode("UTF-8"))) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) - files = dict(base_file=SimpleUploadedFile('foo.GEOTIF', ' ')) + files = dict(base_file=SimpleUploadedFile('foo.GEOTIF', ' '.encode("UTF-8"))) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) - files = dict(base_file=SimpleUploadedFile('foo.geotiff', ' ')) + files = dict(base_file=SimpleUploadedFile('foo.geotiff', ' '.encode("UTF-8"))) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) - files = dict(base_file=SimpleUploadedFile('foo.GEOTIF', ' ')) + files = dict(base_file=SimpleUploadedFile('foo.GEOTIF', ' '.encode("UTF-8"))) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) def testASCIIValidation(self): - files = dict(base_file=SimpleUploadedFile('foo.asc', ' ')) + files = dict(base_file=SimpleUploadedFile('foo.asc', ' '.encode("UTF-8"))) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) - files = dict(base_file=SimpleUploadedFile('foo.ASC', ' ')) + files = dict(base_file=SimpleUploadedFile('foo.ASC', ' '.encode("UTF-8"))) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) def testZipValidation(self): @@ -503,16 +503,17 @@ def testZipValidation(self): the_zip.writestr('foo.shx', in_memory_file.getvalue()) the_zip.writestr('foo.prj', in_memory_file.getvalue()) the_zip.close() - files = dict(base_file=SimpleUploadedFile('test_upload.zip', open('test_upload.zip').read())) + files = dict(base_file=SimpleUploadedFile('test_upload.zip', + open('test_upload.zip').read().encode("UTF-8"))) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) os.remove('test_upload.zip') def testWriteFiles(self): files = dict( - base_file=SimpleUploadedFile('foo.shp', ' '), - shx_file=SimpleUploadedFile('foo.shx', ' '), - dbf_file=SimpleUploadedFile('foo.dbf', ' '), - prj_file=SimpleUploadedFile('foo.prj', ' ')) + base_file=SimpleUploadedFile('foo.shp', ' '.encode("UTF-8")), + shx_file=SimpleUploadedFile('foo.shx', ' '.encode("UTF-8")), + dbf_file=SimpleUploadedFile('foo.dbf', ' '.encode("UTF-8")), + prj_file=SimpleUploadedFile('foo.prj', ' '.encode("UTF-8"))) form = LayerUploadForm(dict(), files) self.assertTrue(form.is_valid()) @@ -528,7 +529,8 @@ def testWriteFiles(self): the_zip.writestr('foo.shx', in_memory_file.getvalue()) the_zip.writestr('foo.prj', in_memory_file.getvalue()) the_zip.close() - files = dict(base_file=SimpleUploadedFile('test_upload.zip', open('test_upload.zip').read())) + files = dict(base_file=SimpleUploadedFile('test_upload.zip', + open('test_upload.zip').read().encode("UTF-8"))) form = LayerUploadForm(dict(), files) self.assertTrue(form.is_valid()) tempdir = form.write_files()[0] @@ -724,10 +726,10 @@ def test_get_valid_layer_name(self): # any files with empty bodies. # # That is, this leads to mysterious test failures: - # SimpleUploadedFile('foo', '') + # SimpleUploadedFile('foo', ' '.encode("UTF-8")) # # And this should be used instead to avoid that: - # SimpleUploadedFile('foo', ' ') + # SimpleUploadedFile('foo', ' '.encode("UTF-8")) def testJSONField(self): field = JSONField() @@ -1289,16 +1291,20 @@ def test_geonode_rest_layer_uploader(self): files = dict( base_file=SimpleUploadedFile( '%s.shp' % thelayer_name, - open(os.path.join(thelayer_path, '%s.shp' % thelayer_name)).read()), + open(os.path.join(thelayer_path, + '%s.shp' % thelayer_name)).read().encode("UTF-8")), shx_file=SimpleUploadedFile( '%s.shx' % thelayer_name, - open(os.path.join(thelayer_path, '%s.shx' % thelayer_name)).read()), + open(os.path.join(thelayer_path, + '%s.shx' % thelayer_name)).read().encode("UTF-8")), dbf_file=SimpleUploadedFile( '%s.dbf' % thelayer_name, - open(os.path.join(thelayer_path, '%s.dbf' % thelayer_name)).read()), + open(os.path.join(thelayer_path, + '%s.dbf' % thelayer_name)).read().encode("UTF-8")), prj_file=SimpleUploadedFile( '%s.prj' % thelayer_name, - open(os.path.join(thelayer_path, '%s.prj' % thelayer_name)).read()) + open(os.path.join(thelayer_path, + '%s.prj' % thelayer_name)).read().encode("UTF-8")) ) files['permissions'] = '{}' files['charset'] = 'windows-1258' diff --git a/geonode/layers/utils.py b/geonode/layers/utils.py index a8c83bba422..99c0430808c 100644 --- a/geonode/layers/utils.py +++ b/geonode/layers/utils.py @@ -147,10 +147,10 @@ def get_files(filename): # Verify if the filename is in ascii format. try: - filename.decode('ascii') + filename except UnicodeEncodeError: msg = "Please use only characters from the english alphabet for the filename. '%s' is not yet supported." \ - % os.path.basename(filename).encode('UTF-8') + % os.path.basename(filename).encode('UTF-8', 'strict') raise GeoNodeException(msg) # Let's unzip the filname in case it is a ZIP file @@ -1074,7 +1074,7 @@ def create_thumbnail(instance, thumbnail_remote_url, thumbnail_create_url=None, 'PASSWORD' in _ogc_server_settings else 'geoserver' import base64 valid_uname_pw = base64.b64encode( - b"%s:%s" % (_user, _pwd)).decode("ascii") + ("%s:%s" % (_user, _pwd)).encode("UTF-8")).decode("ascii") headers['Authorization'] = 'Basic {}'.format(valid_uname_pw) resp, image = ogc_client.request(thumbnail_create_url, headers=headers) if 'ServiceException' in image or \ diff --git a/geonode/layers/views.py b/geonode/layers/views.py index b212e14369a..65026341b43 100644 --- a/geonode/layers/views.py +++ b/geonode/layers/views.py @@ -48,7 +48,7 @@ from django.contrib import messages from django.contrib.auth.decorators import login_required from django.contrib.auth import get_user_model -from django.core.urlresolvers import reverse +from django.urls import reverse from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import render from django.conf import settings @@ -716,7 +716,7 @@ def sld_definition(style): logger.error( "Possible error with OWSLib. Turning all available properties to string") # maps owned by user needed to fill the "add to existing map section" in template - if request.user.is_authenticated(): + if request.user.is_authenticated: context_dict["maps"] = Map.objects.filter(owner=request.user) if getattr(settings, 'FAVORITE_ENABLED', False): from geonode.favorite.utils import get_favorite_info diff --git a/geonode/maps/migrations/24_initial.py b/geonode/maps/migrations/24_initial.py index 459d4140995..dabda9eddac 100644 --- a/geonode/maps/migrations/24_initial.py +++ b/geonode/maps/migrations/24_initial.py @@ -17,7 +17,8 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Map', fields=[ - ('resourcebase_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='base.ResourceBase')), + ('resourcebase_ptr', models.OneToOneField(parent_link=True, on_delete=models.CASCADE, + auto_created=True, primary_key=True, serialize=False, to='base.ResourceBase')), ('title_en', models.CharField(help_text='name by which the cited resource is known', max_length=255, null=True, verbose_name='title')), ('abstract_en', models.TextField(help_text='brief narrative summary of the content of the resource(s)', null=True, verbose_name='abstract', blank=True)), ('purpose_en', models.TextField(help_text='summary of the intentions with which the resource(s) was developed', null=True, verbose_name='purpose', blank=True)), @@ -54,7 +55,7 @@ class Migration(migrations.Migration): ('layer_params', models.TextField(verbose_name='layer params')), ('source_params', models.TextField(verbose_name='source params')), ('local', models.BooleanField(default=False)), - ('map', models.ForeignKey(related_name='layer_set', to='maps.Map')), + ('map', models.ForeignKey(related_name='layer_set', to='maps.Map', on_delete=models.CASCADE)), ], options={ 'ordering': ['stack_order'], @@ -67,8 +68,8 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('config', models.TextField(verbose_name='JSON Configuration')), ('created_dttm', models.DateTimeField(auto_now_add=True)), - ('map', models.ForeignKey(related_name='snapshot_set', to='maps.Map')), - ('user', models.ForeignKey(blank=True, to=settings.AUTH_USER_MODEL, null=True)), + ('map', models.ForeignKey(related_name='snapshot_set', to='maps.Map', on_delete=models.CASCADE)), + ('user', models.ForeignKey(blank=True, to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)), ], ), ] diff --git a/geonode/maps/models.py b/geonode/maps/models.py index 0d1d21c29e6..6f068c9d982 100644 --- a/geonode/maps/models.py +++ b/geonode/maps/models.py @@ -28,7 +28,7 @@ from django.contrib.contenttypes.models import ContentType from django.utils.translation import ugettext_lazy as _ from django.core.exceptions import ObjectDoesNotExist -from django.core.urlresolvers import reverse +from django.urls import reverse from django.template.defaultfilters import slugify from django.core.cache import cache @@ -89,10 +89,13 @@ class Map(ResourceBase, GXPMapBase): blank=True) # Full URL for featured map view, ie http://domain/someview - def __unicode__(self): + def __str__(self): return '%s by %s' % ( self.title, (self.owner.username if self.owner else "")) + def __unicode__(self): + return u"{0}".format(self.__str__()) + @property def center(self): """ @@ -416,7 +419,7 @@ class MapLayer(models.Model, GXPLayerBase): and the file format to use for image tiles. """ - map = models.ForeignKey(Map, related_name="layer_set") + map = models.ForeignKey(Map, related_name="layer_set", on_delete=models.CASCADE) # The map containing this layer stack_order = models.IntegerField(_('stack order')) @@ -565,9 +568,12 @@ def local_link(self): class Meta: ordering = ["stack_order"] - def __unicode__(self): + def __str__(self): return '%s?layers=%s' % (self.ows_url, self.name) + def __unicode__(self): + return u"{0}".format(self.__str__()) + def pre_delete_map(instance, sender, **kwrargs): ct = ContentType.objects.get_for_model(instance) @@ -578,7 +584,7 @@ def pre_delete_map(instance, sender, **kwrargs): class MapSnapshot(models.Model): - map = models.ForeignKey(Map, related_name="snapshot_set") + map = models.ForeignKey(Map, related_name="snapshot_set", on_delete=models.CASCADE) """ The ID of the map this snapshot was generated from. """ @@ -593,7 +599,7 @@ class MapSnapshot(models.Model): The date/time the snapshot was created. """ - user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True) + user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.CASCADE) """ The user who created the snapshot. """ diff --git a/geonode/maps/qgis_server_views.py b/geonode/maps/qgis_server_views.py index 22d75d221a1..bca7a0b68eb 100644 --- a/geonode/maps/qgis_server_views.py +++ b/geonode/maps/qgis_server_views.py @@ -28,7 +28,7 @@ from django.core.serializers.json import DjangoJSONEncoder from django.views.decorators.clickjacking import xframe_options_exempt from django.utils.decorators import method_decorator -from django.core.urlresolvers import reverse +from django.urls import reverse from django.shortcuts import render from django.http import HttpResponse @@ -426,7 +426,7 @@ def get_context_data(self, **kwargs): _PERMISSION_MSG_VIEW) if request.method == 'POST': - if not request.user.is_authenticated(): + if not request.user.is_authenticated: return self.render_to_response( 'You must be logged in to save new maps', content_type="text/plain", diff --git a/geonode/maps/tests.py b/geonode/maps/tests.py index 07e54ac79a8..64c42984a28 100644 --- a/geonode/maps/tests.py +++ b/geonode/maps/tests.py @@ -24,7 +24,7 @@ from datetime import datetime from defusedxml import lxml as dlxml -from django.core.urlresolvers import reverse +from django.urls import reverse import json diff --git a/geonode/maps/views.py b/geonode/maps/views.py index 0e4f7459b72..91becf2ad39 100644 --- a/geonode/maps/views.py +++ b/geonode/maps/views.py @@ -35,7 +35,7 @@ from django.contrib.auth.decorators import login_required from django.core.exceptions import ObjectDoesNotExist -from django.core.urlresolvers import reverse +from django.urls import reverse from django.shortcuts import redirect from django.core.serializers.json import DjangoJSONEncoder from django.http import HttpResponse, HttpResponseRedirect, HttpResponseNotAllowed, HttpResponseServerError, Http404 @@ -180,7 +180,7 @@ def map_detail(request, mapid, snapshot=None, template='maps/map_detail.html'): if settings.SOCIAL_ORIGINS: context_dict["social_links"] = build_social_links(request, map_obj) - if request.user.is_authenticated(): + if request.user.is_authenticated: if getattr(settings, 'FAVORITE_ENABLED', False): from geonode.favorite.utils import get_favorite_info context_dict["favorite_info"] = get_favorite_info(request.user, map_obj) @@ -634,7 +634,7 @@ def map_json(request, mapid, snapshot=None): json.dumps( map_obj.viewer_json(request))) elif request.method == 'PUT': - if not request.user.is_authenticated(): + if not request.user.is_authenticated: return HttpResponse( _PERMISSION_MSG_LOGIN, status=401, @@ -751,7 +751,7 @@ def new_map_json(request): else: return HttpResponse(config) elif request.method == 'POST': - if not request.user.is_authenticated(): + if not request.user.is_authenticated: return HttpResponse( 'You must be logged in to save new maps', content_type="text/plain", @@ -809,7 +809,7 @@ def new_map_config(request): map_obj.abstract = DEFAULT_ABSTRACT map_obj.title = DEFAULT_TITLE - if request.user.is_authenticated(): + if request.user.is_authenticated: map_obj.owner = request.user config = map_obj.viewer_json(request) diff --git a/geonode/monitoring/middleware.py b/geonode/monitoring/middleware.py index b8bedf00b72..85eda265727 100644 --- a/geonode/monitoring/middleware.py +++ b/geonode/monitoring/middleware.py @@ -42,9 +42,13 @@ class MonitoringMiddleware(object): - def __init__(self): + def __init__(self, get_response): + self.get_response = get_response self.setup_logging() + def __call__(self, request): + return self.get_response(request) + def setup_logging(self): self.log = logging.getLogger('{}.catcher'.format(__name__)) self.log.propagate = False @@ -124,7 +128,7 @@ def process_request(self, request): if settings.USER_ANALYTICS_ENABLED: meta.update({ 'user_identifier': hashlib.sha256(request.session.session_key or '').hexdigest(), - 'user_username': request.user.username if request.user.is_authenticated() else 'AnonymousUser' + 'user_username': request.user.username if request.user.is_authenticated else 'AnonymousUser' }) request._monitoring = meta diff --git a/geonode/monitoring/migrations/0001_monitoring_init.py b/geonode/monitoring/migrations/0001_monitoring_init.py index dea3ef711a2..bfdc5910ada 100644 --- a/geonode/monitoring/migrations/0001_monitoring_init.py +++ b/geonode/monitoring/migrations/0001_monitoring_init.py @@ -55,7 +55,7 @@ class Migration(migrations.Migration): ('value_num', models.DecimalField(default=None, null=True, max_digits=16, decimal_places=4, blank=True)), ('value_raw', models.TextField(default=None, null=True, blank=True)), ('data', jsonfield.fields.JSONField(default={})), - ('label', models.ForeignKey(to='monitoring.MetricLabel')), + ('label', models.ForeignKey(to='monitoring.MetricLabel', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -102,7 +102,7 @@ class Migration(migrations.Migration): ('active', models.BooleanField(default=True)), ('notes', models.TextField(null=True, blank=True)), ('url', models.URLField(default='', null=True, blank=True)), - ('host', models.ForeignKey(to='monitoring.Host')), + ('host', models.ForeignKey(to='monitoring.Host', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -116,19 +116,19 @@ class Migration(migrations.Migration): name='ServiceTypeMetric', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('metric', models.ForeignKey(to='monitoring.Metric')), - ('service_type', models.ForeignKey(to='monitoring.ServiceType')), + ('metric', models.ForeignKey(to='monitoring.Metric', on_delete=models.CASCADE)), + ('service_type', models.ForeignKey(to='monitoring.ServiceType', on_delete=models.CASCADE)), ], ), migrations.AddField( model_name='service', name='service_type', - field=models.ForeignKey(to='monitoring.ServiceType'), + field=models.ForeignKey(to='monitoring.ServiceType', on_delete=models.CASCADE), ), migrations.AddField( model_name='requestevent', name='service', - field=models.ForeignKey(to='monitoring.Service'), + field=models.ForeignKey(to='monitoring.Service', on_delete=models.CASCADE), ), migrations.AlterUniqueTogether( name='monitoredresource', @@ -137,26 +137,26 @@ class Migration(migrations.Migration): migrations.AddField( model_name='metricvalue', name='resource', - field=models.ForeignKey(to='monitoring.MonitoredResource'), + field=models.ForeignKey(to='monitoring.MonitoredResource', on_delete=models.CASCADE), ), migrations.AddField( model_name='metricvalue', name='service', - field=models.ForeignKey(to='monitoring.Service'), + field=models.ForeignKey(to='monitoring.Service', on_delete=models.CASCADE), ), migrations.AddField( model_name='metricvalue', name='service_metric', - field=models.ForeignKey(to='monitoring.ServiceTypeMetric'), + field=models.ForeignKey(to='monitoring.ServiceTypeMetric', on_delete=models.CASCADE), ), migrations.AddField( model_name='exceptionevent', name='request', - field=models.ForeignKey(to='monitoring.RequestEvent'), + field=models.ForeignKey(to='monitoring.RequestEvent', on_delete=models.CASCADE), ), migrations.AddField( model_name='exceptionevent', name='service', - field=models.ForeignKey(to='monitoring.Service'), + field=models.ForeignKey(to='monitoring.Service', on_delete=models.CASCADE), ), ] diff --git a/geonode/monitoring/migrations/0004_monitoring_metric_type.py b/geonode/monitoring/migrations/0004_monitoring_metric_type.py index 08e0e765768..78693455f87 100644 --- a/geonode/monitoring/migrations/0004_monitoring_metric_type.py +++ b/geonode/monitoring/migrations/0004_monitoring_metric_type.py @@ -19,12 +19,13 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='exceptionevent', name='request', - field=models.ForeignKey(related_name='exceptions', to='monitoring.RequestEvent'), + field=models.ForeignKey(related_name='exceptions', to='monitoring.RequestEvent', on_delete=models.CASCADE), ), migrations.AlterField( model_name='metricvalue', name='resource', - field=models.ForeignKey(related_name='metric_values', to='monitoring.MonitoredResource'), + field=models.ForeignKey(related_name='metric_values', + to='monitoring.MonitoredResource', on_delete=models.CASCADE), ), migrations.AlterField( model_name='requestevent', @@ -34,11 +35,11 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='servicetypemetric', name='metric', - field=models.ForeignKey(related_name='service_type', to='monitoring.Metric'), + field=models.ForeignKey(related_name='service_type', to='monitoring.Metric', on_delete=models.CASCADE), ), migrations.AlterField( model_name='servicetypemetric', name='service_type', - field=models.ForeignKey(related_name='metric', to='monitoring.ServiceType'), + field=models.ForeignKey(related_name='metric', to='monitoring.ServiceType', on_delete=models.CASCADE), ), ] diff --git a/geonode/monitoring/migrations/0005_monitoring_ows_service.py b/geonode/monitoring/migrations/0005_monitoring_ows_service.py index 951b47598de..d459d03e5c0 100644 --- a/geonode/monitoring/migrations/0005_monitoring_ows_service.py +++ b/geonode/monitoring/migrations/0005_monitoring_ows_service.py @@ -25,17 +25,18 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='metricvalue', name='label', - field=models.ForeignKey(related_name='metric_values', to='monitoring.MetricLabel'), + field=models.ForeignKey(related_name='metric_values', + to='monitoring.MetricLabel', on_delete=models.CASCADE), ), migrations.AddField( model_name='metricvalue', name='ows_service', - field=models.ForeignKey(blank=True, to='monitoring.OWSService', null=True), + field=models.ForeignKey(blank=True, to='monitoring.OWSService', on_delete=models.CASCADE, null=True), ), migrations.AddField( model_name='requestevent', name='ows_service', - field=models.ForeignKey(blank=True, to='monitoring.OWSService', null=True), + field=models.ForeignKey(blank=True, to='monitoring.OWSService', on_delete=models.CASCADE, null=True), ), migrations.AlterUniqueTogether( name='metricvalue', diff --git a/geonode/monitoring/migrations/0008_monitoring_notifications_check.py b/geonode/monitoring/migrations/0008_monitoring_notifications_check.py index aceafe1c446..454e272cf31 100644 --- a/geonode/monitoring/migrations/0008_monitoring_notifications_check.py +++ b/geonode/monitoring/migrations/0008_monitoring_notifications_check.py @@ -22,8 +22,8 @@ class Migration(migrations.Migration): ('max_value', models.DecimalField(default=None, null=True, max_digits=16, decimal_places=4, blank=True)), ('max_timeout', models.DurationField(help_text='Max timeout for given metric before error should be raised', null=True, blank=True)), ('active', models.BooleanField(default=True)), - ('label', models.ForeignKey(blank=True, to='monitoring.MetricLabel', null=True)), - ('metric', models.ForeignKey(related_name='checks', to='monitoring.Metric')), + ('label', models.ForeignKey(blank=True, to='monitoring.MetricLabel', on_delete=models.CASCADE, null=True)), + ('metric', models.ForeignKey(related_name='checks', to='monitoring.Metric', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -38,26 +38,26 @@ class Migration(migrations.Migration): migrations.AddField( model_name='metricnotificationcheck', name='notification_check', - field=models.ForeignKey(related_name='checks', to='monitoring.NotificationCheck'), + field=models.ForeignKey(related_name='checks', to='monitoring.NotificationCheck', on_delete=models.CASCADE), ), migrations.AddField( model_name='metricnotificationcheck', name='ows_service', - field=models.ForeignKey(blank=True, to='monitoring.OWSService', null=True), + field=models.ForeignKey(blank=True, to='monitoring.OWSService', on_delete=models.CASCADE, null=True), ), migrations.AddField( model_name='metricnotificationcheck', name='resource', - field=models.ForeignKey(blank=True, to='monitoring.MonitoredResource', null=True), + field=models.ForeignKey(blank=True, to='monitoring.MonitoredResource', on_delete=models.CASCADE, null=True), ), migrations.AddField( model_name='metricnotificationcheck', name='service', - field=models.ForeignKey(related_name='checks', to='monitoring.Service'), + field=models.ForeignKey(related_name='checks', to='monitoring.Service', on_delete=models.CASCADE), ), migrations.AddField( model_name='metricnotificationcheck', name='user', - field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE), ), ] diff --git a/geonode/monitoring/migrations/0010_metric_unit.py b/geonode/monitoring/migrations/0010_metric_unit.py index a7ebc7f59ec..98cd0958704 100644 --- a/geonode/monitoring/migrations/0010_metric_unit.py +++ b/geonode/monitoring/migrations/0010_metric_unit.py @@ -19,7 +19,8 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='metricvalue', name='ows_service', - field=models.ForeignKey(related_name='metric_values', blank=True, to='monitoring.OWSService', null=True), + field=models.ForeignKey(related_name='metric_values', blank=True, + to='monitoring.OWSService', on_delete=models.CASCADE, null=True), ), migrations.AlterField( model_name='owsservice', diff --git a/geonode/monitoring/migrations/0011_notification_def.py b/geonode/monitoring/migrations/0011_notification_def.py index 40b4f02e379..9aeb90b3333 100644 --- a/geonode/monitoring/migrations/0011_notification_def.py +++ b/geonode/monitoring/migrations/0011_notification_def.py @@ -31,17 +31,19 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='metricnotificationcheck', name='user', - field=models.ForeignKey(related_name='monitoring_checks', to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(related_name='monitoring_checks', + to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE), ), migrations.AddField( model_name='notificationmetricdefinition', name='metric', - field=models.ForeignKey(related_name='+', to='monitoring.Metric'), + field=models.ForeignKey(related_name='+', to='monitoring.Metric', on_delete=models.CASCADE), ), migrations.AddField( model_name='notificationmetricdefinition', name='notification_check', - field=models.ForeignKey(related_name='definitions', to='monitoring.NotificationCheck'), + field=models.ForeignKey(related_name='definitions', + to='monitoring.NotificationCheck', on_delete=models.CASCADE), ), migrations.AddField( model_name='notificationcheck', diff --git a/geonode/monitoring/migrations/0012_notifications_service.py b/geonode/monitoring/migrations/0012_notifications_service.py index 27eb552bbac..676505fdc79 100644 --- a/geonode/monitoring/migrations/0012_notifications_service.py +++ b/geonode/monitoring/migrations/0012_notifications_service.py @@ -19,6 +19,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='metricnotificationcheck', name='service', - field=models.ForeignKey(related_name='checks', blank=True, to='monitoring.Service', null=True), + field=models.ForeignKey(related_name='checks', blank=True, to='monitoring.Service', + on_delete=models.CASCADE, null=True), ), ] diff --git a/geonode/monitoring/migrations/0014_notifications_emails.py b/geonode/monitoring/migrations/0014_notifications_emails.py index a4012e9d6c5..0b3a815dea5 100644 --- a/geonode/monitoring/migrations/0014_notifications_emails.py +++ b/geonode/monitoring/migrations/0014_notifications_emails.py @@ -18,8 +18,9 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('email', models.EmailField(max_length=254, null=True, blank=True)), - ('notification_check', models.ForeignKey(related_name='receivers', to='monitoring.NotificationCheck')), - ('user', models.ForeignKey(blank=True, to=settings.AUTH_USER_MODEL, null=True)), + ('notification_check', models.ForeignKey(related_name='receivers', + to='monitoring.NotificationCheck', on_delete=models.CASCADE)), + ('user', models.ForeignKey(blank=True, to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)), ], ), migrations.RemoveField( diff --git a/geonode/monitoring/migrations/0015_notification_grace_period.py b/geonode/monitoring/migrations/0015_notification_grace_period.py index 50a98dd0f34..7d89d592625 100644 --- a/geonode/monitoring/migrations/0015_notification_grace_period.py +++ b/geonode/monitoring/migrations/0015_notification_grace_period.py @@ -25,6 +25,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='notificationmetricdefinition', name='metric', - field=models.ForeignKey(related_name='notification_checks', to='monitoring.Metric'), + field=models.ForeignKey(related_name='notification_checks', + to='monitoring.Metric', on_delete=models.CASCADE), ), ] diff --git a/geonode/monitoring/migrations/0019_notification_check_def_link.py b/geonode/monitoring/migrations/0019_notification_check_def_link.py index 2311c652eaa..ba47afeb7cd 100644 --- a/geonode/monitoring/migrations/0019_notification_check_def_link.py +++ b/geonode/monitoring/migrations/0019_notification_check_def_link.py @@ -15,7 +15,8 @@ class Migration(migrations.Migration): migrations.AddField( model_name='metricnotificationcheck', name='definition', - field=models.OneToOneField(related_name='metric_check', null=True, to='monitoring.NotificationMetricDefinition'), + field=models.OneToOneField(related_name='metric_check', on_delete=models.CASCADE, + null=True, to='monitoring.NotificationMetricDefinition'), ), migrations.AlterField( model_name='notificationcheck', diff --git a/geonode/monitoring/migrations/0029_auto_20200115_1121.py b/geonode/monitoring/migrations/0029_auto_20200115_1121.py new file mode 100644 index 00000000000..41bae1a03ec --- /dev/null +++ b/geonode/monitoring/migrations/0029_auto_20200115_1121.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.9 on 2020-01-15 11:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('monitoring', '0028_auto_20190830_1018'), + ] + + operations = [ + migrations.AlterField( + model_name='metricnotificationcheck', + name='definition', + field=models.OneToOneField(null=True, on_delete='CASCASE', related_name='metric_check', to='monitoring.NotificationMetricDefinition'), + ), + ] diff --git a/geonode/monitoring/models.py b/geonode/monitoring/models.py index 21082f8acfb..709dca38c94 100644 --- a/geonode/monitoring/models.py +++ b/geonode/monitoring/models.py @@ -40,7 +40,7 @@ from jsonfield import JSONField from django.utils.translation import ugettext_noop as _ -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth import get_user_model try: @@ -88,9 +88,12 @@ class Host(models.Model): ip = models.GenericIPAddressField(null=False, blank=False) active = models.BooleanField(null=False, blank=False, default=True) - def __unicode__(self): + def __str__(self): return 'Host: {} ({})'.format(self.name, self.ip) + def __unicode__(self): + return u"{0}".format(self.__str__()) + class ServiceType(models.Model): @@ -114,9 +117,12 @@ class ServiceType(models.Model): null=False, choices=TYPES) - def __unicode__(self): + def __str__(self): return 'Service Type: {}'.format(self.name) + def __unicode__(self): + return u"{0}".format(self.__str__()) + @property def is_system_monitor(self): return self.name in (self.TYPE_HOST_GN, self.TYPE_HOST_GS,) @@ -132,18 +138,21 @@ class Service(models.Model): unique=True, blank=False, null=False) - host = models.ForeignKey(Host, null=False) + host = models.ForeignKey(Host, null=False, on_delete=models.CASCADE) check_interval = models.DurationField( null=False, blank=False, default=timedelta(seconds=60)) last_check = models.DateTimeField(null=True, blank=True, auto_now_add=True) - service_type = models.ForeignKey(ServiceType, null=False) + service_type = models.ForeignKey(ServiceType, null=False, on_delete=models.CASCADE) active = models.BooleanField(null=False, blank=False, default=True) notes = models.TextField(null=True, blank=True) url = models.URLField(null=True, blank=True, default='') - def __unicode__(self): + def __str__(self): return 'Service: {}@{}'.format(self.name, self.host.name) + def __unicode__(self): + return u"{0}".format(self.__str__()) + def get_metrics(self): return [m.metric for m in self.service_type.metric.all()] @@ -196,9 +205,12 @@ class MonitoredResource(models.Model): class Meta: unique_together = (('name', 'type',),) - def __unicode__(self): + def __str__(self): return 'Monitored Resource: {} {}'.format(self.name, self.type) + def __unicode__(self): + return u"{0}".format(self.__str__()) + @classmethod def get(cls, resource_type, resource_name, or_create=False): if or_create: @@ -287,7 +299,7 @@ def get_aggregate_field(self): def get_aggregate_name(self): return self.AGGREGATE_MAP[self.type] - def __unicode__(self): + def __unicode__de__(self): return "Metric: {}".format(self.name) @property @@ -322,12 +334,15 @@ def get_for(cls, name, service=None): class ServiceTypeMetric(models.Model): - service_type = models.ForeignKey(ServiceType, related_name='metric') - metric = models.ForeignKey(Metric, related_name='service_type') + service_type = models.ForeignKey(ServiceType, related_name='metric', on_delete=models.CASCADE) + metric = models.ForeignKey(Metric, related_name='service_type', on_delete=models.CASCADE) - def __unicode__(self): + def __str__(self): return '{} - {}'.format(self.service_type, self.metric) + def __unicode__(self): + return u"{0}".format(self.__str__()) + class EventType(models.Model): _ows_types = 'tms wms-c wmts wcs wfs wms wps'.upper().split(' ') @@ -372,9 +387,12 @@ class EventType(models.Model): null=False, blank=False) - def __unicode__(self): + def __str__(self): return 'Event Type: {}'.format(self.name) + def __unicode__(self): + return u"{0}".format(self.__str__()) + @classmethod def get(cls, service_name=None): if not service_name: @@ -417,8 +435,8 @@ class RequestEvent(models.Model): METHODS = list(zip(_methods, _methods)) created = models.DateTimeField(db_index=True, null=False) received = models.DateTimeField(db_index=True, null=False) - service = models.ForeignKey(Service) - event_type = models.ForeignKey(EventType, blank=True, null=True) + service = models.ForeignKey(Service, on_delete=models.CASCADE) + event_type = models.ForeignKey(EventType, blank=True, null=True, on_delete=models.CASCADE) host = models.CharField(max_length=255, blank=True, default='') request_path = models.TextField(blank=False, default='') @@ -561,7 +579,7 @@ def _get_user_agent(cls, ua): @classmethod def _get_user_consent(cls, request): return settings.USER_ANALYTICS_ENABLED - # if request.user.is_authenticated(): + # if request.user.is_authenticated: # return request.user.allow_analytics # return True @@ -822,11 +840,11 @@ def from_geoserver(cls, service, request_data, received=None): class ExceptionEvent(models.Model): created = models.DateTimeField(db_index=True, null=False) received = models.DateTimeField(db_index=True, null=False) - service = models.ForeignKey(Service) + service = models.ForeignKey(Service, on_delete=models.CASCADE) error_type = models.CharField(max_length=255, null=False, db_index=True) error_message = models.CharField(max_length=255, null=False, default='') error_data = models.TextField(null=False, default='') - request = models.ForeignKey(RequestEvent, related_name='exceptions') + request = models.ForeignKey(RequestEvent, related_name='exceptions', on_delete=models.CASCADE) @classmethod def add_error(cls, from_service, error_type, stack_trace, @@ -900,26 +918,28 @@ class MetricLabel(models.Model): null=True, blank=True) - def __unicode__(self): + def __unicode__de__(self): return 'Metric Label: {}'.format(self.name.encode('ascii', 'ignore')) class MetricValue(models.Model): valid_from = models.DateTimeField(db_index=True, null=False) valid_to = models.DateTimeField(db_index=True, null=False) - service_metric = models.ForeignKey(ServiceTypeMetric) - service = models.ForeignKey(Service) + service_metric = models.ForeignKey(ServiceTypeMetric, on_delete=models.CASCADE) + service = models.ForeignKey(Service, on_delete=models.CASCADE) event_type = models.ForeignKey( EventType, null=True, blank=True, + on_delete=models.CASCADE, related_name='metric_values') resource = models.ForeignKey( MonitoredResource, null=True, blank=True, + on_delete=models.CASCADE, related_name='metric_values') - label = models.ForeignKey(MetricLabel, related_name='metric_values') + label = models.ForeignKey(MetricLabel, related_name='metric_values', on_delete=models.CASCADE) value = models.CharField(max_length=255, null=False, blank=False) value_num = models.DecimalField( max_digits=20, @@ -943,7 +963,7 @@ class Meta: 'event_type', )) - def __unicode__(self): + def __str__(self): metric = self.service_metric.metric.name if self.label: _l = self.label.name @@ -957,6 +977,9 @@ def __unicode__(self): return 'Metric Value: {}: [{}] (since {} until {})'.format( metric, self.value, self.valid_from, self.valid_to) + def __unicode__(self): + return u"{0}".format(self.__str__()) + @classmethod def add(cls, metric, valid_from, valid_to, service, label, value_raw=None, resource=None, @@ -1123,9 +1146,12 @@ class NotificationCheck(models.Model): blank=False, help_text=_("Is it active")) - def __unicode__(self): + def __str__(self): return "Notification Check #{}: {}".format(self.id, self.name) + def __unicode__(self): + return u"{0}".format(self.__str__()) + @property def notification_subject(self): return _("{}: {}").format(self.severity, self.name) @@ -1379,8 +1405,8 @@ def get_definition_for(self, def_name): class NotificationReceiver(models.Model): notification_check = models.ForeignKey( - NotificationCheck, related_name='receivers') - user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True) + NotificationCheck, related_name='receivers', on_delete=models.CASCADE) + user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.CASCADE) email = models.EmailField(null=True, blank=True) def save(self, *args, **kwargs): @@ -1399,8 +1425,8 @@ class NotificationMetricDefinition(models.Model): (FIELD_OPTION_MAX_TIMEOUT, _("Last update must not be older than"),)) notification_check = models.ForeignKey( - NotificationCheck, related_name='definitions') - metric = models.ForeignKey(Metric, related_name='notification_checks') + NotificationCheck, related_name='definitions', on_delete=models.CASCADE) + metric = models.ForeignKey(Metric, related_name='notification_checks', on_delete=models.CASCADE) use_service = models.BooleanField(null=False, default=False) use_resource = models.BooleanField(null=False, default=False) use_label = models.BooleanField(null=False, default=False) @@ -1521,16 +1547,17 @@ def populate_min_max(self): class MetricNotificationCheck(models.Model): notification_check = models.ForeignKey( - NotificationCheck, related_name="checks") - metric = models.ForeignKey(Metric, related_name="checks") + NotificationCheck, related_name="checks", on_delete=models.CASCADE) + metric = models.ForeignKey(Metric, related_name="checks", on_delete=models.CASCADE) service = models.ForeignKey( Service, related_name="checks", null=True, - blank=True) - resource = models.ForeignKey(MonitoredResource, null=True, blank=True) - label = models.ForeignKey(MetricLabel, null=True, blank=True) - event_type = models.ForeignKey(EventType, null=True, blank=True) + blank=True, + on_delete=models.CASCADE) + resource = models.ForeignKey(MonitoredResource, null=True, blank=True, on_delete=models.CASCADE) + label = models.ForeignKey(MetricLabel, null=True, blank=True, on_delete=models.CASCADE) + event_type = models.ForeignKey(EventType, null=True, blank=True, on_delete=models.CASCADE) min_value = models.DecimalField( max_digits=20, decimal_places=4, @@ -1552,9 +1579,10 @@ class MetricNotificationCheck(models.Model): definition = models.OneToOneField( NotificationMetricDefinition, null=True, - related_name='metric_check') + related_name='metric_check', + on_delete="CASCASE") - def __unicode__(self): + def __str__(self): indicator = [] if self.min_value is not None: indicator.append("value above {}".format(self.min_value)) @@ -1568,6 +1596,9 @@ def __unicode__(self): return "MetricCheck({}@{}: {})".format( self.metric.name, self.service.name if self.service else '', indicator) + def __unicode__(self): + return u"{0}".format(self.__str__()) + @property def field_option(self): field_option = None @@ -1600,12 +1631,15 @@ def __init__(self, metric, check, message, self.valid_from, self.valid_to = metric.valid_from, metric.valid_to - def __unicode__(self): + def __str__(self): return "MetricValueError({}: metric {} misses {} check: {})".format(self.severity, self.metric, self.check, self.message) + def __unicode__(self): + return u"{0}".format(self.__str__()) + def check_value(self, metric, valid_on): """ Check specific metric if it's faulty or not. diff --git a/geonode/monitoring/tests/integration.py b/geonode/monitoring/tests/integration.py index dd2641d20fa..b24bf6268d8 100644 --- a/geonode/monitoring/tests/integration.py +++ b/geonode/monitoring/tests/integration.py @@ -40,7 +40,7 @@ from django.core import mail from django.conf import settings from django.db import connections -from django.core.urlresolvers import reverse +from django.urls import reverse from django.test.utils import override_settings from django.core.management import call_command from django.contrib.auth import get_user, get_user_model @@ -295,7 +295,7 @@ def test_gn_request(self): Test if we have geonode requests logged """ self.client.login_user(self.u) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) _l = file_upload( os.path.join( @@ -324,7 +324,7 @@ def test_gn_error(self): Test if we get geonode errors logged """ self.client.login_user(self.u) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) _l = file_upload( os.path.join( @@ -350,7 +350,7 @@ def test_service_handlers(self): Test if we can calculate metrics """ self.client.login_user(self.u) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) _l = file_upload( os.path.join( @@ -628,7 +628,7 @@ def test_notifications_views(self): max_timeout=None) self.client.login_user(self.u) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) nresp = self.client.get(reverse('monitoring:api_user_notifications')) self.assertIsNotNone(nresp) @@ -651,7 +651,7 @@ def test_notifications_views(self): self.assertTrue(data['data'][0]['id'] == nc.id) self.client.login_user(self.u2) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) nresp = self.client.get(reverse('monitoring:api_user_notifications')) self.assertIsNotNone(nresp) @@ -675,7 +675,7 @@ def test_notifications_edit_views(self): c = self.client c.login_user(self.u) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) notification_url = reverse('monitoring:api_user_notifications') uthreshold = [( 'request.count', 'min_value', False, False, False, False, 0, 100, None, "Min number of request"), @@ -766,7 +766,7 @@ def test_notifications_api(self): nc = NotificationCheck.create(*notifications_config) self.assertTrue(nc.definitions.all().count() == 2) self.client.login_user(self.u2) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) for nc in NotificationCheck.objects.all(): notifications_config_url = reverse( 'monitoring:api_user_notification_config', args=(nc.id,)) @@ -920,7 +920,7 @@ def test_autoconfig(self): self.assertEqual(resp.status_code, 401) self.client.login_user(self.u) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) resp = self.client.post(autoconf_url) self.assertEqual(resp.status_code, 200, resp) @@ -988,7 +988,7 @@ def test_layer_view_endpoints(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -1049,7 +1049,7 @@ def test_layer_upload_endpoints(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -1110,7 +1110,7 @@ def test_layer_view_metadata_endpoints(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -1163,7 +1163,7 @@ def test_layer_change_metadata_endpoints(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -1216,7 +1216,7 @@ def test_layer_download_endpoints(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -1277,7 +1277,7 @@ def test_map_create_endpoints(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -1320,7 +1320,7 @@ def test_map_change_endpoints(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -1354,7 +1354,7 @@ def test_document_upload_endpoints(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -1388,7 +1388,7 @@ def test_document_view_metadata_endpoints(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -1418,13 +1418,13 @@ def test_document_change_metadata_endpoints(self): self.assertEqual(out["error"], "unauthorized_request") self.client.login_user(self.user) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -1458,7 +1458,7 @@ def test_document_download_endpoints(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) self.assertEqual(out["data"]["metric"], 'request.users') @@ -1606,7 +1606,7 @@ def test_url_view_endpoints(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) self.assertEqual(out["data"]["metric"], 'request.users') @@ -1650,7 +1650,7 @@ def test_resources_endpoint(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) self.assertEqual(out["status"], "ok") @@ -1684,7 +1684,7 @@ def test_resource_types_endpoint(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) self.assertEqual(out["status"], "ok") @@ -1798,7 +1798,7 @@ def test_users_count_for_resource_endpoint(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -1841,7 +1841,7 @@ def test_resources_count_endpoint(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -1891,7 +1891,7 @@ def test_event_types_endpoint(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) self.assertEqual(out["status"], "ok") @@ -1928,7 +1928,7 @@ def test_ows_service_enpoints(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -1969,7 +1969,7 @@ def test_non_ows_events_enpoints(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -2053,7 +2053,7 @@ def test_event_type_on_label_endpoint(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -2144,7 +2144,7 @@ def test_event_type_on_user_endpoint(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -2187,7 +2187,7 @@ def test_unique_visitors_count_endpoints(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -2248,7 +2248,7 @@ def test_anonymous_sessions_count_endpoints(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -2346,7 +2346,7 @@ def test_unique_visitors_list_endpoints(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) self.assertEqual(out["data"]["metric"], 'request.users') @@ -2399,7 +2399,7 @@ def test_hostgeonode_cpu_endpoints(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -2441,7 +2441,7 @@ def test_hostgeoserver_cpu_endpoints(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -2483,7 +2483,7 @@ def test_hostgeonode_mem_endpoints(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -2525,7 +2525,7 @@ def test_hostgeoserver_mem_endpoints(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -2575,7 +2575,7 @@ def test_uptime_endpoints(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -2672,7 +2672,7 @@ def test_hits_for_event_type_endpoint(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data @@ -2704,7 +2704,7 @@ def test_countries_endpoint(self): self.assertEqual(out["error"], "unauthorized_request") # Authorized self.client.login_user(self.admin) - self.assertTrue(get_user(self.client).is_authenticated()) + self.assertTrue(get_user(self.client).is_authenticated) response = self.client.get(url) out = json.loads(response.content) # Check data diff --git a/geonode/monitoring/views.py b/geonode/monitoring/views.py index 8b384666d2b..e3df075eb3c 100644 --- a/geonode/monitoring/views.py +++ b/geonode/monitoring/views.py @@ -27,7 +27,7 @@ from django.contrib import auth from django.conf import settings from django.views.generic.base import View -from django.core.urlresolvers import reverse +from django.urls import reverse from django.core.management import call_command from django.views.decorators.csrf import csrf_exempt from geonode.decorators import view_decorator, superuser_protected @@ -610,7 +610,7 @@ def get(self, request, *args, **kwargs): 'steps_calculated', 'unit', 'is_enabled',) - if auth.get_user(request).is_authenticated(): + if auth.get_user(request).is_authenticated: obj = self.get_object() out['success'] = True out['status'] = 'ok' @@ -629,7 +629,7 @@ def get(self, request, *args, **kwargs): def post(self, request, *args, **kwargs): out = {'success': False, 'status': 'error', 'data': [], 'errors': {}} status = 500 - if auth.get_user(request).is_authenticated(): + if auth.get_user(request).is_authenticated: obj = self.get_object() try: is_json = True @@ -670,7 +670,7 @@ class NotificationsList(FilteredView): def get_filter_args(self, *args, **kwargs): self.errors = {} - if not auth.get_user(self.request).is_authenticated(): + if not auth.get_user(self.request).is_authenticated: self.errors = {'user': ['User is not authenticated']} return {} @@ -736,7 +736,7 @@ def get(self, request, *args, **kwargs): class AutoconfigureView(View): def post(self, request, *args, **kwargs): - if not auth.get_user(request).is_authenticated(): + if not auth.get_user(request).is_authenticated: out = {'success': False, 'status': 'error', 'errors': {'user': ['User is not authenticated']} diff --git a/geonode/people/adapters.py b/geonode/people/adapters.py index 3fcd4e7def0..7edf2b61b66 100644 --- a/geonode/people/adapters.py +++ b/geonode/people/adapters.py @@ -37,7 +37,7 @@ from django.conf import settings from django.core.exceptions import ValidationError -from django.core.urlresolvers import reverse +from django.urls import reverse from django.http import HttpResponseRedirect from django.utils.module_loading import import_string # from django.contrib.auth.models import Group diff --git a/geonode/people/migrations/0027_auto_20200114_1651.py b/geonode/people/migrations/0027_auto_20200114_1651.py new file mode 100644 index 00000000000..5cd9c9c2a34 --- /dev/null +++ b/geonode/people/migrations/0027_auto_20200114_1651.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.27 on 2020-01-14 16:51 +from __future__ import unicode_literals + +import django.contrib.auth.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('people', '0026_auto_20200109_1600'), + ] + + operations = [ + migrations.AlterField( + model_name='profile', + name='country', + field=models.CharField(blank=True, choices=[('AFG', 'Afghanistan'), ('ALA', 'Aland Islands'), ('ALB', 'Albania'), ('DZA', 'Algeria'), ('ASM', 'American Samoa'), ('AND', 'Andorra'), ('AGO', 'Angola'), ('AIA', 'Anguilla'), ('ATG', 'Antigua and Barbuda'), ('ARG', 'Argentina'), ('ARM', 'Armenia'), ('ABW', 'Aruba'), ('AUS', 'Australia'), ('AUT', 'Austria'), ('AZE', 'Azerbaijan'), ('BHS', 'Bahamas'), ('BHR', 'Bahrain'), ('BGD', 'Bangladesh'), ('BRB', 'Barbados'), ('BLR', 'Belarus'), ('BEL', 'Belgium'), ('BLZ', 'Belize'), ('BEN', 'Benin'), ('BMU', 'Bermuda'), ('BTN', 'Bhutan'), ('BOL', 'Bolivia'), ('BIH', 'Bosnia and Herzegovina'), ('BWA', 'Botswana'), ('BRA', 'Brazil'), ('VGB', 'British Virgin Islands'), ('BRN', 'Brunei Darussalam'), ('BGR', 'Bulgaria'), ('BFA', 'Burkina Faso'), ('BDI', 'Burundi'), ('KHM', 'Cambodia'), ('CMR', 'Cameroon'), ('CAN', 'Canada'), ('CPV', 'Cape Verde'), ('CYM', 'Cayman Islands'), ('CAF', 'Central African Republic'), ('TCD', 'Chad'), ('CIL', 'Channel Islands'), ('CHL', 'Chile'), ('CHN', 'China'), ('HKG', 'China - Hong Kong'), ('MAC', 'China - Macao'), ('COL', 'Colombia'), ('COM', 'Comoros'), ('COG', 'Congo'), ('COK', 'Cook Islands'), ('CRI', 'Costa Rica'), ('CIV', "Cote d'Ivoire"), ('HRV', 'Croatia'), ('CUB', 'Cuba'), ('CYP', 'Cyprus'), ('CZE', 'Czech Republic'), ('PRK', "Democratic People's Republic of Korea"), ('COD', 'Democratic Republic of the Congo'), ('DNK', 'Denmark'), ('DJI', 'Djibouti'), ('DMA', 'Dominica'), ('DOM', 'Dominican Republic'), ('ECU', 'Ecuador'), ('EGY', 'Egypt'), ('SLV', 'El Salvador'), ('GNQ', 'Equatorial Guinea'), ('ERI', 'Eritrea'), ('EST', 'Estonia'), ('ETH', 'Ethiopia'), ('FRO', 'Faeroe Islands'), ('FLK', 'Falkland Islands (Malvinas)'), ('FJI', 'Fiji'), ('FIN', 'Finland'), ('FRA', 'France'), ('GUF', 'French Guiana'), ('PYF', 'French Polynesia'), ('GAB', 'Gabon'), ('GMB', 'Gambia'), ('GEO', 'Georgia'), ('DEU', 'Germany'), ('GHA', 'Ghana'), ('GIB', 'Gibraltar'), ('GRC', 'Greece'), ('GRL', 'Greenland'), ('GRD', 'Grenada'), ('GLP', 'Guadeloupe'), ('GUM', 'Guam'), ('GTM', 'Guatemala'), ('GGY', 'Guernsey'), ('GIN', 'Guinea'), ('GNB', 'Guinea-Bissau'), ('GUY', 'Guyana'), ('HTI', 'Haiti'), ('VAT', 'Holy See (Vatican City)'), ('HND', 'Honduras'), ('HUN', 'Hungary'), ('ISL', 'Iceland'), ('IND', 'India'), ('IDN', 'Indonesia'), ('IRN', 'Iran'), ('IRQ', 'Iraq'), ('IRL', 'Ireland'), ('IMN', 'Isle of Man'), ('ISR', 'Israel'), ('ITA', 'Italy'), ('JAM', 'Jamaica'), ('JPN', 'Japan'), ('JEY', 'Jersey'), ('JOR', 'Jordan'), ('KAZ', 'Kazakhstan'), ('KEN', 'Kenya'), ('KIR', 'Kiribati'), ('KWT', 'Kuwait'), ('KGZ', 'Kyrgyzstan'), ('LAO', "Lao People's Democratic Republic"), ('LVA', 'Latvia'), ('LBN', 'Lebanon'), ('LSO', 'Lesotho'), ('LBR', 'Liberia'), ('LBY', 'Libyan Arab Jamahiriya'), ('LIE', 'Liechtenstein'), ('LTU', 'Lithuania'), ('LUX', 'Luxembourg'), ('MKD', 'Macedonia'), ('MDG', 'Madagascar'), ('MWI', 'Malawi'), ('MYS', 'Malaysia'), ('MDV', 'Maldives'), ('MLI', 'Mali'), ('MLT', 'Malta'), ('MHL', 'Marshall Islands'), ('MTQ', 'Martinique'), ('MRT', 'Mauritania'), ('MUS', 'Mauritius'), ('MYT', 'Mayotte'), ('MEX', 'Mexico'), ('FSM', 'Micronesia, Federated States of'), ('MCO', 'Monaco'), ('MNG', 'Mongolia'), ('MNE', 'Montenegro'), ('MSR', 'Montserrat'), ('MAR', 'Morocco'), ('MOZ', 'Mozambique'), ('MMR', 'Myanmar'), ('NAM', 'Namibia'), ('NRU', 'Nauru'), ('NPL', 'Nepal'), ('NLD', 'Netherlands'), ('ANT', 'Netherlands Antilles'), ('NCL', 'New Caledonia'), ('NZL', 'New Zealand'), ('NIC', 'Nicaragua'), ('NER', 'Niger'), ('NGA', 'Nigeria'), ('NIU', 'Niue'), ('NFK', 'Norfolk Island'), ('MNP', 'Northern Mariana Islands'), ('NOR', 'Norway'), ('PSE', 'Occupied Palestinian Territory'), ('OMN', 'Oman'), ('PAK', 'Pakistan'), ('PLW', 'Palau'), ('PAN', 'Panama'), ('PNG', 'Papua New Guinea'), ('PRY', 'Paraguay'), ('PER', 'Peru'), ('PHL', 'Philippines'), ('PCN', 'Pitcairn'), ('POL', 'Poland'), ('PRT', 'Portugal'), ('PRI', 'Puerto Rico'), ('QAT', 'Qatar'), ('KOR', 'Republic of Korea'), ('MDA', 'Republic of Moldova'), ('REU', 'Reunion'), ('ROU', 'Romania'), ('RUS', 'Russian Federation'), ('RWA', 'Rwanda'), ('BLM', 'Saint-Barthelemy'), ('SHN', 'Saint Helena'), ('KNA', 'Saint Kitts and Nevis'), ('LCA', 'Saint Lucia'), ('MAF', 'Saint-Martin (French part)'), ('SPM', 'Saint Pierre and Miquelon'), ('VCT', 'Saint Vincent and the Grenadines'), ('WSM', 'Samoa'), ('SMR', 'San Marino'), ('STP', 'Sao Tome and Principe'), ('SAU', 'Saudi Arabia'), ('SEN', 'Senegal'), ('SRB', 'Serbia'), ('SYC', 'Seychelles'), ('SLE', 'Sierra Leone'), ('SGP', 'Singapore'), ('SVK', 'Slovakia'), ('SVN', 'Slovenia'), ('SLB', 'Solomon Islands'), ('SOM', 'Somalia'), ('ZAF', 'South Africa'), ('SSD', 'South Sudan'), ('ESP', 'Spain'), ('LKA', 'Sri Lanka'), ('SDN', 'Sudan'), ('SUR', 'Suriname'), ('SJM', 'Svalbard and Jan Mayen Islands'), ('SWZ', 'Swaziland'), ('SWE', 'Sweden'), ('CHE', 'Switzerland'), ('SYR', 'Syrian Arab Republic'), ('TJK', 'Tajikistan'), ('THA', 'Thailand'), ('TLS', 'Timor-Leste'), ('TGO', 'Togo'), ('TKL', 'Tokelau'), ('TON', 'Tonga'), ('TTO', 'Trinidad and Tobago'), ('TUN', 'Tunisia'), ('TUR', 'Turkey'), ('TKM', 'Turkmenistan'), ('TCA', 'Turks and Caicos Islands'), ('TUV', 'Tuvalu'), ('UGA', 'Uganda'), ('UKR', 'Ukraine'), ('ARE', 'United Arab Emirates'), ('GBR', 'United Kingdom'), ('TZA', 'United Republic of Tanzania'), ('USA', 'United States of America'), ('VIR', 'United States Virgin Islands'), ('URY', 'Uruguay'), ('UZB', 'Uzbekistan'), ('VUT', 'Vanuatu'), ('VEN', 'Venezuela (Bolivarian Republic of)'), ('VNM', 'Viet Nam'), ('WLF', 'Wallis and Futuna Islands'), ('ESH', 'Western Sahara'), ('YEM', 'Yemen'), ('ZMB', 'Zambia'), ('ZWE', 'Zimbabwe')], help_text='country of the physical address', max_length=3, null=True, verbose_name='Country'), + ), + migrations.AlterField( + model_name='profile', + name='language', + field=models.CharField(choices=[('af', 'Afrikaans'), ('ar', 'العربيّة'), ('ast', 'asturian'), ('az', 'Azərbaycanca'), ('bg', 'български'), ('be', 'беларуская'), ('bn', 'বাংলা'), ('br', 'brezhoneg'), ('bs', 'bosanski'), ('ca', 'català'), ('cs', 'česky'), ('cy', 'Cymraeg'), ('da', 'dansk'), ('de', 'Deutsch'), ('el', 'Ελληνικά'), ('en', 'English'), ('en-au', 'Australian English'), ('en-gb', 'British English'), ('eo', 'Esperanto'), ('es', 'español'), ('es-ar', 'español de Argentina'), ('es-mx', 'español de Mexico'), ('es-ni', 'español de Nicaragua'), ('es-ve', 'español de Venezuela'), ('et', 'eesti'), ('eu', 'Basque'), ('fa', 'فارسی'), ('fi', 'suomi'), ('fr', 'français'), ('fy', 'frysk'), ('ga', 'Gaeilge'), ('gl', 'galego'), ('he', 'עברית'), ('hi', 'Hindi'), ('hr', 'Hrvatski'), ('hu', 'Magyar'), ('ia', 'Interlingua'), ('id', 'Bahasa Indonesia'), ('io', 'ido'), ('is', 'Íslenska'), ('it', 'italiano'), ('ja', '日本語'), ('ka', 'ქართული'), ('kk', 'Қазақ'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', '한국어'), ('lb', 'Lëtzebuergesch'), ('lt', 'Lietuviškai'), ('lv', 'latvieš'), ('mk', 'Македонски'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('mr', 'मराठी'), ('my', 'မြန်မာဘာသာ'), ('nb', 'norsk (bokmål)'), ('ne', 'नेपाली'), ('nl', 'Nederlands'), ('nn', 'norsk (nynorsk)'), ('os', 'Ирон'), ('pa', 'Punjabi'), ('pl', 'polski'), ('pt', 'Português'), ('pt-br', 'Português Brasileiro'), ('ro', 'Română'), ('ru', 'Русский'), ('sk', 'slovenský'), ('sl', 'Slovenščina'), ('sq', 'shqip'), ('sr', 'српски'), ('sr-latn', 'srpski (latinica)'), ('sv', 'svenska'), ('sw', 'Kiswahili'), ('ta', 'தமிழ்'), ('te', 'తెలుగు'), ('th', 'ภาษาไทย'), ('tr', 'Türkçe'), ('tt', 'Татарча'), ('udm', 'Удмурт'), ('uk', 'Українська'), ('ur', 'اردو'), ('vi', 'Tiếng Việt'), ('zh-cn', '简体中文'), ('zh-hans', '简体中文'), ('zh-hant', '繁體中文'), ('zh-tw', '繁體中文')], default='en', max_length=10, verbose_name='language'), + ), + migrations.AlterField( + model_name='profile', + name='username', + field=models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username'), + ), + ] diff --git a/geonode/people/migrations/0028_auto_20200115_1121.py b/geonode/people/migrations/0028_auto_20200115_1121.py new file mode 100644 index 00000000000..a17041bfeba --- /dev/null +++ b/geonode/people/migrations/0028_auto_20200115_1121.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.9 on 2020-01-15 11:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('people', '0027_auto_20200114_1651'), + ] + + operations = [ + migrations.AlterField( + model_name='profile', + name='last_name', + field=models.CharField(blank=True, max_length=150, verbose_name='last name'), + ), + ] diff --git a/geonode/people/models.py b/geonode/people/models.py index 1557426b190..356736344d7 100644 --- a/geonode/people/models.py +++ b/geonode/people/models.py @@ -26,7 +26,7 @@ from django.db import models from django.db.models import signals -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.sites.models import Site from django.utils.translation import ugettext_lazy as _ from django.contrib.auth.models import AbstractUser, UserManager @@ -140,9 +140,13 @@ def __init__(self, *args, **kwargs): def get_absolute_url(self): return reverse('profile_detail', args=[self.username, ]) + def __str__(self): + return "{0}".format(self.username) + def __unicode__(self): - return "%s" % (self.username) + return u"{0}".format(self.__str__()) + @staticmethod def class_name(value): return value.__class__.__name__ diff --git a/geonode/people/signals.py b/geonode/people/signals.py index c00c936fde9..0eedc7b2fac 100644 --- a/geonode/people/signals.py +++ b/geonode/people/signals.py @@ -67,7 +67,7 @@ def do_login(sender, user, request, **kwargs): Take action on user login. Generate a new user access_token to be shared with GeoServer, and store it into the request.session """ - if user and user.is_authenticated(): + if user and user.is_authenticated: token = None try: token = get_or_create_token(user) diff --git a/geonode/people/templatetags/socialaccount_extra.py b/geonode/people/templatetags/socialaccount_extra.py index 3b0cb5ebcc5..42c8e99981b 100644 --- a/geonode/people/templatetags/socialaccount_extra.py +++ b/geonode/people/templatetags/socialaccount_extra.py @@ -4,7 +4,7 @@ register = template.Library() -@register.assignment_tag +@register.simple_tag def get_user_social_providers(user): user_providers = set() for account in user.socialaccount_set.all(): @@ -12,7 +12,7 @@ def get_user_social_providers(user): return list(user_providers) -@register.assignment_tag +@register.simple_tag def get_other_social_providers(user): user_providers = get_user_social_providers(user) user_provider_names = [p.name.lower() for p in user_providers] @@ -23,11 +23,11 @@ def get_other_social_providers(user): return other_providers -@register.assignment_tag +@register.simple_tag def get_number_unconnected_providers(user): return len(get_other_social_providers(user)) -@register.assignment_tag +@register.simple_tag def user_providers(user): return user.socialaccount_set.values_list("provider", flat=True) diff --git a/geonode/people/tests.py b/geonode/people/tests.py index fda632e5b61..6fd11d4923a 100644 --- a/geonode/people/tests.py +++ b/geonode/people/tests.py @@ -21,7 +21,7 @@ from geonode.tests.base import GeoNodeBaseTestSupport from django.contrib.auth import get_user_model -from django.core.urlresolvers import reverse +from django.urls import reverse from django.core import mail from django.contrib.sites.models import Site diff --git a/geonode/people/views.py b/geonode/people/views.py index 0e566d0a7b6..8d6f2ef1095 100644 --- a/geonode/people/views.py +++ b/geonode/people/views.py @@ -22,7 +22,7 @@ from django.contrib.auth.decorators import login_required from django.contrib import messages from django.shortcuts import render, redirect, get_object_or_404 -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils.translation import ugettext as _ from django.contrib.sites.models import Site from django.conf import settings diff --git a/geonode/proxy/templatetags/proxy_lib_tags.py b/geonode/proxy/templatetags/proxy_lib_tags.py index 8dfe85aa19d..cf8e659c168 100644 --- a/geonode/proxy/templatetags/proxy_lib_tags.py +++ b/geonode/proxy/templatetags/proxy_lib_tags.py @@ -19,7 +19,7 @@ ######################################################################### from django import template from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils.translation import ugettext as _ from django.core.files.storage import FileSystemStorage diff --git a/geonode/proxy/tests.py b/geonode/proxy/tests.py index 6a1d4e7192c..138162b6a90 100644 --- a/geonode/proxy/tests.py +++ b/geonode/proxy/tests.py @@ -31,7 +31,7 @@ except ImportError: from mock import MagicMock -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth import get_user_model from django.test.utils import override_settings diff --git a/geonode/qgis_server/context_processors.py b/geonode/qgis_server/context_processors.py index 77f6a2edb09..4fc78efd272 100644 --- a/geonode/qgis_server/context_processors.py +++ b/geonode/qgis_server/context_processors.py @@ -19,7 +19,7 @@ ######################################################################### from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse from geonode.geoserver.helpers import ogc_server_settings from geonode.qgis_server.forms import QGISLayerStyleUploadForm diff --git a/geonode/qgis_server/helpers.py b/geonode/qgis_server/helpers.py index 8fd58861c44..62a06e7361c 100644 --- a/geonode/qgis_server/helpers.py +++ b/geonode/qgis_server/helpers.py @@ -35,7 +35,7 @@ from django.contrib.gis.gdal import CoordTransform, SpatialReference from django.contrib.gis.geos import GEOSGeometry, Point from django.core.exceptions import ImproperlyConfigured -from django.core.urlresolvers import reverse +from django.urls import reverse from defusedxml import lxml as dlxml from requests import Request diff --git a/geonode/qgis_server/middleware.py b/geonode/qgis_server/middleware.py index f99c3e98cfa..a265de388d8 100644 --- a/geonode/qgis_server/middleware.py +++ b/geonode/qgis_server/middleware.py @@ -21,6 +21,15 @@ class QGISServerLayerMiddleware(object): + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + return self.get_response(request) + + # def process_exception(self, request, exception): + # return HttpResponse("in exception") + def process_template_response(self, request, response): """Middleware to add more context for QGIS Server backend app. diff --git a/geonode/qgis_server/migrations/0001_initial.py b/geonode/qgis_server/migrations/0001_initial.py index 25f59ba0b70..3fea0caf11d 100644 --- a/geonode/qgis_server/migrations/0001_initial.py +++ b/geonode/qgis_server/migrations/0001_initial.py @@ -33,7 +33,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='QGISServerLayer', fields=[ - ('layer', models.OneToOneField(primary_key=True, serialize=False, to='layers.Layer')), + ('layer', models.OneToOneField(primary_key=True, on_delete=models.CASCADE, serialize=False, to='layers.Layer')), ('base_layer_path', models.CharField(help_text='Location of the base layer.', max_length=100, verbose_name='Base Layer Path')), ], ), diff --git a/geonode/qgis_server/migrations/0002_qgisservermap.py b/geonode/qgis_server/migrations/0002_qgisservermap.py index fad9f37bee8..4055cfb6b47 100644 --- a/geonode/qgis_server/migrations/0002_qgisservermap.py +++ b/geonode/qgis_server/migrations/0002_qgisservermap.py @@ -34,7 +34,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='QGISServerMap', fields=[ - ('map', models.OneToOneField(primary_key=True, serialize=False, to='maps.Map')), + ('map', models.OneToOneField(primary_key=True, on_delete=models.CASCADE, serialize=False, to='maps.Map')), ], ), ] diff --git a/geonode/qgis_server/migrations/0003_auto_20170727_0509.py b/geonode/qgis_server/migrations/0003_auto_20170727_0509.py index 4e0bd07c16a..6bdcbf61dbe 100644 --- a/geonode/qgis_server/migrations/0003_auto_20170727_0509.py +++ b/geonode/qgis_server/migrations/0003_auto_20170727_0509.py @@ -44,7 +44,8 @@ class Migration(migrations.Migration): migrations.AddField( model_name='qgisserverlayer', name='default_style', - field=models.ForeignKey(related_name='layer_default_style', default=None, to='qgis_server.QGISServerStyle', null=True), + field=models.ForeignKey(related_name='layer_default_style', on_delete=models.SET_NULL, + default=None, to='qgis_server.QGISServerStyle', null=True), ), migrations.AddField( model_name='qgisserverlayer', diff --git a/geonode/qgis_server/migrations/0004_auto_20170805_0223.py b/geonode/qgis_server/migrations/0004_auto_20170805_0223.py index 454f58f0f44..65aafd7e4ed 100644 --- a/geonode/qgis_server/migrations/0004_auto_20170805_0223.py +++ b/geonode/qgis_server/migrations/0004_auto_20170805_0223.py @@ -33,7 +33,8 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='qgisserverlayer', name='layer', - field=models.OneToOneField(related_name='qgis_layer', primary_key=True, serialize=False, to='layers.Layer'), + field=models.OneToOneField(related_name='qgis_layer', on_delete=models.CASCADE, + primary_key=True, serialize=False, to='layers.Layer'), ), migrations.AlterField( model_name='qgisserverstyle', diff --git a/geonode/qgis_server/migrations/0005_auto_20170823_0341.py b/geonode/qgis_server/migrations/0005_auto_20170823_0341.py index 9e5c1654eb5..0a7d456b100 100644 --- a/geonode/qgis_server/migrations/0005_auto_20170823_0341.py +++ b/geonode/qgis_server/migrations/0005_auto_20170823_0341.py @@ -34,6 +34,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='qgisserverlayer', name='default_style', - field=models.ForeignKey(related_name='layer_default_style', on_delete=django.db.models.deletion.SET_NULL, default=None, to='qgis_server.QGISServerStyle', null=True), + field=models.ForeignKey(related_name='layer_default_style', on_delete=models.SET_NULL, + default=None, to='qgis_server.QGISServerStyle', null=True), ), ] diff --git a/geonode/qgis_server/models.py b/geonode/qgis_server/models.py index c798ae9c46a..34b0e407e63 100644 --- a/geonode/qgis_server/models.py +++ b/geonode/qgis_server/models.py @@ -61,7 +61,8 @@ class QGISServerLayer(models.Model, PermissionLevelMixin): layer = models.OneToOneField( Layer, primary_key=True, - related_name='qgis_layer' + related_name='qgis_layer', + on_delete=models.CASCADE ) base_layer_path = models.CharField( name='base_layer_path', @@ -330,7 +331,8 @@ class QGISServerMap(models.Model, PermissionLevelMixin): map = models.OneToOneField( Map, primary_key=True, - name='map' + name='map', + on_delete="CASCASE" ) map_name_format = 'map_{id}' diff --git a/geonode/qgis_server/signals.py b/geonode/qgis_server/signals.py index 8d4458a5406..270d6f42621 100644 --- a/geonode/qgis_server/signals.py +++ b/geonode/qgis_server/signals.py @@ -25,7 +25,7 @@ from osgeo import ogr, osr, gdal from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse from django.db.models import signals from django.dispatch import Signal from requests.compat import urljoin diff --git a/geonode/qgis_server/tests/test_helpers.py b/geonode/qgis_server/tests/test_helpers.py index 42210d2b596..b3213727f41 100644 --- a/geonode/qgis_server/tests/test_helpers.py +++ b/geonode/qgis_server/tests/test_helpers.py @@ -38,7 +38,7 @@ import requests from django.conf import settings from django.core.management import call_command -from django.core.urlresolvers import reverse +from django.urls import reverse from geonode import qgis_server from geonode.base.models import Region diff --git a/geonode/qgis_server/tests/test_views.py b/geonode/qgis_server/tests/test_views.py index b50c72e24a7..47a43fbbefe 100644 --- a/geonode/qgis_server/tests/test_views.py +++ b/geonode/qgis_server/tests/test_views.py @@ -36,7 +36,7 @@ import gisdata from django.conf import settings from django.contrib.staticfiles.templatetags import staticfiles -from django.core.urlresolvers import reverse +from django.urls import reverse from geonode import qgis_server from geonode.decorators import on_ogc_backend diff --git a/geonode/qgis_server/views.py b/geonode/qgis_server/views.py index 59072872de0..5b6b9c33c56 100644 --- a/geonode/qgis_server/views.py +++ b/geonode/qgis_server/views.py @@ -31,7 +31,7 @@ import requests import shutil from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse from django.forms.models import model_to_dict from django.http import HttpResponse, Http404 from django.http.response import ( diff --git a/geonode/security/middleware.py b/geonode/security/middleware.py index 56adc9ea8b4..49e8a68fce5 100644 --- a/geonode/security/middleware.py +++ b/geonode/security/middleware.py @@ -22,8 +22,9 @@ from django.conf import settings from django.contrib.auth import logout -from django.core.urlresolvers import reverse +from django.urls import reverse from django.http import HttpResponseRedirect +# from django.http.response import HttpResponse from geonode import geoserver from geonode.utils import check_ogc_backend @@ -36,7 +37,6 @@ reverse('account_login'), reverse('forgot_username'), reverse('help'), - reverse('javascript-catalog'), reverse('layer_acls'), reverse('layer_acls_dep'), reverse('layer_resolve_user'), @@ -50,7 +50,6 @@ reverse('account_login'), reverse('forgot_username'), reverse('help'), - reverse('javascript-catalog'), '/account/(?!.*(?:signup))', # block unauthenticated users from creating new accounts. '/static/*', @@ -67,6 +66,15 @@ class LoginRequiredMiddleware(object): redirect_to = getattr(settings, 'LOGIN_URL', reverse('account_login')) + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + return self.get_response(request) + + # def process_exception(self, request, exception): + # return HttpResponse("in exception") + def process_request(self, request): if not request.user.is_authenticated( ) or request.user == get_anonymous_user(): @@ -84,6 +92,15 @@ class SessionControlMiddleware(object): redirect_to = getattr(settings, 'LOGIN_URL', reverse('account_login')) + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + return self.get_response(request) + + # def process_exception(self, request, exception): + # return HttpResponse("in exception") + def process_request(self, request): if request and request.user and not request.user.is_anonymous: if not request.user.is_active: diff --git a/geonode/security/models.py b/geonode/security/models.py index 77c36a59898..1673ead02a7 100644 --- a/geonode/security/models.py +++ b/geonode/security/models.py @@ -18,6 +18,7 @@ # ######################################################################### import logging +import traceback from django.conf import settings from django.contrib.auth import get_user_model @@ -85,28 +86,29 @@ def get_all_level_info(self): 'users': users, 'groups': groups} - # TODO very hugly here, but isn't huglier - # to set layer permissions to resource base? - if hasattr(self, "layer"): - info_layer = { - 'users': get_users_with_perms( - self.layer), - 'groups': get_groups_with_perms( - self.layer, - attach_perms=True)} - - for user in info_layer['users']: - if user in info['users']: - info['users'][user] = info['users'][user] + info_layer['users'][user] - else: - info['users'][user] = info_layer['users'][user] - - for group in info_layer['groups']: - if group in info['groups']: - info['groups'][group] = info['groups'][group] + info_layer['groups'][group] - else: - info['groups'][group] = info_layer['groups'][group] + try: + if hasattr(self, "layer"): + info_layer = { + 'users': get_users_with_perms( + self.layer), + 'groups': get_groups_with_perms( + self.layer, + attach_perms=True)} + + for user in info_layer['users']: + if user in info['users']: + info['users'][user] = info['users'][user] + info_layer['users'][user] + else: + info['users'][user] = info_layer['users'][user] + for group in info_layer['groups']: + if group in info['groups']: + info['groups'][group] = info['groups'][group] + info_layer['groups'][group] + else: + info['groups'][group] = info_layer['groups'][group] + except BaseException: + tb = traceback.format_exc() + logger.debug(tb) return info def get_self_resource(self): diff --git a/geonode/security/tests.py b/geonode/security/tests.py index c3f358a611c..73b19782f6c 100644 --- a/geonode/security/tests.py +++ b/geonode/security/tests.py @@ -33,7 +33,7 @@ from django.conf import settings from django.http import HttpRequest -from django.core.urlresolvers import reverse +from django.urls import reverse from tastypie.test import ResourceTestCaseMixin from django.contrib.auth import get_user_model from guardian.shortcuts import get_anonymous_user, assign_perm, remove_perm @@ -146,7 +146,7 @@ def test_login_middleware(self): self.client.login(username='admin', password='admin') admin = get_user_model().objects.get(username='admin') - self.assertTrue(admin.is_authenticated()) + self.assertTrue(admin.is_authenticated) request.user = admin # The middleware should return None when an authenticated user attempts @@ -168,7 +168,7 @@ def test_session_ctrl_middleware(self): self.client.login(username='admin', password='admin') admin = get_user_model().objects.get(username='admin') - self.assertTrue(admin.is_authenticated()) + self.assertTrue(admin.is_authenticated) request.user = admin request.path = reverse('layer_browse') middleware.process_request(request) diff --git a/geonode/security/utils.py b/geonode/security/utils.py index e733cb825a3..552e878bec1 100644 --- a/geonode/security/utils.py +++ b/geonode/security/utils.py @@ -490,8 +490,8 @@ def remove_object_permissions(instance): """ from guardian.models import UserObjectPermission, GroupObjectPermission resource = instance.get_self_resource() - if hasattr(resource, "layer"): - try: + try: + if hasattr(resource, "layer"): UserObjectPermission.objects.filter( content_type=ContentType.objects.get_for_model(resource.layer), object_pk=instance.id @@ -506,11 +506,11 @@ def remove_object_permissions(instance): set_geofence_invalidate_cache() else: resource.set_dirty_state() - except (ObjectDoesNotExist, RuntimeError): - pass # This layer is not manageable by geofence - except BaseException: - tb = traceback.format_exc() - logger.debug(tb) + except (ObjectDoesNotExist, RuntimeError): + pass # This layer is not manageable by geofence + except BaseException: + tb = traceback.format_exc() + logger.debug(tb) UserObjectPermission.objects.filter(content_type=ContentType.objects.get_for_model(resource), object_pk=instance.id).delete() GroupObjectPermission.objects.filter(content_type=ContentType.objects.get_for_model(resource), diff --git a/geonode/services/migrations/0025_harvestjob.py b/geonode/services/migrations/0025_harvestjob.py index 9e76d4e51ec..3efded2fb9f 100644 --- a/geonode/services/migrations/0025_harvestjob.py +++ b/geonode/services/migrations/0025_harvestjob.py @@ -17,7 +17,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('resource_id', models.CharField(max_length=255)), ('status', models.CharField(default='QUEUED', max_length=15, choices=[('QUEUED','QUEUED'), ('IN_PROCESS','IN_PROCESS'), ('PROCESSED','PROCESSED'), ('FAILED','FAILED')])), - ('service', models.OneToOneField(to='services.Service')), + ('service', models.OneToOneField(to='services.Service', on_delete=models.CASCADE)), ], ), ] diff --git a/geonode/services/migrations/0026_auto_20171130_0600.py b/geonode/services/migrations/0026_auto_20171130_0600.py index 46eaf3bebb5..6ad499c8150 100644 --- a/geonode/services/migrations/0026_auto_20171130_0600.py +++ b/geonode/services/migrations/0026_auto_20171130_0600.py @@ -14,6 +14,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='harvestjob', name='service', - field=models.ForeignKey(to='services.Service'), + field=models.ForeignKey(to='services.Service', on_delete=models.CASCADE), ), ] diff --git a/geonode/services/migrations/0030_auto_20200115_1121.py b/geonode/services/migrations/0030_auto_20200115_1121.py new file mode 100644 index 00000000000..bf2c7570307 --- /dev/null +++ b/geonode/services/migrations/0030_auto_20200115_1121.py @@ -0,0 +1,17 @@ +# Generated by Django 2.2.9 on 2020-01-15 11:21 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('services', '0029_remove_service_created'), + ] + + operations = [ + migrations.AlterModelOptions( + name='service', + options={'base_manager_name': 'objects'}, + ), + ] diff --git a/geonode/services/migrations/24_initial.py b/geonode/services/migrations/24_initial.py index 1a5b7eed077..20fe92750d9 100644 --- a/geonode/services/migrations/24_initial.py +++ b/geonode/services/migrations/24_initial.py @@ -17,7 +17,8 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Service', fields=[ - ('resourcebase_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='base.ResourceBase')), + ('resourcebase_ptr', models.OneToOneField(parent_link=True, on_delete=models.CASCADE, + auto_created=True, primary_key=True, serialize=False, to='base.ResourceBase')), ('type', models.CharField(max_length=4, choices=[('AUTO', 'Auto-detect'), ('OWS', 'Paired WMS/WFS/WCS'), ('WMS', 'Web Map Service'), ('CSW', 'Catalogue Service'), ('REST', 'ArcGIS REST Service'), ('OGP', 'OpenGeoPortal'), ('HGL', 'Harvard Geospatial Library')])), ('method', models.CharField(max_length=1, choices=[('L', 'Local'), ('C', 'Cascaded'), ('H', 'Harvested'), ('I', 'Indexed'), ('X', 'Live'), ('O', 'OpenGeoPortal')])), ('base_url', models.URLField(unique=True, db_index=True)), @@ -39,7 +40,8 @@ class Migration(migrations.Migration): ('first_noanswer', models.DateTimeField(null=True, blank=True)), ('noanswer_retries', models.PositiveIntegerField(null=True, blank=True)), ('external_id', models.IntegerField(null=True, blank=True)), - ('parent', models.ForeignKey(related_name='service_set', blank=True, to='services.Service', null=True)), + ('parent', models.ForeignKey(related_name='service_set', blank=True, + to='services.Service', on_delete=models.CASCADE, null=True)), ], options={ 'abstract': False, @@ -54,8 +56,8 @@ class Migration(migrations.Migration): ('title', models.CharField(max_length=512, verbose_name='Layer Title')), ('description', models.TextField(null=True, verbose_name='Layer Description')), ('styles', models.TextField(null=True, verbose_name='Layer Styles')), - ('layer', models.ForeignKey(to='layers.Layer', null=True)), - ('service', models.ForeignKey(to='services.Service')), + ('layer', models.ForeignKey(to='layers.Layer', on_delete=models.CASCADE, null=True)), + ('service', models.ForeignKey(to='services.Service', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -63,8 +65,8 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('role', models.CharField(help_text='function performed by the responsible party', max_length=255, choices=[('author', 'party who authored the resource'), ('processor', 'party who has processed the data in a manner such that the resource has been modified'), ('publisher', 'party who published the resource'), ('custodian', 'party that accepts accountability and responsibility for the data and ensures appropriate care and maintenance of the resource'), ('pointOfContact', 'party who can be contacted for acquiring knowledge about or acquisition of the resource'), ('distributor', 'party who distributes the resource'), ('user', 'party who uses the resource'), ('resourceProvider', 'party that supplies the resource'), ('originator', 'party who created the resource'), ('owner', 'party that owns the resource'), ('principalInvestigator', 'key party responsible for gathering information and conducting research')])), - ('profiles', models.ForeignKey(to=settings.AUTH_USER_MODEL)), - ('service', models.ForeignKey(to='services.Service')), + ('profiles', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), + ('service', models.ForeignKey(to='services.Service', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -72,7 +74,7 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('status', models.CharField(default='pending', max_length=10, choices=[('pending','pending'), ('failed','failed'), ('process','process')])), - ('service', models.OneToOneField(to='services.Service')), + ('service', models.OneToOneField(to='services.Service', on_delete=models.CASCADE)), ], ), migrations.CreateModel( diff --git a/geonode/services/models.py b/geonode/services/models.py index b7feaf5257a..46b530c73e4 100644 --- a/geonode/services/models.py +++ b/geonode/services/models.py @@ -21,7 +21,7 @@ import logging from django.db import models from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils.functional import cached_property from django.utils.translation import ugettext_lazy as _ from geonode.base.models import ResourceBase @@ -147,13 +147,17 @@ class Service(ResourceBase): 'services.Service', null=True, blank=True, + on_delete=models.CASCADE, related_name='service_set' ) # Supported Capabilities + def __str__(self): + return "{0}".format(self.name) + def __unicode__(self): - return self.name + return u"{0}".format(self.__str__()) @property def service_url(self): @@ -191,14 +195,14 @@ class ServiceProfileRole(models.Model): """ ServiceProfileRole is an intermediate model to bind Profiles and Services and apply roles. """ - profiles = models.ForeignKey(settings.AUTH_USER_MODEL) - service = models.ForeignKey(Service) + profiles = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) + service = models.ForeignKey(Service, on_delete=models.CASCADE) role = models.CharField(choices=ROLE_VALUES, max_length=255, help_text=_( 'function performed by the responsible party')) class HarvestJob(models.Model): - service = models.ForeignKey(Service) + service = models.ForeignKey(Service, on_delete=models.CASCADE) resource_id = models.CharField(max_length=255) status = models.CharField( choices=( diff --git a/geonode/services/serviceprocessors/base.py b/geonode/services/serviceprocessors/base.py index 956d7e8c999..30cf013bce1 100644 --- a/geonode/services/serviceprocessors/base.py +++ b/geonode/services/serviceprocessors/base.py @@ -28,7 +28,7 @@ from urllib import quote from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse from six.moves.urllib.parse import urlencode, urlparse, urljoin, parse_qs, urlunparse from geonode import geoserver diff --git a/geonode/services/serviceprocessors/wms.py b/geonode/services/serviceprocessors/wms.py index 4086f42b881..fa18a80ffec 100644 --- a/geonode/services/serviceprocessors/wms.py +++ b/geonode/services/serviceprocessors/wms.py @@ -32,7 +32,7 @@ from urlparse import urlsplit, urljoin from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse from django.db.models import Q from django.template.defaultfilters import slugify from django.utils.translation import ugettext as _ diff --git a/geonode/services/tests.py b/geonode/services/tests.py index 5558e38469b..b6fd48ee4ed 100644 --- a/geonode/services/tests.py +++ b/geonode/services/tests.py @@ -23,7 +23,7 @@ from selenium import webdriver from unittest import TestCase as StandardTestCase -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth import get_user_model from django.template.defaultfilters import slugify try: diff --git a/geonode/services/views.py b/geonode/services/views.py index df37c3d6d77..95410c62174 100644 --- a/geonode/services/views.py +++ b/geonode/services/views.py @@ -23,7 +23,7 @@ from django.conf import settings from django.contrib import messages from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator -from django.core.urlresolvers import reverse +from django.urls import reverse from django.http import HttpResponse, HttpResponseRedirect from django.http import Http404 from django.shortcuts import get_object_or_404 diff --git a/geonode/settings.py b/geonode/settings.py index 720394148ce..f485efd1ee5 100644 --- a/geonode/settings.py +++ b/geonode/settings.py @@ -41,7 +41,12 @@ from kombu import Queue, Exchange -SILENCED_SYSTEM_CHECKS = ['1_8.W001', 'fields.W340', 'auth.W004', 'urls.W002'] +SILENCED_SYSTEM_CHECKS = [ + '1_8.W001', + 'fields.W340', + 'auth.W004', + 'urls.W002' +] # GeoNode Version VERSION = get_version() @@ -631,7 +636,7 @@ }, ] -MIDDLEWARE_CLASSES = ( +MIDDLEWARE = ( 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', @@ -644,14 +649,7 @@ 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', - - # Security settings 'django.middleware.security.SecurityMiddleware', - - # If you use SessionAuthenticationMiddleware, be sure it appears before OAuth2TokenMiddleware. - # SessionAuthenticationMiddleware is NOT required for using - # django-oauth-toolkit. - 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'oauth2_provider.middleware.OAuth2TokenMiddleware', ) @@ -663,7 +661,7 @@ if SESSION_EXPIRED_CONTROL_ENABLED: # This middleware checks for ACCESS_TOKEN validity and if expired forces # user logout - MIDDLEWARE_CLASSES += \ + MIDDLEWARE += \ ('geonode.security.middleware.SessionControlMiddleware',) SESSION_COOKIE_SECURE = ast.literal_eval(os.environ.get('SESSION_COOKIE_SECURE', 'False')) @@ -920,8 +918,8 @@ # Set to name of database in DATABASES dictionary to enable # 'datastore', 'DATASTORE': os.getenv('DEFAULT_BACKEND_DATASTORE', ''), - 'TIMEOUT': int(os.getenv('OGC_REQUEST_TIMEOUT', '5')), - 'MAX_RETRIES': int(os.getenv('OGC_REQUEST_MAX_RETRIES', '2')), + 'TIMEOUT': int(os.getenv('OGC_REQUEST_TIMEOUT', '10')), + 'MAX_RETRIES': int(os.getenv('OGC_REQUEST_MAX_RETRIES', '3')), 'BACKOFF_FACTOR': float(os.getenv('OGC_REQUEST_BACKOFF_FACTOR', '0.3')), 'POOL_MAXSIZE': int(os.getenv('OGC_REQUEST_POOL_MAXSIZE', '10')), 'POOL_CONNECTIONS': int(os.getenv('OGC_REQUEST_POOL_CONNECTIONS', '10')), @@ -1058,11 +1056,7 @@ } } -# handle timestamps like 2017-05-30 16:04:00.719 UTC -if django.VERSION[0] == 1 and django.VERSION[1] >= 9: - _DATETIME_INPUT_FORMATS = ['%Y-%m-%d %H:%M:%S.%f %Z', '%Y-%m-%dT%H:%M:%S.%f', '%Y-%m-%dT%H:%M:%S%Z'] -else: - _DATETIME_INPUT_FORMATS = ('%Y-%m-%d %H:%M:%S.%f %Z', '%Y-%m-%dT%H:%M:%S.%f', '%Y-%m-%dT%H:%M:%S%Z') +_DATETIME_INPUT_FORMATS = ['%Y-%m-%d %H:%M:%S.%f %Z', '%Y-%m-%dT%H:%M:%S.%f', '%Y-%m-%dT%H:%M:%S%Z'] DATETIME_INPUT_FORMATS = DATETIME_INPUT_FORMATS + _DATETIME_INPUT_FORMATS DISPLAY_SOCIAL = ast.literal_eval(os.getenv('DISPLAY_SOCIAL', 'True')) @@ -1285,8 +1279,8 @@ if MONITORING_ENABLED: if 'geonode.monitoring' not in INSTALLED_APPS: INSTALLED_APPS += ('geonode.monitoring',) - if 'geonode.monitoring.middleware.MonitoringMiddleware' not in MIDDLEWARE_CLASSES: - MIDDLEWARE_CLASSES += \ + if 'geonode.monitoring.middleware.MonitoringMiddleware' not in MIDDLEWARE: + MIDDLEWARE += \ ('geonode.monitoring.middleware.MonitoringMiddleware',) # skip certain paths to not to mud stats too much @@ -1830,7 +1824,7 @@ def get_geonode_catalogue_service(): # Require users to authenticate before using Geonode if LOCKDOWN_GEONODE: - MIDDLEWARE_CLASSES = MIDDLEWARE_CLASSES + \ + MIDDLEWARE += \ ('geonode.security.middleware.LoginRequiredMiddleware',) # for windows users check if they didn't set GEOS and GDAL in local_settings.py diff --git a/geonode/tests/integration.py b/geonode/tests/integration.py index eaaabdd3f27..e6a5237d7e8 100644 --- a/geonode/tests/integration.py +++ b/geonode/tests/integration.py @@ -34,7 +34,7 @@ from tastypie.test import ResourceTestCaseMixin from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth import get_user_model from django.core.management import call_command from django.test.utils import override_settings diff --git a/geonode/tests/smoke.py b/geonode/tests/smoke.py index 07f137df0dd..26185b587dc 100644 --- a/geonode/tests/smoke.py +++ b/geonode/tests/smoke.py @@ -24,7 +24,7 @@ import math from django.conf import settings from django.test import override_settings -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth import get_user_model from user_messages.models import Message diff --git a/geonode/tests/utils.py b/geonode/tests/utils.py index 3badea33e05..15ae03d4c75 100644 --- a/geonode/tests/utils.py +++ b/geonode/tests/utils.py @@ -51,13 +51,14 @@ import logging import contextlib +from io import IOBase from bs4 import BeautifulSoup from requests_toolbelt.multipart.encoder import MultipartEncoder from django.core import mail from django.conf import settings from django.db.models import signals -from django.core.urlresolvers import reverse +from django.urls import reverse from django.core.management import call_command from django.contrib.auth import get_user_model from django.test.client import Client as DjangoTestClient @@ -117,7 +118,7 @@ def make_request(self, path, data=None, ajax=False, debug=True, force_login=Fals if data: for name, value in data.items(): - if isinstance(value, file): + if isinstance(value, IOBase): data[name] = (os.path.basename(value.name), value) encoder = MultipartEncoder(fields=data) diff --git a/geonode/themes/migrations/0010_auto_20200115_1121.py b/geonode/themes/migrations/0010_auto_20200115_1121.py new file mode 100644 index 00000000000..efaec0aecbb --- /dev/null +++ b/geonode/themes/migrations/0010_auto_20200115_1121.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.9 on 2020-01-15 11:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('geonode_themes', '0009_geonodethemecustomization_footer_bg_color'), + ] + + operations = [ + migrations.AlterField( + model_name='geonodethemecustomization', + name='jumbotron_cta_hide', + field=models.BooleanField(blank=True, default=False, verbose_name='Hide call to action'), + ), + ] diff --git a/geonode/themes/models.py b/geonode/themes/models.py index a1f136f38e5..c74fba1b074 100644 --- a/geonode/themes/models.py +++ b/geonode/themes/models.py @@ -44,8 +44,11 @@ def partner_link(self): _href = self.href if self.href.startswith('http') else 'http://%s' % self.href return u"{0}".format(_href) + def __str__(self): + return "{0}".format(self.title) + def __unicode__(self): - return u"{0}".format(self.title) + return u"{0}".format(self.__str__()) class Meta: ordering = ("name", ) @@ -191,8 +194,11 @@ def theme_uuid(self): self.identifier = slugify("theme id %s %s" % (self.id, self.date)) return u"{0}".format(self.identifier) + def __str__(self): + return "{0}".format(self.name) + def __unicode__(self): - return u"{0}".format(self.name) + return u"{0}".format(self.__str__()) class Meta: ordering = ("date", ) diff --git a/geonode/upload/migrations/24_initial.py b/geonode/upload/migrations/24_initial.py index 43c770203ec..1ab9bd4cd28 100644 --- a/geonode/upload/migrations/24_initial.py +++ b/geonode/upload/migrations/24_initial.py @@ -31,8 +31,8 @@ class Migration(migrations.Migration): ('mosaic_time_value', models.CharField(max_length=128, null=True)), ('mosaic_elev_regex', models.CharField(max_length=128, null=True)), ('mosaic_elev_value', models.CharField(max_length=128, null=True)), - ('layer', models.ForeignKey(to='layers.Layer', null=True)), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, null=True)), + ('layer', models.ForeignKey(to='layers.Layer', on_delete=models.SET_NULL, null=True)), + ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True)), ], options={ 'ordering': ['-date'], @@ -44,7 +44,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('file', models.FileField(upload_to='uploads')), ('slug', models.SlugField(blank=True)), - ('upload', models.ForeignKey(blank=True, to='upload.Upload', null=True)), + ('upload', models.ForeignKey(blank=True, to='upload.Upload', on_delete=models.SET_NULL, null=True)), ], ), ] diff --git a/geonode/upload/models.py b/geonode/upload/models.py index f8cff9e7c63..b16623c6e00 100644 --- a/geonode/upload/models.py +++ b/geonode/upload/models.py @@ -22,7 +22,7 @@ import logging import shutil -from django.core.urlresolvers import reverse +from django.urls import reverse from django.db import models from django.conf import settings from django.utils.timezone import now @@ -57,11 +57,11 @@ class Upload(models.Model): objects = UploadManager() import_id = models.BigIntegerField(null=True) - user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True) + user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.SET_NULL) # hold importer state or internal state (STATE_) state = models.CharField(max_length=16) date = models.DateTimeField('date', default=now) - layer = models.ForeignKey(Layer, null=True) + layer = models.ForeignKey(Layer, null=True, on_delete=models.SET_NULL) upload_dir = models.CharField(max_length=100, null=True) name = models.CharField(max_length=64, null=True) complete = models.BooleanField(default=False) @@ -131,24 +131,29 @@ def delete(self, cascade=True): if self.upload_dir and path.exists(self.upload_dir): shutil.rmtree(self.upload_dir) - def __unicode__(self): + def __str__(self): return 'Upload [%s] gs%s - %s, %s' % (self.pk, self.import_id, self.name, self.user) + def __unicode__(self): + return u"{0}".format(self.__str__()) + class UploadFile(models.Model): - upload = models.ForeignKey(Upload, null=True, blank=True) + upload = models.ForeignKey(Upload, null=True, blank=True, on_delete=models.SET_NULL) file = models.FileField(upload_to="uploads") slug = models.SlugField(max_length=50, blank=True) + def __str__(self): + return "{0}".format(self.slug) + def __unicode__(self): - return self.slug + return u"{0}".format(self.__str__()) - @models.permalink def get_absolute_url(self): - return ('data_upload_new', ) + return reverse('data_upload_new', args=[self.slug, self.version_number]) def save(self, *args, **kwargs): self.slug = self.file.name diff --git a/geonode/upload/tests/test_settings.py b/geonode/upload/tests/test_settings.py index cfef75510a6..3960c3a8e09 100644 --- a/geonode/upload/tests/test_settings.py +++ b/geonode/upload/tests/test_settings.py @@ -57,10 +57,10 @@ SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer' SESSION_EXPIRED_CONTROL_ENABLED = False -if 'geonode.security.middleware.SessionControlMiddleware' in MIDDLEWARE_CLASSES: - _middleware = list(MIDDLEWARE_CLASSES) +if 'geonode.security.middleware.SessionControlMiddleware' in MIDDLEWARE: + _middleware = list(MIDDLEWARE) _middleware.remove('geonode.security.middleware.SessionControlMiddleware') - MIDDLEWARE_CLASSES = tuple(_middleware) + MIDDLEWARE = tuple(_middleware) # Django 1.11 ParallelTestSuite TEST_RUNNER = 'geonode.tests.suite.runner.GeoNodeBaseSuiteDiscoverRunner' @@ -152,7 +152,7 @@ 'LOG_FILE': '%s/geoserver/data/logs/geoserver.log' % os.path.abspath(os.path.join(PROJECT_ROOT, os.pardir)), # Set to dictionary identifier of database containing spatial data in DATABASES dictionary to enable 'DATASTORE': 'datastore', - 'TIMEOUT': int(os.getenv('OGC_REQUEST_TIMEOUT', '5')), + 'TIMEOUT': int(os.getenv('OGC_REQUEST_TIMEOUT', '10')), 'MAX_RETRIES': int(os.getenv('OGC_REQUEST_MAX_RETRIES', '0')), 'BACKOFF_FACTOR': float(os.getenv('OGC_REQUEST_BACKOFF_FACTOR', '0.0')), 'POOL_MAXSIZE': int(os.getenv('OGC_REQUEST_POOL_MAXSIZE', '10')), @@ -209,6 +209,6 @@ if MONITORING_ENABLED: if 'geonode.monitoring' not in INSTALLED_APPS: INSTALLED_APPS += ('geonode.monitoring',) - if 'geonode.monitoring.middleware.MonitoringMiddleware' not in MIDDLEWARE_CLASSES: - MIDDLEWARE_CLASSES += \ + if 'geonode.monitoring.middleware.MonitoringMiddleware' not in MIDDLEWARE: + MIDDLEWARE += \ ('geonode.monitoring.middleware.MonitoringMiddleware',) diff --git a/geonode/upload/upload.py b/geonode/upload/upload.py index 2ef5bd847b9..cdb8eb8a58b 100644 --- a/geonode/upload/upload.py +++ b/geonode/upload/upload.py @@ -656,10 +656,9 @@ def final_step(upload_session, user, charset="UTF-8"): try: style = cat.get_style(name + '_layer', workspace=settings.DEFAULT_WORKSPACE) or \ cat.get_style(name + '_layer') - except BaseException: + except BaseException as e: style = cat.get_style('point') - logger.warn(msg) - e.args = (msg,) + logger.warn(str(e)) if style: publishing.default_style = style diff --git a/geonode/upload/utils.py b/geonode/upload/utils.py index 6b537f11961..38d6a7fb335 100644 --- a/geonode/upload/utils.py +++ b/geonode/upload/utils.py @@ -32,7 +32,7 @@ from six import string_types, text_type from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import render from django.utils.translation import ugettext as _ diff --git a/geonode/upload/views.py b/geonode/upload/views.py index cd2772d98f3..9be51280377 100644 --- a/geonode/upload/views.py +++ b/geonode/upload/views.py @@ -51,7 +51,7 @@ from django.conf import settings from django.contrib.auth.decorators import login_required from django.core.exceptions import PermissionDenied -from django.core.urlresolvers import reverse +from django.urls import reverse from django.http import HttpResponseRedirect from django.utils.html import escape from django.shortcuts import get_object_or_404 @@ -631,7 +631,7 @@ def final_step_view(req, upload_session): def view(req, step): """Main uploader view""" from django.contrib import auth - if not auth.get_user(req).is_authenticated(): + if not auth.get_user(req).is_authenticated: return error_response(req, errors=["Not Authorized"]) upload_session = None upload_id = req.GET.get('id', None) diff --git a/geonode/urls.py b/geonode/urls.py index b04d0436261..3929d0ed40b 100644 --- a/geonode/urls.py +++ b/geonode/urls.py @@ -27,7 +27,7 @@ from django.views.generic import TemplateView from django.contrib import admin from django.conf.urls.i18n import i18n_patterns -from django.views.i18n import javascript_catalog +from django.views.i18n import JavaScriptCatalog from django.contrib.sitemaps.views import sitemap import geonode.proxy.urls @@ -47,7 +47,7 @@ js_info_dict = { 'domain': 'djangojs', - 'packages': ('geonode',) + 'packages': 'geonode' } sitemaps = { @@ -76,8 +76,6 @@ name='privacy-cookies'), # Meta - url(r'^jsi18n/$', javascript_catalog, - js_info_dict, name='javascript-catalog'), url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps}, name='sitemap'), url(r'^robots\.txt$', TemplateView.as_view( @@ -142,8 +140,6 @@ geonode.views.moderator_contacted, name='moderator_contacted'), - # url(r'^i18n/', include('django.conf.urls.i18n')), - # url(r'^admin/', include(admin.site.urls)), url(r'^groups/', include('geonode.groups.urls')), url(r'^documents/', include('geonode.documents.urls')), url(r'^services/', include('geonode.services.urls')), @@ -170,11 +166,13 @@ ] urlpatterns += i18n_patterns( - url("^admin/", include(admin.site.urls)), + url(r'^admin/', admin.site.urls, name="admin"), ) +# Internationalization Javascript urlpatterns += [ - url(r'^i18n/', include(django.conf.urls.i18n)) + url(r'^i18n/', include(django.conf.urls.i18n), name="i18n"), + url(r'^jsi18n/$', JavaScriptCatalog.as_view(), js_info_dict, name='javascript-catalog') ] urlpatterns += [ # '', diff --git a/geonode/utils.py b/geonode/utils.py index 70da54f8f7d..aeab7e62de2 100755 --- a/geonode/utils.py +++ b/geonode/utils.py @@ -211,7 +211,7 @@ def get_headers(request, url, raw_url, allowed_hosts=[]): csrftoken = None if settings.SESSION_COOKIE_NAME in request.COOKIES and is_safe_url( - url=raw_url, host=url.hostname): + url=raw_url, allowed_hosts=url.hostname): cookies = request.META["HTTP_COOKIE"] for cook in request.COOKIES: @@ -1456,7 +1456,7 @@ def request(self, url, method='GET', data=None, headers={}, stream=False, timeou pass elif user == self.username: valid_uname_pw = base64.b64encode( - b"%s:%s" % (self.username, self.password)).decode("ascii") + ("%s:%s" % (self.username, self.password)).encode("UTF-8")).decode("ascii") headers['Authorization'] = 'Basic {}'.format(valid_uname_pw) response = None @@ -1623,7 +1623,7 @@ def slugify_zh(text, separator='_'): def set_resource_default_links(instance, layer, prune=False, **kwargs): from geonode.base.models import Link - from django.core.urlresolvers import reverse + from django.urls import reverse from django.utils.translation import ugettext # Prune old links diff --git a/geonode/views.py b/geonode/views.py index 91c4a205174..a504482243c 100644 --- a/geonode/views.py +++ b/geonode/views.py @@ -22,7 +22,7 @@ from django.conf import settings from django.contrib.auth import authenticate, login, get_user_model from django.http import HttpResponse, HttpResponseRedirect -from django.core.urlresolvers import reverse +from django.urls import reverse import json from django.db.models import Q from django.template.response import TemplateResponse @@ -100,8 +100,8 @@ def ajax_lookup(request): ) -def err403(request): - if not request.user.is_authenticated(): +def err403(request, exception): + if not request.user.is_authenticated: return HttpResponseRedirect( reverse('account_login') + '?next=' + @@ -111,7 +111,7 @@ def err403(request): def ident_json(request): - if not request.user.is_authenticated(): + if not request.user.is_authenticated: return HttpResponseRedirect( reverse('account_login') + '?next=' + diff --git a/pavement.py b/pavement.py index 4c368e79f3f..9321f9a3ee5 100644 --- a/pavement.py +++ b/pavement.py @@ -1193,18 +1193,18 @@ def kill(arg1, arg2): for line in lines: # this kills all java.exe and python including self in windows if ('%s' % - arg2 in line) or (os.name == 'nt' and '%s' % - arg1 in line): + arg2 in str(line)) or (os.name == 'nt' and '%s' % + arg1 in str(line)): running = True # Get pid fields = line.strip().split() - info('Stopping %s (process number %s)' % (arg1, fields[1])) + info('Stopping %s (process number %s)' % (arg1, int(fields[1]))) if os.name == 'nt': - kill = 'taskkill /F /PID "%s"' % fields[1] + kill = 'taskkill /F /PID "%s"' % int(fields[1]) else: - kill = 'kill -9 %s 2> /dev/null' % fields[1] + kill = 'kill -9 %s 2> /dev/null' % int(fields[1]) os.system(kill) # Give it a little more time @@ -1215,7 +1215,7 @@ def kill(arg1, arg2): if running: raise Exception('Could not stop %s: ' 'Running processes are\n%s' - % (arg1, '\n'.join([l.strip() for l in lines]))) + % (arg1, '\n'.join([str(l).strip() for l in lines]))) def waitfor(url, timeout=300): diff --git a/requirements.txt b/requirements.txt index 2a41c4385e1..2c176b83b71 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,9 @@ # native dependencies Pillow==6.2.2 -lxml==4.4.2 +lxml==4.4.0 defusedxml==0.6.0 psycopg2==2.8.4 -Django==1.11.27 +Django==2.2.9 # Other amqp==2.5.2 @@ -19,33 +19,33 @@ decorator==4.4.1 celery==4.4.0 kombu==4.6.7 boto3==1.11.0 -six<1.14.0 +six==1.12.0 tqdm==4.41.1 Deprecated==1.2.7 wrapt==1.11.2 # Django Apps -django-allauth==0.40.0 +django-allauth==0.41.0 django-appconf==1.0.3 -django-filter==1.1.0 +django-filter==2.2.0 django-imagekit==4.0.2 -django-jsonfield<1.4.1 -django-jsonfield-compat<=0.4.4 +django-jsonfield==1.4.0 +django-jsonfield-compat==0.4.4 django-taggit==0.24.0 django-mptt==0.9.1 django-modeltranslation>=0.11,<0.15.0 django-treebeard==4.3.1 django-guardian<=1.4.9 -django-downloadview<=1.9 +django-downloadview==1.10 django-polymorphic==2.1.2 django-tastypie<0.15.0 oauthlib==3.1.0 pyopenssl==19.1.0 # geopython dependencies -pyproj>=1.9.5,<2.2.3.0 +pyproj==2.2.1 OWSLib==0.18.0 -pycsw==2.4.0 +pycsw==2.4.1 SQLAlchemy==1.3.12 # required by PyCSW Shapely==1.6.4.post2 mercantile==1.1.2 @@ -72,17 +72,16 @@ django-recaptcha==2.0.5 geonode-oauth-toolkit==1.1.4.6 # GeoNode org maintained apps. -django-geoexplorer==4.0.43 -django-mapstore-adapter==1.0.17 -django-geonode-mapstore-client==1.4.8 +django-mapstore-adapter==2.0.0b0 +django-geonode-mapstore-client==2.0.0a0 django-geonode-client==1.0.9 -geonode-user-messages==0.1.15 -geonode-avatar==2.1.8 -geonode-announcements==1.0.13 +geonode-user-messages==2.0.0rc0 +geonode-avatar==3.0.2b0 +geonode-announcements==2.0.0b0 arcrest>=10.0 -geonode-dialogos==3.0 -geoserver-restconfig==1.0.5 -gn-gsimporter==1.0.17 +geonode-dialogos==3.0.1b0 +geoserver-restconfig==2.0.0b0 +gn-gsimporter==2.0.0b0 gisdata==0.5.4 # haystack/elasticsearch @@ -135,5 +134,5 @@ pytest-bdd==3.2.1 splinter==0.13.0 pytest-splinter==2.0.1 pytest-django==3.7.0 -setuptools==44.0.0 +setuptools==45.0.0 Twisted==19.10.0 diff --git a/setup.py b/setup.py index 3c02a3cbfc7..73f905419b7 100644 --- a/setup.py +++ b/setup.py @@ -38,8 +38,8 @@ description="Application for serving and sharing geospatial data", long_description=open('README.md').read(), classifiers=[ - "Development Status :: 4 - Beta"], - python_requires='>=2.7, <3', + "Development Status :: 5 - Production/Stable"], + python_requires='>=3', keywords='', author='GeoNode Developers', author_email='dev@geonode.org',