add datamigrate and change for models

This commit is contained in:
Dmitriy Kuzmenko 2019-12-11 18:12:26 +03:00
parent d2f011417a
commit 86b2e708f0
8 changed files with 163 additions and 15 deletions

View File

@ -0,0 +1,49 @@
from django.core.management.base import BaseCommand
from tqdm import tqdm
from account.models import User, UserRole, Role
from transfer.models import OwnershipAffs
from establishment.models import Establishment
class Command(BaseCommand):
help = """Add ownership to UserRoles."""
def handle(self, *args, **kwarg):
create_user_roles = []
# filter owner records with state not null only
owners = OwnershipAffs.objects.filter(state__isnull=False)
# Get role, may be more then 1
role = Role.objects.filter(role=Role.ESTABLISHMENT_MANAGER).first()
if not role:
role = Role.objects.create(
role=Role.ESTABLISHMENT_MANAGER
)
for owner in tqdm(owners):
user = User.objects.filter(
old_id=owner.account_id).first()
requester = User.objects.filter(
old_id=owner.requester_id).first()
establishment = Establishment.objects.filter(
old_id=owner.establishment_id).first()
if user and establishment:
user_role = UserRole.objects.filter(
user=user, role=role, establishment=establishment, state=owner.state).first()
if not user_role:
# add to bulk_create
create_user_roles.append(UserRole(
user=user,
role=role,
establishment=establishment,
state=owner.state,
requester=requester
))
UserRole.objects.bulk_create(create_user_roles)
self.stdout.write(
self.style.WARNING(
f'Created roles: {len(create_user_roles)}')
)

View File

@ -0,0 +1,25 @@
# Generated by Django 2.2.7 on 2019-12-11 11:34
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('account', '0025_auto_20191210_0623'),
]
operations = [
migrations.AddField(
model_name='userrole',
name='requester',
field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='roles_requested', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='userrole',
name='state',
field=models.CharField(choices=[('validated', 'validated'), ('pending', 'pending'), ('cancelled', 'cancelled'), ('rejected', 'rejected')], default='pending', max_length=10, verbose_name='state'),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 2.2.7 on 2019-12-11 14:44
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('establishment', '0067_auto_20191122_1244'),
('account', '0026_auto_20191211_1134'),
]
operations = [
migrations.AlterUniqueTogether(
name='userrole',
unique_together={('user', 'role', 'establishment', 'state')},
),
]

View File

@ -38,12 +38,12 @@ class Role(ProjectBaseMixin):
SELLER = 10 SELLER = 10
ROLE_CHOICES = ( ROLE_CHOICES = (
(STANDARD_USER, 'Standard user'), (STANDARD_USER, _('Standard user')),
(COMMENTS_MODERATOR, 'Comments moderator'), (COMMENTS_MODERATOR, _('Comments moderator')),
(COUNTRY_ADMIN, 'Country admin'), (COUNTRY_ADMIN, _('Country admin')),
(CONTENT_PAGE_MANAGER, 'Content page manager'), (CONTENT_PAGE_MANAGER, _('Content page manager')),
(ESTABLISHMENT_MANAGER, 'Establishment manager'), (ESTABLISHMENT_MANAGER, _('Establishment manager')),
(REVIEWER_MANGER, 'Reviewer manager'), (REVIEWER_MANGER, _('Reviewer manager')),
(RESTAURANT_REVIEWER, 'Restaurant reviewer'), (RESTAURANT_REVIEWER, 'Restaurant reviewer'),
(SALES_MAN, 'Sales man'), (SALES_MAN, 'Sales man'),
(WINERY_REVIEWER, 'Winery reviewer'), (WINERY_REVIEWER, 'Winery reviewer'),
@ -93,6 +93,14 @@ class UserQuerySet(models.QuerySet):
return self.filter(oauth2_provider_refreshtoken__token=token, return self.filter(oauth2_provider_refreshtoken__token=token,
oauth2_provider_refreshtoken__expires__gt=timezone.now()) oauth2_provider_refreshtoken__expires__gt=timezone.now())
def by_role(self, role):
"""Filter by role."""
return self.filter(userrole__role=role).dictinct()
def by_roles(self, roles: list):
"""Filter by roles."""
return self.filter(userrole__role__in=roles).dictinct()
class User(AbstractUser): class User(AbstractUser):
"""Base user model.""" """Base user model."""
@ -116,7 +124,9 @@ class User(AbstractUser):
USERNAME_FIELD = 'username' USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email'] REQUIRED_FIELDS = ['email']
roles = models.ManyToManyField(Role, verbose_name=_('Roles'), through='UserRole') roles = models.ManyToManyField(
Role, verbose_name=_('Roles'), symmetrical=False,
through_fields=('user', 'role'), through='UserRole')
objects = UserManager.from_queryset(UserQuerySet)() objects = UserManager.from_queryset(UserQuerySet)()
class Meta: class Meta:
@ -301,14 +311,33 @@ class User(AbstractUser):
class UserRole(ProjectBaseMixin): class UserRole(ProjectBaseMixin):
"""UserRole model.""" """UserRole model."""
user = models.ForeignKey('account.User', VALIDATED = 'validated'
verbose_name=_('User'), PENDING = 'pending'
on_delete=models.CASCADE) CANCELLED = 'cancelled'
role = models.ForeignKey(Role, verbose_name=_('Role'), on_delete=models.SET_NULL, null=True) REJECTED = 'rejected'
establishment = models.ForeignKey(Establishment, verbose_name=_('Establishment'),
STATE_CHOICES = (
(VALIDATED, _('validated')),
(PENDING, _('pending')),
(CANCELLED, _('cancelled')),
(REJECTED, _('rejected'))
)
user = models.ForeignKey(
'account.User', verbose_name=_('User'), on_delete=models.CASCADE)
role = models.ForeignKey(
Role, verbose_name=_('Role'), on_delete=models.SET_NULL, null=True)
establishment = models.ForeignKey(
Establishment, verbose_name=_('Establishment'),
on_delete=models.SET_NULL, null=True, blank=True) on_delete=models.SET_NULL, null=True, blank=True)
state = models.CharField(
_('state'), choices=STATE_CHOICES, max_length=10, default=PENDING)
requester = models.ForeignKey(
'account.User', blank=True, null=True, default=None, related_name='roles_requested',
on_delete=models.SET_NULL)
class Meta: class Meta:
unique_together = ['user', 'role'] unique_together = ['user', 'role', 'establishment', 'state']
class OldRole(models.Model): class OldRole(models.Model):

View File

@ -70,3 +70,7 @@ class UserRoleSerializer(serializers.ModelSerializer):
'user', 'user',
'establishment' 'establishment'
] ]
class OwnerSerializer(BackUserSerializer):
"""Owner serializer."""

View File

@ -10,4 +10,5 @@ urlpatterns = [
path('user-role/', views.UserRoleLstView.as_view(), name='user-role-list-create'), path('user-role/', views.UserRoleLstView.as_view(), name='user-role-list-create'),
path('user/', views.UserLstView.as_view(), name='user-create-list'), path('user/', views.UserLstView.as_view(), name='user-create-list'),
path('user/<int:id>/', views.UserRUDView.as_view(), name='user-rud'), path('user/<int:id>/', views.UserRUDView.as_view(), name='user-rud'),
path('owner/', views.OwnerListView.as_view(), name='owner-list'),
] ]

View File

@ -46,3 +46,9 @@ class UserRUDView(generics.RetrieveUpdateDestroyAPIView):
serializer_class = serializers.BackDetailUserSerializer serializer_class = serializers.BackDetailUserSerializer
permission_classes = (permissions.IsAdminUser,) permission_classes = (permissions.IsAdminUser,)
lookup_field = 'id' lookup_field = 'id'
class OwnerListView(generics.ListAPIView):
serializer_class = serializers.OwnerSerializer
queryset = models.User.objects.active()
permission_classes = (permissions.IsAuthenticatedOrReadOnly, )

View File

@ -1222,3 +1222,19 @@ class Footers(MigrateMixin):
class Meta: class Meta:
managed = False managed = False
db_table = 'footers' db_table = 'footers'
class OwnershipAffs(MigrateMixin):
using = 'legacy'
role = models.CharField(max_length=255, blank=True, null=True)
state = models.CharField(max_length=255, blank=True, null=True)
account_id = models.IntegerField(blank=True, null=True)
establishment_id = models.IntegerField(blank=True, null=True)
created_at = models.DateTimeField()
updated_at = models.DateTimeField()
requester_id = models.IntegerField(blank=True, null=True)
class Meta:
managed = False
db_table = 'ownership_affs'