From 7d5216fc601672fad2ca75dfd294ad7232c8985e Mon Sep 17 00:00:00 2001 From: "@pavel.bezrukov" Date: Wed, 16 Jun 2021 23:26:17 +0300 Subject: [PATCH 1/2] update user model and registration url --- posts/migrations/0003_post_user.py | 20 +++++++++++++ posts/migrations/0004_auto_20210614_2129.py | 20 +++++++++++++ posts/models.py | 7 +++++ posts/serializers.py | 2 +- redit/settings.py | 1 + redit/urls.py | 1 + users/__init__.py | 0 users/admin.py | 3 ++ users/apps.py | 5 ++++ users/migrations/0001_initial.py | 32 +++++++++++++++++++++ users/migrations/0002_auto_20210613_1955.py | 23 +++++++++++++++ users/migrations/__init__.py | 0 users/models.py | 24 ++++++++++++++++ users/serializers.py | 19 ++++++++++++ users/tests.py | 3 ++ users/urls.py | 9 ++++++ users/views.py | 23 +++++++++++++++ 17 files changed, 191 insertions(+), 1 deletion(-) create mode 100644 posts/migrations/0003_post_user.py create mode 100644 posts/migrations/0004_auto_20210614_2129.py create mode 100644 users/__init__.py create mode 100644 users/admin.py create mode 100644 users/apps.py create mode 100644 users/migrations/0001_initial.py create mode 100644 users/migrations/0002_auto_20210613_1955.py create mode 100644 users/migrations/__init__.py create mode 100644 users/models.py create mode 100644 users/serializers.py create mode 100644 users/tests.py create mode 100644 users/urls.py create mode 100644 users/views.py diff --git a/posts/migrations/0003_post_user.py b/posts/migrations/0003_post_user.py new file mode 100644 index 0000000..61b8351 --- /dev/null +++ b/posts/migrations/0003_post_user.py @@ -0,0 +1,20 @@ +# Generated by Django 3.1.6 on 2021-06-14 21:28 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0002_auto_20210613_1955'), + ('posts', '0002_post_approved'), + ] + + operations = [ + migrations.AddField( + model_name='post', + name='user', + field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='users.user'), + ), + ] diff --git a/posts/migrations/0004_auto_20210614_2129.py b/posts/migrations/0004_auto_20210614_2129.py new file mode 100644 index 0000000..6088930 --- /dev/null +++ b/posts/migrations/0004_auto_20210614_2129.py @@ -0,0 +1,20 @@ +# Generated by Django 3.1.6 on 2021-06-14 21:29 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0002_auto_20210613_1955'), + ('posts', '0003_post_user'), + ] + + operations = [ + migrations.AlterField( + model_name='post', + name='user', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='users.user'), + ), + ] diff --git a/posts/models.py b/posts/models.py index 9000037..de4dd41 100644 --- a/posts/models.py +++ b/posts/models.py @@ -1,7 +1,14 @@ 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, default=1) + + +# class UsersPosts(models.Model): +# post = models.ForeignKey(Post, on_delete=models.CASCADE) +# 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..30dae0a 100644 --- a/redit/settings.py +++ b/redit/settings.py @@ -45,6 +45,7 @@ APPS = [ 'posts', + 'users', ] INSTALLED_APPS = CORE_APPS + THIRD_PARTY_APPS + APPS 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..8c38f3f --- /dev/null +++ b/users/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. 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/0001_initial.py b/users/migrations/0001_initial.py new file mode 100644 index 0000000..24b29f8 --- /dev/null +++ b/users/migrations/0001_initial.py @@ -0,0 +1,32 @@ +# Generated by Django 3.1.6 on 2021-06-01 22:41 + +import django.contrib.auth.models +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='User', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('username', models.CharField(db_index=True, max_length=255, unique=True)), + ('email', models.EmailField(max_length=254, unique=True, validators=[django.core.validators.EmailValidator()])), + ], + options={ + 'abstract': False, + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + ] diff --git a/users/migrations/0002_auto_20210613_1955.py b/users/migrations/0002_auto_20210613_1955.py new file mode 100644 index 0000000..b9281df --- /dev/null +++ b/users/migrations/0002_auto_20210613_1955.py @@ -0,0 +1,23 @@ +# Generated by Django 3.1.6 on 2021-06-13 19:55 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='is_staff', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='user', + name='is_superuser', + field=models.BooleanField(default=False), + ), + ] 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..6222435 --- /dev/null +++ b/users/models.py @@ -0,0 +1,24 @@ +from django.conf import settings +from django.db import models +from django.core import validators +from django.contrib.auth.models import AbstractBaseUser, UserManager +# from django.contrib.auth.models import PermissionsMixin + + +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..fb1001a --- /dev/null +++ b/users/serializers.py @@ -0,0 +1,19 @@ +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/tests.py b/users/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/users/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. 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, + ) From 8ea5c78f44d4962ce90174434d3895ab3bdda921 Mon Sep 17 00:00:00 2001 From: "@pavel.bezrukov" Date: Mon, 20 Sep 2021 22:17:31 +0300 Subject: [PATCH 2/2] make changes according to the comments of pull request. Add dockerfile --- Dockerfile | 8 +++++ Makefile | 6 ++-- .../docker-compose.yml => docker-compose.yml | 10 +++++- posts/admin.py | 2 -- posts/migrations/0001_initial.py | 22 ------------- posts/migrations/0002_post_approved.py | 18 ----------- posts/migrations/0003_post_user.py | 20 ------------ posts/migrations/0004_auto_20210614_2129.py | 20 ------------ posts/models.py | 7 +--- redit/settings.py | 2 +- users/admin.py | 2 -- users/migrations/0001_initial.py | 32 ------------------- users/migrations/0002_auto_20210613_1955.py | 23 ------------- users/models.py | 8 +---- users/serializers.py | 3 +- users/tests.py | 3 -- 16 files changed, 25 insertions(+), 161 deletions(-) create mode 100644 Dockerfile rename docker/docker-compose.yml => docker-compose.yml (55%) delete mode 100644 posts/migrations/0001_initial.py delete mode 100644 posts/migrations/0002_post_approved.py delete mode 100644 posts/migrations/0003_post_user.py delete mode 100644 posts/migrations/0004_auto_20210614_2129.py delete mode 100644 users/migrations/0001_initial.py delete mode 100644 users/migrations/0002_auto_20210613_1955.py delete mode 100644 users/tests.py 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/migrations/0003_post_user.py b/posts/migrations/0003_post_user.py deleted file mode 100644 index 61b8351..0000000 --- a/posts/migrations/0003_post_user.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.1.6 on 2021-06-14 21:28 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0002_auto_20210613_1955'), - ('posts', '0002_post_approved'), - ] - - operations = [ - migrations.AddField( - model_name='post', - name='user', - field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='users.user'), - ), - ] diff --git a/posts/migrations/0004_auto_20210614_2129.py b/posts/migrations/0004_auto_20210614_2129.py deleted file mode 100644 index 6088930..0000000 --- a/posts/migrations/0004_auto_20210614_2129.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.1.6 on 2021-06-14 21:29 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0002_auto_20210613_1955'), - ('posts', '0003_post_user'), - ] - - operations = [ - migrations.AlterField( - model_name='post', - name='user', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='users.user'), - ), - ] diff --git a/posts/models.py b/posts/models.py index de4dd41..df6af06 100644 --- a/posts/models.py +++ b/posts/models.py @@ -6,9 +6,4 @@ 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, default=1) - - -# class UsersPosts(models.Model): -# post = models.ForeignKey(Post, on_delete=models.CASCADE) -# user = models.ForeignKey(User, on_delete=models.CASCADE) + user = models.ForeignKey(User, on_delete=models.CASCADE) diff --git a/redit/settings.py b/redit/settings.py index 30dae0a..79aa570 100644 --- a/redit/settings.py +++ b/redit/settings.py @@ -92,7 +92,7 @@ 'NAME': 'redit_db', 'USER': 'user', 'PASSWORD': 'password', - 'HOST': '127.0.0.1', + 'HOST': 'db', 'PORT': '5432', } } diff --git a/users/admin.py b/users/admin.py index 8c38f3f..694323f 100644 --- a/users/admin.py +++ b/users/admin.py @@ -1,3 +1 @@ from django.contrib import admin - -# Register your models here. diff --git a/users/migrations/0001_initial.py b/users/migrations/0001_initial.py deleted file mode 100644 index 24b29f8..0000000 --- a/users/migrations/0001_initial.py +++ /dev/null @@ -1,32 +0,0 @@ -# Generated by Django 3.1.6 on 2021-06-01 22:41 - -import django.contrib.auth.models -import django.core.validators -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='User', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('password', models.CharField(max_length=128, verbose_name='password')), - ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), - ('username', models.CharField(db_index=True, max_length=255, unique=True)), - ('email', models.EmailField(max_length=254, unique=True, validators=[django.core.validators.EmailValidator()])), - ], - options={ - 'abstract': False, - }, - managers=[ - ('objects', django.contrib.auth.models.UserManager()), - ], - ), - ] diff --git a/users/migrations/0002_auto_20210613_1955.py b/users/migrations/0002_auto_20210613_1955.py deleted file mode 100644 index b9281df..0000000 --- a/users/migrations/0002_auto_20210613_1955.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.1.6 on 2021-06-13 19:55 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='user', - name='is_staff', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='user', - name='is_superuser', - field=models.BooleanField(default=False), - ), - ] diff --git a/users/models.py b/users/models.py index 6222435..0e3a52b 100644 --- a/users/models.py +++ b/users/models.py @@ -1,18 +1,12 @@ -from django.conf import settings from django.db import models from django.core import validators from django.contrib.auth.models import AbstractBaseUser, UserManager -# from django.contrib.auth.models import PermissionsMixin 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 - ) + 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' diff --git a/users/serializers.py b/users/serializers.py index fb1001a..2ea0e19 100644 --- a/users/serializers.py +++ b/users/serializers.py @@ -12,8 +12,7 @@ class RegistrationSerializer(serializers.ModelSerializer): class Meta: model = User - fields = ('email', 'username', 'password',) + fields = ('email', 'username', 'password') def create(self, validated_data): return User.objects.create_user(**validated_data) - diff --git a/users/tests.py b/users/tests.py deleted file mode 100644 index 7ce503c..0000000 --- a/users/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here.