1
0
Fork 0
bill_man/models.py

89 lines
2.8 KiB
Python
Executable File

#!/usr/bin/env python3
from collections import namedtuple, defaultdict
from datetime import datetime
from decimal import Decimal
from util import UTCTZ, KSTTZ
class ObjEntry(namedtuple('ModifiedEntry',
('bucket',
'path',
'etags',
'modified',
))
):
def __new__(cls, *args, **kwargs):
item = super(ObjEntry, cls).__new__(cls, *args, **kwargs)
return item
def params(self, bucket, path):
if (self.bucket, self.path) != (bucket, path):
return ()
if self.etags is not None:
yield ('IfNoneMatch', self.etags)
if self.modified is not None:
yield ('IfModifiedSince', self.modified)
class Cost(namedtuple('Cost',
('amount',
'currency',
'service',
'type',
'start',
'end'
))
):
__slots__ = ()
def __new__(cls, *args, **kwargs):
argdict = defaultdict(lambda: None)
argdict.update(**kwargs)
parse_date = lambda item: datetime.strptime(item, '%Y-%m-%dT%H:%M:%SZ').replace(tzinfo=UTCTZ).astimezone(KSTTZ)
args = (
(Decimal(argdict['lineItem/BlendedCost']) if argdict['lineItem/BlendedCost'] else None),
(argdict['lineItem/CurrencyCode'] if argdict['lineItem/CurrencyCode'] else None),
(argdict['product/ProductName'] if argdict['product/ProductName'] else None),
(argdict['lineItem/UsageType'] if argdict['lineItem/UsageType'] else None),
(parse_date(argdict['lineItem/UsageStartDate']) if argdict['lineItem/UsageStartDate'] else None),
(parse_date(argdict['lineItem/UsageEndDate']) if argdict['lineItem/UsageEndDate'] else None)
)
item = super(Cost, cls).__new__(cls, *args)
return item
@property
def key(self):
return CostSummery(self.currency, self.service, self.type)
class CostSubItem(namedtuple('CostSubItem',
('currency',
'service',
))
):
__slots__ = ()
def __new__(cls, *args):
item = super(CostSubItem, cls).__new__(cls, *args)
return item
class CostSummery(namedtuple('CostSummery',
('currency',
'service',
'type'
))
):
__slots__ = ()
def __new__(cls, *args):
item = super(CostSummery, cls).__new__(cls, *args)
return item
@property
def key(self):
return CostSubItem(self.currency, self.service)