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.
Files changed (121) hide show
  1. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/PKG-INFO +1 -1
  2. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/leadguru_jobs.egg-info/PKG-INFO +1 -1
  3. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/workspace_connect.py +73 -67
  4. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/notifications/notification.py +21 -83
  5. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/mongo_repository.py +5 -20
  6. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/MANIFEST.in +0 -0
  7. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/README.md +0 -0
  8. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/leadguru_jobs.egg-info/SOURCES.txt +0 -0
  9. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/leadguru_jobs.egg-info/dependency_links.txt +0 -0
  10. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/leadguru_jobs.egg-info/not-zip-safe +0 -0
  11. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/leadguru_jobs.egg-info/requires.txt +0 -0
  12. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/leadguru_jobs.egg-info/top_level.txt +0 -0
  13. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/__init__.py +0 -0
  14. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/assets/images/arrow.png +0 -0
  15. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/assets/images/arrow_blue.png +0 -0
  16. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/assets/images/firework.png +0 -0
  17. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/assets/images/lock.png +0 -0
  18. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/assets/images/logo.png +0 -0
  19. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/assets/images/mail.png +0 -0
  20. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/basejobs.py +0 -0
  21. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/env.py +0 -0
  22. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/__init__.py +0 -0
  23. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/analytics.py +0 -0
  24. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/bot_stats_update.py +0 -0
  25. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/bots_killer.py +0 -0
  26. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/chat_history.py +0 -0
  27. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/connect_sources.py +0 -0
  28. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/inbox_leads.py +0 -0
  29. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/load_slack_people.py +0 -0
  30. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/load_slack_users.py +0 -0
  31. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/mass_message.py +0 -0
  32. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/send_code.py +0 -0
  33. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/send_slack_message.py +0 -0
  34. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/jobs/update_slack_profile.py +0 -0
  35. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/__init__.py +0 -0
  36. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/discord_client/__init__.py +0 -0
  37. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/discord_client/discord_client.py +0 -0
  38. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/discord_client/methods.py +0 -0
  39. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/enums/__init__.py +0 -0
  40. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/enums/slack_errors.py +0 -0
  41. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/helpers.py +0 -0
  42. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/pubsub/__init__.py +0 -0
  43. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/pubsub/messages.py +0 -0
  44. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/pubsub/pubsubfactory.py +0 -0
  45. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/slack_client/__init__.py +0 -0
  46. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/slack_client/methods.py +0 -0
  47. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/slack_client/slack_client.py +0 -0
  48. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_common/slack_client/web_client.py +0 -0
  49. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/__init__.py +0 -0
  50. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/analytics.py +0 -0
  51. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/engine.py +0 -0
  52. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/enums.py +0 -0
  53. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/helpers.py +0 -0
  54. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/model.py +0 -0
  55. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/__init__.py +0 -0
  56. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/base.py +0 -0
  57. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/boards/__init__.py +0 -0
  58. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/boards/board.py +0 -0
  59. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/boards/status.py +0 -0
  60. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/bots/__init__.py +0 -0
  61. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/bots/base_bot.py +0 -0
  62. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/bots/bot_info.py +0 -0
  63. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/bots/dedicated_bot.py +0 -0
  64. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/chat/__init__.py +0 -0
  65. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/chat/file.py +0 -0
  66. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/chat/grouped_messages.py +0 -0
  67. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/chat/message.py +0 -0
  68. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/chat/request.py +0 -0
  69. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/chat/scheduled_message.py +0 -0
  70. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/contacts/__init__.py +0 -0
  71. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/contacts/contact.py +0 -0
  72. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/__init__.py +0 -0
  73. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/cloud/__init__.py +0 -0
  74. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/cloud/file.py +0 -0
  75. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/discord/__init__.py +0 -0
  76. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/discord/user.py +0 -0
  77. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/slack/__init__.py +0 -0
  78. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/slack/timezone.py +0 -0
  79. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/slack/user.py +0 -0
  80. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/external/user_workspace.py +0 -0
  81. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/leads/__init__.py +0 -0
  82. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/leads/config.py +0 -0
  83. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/leads/extended_lead.py +0 -0
  84. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/leads/lead.py +0 -0
  85. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/leads/message.py +0 -0
  86. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/notifications/__init__.py +0 -0
  87. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/notifications/notification_settings.py +0 -0
  88. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/people/__init__.py +0 -0
  89. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/people/people.py +0 -0
  90. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/people/profile.py +0 -0
  91. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/post/__init__.py +0 -0
  92. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/post/message.py +0 -0
  93. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/post/post.py +0 -0
  94. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/templates/__init__.py +0 -0
  95. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/templates/template.py +0 -0
  96. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/__init__.py +0 -0
  97. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/feature.py +0 -0
  98. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/general_settings.py +0 -0
  99. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/reset_password.py +0 -0
  100. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/subscription.py +0 -0
  101. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/typed_field.py +0 -0
  102. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/user.py +0 -0
  103. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/user_follow_ups.py +0 -0
  104. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/user_page.py +0 -0
  105. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user/verification.py +0 -0
  106. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user_leads/__init__.py +0 -0
  107. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user_leads/extended_user_lead.py +0 -0
  108. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/models/user_leads/user_lead.py +0 -0
  109. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/repositories/__init__.py +0 -0
  110. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/repositories/post/__init__.py +0 -0
  111. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/lgt_data/repositories/post/posts.py +0 -0
  112. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/main.py +0 -0
  113. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/runner.py +0 -0
  114. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/services/__init__.py +0 -0
  115. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/services/k8_manager.py +0 -0
  116. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/services/web_client.py +0 -0
  117. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/simple_job.py +0 -0
  118. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/smtp.py +0 -0
  119. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/lgt_jobs/templates/new_message.html +0 -0
  120. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/setup.cfg +0 -0
  121. {leadguru_jobs-0.706.0 → leadguru_jobs-0.707.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: leadguru_jobs
3
- Version: 0.706.0
3
+ Version: 0.707.0
4
4
  Summary: LGT jobs builds
5
5
  Author-email: developer@leadguru.co
6
6
  Classifier: Development Status :: 5 - Production/Stable
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: leadguru_jobs
3
- Version: 0.706.0
3
+ Version: 0.707.0
4
4
  Summary: LGT jobs builds
5
5
  Author-email: developer@leadguru.co
6
6
  Classifier: Development Status :: 5 - Production/Stable
@@ -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
- client = SlackWebClient('')
46
- code_confirmed_response = client.confirm_code(data.slack_email, data.code, data.user_agent)
47
- if code_confirmed_response.status_code != 200:
48
- log.warning(f'Unable to confirm code due to error: {code_confirmed_response.content}')
49
- slack_user.status = StatusConnection.FAILED
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
- log.warning(f'Attempt: {attempt}. Unable to get workspaces due to error: {workspaces_response.content}')
69
- attempt += 1
70
- time.sleep(60)
71
- if not workspaces_response.json().get('ok', False):
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
- log.warning(f'Attempt: {attempt}. Unable to get workspaces due to error: {workspaces_response.json()}')
74
- attempt += 1
75
- time.sleep(60)
76
- else:
77
- slack_user.status = StatusConnection.IN_PROGRESS
78
- break
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
- UserMongoRepository().set(current_user.id, slack_users=[user.to_dic() for user in current_user.slack_users])
81
+ UserMongoRepository().set(current_user.id, slack_users=[user.to_dic() for user in current_user.slack_users])
81
82
 
82
- if attempt > 5:
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(users: list):
237
- return 'View message requests' if len(users) > 1 else 'View message request'
181
+ def get_button_name():
182
+ return 'View message request'
238
183
 
239
184
  @staticmethod
240
- def get_chat_url():
185
+ def get_button_url():
241
186
  return f'{portal_url}/feed?requests=true'
242
187
 
243
- @staticmethod
244
- def get_subject_text(users: list) -> str:
245
- return 'New message requests on Leadguru' if len(users) > 1 else'New message request on Leadguru'
246
-
247
- def create_title(self, user_ids: list[str], users: list):
248
- title = ""
249
- for user_id in user_ids[:3]:
250
- user = [user for user in users if user_id == user['sender_id']][0]
251
- photo = user.get('images', {}).get('image_72', '{{ IMAGE_PERSON.src }}')
252
- item = self.name_html_item.replace('$$USER_NAME$$', user['real_name'])
253
- item = item.replace('$$USER_IMAGE$$', photo)
254
- title += item
255
-
256
- return f"New message requests from {title}" if len(users) > 1 else f"New message request from {title}"
257
-
258
- def create_new_requests_list(self, requests: list):
259
- new_requests = ""
260
- for request in requests[:3]:
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:27018/'))
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, **kwargs):
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': match_pipeline
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
- '$lookup': {
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': 1}
1438
+ '$sort': {'created_at': sort_direction}
1454
1439
  }
1455
1440
  ]
1456
1441
  return self.collection().aggregate(pipeline)