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

@ -34,16 +34,16 @@ class Role(ProjectBaseMixin):
REVIEWER_MANGER = 6
RESTAURANT_REVIEWER = 7
SALES_MAN = 8
WINERY_REVIEWER = 9 # Establishments subtype "winery"
WINERY_REVIEWER = 9 # Establishments subtype "winery"
SELLER = 10
ROLE_CHOICES = (
(STANDARD_USER, 'Standard user'),
(COMMENTS_MODERATOR, 'Comments moderator'),
(COUNTRY_ADMIN, 'Country admin'),
(CONTENT_PAGE_MANAGER, 'Content page manager'),
(ESTABLISHMENT_MANAGER, 'Establishment manager'),
(REVIEWER_MANGER, 'Reviewer manager'),
(STANDARD_USER, _('Standard user')),
(COMMENTS_MODERATOR, _('Comments moderator')),
(COUNTRY_ADMIN, _('Country admin')),
(CONTENT_PAGE_MANAGER, _('Content page manager')),
(ESTABLISHMENT_MANAGER, _('Establishment manager')),
(REVIEWER_MANGER, _('Reviewer manager')),
(RESTAURANT_REVIEWER, 'Restaurant reviewer'),
(SALES_MAN, 'Sales man'),
(WINERY_REVIEWER, 'Winery reviewer'),
@ -93,6 +93,14 @@ class UserQuerySet(models.QuerySet):
return self.filter(oauth2_provider_refreshtoken__token=token,
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):
"""Base user model."""
@ -116,7 +124,9 @@ class User(AbstractUser):
USERNAME_FIELD = 'username'
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)()
class Meta:
@ -301,14 +311,33 @@ class User(AbstractUser):
class UserRole(ProjectBaseMixin):
"""UserRole model."""
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)
VALIDATED = 'validated'
PENDING = 'pending'
CANCELLED = 'cancelled'
REJECTED = 'rejected'
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)
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:
unique_together = ['user', 'role']
unique_together = ['user', 'role', 'establishment', 'state']
class OldRole(models.Model):

View File

@ -70,3 +70,7 @@ class UserRoleSerializer(serializers.ModelSerializer):
'user',
'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/', views.UserLstView.as_view(), name='user-create-list'),
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
permission_classes = (permissions.IsAdminUser,)
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:
managed = False
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'