pyrunner / core /models /datastore.py
Perspicacious's picture
Deploy PyRunner on Hugging Face
2529305
Raw
History Blame Contribute Delete
3.06 kB
"""
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