Spaces:
Paused
Paused
| """ | |
| 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 | |
| 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 | |