Fix and refactor
This commit is contained in:
parent
caf11ed372
commit
a6c56a4bf1
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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'),
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
@ -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',
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
@ -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)
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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'
|
||||||
|
|
|
||||||
|
|
@ -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."""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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'},
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
@ -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 = [
|
|
||||||
]
|
|
||||||
Loading…
Reference in New Issue
Block a user