from patchwork.models import CoverLetter
from patchwork.models import Event
from patchwork.models import Patch
+from patchwork.models import Person
from patchwork.models import Project
from patchwork.models import Series
from patchwork.models import State
since = IsoDateTimeFilter(name='date', lookup_expr='gte')
-class ProjectChoiceField(ModelChoiceField):
+class ModelMultiChoiceField(ModelChoiceField):
+
+ def _get_filters(self, value):
+ raise NotImplementedError
def to_python(self, value):
if value in self.empty_values:
return None
- try:
- filters = {'pk': int(value)}
- except ValueError:
- filters = {'linkname__iexact': value}
+ filters = self._get_filters(value)
try:
value = self.queryset.get(**filters)
return value
+class ProjectChoiceField(ModelMultiChoiceField):
+
+ def _get_filters(self, value):
+ try:
+ return {'pk': int(value)}
+ except ValueError:
+ return {'linkname__iexact': value}
+
+
class ProjectFilter(ModelChoiceFilter):
field_class = ProjectChoiceField
queryset=Project.objects.all())
+class PersonChoiceField(ModelMultiChoiceField):
+
+ def _get_filters(self, value):
+ try:
+ return {'pk': int(value)}
+ except ValueError:
+ return {'email__iexact': value}
+
+
+class PersonFilter(ModelChoiceFilter):
+
+ field_class = PersonChoiceField
+
+
class SeriesFilter(ProjectMixin, TimestampMixin, FilterSet):
+ submitter = PersonFilter(queryset=Person.objects.all())
+
class Meta:
model = Series
fields = ('submitter', 'project')
class CoverLetterFilter(ProjectMixin, TimestampMixin, FilterSet):
+ submitter = PersonFilter(queryset=Person.objects.all())
+
class Meta:
model = CoverLetter
fields = ('project', 'series', 'submitter')
class PatchFilter(ProjectMixin, TimestampMixin, FilterSet):
state = StateFilter(queryset=State.objects.all())
+ submitter = PersonFilter(queryset=Person.objects.all())
class Meta:
model = Patch
self.assertEqual(status.HTTP_200_OK, resp.status_code)
self.assertEqual(0, len(resp.data))
+ person_obj = create_person(email='test@example.com')
state_obj = create_state(name='Under Review')
project_obj = create_project(linkname='myproject')
- patch_obj = create_patch(state=state_obj, project=project_obj)
+ patch_obj = create_patch(state=state_obj, project=project_obj,
+ submitter=person_obj)
# anonymous user
resp = self.client.get(self.api_url())
resp = self.client.get(self.api_url(), {'project': 'invalidproject'})
self.assertEqual(0, len(resp.data))
+ # test filtering by submitter, both ID and email
+ resp = self.client.get(self.api_url(), {'submitter': person_obj.id})
+ self.assertEqual([patch_obj.id], [x['id'] for x in resp.data])
+ resp = self.client.get(self.api_url(), {
+ 'submitter': 'test@example.com'})
+ self.assertEqual([patch_obj.id], [x['id'] for x in resp.data])
+ resp = self.client.get(self.api_url(), {
+ 'submitter': 'test@example.org'})
+ self.assertEqual(0, len(resp.data))
+
def test_detail(self):
"""Validate we can get a specific patch."""
patch = create_patch(
self.assertEqual(status.HTTP_200_OK, resp.status_code)
self.assertEqual(0, len(resp.data))
+ person_obj = create_person(email='test@example.com')
project_obj = create_project(linkname='myproject')
- cover_obj = create_cover(project=project_obj)
+ cover_obj = create_cover(project=project_obj, submitter=person_obj)
# anonymous user
resp = self.client.get(self.api_url())
resp = self.client.get(self.api_url(), {'project': 'invalidproject'})
self.assertEqual(0, len(resp.data))
+ # test filtering by submitter, both ID and email
+ resp = self.client.get(self.api_url(), {'submitter': person_obj.id})
+ self.assertEqual([cover_obj.id], [x['id'] for x in resp.data])
+ resp = self.client.get(self.api_url(), {
+ 'submitter': 'test@example.com'})
+ self.assertEqual([cover_obj.id], [x['id'] for x in resp.data])
+ resp = self.client.get(self.api_url(), {
+ 'submitter': 'test@example.org'})
+ self.assertEqual(0, len(resp.data))
+
def test_detail(self):
"""Validate we can get a specific cover letter."""
cover_obj = create_cover()
self.assertEqual(status.HTTP_200_OK, resp.status_code)
self.assertEqual(0, len(resp.data))
+ person_obj = create_person(email='test@example.com')
project_obj = create_project(linkname='myproject')
- series_obj = create_series(project=project_obj)
+ series_obj = create_series(project=project_obj, submitter=person_obj)
# anonymous user
resp = self.client.get(self.api_url())
resp = self.client.get(self.api_url(), {'project': 'invalidproject'})
self.assertEqual(0, len(resp.data))
+ # test filtering by submitter, both ID and email
+ resp = self.client.get(self.api_url(), {'submitter': person_obj.id})
+ self.assertEqual([series_obj.id], [x['id'] for x in resp.data])
+ resp = self.client.get(self.api_url(), {
+ 'submitter': 'test@example.com'})
+ self.assertEqual([series_obj.id], [x['id'] for x in resp.data])
+ resp = self.client.get(self.api_url(), {
+ 'submitter': 'test@example.org'})
+ self.assertEqual(0, len(resp.data))
+
def test_detail(self):
"""Validate we can get a specific series."""
series = create_series()