-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathOrder.py
103 lines (81 loc) · 3.03 KB
/
Order.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
"""Contains Order class"""
from typing import NewType, Union, Optional
from datetime import datetime
from collections import Counter
from .Item import ItemId, ItemCounter
from .OrderStatus import OrderStatus
OrderId = NewType('OrderId', int)
class Order:
"""Order contains items, status and metadata"""
def __init__(
self,
order_id: OrderId,
items: ItemCounter = ItemCounter(),
created_by: Optional[int] = None,
created: Union[str, datetime] = datetime.now(),
description: str = '',
status: OrderStatus = OrderStatus.OPEN,
finished: Union[None, str, datetime] = None,
):
self.created_by = created_by
self.created = created
if isinstance(created, str):
self.created = datetime.strptime(created, "%Y-%m-%d %H:%M:%S.%f")
self.description = description
self.items = Counter(items)
self.order_id = order_id # Exists after order added to database
self.status = status
self.finished = finished
if isinstance(finished, str):
self.finished = datetime.strptime(finished, "%Y-%m-%d %H:%M:%S.%f")
def get_time_to_complete(self):
if not self.finished:
return None
return self.finished - self.created
def set_open(self):
self.status = OrderStatus.OPEN
def is_open(self):
return self.status == OrderStatus.OPEN
def set_in_progress(self):
self.status = OrderStatus.IN_PROGRESS
def is_in_progress(self):
return self.status == OrderStatus.IN_PROGRESS
def set_complete(self):
self.status = OrderStatus.COMPLETE
def is_complete(self):
return self.status == OrderStatus.COMPLETE
def set_error(self):
self.status = OrderStatus.ERROR
def is_error(self):
return self.status == OrderStatus.ERROR
def is_finished(self):
return self.is_complete() or self.is_error()
def to_json(self):
return {
"order_id": self.order_id,
"items": self.items,
"created_by": self.created_by,
"created": self.created,
"description": self.description,
"status": self.status,
"finished": self.finished,
}
def __repr__(self):
return f"Order {self.order_id} [{self.status}]: {self.items}"
def __eq__(self, obj: object) -> bool:
if isinstance(obj, Order):
return (
(self.order_id == obj.order_id) and
(sorted(self.items.items()) == sorted(obj.items.items())) and
(self.created_by == obj.created_by) and
(self.created == obj.created) and
(self.description == obj.description) and
(self.status == obj.status) and
(self.finished == obj.finished)
)
else:
raise NotImplementedError()
if __name__ == "__main__":
order = Order(description='blah', items=ItemCounter(
map(ItemId, [1, 1, 3])), order_id=OrderId(3))
print(order)