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 | # -*- coding: utf-8 -*- | 1 | # -*- coding: utf-8 -*- |
2 | 2 | ||
3 | from tastypie import fields | 3 | from tastypie import fields |
4 | +from tastypie.constants import ALL_WITH_RELATIONS, ALL | ||
4 | from tastypie.resources import ModelResource | 5 | from tastypie.resources import ModelResource |
5 | 6 | ||
6 | from accounts.models import User | 7 | from accounts.models import User |
7 | -from super_archives.models import Message | 8 | +from super_archives.models import Message, EmailAddress |
8 | from proxy.models import Revision, Ticket, Wiki | 9 | from proxy.models import Revision, Ticket, Wiki |
9 | 10 | ||
10 | 11 | ||
@@ -15,13 +16,73 @@ class UserResource(ModelResource): | @@ -15,13 +16,73 @@ class UserResource(ModelResource): | ||
15 | excludes = ['email', 'password', 'is_active', 'is_staff', | 16 | excludes = ['email', 'password', 'is_active', 'is_staff', |
16 | 'is_superuser', 'verification_hash'] | 17 | 'is_superuser', 'verification_hash'] |
17 | allowed_methods = ['get', ] | 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 | class MessageResource(ModelResource): | 72 | class MessageResource(ModelResource): |
73 | + emailaddress = fields.ForeignKey(EmailAddressResource, 'from_address', | ||
74 | + full=False) | ||
75 | + | ||
21 | class Meta: | 76 | class Meta: |
22 | queryset = Message.objects.all() | 77 | queryset = Message.objects.all() |
23 | resource_name = 'message' | 78 | resource_name = 'message' |
24 | excludes = ['spam', 'subject_clean', 'message_id'] | 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 | class RevisionResource(ModelResource): | 88 | class RevisionResource(ModelResource): |
@@ -29,6 +90,14 @@ class RevisionResource(ModelResource): | @@ -29,6 +90,14 @@ class RevisionResource(ModelResource): | ||
29 | queryset = Revision.objects.all() | 90 | queryset = Revision.objects.all() |
30 | resource_name = 'revision' | 91 | resource_name = 'revision' |
31 | excludes = ['collaborators', ] | 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 | class TicketResource(ModelResource): | 103 | class TicketResource(ModelResource): |
@@ -36,6 +105,23 @@ class TicketResource(ModelResource): | @@ -36,6 +105,23 @@ class TicketResource(ModelResource): | ||
36 | queryset = Ticket.objects.all() | 105 | queryset = Ticket.objects.all() |
37 | resource_name = 'ticket' | 106 | resource_name = 'ticket' |
38 | excludes = ['collaborators', ] | 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 | class WikiResource(ModelResource): | 127 | class WikiResource(ModelResource): |
@@ -43,3 +129,12 @@ class WikiResource(ModelResource): | @@ -43,3 +129,12 @@ class WikiResource(ModelResource): | ||
43 | queryset = Wiki.objects.all() | 129 | queryset = Wiki.objects.all() |
44 | resource_name = 'wiki' | 130 | resource_name = 'wiki' |
45 | excludes = ['collaborators', ] | 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,13 +4,14 @@ from django.conf.urls import patterns, include, url | ||
4 | 4 | ||
5 | from tastypie.api import Api | 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 | from .views import VoteView | 9 | from .views import VoteView |
10 | 10 | ||
11 | 11 | ||
12 | api = Api(api_name='colab') | 12 | api = Api(api_name='colab') |
13 | api.register(UserResource()) | 13 | api.register(UserResource()) |
14 | +api.register(EmailAddressResource()) | ||
14 | api.register(MessageResource()) | 15 | api.register(MessageResource()) |
15 | api.register(RevisionResource()) | 16 | api.register(RevisionResource()) |
16 | api.register(TicketResource()) | 17 | api.register(TicketResource()) |