forms.py 2.94 KB
Newer Older
1 2 3 4 5
"""
Defines forms for providing validation of embargo admin details.
"""

from django import forms
6
from django.utils.translation import ugettext as _
7

8
import ipaddr
9 10

from xmodule.modulestore.django import modulestore
11
from opaque_keys import InvalidKeyError
12
from opaque_keys.edx.keys import CourseKey
13

14
from .models import IPFilter, RestrictedCourse
15 16


17 18
class RestrictedCourseForm(forms.ModelForm):
    """Validate course keys for the RestrictedCourse model.
19

20 21 22 23 24 25 26 27
    The default behavior in Django admin is to:
    * Save course keys for courses that do not exist.
    * Return a 500 response if the course key format is invalid.

    Using this form ensures that we display a user-friendly
    error message instead.

    """
28
    class Meta(object):
29
        model = RestrictedCourse
30
        fields = '__all__'
31 32 33 34 35 36 37 38 39 40 41 42 43 44

    def clean_course_key(self):
        """Validate the course key.

        Checks that the key format is valid and that
        the course exists.  If not, displays an error message.

        Arguments:
            field_name (str): The name of the field to validate.

        Returns:
            CourseKey

        """
45
        cleaned_id = self.cleaned_data['course_key']
46
        error_msg = _('COURSE NOT FOUND.  Please check that the course ID is valid.')
47 48

        try:
49
            course_key = CourseKey.from_string(cleaned_id)
50
        except InvalidKeyError:
51
            raise forms.ValidationError(error_msg)
52 53

        if not modulestore().has_course(course_key):
54
            raise forms.ValidationError(error_msg)
55

56
        return course_key
57 58


59
class IPFilterForm(forms.ModelForm):
60 61
    """Form validating entry of IP addresses"""

62
    class Meta(object):
63
        model = IPFilter
64
        fields = '__all__'
65

66 67
    def _is_valid_ip(self, address):
        """Whether or not address is a valid ipv4 address or ipv6 address"""
68
        try:
69 70 71
            # Is this an valid ip address?
            ipaddr.IPNetwork(address)
        except ValueError:
72 73 74 75 76 77 78 79 80 81 82 83 84 85
            return False
        return True

    def _valid_ip_addresses(self, addresses):
        """
        Checks if a csv string of IP addresses contains valid values.

        If not, raises a ValidationError.
        """
        if addresses == '':
            return ''
        error_addresses = []
        for addr in addresses.split(','):
            address = addr.strip()
86
            if not self._is_valid_ip(address):
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
                error_addresses.append(address)
        if error_addresses:
            msg = 'Invalid IP Address(es): {0}'.format(error_addresses)
            msg += ' Please fix the error(s) and try again.'
            raise forms.ValidationError(msg)

        return addresses

    def clean_whitelist(self):
        """Validates the whitelist"""
        whitelist = self.cleaned_data["whitelist"]
        return self._valid_ip_addresses(whitelist)

    def clean_blacklist(self):
        """Validates the blacklist"""
        blacklist = self.cleaned_data["blacklist"]
        return self._valid_ip_addresses(blacklist)