{"id":23537516,"url":"https://github.com/py-package/masonite-multitenancy","last_synced_at":"2025-04-23T14:14:27.023Z","repository":{"id":44000895,"uuid":"511870807","full_name":"py-package/masonite-multitenancy","owner":"py-package","description":"Multitenancy package for Masonite!","archived":false,"fork":false,"pushed_at":"2024-02-05T18:36:06.000Z","size":152,"stargazers_count":10,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-23T14:14:17.592Z","etag":null,"topics":["masonite-framework","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/py-package.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2022-07-08T11:28:39.000Z","updated_at":"2023-06-13T12:21:37.000Z","dependencies_parsed_at":"2022-09-26T21:22:01.732Z","dependency_job_id":"752c72dc-396a-44a5-a2de-8ef8f1195a73","html_url":"https://github.com/py-package/masonite-multitenancy","commit_stats":{"total_commits":24,"total_committers":2,"mean_commits":12.0,"dds":0.125,"last_synced_commit":"6587102e7d566fdd54e08a0cb2794d56e097dd20"},"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/py-package%2Fmasonite-multitenancy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/py-package%2Fmasonite-multitenancy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/py-package%2Fmasonite-multitenancy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/py-package%2Fmasonite-multitenancy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/py-package","download_url":"https://codeload.github.com/py-package/masonite-multitenancy/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250447979,"owners_count":21432165,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["masonite-framework","python"],"created_at":"2024-12-26T03:16:13.222Z","updated_at":"2025-04-23T14:14:26.965Z","avatar_url":"https://github.com/py-package.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://banners.beyondco.de/Masonite%20Multitenancy.png?theme=light\u0026packageManager=pip+install\u0026packageName=masonite-multitenancy\u0026pattern=charlieBrown\u0026style=style_2\u0026description=Multitenancy+package+for+masonite.\u0026md=1\u0026showWatermark=1\u0026fontSize=100px\u0026images=adjustments\u0026widths=50\u0026heights=50\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://docs.masoniteproject.com\"\u003e\n    \u003cimg alt=\"Masonite Package\" src=\"https://img.shields.io/static/v1?label=Masonite\u0026message=package\u0026labelColor=grey\u0026color=blue\u0026logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAIRlWElmTU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABIAAAAAQAAAEgAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAAA6gAwAEAAAAAQAAAA4AAAAATspU+QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAVlpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KTMInWQAAAnxJREFUKBVNUl1IVEEUPjPObdd1VdxWM0rMIl3bzbVWLSofVm3th0AhMakHHyqRiNSHEAq5b2HSVvoQRUiEECQUQkkPbRslRGigG8auoon2oPSjpev+3PWeZq7eaC5nDt93vplz5txDQJYpNxX4st4JFiwj9aCqmswUFQNS/A2YskrZJPYefkECC2GhQwAqvLYybwXrwBvq8HSNOXRO92+aH7nW8vc/wS2Z9TqneYt2KHjlf9Iv+43wFJMExzO0YE5OKe60N+AOW6OmE+WJTBrg23jjzWxMBauOlfyycsV24F+cH+zAXYUOGl+DaiDxfl245/W9OnVrSY+O2eqPkyz4sVvHoKp9gOihf5KoAVv3hkQgbj/ihG9fI3RixKcUVx7lJVaEc0vnyf2FFll+ny80ZHZiGhIKowWJBCEAKr+FSuNDLt+lxybSF51lo74arqs113dOZqwsptxNs5bwi7Q3q8npSC2AWmvjTncZf1l61e5DEizNn5mtufpsqk5+CZTuq00sP1wkNPv8jeEikVVlJso+GEwRtNs3QeBt2YP2V2ZI3Tx0e+7T89zK5tNASOLEytJAryGtkLc2PcBM5byyUWYkMQpMioYcDcchC6xN220Iv36Ot8pV0454RHLEwmmD7UWfIdX0zq3GjMPG5NKBtv5qiPEPekK2U51j1451BZoc3i+1ohSQ/UzzG5uYFFn2mwVUnO4O3JblXA91T51l3pB3QweDl7sNXMyEjbguSjrPcQNmwDkNc8CbCvDd0+xCC7RFi9wFulD3mJeXqxQevB4prrqgc0TmQ85NG/K43e2UwnMVAJIEBNfWRYR3HfnvivrIzMyo4Hgy+hfscvLo53jItAAAAABJRU5ErkJggg==\"\u003e\n  \u003c/a\u003e\n  \u003cimg alt=\"GitHub Workflow Status (branch)\" src=\"https://github.com/py-package/masonite-multitenancy/actions/workflows/pythonapp.yml/badge.svg\"\u003e\n  \u003cimg alt=\"PyPI\" src=\"https://img.shields.io/pypi/v/masonite-multitenancy\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/python-3.6+-blue.svg\" alt=\"Python Version\"\u003e\n  \u003cimg alt=\"GitHub release (latest by date including pre-releases)\" src=\"https://img.shields.io/github/v/release/py-package/masonite-multitenancy?include_prereleases\"\u003e\n  \u003cimg alt=\"License\" src=\"https://img.shields.io/github/license/py-package/masonite-multitenancy\"\u003e\n  \u003ca href=\"https://github.com/psf/black\"\u003e\u003cimg alt=\"Code style: black\" src=\"https://img.shields.io/badge/code%20style-black-000000.svg\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n# Masonite Multitenancy (WIP)\n\nMultitenancy package for Masonite!\n\nMultitenancy is a feature that allows you to have multiple tenants in your application. This is useful for things like a company having multiple websites, or a company having multiple apps.\n\n### Features\n\n- [x] Create a new tenant (with domain)\n- [x] Tenant specific configurations\n- [x] Tenant specific migrations and seeders\n- [x] Tenant middleware to specify tenant in request on the fly\n\n### Installation\n\n```bash\npip install masonite-multitenancy\n```\n\n### Configuration\n\nAdd _`MultitenancyProvider`_ to your project in `config/providers.py`:\n\n```python\n# config/providers.py\n# ...\nfrom multitenancy import MultitenancyProvider\n\n# ...\nPROVIDERS = [\n    # ...\n    # Third Party Providers\n    MultitenancyProvider,\n    # ...\n]\n```\n\nThen you can publish the package resources (if needed) by doing:\n\n```bash\npython craft package:publish multitenancy\n```\n\n### Command Usage\n\nYou'll get bunch of commands to manage tenants.\n\n**Create a new tenant**\n\nThis will prompt few questions just provider answers and that's it.\n\n```bash\npython craft tenancy:create\n```\n\nThis will also automatically generate new database connection based on your `default` database connection from `config/database.py`.\n\n**List all tenants**\n\n```bash\npython craft tenancy:list\n```\n\n**Delete a tenant**\n\n```bash\n# delete a tenant by database name\npython craft tenancy:delete --tenants=tenant1\n# or\npython craft tenancy:delete --tenants=tenant1,tenant2\n```\n\n**Delete all tenants**\n\n```bash\npython craft tenancy:delete\n```\n\n**Migrate a tenant**\n\n```bash\npython craft tenancy:migrate --tenants=tenant1\n# or\npython craft tenancy:migrate --tenants=tenant1,tenant2\n```\n\n**Migrate all tenants**\n\n```bash\npython craft tenancy:migrate\n```\n\nSimilary you can use `tenancy:migrate:refresh`, `tenancy:migrate:reset`, `tenancy:migrate:status` and `tenancy:migrate:rollback` commands.\nAll commands will take `--tenants` option to specify tenants if you ever need.\n\n**Seed a tenant**\n\n```bash\npython craft tenancy:seed --tenants=tenant1\n# or\npython craft tenancy:seed --tenants=tenant1,tenant2\n```\n\n**Seed all tenants**\n\n```bash\npython craft tenancy:seed\n```\n\n### Using Tenancy Facade\n\n**Create a new tenant**\n\n```python\nfrom multitenancy.facades import Tenancy\n\n# creates a new tenant and returns instance of new Tenant\nTenancy.create(\n  name='tenant1',\n  domain='tenant1.example.com',\n  database='tenant1',\n)\n```\n\n**Get tenant**\n\n```python\nfrom multitenancy.facades import Tenancy\n\n# by id\nTenancy.get_tenant_by_id(1)\n\n# by domain\nTenancy.get_tenant_by_domain('tenant1.example.com')\n\n# by database name\nTenancy.get_tenant_by_database('tenant1')\n```\n\n**Delete tenant**\n\n```python\nfrom multitenancy.facades import Tenancy\n\n\ntenant = Tenant.find(1)\nTenancy.delete(tenant)\n```\n\n**Connections**\n\n```python\nfrom multitenancy.facades import Tenancy\n\n# setting tenant specific connection\ntenant = Tenant.find(1)\nTenancy.set_connection(tenant)\n\n# resetting to default connection\nTenancy.reset_connection()\n```\n\nEvent though above approach can be used to set tenant specific connection, and do tenant related tasks, it's recommended to use `TenantContext` instead.\n\n### Using Tenant Context\n\nYou might sometime need to get data from different tenant in your application or you might have to do some logic based on tenant. In this case you can use `TenantContext` class to get tenant data.\n\n```python\nfrom multitenancy.contexts import TenantContext\nfrom multitenancy.models.Tenant import Tenant\n\ntenant = Tenant.where('name', '=', 'tenant1').first()\n\nwith TenantContext(tenant=tenant):\n    # do something with tenant1 data\n    # ...\n```\n\nYou can also do all other tenant specific tasks like: `migrations`, `seeds`.\n\n```python\nfrom multitenancy.contexts import TenantContext\nfrom multitenancy.models.Tenant import Tenant\n\ntenant = Tenant.where('name', '=', 'tenant1').first()\n\nwith TenantContext(tenant=tenant) as ctx:\n    # migrate the database\n    ctx.migrate()\n    ctx.migrate_refresh()\n    ctx.migrate_rollback()\n    ctx.migrate_reset()\n    ctx.migrate_status()\n\n    # seed the database\n    ctx.seed()\n```\n\n### Final Step\n\nNow the multitenancy is almost ready to use. The final step is to make use of tenancy middleware. This middleware will be used to specify tenant in request on the fly. So, basically you have to attach this middleware to all the routes that are tenant aware.\n\n```python\n# config/routes.py\n# ...\n\nRoute.get(\"/\", \"WelcomeController@show\")\nRoute.get(\"/tenant-aware-routes\", \"WelcomeController@show\").middleware(\"multitenancy\")\n```\n\nIn above example, `/tenant-aware-routes` will be tenant aware. It means that if you have tenant setup and you are trying to access `/tenant-aware-routes` then you will get tenant specific items from the database.\n\n### TODO\n\n- [x] Different database server for each tenant\n\n### Contributing\n\nPlease read the [Contributing Documentation](CONTRIBUTING.md) here.\n\n### Maintainers\n\n- [x] [Yubaraj Shrestha](https://www.github.com/yubarajshrestha)\n\n### License\n\nmultitenancy is open-sourced software licensed under the [MIT license](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpy-package%2Fmasonite-multitenancy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpy-package%2Fmasonite-multitenancy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpy-package%2Fmasonite-multitenancy/lists"}