From 6ae201c71cbc9069d510e2180c6d944133c176cc Mon Sep 17 00:00:00 2001 From: Robert Kolner Date: Thu, 21 Feb 2013 14:36:57 +0100 Subject: [PATCH] Fixed implementation to match tests. --- dusken/dusken/settings-sample.py | 2 +- dusken/main/api/member.py | 42 +++++++++++++++++++++++++++++--- dusken/main/api/membership.py | 4 +-- dusken/main/models.py | 5 ++++ 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/dusken/dusken/settings-sample.py b/dusken/dusken/settings-sample.py index bb867a9..dab01c9 100644 --- a/dusken/dusken/settings-sample.py +++ b/dusken/dusken/settings-sample.py @@ -122,7 +122,7 @@ INSTALLED_APPS = ( ) # Profile of the User class used for authentication. -AUTH_PROFILE_MODEL = 'main.models.Member' +AUTH_PROFILE_MODULE = 'main.Member' # A sample logging configuration. The only tangible logging # performed by this configuration is to send an email to diff --git a/dusken/main/api/member.py b/dusken/main/api/member.py index 416aae5..2cd335c 100644 --- a/dusken/main/api/member.py +++ b/dusken/main/api/member.py @@ -1,3 +1,4 @@ +from tastypie import fields from tastypie.resources import ModelResource, ALL from tastypie.authorization import Authorization from main.models import * @@ -9,6 +10,11 @@ class MemberResource(ModelResource): (1) /api/v1/member/ (2) /api/v1/member/{id}/ """ + username = fields.CharField(attribute='username', readonly=True) + email = fields.CharField(attribute='email', readonly=True) + first_name = fields.CharField(attribute='first_name', readonly=True) + last_name = fields.CharField(attribute='last_name', readonly=True) + class Meta: queryset = Member.objects.all() resource_name = 'member' @@ -17,8 +23,38 @@ class MemberResource(ModelResource): authorization = Authorization() # TODO: for dev (VERY INSECURE) excludes = [ 'password' ] filtering = { - 'username' : ALL, - 'epost' : ALL, - 'phone_number' : ALL + 'username' : [ 'exact' ], + 'email' : [ 'exact' ], + 'first_name' : [ 'exact' ], + 'last_name' : [ 'exact' ], + 'phone_number' : [ 'exact' ], } + def build_filters(self, filters=None): + if filters is None: + filters = {} + + orm_filters = super(MemberResource, self).build_filters(filters) + return orm_filters + + def apply_filters(self, request, applicable_filters): + extra_filters = {} + if 'username__exact' in applicable_filters: + extra_filters['username'] = applicable_filters.pop('username__exact') + if 'first_name__exact' in applicable_filters: + extra_filters['first_name'] = applicable_filters.pop('first_name__exact') + if 'last_name__exact' in applicable_filters: + extra_filters['last_name'] = applicable_filters.pop('last_name__exact') + if 'email__exact' in applicable_filters: + extra_filters['email'] = applicable_filters.pop('email__exact') + + + filters = super(MemberResource, self).apply_filters(request, applicable_filters) + + for key,value in extra_filters.items(): + filters = filter(lambda m: getattr(m.user, key) == value, filters) + + return filters + + def dehydrate(self, bundle): + return bundle diff --git a/dusken/main/api/membership.py b/dusken/main/api/membership.py index 2349cff..db0d53a 100644 --- a/dusken/main/api/membership.py +++ b/dusken/main/api/membership.py @@ -11,6 +11,7 @@ class MembershipResource(ModelResource): (1) /api/v1/membership/ """ member = fields.ForeignKey(MemberResource, 'member') + expires = fields.DateTimeField(attribute='expires', readonly=True) class Meta: queryset = Membership.objects.all() @@ -24,8 +25,7 @@ class MembershipResource(ModelResource): } def dehydrate(self, bundle): - bundle.data['expires'] = str(bundle.obj.expires().date()) bundle.data['member'] = bundle.obj.member.id bundle.data['mtype'] = bundle.obj.mtype.id - bundle.data['payment'] = bundle.obj.payment.id + bundle.data['payment'] = None if not bundle.obj.payment else bundle.obj.payment.id return bundle diff --git a/dusken/main/models.py b/dusken/main/models.py index 9b075b7..4c029d0 100644 --- a/dusken/main/models.py +++ b/dusken/main/models.py @@ -29,6 +29,11 @@ class Member(models.Model): # Auth: user = models.OneToOneField(User) + def username(self): return self.user.username + def email(self): return self.user.email + def first_name(self): return self.user.first_name + def last_name(self): return self.user.last_name + # Profile fields: phone_number = models.IntegerField(unique=True, null=True, blank=True) date_of_birth = models.DateField(blank=True, null=True)