-
Notifications
You must be signed in to change notification settings - Fork 27
Expand file tree
/
Copy pathdata_service.py
More file actions
118 lines (104 loc) · 3.5 KB
/
data_service.py
File metadata and controls
118 lines (104 loc) · 3.5 KB
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# -*- coding: utf-8 -*-
from typing import (
Optional, List, Dict, Any,
NoReturn, Union, Callable
)
from social_ethosa import BetterBotBase, BetterUser
from saya import Vk
class BetterBotBaseDataService:
"""Class for interacting with the database.
"""
def __init__(self, db_name: str = "users"):
self.base = BetterBotBase(db_name, "dat")
self.base.addPattern("programming_languages", [])
self.base.addPattern("programming_languages_sorted", True)
self.base.addPattern("last_collective_vote", 0)
self.base.addPattern("github_profile", "")
self.base.addPattern("supporters", [])
self.base.addPattern("opponents", [])
self.base.addPattern("karma", 0)
def get_or_create_user(
self,
uid: int,
vk: Optional[Vk] = None
) -> BetterUser:
"""Returns a user object. Automatically creates it, if need.
:param uid: user ID
:param vk: Vk instance
"""
if self.base.notInBD(uid):
if vk:
name = vk.users.get(user_ids=uid)['response'][0]["first_name"]
else:
name = "Пользователь"
return self.base.addNew(uid=uid, name=name)
return self.base.load(uid)
def get_user(
self,
uid: int,
vk: Optional[Vk] = None
) -> BetterUser:
"""Alias for get_or_create_user.
"""
return self.get_or_create_user(uid, vk)
def get_users(
self,
other_keys: List[str],
sort_key: Optional[Callable[[Any], Any]],
reverse_sort: bool = True
) -> List[Dict[str, Any]]:
"""Returns users and their key values.
:param other_key: list of user keys
:param sort_key: base key
:param reverse_sort: if True returns reversed list.
"""
users = self.base.getByKeys(*other_keys)
if sort_key:
users = sorted(users, key=sort_key, reverse=reverse_sort)
return users
@staticmethod
def get_user_sorted_programming_languages(
user: BetterUser,
sort: bool = True,
reverse_sort: bool = False
) -> List[str]:
"""Returns user's programming languages.
:param user: -- user object
:param sort: -- return sorted list, if True
:param reverse_sort: -- uses for {sort} arg.
"""
languages = BetterBotBaseDataService.get_user_property(user, "programming_languages")
languages = languages if isinstance(languages, list) else []
if sort:
return sorted(languages, reverse=reverse_sort)
return languages
@staticmethod
def get_user_property(
user: Union[Dict[str, Any], BetterUser],
property_name: str
) -> Any:
"""
:param user: dict or BetterUser
:param property_name: needed property
"""
return user[property_name] if isinstance(user, dict) else eval(f"user.{property_name}")
@staticmethod
def set_user_property(
user: Union[Dict[str, Any], BetterUser],
property_name: str,
value: Any
) -> NoReturn:
"""Changes user property
:param user: dict or BetterUser
:param property_name: needed property
:param value: new value
"""
if isinstance(user, dict):
user[property_name] = value
else:
exec(f"user.{property_name} = value")
def save_user(
self,
user: BetterUser
) -> NoReturn:
self.base.save(user)