Advertisement
Guest User

Untitled

a guest
Jun 16th, 2017
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.95 KB | None | 0 0
  1. ###### MODELS.PY ########################
  2. # Create your models here.
  3. class Store(models.Model):
  4.     """ unique store ids """
  5.     store = models.IntegerField(primary_key=True)
  6.     system_name = models.CharField(max_length=10)
  7.     city_signifier = models.CharField(max_length=60, blank=True, null=True)
  8.     three_letter_code = models.CharField(max_length=3, blank=True, null=True)
  9.     """ district / division / region"""
  10.     district = models.ForeignKey('District', related_name='district')
  11.     dma = models.PositiveIntegerField(blank=True, null=True)
  12.     """ supplying dcs """
  13.     primary_supplier = models.ForeignKey('Supplier', related_name='supplier')
  14.     bulk_supplier = models.PositiveIntegerField()
  15.     """ geolocation """
  16.     latitude = models.DecimalField(max_digits=13, decimal_places=9)
  17.     longitude = models.DecimalField(max_digits=13, decimal_places=9)
  18.     """ address """
  19.     address = models.CharField(max_length=200)
  20.     city = models.CharField(max_length=200)
  21.     state = USStateField()
  22.     zip_code = models.PositiveIntegerField()
  23.     """ sla """
  24.     is_hub = models.BooleanField(default=False)
  25.     previous_sales = models.PositiveIntegerField(default=0)
  26.     open_date = models.DateField(blank=True, null=True)
  27.     closed_date = models.DateField(null=True, blank=True)
  28.     """ store hours """
  29.     timezone = models.CharField(max_length=5, choices=get_timezones())
  30.     weekdays_open = models.TimeField(default='7:00')
  31.     weekdays_close = models.TimeField(default='21:00')
  32.     saturday_open = models.TimeField(default='7:00')
  33.     saturday_close = models.TimeField(default='21:00')
  34.     sunday_open = models.TimeField(default='7:00', blank=True, null=True)
  35.     sunday_close = models.TimeField(default='21:00', blank=True, null=True)
  36.  
  37.     def is_closed(self):
  38.         if self.closed_date is None or self.closed_date == '0001-01-01':
  39.             return False
  40.         else:
  41.             return True
  42.  
  43.     def is_open(self):
  44.         from datetime import datetime
  45.         if self.opened_date < datetime.now().date:
  46.             return True
  47.         else:
  48.             return False
  49.  
  50.     def is_dc(self):
  51.         if self.store < 100:
  52.             return True
  53.         else:
  54.             return False
  55.  
  56.     def get_absolute_url(self):
  57.         return reverse("store-detail", kwargs={'store': self.store})
  58.  
  59.     def get_district_url(self):
  60.         return reverse("district-detail", kwargs={'pk': self.district})
  61.  
  62.     def get_supplier_url(self):
  63.         return reverse("supplier-detail", kwargs={'pk': self.primary_supplier})
  64.  
  65.     def __str__(self):
  66.         return '{0}'.format(self.store)
  67.  
  68.  
  69. class District(models.Model):
  70.     district_number = models.PositiveIntegerField(primary_key=True)
  71.     region = models.ForeignKey('Region')
  72.     manager = models.CharField(max_length=50, blank=True, null=True)
  73.     manager_cell = PhoneNumberField(blank=True, null=True)
  74.     manager_office_phone = PhoneNumberField(blank=True, null=True)
  75.     office_at_store = models.ForeignKey(Store, blank=True, null=True, related_name="district_manager_office")
  76.  
  77.     def __str__(self):
  78.         return '{0}'.format(self.district_number)
  79.  
  80.     def get_absolute_url(self):
  81.         return reverse('district-detail', kwargs={'pk': self.district_number})
  82.  
  83.     def locations(self):
  84.         return Store.objects.filter(district=self.district_number)
  85.  
  86.     def district_installers(self):
  87.         return DistrictInstaller.objects.filter(from_district=self.district_number)
  88.  
  89.  
  90. ##### serializer.py #################
  91.  
  92. from rest_framework.serializers import ModelSerializer, CharField, SerializerMethodField, HyperlinkedIdentityField
  93. from locations.models import Store, District, DistrictInstaller, Region, Division, Supplier
  94.  
  95.  
  96. class StoreListSerializer(ModelSerializer):
  97.     url = HyperlinkedIdentityField(view_name='store-detail', lookup_field='store')
  98.  
  99.     class Meta:
  100.         model = Store
  101.         fields = ['store', 'url']
  102.  
  103.  
  104. class StoreDetailSerializer(ModelSerializer):
  105.     district_url = HyperlinkedIdentityField(view_name='district-detail', lookup_field='pk')
  106.     supplier_url = HyperlinkedIdentityField(view_name='supplier-detail', lookup_field='pk')
  107.  
  108.     class Meta:
  109.         model = Store
  110.         fields = '__all__'
  111.  
  112.  
  113. class DistrictListSerializer(ModelSerializer):
  114.     url = HyperlinkedIdentityField(view_name='district-detail', lookup_field='pk')
  115.  
  116.     class Meta:
  117.         model = District
  118.         fields = ['district_number', 'url']
  119.  
  120.  
  121. class DistrictDetailSerializer(ModelSerializer):
  122.     #office_at_store = StoreDetailSerializer(read_only=True, many=True)
  123.     stores = SerializerMethodField()
  124.     #district_installers = SerializerMethodField()
  125.  
  126.     class Meta:
  127.         model = District
  128.         fields = '__all__'
  129.  
  130.     def get_stores(self, obj):
  131.         return StoreListSerializer(obj.locations, many=True, read_only=True)
  132.  
  133.  
  134. ####### views.py #####################
  135. from rest_framework.generics import ListAPIView, UpdateAPIView, RetrieveAPIView
  136.  
  137. from locations.models import Store, District, DistrictInstaller, Region, Division, Supplier
  138.  
  139. from .serializers import (
  140.         StoreListSerializer,
  141.         StoreDetailSerializer,
  142.         DistrictListSerializer,
  143.         DistrictDetailSerializer,
  144.         DistrictInstallerListSerializer,
  145.         DistrictInstallerDetailSerializer,
  146.         RegionListSerializer,
  147.         RegionDetailSerializer,
  148.         DivisionListSerializer,
  149.         DivisionDetailSerializer,
  150.         SupplierListSerializer,
  151.  
  152. )
  153.  
  154.  
  155. class StoreDetailAPIView(RetrieveAPIView):
  156.     queryset = Store.objects.all()
  157.     serializer_class = StoreDetailSerializer
  158.     lookup_field = 'store'
  159.  
  160.  
  161. class StoreListAPIView(ListAPIView):
  162.     queryset = Store.objects.all()
  163.     serializer_class = StoreListSerializer
  164.  
  165.  
  166. class DistrictListAPIView(ListAPIView):
  167.     queryset = District.objects.all()
  168.     serializer_class = DistrictListSerializer
  169.     lookup_field = 'pk'
  170.  
  171.  
  172. class DistrictDetailsAPIView(RetrieveAPIView):
  173.     queryset = District.objects.all()
  174.     serializer_class = DistrictDetailSerializer
  175.     lookup_field = 'pk'
  176.  
  177.  
  178. class DistrictInstallerListAPIView(ListAPIView):
  179.     queryset = DistrictInstaller.objects.all()
  180.     serializer_class = DistrictInstallerListSerializer
  181.  
  182.  
  183. class DistrictInstallerDetailAPIView(RetrieveAPIView):
  184.     queryset = DistrictInstaller.objects.all()
  185.     serializer_class = DistrictInstallerDetailSerializer
  186.     lookup_field = 'pk'
  187.  
  188.  
  189.  
  190. ##### Expected output #########################
  191.  
  192. {
  193.   'district_number': 218,
  194.   'url': 'localhost/api/locations/district/218',
  195.   'stores': [
  196.         'store':2942, 'url': 'localhost/api/locations/stores/2942',
  197.         'store':2922, 'url': 'localhost/api/locations/stores/2922',
  198.     ]
  199. }
  200.  
  201.  
  202.  
  203. ###### Error message ######
  204. StoreListSerializer(<bound method District.locations of <District: 218>>, many=True, read_only=True):
  205.     store = IntegerField(validators=[<UniqueValidator(queryset=Store.objects.all())>])
  206.     url = HyperlinkedIdentityField(lookup_field='store', view_name='store-detail') is not JSON serializable
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement