from django import forms from django.conf import settings from .methods import get_next_state, is_mediacms_editor from .models import Category, Media, Subtitle class MultipleSelect(forms.CheckboxSelectMultiple): input_type = "checkbox" class MediaForm(forms.ModelForm): new_tags = forms.CharField(label="Tags", help_text="a comma separated list of new tags.", required=False) class Meta: model = Media fields = ( "title", "category", "new_tags", "add_date", "uploaded_poster", "description", "state", "enable_comments", "featured", "thumbnail_time", "reported_times", "is_reviewed", "allow_download", ) widgets = { "tags": MultipleSelect(), } def __init__(self, user, *args, **kwargs): self.user = user super(MediaForm, self).__init__(*args, **kwargs) if self.instance.media_type != "video": self.fields.pop("thumbnail_time") if not is_mediacms_editor(user): self.fields.pop("featured") self.fields.pop("reported_times") self.fields.pop("is_reviewed") # if settings.PORTAL_WORKFLOW == 'private': # self.fields.pop("state") if getattr(settings, 'USE_RBAC', False) and 'category' in self.fields: if is_mediacms_editor(user): pass else: self.fields['category'].initial = self.instance.category.all() non_rbac_categories = Category.objects.filter(is_rbac_category=False) rbac_categories = user.get_rbac_categories_as_contributor() combined_category_ids = list(non_rbac_categories.values_list('id', flat=True)) + list(rbac_categories.values_list('id', flat=True)) if self.instance.pk: instance_category_ids = list(self.instance.category.all().values_list('id', flat=True)) combined_category_ids = list(set(combined_category_ids + instance_category_ids)) self.fields['category'].queryset = Category.objects.filter(id__in=combined_category_ids).order_by('title') self.fields["new_tags"].initial = ", ".join([tag.title for tag in self.instance.tags.all()]) def clean_uploaded_poster(self): image = self.cleaned_data.get("uploaded_poster", False) if image: if image.size > 5 * 1024 * 1024: raise forms.ValidationError("Image file too large ( > 5mb )") return image def save(self, *args, **kwargs): data = self.cleaned_data state = data.get("state") if state != self.initial["state"]: self.instance.state = get_next_state(self.user, self.initial["state"], self.instance.state) media = super(MediaForm, self).save(*args, **kwargs) return media class SubtitleForm(forms.ModelForm): class Meta: model = Subtitle fields = ["language", "subtitle_file"] def __init__(self, media_item, *args, **kwargs): super(SubtitleForm, self).__init__(*args, **kwargs) self.instance.media = media_item self.fields["subtitle_file"].help_text = "SubRip (.srt) and WebVTT (.vtt) are supported file formats." self.fields["subtitle_file"].label = "Subtitle or Closed Caption File" def save(self, *args, **kwargs): self.instance.user = self.instance.media.user media = super(SubtitleForm, self).save(*args, **kwargs) return media class EditSubtitleForm(forms.Form): subtitle = forms.CharField(widget=forms.Textarea, required=True) def __init__(self, subtitle, *args, **kwargs): super(EditSubtitleForm, self).__init__(*args, **kwargs) self.fields["subtitle"].initial = subtitle.subtitle_file.read().decode("utf-8") class ContactForm(forms.Form): from_email = forms.EmailField(required=True) name = forms.CharField(required=False) message = forms.CharField(widget=forms.Textarea, required=True) def __init__(self, user, *args, **kwargs): super(ContactForm, self).__init__(*args, **kwargs) self.fields["name"].label = "Your name:" self.fields["from_email"].label = "Your email:" self.fields["message"].label = "Please add your message here and submit:" self.user = user if user.is_authenticated: self.fields.pop("name") self.fields.pop("from_email")