leadguru-jobs 0.413.0__tar.gz → 0.415.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 (61) hide show
  1. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/PKG-INFO +5 -10
  2. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/leadguru_jobs.egg-info/PKG-INFO +5 -10
  3. leadguru_jobs-0.415.0/leadguru_jobs.egg-info/SOURCES.txt +34 -0
  4. leadguru_jobs-0.415.0/leadguru_jobs.egg-info/requires.txt +14 -0
  5. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/lgt_jobs/__init__.py +4 -4
  6. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/lgt_jobs/jobs/analytics.py +1 -1
  7. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/lgt_jobs/jobs/archive_leads.py +2 -2
  8. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/lgt_jobs/jobs/bot_stats_update.py +9 -9
  9. leadguru_jobs-0.415.0/lgt_jobs/jobs/chat_history.py +111 -0
  10. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/lgt_jobs/jobs/inbox_leads.py +6 -5
  11. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/lgt_jobs/jobs/mass_message.py +2 -2
  12. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/lgt_jobs/jobs/send_code.py +1 -1
  13. leadguru_jobs-0.415.0/lgt_jobs/jobs/send_slack_message.py +65 -0
  14. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/lgt_jobs/jobs/update_slack_profile.py +14 -12
  15. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/lgt_jobs/jobs/user_balance_update.py +5 -5
  16. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/lgt_jobs/jobs/workspace_connect.py +5 -7
  17. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/lgt_jobs/main.py +11 -9
  18. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/lgt_jobs/runner.py +9 -6
  19. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/lgt_jobs/smtp.py +1 -1
  20. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/setup.py +5 -10
  21. leadguru_jobs-0.415.0/tests/job_data_test.py +42 -0
  22. leadguru_jobs-0.413.0/leadguru_jobs.egg-info/SOURCES.txt +0 -55
  23. leadguru_jobs-0.413.0/leadguru_jobs.egg-info/requires.txt +0 -19
  24. leadguru_jobs-0.413.0/lgt_jobs/jobs/chat_history.py +0 -116
  25. leadguru_jobs-0.413.0/lgt_jobs/jobs/send_slack_message.py +0 -46
  26. leadguru_jobs-0.413.0/lgt_jobs/lgt_common/discord_client/discord_client.py +0 -62
  27. leadguru_jobs-0.413.0/lgt_jobs/lgt_common/discord_client/methods.py +0 -16
  28. leadguru_jobs-0.413.0/lgt_jobs/lgt_common/enums/__init__.py +0 -0
  29. leadguru_jobs-0.413.0/lgt_jobs/lgt_common/enums/slack_errors.py +0 -6
  30. leadguru_jobs-0.413.0/lgt_jobs/lgt_common/helpers.py +0 -18
  31. leadguru_jobs-0.413.0/lgt_jobs/lgt_common/lgt_logging.py +0 -15
  32. leadguru_jobs-0.413.0/lgt_jobs/lgt_common/pubsub/__init__.py +0 -0
  33. leadguru_jobs-0.413.0/lgt_jobs/lgt_common/pubsub/command.py +0 -14
  34. leadguru_jobs-0.413.0/lgt_jobs/lgt_common/pubsub/messages.py +0 -37
  35. leadguru_jobs-0.413.0/lgt_jobs/lgt_common/pubsub/pubsubfactory.py +0 -51
  36. leadguru_jobs-0.413.0/lgt_jobs/lgt_common/slack_client/__init__.py +0 -0
  37. leadguru_jobs-0.413.0/lgt_jobs/lgt_common/slack_client/methods.py +0 -46
  38. leadguru_jobs-0.413.0/lgt_jobs/lgt_common/slack_client/slack_client.py +0 -392
  39. leadguru_jobs-0.413.0/lgt_jobs/lgt_common/slack_client/web_client.py +0 -167
  40. leadguru_jobs-0.413.0/lgt_jobs/lgt_data/__init__.py +0 -0
  41. leadguru_jobs-0.413.0/lgt_jobs/lgt_data/analytics.py +0 -723
  42. leadguru_jobs-0.413.0/lgt_jobs/lgt_data/engine.py +0 -223
  43. leadguru_jobs-0.413.0/lgt_jobs/lgt_data/enums.py +0 -68
  44. leadguru_jobs-0.413.0/lgt_jobs/lgt_data/helpers.py +0 -2
  45. leadguru_jobs-0.413.0/lgt_jobs/lgt_data/model.py +0 -955
  46. leadguru_jobs-0.413.0/lgt_jobs/lgt_data/mongo_repository.py +0 -1015
  47. leadguru_jobs-0.413.0/lgt_jobs/services/__init__.py +0 -0
  48. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/MANIFEST.in +0 -0
  49. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/README.md +0 -0
  50. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/leadguru_jobs.egg-info/dependency_links.txt +0 -0
  51. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/leadguru_jobs.egg-info/not-zip-safe +0 -0
  52. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/leadguru_jobs.egg-info/top_level.txt +0 -0
  53. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/lgt_jobs/basejobs.py +0 -0
  54. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/lgt_jobs/env.py +0 -0
  55. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/lgt_jobs/jobs/__init__.py +0 -0
  56. {leadguru_jobs-0.413.0/lgt_jobs/lgt_common → leadguru_jobs-0.415.0/lgt_jobs/services}/__init__.py +0 -0
  57. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/lgt_jobs/services/web_client.py +0 -0
  58. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/lgt_jobs/simple_job.py +0 -0
  59. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/lgt_jobs/templates/new_message_mail_template.html +0 -0
  60. {leadguru_jobs-0.413.0 → leadguru_jobs-0.415.0}/setup.cfg +0 -0
  61. {leadguru_jobs-0.413.0/lgt_jobs/lgt_common/discord_client → leadguru_jobs-0.415.0/tests}/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: leadguru_jobs
3
- Version: 0.413.0
3
+ Version: 0.415.0
4
4
  Summary: LGT jobs builds
5
5
  Author-email: developer@leadguru.co
6
6
  Classifier: Development Status :: 5 - Production/Stable
@@ -17,8 +17,11 @@ Classifier: Intended Audience :: System Administrators
17
17
  Classifier: Environment :: Console
18
18
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
19
19
  Classifier: Topic :: Internet
20
- Requires-Dist: cachetools==3.1.0
20
+ Requires-Dist: loguru
21
21
  Requires-Dist: pydantic
22
+ Requires-Dist: cachetools>=3.1.0
23
+ Requires-Dist: leadguru-common==0.383.0
24
+ Requires-Dist: leadguru-data==0.390.0
22
25
  Requires-Dist: wheel
23
26
  Requires-Dist: setuptools
24
27
  Requires-Dist: twine
@@ -28,11 +31,3 @@ Requires-Dist: pyyaml
28
31
  Requires-Dist: pymongo
29
32
  Requires-Dist: pytz
30
33
  Requires-Dist: requests
31
- Requires-Dist: mongoengine
32
- Requires-Dist: google
33
- Requires-Dist: google-cloud-pubsub
34
- Requires-Dist: google-cloud-storage
35
- Requires-Dist: websockets
36
- Requires-Dist: aiohttp
37
- Requires-Dist: nameparser
38
- Requires-Dist: loguru
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: leadguru_jobs
3
- Version: 0.413.0
3
+ Version: 0.415.0
4
4
  Summary: LGT jobs builds
5
5
  Author-email: developer@leadguru.co
6
6
  Classifier: Development Status :: 5 - Production/Stable
@@ -17,8 +17,11 @@ Classifier: Intended Audience :: System Administrators
17
17
  Classifier: Environment :: Console
18
18
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
19
19
  Classifier: Topic :: Internet
20
- Requires-Dist: cachetools==3.1.0
20
+ Requires-Dist: loguru
21
21
  Requires-Dist: pydantic
22
+ Requires-Dist: cachetools>=3.1.0
23
+ Requires-Dist: leadguru-common==0.383.0
24
+ Requires-Dist: leadguru-data==0.390.0
22
25
  Requires-Dist: wheel
23
26
  Requires-Dist: setuptools
24
27
  Requires-Dist: twine
@@ -28,11 +31,3 @@ Requires-Dist: pyyaml
28
31
  Requires-Dist: pymongo
29
32
  Requires-Dist: pytz
30
33
  Requires-Dist: requests
31
- Requires-Dist: mongoengine
32
- Requires-Dist: google
33
- Requires-Dist: google-cloud-pubsub
34
- Requires-Dist: google-cloud-storage
35
- Requires-Dist: websockets
36
- Requires-Dist: aiohttp
37
- Requires-Dist: nameparser
38
- Requires-Dist: loguru
@@ -0,0 +1,34 @@
1
+ MANIFEST.in
2
+ README.md
3
+ setup.cfg
4
+ setup.py
5
+ leadguru_jobs.egg-info/PKG-INFO
6
+ leadguru_jobs.egg-info/SOURCES.txt
7
+ leadguru_jobs.egg-info/dependency_links.txt
8
+ leadguru_jobs.egg-info/not-zip-safe
9
+ leadguru_jobs.egg-info/requires.txt
10
+ leadguru_jobs.egg-info/top_level.txt
11
+ lgt_jobs/__init__.py
12
+ lgt_jobs/basejobs.py
13
+ lgt_jobs/env.py
14
+ lgt_jobs/main.py
15
+ lgt_jobs/runner.py
16
+ lgt_jobs/simple_job.py
17
+ lgt_jobs/smtp.py
18
+ lgt_jobs/jobs/__init__.py
19
+ lgt_jobs/jobs/analytics.py
20
+ lgt_jobs/jobs/archive_leads.py
21
+ lgt_jobs/jobs/bot_stats_update.py
22
+ lgt_jobs/jobs/chat_history.py
23
+ lgt_jobs/jobs/inbox_leads.py
24
+ lgt_jobs/jobs/mass_message.py
25
+ lgt_jobs/jobs/send_code.py
26
+ lgt_jobs/jobs/send_slack_message.py
27
+ lgt_jobs/jobs/update_slack_profile.py
28
+ lgt_jobs/jobs/user_balance_update.py
29
+ lgt_jobs/jobs/workspace_connect.py
30
+ lgt_jobs/services/__init__.py
31
+ lgt_jobs/services/web_client.py
32
+ lgt_jobs/templates/new_message_mail_template.html
33
+ tests/__init__.py
34
+ tests/job_data_test.py
@@ -0,0 +1,14 @@
1
+ loguru
2
+ pydantic
3
+ cachetools>=3.1.0
4
+ leadguru-common==0.383.0
5
+ leadguru-data==0.390.0
6
+ wheel
7
+ setuptools
8
+ twine
9
+ build
10
+ kubernetes
11
+ pyyaml
12
+ pymongo
13
+ pytz
14
+ requests
@@ -6,7 +6,7 @@ from .jobs.analytics import (TrackAnalyticsJob, TrackAnalyticsJobData)
6
6
  from .jobs.archive_leads import (ArchiveLeadsJob, ArchiveLeadsJobData)
7
7
  from .jobs.bot_stats_update import (BotStatsUpdateJob, BotStatsUpdateJobData)
8
8
  from .jobs.chat_history import (LoadChatHistoryJob, LoadChatHistoryJobData)
9
- from .jobs.update_slack_profile import (UpdateExternalUserProfileJob, UpdateExternalUserProfileJobData)
9
+ from .jobs.update_slack_profile import (UpdateUserSlackProfileJob, UpdateUserSlackProfileJobData)
10
10
  from .jobs.mass_message import SendMassMessageSlackChannelJob, SendMassMessageSlackChannelJobData
11
11
  from .basejobs import (BaseBackgroundJobData, BaseBackgroundJob, InvalidJobTypeException)
12
12
  from .smtp import (SendMailJob, SendMailJobData)
@@ -20,7 +20,7 @@ jobs_map = {
20
20
  "SendMailJob": SendMailJob,
21
21
  "TrackAnalyticsJob": TrackAnalyticsJob,
22
22
  "LoadChatHistoryJob": LoadChatHistoryJob,
23
- "UpdateExternalUserProfileJob": UpdateExternalUserProfileJob,
23
+ "UpdateUserSlackProfileJob": UpdateUserSlackProfileJob,
24
24
  "SendSlackMessageJob": SendSlackMessageJob,
25
25
  "UpdateUserBalanceJob": UpdateUserBalanceJob,
26
26
  "SendMassMessageSlackChannelJob": SendMassMessageSlackChannelJob,
@@ -33,7 +33,7 @@ __all__ = [
33
33
  SendMailJob,
34
34
  SimpleTestJob,
35
35
  LoadChatHistoryJob,
36
- UpdateExternalUserProfileJob,
36
+ UpdateUserSlackProfileJob,
37
37
  TrackAnalyticsJob,
38
38
  SendSlackMessageJob,
39
39
  UpdateUserBalanceJob,
@@ -49,7 +49,7 @@ __all__ = [
49
49
  SendMailJobData,
50
50
  SimpleTestJobData,
51
51
  LoadChatHistoryJobData,
52
- UpdateExternalUserProfileJobData,
52
+ UpdateUserSlackProfileJobData,
53
53
  TrackAnalyticsJobData,
54
54
  SendSlackMessageJobData,
55
55
  UpdateUserBalanceJobData,
@@ -3,7 +3,7 @@ import datetime
3
3
  from typing import Optional, List
4
4
  from pydantic import BaseModel, conlist
5
5
  from pymongo import MongoClient
6
- from lgt_jobs.lgt_common.lgt_logging import log
6
+ from lgt.common.python.lgt_logging import log
7
7
  from ..basejobs import BaseBackgroundJob, BaseBackgroundJobData
8
8
  from ..env import mongo_connection_string
9
9
 
@@ -1,6 +1,6 @@
1
1
  from abc import ABC
2
2
  import datetime
3
- from lgt_jobs.lgt_data.mongo_repository import UserLeadMongoRepository
3
+ from lgt_data.mongo_repository import UserLeadMongoRepository
4
4
  from pydantic import BaseModel
5
5
  from ..basejobs import BaseBackgroundJob, BaseBackgroundJobData
6
6
 
@@ -21,7 +21,7 @@ class ArchiveLeadsJob(BaseBackgroundJob, ABC):
21
21
  def exec(self, data: ArchiveLeadsJobData):
22
22
  lead_repository = UserLeadMongoRepository()
23
23
  leads = lead_repository.get_leads(data.user_id, 0, 1000, archived=False,
24
- to_date=datetime.datetime.now(datetime.UTC) - datetime.timedelta(days=90))
24
+ to_date=datetime.datetime.utcnow() - datetime.timedelta(days=90))
25
25
 
26
26
  for lead in leads:
27
27
  lead_repository.update_lead(data.user_id, lead.id, archived=True)
@@ -2,16 +2,16 @@ import random
2
2
  import time
3
3
  from abc import ABC
4
4
  from typing import Optional
5
- from lgt_jobs.lgt_common.discord_client.discord_client import DiscordClient
6
- from lgt_jobs.lgt_common.helpers import get_formatted_bot_name
7
- from lgt_jobs.lgt_common.slack_client.web_client import SlackWebClient
8
- from lgt_jobs.lgt_data.enums import SourceType
9
- from lgt_jobs.lgt_data.model import DedicatedBotModel, Server, Channel, DiscordUser
10
- from lgt_jobs.lgt_data.mongo_repository import DedicatedBotRepository, UserMongoRepository
5
+ from lgt.common.python.discord_client.discord_client import DiscordClient
6
+ from lgt.common.python.helpers import get_formatted_bot_name
7
+ from lgt.common.python.slack_client.web_client import SlackWebClient
8
+ from lgt_data.enums import SourceType
9
+ from lgt_data.model import DedicatedBotModel, Server, Channel, DiscordUser
10
+ from lgt_data.mongo_repository import DedicatedBotRepository, UserMongoRepository
11
11
  from pydantic import BaseModel
12
- from lgt_jobs.lgt_data.analytics import get_bots_aggregated_analytics
13
- from lgt_jobs.lgt_common.lgt_logging import log
14
- from lgt_jobs.lgt_common.enums.slack_errors import SlackErrors
12
+ from lgt_data.analytics import get_bots_aggregated_analytics
13
+ from lgt.common.python.lgt_logging import log
14
+ from lgt.common.python.enums.slack_errors import SlackErrors
15
15
  from ..basejobs import BaseBackgroundJob, BaseBackgroundJobData
16
16
 
17
17
  """
@@ -0,0 +1,111 @@
1
+ import datetime
2
+ from abc import ABC
3
+ from typing import Optional, List
4
+ from lgt.common.python.lgt_logging import log
5
+ from lgt.common.python.slack_client.web_client import SlackWebClient, SlackMessageConvertService
6
+ from lgt_data.model import SlackHistoryMessageModel, UserModel, UserContact
7
+ from lgt_data.mongo_repository import UserMongoRepository, DedicatedBotRepository, UserContactsRepository
8
+ from pydantic import BaseModel
9
+ from ..runner import BackgroundJobRunner
10
+ from ..env import portal_url
11
+ from ..basejobs import BaseBackgroundJob, BaseBackgroundJobData
12
+ from ..smtp import SendMailJobData, SendMailJob
13
+
14
+ """
15
+ Load slack chat history
16
+ """
17
+
18
+
19
+ class LoadChatHistoryJobData(BaseBackgroundJobData, BaseModel):
20
+ user_id: str
21
+ template_path: str = 'lgt_jobs/templates/new_message_mail_template.html'
22
+
23
+
24
+ class LoadChatHistoryJob(BaseBackgroundJob, ABC):
25
+ @property
26
+ def job_data_type(self) -> type:
27
+ return LoadChatHistoryJobData
28
+
29
+ def exec(self, data: LoadChatHistoryJobData):
30
+ """download chat history"""
31
+ user = UserMongoRepository().get(data.user_id)
32
+ contacts = UserContactsRepository().find(user.id, with_chat_only=True, spam=False)
33
+ if not contacts:
34
+ return
35
+
36
+ log.info(f"[LoadChatHistoryJob]: processing {len(contacts)} contacts for user: {user.email}")
37
+ last_message = None
38
+ last_message_contact = None
39
+ for contact in contacts:
40
+ message = LoadChatHistoryJob._update_history(user=user, contact=contact)
41
+
42
+ if not message:
43
+ continue
44
+
45
+ if not last_message:
46
+ last_message = message
47
+ last_message_contact = contact
48
+
49
+ if message.created_at > last_message.created_at and message.user == contact.sender_id:
50
+ last_message = message
51
+ last_message_contact = contact
52
+
53
+ has_to_be_notified = (not user.new_message_notified_at or
54
+ (last_message and last_message.created_at > user.new_message_notified_at))
55
+
56
+ if last_message and has_to_be_notified and last_message.user == last_message_contact.sender_id:
57
+ LoadChatHistoryJob._notify_about_new_messages(user, last_message_contact, data.template_path)
58
+ UserMongoRepository().set(data.user_id, new_message_notified_at=datetime.datetime.utcnow())
59
+
60
+ @staticmethod
61
+ def _merge_chat_histories(contact: UserContact, messages: List[SlackHistoryMessageModel]):
62
+ for message in contact.chat_history:
63
+ if not [True for msg in messages if msg.ts == message.ts]: # Uniq messages
64
+ messages.append(message)
65
+ messages = sorted(messages, key=lambda d: d.created_at)
66
+ return messages
67
+
68
+ @staticmethod
69
+ def _update_history(user: UserModel, contact: UserContact) -> Optional[SlackHistoryMessageModel]:
70
+ bot = DedicatedBotRepository().get_one(user_id=user.id, source_id=contact.source_id, only_valid=True)
71
+ if not bot:
72
+ return None
73
+
74
+ slack_client = SlackWebClient(bot.token, bot.cookies)
75
+ try:
76
+ history = slack_client.chat_history(contact.chat_id)
77
+ if not history.get('messages'):
78
+ return
79
+ except Exception as ex:
80
+ log.error(f'[LoadChatHistoryJob]: Failed to load chat for the contact: {contact.id}. ERROR: {str(ex)}')
81
+ return
82
+
83
+ if not history['ok']:
84
+ log.error(f'Failed to load chat for the contact: {contact.id}. ERROR: {history.get("error", "")}')
85
+ return
86
+
87
+ messages = [SlackMessageConvertService.from_slack_response(user.email, "slack_files", bot.token, m) for m in
88
+ history.get('messages', [])]
89
+ messages = LoadChatHistoryJob._merge_chat_histories(contact, messages)
90
+ chat_history = [message.to_dic() for message in messages]
91
+ if not chat_history:
92
+ return
93
+
94
+ UserContactsRepository().update(user.id, contact.sender_id, chat_history=chat_history)
95
+ return messages[-1] if bot.associated_user != contact.sender_id else None
96
+
97
+ @staticmethod
98
+ def _notify_about_new_messages(user: UserModel, contact: UserContact, template_path: str):
99
+ with open(template_path, mode='r') as template_file:
100
+ html = template_file.read()
101
+ html = html.replace("{sender}", contact.name if hasattr(contact, 'name') else contact.real_name)
102
+ html = html.replace("{view_message_link}", f'{portal_url}/')
103
+
104
+ message_data = {
105
+ "html": html,
106
+ "subject": 'New message(s) on LEADGURU',
107
+ "recipient": user.email,
108
+ "sender": None
109
+ }
110
+
111
+ BackgroundJobRunner.submit(SendMailJob, SendMailJobData(**message_data))
@@ -1,9 +1,9 @@
1
1
  from abc import ABC
2
- from lgt_jobs.lgt_common.lgt_logging import log
3
- from lgt_jobs.lgt_common.slack_client.web_client import SlackWebClient
4
- from lgt_jobs.lgt_data.enums import DefaultBoards
5
- from lgt_jobs.lgt_data.model import UserModel, DedicatedBotModel, SlackMemberInformation, UserLeadModel
6
- from lgt_jobs.lgt_data.mongo_repository import UserMongoRepository, DedicatedBotRepository, \
2
+ from lgt.common.python.lgt_logging import log
3
+ from lgt.common.python.slack_client.web_client import SlackWebClient
4
+ from lgt_data.enums import DefaultBoards
5
+ from lgt_data.model import UserModel, DedicatedBotModel, SlackMemberInformation, UserLeadModel
6
+ from lgt_data.mongo_repository import UserMongoRepository, DedicatedBotRepository, \
7
7
  SlackContactUserRepository, BoardsMongoRepository, UserContactsRepository
8
8
  from pydantic import BaseModel
9
9
  from ..basejobs import BaseBackgroundJob, BaseBackgroundJobData
@@ -80,6 +80,7 @@ class InboxLeadsJob(BaseBackgroundJob, ABC):
80
80
  @staticmethod
81
81
  def create_people(slack_profile: dict, dedicated_bot: DedicatedBotModel):
82
82
  member_info: SlackMemberInformation = SlackMemberInformation.from_slack_response(slack_profile,
83
+ dedicated_bot.source.source_name,
83
84
  dedicated_bot.source)
84
85
  SlackContactUserRepository().collection().update_one({"sender_id": member_info.sender_id,
85
86
  "source.source_id": dedicated_bot.source.source_id},
@@ -2,8 +2,8 @@ import time
2
2
  from abc import ABC
3
3
  from random import randint
4
4
  from typing import Optional, Any
5
- from lgt_jobs.lgt_common.slack_client.web_client import SlackWebClient
6
- from lgt_jobs.lgt_data.mongo_repository import DedicatedBotRepository
5
+ from lgt.common.python.slack_client.web_client import SlackWebClient
6
+ from lgt_data.mongo_repository import DedicatedBotRepository
7
7
  from loguru import logger as log
8
8
  from pydantic import BaseModel
9
9
  from ..basejobs import BaseBackgroundJobData, BaseBackgroundJob
@@ -1,7 +1,7 @@
1
1
  from abc import ABC
2
2
  from typing import Optional
3
3
  from loguru import logger as log
4
- from lgt_jobs.lgt_common.slack_client.web_client import SlackWebClient
4
+ from lgt.common.python.slack_client.web_client import SlackWebClient
5
5
  from pydantic import BaseModel
6
6
  from ..basejobs import BaseBackgroundJobData, BaseBackgroundJob
7
7
 
@@ -0,0 +1,65 @@
1
+ import datetime
2
+ from abc import ABC
3
+ from typing import Optional
4
+ from lgt.common.python.lgt_logging import log
5
+ from lgt.common.python.slack_client.web_client import SlackWebClient, SlackMessageConvertService
6
+ from lgt_data.mongo_repository import (UserMongoRepository, UserLeadMongoRepository,
7
+ DedicatedBotRepository, UserContactsRepository)
8
+ from pydantic import BaseModel
9
+ from ..basejobs import BaseBackgroundJobData, BaseBackgroundJob
10
+
11
+ """
12
+ Send Slack Message
13
+ """
14
+
15
+
16
+ class SendSlackMessageJobData(BaseBackgroundJobData, BaseModel):
17
+ lead_id: str
18
+ user_id: str
19
+ text: Optional[str]
20
+ files_ids: Optional[list]
21
+
22
+
23
+ class SendSlackMessageJob(BaseBackgroundJob, ABC):
24
+ @property
25
+ def job_data_type(self) -> type:
26
+ return SendSlackMessageJobData
27
+
28
+ def exec(self, data: SendSlackMessageJobData):
29
+ user_leads_repository = UserLeadMongoRepository()
30
+ user = UserMongoRepository().get(data.user_id)
31
+ lead = user_leads_repository.get_lead(user_id=data.user_id, lead_id=data.lead_id)
32
+ if not lead:
33
+ return
34
+
35
+ bot = DedicatedBotRepository().get_one(user_id=data.user_id, source_id=data.source_id, only_valid=True)
36
+ if not bot:
37
+ return
38
+
39
+ slack_client = SlackWebClient(bot.token, bot.cookies)
40
+ resp = slack_client.im_open(lead.message.sender_id)
41
+ if not resp['ok']:
42
+ log.warning(f"Unable to open im with user: {resp}")
43
+ return
44
+
45
+ channel_id = resp['channel']['id']
46
+ if data.files_ids:
47
+ resp = slack_client.share_files(data.files_ids, channel_id, data.text)
48
+ else:
49
+ resp = slack_client.post_message(channel_id, data.text)
50
+
51
+ if not resp['ok']:
52
+ return log.warning(f"Unable to send message: {resp}")
53
+
54
+ message = resp.get('message') if 'message' in resp \
55
+ else slack_client.conversation_replies(channel_id, resp['file_msg_ts'])['messages'][0]
56
+
57
+ message_model = SlackMessageConvertService.from_slack_response(user.email, "slack_files", bot.token, message,
58
+ slack_client.client.cookies)
59
+ lead.chat_history.append(message_model)
60
+ chat_history = [message.to_dic() for message in lead.chat_history]
61
+ user_leads_repository.update_lead(user.id, lead.id, slack_channel=channel_id,
62
+ chat_history=chat_history, last_action_at=datetime.datetime.utcnow())
63
+
64
+ UserContactsRepository().update(user.id, lead.message.sender_id,
65
+ chat_id=channel_id, chat_history=chat_history)
@@ -1,32 +1,34 @@
1
1
  from abc import ABC
2
- from lgt_jobs.lgt_common.slack_client.slack_client import SlackClient
3
- from lgt_jobs.lgt_data.enums import SourceType
4
- from lgt_jobs.lgt_data.model import UserModel
5
- from lgt_jobs.lgt_data.mongo_repository import UserMongoRepository, DedicatedBotRepository
2
+ from lgt.common.python.slack_client.slack_client import SlackClient
3
+ from lgt_data.model import UserModel
4
+ from lgt_data.mongo_repository import UserMongoRepository, DedicatedBotRepository
6
5
  from pydantic import BaseModel
7
6
  from ..basejobs import BaseBackgroundJobData, BaseBackgroundJob
8
7
 
8
+ """
9
+ Update Slack User profile
10
+ """
9
11
 
10
- class UpdateExternalUserProfileJobData(BaseBackgroundJobData, BaseModel):
12
+
13
+ class UpdateUserSlackProfileJobData(BaseBackgroundJobData, BaseModel):
11
14
  user_id: str
12
15
 
13
16
 
14
- class UpdateExternalUserProfileJob(BaseBackgroundJob, ABC):
17
+ class UpdateUserSlackProfileJob(BaseBackgroundJob, ABC):
15
18
 
16
19
  @property
17
20
  def job_data_type(self) -> type:
18
- return UpdateExternalUserProfileJobData
21
+ return UpdateUserSlackProfileJobData
19
22
 
20
- def exec(self, data: UpdateExternalUserProfileJobData):
23
+ def exec(self, data: UpdateUserSlackProfileJobData):
21
24
  user = UserMongoRepository().get(data.user_id)
22
25
  bots = DedicatedBotRepository().get_all(user_id=data.user_id, only_valid=True, include_deleted=False)
23
26
  for bot in bots:
24
- if bot.type == SourceType.SLACK:
25
- slack = SlackClient(bot.token, bot.cookies)
26
- UpdateExternalUserProfileJob.__update_slack_profile(user, slack)
27
+ slack = SlackClient(bot.token, bot.cookies)
28
+ UpdateUserSlackProfileJob.__update_profile(user, slack)
27
29
 
28
30
  @staticmethod
29
- def __update_slack_profile(user: UserModel, slack: SlackClient):
31
+ def __update_profile(user: UserModel, slack: SlackClient):
30
32
  profile = slack.get_team_profile()
31
33
  title_section_id = None
32
34
  title_field_id = None
@@ -1,10 +1,10 @@
1
1
  import datetime
2
2
  from abc import ABC
3
3
  from typing import Optional
4
- from lgt_jobs.lgt_data.engine import UserCreditStatementDocument
5
- from lgt_jobs.lgt_data.enums import UserAccountState, UserAction
6
- from lgt_jobs.lgt_data.model import UserModel
7
- from lgt_jobs.lgt_data.mongo_repository import UserMongoRepository, to_object_id
4
+ from lgt_data.engine import UserCreditStatementDocument
5
+ from lgt_data.enums import UserAccountState, UserAction
6
+ from lgt_data.model import UserModel
7
+ from lgt_data.mongo_repository import UserMongoRepository, to_object_id
8
8
  from pydantic import BaseModel
9
9
  from ..basejobs import BaseBackgroundJobData, BaseBackgroundJob
10
10
 
@@ -49,7 +49,7 @@ class UpdateUserBalanceJob(BaseBackgroundJob, ABC):
49
49
  # suspend account
50
50
  if user.state != UserAccountState.Suspended.value:
51
51
  UserMongoRepository().set(user.id, leads_proceeded=count,
52
- credits_exceeded_at=datetime.datetime.now(datetime.UTC),
52
+ credits_exceeded_at=datetime.datetime.utcnow(),
53
53
  state=UserAccountState.Suspended.value)
54
54
  return
55
55
 
@@ -1,11 +1,11 @@
1
1
  from abc import ABC
2
2
  from typing import Dict
3
3
  import requests
4
- from lgt_jobs.lgt_common.helpers import update_credentials, get_formatted_bot_name
5
- from lgt_jobs.lgt_common.slack_client.web_client import SlackWebClient
6
- from lgt_jobs.lgt_data.enums import StatusConnection, SourceType
7
- from lgt_jobs.lgt_data.model import UserWorkspace, SlackUser, DedicatedBotModel
8
- from lgt_jobs.lgt_data.mongo_repository import UserMongoRepository, DedicatedBotRepository
4
+ from lgt.common.python.helpers import update_credentials, get_formatted_bot_name
5
+ from lgt.common.python.slack_client.web_client import SlackWebClient
6
+ from lgt_data.enums import StatusConnection, SourceType
7
+ from lgt_data.model import UserWorkspace, SlackUser, DedicatedBotModel
8
+ from lgt_data.mongo_repository import UserMongoRepository, DedicatedBotRepository
9
9
  from ..basejobs import BaseBackgroundJobData, BaseBackgroundJob
10
10
  from .bot_stats_update import BotStatsUpdateJob, BotStatsUpdateJobData
11
11
  from ..runner import BackgroundJobRunner
@@ -129,6 +129,4 @@ class ConnectSlackAccountJob(BaseBackgroundJob, ABC):
129
129
  if auth.status_code == 200 and dedicated_bot.source.source_id not in user_workspaces_map.keys():
130
130
  dedicated_bot.banned = True
131
131
  dedicated_bot.invalid_creds = True
132
- for server in dedicated_bot.servers:
133
- server.deleted = True
134
132
  dedicated_bots_repository.add_or_update(dedicated_bot)
@@ -2,11 +2,11 @@ import json
2
2
  import sys
3
3
  import threading
4
4
  import time
5
- from lgt_common.pubsub.pubsubfactory import PubSubFactory
6
- from lgt_common.lgt_logging import log
7
- from lgt_jobs.env import project_id, background_jobs_topic, background_jobs_subscriber
8
- from lgt_jobs.runner import BackgroundJobRunner
9
- from lgt_jobs import jobs_map
5
+ from lgt_jobs import BackgroundJobRunner, jobs_map
6
+ from lgt.common.python.pubsub.pubsubfactory import PubSubFactory
7
+ from lgt.common.python.lgt_logging import log
8
+
9
+ from lgt_jobs import env
10
10
 
11
11
  lock = threading.Lock()
12
12
 
@@ -35,10 +35,12 @@ def run_background_job_with_lock(message):
35
35
 
36
36
 
37
37
  if __name__ == '__main__':
38
- factory = PubSubFactory(project_id)
39
- factory.create_topic_if_doesnt_exist(background_jobs_topic)
40
- factory.create_subscription_if_doesnt_exist(background_jobs_subscriber, background_jobs_topic,600)
41
- bot_subscription_path = factory.get_subscription_path(background_jobs_subscriber, background_jobs_topic)
38
+ factory = PubSubFactory(env.project_id)
39
+ factory.create_topic_if_doesnt_exist(env.background_jobs_topic)
40
+ factory.create_subscription_if_doesnt_exist(env.background_jobs_subscriber, env.background_jobs_topic,
41
+ ack_deadline_seconds=600)
42
+ bot_subscription_path = factory.get_subscription_path(env.background_jobs_subscriber, env.background_jobs_topic)
43
+
42
44
  factory.subscriber.subscribe(bot_subscription_path, callback=run_background_job_with_lock)
43
45
  log.info(f'Listening for messages on {bot_subscription_path}')
44
46
  while True:
@@ -1,7 +1,7 @@
1
1
  import json
2
- from datetime import datetime, UTC
3
- from lgt_jobs.lgt_common.pubsub.messages import publish_message2_pubsub
4
- from lgt_jobs.lgt_data.engine import DelayedJob
2
+ from datetime import datetime
3
+ from lgt.common.python.pubsub.messages import _publish_message2_pubsub
4
+ from lgt_data.engine import DelayedJob
5
5
  from .basejobs import InvalidJobTypeException, BaseBackgroundJobData, BaseBackgroundJob
6
6
  from .env import background_jobs_topic
7
7
 
@@ -33,19 +33,22 @@ class BackgroundJobRunner:
33
33
 
34
34
  @staticmethod
35
35
  def submit_data(data: dict):
36
- json_str = json.dumps(data, ensure_ascii=False, default=datetime_converter)
36
+ json_str = json.dumps(data,
37
+ ensure_ascii=False,
38
+ default=datetime_converter)
37
39
  BackgroundJobRunner.submit_json(json_str)
38
40
 
39
41
  @staticmethod
40
42
  def submit_json(json_str: str):
41
- publish_message2_pubsub(background_jobs_topic, message_json=json_str)
43
+ _publish_message2_pubsub(background_jobs_topic,
44
+ message_json=json_str)
42
45
 
43
46
  @staticmethod
44
47
  def schedule(jib: str, job: type, data: BaseBackgroundJobData, scheduled_at: datetime):
45
48
  job_data = BaseBackgroundJob.dumps(job, data.model_dump())
46
49
  DelayedJob(
47
50
  jib=jib,
48
- created_at=datetime.now(UTC),
51
+ created_at=datetime.utcnow(),
49
52
  scheduled_at=scheduled_at,
50
53
  job_type=job.__name__,
51
54
  data=json.dumps(job_data, ensure_ascii=False, default=datetime_converter)
@@ -1,7 +1,7 @@
1
1
  from abc import ABC
2
2
  import smtplib
3
3
  from pydantic import BaseModel
4
- from lgt_jobs.lgt_common.lgt_logging import log
4
+ from lgt.common.python.lgt_logging import log
5
5
  from .basejobs import BaseBackgroundJobData, BaseBackgroundJob
6
6
  from .env import smtp_login, smtp_password, smtp_host
7
7
 
@@ -21,8 +21,11 @@ version_parts[1] = f'{float(version_parts[1]) + 1}'
21
21
  last_version = ".".join(version_parts[0:-1])
22
22
 
23
23
  install_requires = [
24
- 'cachetools==3.1.0',
24
+ 'loguru',
25
25
  'pydantic',
26
+ 'cachetools>=3.1.0',
27
+ 'leadguru-common==0.383.0',
28
+ 'leadguru-data==0.390.0',
26
29
  'wheel',
27
30
  'setuptools',
28
31
  'twine',
@@ -31,15 +34,7 @@ install_requires = [
31
34
  'pyyaml',
32
35
  'pymongo',
33
36
  'pytz',
34
- 'requests',
35
- 'mongoengine',
36
- 'google',
37
- 'google-cloud-pubsub',
38
- 'google-cloud-storage',
39
- 'websockets',
40
- 'aiohttp',
41
- 'nameparser',
42
- 'loguru'
37
+ 'requests'
43
38
  ]
44
39
 
45
40
  setup(name=package_name,