fetchphones.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import os
  2. import yaml
  3. from django.conf import settings
  4. from django.core.management.base import BaseCommand, CommandError
  5. from suitablephones.models import Bluetooth, Camera, Device, Screen
  6. import subprocess
  7. import logging
  8. def update_repo():
  9. devicesdir = settings.LINEAGEWIKI
  10. pull_status = subprocess.run(["git", "pull"], cwd=devicesdir)
  11. if pull_status.returncode != 0:
  12. logging.error("Error pulling repo")
  13. def set_screens(args):
  14. #if type(args)
  15. screen = Screen.objects.filter(**args)
  16. if not screen.exists():
  17. screen = Screen()
  18. for subkey, subvalue in args.items():
  19. if subkey == 'size':
  20. size_mm = subvalue.split(' ')[0]
  21. setattr(screen, 'size_mm', size_mm)
  22. size_inch = subvalue.split(' ')[2].replace('(', '')
  23. setattr(screen, 'size_in', size_inch)
  24. setattr(screen, subkey, subvalue)
  25. #elif subkey == 'technology':
  26. # setattr(screen, 'type', subvalue)
  27. setattr(screen, subkey, subvalue)
  28. screen.save()
  29. else:
  30. screen = screen.get()
  31. return screen
  32. def set_camera(args):
  33. cam = Camera.objects.filter(**args)
  34. if not cam.exists():
  35. cam = Camera()
  36. for subkey, subvalue in args.items():
  37. if subkey == 'info':
  38. mp = subvalue.split(' ')[0]
  39. setattr(cam, 'megapixel', mp)
  40. info = ' '.join(map(str, subvalue.split(' ')[2:]))
  41. setattr(cam, subkey, info)
  42. setattr(cam, subkey, subvalue)
  43. cam.save()
  44. else:
  45. cam = cam.get()
  46. return cam
  47. class Command(BaseCommand):
  48. help = 'Aiuto'
  49. #def add_arguments(self, parser):
  50. # parser.add_argument('poll_ids', nargs='+', type=int
  51. def handle(self, *args, **options):
  52. Device.objects.all().delete()
  53. Bluetooth.objects.all().delete()
  54. Camera.objects.all().delete()
  55. update_repo()
  56. devicesdir = settings.LINEAGEWIKI + "/_data/devices/"
  57. # import pdb; pdb.set_trace()
  58. for filename in os.listdir(devicesdir):
  59. dev = Device()
  60. cameras = []
  61. bluetooth = {}
  62. screen = []
  63. peripherals = []
  64. with open(os.path.join(devicesdir, filename), "r") as stream:
  65. try:
  66. data = yaml.safe_load(stream)
  67. print(data['codename'])
  68. for key, value in data.items():
  69. # if key == "architecture":
  70. # if type(value) == dict():
  71. # setattr(dev, key, value)
  72. # else: #type(value) == str():
  73. # setattr(dev, key, dict({ 'cpu' : value }))
  74. #match caso:
  75. # case dict():
  76. # print('dict')
  77. if key == "bluetooth":
  78. if not 'profiles' in value.keys():
  79. value['profiles'] = None
  80. # get() returned more than one Bluetooth -- it returned 2!
  81. bt = Bluetooth.objects.filter(**value)
  82. # __exact? https://docs.djangoproject.com/en/4.1/ref/models/querysets/#exact
  83. if not bt.exists():
  84. bt = Bluetooth()
  85. for subkey, subvalue in value.items():
  86. if not hasattr(value, 'profiles'):
  87. setattr(bt, 'profiles', None)
  88. setattr(bt, subkey, subvalue)
  89. bt.save()
  90. else:
  91. bt = bt.get(spec=value['spec'], profiles=value['profiles'])
  92. bluetooth = bt
  93. elif key == "cameras":
  94. for c in value:
  95. cam = set_camera(c)
  96. cameras.append(cam)
  97. elif key == "peripherals":
  98. if str(value) == "None":
  99. value = None
  100. elif key == "storage":
  101. if str(value) == "None":
  102. value = None
  103. elif key == "screen":
  104. if type(value) is list:
  105. for s in value:
  106. for k,v in s.items():
  107. screen.append(set_screens(v))
  108. elif type(value) is dict:
  109. screen.append(set_screens(value))
  110. else:
  111. setattr(dev, key, value)
  112. except yaml.YAMLError as exc:
  113. print(exc)
  114. stream.close()
  115. dev.save()
  116. dev.bluetooth = bluetooth
  117. for cam in cameras:
  118. dev.cameras.add(cam)
  119. for scr in screen:
  120. dev.screen.add(scr)
  121. dev.save()