def build_tutorial_form(tutorial = None, disabled = False): base_fields = {'name' : forms.CharField(max_length = 75, min_length = 3, required = True, label = 'Tutorial Name', widget = form_widgets.BigCharfield(attrs={'class':'required', 'minlength':'3'}), help_text = 'Must be <= 75 characters.'), 'description' : form_fields.WMDField(max_length = 2000, min_length = 15, widget = form_widgets.WMDTextarea(attrs={'class':'required', 'minlength':'3', 'rows':15}, preview_id='tutorial_form_wmd_preview'), required = True, label = 'Description', help_text = 'Description of this tutorial. Markdown enabled.'), 'url' : forms.CharField(max_length = 70, min_length = 6, required = True, label = 'URL', widget = form_widgets.BigCharfield(attrs={'class':'required', 'minlength':'6'}), help_text = 'Location of this tutorial.'), 'tags': forms.CharField(max_length = 200, required = True, widget = form_widgets.StandardCharfield(attrs={'class':'required code_form'}), help_text = 'Combine multiple words into single-words. Seperate tags using commas. Maximum five tags. At least one tag required.') } if tutorial: del base_fields['tags'] base_fields['name'].initial = tutorial.name base_fields['description'].initial = tutorial.description base_fields['url'].initial = tutorial.url def clean_name(self): name = self.data['name'] if not models.Tutorial.objects.can_add(self.user): raise forms.ValidationError("You can only submit a max of 5 django tutorials a day. Please wait to submit more.") if models.Tutorial.objects.filter(name__iexact = name): raise forms.ValidationError("There is already a tutorial with that name.") return name TutorialForm = type('TutorialForm', (DivForm, ), base_fields) TutorialForm.clean_name = clean_name if disabled: disable_form(TutorialForm) return TutorialForm
def build_question_form(question = None, disabled = False): base_fields = {'title': forms.CharField(max_length = 200, min_length = 3, required = True, label = 'Title', widget = form_widgets.StandardCharfield(attrs={'class':'required question_form', 'minlength':'3'})) , 'question': form_fields.WMDField(max_length = 5000, min_length = 5, widget = form_widgets.WMDTextarea(attrs={'class':'required', 'minlength':'10'}, preview_id='question_form_wmd_preview'), required = True, label = '', help_text = 'What is this question?. Be descriptive. Required.'), 'tags': forms.CharField(max_length = 200, min_length = 3, required = True, widget = form_widgets.StandardCharfield(attrs={'class':'required question_form', 'minlength':'3'}), help_text = 'Combine multiple words into single-words. Seperate tags using commas. Maximum five tags. At least one tag required.') } if question: del base_fields['tags'] base_fields['title'].initial = question.name base_fields['question'].initial = question.question def clean_title(self): title = self.data['title'] if not models.Question.objects.can_add(self.user): raise forms.ValidationError("You can only ask a max of 5 questions per day. Please wait to ask more.") if not question and models.Question.objects.filter(name__iexact = title): raise forms.ValidationError("There is already a question with that title.") if question: try: existing_question = models.Question.objects.get(name__iexact = title) if not existing_question.id == question.id: raise forms.ValidationError("There is already a question with that title.") except ObjectDoesNotExist: pass return title QuestionForm = type('QuestionForm', (DivForm, ), base_fields) QuestionForm.clean_title = clean_title if disabled: disable_form(QuestionForm) return QuestionForm
def build_answer_form(answer = None, disabled = False): base_fields = {'answer': form_fields.WMDField(max_length = 2000, min_length = 5, widget = form_widgets.WMDTextarea(attrs={'class':'required', 'minlength':'10'}, preview_id='answer_form_wmd_preview'), required = True, label = '', help_text = 'Markdown enabled.') } if answer: base_fields['answer'].initial = answer.answer base_fields['answer'].label = 'Answer' def clean_answer(self): answer = self.cleaned_data['answer'] if not settings.MULTIPLE_ANSWERS_PER_USER and models.Answer.objects.filter(question = self.question, user = self.user): raise forms.ValidationError("You can ony submit one answer per question. Please edit the answer you posted previously.") return answer AnswerForm = type('AnswerForm', (DivForm, ), base_fields) if disabled: disable_form(AnswerForm) return AnswerForm
def build_code_form(code = None, disabled = False): base_fields = {'title': forms.CharField(max_length = 70, min_length = 3, required = True, label = 'Code Name', widget = form_widgets.BigCharfield(attrs={'class':'required code_form', 'minlength':'3'}), help_text = 'Must be <= 75 characters.'), 'mode': forms.ChoiceField(choices = models.CodeMode.MODES, help_text = 'What kind of code snippet is this?'), 'description': form_fields.WMDField(max_length = 2000, min_length = 15, widget = form_widgets.WMDTextarea(attrs={'class':'required', 'minlength':'3'}, preview_id='code_form_wmd_preview'), required = True, help_text = 'Give a detailed description of this code snippet. Markdown enabled.'), 'code': forms.CharField(max_length = 5000, min_length = 25, widget = form_widgets.GiantTextarea(attrs={'class':'required code_form', 'minlength':'5'}), required = True, label = 'Code', help_text = 'The actual code.'), 'tags': forms.CharField(max_length = 200, required = True, widget = form_widgets.StandardCharfield(attrs={'class':'required code_form'}), help_text = 'Combine multiple words into single-words. Seperate tags using commas. Maximum five tags. At least one tag required.') } if code: del base_fields['tags'] base_fields['title'].initial = code.name base_fields['mode'].initial = code.mode.name base_fields['description'].initial = code.description base_fields['code'].initial = code.code def clean_title(self): title = self.data['title'] mode = self.data['mode'] try: code_mode = models.CodeMode.objects.get(name = mode) except ObjectDoesNotExist: code_mode = None if models.Code.objects.filter(name__iexact = title, mode = code_mode): raise forms.ValidationError("A code snippet with that title already exists.") if not models.Code.objects.can_add(self.user): raise forms.ValidationError("You can only submit a max of 5 code snippets a day. Please wait to submit more.") return title def clean_code(self): code = self.cleaned_data['code'] return code CodeForm = type('CodeForm', (DivForm, ), base_fields) CodeForm.clean_title = clean_title if disabled: disable_form(CodeForm) return CodeForm
def build_app_form(app = None, disabled = False): dependencies_content_type_object = ContentType.objects.get_for_model(models.App) dependencies_object_id = -1 # default id to denote new object dependencies_usage = 'dependency' base_fields = {'name' : forms.CharField(max_length = 75, min_length = 3, required = True, label = 'App Name', widget = form_widgets.BigCharfield(attrs={'class':'required'}), help_text = 'Must be <= 75 characters.'), 'version' : forms.CharField(max_length = 75, min_length = 3, required = True, label = 'Version', widget = form_widgets.BigCharfield(attrs={'class':'required'}), help_text = 'Version number. Must be unique when combined with app name.'), 'url' : forms.URLField(max_length = 50, min_length = 3, required = True, label = 'Homepage', widget = form_widgets.BigCharfield(attrs={'class':'required'}), help_text = 'Required. Homepage of this app.'), 'sources' : forms.CharField(max_length = 100, min_length = 3, required = True, label = 'Sources', widget = form_widgets.BigCharfield(), help_text = 'Location(s) where the source code can be downloaded from. Comma separated.'), 'description' : form_fields.WMDField(max_length = 2000, min_length = 15, widget = form_widgets.WMDTextarea(attrs={'class':'required', 'minlength':'10'}, preview_id='app_form_wmd_preview'), required = True, label = 'Description', help_text = 'Give a detailed description of this app. Markdown enabled.'), 'python' : forms.MultipleChoiceField(choices = Python.objects.versions(), widget = forms.widgets.CheckboxSelectMultiple(), label = 'Python Dependency', help_text = 'Which versions of Python is this app compatible with? Minimum one required.'), 'django' : forms.MultipleChoiceField(widget = forms.widgets.CheckboxSelectMultiple(), label = 'Django Dependency', choices = Django.objects.versions(), help_text = 'Which versions of Django is this app compatible with? Minimum one required.'), 'dependencies' : RelatedContentField(base_content_type = dependencies_content_type_object.id, object_id = dependencies_object_id, usage = dependencies_usage, iframe_width = 800, required = False, iframe_height = 600, help_text = 'Other apps on which this apps depends to function.'), 'tags' : forms.CharField(max_length = 200, required = True, widget = form_widgets.StandardCharfield(attrs={'class':'required code_form'}), help_text = 'Combine multiple words into single-words. Seperate tags using commas. Maximum five tags. At least one tag required.') } if app: del base_fields['dependencies'] del base_fields['tags'] base_fields['name'].initial = app.name base_fields['version'].initial = app.version base_fields['url'].initial = app.url base_fields['sources'].initial = ",".join(models.App.objects.sources(app)) base_fields['description'].initial = app.description base_fields['python'].initial = models.App.objects.python_versions(app) base_fields['django'].initial = models.App.objects.django_versions(app) def clean_name(self): name = self.data['name'] if not models.App.objects.can_add(self.user): raise forms.ValidationError("You can only submit a max of 5 django apps a day. Please wait to submit more.") if models.App.objects.filter(name__iexact = name): raise forms.ValidationError("There is already an app with that name.") return name AppForm = type('AppForm', (DivForm, ), base_fields) AppForm.clean_name = clean_name if disabled: disable_form(AppForm) return AppForm