23
23
from storages .compress import CompressedFileMixin
24
24
from storages .compress import CompressStorageMixin
25
25
from storages .utils import check_location
26
+ from storages .utils import clean_name
26
27
from storages .utils import get_available_overwrite_name
27
28
from storages .utils import is_seekable
28
29
from storages .utils import lookup_env
@@ -406,20 +407,6 @@ def _get_security_token(self):
406
407
security_token = self .security_token or lookup_env (self .security_token_names )
407
408
return security_token
408
409
409
- def _clean_name (self , name ):
410
- """
411
- Cleans the name so that Windows style paths work
412
- """
413
- # Normalize Windows style paths
414
- clean_name = posixpath .normpath (name ).replace ('\\ ' , '/' )
415
-
416
- # os.path.normpath() can strip trailing slashes so we implement
417
- # a workaround here.
418
- if name .endswith ('/' ) and not clean_name .endswith ('/' ):
419
- # Add a trailing slash as it was stripped.
420
- clean_name += '/'
421
- return clean_name
422
-
423
410
def _normalize_name (self , name ):
424
411
"""
425
412
Normalizes the name so that paths like /path/to/ignored/../something.txt
@@ -432,7 +419,7 @@ def _normalize_name(self, name):
432
419
raise SuspiciousOperation ("Attempted access to '%s' denied." % name )
433
420
434
421
def _open (self , name , mode = 'rb' ):
435
- name = self ._normalize_name (self . _clean_name (name ))
422
+ name = self ._normalize_name (clean_name (name ))
436
423
try :
437
424
f = S3Boto3StorageFile (name , mode , self )
438
425
except ClientError as err :
@@ -442,7 +429,7 @@ def _open(self, name, mode='rb'):
442
429
return f
443
430
444
431
def _save (self , name , content ):
445
- cleaned_name = self . _clean_name (name )
432
+ cleaned_name = clean_name (name )
446
433
name = self ._normalize_name (cleaned_name )
447
434
params = self ._get_write_parameters (name , content )
448
435
@@ -459,11 +446,11 @@ def _save(self, name, content):
459
446
return cleaned_name
460
447
461
448
def delete (self , name ):
462
- name = self ._normalize_name (self . _clean_name (name ))
449
+ name = self ._normalize_name (clean_name (name ))
463
450
self .bucket .Object (name ).delete ()
464
451
465
452
def exists (self , name ):
466
- name = self ._normalize_name (self . _clean_name (name ))
453
+ name = self ._normalize_name (clean_name (name ))
467
454
try :
468
455
self .connection .meta .client .head_object (Bucket = self .bucket_name , Key = name )
469
456
return True
@@ -475,7 +462,7 @@ def exists(self, name):
475
462
raise
476
463
477
464
def listdir (self , name ):
478
- path = self ._normalize_name (self . _clean_name (name ))
465
+ path = self ._normalize_name (clean_name (name ))
479
466
# The path needs to end with a slash, but if the root is empty, leave it.
480
467
if path and not path .endswith ('/' ):
481
468
path += '/'
@@ -494,7 +481,7 @@ def listdir(self, name):
494
481
return directories , files
495
482
496
483
def size (self , name ):
497
- name = self ._normalize_name (self . _clean_name (name ))
484
+ name = self ._normalize_name (clean_name (name ))
498
485
return self .bucket .Object (name ).content_length
499
486
500
487
def _get_write_parameters (self , name , content = None ):
@@ -531,7 +518,7 @@ def get_modified_time(self, name):
531
518
Returns an (aware) datetime object containing the last modified time if
532
519
USE_TZ is True, otherwise returns a naive datetime in the local timezone.
533
520
"""
534
- name = self ._normalize_name (self . _clean_name (name ))
521
+ name = self ._normalize_name (clean_name (name ))
535
522
entry = self .bucket .Object (name )
536
523
if setting ('USE_TZ' ):
537
524
# boto3 returns TZ aware timestamps
@@ -569,7 +556,7 @@ def _strip_signing_parameters(self, url):
569
556
570
557
def url (self , name , parameters = None , expire = None , http_method = None ):
571
558
# Preserve the trailing slash after normalizing the path.
572
- name = self ._normalize_name (self . _clean_name (name ))
559
+ name = self ._normalize_name (clean_name (name ))
573
560
params = parameters .copy () if parameters else {}
574
561
if expire is None :
575
562
expire = self .querystring_expire
@@ -598,7 +585,7 @@ def url(self, name, parameters=None, expire=None, http_method=None):
598
585
599
586
def get_available_name (self , name , max_length = None ):
600
587
"""Overwrite existing file with the same name."""
601
- name = self . _clean_name (name )
588
+ name = clean_name (name )
602
589
if self .file_overwrite :
603
590
return get_available_overwrite_name (name , max_length )
604
591
return super ().get_available_name (name , max_length )
0 commit comments