leadguru-jobs 0.584.0__py3-none-any.whl → 0.586.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.584.0
3
+ Version: 0.586.0
4
4
  Summary: LGT jobs builds
5
5
  Author-email: developer@leadguru.co
6
6
  Classifier: Development Status :: 5 - Production/Stable
@@ -4,7 +4,7 @@ lgt_jobs/env.py,sha256=cRO03GGvstUjBsv3uYO-iakrOvAk_ZWUP_fnmf21iZQ,789
4
4
  lgt_jobs/main.py,sha256=cK_nkBtJHnUNDbba1WZotqPtI_6OWxiYQkAgco9OAmE,1539
5
5
  lgt_jobs/runner.py,sha256=7KHpMHWwCjDlPDKnkNqrGAyIVn4Po62VqjYGVa85if8,2218
6
6
  lgt_jobs/simple_job.py,sha256=sta7MP-57iwRewPycmTAc9dvSbocbGjWhb1QYYj7ccA,519
7
- lgt_jobs/smtp.py,sha256=Svaq2ghMjGwpPA4J92wVnzrLlVbI2FcM2d4liiAbHLo,1210
7
+ lgt_jobs/smtp.py,sha256=k0qh-Qk9AeSU3WrCOVmuWkfpi9xzwaPMzbw9cED-pZw,1150
8
8
  lgt_jobs/assets/images/arrow.png,sha256=Lr_zG1TyySAWX78jiojcV7j8BHe2S_Oi7eZYAfe4YbM,536
9
9
  lgt_jobs/assets/images/firework.png,sha256=9d_0lUpDFfT3e4JTgp5XVb03qAdtO9yNVi1c1KoQDp8,33754
10
10
  lgt_jobs/assets/images/lock.png,sha256=515llTFqboG9PYXIrXhlbPZ5lQOHXjEYyQkXc9WfJxc,5978
@@ -12,7 +12,7 @@ lgt_jobs/assets/images/logo.png,sha256=nt377FGkBalBF9Z9TYQRv9loHolTXwU8_VRYvCXXz
12
12
  lgt_jobs/assets/images/mail.png,sha256=eORzQcAMkFr7DjgtABVhJ_zFuXgO7OXv78lLF4b39B0,7168
13
13
  lgt_jobs/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  lgt_jobs/jobs/analytics.py,sha256=IIsWt4A1qUw3w-S-8W16uKY1FRVWfXXA41_mu4uCNiM,979
15
- lgt_jobs/jobs/bot_stats_update.py,sha256=yDA6-FqSC5T2jTPaHImSjnuI6OD0pw-BF9VagsfmkXM,7806
15
+ lgt_jobs/jobs/bot_stats_update.py,sha256=R6mf5FxhWbyx92AYXlj0FZVjz2Tgz86mBvLHrsQ9AFE,7502
16
16
  lgt_jobs/jobs/chat_history.py,sha256=tZ4XyOGdy1k6r4uotxSSKbXjTR_oRK6Ym0YthFYBtl8,6200
17
17
  lgt_jobs/jobs/connect_sources.py,sha256=_eA86KnS3AC6YCI1xk7VCV7lFmPRxta-wUStfdmajQU,4790
18
18
  lgt_jobs/jobs/inbox_leads.py,sha256=OSX-FNx27gWEKNBBc-hyq2odCxXytz7WHtQJajtz274,5670
@@ -22,12 +22,12 @@ lgt_jobs/jobs/send_code.py,sha256=dIlLPkG3GgGKIEqGiElyzrtdrnJNTL1Ak2V0xnE-WIQ,82
22
22
  lgt_jobs/jobs/send_slack_message.py,sha256=IuRqDGcDrz2EAZzF6nrLXO0aSA4mETB_tGOEbcMhjHE,2562
23
23
  lgt_jobs/jobs/update_slack_profile.py,sha256=0fUHBd2gEBne52sTfxwji2Wu-oYDM5dLGsL-rHq5kwM,2765
24
24
  lgt_jobs/jobs/user_balance_update.py,sha256=HxeEmDdloK9EcoEj1ybYTgxIkB0IQNLnss_kk3rLI1Q,2404
25
- lgt_jobs/jobs/workspace_connect.py,sha256=LSZkkuPuHTqxvaTgqz_Y_kGIkF3Mmn_xwKf2h0uDWVg,7115
25
+ lgt_jobs/jobs/workspace_connect.py,sha256=qgjIRzAQRbJBx--eYsTtYgOUh2-p3N_-LIltfbJrYYo,7102
26
26
  lgt_jobs/lgt_common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  lgt_jobs/lgt_common/helpers.py,sha256=tJNrKJYPa_MBmfRVrpHryoOWe4gnv7xOlmHuTh-bMBw,428
28
28
  lgt_jobs/lgt_common/lgt_logging.py,sha256=Zxr2sPpY-qU_YbL_47OM6dE_JA1ejG_Vr1PNnjF_jwo,576
29
29
  lgt_jobs/lgt_common/discord_client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
- lgt_jobs/lgt_common/discord_client/discord_client.py,sha256=_zX7yfDi6ShNuA3zhuDvf9TZacJwGPX0Tcu1OIAmj_U,2540
30
+ lgt_jobs/lgt_common/discord_client/discord_client.py,sha256=tvRn0P039Dp5d22-DivQhP2uQMC7ixZc7oe7IA4WrPE,2442
31
31
  lgt_jobs/lgt_common/discord_client/methods.py,sha256=C46Vq9_-dlvs0nEW6ck8QvAmE_nPUfU89MJUhHaPMLk,391
32
32
  lgt_jobs/lgt_common/enums/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  lgt_jobs/lgt_common/enums/slack_errors.py,sha256=nK7uoguq0F8bIHROp73oeszehT7CgS_VU45n9_Gq_WY,172
@@ -39,16 +39,16 @@ lgt_jobs/lgt_common/slack_client/methods.py,sha256=ctKF_1UHEmSWaRsoGEgMZicVabV7e
39
39
  lgt_jobs/lgt_common/slack_client/slack_client.py,sha256=icHapSOszFYnSofJ-eWl4lUWSOqng6S9XSRFfMx87Rg,13836
40
40
  lgt_jobs/lgt_common/slack_client/web_client.py,sha256=JrkEepL6EhEtX3Psv_sd25bcRB2P23LoGnFHcczQpnc,4778
41
41
  lgt_jobs/lgt_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
- lgt_jobs/lgt_data/analytics.py,sha256=fiN88zcIxs_bRMmXL7ftp4FvBeJ5I7QBPE4tbwKJ39E,21689
42
+ lgt_jobs/lgt_data/analytics.py,sha256=TFUffL8Dn-vIJ3ZaCVN-cj1Qnjb8F9GJyuk6Fo7mR1s,21645
43
43
  lgt_jobs/lgt_data/engine.py,sha256=Rsbz-CApAo_TVDssdjBkv8v_fVOZm_Uh1S6W4fnaEWo,7728
44
44
  lgt_jobs/lgt_data/enums.py,sha256=jBH5WGBtDAvFrh4iiPIzlQ-XrImMpuwqstuasG55mJ0,2209
45
45
  lgt_jobs/lgt_data/helpers.py,sha256=NDa-V5EYaJfkGoWsmQSwSe6N_jxNxs8tHRQzW1iST6k,480
46
- lgt_jobs/lgt_data/model.py,sha256=G_x0C7mR__OtM_ps2X5_Rg7iK1ijh4iCYbavsLxdaqA,28652
46
+ lgt_jobs/lgt_data/model.py,sha256=QAWnCPHEoNdXaPPCgMi_tHLx11zj0xcGUUUg2CDS3DQ,28554
47
47
  lgt_jobs/lgt_data/mongo_repository.py,sha256=kLE906lfqhHF9gp1qvH_3XKCZGCZnxjLMrBLWBy7doo,46099
48
48
  lgt_jobs/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
49
  lgt_jobs/services/web_client.py,sha256=GLWsJkIC8rv6xLFaLwcMm4EwBlVDu0njORwkZqBJaE4,2086
50
50
  lgt_jobs/templates/new_message.html,sha256=dZl8UmdAOOMq4nidvAgMFroSrTV7Pw0RWt2yLp_2idg,6989
51
- leadguru_jobs-0.584.0.dist-info/METADATA,sha256=908hY0c8mcnidsnn9K3u_3wWpOoeVbRXvy6v6Q4ToOA,1319
52
- leadguru_jobs-0.584.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
53
- leadguru_jobs-0.584.0.dist-info/top_level.txt,sha256=rIuw1DqwbnZyeoarBSC-bYeGOhv9mZBs7_afl9q4_JI,9
54
- leadguru_jobs-0.584.0.dist-info/RECORD,,
51
+ leadguru_jobs-0.586.0.dist-info/METADATA,sha256=nQOygMxPU916N2ufLOUtLfKM2-_HXSvTNlmuAR3B_k8,1319
52
+ leadguru_jobs-0.586.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
53
+ leadguru_jobs-0.586.0.dist-info/top_level.txt,sha256=rIuw1DqwbnZyeoarBSC-bYeGOhv9mZBs7_afl9q4_JI,9
54
+ leadguru_jobs-0.586.0.dist-info/RECORD,,
@@ -32,7 +32,6 @@ class BotStatsUpdateJob(BaseBackgroundJob, ABC):
32
32
  bots_rep = DedicatedBotRepository()
33
33
  users_rep = UserMongoRepository()
34
34
  bot = bots_rep.get_one(id=data.bot_id, include_deleted=True)
35
- received_messages, filtered_messages = get_bots_aggregated_analytics(bot_ids=[str(bot.id)])
36
35
 
37
36
  if bot.source.source_type == SourceType.DISCORD:
38
37
  client = DiscordClient(bot.token)
@@ -72,8 +71,6 @@ class BotStatsUpdateJob(BaseBackgroundJob, ABC):
72
71
  if discord_server.icon:
73
72
  discord_server.icon = (f'https://cdn.discordapp.com/icons/{discord_server.id}/'
74
73
  f'{discord_server.icon}.png')
75
- discord_server.messages_received = received_messages.get(discord_server.id)
76
- discord_server.messages_filtered = filtered_messages.get(discord_server.id)
77
74
  time.sleep(random.randint(1, 2))
78
75
 
79
76
  bot.servers = discord_servers
@@ -110,6 +107,7 @@ class BotStatsUpdateJob(BaseBackgroundJob, ABC):
110
107
  bot.source.source_name = bot_name
111
108
  bot.slack_url = bot.registration_link = team_info['team']['url']
112
109
  bots_rep.add_or_update(bot)
110
+ received_messages, filtered_messages = get_bots_aggregated_analytics(bot_ids=[bot.id])
113
111
  try:
114
112
  channels_response = client.channels_list()
115
113
  except:
@@ -126,20 +124,23 @@ class BotStatsUpdateJob(BaseBackgroundJob, ABC):
126
124
  connected_channels = 0
127
125
  channels_users = {}
128
126
  active_channels = {}
127
+ users_count = 0
129
128
  for channel in channels:
130
129
  if channel['is_member']:
131
130
  active_channels[channel['id']] = channel['name']
132
131
  connected_channels += 1
133
132
  num_members = channel.get('num_members', 0)
134
133
  channels_users[channel['id']] = num_members
134
+ users_count += num_members
135
135
 
136
136
  bot.active_channels = active_channels
137
+ bot.messages_received = received_messages.get(bot.source.source_id, 0)
138
+ bot.messages_filtered = filtered_messages.get(bot.source.source_id, 0)
137
139
  bot.connected_channels = connected_channels
138
140
  bot.channels = len(channels)
139
141
  bot.channels_users = channels_users
140
142
  if bot.recent_messages is None:
141
143
  bot.recent_messages = []
142
- max_users_count = 0
143
144
  if bot.servers:
144
145
  channels = [Channel.from_dic(channel_dict) for channel_dict in channels]
145
146
  for channel in channels:
@@ -149,12 +150,8 @@ class BotStatsUpdateJob(BaseBackgroundJob, ABC):
149
150
  channel.subscribers = channels_users.get(slack_channel.id, 0)
150
151
  else:
151
152
  channel.active = channel.is_member
152
- if channel.subscribers > max_users_count:
153
- max_users_count = channel.subscribers
154
153
  bot.servers[0].channels = channels
155
- bot.servers[0].subscribers = max_users_count
156
- bot.servers[0].messages_received = received_messages.get(bot.source.source_id, 0)
157
- bot.servers[0].messages_filtered = filtered_messages.get(bot.source.source_id, 0)
154
+ bot.servers[0].subscribers = users_count
158
155
 
159
156
  # save only last 50 messages
160
157
  bot.recent_messages = bot.recent_messages[-50:]
@@ -7,7 +7,7 @@ from lgt_jobs.lgt_data.enums import StatusConnection, SourceType
7
7
  from lgt_jobs.lgt_data.model import UserWorkspace, SlackUser, DedicatedBotModel
8
8
  from lgt_jobs.lgt_data.mongo_repository import UserMongoRepository, DedicatedBotRepository
9
9
  from lgt_jobs.basejobs import BaseBackgroundJobData, BaseBackgroundJob
10
- from lgt_jobs.jobs.bot_stats_update import BotStatsUpdateJob, BotStatsUpdateJobData
10
+ from .bot_stats_update import BotStatsUpdateJob, BotStatsUpdateJobData
11
11
  from lgt_jobs.runner import BackgroundJobRunner
12
12
  import logging as log
13
13
  from pydantic import BaseModel
@@ -29,8 +29,7 @@ class DiscordClient:
29
29
  return {}
30
30
 
31
31
  def get_servers(self) -> list | dict:
32
- response = requests.get(f"{self.base_url}{DiscordMethods.USER_GUILDS.value}?with_counts=true",
33
- headers=self.headers)
32
+ response = requests.get(f"{self.base_url}{DiscordMethods.USER_GUILDS.value}", headers=self.headers)
34
33
  return self.__response(response).json()
35
34
 
36
35
  def get_dms(self) -> list | dict:
@@ -44,8 +43,7 @@ class DiscordClient:
44
43
  return response.json()
45
44
 
46
45
  def get_channels(self, guild_id: str) -> list | dict:
47
- response = requests.get(f"{self.base_url}{DiscordMethods.guild_channels(guild_id)}?with_counts=true",
48
- headers=self.headers)
46
+ response = requests.get(f"{self.base_url}{DiscordMethods.guild_channels(guild_id)}", headers=self.headers)
49
47
  return self.__response(response).json()
50
48
 
51
49
  def get_invite_link(self, channel_id: str) -> Response:
@@ -8,7 +8,7 @@ from lgt_jobs.lgt_data.mongo_repository import to_object_id
8
8
  from pymongo import MongoClient
9
9
 
10
10
  client = MongoClient(os.environ.get('MONGO_CONNECTION_STRING', 'mongodb://127.0.0.1:27017/'))
11
- db = client.get_database('lgt_admin')
11
+ db = client.lgt_admin
12
12
 
13
13
 
14
14
  def _build_date_aggregated_analytics_pipeline(source_id=None, email=None, started_at: datetime = None,
@@ -540,12 +540,12 @@ def get_bots_aggregated_analytics(from_date: datetime = None,
540
540
  if bot_ids is not None:
541
541
  pipeline.insert(0, {"$match": {"extra_ids": {"$in": bot_ids}}})
542
542
 
543
- received_messages = list(db.get_collection('received_messages').aggregate(pipeline))
543
+ received_messages = list(db[f'received_messages'].aggregate(pipeline))
544
544
 
545
545
  if configs is not None:
546
546
  pipeline.insert(0, {"$match": {"attributes": {"$in": configs}}})
547
547
 
548
- filtered_messages = list(db.get_collection('filtered_messages').aggregate(pipeline))
548
+ filtered_messages = list(db[f'filtered_messages'].aggregate(pipeline))
549
549
  received_messages_dic = OrderedDict()
550
550
  filtered_messages_dic = OrderedDict()
551
551
 
@@ -102,6 +102,8 @@ class BaseBotModel(Credentials):
102
102
  self.connected_channels = None
103
103
  self.channels_users = None
104
104
  self.users_count = None
105
+ self.messages_received: int = 0
106
+ self.messages_filtered: int = 0
105
107
  self.recent_messages: List[str] = []
106
108
  self.icon = None
107
109
  self.active_channels = {}
@@ -160,9 +162,6 @@ class Server:
160
162
  self.active = False
161
163
  self.deleted = False
162
164
  self.subscribers = 0
163
- self.approximate_member_count = 0
164
- self.messages_received: int = 0
165
- self.messages_filtered: int = 0
166
165
 
167
166
  @classmethod
168
167
  def from_dic(cls, dic: dict):
@@ -175,7 +174,6 @@ class Server:
175
174
  setattr(model, k, v)
176
175
 
177
176
  model.channels = [Channel.from_dic(channel) for channel in dic.get("channels", [])]
178
- model.subscribers = dic.get('approximate_member_count')
179
177
  return model
180
178
 
181
179
  def to_dic(self):
@@ -328,11 +326,11 @@ class UserModel(BaseModel):
328
326
  def subscription_expired(self):
329
327
  return self.subscription_expired_at.replace(tzinfo=UTC) < datetime.now(UTC)
330
328
 
331
- def get_slack_user(self, slack_email: str) -> SlackUser:
332
- return next(filter(lambda x: slack_email == x.email, self.slack_users), None)
329
+ def get_slack_user(self, slack_email: str):
330
+ return next(filter(lambda x: slack_email == x.email and not x.deleted, self.slack_users), None)
333
331
 
334
- def get_discord_user(self, login: str) -> DiscordUser:
335
- return next(filter(lambda x: login == x.login, self.discord_users), None)
332
+ def get_discord_user(self, login: str):
333
+ return next(filter(lambda x: login == x.login and not x.deleted, self.discord_users), None)
336
334
 
337
335
 
338
336
  class DiscordUser(DictionaryModel):
lgt_jobs/smtp.py CHANGED
@@ -2,7 +2,7 @@ from abc import ABC
2
2
  from pydantic import BaseModel
3
3
  import logging as log
4
4
  from lgt_jobs.basejobs import BaseBackgroundJobData, BaseBackgroundJob
5
- from lgt_jobs.env import smtp_login, smtp_password, smtp_host
5
+ from lgt_jobs.env import smtp_login, smtp_password
6
6
  from lgt_jobs.lgt_data.enums import ImageName
7
7
 
8
8
  """
@@ -14,7 +14,7 @@ class SendMailJobData(BaseBackgroundJobData, BaseModel):
14
14
  html: str
15
15
  subject: str
16
16
  recipient: str
17
- sender: str = "noreply@leadguru.co"
17
+ sender: str = "noreply@leadguru.io"
18
18
  images: list[ImageName] = []
19
19
 
20
20
 
@@ -24,13 +24,14 @@ class SendMailJob(BaseBackgroundJob, ABC):
24
24
  return SendMailJobData
25
25
 
26
26
  def exec(self, data: SendMailJobData):
27
- from redmail import EmailSender
28
- email = EmailSender(host=smtp_host, port=587, username=smtp_login, password=smtp_password, use_starttls=True)
27
+ from redmail import gmail
28
+ gmail.username = smtp_login
29
+ gmail.password = smtp_password
29
30
  body_image = {}
30
31
  for image in data.images:
31
32
  body_image[f'IMAGE_{ImageName(image.value).name}'] = f'lgt_jobs/assets/images/{image.value}'
32
33
 
33
- email.send(
34
+ gmail.send(
34
35
  sender=f"Leadguru <{data.sender}>",
35
36
  receivers=[data.recipient],
36
37
  subject=data.subject,