Fix and refactor

This commit is contained in:
Виктор Гладких 2019-10-11 14:49:32 +03:00
parent caf11ed372
commit a6c56a4bf1
9 changed files with 36 additions and 92 deletions

View File

@ -2,7 +2,6 @@
from django.contrib import admin from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from account import models from account import models

View File

@ -1,4 +1,4 @@
# Generated by Django 2.2.4 on 2019-10-08 07:17 # Generated by Django 2.2.4 on 2019-10-11 11:23
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models
@ -9,7 +9,7 @@ import django.utils.timezone
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('location', '0010_auto_20190904_0711'), ('location', '0011_country_languages'),
('account', '0008_auto_20190912_1325'), ('account', '0008_auto_20190912_1325'),
] ]
@ -21,10 +21,6 @@ class Migration(migrations.Migration):
('created', models.DateTimeField(default=django.utils.timezone.now, editable=False, verbose_name='Date created')), ('created', models.DateTimeField(default=django.utils.timezone.now, editable=False, verbose_name='Date created')),
('modified', models.DateTimeField(auto_now=True, verbose_name='Date updated')), ('modified', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
('role', models.PositiveIntegerField(choices=[(1, 'Standard user'), (2, 'Comments moderator')], verbose_name='Role')), ('role', models.PositiveIntegerField(choices=[(1, 'Standard user'), (2, 'Comments moderator')], verbose_name='Role')),
('is_list', models.BooleanField(default=True, verbose_name='list')),
('is_create', models.BooleanField(default=False, verbose_name='create')),
('is_update', models.BooleanField(default=False, verbose_name='update')),
('is_delete', models.BooleanField(default=False, verbose_name='delete')),
('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='location.Country', verbose_name='Country')), ('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='location.Country', verbose_name='Country')),
], ],
options={ options={
@ -44,4 +40,9 @@ class Migration(migrations.Migration):
'abstract': False, 'abstract': False,
}, },
), ),
migrations.AddField(
model_name='user',
name='roles',
field=models.ManyToManyField(through='account.UserRole', to='account.Role', verbose_name='Roles'),
),
] ]

View File

@ -1,29 +0,0 @@
# Generated by Django 2.2.4 on 2019-10-08 07:51
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('account', '0009_role_userrole'),
]
operations = [
migrations.RemoveField(
model_name='role',
name='is_create',
),
migrations.RemoveField(
model_name='role',
name='is_delete',
),
migrations.RemoveField(
model_name='role',
name='is_list',
),
migrations.RemoveField(
model_name='role',
name='is_update',
),
]

View File

@ -19,6 +19,24 @@ from utils.models import ImageMixin, ProjectBaseMixin, PlatformMixin
from utils.tokens import GMRefreshToken from utils.tokens import GMRefreshToken
class Role(ProjectBaseMixin):
"""Base Role model."""
STANDARD_USER = 1
COMMENTS_MODERATOR = 2
ROLE_CHOICES =(
(STANDARD_USER, 'Standard user'),
(COMMENTS_MODERATOR, 'Comments moderator'),
)
role = models.PositiveIntegerField(verbose_name=_('Role'), choices=ROLE_CHOICES,
null=False, blank=False)
country = models.ForeignKey(Country, verbose_name=_('Country'), on_delete=models.CASCADE)
# is_list = models.BooleanField(verbose_name=_('list'), default=True, null=False)
# is_create = models.BooleanField(verbose_name=_('create'), default=False, null=False)
# is_update = models.BooleanField(verbose_name=_('update'), default=False, null=False)
# is_delete = models.BooleanField(verbose_name=_('delete'), default=False, null=False)
class UserManager(BaseUserManager): class UserManager(BaseUserManager):
"""Extended manager for User model.""" """Extended manager for User model."""
@ -68,6 +86,7 @@ class User(AbstractUser):
USERNAME_FIELD = 'username' USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email'] REQUIRED_FIELDS = ['email']
roles = models.ManyToManyField(Role, verbose_name=_('Roles'), through='UserRole')
objects = UserManager.from_queryset(UserQuerySet)() objects = UserManager.from_queryset(UserQuerySet)()
class Meta: class Meta:
@ -198,20 +217,7 @@ class User(AbstractUser):
context=context) context=context)
class Role(ProjectBaseMixin):
ROLE_CHOICES =(
(1, 'Standard user'),
(2, 'Comments moderator'),
)
role = models.PositiveIntegerField(verbose_name=_('Role'), choices=ROLE_CHOICES,
null=False, blank=False)
country = models.ForeignKey(Country, verbose_name=_('Country'), on_delete=models.CASCADE)
# is_list = models.BooleanField(verbose_name=_('list'), default=True, null=False)
# is_create = models.BooleanField(verbose_name=_('create'), default=False, null=False)
# is_update = models.BooleanField(verbose_name=_('update'), default=False, null=False)
# is_delete = models.BooleanField(verbose_name=_('delete'), default=False, null=False)
class UserRole(ProjectBaseMixin): class UserRole(ProjectBaseMixin):
"""UserRole model."""
user = models.ForeignKey(User, verbose_name=_('User'), on_delete=models.CASCADE) user = models.ForeignKey(User, verbose_name=_('User'), on_delete=models.CASCADE)
role = models.ForeignKey(Role, verbose_name=_('Role'), on_delete=models.SET_NULL, null=True) role = models.ForeignKey(Role, verbose_name=_('Role'), on_delete=models.SET_NULL, null=True)

View File

@ -2,7 +2,7 @@ from rest_framework import permissions
from account.models import UserRole, Role, User from account.models import UserRole, Role, User
class IsCommentModerator(permissions.BasePermission): class IsCommentModerator(permissions.IsAuthenticatedOrReadOnly):
""" """
Object-level permission to only allow owners of an object to edit it. Object-level permission to only allow owners of an object to edit it.
Assumes the model instance has an `owner` attribute. Assumes the model instance has an `owner` attribute.
@ -11,23 +11,18 @@ class IsCommentModerator(permissions.BasePermission):
def has_object_permission(self, request, view, obj): def has_object_permission(self, request, view, obj):
# Read permissions are allowed to any request, # Read permissions are allowed to any request,
# so we'll always allow GET, HEAD or OPTIONS requests. # so we'll always allow GET, HEAD or OPTIONS requests.
if request.method in permissions.SAFE_METHODS: if request.method in permissions.SAFE_METHODS or \
return True obj.user == request.user or request.user.is_superuser:
# # user owner is user request
if obj.user == request.user:
return True return True
# Must have role # Must have role
role = Role.objects.filter(role=2, role = Role.objects.filter(role=Role.COMMENTS_MODERATOR,
country__languages__id=obj.language_id)\ country__languages__id=obj.language_id)\
.first() # 'Comments moderator' .first() # 'Comments moderator'
is_access = UserRole.objects.filter(user=request.user, role=role).exists() is_access = UserRole.objects.filter(user=request.user, role=role).exists()
if obj.user != request.user and is_access: if obj.user != request.user and is_access:
return True return True
super_user = User.objects.filter(pk=request.user.pk, is_superuser=True).exists()
if super_user:
return True
return False return False

View File

@ -5,13 +5,15 @@ from comment.permissions import IsCommentModerator
class CommentLstView(generics.ListCreateAPIView): class CommentLstView(generics.ListCreateAPIView):
"""Comment list create view."""
serializer_class = serializers.CommentBaseSerializer serializer_class = serializers.CommentBaseSerializer
queryset = models.Comment.objects.all() queryset = models.Comment.objects.all()
permission_classes = [permissions.IsAuthenticatedOrReadOnly,] permission_classes = [permissions.IsAuthenticatedOrReadOnly,]
class CommentRUDView(generics.RetrieveUpdateDestroyAPIView): class CommentRUDView(generics.RetrieveUpdateDestroyAPIView):
"""Comment RUD view."""
serializer_class = serializers.CommentBaseSerializer serializer_class = serializers.CommentBaseSerializer
queryset = models.Comment.objects.all() queryset = models.Comment.objects.all()
permission_classes = [permissions.IsAuthenticatedOrReadOnly,IsCommentModerator] permission_classes = [IsCommentModerator]
lookup_field = 'id' lookup_field = 'id'

View File

@ -8,6 +8,7 @@ from django.utils.translation import gettext_lazy as _
from utils.models import ProjectBaseMixin, SVGImageMixin, TranslatedFieldsMixin, TJSONField from utils.models import ProjectBaseMixin, SVGImageMixin, TranslatedFieldsMixin, TJSONField
from translation.models import Language from translation.models import Language
class Country(TranslatedFieldsMixin, SVGImageMixin, ProjectBaseMixin): class Country(TranslatedFieldsMixin, SVGImageMixin, ProjectBaseMixin):
"""Country model.""" """Country model."""

View File

@ -1,17 +0,0 @@
# Generated by Django 2.2.4 on 2019-10-04 09:28
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('timetable', '0002_auto_20190919_1124'),
]
operations = [
migrations.AlterModelOptions(
name='timetable',
options={'ordering': ['weekday'], 'verbose_name': 'Timetable', 'verbose_name_plural': 'Timetables'},
),
]

View File

@ -1,14 +0,0 @@
# Generated by Django 2.2.4 on 2019-10-09 13:41
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('timetable', '0003_auto_20191004_0928'),
('timetable', '0003_auto_20191003_0943'),
]
operations = [
]