diff --git a/apps/location/migrations/0035_auto_20200115_1117.py b/apps/location/migrations/0035_auto_20200115_1117.py new file mode 100644 index 00000000..1f88538d --- /dev/null +++ b/apps/location/migrations/0035_auto_20200115_1117.py @@ -0,0 +1,20 @@ +# Generated by Django 2.2.7 on 2020-01-15 11:17 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('location', '0034_city_image'), + ] + + operations = [ + migrations.RemoveField( + model_name='city', + name='gallery', + ), + migrations.DeleteModel( + name='CityGallery', + ), + ] diff --git a/apps/location/models.py b/apps/location/models.py index 162e72d2..0fa3cdd1 100644 --- a/apps/location/models.py +++ b/apps/location/models.py @@ -143,7 +143,7 @@ class CityQuerySet(models.QuerySet): return self.filter(country__code=code) -class City(GalleryMixin, models.Model): +class City(models.Model): """Region model.""" name = models.CharField(_('name'), max_length=250) name_translated = TJSONField(blank=True, null=True, default=None, @@ -166,10 +166,6 @@ class City(GalleryMixin, models.Model): map2 = models.CharField(max_length=255, blank=True, null=True) map_ref = models.CharField(max_length=255, blank=True, null=True) situation = models.CharField(max_length=255, blank=True, null=True) - - # deprecated - # todo: remove gallery after move to image - gallery = models.ManyToManyField('gallery.Image', through='location.CityGallery', blank=True) image = models.ForeignKey('gallery.Image', on_delete=models.SET_NULL, blank=True, null=True, default=None, related_name='city_image', @@ -211,24 +207,6 @@ class City(GalleryMixin, models.Model): return image_property -class CityGallery(IntermediateGalleryModelMixin): - """Gallery for model City.""" - city = models.ForeignKey(City, null=True, - related_name='city_gallery', - on_delete=models.CASCADE, - verbose_name=_('city')) - image = models.ForeignKey('gallery.Image', null=True, - related_name='city_gallery', - on_delete=models.CASCADE, - verbose_name=_('image')) - - class Meta: - """CityGallery meta class.""" - verbose_name = _('city gallery') - verbose_name_plural = _('city galleries') - unique_together = (('city', 'is_main'), ('city', 'image')) - - class Address(models.Model): """Address model.""" city = models.ForeignKey(City, verbose_name=_('city'), on_delete=models.CASCADE) diff --git a/apps/location/serializers/back.py b/apps/location/serializers/back.py index 8f231d69..c178f7fd 100644 --- a/apps/location/serializers/back.py +++ b/apps/location/serializers/back.py @@ -1,8 +1,5 @@ from location import models from location.serializers import common -from rest_framework import serializers -from gallery.models import Image -from django.utils.translation import gettext_lazy as _ class AddressCreateSerializer(common.AddressDetailSerializer): @@ -21,46 +18,3 @@ class CountryBackSerializer(common.CountrySerializer): 'name', 'country_id' ] - - -class CityGallerySerializer(serializers.ModelSerializer): - """Serializer class for model CityGallery.""" - - class Meta: - """Meta class""" - - model = models.CityGallery - fields = [ - 'id', - 'is_main', - ] - - @property - def request_kwargs(self): - """Get url kwargs from request.""" - return self.context.get('request').parser_context.get('kwargs') - - def validate(self, attrs): - """Override validate method.""" - city_pk = self.request_kwargs.get('pk') - image_id = self.request_kwargs.get('image_id') - - city_qs = models.City.objects.filter(pk=city_pk) - image_qs = Image.objects.filter(id=image_id) - - if not city_qs.exists(): - raise serializers.ValidationError({'detail': _('City not found')}) - - if not image_qs.exists(): - raise serializers.ValidationError({'detail': _('Image not found')}) - - city = city_qs.first() - image = image_qs.first() - - if image in city.gallery.all(): - raise serializers.ValidationError({'detail': _('Image is already added.')}) - - attrs['city'] = city - attrs['image'] = image - - return attrs diff --git a/apps/location/serializers/common.py b/apps/location/serializers/common.py index 9f8613c4..e466e62f 100644 --- a/apps/location/serializers/common.py +++ b/apps/location/serializers/common.py @@ -96,7 +96,11 @@ class CityBaseSerializer(serializers.ModelSerializer): 'country', 'postal_code', 'is_island', + 'image', ] + extra_fields = { + 'image': {'write_only': True} + } class CityDetailSerializer(CityBaseSerializer): diff --git a/apps/location/urls/back.py b/apps/location/urls/back.py index 2434dd26..b1c0d5ca 100644 --- a/apps/location/urls/back.py +++ b/apps/location/urls/back.py @@ -12,11 +12,6 @@ urlpatterns = [ path('cities/', views.CityListCreateView.as_view(), name='city-list-create'), path('cities/all/', views.CityListSearchView.as_view(), name='city-list-create'), path('cities//', views.CityRUDView.as_view(), name='city-retrieve'), - path('cities//gallery/', views.CityGalleryListView.as_view(), - name='gallery-list'), - path('cities//gallery//', - views.CityGalleryCreateDestroyView.as_view(), - name='gallery-create-destroy'), path('countries/', views.CountryListCreateView.as_view(), name='country-list-create'), path('countries//', views.CountryRUDView.as_view(), name='country-retrieve'), diff --git a/apps/location/views/back.py b/apps/location/views/back.py index b02c79aa..a0d1bd36 100644 --- a/apps/location/views/back.py +++ b/apps/location/views/back.py @@ -67,57 +67,6 @@ class CityRUDView(common.CityViewMixin, generics.RetrieveUpdateDestroyAPIView): permission_classes = [IsAuthenticatedOrReadOnly | IsCountryAdmin] -class CityGalleryCreateDestroyView(common.CityViewMixin, - CreateDestroyGalleryViewMixin): - """Resource for a create gallery for product for back-office users.""" - serializer_class = serializers.CityGallerySerializer - permission_classes = [IsAuthenticatedOrReadOnly | IsCountryAdmin] - - def get_object(self): - """ - Returns the object the view is displaying. - """ - city_qs = self.filter_queryset(self.get_queryset()) - - city = get_object_or_404(city_qs, pk=self.kwargs.get('pk')) - gallery = get_object_or_404(city.city_gallery, image_id=self.kwargs.get('image_id')) - - # May raise a permission denied - self.check_object_permissions(self.request, gallery) - - return gallery - - def create(self, request, *args, **kwargs): - try: - return super(CityGalleryCreateDestroyView, self).create(request, *args, **kwargs) - except IntegrityError as e: - if not 'unique constraint' in e.args[0]: - raise e - models.CityGallery.objects.filter(city=kwargs['pk'], is_main=request.data['is_main']).delete() - return super(CityGalleryCreateDestroyView, self).create(request, *args, **kwargs) - - -class CityGalleryListView(common.CityViewMixin, - generics.ListAPIView): - """Resource for returning gallery for product for back-office users.""" - serializer_class = ImageBaseSerializer - permission_classes = [IsAuthenticatedOrReadOnly | IsCountryAdmin] - - def get_object(self): - """Override get_object method.""" - qs = super(CityGalleryListView, self).get_queryset() - city = get_object_or_404(qs, pk=self.kwargs['pk']) - - # May raise a permission denied - self.check_object_permissions(self.request, city) - - return city - - def get_queryset(self): - """Override get_queryset method.""" - return self.get_object().crop_gallery - - # Region class RegionListCreateView(common.RegionViewMixin, generics.ListCreateAPIView): """Create view for model Region"""