Skip to content

Commit

Permalink
Changed endpoint and (pre-)flatten/massage data to be more inline wit…
Browse files Browse the repository at this point in the history
…h db.

Move calculations out of server, into Cura.

CURA-12262
  • Loading branch information
rburema committed Nov 6, 2024
1 parent dcbd40c commit 48bfed0
Showing 1 changed file with 42 additions and 3 deletions.
45 changes: 42 additions & 3 deletions plugins/SliceInfoPlugin/SliceInfo.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
# Copyright (c) 2023 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
import datetime

import json
import os
import platform
import time
from typing import Optional, Set, TYPE_CHECKING
from typing import Any, Optional, Set, TYPE_CHECKING

from PyQt6.QtCore import pyqtSlot, QObject
from PyQt6.QtNetwork import QNetworkRequest
Expand Down Expand Up @@ -33,7 +34,18 @@ class SliceInfo(QObject, Extension):
no model files are being sent (Just a SHA256 hash of the model).
"""

info_url = "https://stats.ultimaker.com/api/cura"
info_url = "https://statistics.ultimaker.com/api/v2/cura/slice"

_adjust_flattened_names = {
"extruders_extruder": "extruders",
"extruders_settings": "extruders",
"models_model": "models",
"models_transformation_data": "models_transformation",
"print_settings_": "",
"print_times": "print_time",
"active_machine_": "",
"slice_uuid": "slice_id",
}

def __init__(self, parent = None):
QObject.__init__(self, parent)
Expand Down Expand Up @@ -112,6 +124,26 @@ def _getUserModifiedSettingKeys(self) -> list:

return list(sorted(user_modified_setting_keys))

def _flattenData(self, data: Any, result: dict, current_flat_key: Optional[str] = None, lift_list: bool = False) -> None:
if isinstance(data, dict):
for key, value in data.items():
total_flat_key = key if current_flat_key is None else f"{current_flat_key}_{key}"
self._flattenData(value, result, total_flat_key, lift_list)
elif isinstance(data, list):
for item in data:
self._flattenData(item, result, current_flat_key, True)
else:
actual_flat_key = current_flat_key.lower()
for key, value in self._adjust_flattened_names.items():
if actual_flat_key.startswith(key):
actual_flat_key = actual_flat_key.replace(key, value)
if lift_list:
if actual_flat_key not in result:
result[actual_flat_key] = []
result[actual_flat_key].append(data)
else:
result[actual_flat_key] = data

def _onWriteStarted(self, output_device):
try:
if not self._application.getPreferences().getValue("info/send_slice_info"):
Expand All @@ -126,7 +158,7 @@ def _onWriteStarted(self, output_device):

data = dict() # The data that we're going to submit.
data["time_stamp"] = time.time()
data["schema_version"] = 0
data["schema_version"] = 1000
data["cura_version"] = self._application.getVersion()
data["cura_build_type"] = ApplicationMetadata.CuraBuildType
org_id = user_profile.get("organization_id", None) if user_profile else None
Expand Down Expand Up @@ -298,6 +330,13 @@ def _onWriteStarted(self, output_device):
"time_backend": int(round(time_backend)),
}

# Massage data into format used in the DB:
flat_data = dict()
self._flattenData(data, flat_data)
data = flat_data
timestamp = datetime.datetime.utcfromtimestamp(float(data["time_stamp"]))
data["timestamp"] = f"{str(timestamp)} UTC"

# Convert data to bytes
binary_data = json.dumps(data).encode("utf-8")

Expand Down

0 comments on commit 48bfed0

Please sign in to comment.