wbintegrator_office365 1.55.10rc0__tar.gz → 1.56.1__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 (42) hide show
  1. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/PKG-INFO +2 -1
  2. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/pyproject.toml +1 -0
  3. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/models/event.py +3 -1
  4. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/tasks.py +77 -0
  5. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/viewsets/viewsets.py +1 -1
  6. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/.gitignore +0 -0
  7. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/__init__.py +0 -0
  8. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/admin.py +0 -0
  9. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/apps.py +0 -0
  10. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/configurations/__init__.py +0 -0
  11. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/configurations/configurations/__init__.py +0 -0
  12. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/dynamic_preferences_registry.py +0 -0
  13. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/factories.py +0 -0
  14. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/filters.py +0 -0
  15. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/importer/__init__.py +0 -0
  16. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/importer/api.py +0 -0
  17. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/importer/disable_signals.py +0 -0
  18. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/importer/parser.py +0 -0
  19. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/kpi_handlers/__init__.py +0 -0
  20. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/kpi_handlers/calls.py +0 -0
  21. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/migrations/0001_initial_squashed_squashed_0003_alter_calendar_owner_alter_calendarevent_organizer_and_more.py +0 -0
  22. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/migrations/0002_remove_calendar_owner_remove_calendarevent_activity_and_more.py +0 -0
  23. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/migrations/0003_alter_event_options.py +0 -0
  24. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/migrations/__init__.py +0 -0
  25. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/models/__init__.py +0 -0
  26. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/models/subscription.py +0 -0
  27. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/models/tenant.py +0 -0
  28. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/serializers.py +0 -0
  29. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/templates/admin/tenant_change_list.html +0 -0
  30. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/tests/__init__.py +0 -0
  31. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/tests/conftest.py +0 -0
  32. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/tests/test_admin.py +0 -0
  33. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/tests/test_models.py +0 -0
  34. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/tests/test_tasks.py +0 -0
  35. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/tests/test_views.py +0 -0
  36. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/tests/tests.py +0 -0
  37. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/urls.py +0 -0
  38. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/viewsets/__init__.py +0 -0
  39. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/viewsets/display.py +0 -0
  40. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/viewsets/endpoints.py +0 -0
  41. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/viewsets/menu.py +0 -0
  42. {wbintegrator_office365-1.55.10rc0 → wbintegrator_office365-1.56.1}/wbintegrator_office365/viewsets/titles.py +0 -0
@@ -1,7 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wbintegrator_office365
3
- Version: 1.55.10rc0
3
+ Version: 1.56.1
4
4
  Author-email: Christopher Wittlinger <c.wittlinger@stainly.com>
5
+ Requires-Dist: boto3>=1.35.99
5
6
  Requires-Dist: bs4==0.0.*
6
7
  Requires-Dist: oauthlib==3.1.*
7
8
  Requires-Dist: requests-oauthlib==1.3.*
@@ -11,6 +11,7 @@ dependencies = [
11
11
  "oauthlib == 3.1.*",
12
12
  "requests-oauthlib == 1.3.*",
13
13
  "bs4 == 0.0.*",
14
+ "boto3>=1.35.99",
14
15
  ]
15
16
 
16
17
  [tool.uv.sources]
@@ -301,8 +301,10 @@ class CallUser(WBModel):
301
301
  contacts = TelephoneContact.objects.filter(number=self.tenant_user.tenant_id, entry__isnull=False)
302
302
  if contacts.exists():
303
303
  return str(contacts.first().entry)
304
- elif self.tenant_user.tenant_id[0] == "+":
304
+ elif self.tenant_user.tenant_id and self.tenant_user.tenant_id[0] == "+":
305
305
  return self.tenant_user.tenant_id
306
+ else:
307
+ return self.tenant_user.display_name
306
308
 
307
309
  def __str__(self):
308
310
  if repr := self.get_humanized_repr():
@@ -1,5 +1,8 @@
1
+ import os
2
+ from collections import defaultdict
1
3
  from datetime import date, timedelta
2
4
 
5
+ import boto3
3
6
  import humanize
4
7
  from celery import shared_task
5
8
  from django.contrib.auth import get_user_model
@@ -23,6 +26,65 @@ def format_td(td: timedelta) -> str:
23
26
  return humanize.precisedelta(td, suppress=["hours"], minimum_unit="seconds", format="%0.0f")
24
27
 
25
28
 
29
+ #################################################
30
+ ################# TEMPORARY #####################
31
+ #################################################
32
+
33
+
34
+ def convert_user(user):
35
+ email = user["Attributes"][0]["Value"]
36
+ first = user["Attributes"][3]["Value"]
37
+ last = user["Attributes"][2]["Value"]
38
+
39
+ return f"{email} ({first} {last})"
40
+
41
+
42
+ def get_fundy_users():
43
+ access_key = os.environ["FUNDY_BOTO_ACCESS_KEY"]
44
+ secret_access_key = os.environ["FUNDY_BOTO_SECRET_ACCESS_KEY"]
45
+
46
+ client = boto3.client(
47
+ "cognito-idp", region_name="eu-north-1", aws_access_key_id=access_key, aws_secret_access_key=secret_access_key
48
+ )
49
+
50
+ pagination_token = None
51
+ users = []
52
+ while True:
53
+ if not pagination_token:
54
+ response = client.list_users(
55
+ UserPoolId="eu-north-1_IFRQriJAf",
56
+ )
57
+ else:
58
+ response = client.list_users(
59
+ UserPoolId="eu-north-1_IFRQriJAf",
60
+ PaginationToken=pagination_token,
61
+ )
62
+
63
+ users.extend(response["Users"])
64
+ if response.get("PaginationToken", None) is None:
65
+ break
66
+ else:
67
+ pagination_token = response["PaginationToken"]
68
+
69
+ users_date = defaultdict(list)
70
+ for user in sorted(users, key=lambda x: x["UserCreateDate"]):
71
+ users_date[user["UserCreateDate"].date()].append(convert_user(user))
72
+ return users_date, len(users)
73
+
74
+
75
+ def get_fundy_user_statistics():
76
+ today = date.today()
77
+ users, total_users = get_fundy_users()
78
+
79
+ yesterday_users = users.get(today - timedelta(days=1), [])
80
+ return yesterday_users, len(yesterday_users), total_users
81
+
82
+
83
+ #################################################
84
+ ################ TEMPORARY END ##################
85
+ #################################################
86
+
87
+
26
88
  @shared_task
27
89
  def send_call_summary(
28
90
  to_emails: list,
@@ -109,6 +171,21 @@ def send_call_summary(
109
171
  message += "</table><br/>"
110
172
 
111
173
  message += "</div>"
174
+
175
+ ######## TEMPORARY START ########
176
+ yesterday_users, yesterday_users_count, total_users_count = get_fundy_user_statistics()
177
+ message += f"""
178
+ <div>
179
+ <h3>FUNDY USER STATISTICS</h3>
180
+ <strong>Yesterday Users:</strong> {yesterday_users_count}
181
+ <strong>Total Users:</strong> {total_users_count}
182
+ <ul>
183
+ """
184
+ for user in yesterday_users:
185
+ message += f"<li>{user}</li>"
186
+ message += "</ul></div>"
187
+ ######## TEMPORARY END ########
188
+
112
189
  title = f"Call summary - {date_repr}"
113
190
  if include_detail:
114
191
  title = "Detailed " + title
@@ -445,7 +445,7 @@ class CallEventSummaryGraph(viewsets.ChartViewSet):
445
445
  df = df.sort_values(by=["day"]).reset_index()
446
446
  return df
447
447
 
448
- def get_plotly(self, queryset):
448
+ def get_plotly(self, queryset): # noqa: C901
449
449
  fig = go.Figure()
450
450
  if queryset.exists():
451
451
  df = pd.DataFrame(queryset.annotate(day=F("created__date")).values("start", "end", "day"))