leadguru-jobs 0.606.0__tar.gz → 0.608.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.606.0 → leadguru_jobs-0.608.0}/PKG-INFO +1 -1
  2. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/leadguru_jobs.egg-info/PKG-INFO +1 -1
  3. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/jobs/update_slack_profile.py +17 -11
  4. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_common/discord_client/discord_client.py +31 -0
  5. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_common/discord_client/methods.py +9 -0
  6. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_data/model.py +16 -6
  7. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/MANIFEST.in +0 -0
  8. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/README.md +0 -0
  9. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/leadguru_jobs.egg-info/SOURCES.txt +0 -0
  10. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/leadguru_jobs.egg-info/dependency_links.txt +0 -0
  11. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/leadguru_jobs.egg-info/not-zip-safe +0 -0
  12. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/leadguru_jobs.egg-info/requires.txt +0 -0
  13. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/leadguru_jobs.egg-info/top_level.txt +0 -0
  14. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/__init__.py +0 -0
  15. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/assets/images/arrow.png +0 -0
  16. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/assets/images/firework.png +0 -0
  17. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/assets/images/lock.png +0 -0
  18. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/assets/images/logo.png +0 -0
  19. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/assets/images/mail.png +0 -0
  20. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/basejobs.py +0 -0
  21. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/env.py +0 -0
  22. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/jobs/__init__.py +0 -0
  23. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/jobs/analytics.py +0 -0
  24. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/jobs/bot_stats_update.py +0 -0
  25. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/jobs/chat_history.py +0 -0
  26. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/jobs/connect_sources.py +0 -0
  27. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/jobs/inbox_leads.py +0 -0
  28. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/jobs/load_slack_people.py +0 -0
  29. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/jobs/mass_message.py +0 -0
  30. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/jobs/send_code.py +0 -0
  31. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/jobs/send_slack_message.py +0 -0
  32. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/jobs/user_balance_update.py +0 -0
  33. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/jobs/workspace_connect.py +0 -0
  34. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_common/__init__.py +0 -0
  35. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_common/discord_client/__init__.py +0 -0
  36. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_common/enums/__init__.py +0 -0
  37. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_common/enums/slack_errors.py +0 -0
  38. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_common/helpers.py +0 -0
  39. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_common/lgt_logging.py +0 -0
  40. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_common/pubsub/__init__.py +0 -0
  41. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_common/pubsub/messages.py +0 -0
  42. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_common/pubsub/pubsubfactory.py +0 -0
  43. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_common/slack_client/__init__.py +0 -0
  44. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_common/slack_client/methods.py +0 -0
  45. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_common/slack_client/slack_client.py +0 -0
  46. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_common/slack_client/web_client.py +0 -0
  47. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_data/__init__.py +0 -0
  48. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_data/analytics.py +0 -0
  49. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_data/engine.py +0 -0
  50. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_data/enums.py +0 -0
  51. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_data/helpers.py +0 -0
  52. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/lgt_data/mongo_repository.py +0 -0
  53. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/main.py +0 -0
  54. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/runner.py +0 -0
  55. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/services/__init__.py +0 -0
  56. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/services/web_client.py +0 -0
  57. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/simple_job.py +0 -0
  58. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/smtp.py +0 -0
  59. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/lgt_jobs/templates/new_message.html +0 -0
  60. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/setup.cfg +0 -0
  61. {leadguru_jobs-0.606.0 → leadguru_jobs-0.608.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: leadguru_jobs
3
- Version: 0.606.0
3
+ Version: 0.608.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.1
2
2
  Name: leadguru_jobs
3
- Version: 0.606.0
3
+ Version: 0.608.0
4
4
  Summary: LGT jobs builds
5
5
  Author-email: developer@leadguru.co
6
6
  Classifier: Development Status :: 5 - Production/Stable
@@ -2,7 +2,7 @@ from abc import ABC
2
2
  from lgt_jobs.lgt_common.slack_client.slack_client import SlackClient
3
3
  from lgt_jobs.lgt_common.slack_client.web_client import SlackFilesClient
4
4
  from lgt_jobs.lgt_data.enums import SourceType
5
- from lgt_jobs.lgt_data.model import UserModel
5
+ from lgt_jobs.lgt_data.model import Profile, SlackUser
6
6
  from lgt_jobs.lgt_data.mongo_repository import UserMongoRepository, DedicatedBotRepository
7
7
  from pydantic import BaseModel
8
8
  from lgt_jobs.basejobs import BaseBackgroundJobData, BaseBackgroundJob
@@ -21,31 +21,37 @@ class UpdateExternalUserProfileJob(BaseBackgroundJob, ABC):
21
21
 
22
22
  def exec(self, data: UpdateExternalUserProfileJobData):
23
23
  user = UserMongoRepository().get(data.user_id)
24
+ main_profile = None
25
+ active_users = [slack_user for slack_user in user.slack_users if not slack_user.deleted]
26
+ if active_users and active_users[0].profile.main:
27
+ main_profile = active_users[0].profile
24
28
  bots = DedicatedBotRepository().get_all(user_id=data.user_id, only_valid=True, include_deleted=False)
25
29
  for bot in bots:
30
+ current_user: SlackUser = next(filter(lambda x: x.email == bot.user_name, user.slack_users), None)
31
+ profile = main_profile if main_profile else current_user.profile
26
32
  if bot.source.source_type == SourceType.SLACK:
27
33
  slack = SlackClient(bot.token, bot.cookies)
28
34
  log.info(f'Updating profile in {bot.source.source_name}:{bot.source.source_id}')
29
- UpdateExternalUserProfileJob.__update_slack_profile(user, slack)
35
+ UpdateExternalUserProfileJob.__update_slack_profile(slack, profile)
30
36
 
31
37
  @staticmethod
32
- def __update_slack_profile(user: UserModel, slack: SlackClient):
33
- slack.update_profile(user.slack_profile.to_dic())
34
- if user.photo_url:
35
- photo_url = SlackFilesClient().get_file_url(user.photo_url)
38
+ def __update_slack_profile(slack: SlackClient, profile: Profile = None):
39
+ slack.update_profile(profile.to_dic())
40
+ if profile.photo_url:
41
+ photo_url = SlackFilesClient().get_file_url(profile.photo_url)
36
42
  slack.update_profile_photo(photo_url)
37
43
 
38
- profile = slack.get_team_profile()
44
+ team_profile = slack.get_team_profile()
39
45
  title_section_id = None
40
46
  title_field_id = None
41
47
  skype_section_id = None
42
- for field_data in profile.get('profile', {}).get('fields', []):
48
+ for field_data in team_profile.get('profile', {}).get('fields', []):
43
49
  if field_data.get('field_name') == 'title':
44
50
  title_section_id = field_data.get('section_id')
45
51
  title_field_id = field_data.get('id')
46
52
  break
47
53
  if title_field_id and title_section_id:
48
- for section_data in profile.get('profile', {}).get('sections', []):
54
+ for section_data in team_profile.get('profile', {}).get('sections', []):
49
55
  if section_data.get('section_type') == 'additional_info':
50
56
  skype_section_id = section_data.get('id')
51
57
  break
@@ -53,7 +59,7 @@ class UpdateExternalUserProfileJob(BaseBackgroundJob, ABC):
53
59
  auth = slack.test_auth().json()
54
60
  user_id = auth.get('user_id')
55
61
  title_element_id = title_field_id.replace(title_field_id[:2], 'Pe')
56
- response = slack.update_section(user_id, title_section_id, title_element_id, user.slack_profile.title)
62
+ response = slack.update_section(user_id, title_section_id, title_element_id, profile.title)
57
63
  sections = response['result']['data']['setProfileSection']['profileSections']
58
64
  elements = []
59
65
  for section in sections:
@@ -65,4 +71,4 @@ class UpdateExternalUserProfileJob(BaseBackgroundJob, ABC):
65
71
  if element['label'] == 'Skype':
66
72
  skype_element_id = element['elementId']
67
73
  break
68
- slack.update_section(user_id, skype_section_id, skype_element_id, user.slack_profile.skype)
74
+ slack.update_section(user_id, skype_section_id, skype_element_id, profile.skype)
@@ -43,6 +43,37 @@ class DiscordClient:
43
43
  self.__log_error(response)
44
44
  return response.json()
45
45
 
46
+ def patch_current_user(self, username: str, avatar: str = None) -> dict:
47
+ payload = {'username': username, 'avatar': avatar}
48
+ response = requests.patch(f"{self.base_url}{DiscordMethods.USER.value}", headers=self.headers, json=payload)
49
+ if response.status_code != 200:
50
+ self.__log_error(response)
51
+ return response.json()
52
+
53
+ def patch_current_user_in_guild(self, guild_id: str, username: str, avatar: str = None) -> dict:
54
+ payload = {'username': username, 'avatar': avatar}
55
+ response = requests.patch(f"{self.base_url}{DiscordMethods.guild_user(guild_id)}",
56
+ headers=self.headers, json=payload)
57
+ if response.status_code != 200:
58
+ self.__log_error(response)
59
+ return response.json()
60
+
61
+ def patch_current_user_bio(self, bio: str) -> dict:
62
+ payload = {'bio': bio}
63
+ response = requests.patch(f"{self.base_url}{DiscordMethods.USER_PROFILE.value}", headers=self.headers,
64
+ json=payload)
65
+ if response.status_code != 200:
66
+ self.__log_error(response)
67
+ return response.json()
68
+
69
+ def patch_user_bio_in_guild(self, guild_id: str, bio: str) -> dict:
70
+ payload = {'bio': bio}
71
+ response = requests.patch(f"{self.base_url}{DiscordMethods.guild_bio(guild_id)}",
72
+ headers=self.headers, json=payload)
73
+ if response.status_code != 200:
74
+ self.__log_error(response)
75
+ return response.json()
76
+
46
77
  def get_channels(self, guild_id: str) -> list | dict:
47
78
  response = requests.get(f"{self.base_url}{DiscordMethods.guild_channels(guild_id)}?with_counts=true",
48
79
  headers=self.headers)
@@ -5,12 +5,21 @@ class DiscordMethods(str, Enum):
5
5
  USER_GUILDS = 'users/@me/guilds'
6
6
  USER_DMS = 'users/@me/channels'
7
7
  USER = 'users/@me'
8
+ USER_PROFILE = 'users/@me/profile'
8
9
  LOGIN = 'auth/login'
9
10
 
10
11
  @staticmethod
11
12
  def guild_channels(guild_id: str):
12
13
  return f'guilds/{guild_id}/channels'
13
14
 
15
+ @staticmethod
16
+ def guild_user(guild_id: str):
17
+ return f'guilds/{guild_id}/members/@me'
18
+
19
+ @staticmethod
20
+ def guild_bio(guild_id: str):
21
+ return f'guilds/{guild_id}/profile/@me'
22
+
14
23
  @staticmethod
15
24
  def channels_invites(channel_id: str):
16
25
  return f'channels/{channel_id}/invites'
@@ -272,8 +272,6 @@ class UserModel(BaseModel):
272
272
  self.company_description: str = ''
273
273
  self.position: str = ''
274
274
  self.new_message_notified_at: Optional[datetime] = None
275
- self.photo_url: str = ''
276
- self.slack_profile = SlackProfile()
277
275
  self.leads_limit: Optional[int] = None
278
276
  self.leads_proceeded: Optional[int] = None
279
277
  self.leads_filtered: Optional[int] = None
@@ -307,7 +305,7 @@ class UserModel(BaseModel):
307
305
  if '_id' in dic:
308
306
  setattr(model, 'id', dic['_id'])
309
307
 
310
- model.slack_profile = SlackProfile.from_dic(dic.get('slack_profile'))
308
+ model.slack_profile = Profile.from_dic(dic.get('slack_profile'))
311
309
  model.slack_users = [SlackUser.from_dic(user) for user in dic.get('slack_users', [])]
312
310
  model.discord_users = [DiscordUser.from_dic(user) for user in dic.get('discord_users', [])]
313
311
  return model
@@ -346,13 +344,17 @@ class DiscordUser(DictionaryModel):
346
344
  self.status = None
347
345
  self.workspaces: List[UserWorkspace] = []
348
346
  self.deleted = False
347
+ self.profile: Profile | None = None
349
348
 
350
349
  def to_dic(self):
351
350
  result = copy.deepcopy(self.__dict__)
352
351
 
353
- if result.get('workspaces', None):
352
+ if result.get('workspaces'):
354
353
  result['workspaces'] = [ws.__dict__ for ws in result.get('workspaces')]
355
354
 
355
+ if result.get('profile'):
356
+ result['profile'] = result.get('profile').__dict__
357
+
356
358
  return result
357
359
 
358
360
  @classmethod
@@ -365,6 +367,7 @@ class DiscordUser(DictionaryModel):
365
367
  setattr(model, k, v)
366
368
 
367
369
  model.workspaces = [UserWorkspace.from_dic(ws) for ws in dic.get('workspaces', [])]
370
+ model.profile = Profile.from_dic(dic.get('profile'))
368
371
  return model
369
372
 
370
373
 
@@ -378,6 +381,7 @@ class SlackUser:
378
381
  self.status = None
379
382
  self.workspaces: List[UserWorkspace] = []
380
383
  self.deleted = False
384
+ self.profile: Profile | None = None
381
385
 
382
386
  def to_dic(self):
383
387
  result = copy.deepcopy(self.__dict__)
@@ -385,6 +389,9 @@ class SlackUser:
385
389
  if result.get('workspaces', None):
386
390
  result['workspaces'] = [ws.__dict__ for ws in result.get('workspaces')]
387
391
 
392
+ if result.get('profile'):
393
+ result['profile'] = result.get('profile').__dict__
394
+
388
395
  return result
389
396
 
390
397
  @classmethod
@@ -397,6 +404,7 @@ class SlackUser:
397
404
  setattr(model, k, v)
398
405
 
399
406
  model.workspaces = [UserWorkspace.from_dic(ws) for ws in dic.get('workspaces', [])]
407
+ model.profile = Profile.from_dic(dic.get('profile'))
400
408
  return model
401
409
 
402
410
 
@@ -730,7 +738,7 @@ class BoardedStatus:
730
738
  return model
731
739
 
732
740
 
733
- class SlackProfile:
741
+ class Profile:
734
742
  pass
735
743
 
736
744
  def __init__(self):
@@ -740,6 +748,8 @@ class SlackProfile:
740
748
  self.display_name = ''
741
749
  self.real_name = ''
742
750
  self.email = ''
751
+ self.photo_url = ''
752
+ self.main = False
743
753
 
744
754
  def to_dic(self):
745
755
  return copy.deepcopy(self.__dict__)
@@ -754,7 +764,7 @@ class SlackProfile:
754
764
  return model
755
765
 
756
766
 
757
- class SlackMemberInformation(BaseModel, SlackProfile):
767
+ class SlackMemberInformation(BaseModel, Profile):
758
768
  workspace: str
759
769
  sender_id: str
760
770
  images: dict