diff options
Diffstat (limited to 'pgcommitfest/commitfest/forms.py')
-rw-r--r-- | pgcommitfest/commitfest/forms.py | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/pgcommitfest/commitfest/forms.py b/pgcommitfest/commitfest/forms.py new file mode 100644 index 0000000..af3bd45 --- /dev/null +++ b/pgcommitfest/commitfest/forms.py @@ -0,0 +1,77 @@ +from django import forms +from django.forms import ValidationError + +from selectable.forms.widgets import AutoCompleteSelectMultipleWidget + +from models import Patch, MailThread +from lookups import UserLookup +from ajax import _archivesAPI + +class PatchForm(forms.ModelForm): + class Meta: + model = Patch + exclude = ('commitfests', 'mailthreads', 'modified', ) + widgets = { + 'authors': AutoCompleteSelectMultipleWidget(lookup_class=UserLookup, position='top'), + 'reviewers': AutoCompleteSelectMultipleWidget(lookup_class=UserLookup, position='top'), + } + + def __init__(self, *args, **kwargs): + super(PatchForm, self).__init__(*args, **kwargs) + self.fields['authors'].help_text = 'Enter part of name to see list' + self.fields['reviewers'].help_text = 'Enter part of name to see list' + self.fields['committer'].label_from_instance = lambda x: '%s %s (%s)' % (x.user.first_name, x.user.last_name, x.user.username) + + +def _fetch_thread_choices(patch): + for mt in patch.mailthread_set.order_by('-latestmessage'): + ti = sorted(_archivesAPI('/message-id.json/%s' % mt.messageid), key=lambda x: x['date'], reverse=True) + yield [mt.subject, + [('%s,%s' % (mt.messageid, t['msgid']),'From %s at %s' % (t['from'], t['date'])) for t in ti]] + + +review_state_choices = ( + (0, 'Tested'), + (1, 'Passed'), +) + +def reviewfield(label): + return forms.MultipleChoiceField(choices=review_state_choices, label=label, widget=forms.CheckboxSelectMultiple, required=False) + +class CommentForm(forms.Form): + responseto = forms.ChoiceField(choices=[], required=True, label='In response to') + + # Specific checkbox fields for reviews + review_installcheck = reviewfield('make installcheck') + review_implements = reviewfield('Implements feature') + review_spec = reviewfield('Spec compliant') + review_doc = reviewfield('Documentation') + + message = forms.CharField(required=True, widget=forms.Textarea) + + def __init__(self, patch, is_review, *args, **kwargs): + super(CommentForm, self).__init__(*args, **kwargs) + self.is_review = is_review + + self.fields['responseto'].choices = _fetch_thread_choices(patch) + if not is_review: + del self.fields['reviewtype'] + + def clean_responseto(self): + try: + (threadid, respid) = self.cleaned_data['responseto'].split(',') + self.thread = MailThread.objects.get(messageid=threadid) + self.respid = respid + except MailThread.DoesNotExist: + raise ValidationError('Selected thread appears to no longer exist') + except: + raise ValidationError('Invalid message selected') + return self.cleaned_data['responseto'] + + def clean(self): + if self.is_review: + for fn,f in self.fields.items(): + if fn.startswith('review_') and self.cleaned_data.has_key(fn): + if '1' in self.cleaned_data[fn] and not '0' in self.cleaned_data[fn]: + self.errors[fn] = (('Cannot pass a test without performing it!'),) + return self.cleaned_data |