diff --git a/src/c3nav/editor/views/edit.py b/src/c3nav/editor/views/edit.py index 575e458f..c6dde44b 100644 --- a/src/c3nav/editor/views/edit.py +++ b/src/c3nav/editor/views/edit.py @@ -1,5 +1,4 @@ import mimetypes -import os import typing from contextlib import suppress @@ -739,7 +738,7 @@ def sourceimage(request, filename): return PermissionDenied try: - return HttpResponse(open(os.path.join(settings.SOURCES_ROOT, filename), 'rb'), + return HttpResponse(open(settings.SOURCES_ROOT / filename, 'rb'), content_type=mimetypes.guess_type(filename)[0]) except FileNotFoundError: raise Http404 diff --git a/src/c3nav/mapdata/management/commands/clearmapcache.py b/src/c3nav/mapdata/management/commands/clearmapcache.py index 967efc4b..a57f6e06 100644 --- a/src/c3nav/mapdata/management/commands/clearmapcache.py +++ b/src/c3nav/mapdata/management/commands/clearmapcache.py @@ -33,7 +33,7 @@ class Command(BaseCommand): for filename in os.listdir(settings.CACHE_ROOT): if filename.startswith('history_base_'): logger.info('Deleting %s...' % filename) - os.remove(os.path.join(settings.CACHE_ROOT, filename)) + os.remove(settings.CACHE_ROOT / filename) logger.info('Base history deleted.') if not settings.HAS_CELERY and not options['no_process']: diff --git a/src/c3nav/mapdata/management/commands/rendermap.py b/src/c3nav/mapdata/management/commands/rendermap.py index 4c7fa226..394bf9fa 100644 --- a/src/c3nav/mapdata/management/commands/rendermap.py +++ b/src/c3nav/mapdata/management/commands/rendermap.py @@ -1,5 +1,4 @@ import argparse -import os from django.conf import settings from django.core.management.base import BaseCommand, CommandError @@ -109,8 +108,7 @@ class Command(BaseCommand): min_width=options['min_width']) name = options['name'] or ('level_%s' % level.short_label) - filename = os.path.join(settings.RENDER_ROOT, - '%s.%s' % (name, options['filetype'])) + filename = settings.RENDER_ROOT / ('%s.%s' % (name, options['filetype'])) render = renderer.render(get_engine(options['filetype']), center=not options['no_center']) data = render.render(filename) diff --git a/src/c3nav/mapdata/management/commands/statssnapshot.py b/src/c3nav/mapdata/management/commands/statssnapshot.py index b189b37d..f2ae1681 100644 --- a/src/c3nav/mapdata/management/commands/statssnapshot.py +++ b/src/c3nav/mapdata/management/commands/statssnapshot.py @@ -1,5 +1,4 @@ import json -import os from django.conf import settings from django.core.management.base import BaseCommand @@ -20,10 +19,9 @@ class Command(BaseCommand): def handle(self, *args, **options): result = stats_snapshot(reset=options['reset']) if options['save']: - filename = os.path.join( - settings.STATS_ROOT, - 'stats__%s__%s.json' % (result['start_date'], result['end_date']) - ).replace(' ', '_').replace(':', '-') + filename = settings.STATS_ROOT / ( + ('stats__%s__%s.json' % (result['start_date'], result['end_date'])).replace(' ', '_').replace(':', '-') + ) json.dump(result, open(filename, 'w'), indent=4) print('saved to %s' % filename) else: diff --git a/src/c3nav/mapdata/migrations/0016_remove_source_image.py b/src/c3nav/mapdata/migrations/0016_remove_source_image.py index b194ea43..8eb6bafd 100644 --- a/src/c3nav/mapdata/migrations/0016_remove_source_image.py +++ b/src/c3nav/mapdata/migrations/0016_remove_source_image.py @@ -11,7 +11,7 @@ from django.db import migrations def move_sources(apps, schema_editor): Source = apps.get_model('mapdata', 'Source') for source in Source.objects.all(): - with open(os.path.join(settings.SOURCES_ROOT, source.name), 'wb') as f: + with open(settings.SOURCES_ROOT / source.name), 'wb') as f: f.write(source.image) diff --git a/src/c3nav/mapdata/models/source.py b/src/c3nav/mapdata/models/source.py index 6a20a7f0..8dcbbfc5 100644 --- a/src/c3nav/mapdata/models/source.py +++ b/src/c3nav/mapdata/models/source.py @@ -1,5 +1,3 @@ -import os - from django.conf import settings from django.db import models from django.utils.translation import gettext_lazy as _ @@ -21,7 +19,7 @@ class Source(BoundsMixin, AccessRestrictionMixin, models.Model): @property def filepath(self): - return os.path.join(settings.SOURCES_ROOT, self.name) + return settings.SOURCES_ROOT / self.name @property def title(self): diff --git a/src/c3nav/mapdata/models/update.py b/src/c3nav/mapdata/models/update.py index dfeba68d..65326c1d 100644 --- a/src/c3nav/mapdata/models/update.py +++ b/src/c3nav/mapdata/models/update.py @@ -104,7 +104,7 @@ class MapUpdate(models.Model): yield cls.objects.select_for_update().get(pk=earliest.pk) def _changed_geometries_filename(self): - return os.path.join(settings.CACHE_ROOT, 'changed_geometries', 'update_%d.pickle' % self.pk) + return settings.CACHE_ROOT / 'changed_geometries' / ('update_%d.pickle' % self.pk) class ProcessUpdatesAlreadyRunning(Exception): pass diff --git a/src/c3nav/mapdata/render/renderdata.py b/src/c3nav/mapdata/render/renderdata.py index f2146f70..5cb64193 100644 --- a/src/c3nav/mapdata/render/renderdata.py +++ b/src/c3nav/mapdata/render/renderdata.py @@ -1,5 +1,4 @@ import operator -import os import pickle import threading from collections import deque @@ -297,7 +296,7 @@ class LevelRenderData: @staticmethod def _level_filename(pk): - return os.path.join(settings.CACHE_ROOT, 'render_data_level_%d.pickle' % pk) + return settings.CACHE_ROOT / ('render_data_level_%d.pickle' % pk) @classmethod def get(cls, level): diff --git a/src/c3nav/mapdata/utils/cache/indexed.py b/src/c3nav/mapdata/utils/cache/indexed.py index 5d5de039..785a735a 100644 --- a/src/c3nav/mapdata/utils/cache/indexed.py +++ b/src/c3nav/mapdata/utils/cache/indexed.py @@ -1,5 +1,4 @@ import math -import os import struct import threading @@ -197,7 +196,7 @@ class LevelGeometryIndexed(GeometryIndexed): @classmethod def level_filename(cls, level_id, mode): from django.conf import settings - return os.path.join(settings.CACHE_ROOT, '%s_%s_level_%d' % (cls.variant_name, mode, level_id)) + return settings.CACHE_ROOT / ('%s_%s_level_%d' % (cls.variant_name, mode, level_id)) @classmethod def open_level(cls, level_id, mode, **kwargs): diff --git a/src/c3nav/mapdata/utils/cache/package.py b/src/c3nav/mapdata/utils/cache/package.py index 04edf180..2c372b39 100644 --- a/src/c3nav/mapdata/utils/cache/package.py +++ b/src/c3nav/mapdata/utils/cache/package.py @@ -21,7 +21,7 @@ class CachePackage: def save(self, filename=None, compression=None): if filename is None: from django.conf import settings - filename = os.path.join(settings.CACHE_ROOT, 'package.tar') + filename = settings.CACHE_ROOT / 'package.tar' if compression is not None: filename += '.' + compression @@ -75,7 +75,7 @@ class CachePackage: def open(cls, filename=None): if filename is None: from django.conf import settings - filename = os.path.join(settings.CACHE_ROOT, 'package.tar') + filename = settings.CACHE_ROOT / 'package.tar' return cls.read(open(filename, 'rb')) cached = None diff --git a/src/c3nav/mapdata/views.py b/src/c3nav/mapdata/views.py index 8f99a747..3bb780ac 100644 --- a/src/c3nav/mapdata/views.py +++ b/src/c3nav/mapdata/views.py @@ -99,9 +99,9 @@ def tile(request, level, zoom, x, y, access_permissions=None): # get tile cache last update if settings.CACHE_TILES: - tile_dirname = os.path.sep.join((settings.TILES_ROOT, str(level), str(zoom), str(x), str(y))) - last_update_filename = os.path.join(tile_dirname, 'last_update') - tile_filename = os.path.join(tile_dirname, access_cache_key+'.png') + tile_dirname = settings.TILES_ROOT / str(level) / str(zoom) / str(x) / str(y) + last_update_filename = tile_dirname / 'last_update' + tile_filename = tile_dirname / (access_cache_key+'.png') # get tile cache last update tile_cache_update_cache_key = 'mapdata:tile-cache-update:%d-%d-%d-%d' % (level, zoom, x, y) @@ -114,7 +114,7 @@ def tile(request, level, zoom, x, y, access_permissions=None): pass if tile_cache_update != base_cache_key: - os.system('rm -rf '+os.path.join(tile_dirname, '*')) + os.system('rm -rf '+(tile_dirname / '*')) else: try: with open(tile_filename, 'rb') as f: @@ -171,7 +171,7 @@ def map_history(request, level, mode, filetype): def get_cache_package(request, filetype): enforce_tile_secret_auth(request) - filename = os.path.join(settings.CACHE_ROOT, 'package.'+filetype) + filename = settings.CACHE_ROOT / ('package.'+filetype) f = open(filename, 'rb') f.seek(0, os.SEEK_END) diff --git a/src/c3nav/routing/locator.py b/src/c3nav/routing/locator.py index b07c6f0d..e52d0cbd 100644 --- a/src/c3nav/routing/locator.py +++ b/src/c3nav/routing/locator.py @@ -1,5 +1,4 @@ import operator -import os import pickle import re import threading @@ -17,7 +16,7 @@ from c3nav.routing.router import Router class Locator: - filename = os.path.join(settings.CACHE_ROOT, 'locator') + filename = settings.CACHE_ROOT / 'locator' def __init__(self, stations, spaces): self.stations = stations @@ -42,7 +41,7 @@ class Locator: @classmethod def build_filename(cls, update): - return os.path.join(settings.CACHE_ROOT, 'locator_%s.pickle' % MapUpdate.build_cache_key(*update)) + return settings.CACHE_ROOT / ('locator_%s.pickle' % MapUpdate.build_cache_key(*update)) @classmethod def load_nocache(cls, update): diff --git a/src/c3nav/routing/rangelocator.py b/src/c3nav/routing/rangelocator.py index e66fb447..b6d09e4a 100644 --- a/src/c3nav/routing/rangelocator.py +++ b/src/c3nav/routing/rangelocator.py @@ -1,4 +1,3 @@ -import os import pickle import threading from dataclasses import dataclass @@ -21,7 +20,7 @@ class RangeLocatorBeacon: @dataclass class RangeLocator: - filename = os.path.join(settings.CACHE_ROOT, 'rangelocator') + filename = settings.CACHE_ROOT / 'rangelocator' beacons: dict[str, RangeLocatorBeacon] @@ -45,7 +44,7 @@ class RangeLocator: @classmethod def build_filename(cls, update): - return os.path.join(settings.CACHE_ROOT, 'rangelocator_%s.pickle' % MapUpdate.build_cache_key(*update)) + return settings.CACHE_ROOT / ('rangelocator_%s.pickle' % MapUpdate.build_cache_key(*update)) @classmethod def load_nocache(cls, update): diff --git a/src/c3nav/routing/router.py b/src/c3nav/routing/router.py index 11b544d2..c2d4d320 100644 --- a/src/c3nav/routing/router.py +++ b/src/c3nav/routing/router.py @@ -1,6 +1,5 @@ import logging import operator -import os import pickle import threading from collections import deque, namedtuple @@ -29,7 +28,7 @@ logger = logging.getLogger('c3nav') class Router: - filename = os.path.join(settings.CACHE_ROOT, 'router') + filename = settings.CACHE_ROOT / 'router' def __init__(self, levels, spaces, areas, pois, groups, restrictions, nodes, edges, waytypes, graph): self.levels = levels @@ -273,7 +272,7 @@ class Router: @classmethod def build_filename(cls, update): - return os.path.join(settings.CACHE_ROOT, 'router_%s.pickle' % MapUpdate.build_cache_key(*update)) + return settings.CACHE_ROOT / ('router_%s.pickle' % MapUpdate.build_cache_key(*update)) @classmethod def load_nocache(cls, update):