Browse Source

first working filter

Matteo Parrucci 1 year ago
parent
commit
938734f34f

+ 7 - 0
mysuitablephone/settings.py

@@ -37,6 +37,7 @@ INSTALLED_APPS = [
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
+    'django_filters',
     'rest_framework',
     'suitablephones',
 ]
@@ -123,3 +124,9 @@ STATIC_URL = 'static/'
 # https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field
 
 DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
+
+REST_FRAMEWORK = {
+    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
+}
+
+LINEAGEWIKI = '/home/d0c/Code/lineage_wiki'

+ 0 - 23
suitablephones/fetchphones.py

@@ -1,23 +0,0 @@
-import yaml
-import json
-
-LINEAGEWIKI = '/home/d0c/Code/lineage_wiki'
-
-with open(LINEAGEWIKI+"/_data/devices/surnia.yml", "r") as stream:
-    try:
-        data=yaml.safe_load(stream)
-        #print(type(data))
-        for i in data.keys():
-            value=data[i]
-            print(i, " = ", type(value))
-           # if isinstance(value, (list, dict)):
-           #     print(value)
-        ##print(json.dumps(data, sort_keys=True, indent=4))
-    except yaml.YAMLError as exc:
-        print(exc)
-
-## create instance of model
-# m = MyModel(**data_dict)
-# don't forget to save to database!
-# m.save()
-#

+ 38 - 0
suitablephones/management/commands/fetchphones.py

@@ -0,0 +1,38 @@
+import os
+
+import yaml
+from django.conf import settings
+from django.core.management.base import BaseCommand, CommandError
+
+from suitablephones.models import Bluetooth, Camera, Device
+
+
+class Command(BaseCommand):
+    help = 'Closes the specified poll for voting'
+
+    def add_arguments(self, parser):
+        parser.add_argument('poll_ids', nargs='+', type=int)
+
+    def handle(self, *args, **options):
+        Device.objects.all().delete()
+        Bluetooth.objects.all().delete()
+        Camera.objects.all().delete()
+        for filename in os.listdir(settings.LINEAGEWIKI + "/_data/devices/"):
+            with open(filename, "r") as stream:
+                try:
+                    data = yaml.safe_load(stream)
+                    dev = Device()
+                    for key, value in data.items():
+                        if key == "cameras":
+                            cam = Camera.objects.filter(*value.items())
+                            if not cam.exists():
+                                cam = Camera()
+                                for subkey, subvalue in value.items():
+                                    cam
+                            for subkey in value.items():
+                                setattr(cam, subkey, subvalue)
+                        else:
+                            setattr(dev, key, value)
+                    dev.save()
+                except yaml.YAMLError as exc:
+                    print(exc)

+ 11 - 8
suitablephones/serializers.py

@@ -3,19 +3,22 @@ from rest_framework import serializers
 from suitablephones.models import Bluetooth, Camera, Device
 
 
-class DeviceSerializer(serializers.HyperlinkedModelSerializer):
+class CameraSerializer(serializers.ModelSerializer):
     class Meta:
-        model = Device
-        exclude = []
+        model = Camera
+        exclude = ["id"]
 
 
-class CameraSerializer(serializers.HyperlinkedModelSerializer):
+class BluetoothSerializer(serializers.ModelSerializer):
     class Meta:
-        model = Camera
+        model = Bluetooth
         exclude = []
 
 
-class BluetoothSerializer(serializers.HyperlinkedModelSerializer):
+class DeviceSerializer(serializers.ModelSerializer):
+    bluetooth = BluetoothSerializer(many=False, read_only=True)
+    cameras = CameraSerializer(many=True, read_only=True)
+
     class Meta:
-        model = Bluetooth
-        exclude = []
+        model = Device
+        exclude = ["id"]

+ 11 - 0
suitablephones/templates/suitablephones/device_list.html

@@ -0,0 +1,11 @@
+<html>
+<body>
+{% for device in device_list %}
+  <h1>{{ device.name }}</h1>
+  <h2>Cameras</h2>
+  {% for camera in device.cameras.all %}
+    <div>Camera with {{ camera.megapixel }} MP</div>
+  {% endfor %}
+{% endfor %}
+</body>
+</html>

+ 1 - 3
suitablephones/urls.py

@@ -1,8 +1,7 @@
 from django.urls import include, path
 from rest_framework import routers
 
-from suitablephones.views import (BluetoothViewSet, CameraViewSet,
-                                  DeviceViewSet, SuitablePhones)
+from suitablephones.views import BluetoothViewSet, CameraViewSet, DeviceViewSet
 
 router = routers.DefaultRouter()
 router.register(r'devices', DeviceViewSet)
@@ -12,6 +11,5 @@ router.register(r'camera', CameraViewSet)
 urlpatterns = [
     path('api/', include(router.urls)),
     path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
-    path('suitablephones/', SuitablePhones.as_view(), name='suitablephones'),
 ]
 

+ 13 - 13
suitablephones/views.py

@@ -1,4 +1,6 @@
-from django.views.generic.list import ListView
+import logging
+from decimal import Decimal
+
 from rest_framework import viewsets
 
 from suitablephones.models import Bluetooth, Camera, Device
@@ -6,23 +8,21 @@ from suitablephones.serializers import (BluetoothSerializer, CameraSerializer,
                                         DeviceSerializer)
 
 
-class SuitablePhones(ListView):
-    model = Device
-   
-    def get_request_camera(self):
-        return self.request.GET.get("camera")
-
-    
-    def get_queryset(self):
-        camera = self.get_request_camera()
-        return self.model.objects.filter(camera=camera)
-
-
 # ViewSets define the view behavior.
 class DeviceViewSet(viewsets.ModelViewSet):
     queryset = Device.objects.all()
     serializer_class = DeviceSerializer
 
+    def get_queryset(self):
+        megapixel = self.request.query_params.get('megapixel')
+        if megapixel:
+            self.queryset = self.queryset.filter(cameras__megapixel__lt=Decimal(megapixel))
+        return self.queryset
+
+
+    def get_cameras(self):
+        return self.request.GET.getlist("cameras")
+
 
 class BluetoothViewSet(viewsets.ModelViewSet):
     queryset = Bluetooth.objects.all()