Commit d65eaf5f12a112a394497153316298ad48a12dfd
1 parent
5fc33e88
Exists in
master
and in
39 other branches
Adding filtering to api
Showing
2 changed files
with
99 additions
and
3 deletions
Show diff stats
src/api/models.py
1 | 1 | # -*- coding: utf-8 -*- |
2 | 2 | |
3 | 3 | from tastypie import fields |
4 | +from tastypie.constants import ALL_WITH_RELATIONS, ALL | |
4 | 5 | from tastypie.resources import ModelResource |
5 | 6 | |
6 | 7 | from accounts.models import User |
7 | -from super_archives.models import Message | |
8 | +from super_archives.models import Message, EmailAddress | |
8 | 9 | from proxy.models import Revision, Ticket, Wiki |
9 | 10 | |
10 | 11 | |
... | ... | @@ -15,13 +16,73 @@ class UserResource(ModelResource): |
15 | 16 | excludes = ['email', 'password', 'is_active', 'is_staff', |
16 | 17 | 'is_superuser', 'verification_hash'] |
17 | 18 | allowed_methods = ['get', ] |
19 | + filtering = { | |
20 | + 'username': ALL, | |
21 | + 'institution': ALL, | |
22 | + 'role': ALL, | |
23 | + 'twitter': ALL, | |
24 | + 'facebook': ALL, | |
25 | + 'google_talk': ALL, | |
26 | + 'github': ALL, | |
27 | + 'webpage': ALL, | |
28 | + 'bio': ALL, | |
29 | + } | |
30 | + | |
31 | + def build_filters(self, filters=None): | |
32 | + if filters is None: | |
33 | + filters = {} | |
34 | + | |
35 | + orm_filters = super(UserResource, self).build_filters(filters) | |
36 | + | |
37 | + if 'email' in filters: | |
38 | + qs = User.objects.filter(email=filters['email']) | |
39 | + orm_filters['pk__in'] = [i.pk for i in qs] | |
40 | + | |
41 | + return orm_filters | |
42 | + | |
43 | + | |
44 | +class EmailAddressResource(ModelResource): | |
45 | + user = fields.ForeignKey(UserResource, 'user', full=False, null=True) | |
46 | + | |
47 | + class Meta: | |
48 | + queryset = EmailAddress.objects.all() | |
49 | + resource_name = 'emailaddress' | |
50 | + excludes = ['address', 'md5'] | |
51 | + allowed_methods = ['get', ] | |
52 | + filtering = { | |
53 | + 'user': ALL_WITH_RELATIONS, | |
54 | + 'real_name': ALL, | |
55 | + } | |
56 | + | |
57 | + def build_filters(self, filters=None): | |
58 | + if filters is None: | |
59 | + filters = {} | |
60 | + | |
61 | + orm_filters = super(EmailAddressResource, self).build_filters(filters) | |
62 | + | |
63 | + if 'email' in filters or 'address' in filters: | |
64 | + address = filters.get('email') if filters.get('email') else \ | |
65 | + filters.get('address') | |
66 | + qs = EmailAddress.objects.filter(address=address) | |
67 | + orm_filters['pk__in'] = [i.pk for i in qs] | |
68 | + | |
69 | + return orm_filters | |
18 | 70 | |
19 | 71 | |
20 | 72 | class MessageResource(ModelResource): |
73 | + emailaddress = fields.ForeignKey(EmailAddressResource, 'from_address', | |
74 | + full=False) | |
75 | + | |
21 | 76 | class Meta: |
22 | 77 | queryset = Message.objects.all() |
23 | 78 | resource_name = 'message' |
24 | 79 | excludes = ['spam', 'subject_clean', 'message_id'] |
80 | + filtering = { | |
81 | + 'from_address': ALL_WITH_RELATIONS, | |
82 | + 'subject': ALL, | |
83 | + 'body': ALL, | |
84 | + 'received_time': ALL, | |
85 | + } | |
25 | 86 | |
26 | 87 | |
27 | 88 | class RevisionResource(ModelResource): |
... | ... | @@ -29,6 +90,14 @@ class RevisionResource(ModelResource): |
29 | 90 | queryset = Revision.objects.all() |
30 | 91 | resource_name = 'revision' |
31 | 92 | excludes = ['collaborators', ] |
93 | + filtering = { | |
94 | + 'key': ALL, | |
95 | + 'rev': ALL, | |
96 | + 'author': ALL, | |
97 | + 'message': ALL, | |
98 | + 'repository_name': ALL, | |
99 | + 'created': ALL, | |
100 | + } | |
32 | 101 | |
33 | 102 | |
34 | 103 | class TicketResource(ModelResource): |
... | ... | @@ -36,6 +105,23 @@ class TicketResource(ModelResource): |
36 | 105 | queryset = Ticket.objects.all() |
37 | 106 | resource_name = 'ticket' |
38 | 107 | excludes = ['collaborators', ] |
108 | + filtering = { | |
109 | + 'id': ALL, | |
110 | + 'summary': ALL, | |
111 | + 'description': ALL, | |
112 | + 'milestone': ALL, | |
113 | + 'priority': ALL, | |
114 | + 'component': ALL, | |
115 | + 'version': ALL, | |
116 | + 'severity': ALL, | |
117 | + 'reporter': ALL, | |
118 | + 'author': ALL, | |
119 | + 'status': ALL, | |
120 | + 'keywords': ALL, | |
121 | + 'created': ALL, | |
122 | + 'modified': ALL, | |
123 | + 'modified_by': ALL, | |
124 | + } | |
39 | 125 | |
40 | 126 | |
41 | 127 | class WikiResource(ModelResource): |
... | ... | @@ -43,3 +129,12 @@ class WikiResource(ModelResource): |
43 | 129 | queryset = Wiki.objects.all() |
44 | 130 | resource_name = 'wiki' |
45 | 131 | excludes = ['collaborators', ] |
132 | + filtering = { | |
133 | + 'name': ALL, | |
134 | + 'wiki_text': ALL, | |
135 | + 'author': ALL, | |
136 | + 'name': ALL, | |
137 | + 'created': ALL, | |
138 | + 'modified': ALL, | |
139 | + 'modified_by': ALL, | |
140 | + } | ... | ... |
src/api/urls.py
... | ... | @@ -4,13 +4,14 @@ from django.conf.urls import patterns, include, url |
4 | 4 | |
5 | 5 | from tastypie.api import Api |
6 | 6 | |
7 | -from .models import (UserResource, MessageResource, RevisionResource, | |
8 | - TicketResource, WikiResource) | |
7 | +from .models import (UserResource, EmailAddressResource, MessageResource, | |
8 | + RevisionResource, TicketResource, WikiResource) | |
9 | 9 | from .views import VoteView |
10 | 10 | |
11 | 11 | |
12 | 12 | api = Api(api_name='colab') |
13 | 13 | api.register(UserResource()) |
14 | +api.register(EmailAddressResource()) | |
14 | 15 | api.register(MessageResource()) |
15 | 16 | api.register(RevisionResource()) |
16 | 17 | api.register(TicketResource()) | ... | ... |