Skip to content

Commit 48f859d

Browse files
committed
[File]Rest Parity
1 parent fa309b1 commit 48f859d

16 files changed

+2020
-68
lines changed

azure-storage-common/azure/storage/common/_deserialization.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,13 @@ def _get_download_size(start_range, end_range, resource_size):
8484
'x-ms-copy-status-description': ('copy', 'status_description', _to_str),
8585
'x-ms-has-immutability-policy': (None, 'has_immutability_policy', _bool),
8686
'x-ms-has-legal-hold': (None, 'has_legal_hold', _bool),
87+
'x-ms-file-attributes': ('smb_properties', 'ntfs_attributes', _to_str),
88+
'x-ms-file-creation-time': ('smb_properties', 'creation_time', parser.parse, True),
89+
'x-ms-file-last-write-time': ('smb_properties', 'last_write_time', parser.parse, True),
90+
'x-ms-file-change-time': ('smb_properties', 'change_time', parser.parse, True),
91+
'x-ms-file-permission-key': ('smb_properties', 'permission_key', _to_str),
92+
'x-ms-file-id': ('smb_properties', 'file_id', _to_str),
93+
'x-ms-file-parent-id': ('smb_properties', 'parent_id', _to_str),
8794
}
8895

8996

@@ -120,7 +127,11 @@ def _parse_properties(response, result_class):
120127
setattr(props, info[1], info[2](value))
121128
else:
122129
attr = getattr(props, info[0])
123-
setattr(attr, info[1], info[2](value))
130+
# if info[3] is True, time zones in parsed strings are ignored and a naive :class:`datetime` object
131+
# will be returned.
132+
ignoretz = info[3] if len(info) > 3 else False
133+
header_value = info[2](value, ignoretz=ignoretz) if info[2] is parser.parse else info[2](value)
134+
setattr(attr, info[1], header_value)
124135

125136
if hasattr(props, 'blob_type') and props.blob_type == 'PageBlob' and hasattr(props, 'blob_tier') and props.blob_tier is not None:
126137
props.blob_tier = _to_upper_str(props.blob_tier)

azure-storage-file/ChangeLog.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
55
## Version XX.XX.XX
66
- Added update_range_from_file_url API to writes the bytes from one Azure File endpoint into the specified range of another Azure File endpoint.
7+
- Added set_directory_properties, create_permission_for_share and get_permission_for_share APIs
8+
- Added optional parameters(file_permission, smb_properties) for create_file*, create_directory* related APIs and set_file_properties API
9+
- Updated get_file_properties, get_directory_properties so that the response has SMB related properties
710

811
## Version 2.0.1:
912
- Updated dependency on azure-storage-common.

azure-storage-file/azure/storage/file/_deserialization.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,24 @@ def _parse_directory(response, name):
6060
return Directory(name, props, metadata)
6161

6262

63+
def _parse_permission_key(response):
64+
'''
65+
Extracts out file permission key
66+
'''
67+
68+
if response is None or response.headers is None:
69+
return None
70+
return response.headers.get('x-ms-file-permission-key', None)
71+
72+
73+
def _parse_permission(response):
74+
'''
75+
Extracts out file permission
76+
'''
77+
78+
return response.body
79+
80+
6381
def _parse_file(response, name, validate_content=False):
6482
if response is None:
6583
return None

azure-storage-file/azure/storage/file/_serialization.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,17 @@
33
# Licensed under the MIT License. See License.txt in the project root for
44
# license information.
55
# --------------------------------------------------------------------------
6+
from sys import getsizeof
7+
68
from azure.storage.common._common_conversion import _str
79
from azure.storage.common._error import (
810
_validate_not_none,
911
_ERROR_START_END_NEEDED_FOR_MD5,
1012
_ERROR_RANGE_TOO_LARGE_FOR_MD5,
1113
)
14+
_ERROR_TOO_MANY_FILE_PERMISSIONS = 'file_permission and file_permission_key should not be set at the same time'
15+
_FILE_PERMISSION_TOO_LONG = 'Size of file_permission is too large. file_permission should be <=8KB, else' \
16+
'please use file_permission_key'
1217

1318

1419
def _get_path(share_name=None, directory_name=None, file_name=None):
@@ -65,3 +70,25 @@ def _validate_and_format_range_headers(request, start_range, end_range, start_ra
6570
raise ValueError(_ERROR_RANGE_TOO_LARGE_FOR_MD5)
6671

6772
request.headers['x-ms-range-get-content-md5'] = 'true'
73+
74+
75+
def _validate_and_return_file_permission(file_permission, file_permission_key, default_permission):
76+
# if file_permission and file_permission are both empty, then use the default_permission value as file permission
77+
# file_permission size should be <= 8KB, else file permission_key should be used
78+
empty_file_permission = file_permission is None or len(file_permission) == 0
79+
empty_file_permission_key = file_permission_key is None or len(file_permission_key) == 0
80+
file_permission_size_too_big = getsizeof(file_permission) > 8 * 1024
81+
82+
if file_permission_size_too_big:
83+
raise ValueError(_FILE_PERMISSION_TOO_LONG)
84+
85+
if empty_file_permission:
86+
if empty_file_permission_key:
87+
return default_permission
88+
else:
89+
return None
90+
91+
if empty_file_permission_key:
92+
return file_permission
93+
94+
raise ValueError(_ERROR_TOO_MANY_FILE_PERMISSIONS)

0 commit comments

Comments
 (0)