"""ACD account information"""
import logging
import collections
from .common import *
logger = logging.getLogger(__name__)
class _Usage(object):
dict_ = {}
def __init__(self, dict_):
self.dict_ = dict_
@staticmethod
def format_line(type_, count, size):
return '{0:10} {1:7}, {2:>6} {3:3}\n'.format(type_ + ':', count, *size)
def __str__(self):
str_ = ''
try:
sum_count = 0
sum_bytes = 0
for key in self.dict_.keys():
if not isinstance(self.dict_[key], dict):
continue
sum_count += self.dict_[key]['total']['count']
sum_bytes += self.dict_[key]['total']['bytes']
types = collections.OrderedDict([('Documents', 'doc'),
('Other', 'other'),
('Photos', 'photo'),
('Videos', 'video')])
total_count = 0
total_bytes = 0
for desc in types:
t = types[desc]
type_usage = self.dict_[t]['total']
type_count = type_usage['count']
type_bytes = type_usage['bytes']
total_count += type_count
total_bytes += type_bytes
str_ += _Usage.format_line(desc, type_count, _Usage.file_size_pair(type_bytes))
str_ += _Usage.format_line('Total', total_count, _Usage.file_size_pair(total_bytes))
except KeyError:
logger.warning('Invalid usage JSON string.')
return str_
@staticmethod
def file_size_pair(num: int, suffix='B') -> str:
for unit in ['', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi']:
if abs(num) < 1024.0:
return '%3.1f' % num, '%s%s' % (unit, suffix)
num /= 1024.0
return '%.1f' % num, '%s%s' % ('Yi', suffix)
[docs]class AccountMixin(object):
[docs] def get_account_info(self) -> dict:
"""Gets account status [ACTIVE, ...?] and terms of use version."""
r = self.BOReq.get(self.metadata_url + 'account/info')
return r.json()
[docs] def get_account_usage(self) -> str:
r = self.BOReq.get(self.metadata_url + 'account/usage')
if r.status_code not in OK_CODES:
raise RequestError(r.status_code, r.text)
return _Usage(r.json())
[docs] def get_quota(self) -> dict:
r = self.BOReq.get(self.metadata_url + 'account/quota')
if r.status_code not in OK_CODES:
raise RequestError(r.status_code, r.text)
return r.json()
[docs] def fs_sizes(self) -> tuple:
""":returns tuple: total and free space"""
q = self.get_quota()
return q.get('quota', 0), q.get('available', 0)