]> git.ozlabs.org Git - patchwork/blobdiff - apps/patchwork/forms.py
pwclient: honor PAGER for view
[patchwork] / apps / patchwork / forms.py
index ed55c4fc0bbdb1d6bdd15ed831343b0272037afb..82197696588b3ced6f8a86bf71e7db18d8e0dc4b 100644 (file)
 
 
 from django.contrib.auth.models import User
-from django import newforms as forms
+from django import forms
 
-from patchwork.models import RegistrationRequest, Patch, State, Bundle, \
-         UserProfile
+from patchwork.models import Patch, State, Bundle, UserProfile
 
-class RegisterForm(forms.ModelForm):
-    password = forms.CharField(widget = forms.PasswordInput)
-    email = forms.EmailField(max_length = 200)
+class RegistrationForm(forms.Form):
+    first_name = forms.CharField(max_length = 30, required = False)
+    last_name = forms.CharField(max_length = 30, required = False)
+    username = forms.RegexField(regex = r'^\w+$', max_length=30,
+                                label=u'Username')
+    email = forms.EmailField(max_length=100, label=u'Email address')
+    password = forms.CharField(widget=forms.PasswordInput(),
+                                label='Password')
 
-    class Meta:
-        model = RegistrationRequest
-        exclude = ['key']
+    def clean_username(self):
+        value = self.cleaned_data['username']
+        try:
+            user = User.objects.get(username__iexact = value)
+        except User.DoesNotExist:
+            return self.cleaned_data['username']
+        raise forms.ValidationError('This username is already taken. ' + \
+                                    'Please choose another.')
 
     def clean_email(self):
         value = self.cleaned_data['email']
         try:
-            User.objects.get(email = value)
-            raise forms.ValidationError(('The email address %s has ' +
-                    'has already been registered') % value)
+            user = User.objects.get(email__iexact = value)
         except User.DoesNotExist:
-            pass
-        try:
-            RegistrationRequest.objects.get(email = value)
-            raise forms.ValidationError(('The email address %s has ' +
-                    'has already been registered') % value)
-        except RegistrationRequest.DoesNotExist:
-            pass
-        return value
+            return self.cleaned_data['email']
+        raise forms.ValidationError('This email address is already in use ' + \
+                                    'for the account "%s".\n' % user.username)
 
-    def clean_username(self):
-        value = self.cleaned_data['username']
-        try:
-            User.objects.get(username = value)
-            raise forms.ValidationError(('The username %s has ' +
-                    'has already been registered') % value)
-        except User.DoesNotExist:
-            pass
-        try:
-            RegistrationRequest.objects.get(username = value)
-            raise forms.ValidationError(('The username %s has ' +
-                    'has already been registered') % value)
-        except RegistrationRequest.DoesNotExist:
-            pass
-        return value
+    def clean(self):
+        return self.cleaned_data
 
 class LoginForm(forms.Form):
     username = forms.CharField(max_length = 30)
     password = forms.CharField(widget = forms.PasswordInput)
 
 class BundleForm(forms.ModelForm):
+    name = forms.RegexField(regex = r'^[^/]+$', max_length=50, label=u'Name',
+            error_messages = {'invalid': 'Bundle names can\'t contain slashes'})
+
     class Meta:
         model = Bundle
         fields = ['name', 'public']
 
-class CreateBundleForm(forms.ModelForm):
+class CreateBundleForm(BundleForm):
     def __init__(self, *args, **kwargs):
         super(CreateBundleForm, self).__init__(*args, **kwargs)
 
@@ -90,9 +82,14 @@ class CreateBundleForm(forms.ModelForm):
                     % name)
         return name
 
+class DeleteBundleForm(forms.Form):
+    name = 'deletebundleform'
+    form_name = forms.CharField(initial = name, widget = forms.HiddenInput)
+    bundle_id = forms.IntegerField(widget = forms.HiddenInput)
+
 class DelegateField(forms.ModelChoiceField):
     def __init__(self, project, *args, **kwargs):
-       queryset = User.objects.filter(userprofile__in = \
+        queryset = User.objects.filter(userprofile__in = \
                 UserProfile.objects \
                         .filter(maintainer_projects = project) \
                         .values('pk').query)
@@ -101,12 +98,12 @@ class DelegateField(forms.ModelChoiceField):
 
 class PatchForm(forms.ModelForm):
     def __init__(self, instance = None, project = None, *args, **kwargs):
-       if (not project) and instance:
+        if (not project) and instance:
             project = instance.project
         if not project:
-           raise Exception("meep")
+            raise Exception("meep")
         super(PatchForm, self).__init__(instance = instance, *args, **kwargs)
-        self.fields['delegate'] = DelegateField(project)
+        self.fields['delegate'] = DelegateField(project, required = False)
 
     class Meta:
         model = Patch
@@ -119,6 +116,7 @@ class UserProfileForm(forms.ModelForm):
 
 class OptionalDelegateField(DelegateField):
     no_change_choice = ('*', 'no change')
+    to_field_name = None
 
     def __init__(self, no_change_choice = None, *args, **kwargs):
         self.filter = None
@@ -145,6 +143,7 @@ class OptionalDelegateField(DelegateField):
 
 class OptionalModelChoiceField(forms.ModelChoiceField):
     no_change_choice = ('*', 'no change')
+    to_field_name = None
 
     def __init__(self, no_change_choice = None, *args, **kwargs):
         self.filter = None
@@ -179,14 +178,33 @@ class MultipleBooleanField(forms.ChoiceField):
     def is_no_change(self, value):
         return value == self.no_change_choice[0]
 
-class MultiplePatchForm(PatchForm):
+    # TODO: Check whether it'd be worth to use a TypedChoiceField here; I
+    # think that'd allow us to get rid of the custom valid_value() and
+    # to_python() methods.
+    def valid_value(self, value):
+        if value in [v1 for (v1, v2) in self.choices]:
+            return True
+        return False
+
+    def to_python(self, value):
+        if value is None or self.is_no_change(value):
+            return self.no_change_choice[0]
+        elif value == 'True':
+            return True
+        elif value == 'False':
+            return False
+        else:
+            raise ValueError('Unknown value: %s' % value)
+
+class MultiplePatchForm(forms.Form):
+    action = 'update'
     state = OptionalModelChoiceField(queryset = State.objects.all())
     archived = MultipleBooleanField()
 
     def __init__(self, project, *args, **kwargs):
-        super(MultiplePatchForm, self).__init__(project = project,
-                *args, **kwargs)
-        self.fields['delegate'] = OptionalDelegateField(project = project)
+        super(MultiplePatchForm, self).__init__(*args, **kwargs)
+        self.fields['delegate'] = OptionalDelegateField(project = project,
+                required = False)
 
     def save(self, instance, commit = True):
         opts = instance.__class__._meta
@@ -194,20 +212,26 @@ class MultiplePatchForm(PatchForm):
             raise ValueError("The %s could not be changed because the data "
                     "didn't validate." % opts.object_name)
         data = self.cleaned_data
-        # remove 'no change fields' from the data
+        # Update the instance
         for f in opts.fields:
             if not f.name in data:
                 continue
 
-            field = getattr(self, f.name, None)
+            field = self.fields.get(f.name, None)
             if not field:
                 continue
 
             if field.is_no_change(data[f.name]):
-                del data[f.name]
+                continue
 
-        return forms.save_instance(self, instance,
-                self._meta.fields, 'changed', commit)
+            setattr(instance, f.name, data[f.name])
 
-class UserPersonLinkForm(forms.Form):
+        if commit:
+            instance.save()
+        return instance
+
+class EmailForm(forms.Form):
     email = forms.EmailField(max_length = 200)
+
+UserPersonLinkForm = EmailForm
+OptinoutRequestForm = EmailForm