Archived
Saner directory structure
This commit is contained in:
1 parent
371a26c62c
commit
b4abda4f43
25 files changed
+38
-44
No files matched your search
Whitespace-only changes.
@@ -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 = {
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in new issue
Block a user