diff --git a/lms/djangoapps/learner_dashboard/programs.py b/lms/djangoapps/learner_dashboard/programs.py index 3da8a567fe..71485db581 100644 --- a/lms/djangoapps/learner_dashboard/programs.py +++ b/lms/djangoapps/learner_dashboard/programs.py @@ -218,6 +218,26 @@ class ProgramDiscussionLTI: self.program.get('subtitle', ''), ) + def _get_pii_lti_parameters(self, configuration, request): + """ + Get LTI parameters that contain PII. + + Args: + configuration (LtiConfiguration): LtiConfiguration object. + request (HttpRequest): Request object for view in which LTI will be embedded. + + Returns: + Dictionary with LTI parameters containing PII. + """ + if configuration.version != configuration.LTI_1P1: + return {} + pii_config = {} + if configuration.pii_share_username: + pii_config['person_sourcedid'] = request.user.username + if configuration.pii_share_email: + pii_config['person_contact_email_primary'] = request.user.email + return pii_config + def _get_lti_embed_code(self) -> str: """ Returns the LTI embed code for embedding in the program discussions tab @@ -226,6 +246,8 @@ class ProgramDiscussionLTI: """ resource_link_id = self._get_resource_link_id() result_sourcedid = self._get_result_sourcedid(resource_link_id) + pii_params = self._get_pii_lti_parameters(self.configuration.lti_configuration, self.request) + additional_params = self._get_additional_lti_parameters() return lti_embed( html_element_id='lti-tab-launcher', @@ -238,8 +260,8 @@ class ProgramDiscussionLTI: context_label=self.program_uuid, result_sourcedid=quote(result_sourcedid), locale=to_locale(get_language()), - additional_params=self._get_additional_lti_parameters() - + **pii_params, + **additional_params ) def render_iframe(self) -> str: diff --git a/openedx/core/djangoapps/discussions/admin.py b/openedx/core/djangoapps/discussions/admin.py index 870940a939..ae3fd1dea9 100644 --- a/openedx/core/djangoapps/discussions/admin.py +++ b/openedx/core/djangoapps/discussions/admin.py @@ -7,6 +7,7 @@ from simple_history.admin import SimpleHistoryAdmin from openedx.core.djangoapps.config_model_utils.admin import StackedConfigModelAdmin +from .forms import ProgramDiscussionsConfigurationForm from .models import DiscussionsConfiguration, ProgramDiscussionsConfiguration from .models import ProviderFilter @@ -31,6 +32,14 @@ class ProgramDiscussionsConfigurationAdmin(SimpleHistoryAdmin): """ Customize the admin interface for the program discussions configuration """ + form = ProgramDiscussionsConfigurationForm + + fieldsets = ( + (None, { + 'fields': ('program_uuid', 'enabled', 'lti_configuration', 'pii_share_username', 'pii_share_email', + 'provider_type'), + }), + ) search_fields = ( 'program_uuid', diff --git a/openedx/core/djangoapps/discussions/forms.py b/openedx/core/djangoapps/discussions/forms.py new file mode 100644 index 0000000000..17d81f87d9 --- /dev/null +++ b/openedx/core/djangoapps/discussions/forms.py @@ -0,0 +1,34 @@ +""" +Forms for discussions. +""" +from django import forms + +from .models import ProgramDiscussionsConfiguration + + +class ProgramDiscussionsConfigurationForm(forms.ModelForm): + """ + Custom ProgramDiscussionsConfiguration form for admin page + """ + pii_share_username = forms.BooleanField(required=False, initial=False) + pii_share_email = forms.BooleanField(required=False, initial=False) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if self.instance.lti_configuration: + self.fields['pii_share_username'].initial = self.instance.lti_configuration.pii_share_username + self.fields['pii_share_email'].initial = self.instance.lti_configuration.pii_share_email + + def save(self, commit=True): + pii_share_username = self.cleaned_data.get('pii_share_username', False) + pii_share_email = self.cleaned_data.get('pii_share_email', False) + lti_configuration = self.cleaned_data.get('lti_configuration', None) + if lti_configuration: + lti_configuration.pii_share_username = pii_share_username + lti_configuration.pii_share_email = pii_share_email + lti_configuration.save() + return super().save(commit=commit) + + class Meta: + model = ProgramDiscussionsConfiguration + fields = '__all__'