From 70ded1085220c24818f35b785363e5385ef4eb95 Mon Sep 17 00:00:00 2001 From: Cayo Puigdefabregas Date: Tue, 23 Jul 2024 15:37:40 +0200 Subject: [PATCH] save the device from web to index --- device/forms.py | 97 +++++++++++++++++++++++++++++--- device/templates/new_device.html | 24 +++++++- device/views.py | 5 +- snapshot/parse.py | 5 +- 4 files changed, 116 insertions(+), 15 deletions(-) diff --git a/device/forms.py b/device/forms.py index b74d29b..cf42dbc 100644 --- a/device/forms.py +++ b/device/forms.py @@ -1,17 +1,98 @@ +import json +import uuid +import hashlib +import datetime + from django import forms from snapshot.models import Annotation +from snapshot.xapian import search, index - -class DeviceForm2(forms.ModelForm): - class Meta: - model = Annotation - fields = ['key', 'value'] +DEVICE_TYPES = [ + ("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"), +] class DeviceForm(forms.Form): - name = forms.CharField() - value = forms.CharField() + type = forms.ChoiceField(choices = DEVICE_TYPES, required=False) + amount = forms.IntegerField(required=True, initial=1) + tag = forms.CharField(required=False) + name = forms.CharField(required=False) + value = forms.CharField(required=False) -DeviceFormSet = forms.formset_factory(form=DeviceForm, extra=1) +class BaseDeviceFormSet(forms.BaseFormSet): + def save(self, user, commit=True): + self.user = user + doc = {} + device = {} + kv = {} + self.uuid = str(uuid.uuid4()) + tag = hashlib.sha3_256(self.uuid.encode()).hexdigest() + for f in self.forms: + d = f.cleaned_data + if not d: + continue + if d.get("type"): + device["type"] = d["type"] + if d.get("amount"): + device["amount"] = d["amount"] + if d.get("name"): + kv[d["name"]] = d.get("value", '') + if d.get("tag"): + tag = d["tag"] + + if not device: + return + device["manufacturer"] = "" + device["model"] = tag + + doc["device"] = device + + if kv: + doc["kv"] = kv + + date = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S") + if doc: + doc["uuid"] = self.uuid + doc["endTime"] = date + doc["software"] = "DeviceHub" + doc["type"] = "WebSnapshot" + + + if not commit: + return doc + + self.index(doc) + self.create_annotations(tag) + return doc + + def index(self, doc): + snap = json.dumps(doc) + index(self.uuid, snap) + + def create_annotations(self, tag): + Annotation.objects.create( + uuid=self.uuid, + owner=self.user, + type=Annotation.Type.SYSTEM, + key='Web', + value=tag + ) + + + +DeviceFormSet = forms.formset_factory(form=DeviceForm, formset=BaseDeviceFormSet, extra=1) diff --git a/device/templates/new_device.html b/device/templates/new_device.html index 870bf79..0d6cf7c 100644 --- a/device/templates/new_device.html +++ b/device/templates/new_device.html @@ -12,8 +12,13 @@ function addForm(button) { var formCount = parseInt(document.getElementById('id_form-TOTAL_FORMS').value); var formCopy = $(document.querySelector('#id_form-0-name')).parent().parent().parent()[0].cloneNode(true); - // formCopy.style.display = 'block'; - formCopy.innerHTML = formCopy.innerHTML.replace(/__prefix__/g, formCount); + formCopy.querySelectorAll('input').forEach(function(input) { + var name = input.name.replace(/form-\d+/g, 'form-' + formCount); + var id = 'id_' + name; + input.name = name; + input.id = id; + input.value = ''; + }); document.getElementById('formset-container').appendChild(formCopy); document.getElementById('id_form-TOTAL_FORMS').value = formCount + 1; } @@ -44,6 +49,21 @@ +
+
+ {% bootstrap_field form.0.type %} +
+
+
+
+ {% bootstrap_field form.0.amount %} +
+
+
+
+ {% bootstrap_field form.0.tag %} +
+
{% for f in form %}
diff --git a/device/views.py b/device/views.py index 1a1f4a8..68344b0 100644 --- a/device/views.py +++ b/device/views.py @@ -22,17 +22,14 @@ class NewDeviceView(DashboardView, FormView): title = _("New Device") breadcrumb = "Device / New Device" success_url = reverse_lazy('device:add') - # success_url = reverse_lazy('dashboard:unassigned_devices') form_class = DeviceFormSet def form_valid(self, form): - # import pdb; pdb.set_trace() - # form.instance.owner = self.request.user + form.save(self.request.user) response = super().form_valid(form) return response def form_invalid(self, form): - import pdb; pdb.set_trace() response = super().form_invalid(form) return response diff --git a/snapshot/parse.py b/snapshot/parse.py index 8137a86..ee0e8cc 100644 --- a/snapshot/parse.py +++ b/snapshot/parse.py @@ -1,7 +1,6 @@ import os import json import shutil -import xapian import hashlib from datetime import datetime @@ -39,6 +38,7 @@ class Build: 'hidalgo1': self.get_hid_14(), } + # TODO is neccesary? annotation = Annotation.objects.filter( owner=self.user, type=Annotation.Type.SYSTEM, @@ -47,6 +47,9 @@ class Build: ).first() for k, v in algorithms.items(): + if annotation and k == annotation.key: + continue + Annotation.objects.create( uuid=self.uuid, owner=self.user,