Add transfer to city_photos
Add migrations
This commit is contained in:
parent
48d9ce37f7
commit
6d27ac533a
20
apps/gallery/migrations/0007_auto_20191110_1329.py
Normal file
20
apps/gallery/migrations/0007_auto_20191110_1329.py
Normal 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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -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'))
|
||||||
|
|
|
||||||
23
apps/location/migrations/0027_auto_20191110_1331.py
Normal file
23
apps/location/migrations/0027_auto_20191110_1331.py
Normal 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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
]
|
]
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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), },
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user