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