Ejemplo n.º 1
0
    def to_representation(self, instance):
        """
        Serialize the EnterpriseCustomerCatalog object.

        Arguments:
            instance (EnterpriseCustomerCatalog): The EnterpriseCustomerCatalog to serialize.

        Returns:
            dict: The EnterpriseCustomerCatalog converted to a dict.
        """
        request = self.context['request']
        enterprise_customer = instance.enterprise_customer

        representation = super(EnterpriseCustomerCatalogDetailSerializer,
                               self).to_representation(instance)

        # Retrieve the EnterpriseCustomerCatalog search results from the discovery service.
        paginated_content = instance.get_paginated_content(request.GET)
        count = paginated_content['count']
        search_results = paginated_content['results']

        for item in search_results:
            content_type = item[ContentType.METADATA_KEY]
            marketing_url = item.get('marketing_url')
            if marketing_url:
                item['marketing_url'] = utils.update_query_parameters(
                    marketing_url,
                    utils.get_enterprise_utm_context(enterprise_customer))
            # Add the Enterprise enrollment URL to each content item returned from the discovery service.
            if content_type == ContentType.COURSE:
                item['enrollment_url'] = instance.get_course_enrollment_url(
                    item['key'])
                item['active'] = has_course_run_available_for_enrollment(
                    item['course_runs'])
            if content_type == ContentType.COURSE_RUN:
                item[
                    'enrollment_url'] = instance.get_course_run_enrollment_url(
                        item['key'], item[ContentType.COURSE])
            if content_type == ContentType.PROGRAM:
                item['enrollment_url'] = instance.get_program_enrollment_url(
                    item['uuid'])

        # Build pagination URLs
        previous_url = None
        next_url = None
        page = int(request.GET.get('page', '1'))
        request_uri = request.build_absolute_uri()
        if paginated_content['previous']:
            previous_url = utils.update_query_parameters(
                request_uri, {'page': page - 1})
        if paginated_content['next']:
            next_url = utils.update_query_parameters(request_uri,
                                                     {'page': page + 1})

        representation['count'] = count
        representation['previous'] = previous_url
        representation['next'] = next_url
        representation['results'] = search_results

        return representation
Ejemplo n.º 2
0
    def update_course(self, course, enterprise_customer, enterprise_context):
        """
        Update course metadata of the given course and return updated course.

        Arguments:
            course (dict): Course Metadata returned by course catalog API
            enterprise_customer (EnterpriseCustomer): enterprise customer instance.
            enterprise_context (dict): Enterprise context to be added to course runs and URLs..

        Returns:
            (dict): Updated course metadata
        """
        course['course_runs'] = self.update_course_runs(
            course_runs=course.get('course_runs') or [],
            enterprise_customer=enterprise_customer,
            enterprise_context=enterprise_context,
            parent_course_key=course['key'],
        )

        # Update marketing urls in course metadata to include enterprise related info (i.e. our global context).
        marketing_url = course.get('marketing_url')
        if marketing_url:
            query_parameters = dict(
                enterprise_context,
                **utils.get_enterprise_utm_context(enterprise_customer))
            course.update({
                'marketing_url':
                utils.update_query_parameters(marketing_url, query_parameters)
            })

        # Finally, add context to the course as a whole.
        course.update(enterprise_context)
        return course
Ejemplo n.º 3
0
    def update_course_runs(self, course_runs, enterprise_customer, enterprise_context):
        """
        Update Marketing urls in course metadata and return updated course.

        Arguments:
            course_runs (list): List of course runs.
            enterprise_customer (EnterpriseCustomer): enterprise customer instance.
            enterprise_context (dict): The context to inject into URLs.

        Returns:
            (dict): Dictionary containing updated course metadata.
        """
        updated_course_runs = []
        for course_run in course_runs:
            track_selection_url = utils.get_course_track_selection_url(
                course_run=course_run,
                query_parameters=dict(enterprise_context, **utils.get_enterprise_utm_context(enterprise_customer)),
            )

            enrollment_url = enterprise_customer.get_course_run_enrollment_url(course_run.get('key'))

            course_run.update({
                'enrollment_url': enrollment_url,
                'track_selection_url': track_selection_url,
            })

            # Update marketing urls in course metadata to include enterprise related info.
            marketing_url = course_run.get('marketing_url')
            if marketing_url:
                query_parameters = dict(enterprise_context, **utils.get_enterprise_utm_context(enterprise_customer))
                course_run.update({'marketing_url': utils.update_query_parameters(marketing_url, query_parameters)})

            # Add updated course run to the list.
            updated_course_runs.append(course_run)
        return updated_course_runs
Ejemplo n.º 4
0
    def test_update_query_parameters(self, url, query_parameters,
                                     expected_url_parts):
        """
        Test `update_query_parameters` helper method.
        """
        url = utils.update_query_parameters(url, query_parameters)

        # Make sure all query parameters are present We can not assert whole urls because we can
        # not determine the position of these query parameters.
        # e.g. `http://<base>?course=test-course&tpa_hint=test-shib` and
        # `http://<base>?tpa_hint=test-shib&course=test-course` are both same urls but different strings.
        for url_part in expected_url_parts:
            assert url_part in url
Ejemplo n.º 5
0
def update_url_with_enterprise_context(url, add_utm_info=True, enterprise_catalog_uuid=None):
    """
    Append enterprise-related query parameters to the given URL.
    """
    query_params = {}

    if enterprise_catalog_uuid:
        query_params['catalog'] = enterprise_catalog_uuid

    if add_utm_info:
        query_params['utm_medium'] = 'enterprise'
        query_params['utm_source'] = 'test_enterprise'

    url = utils.update_query_parameters(url, query_params)
    return url
Ejemplo n.º 6
0
    def update_course_runs(self, course_runs, catalog_id, enterprise_customer):
        """
        Update Marketing urls in course metadata adn return updated course.

        Arguments:
            course_runs (list): List of course runs.
            catalog_id (int): Course catalog identifier.
            enterprise_customer (EnterpriseCustomer): enterprise customer instance.

        Returns:
            (dict): Dictionary containing updated course metadata.
        """
        updated_course_runs = []

        query_parameters = {
            'tpa_hint': enterprise_customer
            and enterprise_customer.identity_provider,
            'enterprise_id': enterprise_customer and enterprise_customer.uuid,
            'catalog_id': catalog_id,
        }

        for course_run in course_runs:
            track_selection_url = utils.get_course_track_selection_url(
                course_run=course_run,
                query_parameters=query_parameters,
            )

            enrollment_url = enterprise_customer.get_course_enrollment_url(
                course_run.get('key'))

            # Add/update track selection url in course run metadata.
            course_run.update({
                'track_selection_url': track_selection_url,
                'enrollment_url': enrollment_url
            })

            # Update marketing urls in course metadata to include enterprise related info.
            if course_run.get('marketing_url'):
                course_run.update({
                    "marketing_url":
                    utils.update_query_parameters(
                        course_run.get('marketing_url'), query_parameters),
                })

            # Add updated course run to the list.
            updated_course_runs.append(course_run)

        return updated_course_runs
Ejemplo n.º 7
0
    def update_course(self, course, catalog_id, enterprise_customer,
                      global_context):
        """
        Update course metadata of the given course and return updated course.

        Arguments:
            course (dict): Course Metadata returned by course catalog API
            catalog_id (int): identifier of the catalog given course belongs to.
            enterprise_customer (EnterpriseCustomer): enterprise customer instance.
            global_context (dict): Global attributes that should be added to all the courses.

        Returns:
            (dict): Updated course metadata
        """
        # extract course runs from course metadata and
        # Replace course's course runs with the updated course runs
        course['course_runs'] = self.update_course_runs(
            course_runs=course.get('course_runs') or [],
            catalog_id=catalog_id,
            enterprise_customer=enterprise_customer,
        )

        # Update marketing urls in course metadata to include enterprise related info.
        if course.get('marketing_url'):
            course.update({
                "marketing_url":
                utils.update_query_parameters(
                    course.get('marketing_url'),
                    {
                        'tpa_hint':
                        enterprise_customer
                        and enterprise_customer.identity_provider,
                        'enterprise_id':
                        enterprise_customer and enterprise_customer.uuid,
                        'catalog_id':
                        catalog_id,
                    },
                ),
            })

        # now add global context to the course.
        course.update(global_context)
        return course