-
Notifications
You must be signed in to change notification settings - Fork 61
Expand file tree
/
Copy pathapi.py
More file actions
136 lines (105 loc) · 4.19 KB
/
api.py
File metadata and controls
136 lines (105 loc) · 4.19 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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
"""
Wrapper of Memberkit api.
See doc: https://gist.github.com/rainerborene/26bc6b66bbc5dd4f78a1141df31ef718
"""
from datetime import date
import requests
from decorator import decorator
from django.conf import settings
class _ApiKeyNone:
pass
_base_url = 'https://memberkit.com.br'
_default_api_key = _ApiKeyNone
def set_default_api_key(key: str) -> None:
global _default_api_key
if key:
_default_api_key = key
set_default_api_key(settings.MEMBERKIT_API_KEY)
class MemberkitApiKeyError(Exception):
pass
@decorator
def _configure_api_key(func, *args, api_key=_ApiKeyNone, **kwargs):
if not settings.MEMBERKIT_ON:
return []
if api_key is _ApiKeyNone:
api_key = _default_api_key
if api_key is _ApiKeyNone:
raise MemberkitApiKeyError('api_key must be passed as parameter or set_default_api_key if valid key')
return func(*args, api_key=api_key, **kwargs)
@_configure_api_key
def list_membership_levels(*, api_key=_ApiKeyNone):
response = requests.get(f'{_base_url}/api/v1/membership_levels?api_key={api_key}')
response.raise_for_status()
return response.json()
@_configure_api_key
def user_detail(email_or_memberkit_user_id, *, api_key=_ApiKeyNone):
response = requests.get(f'{_base_url}/api/v1/users/{email_or_memberkit_user_id}?api_key={api_key}')
response.raise_for_status()
return response.json()
@_configure_api_key
def activate_user(full_name: str, email: str, subscription_type_id: int, expires_at: date = None, *,
api_key=_ApiKeyNone):
if expires_at is None:
expires_at = date(2200, 1, 1)
data = {
'full_name': full_name,
'email': email,
'status': 'active',
'blocked': False,
'membership_level_id': subscription_type_id,
'unlimited': False,
'expires_at': expires_at.strftime('%d/%m/%Y'),
}
requests.post(f'{_base_url}/api/v1/users?api_key={api_key}', json=data)
return user_detail(email)
@_configure_api_key
def update_user_subscription(memberkit_user_id: int, subscription_type_id: int, status: str, expires_at: date, *,
api_key=_ApiKeyNone):
valid_statuses = {'inactive', 'pending', 'active', 'expired'}
if status not in valid_statuses:
raise ValueError(f'{status} is not on of valid statuses: {valid_statuses}')
user_json = user_detail(memberkit_user_id, api_key=api_key)
data = {
'full_name': user_json['full_name'],
'email': user_json['email'],
'status': status,
'blocked': False,
'membership_level_id': subscription_type_id,
'unlimited': False,
'expires_at': expires_at.strftime('%d/%m/%Y'),
}
response = requests.post(f'{_base_url}/api/v1/users?api_key={api_key}', json=data)
response.raise_for_status()
return response.json()
@_configure_api_key
def inactivate_user(memberkit_user_id: int, subscription_type_id: int, *,
api_key=_ApiKeyNone):
user_json = user_detail(memberkit_user_id, api_key=api_key)
data = {
'full_name': user_json['full_name'],
'email': user_json['email'],
'status': 'expired',
'blocked': False,
'membership_level_id': subscription_type_id,
'unlimited': False,
'expires_at': date.today().strftime('%d/%m/%Y'),
}
response = requests.post(f'{_base_url}/api/v1/users?api_key={api_key}', json=data)
response.raise_for_status()
return response.json()
@_configure_api_key
def delete_user(memberkit_user_id: int, *, api_key=_ApiKeyNone):
response = requests.delete(f'{_base_url}/api/v1/users/{memberkit_user_id}?api_key={api_key}')
response.raise_for_status()
return response
@_configure_api_key
def list_users(page=0, *, api_key=_ApiKeyNone):
response = requests.get(f'{_base_url}/api/v1/users?api_key={api_key}&page={page}')
response.raise_for_status()
return response.json()
@_configure_api_key
def generate_token(memberkit_user_id: int, *, api_key=_ApiKeyNone):
user_json = user_detail(memberkit_user_id, api_key=api_key)
data = {'email': user_json['email']}
response = requests.post(f'{_base_url}/api/v1/tokens?api_key={api_key}', json=data)
return response.json()['token']