diff --git a/fava_client.py b/fava_client.py
index afc964f..c61e1d9 100644
--- a/fava_client.py
+++ b/fava_client.py
@@ -44,22 +44,6 @@ def _infer_target_file(account_name: str) -> str:
return "accounts/chart.beancount"
-def _escape_beancount_string(value: str) -> str:
- """Escape a value for safe inclusion in a Beancount string literal.
-
- Beancount's tokenizer unescapes \\", \\n, \\t, \\r, \\\\ etc. (tokens.c
- cunescape). Unescaped quotes or newlines in free-text metadata written
- straight into the ledger source would corrupt the file, so escape the
- backslash first (to keep it round-tripping) then quotes and newlines.
- """
- return (
- value.replace("\\", "\\\\")
- .replace('"', '\\"')
- .replace("\n", "\\n")
- .replace("\r", "\\r")
- )
-
-
class FavaClient:
"""
Async client for Fava REST API.
@@ -1560,7 +1544,7 @@ class FavaClient:
async def add_account(
self,
account_name: str,
- currencies: Optional[list[str]] = None,
+ currencies: list[str],
opening_date: Optional[date] = None,
metadata: Optional[Dict[str, Any]] = None,
target_file: Optional[str] = None,
@@ -1658,23 +1642,19 @@ class FavaClient:
lines = source.split('\n')
insert_index = len(lines)
- # Step 4: Format Open directive as Beancount text.
- # Currencies are an optional constraint on an Open
- # directive; when none are given the account accepts
- # any commodity.
- open_directive = f"{opening_date.isoformat()} open {account_name}"
- if currencies:
- open_directive += f" {', '.join(currencies)}"
- open_lines = ["", open_directive]
+ # Step 4: Format Open directive as Beancount text
+ currencies_str = ", ".join(currencies)
+ open_lines = [
+ "",
+ f"{opening_date.isoformat()} open {account_name} {currencies_str}"
+ ]
# Add metadata if provided
if metadata:
for key, value in metadata.items():
# Format metadata with proper indentation
if isinstance(value, str):
- open_lines.append(
- f' {key}: "{_escape_beancount_string(value)}"'
- )
+ open_lines.append(f' {key}: "{value}"')
else:
open_lines.append(f' {key}: {value}')
diff --git a/static/js/index.js b/static/js/index.js
index a10d50c..418ec41 100644
--- a/static/js/index.js
+++ b/static/js/index.js
@@ -69,12 +69,6 @@ window.app = Vue.createApp({
userWalletId: '',
loading: false
},
- addAccountDialog: {
- show: false,
- name: '',
- description: '',
- loading: false
- },
receivableDialog: {
show: false,
selectedUser: '',
@@ -572,45 +566,6 @@ window.app = Vue.createApp({
this.syncingAccounts = false
}
},
- showAddAccountDialog() {
- this.addAccountDialog.name = ''
- this.addAccountDialog.description = ''
- this.addAccountDialog.show = true
- },
- async submitAddAccount() {
- const name = (this.addAccountDialog.name || '').trim()
- const validPrefixes = ['Assets:', 'Liabilities:', 'Equity:', 'Income:', 'Expenses:']
- if (!validPrefixes.some(p => name.startsWith(p))) {
- this.$q.notify({
- type: 'warning',
- message: `Account name must start with one of: ${validPrefixes.join(', ')}`
- })
- return
- }
- this.addAccountDialog.loading = true
- try {
- const {data} = await LNbits.api.request(
- 'POST',
- '/libra/api/v1/admin/accounts',
- this.g.user.wallets[0].adminkey,
- {
- name,
- description: this.addAccountDialog.description || null
- }
- )
- this.$q.notify({
- type: 'positive',
- message: `Account ${data.account_name} created` +
- (data.synced_to_libra_db ? '' : ' (sync pending)')
- })
- this.addAccountDialog.show = false
- await this.loadAccounts()
- } catch (error) {
- LNbits.utils.notifyApiError(error)
- } finally {
- this.addAccountDialog.loading = false
- }
- },
showSettingsDialog() {
this.settingsDialog.libraWalletId = this.settings?.libra_wallet_id || ''
this.settingsDialog.favaUrl = this.settings?.fava_url || 'http://localhost:3333'
diff --git a/templates/libra/index.html b/templates/libra/index.html
index f36c466..0de0e71 100644
--- a/templates/libra/index.html
+++ b/templates/libra/index.html
@@ -857,20 +857,7 @@
-
-
Chart of Accounts
-
-
-
+
Chart of Accounts
@@ -1245,50 +1232,6 @@
-
-
-
-
-
Add Account
-
-
-
-
-
-
- Creates an Open directive in the Beancount ledger and syncs it into Libra
- so permissions can be granted. Per-user accounts are managed automatically.
-