diff --git a/openbadge-server/openbadge/models.py b/openbadge-server/openbadge/models.py index 64ecce9..36586a5 100644 --- a/openbadge-server/openbadge/models.py +++ b/openbadge-server/openbadge/models.py @@ -5,6 +5,7 @@ import random import json as simplejson import string +import time from decimal import Decimal @@ -212,12 +213,12 @@ class Member(BaseModel): email = models.EmailField(unique=True) name = models.CharField(max_length=64) - badge = models.CharField(max_length=64) + badge = models.CharField(max_length=64, unique=True) """Some sort of hub-readable ID for the badge, similar to a MAC, but accessible from iPhone""" - last_audio_ts = models.DecimalField(max_digits=20, decimal_places=3, default=Decimal(0)) + last_audio_ts = models.DecimalField(max_digits=20, decimal_places=3, default=round(Decimal(time.time()), 0)) last_audio_ts_fract = models.DecimalField(max_digits=20, decimal_places=3, default=Decimal(0)) - last_proximity_ts = models.DecimalField(max_digits=20, decimal_places=3, default=Decimal(0)) + last_proximity_ts = models.DecimalField(max_digits=20, decimal_places=3, default=round(Decimal(time.time()), 0)) last_voltage = models.DecimalField(max_digits=5, decimal_places=3, default=Decimal(0)) last_seen_ts = models.DecimalField(max_digits=20, decimal_places=3, default=Decimal(0)) diff --git a/openbadge-server/openbadge/serializers.py b/openbadge-server/openbadge/serializers.py index a095678..1f0edb1 100644 --- a/openbadge-server/openbadge/serializers.py +++ b/openbadge-server/openbadge/serializers.py @@ -11,7 +11,7 @@ class Meta: model = Member fields = ('id', 'project', 'name', 'email', 'badge', 'last_seen_ts', 'last_audio_ts', 'last_audio_ts_fract', 'last_proximity_ts', 'last_voltage', 'key') - read_only_fields = ('project', 'id', 'key', 'badge', 'name', 'email') + read_only_fields = ('project', 'id', 'key') def update(self, instance, validated_data): @@ -34,6 +34,7 @@ def update(self, instance, validated_data): instance.save() return instance + class HubSerializer(serializers.ModelSerializer): project = serializers.PrimaryKeyRelatedField(queryset=Project.objects.all()) diff --git a/openbadge-server/openbadge/urls.py b/openbadge-server/openbadge/urls.py index b4329c9..47f5774 100644 --- a/openbadge-server/openbadge/urls.py +++ b/openbadge-server/openbadge/urls.py @@ -4,13 +4,14 @@ badges_list = views.MemberViewSet.as_view({ 'get': 'list', - # 'post': 'create', + 'post': 'create', }) badges_details = views.MemberViewSet.as_view({ 'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', + #'post': 'create', }) hubs_list = views.HubViewSet.as_view({ diff --git a/openbadge-server/openbadge/views.py b/openbadge-server/openbadge/views.py index eb5dbca..75ff1d5 100644 --- a/openbadge-server/openbadge/views.py +++ b/openbadge-server/openbadge/views.py @@ -12,6 +12,7 @@ from rest_framework.decorators import api_view from rest_framework import viewsets from rest_framework.response import Response +from rest_framework import status from .decorators import app_view, is_god, is_own_project, require_hub_uuid from .models import Meeting, Project, Hub, DataFile # Chunk # ActionDataChunk, SamplesDataChunk @@ -37,11 +38,25 @@ def context(**extra): class MemberViewSet(viewsets.ModelViewSet): - queryset = Member.objects.all() + #queryset = Member.objects.all() serializer_class = MemberSerializer permission_classes = [AppkeyRequired, HubUuidRequired] lookup_field = 'key' + def get_queryset(self): + """ + Filters the members list based on the hub's project + :return: + """ + + # hub information is validated in the permission class + hub_uuid = self.request.META.get("HTTP_X_HUB_UUID") + hub = Hub.objects.prefetch_related("project").get(uuid=hub_uuid) + project = hub.project + + # Return only badges from the relevant project + return Member.objects.filter(project=project) + def retrieve(self, request, *args, **kwargs): """ Get the badge specified by the provided key @@ -52,6 +67,25 @@ def retrieve(self, request, *args, **kwargs): serializer = self.get_serializer(badge) return Response(serializer.data) + def create(self, request, *args, **kwargs): + """ + Creates a new member under the call hub project + """ + hub_uuid = request.META.get("HTTP_X_HUB_UUID") + hub = Hub.objects.prefetch_related("project").get(uuid=hub_uuid) + project = hub.project + + # request.data is from the POST object. Adding the project id + data = request.data.dict() + data['project'] = project.id + + serializer = MemberSerializer(data=data) + if serializer.is_valid(): + serializer.save() # will call .create() + return Response(serializer.data, status=status.HTTP_201_CREATED) + else: + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + class HubViewSet(viewsets.ModelViewSet): queryset = Hub.objects.all()