diff options
| author | Andrew <saintruler@gmail.com> | 2019-03-11 21:00:02 +0400 |
|---|---|---|
| committer | Andrew <saintruler@gmail.com> | 2019-03-11 21:00:02 +0400 |
| commit | 7e7dd5244e8d26485ad7950a89c04c98c4fef83f (patch) | |
| tree | 810730c4650392080fb87a78d3b527201e89fe4b /backend/articles | |
Initial commit/
Diffstat (limited to 'backend/articles')
| -rw-r--r-- | backend/articles/__init__.py | 0 | ||||
| -rw-r--r-- | backend/articles/admin.py | 39 | ||||
| -rw-r--r-- | backend/articles/api/serializers.py | 59 | ||||
| -rw-r--r-- | backend/articles/api/urls.py | 7 | ||||
| -rw-r--r-- | backend/articles/api/views.py | 16 | ||||
| -rw-r--r-- | backend/articles/apps.py | 5 | ||||
| -rw-r--r-- | backend/articles/forms.py | 15 | ||||
| -rw-r--r-- | backend/articles/migrations/0001_initial.py | 61 | ||||
| -rw-r--r-- | backend/articles/migrations/0002_auto_20190228_0732.py | 33 | ||||
| -rw-r--r-- | backend/articles/migrations/__init__.py | 0 | ||||
| -rw-r--r-- | backend/articles/models.py | 30 | ||||
| -rw-r--r-- | backend/articles/tests.py | 3 | ||||
| -rw-r--r-- | backend/articles/views.py | 3 |
13 files changed, 271 insertions, 0 deletions
diff --git a/backend/articles/__init__.py b/backend/articles/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/backend/articles/__init__.py diff --git a/backend/articles/admin.py b/backend/articles/admin.py new file mode 100644 index 0000000..ee1a3ff --- /dev/null +++ b/backend/articles/admin.py @@ -0,0 +1,39 @@ +from django.contrib import admin + +# Register your models here. +from django.contrib.auth.admin import UserAdmin as BaseUserAdmin +from articles.models import Article, User +from django.contrib.auth.models import Group + + +class UserAdmin(BaseUserAdmin): + add_fieldsets = ( + (None, { + 'fields': ( + 'username', 'email', 'bio', 'avatar', 'password1', + 'password2') + }), + ('Permissions', { + 'fields': ('is_superuser', 'is_staff') + }) + ) + + fieldsets = ( + (None, { + 'fields': ( + 'username', 'email', 'bio', 'avatar', 'password') + }), + ('Permissions', { + 'fields': ('is_superuser', 'is_staff') + }) + ) + + list_display = ['username', 'email'] + search_fields = ('email', 'username') + ordering = ('email',) + + +admin.site.register(User, UserAdmin) +admin.site.register(Article) + +admin.site.unregister(Group) diff --git a/backend/articles/api/serializers.py b/backend/articles/api/serializers.py new file mode 100644 index 0000000..f8629e8 --- /dev/null +++ b/backend/articles/api/serializers.py @@ -0,0 +1,59 @@ +from rest_framework import serializers +from rest_auth.registration.serializers import RegisterSerializer +from articles.models import Article, User +from allauth.account.adapter import get_adapter +from rest_framework.authtoken.models import Token + + +class ArticleSerializer(serializers.ModelSerializer): + class Meta: + model = Article + fields = ( + 'id', 'title', 'image', 'text', 'rating', 'n_comments', 'author', 'is_solved', 'city', 'address', 'lat', 'lon') + + +class UserSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = ('username', 'email', 'bio', 'avatar', 'password', + ) + + +class CustomRegisterSerializer(RegisterSerializer): + + class Meta: + model = User + fields = ('username', 'email', 'password') + + def get_cleaned_data(self): + return { + 'username': self.validated_data.get('username', ''), + 'password1': self.validated_data.get('password1', ''), + 'password2': self.validated_data.get('password2', ''), + 'email': self.validated_data.get('email', ''), + + } + + def save(self, request): + adapter = get_adapter() + user = adapter.new_user(request) + + self.cleaned_data = self.get_cleaned_data() + + user.save() + adapter.save_user(request, user, self) + return user + + +class TokenSerializer(serializers.ModelSerializer): + user_info = serializers.SerializerMethodField() + + class Meta: + model = Token + fields = ('key', 'user', 'user_info') + + def get_user_info(self, obj): + serializer_data = UserSerializer(obj.user).data + del serializer_data['password'] + + return serializer_data diff --git a/backend/articles/api/urls.py b/backend/articles/api/urls.py new file mode 100644 index 0000000..f8bf0d5 --- /dev/null +++ b/backend/articles/api/urls.py @@ -0,0 +1,7 @@ +from rest_framework.routers import DefaultRouter +from .views import UserViewSet, ArticleViewSet + +router = DefaultRouter() +router.register(r'users', UserViewSet, base_name='users') +router.register(r'articles', ArticleViewSet, base_name='articles') +urlpatterns = router.urls diff --git a/backend/articles/api/views.py b/backend/articles/api/views.py new file mode 100644 index 0000000..209f71f --- /dev/null +++ b/backend/articles/api/views.py @@ -0,0 +1,16 @@ +from rest_framework.generics import ListAPIView, RetrieveAPIView +from ..models import User +from .serializers import UserSerializer +from articles.models import Article +from .serializers import ArticleSerializer +from rest_framework import viewsets + + +class UserViewSet(viewsets.ModelViewSet): + serializer_class = UserSerializer + queryset = User.objects.all() + + +class ArticleViewSet(viewsets.ModelViewSet): + serializer_class = ArticleSerializer + queryset = Article.objects.all() diff --git a/backend/articles/apps.py b/backend/articles/apps.py new file mode 100644 index 0000000..bc12dfb --- /dev/null +++ b/backend/articles/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class ArticlesConfig(AppConfig): + name = 'articles' diff --git a/backend/articles/forms.py b/backend/articles/forms.py new file mode 100644 index 0000000..63444a1 --- /dev/null +++ b/backend/articles/forms.py @@ -0,0 +1,15 @@ +from django import forms +from django.contrib.auth.forms import UserCreationForm, UserChangeForm +from .models import User + + +class CustomUserCreationForm(UserCreationForm): + class Meta(UserCreationForm): + model = User + fields = ('username', 'email') + + +class CustomUserChangeForm(UserChangeForm): + class Meta: + model = User + fields = ('username', 'email') diff --git a/backend/articles/migrations/0001_initial.py b/backend/articles/migrations/0001_initial.py new file mode 100644 index 0000000..79eb3ae --- /dev/null +++ b/backend/articles/migrations/0001_initial.py @@ -0,0 +1,61 @@ +# Generated by Django 2.1.5 on 2019-02-28 07:23 + +from django.conf import settings +import django.contrib.auth.models +import django.contrib.auth.validators +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0009_alter_user_last_name_max_length'), + ] + + 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')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('bio', models.TextField(blank=True, max_length=500)), + ('avatar', models.ImageField(blank=True, upload_to='avatars/')), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), + ], + options={ + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + 'abstract': False, + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + migrations.CreateModel( + name='Article', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=30)), + ('text', models.TextField()), + ('image', models.ImageField(upload_to='article_images/')), + ('rating', models.IntegerField(default=0)), + ('n_comments', models.IntegerField(default=0)), + ('is_solved', models.BooleanField(default=0)), + ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/backend/articles/migrations/0002_auto_20190228_0732.py b/backend/articles/migrations/0002_auto_20190228_0732.py new file mode 100644 index 0000000..74c816a --- /dev/null +++ b/backend/articles/migrations/0002_auto_20190228_0732.py @@ -0,0 +1,33 @@ +# Generated by Django 2.1.5 on 2019-02-28 07:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('articles', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='article', + name='address', + field=models.CharField(default='Не указано', max_length=100), + ), + migrations.AddField( + model_name='article', + name='city', + field=models.CharField(default='Не указано', max_length=30), + ), + migrations.AddField( + model_name='article', + name='lat', + field=models.FloatField(default=0.0), + ), + migrations.AddField( + model_name='article', + name='lon', + field=models.FloatField(default=0.0), + ), + ] diff --git a/backend/articles/migrations/__init__.py b/backend/articles/migrations/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/backend/articles/migrations/__init__.py diff --git a/backend/articles/models.py b/backend/articles/models.py new file mode 100644 index 0000000..fdde780 --- /dev/null +++ b/backend/articles/models.py @@ -0,0 +1,30 @@ +from django.contrib.auth.models import AbstractUser +from django.db import models +from django.utils.translation import gettext_lazy as _ + +from EcoAlert.settings import AUTH_USER_MODEL + + +class User(AbstractUser): + bio = models.TextField(max_length=500, blank=True) + avatar = models.ImageField(upload_to='avatars/', blank=True) + + def __str__(self): + return self.username + + +class Article(models.Model): + author = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE) + city = models.CharField(max_length=30, default='Не указано') + address = models.CharField(max_length=100, default='Не указано') + title = models.CharField(max_length=30) + text = models.TextField() + image = models.ImageField(upload_to='article_images/', default='../media/article_images/') + rating = models.IntegerField(default=0) + n_comments = models.IntegerField(default=0) + is_solved = models.BooleanField(default=0) + lat = models.FloatField(default=0.0) + lon = models.FloatField(default=0.0) + + def __str__(self): + return self.title diff --git a/backend/articles/tests.py b/backend/articles/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/backend/articles/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/backend/articles/views.py b/backend/articles/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/backend/articles/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. |