2024-10-02 10:13:05 +00:00
|
|
|
from django.db import models, connection
|
2024-07-18 15:21:22 +00:00
|
|
|
|
|
|
|
from utils.constants import STR_SM_SIZE, STR_SIZE, STR_EXTEND_SIZE, ALGOS
|
2024-07-26 15:59:34 +00:00
|
|
|
from evidence.models import Annotation, Evidence
|
2024-06-12 07:32:49 +00:00
|
|
|
from user.models import User
|
2024-07-19 15:40:01 +00:00
|
|
|
from lot.models import DeviceLot
|
2024-06-12 07:32:49 +00:00
|
|
|
|
|
|
|
|
2024-07-19 15:40:01 +00:00
|
|
|
class Device:
|
2024-07-05 13:32:07 +00:00
|
|
|
class Types(models.TextChoices):
|
|
|
|
DESKTOP = "Desktop"
|
|
|
|
LAPTOP = "Laptop"
|
|
|
|
SERVER = "Server"
|
|
|
|
GRAPHICCARD = "GraphicCard"
|
|
|
|
HARDDRIVE = "HardDrive"
|
|
|
|
SOLIDSTATEDRIVE = "SolidStateDrive"
|
|
|
|
MOTHERBOARD = "Motherboard"
|
|
|
|
NETWORKADAPTER = "NetworkAdapter"
|
|
|
|
PROCESSOR = "Processor"
|
|
|
|
RAMMODULE = "RamModule"
|
|
|
|
SOUNDCARD = "SoundCard"
|
|
|
|
DISPLAY = "Display"
|
|
|
|
BATTERY = "Battery"
|
|
|
|
CAMERA = "Camera"
|
|
|
|
|
2024-07-18 15:21:22 +00:00
|
|
|
def __init__(self, *args, **kwargs):
|
2024-07-19 15:40:01 +00:00
|
|
|
# the id is the chid of the device
|
|
|
|
self.id = kwargs["id"]
|
|
|
|
self.pk = self.id
|
2024-09-26 03:22:21 +00:00
|
|
|
self.shortid = self.pk[:6]
|
2024-07-19 15:40:01 +00:00
|
|
|
self.algorithm = None
|
|
|
|
self.owner = None
|
2024-07-18 15:21:22 +00:00
|
|
|
self.annotations = []
|
|
|
|
self.hids = []
|
|
|
|
self.uuids = []
|
2024-07-26 15:59:34 +00:00
|
|
|
self.evidences = []
|
2024-07-31 11:21:54 +00:00
|
|
|
self.lots = []
|
2024-07-26 15:59:34 +00:00
|
|
|
self.last_evidence = None
|
|
|
|
self.get_last_evidence()
|
2024-07-18 15:21:22 +00:00
|
|
|
|
|
|
|
def initial(self):
|
|
|
|
self.get_annotations()
|
|
|
|
self.get_uuids()
|
|
|
|
self.get_hids()
|
2024-07-26 15:59:34 +00:00
|
|
|
self.get_evidences()
|
2024-07-31 11:21:54 +00:00
|
|
|
self.get_lots()
|
2024-08-05 13:06:34 +00:00
|
|
|
|
2024-07-18 15:21:22 +00:00
|
|
|
def get_annotations(self):
|
2024-07-19 15:40:01 +00:00
|
|
|
if self.annotations:
|
|
|
|
return self.annotations
|
2024-08-05 13:06:34 +00:00
|
|
|
|
2024-07-18 15:21:22 +00:00
|
|
|
self.annotations = Annotation.objects.filter(
|
2024-07-19 15:40:01 +00:00
|
|
|
type=Annotation.Type.SYSTEM,
|
|
|
|
value=self.id
|
2024-07-18 15:21:22 +00:00
|
|
|
).order_by("-created")
|
2024-07-19 15:40:01 +00:00
|
|
|
|
|
|
|
if self.annotations.count():
|
|
|
|
self.algorithm = self.annotations[0].key
|
|
|
|
self.owner = self.annotations[0].owner
|
|
|
|
|
|
|
|
return self.annotations
|
2024-07-30 11:37:08 +00:00
|
|
|
|
|
|
|
def get_user_annotations(self):
|
|
|
|
if not self.uuids:
|
|
|
|
self.get_uuids()
|
|
|
|
|
|
|
|
annotations = Annotation.objects.filter(
|
|
|
|
uuid__in=self.uuids,
|
|
|
|
owner=self.owner,
|
|
|
|
type=Annotation.Type.USER
|
|
|
|
)
|
|
|
|
return annotations
|
2024-08-05 13:06:34 +00:00
|
|
|
|
2024-07-30 11:37:08 +00:00
|
|
|
def get_user_documents(self):
|
|
|
|
if not self.uuids:
|
|
|
|
self.get_uuids()
|
|
|
|
|
|
|
|
annotations = Annotation.objects.filter(
|
|
|
|
uuid__in=self.uuids,
|
|
|
|
owner=self.owner,
|
|
|
|
type=Annotation.Type.DOCUMENT
|
|
|
|
)
|
|
|
|
return annotations
|
2024-08-05 13:06:34 +00:00
|
|
|
|
2024-07-18 15:21:22 +00:00
|
|
|
def get_uuids(self):
|
2024-07-19 15:40:01 +00:00
|
|
|
for a in self.get_annotations():
|
2024-07-30 11:37:08 +00:00
|
|
|
if a.uuid not in self.uuids:
|
2024-07-18 15:21:22 +00:00
|
|
|
self.uuids.append(a.uuid)
|
|
|
|
|
|
|
|
def get_hids(self):
|
2024-07-19 15:40:01 +00:00
|
|
|
annotations = self.get_annotations()
|
2024-07-18 15:21:22 +00:00
|
|
|
|
2024-09-26 03:10:48 +00:00
|
|
|
self.hids = list(set(annotations.filter(
|
2024-07-18 15:21:22 +00:00
|
|
|
type=Annotation.Type.SYSTEM,
|
|
|
|
key__in=ALGOS.keys(),
|
2024-09-26 03:10:48 +00:00
|
|
|
).values_list("value", flat=True)))
|
2024-07-18 15:21:22 +00:00
|
|
|
|
2024-07-26 15:59:34 +00:00
|
|
|
def get_evidences(self):
|
2024-07-18 15:21:22 +00:00
|
|
|
if not self.uuids:
|
|
|
|
self.get_uuids()
|
|
|
|
|
2024-07-26 15:59:34 +00:00
|
|
|
self.evidences = [Evidence(u) for u in self.uuids]
|
2024-07-18 15:21:22 +00:00
|
|
|
|
2024-07-26 15:59:34 +00:00
|
|
|
def get_last_evidence(self):
|
2024-07-19 15:40:01 +00:00
|
|
|
annotations = self.get_annotations()
|
2024-09-25 17:04:29 +00:00
|
|
|
if not annotations.count():
|
|
|
|
return
|
|
|
|
annotation = annotations.first()
|
2024-07-26 15:59:34 +00:00
|
|
|
self.last_evidence = Evidence(annotation.uuid)
|
2024-07-18 15:21:22 +00:00
|
|
|
|
2024-07-19 15:40:01 +00:00
|
|
|
def last_uuid(self):
|
|
|
|
return self.uuids[0]
|
2024-07-18 15:21:22 +00:00
|
|
|
|
2024-07-31 11:21:54 +00:00
|
|
|
def get_lots(self):
|
|
|
|
self.lots = [x.lot for x in DeviceLot.objects.filter(device_id=self.id)]
|
|
|
|
|
2024-07-18 15:21:22 +00:00
|
|
|
@classmethod
|
2024-10-10 09:44:23 +00:00
|
|
|
def get_unassigned(cls, institution, offset=0, limit=None):
|
2024-10-02 10:13:05 +00:00
|
|
|
|
|
|
|
sql = """
|
|
|
|
SELECT DISTINCT t1.value from evidence_annotation as t1
|
|
|
|
left join lot_devicelot as t2 on t1.value = t2.device_id
|
2024-10-10 09:44:23 +00:00
|
|
|
where t2.device_id is null and owner_id=={institution} and type=={type}
|
2024-10-02 10:13:05 +00:00
|
|
|
""".format(
|
2024-10-10 09:44:23 +00:00
|
|
|
institution=institution.id,
|
2024-10-02 10:13:05 +00:00
|
|
|
type=Annotation.Type.SYSTEM,
|
|
|
|
)
|
|
|
|
if limit:
|
|
|
|
sql += " limit {} offset {}".format(int(limit), int(offset))
|
|
|
|
|
|
|
|
sql += ";"
|
|
|
|
|
|
|
|
annotations = []
|
|
|
|
with connection.cursor() as cursor:
|
|
|
|
cursor.execute(sql)
|
|
|
|
annotations = cursor.fetchall()
|
|
|
|
|
|
|
|
devices = [cls(id=x[0]) for x in annotations]
|
2024-10-10 09:44:23 +00:00
|
|
|
count = cls.get_unassigned_count(institution)
|
2024-10-02 10:13:05 +00:00
|
|
|
return devices, count
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
2024-10-10 09:44:23 +00:00
|
|
|
def get_unassigned_count(cls, institution):
|
2024-10-02 10:13:05 +00:00
|
|
|
|
|
|
|
sql = """
|
|
|
|
SELECT count(DISTINCT t1.value) from evidence_annotation as t1
|
|
|
|
left join lot_devicelot as t2 on t1.value = t2.device_id
|
2024-10-10 09:44:23 +00:00
|
|
|
where t2.device_id is null and owner_id=={institution} and type=={type};
|
2024-10-02 10:13:05 +00:00
|
|
|
""".format(
|
2024-10-10 09:44:23 +00:00
|
|
|
institution=institution.id,
|
2024-07-19 15:40:01 +00:00
|
|
|
type=Annotation.Type.SYSTEM,
|
2024-10-02 10:13:05 +00:00
|
|
|
)
|
2024-07-19 15:40:01 +00:00
|
|
|
|
2024-10-02 10:13:05 +00:00
|
|
|
with connection.cursor() as cursor:
|
|
|
|
cursor.execute(sql)
|
|
|
|
return cursor.fetchall()[0][0]
|
2024-07-19 15:40:01 +00:00
|
|
|
|
2024-08-05 13:06:34 +00:00
|
|
|
@property
|
|
|
|
def is_websnapshot(self):
|
|
|
|
if not self.last_evidence:
|
|
|
|
self.get_last_evidence()
|
2024-09-26 11:09:55 +00:00
|
|
|
return self.last_evidence.doc['type'] == "WebSnapshot"
|
|
|
|
|
2024-08-05 13:06:34 +00:00
|
|
|
@property
|
|
|
|
def last_user_evidence(self):
|
|
|
|
if not self.last_evidence:
|
|
|
|
self.get_last_evidence()
|
|
|
|
return self.last_evidence.doc['kv'].items()
|
2024-09-26 11:09:55 +00:00
|
|
|
|
2024-07-19 15:40:01 +00:00
|
|
|
@property
|
|
|
|
def manufacturer(self):
|
2024-07-26 15:59:34 +00:00
|
|
|
if not self.last_evidence:
|
|
|
|
self.get_last_evidence()
|
2024-09-18 16:01:46 +00:00
|
|
|
return self.last_evidence.get_manufacturer()
|
2024-07-19 15:40:01 +00:00
|
|
|
|
|
|
|
@property
|
|
|
|
def type(self):
|
2024-09-26 11:09:55 +00:00
|
|
|
if self.last_evidence.doc['type'] == "WebSnapshot":
|
|
|
|
return self.last_evidence.doc.get("device", {}).get("type", "")
|
|
|
|
|
2024-07-26 15:59:34 +00:00
|
|
|
if not self.last_evidence:
|
|
|
|
self.get_last_evidence()
|
2024-09-18 16:01:46 +00:00
|
|
|
return self.last_evidence.get_chassis()
|
2024-07-19 15:40:01 +00:00
|
|
|
|
|
|
|
@property
|
|
|
|
def model(self):
|
2024-07-26 15:59:34 +00:00
|
|
|
if not self.last_evidence:
|
|
|
|
self.get_last_evidence()
|
2024-09-18 16:01:46 +00:00
|
|
|
return self.last_evidence.get_model()
|
2024-07-19 15:40:01 +00:00
|
|
|
|
2024-09-25 10:51:08 +00:00
|
|
|
@property
|
|
|
|
def components(self):
|
|
|
|
if not self.last_evidence:
|
|
|
|
self.get_last_evidence()
|
|
|
|
return self.last_evidence.get_components()
|