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