From b2837d22a95061ead614598d8203865e6c6a09ee Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Fri, 3 Jul 2026 11:36:18 +0530 Subject: [PATCH 01/25] [ADD] estate: bare-minimum structure to make module -by following guide of odoo 19.0 docs chapter 2 --- .gitignore | 3 +++ estate/__init__.py | 0 estate/__manifest__.py | 4 ++++ 3 files changed, 7 insertions(+) create mode 100644 estate/__init__.py create mode 100644 estate/__manifest__.py diff --git a/.gitignore b/.gitignore index b6e47617de1..10840bf7e45 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,6 @@ dmypy.json # Pyre type checker .pyre/ + +#estate +estate/.idea/ diff --git a/estate/__init__.py b/estate/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/estate/__manifest__.py b/estate/__manifest__.py new file mode 100644 index 00000000000..efb0e81e78b --- /dev/null +++ b/estate/__manifest__.py @@ -0,0 +1,4 @@ +{ + 'name': "estate", + 'depends': ["base_setup"] +} From 7b8a6fe919b478680a95d94319aba771ff7f23da Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Fri, 3 Jul 2026 15:48:33 +0530 Subject: [PATCH 02/25] [IMP] estate: basic model for estate module --- estate/models/__init__.py | 0 estate/models/estate.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 estate/models/__init__.py create mode 100644 estate/models/estate.py diff --git a/estate/models/__init__.py b/estate/models/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/estate/models/estate.py b/estate/models/estate.py new file mode 100644 index 00000000000..e69de29bb2d From 82e58997da4fe2e4b4999f291c72dc615a681d22 Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Fri, 3 Jul 2026 17:07:40 +0530 Subject: [PATCH 03/25] [IMP] estate: add ir.model.access.csv file for security of access rights --- estate/security/ir.model.access.csv | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 estate/security/ir.model.access.csv diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv new file mode 100644 index 00000000000..e69de29bb2d From 01ff0fe3b353f2d6df429a35b9dd4371b0fa3391 Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Fri, 3 Jul 2026 17:20:03 +0530 Subject: [PATCH 04/25] [FIX] estate: update missing properties in manifest --- estate/__init__.py | 1 + estate/__manifest__.py | 9 +++++++-- estate/models/__init__.py | 1 + estate/models/estate.py | 13 +++++++++++++ estate/security/ir.model.access.csv | 2 ++ 5 files changed, 24 insertions(+), 2 deletions(-) diff --git a/estate/__init__.py b/estate/__init__.py index e69de29bb2d..9a7e03eded3 100644 --- a/estate/__init__.py +++ b/estate/__init__.py @@ -0,0 +1 @@ +from . import models \ No newline at end of file diff --git a/estate/__manifest__.py b/estate/__manifest__.py index efb0e81e78b..938ce86baa1 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,4 +1,9 @@ { - 'name': "estate", - 'depends': ["base_setup"] + "name": "estate", + "depends": ["base_setup"], + "author": "Havit", + "license": "LGPL-3", + "data": [ + "security/ir.model.access.csv", + ], } diff --git a/estate/models/__init__.py b/estate/models/__init__.py index e69de29bb2d..824d8713100 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -0,0 +1 @@ +from . import estate \ No newline at end of file diff --git a/estate/models/estate.py b/estate/models/estate.py index e69de29bb2d..6ec68837ed3 100644 --- a/estate/models/estate.py +++ b/estate/models/estate.py @@ -0,0 +1,13 @@ +from odoo import models, fields + + +class Estate(models.Model): + _name = "estate" + _description = "Real Estate Module" + + # fields + name = fields.Char(required=True) + description = fields.Text() + date = fields.Datetime(readonly=True) + + garden_area = fields.Selection(string="Type", selection=[("e", "w")]) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index e69de29bb2d..b3d4b09271f 100644 --- a/estate/security/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink +access_estate,access_estate,model_estate,base.group_user,1,1,1,1 \ No newline at end of file From 385eb6233057c4dba95ee3ebfd91662cfb971867 Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Fri, 3 Jul 2026 17:41:45 +0530 Subject: [PATCH 05/25] [LINT] estate: add new line to fix type check errors --- estate/__init__.py | 2 +- estate/models/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/estate/__init__.py b/estate/__init__.py index 9a7e03eded3..0650744f6bc 100644 --- a/estate/__init__.py +++ b/estate/__init__.py @@ -1 +1 @@ -from . import models \ No newline at end of file +from . import models diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 824d8713100..e4f59229d23 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1 @@ -from . import estate \ No newline at end of file +from . import estate From fa64dd8e3de30824f82bf2a277a4ad8768559334 Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Tue, 7 Jul 2026 10:30:50 +0530 Subject: [PATCH 06/25] [IMP] estate: add Pyright and Odoo LS configs Introduce configuration files for Pyright and the Odoo Language Server directly inside the addon to optimize the development workflow. - for zed --- .gitignore | 5 +---- estate/odools.toml | 9 +++++++++ estate/pyrightconfig.json | 7 +++++++ 3 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 estate/odools.toml create mode 100644 estate/pyrightconfig.json diff --git a/.gitignore b/.gitignore index 10840bf7e45..9fe17bcebb3 100644 --- a/.gitignore +++ b/.gitignore @@ -126,7 +126,4 @@ venv.bak/ dmypy.json # Pyre type checker -.pyre/ - -#estate -estate/.idea/ +.pyre/ \ No newline at end of file diff --git a/estate/odools.toml b/estate/odools.toml new file mode 100644 index 00000000000..d0f84c9dfab --- /dev/null +++ b/estate/odools.toml @@ -0,0 +1,9 @@ +[[config]] +name = "default" +odoo_path = "/home/odoo/odoo19/community" +addons_paths = [ + "/home/odoo/odoo19/community/addons", + "/home/odoo/odoo19/enterprise", + "//home/odoo/odoo19/tutorials" +] +python_path = "python3" diff --git a/estate/pyrightconfig.json b/estate/pyrightconfig.json new file mode 100644 index 00000000000..4cc4e0980d9 --- /dev/null +++ b/estate/pyrightconfig.json @@ -0,0 +1,7 @@ +{ + "extraPaths": ["../../community"], + "typeCheckingMode": "basic", + "reportPrivateLocalImportUsage": "none", + "reportUnannotatedClassAttribute": "none", + "reportArgumentType": "none", +} From 7fa4c951e5b2de127239cdf9eeb421f301aef655 Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Tue, 7 Jul 2026 10:44:04 +0530 Subject: [PATCH 07/25] [IMP] estate: add missing fields to Estate Model --- estate/models/estate.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/estate/models/estate.py b/estate/models/estate.py index 6ec68837ed3..ef3e7dd7ce4 100644 --- a/estate/models/estate.py +++ b/estate/models/estate.py @@ -1,4 +1,4 @@ -from odoo import models, fields +from odoo import fields, models class Estate(models.Model): @@ -8,6 +8,21 @@ class Estate(models.Model): # fields name = fields.Char(required=True) description = fields.Text() - date = fields.Datetime(readonly=True) - - garden_area = fields.Selection(string="Type", selection=[("e", "w")]) + postcode = fields.Char() + date_availability = fields.Date() + expected_price = fields.Float() + selling_price = fields.Float() + bedrooms = fields.Integer() + living_area = fields.Integer() + facades = fields.Integer() + garage = fields.Boolean() + garden = fields.Boolean() + garden_area = fields.Integer() + garden_orientation = fields.Selection( + selection=[ + ("north", "North"), + ("south", "South"), + ("east", "East"), + ("west", "West"), + ] + ) From 1b44b46382e7c77cddf9d9a8680178c82e2018cc Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Tue, 7 Jul 2026 12:57:25 +0530 Subject: [PATCH 08/25] [IMP] estate: add views(actions) & menus - action defined in estate_views.xml and linked with esate model - three level menus added using nested menuitem element - updated manifest to include menus & views files --- estate/__manifest__.py | 4 +++- estate/views/estate_menus.xml | 7 +++++++ estate/views/estate_views.xml | 7 +++++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 estate/views/estate_menus.xml create mode 100644 estate/views/estate_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 938ce86baa1..f234e221e49 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,9 +1,11 @@ -{ +{ # pyright: ignore[reportUnusedExpression] "name": "estate", "depends": ["base_setup"], "author": "Havit", "license": "LGPL-3", "data": [ "security/ir.model.access.csv", + "views/estate_views.xml", + "views/estate_menus.xml", ], } diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml new file mode 100644 index 00000000000..1231c054746 --- /dev/null +++ b/estate/views/estate_menus.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/estate/views/estate_views.xml b/estate/views/estate_views.xml new file mode 100644 index 00000000000..3bf3dc9d2d0 --- /dev/null +++ b/estate/views/estate_views.xml @@ -0,0 +1,7 @@ + + + Estate + estate + list,form + + From e68219c715c7207aa42b5662a9ceeb5b97faed44 Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Tue, 7 Jul 2026 17:59:31 +0530 Subject: [PATCH 09/25] [IMP] estate: set default values and other field customizations - set default value in date_availability (3 months from current date) - set selling_price to readonly - bedrooms have now default value of 2 --- estate/models/estate.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/estate/models/estate.py b/estate/models/estate.py index ef3e7dd7ce4..b67e0f25fd7 100644 --- a/estate/models/estate.py +++ b/estate/models/estate.py @@ -1,3 +1,4 @@ +from dateutil.relativedelta import relativedelta from odoo import fields, models @@ -9,10 +10,12 @@ class Estate(models.Model): name = fields.Char(required=True) description = fields.Text() postcode = fields.Char() - date_availability = fields.Date() + date_availability = fields.Date( + default=lambda self: fields.Date.today() + relativedelta(months=3) + ) expected_price = fields.Float() - selling_price = fields.Float() - bedrooms = fields.Integer() + selling_price = fields.Float(readonly=True, copy=False) + bedrooms = fields.Integer(default=2) living_area = fields.Integer() facades = fields.Integer() garage = fields.Boolean() From c2960880194b20a1872d7ab5227a369d8b457451 Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Tue, 7 Jul 2026 18:18:11 +0530 Subject: [PATCH 10/25] [IMP] estate: add state(selection) & active(bool) fields --- estate/models/estate.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/estate/models/estate.py b/estate/models/estate.py index b67e0f25fd7..250435dc3ec 100644 --- a/estate/models/estate.py +++ b/estate/models/estate.py @@ -29,3 +29,16 @@ class Estate(models.Model): ("west", "West"), ] ) + state = fields.Selection( + selection=[ + ("new", "New"), + ("offer_received", "Offer Received"), + ("offer_accepted", "Offer Accepted"), + ("sold", "Sold"), + ("cancelled", "Cancelled"), + ], + required=True, + copy=False, + default="new", + ) + active = fields.Boolean(default=True) From 8003e01e371c8f51fef7f6ed24db6f2400c0175d Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Tue, 7 Jul 2026 18:43:43 +0530 Subject: [PATCH 11/25] [IMP] estate: add list view - uses some useful fields from estate model --- estate/views/estate_views.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/estate/views/estate_views.xml b/estate/views/estate_views.xml index 3bf3dc9d2d0..53b83f33c10 100644 --- a/estate/views/estate_views.xml +++ b/estate/views/estate_views.xml @@ -4,4 +4,22 @@ estate list,form + + + Estate List + estate + + + + + + + + + + + + + + From 2e5fe6a419ec07b1d3533558cdd4938de1816ccd Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Tue, 7 Jul 2026 19:09:32 +0530 Subject: [PATCH 12/25] [IMP] estate: update form ui - define form_view in views xml --- estate/views/estate_views.xml | 38 +++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/estate/views/estate_views.xml b/estate/views/estate_views.xml index 53b83f33c10..6158d4db059 100644 --- a/estate/views/estate_views.xml +++ b/estate/views/estate_views.xml @@ -22,4 +22,42 @@ + + Estate Form + estate + +
+ +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ From 9738b9b2b4c214535613b0deea7f3375445ea867 Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Wed, 8 Jul 2026 12:49:24 +0530 Subject: [PATCH 13/25] [IMP] estate: add search shortcuts, filters & groupBy - searchbar now suggests search in different fields when user types. - filter using availability based on state - groupBy based on Postcode - addon PATH correction in odools.toml --- estate/odools.toml | 2 +- estate/views/estate_views.xml | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/estate/odools.toml b/estate/odools.toml index d0f84c9dfab..109333b8646 100644 --- a/estate/odools.toml +++ b/estate/odools.toml @@ -4,6 +4,6 @@ odoo_path = "/home/odoo/odoo19/community" addons_paths = [ "/home/odoo/odoo19/community/addons", "/home/odoo/odoo19/enterprise", - "//home/odoo/odoo19/tutorials" + "/home/odoo/odoo19/tutorials" ] python_path = "python3" diff --git a/estate/views/estate_views.xml b/estate/views/estate_views.xml index 6158d4db059..e662889cce2 100644 --- a/estate/views/estate_views.xml +++ b/estate/views/estate_views.xml @@ -60,4 +60,29 @@ + + Estate Search + estate + + + + + + + + + + + + + + From 5e1106a056d469a3c892eaaa04e54eabab16774b Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Thu, 9 Jul 2026 10:36:34 +0530 Subject: [PATCH 14/25] [IMP] estate: add missing fields in views - active & state added to view --- estate/views/estate_views.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/estate/views/estate_views.xml b/estate/views/estate_views.xml index e662889cce2..bdeb0806acc 100644 --- a/estate/views/estate_views.xml +++ b/estate/views/estate_views.xml @@ -35,10 +35,12 @@ + + From 95767ec45d2947a6fa7988771e267aed75acadc2 Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Thu, 9 Jul 2026 12:56:50 +0530 Subject: [PATCH 15/25] [IMP] estate: add Drizzle Studio for local database viewing - Improves devEx for DB Viewer - Isolated tool for local use only, does not affect the estate addon --- estate/postgres-studio/.gitignore | 36 ++++ estate/postgres-studio/README.md | 15 ++ estate/postgres-studio/bun.lock | 237 +++++++++++++++++++++++ estate/postgres-studio/drizzle.config.ts | 9 + estate/postgres-studio/index.ts | 1 + estate/postgres-studio/package.json | 21 ++ estate/postgres-studio/tsconfig.json | 30 +++ 7 files changed, 349 insertions(+) create mode 100644 estate/postgres-studio/.gitignore create mode 100644 estate/postgres-studio/README.md create mode 100644 estate/postgres-studio/bun.lock create mode 100644 estate/postgres-studio/drizzle.config.ts create mode 100644 estate/postgres-studio/index.ts create mode 100644 estate/postgres-studio/package.json create mode 100644 estate/postgres-studio/tsconfig.json diff --git a/estate/postgres-studio/.gitignore b/estate/postgres-studio/.gitignore new file mode 100644 index 00000000000..56d686aca1b --- /dev/null +++ b/estate/postgres-studio/.gitignore @@ -0,0 +1,36 @@ +# dependencies (bun install) +node_modules + +# output +out +dist +*.tgz + +# code coverage +coverage +*.lcov + +# logs +logs +_.log +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# caches +.eslintcache +.cache +*.tsbuildinfo + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store + +drizzle diff --git a/estate/postgres-studio/README.md b/estate/postgres-studio/README.md new file mode 100644 index 00000000000..a607479f545 --- /dev/null +++ b/estate/postgres-studio/README.md @@ -0,0 +1,15 @@ +# postgres-studio + +To install dependencies: + +```bash +bun install +``` + +To run: + +```bash +bun run index.ts +``` + +This project was created using `bun init` in bun v1.3.14. [Bun](https://bun.com) is a fast all-in-one JavaScript runtime. diff --git a/estate/postgres-studio/bun.lock b/estate/postgres-studio/bun.lock new file mode 100644 index 00000000000..77aca64ede6 --- /dev/null +++ b/estate/postgres-studio/bun.lock @@ -0,0 +1,237 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "postgres-studio", + "dependencies": { + "drizzle-orm": "^0.45.2", + "pg": "^8.22.0", + }, + "devDependencies": { + "@types/bun": "latest", + "drizzle-kit": "^0.31.10", + }, + "peerDependencies": { + "typescript": "^5", + }, + }, + }, + "packages": { + "@drizzle-team/brocli": ["@drizzle-team/brocli@0.10.2", "", {}, "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w=="], + + "@esbuild-kit/core-utils": ["@esbuild-kit/core-utils@3.3.2", "", { "dependencies": { "esbuild": "~0.18.20", "source-map-support": "^0.5.21" } }, "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ=="], + + "@esbuild-kit/esm-loader": ["@esbuild-kit/esm-loader@2.6.5", "", { "dependencies": { "@esbuild-kit/core-utils": "^3.3.2", "get-tsconfig": "^4.7.0" } }, "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], + + "@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="], + + "@types/node": ["@types/node@26.1.1", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="], + + "drizzle-kit": ["drizzle-kit@0.31.10", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.25.4", "tsx": "^4.21.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw=="], + + "drizzle-orm": ["drizzle-orm@0.45.2", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "prisma": "*", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "prisma", "sql.js", "sqlite3"] }, "sha512-kY0BSaTNYWnoDMVoyY8uxmyHjpJW1geOmBMdSSicKo9CIIWkSxMIj2rkeSR51b8KAPB7m+qysjuHme5nKP+E5Q=="], + + "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "get-tsconfig": ["get-tsconfig@4.14.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA=="], + + "pg": ["pg@8.22.0", "", { "dependencies": { "pg-connection-string": "^2.14.0", "pg-pool": "^3.14.0", "pg-protocol": "^1.15.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.4.0" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-8wih1vVIBMxoUM2oB4soJsD9tDnDpLv4OXBJ+EJzFsvycD+lfyIreC2gGHq78f8jbLLt+bvlPTFdFZfJkOuzAA=="], + + "pg-cloudflare": ["pg-cloudflare@1.4.0", "", {}, "sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A=="], + + "pg-connection-string": ["pg-connection-string@2.14.0", "", {}, "sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg=="], + + "pg-int8": ["pg-int8@1.0.1", "", {}, "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="], + + "pg-pool": ["pg-pool@3.14.0", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw=="], + + "pg-protocol": ["pg-protocol@1.15.0", "", {}, "sha512-cq9sECI5s0+uPUXjbz8ioyPJni6RzsRib0US67i5IoTZKw8fNeYlVE7u8F4dG7vEJJtc5wdD1K189lCCUwqWTQ=="], + + "pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], + + "pgpass": ["pgpass@1.0.5", "", { "dependencies": { "split2": "^4.1.0" } }, "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug=="], + + "postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], + + "postgres-bytea": ["postgres-bytea@1.0.1", "", {}, "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ=="], + + "postgres-date": ["postgres-date@1.0.7", "", {}, "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="], + + "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], + + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], + + "tsx": ["tsx@4.23.0", "", { "dependencies": { "esbuild": "~0.28.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-eUdUIaCr963q2h5u3+QwvYp0+eqPvn+egeqZUm0hwERCqqx1E3kK5ehbGCvqSE5MQAULr67ww0cA3jKc3YkM1w=="], + + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], + + "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], + + "@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="], + + "tsx/esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.18.20", "", { "os": "android", "cpu": "arm64" }, "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.18.20", "", { "os": "android", "cpu": "x64" }, "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.18.20", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.18.20", "", { "os": "darwin", "cpu": "x64" }, "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.18.20", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.18.20", "", { "os": "freebsd", "cpu": "x64" }, "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.18.20", "", { "os": "linux", "cpu": "arm" }, "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.18.20", "", { "os": "linux", "cpu": "arm64" }, "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.18.20", "", { "os": "linux", "cpu": "ia32" }, "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.18.20", "", { "os": "linux", "cpu": "ppc64" }, "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.18.20", "", { "os": "linux", "cpu": "s390x" }, "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.18.20", "", { "os": "linux", "cpu": "x64" }, "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.18.20", "", { "os": "none", "cpu": "x64" }, "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.18.20", "", { "os": "openbsd", "cpu": "x64" }, "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.18.20", "", { "os": "sunos", "cpu": "x64" }, "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.18.20", "", { "os": "win32", "cpu": "arm64" }, "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.18.20", "", { "os": "win32", "cpu": "ia32" }, "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g=="], + + "@esbuild-kit/core-utils/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="], + + "tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ=="], + + "tsx/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.28.1", "", { "os": "android", "cpu": "arm" }, "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ=="], + + "tsx/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.1", "", { "os": "android", "cpu": "arm64" }, "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg=="], + + "tsx/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.28.1", "", { "os": "android", "cpu": "x64" }, "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng=="], + + "tsx/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q=="], + + "tsx/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ=="], + + "tsx/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw=="], + + "tsx/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ=="], + + "tsx/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.1", "", { "os": "linux", "cpu": "arm" }, "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ=="], + + "tsx/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g=="], + + "tsx/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w=="], + + "tsx/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg=="], + + "tsx/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ=="], + + "tsx/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ=="], + + "tsx/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ=="], + + "tsx/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag=="], + + "tsx/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.1", "", { "os": "linux", "cpu": "x64" }, "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA=="], + + "tsx/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw=="], + + "tsx/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.1", "", { "os": "none", "cpu": "x64" }, "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg=="], + + "tsx/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q=="], + + "tsx/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw=="], + + "tsx/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg=="], + + "tsx/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ=="], + + "tsx/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA=="], + + "tsx/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg=="], + + "tsx/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A=="], + } +} diff --git a/estate/postgres-studio/drizzle.config.ts b/estate/postgres-studio/drizzle.config.ts new file mode 100644 index 00000000000..8bcf3f27c54 --- /dev/null +++ b/estate/postgres-studio/drizzle.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from "drizzle-kit"; + +export default defineConfig({ + dialect: "postgresql", + dbCredentials: { + url: process.env.DATABASE_URL!, + }, + out: "./drizzle", +}); diff --git a/estate/postgres-studio/index.ts b/estate/postgres-studio/index.ts new file mode 100644 index 00000000000..f67b2c6454e --- /dev/null +++ b/estate/postgres-studio/index.ts @@ -0,0 +1 @@ +console.log("Hello via Bun!"); \ No newline at end of file diff --git a/estate/postgres-studio/package.json b/estate/postgres-studio/package.json new file mode 100644 index 00000000000..dda487966d9 --- /dev/null +++ b/estate/postgres-studio/package.json @@ -0,0 +1,21 @@ +{ + "name": "postgres-studio", + "module": "index.ts", + "type": "module", + "private": true, + "scripts": { + "studio": "drizzle-kit studio", + "studio:pull": "drizzle-kit pull && drizzle-kit studio" + }, + "devDependencies": { + "@types/bun": "latest", + "drizzle-kit": "^0.31.10" + }, + "peerDependencies": { + "typescript": "^5" + }, + "dependencies": { + "drizzle-orm": "^0.45.2", + "pg": "^8.22.0" + } +} diff --git a/estate/postgres-studio/tsconfig.json b/estate/postgres-studio/tsconfig.json new file mode 100644 index 00000000000..b2e7497d897 --- /dev/null +++ b/estate/postgres-studio/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + // Environment setup & latest features + "lib": ["ESNext"], + "target": "ESNext", + "module": "Preserve", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + "types": ["bun"], + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} From a75e2984d59b84fefef83d8aa4625563dc772ce0 Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Mon, 13 Jul 2026 15:58:19 +0530 Subject: [PATCH 16/25] [IMP] estate: New model estate.type is added to use as type of estate - linked as Many2one field - add access config in access file for new model --- estate/models/__init__.py | 1 + estate/models/estate.py | 1 + estate/models/estate_type.py | 8 ++++++++ estate/security/ir.model.access.csv | 3 ++- estate/views/estate_menus.xml | 3 +++ estate/views/estate_views.xml | 12 +++++++++++- 6 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 estate/models/estate_type.py diff --git a/estate/models/__init__.py b/estate/models/__init__.py index e4f59229d23..34f6e632605 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1,2 @@ from . import estate +from . import estate_type diff --git a/estate/models/estate.py b/estate/models/estate.py index 250435dc3ec..9ab2b73862f 100644 --- a/estate/models/estate.py +++ b/estate/models/estate.py @@ -42,3 +42,4 @@ class Estate(models.Model): default="new", ) active = fields.Boolean(default=True) + estate_type_id = fields.Many2one("estate.type", string="Estate Type") diff --git a/estate/models/estate_type.py b/estate/models/estate_type.py new file mode 100644 index 00000000000..f05618a19ce --- /dev/null +++ b/estate/models/estate_type.py @@ -0,0 +1,8 @@ +from odoo import models, fields + + +class EstateType(models.Model): + _name = 'estate.type' + _description = 'Estate Type' + + name = fields.Char(string='Name', required=True) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index b3d4b09271f..d1503129f6a 100644 --- a/estate/security/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -1,2 +1,3 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink -access_estate,access_estate,model_estate,base.group_user,1,1,1,1 \ No newline at end of file +access_estate,access_estate,model_estate,base.group_user,1,1,1,1 +access_estate_type,access_estate_type,model_estate_type,base.group_user,1,1,1,1 diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml index 1231c054746..97e4348ca69 100644 --- a/estate/views/estate_menus.xml +++ b/estate/views/estate_menus.xml @@ -3,5 +3,8 @@ + + + diff --git a/estate/views/estate_views.xml b/estate/views/estate_views.xml index bdeb0806acc..986baf4c9b5 100644 --- a/estate/views/estate_views.xml +++ b/estate/views/estate_views.xml @@ -1,10 +1,18 @@ + Estate estate list,form + + + Estate Types + estate.type + list,form + + Estate List estate @@ -18,6 +26,7 @@ + @@ -33,9 +42,9 @@ + - @@ -73,6 +82,7 @@ + Date: Mon, 13 Jul 2026 17:32:43 +0530 Subject: [PATCH 17/25] [IMP] estate: add buyer & seller to model and view --- estate/models/estate.py | 2 ++ estate/views/estate_views.xml | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/estate/models/estate.py b/estate/models/estate.py index 9ab2b73862f..fee14b60aa2 100644 --- a/estate/models/estate.py +++ b/estate/models/estate.py @@ -43,3 +43,5 @@ class Estate(models.Model): ) active = fields.Boolean(default=True) estate_type_id = fields.Many2one("estate.type", string="Estate Type") + seller_id = fields.Many2one("res.users", string="Seller", default=lambda self: self.env.user) + buyer_id = fields.Many2one("res.partner", string="Buyer", copy=False) diff --git a/estate/views/estate_views.xml b/estate/views/estate_views.xml index 986baf4c9b5..6f3636c27a0 100644 --- a/estate/views/estate_views.xml +++ b/estate/views/estate_views.xml @@ -65,6 +65,12 @@ + + + + + + From c04603a85409313246ac92fd2cc8f5c03fbe25cd Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Mon, 13 Jul 2026 18:13:01 +0530 Subject: [PATCH 18/25] [IMP] estate: add estate.tag model for tags - linked with estate using many2many --- estate/models/__init__.py | 1 + estate/models/estate.py | 1 + estate/models/estate_tag.py | 8 ++++++++ estate/security/ir.model.access.csv | 1 + estate/views/estate_menus.xml | 3 ++- estate/views/estate_views.xml | 11 +++++++++++ 6 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 estate/models/estate_tag.py diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 34f6e632605..735b2a1d54c 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1,2 +1,3 @@ from . import estate from . import estate_type +from . import estate_tag diff --git a/estate/models/estate.py b/estate/models/estate.py index fee14b60aa2..dc60c62883e 100644 --- a/estate/models/estate.py +++ b/estate/models/estate.py @@ -45,3 +45,4 @@ class Estate(models.Model): estate_type_id = fields.Many2one("estate.type", string="Estate Type") seller_id = fields.Many2one("res.users", string="Seller", default=lambda self: self.env.user) buyer_id = fields.Many2one("res.partner", string="Buyer", copy=False) + tag_ids = fields.Many2many("estate.tag", string="Tags") diff --git a/estate/models/estate_tag.py b/estate/models/estate_tag.py new file mode 100644 index 00000000000..7ca15840be2 --- /dev/null +++ b/estate/models/estate_tag.py @@ -0,0 +1,8 @@ +from odoo import models, fields + + +class EstateTag(models.Model): + _name = 'estate.tag' + _description = 'Estate Tag' + + name = fields.Char(string='Name', required=True) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index d1503129f6a..199ebaacdd0 100644 --- a/estate/security/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -1,3 +1,4 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink access_estate,access_estate,model_estate,base.group_user,1,1,1,1 access_estate_type,access_estate_type,model_estate_type,base.group_user,1,1,1,1 +access_estate_tag,access_estate_tag,model_estate_tag,base.group_user,1,1,1,1 diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml index 97e4348ca69..c1b25d2f810 100644 --- a/estate/views/estate_menus.xml +++ b/estate/views/estate_menus.xml @@ -3,8 +3,9 @@ - + + diff --git a/estate/views/estate_views.xml b/estate/views/estate_views.xml index 6f3636c27a0..16ee1b25b59 100644 --- a/estate/views/estate_views.xml +++ b/estate/views/estate_views.xml @@ -13,6 +13,13 @@ list,form + + Estate Tags + estate.tag + list,form + + + Estate List estate @@ -40,6 +47,10 @@

+

+ +

+ From 563474206d5c6be4cfec64b68186abe470f13ffb Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Mon, 13 Jul 2026 19:08:59 +0530 Subject: [PATCH 19/25] [IMP] estate: add estate.offer model - adds offers page (tab) to estate form view - linked using one2many field [property_id (many2one) from estate.offer] --- estate/__manifest__.py | 1 + estate/models/__init__.py | 1 + estate/models/estate.py | 1 + estate/models/estate_offer.py | 14 +++++++++++++ estate/security/ir.model.access.csv | 1 + estate/views/estate_offers.xml | 31 +++++++++++++++++++++++++++++ estate/views/estate_views.xml | 4 +++- 7 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 estate/models/estate_offer.py create mode 100644 estate/views/estate_offers.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index f234e221e49..212a8194f3c 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -6,6 +6,7 @@ "data": [ "security/ir.model.access.csv", "views/estate_views.xml", + "views/estate_offers.xml", "views/estate_menus.xml", ], } diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 735b2a1d54c..3594f80054a 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1,3 +1,4 @@ from . import estate from . import estate_type from . import estate_tag +from . import estate_offer diff --git a/estate/models/estate.py b/estate/models/estate.py index dc60c62883e..d5063b80559 100644 --- a/estate/models/estate.py +++ b/estate/models/estate.py @@ -46,3 +46,4 @@ class Estate(models.Model): seller_id = fields.Many2one("res.users", string="Seller", default=lambda self: self.env.user) buyer_id = fields.Many2one("res.partner", string="Buyer", copy=False) tag_ids = fields.Many2many("estate.tag", string="Tags") + offer_ids = fields.One2many("estate.offer", "property_id", string="Offers") diff --git a/estate/models/estate_offer.py b/estate/models/estate_offer.py new file mode 100644 index 00000000000..88a23d67050 --- /dev/null +++ b/estate/models/estate_offer.py @@ -0,0 +1,14 @@ +from odoo import models, fields + + +class EstateOffer(models.Model): + _name = 'estate.offer' + _description = 'Estate Offer' + + price = fields.Float() + status = fields.Selection( + selection=[('accepted', 'Accepted'), ('refused', 'Refused')], + copy=False, + ) + partner_id = fields.Many2one('res.partner', required=True) + property_id = fields.Many2one('estate', required=True) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 199ebaacdd0..9abe1f33c55 100644 --- a/estate/security/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -2,3 +2,4 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink access_estate,access_estate,model_estate,base.group_user,1,1,1,1 access_estate_type,access_estate_type,model_estate_type,base.group_user,1,1,1,1 access_estate_tag,access_estate_tag,model_estate_tag,base.group_user,1,1,1,1 +access_estate_offer,access_estate_offer,model_estate_offer,base.group_user,1,1,1,1 diff --git a/estate/views/estate_offers.xml b/estate/views/estate_offers.xml new file mode 100644 index 00000000000..dc2277e1565 --- /dev/null +++ b/estate/views/estate_offers.xml @@ -0,0 +1,31 @@ + + + + Estate Offer List + estate.offer + + + + + + + + + + + Estate Offer Form + estate.offer + +
+ + + + + + + +
+
+
+ +
diff --git a/estate/views/estate_views.xml b/estate/views/estate_views.xml index 16ee1b25b59..1fe78204dfa 100644 --- a/estate/views/estate_views.xml +++ b/estate/views/estate_views.xml @@ -19,7 +19,6 @@ list,form
- Estate List estate @@ -76,6 +75,9 @@ + + + From f315778bc2d4abee007e90f47521e2de2075517c Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Tue, 14 Jul 2026 18:38:25 +0530 Subject: [PATCH 20/25] [IMP] estate: add total_area computed field - using @api.depends - docs suggest to use loop but as we set store=True this makes total_area stored in db every time. - user can only create or edit one field at time and this true for both list view and form also so we have always one record to compute --- estate/models/estate.py | 7 ++++++- estate/views/estate_views.xml | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/estate/models/estate.py b/estate/models/estate.py index d5063b80559..e8faf7d27fa 100644 --- a/estate/models/estate.py +++ b/estate/models/estate.py @@ -1,5 +1,5 @@ from dateutil.relativedelta import relativedelta -from odoo import fields, models +from odoo import api, fields, models class Estate(models.Model): @@ -47,3 +47,8 @@ class Estate(models.Model): buyer_id = fields.Many2one("res.partner", string="Buyer", copy=False) tag_ids = fields.Many2many("estate.tag", string="Tags") offer_ids = fields.One2many("estate.offer", "property_id", string="Offers") + total_area = fields.Integer(compute="_compute_total_area", store=True) + + @api.depends("living_area", "garden_area") + def _compute_total_area(self): + self[0].total_area = self[0].living_area + self[0].garden_area diff --git a/estate/views/estate_views.xml b/estate/views/estate_views.xml index 1fe78204dfa..74d4772f3eb 100644 --- a/estate/views/estate_views.xml +++ b/estate/views/estate_views.xml @@ -23,7 +23,7 @@ Estate List estate - + @@ -33,6 +33,7 @@ + @@ -73,6 +74,7 @@ + From 9c95d3d27f3a2e613faa8a8993d116a7b1ca763d Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Wed, 15 Jul 2026 10:20:25 +0530 Subject: [PATCH 21/25] [FIX] estate: use for-loop for compute total - in f315778bc2d4abee007e90f47521e2de2075517c when we duplicate 1+ records or import 1+records we have multipale records to compute and without loop only able to calaculate first record so fix this now using for-loop which fixs this (also suggested in docs) --- estate/models/estate.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/estate/models/estate.py b/estate/models/estate.py index e8faf7d27fa..1d10bab9f22 100644 --- a/estate/models/estate.py +++ b/estate/models/estate.py @@ -51,4 +51,5 @@ class Estate(models.Model): @api.depends("living_area", "garden_area") def _compute_total_area(self): - self[0].total_area = self[0].living_area + self[0].garden_area + for record in self: + record.total_area = record.living_area + record.garden_area From 9d82971bbd443729711d25defbe6ff502b0846ab Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Wed, 22 Jul 2026 18:34:39 +0530 Subject: [PATCH 22/25] [FIX] estate: correction 'base_setup' -> 'base' in dependency - base_setup used for intial config of new database (in all previous commits used 'base_setup' which also has dependency on 'base' so we did't get any errors but 'base' is not added as direct dependency to this module, which is required to update this module when 'base' is updated). - 'base_setup' was added as a dependency by mistake in previous commits. --- estate/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 212a8194f3c..07fda50eebe 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { # pyright: ignore[reportUnusedExpression] "name": "estate", - "depends": ["base_setup"], + "depends": ["base"], "author": "Havit", "license": "LGPL-3", "data": [ From 48671cd0c04dad27309b2e7fb2347138959a10e7 Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Mon, 27 Jul 2026 19:01:27 +0530 Subject: [PATCH 23/25] [IMP] estate: add best_offer computed field - retreving offer's amount using mapped method - updated view to include best_offer field - debug.json for zen debugger --- estate/.zed/debug.json | 17 +++++++++++++++++ estate/models/estate.py | 6 ++++++ estate/views/estate_views.xml | 6 +++--- 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 estate/.zed/debug.json diff --git a/estate/.zed/debug.json b/estate/.zed/debug.json new file mode 100644 index 00000000000..08c2970492e --- /dev/null +++ b/estate/.zed/debug.json @@ -0,0 +1,17 @@ +[ + { + "label": "Debug Odoo: rd-demo", + "adapter": "Debugpy", + "request": "launch", + "python": "/home/odoo/odoo19/community/.venv/bin/python", + "program": "/home/odoo/odoo19/community/odoo-bin", + "cwd": "/home/odoo/odoo19/community", + "args": [ + "--addons-path=addons,../enterprise/,../tutorials/", + "-d", + "rd-demo", + "-u", + "estate" + ] + } +] diff --git a/estate/models/estate.py b/estate/models/estate.py index 1d10bab9f22..174c6fb986a 100644 --- a/estate/models/estate.py +++ b/estate/models/estate.py @@ -48,8 +48,14 @@ class Estate(models.Model): tag_ids = fields.Many2many("estate.tag", string="Tags") offer_ids = fields.One2many("estate.offer", "property_id", string="Offers") total_area = fields.Integer(compute="_compute_total_area", store=True) + best_offer = fields.Float(compute="_compute_best_offer") @api.depends("living_area", "garden_area") def _compute_total_area(self): for record in self: record.total_area = record.living_area + record.garden_area + + @api.depends("offer_ids") + def _compute_best_offer(self): + for record in self: + record.best_offer = max(record.offer_ids.mapped("price")) if record.offer_ids else 0 diff --git a/estate/views/estate_views.xml b/estate/views/estate_views.xml index 74d4772f3eb..65f0f1ef42f 100644 --- a/estate/views/estate_views.xml +++ b/estate/views/estate_views.xml @@ -16,14 +16,14 @@ Estate Tags estate.tag - list,form + Estate List estate - + @@ -60,7 +60,7 @@ - + From f784cebd18121c16b905352f5beb9ca1c42eac97 Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Wed, 29 Jul 2026 18:42:21 +0530 Subject: [PATCH 24/25] [IMP] estate: add deadline and validity field with compute and inverse func - updated form & list view - using current date as fallback when create_date is not set e.g. When we create new offer at that time create_date is not set until that record is saved for first time - ! inverse func only triggered after saving record --- estate/models/estate_offer.py | 14 +++++++++++++- estate/views/estate_offers.xml | 4 ++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/estate/models/estate_offer.py b/estate/models/estate_offer.py index 88a23d67050..7752c688c69 100644 --- a/estate/models/estate_offer.py +++ b/estate/models/estate_offer.py @@ -1,4 +1,5 @@ -from odoo import models, fields +from dateutil.relativedelta import relativedelta +from odoo import models, fields, api class EstateOffer(models.Model): @@ -12,3 +13,14 @@ class EstateOffer(models.Model): ) partner_id = fields.Many2one('res.partner', required=True) property_id = fields.Many2one('estate', required=True) + validity = fields.Integer(default=7) + date_deadline = fields.Date(compute='_compute_date_deadline', inverse='_inverse_date_deadline') + + @api.depends('validity') + def _compute_date_deadline(self): + for record in self: + record.date_deadline = (record.create_date or fields.Date.today()) + relativedelta(days=record.validity) + + def _inverse_date_deadline(self): + for record in self: + record.validity = (record.date_deadline - (record.create_date.date() or fields.Date.today())).days diff --git a/estate/views/estate_offers.xml b/estate/views/estate_offers.xml index dc2277e1565..4a218c7961d 100644 --- a/estate/views/estate_offers.xml +++ b/estate/views/estate_offers.xml @@ -7,6 +7,8 @@ + + @@ -22,6 +24,8 @@ + + From eb520874567086bd8f8ed0128dbbc3b98c77adb9 Mon Sep 17 00:00:00 2001 From: "Harsh Gavit (hagav)" Date: Fri, 31 Jul 2026 12:56:28 +0530 Subject: [PATCH 25/25] [IMP] estate: set default values when garden bool is changed - set default garden_area & orientation whenever garden_area is changed using api.onchange --- estate/models/estate.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/estate/models/estate.py b/estate/models/estate.py index 174c6fb986a..c57d9ac90f1 100644 --- a/estate/models/estate.py +++ b/estate/models/estate.py @@ -52,6 +52,7 @@ class Estate(models.Model): @api.depends("living_area", "garden_area") def _compute_total_area(self): + for record in self: record.total_area = record.living_area + record.garden_area @@ -59,3 +60,12 @@ def _compute_total_area(self): def _compute_best_offer(self): for record in self: record.best_offer = max(record.offer_ids.mapped("price")) if record.offer_ids else 0 + + @api.onchange("garden") + def _onchange_garden(self): + if self.garden: + self.garden_area = 10 + self.garden_orientation = "north" + else: + self.garden_area = 0 + self.garden_orientation = False