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

Add date_joined filter for super user reports #4435

Merged
merged 2 commits into from
Jun 5, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
13 changes: 10 additions & 3 deletions kobo/apps/superuser_stats/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -528,7 +528,11 @@ def _get_country_value(value: Union[dict, list]) -> str:


@shared_task
def generate_user_details_report(output_filename: str):
def generate_user_details_report(
output_filename: str,
start_date: str,
end_date: str
):
USER_COLS = [
'id',
'username',
Expand Down Expand Up @@ -580,7 +584,10 @@ def get_row_value(
values = USER_COLS + METADATA_COL

data = (
User.objects.exclude(pk=settings.ANONYMOUS_USER_ID)
User.objects.filter(
date_joined__date__range=(start_date, end_date),
)
.exclude(pk=settings.ANONYMOUS_USER_ID)
.annotate(
mfa_is_active=F('mfa_methods__is_active'),
metadata=F('extra_details__data'),
Expand All @@ -601,7 +608,7 @@ def get_row_value(
columns = USER_COLS + EXTRA_DETAILS_COLS
writer = csv.writer(f)
writer.writerow(columns)
for row in data:
for row in data.iterator():
JacquelineMorrissette marked this conversation as resolved.
Show resolved Hide resolved
metadata = row.pop('metadata', {}) or {}
flatten_metadata_inplace(metadata)
row.update(metadata)
Expand Down
24 changes: 22 additions & 2 deletions kobo/apps/superuser_stats/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,16 @@ def user_statistics_report(request):


def user_details_report(request):

# Get the date filters from the query and set defaults
today = timezone.now().date()
first_of_month = today.replace(day=1)
if not (start_date := request.GET.get('date_joined_gte')):
JacquelineMorrissette marked this conversation as resolved.
Show resolved Hide resolved
start_date = str(first_of_month)

if not (end_date := request.GET.get('date_joined_lte')):
JacquelineMorrissette marked this conversation as resolved.
Show resolved Hide resolved
end_date = str(today)

base_filename = 'user-details-report_{}_{}_{}.csv'.format(
re.sub('[^a-zA-Z0-9]', '-', request.META['HTTP_HOST']),
date.today(),
Expand All @@ -339,13 +349,23 @@ def user_details_report(request):
filename = _base_filename_to_full_filename(
base_filename, request.user.username
)
generate_user_details_report.delay(filename)
url = f"{KOBOFORM_URL}{reverse('superuser_stats:user_details_report')}"
generate_user_details_report.delay(filename, start_date, end_date)
template_ish = (
f'<html><head><title>User details report</title></head>'
f'<body>Your report is being generated. Once finished, it will be '
f'available at <a href="{base_filename}">{base_filename}</a>.<br>'
f'If you receive a 404, please refresh your browser periodically until '
f'your request succeeds.'
f'your request succeeds.<br><br>'
f'To select a date range based on the user\'s date joined, add a <code style="background: lightgray">?</code> at the end of the URL and set the '
f'<code style="background: lightgray">date_joined_gte</code> parameter to <code style="background: lightgray">YYYY-MM-DD</code> and/or the '
f'<code style="background: lightgray">date_joined_lte</code> parameter to <code style="background: lightgray">YYYY-MM-DD</code>.<br><br>'
f'<b>Example:</b><br>'
f'<a href="{url}?date_joined_gte={first_of_month}&date_joined_lte={today}">'
JacquelineMorrissette marked this conversation as resolved.
Show resolved Hide resolved
f' {url}?date_joined_gte={first_of_month}&date_joined_lte={today}'
f'</a>'
f'<p>Range is <b>inclusive</b>.</p>'
f'<p>The default range is current month: {today.strftime("%B %Y")}.</p>'
f'</body></html>'
)
return HttpResponse(template_ish)
Expand Down