# API Charts

{% hint style="success" %}
This is the official documentation of the `forestadmin-agent-django` and `forestadmin-agent-flask` Python agents.
{% endhint %}

API charts in the legacy agents were declared using routes.

In the new agent, you will need to use either the `agent.add_chart` or the `collection.add_chart` function, depending on if the chart is to be displayed on a record of a collection or a dashboard.

{% hint style="info" %}
You can find the full documentation of chart customization [here](https://docs.forestadmin.com/developer-guide-agents-python/agent-customization/charts).
{% endhint %}

## Code cheatsheet

| Legacy agent     | New agent                                                                            |
| ---------------- | ------------------------------------------------------------------------------------ |
| route in urls.py | <p>agent.add\_chart<br>collection.add\_chart(...)</p>                                |
| render Chart     | <p>return result\_builder.value(...)<br>return result\_builder.distribution(...)</p> |
| request object   | context.record\_id                                                                   |

## How to migrate

Migrating should be straightforward: the only differences are that:

* dashboard charts are now declared using the `agent.add_chart` function.
* collection charts are now declared using the `collection.add_chart` function, and access the record id using `context.record_id` instead of `request.query?.record_id`.
* Both types should use the `resultBuilder` helper to return the chart data.

{% tabs %}
{% tab title="Before" %}

* Define a new route in `urls.py`:
* Setup an action into a controller

```python
from django_forest.utils.views.base import BaseView

class MrrChartView(BaseView):
    def post(self, request):
        mrr = 0
        stripe = StripeClient("sk_AABBCCDD11223344")
        for charge in stripe.charges.all({"limit": 3}):
            mrr += charge.amount
        res = {
            "data": {
                "attributes": {
                    "value": {"countCurrent": mrr}
                },
                "type": "stats",
                "id": uuid.uuid4(),
            }
        }
        return JsonResponse(status=200, data=res)

```

{% endtab %}

{% tab title="After" %}

```python
from forestadmin.datasource_toolkit.context.agent_context import AgentCustomizationContext
from forestadmin.datasource_toolkit.decorators.chart.result_builder import ResultBuilder

def mrr_chart(context: AgentCustomizationContext, result_builder: ResultBuilder):
    mrr = 0
    stripe = StripeClient("sk_AABBCCDD11223344")
    for charge in stripe.charges.all({"limit": 3}):
        mrr += charge.amount
    return result_builder.value(mrr)

agent.add_chart("monthlyRecuringRevenue", mrr_chart)
```

{% endtab %}
{% endtabs %}
