Commit d65eaf5f12a112a394497153316298ad48a12dfd

Authored by Luan
1 parent 5fc33e88

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())