# Plugins

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

When customizing your Agent behavior, it is quite common to have to perform the same tasks on multiple Fields and Collections.

Plugins are the answer to that need, and you are strongly encouraged to use them everywhere you notice that your customization files could benefit from code factorization.

### Minimal example

#### Using plugins

Plugins are used by either importing a module, or installing the relevant package, and then calling the `use` method.

Depending on the plugin, options may be provided.

```python
# The .use() method can be called both on the agent and on collections.
agent.use(
    # Some plugins do not require options
    RemoveTimestamps
    # Others do
).customize_collection('accounts').use(CreateFileField, { "fieldname": 'avatar' })
```

#### Writing plugins

A Plugin is nothing more than a `class` that implements our `Plugin interface` with an `async method` and can perform customizations.

The full documentation can be found in the ["Write your own plugin" section](https://docs.forestadmin.com/developer-guide-agents-python/agent-customization/plugins/custom).

```python
from forestadmin.datasource_toolkit.plugins.plugin import Plugin
# from forestadmin.datasource_toolkit.datasource_customizer.collection_customizer import (
#     CollectionCustomizer
# )
# from forestadmin.datasource_toolkit.datasource_customizer.datasource_customizer import (
#     DatasourceCustomizer
# )

class RemoveTimestamps(Plugin):
    async def run(
        self,
        datasource_customizer: "DatasourceCustomizer",  # noqa: F821
        collection_customizer: Optional["CollectionCustomizer"] = None,  # noqa: F821
        options: Optional[Dict] = {},
    ):
        # Allow the plugin to be used both on the dataSource or on individual collections
        collections = (
            [collection_customizer]
            if collection_customizer
            else datasource_customizer.collections
        )

        for current_collection in collections:
            collection.remove_field("createdAt")
            collection.remove_field("updatedAt")
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.forestadmin.com/developer-guide-agents-python/agent-customization/plugins.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
