Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
15 changes: 15 additions & 0 deletions .claudeignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@

dashboard/
log/
dist/
venv/
node_modules/
docs/
uploads/
workdir/
.env
pytest.ini
general_ledger/data
general_ledger/scripts
general_ledger/static

15 changes: 5 additions & 10 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,13 @@
mysite/settings/prod.py
mysite/settings/dev.py
general_ledger/data
general_ledger/guff
.env.*
.env
/run
stuff
guff
/general_ledger/scripts/ofxparse1.py
/uploads/

# Django #
*.log
Expand Down Expand Up @@ -128,13 +132,6 @@ venv.bak/
# mypy
.mypy_cache/

# Sublime Text #
*.tmlanguage.cache
*.tmPreferences.cache
*.stTheme.cache
*.sublime-workspace
*.sublime-project

# sftp configuration file
sftp-config.json

Expand All @@ -152,5 +149,3 @@ GitHub.sublime-settings
!.vscode/launch.json
!.vscode/extensions.json
.history
/general_ledger/scripts/ofxparse1.py
/uploads/
138 changes: 137 additions & 1 deletion dashboard/dynamic_preferences_registry.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
import json
from collections import defaultdict

from dynamic_preferences.preferences import Section
from dynamic_preferences.registries import (
global_preferences_registry,
)
from dynamic_preferences.types import BooleanPreference, StringPreference, IntegerPreference
from dynamic_preferences.serializers import BaseSerializer
from dynamic_preferences.types import (
BooleanPreference,
StringPreference,
IntegerPreference,
LongStringPreference,
BasePreferenceType,
)
from dynamic_preferences.users.registries import user_preferences_registry
from .registries import book_preferences_registry

Expand All @@ -11,6 +21,7 @@
discussion = Section("discussion")
access = Section("access")
debugging = Section("debugging")
layout = Section("layout")


# We start with a global preference
Expand All @@ -37,6 +48,7 @@ class CommentNotificationsEnabled(BooleanPreference):
name = "comment_notifications_enabled"
default = True


@user_preferences_registry.register
class DebugLevel(IntegerPreference):
"""
Expand All @@ -48,6 +60,92 @@ class DebugLevel(IntegerPreference):
default = 0


string_types = str
from django.template import defaultfilters


class GridstackLayoutPreferenceSerializer(BaseSerializer):
@classmethod
def to_db(cls, value, **kwargs):
# print("calling to_db in serializer")
if not isinstance(value, string_types):
raise cls.exception(
"Cannot serialize, value {0} is not a string".format(value)
)
# print(f"value is '{value}'")
if value == "":
return ""

data = json.loads(value)
filtered = {
x["id"]: {
k: v
for (k, v) in x.items()
if k
in [
"w",
"h",
"x",
"y",
"minH",
"minW",
]
}
for x in data
if x.get("id")
}
for foo in filtered:
if not "w" in filtered[foo]:
filtered[foo]["w"] = filtered[foo]["minW"]

out = json.dumps(filtered, indent=2)

# print("out is ", out)
if kwargs.get("escape_html", False):
return defaultfilters.force_escape(out)
else:
return out

@classmethod
def to_python(cls, value, **kwargs):
# print("calling to_python in serializer ")
# print(f"value is '{value}'")
if not value:
return defaultdict(dict)
try:
return json.loads(value)
except:
raise cls.exception("Cannot deserialize value {0} to json".format(value))


class GridstackLayoutPreference(LongStringPreference):
section = layout
name = "dashboard_layout_json"
verbose_name = "GridStack Layout Configuration"
serializer = GridstackLayoutPreferenceSerializer

# def serialize(self, value):
# """Convert dict to JSON string for storage"""
# if isinstance(value, str):
# return value
# return json.dumps(value)
#
# def deserialize(self, value):
# """Convert stored JSON string back to dict"""
# try:
# return json.loads(value)
# except json.JSONDecodeError:
# return {}


@user_preferences_registry.register
class DashboardLayout(GridstackLayoutPreference):
section = layout
name = "dashboard_layout_json"
default = ""
required = False


@book_preferences_registry.register
class IsPublic(BooleanPreference):
section = access
Expand All @@ -59,3 +157,41 @@ class IsPublic(BooleanPreference):
class MaintenanceMode(BooleanPreference):
name = "maintenance_mode"
default = False


# @book_preferences_registry.register
# class DashboardLayout(LongStringPreference):
# name = "dashboard_layout_json"
# default = ""
# required = False

# class GridstackLayoutPreference(PerInstancePreferenceType):
# """
# Stores gridstack layout configuration as JSON string
# """
# section = dashboard
# name = 'gridstack_layout'
# verbose_name = 'Gridstack Layout Configuration'
#
# default = '{}' # Empty JSON object as default
#
# def validate(self, value):
# """Ensure the value is valid JSON"""
# try:
# json.loads(value)
# return True
# except json.JSONDecodeError:
# return False
#
# def serialize(self, value):
# """Convert dict to JSON string for storage"""
# if isinstance(value, str):
# return value
# return json.dumps(value)
#
# def deserialize(self, value):
# """Convert stored JSON string back to dict"""
# try:
# return json.loads(value)
# except json.JSONDecodeError:
# return {}
14 changes: 2 additions & 12 deletions dashboard/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
# Generated by Django 5.1.1 on 2024-10-04 02:46
# Generated by Django 5.1.1 on 2024-11-04 22:44

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

initial = True

dependencies = [
("general_ledger", "0001_squashed_0007_bankbalance_balance_type"),
]
dependencies = []

operations = [
migrations.CreateModel(
Expand Down Expand Up @@ -46,13 +43,6 @@ class Migration(migrations.Migration):
"raw_value",
models.TextField(blank=True, null=True, verbose_name="Raw Value"),
),
(
"instance",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="general_ledger.book",
),
),
],
),
]
24 changes: 24 additions & 0 deletions dashboard/migrations/0002_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Generated by Django 5.1.1 on 2024-11-04 22:44

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

initial = True

dependencies = [
("dashboard", "0001_initial"),
("general_ledger", "0001_initial"),
]

operations = [
migrations.AddField(
model_name="bookpreferencemodel",
name="instance",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="general_ledger.book"
),
),
]
2 changes: 1 addition & 1 deletion dashboard/models/book_preferences.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from django.db import models
from dynamic_preferences.models import PerInstancePreferenceModel

from general_ledger.models import Book
from general_ledger.django.models import Book


class BookPreferenceModel(PerInstancePreferenceModel):
Expand Down
Loading