added transfer for notes

This commit is contained in:
Anatoly 2019-11-12 15:14:35 +03:00
parent 7064790606
commit 8eac730d9f
10 changed files with 162 additions and 21 deletions

View File

@ -0,0 +1,33 @@
# Generated by Django 2.2.7 on 2019-11-12 10:07
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('establishment', '0058_merge_20191106_0921'),
]
operations = [
migrations.CreateModel(
name='EstablishmentNote',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', models.DateTimeField(default=django.utils.timezone.now, editable=False, verbose_name='Date created')),
('modified', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
('old_id', models.PositiveIntegerField(blank=True, null=True)),
('text', models.TextField(verbose_name='text')),
('establishment', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='establishment_notes', to='establishment.Establishment', verbose_name='establishment')),
('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='establishment_notes', to=settings.AUTH_USER_MODEL, verbose_name='author')),
],
options={
'verbose_name': 'product notes',
'verbose_name_plural': 'product note',
},
),
]

View File

@ -520,6 +520,30 @@ class Establishment(ProjectBaseMixin, URLImageMixin, TranslatedFieldsMixin):
return self.products.wines() return self.products.wines()
class EstablishmentNoteQuerySet(models.QuerySet):
"""QuerySet for model EstablishmentNote."""
class EstablishmentNote(ProjectBaseMixin):
"""Note model for Establishment entity."""
old_id = models.PositiveIntegerField(null=True, blank=True)
text = models.TextField(verbose_name=_('text'))
establishment = models.ForeignKey(Establishment, on_delete=models.PROTECT,
related_name='establishment_notes',
verbose_name=_('establishment'))
user = models.ForeignKey('account.User', on_delete=models.PROTECT,
null=True,
related_name='establishment_notes',
verbose_name=_('author'))
objects = EstablishmentNoteQuerySet.as_manager()
class Meta:
"""Meta class."""
verbose_name_plural = _('product note')
verbose_name = _('product notes')
class Position(BaseAttributes, TranslatedFieldsMixin): class Position(BaseAttributes, TranslatedFieldsMixin):
"""Position model.""" """Position model."""

View File

@ -4,8 +4,9 @@ from django.db.models import Q, F
from establishment.models import Establishment from establishment.models import Establishment
from location.models import Address from location.models import Address
from transfer.models import Establishments, Dishes from transfer.models import Establishments, Dishes, EstablishmentNotes
from transfer.serializers.establishment import EstablishmentSerializer from transfer.serializers.establishment import EstablishmentSerializer, \
EstablishmentNoteSerializer
from transfer.serializers.plate import PlateSerializer from transfer.serializers.plate import PlateSerializer
@ -124,10 +125,26 @@ def transfer_establishment_addresses():
establishment.save() establishment.save()
def transfer_establishment_note():
errors = []
queryset = EstablishmentNotes.objects.exclude(text__exact='') \
.exclude(text__isnull=True) \
.exclude(establishment_id__isnull=True)
serialized_data = EstablishmentNoteSerializer(
data=list(queryset.values()),
many=True)
if serialized_data.is_valid():
serialized_data.save()
else:
for d in serialized_data.errors: errors.append(d) if d else None
pprint(f"transfer_establishment_note errors: {errors}")
data_types = { data_types = {
"establishment": [ "establishment": [
transfer_establishment, transfer_establishment,
], ],
"establishment_note": [transfer_establishment_note],
"location_establishment": [ "location_establishment": [
transfer_establishment_addresses transfer_establishment_addresses
], ],

View File

@ -1,4 +1,4 @@
# Generated by Django 2.2.7 on 2019-11-12 09:37 # Generated by Django 2.2.7 on 2019-11-12 10:07
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models
@ -24,9 +24,10 @@ class Migration(migrations.Migration):
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('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')),
('old_id', models.PositiveIntegerField(blank=True, null=True)),
('text', models.TextField(verbose_name='text')), ('text', models.TextField(verbose_name='text')),
('product', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='notes', to='product.Product', verbose_name='product')), ('product', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='product_notes', to='product.Product', verbose_name='product')),
('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='notes', to=settings.AUTH_USER_MODEL, verbose_name='author')), ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='product_notes', to=settings.AUTH_USER_MODEL, verbose_name='author')),
], ],
options={ options={
'verbose_name': 'product notes', 'verbose_name': 'product notes',

View File

@ -414,13 +414,14 @@ class ProductNoteQuerySet(models.QuerySet):
class ProductNote(ProjectBaseMixin): class ProductNote(ProjectBaseMixin):
"""Note model for Product entity.""" """Note model for Product entity."""
old_id = models.PositiveIntegerField(null=True, blank=True)
text = models.TextField(verbose_name=_('text')) text = models.TextField(verbose_name=_('text'))
product = models.ForeignKey(Product, on_delete=models.PROTECT, product = models.ForeignKey(Product, on_delete=models.PROTECT,
related_name='notes', related_name='product_notes',
verbose_name=_('product')) verbose_name=_('product'))
user = models.ForeignKey('account.User', on_delete=models.PROTECT, user = models.ForeignKey('account.User', on_delete=models.PROTECT,
null=True, null=True,
related_name='notes', related_name='product_notes',
verbose_name=_('author')) verbose_name=_('author'))
objects = ProductNoteQuerySet.as_manager() objects = ProductNoteQuerySet.as_manager()

View File

@ -101,6 +101,7 @@ def transfer_wine_classifications():
def transfer_product(): def transfer_product():
errors = []
queryset = transfer_models.Products.objects.all() queryset = transfer_models.Products.objects.all()
serialized_data = product_serializers.ProductSerializer( serialized_data = product_serializers.ProductSerializer(
data=list(queryset.values()), data=list(queryset.values()),
@ -108,12 +109,12 @@ def transfer_product():
if serialized_data.is_valid(): if serialized_data.is_valid():
serialized_data.save() serialized_data.save()
else: else:
errors = []
for d in serialized_data.errors: errors.append(d) if d else None for d in serialized_data.errors: errors.append(d) if d else None
pprint(f"transfer_product errors: {errors}") pprint(f"transfer_product errors: {errors}")
def transfer_product_note(): def transfer_product_note():
errors = []
queryset = transfer_models.ProductNotes.objects.exclude(text='') queryset = transfer_models.ProductNotes.objects.exclude(text='')
serialized_data = product_serializers.ProductNoteSerializer( serialized_data = product_serializers.ProductNoteSerializer(
data=list(queryset.values()), data=list(queryset.values()),
@ -121,12 +122,12 @@ def transfer_product_note():
if serialized_data.is_valid(): if serialized_data.is_valid():
serialized_data.save() serialized_data.save()
else: else:
errors = []
for d in serialized_data.errors: errors.append(d) if d else None for d in serialized_data.errors: errors.append(d) if d else None
pprint(f"transfer_product_note errors: {errors}") pprint(f"transfer_product_note errors: {errors}")
def transfer_plate(): def transfer_plate():
errors = []
queryset = transfer_models.Merchandise.objects.all() queryset = transfer_models.Merchandise.objects.all()
serialized_data = product_serializers.PlateSerializer( serialized_data = product_serializers.PlateSerializer(
data=list(queryset.values()), data=list(queryset.values()),
@ -134,12 +135,12 @@ def transfer_plate():
if serialized_data.is_valid(): if serialized_data.is_valid():
serialized_data.save() serialized_data.save()
else: else:
errors = []
for d in serialized_data.errors: errors.append(d) if d else None for d in serialized_data.errors: errors.append(d) if d else None
pprint(f"transfer_plates errors: {errors}") pprint(f"transfer_plates errors: {errors}")
def transfer_plate_image(): def transfer_plate_image():
errors = []
queryset = transfer_models.Merchandise.objects.all() queryset = transfer_models.Merchandise.objects.all()
serialized_data = product_serializers.PlateImageSerializer( serialized_data = product_serializers.PlateImageSerializer(
data=list(queryset.values()), data=list(queryset.values()),
@ -147,7 +148,6 @@ def transfer_plate_image():
if serialized_data.is_valid(): if serialized_data.is_valid():
serialized_data.save() serialized_data.save()
else: else:
errors = []
for d in serialized_data.errors: errors.append(d) if d else None for d in serialized_data.errors: errors.append(d) if d else None
pprint(f"transfer_plates_images errors: {errors}") pprint(f"transfer_plates_images errors: {errors}")

View File

@ -34,6 +34,7 @@ class Command(BaseCommand):
'product', 'product',
'product_note', 'product_note',
'souvenir', 'souvenir',
'establishment_note',
] ]
def handle(self, *args, **options): def handle(self, *args, **options):

View File

@ -447,6 +447,18 @@ class Establishments(MigrateMixin):
db_table = 'establishments' db_table = 'establishments'
class EstablishmentNotes(MigrateMixin):
using = 'legacy'
establishment_id = models.IntegerField(null=True, blank=True)
account_id = models.IntegerField(null=True, blank=True)
text = models.TextField(null=True)
class Meta:
managed = False
db_table = 'notes'
class Descriptions(MigrateMixin): class Descriptions(MigrateMixin):
using = 'legacy' using = 'legacy'
@ -973,7 +985,7 @@ class Products(MigrateMixin):
class ProductNotes(MigrateMixin): class ProductNotes(MigrateMixin):
using = 'legacy' using = 'legacy'
product = models.ForeignKey(Products, on_delete=models.DO_NOTHING) product_id = models.IntegerField(null=True, blank=True)
text = models.CharField(max_length=255) text = models.CharField(max_length=255)
win_import_id = models.CharField(max_length=255) win_import_id = models.CharField(max_length=255)

View File

@ -1,16 +1,17 @@
from django.conf import settings from django.conf import settings
from django.core.exceptions import MultipleObjectsReturned, ValidationError from django.core.exceptions import MultipleObjectsReturned, ValidationError
from django.db import transaction from django.db import transaction
from django.utils.text import slugify
from rest_framework import serializers from rest_framework import serializers
from establishment.models import Establishment, ContactEmail, ContactPhone, EstablishmentType, \ from account.models import User
EstablishmentSubType from establishment.models import Establishment, ContactEmail, ContactPhone, \
EstablishmentType, EstablishmentSubType, EstablishmentNote
from location.models import Address from location.models import Address
from timetable.models import Timetable from timetable.models import Timetable
from utils.legacy_parser import parse_legacy_schedule_content from utils.legacy_parser import parse_legacy_schedule_content
from utils.serializers import TimeZoneChoiceField from utils.serializers import TimeZoneChoiceField
from utils.slug_generator import generate_unique_slug from utils.slug_generator import generate_unique_slug
from django.utils.text import slugify
class EstablishmentSerializer(serializers.ModelSerializer): class EstablishmentSerializer(serializers.ModelSerializer):
@ -173,3 +174,45 @@ class EstablishmentSerializer(serializers.ModelSerializer):
index_name=slugify(subtype_name), index_name=slugify(subtype_name),
establishment_type_id=establishment_type_id) establishment_type_id=establishment_type_id)
return subtype return subtype
class EstablishmentNoteSerializer(serializers.ModelSerializer):
id = serializers.IntegerField()
establishment_id = serializers.IntegerField()
account_id = serializers.IntegerField(allow_null=True)
text = serializers.CharField(allow_blank=True, allow_null=True)
class Meta:
model = EstablishmentNote
fields = (
'id',
'establishment_id',
'account_id',
'text',
)
def validate(self, attrs):
attrs['old_id'] = attrs['id']
attrs['establishment'] = self.get_establishment(attrs.pop('establishment_id'))
attrs['user'] = self.get_user(attrs.pop('account_id'))
return attrs
def create(self, validated_data):
qs = self.Meta.model.objects.filter(**validated_data)
establishment = validated_data.get('establishment')
if not qs.exists() and establishment:
obj = super().create(validated_data)
return obj
def get_establishment(self, old_id):
if old_id:
qs = Establishment.objects.filter(old_id=old_id)
if qs.exists():
return qs.first()
def get_user(self, old_id):
qs = User.objects.exclude(old_id__isnull=True).filter(old_id=old_id)
if qs.exists():
return qs.first()

View File

@ -543,25 +543,34 @@ class PlateImageSerializer(serializers.ModelSerializer):
return product_qs.first() return product_qs.first()
class ProductNoteSerializer(TransferSerializerMixin): class ProductNoteSerializer(serializers.ModelSerializer):
product_id = serializers.PrimaryKeyRelatedField(
queryset=transfer_models.Products.objects.all()) id = serializers.IntegerField()
product_id = serializers.IntegerField()
text = serializers.CharField(allow_blank=True) text = serializers.CharField(allow_blank=True)
class Meta: class Meta:
model = models.ProductNote model = models.ProductNote
fields = ( fields = (
'id',
'product_id', 'product_id',
'text', 'text',
) )
def validate(self, attrs): def validate(self, attrs):
attrs['old_id'] = attrs['id']
attrs['product'] = self.get_product(attrs.pop('product_id')) attrs['product'] = self.get_product(attrs.pop('product_id'))
return attrs return attrs
def get_product(self, product): def create(self, validated_data):
if product: qs = self.Meta.model.objects.filter(**validated_data)
old_id = product.id if hasattr(product, 'id') else product product = validated_data.get('product')
if not qs.exists() and product:
return super().create(validated_data)
def get_product(self, old_id):
if old_id:
qs = models.Product.objects.filter(old_id=old_id) qs = models.Product.objects.filter(old_id=old_id)
if qs.exists(): if qs.exists():
return qs.first() return qs.first()