leadguru-jobs 0.706.0__tar.gz → 0.707.0__tar.gz
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.706.0 → leadguru_jobs-0.707.0}/PKG-INFO +1 -1
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/leadguru_jobs.egg-info/PKG-INFO +1 -1
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/workspace_connect.py +73 -67
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/notifications/notification.py +21 -83
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/mongo_repository.py +5 -20
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/MANIFEST.in +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/README.md +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/leadguru_jobs.egg-info/SOURCES.txt +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/leadguru_jobs.egg-info/dependency_links.txt +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/leadguru_jobs.egg-info/not-zip-safe +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/leadguru_jobs.egg-info/requires.txt +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/leadguru_jobs.egg-info/top_level.txt +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/assets/images/arrow.png +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/assets/images/arrow_blue.png +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/assets/images/firework.png +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/assets/images/lock.png +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/assets/images/logo.png +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/assets/images/mail.png +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/basejobs.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/env.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/analytics.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/bot_stats_update.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/bots_killer.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/chat_history.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/connect_sources.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/inbox_leads.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/load_slack_people.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/load_slack_users.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/mass_message.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/send_code.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/send_slack_message.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/update_slack_profile.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/discord_client/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/discord_client/discord_client.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/discord_client/methods.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/enums/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/enums/slack_errors.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/helpers.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/pubsub/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/pubsub/messages.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/pubsub/pubsubfactory.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/slack_client/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/slack_client/methods.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/slack_client/slack_client.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/slack_client/web_client.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/analytics.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/engine.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/enums.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/helpers.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/model.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/base.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/boards/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/boards/board.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/boards/status.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/bots/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/bots/base_bot.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/bots/bot_info.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/bots/dedicated_bot.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/chat/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/chat/file.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/chat/grouped_messages.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/chat/message.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/chat/request.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/chat/scheduled_message.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/contacts/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/contacts/contact.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/cloud/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/cloud/file.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/discord/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/discord/user.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/slack/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/slack/timezone.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/slack/user.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/user_workspace.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/leads/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/leads/config.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/leads/extended_lead.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/leads/lead.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/leads/message.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/notifications/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/notifications/notification_settings.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/people/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/people/people.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/people/profile.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/post/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/post/message.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/post/post.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/templates/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/templates/template.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/feature.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/general_settings.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/reset_password.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/subscription.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/typed_field.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/user.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/user_follow_ups.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/user_page.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/verification.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user_leads/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user_leads/extended_user_lead.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user_leads/user_lead.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/repositories/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/repositories/post/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/repositories/post/posts.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/main.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/runner.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/services/__init__.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/services/k8_manager.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/services/web_client.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/simple_job.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/smtp.py +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/templates/new_message.html +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/setup.cfg +0 -0
- {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/setup.py +0 -0
@@ -42,78 +42,84 @@ class ConnectSlackAccountJob(BaseBackgroundJob, ABC):
|
|
42
42
|
current_user.slack_users.append(slack_user)
|
43
43
|
slack_user.status = StatusConnection.IN_PROGRESS
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
UserMongoRepository().set(current_user.id, slack_users=[user.to_dic() for user in current_user.slack_users])
|
51
|
-
return
|
52
|
-
|
53
|
-
code_confirmed = code_confirmed_response.json().get('ok', False)
|
54
|
-
if not code_confirmed:
|
55
|
-
slack_user.status = StatusConnection.FAILED
|
56
|
-
UserMongoRepository().set(current_user.id, slack_users=[user.to_dic() for user in current_user.slack_users])
|
57
|
-
log.warning(f'Invalid code')
|
58
|
-
return
|
59
|
-
|
60
|
-
slack_user.cookies = client.client.cookies = code_confirmed_response.cookies.get_dict()
|
61
|
-
|
62
|
-
workspaces_response = None
|
63
|
-
attempt = 1
|
64
|
-
while attempt <= 5:
|
65
|
-
workspaces_response = client.find_workspaces(data.user_agent)
|
66
|
-
if workspaces_response.status_code != 200:
|
45
|
+
try:
|
46
|
+
client = SlackWebClient('')
|
47
|
+
code_confirmed_response = client.confirm_code(data.slack_email, data.code, data.user_agent)
|
48
|
+
if code_confirmed_response.status_code != 200:
|
49
|
+
log.warning(f'Unable to confirm code due to error: {code_confirmed_response.content}')
|
67
50
|
slack_user.status = StatusConnection.FAILED
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
51
|
+
UserMongoRepository().set(current_user.id, slack_users=[user.to_dic() for user in current_user.slack_users])
|
52
|
+
return
|
53
|
+
|
54
|
+
code_confirmed = code_confirmed_response.json().get('ok', False)
|
55
|
+
if not code_confirmed:
|
72
56
|
slack_user.status = StatusConnection.FAILED
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
57
|
+
UserMongoRepository().set(current_user.id, slack_users=[user.to_dic() for user in current_user.slack_users])
|
58
|
+
log.warning(f'Invalid code')
|
59
|
+
return
|
60
|
+
|
61
|
+
slack_user.cookies = client.client.cookies = code_confirmed_response.cookies.get_dict()
|
62
|
+
|
63
|
+
workspaces_response = None
|
64
|
+
attempt = 1
|
65
|
+
while attempt <= 5:
|
66
|
+
workspaces_response = client.find_workspaces(data.user_agent)
|
67
|
+
if workspaces_response.status_code != 200:
|
68
|
+
slack_user.status = StatusConnection.FAILED
|
69
|
+
log.warning(f'Attempt: {attempt}. Unable to get workspaces due to error: {workspaces_response.content}')
|
70
|
+
attempt += 1
|
71
|
+
time.sleep(60)
|
72
|
+
if not workspaces_response.json().get('ok', False):
|
73
|
+
slack_user.status = StatusConnection.FAILED
|
74
|
+
log.warning(f'Attempt: {attempt}. Unable to get workspaces due to error: {workspaces_response.json()}')
|
75
|
+
attempt += 1
|
76
|
+
time.sleep(60)
|
77
|
+
else:
|
78
|
+
slack_user.status = StatusConnection.IN_PROGRESS
|
79
|
+
break
|
79
80
|
|
80
|
-
|
81
|
+
UserMongoRepository().set(current_user.id, slack_users=[user.to_dic() for user in current_user.slack_users])
|
81
82
|
|
82
|
-
|
83
|
+
if attempt > 5:
|
84
|
+
return
|
85
|
+
|
86
|
+
log.info(f'{slack_user.email}: got workspaces data {workspaces_response.json()}')
|
87
|
+
user_workspaces = next((user for user in workspaces_response.json()['current_teams']
|
88
|
+
if user['email'] == data.slack_email), {}).get('teams', [])
|
89
|
+
user_workspaces = [UserWorkspace.from_dic(ws) for ws in user_workspaces]
|
90
|
+
user_workspaces = sorted(user_workspaces, key=lambda ws: ws.domain)
|
91
|
+
|
92
|
+
session = requests.Session()
|
93
|
+
session.cookies = code_confirmed_response.cookies
|
94
|
+
session.headers.update({'User-Agent': data.user_agent})
|
95
|
+
log.info(f'{slack_user.email}: started getting of tokens for {len(user_workspaces)} workspaces')
|
96
|
+
for workspace in user_workspaces:
|
97
|
+
if not workspace.magic_login_code:
|
98
|
+
continue
|
99
|
+
login_url = f"https://app.slack.com/t/{workspace.domain}/login/{workspace.magic_login_code}"
|
100
|
+
magic_response = session.post(login_url, cookies=session.cookies, headers=session.headers)
|
101
|
+
content = magic_response.content.decode('utf-8')
|
102
|
+
start_token_index = content.find("xox")
|
103
|
+
sliced_content = content[start_token_index:]
|
104
|
+
end_token_index = sliced_content.find('"')
|
105
|
+
token = sliced_content[:end_token_index]
|
106
|
+
workspace.magic_login_url = login_url
|
107
|
+
workspace.token = token
|
108
|
+
workspace.domain = workspace.domain
|
109
|
+
time.sleep(random.uniform(0.2, 0.5))
|
110
|
+
|
111
|
+
slack_user.cookies = session.cookies.get_dict()
|
112
|
+
slack_user.workspaces = user_workspaces
|
113
|
+
slack_user.status = StatusConnection.COMPLETE
|
114
|
+
|
115
|
+
slack_users_dict = [user.to_dic() for user in current_user.slack_users]
|
116
|
+
UserMongoRepository().set(current_user.id, slack_users=slack_users_dict)
|
117
|
+
|
118
|
+
except:
|
119
|
+
slack_user.status = StatusConnection.FAILED
|
120
|
+
UserMongoRepository().set(current_user.id, slack_users=[user.to_dic() for user in current_user.slack_users])
|
83
121
|
return
|
84
122
|
|
85
|
-
log.info(f'{slack_user.email}: got workspaces data {workspaces_response.json()}')
|
86
|
-
user_workspaces = next((user for user in workspaces_response.json()['current_teams']
|
87
|
-
if user['email'] == data.slack_email), {}).get('teams', [])
|
88
|
-
user_workspaces = [UserWorkspace.from_dic(ws) for ws in user_workspaces]
|
89
|
-
user_workspaces = sorted(user_workspaces, key=lambda ws: ws.domain)
|
90
|
-
|
91
|
-
session = requests.Session()
|
92
|
-
session.cookies = code_confirmed_response.cookies
|
93
|
-
session.headers.update({'User-Agent': data.user_agent})
|
94
|
-
log.info(f'{slack_user.email}: started getting of tokens for {len(user_workspaces)} workspaces')
|
95
|
-
for workspace in user_workspaces:
|
96
|
-
if not workspace.magic_login_code:
|
97
|
-
continue
|
98
|
-
login_url = f"https://app.slack.com/t/{workspace.domain}/login/{workspace.magic_login_code}"
|
99
|
-
magic_response = session.post(login_url, cookies=session.cookies, headers=session.headers)
|
100
|
-
content = magic_response.content.decode('utf-8')
|
101
|
-
start_token_index = content.find("xox")
|
102
|
-
sliced_content = content[start_token_index:]
|
103
|
-
end_token_index = sliced_content.find('"')
|
104
|
-
token = sliced_content[:end_token_index]
|
105
|
-
workspace.magic_login_url = login_url
|
106
|
-
workspace.token = token
|
107
|
-
workspace.domain = workspace.domain
|
108
|
-
time.sleep(random.uniform(0.2, 0.5))
|
109
|
-
|
110
|
-
slack_user.cookies = session.cookies.get_dict()
|
111
|
-
slack_user.workspaces = user_workspaces
|
112
|
-
slack_user.status = StatusConnection.COMPLETE
|
113
|
-
|
114
|
-
slack_users_dict = [user.to_dic() for user in current_user.slack_users]
|
115
|
-
UserMongoRepository().set(current_user.id, slack_users=slack_users_dict)
|
116
|
-
|
117
123
|
dedicated_bots_repository = DedicatedBotRepository()
|
118
124
|
dedicated_bots = dedicated_bots_repository.get_all(user_id=current_user.id, user_name=data.slack_email,
|
119
125
|
source_type=SourceType.SLACK, include_deleted=True)
|
@@ -141,4 +147,4 @@ class ConnectSlackAccountJob(BaseBackgroundJob, ABC):
|
|
141
147
|
dedicated_bot.invalid_creds = True
|
142
148
|
for server in dedicated_bot.servers:
|
143
149
|
server.deleted = True
|
144
|
-
dedicated_bots_repository.add_or_update(dedicated_bot)
|
150
|
+
dedicated_bots_repository.add_or_update(dedicated_bot)
|
@@ -54,7 +54,6 @@ class Notification(DictionaryModel):
|
|
54
54
|
class IncomingMessageNotification(Notification):
|
55
55
|
|
56
56
|
other_leads_text = ' and other leads.'
|
57
|
-
|
58
57
|
name_html_item = '''
|
59
58
|
<div style="display: inline-block; padding-left: 2px" class="lead_names">
|
60
59
|
<img alt="Lead Photo" src="$$USER_IMAGE$$" width="24" height="24"
|
@@ -177,94 +176,33 @@ class IncomingMessageNotification(Notification):
|
|
177
176
|
|
178
177
|
|
179
178
|
class InboxNotification(Notification):
|
180
|
-
name_html_item = '''
|
181
|
-
<div style="display: inline-block; padding-left: 2px" class="lead_names">
|
182
|
-
<img alt="Lead Photo" src="$$USER_IMAGE$$" width="24" height="24"
|
183
|
-
style="background-color: #FFFFFE !important; display: inline-block; vertical-align: top; width: 24px;
|
184
|
-
max-width: 24px; min-width: 24px; font-family: 'Outfit', Helvetica, Arial, sans-serif; color: #FFFFFE;
|
185
|
-
border-radius: 50% !important; font-size: 16px;" border="0">
|
186
|
-
<span style="font-weight: 600;">$$USER_NAME$$</span>
|
187
|
-
</div>
|
188
|
-
'''
|
189
|
-
new_request_html_item = '''
|
190
|
-
<tr>
|
191
|
-
<td bgcolor="#FFFFFE" align="left" style="padding-top: 16px;"
|
192
|
-
class="pr-bg-dark pr-text-dark">
|
193
|
-
<table role="presentation" width="100%" border="0" cellspacing="0" cellpadding="0">
|
194
|
-
<tr>
|
195
|
-
<td bgcolor="#FFFFFE" align="left"
|
196
|
-
class="pr-bg-dark pr-text-dark"
|
197
|
-
style="font-family: 'Outfit', Helvetica, Arial, sans-serif; font-size: 14px; font-weight: 400; line-height: 20px;">
|
198
|
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0"
|
199
|
-
style="border-collapse: separate !important;">
|
200
|
-
<tr>
|
201
|
-
<td align="center" bgcolor="#FFFFFE" style="border-radius: 50% !important;">
|
202
|
-
<img alt="Lead Photo" src="$$USER_IMAGE$$" width="24"
|
203
|
-
height="24"
|
204
|
-
style="display: inline-block; vertical-align: middle; width: 24px; max-width: 24px; min-width: 24px; font-family: 'Outfit', Helvetica, Arial, sans-serif; color: #FFFFFE; border-radius: 50% !important; font-size: 16px;"
|
205
|
-
border="0">
|
206
|
-
</td>
|
207
|
-
<td align="center"
|
208
|
-
class="pr-text-dark"
|
209
|
-
style="white-space: nowrap; font-family: 'Outfit', Helvetica, Arial, sans-serif; font-size: 14px; font-weight: 600; line-height: 20px; padding-left: 4px">
|
210
|
-
$$USER_NAME$$
|
211
|
-
</td>
|
212
|
-
</tr>
|
213
|
-
</table>
|
214
|
-
</td>
|
215
|
-
</tr>
|
216
179
|
|
217
|
-
<tr>
|
218
|
-
<td align="left" style="padding-top: 8px">
|
219
|
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0"
|
220
|
-
style="border-collapse: separate !important;">
|
221
|
-
<tr>
|
222
|
-
<td align="left" bgcolor="#F6F6F8"
|
223
|
-
class="sec-bg-dark pr-text-dark"
|
224
|
-
style="color: #262730; font-family: 'Outfit', Helvetica, Arial, sans-serif; font-size: 14px; font-weight: 400; line-height: 20px; padding: 12px; border-radius: 0 12px 12px 12px !important; background-color: #F6F6F8">
|
225
|
-
$$REQUEST_TEXT$$
|
226
|
-
</td>
|
227
|
-
</tr>
|
228
|
-
</table>
|
229
|
-
</td>
|
230
|
-
</tr>
|
231
|
-
</table>
|
232
|
-
</td>
|
233
|
-
</tr>
|
234
|
-
'''
|
235
180
|
@staticmethod
|
236
|
-
def get_button_name(
|
237
|
-
return 'View message
|
181
|
+
def get_button_name():
|
182
|
+
return 'View message request'
|
238
183
|
|
239
184
|
@staticmethod
|
240
|
-
def
|
185
|
+
def get_button_url():
|
241
186
|
return f'{portal_url}/feed?requests=true'
|
242
187
|
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
name = request['user']['real_name']
|
262
|
-
photo = request['user'].get('images', {}).get('image_72', '{{ IMAGE_PERSON.src }}')
|
263
|
-
item = self.new_request_html_item.replace('$$USER_NAME$$', name)
|
264
|
-
item = item.replace('$$USER_IMAGE$$', photo)
|
265
|
-
item = item.replace('$$REQUEST_TEXT$$', request['text'])
|
266
|
-
new_requests += item
|
267
|
-
return new_requests
|
188
|
+
def get_subject_text(self, users: list) -> str:
|
189
|
+
if self.type == NotificationType.INSTANTLY:
|
190
|
+
return 'New message request on Leadguru'
|
191
|
+
elif len(users) > 1:
|
192
|
+
return 'Message requests on Leadguru'
|
193
|
+
return 'Message request on Leadguru'
|
194
|
+
|
195
|
+
def get_notification_text(self, users: list):
|
196
|
+
if self.type == NotificationType.INSTANTLY:
|
197
|
+
return f'{users[0]} has just sent you message request.'
|
198
|
+
elif (self.type == NotificationType.ONCE_A_DAY or self.type == NotificationType.ONCE_A_WEEK) and users:
|
199
|
+
match len(users):
|
200
|
+
case 1:
|
201
|
+
return f'You have unread message request from {users[0]}.'
|
202
|
+
case 2 | 3:
|
203
|
+
return f'You have unread message request from {", ".join(users)}.'
|
204
|
+
case _:
|
205
|
+
return f'You have unread message requests from {", ".join(users[:3])} and other leads.'
|
268
206
|
|
269
207
|
|
270
208
|
class SourceDeactivationNotification(Notification):
|
@@ -31,7 +31,7 @@ from lgt_jobs.lgt_data.models.user.verification import UserVerificationModel
|
|
31
31
|
from lgt_jobs.lgt_data.models.user_leads.extended_user_lead import ExtendedUserLeadModel
|
32
32
|
from lgt_jobs.lgt_data.models.user_leads.user_lead import UserLeadModel
|
33
33
|
|
34
|
-
client = MongoClient(os.environ.get('MONGO_CONNECTION_STRING', 'mongodb://127.0.0.1:
|
34
|
+
client = MongoClient(os.environ.get('MONGO_CONNECTION_STRING', 'mongodb://127.0.0.1:27017/'))
|
35
35
|
|
36
36
|
|
37
37
|
def to_object_id(oid):
|
@@ -1418,17 +1418,10 @@ class MessageRequestsRepository(BaseMongoRepository):
|
|
1418
1418
|
self.collection().update_one({'user_id': to_object_id(user_id), 'sender_id': sender_id},
|
1419
1419
|
{'$set': message_request.to_dic()}, upsert=True)
|
1420
1420
|
|
1421
|
-
def get_many(self, user_id: str, viewed: bool = False,
|
1422
|
-
match_pipeline = {'user_id': to_object_id(user_id), 'viewed': viewed}
|
1423
|
-
from_date = kwargs.get('from_date')
|
1424
|
-
|
1425
|
-
if from_date:
|
1426
|
-
start = datetime(from_date.year, from_date.month, from_date.day, tzinfo=tz.tzutc())
|
1427
|
-
match_pipeline['created_at']['$gte'] = start
|
1428
|
-
|
1421
|
+
def get_many(self, user_id: str, viewed: bool = False, sort_direction: int = pymongo.ASCENDING):
|
1429
1422
|
pipeline = [
|
1430
1423
|
{
|
1431
|
-
'$match':
|
1424
|
+
'$match': {'user_id': to_object_id(user_id), 'viewed': viewed}
|
1432
1425
|
},
|
1433
1426
|
{
|
1434
1427
|
'$lookup': {
|
@@ -1439,18 +1432,10 @@ class MessageRequestsRepository(BaseMongoRepository):
|
|
1439
1432
|
}
|
1440
1433
|
},
|
1441
1434
|
{
|
1442
|
-
'$
|
1443
|
-
'from': 'dedicated_bots',
|
1444
|
-
'localField': 'bot_id',
|
1445
|
-
'foreignField': '_id',
|
1446
|
-
'as': 'bot'
|
1447
|
-
}
|
1448
|
-
},
|
1449
|
-
{
|
1450
|
-
'$addFields': {'user': {'$first': '$user'}, 'bot': {'$first': '$bot'}}
|
1435
|
+
'$addFields': {'user': {'$first': '$user'}}
|
1451
1436
|
},
|
1452
1437
|
{
|
1453
|
-
'$sort': {'created_at':
|
1438
|
+
'$sort': {'created_at': sort_direction}
|
1454
1439
|
}
|
1455
1440
|
]
|
1456
1441
|
return self.collection().aggregate(pipeline)
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/discord_client/__init__.py
RENAMED
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/discord_client/discord_client.py
RENAMED
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/discord_client/methods.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/slack_client/__init__.py
RENAMED
File without changes
|
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/slack_client/slack_client.py
RENAMED
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/slack_client/web_client.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/bots/dedicated_bot.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/chat/grouped_messages.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/chat/scheduled_message.py
RENAMED
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/contacts/__init__.py
RENAMED
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/contacts/contact.py
RENAMED
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/__init__.py
RENAMED
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/cloud/__init__.py
RENAMED
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/cloud/file.py
RENAMED
File without changes
|
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/discord/user.py
RENAMED
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/slack/__init__.py
RENAMED
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/slack/timezone.py
RENAMED
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/slack/user.py
RENAMED
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/user_workspace.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/leads/extended_lead.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/notifications/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/templates/__init__.py
RENAMED
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/templates/template.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/general_settings.py
RENAMED
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/reset_password.py
RENAMED
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/subscription.py
RENAMED
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/typed_field.py
RENAMED
File without changes
|
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/user_follow_ups.py
RENAMED
File without changes
|
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/verification.py
RENAMED
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user_leads/__init__.py
RENAMED
File without changes
|
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user_leads/user_lead.py
RENAMED
File without changes
|
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/repositories/post/__init__.py
RENAMED
File without changes
|
{leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/repositories/post/posts.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|