diff --git a/server/.gitignore b/server/.gitignore index 2424334..340c0d5 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -157,4 +157,6 @@ venv.bak/ server/settings.py .idea/ -db.sqlite3 \ No newline at end of file +db.sqlite3 + +tmp/ \ No newline at end of file diff --git a/server/emil/serializer.py b/server/emil/serializer.py index df36ce0..ab0daa6 100644 --- a/server/emil/serializer.py +++ b/server/emil/serializer.py @@ -8,14 +8,9 @@ class Meta: fields = ('random_id', 'available_smileage', 'used_smileage') -# class SoundSerializer(serializers.Serializer): -# content_type = serializers.CharField(allow_blank=False, allow_null=False, required=True) -# filename = serializers.CharField(allow_blank=False, allow_null=False, required=True) -# file_data = serializers.CharField(allow_blank=False, allow_null=False, required=True) - - -# class PostCafSerializer(serializers.Serializer): -# sound = serializers.CharField(allow_blank=False, allow_null=False, required=True) +class SoundSerializer(serializers.Serializer): + user_id = serializers.CharField(allow_null=False, allow_blank=False, required=True, max_length=10) + file_data = serializers.CharField(allow_blank=False, allow_null=False, required=True) class LaughsSerializer(serializers.Serializer): diff --git a/server/emil/urls.py b/server/emil/urls.py index 99e6c60..f36361c 100644 --- a/server/emil/urls.py +++ b/server/emil/urls.py @@ -4,7 +4,7 @@ router = routers.DefaultRouter() router.register(r'users/(?P[0-9])', UsersViewSet, 'users') -# router.register(r'post_caf', PostCafViewSet, 'post_caf') router.register(r'laughs/(?P[0-9])/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})', LaughsViewSet, 'laughs') router.register(r'laughs/detail/(?P[0-9])/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})', LaughsDetailViewSet, 'laughs-detail') router.register(r'laugh', LaughViewSet, 'laugh') +router.register(r'sound', SoundViewSet, 'sound') diff --git a/server/emil/views.py b/server/emil/views.py index fc51d23..10c96e7 100644 --- a/server/emil/views.py +++ b/server/emil/views.py @@ -1,3 +1,5 @@ +import os +import base64 from django.core.exceptions import ObjectDoesNotExist from rest_framework import viewsets from rest_framework.exceptions import ValidationError @@ -14,37 +16,17 @@ def list(self, request, **kwargs): try: user = self.get_queryset() except ObjectDoesNotExist: - raise ValidationError(404) + raise ValidationError(404) return Response({ 'available': user.available_smileage, 'used': user.used_smileage - }) + }) def get_queryset(self): return User.objects.get(id=self.kwargs.get('user_id')) -# class PostCafViewSet(viewsets.ViewSet): -# -# @staticmethod -# def create(request): -# if request.method == 'POST': -# serializer = PostCafSerializer(data=request.data) -# -# if serializer.is_valid(): -# serializer = SoundSerializer(data=json.loads(request.data['sound'])) -# -# if serializer.is_valid(): -# return Response({'result': 'OK'}) -# else: -# return Response(serializer.errors) -# else: -# return Response(serializer.errors) -# else: -# return Response('Not Allow GET method') - - class LaughsViewSet(viewsets.ModelViewSet): http_method_names = ['get'] serializer_class = LaughsSerializer @@ -91,7 +73,8 @@ def list(self, request, **kwargs): if serializer.is_valid(): - weekday = datetime.strptime(kwargs.get('year') + '/' + kwargs.get('month') + '/' + kwargs.get('day'), '%Y/%m/%d').weekday() + weekday = datetime.strptime(kwargs.get('year') + '/' + kwargs.get('month') + '/' + kwargs.get('day'), + '%Y/%m/%d').weekday() # 指定された日付が日曜日かをチェック if weekday != 6: @@ -142,7 +125,8 @@ def list(self, request, **kwargs): # print(start, end, laughs.filter(created_at__range=(start, end)).count()) # 1コマに笑った回数を記録 - day_laughs_by_one_class.append(laughs.filter(created_at__range=(start+timedelta(hours=9), end+timedelta(hours=9))).count()) + day_laughs_by_one_class.append( + laughs.filter(created_at__range=(start + timedelta(hours=9), end + timedelta(hours=9))).count()) start = start + timedelta(days=1) end = end + timedelta(days=1) @@ -183,3 +167,42 @@ def create(self, request, *args, **kwargs): def get_queryset(self): return User.objects.get(random_id=self.request.data['user_id']) + + +class SoundViewSet(viewsets.ModelViewSet): + http_method_names = ['post'] + serializer_class = SoundSerializer + + def create(self, request, *args, **kwargs): + if request.method == 'POST': + sound_serializer = SoundSerializer(data=request.data) + + if not sound_serializer.is_valid(): + return Response(sound_serializer.errors) + + json_data = dict(request.data) + encoded = json_data['file_data'] + + # 規定に合わせるために=で埋め合わせ + missing_padding = len(encoded) % 4 + if missing_padding != 0: + encoded += '=' * (4 - len(encoded) % 4) + + now = datetime.now() + now_str = now.strftime('%Y-%m-%d %H:%M:%S') + + filename_caf = 'tmp/' + json_data['user_id'][0] + '_' + now_str + '.caf' + + f = open(filename_caf, 'wb') + + try: + f.write(base64.b64decode(encoded)) + f.close() + except ValueError: + os.remove(filename_caf) + raise ValueError(500) + + return Response(filename_caf) + + def get_queryset(self): + return User.objects.get(id=self.request.data['user_id'])