leadguru-jobs 0.276.0__py3-none-any.whl → 0.278.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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: leadguru-jobs
3
- Version: 0.276.0
3
+ Version: 0.278.0
4
4
  Summary: LGT jobs builds
5
5
  Author-email: developer@leadguru.co
6
6
  Classifier: Development Status :: 5 - Production/Stable
@@ -20,8 +20,8 @@ Classifier: Topic :: Internet
20
20
  Requires-Dist: loguru
21
21
  Requires-Dist: pydantic
22
22
  Requires-Dist: cachetools >=3.1.0
23
- Requires-Dist: leadguru-common ==0.317.0
24
- Requires-Dist: leadguru-data ==0.324.0
23
+ Requires-Dist: leadguru-common ==0.320.0
24
+ Requires-Dist: leadguru-data ==0.327.0
25
25
  Requires-Dist: wheel
26
26
  Requires-Dist: setuptools
27
27
  Requires-Dist: twine
@@ -0,0 +1,30 @@
1
+ lgt_jobs/__init__.py,sha256=JHgkIlH-HvoLcmaYZfzGC1-OuoA0sEYlPm1ugrOxGYg,3009
2
+ lgt_jobs/basejobs.py,sha256=LPEclvY6fIG17YMGy9pRK0Q58n62gkI5W1BTK6R2p-c,1234
3
+ lgt_jobs/env.py,sha256=M4nlt7SpwEYptNCopc6c3V0hpsHKc9bO60FnlGc7rTE,712
4
+ lgt_jobs/main.py,sha256=g9cIpahGFXZZv6fsftbjrOhQMrrD04kxKOuPpxKk3rk,1545
5
+ lgt_jobs/runner.py,sha256=mWyJTOjEN81Lx0M8jxtZray9vcB5PAWltPjYL2uqIXY,2210
6
+ lgt_jobs/simple_job.py,sha256=sta7MP-57iwRewPycmTAc9dvSbocbGjWhb1QYYj7ccA,519
7
+ lgt_jobs/smtp.py,sha256=W9OIkckBORAWEsNgIG3nVKs6OTU6esZNnq09WDsj8Lc,1352
8
+ lgt_jobs/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ lgt_jobs/jobs/analytics.py,sha256=bNQpYBPz6CMN0i-wXDzQKcc1L8UYUvyiVGJbUeGdf9Q,1307
10
+ lgt_jobs/jobs/archive_leads.py,sha256=wZ4LwbuC9G7NB16AO15YiMemEV40LoJVjd8VRqaFv9o,831
11
+ lgt_jobs/jobs/bot_stats_update.py,sha256=b3a0Gykk6AiGSNIj9YlOifxDY3I8KrJH0AtZeEdcxx0,3449
12
+ lgt_jobs/jobs/chat_history.py,sha256=CjV_oGk0WYlTFpCDwGdPs91XQfUUdCf5J-qIG7G7kBQ,6131
13
+ lgt_jobs/jobs/clear_user_analytics.py,sha256=sP90jhOcZqs67hJV-lJyFJH9Iciqai8IsbNs5fSc90U,2478
14
+ lgt_jobs/jobs/conversation_replied.py,sha256=nFEK8afPZ4cnxlU2yxXUAAQW8DiHJ7Du434gPrmQy-4,2870
15
+ lgt_jobs/jobs/inbox_leads.py,sha256=6XVFgxVjRl_pOLA8yQ_MDwBillo7ZdDJgW6Ca4NVjqg,4439
16
+ lgt_jobs/jobs/mass_message.py,sha256=guXQjAL78fc6V0qWZr6nVB-vOGaMDs_NU4yq3iCyAjE,2033
17
+ lgt_jobs/jobs/reactions_added.py,sha256=GTSJRZr1fXHLc5-WyFi0wyhuyRKpqhZRtGCar3ZsUos,2465
18
+ lgt_jobs/jobs/reindex_conversation_history.py,sha256=5kAblOERu3VdqrcV43hBgyBC4iiqVrIP3GQrugv9Mjg,1062
19
+ lgt_jobs/jobs/send_code.py,sha256=pLzKJhaTvWYPtvOjH02xpZ-h4dMk5hmkcnc5AS8hc9Q,827
20
+ lgt_jobs/jobs/send_slack_message.py,sha256=7x3lnHWmTmltRy2LbIKpxgI7sBYMRHndlUEKBnhBjJU,2899
21
+ lgt_jobs/jobs/update_slack_profile.py,sha256=z0uuUXjC1etkS0Yu4k_q66TUJURgUKn1pIQ_pD7A1A8,1692
22
+ lgt_jobs/jobs/user_balance_update.py,sha256=7pq0ZWWfi8c2F9CX0IrrZ4yHNCTr8_vYY2cnWzZpi3s,2318
23
+ lgt_jobs/jobs/workspace_connect.py,sha256=iIoJxF4z7rMbjbRQuw46NPp5ihatTEUEn1Ki0mYtF1M,6631
24
+ lgt_jobs/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
+ lgt_jobs/services/web_client.py,sha256=SZogxjM0jyACRqBOP5EJvtqwe44og8B5B6TMWLpYmKM,1878
26
+ lgt_jobs/templates/new_message_mail_template.html,sha256=82XdDPtmkJVUWUcZtgd8bv_9-viAG2WWOnf3AhR6PeY,3635
27
+ leadguru_jobs-0.278.0.dist-info/METADATA,sha256=g58KfNYmjskIWwGChAJ-UEY_4idQ86x1aeMq8AgAIKc,1181
28
+ leadguru_jobs-0.278.0.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
29
+ leadguru_jobs-0.278.0.dist-info/top_level.txt,sha256=rIuw1DqwbnZyeoarBSC-bYeGOhv9mZBs7_afl9q4_JI,9
30
+ leadguru_jobs-0.278.0.dist-info/RECORD,,
lgt_jobs/__init__.py CHANGED
@@ -4,7 +4,6 @@ from .jobs.user_balance_update import UpdateUserBalanceJob, UpdateUserBalanceJob
4
4
  from .jobs.conversation_replied import ConversationRepliedJob, ConversationRepliedJobData
5
5
  from .jobs.reactions_added import ReactionAddedJobData, ReactionAddedJob
6
6
  from .jobs.send_slack_message import SendSlackMessageJob, SendSlackMessageJobData
7
- from .jobs.user_limits_update import UpdateUserDataUsageJob, UpdateUserDataUsageJobData
8
7
  from .jobs.analytics import (TrackAnalyticsJob, TrackAnalyticsJobData)
9
8
  from .jobs.archive_leads import (ArchiveLeadsJob, ArchiveLeadsJobData)
10
9
  from .jobs.bot_stats_update import (BotStatsUpdateJob, BotStatsUpdateJobData)
@@ -27,7 +26,6 @@ jobs_map = {
27
26
  "TrackAnalyticsJob": TrackAnalyticsJob,
28
27
  "LoadChatHistoryJob": LoadChatHistoryJob,
29
28
  "UpdateUserSlackProfileJob": UpdateUserSlackProfileJob,
30
- "UpdateUserDataUsageJob": UpdateUserDataUsageJob,
31
29
  "ConversationRepliedJob": ConversationRepliedJob,
32
30
  "ReactionAddedJob": ReactionAddedJob,
33
31
  "SendSlackMessageJob": SendSlackMessageJob,
@@ -46,7 +44,6 @@ __all__ = [
46
44
  LoadChatHistoryJob,
47
45
  UpdateUserSlackProfileJob,
48
46
  TrackAnalyticsJob,
49
- UpdateUserDataUsageJob,
50
47
  ConversationRepliedJob,
51
48
  ReactionAddedJob,
52
49
  SendSlackMessageJob,
@@ -67,7 +64,6 @@ __all__ = [
67
64
  LoadChatHistoryJobData,
68
65
  UpdateUserSlackProfileJobData,
69
66
  TrackAnalyticsJobData,
70
- UpdateUserDataUsageJobData,
71
67
  ConversationRepliedJobData,
72
68
  ReactionAddedJobData,
73
69
  SendSlackMessageJobData,
@@ -15,8 +15,7 @@ Update bots statistics
15
15
 
16
16
 
17
17
  class BotStatsUpdateJobData(BaseBackgroundJobData, BaseModel):
18
- dedicated_bot_id: Optional[str]
19
- bot_name: Optional[str]
18
+ bot_id: Optional[str]
20
19
 
21
20
 
22
21
  class BotStatsUpdateJob(BaseBackgroundJob, ABC):
@@ -25,12 +24,13 @@ class BotStatsUpdateJob(BaseBackgroundJob, ABC):
25
24
  return BotStatsUpdateJobData
26
25
 
27
26
  def exec(self, data: BotStatsUpdateJobData):
28
- if data.dedicated_bot_id:
29
- bots_rep = DedicatedBotRepository()
30
- bot = bots_rep.get_by_id(data.dedicated_bot_id)
31
- else:
27
+ bots_rep = DedicatedBotRepository()
28
+ bot = bots_rep.get_by_id(data.bot_id)
29
+ if not bot:
32
30
  bots_rep = BotMongoRepository()
33
- bot = bots_rep.get_by_id(data.bot_name)
31
+ bot = bots_rep.get_by_object_id(data.bot_id)
32
+ if not bot:
33
+ return
34
34
 
35
35
  if not bot.token or not bot.cookies:
36
36
  log.warning(f"[BotStatsUpdateJob]: Bot {bot.id} has no credentials.")
@@ -69,8 +69,8 @@ class LoadChatHistoryJob(BaseBackgroundJob, ABC):
69
69
  lead.last_action_at = last_message.created_at
70
70
  UserLeadMongoRepository().update_lead(lead.user_id, lead.id, last_action_at=last_message.created_at)
71
71
 
72
- has_to_be_notified = not user.new_message_notified_at \
73
- or (last_message and last_message.created_at > user.new_message_notified_at)
72
+ has_to_be_notified = (not user.new_message_notified_at or
73
+ (last_message and last_message.created_at > user.new_message_notified_at))
74
74
 
75
75
  if last_message and has_to_be_notified and last_message.user == last_message_lead.message.sender_id:
76
76
  LoadChatHistoryJob._notify_about_new_messages(user, last_message_lead, data.template_path)
@@ -92,7 +92,7 @@ class LoadChatHistoryJob(BaseBackgroundJob, ABC):
92
92
  def _update_history(user: UserModel, lead: UserLeadModel) -> Optional[SlackHistoryMessageModel]:
93
93
  saved_chat_history = lead.chat_history if lead.chat_history else list()
94
94
 
95
- bot = DedicatedBotRepository().get_by_user_and_name(user.id, lead.message.name)
95
+ bot = DedicatedBotRepository().get_by_user_and_source_id(user.id, lead.message.source.source_id)
96
96
  if not bot or bot.invalid_creds:
97
97
  return None
98
98
 
@@ -28,9 +28,9 @@ class ConversationRepliedJob(BaseBackgroundJob, ABC):
28
28
  if not lead:
29
29
  return
30
30
 
31
- bot = DedicatedBotRepository().get_one(only_valid=True, name=lead.message.name)
32
- if not bot:
33
- log.warning(f"Lead: {lead.id}, no bot to load replies")
31
+ bot = DedicatedBotRepository().get_one(only_valid=True, source_id=lead.message.source.source_id)
32
+ if not bot or bot.invalid_creds:
33
+ log.warning(f"Lead: {lead.id}, no bot with valid creds to load replies")
34
34
  return
35
35
 
36
36
  client = SlackClient(bot.token, bot.cookies)
@@ -49,8 +49,12 @@ class ConversationRepliedJob(BaseBackgroundJob, ABC):
49
49
  reply.username = user_response.get("user").get("real_name")
50
50
  if not reply.attachments and lead.message.urls_in_message:
51
51
  for attachment in lead.message.urls_in_message:
52
- reply.attachments.append(client.get_attachments(
53
- lead.message.channel_id, lead.message.message_id, attachment))
52
+ if attachment:
53
+ attachments = client.get_attachments(lead.message.channel_id,
54
+ lead.message.message_id,
55
+ attachment)
56
+ if attachments:
57
+ reply.attachments.append(attachments)
54
58
  replies.append(reply.to_dic())
55
59
 
56
60
  set_dict = {
@@ -62,4 +66,4 @@ class ConversationRepliedJob(BaseBackgroundJob, ABC):
62
66
  LeadMongoRepository().collection().update_many(pipeline, {"$set": set_dict})
63
67
  UserLeadMongoRepository().collection().update_many(pipeline, {"$set": set_dict})
64
68
  GarbageLeadsMongoRepository().collection().update_many(pipeline, {"$set": set_dict})
65
- SpamLeadsMongoRepository().collection().update_many(pipeline, {"$set": set_dict})
69
+ SpamLeadsMongoRepository().collection().update_many(pipeline, {"$set": set_dict})
@@ -2,7 +2,7 @@ from abc import ABC
2
2
  from lgt.common.python.lgt_logging import log
3
3
  from lgt.common.python.slack_client.web_client import SlackWebClient
4
4
  from lgt_data.enums import DefaultBoards
5
- from lgt_data.model import UserModel, DedicatedBotModel, SlackMemberInformation, UserLeadModel, Source
5
+ from lgt_data.model import UserModel, DedicatedBotModel, SlackMemberInformation, UserLeadModel
6
6
  from lgt_data.mongo_repository import UserLeadMongoRepository, UserMongoRepository, DedicatedBotRepository, \
7
7
  SlackContactUserRepository, BoardsMongoRepository
8
8
  from pydantic import BaseModel
@@ -76,13 +76,10 @@ class InboxLeadsJob(BaseBackgroundJob, ABC):
76
76
 
77
77
  @staticmethod
78
78
  def create_people(slack_profile: dict, dedicated_bot: DedicatedBotModel):
79
- source = Source()
80
- source.source_id = dedicated_bot.workspace_id
81
- source.source_name = dedicated_bot.name
82
- source.source_type = dedicated_bot.type
83
79
  member_info: SlackMemberInformation = SlackMemberInformation.from_slack_response(slack_profile,
84
- dedicated_bot.name, source)
80
+ dedicated_bot.name,
81
+ dedicated_bot.source)
85
82
  SlackContactUserRepository().collection().update_one({"sender_id": member_info.sender_id,
86
- "source.source_id": dedicated_bot.workspace_id},
83
+ "source.source_id": dedicated_bot.source.source_id},
87
84
  {"$set": member_info.to_dic()}, upsert=True)
88
85
  return SlackContactUserRepository().find_one(member_info.sender_id)
@@ -1,9 +1,12 @@
1
1
  import time
2
+ from abc import ABC
2
3
  from random import randint
3
4
  from typing import Optional, Any
4
5
  from lgt.common.python.slack_client.web_client import SlackWebClient
5
6
  from lgt_data.mongo_repository import DedicatedBotRepository
6
7
  from loguru import logger as log
8
+ from pydantic import BaseModel
9
+
7
10
  from ..basejobs import BaseBackgroundJobData, BaseBackgroundJob
8
11
 
9
12
  """
@@ -11,7 +14,7 @@ Send Slack Code
11
14
  """
12
15
 
13
16
 
14
- class SendMassMessageSlackChannelJobData(BaseBackgroundJobData):
17
+ class SendMassMessageSlackChannelJobData(BaseBackgroundJobData, BaseModel):
15
18
  text: str
16
19
  channel_ids: list[str]
17
20
  user_id: str
@@ -19,7 +22,7 @@ class SendMassMessageSlackChannelJobData(BaseBackgroundJobData):
19
22
  source_id: str
20
23
 
21
24
 
22
- class SendMassMessageSlackChannelJob(BaseBackgroundJob):
25
+ class SendMassMessageSlackChannelJob(BaseBackgroundJob, ABC):
23
26
  @property
24
27
  def job_data_type(self) -> type:
25
28
  return SendMassMessageSlackChannelJobData
@@ -27,7 +30,8 @@ class SendMassMessageSlackChannelJob(BaseBackgroundJob):
27
30
  def exec(self, data: SendMassMessageSlackChannelJobData):
28
31
  bot = DedicatedBotRepository().get_by_user_and_source_id(data.user_id, data.source_id)
29
32
  if not bot or bot.invalid_creds:
30
- log.warning(f"Bot not found or not invalid creds, source id:{data.source_id}")
33
+ log.warning(f"[SendMassMessageSlackChannelJob]: "
34
+ f"Bot not found or has invalid creds, source id:{data.source_id}")
31
35
  return
32
36
 
33
37
  slack_client = SlackWebClient(bot.token, bot.cookies)
@@ -39,10 +43,12 @@ class SendMassMessageSlackChannelJob(BaseBackgroundJob):
39
43
  try:
40
44
  post_message_response = slack_client.post_message(to=channel, text=data.text)
41
45
  if not post_message_response['ok']:
42
- log.warning(f"Failed to post message. Attempt {attempts}, bot id {bot.id},"
46
+ log.warning(f"[SendMassMessageSlackChannelJob]: "
47
+ f"Failed to post message. Attempt {attempts}, bot id {bot.id},"
43
48
  f" channel id {channel}. Details {post_message_response}")
44
49
  attempts = 0
45
50
  break
46
51
  except:
47
- log.warning(f"Failed attempt to get clist of channels. Attempt {attempts}, bot id {bot.id}")
52
+ log.warning(f"[SendMassMessageSlackChannelJob]: "
53
+ f"Failed attempt to send message. Attempt {attempts}, bot id {bot.id}")
48
54
  time.sleep(randint(1, 3))
@@ -28,9 +28,9 @@ class ReactionAddedJob(BaseBackgroundJob, ABC):
28
28
  if not lead:
29
29
  return
30
30
 
31
- bot = DedicatedBotRepository().get_one(only_valid=True, name=lead.message.name)
32
- if not bot:
33
- log.warning(f"Lead: {lead.id}, no bot to load reactions")
31
+ bot = DedicatedBotRepository().get_one(only_valid=True, source_id=lead.message.source.source_id)
32
+ if not bot or bot.invalid_creds:
33
+ log.warning(f"Lead: {lead.id}, no bot with valid creds to load reactions")
34
34
  return
35
35
 
36
36
  client = SlackWebClient(bot.token, bot.cookies)
@@ -1,10 +1,8 @@
1
1
  from abc import ABC
2
2
  from typing import List
3
-
4
3
  from lgt_data.model import UserLeadModel
5
4
  from lgt_data.mongo_repository import UserLeadMongoRepository
6
5
  from pydantic import BaseModel
7
-
8
6
  from ..basejobs import BaseBackgroundJobData, BaseBackgroundJob
9
7
 
10
8
  """
@@ -1,6 +1,9 @@
1
+ from abc import ABC
1
2
  from typing import Optional
2
3
  from loguru import logger as log
3
4
  from lgt.common.python.slack_client.web_client import SlackWebClient
5
+ from pydantic import BaseModel
6
+
4
7
  from ..basejobs import BaseBackgroundJobData, BaseBackgroundJob
5
8
 
6
9
  """
@@ -8,13 +11,13 @@ Send Slack Code
8
11
  """
9
12
 
10
13
 
11
- class SendSlackEmailJobData(BaseBackgroundJobData):
14
+ class SendSlackEmailJobData(BaseBackgroundJobData, BaseModel):
12
15
  email: str
13
16
  user_agent: str
14
17
  locale: Optional[str]
15
18
 
16
19
 
17
- class SendSlackEmailJob(BaseBackgroundJob):
20
+ class SendSlackEmailJob(BaseBackgroundJob, ABC):
18
21
  @property
19
22
  def job_data_type(self) -> type:
20
23
  return SendSlackEmailJobData
@@ -1,10 +1,11 @@
1
1
  import datetime
2
+ from abc import ABC
2
3
  from typing import Optional
3
4
  from lgt.common.python.lgt_logging import log
4
- from lgt_data.mongo_repository import DedicatedBotRepository, UserContactsRepository
5
5
  from lgt.common.python.slack_client.web_client import SlackWebClient, SlackMessageConvertService
6
6
  from lgt_data.engine import LeadChat
7
- from lgt_data.mongo_repository import UserMongoRepository, UserLeadMongoRepository
7
+ from lgt_data.mongo_repository import (UserMongoRepository, UserLeadMongoRepository,
8
+ DedicatedBotRepository, UserContactsRepository)
8
9
  from pydantic import BaseModel
9
10
  from ..basejobs import BaseBackgroundJobData, BaseBackgroundJob
10
11
 
@@ -20,7 +21,7 @@ class SendSlackMessageJobData(BaseBackgroundJobData, BaseModel):
20
21
  files_ids: Optional[list]
21
22
 
22
23
 
23
- class SendSlackMessageJob(BaseBackgroundJob):
24
+ class SendSlackMessageJob(BaseBackgroundJob, ABC):
24
25
  @property
25
26
  def job_data_type(self) -> type:
26
27
  return SendSlackMessageJobData
@@ -32,7 +33,7 @@ class SendSlackMessageJob(BaseBackgroundJob):
32
33
  if not lead:
33
34
  return
34
35
 
35
- bot = DedicatedBotRepository().get_by_user_and_name(user.id, lead.message.name)
36
+ bot = DedicatedBotRepository().get_by_user_and_source_id(user.id, lead.message.source.source_id)
36
37
  if not bot or bot.invalid_creds:
37
38
  return
38
39
 
@@ -1,10 +1,10 @@
1
- from typing import List
1
+ from abc import ABC
2
+
2
3
  from lgt.common.python.lgt_logging import log
3
4
  from lgt.common.python.slack_client.slack_client import SlackClient
4
- from lgt_data.model import UserBotCredentialsModel, UserModel
5
- from lgt_data.mongo_repository import UserMongoRepository, UserBotCredentialsMongoRepository, DedicatedBotRepository
5
+ from lgt_data.model import UserModel
6
+ from lgt_data.mongo_repository import UserMongoRepository, DedicatedBotRepository
6
7
  from pydantic import BaseModel
7
- from ..runner import BackgroundJobRunner
8
8
  from ..basejobs import BaseBackgroundJobData, BaseBackgroundJob
9
9
 
10
10
  """
@@ -14,82 +14,39 @@ Update Slack User profile
14
14
 
15
15
  class UpdateUserSlackProfileJobData(BaseBackgroundJobData, BaseModel):
16
16
  user_id: str
17
- bot_name: str
18
17
 
19
18
 
20
- class UpdateUserSlackProfileJob(BaseBackgroundJob):
21
- @staticmethod
22
- def __update_profile(user: UserModel, slack: SlackClient) -> bool:
23
- try:
24
- profile_resp = slack.get_profile()
25
- except:
26
- log.warning(f"User: {user.email} Bot credentials are not valid")
27
- return False
28
-
29
- if not profile_resp["ok"]:
30
- return False
31
-
32
- # try to update user photo
33
- if user.photo_url:
34
- photo_resp = slack.update_profile_photo(user.photo_url)
35
- log.info(f"[PHOTO UPDATE] {photo_resp}")
36
-
37
- return True
19
+ class UpdateUserSlackProfileJob(BaseBackgroundJob, ABC):
38
20
 
39
21
  @property
40
22
  def job_data_type(self) -> type:
41
23
  return UpdateUserSlackProfileJobData
42
24
 
43
- @staticmethod
44
- def update_all_user_bots_command(data: UpdateUserSlackProfileJobData, bots: List[UserBotCredentialsModel]):
45
- for bot in bots:
46
- BackgroundJobRunner.submit(UpdateUserSlackProfileJob,
47
- UpdateUserSlackProfileJobData(user_id=data.user_id,
48
- bot_name=bot.bot_name))
49
-
50
- UpdateUserSlackProfileJob.update_dedicated_bot_profile(data)
51
-
52
- @staticmethod
53
- def update_dedicated_bot_profile(data: UpdateUserSlackProfileJobData):
25
+ def exec(self, data: UpdateUserSlackProfileJobData):
54
26
  user = UserMongoRepository().get(data.user_id)
55
27
  bots = DedicatedBotRepository().get_user_bots(data.user_id)
56
28
  for bot in bots:
57
29
  if bot.invalid_creds:
58
30
  log.warning(
59
- f'User: {user.email} dedicated bot: {bot.name} credentials are invalid. Not able to update user profile')
31
+ f'User: {user.email} dedicated bot: {bot.name} credentials are invalid. '
32
+ f'Not able to update user profile')
60
33
  continue
61
34
 
62
35
  slack = SlackClient(bot.token, bot.cookies)
63
36
  UpdateUserSlackProfileJob.__update_profile(user, slack)
64
37
 
65
38
  @staticmethod
66
- def update_single_user_bots_command(data: UpdateUserSlackProfileJobData, bots: List[UserBotCredentialsModel]):
67
- user = UserMongoRepository().get(data.user_id)
68
- for bot in bots:
69
- if bot.bot_name != data.bot_name:
70
- continue
71
-
72
- if bot.invalid_creds:
73
- log.warning(
74
- f'User: {user.email} bot: {bot.bot_name} credentials are invalid. Not able to update user profile')
75
- continue
76
-
77
- if not bot.user_name or not bot.password:
78
- log.warning(f"User: {user.email} Bot: {bot.bot_name} credentials are not SET")
79
- continue
80
-
81
- slack = SlackClient(bot.token, bot.cookies)
82
- result = UpdateUserSlackProfileJob.__update_profile(user, slack)
83
- if result:
84
- UserBotCredentialsMongoRepository().set(user_id=data.user_id, bot_name=data.bot_name,
85
- slack_profile=user.slack_profile.to_dic())
39
+ def __update_profile(user: UserModel, slack: SlackClient):
40
+ try:
41
+ profile_resp = slack.get_profile()
42
+ except:
43
+ log.warning(f"User: {user.email} Bot credentials are not valid")
44
+ return
86
45
 
87
- if user.slack_profile:
88
- log.info(slack.update_profile(user.slack_profile.to_dic()))
46
+ if not profile_resp["ok"]:
47
+ return
89
48
 
90
- def exec(self, data: UpdateUserSlackProfileJobData):
91
- bots = UserBotCredentialsMongoRepository().get_bot_credentials(data.user_id)
92
- if data.bot_name == '':
93
- UpdateUserSlackProfileJob.update_all_user_bots_command(data, bots)
94
- else:
95
- UpdateUserSlackProfileJob.update_single_user_bots_command(data, bots)
49
+ # try to update user photo
50
+ if user.photo_url:
51
+ photo_resp = slack.update_profile_photo(user.photo_url)
52
+ log.info(f"[PHOTO UPDATE] {photo_resp}")
@@ -1,12 +1,11 @@
1
1
  import datetime
2
+ from abc import ABC
2
3
  from typing import Optional
3
-
4
4
  from lgt_data.engine import UserCreditStatementDocument
5
5
  from lgt_data.enums import UserAccountState
6
6
  from lgt_data.model import UserModel
7
7
  from lgt_data.mongo_repository import UserMongoRepository, to_object_id
8
8
  from pydantic import BaseModel
9
-
10
9
  from ..basejobs import BaseBackgroundJobData, BaseBackgroundJob
11
10
 
12
11
  """
@@ -18,7 +17,7 @@ class UpdateUserBalanceJobData(BaseBackgroundJobData, BaseModel):
18
17
  user_id: Optional[str]
19
18
 
20
19
 
21
- class UpdateUserBalanceJob(BaseBackgroundJob):
20
+ class UpdateUserBalanceJob(BaseBackgroundJob, ABC):
22
21
  @property
23
22
  def job_data_type(self) -> type:
24
23
  return UpdateUserBalanceJobData
@@ -1,3 +1,4 @@
1
+ from abc import ABC
1
2
  from random import randint
2
3
  from time import sleep
3
4
  from typing import Dict
@@ -25,7 +26,7 @@ class ConnectSlackAccountJobData(BaseBackgroundJobData, BaseModel):
25
26
  user_agent: str
26
27
 
27
28
 
28
- class ConnectSlackAccountJob(BaseBackgroundJob):
29
+ class ConnectSlackAccountJob(BaseBackgroundJob, ABC):
29
30
  @property
30
31
  def job_data_type(self) -> type:
31
32
  return ConnectSlackAccountJobData
@@ -105,7 +106,6 @@ class ConnectSlackAccountJob(BaseBackgroundJob):
105
106
  log.info(f'Test token: {test_auth_response.json()}')
106
107
  break
107
108
  log.warning(f'{slack_user.email}: did not get token by url {login_url}. Attempt {counter + 1}')
108
- counter += 1
109
109
 
110
110
  slack_user.cookies = session.cookies.get_dict()
111
111
  slack_user.workspaces = user_workspaces
@@ -117,14 +117,13 @@ class ConnectSlackAccountJob(BaseBackgroundJob):
117
117
 
118
118
  dedicated_bots_repository = DedicatedBotRepository()
119
119
  dedicated_bots = dedicated_bots_repository.get_user_bots(current_user.id)
120
- user_workspaces_map: Dict[str, UserWorkspace] = {workspace.name: workspace
120
+ user_workspaces_map: Dict[str, UserWorkspace] = {workspace.id: workspace
121
121
  for workspace in user_workspaces if workspace.token}
122
- for name, workspace in user_workspaces_map.items():
123
- dedicated_bot = next(filter(lambda x: x.workspace_id == workspace.id
124
- and x.user_name == slack_user.email, dedicated_bots), None)
122
+ for workspace_id, workspace in user_workspaces_map.items():
123
+ dedicated_bot = next(filter(lambda x:
124
+ x.workspace_id == workspace_id and x.user_name == slack_user.email,
125
+ dedicated_bots), None)
125
126
  if dedicated_bot:
126
127
  dedicated_bot = update_credentials(dedicated_bot, workspace.token, slack_user.cookies)
127
128
  dedicated_bots_repository.add_or_update(dedicated_bot)
128
- BackgroundJobRunner.submit(BotStatsUpdateJob,
129
- BotStatsUpdateJobData(dedicated_bot_id=str(dedicated_bot.id),
130
- bot_name=None))
129
+ BackgroundJobRunner.submit(BotStatsUpdateJob, BotStatsUpdateJobData(bot_id=str(dedicated_bot.id)))
@@ -1,31 +0,0 @@
1
- lgt_jobs/__init__.py,sha256=-VK_Z6lanY__zvL3qgaHv_g8MG27Ow7XEdjtt17iM6A,3211
2
- lgt_jobs/basejobs.py,sha256=LPEclvY6fIG17YMGy9pRK0Q58n62gkI5W1BTK6R2p-c,1234
3
- lgt_jobs/env.py,sha256=M4nlt7SpwEYptNCopc6c3V0hpsHKc9bO60FnlGc7rTE,712
4
- lgt_jobs/main.py,sha256=g9cIpahGFXZZv6fsftbjrOhQMrrD04kxKOuPpxKk3rk,1545
5
- lgt_jobs/runner.py,sha256=mWyJTOjEN81Lx0M8jxtZray9vcB5PAWltPjYL2uqIXY,2210
6
- lgt_jobs/simple_job.py,sha256=sta7MP-57iwRewPycmTAc9dvSbocbGjWhb1QYYj7ccA,519
7
- lgt_jobs/smtp.py,sha256=W9OIkckBORAWEsNgIG3nVKs6OTU6esZNnq09WDsj8Lc,1352
8
- lgt_jobs/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- lgt_jobs/jobs/analytics.py,sha256=bNQpYBPz6CMN0i-wXDzQKcc1L8UYUvyiVGJbUeGdf9Q,1307
10
- lgt_jobs/jobs/archive_leads.py,sha256=wZ4LwbuC9G7NB16AO15YiMemEV40LoJVjd8VRqaFv9o,831
11
- lgt_jobs/jobs/bot_stats_update.py,sha256=_ziqMW0l1K9Eboaon0EruN3WJhQj6ZNImQvlnjMQRdA,3481
12
- lgt_jobs/jobs/chat_history.py,sha256=iuU-Zqa-m0IaT5Hw63xhqiEPaf7--ZY2dAymJcuwUkQ,6113
13
- lgt_jobs/jobs/clear_user_analytics.py,sha256=sP90jhOcZqs67hJV-lJyFJH9Iciqai8IsbNs5fSc90U,2478
14
- lgt_jobs/jobs/conversation_replied.py,sha256=pMkalznkVt_j20VfXzZcaGIMXxkIknxDlHKvu4_yrrs,2584
15
- lgt_jobs/jobs/inbox_leads.py,sha256=pAZUGOoxCxwN9befeRvTOFUWiLQhAiTsOWaRDpuGBD8,4516
16
- lgt_jobs/jobs/mass_message.py,sha256=uv-o-c8m3JrNciN7ypZLsd7RDetdUppx9OTfGi_1DKg,1768
17
- lgt_jobs/jobs/reactions_added.py,sha256=1fhSWBSfj82cdXJLznjPlaCSooAsmCIs_6AaoTQG6mY,2410
18
- lgt_jobs/jobs/reindex_conversation_history.py,sha256=heBrXcEgsT426FZRQ0cCz57ZcN_h4_x1W8tEjhn7LI8,1064
19
- lgt_jobs/jobs/send_code.py,sha256=VTp7vIoL2MJbzn_FpmZZgF1jMcNdBGpcXAc2BFo2c4A,759
20
- lgt_jobs/jobs/send_slack_message.py,sha256=ifF_X8WysS38eQKfAYde-SSQJf2fKAzDjr2fKtDmq3M,2853
21
- lgt_jobs/jobs/update_slack_profile.py,sha256=lYOi2jn2vhB_smDypy0655SONyjHU_k17Bbxe3r57Pc,3826
22
- lgt_jobs/jobs/user_balance_update.py,sha256=x8mcq-S-f4-weGmuvyqram0ixJ2HcdDg5wgMI1SKQFE,2295
23
- lgt_jobs/jobs/user_limits_update.py,sha256=bsn2iQ2UiWXGhowTKhy-D7YIFCJAOKibhEv_2cPYBUI,2352
24
- lgt_jobs/jobs/workspace_connect.py,sha256=64av5VIfFqOqBatzOK-3-yBjmemBASDNVoOH6uRTJTE,6732
25
- lgt_jobs/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
- lgt_jobs/services/web_client.py,sha256=SZogxjM0jyACRqBOP5EJvtqwe44og8B5B6TMWLpYmKM,1878
27
- lgt_jobs/templates/new_message_mail_template.html,sha256=82XdDPtmkJVUWUcZtgd8bv_9-viAG2WWOnf3AhR6PeY,3635
28
- leadguru_jobs-0.276.0.dist-info/METADATA,sha256=6crjB_yzhrLZM-TZUjjmwaNdYfGBF09BMSLc5OBh-4U,1181
29
- leadguru_jobs-0.276.0.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
30
- leadguru_jobs-0.276.0.dist-info/top_level.txt,sha256=rIuw1DqwbnZyeoarBSC-bYeGOhv9mZBs7_afl9q4_JI,9
31
- leadguru_jobs-0.276.0.dist-info/RECORD,,
@@ -1,62 +0,0 @@
1
- from abc import ABC
2
- from datetime import datetime
3
- from typing import List, Optional
4
- from lgt_data.engine import UserCreditStatementDocument
5
- from lgt_data.enums import UserAccountState
6
- from lgt_data.model import UserModel
7
- from lgt_data.mongo_repository import UserMongoRepository, DedicatedBotRepository, to_object_id
8
- from pydantic import BaseModel
9
- from lgt.common.python.lgt_logging import log
10
- from ..basejobs import BaseBackgroundJobData, BaseBackgroundJob
11
-
12
- """
13
- User limits handling
14
- """
15
-
16
-
17
- class UpdateUserDataUsageJobData(BaseBackgroundJobData, BaseModel):
18
- channel_id: str
19
- bot_name: str
20
- filtered: bool
21
- user_ids: List[str]
22
- message: Optional[str]
23
-
24
-
25
- class UpdateUserDataUsageJob(BaseBackgroundJob, ABC):
26
- @property
27
- def job_data_type(self) -> type:
28
- return UpdateUserDataUsageJobData
29
-
30
- @staticmethod
31
- def increment(user_id: str, dedicated_bot_id: str = None, bot_name: str = None, message: str = None):
32
- log.info(f"[UpdateUserDataUsageJob] Updating user: {user_id}")
33
- UserCreditStatementDocument(
34
- user_id=to_object_id(user_id),
35
- created_at=datetime.utcnow(),
36
- balance=-1,
37
- action="lead-filtered",
38
- attributes=[bot_name if bot_name else "", dedicated_bot_id if dedicated_bot_id else "",
39
- message if message else ""]
40
- ).save()
41
-
42
- @staticmethod
43
- def get_users(user_ids: List[str]) -> List[UserModel]:
44
- return UserMongoRepository().get_users(users_ids=user_ids)
45
-
46
- def exec(self, data: UpdateUserDataUsageJobData):
47
- users = self.get_users(data.user_ids)
48
- for user in users:
49
- if user.state == UserAccountState.Suspended.value:
50
- continue
51
-
52
- if user and data.bot_name in user.excluded_workspaces:
53
- continue
54
-
55
- if user and user.excluded_channels and user.excluded_channels.get(data.bot_name) and \
56
- (data.channel_id in user.excluded_channels.get(data.bot_name)):
57
- continue
58
-
59
- dedicated_bot = DedicatedBotRepository().get_by_user_and_name(user.id, data.bot_name)
60
- if dedicated_bot and not dedicated_bot.invalid_creds:
61
- self.increment(f"{user.id}", bot_name=data.bot_name,
62
- dedicated_bot_id=str(dedicated_bot.id), message=data.message)