leadguru-jobs 0.554.0__py3-none-any.whl → 0.556.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {leadguru_jobs-0.554.0.dist-info → leadguru_jobs-0.556.0.dist-info}/METADATA +1 -1
- {leadguru_jobs-0.554.0.dist-info → leadguru_jobs-0.556.0.dist-info}/RECORD +8 -8
- lgt_jobs/jobs/chat_history.py +2 -3
- lgt_jobs/jobs/send_slack_message.py +2 -4
- lgt_jobs/lgt_common/slack_client/web_client.py +16 -51
- lgt_jobs/lgt_data/model.py +14 -5
- {leadguru_jobs-0.554.0.dist-info → leadguru_jobs-0.556.0.dist-info}/WHEEL +0 -0
- {leadguru_jobs-0.554.0.dist-info → leadguru_jobs-0.556.0.dist-info}/top_level.txt +0 -0
@@ -13,12 +13,12 @@ lgt_jobs/assets/images/mail.png,sha256=eORzQcAMkFr7DjgtABVhJ_zFuXgO7OXv78lLF4b39
|
|
13
13
|
lgt_jobs/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
14
14
|
lgt_jobs/jobs/analytics.py,sha256=IIsWt4A1qUw3w-S-8W16uKY1FRVWfXXA41_mu4uCNiM,979
|
15
15
|
lgt_jobs/jobs/bot_stats_update.py,sha256=R6mf5FxhWbyx92AYXlj0FZVjz2Tgz86mBvLHrsQ9AFE,7502
|
16
|
-
lgt_jobs/jobs/chat_history.py,sha256=
|
16
|
+
lgt_jobs/jobs/chat_history.py,sha256=tZ4XyOGdy1k6r4uotxSSKbXjTR_oRK6Ym0YthFYBtl8,6200
|
17
17
|
lgt_jobs/jobs/connect_sources.py,sha256=2tl1MGdm6l0yFwCXlD0J2tFSQpj7i1eT9sYd1nMOwWA,3596
|
18
18
|
lgt_jobs/jobs/inbox_leads.py,sha256=EYxdQPseNBY5ON7BK3LpnXDCgQpzHTPLRJCZmZiAAHA,5582
|
19
19
|
lgt_jobs/jobs/mass_message.py,sha256=1mFcBlL2MhzLbj5yrd_NyJc7TXDWCcROAzGDnr0miMU,2035
|
20
20
|
lgt_jobs/jobs/send_code.py,sha256=dIlLPkG3GgGKIEqGiElyzrtdrnJNTL1Ak2V0xnE-WIQ,824
|
21
|
-
lgt_jobs/jobs/send_slack_message.py,sha256=
|
21
|
+
lgt_jobs/jobs/send_slack_message.py,sha256=IuRqDGcDrz2EAZzF6nrLXO0aSA4mETB_tGOEbcMhjHE,2562
|
22
22
|
lgt_jobs/jobs/update_slack_profile.py,sha256=0fUHBd2gEBne52sTfxwji2Wu-oYDM5dLGsL-rHq5kwM,2765
|
23
23
|
lgt_jobs/jobs/user_balance_update.py,sha256=HxeEmDdloK9EcoEj1ybYTgxIkB0IQNLnss_kk3rLI1Q,2404
|
24
24
|
lgt_jobs/jobs/workspace_connect.py,sha256=qgjIRzAQRbJBx--eYsTtYgOUh2-p3N_-LIltfbJrYYo,7102
|
@@ -36,18 +36,18 @@ lgt_jobs/lgt_common/pubsub/pubsubfactory.py,sha256=rfUDooYuhBQ2pE9FdDxZOpXjbrvlp
|
|
36
36
|
lgt_jobs/lgt_common/slack_client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
37
37
|
lgt_jobs/lgt_common/slack_client/methods.py,sha256=ctKF_1UHEmSWaRsoGEgMZicVabV7eEufZ7pjxdMAx8g,1455
|
38
38
|
lgt_jobs/lgt_common/slack_client/slack_client.py,sha256=fxSTaU696yfe5tFWnuW6LuH4EUkgB2kdqDxQ96GYMJY,13799
|
39
|
-
lgt_jobs/lgt_common/slack_client/web_client.py,sha256=
|
39
|
+
lgt_jobs/lgt_common/slack_client/web_client.py,sha256=JrkEepL6EhEtX3Psv_sd25bcRB2P23LoGnFHcczQpnc,4778
|
40
40
|
lgt_jobs/lgt_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
41
41
|
lgt_jobs/lgt_data/analytics.py,sha256=TFUffL8Dn-vIJ3ZaCVN-cj1Qnjb8F9GJyuk6Fo7mR1s,21645
|
42
42
|
lgt_jobs/lgt_data/engine.py,sha256=Rsbz-CApAo_TVDssdjBkv8v_fVOZm_Uh1S6W4fnaEWo,7728
|
43
43
|
lgt_jobs/lgt_data/enums.py,sha256=GZn6wm-kOd3veEOo1qlOR8QYje4vKaGV0na9jGt9388,2160
|
44
44
|
lgt_jobs/lgt_data/helpers.py,sha256=NDa-V5EYaJfkGoWsmQSwSe6N_jxNxs8tHRQzW1iST6k,480
|
45
|
-
lgt_jobs/lgt_data/model.py,sha256=
|
45
|
+
lgt_jobs/lgt_data/model.py,sha256=y6heXdZblZTRia7IwI1zbXMVAkNHuw5zlf5tIAZ6FP4,28283
|
46
46
|
lgt_jobs/lgt_data/mongo_repository.py,sha256=qqbt-oJ-RHmICLARgWvHuyPwVeKFkUqJZ2MA1bfIlXs,44762
|
47
47
|
lgt_jobs/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
48
48
|
lgt_jobs/services/web_client.py,sha256=GLWsJkIC8rv6xLFaLwcMm4EwBlVDu0njORwkZqBJaE4,2086
|
49
49
|
lgt_jobs/templates/new_message.html,sha256=BD_E90akmQ1Wf07wtZAjeK_7DUKRmja5HFHVo_AKI24,6994
|
50
|
-
leadguru_jobs-0.
|
51
|
-
leadguru_jobs-0.
|
52
|
-
leadguru_jobs-0.
|
53
|
-
leadguru_jobs-0.
|
50
|
+
leadguru_jobs-0.556.0.dist-info/METADATA,sha256=jkZtBYwZKYwuYb-zS21fIWMZKjygBiKfml6JcHjuQac,1319
|
51
|
+
leadguru_jobs-0.556.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
52
|
+
leadguru_jobs-0.556.0.dist-info/top_level.txt,sha256=rIuw1DqwbnZyeoarBSC-bYeGOhv9mZBs7_afl9q4_JI,9
|
53
|
+
leadguru_jobs-0.556.0.dist-info/RECORD,,
|
lgt_jobs/jobs/chat_history.py
CHANGED
@@ -100,9 +100,8 @@ class LoadChatHistoryJob(BaseBackgroundJob, ABC):
|
|
100
100
|
if not messages:
|
101
101
|
return None
|
102
102
|
|
103
|
-
messages = [SlackMessageConvertService.from_slack_response(
|
104
|
-
bot.
|
105
|
-
user.id, bot.cookies) for m in messages]
|
103
|
+
messages = [SlackMessageConvertService.from_slack_response(bot.user_name, m, contact.sender_id,
|
104
|
+
bot.id, user.id) for m in messages]
|
106
105
|
new_messages = self._get_new_messages(contact, bot, messages)
|
107
106
|
chat_history = [message.to_dic() for message in new_messages]
|
108
107
|
self.chat_repo.upsert_messages(chat_history)
|
@@ -54,9 +54,7 @@ class SendSlackMessageJob(BaseBackgroundJob, ABC):
|
|
54
54
|
message = resp.get('message') if 'message' in resp \
|
55
55
|
else slack_client.conversation_replies(channel_id, resp['file_msg_ts'])['messages'][0]
|
56
56
|
|
57
|
-
message_model: ChatMessage = SlackMessageConvertService.from_slack_response(
|
58
|
-
|
59
|
-
bot.id, user.id,
|
60
|
-
slack_client.client.cookies)
|
57
|
+
message_model: ChatMessage = SlackMessageConvertService.from_slack_response(bot.user_name, message,
|
58
|
+
data.sender_id, bot.id, user.id)
|
61
59
|
message_model.viewed = True
|
62
60
|
ChatRepository().upsert_messages([message_model.to_dic()])
|
@@ -1,28 +1,13 @@
|
|
1
|
-
import requests
|
2
1
|
from google.cloud import storage
|
3
2
|
from datetime import datetime, timedelta
|
4
|
-
from lgt_jobs.lgt_data.model import ChatMessage
|
5
|
-
from .slack_client import SlackClient
|
6
|
-
from
|
7
|
-
|
8
|
-
|
9
|
-
def get_file_url(blob_path):
|
10
|
-
storage_client = storage.Client()
|
11
|
-
bucket = storage_client.get_bucket(SlackFilesClient.bucket_name)
|
12
|
-
blob = bucket.get_blob(blob_path)
|
13
|
-
if not blob:
|
14
|
-
return None
|
15
|
-
# valid for 3 days
|
16
|
-
return blob.generate_signed_url(timedelta(3))
|
3
|
+
from lgt_jobs.lgt_data.model import ChatMessage, LeadGuruFile
|
4
|
+
from lgt_jobs.lgt_common.slack_client.slack_client import SlackClient
|
5
|
+
from lgt_jobs.lgt_data.mongo_repository import to_object_id
|
17
6
|
|
18
7
|
|
19
8
|
class SlackMessageConvertService:
|
20
9
|
@staticmethod
|
21
|
-
def from_slack_response(
|
22
|
-
|
23
|
-
"""
|
24
|
-
:rtype: SlackHistoryMessageModel
|
25
|
-
"""
|
10
|
+
def from_slack_response(bot_name, dic, sender_id, bot_id, user_id) -> ChatMessage:
|
26
11
|
result = ChatMessage()
|
27
12
|
result.sender_id = sender_id
|
28
13
|
result.bot_id = bot_id
|
@@ -32,24 +17,15 @@ class SlackMessageConvertService:
|
|
32
17
|
result.attachments = dic.get('attachments', [])
|
33
18
|
result.files = []
|
34
19
|
result.user_id = to_object_id(user_id)
|
35
|
-
|
36
20
|
if 'files' in dic:
|
37
21
|
for file in dic.get('files'):
|
38
|
-
if file.get('mode'
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
new_file.size = file.get('size')
|
46
|
-
new_file.mimetype = file.get('mimetype')
|
47
|
-
|
48
|
-
url_private_download = file.get('url_private_download')
|
49
|
-
new_file.download_url = SlackFilesClient.get_file_url(user_email, bot_name, bot_token,
|
50
|
-
new_file.id, url_private_download,
|
51
|
-
new_file.mimetype, cookies)
|
52
|
-
result.files.append(new_file)
|
22
|
+
if file.get('mode') != "tombstone" and file.get('url_private_download'):
|
23
|
+
leadguru_file = LeadGuruFile()
|
24
|
+
leadguru_file.id = file['id']
|
25
|
+
leadguru_file.content_type = file['mimetype']
|
26
|
+
leadguru_file.file_name = file['name']
|
27
|
+
leadguru_file.blob_path = f'slack_files/{bot_name}/slack_files/{file["id"]}'
|
28
|
+
result.files.append(leadguru_file)
|
53
29
|
|
54
30
|
js_ticks = int(result.id.split('.')[0] + result.id.split('.')[1][3:])
|
55
31
|
result.created_at = datetime.fromtimestamp(js_ticks / 1000.0)
|
@@ -59,23 +35,12 @@ class SlackMessageConvertService:
|
|
59
35
|
class SlackFilesClient:
|
60
36
|
bucket_name = 'lgt_service_file'
|
61
37
|
|
62
|
-
|
63
|
-
@staticmethod
|
64
|
-
def get_file_url(user_email, bot_name, bot_token, file_id, url_private_download, mimetype, cookies=None):
|
38
|
+
def get_file_url(self, blob_path):
|
65
39
|
storage_client = storage.Client()
|
66
|
-
bucket = storage_client.get_bucket(
|
67
|
-
blob_path = f'slack_files/{user_email}/{bot_name}/{file_id}'
|
40
|
+
bucket = storage_client.get_bucket(self.bucket_name)
|
68
41
|
blob = bucket.get_blob(blob_path)
|
69
|
-
|
70
42
|
if not blob:
|
71
|
-
|
72
|
-
if res.status_code != 200:
|
73
|
-
raise Exception(
|
74
|
-
f'Failed to download file: {url_private_download} from slack due to response: '
|
75
|
-
f'Code: {res.status_code} Error: {res.content}')
|
76
|
-
blob = bucket.blob(blob_path)
|
77
|
-
blob.upload_from_string(res.content, content_type=mimetype)
|
78
|
-
|
43
|
+
return None
|
79
44
|
# valid for 3 days
|
80
45
|
return blob.generate_signed_url(timedelta(3))
|
81
46
|
|
@@ -138,10 +103,10 @@ class SlackWebClient:
|
|
138
103
|
def confirm_email(self, email: str, user_agent: str, locale: str = 'en-US') -> bool:
|
139
104
|
return self.client.confirm_email(email, user_agent, locale)
|
140
105
|
|
141
|
-
def confirm_code(self, email: str, code: str, user_agent: str
|
106
|
+
def confirm_code(self, email: str, code: str, user_agent: str):
|
142
107
|
return self.client.confirm_code(email, code, user_agent)
|
143
108
|
|
144
|
-
def find_workspaces(self, user_agent: str
|
109
|
+
def find_workspaces(self, user_agent: str):
|
145
110
|
return self.client.find_workspaces(user_agent)
|
146
111
|
|
147
112
|
def conversation_replies(self, channel: str, id: str) -> dict:
|
lgt_jobs/lgt_data/model.py
CHANGED
@@ -290,8 +290,8 @@ class UserModel(BaseModel):
|
|
290
290
|
self.subscription_expired_at: datetime | None = None
|
291
291
|
self.balance: str | None = None
|
292
292
|
self.subscription_name: str | None = None
|
293
|
-
self.
|
294
|
-
self.
|
293
|
+
self.subscription_expiration_notified = False
|
294
|
+
self.subscription_expiration_warning_notified = False
|
295
295
|
|
296
296
|
@classmethod
|
297
297
|
def from_dic(cls, dic: dict):
|
@@ -322,6 +322,10 @@ class UserModel(BaseModel):
|
|
322
322
|
def is_admin(self):
|
323
323
|
return UserRole.ADMIN in self.roles
|
324
324
|
|
325
|
+
@property
|
326
|
+
def subscription_expired(self):
|
327
|
+
return self.subscription_expired_at.replace(tzinfo=UTC) < datetime.now(UTC)
|
328
|
+
|
325
329
|
def get_slack_user(self, slack_email: str):
|
326
330
|
return next(filter(lambda x: slack_email == x.email, self.slack_users), None)
|
327
331
|
|
@@ -579,9 +583,7 @@ class ChatMessage:
|
|
579
583
|
|
580
584
|
def to_dic(self):
|
581
585
|
result = copy.deepcopy(self.__dict__)
|
582
|
-
|
583
|
-
result['files'] = [x.to_dic() if isinstance(x, ChatMessage.SlackFileModel) else x for x in self.files]
|
584
|
-
|
586
|
+
result['files'] = [x.to_dic() for x in result.get('files', [])]
|
585
587
|
return result
|
586
588
|
|
587
589
|
@classmethod
|
@@ -971,3 +973,10 @@ class Subscription(BaseModel):
|
|
971
973
|
model: Subscription | None = super().from_dic(dic)
|
972
974
|
model.features = [Feature.from_dic(feature) for feature in dic.get('features', [])]
|
973
975
|
return model
|
976
|
+
|
977
|
+
|
978
|
+
class LeadGuruFile(DictionaryModel):
|
979
|
+
id: str = None
|
980
|
+
blob_path: str
|
981
|
+
content_type: str
|
982
|
+
file_name: str = None
|
File without changes
|
File without changes
|