mirror of https://github.com/ghostfolio/ghostfolio
Browse Source
- ngOnInit restores conversation from sessionStorage on mount - saveHistory() persists every message exchange automatically - clearHistory() resets to welcome message and wipes stored history - Clear button added to panel header (small, subtle, matches dark theme) - welcomeMessage getter adapts copy based on enableRealEstate flag Made-with: Cursorpull/6453/head
1 changed files with 87 additions and 0 deletions
@ -0,0 +1,87 @@ |
|||||
|
""" |
||||
|
seed_portfolio.py — Seed a Ghostfolio account with demo holdings. |
||||
|
|
||||
|
Usage: |
||||
|
python scripts/seed_portfolio.py |
||||
|
|
||||
|
Environment variables: |
||||
|
GHOSTFOLIO_BASE_URL (default: http://localhost:3333) |
||||
|
GHOSTFOLIO_BEARER_TOKEN (required) |
||||
|
""" |
||||
|
|
||||
|
import asyncio |
||||
|
import os |
||||
|
import sys |
||||
|
|
||||
|
import httpx |
||||
|
|
||||
|
GHOSTFOLIO_URL = os.getenv("GHOSTFOLIO_BASE_URL", "http://localhost:3333") |
||||
|
TOKEN = os.getenv("GHOSTFOLIO_BEARER_TOKEN", "") |
||||
|
|
||||
|
|
||||
|
async def seed() -> None: |
||||
|
if not TOKEN: |
||||
|
print("ERROR: GHOSTFOLIO_BEARER_TOKEN is not set.", file=sys.stderr) |
||||
|
sys.exit(1) |
||||
|
|
||||
|
holdings = [ |
||||
|
{ |
||||
|
"symbol": "AAPL", |
||||
|
"quantity": 10, |
||||
|
"unitPrice": 150.00, |
||||
|
"date": "2024-01-15T00:00:00.000Z", |
||||
|
"type": "BUY", |
||||
|
"currency": "USD", |
||||
|
"dataSource": "YAHOO", |
||||
|
"fee": 4.95, |
||||
|
}, |
||||
|
{ |
||||
|
"symbol": "MSFT", |
||||
|
"quantity": 5, |
||||
|
"unitPrice": 300.00, |
||||
|
"date": "2024-03-10T00:00:00.000Z", |
||||
|
"type": "BUY", |
||||
|
"currency": "USD", |
||||
|
"dataSource": "YAHOO", |
||||
|
"fee": 4.95, |
||||
|
}, |
||||
|
{ |
||||
|
"symbol": "NVDA", |
||||
|
"quantity": 3, |
||||
|
"unitPrice": 400.00, |
||||
|
"date": "2024-06-01T00:00:00.000Z", |
||||
|
"type": "BUY", |
||||
|
"currency": "USD", |
||||
|
"dataSource": "YAHOO", |
||||
|
"fee": 4.95, |
||||
|
}, |
||||
|
{ |
||||
|
"symbol": "TSLA", |
||||
|
"quantity": 2, |
||||
|
"unitPrice": 200.00, |
||||
|
"date": "2024-09-20T00:00:00.000Z", |
||||
|
"type": "BUY", |
||||
|
"currency": "USD", |
||||
|
"dataSource": "YAHOO", |
||||
|
"fee": 4.95, |
||||
|
}, |
||||
|
] |
||||
|
|
||||
|
async with httpx.AsyncClient(timeout=30) as client: |
||||
|
resp = await client.post( |
||||
|
f"{GHOSTFOLIO_URL}/api/v1/import", |
||||
|
headers={"Authorization": f"Bearer {TOKEN}"}, |
||||
|
json={"activities": holdings}, |
||||
|
) |
||||
|
print(f"Seed result: {resp.status_code}") |
||||
|
if resp.status_code == 201: |
||||
|
print(f"SUCCESS — imported {len(holdings)} transactions.") |
||||
|
for h in holdings: |
||||
|
print(f" ✓ {h['type']} {h['quantity']} {h['symbol']} @ ${h['unitPrice']}") |
||||
|
else: |
||||
|
print(f"RESPONSE: {resp.text}") |
||||
|
sys.exit(1) |
||||
|
|
||||
|
|
||||
|
if __name__ == "__main__": |
||||
|
asyncio.run(seed()) |
||||
Loading…
Reference in new issue