File size: 3,055 Bytes
d6ee72a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | """
DataStore models for script data persistence.
"""
import json
import uuid
from django.conf import settings
from django.db import models
class DataStore(models.Model):
"""
A named data store that scripts can use for simple key-value storage.
Data stores are backed by the instance SQLite database.
"""
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(
max_length=100,
unique=True,
help_text="Unique name for this data store (used in scripts)",
)
description = models.TextField(
blank=True,
help_text="Optional description of what this data store is used for",
)
# Timestamps
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
# Who created this data store
created_by = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="created_datastores",
)
class Meta:
db_table = "datastores"
verbose_name = "data store"
verbose_name_plural = "data stores"
ordering = ["name"]
def __str__(self):
return self.name
@property
def entry_count(self) -> int:
"""Return the number of entries in this data store."""
return self.entries.count()
class DataStoreEntry(models.Model):
"""
A key-value entry in a data store.
Values are stored as JSON to support various data types.
"""
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
datastore = models.ForeignKey(
DataStore,
on_delete=models.CASCADE,
related_name="entries",
)
key = models.CharField(
max_length=255,
help_text="Unique key within this data store",
)
# Value stored as JSON text (supports strings, numbers, lists, dicts, etc.)
value_json = models.TextField(
help_text="JSON-encoded value",
)
# Timestamps
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
db_table = "datastore_entries"
verbose_name = "data store entry"
verbose_name_plural = "data store entries"
unique_together = [["datastore", "key"]]
ordering = ["key"]
indexes = [
models.Index(fields=["datastore", "key"]),
]
def __str__(self):
return f"{self.datastore.name}:{self.key}"
def get_value(self):
"""Deserialize and return the stored value."""
return json.loads(self.value_json)
def set_value(self, value) -> None:
"""Serialize and store a value."""
self.value_json = json.dumps(value)
def get_display_value(self) -> str:
"""Return a displayable version of the value (truncated if too long)."""
value = self.value_json
if len(value) > 100:
return value[:100] + "..."
return value
|