diff --git a/.gitignore b/.gitignore index c6a6f48..a789335 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,4 @@ settings.py *.bak build docs/_build - +db.sqlite3 diff --git a/docs/index.rst b/docs/index.rst index 844e944..7b6eae5 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -14,7 +14,7 @@ Contents: member group membership - + institution Indices and tables ================== diff --git a/docs/institution.rst b/docs/institution.rst new file mode 100644 index 0000000..8322a60 --- /dev/null +++ b/docs/institution.rst @@ -0,0 +1,55 @@ +Institution +====== + +GET /institution/ +------------ +.. http:get:: /institution/ + + Returns info about all institutions. + + **Example request**: + + .. sourcecode:: http + + GET /institution/?format=json HTTP/1.1 + + :query offset: offset number. default is 0 + :query limit: limit number. default is 20 + :statuscode 200: Everything is gonna be alright. + :statuscode 403: User does not have necessary permissions. + + **Example response**: + + .. sourcecode:: http + + HTTP/1.1 200 OK + Vary: Accept + Content-Type: text/javascript + + { + "meta" : { + "limit" : 20, + "next" : null, + "offset" : 0, + "previous" : null, + "total_count" : 2 + }, + "objects" : [ + { + "created": "2013-06-26T12:15:52.889701", + "id": 1, + "name": "Universitetet i Oslo", + "resource_uri": "/api/v1/institution/1/", + "short_name": "UiO", + "updated": "2013-06-26T12:15:52.889785" + }, + { + "created": "2013-06-26T12:16:07.840886", + "id": 2, + "name": "Høgskolen i Oslo og Akershus", + "resource_uri": "/api/v1/institution/2/", + "short_name": "HiOA", + "updated": "2013-06-26T12:29:38.488712" + } + ] + } diff --git a/docs/membership.rst b/docs/membership.rst new file mode 100644 index 0000000..bf738e4 --- /dev/null +++ b/docs/membership.rst @@ -0,0 +1,102 @@ +Membership +========== + +GET /membership/ +---------------- +.. http:get:: /membership/ + + Returns info about all memberships. + + **Example request**: + + .. sourcecode:: http + + GET /membership/?format=json HTTP/1.1 + + :query filter: one of ``valid``, ``can_vote`` + :query offset: offset number. default is 0 + :query limit: limit number. default is 20 + :statuscode 200: Thumbs up! + :statuscode 403: Ur not authorized – don't cheat! + + **Example response**: + + .. sourcecode:: http + + { + "meta" : { + "limit" : 20, + "next" : null, + "offset" : 0, + "previous" : null, + "total_count" : 1 + }, + "objects" : { + "created" : "2012-08-23T01:30:14", + "end_date" : "2013-08-01T00:00:00", + "id" : 1, + "member" : 1, + "membership_type" : 1, + "payment" : 86, + "start_date" : "2012-08-23T01:30:14", + "updated" : "2013-08-01T00:00:00", + } + + } + +GET /membership/(int)/ +---------------------- +.. http:get:: /membership/(int:membership_id)/ + + Returns info about membership (`membership_id`). + + **Example request**: + + .. sourcecode:: http + + GET /membership/13371337/?format=json HTTP/1.1 + Content-Type: application/json + + :statuscode 200: Thumbs up! + :statuscode 403: You'll need to get authorized first, buddy. + :statuscode 404: This is not the membership you're looking for. + + **Example response**: + + .. sourcecode:: http + + { + "membership" : { + "created" : "2012-08-23T01:30:14", + "end_date" : "2013-08-01T00:00:00", + "id" : 1, + "member" : 1, + "membership_type" : 1, + "payment" : 86, + "start_date" : "2012-08-23T01:30:14", + "updated" : "2013-08-01T00:00:00", + } + + } + +POST /membership/ +----------------- +.. http:post:: /membership/ + + Creates a new membership with data given in body (json). + + **Example request**: + + .. sourcecode:: http + + POST /membership/ HTTP/1.1 + Body: + { + "member": 1337, + "membership_type": 1, + "payment": 16811, + } + + :statuscode 201: You just created a brand new membership! + :statuscode 403: Don't fake it – get authorized! + :statuscode 500: You messed up and made a pile of poo. Check body, make sure values are correct. diff --git a/dusken/admin.py b/dusken/admin.py index 958a432..9e0e799 100644 --- a/dusken/admin.py +++ b/dusken/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin -from dusken.models import Member +from dusken.models import Member, Institution class MemberAdmin(admin.ModelAdmin): fieldsets = [ @@ -8,4 +8,8 @@ class MemberAdmin(admin.ModelAdmin): ('User data', {'fields' : ['phone_number', 'date_of_birth', 'address', 'place_of_study']}), ] +class InstitutionAdmin(admin.ModelAdmin): + pass + admin.site.register(Member, MemberAdmin) +admin.site.register(Institution, InstitutionAdmin) diff --git a/dusken/api/institution.py b/dusken/api/institution.py new file mode 100644 index 0000000..f42e8b2 --- /dev/null +++ b/dusken/api/institution.py @@ -0,0 +1,25 @@ +from django.contrib.auth.models import User +from django.conf.urls import url +from django.shortcuts import get_object_or_404 +from tastypie import fields +from tastypie.authorization import Authorization +from tastypie.exceptions import ImmediateHttpResponse +from tastypie.http import HttpForbidden, HttpNoContent, HttpResponse +from tastypie.resources import ModelResource, ALL +from dusken.models import * +from dusken.api.membersbygroup import MembersByGroupResource +from dusken.api.groupsbymember import GroupsByMemberResource + + +class InstitutionResource(ModelResource): + + class Meta: + queryset = Institution.objects.all() + resource_name = 'institution' + list_allowed_methods = [ 'get', 'post' ] + detail_allowed_methods = [ 'get', 'patch', 'delete' ] + authorization = Authorization() # TODO: for dev (VERY INSECURE) + filtering = { + 'name' : [ 'exact' ], + } + diff --git a/dusken/models.py b/dusken/models.py index 91d891e..8a686a0 100644 --- a/dusken/models.py +++ b/dusken/models.py @@ -2,6 +2,9 @@ import django from django.db import models class Country(models.Model): + def __unicode__(self): + return self.name + name = models.CharField(max_length=50, unique=True) created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) @@ -15,7 +18,11 @@ class Address(models.Model): updated = models.DateTimeField(auto_now=True) class Institution(models.Model): + def __unicode__(self): + return u'%s - %s' % (self.short_name, self.name) + name = models.CharField(max_length=255) + short_name = models.CharField(max_length=16) created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) @@ -26,6 +33,9 @@ class PlaceOfStudy(models.Model): updated = models.DateTimeField(auto_now=True) class Member(django.contrib.auth.models.User): + def __unicode__(self): + return u'%s %s' % (self.first_name, self.last_name) + phone_number = models.IntegerField(unique=True, null=True, blank=True) date_of_birth = models.DateField(blank=True, null=True) legacy_id = models.IntegerField(unique=True, null=True, blank=True) diff --git a/dusken/urls.py b/dusken/urls.py index 167049c..5a3d667 100644 --- a/dusken/urls.py +++ b/dusken/urls.py @@ -8,6 +8,7 @@ from dusken.api.membership import MembershipResource from dusken.api.group import GroupResource from dusken.api.groupsbymember import GroupsByMemberResource from dusken.api.membersbygroup import MembersByGroupResource +from dusken.api.institution import InstitutionResource admin.autodiscover() @@ -17,6 +18,7 @@ v1_api.register(MembershipResource()) v1_api.register(GroupResource()) v1_api.register(GroupsByMemberResource()) v1_api.register(MembersByGroupResource()) +v1_api.register(InstitutionResource()) urlpatterns = patterns('', url(r'^admin/doc/', include('django.contrib.admindocs.urls')),