Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ###### MODELS.PY ########################
- # Create your models here.
- class Store(models.Model):
- """ unique store ids """
- store = models.IntegerField(primary_key=True)
- system_name = models.CharField(max_length=10)
- city_signifier = models.CharField(max_length=60, blank=True, null=True)
- three_letter_code = models.CharField(max_length=3, blank=True, null=True)
- """ district / division / region"""
- district = models.ForeignKey('District', related_name='district')
- dma = models.PositiveIntegerField(blank=True, null=True)
- """ supplying dcs """
- primary_supplier = models.ForeignKey('Supplier', related_name='supplier')
- bulk_supplier = models.PositiveIntegerField()
- """ geolocation """
- latitude = models.DecimalField(max_digits=13, decimal_places=9)
- longitude = models.DecimalField(max_digits=13, decimal_places=9)
- """ address """
- address = models.CharField(max_length=200)
- city = models.CharField(max_length=200)
- state = USStateField()
- zip_code = models.PositiveIntegerField()
- """ sla """
- is_hub = models.BooleanField(default=False)
- previous_sales = models.PositiveIntegerField(default=0)
- open_date = models.DateField(blank=True, null=True)
- closed_date = models.DateField(null=True, blank=True)
- """ store hours """
- timezone = models.CharField(max_length=5, choices=get_timezones())
- weekdays_open = models.TimeField(default='7:00')
- weekdays_close = models.TimeField(default='21:00')
- saturday_open = models.TimeField(default='7:00')
- saturday_close = models.TimeField(default='21:00')
- sunday_open = models.TimeField(default='7:00', blank=True, null=True)
- sunday_close = models.TimeField(default='21:00', blank=True, null=True)
- def is_closed(self):
- if self.closed_date is None or self.closed_date == '0001-01-01':
- return False
- else:
- return True
- def is_open(self):
- from datetime import datetime
- if self.opened_date < datetime.now().date:
- return True
- else:
- return False
- def is_dc(self):
- if self.store < 100:
- return True
- else:
- return False
- def get_absolute_url(self):
- return reverse("store-detail", kwargs={'store': self.store})
- def get_district_url(self):
- return reverse("district-detail", kwargs={'pk': self.district})
- def get_supplier_url(self):
- return reverse("supplier-detail", kwargs={'pk': self.primary_supplier})
- def __str__(self):
- return '{0}'.format(self.store)
- class District(models.Model):
- district_number = models.PositiveIntegerField(primary_key=True)
- region = models.ForeignKey('Region')
- manager = models.CharField(max_length=50, blank=True, null=True)
- manager_cell = PhoneNumberField(blank=True, null=True)
- manager_office_phone = PhoneNumberField(blank=True, null=True)
- office_at_store = models.ForeignKey(Store, blank=True, null=True, related_name="district_manager_office")
- def __str__(self):
- return '{0}'.format(self.district_number)
- def get_absolute_url(self):
- return reverse('district-detail', kwargs={'pk': self.district_number})
- def locations(self):
- return Store.objects.filter(district=self.district_number)
- def district_installers(self):
- return DistrictInstaller.objects.filter(from_district=self.district_number)
- ##### serializer.py #################
- from rest_framework.serializers import ModelSerializer, CharField, SerializerMethodField, HyperlinkedIdentityField
- from locations.models import Store, District, DistrictInstaller, Region, Division, Supplier
- class StoreListSerializer(ModelSerializer):
- url = HyperlinkedIdentityField(view_name='store-detail', lookup_field='store')
- class Meta:
- model = Store
- fields = ['store', 'url']
- class StoreDetailSerializer(ModelSerializer):
- district_url = HyperlinkedIdentityField(view_name='district-detail', lookup_field='pk')
- supplier_url = HyperlinkedIdentityField(view_name='supplier-detail', lookup_field='pk')
- class Meta:
- model = Store
- fields = '__all__'
- class DistrictListSerializer(ModelSerializer):
- url = HyperlinkedIdentityField(view_name='district-detail', lookup_field='pk')
- class Meta:
- model = District
- fields = ['district_number', 'url']
- class DistrictDetailSerializer(ModelSerializer):
- #office_at_store = StoreDetailSerializer(read_only=True, many=True)
- stores = SerializerMethodField()
- #district_installers = SerializerMethodField()
- class Meta:
- model = District
- fields = '__all__'
- def get_stores(self, obj):
- return StoreListSerializer(obj.locations, many=True, read_only=True)
- ####### views.py #####################
- from rest_framework.generics import ListAPIView, UpdateAPIView, RetrieveAPIView
- from locations.models import Store, District, DistrictInstaller, Region, Division, Supplier
- from .serializers import (
- StoreListSerializer,
- StoreDetailSerializer,
- DistrictListSerializer,
- DistrictDetailSerializer,
- DistrictInstallerListSerializer,
- DistrictInstallerDetailSerializer,
- RegionListSerializer,
- RegionDetailSerializer,
- DivisionListSerializer,
- DivisionDetailSerializer,
- SupplierListSerializer,
- )
- class StoreDetailAPIView(RetrieveAPIView):
- queryset = Store.objects.all()
- serializer_class = StoreDetailSerializer
- lookup_field = 'store'
- class StoreListAPIView(ListAPIView):
- queryset = Store.objects.all()
- serializer_class = StoreListSerializer
- class DistrictListAPIView(ListAPIView):
- queryset = District.objects.all()
- serializer_class = DistrictListSerializer
- lookup_field = 'pk'
- class DistrictDetailsAPIView(RetrieveAPIView):
- queryset = District.objects.all()
- serializer_class = DistrictDetailSerializer
- lookup_field = 'pk'
- class DistrictInstallerListAPIView(ListAPIView):
- queryset = DistrictInstaller.objects.all()
- serializer_class = DistrictInstallerListSerializer
- class DistrictInstallerDetailAPIView(RetrieveAPIView):
- queryset = DistrictInstaller.objects.all()
- serializer_class = DistrictInstallerDetailSerializer
- lookup_field = 'pk'
- ##### Expected output #########################
- {
- 'district_number': 218,
- 'url': 'localhost/api/locations/district/218',
- 'stores': [
- 'store':2942, 'url': 'localhost/api/locations/stores/2942',
- 'store':2922, 'url': 'localhost/api/locations/stores/2922',
- ]
- }
- ###### Error message ######
- StoreListSerializer(<bound method District.locations of <District: 218>>, many=True, read_only=True):
- store = IntegerField(validators=[<UniqueValidator(queryset=Store.objects.all())>])
- url = HyperlinkedIdentityField(lookup_field='store', view_name='store-detail') is not JSON serializable
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement