Ejemplo n.º 1
0
 def get(self, request, catalog_id):
     """Display a form to edit this catalog."""
     client = course_discovery_api_client(request.user)
     response = client.catalogs(catalog_id).get()
     catalog = Catalog(attributes=response)
     form = CatalogForm(instance=catalog)
     return render_to_response(self.template_name, self.get_context_data(catalog, form, client))
Ejemplo n.º 2
0
    def post(self, request, username):
        """Create a new catalog for a user."""
        form = CatalogForm(request.POST)
        client = course_discovery_api_client(request.user)
        if not form.is_valid():
            return render_to_response(self.template, self.get_context_data(client, username, form), status=400)

        attrs = form.instance.attributes
        catalog = client.catalogs.post(attrs)
        return redirect(reverse('api_admin:catalog-edit', kwargs={'catalog_id': catalog['id']}))
Ejemplo n.º 3
0
 def get(self, request, username):
     """Display a list of a user's catalogs."""
     client = course_discovery_api_client(request.user)
     catalogs = self._get_catalogs(client, username)
     return render_to_response(self.template, {
         'username': username,
         'catalogs': catalogs,
         'form': CatalogForm(initial={'viewers': [username]}),
         'preview_url': reverse('api_admin:catalog-preview'),
         'catalog_api_url': client.api.v1.courses.url(),
     })
Ejemplo n.º 4
0
 def get(self, request, catalog_id):
     """Display a form to edit this catalog."""
     client = course_discovery_api_client(request.user)
     response = client.api.v1.catalogs(catalog_id).get()
     catalog = Catalog(attributes=response)
     form = CatalogForm(instance=catalog)
     return render_to_response('api_admin/catalogs/edit.html', {
         'catalog': catalog,
         'form': form,
         'preview_url': reverse('api_admin:catalog-preview'),
         'catalog_api_url': client.api.v1.courses.url(),
     })
Ejemplo n.º 5
0
 def get(self, request, username):
     """Display a list of a user's catalogs."""
     client = course_discovery_api_client(request.user)
     response = client.api.v1.catalogs.get(username=username)
     catalogs = [Catalog(attributes=catalog) for catalog in response['results']]
     return render_to_response(self.template, {
         'username': username,
         'catalogs': catalogs,
         'form': CatalogForm(initial={'viewers': [username]}),
         'preview_url': reverse('api_admin:catalog-preview'),
         'catalog_api_url': client.api.v1.courses.url(),
     })
Ejemplo n.º 6
0
 def get(self, request):
     """
     Return the results of a query against the course catalog API. If no
     query parameter is given, returns an empty result set.
     """
     client = course_discovery_api_client(request.user)
     # Just pass along the request params including limit/offset pagination
     if 'q' in request.GET:
         results = client.courses.get(**request.GET)
     # Ensure that we don't just return all the courses if no query is given
     else:
         results = {'count': 0, 'results': [], 'next': None, 'prev': None}
     return JsonResponse(results)
Ejemplo n.º 7
0
 def post(self, request, catalog_id):
     """Update or delete this catalog."""
     client = course_discovery_api_client(request.user)
     if request.POST.get('delete-catalog') == 'on':
         client.catalogs(catalog_id).delete()
         return redirect(reverse('api_admin:catalog-search'))
     form = CatalogForm(request.POST)
     if not form.is_valid():
         response = client.catalogs(catalog_id).get()
         catalog = Catalog(attributes=response)
         return render_to_response(self.template_name, self.get_context_data(catalog, form, client), status=400)
     catalog = client.catalogs(catalog_id).patch(form.instance.attributes)
     return redirect(reverse('api_admin:catalog-edit', kwargs={'catalog_id': catalog['id']}))
Ejemplo n.º 8
0
def get_catalog_api_client(user):
    """
    Retrieve a course catalog API client.

    This method retrieves an authenticated API client that can be used
    to access the course catalog API. It raises an exception to be caught at
    a higher level if the package doesn't have OpenEdX resources available.
    """
    if course_discovery_api_client is None:
        raise NotConnectedToOpenEdX(
            _('To get a catalog API client, this package must be installed in an OpenEdX environment.'
              ))
    else:
        return course_discovery_api_client(user)
Ejemplo n.º 9
0
def is_course_in_enterprise_catalog(site, course_id, enterprise_catalog_id):
    """
    Verify that the provided course id exists in the site base list of course
    run keys from the provided enterprise course catalog.

    Arguments:
        course_id (str): The course ID.
        site: (django.contrib.sites.Site) site instance
        enterprise_catalog_id (Int): Course catalog id of enterprise

    Returns:
        Boolean

    """
    cache_key = get_cache_key(site_domain=site.domain,
                              resource='catalogs.contains',
                              course_id=course_id,
                              catalog_id=enterprise_catalog_id)
    response = cache.get(cache_key)
    if not response:
        catalog_integration = CatalogIntegration.current()
        if not catalog_integration.enabled:
            LOGGER.error("Catalog integration is not enabled.")
            return False

        try:
            user = User.objects.get(
                username=catalog_integration.service_username)
        except User.DoesNotExist:
            LOGGER.exception("Catalog service user '%s' does not exist.",
                             catalog_integration.service_username)
            return False

        try:
            # GET: /api/v1/catalogs/{catalog_id}/contains?course_run_id={course_run_ids}
            response = course_discovery_api_client(
                user=user).catalogs(enterprise_catalog_id).contains.get(
                    course_run_id=course_id)
            cache.set(cache_key, response, settings.COURSES_API_CACHE_TIMEOUT)
        except (ConnectionError, SlumberBaseException, Timeout):
            LOGGER.exception(
                'Unable to connect to Course Catalog service for catalog contains endpoint.'
            )
            return False

    try:
        return response['courses'][course_id]
    except KeyError:
        return False
Ejemplo n.º 10
0
    def post(self, request, username):
        """Create a new catalog for a user."""
        form = CatalogForm(request.POST)
        client = course_discovery_api_client(request.user)
        if not form.is_valid():
            catalogs = self._get_catalogs(client, username)
            return render_to_response(self.template, {
                'form': form,
                'catalogs': catalogs,
                'username': username,
                'preview_url': reverse('api_admin:catalog-preview'),
                'catalog_api_url': client.api.v1.courses.url(),
            }, status=400)

        attrs = form.instance.attributes
        catalog = client.api.v1.catalogs.post(attrs)
        return redirect(reverse('api_admin:catalog-edit', kwargs={'catalog_id': catalog['id']}))
Ejemplo n.º 11
0
 def post(self, request, catalog_id):
     """Update or delete this catalog."""
     client = course_discovery_api_client(request.user)
     if request.POST.get('delete-catalog') == 'on':
         client.api.v1.catalogs(catalog_id).delete()
         return redirect(reverse('api_admin:catalog-search'))
     form = CatalogForm(request.POST)
     if not form.is_valid():
         response = client.api.v1.catalogs(catalog_id).get()
         catalog = Catalog(attributes=response)
         return render_to_response('api_admin/catalogs/edit.html', {
             'catalog': catalog,
             'form': form,
             'preview_url': reverse('api_admin:catalog-preview'),
             'catalog_api_url': client.api.v1.courses.url(),
         }, status=400)
     catalog = client.api.v1.catalogs(catalog_id).patch(form.instance.attributes)
     return redirect(reverse('api_admin:catalog-edit', kwargs={'catalog_id': catalog['id']}))
Ejemplo n.º 12
0
    def __init__(self, user):
        """
        Create an Course Catalog API client, authenticated with the API token from Django settings.

        This method retrieves an authenticated API client that can be used
        to access the course catalog API. It raises an exception to be caught at
        a higher level if the package doesn't have OpenEdX resources available.
        """
        if CatalogIntegration is None:
            raise NotConnectedToOpenEdX(
                _("To get a CatalogIntegration object, this package must be "
                  "installed in an Open edX environment."))
        if get_edx_api_data is None:
            raise NotConnectedToOpenEdX(
                _("To parse a Catalog API response, this package must be "
                  "installed in an Open edX environment."))
        if course_discovery_api_client is None:
            raise NotConnectedToOpenEdX(
                _("To get a Catalog API client, this package must be "
                  "installed in an Open edX environment."))

        self.user = user
        self.client = course_discovery_api_client(user)
Ejemplo n.º 13
0
def is_course_in_enterprise_catalog(site, course_id, user, enterprise_catalog_id):
    """
    Verify that the provided course id exists in the site base list of course
    run keys from the provided enterprise course catalog.

    Arguments:
        course_id (str): The course ID.
        site: (django.contrib.sites.Site) site instance
        enterprise_catalog_id (Int): Course catalog id of enterprise

    Returns:
        Boolean

    """
    cache_key = get_cache_key(
        site_domain=site.domain,
        resource='catalogs.contains',
        course_id=course_id,
        catalog_id=enterprise_catalog_id
    )
    response = cache.get(cache_key)
    if not response:
        try:
            # GET: /api/v1/catalogs/{catalog_id}/contains?course_run_id={course_run_ids}
            response = course_discovery_api_client(user=user).catalogs(enterprise_catalog_id).contains.get(
                course_run_id=course_id
            )
            cache.set(cache_key, response, settings.COURSES_API_CACHE_TIMEOUT)
        except (ConnectionError, SlumberBaseException, Timeout):
            LOGGER.exception('Unable to connect to Course Catalog service for catalog contains endpoint.')
            return False

    try:
        return response['courses'][course_id]
    except KeyError:
        return False
Ejemplo n.º 14
0
 def get(self, request, username):
     """Display a list of a user's catalogs."""
     client = course_discovery_api_client(request.user)
     form = CatalogForm(initial={'viewers': [username]})
     return render_to_response(self.template, self.get_context_data(client, username, form))