leadguru-jobs 0.638.0__tar.gz → 0.640.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 (119) hide show
  1. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/PKG-INFO +1 -1
  2. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/leadguru_jobs.egg-info/PKG-INFO +1 -1
  3. leadguru_jobs-0.640.0/leadguru_jobs.egg-info/SOURCES.txt +115 -0
  4. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/jobs/bot_stats_update.py +2 -10
  5. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/jobs/chat_history.py +3 -6
  6. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/jobs/connect_sources.py +4 -1
  7. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/jobs/inbox_leads.py +6 -2
  8. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/jobs/load_slack_people.py +2 -1
  9. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/jobs/send_slack_message.py +1 -1
  10. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/jobs/update_slack_profile.py +2 -1
  11. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/jobs/workspace_connect.py +3 -1
  12. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/base.py +29 -0
  13. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/boards/__init__.py +0 -0
  14. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/boards/board.py +39 -0
  15. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/boards/status.py +14 -0
  16. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/bots/__init__.py +0 -0
  17. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/bots/base_bot.py +44 -0
  18. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/bots/bot_info.py +33 -0
  19. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/bots/dedicated_bot.py +90 -0
  20. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/chat/__init__.py +0 -0
  21. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/chat/file.py +8 -0
  22. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/chat/grouped_messages.py +17 -0
  23. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/chat/message.py +85 -0
  24. leadguru_jobs-0.638.0/lgt_jobs/lgt_data/models/message_request.py → leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/chat/request.py +2 -1
  25. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/chat/scheduled_message.py +14 -0
  26. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/contacts/__init__.py +0 -0
  27. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/contacts/contact.py +22 -0
  28. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/external/__init__.py +0 -0
  29. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/external/cloud/__init__.py +0 -0
  30. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/external/cloud/file.py +18 -0
  31. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/external/discord/__init__.py +0 -0
  32. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/external/discord/user.py +45 -0
  33. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/external/slack/__init__.py +0 -0
  34. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/external/slack/timezone.py +8 -0
  35. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/external/slack/user.py +43 -0
  36. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/external/user_workspace.py +32 -0
  37. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/leads/__init__.py +0 -0
  38. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/leads/config.py +13 -0
  39. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/leads/extended_lead.py +46 -0
  40. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/leads/lead.py +48 -0
  41. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/leads/message.py +51 -0
  42. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/notifications/__init__.py +0 -0
  43. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/notifications/notification.py +248 -0
  44. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/notifications/notification_settings.py +52 -0
  45. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/people/__init__.py +0 -0
  46. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/people/people.py +75 -0
  47. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/people/profile.py +13 -0
  48. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/post/__init__.py +0 -0
  49. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/post/message.py +18 -0
  50. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/post/post.py +15 -0
  51. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/templates/__init__.py +0 -0
  52. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/templates/template.py +12 -0
  53. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/user/__init__.py +0 -0
  54. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/user/feature.py +10 -0
  55. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/user/general_settings.py +9 -0
  56. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/user/reset_password.py +7 -0
  57. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/user/subscription.py +22 -0
  58. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/user/user.py +95 -0
  59. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/user/user_follow_ups.py +20 -0
  60. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/user/user_page.py +19 -0
  61. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/user/verification.py +12 -0
  62. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/user_leads/__init__.py +0 -0
  63. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/user_leads/extended_user_lead.py +41 -0
  64. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models/user_leads/user_lead.py +33 -0
  65. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/lgt_data/mongo_repository.py +225 -45
  66. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/repositories/__init__.py +0 -0
  67. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/repositories/post/__init__.py +0 -0
  68. leadguru_jobs-0.640.0/lgt_jobs/lgt_data/repositories/post/posts.py +28 -0
  69. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/runner.py +2 -2
  70. leadguru_jobs-0.640.0/lgt_jobs/services/__init__.py +0 -0
  71. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/simple_job.py +1 -1
  72. leadguru_jobs-0.638.0/leadguru_jobs.egg-info/SOURCES.txt +0 -61
  73. leadguru_jobs-0.638.0/lgt_jobs/lgt_common/lgt_logging.py +0 -15
  74. leadguru_jobs-0.638.0/lgt_jobs/lgt_data/model.py +0 -1136
  75. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/MANIFEST.in +0 -0
  76. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/README.md +0 -0
  77. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/leadguru_jobs.egg-info/dependency_links.txt +0 -0
  78. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/leadguru_jobs.egg-info/not-zip-safe +0 -0
  79. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/leadguru_jobs.egg-info/requires.txt +0 -0
  80. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/leadguru_jobs.egg-info/top_level.txt +0 -0
  81. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/__init__.py +0 -0
  82. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/assets/images/arrow.png +0 -0
  83. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/assets/images/firework.png +0 -0
  84. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/assets/images/lock.png +0 -0
  85. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/assets/images/logo.png +0 -0
  86. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/assets/images/mail.png +0 -0
  87. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/basejobs.py +0 -0
  88. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/env.py +0 -0
  89. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/jobs/__init__.py +0 -0
  90. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/jobs/analytics.py +0 -0
  91. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/jobs/mass_message.py +0 -0
  92. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/jobs/send_code.py +0 -0
  93. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/lgt_common/__init__.py +0 -0
  94. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/lgt_common/discord_client/__init__.py +0 -0
  95. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/lgt_common/discord_client/discord_client.py +0 -0
  96. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/lgt_common/discord_client/methods.py +0 -0
  97. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/lgt_common/enums/__init__.py +0 -0
  98. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/lgt_common/enums/slack_errors.py +0 -0
  99. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/lgt_common/helpers.py +0 -0
  100. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/lgt_common/pubsub/__init__.py +0 -0
  101. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/lgt_common/pubsub/messages.py +0 -0
  102. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/lgt_common/pubsub/pubsubfactory.py +0 -0
  103. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/lgt_common/slack_client/__init__.py +0 -0
  104. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/lgt_common/slack_client/methods.py +0 -0
  105. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/lgt_common/slack_client/slack_client.py +0 -0
  106. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/lgt_common/slack_client/web_client.py +0 -0
  107. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/lgt_data/__init__.py +0 -0
  108. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/lgt_data/analytics.py +0 -0
  109. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/lgt_data/engine.py +0 -0
  110. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/lgt_data/enums.py +0 -0
  111. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/lgt_data/helpers.py +0 -0
  112. /leadguru_jobs-0.638.0/lgt_jobs/lgt_data/models/__init__.py → /leadguru_jobs-0.640.0/lgt_jobs/lgt_data/model.py +0 -0
  113. {leadguru_jobs-0.638.0/lgt_jobs/services → leadguru_jobs-0.640.0/lgt_jobs/lgt_data/models}/__init__.py +0 -0
  114. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/main.py +0 -0
  115. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/services/web_client.py +0 -0
  116. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/smtp.py +0 -0
  117. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/lgt_jobs/templates/new_message.html +0 -0
  118. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/setup.cfg +0 -0
  119. {leadguru_jobs-0.638.0 → leadguru_jobs-0.640.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: leadguru_jobs
3
- Version: 0.638.0
3
+ Version: 0.640.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.638.0
3
+ Version: 0.640.0
4
4
  Summary: LGT jobs builds
5
5
  Author-email: developer@leadguru.co
6
6
  Classifier: Development Status :: 5 - Production/Stable
@@ -0,0 +1,115 @@
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/assets/images/arrow.png
19
+ lgt_jobs/assets/images/firework.png
20
+ lgt_jobs/assets/images/lock.png
21
+ lgt_jobs/assets/images/logo.png
22
+ lgt_jobs/assets/images/mail.png
23
+ lgt_jobs/jobs/__init__.py
24
+ lgt_jobs/jobs/analytics.py
25
+ lgt_jobs/jobs/bot_stats_update.py
26
+ lgt_jobs/jobs/chat_history.py
27
+ lgt_jobs/jobs/connect_sources.py
28
+ lgt_jobs/jobs/inbox_leads.py
29
+ lgt_jobs/jobs/load_slack_people.py
30
+ lgt_jobs/jobs/mass_message.py
31
+ lgt_jobs/jobs/send_code.py
32
+ lgt_jobs/jobs/send_slack_message.py
33
+ lgt_jobs/jobs/update_slack_profile.py
34
+ lgt_jobs/jobs/workspace_connect.py
35
+ lgt_jobs/lgt_common/__init__.py
36
+ lgt_jobs/lgt_common/helpers.py
37
+ lgt_jobs/lgt_common/discord_client/__init__.py
38
+ lgt_jobs/lgt_common/discord_client/discord_client.py
39
+ lgt_jobs/lgt_common/discord_client/methods.py
40
+ lgt_jobs/lgt_common/enums/__init__.py
41
+ lgt_jobs/lgt_common/enums/slack_errors.py
42
+ lgt_jobs/lgt_common/pubsub/__init__.py
43
+ lgt_jobs/lgt_common/pubsub/messages.py
44
+ lgt_jobs/lgt_common/pubsub/pubsubfactory.py
45
+ lgt_jobs/lgt_common/slack_client/__init__.py
46
+ lgt_jobs/lgt_common/slack_client/methods.py
47
+ lgt_jobs/lgt_common/slack_client/slack_client.py
48
+ lgt_jobs/lgt_common/slack_client/web_client.py
49
+ lgt_jobs/lgt_data/__init__.py
50
+ lgt_jobs/lgt_data/analytics.py
51
+ lgt_jobs/lgt_data/engine.py
52
+ lgt_jobs/lgt_data/enums.py
53
+ lgt_jobs/lgt_data/helpers.py
54
+ lgt_jobs/lgt_data/model.py
55
+ lgt_jobs/lgt_data/mongo_repository.py
56
+ lgt_jobs/lgt_data/models/__init__.py
57
+ lgt_jobs/lgt_data/models/base.py
58
+ lgt_jobs/lgt_data/models/boards/__init__.py
59
+ lgt_jobs/lgt_data/models/boards/board.py
60
+ lgt_jobs/lgt_data/models/boards/status.py
61
+ lgt_jobs/lgt_data/models/bots/__init__.py
62
+ lgt_jobs/lgt_data/models/bots/base_bot.py
63
+ lgt_jobs/lgt_data/models/bots/bot_info.py
64
+ lgt_jobs/lgt_data/models/bots/dedicated_bot.py
65
+ lgt_jobs/lgt_data/models/chat/__init__.py
66
+ lgt_jobs/lgt_data/models/chat/file.py
67
+ lgt_jobs/lgt_data/models/chat/grouped_messages.py
68
+ lgt_jobs/lgt_data/models/chat/message.py
69
+ lgt_jobs/lgt_data/models/chat/request.py
70
+ lgt_jobs/lgt_data/models/chat/scheduled_message.py
71
+ lgt_jobs/lgt_data/models/contacts/__init__.py
72
+ lgt_jobs/lgt_data/models/contacts/contact.py
73
+ lgt_jobs/lgt_data/models/external/__init__.py
74
+ lgt_jobs/lgt_data/models/external/user_workspace.py
75
+ lgt_jobs/lgt_data/models/external/cloud/__init__.py
76
+ lgt_jobs/lgt_data/models/external/cloud/file.py
77
+ lgt_jobs/lgt_data/models/external/discord/__init__.py
78
+ lgt_jobs/lgt_data/models/external/discord/user.py
79
+ lgt_jobs/lgt_data/models/external/slack/__init__.py
80
+ lgt_jobs/lgt_data/models/external/slack/timezone.py
81
+ lgt_jobs/lgt_data/models/external/slack/user.py
82
+ lgt_jobs/lgt_data/models/leads/__init__.py
83
+ lgt_jobs/lgt_data/models/leads/config.py
84
+ lgt_jobs/lgt_data/models/leads/extended_lead.py
85
+ lgt_jobs/lgt_data/models/leads/lead.py
86
+ lgt_jobs/lgt_data/models/leads/message.py
87
+ lgt_jobs/lgt_data/models/notifications/__init__.py
88
+ lgt_jobs/lgt_data/models/notifications/notification.py
89
+ lgt_jobs/lgt_data/models/notifications/notification_settings.py
90
+ lgt_jobs/lgt_data/models/people/__init__.py
91
+ lgt_jobs/lgt_data/models/people/people.py
92
+ lgt_jobs/lgt_data/models/people/profile.py
93
+ lgt_jobs/lgt_data/models/post/__init__.py
94
+ lgt_jobs/lgt_data/models/post/message.py
95
+ lgt_jobs/lgt_data/models/post/post.py
96
+ lgt_jobs/lgt_data/models/templates/__init__.py
97
+ lgt_jobs/lgt_data/models/templates/template.py
98
+ lgt_jobs/lgt_data/models/user/__init__.py
99
+ lgt_jobs/lgt_data/models/user/feature.py
100
+ lgt_jobs/lgt_data/models/user/general_settings.py
101
+ lgt_jobs/lgt_data/models/user/reset_password.py
102
+ lgt_jobs/lgt_data/models/user/subscription.py
103
+ lgt_jobs/lgt_data/models/user/user.py
104
+ lgt_jobs/lgt_data/models/user/user_follow_ups.py
105
+ lgt_jobs/lgt_data/models/user/user_page.py
106
+ lgt_jobs/lgt_data/models/user/verification.py
107
+ lgt_jobs/lgt_data/models/user_leads/__init__.py
108
+ lgt_jobs/lgt_data/models/user_leads/extended_user_lead.py
109
+ lgt_jobs/lgt_data/models/user_leads/user_lead.py
110
+ lgt_jobs/lgt_data/repositories/__init__.py
111
+ lgt_jobs/lgt_data/repositories/post/__init__.py
112
+ lgt_jobs/lgt_data/repositories/post/posts.py
113
+ lgt_jobs/services/__init__.py
114
+ lgt_jobs/services/web_client.py
115
+ lgt_jobs/templates/new_message.html
@@ -1,12 +1,12 @@
1
1
  import random
2
2
  import time
3
3
  from abc import ABC
4
- from datetime import datetime, UTC, timedelta
5
4
  from typing import Optional
6
5
  from lgt_jobs.lgt_common.discord_client.discord_client import DiscordClient
7
6
  from lgt_jobs.lgt_common.slack_client.web_client import SlackWebClient
8
7
  from lgt_jobs.lgt_data.enums import SourceType
9
- from lgt_jobs.lgt_data.model import DedicatedBotModel, Server, Channel, DiscordUser
8
+ from lgt_jobs.lgt_data.models.bots.dedicated_bot import Server, Channel, DedicatedBotModel
9
+ from lgt_jobs.lgt_data.models.external.discord.user import DiscordUser
10
10
  from lgt_jobs.lgt_data.mongo_repository import (DedicatedBotRepository, UserMongoRepository, SlackContactUserRepository,
11
11
  LeadMongoRepository, UserLeadMongoRepository)
12
12
  from pydantic import BaseModel
@@ -33,15 +33,7 @@ class BotStatsUpdateJob(BaseBackgroundJob, ABC):
33
33
  bots_rep = DedicatedBotRepository()
34
34
  users_rep = UserMongoRepository()
35
35
  bot = bots_rep.get_one(id=data.bot_id, include_deleted=True)
36
-
37
36
  user = users_rep.get(bot.user_id)
38
- if user.subscription_expired_at.replace(tzinfo=UTC) < (datetime.now(UTC) - timedelta(7)):
39
- bot.deleted = True
40
- for server in bot.servers:
41
- server.deleted = True
42
- bots_rep.add_or_update(bot)
43
- return
44
-
45
37
  received_messages, filtered_messages = get_bots_aggregated_analytics(bot_ids=[str(bot.id)])
46
38
 
47
39
  if bot.source.source_type == SourceType.DISCORD:
@@ -3,7 +3,9 @@ from abc import ABC
3
3
  from typing import Optional, List
4
4
  import logging as log
5
5
  from lgt_jobs.lgt_common.slack_client.web_client import SlackWebClient
6
- from lgt_jobs.lgt_data.model import ChatMessage, UserContact, DedicatedBotModel
6
+ from lgt_jobs.lgt_data.models.bots.dedicated_bot import DedicatedBotModel
7
+ from lgt_jobs.lgt_data.models.chat.message import ChatMessage
8
+ from lgt_jobs.lgt_data.models.contacts.contact import UserContact
7
9
  from lgt_jobs.lgt_data.mongo_repository import UserMongoRepository, DedicatedBotRepository, UserContactsRepository, \
8
10
  ChatRepository, UserLeadMongoRepository
9
11
  from pydantic import BaseModel
@@ -39,7 +41,6 @@ class LoadChatHistoryJob(BaseBackgroundJob, ABC):
39
41
  return
40
42
  last_message = None
41
43
  last_message_contact = None
42
- last_message_bot = None
43
44
  contacts_groups = self.contacts_repo.find_grouped_actual_contacts(user.id, spam=False, with_chat_only=False)
44
45
  for bot in bots:
45
46
  contacts = contacts_groups.get(bot.source.source_id)
@@ -54,12 +55,10 @@ class LoadChatHistoryJob(BaseBackgroundJob, ABC):
54
55
  continue
55
56
 
56
57
  if not last_message:
57
- last_message_bot = bot
58
58
  last_message = message
59
59
  last_message_contact = contact
60
60
 
61
61
  if message.created_at > last_message.created_at and message.user == contact.sender_id:
62
- last_message_bot = bot
63
62
  last_message = message
64
63
  last_message_contact = contact
65
64
 
@@ -67,8 +66,6 @@ class LoadChatHistoryJob(BaseBackgroundJob, ABC):
67
66
  has_to_be_notified = (not last_notification or (last_message and last_message.created_at > last_notification))
68
67
  if last_message and has_to_be_notified and last_message.user == last_message_contact.sender_id:
69
68
  user.notification_settings.incoming_messages.need_to_notify = True
70
- user.notification_settings.incoming_messages.attributes = [last_message_contact.sender_id,
71
- last_message_bot.source.source_id]
72
69
  UserMongoRepository().set(data.user_id, notification_settings=user.notification_settings.to_dic())
73
70
 
74
71
  def _get_new_messages(self, contact: UserContact, bot: DedicatedBotModel, slack_chat: List[ChatMessage]):
@@ -5,10 +5,13 @@ import logging as log
5
5
  from lgt_jobs.jobs.load_slack_people import LoadSlackPeopleJob, LoadSlackPeopleJobData
6
6
  from lgt_jobs.basejobs import BaseBackgroundJob, BaseBackgroundJobData
7
7
  from lgt_jobs.jobs.bot_stats_update import BotStatsUpdateJob, BotStatsUpdateJobData
8
+ from lgt_jobs.lgt_data.models.base import BaseModel
9
+ from lgt_jobs.lgt_data.models.bots.base_bot import Source
10
+ from lgt_jobs.lgt_data.models.bots.dedicated_bot import DedicatedBotModel, Server
11
+ from lgt_jobs.lgt_data.models.external.slack.user import SlackUser
8
12
  from lgt_jobs.runner import BackgroundJobRunner
9
13
  from lgt_jobs.lgt_data.engine import UserTrackAction
10
14
  from lgt_jobs.lgt_data.enums import SourceType, UserAction, StatusConnection
11
- from lgt_jobs.lgt_data.model import BaseModel, DedicatedBotModel, Server, Source, SlackUser
12
15
  from lgt_jobs.lgt_data.mongo_repository import DedicatedBotRepository, UserMongoRepository
13
16
 
14
17
 
@@ -1,8 +1,10 @@
1
1
  from abc import ABC
2
2
  import logging as log
3
3
  from lgt_jobs.lgt_common.slack_client.web_client import SlackWebClient
4
- from lgt_jobs.lgt_data.model import UserModel, DedicatedBotModel, SlackMemberInformation
5
- from lgt_jobs.lgt_data.models.message_request import MessageRequest
4
+ from lgt_jobs.lgt_data.models.bots.dedicated_bot import DedicatedBotModel
5
+ from lgt_jobs.lgt_data.models.chat.request import MessageRequest
6
+ from lgt_jobs.lgt_data.models.people.people import SlackMemberInformation
7
+ from lgt_jobs.lgt_data.models.user.user import UserModel
6
8
  from lgt_jobs.lgt_data.mongo_repository import UserMongoRepository, DedicatedBotRepository, \
7
9
  SlackContactUserRepository, UserContactsRepository, MessageRequestsRepository
8
10
  from pydantic import BaseModel
@@ -84,6 +86,8 @@ class InboxLeadsJob(BaseBackgroundJob, ABC):
84
86
  if not sender_request:
85
87
  log.info(f"[InboxLeadsJob]: New message request from {sender_id} for user: {user.email}")
86
88
  requests_repo.upsert(user.id, sender_id, message_request)
89
+ user.notification_settings.inbox.need_to_notify = True
90
+ UserMongoRepository().set(user.id, notification_settings=user.notification_settings.to_dic())
87
91
 
88
92
  @staticmethod
89
93
  def create_people(slack_profile: dict, dedicated_bot: DedicatedBotModel):
@@ -1,7 +1,8 @@
1
1
  from abc import ABC
2
2
  from lgt_jobs.lgt_common.enums.slack_errors import SlackErrors
3
3
  from lgt_jobs.lgt_common.slack_client.slack_client import SlackClient
4
- from lgt_jobs.lgt_data.model import Source, SlackMemberInformation
4
+ from lgt_jobs.lgt_data.models.bots.base_bot import Source
5
+ from lgt_jobs.lgt_data.models.people.people import SlackMemberInformation
5
6
  from lgt_jobs.lgt_data.mongo_repository import DedicatedBotRepository, SlackContactUserRepository
6
7
  import logging as log
7
8
  from pydantic import BaseModel
@@ -3,7 +3,7 @@ from abc import ABC
3
3
  from typing import Optional
4
4
  import logging as log
5
5
  from lgt_jobs.lgt_common.slack_client.web_client import SlackWebClient
6
- from lgt_jobs.lgt_data.model import ChatMessage
6
+ from lgt_jobs.lgt_data.models.chat.message import ChatMessage
7
7
  from lgt_jobs.lgt_data.mongo_repository import DedicatedBotRepository, UserContactsRepository, ChatRepository
8
8
  from pydantic import BaseModel
9
9
  from lgt_jobs.basejobs import BaseBackgroundJobData, BaseBackgroundJob
@@ -2,7 +2,8 @@ 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 Profile, SlackUser
5
+ from lgt_jobs.lgt_data.models.external.slack.user import SlackUser
6
+ from lgt_jobs.lgt_data.models.people.profile import Profile
6
7
  from lgt_jobs.lgt_data.mongo_repository import UserMongoRepository, DedicatedBotRepository
7
8
  from pydantic import BaseModel
8
9
  from lgt_jobs.basejobs import BaseBackgroundJobData, BaseBackgroundJob
@@ -4,7 +4,9 @@ import requests
4
4
  from lgt_jobs.lgt_common.helpers import update_credentials
5
5
  from lgt_jobs.lgt_common.slack_client.web_client import SlackWebClient
6
6
  from lgt_jobs.lgt_data.enums import StatusConnection, SourceType
7
- from lgt_jobs.lgt_data.model import UserWorkspace, SlackUser, DedicatedBotModel
7
+ from lgt_jobs.lgt_data.models.bots.dedicated_bot import DedicatedBotModel
8
+ from lgt_jobs.lgt_data.models.external.slack.user import SlackUser
9
+ from lgt_jobs.lgt_data.models.external.user_workspace import UserWorkspace
8
10
  from lgt_jobs.lgt_data.mongo_repository import UserMongoRepository, DedicatedBotRepository
9
11
  from lgt_jobs.basejobs import BaseBackgroundJobData, BaseBackgroundJob
10
12
  from lgt_jobs.jobs.bot_stats_update import BotStatsUpdateJob, BotStatsUpdateJobData
@@ -0,0 +1,29 @@
1
+ import copy
2
+ from abc import ABC
3
+ from datetime import datetime, UTC
4
+
5
+
6
+ class DictionaryModel(ABC):
7
+ @classmethod
8
+ def from_dic(cls, dic: dict):
9
+ if not dic:
10
+ return None
11
+
12
+ model = cls()
13
+ for k, v in dic.items():
14
+ setattr(model, k, v)
15
+
16
+ if '_id' in dic:
17
+ setattr(model, 'id', dic['_id'])
18
+
19
+ return model
20
+
21
+ def to_dic(self):
22
+ result = copy.deepcopy(self.__dict__)
23
+ return result
24
+
25
+
26
+ class BaseModel(DictionaryModel):
27
+ def __init__(self):
28
+ self.id = None
29
+ self.created_at = datetime.now(UTC)
@@ -0,0 +1,39 @@
1
+ import copy
2
+ from typing import List
3
+
4
+ from lgt_jobs.lgt_data.models.base import BaseModel
5
+ from lgt_jobs.lgt_data.models.boards.status import BoardedStatus
6
+
7
+
8
+ class BoardModel(BaseModel):
9
+ pass
10
+
11
+ def __init__(self):
12
+ super().__init__()
13
+ self.name = None
14
+ self.user_id = None
15
+ self.statuses: List[BoardedStatus] = []
16
+ self.is_primary = None
17
+ self.default = False
18
+
19
+ @classmethod
20
+ def from_dic(cls, dic: dict):
21
+ if not dic:
22
+ return None
23
+
24
+ model = BoardModel()
25
+ for k, v in dic.items():
26
+ setattr(model, k, v)
27
+
28
+ model.id = dic.get('_id')
29
+ model.statuses = [BoardedStatus.from_dic(status) for status in dic.get('statuses', [])]
30
+ return model
31
+
32
+ def to_dic(self):
33
+ result = copy.deepcopy(self.__dict__)
34
+ result["statuses"] = [BoardedStatus.to_dic(status) for status in self.statuses]
35
+
36
+ for status in result['statuses']:
37
+ status['board_id'] = result['id']
38
+
39
+ return result
@@ -0,0 +1,14 @@
1
+ from lgt_jobs.lgt_data.models.base import DictionaryModel
2
+
3
+
4
+ class BoardedStatus(DictionaryModel):
5
+ pass
6
+
7
+ def __init__(self):
8
+ self.id = None
9
+ self.name = None
10
+ self.order = 0
11
+ self.is_primary = False
12
+ self.default = False
13
+ self.user_leads = 0
14
+ self.collapsed = False
@@ -0,0 +1,44 @@
1
+ from datetime import datetime
2
+ from typing import List
3
+
4
+ from lgt_jobs.lgt_data.enums import SourceType
5
+ from lgt_jobs.lgt_data.models.base import BaseModel, DictionaryModel
6
+
7
+
8
+ class Credentials(BaseModel):
9
+ def __init__(self):
10
+ super().__init__()
11
+ self.token = None
12
+ self.cookies = None
13
+ self.invalid_creds = False
14
+
15
+
16
+ class Source(DictionaryModel):
17
+ def __init__(self):
18
+ self.source_type: SourceType | None = None
19
+ self.source_name: str | None = None
20
+ self.source_id = None
21
+
22
+
23
+ class BaseBotModel(Credentials):
24
+ def __init__(self):
25
+ super().__init__()
26
+ self.created_by = None
27
+ self.user_name = None
28
+ self.slack_url = None
29
+ self.registration_link = None
30
+ self.channels = None
31
+ self.connected_channels = None
32
+ self.channels_users = None
33
+ self.users_count = None
34
+ self.recent_messages: List[str] = []
35
+ self.icon = None
36
+ self.active_channels = {}
37
+ self.paused_channels = []
38
+ self.source: Source | None = None
39
+ self.two_factor_required: bool = False
40
+ self.banned: bool = False
41
+ self.associated_user = None
42
+ self.type: SourceType | None = None
43
+ self.deleted = False
44
+ self.deactivated_at: datetime | None = None
@@ -0,0 +1,33 @@
1
+ import copy
2
+
3
+
4
+ class BotInfo:
5
+ def __init__(self):
6
+ self.id = None
7
+ self.invalid_creds: bool | None = False
8
+ self.source = None
9
+ self.banned: bool | None = False
10
+ self.user_name: str = ''
11
+ self.associated_user: str | None = ''
12
+ self.deleted: bool = False
13
+ self.two_factor_required = False
14
+
15
+ @classmethod
16
+ def from_dic(cls, dic: dict):
17
+ if not dic:
18
+ return None
19
+
20
+ model = BotInfo()
21
+ for k, v in dic.items():
22
+ if hasattr(model, k):
23
+ setattr(model, k, v)
24
+
25
+ if '_id' in dic:
26
+ setattr(model, 'id', dic['_id'])
27
+
28
+ return model
29
+
30
+ def to_dic(self):
31
+ result = copy.deepcopy(self.__dict__)
32
+ return result
33
+
@@ -0,0 +1,90 @@
1
+ import copy
2
+ from datetime import datetime, UTC
3
+ from typing import Optional, List
4
+
5
+ from bson import ObjectId
6
+
7
+ from lgt_jobs.lgt_data.models.base import DictionaryModel
8
+ from lgt_jobs.lgt_data.models.bots.base_bot import BaseBotModel, Source
9
+
10
+
11
+ class DedicatedBotModel(BaseBotModel):
12
+ def __init__(self):
13
+ super().__init__()
14
+ self.user_id: ObjectId | None = None
15
+ self.updated_at: Optional[datetime] = datetime.now(UTC)
16
+ self.servers: List[Server] = []
17
+ self.state = 0
18
+ self.source: Source | None = None
19
+
20
+ def to_dic(self):
21
+ result = copy.deepcopy(self.__dict__)
22
+
23
+ if result.get('source'):
24
+ result['source'] = Source.to_dic(result.get('source'))
25
+
26
+ result['servers'] = [Server.to_dic(server) for server in self.servers]
27
+ return result
28
+
29
+ @classmethod
30
+ def from_dic(cls, dic: dict):
31
+ if not dic:
32
+ return None
33
+
34
+ model: DedicatedBotModel = cls()
35
+ for k, v in dic.items():
36
+ setattr(model, k, v)
37
+
38
+ if '_id' in dic:
39
+ setattr(model, 'id', dic['_id'])
40
+
41
+ model.source = Source.from_dic(dic.get("source"))
42
+ model.servers = [Server.from_dic(server) for server in dic.get("servers", [])]
43
+ return model
44
+
45
+
46
+ class Server:
47
+ pass
48
+
49
+ def __init__(self):
50
+ self.id = None
51
+ self.name = None
52
+ self.channels: List[Channel] = []
53
+ self.icon = None
54
+ self.active = False
55
+ self.deleted = False
56
+ self.subscribers = 0
57
+ self.approximate_member_count = 0
58
+ self.messages_received: int = 0
59
+ self.messages_filtered: int = 0
60
+
61
+ @classmethod
62
+ def from_dic(cls, dic: dict):
63
+ if not dic:
64
+ return None
65
+
66
+ model = cls()
67
+ for k, v in dic.items():
68
+ if hasattr(model, k):
69
+ setattr(model, k, v)
70
+
71
+ model.channels = [Channel.from_dic(channel) for channel in dic.get("channels", [])]
72
+ model.subscribers = dic.get('approximate_member_count')
73
+ return model
74
+
75
+ def to_dic(self):
76
+ result = copy.deepcopy(self.__dict__)
77
+ result['channels'] = [Channel.to_dic(channel) for channel in self.channels]
78
+ return result
79
+
80
+
81
+ class Channel(DictionaryModel):
82
+ pass
83
+
84
+ def __init__(self):
85
+ self.id = None
86
+ self.name = None
87
+ self.type = None
88
+ self.is_member = True
89
+ self.active = True
90
+ self.subscribers = 0
@@ -0,0 +1,8 @@
1
+ from lgt_jobs.lgt_data.models.base import DictionaryModel
2
+
3
+
4
+ class LeadGuruFile(DictionaryModel):
5
+ id: str = None
6
+ blob_path: str
7
+ content_type: str
8
+ file_name: str = None
@@ -0,0 +1,17 @@
1
+ from typing import List
2
+
3
+ from lgt_jobs.lgt_data.models.chat.message import ChatMessage
4
+
5
+
6
+ class GroupedMessagesModel:
7
+ messages: List[ChatMessage] = []
8
+
9
+ @classmethod
10
+ def from_dic(cls, dic: dict):
11
+ if not dic:
12
+ return None
13
+
14
+ model = cls()
15
+ model.messages = [ChatMessage.from_dic(message) for message in dic.get('messages', [])]
16
+ return model
17
+
@@ -0,0 +1,85 @@
1
+ import copy
2
+ from datetime import datetime
3
+
4
+ from bson import ObjectId
5
+
6
+ from lgt_jobs.lgt_data.models.bots.dedicated_bot import DedicatedBotModel
7
+ from lgt_jobs.lgt_data.models.chat.file import LeadGuruFile
8
+
9
+
10
+ class ChatMessage:
11
+ bot_id: ObjectId
12
+ user_id: ObjectId
13
+ sender_id: str
14
+ text: str
15
+ user: str
16
+ id: str
17
+ viewed: bool
18
+ files: list
19
+ attachments: list[dict] | None
20
+ created_at: datetime | None
21
+ source_id: str | None
22
+
23
+ class SlackFileModel:
24
+ def __init__(self):
25
+ self.id = None
26
+ self.name = None
27
+ self.title = None
28
+ self.filetype = None
29
+ self.size = 0
30
+ self.mimetype = None
31
+ self.download_url = None
32
+
33
+ def to_dic(self):
34
+ result = copy.deepcopy(self.__dict__)
35
+ return result
36
+
37
+ def __init__(self):
38
+ self.viewed = False
39
+ self.text: str = ''
40
+ self.created_at: datetime
41
+ self.user = ''
42
+ self.id = ''
43
+ self.files = []
44
+ self.attachments = []
45
+
46
+ def to_dic(self):
47
+ result = copy.deepcopy(self.__dict__)
48
+ result['files'] = [x.to_dic() for x in result.get('files', [])]
49
+ return result
50
+
51
+ @classmethod
52
+ def from_dic(cls, dic: dict):
53
+ if not dic:
54
+ return None
55
+ model = cls()
56
+ for k, v in dic.items():
57
+ setattr(model, k, v)
58
+ return model
59
+
60
+ @classmethod
61
+ def from_slack_response(cls, bot: DedicatedBotModel, message_data: dict, sender_id: str):
62
+ model = cls()
63
+ model.sender_id = sender_id
64
+ model.bot_id = bot.id
65
+ model.text = message_data.get('text', '')
66
+ model.user = message_data.get('user', '')
67
+ model.id = message_data.get('ts', '')
68
+ model.attachments = message_data.get('attachments', [])
69
+ model.files = []
70
+ model.user_id = bot.user_id
71
+ model.source_id = bot.source.source_id
72
+ if 'files' in message_data:
73
+ for file in message_data.get('files'):
74
+ if file.get('mode') != "tombstone" and file.get('url_private_download'):
75
+ leadguru_file = LeadGuruFile()
76
+ leadguru_file.id = file['id']
77
+ leadguru_file.content_type = file['mimetype']
78
+ leadguru_file.file_name = file['name']
79
+ leadguru_file.blob_path = f'slack_files/{bot.user_name}/slack_files/{file["id"]}'
80
+ model.files.append(leadguru_file)
81
+
82
+ js_ticks = int(model.id.split('.')[0] + model.id.split('.')[1][3:])
83
+ model.created_at = datetime.fromtimestamp(js_ticks / 1000.0)
84
+ return model
85
+
@@ -1,4 +1,5 @@
1
- from lgt_jobs.lgt_data.model import ChatMessage, DedicatedBotModel
1
+ from lgt_jobs.lgt_data.models.bots.dedicated_bot import DedicatedBotModel
2
+ from lgt_jobs.lgt_data.models.chat.message import ChatMessage
2
3
 
3
4
 
4
5
  class MessageRequest(ChatMessage):