edx-enterprise-data 7.0.0__py3-none-any.whl → 8.2.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.
Files changed (35) hide show
  1. {edx_enterprise_data-7.0.0.dist-info → edx_enterprise_data-8.2.0.dist-info}/METADATA +4 -1
  2. {edx_enterprise_data-7.0.0.dist-info → edx_enterprise_data-8.2.0.dist-info}/RECORD +35 -21
  3. {edx_enterprise_data-7.0.0.dist-info → edx_enterprise_data-8.2.0.dist-info}/WHEEL +1 -1
  4. enterprise_data/__init__.py +1 -1
  5. enterprise_data/admin_analytics/__init__.py +0 -0
  6. enterprise_data/admin_analytics/constants.py +15 -0
  7. enterprise_data/admin_analytics/data_loaders.py +137 -0
  8. enterprise_data/admin_analytics/database.py +31 -0
  9. enterprise_data/admin_analytics/utils.py +81 -0
  10. enterprise_data/api/v1/serializers.py +20 -0
  11. enterprise_data/api/v1/urls.py +13 -6
  12. enterprise_data/api/v1/views/__init__.py +0 -0
  13. enterprise_data/api/v1/views/base.py +26 -0
  14. enterprise_data/api/v1/views/enterprise_admin.py +109 -0
  15. enterprise_data/api/v1/{views.py → views/enterprise_learner.py} +5 -114
  16. enterprise_data/api/v1/views/enterprise_offers.py +41 -0
  17. enterprise_data/migrations/{0040_auto_20240712_0740.py → 0040_auto_20240718_0536_squashed_0043_alter_enterpriselearnerenrollment_enterprise_enrollment_id.py} +10 -5
  18. enterprise_data/settings/test.py +8 -9
  19. enterprise_data/tests/admin_analytics/__init__.py +0 -0
  20. enterprise_data/tests/admin_analytics/test_data_loaders.py +86 -0
  21. enterprise_data/tests/admin_analytics/test_utils.py +102 -0
  22. enterprise_data/tests/api/v1/views/__init__.py +0 -0
  23. enterprise_data/tests/api/v1/views/test_enterprise_admin.py +82 -0
  24. enterprise_data/tests/test_filters.py +1 -1
  25. enterprise_data/tests/test_utils.py +73 -0
  26. enterprise_data/utils.py +48 -1
  27. enterprise_reporting/clients/__init__.py +2 -3
  28. enterprise_reporting/external_resource_link_report.py +3 -3
  29. enterprise_reporting/tests/test_clients.py +1 -1
  30. enterprise_reporting/tests/test_enterprise_client.py +2 -5
  31. enterprise_reporting/tests/test_external_link_report.py +2 -2
  32. enterprise_reporting/tests/test_utils.py +3 -3
  33. enterprise_reporting/utils.py +1 -1
  34. {edx_enterprise_data-7.0.0.dist-info → edx_enterprise_data-8.2.0.dist-info}/LICENSE +0 -0
  35. {edx_enterprise_data-7.0.0.dist-info → edx_enterprise_data-8.2.0.dist-info}/top_level.txt +0 -0
enterprise_data/utils.py CHANGED
@@ -1,9 +1,14 @@
1
1
  """
2
2
  Utility functions for Enterprise Data app.
3
3
  """
4
-
5
4
  import hashlib
6
5
  import random
6
+ import time
7
+ from datetime import timedelta
8
+ from functools import wraps
9
+ from logging import getLogger
10
+
11
+ LOGGER = getLogger(__name__)
7
12
 
8
13
 
9
14
  def get_cache_key(**kwargs):
@@ -35,3 +40,45 @@ def get_unique_id():
35
40
  Return a unique 32 bit integer.
36
41
  """
37
42
  return random.getrandbits(32)
43
+
44
+
45
+ def subtract_one_month(original_date):
46
+ """
47
+ Return a date exactly one month prior to the passed in date.
48
+ """
49
+ one_day = timedelta(days=1)
50
+ one_month_earlier = original_date - one_day
51
+ while one_month_earlier.month == original_date.month or one_month_earlier.day > original_date.day:
52
+ one_month_earlier -= one_day
53
+ return one_month_earlier
54
+
55
+
56
+ def timeit(func):
57
+ """
58
+ Measure time taken by a function.
59
+ """
60
+ @wraps(func)
61
+ def wrapper(*args, **kwargs):
62
+ start = time.time()
63
+ result = func(*args, **kwargs)
64
+ end = time.time()
65
+ LOGGER.info(f'Time taken by {func.__name__}: {end - start} seconds')
66
+ return result
67
+
68
+ return wrapper
69
+
70
+
71
+ def date_filter(start, end, data_frame, date_column):
72
+ """
73
+ Filter a pandas DataFrame by date range.
74
+
75
+ Arguments:
76
+ start (DatetimeScalar | NaTType | None): The start date.
77
+ end (DatetimeScalar | NaTType | None): The end date.
78
+ data_frame (pandas.DataFrame): The DataFrame to filter.
79
+ date_column (str): The name of the date column.
80
+
81
+ Returns:
82
+ (pandas.DataFrame): The filtered DataFrame.
83
+ """
84
+ return data_frame[(start <= data_frame[date_column]) & (data_frame[date_column] <= end)]
@@ -2,18 +2,17 @@
2
2
  Clients used to access third party systems.
3
3
  """
4
4
 
5
+ import logging
5
6
  import os
6
7
  from datetime import datetime, timedelta
7
8
  from functools import wraps
8
9
  from urllib.parse import parse_qs, urljoin, urlparse
9
- from edx_rest_api_client.client import get_oauth_access_token
10
10
 
11
- import logging
12
11
  import requests
12
+ from edx_rest_api_client.client import get_oauth_access_token
13
13
 
14
14
  from enterprise_reporting.utils import retry_on_exception
15
15
 
16
-
17
16
  LOGGER = logging.getLogger(__name__)
18
17
 
19
18
 
@@ -3,13 +3,13 @@ External Resource Link Report Generation Code.
3
3
  """
4
4
 
5
5
 
6
- from collections import Counter
7
- from datetime import date
8
- import operator
9
6
  import logging
7
+ import operator
10
8
  import os
11
9
  import re
12
10
  import sys
11
+ from collections import Counter
12
+ from datetime import date
13
13
  from urllib.parse import urlparse
14
14
 
15
15
  from py2neo import Graph
@@ -1,9 +1,9 @@
1
1
  """
2
2
  Tests for clients in enterprise_reporting.
3
3
  """
4
+ from datetime import datetime, timedelta
4
5
  from unittest.mock import Mock, patch
5
6
  from urllib.parse import urljoin
6
- from datetime import datetime, timedelta
7
7
 
8
8
  import responses
9
9
 
@@ -2,14 +2,11 @@
2
2
  Test Enterprise client.
3
3
  """
4
4
 
5
+ import json
5
6
  import os
6
7
  import unittest
7
8
 
8
- import json
9
-
10
- from enterprise_reporting.utils import (
11
- extract_catalog_uuids_from_reporting_config,
12
- )
9
+ from enterprise_reporting.utils import extract_catalog_uuids_from_reporting_config
13
10
 
14
11
  REPO_DIR = os.getcwd()
15
12
  FIXTURE_DIR = os.path.join(REPO_DIR, 'enterprise_reporting/fixtures')
@@ -2,13 +2,13 @@
2
2
  Test utils for external link reports.
3
3
  """
4
4
 
5
- from collections import OrderedDict
6
5
  import unittest
6
+ from collections import OrderedDict
7
7
 
8
8
  from enterprise_reporting.external_resource_link_report import (
9
9
  AGGREGATE_REPORT_CSV_HEADER_ROW,
10
- create_csv_string,
11
10
  create_columns_for_aggregate_report,
11
+ create_csv_string,
12
12
  process_coursegraph_results,
13
13
  split_up_results,
14
14
  )
@@ -3,12 +3,15 @@ Test utilities.
3
3
  """
4
4
 
5
5
 
6
+ import datetime
6
7
  import os
7
8
  import tempfile
8
9
  import unittest
9
10
  from collections import OrderedDict
11
+
10
12
  import ddt
11
13
  import pgpy
14
+ import pytz
12
15
  from pgpy.constants import CompressionAlgorithm, HashAlgorithm, KeyFlags, PubKeyAlgorithm, SymmetricKeyAlgorithm
13
16
  from pgpy.errors import PGPError
14
17
 
@@ -16,9 +19,6 @@ from enterprise_reporting import utils
16
19
 
17
20
  from .utils import create_files, verify_compressed
18
21
 
19
- import pytz
20
- import datetime
21
-
22
22
 
23
23
  @ddt.ddt
24
24
  class TestUtilities(unittest.TestCase):
@@ -11,6 +11,7 @@ from collections import OrderedDict
11
11
  from email.mime.application import MIMEApplication
12
12
  from email.mime.multipart import MIMEMultipart
13
13
  from email.mime.text import MIMEText
14
+ from urllib.parse import parse_qs, urlparse
14
15
 
15
16
  import boto3
16
17
  import pgpy
@@ -18,7 +19,6 @@ import pyminizip
18
19
  import pytz
19
20
  from cryptography.fernet import Fernet
20
21
  from fernet_fields.hkdf import derive_fernet_key
21
- from urllib.parse import parse_qs, urlparse
22
22
 
23
23
  from django.utils.encoding import force_str
24
24