Saner directory structure

This commit is contained in:
nikolark committed 2013-05-19 16:19:03 +02:00
1 parent 371a26c62c
commit b4abda4f43
25 files changed
+38 -44

No files matched your search

View File
Whitespace-only changes.
+20
View File
@@ -0,0 +1,20 @@
from tastypie.authorization import Authorization
from tastypie.resources import ModelResource, ALL
from dusken.models import Group
class GroupResource(ModelResource):
"""
This class provides following endpoints:
(1) /api/v1/group/
(2) /api/v1/group/{id}/
"""
class Meta:
queryset = Group.objects.all()
resource_name = 'group'
list_allowed_methods = [ 'get', 'post' ]
detail_allowed_methods = [ 'get', 'post' ]
authorization = Authorization() # TODO: for dev (VERY INSECURE)
filtering = {
}
+32
View File
@@ -0,0 +1,32 @@
from tastypie import fields
from tastypie.resources import ModelResource, ALL
from tastypie.authorization import Authorization
from main.api.group import GroupResource
from main.api.member import MemberResource
from main.models import *
class GroupMembershipResource(ModelResource):
"""
This class provides following endpoints:
(1) /api/v1/groupmembership/
"""
member = fields.ForeignKey(MemberResource, 'member')
group = fields.ForeignKey(GroupResource, 'group')
class Meta:
queryset = GroupMembership.objects.all()
resource_name = 'groupmembership'
list_allowed_methods = [ 'get', 'post', 'put', 'delete' ]
detail_allowed_methods = [ 'get', 'post', 'put', 'delete' ]
authorization = Authorization() # TODO: for dev (VERY INSECURE)
filtering = {
'member' : ALL,
'group' : ALL,
}
def dehydrate(self, bundle):
bundle.data['member'] = bundle.obj.member.id
bundle.data['group'] = bundle.obj.group.id
return bundle
+79
View File
@@ -0,0 +1,79 @@
from tastypie import fields
from tastypie.authorization import Authorization
from tastypie.bundle import Bundle
from tastypie.resources import Resource
from dusken.models import Member, Group
class GroupsByMemberObject(object):
def __init__(self):
self.member_id = 0
self.groups = []
class GroupsByMemberResource(Resource):
member_id = fields.IntegerField(attribute='member_id')
groups = fields.ListField(attribute='groups')
class Meta:
resource_name = 'groupsbymember'
object_class = GroupsByMemberObject
list_allowed_methods = [ 'post' ]
detail_allowed_methods = [ 'get', 'delete' ]
authorization = Authorization() # TODO: look up
filtering = {
'member_id' : [ 'exact' ]
}
def detail_uri_kwargs(self, bundle_or_obj):
kwargs = {
'resource_name': self._meta.resource_name,
}
if isinstance(bundle_or_obj, Bundle):
kwargs['pk'] = bundle_or_obj.obj.member_id
else:
kwargs['pk'] = bundle_or_obj.member_id
if self._meta.api_name is not None:
kwargs['api_name'] = self._meta.api_name
return kwargs
def get_object_list(self, request):
pass # We can't return lists.
def obj_get_list(self, request=None, **kwargs):
pass # We can't return lists.
def obj_get(self, request=None, **kwargs):
member_id = int(kwargs['pk'])
member = Member.objects.get(id=member_id)
if member is None:
return None
obj = GroupsByMemberObject()
obj.member_id = member.id
for group in member.groups.all():
obj.groups.append(group.id)
return obj
def obj_create(self, request=None, **kwargs):
group = Group.objects.get(id=group_id)
member = Member.objects.get(id=user_id)
group.user_set.add(member)
def obj_update(self, bundle, request=None, **kwargs):
pass # We can't update.
def obj_delete_list(self, request=None, **kwargs):
pass # We can't delete lists.
def obj_delete(self, request=None, **kwargs):
group = Group.objects.get(id=group_id)
member = Member.objects.get(id=user_id)
group.user_set.remove(member)
def rollback(self, bundles):
pass
+65
View File
@@ -0,0 +1,65 @@
from django.contrib.auth.models import User
from tastypie import fields
from tastypie.authorization import Authorization
from tastypie.exceptions import ImmediateHttpResponse
from tastypie.http import HttpForbidden
from tastypie.resources import ModelResource, ALL
from dusken.models import *
class MemberResource(ModelResource):
"""
This class provides following endpoints:
(1) /api/v1/member/
(2) /api/v1/member/{id}/
"""
class Meta:
queryset = Member.objects.all()
resource_name = 'member'
list_allowed_methods = [ 'get', 'post' ]
detail_allowed_methods = [ 'get', 'patch' ]
authorization = Authorization() # TODO: for dev (VERY INSECURE)
excludes = [ 'date_joined', 'password', 'is_active', 'is_staff', 'is_superuser', 'last_login' ]
filtering = {
'username' : [ 'exact' ],
'email' : [ 'exact' ],
'first_name' : [ 'exact' ],
'last_name' : [ 'exact' ],
'phone_number' : [ 'exact' ],
}
def apply_filters(self, request, applicable_filters):
# Extra filters are used for filtering by attributes in User class. Find out if there
# are any, and if so, apply them.
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')
filtered = super(MemberResource, self).apply_filters(request, applicable_filters)
for key,value in extra_filters.items():
filtered = filter(lambda m: getattr(m, key) == value, filtered)
return filtered
def hydrate(self, bundle):
"""
Catches POST and PATCH requests and intercepts data.
"""
if bundle.obj.user_ptr_id is not None: # happens only if user exists
for key, value in bundle.data.items():
if key == 'username':
if value != bundle.obj.username:
# We can't change username.
raise ImmediateHttpResponse(HttpForbidden("You can't change your username."))
elif key == 'password':
bundle.obj.set_password(value)
return bundle
+74
View File
@@ -0,0 +1,74 @@
from tastypie import fields
from tastypie.authorization import Authorization
from tastypie.bundle import Bundle
from tastypie.resources import Resource
from dusken.models import Member, Group
class MembersByGroupObject(object):
def __init__(self):
self.group_id = 0
self.members = []
class MembersByGroupResource(Resource):
group_id = fields.IntegerField(attribute='group_id')
members = fields.ListField(attribute='members')
class Meta:
resource_name = 'membersbygroup'
object_class = MembersByGroupObject
list_allowed_methods = [ 'post' ]
detail_allowed_methods = [ 'get', 'delete' ]
authorization = Authorization() # TODO: Obvious
def detail_uri_kwargs(self, bundle_or_obj):
kwargs = {
'resource_name': self._meta.resource_name,
}
if isinstance(bundle_or_obj, Bundle):
kwargs['pk'] = bundle_or_obj.obj.group_id
else:
kwargs['pk'] = bundle_or_obj.group_id
if self._meta.api_name is not None:
kwargs['api_name'] = self._meta.api_name
return kwargs
def get_object_list(self, request):
pass # We can't return lists.
def obj_get_list(self, request=None, **kwargs):
pass # We can't return lists.
def obj_get(self, request=None, **kwargs):
group_id = int(kwargs['pk'])
group = Group.objects.get(id=group_id)
if group is None:
return None
obj = MembersByGroupObject()
obj.group_id = group.id
for member in group.user_set.all():
obj.members.append(member.id)
return obj
def obj_create(self, request=None, **kwargs):
pass # TODO
def obj_update(self, bundle, request=None, **kwargs):
pass # We can't update.
def obj_delete_list(self, request=None, **kwargs):
pass # We can't delete lists.
def obj_delete(self, request=None, **kwargs):
group = Group.objects.get(id=group_id)
member = Member.objects.get(id=user_id)
group.user_set.remove(member)
def rollback(self, bundles):
pass
+31
View File
@@ -0,0 +1,31 @@
from tastypie import fields
from tastypie.resources import ModelResource, ALL, ALL_WITH_RELATIONS
from tastypie.authorization import Authorization
from dusken.api.member import MemberResource
from dusken.models import *
class MembershipResource(ModelResource):
"""
This class provides following endpoints:
(1) /api/v1/membership/
"""
member = fields.ForeignKey(MemberResource, 'member')
expires = fields.DateTimeField(attribute='expires', readonly=True)
class Meta:
queryset = Membership.objects.all()
resource_name = 'membership'
list_allowed_methods = [ 'get', 'post' ]
detail_allowed_methods = [ 'get', 'post' ]
authorization = Authorization() # TODO: for dev (VERY INSECURE)
filtering = {
'member' : ALL_WITH_RELATIONS,
'expires' : [ 'exact','range','gt','gte','lt','lte' ], #TODO: Doesn't work.
}
def dehydrate(self, bundle):
bundle.data['member'] = bundle.obj.member.id
bundle.data['mtype'] = bundle.obj.mtype.id
bundle.data['payment'] = None if not bundle.obj.payment else bundle.obj.payment.id
return bundle