models.py 3.89 KB
# -*- coding: utf-8 -*-

from tastypie import fields
from tastypie.constants import ALL_WITH_RELATIONS, ALL
from tastypie.resources import ModelResource

from accounts.models import User
from super_archives.models import Message, EmailAddress
from proxy.models import Revision, Ticket, Wiki


class UserResource(ModelResource):
    class Meta:
        queryset = User.objects.filter(is_active=True)
        resource_name = 'user'
        excludes = ['email', 'password', 'is_active', 'is_staff',
                    'is_superuser', 'verification_hash']
        allowed_methods = ['get', ]
        filtering = {
            'username': ALL,
            'institution': ALL,
            'role': ALL,
            'twitter': ALL,
            'facebook': ALL,
            'google_talk': ALL,
            'github': ALL,
            'webpage': ALL,
            'bio': ALL,
        }

    def build_filters(self, filters=None):
        if filters is None:
            filters = {}

        orm_filters = super(UserResource, self).build_filters(filters)

        if 'email' in filters:
            qs = User.objects.filter(email=filters['email'])
            orm_filters['pk__in'] = [i.pk for i in qs]

        return orm_filters


class EmailAddressResource(ModelResource):
    user = fields.ForeignKey(UserResource, 'user', full=False, null=True)

    class Meta:
        queryset = EmailAddress.objects.all()
        resource_name = 'emailaddress'
        excludes = ['address', 'md5']
        allowed_methods = ['get', ]
        filtering = {
            'user': ALL_WITH_RELATIONS,
            'real_name': ALL,
        }

    def build_filters(self, filters=None):
        if filters is None:
            filters = {}

        orm_filters = super(EmailAddressResource, self).build_filters(filters)

        if 'email' in filters or 'address' in filters:
            address = filters.get('email') if filters.get('email') else \
                    filters.get('address')
            qs = EmailAddress.objects.filter(address=address)
            orm_filters['pk__in'] = [i.pk for i in qs]

        return orm_filters


class MessageResource(ModelResource):
    emailaddress = fields.ForeignKey(EmailAddressResource, 'from_address',
                                     full=False)

    class Meta:
        queryset = Message.objects.all()
        resource_name = 'message'
        excludes = ['spam', 'subject_clean', 'message_id']
        filtering = {
            'from_address': ALL_WITH_RELATIONS,
            'subject': ALL,
            'body': ALL,
            'received_time': ALL,
        }


class RevisionResource(ModelResource):
    class Meta:
        queryset = Revision.objects.all()
        resource_name = 'revision'
        excludes = ['collaborators', ]
        filtering = {
            'key': ALL,
            'rev': ALL,
            'author': ALL,
            'message': ALL,
            'repository_name': ALL,
            'created': ALL,
        }


class TicketResource(ModelResource):
    class Meta:
        queryset = Ticket.objects.all()
        resource_name = 'ticket'
        excludes = ['collaborators', ]
        filtering = {
            'id': ALL,
            'summary': ALL,
            'description': ALL,
            'milestone': ALL,
            'priority': ALL,
            'component': ALL,
            'version': ALL,
            'severity': ALL,
            'reporter': ALL,
            'author': ALL,
            'status': ALL,
            'keywords': ALL,
            'created': ALL,
            'modified': ALL,
            'modified_by': ALL,
        }


class WikiResource(ModelResource):
    class Meta:
        queryset = Wiki.objects.all()
        resource_name = 'wiki'
        excludes = ['collaborators', ]
        filtering = {
            'name': ALL,
            'wiki_text': ALL,
            'author': ALL,
            'name': ALL,
            'created': ALL,
            'modified': ALL,
            'modified_by': ALL,
        }