def test_validate_text_count(self, text_to_validate, expected_clean_text):
        """Tests that validate text count work as expected"""
        max_length_allowed = len(expected_clean_text)
        validate_text_count(max_length_allowed)(text_to_validate)

        # Verify you get a Validation Error if try go below the max.
        with self.assertRaises(ValidationError):
            validate_text_count(max_length_allowed - 1)(text_to_validate)
class CustomCourseForm(CourseForm):
    """ Course Form. """
    organization = forms.ModelChoiceField(queryset=Organization.objects.filter(
        organization_extension__organization_id__isnull=False).order_by(
            Lower('key')),
                                          label=_('Organization Name'),
                                          required=True)
    title = forms.CharField(label=_('Course Title'), required=True)
    number = forms.CharField(label=_('Course Number'),
                             required=True,
                             validators=[validate_text_count(max_length=50)])
    short_description = forms.CharField(
        label=_('Short Description'),
        widget=forms.Textarea,
        required=False,
        validators=[validate_text_count(max_length=255)])
    full_description = forms.CharField(
        label=_('Long Description'),
        widget=forms.Textarea,
        required=False,
        validators=[validate_text_count(max_length=2500)])
    prerequisites = forms.CharField(
        label=_('Prerequisites'),
        widget=forms.Textarea,
        required=False,
        validators=[validate_text_count(max_length=200)])

    # users will be loaded through AJAX call based on organization
    team_admin = UserModelChoiceField(
        queryset=User.objects.none(),
        required=True,
        label=_('Organization Course Admin'),
    )

    subjects = Subject.objects.all().order_by('name')
    primary_subject = forms.ModelChoiceField(queryset=subjects,
                                             label=_('Primary'),
                                             required=False)
    secondary_subject = forms.ModelChoiceField(
        queryset=subjects,
        label=_('Additional Subject (optional)'),
        required=False)
    tertiary_subject = forms.ModelChoiceField(
        queryset=subjects,
        label=_('Additional Subject (optional)'),
        required=False)

    level_type = forms.ModelChoiceField(
        queryset=LevelType.objects.all().order_by('-name'),
        label=_('Level'),
        required=False)

    expected_learnings = forms.CharField(
        label=_('What You Will Learn'),
        widget=forms.Textarea,
        required=False,
        validators=[validate_text_count(max_length=2500)])

    learner_testimonial = forms.CharField(
        label=_('Learner Testimonial'),
        widget=forms.Textarea,
        required=False,
        validators=[validate_text_count(max_length=500)])

    faq = forms.CharField(label=_('FAQ'),
                          widget=forms.Textarea,
                          required=False,
                          validators=[validate_text_count(max_length=2500)])

    syllabus = forms.CharField(
        label=_('Syllabus'),
        widget=forms.Textarea,
        required=False,
        validators=[validate_text_count(max_length=2500)])

    add_new_run = forms.BooleanField(required=False)

    class Meta(CourseForm.Meta):
        model = Course
        widgets = {'image': ClearableImageInput(attrs={'accept': 'image/*'})}
        fields = (
            'title',
            'number',
            'short_description',
            'full_description',
            'expected_learnings',
            'primary_subject',
            'secondary_subject',
            'tertiary_subject',
            'prerequisites',
            'image',
            'team_admin',
            'level_type',
            'organization',
            'is_seo_review',
            'syllabus',
            'learner_testimonial',
            'faq',
            'video_link',
        )

    def __init__(self, *args, **kwargs):
        # In case of edit mode pre-populate the drop-downs
        user = kwargs.pop('user', None)
        organization = kwargs.pop('organization', None)
        if organization:
            org_extension = OrganizationExtension.objects.get(
                organization=organization)
            self.declared_fields['team_admin'].queryset = User.objects.filter(
                groups__name=org_extension.group).order_by(
                    'full_name', 'username')

        if user:
            self.declared_fields[
                'organization'].queryset = get_user_organizations(user)
            self.declared_fields['team_admin'].widget.attrs = {
                'data-user': user.id
            }

        super(CustomCourseForm, self).__init__(*args, **kwargs)

        if user and not is_internal_user(user):
            self.fields['video_link'].widget = forms.HiddenInput()

    def clean_title(self):
        """
        Convert all named and numeric character references in the string
        to the corresponding unicode characters
        """
        return html.unescape(self.cleaned_data.get("title"))

    def clean(self):
        cleaned_data = self.cleaned_data
        organization = cleaned_data.get("organization")
        title = cleaned_data.get("title")
        number = cleaned_data.get("number")
        instance = getattr(self, 'instance', None)
        if not instance.pk:
            if Course.objects.filter(title=title,
                                     organizations__in=[organization
                                                        ]).exists():
                raise ValidationError(
                    {'title': _('This course title already exists')})
            if Course.objects.filter(number=number,
                                     organizations__in=[organization
                                                        ]).exists():
                raise ValidationError(
                    {'number': _('This course number already exists')})
        return cleaned_data