Add transfer to city_photos

Add migrations
This commit is contained in:
littlewolf 2019-11-10 16:34:31 +03:00
parent 48d9ce37f7
commit 6d27ac533a
9 changed files with 162 additions and 55 deletions

View File

@ -0,0 +1,20 @@
# Generated by Django 2.2.4 on 2019-11-10 13:29
from django.db import migrations
import sorl.thumbnail.fields
import utils.methods
class Migration(migrations.Migration):
dependencies = [
('gallery', '0006_merge_20191027_1758'),
]
operations = [
migrations.AlterField(
model_name='image',
name='image',
field=sorl.thumbnail.fields.ImageField(max_length=255, upload_to=utils.methods.image_path, verbose_name='image file'),
),
]

View File

@ -22,7 +22,7 @@ class Image(ProjectBaseMixin, SORLImageMixin, PlatformMixin):
) )
image = SORLImageField(upload_to=image_path, image = SORLImageField(upload_to=image_path,
verbose_name=_('image file')) verbose_name=_('image file'), max_length=255)
orientation = models.PositiveSmallIntegerField(choices=ORIENTATIONS, orientation = models.PositiveSmallIntegerField(choices=ORIENTATIONS,
blank=True, null=True, default=None, blank=True, null=True, default=None,
verbose_name=_('image orientation')) verbose_name=_('image orientation'))

View File

@ -0,0 +1,23 @@
# Generated by Django 2.2.4 on 2019-11-10 13:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('location', '0026_auto_20191107_2010'),
]
operations = [
migrations.AddField(
model_name='citygallery',
name='old_id',
field=models.IntegerField(blank=True, null=True),
),
migrations.AlterField(
model_name='city',
name='gallery',
field=models.ManyToManyField(blank=True, through='location.CityGallery', to='gallery.Image'),
),
]

View File

@ -130,6 +130,7 @@ class CityGalleryQuerySet(models.QuerySet):
class CityGallery(models.Model): class CityGallery(models.Model):
old_id = models.IntegerField(blank=True, null=True)
city = models.ForeignKey(City, null=True, city = models.ForeignKey(City, null=True,
related_name='city_gallery', related_name='city_gallery',
on_delete=models.CASCADE, on_delete=models.CASCADE,

View File

@ -60,51 +60,36 @@ class RegionSerializer(serializers.ModelSerializer):
class CropImageSerializer(serializers.Serializer): class CropImageSerializer(serializers.Serializer):
"""Serializer for crop images for City object.""" """Serializer for crop images for City object."""
preview_url = serializers.SerializerMethodField() xsmall_url = serializers.SerializerMethodField()
promo_horizontal_web_url = serializers.SerializerMethodField() small_url = serializers.SerializerMethodField()
promo_horizontal_mobile_url = serializers.SerializerMethodField() medium_url = serializers.SerializerMethodField()
tile_horizontal_web_url = serializers.SerializerMethodField() large_url = serializers.SerializerMethodField()
tile_horizontal_mobile_url = serializers.SerializerMethodField() xlarge_url = serializers.SerializerMethodField()
tile_vertical_web_url = serializers.SerializerMethodField() detail_url = serializers.SerializerMethodField()
highlight_vertical_web_url = serializers.SerializerMethodField()
editor_web_url = serializers.SerializerMethodField()
editor_mobile_url = serializers.SerializerMethodField()
def get_preview_url(self, obj): def get_xsmall_url(self, obj):
"""Get crop preview.""" """Get crop preview."""
return obj.instance.get_image_url('news_preview') return obj.instance.get_image_url('location_city_xsmall')
def get_promo_horizontal_web_url(self, obj): def get_small_url(self, obj):
"""Get crop promo_horizontal_web.""" """Get crop preview."""
return obj.instance.get_image_url('news_promo_horizontal_web') return obj.instance.get_image_url('location_city_small')
def get_promo_horizontal_mobile_url(self, obj): def get_medium_url(self, obj):
"""Get crop promo_horizontal_mobile.""" """Get crop preview."""
return obj.instance.get_image_url('news_promo_horizontal_mobile') return obj.instance.get_image_url('location_city_medium')
def get_tile_horizontal_web_url(self, obj): def get_large_url(self, obj):
"""Get crop tile_horizontal_web.""" """Get crop preview."""
return obj.instance.get_image_url('news_tile_horizontal_web') return obj.instance.get_image_url('location_city_large')
def get_tile_horizontal_mobile_url(self, obj): def get_xlarge_url(self, obj):
"""Get crop tile_horizontal_mobile.""" """Get crop preview."""
return obj.instance.get_image_url('news_tile_horizontal_mobile') return obj.instance.get_image_url('location_city_xlarge')
def get_tile_vertical_web_url(self, obj): def get_detail_url(self, obj):
"""Get crop tile_vertical_web.""" """Get crop preview."""
return obj.instance.get_image_url('news_tile_vertical_web') return obj.instance.get_image_url('location_city_detail')
def get_highlight_vertical_web_url(self, obj):
"""Get crop highlight_vertical_web."""
return obj.instance.get_image_url('news_highlight_vertical_web')
def get_editor_web_url(self, obj):
"""Get crop editor_web."""
return obj.instance.get_image_url('news_editor_web')
def get_editor_mobile_url(self, obj):
"""Get crop editor_mobile."""
return obj.instance.get_image_url('news_editor_mobile')
class CityImageSerializer(serializers.ModelSerializer): class CityImageSerializer(serializers.ModelSerializer):

View File

@ -1,7 +1,7 @@
from transfer.serializers.location import CountrySerializer, RegionSerializer, \ from transfer.serializers.location import CountrySerializer, RegionSerializer, \
CitySerializer, AddressSerializer, CityMapSerializer, \ CitySerializer, AddressSerializer, CityMapSerializer, CityGallerySerializer, \
Country Country
from transfer.models import Cities, Locations from transfer.models import Cities, Locations, CityPhotos
from pprint import pprint from pprint import pprint
from requests import get from requests import get
@ -162,6 +162,29 @@ def migrate_city_map_situation():
pprint(f"City info serializer errors: {serialized_data.errors}") pprint(f"City info serializer errors: {serialized_data.errors}")
def migrate_city_photos():
queryset = CityPhotos.objects.raw("""SELECT city_photos.id, city_photos.city_id, city_photos.attachment_file_name
FROM city_photos WHERE
city_photos.attachment_file_name IS NOT NULL AND
city_id IN(
SELECT cities.id
FROM cities WHERE
region_code IS NOT NULL AND
region_code != "" AND
country_code_2 IS NOT NULL AND
country_code_2 != ""
)
""")
queryset = [vars(query) for query in queryset]
serialized_data = CityGallerySerializer(data=queryset, many=True)
if serialized_data.is_valid():
serialized_data.save()
else:
pprint(f"Address serializer errors: {serialized_data.errors}")
data_types = { data_types = {
"dictionaries": [ "dictionaries": [
transfer_countries, transfer_countries,
@ -173,7 +196,10 @@ data_types = {
update_flags update_flags
], ],
"update_city_info": [ "update_city_info": [
migrate_city_map_situation() migrate_city_map_situation
],
"migrate_city_gallery": [
migrate_city_photos
] ]
} }

View File

@ -29,7 +29,8 @@ class Command(BaseCommand):
LONG_DATA_TYPES = [ LONG_DATA_TYPES = [
'update_country_flag', 'update_country_flag',
'comment', 'comment',
'update_city_info' 'update_city_info',
'migrate_city_gallery'
] ]
def handle(self, *args, **options): def handle(self, *args, **options):

View File

@ -1,7 +1,8 @@
from rest_framework import serializers from rest_framework import serializers
from location.models import Country, Region, City, Address from location.models import Country, Region, City, Address, CityGallery
from django.contrib.gis.geos import Point from django.contrib.gis.geos import Point
from django.core.exceptions import MultipleObjectsReturned from django.core.exceptions import MultipleObjectsReturned
from gallery.models import Image
class CountrySerializer(serializers.ModelSerializer): class CountrySerializer(serializers.ModelSerializer):
@ -310,7 +311,6 @@ class CityMapSerializer(serializers.ModelSerializer):
except MultipleObjectsReturned as e: except MultipleObjectsReturned as e:
raise ValueError(f"Find multiple cities with id = {data['old_id']}: {e}") raise ValueError(f"Find multiple cities with id = {data['old_id']}: {e}")
data['city'] = city data['city'] = city
return data return data
@ -319,3 +319,47 @@ class CityMapSerializer(serializers.ModelSerializer):
if field not in data or data[field] is None: if field not in data or data[field] is None:
data[field] = "" data[field] = ""
return data return data
class CityGallerySerializer(serializers.ModelSerializer):
id = serializers.IntegerField()
city_id = serializers.IntegerField()
attachment_file_name = serializers.CharField()
class Meta:
model = CityGallery
fields = ("id", "city_id", "attachment_file_name")
def validate(self, data):
data = self.set_old_id(data)
data = self.set_gallery(data)
data = self.set_city(data)
return data
def create(self, validated_data):
return CityGallery.objects.create(**validated_data)
def set_old_id(self, data):
data['old_id'] = data.pop('id')
return data
def set_gallery(self, data):
link_prefix = "city_photos/00baf486523f62cdf131fa1b19c5df2bf21fc9f8/"
try:
data['image'] = Image.objects.create(
image=f"{link_prefix}{data['attachment_file_name']}"
)
except Exception as e:
raise ValueError(f"Cannot create image with {data}: {e}")
del(data['attachment_file_name'])
return data
def set_city(self, data):
try:
data['city'] = City.objects.get(old_id=data.pop('city_id'))
except City.DoesNotExist as e:
raise ValueError(f"Cannot get city with {data}: {e}")
except MultipleObjectsReturned as e:
raise ValueError(f"Multiple cities find with {data}: {e}")
return data

View File

@ -157,16 +157,16 @@ DATABASES = {
'HOST': os.environ.get('DB_HOSTNAME'), 'HOST': os.environ.get('DB_HOSTNAME'),
'PORT': os.environ.get('DB_PORT'), 'PORT': os.environ.get('DB_PORT'),
}, },
# 'legacy': { 'legacy': {
# 'ENGINE': 'django.db.backends.mysql', 'ENGINE': 'django.db.backends.mysql',
# # 'HOST': '172.17.0.1', 'HOST': '172.17.0.1',
# # 'HOST': '172.23.0.1', # 'HOST': '172.23.0.1',
# 'HOST': 'mysql_db', # 'HOST': 'mysql_db',
# 'PORT': 3306, 'PORT': 3306,
# 'NAME': 'dev', 'NAME': 'dev',
# 'USER': 'dev', 'USER': 'dev',
# 'PASSWORD': 'octosecret123' 'PASSWORD': 'octosecret123'
# } }
} }
@ -361,6 +361,13 @@ THUMBNAIL_ALIASES = {
'news_editor_web': {'size': (940, 430), }, # при загрузке через контент эдитор 'news_editor_web': {'size': (940, 430), }, # при загрузке через контент эдитор
'news_editor_mobile': {'size': (343, 260), }, # через контент эдитор в мобильном браузерe 'news_editor_mobile': {'size': (343, 260), }, # через контент эдитор в мобильном браузерe
'avatar_comments_web': {'size': (116, 116), }, 'avatar_comments_web': {'size': (116, 116), },
# location.city
'location_city_xsmall': {'size': (70, 70), },
'location_city_small': {'size': (140, 140), },
'location_city_medium': {'size': (280, 280), },
'location_city_large': {'size': (280, 280), },
'location_city_xlarge': {'size': (560, 560), },
'location_city_detail': {'size': (1120, 1120), },
} }
} }