leadguru-jobs 0.702.0__py3-none-any.whl → 0.704.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.702.0
3
+ Version: 0.704.0
4
4
  Summary: LGT jobs builds
5
5
  Author-email: developer@leadguru.co
6
6
  Classifier: Development Status :: 5 - Production/Stable
@@ -1,7 +1,7 @@
1
1
  lgt_jobs/__init__.py,sha256=fQ97ZFeVtbOgODPdB26x7ku45AQPQ8ixeziiCAjNYZM,2451
2
2
  lgt_jobs/basejobs.py,sha256=LPEclvY6fIG17YMGy9pRK0Q58n62gkI5W1BTK6R2p-c,1234
3
- lgt_jobs/env.py,sha256=cRO03GGvstUjBsv3uYO-iakrOvAk_ZWUP_fnmf21iZQ,789
4
- lgt_jobs/main.py,sha256=cK_nkBtJHnUNDbba1WZotqPtI_6OWxiYQkAgco9OAmE,1539
3
+ lgt_jobs/env.py,sha256=HHlpQgZrRQMMuPZYhP94A8b29T_10sKRo98mh0_hh3Y,907
4
+ lgt_jobs/main.py,sha256=zd0TdwFBUXUmFfUw552rPt6Rd_uG-LWEE6wTs8TCxIk,2081
5
5
  lgt_jobs/runner.py,sha256=pS-Qwyfuk22aQ1Mk3p-Q0ysdZfKy1Bh9YoWBlDaLeM8,2234
6
6
  lgt_jobs/simple_job.py,sha256=EBxhre3749GEAzJyaV1GXYy3P0pzwHchxcZ2kSN1vWU,527
7
7
  lgt_jobs/smtp.py,sha256=k0qh-Qk9AeSU3WrCOVmuWkfpi9xzwaPMzbw9cED-pZw,1150
@@ -15,7 +15,7 @@ lgt_jobs/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
15
  lgt_jobs/jobs/analytics.py,sha256=IIsWt4A1qUw3w-S-8W16uKY1FRVWfXXA41_mu4uCNiM,979
16
16
  lgt_jobs/jobs/bot_stats_update.py,sha256=3gq1Ilj_RHddYeSny_238ITs7YIfCf7d4BmfYU8PKlo,8177
17
17
  lgt_jobs/jobs/bots_killer.py,sha256=s2f7kal4vAMJd9YaMQ1X3FkCrLWCKNb-bWeI9RZ1Oco,506
18
- lgt_jobs/jobs/chat_history.py,sha256=rj337uHT2XmyDu3oMPbnCBxSsRn4roxDNS0hsbvoI7I,5040
18
+ lgt_jobs/jobs/chat_history.py,sha256=H2ezntWSdtiE4KREL-RIHXKdDm2xs9PgEm-K8XKH9MA,4739
19
19
  lgt_jobs/jobs/connect_sources.py,sha256=vOKu2Q9cmQsj4VMVzOoEJkD1wzE9XurbIChx35rES8I,4957
20
20
  lgt_jobs/jobs/inbox_leads.py,sha256=S6sGXePmWDsT8FvtFOBi3BJALtaDlF6aaQZsHntzHm0,4958
21
21
  lgt_jobs/jobs/load_slack_people.py,sha256=SaDpp3JCNVKcyZ2WSJ9TyP5lUUZJnGlPUyWdRNzfMkU,4183
@@ -108,7 +108,7 @@ lgt_jobs/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
108
108
  lgt_jobs/services/k8_manager.py,sha256=bXpka9psIQ5UJ6QG_e4xolmE_3gtmNrzzZeL03bJ62I,995
109
109
  lgt_jobs/services/web_client.py,sha256=oMyWJxwGeIe3f40fPT7xcisjDg3BhA3Ipf8dr1jVT-Y,1549
110
110
  lgt_jobs/templates/new_message.html,sha256=dZl8UmdAOOMq4nidvAgMFroSrTV7Pw0RWt2yLp_2idg,6989
111
- leadguru_jobs-0.702.0.dist-info/METADATA,sha256=KXsfGYtQ67w0SvI_5YpmqKCZFrG8z4hxX50_S72JDUs,1317
112
- leadguru_jobs-0.702.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
113
- leadguru_jobs-0.702.0.dist-info/top_level.txt,sha256=rIuw1DqwbnZyeoarBSC-bYeGOhv9mZBs7_afl9q4_JI,9
114
- leadguru_jobs-0.702.0.dist-info/RECORD,,
111
+ leadguru_jobs-0.704.0.dist-info/METADATA,sha256=gVXND-kRORqj8cVPzvl23D7WNbSr8pbR888L_KVPVpM,1317
112
+ leadguru_jobs-0.704.0.dist-info/WHEEL,sha256=A3WOREP4zgxI0fKrHUG8DC8013e3dK3n7a6HDbcEIwE,91
113
+ leadguru_jobs-0.704.0.dist-info/top_level.txt,sha256=rIuw1DqwbnZyeoarBSC-bYeGOhv9mZBs7_afl9q4_JI,9
114
+ leadguru_jobs-0.704.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.6.0)
2
+ Generator: setuptools (75.7.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
lgt_jobs/env.py CHANGED
@@ -2,7 +2,7 @@ import os
2
2
 
3
3
  project_id = os.environ.get('PROJECT_ID')
4
4
  background_jobs_topic = os.environ.get('BACKGROUND_JOBS_TOPIC')
5
- background_jobs_subscriber = os.environ.get('BACKGROUND_JOBS_SUBSCRIBER')
5
+ background_jobs_subscriber = os.environ.get('BACKGROUND_JOBS_SUBSCRIBER', 'subscriber')
6
6
  mongo_connection_string = os.environ.get('MONGO_CONNECTION_STRING')
7
7
  smtp_host = os.environ.get('SMTP_HOST')
8
8
  smtp_login = os.environ.get('SMTP_LOGIN')
@@ -14,3 +14,5 @@ service_account_password = os.environ.get('SERVICE_ACCOUNT_PASSWORD')
14
14
  v2_server_host = os.environ.get('V2_SERVER_HOST')
15
15
  v3_server_host = os.environ.get('V3_SERVER_HOST')
16
16
  v1_server_host = os.environ.get('V1_SERVER_HOST')
17
+ max_messages = int(os.environ.get('MAX_MESSAGES', 10))
18
+ pool_size = int(os.environ.get('POOL_SIZE', 10))
@@ -33,9 +33,6 @@ class LoadChatHistoryJob(BaseBackgroundJob, ABC):
33
33
 
34
34
  def exec(self, data: LoadChatHistoryJobData):
35
35
  user = UserMongoRepository().get(data.user_id)
36
- if user.subscription_expired_at.replace(tzinfo=UTC) < datetime.now(UTC):
37
- log.info(f"[LoadChatHistoryJob]: {user.email} has expired subscription")
38
- return
39
36
  bots = DedicatedBotRepository().get_all(only_valid=True, user_id=user.id, source_type=SourceType.SLACK)
40
37
  if not bots:
41
38
  return
@@ -47,7 +44,6 @@ class LoadChatHistoryJob(BaseBackgroundJob, ABC):
47
44
  if not contacts:
48
45
  continue
49
46
 
50
- log.info(f"[LoadChatHistoryJob]: processing {len(contacts)} contacts for user: {user.email}")
51
47
  for contact in contacts:
52
48
  message = self._update_history(contact=contact, bot=bot)
53
49
 
@@ -93,7 +89,7 @@ class LoadChatHistoryJob(BaseBackgroundJob, ABC):
93
89
 
94
90
  messages = history.get('messages', [])
95
91
  if not messages:
96
- return None
92
+ return
97
93
 
98
94
  messages = [ChatMessage.from_slack_response(bot, m, contact.sender_id) for m in messages]
99
95
  new_messages = self._get_new_messages(contact, bot, messages)
@@ -106,4 +102,4 @@ class LoadChatHistoryJob(BaseBackgroundJob, ABC):
106
102
  self.user_leads_repo.update_many_by_sender_id(contact.sender_id, last_action_at=now)
107
103
  return new_messages[-1]
108
104
 
109
- return None
105
+ return
lgt_jobs/main.py CHANGED
@@ -1,35 +1,28 @@
1
1
  import json
2
- import sys
3
- import threading
4
- import time
2
+ import traceback
3
+
4
+ from concurrent.futures import ThreadPoolExecutor
5
+
5
6
  from lgt_common.pubsub.pubsubfactory import PubSubFactory
6
7
  import logging as log
7
8
  from lgt_jobs.env import project_id, background_jobs_topic, background_jobs_subscriber
8
9
  from lgt_jobs.runner import BackgroundJobRunner
9
- from lgt_jobs import jobs_map
10
+ from lgt_jobs import jobs_map, env
10
11
  import google.cloud.logging
11
-
12
- lock = threading.Lock()
12
+ from google.cloud.pubsub_v1 import SubscriberClient
13
+ from google.cloud.pubsub_v1.types import FlowControl
14
+ from google.cloud.pubsub_v1.subscriber.scheduler import ThreadScheduler
13
15
 
14
16
 
15
- def run_background_job(data):
17
+ def callback(message):
16
18
  try:
19
+ data = json.loads(message.data)
17
20
  log.info(f"[JOB]: {data} [START]")
18
21
  BackgroundJobRunner.run(jobs_map=jobs_map, data=data)
19
22
  log.info(f"[JOB]: {data} [FINISHED]")
20
- except Exception:
21
- raise
22
-
23
-
24
- def run_background_job_with_lock(message):
25
- try:
26
- data = json.loads(message.data)
27
- with lock:
28
- run_background_job(data)
29
- except:
30
- import traceback
31
- log.error(f"[ERROR][JOB]: {message.data} [ERROR] {traceback.format_exception(*sys.exc_info())} ")
32
- traceback.print_exception(*sys.exc_info())
23
+ except Exception as exception:
24
+ log.error(f"[ERROR][JOB]: {message.data} [ERROR] {traceback.format_exception(exception)} ")
25
+ traceback.print_exception(exception)
33
26
  finally:
34
27
  # accept message any way
35
28
  message.ack()
@@ -41,7 +34,20 @@ if __name__ == '__main__':
41
34
  factory = PubSubFactory(project_id)
42
35
  factory.create_topic_if_doesnt_exist(background_jobs_topic)
43
36
  factory.create_subscription_if_doesnt_exist(background_jobs_subscriber, background_jobs_topic, 600)
44
- bot_subscription_path = factory.get_subscription_path(background_jobs_subscriber, background_jobs_topic)
45
- factory.subscriber.subscribe(bot_subscription_path, callback=run_background_job_with_lock)
46
- while True:
47
- time.sleep(1)
37
+ subscription_path = factory.get_subscription_path(background_jobs_subscriber, background_jobs_topic)
38
+ # Launching a subscription
39
+ future = SubscriberClient().subscribe(
40
+ subscription_path,
41
+ callback=callback,
42
+ flow_control=FlowControl(max_messages=env.max_messages),
43
+ scheduler=ThreadScheduler(executor=ThreadPoolExecutor(max_workers=env.pool_size))
44
+ )
45
+
46
+ log.info(f"Subscription to {subscription_path} started. We are waiting for a message..\n")
47
+
48
+ try:
49
+ future.result() # Block the current thread until an exception occurs
50
+ except Exception as exception:
51
+ log.error(f"[ERROR][SUBSCRIBER]: {traceback.format_exception(exception)}")
52
+ traceback.print_exception(exception)
53
+ future.cancel()