diff --git a/src/account/__pycache__/views.cpython-37.pyc b/src/account/__pycache__/views.cpython-37.pyc index 00d9ad8..e39e58f 100644 Binary files a/src/account/__pycache__/views.cpython-37.pyc and b/src/account/__pycache__/views.cpython-37.pyc differ diff --git a/src/account/api/__init__.py b/src/account/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/account/api/__pycache__/__init__.cpython-37.pyc b/src/account/api/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..f53cb43 Binary files /dev/null and b/src/account/api/__pycache__/__init__.cpython-37.pyc differ diff --git a/src/account/api/__pycache__/serializers.cpython-37.pyc b/src/account/api/__pycache__/serializers.cpython-37.pyc new file mode 100644 index 0000000..9e8fe0a Binary files /dev/null and b/src/account/api/__pycache__/serializers.cpython-37.pyc differ diff --git a/src/account/api/__pycache__/urls.cpython-37.pyc b/src/account/api/__pycache__/urls.cpython-37.pyc new file mode 100644 index 0000000..a452875 Binary files /dev/null and b/src/account/api/__pycache__/urls.cpython-37.pyc differ diff --git a/src/account/api/__pycache__/views.cpython-37.pyc b/src/account/api/__pycache__/views.cpython-37.pyc new file mode 100644 index 0000000..e5e3940 Binary files /dev/null and b/src/account/api/__pycache__/views.cpython-37.pyc differ diff --git a/src/account/api/serializers.py b/src/account/api/serializers.py new file mode 100644 index 0000000..c92bf88 --- /dev/null +++ b/src/account/api/serializers.py @@ -0,0 +1,44 @@ +from rest_framework import serializers + +from account.models import Account + + +# class LoginSerializer(serializers.ModelSerializer): +# class Meta: +# model = Account +# fields = ['email', 'password',] + +# extra_kwargs = {'password': {'write_only': True}} + +# def validate(self, data): +# password = data.get('password') +# email = data.get('email') + + +class RegistrationSerializer(serializers.ModelSerializer): + + password2 = serializers.CharField(style={'input_type': 'password'}, write_only=True) + + class Meta: + model = Account + fields = ['email', 'username', 'password', 'password2'] + extra_kwargs = { + 'password': {'write_only': True}, + } + + + def save(self): + + account = Account( + email=self.validated_data['email'], + username=self.validated_data['username'] + ) + password = self.validated_data['password'] + password2 = self.validated_data['password2'] + if password != password2: + raise serializers.ValidationError({'password': 'Passwords must match.'}) + account.set_password(password) + account.save() + return account + + diff --git a/src/account/api/urls.py b/src/account/api/urls.py new file mode 100644 index 0000000..441bc28 --- /dev/null +++ b/src/account/api/urls.py @@ -0,0 +1,12 @@ +from django.urls import path +from account.api.views import( + registration_view, + +) + +app_name = 'account' + +urlpatterns = [ + path('register', registration_view, name="register"), +] + diff --git a/src/account/api/views.py b/src/account/api/views.py new file mode 100644 index 0000000..77975ac --- /dev/null +++ b/src/account/api/views.py @@ -0,0 +1,21 @@ +from rest_framework import status +from rest_framework.response import Response +from rest_framework.decorators import api_view + +from account.api.serializers import RegistrationSerializer + + +@api_view(['POST', ]) +def registration_view(request): + + if request.method == 'POST': + serializer = RegistrationSerializer(data=request.data) + data = {} + if serializer.is_valid(): + account = serializer.save() + data['response'] = 'successfully registered new user.' + data['email'] = account.email + data['username'] = account.username + else: + data = serializer.errors + return Response(data) \ No newline at end of file diff --git a/src/blog/__pycache__/serializers.cpython-37.pyc b/src/blog/__pycache__/serializers.cpython-37.pyc new file mode 100644 index 0000000..1ddff53 Binary files /dev/null and b/src/blog/__pycache__/serializers.cpython-37.pyc differ diff --git a/src/blog/__pycache__/urls-api.cpython-37.pyc b/src/blog/__pycache__/urls-api.cpython-37.pyc new file mode 100644 index 0000000..068754b Binary files /dev/null and b/src/blog/__pycache__/urls-api.cpython-37.pyc differ diff --git a/src/blog/__pycache__/urls.cpython-37.pyc b/src/blog/__pycache__/urls.cpython-37.pyc index 26a5f92..8eb0c56 100644 Binary files a/src/blog/__pycache__/urls.cpython-37.pyc and b/src/blog/__pycache__/urls.cpython-37.pyc differ diff --git a/src/blog/__pycache__/urls_api.cpython-37.pyc b/src/blog/__pycache__/urls_api.cpython-37.pyc new file mode 100644 index 0000000..38a77c9 Binary files /dev/null and b/src/blog/__pycache__/urls_api.cpython-37.pyc differ diff --git a/src/blog/__pycache__/views.cpython-37.pyc b/src/blog/__pycache__/views.cpython-37.pyc index 88b41df..1503813 100644 Binary files a/src/blog/__pycache__/views.cpython-37.pyc and b/src/blog/__pycache__/views.cpython-37.pyc differ diff --git a/src/blog/__pycache__/views_api.cpython-37.pyc b/src/blog/__pycache__/views_api.cpython-37.pyc new file mode 100644 index 0000000..2b568ba Binary files /dev/null and b/src/blog/__pycache__/views_api.cpython-37.pyc differ diff --git a/src/blog/api/__init__.py b/src/blog/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/blog/api/__pycache__/__init__.cpython-37.pyc b/src/blog/api/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..3e65334 Binary files /dev/null and b/src/blog/api/__pycache__/__init__.cpython-37.pyc differ diff --git a/src/blog/api/__pycache__/urls.cpython-37.pyc b/src/blog/api/__pycache__/urls.cpython-37.pyc new file mode 100644 index 0000000..3828ca9 Binary files /dev/null and b/src/blog/api/__pycache__/urls.cpython-37.pyc differ diff --git a/src/blog/api/__pycache__/views.cpython-37.pyc b/src/blog/api/__pycache__/views.cpython-37.pyc new file mode 100644 index 0000000..04977d6 Binary files /dev/null and b/src/blog/api/__pycache__/views.cpython-37.pyc differ diff --git a/src/blog/api/serializers.py b/src/blog/api/serializers.py new file mode 100644 index 0000000..c489fe1 --- /dev/null +++ b/src/blog/api/serializers.py @@ -0,0 +1,16 @@ +from rest_framework import serializers + +from blog.models import BlogPost + + +class BlogPostSerializer(serializers.ModelSerializer): + class Meta: + model = BlogPost + fields = ['title', 'body', 'image',] + + + + + + + diff --git a/src/blog/api/urls.py b/src/blog/api/urls.py new file mode 100644 index 0000000..69bee88 --- /dev/null +++ b/src/blog/api/urls.py @@ -0,0 +1,16 @@ +from django.urls import path +from blog.api.views import( + api_detail_blog_view, + api_update_blog_view, + api_delete_blog_view, + api_create_blog_view, +) + +app_name = 'blog' + +urlpatterns = [ + path('/', api_detail_blog_view, name="detail"), + path('/update', api_update_blog_view, name="update"), + path('/delete', api_delete_blog_view, name="delete"), + path('create', api_create_blog_view, name="create"), +] \ No newline at end of file diff --git a/src/blog/api/views.py b/src/blog/api/views.py new file mode 100644 index 0000000..785dd99 --- /dev/null +++ b/src/blog/api/views.py @@ -0,0 +1,80 @@ +from rest_framework import status +from rest_framework.response import Response +from rest_framework.decorators import api_view + +from account.models import Account +from blog.models import BlogPost +from blog.api.serializers import BlogPostSerializer + +SUCCESS = 'success' +ERROR = 'error' +DELETE_SUCCESS = 'deleted' +UPDATE_SUCCESS = 'updated' +CREATE_SUCCESS = 'created' + +@api_view(['GET', ]) +def api_detail_blog_view(request, slug): + + try: + blog_post = BlogPost.objects.get(slug=slug) + except BlogPost.DoesNotExist: + return Response(status=status.HTTP_404_NOT_FOUND) + + if request.method == 'GET': + serializer = BlogPostSerializer(blog_post) + return Response(serializer.data) + + +@api_view(['PUT',]) +def api_update_blog_view(request, slug): + + try: + blog_post = BlogPost.objects.get(slug=slug) + except BlogPost.DoesNotExist: + return Response(status=status.HTTP_404_NOT_FOUND) + + if request.method == 'PUT': + serializer = BlogPostSerializer(blog_post, data=request.data) + data = {} + if serializer.is_valid(): + serializer.save() + data[SUCCESS] = UPDATE_SUCCESS + return Response(data=data) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + +@api_view(['DELETE',]) +def api_delete_blog_view(request, slug): + + try: + blog_post = BlogPost.objects.get(slug=slug) + except BlogPost.DoesNotExist: + return Response(status=status.HTTP_404_NOT_FOUND) + + if request.method == 'DELETE': + operation = blog_post.delete() + data = {} + if operation: + data[SUCCESS] = DELETE_SUCCESS + return Response(data=data) + + +@api_view(['POST']) +def api_create_blog_view(request): + + account = Account.objects.get(pk=1) + + blog_post = BlogPost(author=account) + + if request.method == 'POST': + serializer = BlogPostSerializer(blog_post, data=request.data) + data = {} + if serializer.is_valid(): + serializer.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + + + + diff --git a/src/blog/urls.py b/src/blog/urls.py index c11752b..8b79ee9 100644 --- a/src/blog/urls.py +++ b/src/blog/urls.py @@ -4,6 +4,7 @@ create_blog_view, detail_blog_view, edit_blog_view, + ) app_name = 'blog' diff --git a/src/blog/views.py b/src/blog/views.py index 8f7003c..f7bfc9b 100644 --- a/src/blog/views.py +++ b/src/blog/views.py @@ -4,6 +4,7 @@ from blog.models import BlogPost from blog.forms import CreateBlogPostForm, UpdateBlogPostForm + from account.models import Account diff --git a/src/mysite/urls.py b/src/mysite/urls.py index 5c22cec..c6d4879 100644 --- a/src/mysite/urls.py +++ b/src/mysite/urls.py @@ -40,6 +40,10 @@ path('logout/', logout_view, name="logout"), path('must_authenticate/', must_authenticate_view, name="must_authenticate"), path('register/', registration_view, name="register"), + + # REST-framework + path('api/blog/', include('blog.api.urls', 'blog_api')), + path('api/account/', include('account.api.urls', 'account_api')), # Password reset links (ref: https://github.com/django/django/blob/master/django/contrib/auth/views.py) path('password_change/done/', auth_views.PasswordChangeDoneView.as_view(template_name='registration/password_change_done.html'),