from django import forms from django.utils.translation import ugettext_lazy as _ import datetime from .models import Subject, Tag class CreateSubjectForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(CreateSubjectForm, self).__init__(*args, **kwargs) if not kwargs['instance'] is None: self.initial['tags'] = ", ".join(self.instance.tags.all().values_list("name", flat = True)) # TODO: Define form fields here tags = forms.CharField(label = _('Tags'), required = False) class Meta: model = Subject fields = ('name', 'description_brief', 'description', 'subscribe_begin', 'subscribe_end', 'init_date', 'end_date', 'visible', 'professor', 'students', ) widgets = { 'description_brief': forms.Textarea, 'description': forms.Textarea, 'professor': forms.SelectMultiple, 'students': forms.SelectMultiple, } def save(self, commit=True): super(CreateSubjectForm, self).save(commit = True) self.instance.save() previous_tags = self.instance.tags.all() tags = self.cleaned_data['tags'].split(",") #Excluding unwanted tags for prev in previous_tags: if not prev.name in tags: self.instance.tags.remove(prev) for tag in tags: tag = tag.strip() exist = Tag.objects.filter(name = tag).exists() if exist: new_tag = Tag.objects.get(name = tag) else: new_tag = Tag.objects.create(name = tag) if not new_tag in self.instance.tags.all(): self.instance.tags.add(new_tag) return self.instance def clean_name(self): name = self.cleaned_data.get('name') if self.instance.id: same_name = Subject.objects.filter(name__unaccent__iexact = name).exclude(id = self.instance.id) else: same_name = Subject.objects.filter(name__unaccent__iexact = name) if same_name.count() > 0: self._errors['name'] = [_('There is another subject with this name, try another one.')] return name def clean_subscribe_begin(self): subscribe_begin = self.cleaned_data['subscribe_begin'] if subscribe_begin < datetime.datetime.today().date(): self._errors['subscribe_begin'] = [_('This date must be today or after')] return ValueError return subscribe_begin def clean_subscribe_end(self): subscribe_end = self.cleaned_data['subscribe_end'] subscribe_begin = self.cleaned_data['subscribe_begin'] if subscribe_begin is ValueError or subscribe_end < subscribe_begin: self._errors['subscribe_end'] = [_('This date must be equal subscribe begin or after')] return ValueError return subscribe_end def clean_init_date(self): init_date = self.cleaned_data['init_date'] subscribe_end = self.cleaned_data['subscribe_end'] if subscribe_end is ValueError or init_date <= subscribe_end: self._errors['init_date'] = [_('This date must be after subscribe end')] return ValueError return init_date def clean_end_date(self): end_date = self.cleaned_data['end_date'] init_date = self.cleaned_data['init_date'] if init_date is ValueError or end_date < init_date: self._errors['end_date'] = [_('This date must be equal init date or after')] return ValueError return end_date class UpdateSubjectForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(UpdateSubjectForm, self).__init__(*args, **kwargs) if not kwargs['instance'] is None: self.initial['tags'] = ", ".join(self.instance.tags.all().values_list("name", flat = True)) # TODO: Define form fields here tags = forms.CharField(label = _('Tags'), required = False) class Meta: model = Subject fields = ('name', 'description_brief', 'description', 'subscribe_begin', 'subscribe_end', 'init_date', 'end_date', 'visible', 'professor', 'students', ) widgets = { 'description_brief': forms.Textarea, 'description': forms.Textarea, 'professor': forms.SelectMultiple, 'students': forms.SelectMultiple, } def save(self, commit=True): super(UpdateSubjectForm, self).save(commit = True) self.instance.save() previous_tags = self.instance.tags.all() tags = self.cleaned_data['tags'].split(",") #Excluding unwanted tags for prev in previous_tags: if not prev.name in tags: self.instance.tags.remove(prev) for tag in tags: tag = tag.strip() exist = Tag.objects.filter(name = tag).exists() if exist: new_tag = Tag.objects.get(name = tag) else: new_tag = Tag.objects.create(name = tag) if not new_tag in self.instance.tags.all(): self.instance.tags.add(new_tag) return self.instance def clean_name(self): name = self.cleaned_data.get('name') if self.instance.id: same_name = Subject.objects.filter(name__unaccent__iexact = name).exclude(id = self.instance.id) else: same_name = Subject.objects.filter(name__unaccent__iexact = name) if same_name.count() > 0: self._errors['name'] = [_('There is another subject with this name, try another one.')] return name def clean_subscribe_begin(self): subscribe_begin = self.cleaned_data['subscribe_begin'] if subscribe_begin < datetime.datetime.today().date() and subscribe_begin < self.instance.subscribe_begin: self._errors['subscribe_begin'] = [_('This date must be today or after')] return ValueError return subscribe_begin def clean_subscribe_end(self): subscribe_end = self.cleaned_data['subscribe_end'] subscribe_begin = self.cleaned_data['subscribe_begin'] if subscribe_begin is ValueError or subscribe_end < subscribe_begin: self._errors['subscribe_end'] = [_('This date must be equal subscribe begin or after')] return ValueError return subscribe_end def clean_init_date(self): init_date = self.cleaned_data['init_date'] subscribe_end = self.cleaned_data['subscribe_end'] if subscribe_end is ValueError or init_date <= subscribe_end: self._errors['init_date'] = [_('This date must be after subscribe end')] return ValueError return init_date def clean_end_date(self): end_date = self.cleaned_data['end_date'] init_date = self.cleaned_data['init_date'] if init_date is ValueError or end_date < init_date: self._errors['end_date'] = [_('This date must be equal init date or after')] return ValueError return end_date class CreateTagForm(forms.ModelForm): class Meta: model = Tag fields = ('name',)