Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reworked SiteMonthlyMetrics registered users metric #268

Merged
merged 1 commit into from
Oct 15, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 9 additions & 21 deletions figures/metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ def get_active_users_for_time_period(site, start_date, end_date, course_ids=None
**filter_args).values('student__id').distinct().count()


def get_total_site_users_for_time_period(site, start_date, end_date, **kwargs):
def get_total_site_users_for_time_period(site, start_date, end_date, **_kwargs):
"""
Returns the maximum number of users who joined before or on the end date

Expand All @@ -304,28 +304,15 @@ def get_total_site_users_for_time_period(site, start_date, end_date, **kwargs):
TODO: Consider first trying to get the data from the SiteDailyMetrics
model. If there are no records, then get the data from the User model
"""
def calc_from_user_model():
filter_args = dict(
date_joined__lt=as_datetime(next_day(end_date)),
)
users = figures.sites.get_users_for_site(site)
return users.filter(**filter_args).count()

def calc_from_site_daily_metrics():
filter_args = dict(
site=site,
date_for__gt=prev_day(start_date),
date_for__lt=next_day(end_date))
qs = SiteDailyMetrics.objects.filter(**filter_args)
if qs:
return qs.aggregate(maxval=Max('total_user_count'))['maxval']
else:
return 0

if kwargs.get('calc_from_sdm'):
return calc_from_site_daily_metrics()
filter_args = dict(site=site,
date_for__gt=prev_day(start_date),
date_for__lt=next_day(end_date))
qs = SiteDailyMetrics.objects.filter(**filter_args)
if qs:
return qs.aggregate(maxval=Max('total_user_count'))['maxval']
else:
return calc_from_user_model()
return 0


def get_total_site_users_joined_for_time_period(site, start_date, end_date,
Expand All @@ -334,6 +321,7 @@ def get_total_site_users_joined_for_time_period(site, start_date, end_date,

NOTE: Untested and not yet used in the general site metrics, but we'll want to add it
TODO: Rename this function to be "new_users" for consistency with the API endpoint
TODO: When we implement this, add data to Figures model space for performance
"""
def calc_from_user_model():
filter_args = dict(
Expand Down
40 changes: 1 addition & 39 deletions tests/metrics/test_metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@
get_total_course_completions_for_time_period,
get_total_enrollments_for_time_period,
get_total_site_courses_for_time_period,
get_total_site_users_for_time_period,
get_total_site_users_joined_for_time_period,

)
Expand Down Expand Up @@ -308,25 +307,7 @@ def test_get_active_users_for_month(self):
count = get_active_users_for_time_period(site=self.site,
start_date=start_date,
end_date=end_date)
assert count == len(sm_in) -1

def test_get_total_site_users_for_time_period(self):
'''
TODO: add users who joined before and after the time period, and
compare the count to the users created on or before the end date

TODO: Create
'''
users = create_users_joined_over_time(
site=self.site,
is_multisite=figures.helpers.is_multisite(),
start_date=self.data_start_date,
end_date=self.data_end_date)
count = get_total_site_users_for_time_period(
site=self.site,
start_date=self.data_start_date,
end_date=self.data_end_date)
assert count == len(users)
assert count == len(sm_in) - 1

def test_get_total_site_users_joined_for_time_period(self):
'''
Expand Down Expand Up @@ -366,7 +347,6 @@ def test_get_total_site_courses_for_time_period(self):

assert count == self.site_daily_metrics[-1].course_count


def test_get_monthly_site_metrics(self):
'''
Since we are testing results for individual getters in other test
Expand Down Expand Up @@ -442,23 +422,6 @@ def test_get_active_users_for_time_period(self):

assert count == len(student_module_sets)

def test_get_total_site_users_for_time_period(self):
'''
TODO: add users who joined before and after the time period, and
compare the count to the users created on or before the end date

TODO: Create
'''
users = create_users_joined_over_time(
site=self.alpha_site,
is_multisite=figures.helpers.is_multisite(),
start_date=self.data_start_date,
end_date=self.data_end_date)
count = get_total_site_users_for_time_period(site=self.alpha_site,
start_date=self.data_start_date,
end_date=self.data_end_date)
assert count == len(users)

def test_get_total_site_users_joined_for_time_period(self):
'''
TODO: add users who joined before and after the time period, and
Expand Down Expand Up @@ -494,7 +457,6 @@ def test_get_total_site_courses_for_time_period(self):
end_date=self.data_end_date)
assert count == self.alpha_site_daily_metrics[-1].course_count


def test_get_monthly_site_metrics(self):
'''
Since we are testing results for individual getters in other test
Expand Down
101 changes: 101 additions & 0 deletions tests/metrics/test_registered_users.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
"""Tests for registered user metrics

This module tests metrics functionality in `figures.metrics` that work with
the "registered user" metric

The registered user metric provides the count of how many users have registered
for a given site for a time range

TODO: Provide details here
* Figures UI registered users on a site
* The pipeline, storage, API retrieval, and any derivative metrics

# Developer Note

* Initially, we have basic tests for coverage

* We've just changed the metric from live User model `date_joined` queries to
using stored data in `SiteDailyMetrics.total_user_count`
* We need to deploy quickly, so doing minimal testing to start


"""

from datetime import datetime
import pytest

from figures.metrics import get_total_site_users_for_time_period

from tests.factories import (
SiteDailyMetricsFactory,
SiteFactory,
)


@pytest.fixture
@pytest.mark.django_db
def sdm_test_data(db):
"""Quick-n-dirty test data construction

Expected count is the highest 'total_user_count'
"""
dates = [
datetime(year=2020, month=3, day=15),
datetime(year=2020, month=4, day=1),
datetime(year=2020, month=4, day=15),
datetime(year=2020, month=4, day=30),
datetime(year=2020, month=5, day=1)
]

our_date_range = [
datetime(year=2020, month=4, day=1),
datetime(year=2020, month=4, day=30),
]
my_site = SiteFactory()
other_site = SiteFactory()

my_sdm = [
# month before
SiteDailyMetricsFactory(site=my_site,
date_for=dates[0],
total_user_count=10),
# in our date range
SiteDailyMetricsFactory(site=my_site,
date_for=dates[1],
total_user_count=20),
SiteDailyMetricsFactory(site=my_site,
date_for=dates[2],
total_user_count=30),
SiteDailyMetricsFactory(site=my_site,
date_for=dates[3],
total_user_count=25),
# month after
SiteDailyMetricsFactory(site=my_site,
date_for=dates[4],
total_user_count=500),
]
# Create one SDM record for the other site in the month we query
other_sdm = [
SiteDailyMetricsFactory(site=other_site,
date_for=dates[2],
total_user_count=13)]
return dict(
our_date_range=our_date_range,
my_site=my_site,
other_site=other_site,
my_sdm=my_sdm,
other_sdm=other_sdm,
expected_count=30,
)


def test_get_total_site_users_for_month(sdm_test_data):
"""
"""
my_site = sdm_test_data['my_site']
start_date, end_date = sdm_test_data['our_date_range']
count = get_total_site_users_for_time_period(
site=my_site,
start_date=start_date,
end_date=end_date)
assert count == sdm_test_data['expected_count']