diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a10d8b2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,8 @@ +FROM python:3.7-stretch +RUN apt-get update +RUN apt-get upgrade -y +COPY ./ / +WORKDIR ./ +RUN pip3 install --no-cache-dir -r requirements.txt && \ + rm -v requirements.txt +EXPOSE 8000 diff --git a/Makefile b/Makefile index 82d898a..08c048f 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,8 @@ + up: - @docker-compose -f docker/docker-compose.yml up -d + @docker-compose build + @docker-compose up -d @docker ps down: - @docker-compose -f docker/docker-compose.yml down + @docker-compose down diff --git a/docker/docker-compose.yml b/docker-compose.yml similarity index 55% rename from docker/docker-compose.yml rename to docker-compose.yml index 6250413..b86fd6e 100644 --- a/docker/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,14 @@ version: "3" services: + app: + container_name: app + build: . + command: bash -c "python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000" + ports: + - "8552:8000" + depends_on: + - db + db: image: "postgres:12" environment: @@ -11,6 +20,5 @@ services: ports: - "5432:5432" - volumes: redit_volume: diff --git a/posts/admin.py b/posts/admin.py index 8c38f3f..694323f 100644 --- a/posts/admin.py +++ b/posts/admin.py @@ -1,3 +1 @@ from django.contrib import admin - -# Register your models here. diff --git a/posts/migrations/0001_initial.py b/posts/migrations/0001_initial.py deleted file mode 100644 index 2db6d05..0000000 --- a/posts/migrations/0001_initial.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 3.1.6 on 2021-02-18 18:24 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Post', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('text', models.TextField()), - ('created_at', models.DateTimeField(auto_now_add=True)), - ], - ), - ] diff --git a/posts/migrations/0002_post_approved.py b/posts/migrations/0002_post_approved.py deleted file mode 100644 index d9278f1..0000000 --- a/posts/migrations/0002_post_approved.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.1.6 on 2021-02-18 18:32 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('posts', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='post', - name='approved', - field=models.BooleanField(default=False), - ), - ] diff --git a/posts/models.py b/posts/models.py index 9000037..df6af06 100644 --- a/posts/models.py +++ b/posts/models.py @@ -1,7 +1,9 @@ from django.db import models +from users.models import User class Post(models.Model): text = models.TextField() created_at = models.DateTimeField(auto_now_add=True) approved = models.BooleanField(default=False) + user = models.ForeignKey(User, on_delete=models.CASCADE) diff --git a/posts/serializers.py b/posts/serializers.py index c4c4489..b8bc80e 100644 --- a/posts/serializers.py +++ b/posts/serializers.py @@ -7,4 +7,4 @@ class PostSerializer(serializers.ModelSerializer): class Meta: model = Post - fields = ("id", "text", "created_at") + fields = ("id", "text", "created_at", "user") diff --git a/redit/settings.py b/redit/settings.py index 4d18b02..79aa570 100644 --- a/redit/settings.py +++ b/redit/settings.py @@ -45,6 +45,7 @@ APPS = [ 'posts', + 'users', ] INSTALLED_APPS = CORE_APPS + THIRD_PARTY_APPS + APPS @@ -91,7 +92,7 @@ 'NAME': 'redit_db', 'USER': 'user', 'PASSWORD': 'password', - 'HOST': '127.0.0.1', + 'HOST': 'db', 'PORT': '5432', } } diff --git a/redit/urls.py b/redit/urls.py index 5d2eb02..e2ad3cd 100644 --- a/redit/urls.py +++ b/redit/urls.py @@ -19,4 +19,5 @@ urlpatterns = [ path('admin/', admin.site.urls), path('posts/', include('posts.urls')), + path('user/', include('users.urls')) ] diff --git a/users/__init__.py b/users/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/users/admin.py b/users/admin.py new file mode 100644 index 0000000..694323f --- /dev/null +++ b/users/admin.py @@ -0,0 +1 @@ +from django.contrib import admin diff --git a/users/apps.py b/users/apps.py new file mode 100644 index 0000000..4ce1fab --- /dev/null +++ b/users/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class UsersConfig(AppConfig): + name = 'users' diff --git a/users/migrations/__init__.py b/users/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/users/models.py b/users/models.py new file mode 100644 index 0000000..0e3a52b --- /dev/null +++ b/users/models.py @@ -0,0 +1,18 @@ +from django.db import models +from django.core import validators +from django.contrib.auth.models import AbstractBaseUser, UserManager + + +class User(AbstractBaseUser): + + username = models.CharField(db_index=True, max_length=255, unique=True) + email = models.EmailField(validators=[validators.validate_email], unique=True, blank=False) + is_staff = models.BooleanField(default=False) # a admin user; non super-user + is_superuser = models.BooleanField(default=False) # a superuser + USERNAME_FIELD = 'email' + REQUIRED_FIELDS = ('username',) + + objects = UserManager() + + def __str__(self): + return self.username diff --git a/users/serializers.py b/users/serializers.py new file mode 100644 index 0000000..2ea0e19 --- /dev/null +++ b/users/serializers.py @@ -0,0 +1,18 @@ +from rest_framework import serializers +from .models import User + + +class RegistrationSerializer(serializers.ModelSerializer): + + password = serializers.CharField( + max_length=128, + min_length=8, + write_only=True, + ) + + class Meta: + model = User + fields = ('email', 'username', 'password') + + def create(self, validated_data): + return User.objects.create_user(**validated_data) diff --git a/users/urls.py b/users/urls.py new file mode 100644 index 0000000..010f353 --- /dev/null +++ b/users/urls.py @@ -0,0 +1,9 @@ +from django.urls import re_path + +from .views import RegistrationAPIView +# from .views import LoginAPIView +from django.urls import path + +urlpatterns = [ + path("registration", RegistrationAPIView.as_view(), name='user_registration'), +] diff --git a/users/views.py b/users/views.py new file mode 100644 index 0000000..7b3e63c --- /dev/null +++ b/users/views.py @@ -0,0 +1,23 @@ +from rest_framework import status +# from rest_framework.permissions import AllowAny +from rest_framework.response import Response +from rest_framework.views import APIView + +# from .models import User +# from .serializers import LoginSerializer +from .serializers import RegistrationSerializer + + +class RegistrationAPIView(APIView): + + serializer_class = RegistrationSerializer + + def post(self, request): + + serializer = self.serializer_class(data=request.data) + serializer.is_valid(raise_exception=True) + serializer.save() + + return Response( + status=status.HTTP_201_CREATED, + )