From f57c0aa65a9dc5a011643af2cfaee07d51f31846 Mon Sep 17 00:00:00 2001 From: Dmitry Volodin Date: Wed, 2 Dec 2020 19:45:05 +0300 Subject: [PATCH 1/3] Measurement Units --- collections/pm.measurementunits/Ampere.json | 9 + collections/pm.measurementunits/Celsius.json | 27 +++ collections/pm.measurementunits/Hertz.json | 9 + collections/pm.measurementunits/Meter.json | 9 + collections/pm.measurementunits/RPM.json | 9 + collections/pm.measurementunits/Second.json | 9 + collections/pm.measurementunits/Volt_AC.json | 9 + collections/pm.measurementunits/Volt_DC.json | 9 + collections/pm.measurementunits/Watt.json | 9 + .../docs/reference/measurementunits/ampere.md | 15 ++ .../reference/measurementunits/celsius.md | 22 +++ .../docs/reference/measurementunits/hertz.md | 15 ++ .../docs/reference/measurementunits/index.md | 1 + .../docs/reference/measurementunits/meter.md | 15 ++ .../en/docs/reference/measurementunits/rpm.md | 15 ++ .../docs/reference/measurementunits/second.md | 15 ++ .../reference/measurementunits/volt-ac.md | 15 ++ .../reference/measurementunits/volt-dc.md | 15 ++ .../docs/reference/measurementunits/watt.md | 15 ++ docs/en/mkdocs.yml | 11 ++ docs/tools/collection-to-md.py | 118 +++++++++++++ models.py | 2 + pm/models/measurementunits.py | 142 +++++++++++++++ .../web/apps/pm/measurementunits/__init__.py | 0 .../web/apps/pm/measurementunits/views.py | 21 +++ ui/web/pm/measurementunits/Application.js | 161 ++++++++++++++++++ ui/web/pm/measurementunits/LookupField.js | 12 ++ ui/web/pm/measurementunits/Model.js | 52 ++++++ 28 files changed, 761 insertions(+) create mode 100644 collections/pm.measurementunits/Ampere.json create mode 100644 collections/pm.measurementunits/Celsius.json create mode 100644 collections/pm.measurementunits/Hertz.json create mode 100644 collections/pm.measurementunits/Meter.json create mode 100644 collections/pm.measurementunits/RPM.json create mode 100644 collections/pm.measurementunits/Second.json create mode 100644 collections/pm.measurementunits/Volt_AC.json create mode 100644 collections/pm.measurementunits/Volt_DC.json create mode 100644 collections/pm.measurementunits/Watt.json create mode 100644 docs/en/docs/reference/measurementunits/ampere.md create mode 100644 docs/en/docs/reference/measurementunits/celsius.md create mode 100644 docs/en/docs/reference/measurementunits/hertz.md create mode 100644 docs/en/docs/reference/measurementunits/index.md create mode 100644 docs/en/docs/reference/measurementunits/meter.md create mode 100644 docs/en/docs/reference/measurementunits/rpm.md create mode 100644 docs/en/docs/reference/measurementunits/second.md create mode 100644 docs/en/docs/reference/measurementunits/volt-ac.md create mode 100644 docs/en/docs/reference/measurementunits/volt-dc.md create mode 100644 docs/en/docs/reference/measurementunits/watt.md create mode 100644 pm/models/measurementunits.py create mode 100644 services/web/apps/pm/measurementunits/__init__.py create mode 100644 services/web/apps/pm/measurementunits/views.py create mode 100644 ui/web/pm/measurementunits/Application.js create mode 100644 ui/web/pm/measurementunits/LookupField.js create mode 100644 ui/web/pm/measurementunits/Model.js diff --git a/collections/pm.measurementunits/Ampere.json b/collections/pm.measurementunits/Ampere.json new file mode 100644 index 0000000000..086e870aab --- /dev/null +++ b/collections/pm.measurementunits/Ampere.json @@ -0,0 +1,9 @@ +{ + "name": "Ampere", + "$collection": "pm.measurementunits", + "uuid": "9e59d6e9-debf-48d4-b122-8283e1206797", + "description": "Electric current measurement", + "label": "A", + "dashboard_label": "A", + "scale_type": "d" +} diff --git a/collections/pm.measurementunits/Celsius.json b/collections/pm.measurementunits/Celsius.json new file mode 100644 index 0000000000..7210b20e45 --- /dev/null +++ b/collections/pm.measurementunits/Celsius.json @@ -0,0 +1,27 @@ +{ + "name": "Celsius", + "$collection": "pm.measurementunits", + "uuid": "1485097a-e3c8-46f9-bf62-bf676df36150", + "description": "Temperature measurement", + "label": "C", + "dashboard_label": "C", + "scale_type": "d", + "alt_units": [ + { + "dashboard_label": "K", + "description": "Kelvin degree", + "from_primary": "x + 273", + "label": "K", + "name": "Kelvin", + "to_primary": "x - 273" + }, + { + "dashboard_label": "F", + "description": "Farenheit degreee", + "from_primary": "(x - 32.0) * 5.0 / 9.0", + "label": "F", + "name": "Farenheit", + "to_primary": "x * 9.0 / 5.0 + 32.0" + } + ] +} diff --git a/collections/pm.measurementunits/Hertz.json b/collections/pm.measurementunits/Hertz.json new file mode 100644 index 0000000000..a91d5c48df --- /dev/null +++ b/collections/pm.measurementunits/Hertz.json @@ -0,0 +1,9 @@ +{ + "name": "Hertz", + "$collection": "pm.measurementunits", + "uuid": "0c4e4c27-4084-4e73-ace8-d0d244b45983", + "description": "Frequency measurement", + "label": "Hz", + "dashboard_label": "Hz", + "scale_type": "d" +} diff --git a/collections/pm.measurementunits/Meter.json b/collections/pm.measurementunits/Meter.json new file mode 100644 index 0000000000..4329893534 --- /dev/null +++ b/collections/pm.measurementunits/Meter.json @@ -0,0 +1,9 @@ +{ + "name": "Meter", + "$collection": "pm.measurementunits", + "uuid": "c5730ec7-b7c5-47ee-90b0-b03f2297f128", + "description": "Distance measurement", + "label": "m", + "dashboard_label": "m", + "scale_type": "d" +} diff --git a/collections/pm.measurementunits/RPM.json b/collections/pm.measurementunits/RPM.json new file mode 100644 index 0000000000..ccb633315e --- /dev/null +++ b/collections/pm.measurementunits/RPM.json @@ -0,0 +1,9 @@ +{ + "name": "RPM", + "$collection": "pm.measurementunits", + "uuid": "c5078a4f-f8e7-4c76-8432-fa9af14fc5f3", + "description": "Rotation measure, rotations per minute", + "label": "RPM", + "dashboard_label": "RPM", + "scale_type": "d" +} diff --git a/collections/pm.measurementunits/Second.json b/collections/pm.measurementunits/Second.json new file mode 100644 index 0000000000..275cfa32bb --- /dev/null +++ b/collections/pm.measurementunits/Second.json @@ -0,0 +1,9 @@ +{ + "name": "Second", + "$collection": "pm.measurementunits", + "uuid": "9194bf43-6b1a-443e-8656-0b1821f369c3", + "description": "Time measurement", + "label": "s", + "dashboard_label": "s", + "scale_type": "d" +} diff --git a/collections/pm.measurementunits/Volt_AC.json b/collections/pm.measurementunits/Volt_AC.json new file mode 100644 index 0000000000..4c05ded4c5 --- /dev/null +++ b/collections/pm.measurementunits/Volt_AC.json @@ -0,0 +1,9 @@ +{ + "name": "Volt AC", + "$collection": "pm.measurementunits", + "uuid": "f5353c4a-68af-47e7-8b1a-60e2ff1c2c0b", + "description": "Electric Potential of Alternating Current measurement", + "label": "VAC", + "dashboard_label": "V(AC)", + "scale_type": "d" +} diff --git a/collections/pm.measurementunits/Volt_DC.json b/collections/pm.measurementunits/Volt_DC.json new file mode 100644 index 0000000000..236aeb6873 --- /dev/null +++ b/collections/pm.measurementunits/Volt_DC.json @@ -0,0 +1,9 @@ +{ + "name": "Volt DC", + "$collection": "pm.measurementunits", + "uuid": "28b4f8c1-beed-4393-b0ea-168fc3d37d9f", + "description": "Direct Current electric potential measurement", + "label": "VDC", + "dashboard_label": "V(DC)", + "scale_type": "d" +} diff --git a/collections/pm.measurementunits/Watt.json b/collections/pm.measurementunits/Watt.json new file mode 100644 index 0000000000..72fa575c2e --- /dev/null +++ b/collections/pm.measurementunits/Watt.json @@ -0,0 +1,9 @@ +{ + "name": "Watt", + "$collection": "pm.measurementunits", + "uuid": "6f814980-325b-4854-a25b-1b7f0aa9ca7b", + "description": "Power measurement", + "label": "W", + "dashboard_label": "W", + "scale_type": "d" +} diff --git a/docs/en/docs/reference/measurementunits/ampere.md b/docs/en/docs/reference/measurementunits/ampere.md new file mode 100644 index 0000000000..865ac343aa --- /dev/null +++ b/docs/en/docs/reference/measurementunits/ampere.md @@ -0,0 +1,15 @@ +--- +uuid: 9e59d6e9-debf-48d4-b122-8283e1206797 +--- +# Ampere Measurement Units + +Electric current measurement + +Scale +: Decimal + +Label +: `A` + +Dashboard Label +: `A` diff --git a/docs/en/docs/reference/measurementunits/celsius.md b/docs/en/docs/reference/measurementunits/celsius.md new file mode 100644 index 0000000000..3eecbafb66 --- /dev/null +++ b/docs/en/docs/reference/measurementunits/celsius.md @@ -0,0 +1,22 @@ +--- +uuid: 1485097a-e3c8-46f9-bf62-bf676df36150 +--- +# Celsius Measurement Units + +Temperature measurement + +Scale +: Decimal + +Label +: `C` + +Dashboard Label +: `C` + +## Alternative Units + +Name | Description | Label | Dash. Label | From Primary | To Primary +--- | --- | --- | --- | --- | --- +Kelvin | Kelvin degree | K | K | `x + 273` | `x - 273` +Farenheit | Farenheit degreee | F | F | `(x - 32.0) * 5.0 / 9.0` | `x * 9.0 / 5.0 + 32.0` diff --git a/docs/en/docs/reference/measurementunits/hertz.md b/docs/en/docs/reference/measurementunits/hertz.md new file mode 100644 index 0000000000..3adbeede24 --- /dev/null +++ b/docs/en/docs/reference/measurementunits/hertz.md @@ -0,0 +1,15 @@ +--- +uuid: 0c4e4c27-4084-4e73-ace8-d0d244b45983 +--- +# Hertz Measurement Units + +Frequency measurement + +Scale +: Decimal + +Label +: `Hz` + +Dashboard Label +: `Hz` diff --git a/docs/en/docs/reference/measurementunits/index.md b/docs/en/docs/reference/measurementunits/index.md new file mode 100644 index 0000000000..ab49c8b117 --- /dev/null +++ b/docs/en/docs/reference/measurementunits/index.md @@ -0,0 +1 @@ +# Measurement Units diff --git a/docs/en/docs/reference/measurementunits/meter.md b/docs/en/docs/reference/measurementunits/meter.md new file mode 100644 index 0000000000..0e77eaeb05 --- /dev/null +++ b/docs/en/docs/reference/measurementunits/meter.md @@ -0,0 +1,15 @@ +--- +uuid: c5730ec7-b7c5-47ee-90b0-b03f2297f128 +--- +# Meter Measurement Units + +Distance measurement + +Scale +: Decimal + +Label +: `m` + +Dashboard Label +: `m` diff --git a/docs/en/docs/reference/measurementunits/rpm.md b/docs/en/docs/reference/measurementunits/rpm.md new file mode 100644 index 0000000000..a6f7dc8477 --- /dev/null +++ b/docs/en/docs/reference/measurementunits/rpm.md @@ -0,0 +1,15 @@ +--- +uuid: c5078a4f-f8e7-4c76-8432-fa9af14fc5f3 +--- +# RPM Measurement Units + +Rotation measure, rotations per minute + +Scale +: Decimal + +Label +: `RPM` + +Dashboard Label +: `RPM` diff --git a/docs/en/docs/reference/measurementunits/second.md b/docs/en/docs/reference/measurementunits/second.md new file mode 100644 index 0000000000..5c9ebf5449 --- /dev/null +++ b/docs/en/docs/reference/measurementunits/second.md @@ -0,0 +1,15 @@ +--- +uuid: 9194bf43-6b1a-443e-8656-0b1821f369c3 +--- +# Second Measurement Units + +Time measurement + +Scale +: Decimal + +Label +: `s` + +Dashboard Label +: `s` diff --git a/docs/en/docs/reference/measurementunits/volt-ac.md b/docs/en/docs/reference/measurementunits/volt-ac.md new file mode 100644 index 0000000000..ebe1d1300d --- /dev/null +++ b/docs/en/docs/reference/measurementunits/volt-ac.md @@ -0,0 +1,15 @@ +--- +uuid: f5353c4a-68af-47e7-8b1a-60e2ff1c2c0b +--- +# Volt AC Measurement Units + +Electric Potential of Alternating Current measurement + +Scale +: Decimal + +Label +: `VAC` + +Dashboard Label +: `V(AC)` diff --git a/docs/en/docs/reference/measurementunits/volt-dc.md b/docs/en/docs/reference/measurementunits/volt-dc.md new file mode 100644 index 0000000000..b0f9cba955 --- /dev/null +++ b/docs/en/docs/reference/measurementunits/volt-dc.md @@ -0,0 +1,15 @@ +--- +uuid: 28b4f8c1-beed-4393-b0ea-168fc3d37d9f +--- +# Volt DC Measurement Units + +Direct Current electric potential measurement + +Scale +: Decimal + +Label +: `VDC` + +Dashboard Label +: `V(DC)` diff --git a/docs/en/docs/reference/measurementunits/watt.md b/docs/en/docs/reference/measurementunits/watt.md new file mode 100644 index 0000000000..db82c8b597 --- /dev/null +++ b/docs/en/docs/reference/measurementunits/watt.md @@ -0,0 +1,15 @@ +--- +uuid: 6f814980-325b-4854-a25b-1b7f0aa9ca7b +--- +# Watt Measurement Units + +Power measurement + +Scale +: Decimal + +Label +: `W` + +Dashboard Label +: `W` diff --git a/docs/en/mkdocs.yml b/docs/en/mkdocs.yml index aac2c6dd01..a8d5e44937 100644 --- a/docs/en/mkdocs.yml +++ b/docs/en/mkdocs.yml @@ -1085,6 +1085,17 @@ nav: - "Node Up": reference/event-classes/vendor/f5/bigip/network/load-balance/node-up.md - "Service Down": reference/event-classes/vendor/f5/bigip/network/load-balance/service-down.md - "Service Up": reference/event-classes/vendor/f5/bigip/network/load-balance/service-up.md + - Measurement Units: + - Overview: reference/measurementunits/index.md + - Ampere: reference/measurementunits/ampere.md + - Celsius: reference/measurementunits/celsius.md + - Hertz: reference/measurementunits/hertz.md + - Meter: reference/measurementunits/meter.md + - RPM: reference/measurementunits/rpm.md + - Second: reference/measurementunits/second.md + - Volt AC: reference/measurementunits/volt-ac.md + - Volt DC: reference/measurementunits/volt-dc.md + - Watt: reference/measurementunits/watt.md - Metrics: - Metric Scopes: - Overview: reference/metrics/scopes/index.md diff --git a/docs/tools/collection-to-md.py b/docs/tools/collection-to-md.py index a4de0338a9..db7ee66584 100644 --- a/docs/tools/collection-to-md.py +++ b/docs/tools/collection-to-md.py @@ -209,6 +209,35 @@ class MetricType(object): return f"reference/metrics/types/{'/'.join(self.dir_path)}/{self.file_name}" +@dataclass +class AltMeasurementUnits(object): + name: str + description: Optional[str] + label: str + dashboard_label: str + from_primary: str + to_primary: str + + +@dataclass +class MeasurementUnits(object): + name: str + uuid: str + description: Optional[str] + label: str + dashboard_label: str + scale_type: str + alt_units: Optional[List[AltMeasurementUnits]] + + @property + def file_name(self) -> str: + return quote_file_name(self.name) + ".md" + + @property + def rel_path(self) -> str: + return f"reference/measurementunits/{self.file_name}" + + class CollectionDoc(object): rx_indent = re.compile(r"^(\s+)-") @@ -222,6 +251,7 @@ class CollectionDoc(object): self.alarm_class: Dict[str, AlarmClass] = {} self.metric_scope: Dict[str, MetricScope] = {} self.metric_type: Dict[str, MetricType] = {} + self.measurement_units: Dict[str, MeasurementUnits] = {} def build(self): shutil.copy(self.yml_path, self.new_yml_path) @@ -230,12 +260,14 @@ class CollectionDoc(object): self.build_alarmclasses() self.build_metric_scopes() self.build_metric_types() + self.build_measurement_units() def read_collections(self): self.read_eventclasses() self.read_alarmclasses() self.read_metric_scopes() self.read_metric_types() + self.read_measurement_units() def iter_jsons(self, path: str) -> Iterable[Dict[str, Any]]: for root, _, files in os.walk(path): @@ -374,6 +406,29 @@ class CollectionDoc(object): self.metric_type[metric_type.name] = metric_type metric_scope.metric_types += [metric_type] + def read_measurement_units(self): + for d in self.iter_jsons(os.path.join("collections", "pm.measurementunits")): + unit = MeasurementUnits( + name=d["name"], + uuid=d["uuid"], + description=d.get("description") or "", + label=d["label"], + dashboard_label=d["dashboard_label"], + scale_type=d["scale_type"], + alt_units=[ + AltMeasurementUnits( + name=a["name"], + description=a.get("description") or "", + label=a["label"], + dashboard_label=a["dashboard_label"], + from_primary=a.get("from_primary") or "", + to_primary=a.get("to_primary") or "", + ) + for a in d.get("alt_units") or [] + ], + ) + self.measurement_units[unit.name] = unit + def ensure_dir(self, path: str) -> None: os.makedirs(path, exist_ok=True) @@ -817,6 +872,69 @@ class CollectionDoc(object): ) self.update_toc("Metric Types", toc) + def build_measurement_units(self) -> None: + print("# Writing measurement units doc:") + new_files = 0 + changed_files = 0 + unmodified_files = 0 + mu_root = os.path.join(self.doc_root, "reference", "measurementunits") + tab = "{{ tab }}" + toc = ["- Overview: reference/measurementunits/index.md"] + for mu_name in sorted(self.measurement_units): + mu = self.measurement_units[mu_name] + data = ["---", f"uuid: {mu.uuid}", "---", f"# {mu.name} Measurement Units"] + if mu.description: + data += ["", mu.description] + scale = {"d": "Decimal", "b": "Binary"}[mu.scale_type] + data += [ + "", + "Scale", + f": {scale}", + "", + "Label", + f": `{mu.label}`", + "", + "Dashboard Label", + f": `{mu.dashboard_label}`", + ] + if mu.alt_units: + data += [ + "", + "## Alternative Units", + "", + "Name | Description | Label | Dash. Label | From Primary | To Primary", + "--- | --- | --- | --- | --- | ---", + ] + data += [ + f"{a.name} | {a.description} | {a.label} | {a.dashboard_label} | `{a.from_primary}` | `{a.to_primary}`" + for a in mu.alt_units + ] + data += [""] + toc += [f"- {mu.name}: reference/measurementunits/{mu.file_name}"] + page = "\n".join(data) + page_path = os.path.join(mu_root, mu.file_name) + to_write = False + if os.path.exists(page_path): + with open(page_path) as f: + old_page = f.read() + if old_page == page: + unmodified_files += 1 + else: + changed_files += 1 + to_write = 1 + else: + new_files += 1 + to_write = True + if to_write: + print(f" Writing: reference/measurementunits/{mu.file_name}") + with open(page_path, "w") as f: + f.write(page) + total_files = new_files + changed_files + unmodified_files + print( + f" Pages: new {new_files}, changed {changed_files}, unmodified {unmodified_files}, total {total_files}" + ) + self.update_toc("Measurement Units", toc) + if __name__ == "__main__": CollectionDoc().build() diff --git a/models.py b/models.py index 1cda143757..cbf9daa47a 100644 --- a/models.py +++ b/models.py @@ -239,6 +239,7 @@ _MODELS = { "fm.TTSystem": "noc.fm.models.ttsystem.TTSystem", "fm.Uptime": "noc.fm.models.uptime.Uptime", # pm models + "pm.MeasurementUnits": "noc.pm.models.measurementunits.MeasurementUnits", "pm.MetricScope": "noc.pm.models.metricscope.MetricScope", "pm.MetricType": "noc.pm.models.metrictype.MetricType", "pm.ThresholdProfile": "noc.pm.models.thresholdprofile.ThresholdProfile", @@ -337,6 +338,7 @@ COLLECTIONS = [ "dev.Spec", "sa.Action", "inv.Capability", + "pm.MeasurementUnits", "pm.MetricScope", "pm.MetricType", "fm.Enumeration", diff --git a/pm/models/measurementunits.py b/pm/models/measurementunits.py new file mode 100644 index 0000000000..9c5e9d1bce --- /dev/null +++ b/pm/models/measurementunits.py @@ -0,0 +1,142 @@ +# ---------------------------------------------------------------------- +# MeasurementUnits document model +# ---------------------------------------------------------------------- +# Copyright (C) 2007-2020 The NOC Project +# See LICENSE for details +# ---------------------------------------------------------------------- + +# Python modules +import operator +from threading import Lock +from typing import Optional + +# Third-party modules +from mongoengine.document import Document, EmbeddedDocument +from mongoengine.fields import StringField, IntField, UUIDField, ListField, EmbeddedDocumentField +import cachetools + +# NOC modules +from noc.core.prettyjson import to_json +from noc.core.text import quote_safe_path + + +id_lock = Lock() + + +class AltUnit(EmbeddedDocument): + # Unique units name + name = StringField(unique=True) + # Optional description + description = StringField() + # Short label + label = StringField() + # Label for dashboards + dashboard_label = StringField() + # Expression to convert from primary units to alternative. + # Primary value is denoted as variable x + from_primary = StringField() + # Expression to convert from alternative units to primary. + # Alternative value is denoted as variable x + to_primary = StringField() + + def __str__(self): + return self.name + + @property + def json_data(self): + return { + "name": self.name, + "description": self.description, + "label": self.label, + "dashboard_label": self.dashboard_label, + "from_primary": self.from_primary, + "to_primary": self.to_primary, + } + + +class EnumValue(EmbeddedDocument): + key = StringField() + value = IntField() + + def __str__(self): + return f"{self.key}: {self.value}" + + @property + def json_data(self): + return {"key": self.key, "value": self.value} + + +class MeasurementUnits(Document): + meta = { + "collection": "measurementunits", + "strict": False, + "auto_create_index": False, + "json_collection": "pm.measurementunits", + "json_unique_fields": ["name"], + } + + # Unique units name + name = StringField(unique=True) + # Global ID + uuid = UUIDField(binary=True) + # Optional description + description = StringField() + # Short label + label = StringField() + # Label for dashboards + dashboard_label = StringField() + # Type of scale (K/M/G prefixes) + # * d - decimal scale, 1/1_000/1_000_000/... + # * b - binary scale, 1/2^10/2^20/... + scale_type = StringField(choices=["d", "b"], default="d") + # Alternative units + alt_units = ListField(EmbeddedDocumentField(AltUnit)) + # Enumerations + enum = ListField(EmbeddedDocumentField(EnumValue)) + + _id_cache = cachetools.TTLCache(maxsize=100, ttl=60) + + def __str__(self): + return self.name + + @classmethod + @cachetools.cachedmethod(operator.attrgetter("_id_cache"), lock=lambda _: id_lock) + def get_by_id(cls, id) -> Optional["MeasurementUnits"]: + return MeasurementUnits.objects.filter(id=id).first() + + @property + def json_data(self): + r = { + "name": self.name, + "$collection": self._meta["json_collection"], + "uuid": self.uuid, + "label": self.label, + "dashboard_label": self.dashboard_label, + "scale_type": self.scale_type, + } + if self.description: + r["description"] = self.description + if self.alt_units: + r["alt_units"] = [x.json_data for x in self.alt_units] + if self.enum: + r["enum"] = [x.json_data for x in self.enum] + return r + + def to_json(self): + return to_json( + self.json_data, + order=[ + "name", + "$collection", + "uuid", + "description", + "label", + "dashboard_label", + "scale_type", + "alt_units", + "enum", + ], + ) + + def get_json_path(self): + return "%s.json" % quote_safe_path(self.name) diff --git a/services/web/apps/pm/measurementunits/__init__.py b/services/web/apps/pm/measurementunits/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/services/web/apps/pm/measurementunits/views.py b/services/web/apps/pm/measurementunits/views.py new file mode 100644 index 0000000000..9dd62b0e07 --- /dev/null +++ b/services/web/apps/pm/measurementunits/views.py @@ -0,0 +1,21 @@ +# ---------------------------------------------------------------------- +# pm.measurementunits application +# ---------------------------------------------------------------------- +# Copyright (C) 2007-2020 The NOC Project +# See LICENSE for details +# ---------------------------------------------------------------------- + +# NOC modules +from noc.lib.app.extdocapplication import ExtDocApplication +from noc.pm.models.measurementunits import MeasurementUnits +from noc.core.translation import ugettext as _ + + +class MeasurementUnitsApplication(ExtDocApplication): + """ + MeasurementUnits application + """ + + title = "MeasurementUnits" + menu = [_("Setup"), _("Measurement Units")] + model = MeasurementUnits diff --git a/ui/web/pm/measurementunits/Application.js b/ui/web/pm/measurementunits/Application.js new file mode 100644 index 0000000000..ac1c89f161 --- /dev/null +++ b/ui/web/pm/measurementunits/Application.js @@ -0,0 +1,161 @@ +//--------------------------------------------------------------------- +// pm.measurementunits application +//--------------------------------------------------------------------- +// Copyright (C) 2007-2020 The NOC Project +// See LICENSE for details +//--------------------------------------------------------------------- +console.debug("Defining NOC.pm.measurementunits.Application"); + +Ext.define("NOC.pm.measurementunits.Application", { + extend: "NOC.core.ModelApplication", + requires: ["NOC.pm.measurementunits.Model"], + model: "NOC.pm.measurementunits.Model", + search: true, + + initComponent: function() { + var me = this; + + me.jsonPanel = Ext.create("NOC.core.JSONPreview", { + app: me, + restUrl: new Ext.XTemplate("/pm/measurementunits/{id}/json/"), + previewName: new Ext.XTemplate("Scope: {name}") + }); + + me.ITEM_JSON = me.registerItem(me.jsonPanel); + + Ext.apply(me, { + columns: [ + { + text: "Name", + dataIndex: "name", + flex: 1 + } + ], + fields: [ + { + name: "name", + xtype: "textfield", + fieldLabel: __("Name"), + allowBlank: false, + uiStyle: "medium" + }, + { + name: "uuid", + xtype: "displayfield", + fieldLabel: __("UUID"), + allowBlank: true + }, + { + name: "description", + xtype: "textarea", + fieldLabel: __("Description"), + allowBlank: true, + uiStyle: "extra" + }, + { + name: "label", + xtype: "textfield", + fieldLabel: __("Label"), + allowBlank: false, + uiStyle: "medium" + }, + { + name: "dashboard_label", + xtype: "textfield", + fieldLabel: __("Dashboard Label"), + allowBlank: false, + uiStyle: "medium" + }, + { + name: "scale_type", + xtype: "combobox", + fieldLabel: __("Scale Type"), + allowBlank: false, + uiStyle: "medium", + store: [["d", __("Decimal Scale")], ["b", __("Binary Scale")]] + }, + { + name: "alt_units", + xtype: "gridfield", + fieldLabel: __("Alternative Units"), + allowBlank: true, + columns: [ + { + text: __("Name"), + dataIndex: "name", + width: 100, + editor: "textfield" + }, + { + text: __("Description"), + dataIndex: "description", + width: 250, + editor: "textfield" + }, + { + text: __("Label"), + dataIndex: "label", + width: 75, + editor: "textfield" + }, + { + text: __("Dash. Label"), + dataIndex: "dashboard_label", + width: 75, + editor: "textfield" + }, + { + text: __("From Primary"), + dataIndex: "from_primary", + flex: 1, + editor: "textfield" + }, + { + text: __("To Primary"), + dataIndex: "to_primary", + flex: 1, + editor: "textfield" + } + ] + }, + { + name: "enum", + xtype: "gridfield", + fieldLabel: __("Enumeration"), + allowBlank: true, + columns: [ + { + text: __("Key"), + dataIndex: "key", + width: 150, + editor: "textfield" + }, + { + text: __("Value"), + dataIndex: "value", + flex: 1, + editor: "numberfield" + } + ] + } + ], + formToolbar: [ + { + text: __("JSON"), + glyph: NOC.glyph.file, + tooltip: __("Show JSON"), + hasAccess: NOC.hasPermission("read"), + scope: me, + handler: me.onJSON + } + ] + }); + me.callParent(); + }, + // + onJSON: function() { + var me = this; + me.showItem(me.ITEM_JSON); + me.jsonPanel.preview(me.currentRecord); + } +}); diff --git a/ui/web/pm/measurementunits/LookupField.js b/ui/web/pm/measurementunits/LookupField.js new file mode 100644 index 0000000000..3288851c76 --- /dev/null +++ b/ui/web/pm/measurementunits/LookupField.js @@ -0,0 +1,12 @@ +//--------------------------------------------------------------------- +// NOC.pm.measurementunits.Lookup +//--------------------------------------------------------------------- +// Copyright (C) 2007-2020 The NOC Project +// See LICENSE for details +//--------------------------------------------------------------------- +console.debug("Defining NOC.pm.measurementunits.LookupField"); + +Ext.define("NOC.pm.measurementunits.LookupField", { + extend: "NOC.core.LookupField", + alias: "widget.pm.measurementunits.LookupField" +}); diff --git a/ui/web/pm/measurementunits/Model.js b/ui/web/pm/measurementunits/Model.js new file mode 100644 index 0000000000..41d04cd853 --- /dev/null +++ b/ui/web/pm/measurementunits/Model.js @@ -0,0 +1,52 @@ +//--------------------------------------------------------------------- +// pm.measurementunits Model +//--------------------------------------------------------------------- +// Copyright (C) 2007-2020 The NOC Project +// See LICENSE for details +//--------------------------------------------------------------------- +console.debug("Defining NOC.pm.measurementunits.Model"); + +Ext.define("NOC.pm.measurementunits.Model", { + extend: "Ext.data.Model", + rest_url: "/pm/measurementunits/", + + fields: [ + { + name: "id", + type: "string" + }, + { + name: "name", + type: "string" + }, + { + name: "uuid", + type: "string" + }, + { + name: "description", + type: "string" + }, + { + name: "label", + type: "string" + }, + { + name: "dashboard_label", + type: "string" + }, + { + name: "scale_type", + type: "string", + defaultValue: "d" + }, + { + name: "alt_units", + type: "auto" + }, + { + name: "enum", + type: "auto" + } + ] +}); \ No newline at end of file -- GitLab From 53b8718c10b27eedf63f8b08bbeff202e91eecfa Mon Sep 17 00:00:00 2001 From: Dmitry Volodin Date: Wed, 2 Dec 2020 20:23:47 +0300 Subject: [PATCH 2/3] Fix --- pm/models/measurementunits.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pm/models/measurementunits.py b/pm/models/measurementunits.py index 9c5e9d1bce..a95a572b47 100644 --- a/pm/models/measurementunits.py +++ b/pm/models/measurementunits.py @@ -25,7 +25,7 @@ id_lock = Lock() class AltUnit(EmbeddedDocument): # Unique units name - name = StringField(unique=True) + name = StringField() # Optional description description = StringField() # Short label -- GitLab From aa4cb2216a51ec4e024abdacd233f7f1d85a418b Mon Sep 17 00:00:00 2001 From: Dmitry Volodin Date: Wed, 2 Dec 2020 20:35:12 +0300 Subject: [PATCH 3/3] Fix --- docs/tools/collection-to-md.py | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/tools/collection-to-md.py b/docs/tools/collection-to-md.py index db7ee66584..0151524abf 100644 --- a/docs/tools/collection-to-md.py +++ b/docs/tools/collection-to-md.py @@ -878,7 +878,6 @@ class CollectionDoc(object): changed_files = 0 unmodified_files = 0 mu_root = os.path.join(self.doc_root, "reference", "measurementunits") - tab = "{{ tab }}" toc = ["- Overview: reference/measurementunits/index.md"] for mu_name in sorted(self.measurement_units): mu = self.measurement_units[mu_name] -- GitLab