123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- import os
- import yaml
- from django.conf import settings
- from django.core.management.base import BaseCommand, CommandError
- from suitablephones.models import Bluetooth, Camera, Device, Screen
- import subprocess
- import logging
- def update_repo():
- devicesdir = settings.LINEAGEWIKI
- pull_status = subprocess.run(["git", "pull"], cwd=devicesdir)
- if pull_status.returncode != 0:
- logging.error("Error pulling repo")
-
- def set_screens(args):
- #if type(args)
- screen = Screen.objects.filter(**args)
- if not screen.exists():
- screen = Screen()
- for subkey, subvalue in args.items():
- if subkey == 'size':
- size_mm = subvalue.split(' ')[0]
- setattr(screen, 'size_mm', size_mm)
- size_inch = subvalue.split(' ')[2].replace('(', '')
- setattr(screen, 'size_in', size_inch)
- setattr(screen, subkey, subvalue)
- #elif subkey == 'technology':
- # setattr(screen, 'type', subvalue)
- setattr(screen, subkey, subvalue)
- screen.save()
- else:
- screen = screen.get()
- return screen
- def set_camera(args):
- cam = Camera.objects.filter(**args)
- if not cam.exists():
- cam = Camera()
- for subkey, subvalue in args.items():
- if subkey == 'info':
- mp = subvalue.split(' ')[0]
- setattr(cam, 'megapixel', mp)
- info = ' '.join(map(str, subvalue.split(' ')[2:]))
- setattr(cam, subkey, info)
- setattr(cam, subkey, subvalue)
- cam.save()
- else:
- cam = cam.get()
- return cam
- class Command(BaseCommand):
- help = 'Aiuto'
- #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()
- update_repo()
- devicesdir = settings.LINEAGEWIKI + "/_data/devices/"
- # import pdb; pdb.set_trace()
- for filename in os.listdir(devicesdir):
- dev = Device()
- cameras = []
- bluetooth = {}
- screen = []
- peripherals = []
- with open(os.path.join(devicesdir, filename), "r") as stream:
- try:
- data = yaml.safe_load(stream)
- print(data['codename'])
- for key, value in data.items():
-
- # if key == "architecture":
- # if type(value) == dict():
- # setattr(dev, key, value)
- # else: #type(value) == str():
- # setattr(dev, key, dict({ 'cpu' : value }))
- #match caso:
- # case dict():
- # print('dict')
- if key == "bluetooth":
- if not 'profiles' in value.keys():
- value['profiles'] = None
- # get() returned more than one Bluetooth -- it returned 2!
- bt = Bluetooth.objects.filter(**value)
- # __exact? https://docs.djangoproject.com/en/4.1/ref/models/querysets/#exact
- if not bt.exists():
- bt = Bluetooth()
- for subkey, subvalue in value.items():
- if not hasattr(value, 'profiles'):
- setattr(bt, 'profiles', None)
- setattr(bt, subkey, subvalue)
- bt.save()
- else:
- bt = bt.get(spec=value['spec'], profiles=value['profiles'])
- bluetooth = bt
- elif key == "cameras":
- for c in value:
- cam = set_camera(c)
- cameras.append(cam)
- elif key == "peripherals":
- if str(value) == "None":
- value = None
- elif key == "storage":
- if str(value) == "None":
- value = None
- elif key == "screen":
- if type(value) is list:
- for s in value:
- for k,v in s.items():
- screen.append(set_screens(v))
- elif type(value) is dict:
- screen.append(set_screens(value))
- else:
- setattr(dev, key, value)
- except yaml.YAMLError as exc:
- print(exc)
- stream.close()
- dev.save()
- dev.bluetooth = bluetooth
- for cam in cameras:
- dev.cameras.add(cam)
- for scr in screen:
- dev.screen.add(scr)
- dev.save()
-
|