feat: added banner message for survey report (#33633)

* feat: added banner message for survey report

* refactor: addressed PR feedback and changes
* fix: fixed styles on admin templates
* refactor: changed script location to survey report block
* chore: removed whitespaces and renamed the context processor files
* feat: added banner message for survey report
* refactor: separated survey report template from admin and deleted base template
* refactor: changed months variable into a configurable setting


---------

Co-authored-by: Maria Fernanda Magallanes Zubillaga <maria.magallanes@edunext.co>
Co-authored-by: María Fernanda Magallanes <35668326+MaferMazu@users.noreply.github.com>
This commit is contained in:
Asespinel
2023-12-18 10:19:51 -05:00
committed by GitHub
parent 82f3cecd77
commit e9d84d0ec1
8 changed files with 125 additions and 2 deletions

View File

@@ -1342,7 +1342,12 @@ CONTEXT_PROCESSORS = [
'openedx.core.djangoapps.site_configuration.context_processors.configuration_context',
# Mobile App processor (Detects if request is from the mobile app)
'lms.djangoapps.mobile_api.context_processor.is_from_mobile_app'
'lms.djangoapps.mobile_api.context_processor.is_from_mobile_app',
# Context processor necesarry for the survey report message appear on the admin site
'openedx.features.survey_report.context_processors.admin_extra_context'
]
# Django templating

View File

@@ -1131,6 +1131,8 @@ SURVEY_REPORT_ENDPOINT = ENV_TOKENS.get('SURVEY_REPORT_ENDPOINT',
'https://hooks.zapier.com/hooks/catch/11595998/3ouwv7m/')
ANONYMOUS_SURVEY_REPORT = False
SURVEY_REPORT_CHECK_THRESHOLD = ENV_TOKENS.get('SURVEY_REPORT_CHECK_THRESHOLD', 6)
AVAILABLE_DISCUSSION_TOURS = ENV_TOKENS.get('AVAILABLE_DISCUSSION_TOURS', [])
############## NOTIFICATIONS EXPIRY ##############

View File

@@ -663,6 +663,7 @@ MFE_CONFIG_OVERRIDES = {
############## Settings for survey report ##############
SURVEY_REPORT_EXTRA_DATA = {}
SURVEY_REPORT_ENDPOINT = "https://example.com/survey_report"
SURVEY_REPORT_CHECK_THRESHOLD = 6
ANONYMOUS_SURVEY_REPORT = False
######################## Subscriptions API SETTINGS ########################

View File

@@ -20,3 +20,7 @@
{% endblock %}
{% block header %}{{ block.super }}
{% include "survey_report/admin_banner.html" %}
{% endblock %}

View File

@@ -53,6 +53,7 @@ def generate_report() -> None:
data = get_report_data()
data["state"] = SURVEY_REPORT_GENERATED
update_report(survey_report.id, data)
send_report_to_external_api(survey_report.id)
except (Exception, ) as update_report_error:
update_report(survey_report.id, {"state": SURVEY_REPORT_ERROR})
raise Exception(update_report_error) from update_report_error

View File

@@ -0,0 +1,34 @@
"""
This is the survey report contex_processor modules
This is meant to determine the visibility of the survey report banner
across all admin pages in case a survey report has not been generated
"""
from datetime import datetime
from dateutil.relativedelta import relativedelta # for months test
from .models import SurveyReport
from django.urls import reverse
from django.conf import settings
def admin_extra_context(request):
"""
This function sends extra context to every admin site
The current treshhold to show the banner is one month but this can be redefined in the future
"""
months = settings.SURVEY_REPORT_CHECK_THRESHOLD
if not request.path.startswith(reverse('admin:index')):
return {'show_survey_report_banner': False, }
try:
latest_report = SurveyReport.objects.latest('created_at')
months_treshhold = datetime.today().date() - relativedelta(months=months) # Calculate date one month ago
show_survey_report_banner = latest_report.created_at.date() <= months_treshhold
except SurveyReport.DoesNotExist:
show_survey_report_banner = True
return {'show_survey_report_banner': show_survey_report_banner, }

View File

@@ -16,8 +16,9 @@ class GenerateReportTest(TestCase):
Test for generate_report command.
"""
@mock.patch('openedx.features.survey_report.api.send_report_to_external_api')
@mock.patch('openedx.features.survey_report.api.get_report_data')
def test_generate_report(self, mock_get_report_data):
def test_generate_report(self, mock_get_report_data, mock_send_report):
"""
Test that generate_report command creates a survey report.
"""
@@ -30,6 +31,7 @@ class GenerateReportTest(TestCase):
'extra_data': {'extra': 'data'},
}
mock_get_report_data.return_value = report_test_data
mock_send_report.return_value = None
out = StringIO()
call_command('generate_report', no_send=True, stdout=out)

View File

@@ -0,0 +1,74 @@
{% block survey_report_banner %}
{% if show_survey_report_banner %}
<div id="originalContent" style="border: 3px solid #06405d; margin-bottom: 50px; rgb(0 0 0 / 18%) 0px 3px 5px;">
<div style="background-color: #06405d;padding: 17px 37px;">
<h1 style="margin: 0; color: #FFFF; font-weight: 600;">Join the Open edX Data Sharing Initiative and shape the future of learning</h1>
</div>
<div style="padding: 17px 37px;">
<p>The Open edX Project relies on the collective strength of its community to be a thriving platform for online education.</p>
<p>Open edX is a dynamic ecosystem and it is used in diverse learning environments. By sharing anonymized reports of aggregated data, you can contribute to the collective knowledge of the community. This data can help us all understand the reach of our project, make better decisions and ultimately support innovation in lifelong learning and advance next generation learning experience platforms.</p>
<p>We invite you to join the Open edX Data Sharing Initiative by sharing an anonymized reports of aggregated data from your institution's usage of the platform. The report data will be sent to Axim Collaborative, the non-profit behind the Open edX project.</p>
<p>If you agree and want to send a report you can click the button below. You can always send reports and see the status of reports you have sent in the past at <a href="/admin/survey_report/surveyreport/">admin/survey_report/surveyreport/</a> .</p>
</div>
<div style="display: flex; justify-content: flex-end; padding: 0 37px 17px;">
<button id="dismissButton" type="button" style="background-color:var(--close-button-bg); color: var(--button-fg); border: none; border-radius: 4px; padding: 10px 20px; margin-right: 10px; cursor: pointer;">Dismiss</button>
<form id='survey_report_form' method="POST" action="/survey_report/generate_report" style="margin: 0; padding: 0;">
{% csrf_token %}
<button type="submit" style="background-color: #377D4D; color: var(--button-fg); border: none; border-radius: 4px; padding: 10px 20px; cursor: pointer;">Send Report</button>
</form>
</div>
</div>
<div id="thankYouMessage" style="display: none; background-color: var(--darkened-bg); padding: 20px 40px; margin-bottom: 30px;box-shadow: rgb(0 0 0 / 18%) 0px 3px 5px;">
<div style="display: flex; align-items: center;">
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 24 24">
<g fill="#377D4D"><path d="M22 12c0 5.523-4.477 10-10 10S2 17.523 2 12S6.477 2 12 2s10 4.477 10 10Z"></path>
<path d="M16.03 8.97a.75.75 0 0 1 0 1.06l-5 5a.75.75 0 0 1-1.06 0l-2-2a.75.75 0 1 1 1.06-1.06l1.47 1.47l2.235-2.236L14.97 8.97a.75.75 0 0 1 1.06 0Z" fill="#FFF"></path>
</g>
</svg>
<span style="font-size: 16px; margin-left: 15px;">Thank you for your collaboration and support! Your contribution is greatly appreciated and will help us continue to improve.</span>
</div>
</div>
{% endif %}
<!-- The original content of the block -->
<script>
$(document).ready(function(){
$('#dismissButton').click(function() {
$('#originalContent').slideUp('slow', function() {
// If you want to do something after the slide-up, do it here.
// For example, you can hide the entire div:
// $(this).hide();
});
});
// When the form is submitted
$("#survey_report_form").submit(function(event){
event.preventDefault(); // Prevent the form from submitting traditionally
// Make the AJAX request
$.ajax({
url: $(this).attr("action"),
type: $(this).attr("method"),
data: $(this).serialize(),
success: function(response){
// Hide the original content block
$("#originalContent").slideUp(400, function() {
//$(this).css('display', 'none');
// Show the thank-you message block with slide down effect
$("#thankYouMessage").slideDown(400, function() {
// Wait for 3 seconds (3000 milliseconds) and then slide up the thank-you message
setTimeout(function() {
$("#thankYouMessage").slideUp(400);
}, 3000);
});
});
},
error: function(error){
// Handle any errors
console.error("Error sending report:", error);
}
});
});
});
</script>
{% endblock %}