from django.contrib.auth.models import User
from django import forms
+from django.forms import renderers
from django.db.models import Q
from django.db.utils import ProgrammingError
+from django.template.backends import django as django_template_backend
from patchwork.models import Bundle
from patchwork.models import Patch
from patchwork.models import UserProfile
+class PatchworkTableRenderer(renderers.EngineMixin, renderers.BaseRenderer):
+ backend = django_template_backend.DjangoTemplates
+ form_template_name = 'django/forms/table.html'
+ formset_template_name = 'django/forms/formsets/table.html'
+
+
class RegistrationForm(forms.Form):
first_name = forms.CharField(max_length=30, required=False)
last_name = forms.CharField(max_length=30, required=False)
},
]
+FORM_RENDERER = 'patchwork.forms.PatchworkTableRenderer'
+
# TODO(stephenfin): Consider changing to BigAutoField when we drop support for
# Django < 3.2
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
import re
+import django
from django.core import mail
from django.test import TestCase
from django.urls import reverse
response = self.client.post(reverse('mail-settings'), {'email': ''})
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, 'patchwork/mail.html')
- self.assertFormError(
- response, 'form', 'email', 'This field is required.'
- )
+ if django.VERSION >= (4, 1):
+ self.assertFormError(
+ response.context['form'],
+ 'email',
+ 'This field is required.',
+ )
+ else:
+ self.assertFormError(
+ response,
+ 'form',
+ 'email',
+ 'This field is required.',
+ )
def test_post_invalid(self):
response = self.client.post(reverse('mail-settings'), {'email': 'foo'})
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, 'patchwork/mail.html')
- self.assertFormError(response, 'form', 'email', error_strings['email'])
+ if django.VERSION >= (4, 1):
+ self.assertFormError(
+ response.context['form'],
+ 'email',
+ error_strings['email'],
+ )
+ else:
+ self.assertFormError(
+ response,
+ 'form',
+ 'email',
+ error_strings['email'],
+ )
def test_post_optin(self):
email = 'foo@example.com'
def test_post_empty(self):
response = self.client.post(reverse('mail-optout'), {'email': ''})
self.assertEqual(response.status_code, 200)
- self.assertFormError(
- response, 'form', 'email', 'This field is required.'
- )
+ if django.VERSION >= (4, 1):
+ self.assertFormError(
+ response.context['form'],
+ 'email',
+ 'This field is required.',
+ )
+ else:
+ self.assertFormError(
+ response,
+ 'form',
+ 'email',
+ 'This field is required.',
+ )
self.assertTrue(response.context['error'])
self.assertNotIn('confirmation', response.context)
self.assertEqual(len(mail.outbox), 0)
def test_post_non_email(self):
response = self.client.post(reverse('mail-optout'), {'email': 'foo'})
self.assertEqual(response.status_code, 200)
- self.assertFormError(response, 'form', 'email', error_strings['email'])
+ if django.VERSION >= (4, 1):
+ self.assertFormError(
+ response.context['form'],
+ 'email',
+ error_strings['email'],
+ )
+ else:
+ self.assertFormError(
+ response,
+ 'form',
+ 'email',
+ error_strings['email'],
+ )
self.assertTrue(response.context['error'])
self.assertNotIn('confirmation', response.context)
self.assertEqual(len(mail.outbox), 0)
def test_post_empty(self):
response = self.client.post(reverse('mail-optin'), {'email': ''})
self.assertEqual(response.status_code, 200)
- self.assertFormError(
- response, 'form', 'email', 'This field is required.'
- )
+ if django.VERSION >= (4, 1):
+ self.assertFormError(
+ response.context['form'],
+ 'email',
+ 'This field is required.',
+ )
+ else:
+ self.assertFormError(
+ response,
+ 'form',
+ 'email',
+ 'This field is required.',
+ )
self.assertTrue(response.context['error'])
self.assertNotIn('confirmation', response.context)
self.assertEqual(len(mail.outbox), 0)
def test_post_non_email(self):
response = self.client.post(reverse('mail-optin'), {'email': 'foo'})
self.assertEqual(response.status_code, 200)
- self.assertFormError(response, 'form', 'email', error_strings['email'])
+ if django.VERSION >= (4, 1):
+ self.assertFormError(
+ response.context['form'],
+ 'email',
+ error_strings['email'],
+ )
+ else:
+ self.assertFormError(
+ response,
+ 'form',
+ 'email',
+ error_strings['email'],
+ )
self.assertTrue(response.context['error'])
self.assertNotIn('confirmation', response.context)
self.assertEqual(len(mail.outbox), 0)
import re
import unittest
+import django
from django.conf import settings
from django.test import TestCase
from django.urls import reverse
new_states = [Patch.objects.get(pk=p.pk).state for p in self.patches]
self.assertEqual(new_states, orig_states)
- self.assertFormError(
- response,
- 'patchform',
- 'state',
- 'Select a valid choice. That choice is not one '
- 'of the available choices.',
- )
+ if django.VERSION >= (4, 1):
+ self.assertFormError(
+ response.context['patchform'],
+ 'state',
+ 'Select a valid choice. That choice is not one '
+ 'of the available choices.',
+ )
+ else:
+ self.assertFormError(
+ response,
+ 'patchform',
+ 'state',
+ 'Select a valid choice. That choice is not one '
+ 'of the available choices.',
+ )
def _test_delegate_change(self, delegate_str):
data = self.base_data.copy()
#
# SPDX-License-Identifier: GPL-2.0-or-later
+import django
from django.contrib.auth.models import User
from django.core import mail
from django.test.client import Client
del data[field]
response = self.client.post('/register/', data)
self.assertEqual(response.status_code, 200)
- self.assertFormError(response, 'form', field, self.required_error)
+ if django.VERSION >= (4, 1):
+ self.assertFormError(
+ response.context['form'],
+ field,
+ self.required_error,
+ )
+ else:
+ self.assertFormError(
+ response,
+ 'form',
+ field,
+ self.required_error,
+ )
def test_invalid_username(self):
data = self.default_data.copy()
data['username'] = 'invalid user'
response = self.client.post('/register/', data)
self.assertEqual(response.status_code, 200)
- self.assertFormError(response, 'form', 'username', self.invalid_error)
+ if django.VERSION >= (4, 1):
+ self.assertFormError(
+ response.context['form'],
+ 'username',
+ self.invalid_error,
+ )
+ else:
+ self.assertFormError(
+ response,
+ 'form',
+ 'username',
+ self.invalid_error,
+ )
def test_existing_username(self):
user = create_user()
data['username'] = user.username
response = self.client.post('/register/', data)
self.assertEqual(response.status_code, 200)
- self.assertFormError(
- response,
- 'form',
- 'username',
- 'This username is already taken. Please choose another.',
- )
+ if django.VERSION >= (4, 1):
+ self.assertFormError(
+ response.context['form'],
+ 'username',
+ 'This username is already taken. Please choose another.',
+ )
+ else:
+ self.assertFormError(
+ response,
+ 'form',
+ 'username',
+ 'This username is already taken. Please choose another.',
+ )
def test_existing_email(self):
user = create_user()
data['email'] = user.email
response = self.client.post('/register/', data)
self.assertEqual(response.status_code, 200)
- self.assertFormError(
- response,
- 'form',
- 'email',
- 'This email address is already in use for the account '
- '"%s".\n' % user.username,
- )
+ if django.VERSION >= (4, 1):
+ self.assertFormError(
+ response.context['form'],
+ 'email',
+ 'This email address is already in use for the account '
+ '"%s".\n' % user.username,
+ )
+ else:
+ self.assertFormError(
+ response,
+ 'form',
+ 'email',
+ 'This email address is already in use for the account '
+ '"%s".\n' % user.username,
+ )
def test_valid_registration(self):
response = self.client.post('/register/', self.default_data)
response = self.client.post(reverse('user-link'), {'email': ''})
self.assertEqual(response.status_code, 200)
self.assertTrue(response.context['linkform'])
- self.assertFormError(
- response, 'linkform', 'email', 'This field is required.'
- )
+ if django.VERSION >= (4, 1):
+ self.assertFormError(
+ response.context['linkform'],
+ 'email',
+ 'This field is required.',
+ )
+ else:
+ self.assertFormError(
+ response,
+ 'linkform',
+ 'email',
+ 'This field is required.',
+ )
def test_user_person_request_invalid(self):
response = self.client.post(reverse('user-link'), {'email': 'foo'})
self.assertEqual(response.status_code, 200)
self.assertTrue(response.context['linkform'])
- self.assertFormError(
- response, 'linkform', 'email', error_strings['email']
- )
+ if django.VERSION >= (4, 1):
+ self.assertFormError(
+ response.context['linkform'],
+ 'email',
+ error_strings['email'],
+ )
+ else:
+ self.assertFormError(
+ response,
+ 'linkform',
+ 'email',
+ error_strings['email'],
+ )
def test_user_person_request_valid(self):
response = self.client.post(
--- /dev/null
+---
+features:
+ - |
+ `Django 4.1 <https://docs.djangoproject.com/en/dev/releases/4.1/>`_ is
+ now supported.
[tox]
minversion = 3.2
-envlist = pep8,docs,py{37,38,39}-django32,py{38,39,310}-django{40}
+envlist = pep8,docs,py{37,38,39}-django32,py{38,39,310}-django{40,41}
skipsdist = true
ignore_basepython_conflict = true
deps =
-r{toxinidir}/requirements-test.txt
django32: django~=3.2.0
- django32: djangorestframework~=3.13.0
+ django32: djangorestframework~=3.14.0
django32: django-filter~=22.1.0
django40: django~=4.0.0
- django40: djangorestframework~=3.13.0
+ django40: djangorestframework~=3.14.0
django40: django-filter~=22.1.0
+ django41: django~=4.1.0
+ django41: djangorestframework~=3.14.0
+ django41: django-filter~=22.1.0
setenv =
DJANGO_SETTINGS_MODULE = patchwork.settings.dev
PYTHONDONTWRITEBYTECODE = 1