"""
Django Rest Framework view mixins.
"""
from django.core.exceptions import ValidationError
from django.http import Http404
from rest_framework import status
from rest_framework.mixins import CreateModelMixin
from rest_framework.response import Response


class PutAsCreateMixin(CreateModelMixin):
    """
    Backwards compatibility with Django Rest Framework v2, which allowed
    creation of a new resource using PUT.
    """

    def update(self, request, *args, **kwargs):
        """
        Create/update course modes for a course.
        """
        # First, try to update the existing instance
        try:
            try:
                return super(PutAsCreateMixin, self).update(request, *args, **kwargs)
            except Http404:
                # If no instance exists yet, create it.
                # This is backwards-compatible with the behavior of DRF v2.
                return super(PutAsCreateMixin, self).create(request, *args, **kwargs)

        # Backwards compatibility with DRF v2 behavior, which would catch model-level
        # validation errors and return a 400
        except ValidationError as err:
            return Response(err.messages, status=status.HTTP_400_BAD_REQUEST)