109 lines
2.5 KiB
Python
109 lines
2.5 KiB
Python
import json
|
|
import uuid
|
|
import hashlib
|
|
import datetime
|
|
import logging
|
|
|
|
from django.core.exceptions import ValidationError
|
|
from evidence.xapian import index
|
|
from evidence.models import Annotation
|
|
from device.models import Device
|
|
|
|
|
|
logger = logging.getLogger('django')
|
|
|
|
|
|
def create_doc(data):
|
|
if not data:
|
|
return
|
|
|
|
doc = {}
|
|
device = {"manufacturer": "", "model": "", "amount": 1}
|
|
kv = {}
|
|
_uuid = str(uuid.uuid4())
|
|
customer_id = hashlib.sha3_256(_uuid.encode()).hexdigest()
|
|
|
|
|
|
for k, v in data.items():
|
|
if not v:
|
|
continue
|
|
|
|
if k.upper() == "CUSTOMER_ID":
|
|
customer_id = v
|
|
continue
|
|
|
|
if k.lower() == "type":
|
|
if v not in Device.Types.values:
|
|
raise ValidationError("{} is not a valid device".format(v))
|
|
|
|
device["type"] = v
|
|
|
|
elif k.lower() == "amount":
|
|
try:
|
|
amount = int(v)
|
|
device["amount"] = amount
|
|
except Exception:
|
|
pass
|
|
|
|
else:
|
|
kv[k] = v
|
|
|
|
if not device:
|
|
return
|
|
|
|
doc["device"] = device
|
|
|
|
if kv:
|
|
doc["kv"] = kv
|
|
|
|
date = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S")
|
|
|
|
if doc:
|
|
doc["uuid"] = _uuid
|
|
doc["endTime"] = date
|
|
doc["software"] = "DeviceHub"
|
|
doc["CUSTOMER_ID"] = customer_id
|
|
doc["type"] = "WebSnapshot"
|
|
|
|
return doc
|
|
|
|
|
|
def create_annotation(doc, user, commit=False):
|
|
if not doc or not doc.get('uuid') or not doc.get("CUSTOMER_ID"):
|
|
return []
|
|
|
|
data = {
|
|
'uuid': doc['uuid'],
|
|
'owner': user.institution,
|
|
'user': user,
|
|
'type': Annotation.Type.SYSTEM,
|
|
'key': 'CUSTOMER_ID',
|
|
'value': doc['CUSTOMER_ID'],
|
|
}
|
|
if commit:
|
|
annotation = Annotation.objects.filter(
|
|
uuid=doc["uuid"],
|
|
owner=user.institution,
|
|
type=Annotation.Type.SYSTEM,
|
|
)
|
|
|
|
if annotation:
|
|
txt = "Warning: Snapshot %s already registered (annotation exists)"
|
|
logger.warning(txt, doc["uuid"])
|
|
return annotation
|
|
|
|
return Annotation.objects.create(**data)
|
|
|
|
return Annotation(**data)
|
|
|
|
|
|
def create_index(doc, user):
|
|
if not doc or not doc.get('uuid'):
|
|
return []
|
|
|
|
_timestamp = doc['endTime']
|
|
_uuid = doc['uuid']
|
|
_device_id = doc['CUSTOMER_ID']
|
|
ev = json.dumps(doc)
|
|
index(user.institution, _device_id, _uuid, _timestamp, ev)
|