# Write your own

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

Each Plugin is nothing more than a `class` that implements our `Plugin interface` with an `async method` and can perform customizations at either Agent level, Collection level, or both.

```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] = {},
    ):
        # ... call customization methods here
```

3 parameters are provided:

| Name                   | Description                                                                                                                                                                                                |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| datasource\_customizer | An object that allows customizing the whole agent. It has the same interface than the `Agent` you manipulate outside of Plugins                                                                            |
| collection\_customizer | An object that allows customizing the collection that the Plugin was called from (`None` if the Plugin was called on the Agent). It is the same object than is passed when you call `customize_collection` |
| options                | An dictionary of options that are provided to the Plugin. Each Plugin will provide specific mandatory or optional options.                                                                                 |

### Making your Plugin act differently depending on the Collection

When making a Plugin, you may want it to generalize to many different Collections.

This can be achieved by adopting different behavior depending on the `schema` of the Collection being targeted.

```python
from forestadmin.datasource_toolkit.plugins.plugin import Plugin

class RemoveTimestamps(Plugin):
    async def run(
        self,
        datasource_customizer: "DatasourceCustomizer",  # noqa: F821
        collection_customizer: Optional["CollectionCustomizer"] = None,  # noqa: F821
        options: Optional[Dict] = {},
    ):
        for collection in datasource_customizer.collections:
            if 'createdAt' collection.schema["fields"].keys():
                collection.remove_field("createdAt")

            if 'updatedAt' collection.schema["fields"].keys():
                collection.remove_field("updatedAt")

```
