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
|
# Copyright 2016 Egor Tensin <Egor.Tensin@gmail.com>
# This file is licensed under the terms of the MIT License.
# See LICENSE.txt for details.
from collections import OrderedDict
from datetime import datetime, timezone
from vk.user import Field as UserField
def _gen_timestamp():
return datetime.now(timezone.utc).replace(microsecond=0)
class Record:
_USER_FIELDS = (
UserField.UID,
UserField.FIRST_NAME,
UserField.LAST_NAME,
UserField.SCREEN_NAME,
UserField.ONLINE,
UserField.LAST_SEEN,
)
def __init__(self, fields, timestamp=None):
self._fields = fields
self._timestamp = timestamp if timestamp is not None else _gen_timestamp()
def __iter__(self):
return iter(self._fields)
def __contains__(self, field):
return field in self._fields
def __getitem__(self, field):
return self._fields[field]
def __setitem__(self, field, value):
self._fields[field] = value
def get_timestamp(self):
return self._timestamp
@staticmethod
def _timestamp_from_string(s):
return datetime.fromtimestamp(s)
def timestamp_to_string(self):
return self.get_timestamp().isoformat()
@staticmethod
def from_user(user):
fields = OrderedDict()
for field in Record._USER_FIELDS:
fields[field] = user[field]
if UserField.LAST_SEEN in Record._USER_FIELDS:
fields[UserField.LAST_SEEN] = fields[UserField.LAST_SEEN].isoformat()
return Record(fields)
@staticmethod
def from_row(row):
timestamp = Record._timestamp_from_string(row[0])
fields = OrderedDict()
for i in range(len(Record._USER_FIELDS)):
fields[Record._USER_FIELDS[i]] = row[i + 1]
return Record(fields, timestamp)
def to_row(self):
return [self.timestamp_to_string()] + [self[field] for field in self]
|