"
TYPE_UNKNOWN = FileType("unknown", None, None)
@@ -298,8 +298,7 @@ def scan_file(file_name, scan_hint=None, charset=None):
if len(found) == 1:
found[0].xml_files = xml_files
else:
- raise Exception(_("One or more XML files was provided, but no " +
- "matching files were found for them."))
+ raise Exception(_("One or more XML files was provided, but no matching files were found for them."))
# detect slds and assign if a single upload is found
sld_files = _find_file_type(safe_paths, extension='.sld')
@@ -307,8 +306,7 @@ def scan_file(file_name, scan_hint=None, charset=None):
if len(found) == 1:
found[0].sld_files = sld_files
else:
- raise Exception(_("One or more SLD files was provided, but no " +
- "matching files were found for them."))
+ raise Exception(_("One or more SLD files was provided, but no matching files were found for them."))
return SpatialFiles(dirname, found, archive=archive)
diff --git a/geonode/upload/models.py b/geonode/upload/models.py
index b503ee03e50..ccf9b854487 100644
--- a/geonode/upload/models.py
+++ b/geonode/upload/models.py
@@ -109,14 +109,13 @@ def update_from_session(self, upload_session):
self.save()
def get_resume_url(self):
- return reverse('data_upload') + "?id=%s" % self.import_id
+ return f"{reverse('data_upload')}?id={self.import_id}"
def get_delete_url(self):
return reverse('data_upload_delete', args=[self.import_id])
def get_import_url(self):
- return "%srest/imports/%s" % (
- ogc_server_settings.LOCATION, self.import_id)
+ return f"{ogc_server_settings.LOCATION}rest/imports/{self.import_id}"
def delete(self, cascade=True):
models.Model.delete(self)
@@ -134,10 +133,7 @@ def delete(self, cascade=True):
shutil.rmtree(self.upload_dir)
def __str__(self):
- return 'Upload [%s] gs%s - %s, %s' % (self.pk,
- self.import_id,
- self.name,
- self.user)
+ return f'Upload [{self.pk}] gs{self.import_id} - {self.name}, {self.user}'
class UploadFile(models.Model):
@@ -146,7 +142,7 @@ class UploadFile(models.Model):
slug = models.SlugField(max_length=50, blank=True)
def __str__(self):
- return "{0}".format(self.slug)
+ return f"{self.slug}"
def get_absolute_url(self):
return reverse('data_upload_new', args=[self.slug, ])
diff --git a/geonode/upload/tests/__init__.py b/geonode/upload/tests/__init__.py
index 7cb1e85e918..719b69c6ff1 100644
--- a/geonode/upload/tests/__init__.py
+++ b/geonode/upload/tests/__init__.py
@@ -93,7 +93,7 @@ def test_scan_file(self):
"""
exts = ('.shp', '.shx', '.sld', '.xml', '.prj', '.dbf')
- with create_files(['san_andres_y_providencia_location{0}'.format(s) for s in exts]) as tests:
+ with create_files([f'san_andres_y_providencia_location{s}' for s in exts]) as tests:
shp = [s for s in tests if s.endswith('.shp')][0]
spatial_files = scan_file(shp)
self.assertTrue(isinstance(spatial_files, SpatialFiles))
@@ -127,7 +127,7 @@ def test_scan_file(self):
basedir = os.path.dirname(spatial_file.base_file)
for f in file_names:
- path = os.path.join(basedir, '_%s' % f)
+ path = os.path.join(basedir, f'_{f}')
self.assertTrue(os.path.exists(path))
# Test the scan_file function with a raster spatial file takes SLD also.
diff --git a/geonode/upload/tests/integration.py b/geonode/upload/tests/integration.py
index efb9a89e733..8976bc927fd 100644
--- a/geonode/upload/tests/integration.py
+++ b/geonode/upload/tests/integration.py
@@ -73,13 +73,7 @@
DB_NAME = settings.DATABASES['default']['NAME']
DB_USER = settings.DATABASES['default']['USER']
DB_PASSWORD = settings.DATABASES['default']['PASSWORD']
-DATASTORE_URL = 'postgis://{}:{}@{}:{}/{}'.format(
- DB_USER,
- DB_PASSWORD,
- DB_HOST,
- DB_PORT,
- DB_NAME
-)
+DATASTORE_URL = f'postgis://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}'
postgis_db = dj_database_url.parse(DATASTORE_URL, conn_max_age=0)
logging.getLogger('south').setLevel(logging.WARNING)
@@ -101,11 +95,9 @@ def get_wms(version='1.1.1', type_name=None, username=None, password=None):
# right now owslib does not support auth for get caps
# requests. Either we should roll our own or fix owslib
if type_name:
- url = GEOSERVER_URL + \
- '%swms?request=getcapabilities' % type_name.replace(':', '/')
+ url = f"{GEOSERVER_URL}{type_name.replace(':', '/')}wms?request=getcapabilities"
else:
- url = GEOSERVER_URL + \
- 'wms?request=getcapabilities'
+ url = f"{GEOSERVER_URL}wms?request=getcapabilities"
ogc_server_settings = settings.OGC_SERVER['default']
if username and password:
return WebMapService(
@@ -150,7 +142,7 @@ def setUp(self):
GEONODE_URL, GEONODE_USER, GEONODE_PASSWD
)
self.catalog = Catalog(
- GEOSERVER_URL + 'rest',
+ f"{GEOSERVER_URL}rest",
GEOSERVER_USER,
GEOSERVER_PASSWD,
retries=ogc_server_settings.MAX_RETRIES,
@@ -197,7 +189,7 @@ def check_layer_geoserver_caps(self, type_name):
type_name=type_name, username=GEOSERVER_USER, password=GEOSERVER_PASSWD)
ws, layer_name = type_name.split(':')
self.assertTrue(layer_name in wms.contents,
- '%s is not in %s' % (layer_name, wms.contents))
+ f'{layer_name} is not in {wms.contents}')
def check_layer_geoserver_rest(self, layer_name):
""" Check that a layer shows up in GeoServer rest api after
@@ -228,7 +220,7 @@ def check_save_step(self, resp, data):
self.assertEqual(resp.status_code, 200)
self.assertTrue(isinstance(data, dict))
# make that the upload returns a success True key
- self.assertTrue(data['success'], 'expected success but got %s' % data)
+ self.assertTrue(data['success'], f'expected success but got {data}')
self.assertTrue('redirect_to' in data)
def complete_upload(self, file_path, resp, data, is_raster=False):
@@ -267,8 +259,7 @@ def finish_upload(
if data['success']:
self.assertTrue(
data['success'],
- 'expected success but got %s' %
- data)
+ f'expected success but got {data}')
self.assertTrue('redirect_to' in data)
current_step = data['redirect_to']
self.wait_for_progress(data.get('progress'))
@@ -294,8 +285,7 @@ def finish_upload(
# @todo - make the check match completely (endswith at least)
# currently working around potential 'orphaned' db tables
self.assertTrue(
- layer_name in url, 'expected %s in URL, got %s' %
- (layer_name, url))
+ layer_name in url, f'expected {layer_name} in URL, got {url}')
return url
except Exception:
return current_step
@@ -311,10 +301,9 @@ def check_upload_model(self, original_name):
# the import session is COMPLETE
if upload and not upload.complete:
logger.warning(
- "Upload not complete for Layer %s" %
- original_name)
+ f"Upload not complete for Layer {original_name}")
except Upload.DoesNotExist:
- self.fail('expected to find Upload object for %s' % original_name)
+ self.fail(f'expected to find Upload object for {original_name}')
def check_layer_complete(self, layer_page, original_name):
'''check everything to verify the layer is complete'''
@@ -341,8 +330,7 @@ def check_layer_complete(self, layer_page, original_name):
pass
if not caps_found:
logger.warning(
- "Could not recognize Layer %s on GeoServer WMS Capa" %
- original_name)
+ f"Could not recognize Layer {original_name} on GeoServer WMS Capa")
self.check_upload_model(layer_name)
def check_invalid_projection(self, layer_name, resp, data):
@@ -416,7 +404,7 @@ def wait_for_progress(self, progress_url):
json_data = resp.json()
# "COMPLETE" state means done
if json_data and json_data.get('state', '') == 'RUNNING' and \
- self.wait_for_progress_cnt < 100:
+ self.wait_for_progress_cnt < 100:
self.wait_for_progress_cnt += 1
self.wait_for_progress(progress_url)
else:
@@ -449,12 +437,12 @@ def test_shp_upload(self):
fname = os.path.join(
GOOD_DATA,
'vector',
- '%s.shp' % layer_name)
+ f'{layer_name}.shp')
self.upload_file(fname,
self.complete_upload,
- check_name='%s' % layer_name)
+ check_name=f'{layer_name}')
- test_layer = Layer.objects.filter(name__icontains='%s' % layer_name).last()
+ test_layer = Layer.objects.filter(name__icontains=f'{layer_name}').last()
if test_layer:
layer_attributes = test_layer.attributes
self.assertIsNotNone(layer_attributes)
@@ -482,20 +470,14 @@ def test_shp_upload(self):
self.assertIn(
_link_orig.url,
test_layer.csw_anytext,
- "The link URL {0} is not present in the 'csw_anytext' attribute of the layer '{1}'".format(
- _link_orig.url,
- test_layer.alternate
- )
- )
+ f"The link URL {_link_orig.url} is not present in the 'csw_anytext' attribute of the layer '{test_layer.alternate}'")
# Check catalogue
catalogue = get_catalogue()
record = catalogue.get_record(test_layer.uuid)
self.assertIsNotNone(record)
self.assertTrue(
hasattr(record, 'links'),
- "No records have been found in the catalogue for the resource '{}'".format(
- test_layer.alternate
- )
+ f"No records have been found in the catalogue for the resource '{test_layer.alternate}'"
)
# Check 'metadata' links for each record
for mime, name, metadata_url in record.links['metadata']:
@@ -510,10 +492,7 @@ def test_shp_upload(self):
)
self.assertIsNotNone(
_post_migrate_link_meta,
- "No '{}' links have been found in the catalogue for the resource '{}'".format(
- name,
- test_layer.alternate
- )
+ f"No '{name}' links have been found in the catalogue for the resource '{test_layer.alternate}'"
)
except Link.DoesNotExist:
_post_migrate_link_meta = None
@@ -657,7 +636,7 @@ def test_time(self):
timedir = os.path.join(GOOD_DATA, 'time')
layer_name = 'boxes_with_date'
- shp = os.path.join(timedir, '%s.shp' % layer_name)
+ shp = os.path.join(timedir, f'{layer_name}.shp')
# get to time step
resp, data = self.client.upload_file(shp)
@@ -685,15 +664,13 @@ def test_time(self):
self.assertTrue(
url.endswith(layer_name),
- 'expected url to end with %s, but got %s' %
- (layer_name,
- url))
+ f'expected url to end with {layer_name}, but got {url}')
self.assertEqual(resp.status_code, 200)
url = unquote(url)
self.check_layer_complete(url, layer_name)
wms = get_wms(
- type_name='geonode:%s' % layer_name, username=GEOSERVER_USER, password=GEOSERVER_PASSWD)
+ type_name=f'geonode:{layer_name}', username=GEOSERVER_USER, password=GEOSERVER_PASSWD)
layer_info = list(wms.items())[0][1]
self.assertEqual(100, len(layer_info.timepositions))
else:
@@ -705,7 +682,7 @@ def test_configure_time(self):
cascading_delete(layer_name=layer_name, catalog=gs_catalog)
def get_wms_timepositions():
- alternate_name = 'geonode:%s' % layer_name
+ alternate_name = f'geonode:{layer_name}'
if alternate_name in get_wms().contents:
metadata = get_wms().contents[alternate_name]
self.assertTrue(metadata is not None)
@@ -714,7 +691,7 @@ def get_wms_timepositions():
return None
thefile = os.path.join(
- GOOD_DATA, 'time', '%s.shp' % layer_name
+ GOOD_DATA, 'time', f'{layer_name}.shp'
)
resp, data = self.client.upload_file(thefile)
@@ -747,15 +724,13 @@ def get_wms_timepositions():
self.assertTrue(
url.endswith(layer_name),
- 'expected url to end with %s, but got %s' %
- (layer_name,
- url))
+ f'expected url to end with {layer_name}, but got {url}')
self.assertEqual(resp.status_code, 200)
url = unquote(url)
self.check_layer_complete(url, layer_name)
wms = get_wms(
- type_name='geonode:%s' % layer_name, username=GEOSERVER_USER, password=GEOSERVER_PASSWD)
+ type_name=f'geonode:{layer_name}', username=GEOSERVER_USER, password=GEOSERVER_PASSWD)
layer_info = list(wms.items())[0][1]
self.assertEqual(100, len(layer_info.timepositions))
else:
diff --git a/geonode/upload/tests/test_settings.py b/geonode/upload/tests/test_settings.py
index bc8586f9e5a..15e6493bfb9 100644
--- a/geonode/upload/tests/test_settings.py
+++ b/geonode/upload/tests/test_settings.py
@@ -40,7 +40,7 @@
# add trailing slash to site url. geoserver url will be relative to this
if not SITEURL.endswith('/'):
- SITEURL = '{}/'.format(SITEURL)
+ SITEURL = f'{SITEURL}/'
ALLOWED_HOSTS = ['localhost', 'geonode', 'django', 'geonode.example.com']
@@ -105,8 +105,7 @@
'GEOSERVER_PUBLIC_PORT', 8080
)
-_default_public_location = 'http://{}:{}/geoserver/'.format(
- GEOSERVER_PUBLIC_HOST, GEOSERVER_PUBLIC_PORT) if GEOSERVER_PUBLIC_PORT else 'http://{}/geoserver/'.format(GEOSERVER_PUBLIC_HOST)
+_default_public_location = f'http://{GEOSERVER_PUBLIC_HOST}:{GEOSERVER_PUBLIC_PORT}/geoserver/' if GEOSERVER_PUBLIC_PORT else f'http://{GEOSERVER_PUBLIC_HOST}/geoserver/'
GEOSERVER_WEB_UI_LOCATION = os.getenv(
'GEOSERVER_WEB_UI_LOCATION', GEOSERVER_LOCATION
@@ -145,7 +144,7 @@
'WMST_ENABLED': False,
'BACKEND_WRITE_ENABLED': True,
'WPS_ENABLED': False,
- 'LOG_FILE': '%s/geoserver/data/logs/geoserver.log' % os.path.abspath(os.path.join(PROJECT_ROOT, os.pardir)),
+ 'LOG_FILE': f'{os.path.abspath(os.path.join(PROJECT_ROOT, os.pardir))}/geoserver/data/logs/geoserver.log',
# Set to dictionary identifier of database containing spatial data in DATABASES dictionary to enable
'DATASTORE': 'datastore',
'TIMEOUT': int(os.getenv('OGC_REQUEST_TIMEOUT', '60')),
@@ -191,7 +190,7 @@
USER_ANALYTICS_ENABLED = ast.literal_eval(
os.getenv('USER_ANALYTICS_ENABLED', os.environ.get('MONITORING_ENABLED', 'False')))
USER_ANALYTICS_GZIP = ast.literal_eval(os.getenv('USER_ANALYTICS_GZIP',
- os.environ.get('MONITORING_ENABLED', 'False')))
+ os.environ.get('MONITORING_ENABLED', 'False')))
MONITORING_CONFIG = os.getenv("MONITORING_CONFIG", None)
MONITORING_HOST_NAME = os.getenv("MONITORING_HOST_NAME", HOSTNAME)
diff --git a/geonode/upload/upload.py b/geonode/upload/upload.py
index bccde9977bf..ac29cb2830c 100644
--- a/geonode/upload/upload.py
+++ b/geonode/upload/upload.py
@@ -147,7 +147,7 @@ def __init__(self, **kw):
if hasattr(self, k):
setattr(self, k, v)
else:
- raise Exception('not handled : %s' % k)
+ raise Exception(f'not handled : {k}')
def cleanup(self):
"""do what we should at the given state of the upload"""
@@ -257,10 +257,8 @@ def _check_geoserver_store(store_name, layer_type, overwrite):
"Name already in use and overwrite is False")
existing_type = resource.resource_type
if existing_type != layer_type:
- msg = ("Type of uploaded file {} ({}) does not "
- "match type of existing resource type "
- "{}".format(store_name, layer_type,
- existing_type))
+ msg = (f"Type of uploaded file {store_name} ({layer_type}) does not "
+ f"match type of existing resource type {existing_type}")
logger.error(msg)
raise GeoNodeException(msg)
@@ -281,7 +279,7 @@ def save_step(user, layer, spatial_files, overwrite=True, mosaic=False,
time_presentation_reference_value=None,
charset_encoding="UTF-8"):
logger.debug(
- 'Uploading layer: {}, files {!r}'.format(layer, spatial_files))
+ f'Uploading layer: {layer}, files {spatial_files!r}')
if len(spatial_files) > 1:
# we only support more than one file if they're rasters for mosaicing
if not all(
@@ -289,7 +287,7 @@ def save_step(user, layer, spatial_files, overwrite=True, mosaic=False,
raise UploadException(
"Please upload only one type of file at a time")
name = get_valid_layer_name(layer, overwrite)
- logger.debug('Name for layer: {!r}'.format(name))
+ logger.debug(f'Name for layer: {name!r}')
if not any(spatial_files.all_files()):
raise UploadException("Unable to recognize the uploaded file(s)")
the_layer_type = _get_layer_type(spatial_files)
@@ -297,11 +295,10 @@ def save_step(user, layer, spatial_files, overwrite=True, mosaic=False,
if the_layer_type not in (
FeatureType.resource_type,
Coverage.resource_type):
- raise RuntimeError("Expected layer type to FeatureType or "
- "Coverage, not {}".format(the_layer_type))
+ raise RuntimeError(f"Expected layer type to FeatureType or Coverage, not {the_layer_type}")
files_to_upload = preprocess_files(spatial_files)
- logger.debug("files_to_upload: {}".format(files_to_upload))
- logger.debug('Uploading {}'.format(the_layer_type))
+ logger.debug(f"files_to_upload: {files_to_upload}")
+ logger.debug(f'Uploading {the_layer_type}')
error_msg = None
try:
next_id = _get_next_id()
@@ -506,7 +503,7 @@ def build_att_remap_transform(att):
)
if transforms:
- logger.debug('Setting transforms %s' % transforms)
+ logger.debug(f'Setting transforms {transforms}')
upload_session.import_session.tasks[0].add_transforms(transforms)
try:
upload_session.time_transforms = transforms
@@ -576,7 +573,7 @@ def final_step(upload_session, user, charset="UTF-8"):
if import_session.state == 'INCOMPLETE':
if task.state != 'ERROR':
- raise Exception('unknown item state: %s' % task.state)
+ raise Exception(f'unknown item state: {task.state}')
elif import_session.state == 'READY':
import_session.commit()
elif import_session.state == 'PENDING':
@@ -586,8 +583,7 @@ def final_step(upload_session, user, charset="UTF-8"):
if not publishing:
raise LayerNotReady(
- "Expected to find layer named '%s' in geoserver" %
- name)
+ f"Expected to find layer named '{name}' in geoserver")
_log('Creating Django record for [%s]', name)
target = task.target
@@ -662,8 +658,7 @@ def final_step(upload_session, user, charset="UTF-8"):
temporal_extent_start=end)
except Exception as e:
_log(
- 'There was an error updating the mosaic temporal extent: ' +
- str(e))
+ f"There was an error updating the mosaic temporal extent: {str(e)}")
else:
_has_time = (True if upload_session.time and upload_session.time_info and
upload_session.time_transforms else False)
@@ -681,7 +676,7 @@ def final_step(upload_session, user, charset="UTF-8"):
abstract=abstract or '',
owner=user,
has_time=_has_time)
- )
+ )
except IntegrityError:
raise
assert saved_layer
@@ -711,8 +706,7 @@ def _store_file(saved_layer,
name=file_name,
base=base,
file=File(
- f, name='%s%s' %
- (assigned_name or saved_layer.name, type_name)))
+ f, name=f'{assigned_name or saved_layer.name}{type_name}'))
# save the system assigned name for the remaining files
if not assigned_name:
the_file = geonode_upload_session.layerfile_set.all()[0].file.name
@@ -770,7 +764,7 @@ def _store_file(saved_layer,
zf = zipfile.ZipFile(archive, 'r', allowZip64=True)
zf.extract(sld_file[0], os.path.dirname(archive))
# Assign the absolute path to this file
- sld_file[0] = os.path.dirname(archive) + '/' + sld_file[0]
+ sld_file[0] = f"{os.path.dirname(archive)}/{sld_file[0]}"
sld_file = sld_file[0]
sld_uploaded = True
# geoserver_set_style.apply_async((saved_layer.id, sld_file))
@@ -794,7 +788,7 @@ def _store_file(saved_layer,
zf = zipfile.ZipFile(archive, 'r', allowZip64=True)
zf.extract(xml_file[0], os.path.dirname(archive))
# Assign the absolute path to this file
- xml_file = os.path.dirname(archive) + '/' + xml_file[0]
+ xml_file = f"{os.path.dirname(archive)}/{xml_file[0]}"
if upload_session.time_info:
set_time_info(saved_layer, **upload_session.time_info)
diff --git a/geonode/upload/upload_preprocessing.py b/geonode/upload/upload_preprocessing.py
index 0963166d975..b980a249068 100644
--- a/geonode/upload/upload_preprocessing.py
+++ b/geonode/upload/upload_preprocessing.py
@@ -109,7 +109,6 @@ def preprocess_files(spatial_files):
def _extract_bbox_param(kml_doc, namespaces, param):
return kml_doc.xpath(
- "kml:Document/kml:GroundOverlay/kml:LatLonBox/"
- "kml:{}/text()".format(param),
+ f"kml:Document/kml:GroundOverlay/kml:LatLonBox/kml:{param}/text()",
namespaces=namespaces
)[0]
diff --git a/geonode/upload/upload_validators.py b/geonode/upload/upload_validators.py
index 24160da4183..a5618dcab97 100644
--- a/geonode/upload/upload_validators.py
+++ b/geonode/upload/upload_validators.py
@@ -46,7 +46,7 @@ def _supported_type(ext, supported_types):
def validate_uploaded_files(cleaned, uploaded_files, field_spatial_types):
- logger.debug("uploaded_files: {}".format(uploaded_files))
+ logger.debug(f"uploaded_files: {uploaded_files}")
requires_datastore = () if ogc_server_settings.DATASTORE else (
'csv',
'kml')
@@ -152,11 +152,9 @@ def _validate_shapefile_components(possible_filenames):
else:
if additional_component.mandatory:
raise forms.ValidationError(
- "Could not find {!r} file, which is mandatory for "
- "shapefile uploads".format(
- additional_component.extension)
+ f"Could not find {additional_component.extension!r} file, which is mandatory for shapefile uploads"
)
- logger.debug("shapefile components: {}".format(components))
+ logger.debug(f"shapefile components: {components}")
return components
@@ -174,8 +172,8 @@ def _validate_kml_bytes(kml_bytes, other_files):
"kml:Icon/kml:href/text()", namespaces=namespaces)[0].strip()
except IndexError:
image_path = ""
- logger.debug("image_path: {}".format(image_path))
- logger.debug("other_files: {}".format(other_files))
+ logger.debug(f"image_path: {image_path}")
+ logger.debug(f"other_files: {other_files}")
if image_path not in other_files:
raise forms.ValidationError(
_("Ground overlay image declared in kml file cannot be found"))
@@ -259,10 +257,10 @@ def dupes(_a):
valid_extensions = None
raster_types = [t for t in files.types if t.layer_type == files.raster]
- raster_exts = [".%s" % t.code for t in raster_types]
+ raster_exts = [f".{t.code}" for t in raster_types]
raster_aliases = []
for alias in [aliases for aliases in [t.aliases for t in raster_types] if aliases]:
- raster_aliases.extend([".%s" % a for a in alias])
+ raster_aliases.extend([f".{a}" for a in alias])
raster_exts.extend(raster_aliases)
raster_files = [
diff --git a/geonode/upload/utils.py b/geonode/upload/utils.py
index ae209f3766e..94346c4378f 100644
--- a/geonode/upload/utils.py
+++ b/geonode/upload/utils.py
@@ -146,7 +146,7 @@ def error_response(req, exception=None, errors=None, force_ajax=True):
return render(
req,
'upload/layer_upload_error.html',
- context={'error_msg': 'Unexpected error : %s,' % exception})
+ context={'error_msg': f'Unexpected error : {exception},'})
def json_load_byteified(file_handle):
@@ -257,7 +257,7 @@ def get_next_step(upload_session, offset=1):
try:
pages = _pages[upload_session.upload_type]
except KeyError as e:
- raise Exception(_('Unsupported file type: %s' % e.message))
+ raise Exception(_(f'Unsupported file type: {e.message}'))
index = -1
if upload_session.completed_step and upload_session.completed_step != 'save':
index = pages.index(upload_session.completed_step)
@@ -299,7 +299,7 @@ def next_step_response(req, upload_session, force_ajax=True):
{'status': 'error',
'success': False,
'id': import_session.id,
- 'error_msg': "%s" % upload_session.error_msg,
+ 'error_msg': f"{upload_session.error_msg}",
}
)
@@ -310,13 +310,13 @@ def next_step_response(req, upload_session, force_ajax=True):
upload_session.completed_step = 'check'
return next_step_response(req, upload_session, force_ajax=True)
if next == 'check' and force_ajax:
- url = reverse('data_upload') + "?id=%s" % (import_session.id)
+ url = f"{reverse('data_upload')}?id={import_session.id}"
return json_response(
{'url': url,
'status': 'incomplete',
'success': True,
'id': import_session.id,
- 'redirect_to': settings.SITEURL + 'upload/check' + "?id=%s%s" % (import_session.id, _force_ajax),
+ 'redirect_to': f"{settings.SITEURL}upload/check?id={import_session.id}{_force_ajax}",
}
)
@@ -335,46 +335,46 @@ def next_step_response(req, upload_session, force_ajax=True):
upload_session.completed_step = 'time'
return next_step_response(req, upload_session, force_ajax)
if next == 'time' and force_ajax:
- url = reverse('data_upload') + "?id=%s" % (import_session.id)
+ url = f"{reverse('data_upload')}?id={import_session.id}"
return json_response(
{'url': url,
'status': 'incomplete',
'success': True,
'id': import_session.id,
- 'redirect_to': settings.SITEURL + 'upload/time' + "?id=%s%s" % (import_session.id, _force_ajax),
+ 'redirect_to': f"{settings.SITEURL}upload/time?id={import_session.id}{_force_ajax}",
}
)
if next == 'mosaic' and force_ajax:
- url = reverse('data_upload') + "?id=%s" % (import_session.id)
+ url = f"{reverse('data_upload')}?id={import_session.id}"
return json_response(
{'url': url,
'status': 'incomplete',
'success': True,
'id': import_session.id,
- 'redirect_to': settings.SITEURL + 'upload/mosaic' + "?id=%s%s" % (import_session.id, _force_ajax),
+ 'redirect_to': f"{settings.SITEURL}upload/mosaic?id={import_session.id}{_force_ajax}",
}
)
if next == 'srs' and force_ajax:
- url = reverse('data_upload') + "?id=%s" % (import_session.id)
+ url = f"{reverse('data_upload')}?id={import_session.id}"
return json_response(
{'url': url,
'status': 'incomplete',
'success': True,
'id': import_session.id,
- 'redirect_to': settings.SITEURL + 'upload/srs' + "?id=%s%s" % (import_session.id, _force_ajax),
+ 'redirect_to': f"{settings.SITEURL}upload/srs?id={import_session.id}{_force_ajax}",
}
)
if next == 'csv' and force_ajax:
- url = reverse('data_upload') + "?id=%s" % (import_session.id)
+ url = f"{reverse('data_upload')}?id={import_session.id}"
return json_response(
{'url': url,
'status': 'incomplete',
'success': True,
'id': import_session.id,
- 'redirect_to': settings.SITEURL + 'upload/csv' + "?id=%s%s" % (import_session.id, _force_ajax),
+ 'redirect_to': f"{settings.SITEURL}upload/csv?id={import_session.id}{_force_ajax}",
}
)
@@ -391,9 +391,9 @@ def next_step_response(req, upload_session, force_ajax=True):
force_ajax=force_ajax)
session_id = None
if 'id' in req.GET:
- session_id = "?id=%s" % (req.GET['id'])
+ session_id = f"?id={req.GET['id']}"
elif import_session and import_session.id:
- session_id = "?id=%s" % (import_session.id)
+ session_id = f"?id={import_session.id}"
if req.is_ajax() or force_ajax:
content_type = 'text/html' if not req.is_ajax() else None
@@ -444,9 +444,8 @@ def check_import_session_is_valid(request, upload_session, import_session):
layer = import_session.tasks[0].layer
invalid = [a for a in layer.attributes if str(a.name).find(' ') >= 0]
if invalid:
- att_list = "%s
" % '. '.join(
- [a.name for a in invalid])
- msg = "Attributes with spaces are not supported : %s" % att_list
+ att_list = f"{'. '.join([a.name for a in invalid])}
"
+ msg = f"Attributes with spaces are not supported : {att_list}"
upload_session.completed_step = 'error'
upload_session.error_msg = msg
return layer
@@ -522,7 +521,7 @@ def _fixup_base_file(absolute_base_file, tempdir=None):
if os.path.exists(absolute_base_file):
return absolute_base_file
else:
- raise Exception(_('File does not exist: %s' % absolute_base_file))
+ raise Exception(_(f'File does not exist: {absolute_base_file}'))
def _get_layer_values(layer, upload_session, expand=0):
@@ -579,7 +578,7 @@ def run_import(upload_session, async_upload=_ASYNC_UPLOAD):
import_execution_requested = False
if import_session.state == 'INCOMPLETE':
if task.state != 'ERROR':
- raise Exception(_('unknown item state: %s' % task.state))
+ raise Exception(_(f'unknown item state: {task.state}'))
elif import_session.state == 'PENDING' and task.target.store_type == 'coverageStore':
if task.state == 'READY':
import_session.commit(async_upload)
@@ -587,8 +586,7 @@ def run_import(upload_session, async_upload=_ASYNC_UPLOAD):
if task.state == 'ERROR':
progress = task.get_progress()
raise Exception(_(
- 'error during import: %s' %
- progress.get('message')))
+ f"error during import: {progress.get('message')}"))
# if a target datastore is configured, ensure the datastore exists
# in geoserver and set the uploader target appropriately
@@ -624,8 +622,8 @@ def progress_redirect(step, upload_id):
return json_response(dict(
success=True,
id=upload_id,
- redirect_to=reverse('data_upload', args=[step]) + "?id=%s" % upload_id,
- progress=reverse('data_upload_progress') + "?id=%s" % upload_id
+ redirect_to=f"{reverse('data_upload', args=[step])}?id={upload_id}",
+ progress=f"{reverse('data_upload_progress')}?id={upload_id}"
))
@@ -792,8 +790,8 @@ def import_imagemosaic_granules(
timeregex_template = """regex=(?<=_)({mosaic_time_regex})"""
- if not os.path.exists(dirname + '/timeregex.properties'):
- with open(dirname + '/timeregex.properties', 'w') as timeregex_prop_file:
+ if not os.path.exists(f"{dirname}/timeregex.properties"):
+ with open(f"{dirname}/timeregex.properties", 'w') as timeregex_prop_file:
timeregex_prop_file.write(timeregex_template.format(**context))
datastore_template = r"""SPI=org.geotools.data.postgis.PostgisNGDataStoreFactory
@@ -809,17 +807,17 @@ def import_imagemosaic_granules(
min\ connections={db_conn_min}
max\ connections={db_conn_max}"""
- if not os.path.exists(dirname + '/indexer.properties'):
- with open(dirname + '/indexer.properties', 'w') as indexer_prop_file:
+ if not os.path.exists(f"{dirname}/indexer.properties"):
+ with open(f"{dirname}/indexer.properties", 'w') as indexer_prop_file:
indexer_prop_file.write(indexer_template.format(**context))
- if not os.path.exists(dirname + '/datastore.properties'):
- with open(dirname + '/datastore.properties', 'w') as datastore_prop_file:
+ if not os.path.exists(f"{dirname}/datastore.properties"):
+ with open(f"{dirname}/datastore.properties", 'w') as datastore_prop_file:
datastore_prop_file.write(datastore_template.format(**context))
files_to_upload = []
if not append_to_mosaic_opts and spatial_files:
- z = zipfile.ZipFile(dirname + '/' + head + '.zip', "w", allowZip64=True)
+ z = zipfile.ZipFile(f"{dirname}/{head}.zip", "w", allowZip64=True)
for spatial_file in spatial_files:
f = spatial_file.base_file
dst_basename = os.path.basename(f)
@@ -828,16 +826,15 @@ def import_imagemosaic_granules(
# Let's import only the first granule
z.write(spatial_file.base_file, arcname=dst_head + dst_tail)
files_to_upload.append(spatial_file.base_file)
- if os.path.exists(dirname + '/indexer.properties'):
- z.write(dirname + '/indexer.properties', arcname='indexer.properties')
- if os.path.exists(dirname + '/datastore.properties'):
+ if os.path.exists(f"{dirname}/indexer.properties"):
+ z.write(f"{dirname}/indexer.properties", arcname='indexer.properties')
+ if os.path.exists(f"{dirname}/datastore.properties"):
z.write(
- dirname +
- '/datastore.properties',
+ f"{dirname}/datastore.properties",
arcname='datastore.properties')
if mosaic_time_regex:
z.write(
- dirname + '/timeregex.properties',
+ f"{dirname}/timeregex.properties",
arcname='timeregex.properties')
z.close()
diff --git a/geonode/upload/views.py b/geonode/upload/views.py
index f007d07737a..436280fe01f 100644
--- a/geonode/upload/views.py
+++ b/geonode/upload/views.py
@@ -164,24 +164,24 @@ def save_step_view(req, session):
form = LayerUploadForm(req.POST, req.FILES)
if form.is_valid():
tempdir = tempfile.mkdtemp(dir=settings.STATIC_ROOT)
- logger.debug("valid_extensions: {}".format(form.cleaned_data["valid_extensions"]))
+ logger.debug(f"valid_extensions: {form.cleaned_data['valid_extensions']}")
relevant_files = _select_relevant_files(
form.cleaned_data["valid_extensions"],
iter(req.FILES.values())
)
- logger.debug("relevant_files: {}".format(relevant_files))
+ logger.debug(f"relevant_files: {relevant_files}")
_write_uploaded_files_to_disk(tempdir, relevant_files)
base_file = os.path.join(tempdir, form.cleaned_data["base_file"].name)
name, ext = os.path.splitext(os.path.basename(base_file))
- logger.debug('Name: {0}, ext: {1}'.format(name, ext))
- logger.debug("base_file: {}".format(base_file))
+ logger.debug(f'Name: {name}, ext: {ext}')
+ logger.debug(f"base_file: {base_file}")
scan_hint = get_scan_hint(form.cleaned_data["valid_extensions"])
spatial_files = scan_file(
base_file,
scan_hint=scan_hint,
charset=form.cleaned_data["charset"]
)
- logger.debug("spatial_files: {}".format(spatial_files))
+ logger.debug(f"spatial_files: {spatial_files}")
import_session = save_step(
req.user,
name,
@@ -210,7 +210,7 @@ def save_step_view(req, session):
form.cleaned_data["charset"],
tempdir=tempdir)
- _log('provided sld is %s' % sld)
+ _log(f'provided sld is {sld}')
# upload_type = get_upload_type(base_file)
upload_session = UploaderSession(
tempdir=tempdir,
@@ -307,7 +307,7 @@ def srs_step_view(request, upload_session):
{'status': 'error',
'success': False,
'id': upload_session.import_session.id,
- 'error_msg': "%s" % error,
+ 'error_msg': f"{error}",
}
)
else:
@@ -401,7 +401,7 @@ def csv_step_view(request, upload_session):
{'status': 'error',
'success': False,
'id': upload_session.import_session.id,
- 'error_msg': "%s" % error,
+ 'error_msg': f"{error}",
}
)
else:
@@ -593,7 +593,7 @@ def final_step_view(req, upload_session):
return json_response({'status': 'pending',
'success': True,
'id': req.GET['id'],
- 'redirect_to': '/upload/final' + "?id=%s%s" % (req.GET['id'], force_ajax)})
+ 'redirect_to': f"/upload/final?id={req.GET['id']}{force_ajax}"})
else:
# url = reverse('layer_browse') + '?limit={}'.format(settings.CLIENT_RESULTS_LIMIT)
url = "upload/layer_upload_invalid.html"
@@ -734,16 +734,8 @@ def form_valid(self, form):
data = [
{
'name': f.name,
- 'url': settings.MEDIA_URL +
- "uploads/" +
- f.name.replace(
- " ",
- "_"),
- 'thumbnail_url': settings.MEDIA_URL +
- "pictures/" +
- f.name.replace(
- " ",
- "_"),
+ 'url': f"{settings.MEDIA_URL}uploads/{f.name.replace(' ', '_')}",
+ 'thumbnail_url': f"{settings.MEDIA_URL}pictures/{f.name.replace(' ', '_')}",
'delete_url': reverse(
'data_upload_remove',
args=[
diff --git a/geonode/urls.py b/geonode/urls.py
index baab169cec4..4e818d063d1 100644
--- a/geonode/urls.py
+++ b/geonode/urls.py
@@ -221,7 +221,7 @@
]
if settings.NOTIFICATIONS_MODULE in settings.INSTALLED_APPS:
- notifications_urls = '{}.urls'.format(settings.NOTIFICATIONS_MODULE)
+ notifications_urls = f'{settings.NOTIFICATIONS_MODULE}.urls'
urlpatterns += [ # '',
url(r'^notifications/', include(notifications_urls)),
]
diff --git a/geonode/utils.py b/geonode/utils.py
index 059bf29994c..d313fe9dd47 100755
--- a/geonode/utils.py
+++ b/geonode/utils.py
@@ -91,8 +91,7 @@
INVALID_PERMISSION_MESSAGE = _("Invalid permission level.")
-ALPHABET = string.ascii_uppercase + string.ascii_lowercase + \
- string.digits + '-_'
+ALPHABET = f"{string.ascii_uppercase + string.ascii_lowercase + string.digits}-_"
ALPHABET_REVERSE = {c: i for (i, c) in enumerate(ALPHABET)}
BASE = len(ALPHABET)
SIGN_CHARACTER = '$'
@@ -211,21 +210,20 @@ def get_headers(request, url, raw_url, allowed_hosts=[]):
value = request.COOKIES.get(name)
if name == 'csrftoken':
csrftoken = value
- cook = "%s=%s" % (name, value)
- cookies = cook if not cookies else (cookies + '; ' + cook)
+ cook = f"{name}={value}"
+ cookies = cook if not cookies else (f"{cookies}; {cook}")
csrftoken = get_token(request) if not csrftoken else csrftoken
if csrftoken:
headers['X-Requested-With'] = "XMLHttpRequest"
headers['X-CSRFToken'] = csrftoken
- cook = "%s=%s" % ('csrftoken', csrftoken)
- cookies = cook if not cookies else (cookies + '; ' + cook)
+ cook = f"{'csrftoken'}={csrftoken}"
+ cookies = cook if not cookies else (f"{cookies}; {cook}")
if cookies:
if 'JSESSIONID' in request.session and request.session['JSESSIONID']:
- cookies = cookies + '; JSESSIONID=' + \
- request.session['JSESSIONID']
+ cookies = f"{cookies}; JSESSIONID={request.session['JSESSIONID']}"
headers['Cookie'] = cookies
if request.method in ("POST", "PUT") and "CONTENT_TYPE" in request.META:
@@ -254,18 +252,17 @@ def get_headers(request, url, raw_url, allowed_hosts=[]):
access_token = get_or_create_token(request.user)
if access_token:
- headers['Authorization'] = 'Bearer %s' % access_token
+ headers['Authorization'] = f'Bearer {access_token}'
pragma = "no-cache"
referer = request.META[
"HTTP_REFERER"] if "HTTP_REFERER" in request.META else \
- "{scheme}://{netloc}/".format(scheme=site_url.scheme,
- netloc=site_url.netloc)
+ f"{site_url.scheme}://{site_url.netloc}/"
encoding = request.META["HTTP_ACCEPT_ENCODING"] if "HTTP_ACCEPT_ENCODING" in request.META else "gzip"
headers.update({"Pragma": pragma,
"Referer": referer,
"Accept-encoding": encoding,
- })
+ })
return (headers, access_token)
@@ -307,7 +304,7 @@ def _split_query(query):
elif kw:
keywords.append(kw)
else:
- accum += ' ' + kw
+ accum += f" {kw}"
if kw.endswith('"'):
keywords.append(accum[0:-1])
accum = None
@@ -327,11 +324,11 @@ def bbox_to_wkt(x0, x1, y0, y1, srid="4326", include_srid=True):
float(x1), float(y0),
float(x0), float(y0))
if include_srid:
- wkt = 'SRID=%s;%s' % (srid, wkt)
+ wkt = f'SRID={srid};{wkt}'
else:
wkt = 'POLYGON((-180 -90,-180 90,180 90,180 -90,-180 -90))'
if include_srid:
- wkt = 'SRID=4326;%s' % wkt
+ wkt = f'SRID=4326;{wkt}'
return wkt
@@ -383,14 +380,14 @@ def bbox_to_projection(native_bbox, target_srid=4326):
dest = SpatialReference()
dest.ImportFromEPSG(target_srid)
if int(_gdal_ver[0]) >= 3 and \
- ((int(_gdal_ver[1]) == 0 and int(_gdal_ver[2]) >= 4) or int(_gdal_ver[1]) > 0):
+ ((int(_gdal_ver[1]) == 0 and int(_gdal_ver[2]) >= 4) or int(_gdal_ver[1]) > 0):
source.SetAxisMappingStrategy(0)
dest.SetAxisMappingStrategy(0)
g.Transform(CoordinateTransformation(source, dest))
projected_bbox = [str(x) for x in g.GetEnvelope()]
# Must be in the form : [x0, x1, y0, y1, EPSG:)
return tuple([projected_bbox[0], projected_bbox[1], projected_bbox[2], projected_bbox[3]]) + \
- ("EPSG:%s" % target_srid,)
+ (f"EPSG:{target_srid}",)
except Exception:
tb = traceback.format_exc()
logger.error(tb)
@@ -562,10 +559,7 @@ def viewer_json(self, request, *added_layers):
access_token = access_token.token
if self.id and len(added_layers) == 0:
- cfg = cache.get("viewer_json_" +
- str(self.id) +
- "_" +
- str(0 if user is None else user.id))
+ cfg = cache.get(f"viewer_json_{str(self.id)}_{str(0 if user is None else user.id)}")
if cfg is not None:
return cfg
@@ -652,7 +646,7 @@ def _base_source(source):
'remote': True,
'ptype': service.ptype,
'name': service.name,
- 'title': "[R] %s" % service.title
+ 'title': f"[R] {service.title}"
}
if remote_source['url'] not in source_urls:
index += 1
@@ -686,10 +680,7 @@ def _base_source(source):
# Create user-specific cache of maplayer config
if self is not None:
- cache.set("viewer_json_" +
- str(self.id) +
- "_" +
- str(0 if user is None else user.id), config)
+ cache.set(f"viewer_json_{str(self.id)}_{str(0 if user is None else user.id)}", config)
# Client conversion if needed
from geonode.client.hooks import hookset
@@ -1012,7 +1003,7 @@ def json_response(body=None, errors=None, url=None, redirect_to=None, exception=
}
elif exception:
if body is None:
- body = "Unexpected exception %s" % exception
+ body = f"Unexpected exception {exception}"
else:
body = body % exception
body = {
@@ -1085,16 +1076,13 @@ def build_caveats(resourcebase):
if resourcebase.data_quality_statement:
caveats.append(resourcebase.data_quality_statement)
if len(caveats) > 0:
- return "- " + "%0A- ".join(caveats)
+ return f"- {'%0A- '.join(caveats)}"
else:
return ""
def build_social_links(request, resourcebase):
- social_url = "{protocol}://{host}{path}".format(
- protocol=("https" if request.is_secure() else "http"),
- host=request.get_host(),
- path=request.get_full_path())
+ social_url = f"{'https' if request.is_secure() else 'http'}://{request.get_host()}{request.get_full_path()}"
# Don't use datetime strftime() because it requires year >= 1900
# see
# https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior
@@ -1173,7 +1161,7 @@ def fixup_shp_columnnames(inShapefile, charset, tempdir=None):
inDataSource = None
if inDataSource is None:
- logger.debug("Could not open {}".format(inShapefile))
+ logger.debug(f"Could not open {inShapefile}")
return False, None, None
else:
inLayer = inDataSource.GetLayer()
@@ -1209,14 +1197,14 @@ def fixup_shp_columnnames(inShapefile, charset, tempdir=None):
else:
new_field_name = slugify(field_name)
if not b.match(new_field_name):
- new_field_name = '_' + new_field_name
+ new_field_name = f"_{new_field_name}"
j = 0
while new_field_name in list_col_original or new_field_name in list_col.values():
if j == 0:
new_field_name += '_0'
- if new_field_name.endswith('_' + str(j)):
+ if new_field_name.endswith(f"_{str(j)}"):
j += 1
- new_field_name = new_field_name[:-2] + '_' + str(j)
+ new_field_name = f"{new_field_name[:-2]}_{str(j)}"
if field_name != new_field_name:
list_col[field_name] = new_field_name
except Exception as e:
@@ -1233,7 +1221,7 @@ def fixup_shp_columnnames(inShapefile, charset, tempdir=None):
except Exception as e:
logger.exception(e)
raise GeoNodeException(
- "Could not decode SHAPEFILE attributes by using the specified charset '{}'.".format(charset))
+ f"Could not decode SHAPEFILE attributes by using the specified charset '{charset}'.")
return True, None, list_col
@@ -1249,7 +1237,7 @@ def id_to_obj(id_):
def printsignals():
for signalname in signalnames:
- logger.debug("SIGNALNAME: %s" % signalname)
+ logger.debug(f"SIGNALNAME: {signalname}")
signaltype = getattr(models.signals, signalname)
signals = signaltype.receivers[:]
for signal in signals:
@@ -1264,6 +1252,7 @@ class DisableDjangoSignals:
with DisableDjangoSignals():
# do some fancy stuff here
"""
+
def __init__(self, disabled_signals=None, skip=False):
self.skip = skip
self.stashed_signals = defaultdict(list)
@@ -1335,7 +1324,7 @@ def parse_datetime(value):
# tb = traceback.format_exc()
# logger.error(tb)
pass
- raise ValueError("Invalid datetime input: {}".format(value))
+ raise ValueError(f"Invalid datetime input: {value}")
def _convert_sql_params(cur, query):
@@ -1428,7 +1417,7 @@ def __init__(self):
def request(self, url, method='GET', data=None, headers={}, stream=False,
timeout=None, retries=None, user=None, verify=False):
if (user or self.username != 'admin') and \
- check_ogc_backend(geoserver.BACKEND_PACKAGE) and 'Authorization' not in headers:
+ check_ogc_backend(geoserver.BACKEND_PACKAGE) and 'Authorization' not in headers:
if connection.cursor().db.vendor not in ('sqlite', 'sqlite3', 'spatialite'):
try:
if user and isinstance(user, str):
@@ -1436,14 +1425,14 @@ def request(self, url, method='GET', data=None, headers={}, stream=False,
_u = user or get_user_model().objects.get(username=self.username)
access_token = get_or_create_token(_u)
if access_token and not access_token.is_expired():
- headers['Authorization'] = 'Bearer %s' % access_token.token
+ headers['Authorization'] = f'Bearer {access_token.token}'
except Exception:
tb = traceback.format_exc()
logger.debug(tb)
elif user == self.username:
valid_uname_pw = base64.b64encode(
- "{}:{}".format(self.username, self.password).encode()).decode()
- headers['Authorization'] = 'Basic {}'.format(valid_uname_pw)
+ f"{self.username}:{self.password}".encode()).decode()
+ headers['Authorization'] = f'Basic {valid_uname_pw}'
response = None
content = None
@@ -1579,14 +1568,14 @@ def chmod_tree(dst, permissions=0o777):
os.chmod(path, permissions)
status = os.stat(path)
if oct(status.st_mode & 0o777) != str(oct(permissions)):
- raise Exception("Could not update permissions of {}".format(path))
+ raise Exception(f"Could not update permissions of {path}")
for dirname in dirnames:
path = os.path.join(dirpath, dirname)
os.chmod(path, permissions)
status = os.stat(path)
if oct(status.st_mode & 0o777) != str(oct(permissions)):
- raise Exception("Could not update permissions of {}".format(path))
+ raise Exception(f"Could not update permissions of {path}")
def slugify_zh(text, separator='_'):
@@ -1704,7 +1693,7 @@ def set_resource_default_links(instance, layer, prune=False, **kwargs):
# Set download links for WMS, WCS or WFS and KML
logger.debug(" -- Resource Links[Set download links for WMS, WCS or WFS and KML]...")
- links = wms_links(ogc_server_settings.public_url + 'ows?',
+ links = wms_links(f"{ogc_server_settings.public_url}ows?",
instance.alternate,
bbox,
srid,
@@ -1733,7 +1722,7 @@ def set_resource_default_links(instance, layer, prune=False, **kwargs):
link_type='image').update(**_d)
if instance.storeType == "dataStore":
- links = wfs_links(ogc_server_settings.public_url + 'ows?',
+ links = wfs_links(f"{ogc_server_settings.public_url}ows?",
instance.alternate,
bbox=None, # bbox filter should be set at runtime otherwise conflicting with CQL
srid=srid)
@@ -1756,7 +1745,7 @@ def set_resource_default_links(instance, layer, prune=False, **kwargs):
)
elif instance.storeType == 'coverageStore':
- links = wcs_links(ogc_server_settings.public_url + 'wcs?',
+ links = wcs_links(f"{ogc_server_settings.public_url}wcs?",
instance.alternate,
bbox,
srid)
@@ -1778,8 +1767,7 @@ def set_resource_default_links(instance, layer, prune=False, **kwargs):
)
site_url = settings.SITEURL.rstrip('/') if settings.SITEURL.startswith('http') else settings.SITEURL
- html_link_url = '%s%s' % (
- site_url, instance.get_absolute_url())
+ html_link_url = f'{site_url}{instance.get_absolute_url()}'
if (Link.objects.filter(resource=instance.resourcebase_ptr,
url=html_link_url,
@@ -1846,7 +1834,7 @@ def set_resource_default_links(instance, layer, prune=False, **kwargs):
# ogc_wms_path = '%s/ows' % instance.workspace
ogc_wms_path = 'ows'
ogc_wms_url = urljoin(ogc_server_settings.public_url, ogc_wms_path)
- ogc_wms_name = 'OGC WMS: %s Service' % instance.workspace
+ ogc_wms_name = f'OGC WMS: {instance.workspace} Service'
if Link.objects.filter(resource=instance.resourcebase_ptr, name=ogc_wms_name, url=ogc_wms_url).count() < 2:
Link.objects.get_or_create(
resource=instance.resourcebase_ptr,
@@ -1864,7 +1852,7 @@ def set_resource_default_links(instance, layer, prune=False, **kwargs):
# ogc_wfs_path = '%s/wfs' % instance.workspace
ogc_wfs_path = 'ows'
ogc_wfs_url = urljoin(ogc_server_settings.public_url, ogc_wfs_path)
- ogc_wfs_name = 'OGC WFS: %s Service' % instance.workspace
+ ogc_wfs_name = f'OGC WFS: {instance.workspace} Service'
if Link.objects.filter(resource=instance.resourcebase_ptr, name=ogc_wfs_name, url=ogc_wfs_url).count() < 2:
Link.objects.get_or_create(
resource=instance.resourcebase_ptr,
@@ -1882,7 +1870,7 @@ def set_resource_default_links(instance, layer, prune=False, **kwargs):
# ogc_wcs_path = '%s/wcs' % instance.workspace
ogc_wcs_path = 'ows'
ogc_wcs_url = urljoin(ogc_server_settings.public_url, ogc_wcs_path)
- ogc_wcs_name = 'OGC WCS: %s Service' % instance.workspace
+ ogc_wcs_name = f'OGC WCS: {instance.workspace} Service'
if Link.objects.filter(resource=instance.resourcebase_ptr, name=ogc_wcs_name, url=ogc_wcs_url).count() < 2:
Link.objects.get_or_create(
resource=instance.resourcebase_ptr,
@@ -1913,7 +1901,7 @@ def set_resource_default_links(instance, layer, prune=False, **kwargs):
zip_download_url = reverse(
'qgis_server:download-zip', kwargs={'layername': instance.name})
zip_download_url = urljoin(base_url, zip_download_url)
- logger.debug('zip_download_url: %s' % zip_download_url)
+ logger.debug(f'zip_download_url: {zip_download_url}')
if is_shapefile:
link_name = 'Zipped Shapefile'
link_mime = 'SHAPE-ZIP'
@@ -1938,7 +1926,7 @@ def set_resource_default_links(instance, layer, prune=False, **kwargs):
settings.SITEURL,
reverse(
'qgis_server:layer-request', kwargs={'layername': instance.name}))
- ogc_wms_name = 'OGC WMS: %s Service' % instance.workspace
+ ogc_wms_name = f'OGC WMS: {instance.workspace} Service'
ogc_wms_link_type = 'OGC:WMS'
Link.objects.update_or_create(
resource=instance.resourcebase_ptr,
@@ -1958,7 +1946,7 @@ def set_resource_default_links(instance, layer, prune=False, **kwargs):
reverse(
'qgis_server:download-qgs',
kwargs={'layername': instance.name}))
- logger.debug('qgs_download_url: %s' % ogc_qgs_url)
+ logger.debug(f'qgs_download_url: {ogc_qgs_url}')
link_name = 'QGIS project file (.qgs)'
link_mime = 'application/xml'
Link.objects.update_or_create(
@@ -1979,7 +1967,7 @@ def set_resource_default_links(instance, layer, prune=False, **kwargs):
reverse(
'qgis_server:layer-request',
kwargs={'layername': instance.name}))
- ogc_wfs_name = 'OGC WFS: %s Service' % instance.workspace
+ ogc_wfs_name = f'OGC WFS: {instance.workspace} Service'
ogc_wfs_link_type = 'OGC:WFS'
Link.objects.update_or_create(
resource=instance.resourcebase_ptr,
@@ -1999,7 +1987,7 @@ def set_resource_default_links(instance, layer, prune=False, **kwargs):
reverse(
'qgis_server:download-qlr',
kwargs={'layername': instance.name}))
- logger.debug('qlr_download_url: %s' % ogc_qlr_url)
+ logger.debug(f'qlr_download_url: {ogc_qlr_url}')
link_name = 'QGIS layer file (.qlr)'
link_mime = 'application/xml'
Link.objects.update_or_create(
@@ -2022,9 +2010,9 @@ def set_resource_default_links(instance, layer, prune=False, **kwargs):
instance, layer.qgis_project_path, overwrite=overwrite,
internal=True)
- logger.debug('Creating the QGIS Project : %s' % response.url)
+ logger.debug(f'Creating the QGIS Project : {response.url}')
if ensure_string(response.content) != 'OK':
- logger.debug('Result : %s' % ensure_string(response.content))
+ logger.debug(f'Result : {ensure_string(response.content)}')
# Generate style model cache
style_list(instance, internal=False)
@@ -2053,7 +2041,7 @@ def set_resource_default_links(instance, layer, prune=False, **kwargs):
geotiff_url = reverse(
'qgis_server:geotiff', kwargs={'layername': instance.name})
geotiff_url = urljoin(base_url, geotiff_url)
- logger.debug('geotif_url: %s' % geotiff_url)
+ logger.debug(f'geotif_url: {geotiff_url}')
Link.objects.update_or_create(
resource=instance.resourcebase_ptr,
@@ -2199,7 +2187,7 @@ def is_monochromatic_image(image_url, image_data=None):
def is_local_static(url):
if url.startswith(settings.STATIC_URL) or \
- (url.startswith(settings.SITEURL) and settings.STATIC_URL in url):
+ (url.startswith(settings.SITEURL) and settings.STATIC_URL in url):
return True
return False
diff --git a/geonode/version.py b/geonode/version.py
index e9f5ded53ed..5c664f8324b 100644
--- a/geonode/version.py
+++ b/geonode/version.py
@@ -43,9 +43,9 @@ def get_version(version=None):
sub = mapping[version[3]] + str(version[4])
if git_changeset:
if version[3] == 'unstable':
- sub += '.dev%s' % git_changeset
+ sub += f'.dev{git_changeset}'
elif version[3] != 'final':
- sub += '.build%s' % git_changeset
+ sub += f'.build{git_changeset}'
return main + sub
diff --git a/geonode/views.py b/geonode/views.py
index 90a15d27e24..2f6f9d75bac 100644
--- a/geonode/views.py
+++ b/geonode/views.py
@@ -101,7 +101,7 @@ def ajax_lookup(request):
Q(slug__icontains=keyword)).exclude(
Q(access='private') & ~Q(
slug__in=request.user.groupmember_set.all().values_list("group__slug", flat=True))
- )
+ )
json_dict = {
'users': [({'username': u.username}) for u in users],
'count': users.count(),
@@ -117,9 +117,7 @@ def ajax_lookup(request):
def err403(request, exception):
if not request.user.is_authenticated:
return HttpResponseRedirect(
- reverse('account_login') +
- '?next=' +
- request.get_full_path())
+ f"{reverse('account_login')}?next={request.get_full_path()}")
else:
return TemplateResponse(request, '401.html', {}, status=401).render()
@@ -145,7 +143,7 @@ def ident_json(request):
json_data['poc'] = {
'name': settings.PYCSW['CONFIGURATION']['metadata:main']['contact_name'],
'email': settings.PYCSW['CONFIGURATION']['metadata:main']['contact_email'],
- 'twitter': 'https://twitter.com/%s' % settings.TWITTER_SITE
+ 'twitter': f'https://twitter.com/{settings.TWITTER_SITE}'
}
json_data['version'] = get_version()
diff --git a/pavement.py b/pavement.py
index b0ebac6c907..bc7b8f2a464 100644
--- a/pavement.py
+++ b/pavement.py
@@ -78,7 +78,7 @@
try:
from geonode.settings import TEST_RUNNER_KEEPDB, TEST_RUNNER_PARALLEL
_keepdb = '--keepdb' if TEST_RUNNER_KEEPDB else ''
- _parallel = ('--parallel=%s' % TEST_RUNNER_PARALLEL) if TEST_RUNNER_PARALLEL else ''
+ _parallel = f'--parallel={TEST_RUNNER_PARALLEL}' if TEST_RUNNER_PARALLEL else ''
except Exception:
_keepdb = ''
_parallel = ''
@@ -99,18 +99,18 @@ def grab(src, dest, name):
logger.info(f" src, dest, name --> {src} {dest} {name}")
if not os.path.exists(dest):
- logger.info("Downloading {}".format(name))
+ logger.info(f"Downloading {name}")
elif not zipfile.is_zipfile(dest):
- logger.info("Downloading {} (corrupt file)".format(name))
+ logger.info(f"Downloading {name} (corrupt file)")
else:
return
if src.startswith("file://"):
src2 = src.replace("file://", '')
if not os.path.exists(src2):
- logger.info("Source location ({}) does not exist".format(src2))
+ logger.info(f"Source location ({src2}) does not exist")
else:
- logger.info("Copying local file from {}".format(src2))
+ logger.info(f"Copying local file from {src2}")
shutil.copyfile(src2, dest)
else:
# urlretrieve(str(src), str(dest))
@@ -118,7 +118,7 @@ def grab(src, dest, name):
r = requests.get(src, stream=True, timeout=10, verify=False)
# Total size in bytes.
total_size = int(r.headers.get('content-length', 0))
- logger.info("Requesting {}".format(src))
+ logger.info(f"Requesting {src}")
block_size = 1024
wrote = 0
with open("output.bin", 'wb') as f:
@@ -129,10 +129,11 @@ def grab(src, dest, name):
unit_scale=False):
wrote += len(data)
f.write(data)
- logger.info(" total_size [{}] / wrote [{}] ".format(total_size, wrote))
+ logger.info(f" total_size [{total_size}] / wrote [{wrote}] ")
if total_size != 0 and wrote != total_size:
- logger.error("ERROR, something went wrong. Data could not be written. Expected to write " + wrote +
- " but wrote " + total_size + " instead")
+ logger.error(
+ f"ERROR, something went wrong. Data could not be written. Expected to write {wrote} "
+ f"but wrote {total_size} instead")
else:
shutil.move("output.bin", dest)
try:
@@ -223,10 +224,10 @@ def setup_qgis_server(options):
all_permission = 0o777
os.chmod('geonode/qgis_layer', all_permission)
stat = os.stat('geonode/qgis_layer')
- info('Mode : %o' % stat.st_mode)
+ info(f'Mode : {stat.st_mode:o}')
os.chmod('geonode/qgis_tiles', all_permission)
stat = os.stat('geonode/qgis_tiles')
- info('Mode : %o' % stat.st_mode)
+ info(f'Mode : {stat.st_mode:o}')
info('QGIS Server related folder successfully setup.')
@@ -244,7 +245,7 @@ def _robust_rmtree(path, logger=None, max_retries=5):
return
except OSError:
if logger:
- info('Unable to remove path: %s' % path)
+ info(f'Unable to remove path: {path}')
info('Retrying after %d seconds' % i)
time.sleep(i)
@@ -269,8 +270,7 @@ def _install_data_dir():
with open(config) as f:
xml = f.read()
m = re.search('proxyBaseUrl>([^<]+)', xml)
- xml = xml[:m.start(1)] + \
- "http://localhost:8080/geoserver" + xml[m.end(1):]
+ xml = f"{xml[:m.start(1)]}http://localhost:8080/geoserver{xml[m.end(1):]}"
with open(config, 'w') as f:
f.write(xml)
except Exception as e:
@@ -282,20 +282,15 @@ def _install_data_dir():
with open(config) as f:
xml = f.read()
m = re.search('accessTokenUri>([^<]+)', xml)
- xml = xml[:m.start(1)] + \
- "http://localhost:8000/o/token/" + xml[m.end(1):]
+ xml = f"{xml[:m.start(1)]}http://localhost:8000/o/token/{xml[m.end(1):]}"
m = re.search('userAuthorizationUri>([^<]+)', xml)
- xml = xml[:m.start(
- 1)] + "http://localhost:8000/o/authorize/" + xml[m.end(1):]
+ xml = f"{xml[:m.start(1)]}http://localhost:8000/o/authorize/{xml[m.end(1):]}"
m = re.search('redirectUri>([^<]+)', xml)
- xml = xml[:m.start(
- 1)] + "http://localhost:8080/geoserver/index.html" + xml[m.end(1):]
+ xml = f"{xml[:m.start(1)]}http://localhost:8080/geoserver/index.html{xml[m.end(1):]}"
m = re.search('checkTokenEndpointUrl>([^<]+)', xml)
- xml = xml[:m.start(
- 1)] + "http://localhost:8000/api/o/v4/tokeninfo/" + xml[m.end(1):]
+ xml = f"{xml[:m.start(1)]}http://localhost:8000/api/o/v4/tokeninfo/{xml[m.end(1):]}"
m = re.search('logoutUri>([^<]+)', xml)
- xml = xml[:m.start(
- 1)] + "http://localhost:8000/account/logout/" + xml[m.end(1):]
+ xml = f"{xml[:m.start(1)]}http://localhost:8000/account/logout/{xml[m.end(1):]}"
with open(config, 'w') as f:
f.write(xml)
except Exception as e:
@@ -307,7 +302,7 @@ def _install_data_dir():
with open(config) as f:
xml = f.read()
m = re.search('baseUrl>([^<]+)', xml)
- xml = xml[:m.start(1)] + "http://localhost:8000" + xml[m.end(1):]
+ xml = f"{xml[:m.start(1)]}http://localhost:8000{xml[m.end(1):]}"
with open(config, 'w') as f:
f.write(xml)
except Exception as e:
@@ -363,7 +358,7 @@ def win_install_deps(options):
failed = False
for package, url in win_packages.items():
tempfile = download_dir / os.path.basename(url)
- logger.info("Installing file ... " + tempfile)
+ logger.info(f"Installing file ... {tempfile}")
grab_winfiles(url, tempfile, package)
try:
easy_install.main([tempfile])
@@ -395,7 +390,7 @@ def upgradedb(options):
elif version is None:
print("Please specify your GeoNode version")
else:
- print("Upgrades from version {} are not yet supported.".format(version))
+ print(f"Upgrades from version {version} are not yet supported.")
@task
@@ -408,9 +403,9 @@ def updategeoip(options):
"""
settings = options.get('settings', '')
if settings and 'DJANGO_SETTINGS_MODULE' not in settings:
- settings = 'DJANGO_SETTINGS_MODULE=%s' % settings
+ settings = f'DJANGO_SETTINGS_MODULE={settings}'
- sh("%s python -W ignore manage.py updategeoip -o" % settings)
+ sh(f"{settings} python -W ignore manage.py updategeoip -o")
@task
@@ -423,16 +418,16 @@ def sync(options):
"""
settings = options.get('settings', '')
if settings and 'DJANGO_SETTINGS_MODULE' not in settings:
- settings = 'DJANGO_SETTINGS_MODULE=%s' % settings
+ settings = f'DJANGO_SETTINGS_MODULE={settings}'
- sh("%s python -W ignore manage.py makemigrations --noinput" % settings)
- sh("%s python -W ignore manage.py migrate --noinput" % settings)
- sh("%s python -W ignore manage.py loaddata sample_admin.json" % settings)
- sh("%s python -W ignore manage.py loaddata geonode/base/fixtures/default_oauth_apps.json" % settings)
- sh("%s python -W ignore manage.py loaddata geonode/base/fixtures/initial_data.json" % settings)
+ sh(f"{settings} python -W ignore manage.py makemigrations --noinput")
+ sh(f"{settings} python -W ignore manage.py migrate --noinput")
+ sh(f"{settings} python -W ignore manage.py loaddata sample_admin.json")
+ sh(f"{settings} python -W ignore manage.py loaddata geonode/base/fixtures/default_oauth_apps.json")
+ sh(f"{settings} python -W ignore manage.py loaddata geonode/base/fixtures/initial_data.json")
if 'django_celery_beat' in INSTALLED_APPS:
- sh("%s python -W ignore manage.py loaddata geonode/base/fixtures/django_celery_beat.json" % settings)
- sh("%s python -W ignore manage.py set_all_layers_alternate" % settings)
+ sh(f"{settings} python -W ignore manage.py loaddata geonode/base/fixtures/django_celery_beat.json")
+ sh(f"{settings} python -W ignore manage.py set_all_layers_alternate")
@task
@@ -445,11 +440,11 @@ def package(options):
version = geonode.get_version()
# Use GeoNode's version for the package name.
- pkgname = 'GeoNode-%s-all' % version
+ pkgname = f'GeoNode-{version}-all'
# Create the output directory.
out_pkg = path(pkgname)
- out_pkg_tar = path("%s.tar.gz" % pkgname)
+ out_pkg_tar = path(f"{pkgname}.tar.gz")
# Create a distribution in zip format for the geonode python package.
dist_dir = path('dist')
@@ -465,7 +460,7 @@ def package(options):
old_package.remove()
if out_pkg_tar.exists():
- info('There is already a package for version %s' % version)
+ info(f'There is already a package for version {version}')
return
# Clean anything that is in the oupout package tree.
@@ -479,7 +474,7 @@ def package(options):
justcopy(support_folder, out_pkg / 'support')
justcopy(install_file, out_pkg)
- geonode_dist = path('..') / 'dist' / 'GeoNode-%s.zip' % version
+ geonode_dist = path('..') / 'dist' / f'GeoNode-{version}.zip'
justcopy(geonode_dist, out_pkg)
# Create a tar file with all files in the output package folder.
@@ -488,14 +483,14 @@ def package(options):
tar.add(file)
# Add the README with the license and important links to documentation.
- tar.add('README', arcname=('%s/README.rst' % out_pkg))
+ tar.add('README', arcname=f'{out_pkg}/README.rst')
tar.close()
# Remove all the files in the temporary output package directory.
out_pkg.rmtree()
# Report the info about the new package.
- info("%s created" % out_pkg_tar.abspath())
+ info(f"{out_pkg_tar.abspath()} created")
@task
@@ -553,7 +548,7 @@ def stop_geoserver(options):
shell=True,
stdout=subprocess.PIPE)
for pid in map(int, proc.stdout):
- info('Stopping geoserver (process number {})'.format(pid))
+ info(f'Stopping geoserver (process number {pid})')
os.kill(pid, signal.SIGKILL)
# Check if the process that we killed is alive.
@@ -611,11 +606,11 @@ def start_django(options):
"""
settings = options.get('settings', '')
if settings and 'DJANGO_SETTINGS_MODULE' not in settings:
- settings = 'DJANGO_SETTINGS_MODULE=%s' % settings
+ settings = f'DJANGO_SETTINGS_MODULE={settings}'
bind = options.get('bind', '0.0.0.0:8000')
port = bind.split(":")[1]
foreground = '' if options.get('foreground', False) else '&'
- sh('%s python -W ignore manage.py runserver %s %s' % (settings, bind, foreground))
+ sh(f'{settings} python -W ignore manage.py runserver {bind} {foreground}')
if ASYNC_SIGNALS:
if 'django_celery_beat' not in INSTALLED_APPS:
@@ -626,15 +621,12 @@ def start_django(options):
foreground
))
else:
- sh("{} celery -A geonode.celery_app:app worker -l DEBUG {} {}".format(
- settings,
- "-s django_celery_beat.schedulers:DatabaseScheduler",
- foreground
- ))
- sh('%s python -W ignore manage.py runmessaging %s' % (settings, foreground))
+ sh(f"{settings} celery -A geonode.celery_app:app worker -l DEBUG -s "
+ f"django_celery_beat.schedulers:DatabaseScheduler {foreground}")
+ sh(f'{settings} python -W ignore manage.py runmessaging {foreground}')
# wait for Django to start
- started = waitfor("http://localhost:" + port)
+ started = waitfor(f"http://localhost:{port}")
if not started:
info('Django never started properly or timed out.')
sys.exit(1)
@@ -647,9 +639,9 @@ def start_messaging(options):
"""
settings = options.get('settings', '')
if settings and 'DJANGO_SETTINGS_MODULE' not in settings:
- settings = 'DJANGO_SETTINGS_MODULE=%s' % settings
+ settings = f'DJANGO_SETTINGS_MODULE={settings}'
foreground = '' if options.get('foreground', False) else '&'
- sh('%s python -W ignore manage.py runmessaging %s' % (settings, foreground))
+ sh(f'{settings} python -W ignore manage.py runmessaging {foreground}')
@task
@@ -698,11 +690,10 @@ def start_geoserver(options):
except socket.error as e:
socket_free = False
if e.errno == 98:
- info('Port %s is already in use' % jetty_port)
+ info(f'Port {jetty_port} is already in use')
else:
info(
- 'Something else raised the socket.error exception while checking port %s' %
- jetty_port)
+ f'Something else raised the socket.error exception while checking port {jetty_port}')
print(e)
finally:
s.close()
@@ -754,7 +745,7 @@ def start_geoserver(options):
"java.exe e.g. --java_path=C:/path/to/java/bin/java.exe")
sys.exit(1)
# if there are spaces
- javapath = 'START /B "" "' + javapath_opt + '"'
+ javapath = f"START /B \"\" \"{javapath_opt}\""
sh((
'%(javapath)s -Xms512m -Xmx2048m -server -XX:+UseConcMarkSweepGC -XX:MaxPermSize=512m'
@@ -772,11 +763,11 @@ def start_geoserver(options):
' > %(loggernullpath)s &' % locals()
))
- info('Starting GeoServer on %s' % url)
+ info(f'Starting GeoServer on {url}')
# wait for GeoServer to start
started = waitfor(url)
- info('The logs are available at %s' % log_file)
+ info(f'The logs are available at {log_file}')
if not started:
# If applications did not start in time we will give the user a chance
@@ -830,10 +821,8 @@ def test(options):
'geonode.monitoring' in INSTALLED_APPS and \
'geonode.monitoring' not in _apps_to_test:
_apps_to_test.append('geonode.monitoring')
- sh("%s manage.py test geonode.tests.smoke %s.tests --noinput %s %s" % (options.get('prefix'),
- '.tests '.join(_apps_to_test),
- _keepdb,
- _parallel))
+ sh(f"{options.get('prefix')} manage.py test geonode.tests.smoke "
+ f"{'.tests '.join(_apps_to_test)}.tests --noinput {_keepdb} {_parallel}")
@task
@@ -891,7 +880,7 @@ def test_integration(options):
if name and name in ('geonode.tests.csw', 'geonode.tests.integration', 'geonode.geoserver.tests.integration'):
if not settings:
settings = 'geonode.local_settings' if _backend == 'geonode.qgis_server' else 'geonode.settings'
- settings = 'REUSE_DB=1 DJANGO_SETTINGS_MODULE=%s' % settings
+ settings = f'REUSE_DB=1 DJANGO_SETTINGS_MODULE={settings}'
call_task('sync', options={'settings': settings})
if _backend == 'geonode.geoserver':
call_task('start_geoserver', options={'settings': settings, 'force_exec': True})
@@ -901,37 +890,27 @@ def test_integration(options):
elif _backend == 'geonode.geoserver' and 'geonode.geoserver' in INSTALLED_APPS:
sh("cp geonode/upload/tests/test_settings.py geonode/")
settings = 'geonode.test_settings'
- sh("DJANGO_SETTINGS_MODULE={} python -W ignore manage.py "
- "makemigrations --noinput".format(settings))
- sh("DJANGO_SETTINGS_MODULE={} python -W ignore manage.py "
- "migrate --noinput".format(settings))
- sh("DJANGO_SETTINGS_MODULE={} python -W ignore manage.py "
- "loaddata sample_admin.json".format(settings))
- sh("DJANGO_SETTINGS_MODULE={} python -W ignore manage.py "
- "loaddata geonode/base/fixtures/default_oauth_apps.json".format(settings))
- sh("DJANGO_SETTINGS_MODULE={} python -W ignore manage.py "
- "loaddata geonode/base/fixtures/initial_data.json".format(settings))
+ sh(f"DJANGO_SETTINGS_MODULE={settings} python -W ignore manage.py makemigrations --noinput")
+ sh(f"DJANGO_SETTINGS_MODULE={settings} python -W ignore manage.py migrate --noinput")
+ sh(f"DJANGO_SETTINGS_MODULE={settings} python -W ignore manage.py loaddata sample_admin.json")
+ sh(f"DJANGO_SETTINGS_MODULE={settings} python -W ignore manage.py loaddata "
+ f"geonode/base/fixtures/default_oauth_apps.json")
+ sh(f"DJANGO_SETTINGS_MODULE={settings} python -W ignore manage.py loaddata "
+ f"geonode/base/fixtures/initial_data.json")
call_task('start_geoserver')
bind = options.get('bind', '0.0.0.0:8000')
foreground = '' if options.get('foreground', False) else '&'
- sh('DJANGO_SETTINGS_MODULE=%s python -W ignore manage.py runmessaging %s' %
- (settings, foreground))
- sh('DJANGO_SETTINGS_MODULE=%s python -W ignore manage.py runserver %s %s' %
- (settings, bind, foreground))
+ sh(f'DJANGO_SETTINGS_MODULE={settings} python -W ignore manage.py runmessaging {foreground}')
+ sh(f'DJANGO_SETTINGS_MODULE={settings} python -W ignore manage.py runserver {bind} {foreground}')
sh('sleep 30')
- settings = 'REUSE_DB=1 DJANGO_SETTINGS_MODULE=%s' % settings
+ settings = f'REUSE_DB=1 DJANGO_SETTINGS_MODULE={settings}'
live_server_option = ''
info("Running the tests now...")
- sh(('%s %s manage.py test %s'
- ' %s --noinput %s' % (settings,
- prefix,
- name,
- _keepdb,
- live_server_option)))
+ sh(f'{settings} {prefix} manage.py test {name} {_keepdb} --noinput {live_server_option}')
except BuildFailure as e:
- info('Tests failed! %s' % str(e))
+ info(f'Tests failed! {str(e)}')
else:
success = True
finally:
@@ -990,10 +969,8 @@ def reset(options):
def _reset():
from geonode import settings
- sh("rm -rf {path}".format(
- path=os.path.join(settings.PROJECT_ROOT, 'development.db')
- )
- )
+ sh(f"rm -rf {os.path.join(settings.PROJECT_ROOT, 'development.db')}"
+ )
sh("rm -rf geonode/development.db")
sh("rm -rf geonode/uploaded/*")
_install_data_dir()
@@ -1027,9 +1004,9 @@ def setup_data(options):
settings = options.get('settings', '')
if settings and 'DJANGO_SETTINGS_MODULE' not in settings:
- settings = 'DJANGO_SETTINGS_MODULE=%s' % settings
+ settings = f'DJANGO_SETTINGS_MODULE={settings}'
- sh("%s python -W ignore manage.py importlayers %s -v2" % (settings, data_dir))
+ sh(f"{settings} python -W ignore manage.py importlayers {data_dir} -v2")
@needs(['package'])
@@ -1051,7 +1028,7 @@ def deb(options):
version, simple_version = versions()
- info('Creating package for GeoNode version %s' % version)
+ info(f'Creating package for GeoNode version {version}')
# Get rid of any uncommitted changes to debian/changelog
info('Getting rid of any uncommitted changes in debian/changelog')
@@ -1059,8 +1036,8 @@ def deb(options):
# Workaround for git-dch bug
# http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594580
- sh('rm -rf %s/.git' % (os.path.realpath('package')))
- sh('ln -s %s %s' % (os.path.realpath('.git'), os.path.realpath('package')))
+ sh(f"rm -rf {os.path.realpath('package')}/.git")
+ sh(f"ln -s {os.path.realpath('.git')} {os.path.realpath('package')}")
with pushd('package'):
@@ -1080,7 +1057,7 @@ def deb(options):
deb_changelog = path('debian') / 'changelog'
for idx, line in enumerate(fileinput.input([deb_changelog], inplace=True)):
if idx == 0:
- logger.info("geonode ({}) {}; urgency=high".format(simple_version, distribution), end='')
+ logger.info(f"geonode ({simple_version}) {distribution}; urgency=high", end='')
else:
print(line.replace("urgency=medium", "urgency=high"), end='')
@@ -1095,13 +1072,13 @@ def deb(options):
sh('debuild -S')
elif key is not None and ppa is None:
print("A signed installable package")
- sh('debuild -k%s -A' % key)
+ sh(f'debuild -k{key} -A')
elif key is not None and ppa is not None:
print("A signed, source package")
- sh('debuild -k%s -S' % key)
+ sh(f'debuild -k{key} -S')
if ppa is not None:
- sh('dput ppa:%s geonode_%s_source.changes' % (ppa, simple_version))
+ sh(f'dput ppa:{ppa} geonode_{simple_version}_source.changes')
@task
@@ -1127,11 +1104,11 @@ def publish(options):
version, simple_version = versions()
if ppa:
sh('git add package/debian/changelog')
- sh('git commit -m "Updated changelog for version %s"' % version)
- sh('git tag -f %s' % version)
- sh('git push origin %s' % version)
- sh('git tag -f debian/%s' % simple_version)
- sh('git push origin debian/%s' % simple_version)
+ sh(f'git commit -m "Updated changelog for version {version}"')
+ sh(f'git tag -f {version}')
+ sh(f'git push origin {version}')
+ sh(f'git tag -f debian/{simple_version}')
+ sh(f'git push origin debian/{simple_version}')
# sh('git push origin master')
sh('python setup.py sdist upload -r pypi')
@@ -1151,11 +1128,11 @@ def versions():
stage = 'thefinal'
if stage == 'unstable':
- tail = '%s%s' % (branch, timestamp)
+ tail = f'{branch}{timestamp}'
else:
- tail = '%s%s' % (stage, edition)
+ tail = f'{stage}{edition}'
- simple_version = '%s.%s.%s+%s' % (major, minor, revision, tail)
+ simple_version = f'{major}.{minor}.{revision}+{tail}'
return version, simple_version
@@ -1172,10 +1149,10 @@ def kill(arg1, arg2):
while running and time.time() - t0 < time_out:
if os.name == 'nt':
- p = Popen('tasklist | find "%s"' % arg1, shell=True,
+ p = Popen(f'tasklist | find "{arg1}"', shell=True,
stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=False)
else:
- p = Popen('ps aux | grep %s' % arg1, shell=True,
+ p = Popen(f'ps aux | grep {arg1}', shell=True,
stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
lines = p.stdout.readlines()
@@ -1183,17 +1160,17 @@ def kill(arg1, arg2):
running = False
for line in lines:
# this kills all java.exe and python including self in windows
- if ('%s' % arg2 in str(line)) or (os.name == 'nt' and '%s' % arg1 in str(line)):
+ if (f'{arg2}' in str(line)) or (os.name == 'nt' and f'{arg1}' in str(line)):
running = True
# Get pid
fields = line.strip().split()
- info('Stopping %s (process number %s)' % (arg1, int(fields[1])))
+ info(f'Stopping {arg1} (process number {int(fields[1])})')
if os.name == 'nt':
- kill = 'taskkill /F /PID "%s"' % int(fields[1])
+ kill = f'taskkill /F /PID "{int(fields[1])}"'
else:
- kill = 'kill -9 %s 2> /dev/null' % int(fields[1])
+ kill = f'kill -9 {int(fields[1])} 2> /dev/null'
os.system(kill)
# Give it a little more time
diff --git a/scripts/cloud/demo_site.py b/scripts/cloud/demo_site.py
index 2b3fb78b96d..76c73020263 100644
--- a/scripts/cloud/demo_site.py
+++ b/scripts/cloud/demo_site.py
@@ -73,7 +73,7 @@ def deleteNode(self, node_name):
def buildJob(self, job):
"""Trigger a job build"""
- print('Building %s job' % job)
+ print(f'Building {job} job')
self.j.build_job(job)
print('Build requested')
diff --git a/scripts/cloud/ec2.py b/scripts/cloud/ec2.py
index 6b812bf8c89..f79f810cbb6 100644
--- a/scripts/cloud/ec2.py
+++ b/scripts/cloud/ec2.py
@@ -219,13 +219,13 @@ def launch():
print("Firing up instance...")
instance = wait_for_state(ec2, instance_id, 'running')
dns = instance['PublicDnsName']
- print(("Instance running at %s" % dns))
+ print(f"Instance running at {dns}")
config.set('ec2', 'HOST', dns)
config.set('ec2', 'INSTANCE', instance_id)
writeconfig(config)
- print(("ssh -i %s ubuntu@%s" % (key_path, dns)))
+ print(f"ssh -i {key_path} ubuntu@{dns}")
print("Terminate the instance via the web interface.")
time.sleep(20)
@@ -265,7 +265,4 @@ def terminate():
config = readconfig()
print(config.get('ec2', 'KEY_PATH'))
else:
- print("Usage:\n " +
- "python %s launch_base\n " % sys.argv[0] +
- "python %s launch_geonode\n " % sys.argv[0] +
- "python %s terminate" % sys.argv[0])
+ print(f"Usage:\n python {sys.argv[0]} launch_base\n python {sys.argv[0]} launch_geonode\n python {sys.argv[0]} terminate")
diff --git a/scripts/cloud/fabfile.py b/scripts/cloud/fabfile.py
index b614455de14..cedc3002aa5 100644
--- a/scripts/cloud/fabfile.py
+++ b/scripts/cloud/fabfile.py
@@ -62,21 +62,21 @@
KEY_PATH = '~/.ssh/' # trailing slash please
# Derived variables
-GEONODEDIR = INSTALLDIR + '/geonode'
-PYLIBS = GEONODEDIR + '/lib/python2.7/site-packages'
-ACT = 'source ' + GEONODEDIR + '/bin/activate'
+GEONODEDIR = f"{INSTALLDIR}/geonode"
+PYLIBS = f"{GEONODEDIR}/lib/python2.7/site-packages"
+ACT = f"source {GEONODEDIR}/bin/activate"
# Install GeoNode dependencies
def install_depend():
- sudo('cd %s; virtualenv geonode --system-site-packages;' % INSTALLDIR)
+ sudo(f'cd {INSTALLDIR}; virtualenv geonode --system-site-packages;')
sudo('apt-get install -y gcc python-pastescript python-dev libxml2-dev libxslt1-dev openjdk-6-jdk '
'python-psycopg2 imagemagick')
# Web server
sudo('apt-get install -y apache2 tomcat6 libapache2-mod-wsgi maven2')
sudo("a2enmod proxy_http")
# Database
- sudo('apt-get install -y postgis=%s postgresql-9.1-postgis postgresql-server-dev-9.1' % POSTGIS_VER)
+ sudo(f'apt-get install -y postgis={POSTGIS_VER} postgresql-9.1-postgis postgresql-server-dev-9.1')
create_postgis_template()
# sed('/etc/postgresql/9.1/main/pg_hba.conf',
# 'local all all peer',
@@ -89,17 +89,14 @@ def create_postgis_template():
sudo('createdb -E UTF8 template_postgis', user='postgres')
sudo('createlang -d template_postgis plpgsql', user='postgres')
cstring = "UPDATE pg_database SET datistemplate='true' WHERE datname='template_postgis'"
- sudo('psql -d postgres -c %s' % cstring, user='postgres')
- sudo('psql -d template_postgis -f /usr/share/postgresql/9.1/contrib/postgis-%s/postgis.sql'
- % POSTGIS_VER[:3], user='postgres')
- sudo('psql -d template_postgis -f /usr/share/postgresql/9.1/contrib/postgis-%s/spatial_ref_sys.sql'
- % POSTGIS_VER[:3], user='postgres')
+ sudo(f'psql -d postgres -c {cstring}', user='postgres')
+ sudo(f'psql -d template_postgis -f /usr/share/postgresql/9.1/contrib/postgis-{POSTGIS_VER[:3]}/postgis.sql', user='postgres')
+ sudo(f'psql -d template_postgis -f /usr/share/postgresql/9.1/contrib/postgis-{POSTGIS_VER[:3]}/spatial_ref_sys.sql', user='postgres')
sudo('psql -d template_postgis -c "GRANT ALL ON geometry_columns TO PUBLIC;"', user='postgres')
sudo('psql -d template_postgis -c "GRANT ALL ON geography_columns TO PUBLIC;"', user='postgres')
sudo('psql -d template_postgis -c "GRANT ALL ON spatial_ref_sys TO PUBLIC;"', user='postgres')
if POSTGIS_VER[:1] == '2':
- sudo('psql -d template_postgis -f /usr/share/postgresql/9.1/contrib/postgis-%s/rtpostgis.sql'
- % POSTGIS_VER[:3], user='postgres')
+ sudo(f'psql -d template_postgis -f /usr/share/postgresql/9.1/contrib/postgis-{POSTGIS_VER[:3]}/rtpostgis.sql', user='postgres')
# Install GeoNode library
@@ -109,14 +106,14 @@ def deploy_geonode():
# Fetch from GitHub
sudo('apt-get install -y git')
sudo('rm -rf setup')
- sudo('git clone -b %s %s setup' % (GEONODE_BRANCH, GEONODE_GIT_URL))
+ sudo(f'git clone -b {GEONODE_BRANCH} {GEONODE_GIT_URL} setup')
# Install requirements, setup
sudo('pip install -e setup')
- sudo('cp -r setup/geonode %s' % PYLIBS)
+ sudo(f'cp -r setup/geonode {PYLIBS}')
sudo('cp setup/package/support/geonode.apache /etc/apache2/sites-available/geonode')
sudo('rm -rf setup')
sed('/etc/apache2/sites-available/geonode', 'REPLACE_WITH_SITEDIR', PYLIBS, use_sudo=True)
- sed('/etc/apache2/sites-available/geonode', '/var/www/geonode/wsgi/geonode.wsgi', PYLIBS+'/geonode/wsgi.py',
+ sed('/etc/apache2/sites-available/geonode', '/var/www/geonode/wsgi/geonode.wsgi', f"{PYLIBS}/geonode/wsgi.py",
use_sudo=True)
# Fix geoserver auth config file
sed('/usr/share/geoserver/data/security/auth/geonodeAuthProvider/config.xml', 'localhost:8000',
@@ -138,24 +135,24 @@ def deploy_project(project):
with cd(GEONODEDIR), prefix(ACT):
sudo('pip install -r requirements.txt --upgrade')
sudo('rm requirements.txt')
- put('%s/%s.apache' % (project, project), '/etc/apache2/sites-available/%s' % project, use_sudo=True)
- sed('/etc/apache2/sites-available/%s' % project, 'REPLACE_WITH_SITEDIR', PYLIBS, use_sudo=True)
+ put(f'{project}/{project}.apache', f'/etc/apache2/sites-available/{project}', use_sudo=True)
+ sed(f'/etc/apache2/sites-available/{project}', 'REPLACE_WITH_SITEDIR', PYLIBS, use_sudo=True)
with cd(os.path.join(PYLIBS, project)):
sudo('ln -s settings_production.py local_settings.py')
def enable_site(project):
with cd(PYLIBS), prefix(ACT):
- sudo('a2ensite %s; service apache2 restart' % project)
+ sudo(f'a2ensite {project}; service apache2 restart')
sudo('mkdir /var/www/geonode; chown www-data:www-data /var/www/geonode')
- sudo('django-admin.py collectstatic --noinput --settings=%s.settings' % project)
+ sudo(f'django-admin.py collectstatic --noinput --settings={project}.settings')
# TODO - test/fix this function
def restore_data(project):
# Restore geoserver data
gsdir = '/var/lib/tomcat6/webapps/geoserver'
- put('data/geoserver-data.tar', gsdir+'/geoserver-data.tar', use_sudo=True)
+ put('data/geoserver-data.tar', f"{gsdir}/geoserver-data.tar", use_sudo=True)
with cd(gsdir):
sudo('rm -rf data')
sudo('tar xvf geoserver-data.tar')
@@ -163,29 +160,29 @@ def restore_data(project):
run('rm geoserver-data.tar')
sudo('service tomcat6 restart')
with prefix(ACT):
- sudo('django-admin.py cleardeadlayers --settings=%s.settings' % project)
- sudo('django-admin.py updatelayers --settings=%s.settings' % project)
+ sudo(f'django-admin.py cleardeadlayers --settings={project}.settings')
+ sudo(f'django-admin.py updatelayers --settings={project}.settings')
def create_database(db, user, password):
# sudo("dropdb %s" % db, user="postgres")
# sudo("dropuser %s" % user, user="postgres")
with fab_settings(warn_only=True):
- sudo("createuser -s %s" % user, user="postgres")
- sudo("createdb -O %s %s -T template_postgis" % (user, db), user="postgres")
- sudo("psql -c \"alter user %s with encrypted password '%s'\" " % (user, password), user="postgres")
+ sudo(f"createuser -s {user}", user="postgres")
+ sudo(f"createdb -O {user} {db} -T template_postgis", user="postgres")
+ sudo(f"psql -c \"alter user {user} with encrypted password '{password}'\" ", user="postgres")
def setup_pgsql(project):
import sys
sys.path.append('.')
- exec('import %s.settings_production as settings' % project)
+ exec(f'import {project}.settings_production as settings')
db = settings.DATABASES['default']['NAME']
user = settings.DATABASES['default']['USER']
password = settings.DATABASES['default']['PASSWORD']
create_database(db, user, password)
with prefix(ACT):
- sudo('django-admin.py migrate --settings=%s.settings' % project)
+ sudo(f'django-admin.py migrate --settings={project}.settings')
# Need to restore database and GeoServer data
# put('data/%s.sql' % db, GEONODEDIR, use_sudo=True)
# sudo('psql -d %s -f %s/%s.sql' % (db, GEONODEDIR, db), user='postgres')
@@ -236,14 +233,14 @@ def deploy_geonode_dev_deb():
def change_admin_password():
put('../misc/changepw.py', '/home/ubuntu/')
- run("perl -pi -e 's/replace.me.admin.user/%s/g' ~/changepw.py" % ADMIN_USER)
- run("perl -pi -e 's/replace.me.admin.pw/%s/g' ~/changepw.py" % ADMIN_PASSWORD)
+ run(f"perl -pi -e 's/replace.me.admin.user/{ADMIN_USER}/g' ~/changepw.py")
+ run(f"perl -pi -e 's/replace.me.admin.pw/{ADMIN_PASSWORD}/g' ~/changepw.py")
sudo('source /var/lib/geonode/bin/activate;cat ~/changepw.py | django-admin.py shell --settings=geonode.settings')
run('rm ~/changepw.py')
def geonode_updateip(server_name="demo.geonode.org"):
- sudo('geonode-updateip %s' % server_name)
+ sudo(f'geonode-updateip {server_name}')
def set_temp_hosts_entry(server_name="demo.geonode.org"):
@@ -273,14 +270,13 @@ def cleanup_temp():
def copy_keys():
- sudo('rm -f ~/.ssh/*%s.pem' % KEY_BASE)
- put(('%s*%s*' % (KEY_PATH, KEY_BASE)), '/home/ubuntu/.ssh/', mode=0o400)
+ sudo(f'rm -f ~/.ssh/*{KEY_BASE}.pem')
+ put(f'{KEY_PATH}*{KEY_BASE}*', '/home/ubuntu/.ssh/', mode=0o400)
def install_ec2_tools():
- sudo('add-apt-repository "deb http://us-east-1.ec2.archive.ubuntu.com/ubuntu/ %s multiverse"' % UBUNTU_VERSION)
- sudo('add-apt-repository "deb http://us-east-1.ec2.archive.ubuntu.com/ubuntu/ %s-updates multiverse"'
- % UBUNTU_VERSION)
+ sudo(f'add-apt-repository "deb http://us-east-1.ec2.archive.ubuntu.com/ubuntu/ {UBUNTU_VERSION} multiverse"')
+ sudo(f'add-apt-repository "deb http://us-east-1.ec2.archive.ubuntu.com/ubuntu/ {UBUNTU_VERSION}-updates multiverse"')
sudo('apt-get -y update')
sudo('apt-get install -y ec2-ami-tools')
sudo('apt-get install -y ec2-api-tools')
@@ -294,22 +290,19 @@ def build_geonode_ami():
update_instance()
install_ec2_tools()
with hide('running', 'stdout', 'stderr'):
- sudo('export AWS_USER_ID=%s' % AWS_USER_ID)
- sudo('export AWS_ACCESS_KEY_ID=%s' % AWS_ACCESS_KEY_ID)
- sudo('export AWS_SECRET_ACCESS_KEY=%s' % AWS_SECRET_ACCESS_KEY)
- sudo('export ARCH=%s' % ARCH)
- prefix = 'geonode-%s-%s' % (VERSION, datetime.datetime.now().strftime('%Y%m%d%H%M%S'))
+ sudo(f'export AWS_USER_ID={AWS_USER_ID}')
+ sudo(f'export AWS_ACCESS_KEY_ID={AWS_ACCESS_KEY_ID}')
+ sudo(f'export AWS_SECRET_ACCESS_KEY={AWS_SECRET_ACCESS_KEY}')
+ sudo(f'export ARCH={ARCH}')
+ prefix = f"geonode-{VERSION}-{datetime.datetime.now().strftime('%Y%m%d%H%M%S')}"
excludes = '/mnt,/root/.ssh,/home/ubuntu/.ssh,/tmp'
- sudo("ec2-bundle-vol -r %s -d /mnt -p %s -u %s -k ~/.ssh/pk-*.pem -c ~/.ssh/cert-*.pem -e %s"
- % (ARCH, prefix, AWS_USER_ID, excludes))
- sudo("ec2-upload-bundle -b %s -m /mnt/%s.manifest.xml -a %s -s %s"
- % (AMI_BUCKET, prefix, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY))
- output = sudo('ec2-register --name "%s/%s" "%s/%s.manifest.xml" -K ~/.ssh/pk-*.pem -C ~/.ssh/cert-*.pem'
- % (AMI_BUCKET, prefix, AMI_BUCKET, prefix))
+ sudo(f"ec2-bundle-vol -r {ARCH} -d /mnt -p {prefix} -u {AWS_USER_ID} -k ~/.ssh/pk-*.pem -c ~/.ssh/cert-*.pem -e {excludes}")
+ sudo(f"ec2-upload-bundle -b {AMI_BUCKET} -m /mnt/{prefix}.manifest.xml -a {AWS_ACCESS_KEY_ID} -s {AWS_SECRET_ACCESS_KEY}")
+ output = sudo(f'ec2-register --name "{AMI_BUCKET}/{prefix}" "{AMI_BUCKET}/{prefix}.manifest.xml" -K ~/.ssh/pk-*.pem -C ~/.ssh/cert-*.pem')
ami_id = output.split('\t')[1]
if MAKE_PUBLIC:
- sudo("ec2-modify-image-attribute -l -a all -K ~/.ssh/pk-*.pem -C ~/.ssh/cert-*.pem %s" % ami_id)
- print("AMI %s Ready for Use" % ami_id)
+ sudo(f"ec2-modify-image-attribute -l -a all -K ~/.ssh/pk-*.pem -C ~/.ssh/cert-*.pem {ami_id}")
+ print(f"AMI {ami_id} Ready for Use")
def install_sample_data():
diff --git a/scripts/misc/create_full_geonode_db.py b/scripts/misc/create_full_geonode_db.py
index 67746014682..4ffb986b8ae 100755
--- a/scripts/misc/create_full_geonode_db.py
+++ b/scripts/misc/create_full_geonode_db.py
@@ -64,7 +64,7 @@ def assign_random_category(resource):
def assign_keywords(resource):
""" Assigns up to 5 keywords to resource """
for i in range(0, randint(0, 5)):
- resource.keywords.add('keyword_%s' % randint(0, n_keywords))
+ resource.keywords.add(f'keyword_{randint(0, n_keywords)}')
def assign_regions(resource):
@@ -79,7 +79,7 @@ def create_users(n_users):
""" Create n users in the database """
for i in range(0, n_users):
user = get_user_model()
- user.username = 'user_%s' % i
+ user.username = f'user_{i}'
user.save()
@@ -93,11 +93,11 @@ def set_resource(resource):
def create_document(number):
""" Creates a new document """
- file_list = glob.glob('%s*.jpg' % doc_path)
+ file_list = glob.glob(f'{doc_path}*.jpg')
random_index = randint(0, len(file_list) - 1)
file_uri = file_list[random_index]
- title = 'Document N. %s' % number
- img_filename = '%s_img.jpg' % number
+ title = f'Document N. {number}'
+ img_filename = f'{number}_img.jpg'
doc = Document(title=title, owner=get_random_user())
doc.save()
with open(file_uri, 'r') as f:
@@ -111,7 +111,7 @@ def create_document(number):
def create_layer(number):
""" Creates a new layer """
- file_list = glob.glob('%s*.shp' % shp_path)
+ file_list = glob.glob(f'{shp_path}*.shp')
random_index = randint(0, len(file_list) - 1)
file_uri = file_list[random_index]
layer = file_upload(file_uri)
@@ -142,7 +142,7 @@ def create_layer(number):
Document.objects.all().delete()
for d in range(0, n_docs):
t = Timer(partial(create_document, d))
- print('Document %s generated in: %s' % (d, t.timeit(number=1)))
+ print(f'Document {d} generated in: {t.timeit(number=1)}')
# 3. create layers
# first we delete layers
@@ -151,4 +151,4 @@ def create_layer(number):
for l in range(0, n_layers):
t = Timer(partial(create_layer, l))
- print('Layer %s generated in: %s' % (l, t.timeit(number=1)))
+ print(f'Layer {l} generated in: {t.timeit(number=1)}')
diff --git a/scripts/misc/upload.py b/scripts/misc/upload.py
index b748907b083..0aa4f17ba14 100755
--- a/scripts/misc/upload.py
+++ b/scripts/misc/upload.py
@@ -50,13 +50,12 @@ def upload_file_s3(filename, bucket, obj_name=None):
try:
_, bucket_name, filepath = sys.argv
except ValueError:
- print(("Usage:\n python %s bucket_name filepath" % sys.argv[0]))
+ print(f"Usage:\n python {sys.argv[0]} bucket_name filepath")
filename = os.path.basename(filepath)
error = upload_file_s3(filepath, bucket_name)
if error is not None:
- print((filename + " failed uploading to " +
- bucket_name + " with error " + error))
+ print(f"{filename} failed uploading to {bucket_name} with error {error}")
else:
- print((filename + " uploaded to " + bucket_name))
+ print(f"{filename} uploaded to {bucket_name}")
diff --git a/scripts/spcgeonode/django/initialize.py b/scripts/spcgeonode/django/initialize.py
index 6fa4693aac6..9c61a1e442e 100644
--- a/scripts/spcgeonode/django/initialize.py
+++ b/scripts/spcgeonode/django/initialize.py
@@ -109,14 +109,14 @@
}
if _port not in _protocols:
redirect_uris = [
- 'http://{}:{}/geoserver'.format(_host, _port),
- 'http://{}:{}/geoserver/index.html'.format(_host, _port),
+ f'http://{_host}:{_port}/geoserver',
+ f'http://{_host}:{_port}/geoserver/index.html',
]
else:
# Make sure protocol string match with GeoServer Redirect URL's protocol string
redirect_uris = [
- '{}{}/geoserver'.format(_protocols[_port], _host),
- '{}{}/geoserver/index.html'.format(_protocols[_port], _host),
+ f'{_protocols[_port]}{_host}/geoserver',
+ f'{_protocols[_port]}{_host}/geoserver/index.html',
]
app.redirect_uris = "\n".join(redirect_uris)
@@ -164,12 +164,12 @@
_geoserver_host = os.getenv('GEOSERVER_LOCATION', 'http://geoserver:8080/geoserver')
for _ in range(60*5):
try:
- requests.head("{}".format(_geoserver_host))
+ requests.head(f"{_geoserver_host}")
break
except ConnectionError:
time.sleep(1)
else:
- requests.head("{}".format(_geoserver_host))
+ requests.head(f"{_geoserver_host}")
#########################################################
# 9. Securing GeoServer
@@ -184,7 +184,7 @@
# Getting the old password
try:
- r1 = requests.get('{}/rest/security/masterpw.json'.format(_geoserver_host),
+ r1 = requests.get(f'{_geoserver_host}/rest/security/masterpw.json',
auth=(geoserver_admin_username, geoserver_admin_password))
except requests.exceptions.ConnectionError:
print("Unable to connect to GeoServer. Make sure GeoServer is started and accessible.")
@@ -196,7 +196,7 @@
print("Randomizing master password")
new_password = uuid.uuid4().hex
data = json.dumps({"oldMasterPassword": old_password, "newMasterPassword": new_password})
- r2 = requests.put('{}/rest/security/masterpw.json'.format(_geoserver_host), data=data,
+ r2 = requests.put(f'{_geoserver_host}/rest/security/masterpw.json', data=data,
headers={'Content-Type': 'application/json'}, auth=(geoserver_admin_username, geoserver_admin_password))
r2.raise_for_status()
else:
diff --git a/setup.cfg b/setup.cfg
index a0b0c8a32a0..61814a6b3b5 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -187,6 +187,6 @@ exclude = tests
universal = 1
[flake8]
-max-line-length = 120
+max-line-length = 200
exclude=geonode/*/migrations/*,management,scripts,docs,static,migrations,geonode/*settings.py,node_modules
extend-ignore=E122,E124
diff --git a/tasks.py b/tasks.py
index cf729c0ec29..9a6d8d505e4 100755
--- a/tasks.py
+++ b/tasks.py
@@ -1,6 +1,5 @@
import ast
import json
-import logging
import os
import re
import time
@@ -12,9 +11,9 @@
from urllib.parse import urlparse
from urllib.request import urlopen, Request
except ImportError:
- from urllib2 import urlopen, Request
- from urlparse import urlparse
-from invoke import run, task
+ from urllib2 import urlopen, Request # noqa
+ from urlparse import urlparse # noqa
+from invoke import task
BOOTSTRAP_IMAGE_CHEIP = 'codenvy/che-ip:nightly'
@@ -29,7 +28,7 @@ def waitfordbs(ctx):
def waitforgeoserver(ctx):
print("****************************geoserver********************************")
while not _rest_api_availability(os.environ['GEOSERVER_LOCATION'] + 'rest'):
- print ("Wait for GeoServer API availability...")
+ print("Wait for GeoServer API availability...")
print("GeoServer is available for HTTP calls!")
@@ -62,8 +61,9 @@ def update(ctx):
envs = {
"local_settings": "{0}".format(_localsettings()),
- "siteurl": os.environ.get('SITEURL',
- '{0}://{1}:{2}/'.format(pub_protocol, pub_ip, pub_port) if pub_port else '{0}://{1}/'.format(pub_protocol, pub_ip)),
+ "siteurl": os.environ.get(
+ 'SITEURL',
+ '{0}://{1}:{2}/'.format(pub_protocol, pub_ip, pub_port) if pub_port else '{0}://{1}/'.format(pub_protocol, pub_ip)),
"geonode_docker_host": "{0}".format(socket.gethostbyname('geonode')),
"public_protocol": pub_protocol,
"public_fqdn": "{0}{1}".format(pub_ip, ':' + pub_port if pub_port else ''),
@@ -85,16 +85,19 @@ def update(ctx):
"geodb_url": os.environ.get('GEODATABASE_URL', 'postgis://geonode:geonode@db:5432/geonode_data'),
"geonode_db": os.environ.get('GEONODE_DATABASE', 'geonode'),
"gs_loc": os.environ.get('GEOSERVER_LOCATION', 'http://geoserver:8080/geoserver/'),
- "gs_web_ui_loc": os.environ.get('GEOSERVER_WEB_UI_LOCATION',
- 'http://{0}:{1}/geoserver/'.format(pub_ip, pub_port) if pub_port else 'http://{0}/geoserver/'.format(pub_ip)),
- "gs_pub_loc": os.environ.get('GEOSERVER_PUBLIC_LOCATION',
- 'http://{0}:{1}/geoserver/'.format(pub_ip, pub_port) if pub_port else 'http://{0}/geoserver/'.format(pub_ip)),
+ "gs_web_ui_loc": os.environ.get(
+ 'GEOSERVER_WEB_UI_LOCATION',
+ 'http://{0}:{1}/geoserver/'.format(pub_ip, pub_port) if pub_port else 'http://{0}/geoserver/'.format(pub_ip)),
+ "gs_pub_loc": os.environ.get(
+ 'GEOSERVER_PUBLIC_LOCATION',
+ 'http://{0}:{1}/geoserver/'.format(pub_ip, pub_port) if pub_port else 'http://{0}/geoserver/'.format(pub_ip)),
"gs_admin_pwd": os.environ.get('GEOSERVER_ADMIN_PASSWORD', 'geoserver'),
"override_fn": override_env
}
try:
- current_allowed = ast.literal_eval(os.getenv('ALLOWED_HOSTS') or \
- "['{public_fqdn}', '{public_host}', 'localhost', 'django', 'geonode',]".format(**envs))
+ current_allowed = ast.literal_eval(
+ os.getenv('ALLOWED_HOSTS') or "['{public_fqdn}', '{public_host}', 'localhost', 'django', 'geonode',]".format(
+ **envs))
except ValueError:
current_allowed = []
current_allowed.extend(['{}'.format(pub_ip), '{}:{}'.format(pub_ip, pub_port)])
@@ -180,9 +183,10 @@ def migrations(ctx):
ctx.run("python manage.py rebuild_index --noinput --settings={0}".format(
_localsettings()
), pty=True)
- except:
+ except BaseException:
pass
+
@task
def statics(ctx):
print("**************************statics*******************************")
@@ -191,6 +195,7 @@ def statics(ctx):
_localsettings()
), pty=True)
+
@task
def prepare(ctx):
print("**********************prepare fixture***************************")
@@ -213,13 +218,13 @@ def prepare(ctx):
ctx.run(
'sed -i "s|.*|{new_ext_ip}o/authorize/|g" {oauth_config}'.format(
new_ext_ip=os.environ['SITEURL'],
- oauth_config=oauth_config
- ), pty=True)
+ oauth_config=oauth_config),
+ pty=True)
ctx.run(
'sed -i "s|.*|{new_ext_ip}geoserver/index.html|g" {oauth_config}'.format(
new_ext_ip=os.environ['SITEURL'],
- oauth_config=oauth_config
- ), pty=True)
+ oauth_config=oauth_config),
+ pty=True)
ctx.run(
'sed -i "s|.*|{new_ext_ip}account/logout/|g" {oauth_config}'.format(
new_ext_ip=os.environ['SITEURL'],
@@ -280,7 +285,10 @@ def updategeoip(ctx):
def updateadmin(ctx):
print("***********************update admin details**************************")
ctx.run("rm -rf /tmp/django_admin_docker.json", pty=True)
- _prepare_admin_fixture(os.environ.get('ADMIN_PASSWORD', 'admin'), os.environ.get('ADMIN_EMAIL', 'admin@example.org'))
+ _prepare_admin_fixture(
+ os.environ.get(
+ 'ADMIN_PASSWORD', 'admin'), os.environ.get(
+ 'ADMIN_EMAIL', 'admin@example.org'))
ctx.run("django-admin.py loaddata /tmp/django_admin_docker.json \
--settings={0}".format(_localsettings()), pty=True)
@@ -291,11 +299,13 @@ def collectmetrics(ctx):
ctx.run("python -W ignore manage.py collect_metrics \
--settings={0} -n -t xml".format(_localsettings()), pty=True)
+
@task
def initialized(ctx):
print("**************************init file********************************")
ctx.run('date > /mnt/volumes/statics/geonode_init.lock')
+
def _docker_host_ip():
client = docker.from_env()
ip_list = client.containers.run(BOOTSTRAP_IMAGE_CHEIP,
@@ -327,6 +337,7 @@ def _container_exposed_port(component, instname):
port = re.split('/tcp', key)[0]
return port
+
def _update_db_connstring():
user = os.getenv('GEONODE_DATABASE', 'geonode')
pwd = os.getenv('GEONODE_DATABASE_PASSWORD', 'geonode')
@@ -396,9 +407,9 @@ def _geoserver_info_provision(url):
from geoserver.catalog import Catalog
print("Setting GeoServer Admin Password...")
cat = Catalog(url,
- username=settings.OGC_SERVER_DEFAULT_USER,
- password=settings.OGC_SERVER_DEFAULT_PASSWORD
- )
+ username=settings.OGC_SERVER_DEFAULT_USER,
+ password=settings.OGC_SERVER_DEFAULT_PASSWORD
+ )
headers = {
"Content-type": "application/xml",
"Accept": "application/xml"
@@ -423,27 +434,22 @@ def _prepare_oauth_fixture():
print("Public Hostname or IP is {0}".format(pub_ip))
pub_port = _geonode_public_port()
print("Public PORT is {0}".format(pub_port))
- default_fixture = [
- {
- "model": "oauth2_provider.application",
- "pk": 1001,
- "fields": {
- "skip_authorization": True,
- "created": "2018-05-31T10:00:31.661Z",
- "updated": "2018-05-31T11:30:31.245Z",
- "algorithm": "RS256",
- "redirect_uris": "{0}://{1}:{2}/geoserver/index.html".format(net_scheme, pub_ip, pub_port) if pub_port else "{0}://{1}/geoserver/index.html".format(net_scheme, pub_ip),
- "name": "GeoServer",
- "authorization_grant_type": "authorization-code",
- "client_type": "confidential",
- "client_id": "{0}".format(os.environ['OAUTH2_CLIENT_ID']),
- "client_secret": "{0}".format(os.environ['OAUTH2_CLIENT_SECRET']),
- "user": [
- "admin"
- ]
- }
- }
- ]
+ default_fixture = [{"model": "oauth2_provider.application",
+ "pk": 1001,
+ "fields": {"skip_authorization": True,
+ "created": "2018-05-31T10:00:31.661Z",
+ "updated": "2018-05-31T11:30:31.245Z",
+ "algorithm": "RS256",
+ "redirect_uris": "{0}://{1}:{2}/geoserver/index.html".format(net_scheme,
+ pub_ip,
+ pub_port) if pub_port else "{0}://{1}/geoserver/index.html".format(net_scheme,
+ pub_ip),
+ "name": "GeoServer",
+ "authorization_grant_type": "authorization-code",
+ "client_type": "confidential",
+ "client_id": "{0}".format(os.environ['OAUTH2_CLIENT_ID']),
+ "client_secret": "{0}".format(os.environ['OAUTH2_CLIENT_SECRET']),
+ "user": ["admin"]}}]
with open('/tmp/default_oauth_apps_docker.json', 'w') as fixturefile:
json.dump(default_fixture, fixturefile)
@@ -465,9 +471,6 @@ def _prepare_site_fixture():
def _prepare_monitoring_fixture():
- upurl = urlparse(os.environ['SITEURL'])
- net_scheme = upurl.scheme
- net_loc = upurl.netloc
pub_ip = _geonode_public_host_ip()
print("Public Hostname or IP is {0}".format(pub_ip))
pub_port = _geonode_public_port()
@@ -482,7 +485,7 @@ def _prepare_monitoring_fixture():
geoserver_ip = socket.gethostbyname('geoserver')
except Exception:
pass
- #d = str(datetime.datetime.now())
+
d = '1970-01-01 00:00:00'
default_fixture = [
{
@@ -572,22 +575,22 @@ def _prepare_admin_fixture(admin_password, admin_email):
mdext_date = d.isoformat()[:23] + "Z"
default_fixture = [
{
- "fields": {
- "date_joined": mdext_date,
- "email": admin_email,
- "first_name": "",
- "groups": [],
- "is_active": True,
- "is_staff": True,
- "is_superuser": True,
- "last_login": mdext_date,
- "last_name": "",
- "password": make_password(admin_password),
- "user_permissions": [],
- "username": "admin"
- },
- "model": "people.Profile",
- "pk": 1000
+ "fields": {
+ "date_joined": mdext_date,
+ "email": admin_email,
+ "first_name": "",
+ "groups": [],
+ "is_active": True,
+ "is_staff": True,
+ "is_superuser": True,
+ "last_login": mdext_date,
+ "last_name": "",
+ "password": make_password(admin_password),
+ "user_permissions": [],
+ "username": "admin"
+ },
+ "model": "people.Profile",
+ "pk": 1000
}
]
with open('/tmp/django_admin_docker.json', 'w') as fixturefile: