PhracturedBlue / fava-portfolio-summary

Fava extension to display a portfolio summary
MIT License
24 stars 8 forks source link

Error with start page: 'FavaLedger' object has no attribute 'price_map' #7

Open pallavg opened 7 months ago

pallavg commented 7 months ago

I have installed this plugin, but I'm running into an error when I launch the fava application. When I click the Portfolio Summary link, I get the following error in the backend:

  ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\drpal\Desktop\PyCharmProjects\work\venv\Lib\site-packages\fava_portfolio_summary\__init__.py", line 52, in portfolio_accounts
    portfolio_summary = PortfolioSummaryInstance(self.ledger, self.config, self.irr_cache, self.dividend_cache)
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\drpal\Desktop\PyCharmProjects\work\venv\Lib\site-packages\fava_portfolio_summary\__init__.py", line 65, in __init__
    self.irr = IRR(self.ledger.all_entries, g.ledger.price_map, self.operating_currency, errors=self.ledger.errors)
                                            ^^^^^^^^^^^^^^^^^^
AttributeError: 'FavaLedger' object has no attribute 'price_map'

Here are the list of dependencies I am using:

beancount                 2.3.6
beancount-import          1.3.5.post1.dev50
beanprice                 1.2.0
fava                      1.27.2
fava-dashboards           0.1.dev52+g25d108e C:\Users\drpal\Desktop\PyCharmProjects\work\lib\fava-dashboards
fava_portfolio_summary    0.1.dev21+gfb31e37
jesucarr commented 7 months ago

Looks like 'price_map' has been changed to 'prices': https://github.com/beancount/fava/commit/4cdff4d13f0b2ff8dcb506695035ca3d2b42a330

pallavg commented 7 months ago

Looks like more than just that:

  File "C:\Users\drpal\Desktop\PyCharmProjects\work\venv\Lib\site-packages\fava_portfolio_summary\__init__.py", line 96, in run
    title, portfolio = self._account_metadata_pattern(
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\drpal\Desktop\PyCharmProjects\work\venv\Lib\site-packages\fava_portfolio_summary\__init__.py", line 231, in _account_metadata_pattern
    portfolio_data = self._portfolio_data(selected_accounts, internal, mwr, twr, dividends)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\drpal\Desktop\PyCharmProjects\work\venv\Lib\site-packages\fava_portfolio_summary\__init__.py", line 354, in _portfolio_data
    row['mwr'], row['twr'] = self._calculate_irr_twr(
                             ^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\drpal\Desktop\PyCharmProjects\work\venv\Lib\site-packages\fava_portfolio_summary\__init__.py", line 383, in _calculate_irr_twr
    mwr, twr = self.irr.calculate(
               ^^^^^^^^^^^^^^^^^^^
  File "C:\Users\drpal\Desktop\PyCharmProjects\work\venv\Lib\site-packages\fava_portfolio_summary\irr.py", line 310, in calculate
    converted = beancount.core.convert.convert_position(
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\drpal\Desktop\PyCharmProjects\work\venv\Lib\site-packages\beancount\core\convert.py", line 177, in convert_position
    return convert_amount(pos.units, target_currency, price_map,
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\drpal\Desktop\PyCharmProjects\work\venv\Lib\site-packages\beancount\core\convert.py", line 202, in convert_amount
    _, rate = prices.get_price(price_map, base_quote, date)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\drpal\Desktop\PyCharmProjects\work\venv\Lib\site-packages\beancount\core\prices.py", line 366, in get_price
    price_list = _lookup_price_and_inverse(price_map, base_quote)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\drpal\Desktop\PyCharmProjects\work\venv\Lib\site-packages\beancount\core\prices.py", line 278, in _lookup_price_and_inverse
    return price_map[base_quote]
           ~~~~~~~~~^^^^^^^^^^^^
TypeError: 'FavaPriceMap' object is not subscriptable

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
te code
    {% for title, data in extension.portfolio_accounts() %}
    ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\drpal\Desktop\PyCharmProjects\work\venv\Lib\site-packages\fava_portfolio_summary\__init__.py", line 53, in portfolio_accounts
    return portfolio_summary.run()
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\drpal\Desktop\PyCharmProjects\work\venv\Lib\site-packages\fava_portfolio_summary\__init__.py", line 100, in run
    raise Exception from _e
Exception
pallavg commented 7 months ago

I was able to get this work by hacking the following:

__init__.py:

Change line to g.ledger.prices._map:
        self.irr = IRR(self.ledger.all_entries, g.ledger.prices._map, self.operating_currency, errors=self.ledger.errors)

Change the query to follows. My naming conversion of Dividends is like Assets:Fidelity:401K:Dividends:VTI, etc so that I can group all the various tickers under dividends in the Balance sheets etc. So maybe you can relax the query condition a little?
        query = (
            f"SELECT SUM(CONVERT(COST(position),'{self.operating_currency}')) AS dividends "
            #f"FROM HAS_ACCOUNT('{currency}') AND HAS_ACCOUNT('{parent_name}') WHERE LEAF(account) = 'Dividends'")
            f"FROM HAS_ACCOUNT('{currency}') AND HAS_ACCOUNT('{parent_name}') WHERE account ~ 'Dividends'")

Change the line:  need to add self.ledger.all_entries to the fava API
        result = self.ledger.query_shell.execute_query(self.ledger.all_entries, query)
PortfolioSummary.html

Change line to: remove the last_segment argument             
   {{ account_macros.account_name(ledger, row.account ) }}