From 3fed13e4ec0ba070b67fe854fa60182e6c18324b Mon Sep 17 00:00:00 2001 From: m3r3nix Date: Fri, 2 Feb 2024 14:56:17 +0100 Subject: [PATCH] Create v17 config --- .devcontainer/Dockerfile | 101 ++++++++++++++++++ .devcontainer/URL.conf | 1 + .devcontainer/devcontainer.json | 24 +++++ .devcontainer/docker-compose.yml | 16 +++ .devcontainer/entrypoint.sh | 49 +++++++++ .devcontainer/odoo.conf | 37 +++++++ .devcontainer/wait-for-psql.py | 32 ++++++ .github/workflows/docker-publish.yml | 96 +++++++++++++++++ README.md | 77 +++++++++++++ custom/estate-demo-addon/__init__.py | 1 + custom/estate-demo-addon/__manifest__.py | 17 +++ custom/estate-demo-addon/models/__init__.py | 1 + .../models/estate_property.py | 27 +++++ .../security/ir.model.access.csv | 2 + .../estate-demo-addon/views/estate_menus.xml | 8 ++ .../views/estate_property_views.xml | 8 ++ 16 files changed, 497 insertions(+) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/URL.conf create mode 100644 .devcontainer/devcontainer.json create mode 100644 .devcontainer/docker-compose.yml create mode 100755 .devcontainer/entrypoint.sh create mode 100644 .devcontainer/odoo.conf create mode 100755 .devcontainer/wait-for-psql.py create mode 100644 .github/workflows/docker-publish.yml create mode 100644 README.md create mode 100644 custom/estate-demo-addon/__init__.py create mode 100644 custom/estate-demo-addon/__manifest__.py create mode 100644 custom/estate-demo-addon/models/__init__.py create mode 100644 custom/estate-demo-addon/models/estate_property.py create mode 100644 custom/estate-demo-addon/security/ir.model.access.csv create mode 100644 custom/estate-demo-addon/views/estate_menus.xml create mode 100644 custom/estate-demo-addon/views/estate_property_views.xml diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..e444cb8 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,101 @@ +FROM ubuntu:jammy +MAINTAINER Odoo S.A. + +SHELL ["/bin/bash", "-xo", "pipefail", "-c"] + +# Generate locale C.UTF-8 for postgres and general locale data +ENV LANG en_US.UTF-8 + +# Retrieve the target architecture to install the correct wkhtmltopdf package +ARG TARGETARCH + +# Install some deps, lessc and less-plugin-clean-css, and wkhtmltopdf +RUN apt-get update && \ + DEBIAN_FRONTEND=noninteractive \ + apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + dirmngr \ + fonts-noto-cjk \ + git \ + gnupg \ + libssl-dev \ + node-less \ + npm \ + python3-magic \ + python3-num2words \ + python3-odf \ + python3-pdfminer \ + python3-pip \ + python3-phonenumbers \ + python3-pyldap \ + python3-qrcode \ + python3-renderpm \ + python3-setuptools \ + python3-slugify \ + python3-vobject \ + python3-watchdog \ + python3-xlrd \ + python3-xlwt \ + xz-utils && \ + if [ -z "${TARGETARCH}" ]; then \ + TARGETARCH="$(dpkg --print-architecture)"; \ + fi; \ + WKHTMLTOPDF_ARCH=${TARGETARCH} && \ + case ${TARGETARCH} in \ + "amd64") WKHTMLTOPDF_ARCH=amd64 && WKHTMLTOPDF_SHA=967390a759707337b46d1c02452e2bb6b2dc6d59 ;; \ + "arm64") WKHTMLTOPDF_SHA=90f6e69896d51ef77339d3f3a20f8582bdf496cc ;; \ + "ppc64le" | "ppc64el") WKHTMLTOPDF_ARCH=ppc64el && WKHTMLTOPDF_SHA=5312d7d34a25b321282929df82e3574319aed25c ;; \ + esac \ + && curl -o wkhtmltox.deb -sSL https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-3/wkhtmltox_0.12.6.1-3.jammy_${WKHTMLTOPDF_ARCH}.deb \ + && echo ${WKHTMLTOPDF_SHA} wkhtmltox.deb | sha1sum -c - \ + && apt-get install -y --no-install-recommends ./wkhtmltox.deb \ + && rm -rf /var/lib/apt/lists/* wkhtmltox.deb + +# Install latest postgresql-client +RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ jammy-pgdg main' > /etc/apt/sources.list.d/pgdg.list \ + && GNUPGHOME="$(mktemp -d)" \ + && export GNUPGHOME \ + && repokey='B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8' \ + && gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "${repokey}" \ + && gpg --batch --armor --export "${repokey}" > /etc/apt/trusted.gpg.d/pgdg.gpg.asc \ + && gpgconf --kill all \ + && rm -rf "$GNUPGHOME" \ + && apt-get update \ + && apt-get install --no-install-recommends -y postgresql-client \ + && rm -f /etc/apt/sources.list.d/pgdg.list \ + && rm -rf /var/lib/apt/lists/* + +# Install rtlcss (on Debian buster) +RUN npm install -g rtlcss + +# Copy Odoo installation package downloaded in the previous GitHub Action step +COPY ./odoo.deb / + +# Install Odoo +RUN apt-get update \ + && apt-get -y install --no-install-recommends ./odoo.deb \ + && rm -rf /var/lib/apt/lists/* odoo.deb + +# Copy entrypoint script and Odoo configuration file +COPY ./entrypoint.sh / +COPY ./odoo.conf /etc/odoo/ +COPY ./wait-for-psql.py /usr/local/bin/wait-for-psql.py + +# Set permissions and Mount /var/lib/odoo to allow restoring filestore and /mnt/extra-addons for users addons +RUN chown odoo /etc/odoo/odoo.conf \ + && mkdir -p /mnt/extra-addons \ + && chown -R odoo /mnt/extra-addons +VOLUME ["/var/lib/odoo", "/mnt/extra-addons"] + +# Expose Odoo services +EXPOSE 8069 8071 8072 + +# Set the default config file +ENV ODOO_RC /etc/odoo/odoo.conf + +# Set default user when running the container +USER odoo + +ENTRYPOINT ["/entrypoint.sh"] +CMD ["odoo"] diff --git a/.devcontainer/URL.conf b/.devcontainer/URL.conf new file mode 100644 index 0000000..0ef8ff7 --- /dev/null +++ b/.devcontainer/URL.conf @@ -0,0 +1 @@ +https://nightly.odoo.com/17.0/nightly/deb/odoo_17.0.latest_all.deb \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..49df19f --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,24 @@ +{ + "name": "Odoo Dev Container", + "dockerComposeFile": "docker-compose.yml", + "service": "odoo", + "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}/custom", + "remoteUser": "root", + "forwardPorts": [8069], + "shutdownAction": "stopCompose", + "customizations": { + "vscode": { + "settings": { + "terminal.integrated.shell.linux": "/bin/bash" + }, + "extensions": [ + "ms-python.python", + "ms-python.vscode-pylance", + "GitHub.copilot", + "GitHub.copilot-chat", + "DavidAnson.vscode-markdownlint", + "DotJoshJohnson.xml" + ] + } + } +} diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml new file mode 100644 index 0000000..2aaada3 --- /dev/null +++ b/.devcontainer/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3.1' +services: + odoo: + image: "ghcr.io/m3r3nix/odoo-v17-community:latest" + depends_on: + - db + ports: + - "8069:8069" + volumes: + - ../custom:/mnt/extra-addons + db: + image: postgres:15 + environment: + - POSTGRES_DB=postgres + - POSTGRES_PASSWORD=odoo + - POSTGRES_USER=odoo diff --git a/.devcontainer/entrypoint.sh b/.devcontainer/entrypoint.sh new file mode 100755 index 0000000..f802bcb --- /dev/null +++ b/.devcontainer/entrypoint.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +set -e + +if [ -v PASSWORD_FILE ]; then + PASSWORD="$(< $PASSWORD_FILE)" +fi + +# set the postgres database host, port, user and password according to the environment +# and pass them as arguments to the odoo process if not present in the config file +: ${HOST:=${DB_PORT_5432_TCP_ADDR:='db'}} +: ${PORT:=${DB_PORT_5432_TCP_PORT:=5432}} +: ${USER:=${DB_ENV_POSTGRES_USER:=${POSTGRES_USER:='odoo'}}} +: ${PASSWORD:=${DB_ENV_POSTGRES_PASSWORD:=${POSTGRES_PASSWORD:='odoo'}}} + +DB_ARGS=() +function check_config() { + param="$1" + value="$2" + if grep -q -E "^\s*\b${param}\b\s*=" "$ODOO_RC" ; then + value=$(grep -E "^\s*\b${param}\b\s*=" "$ODOO_RC" |cut -d " " -f3|sed 's/["\n\r]//g') + fi; + DB_ARGS+=("--${param}") + DB_ARGS+=("${value}") +} +check_config "db_host" "$HOST" +check_config "db_port" "$PORT" +check_config "db_user" "$USER" +check_config "db_password" "$PASSWORD" + +case "$1" in + -- | odoo) + shift + if [[ "$1" == "scaffold" ]] ; then + exec odoo "$@" + else + wait-for-psql.py ${DB_ARGS[@]} --timeout=30 + exec odoo "$@" "${DB_ARGS[@]}" + fi + ;; + -*) + wait-for-psql.py ${DB_ARGS[@]} --timeout=30 + exec odoo "$@" "${DB_ARGS[@]}" + ;; + *) + exec "$@" +esac + +exit 1 diff --git a/.devcontainer/odoo.conf b/.devcontainer/odoo.conf new file mode 100644 index 0000000..28f70c1 --- /dev/null +++ b/.devcontainer/odoo.conf @@ -0,0 +1,37 @@ +[options] +addons_path = /mnt/extra-addons +data_dir = /var/lib/odoo +; admin_passwd = admin +; csv_internal_sep = , +; db_maxconn = 64 +; db_name = False +; db_template = template1 +; dbfilter = .* +; debug_mode = False +; email_from = False +; limit_memory_hard = 2684354560 +; limit_memory_soft = 2147483648 +; limit_request = 8192 +; limit_time_cpu = 60 +; limit_time_real = 120 +; list_db = True +; log_db = False +; log_handler = [':INFO'] +; log_level = info +; logfile = None +; longpolling_port = 8072 +; max_cron_threads = 2 +; osv_memory_age_limit = 1.0 +; osv_memory_count_limit = False +; smtp_password = False +; smtp_port = 25 +; smtp_server = localhost +; smtp_ssl = False +; smtp_user = False +; workers = 0 +; xmlrpc = True +; xmlrpc_interface = +; xmlrpc_port = 8069 +; xmlrpcs = True +; xmlrpcs_interface = +; xmlrpcs_port = 8071 diff --git a/.devcontainer/wait-for-psql.py b/.devcontainer/wait-for-psql.py new file mode 100755 index 0000000..a55f440 --- /dev/null +++ b/.devcontainer/wait-for-psql.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 +import argparse +import psycopg2 +import sys +import time + + +if __name__ == '__main__': + arg_parser = argparse.ArgumentParser() + arg_parser.add_argument('--db_host', required=True) + arg_parser.add_argument('--db_port', required=True) + arg_parser.add_argument('--db_user', required=True) + arg_parser.add_argument('--db_password', required=True) + arg_parser.add_argument('--timeout', type=int, default=5) + + args = arg_parser.parse_args() + + start_time = time.time() + while (time.time() - start_time) < args.timeout: + try: + conn = psycopg2.connect(user=args.db_user, host=args.db_host, port=args.db_port, password=args.db_password, dbname='postgres') + error = '' + break + except psycopg2.OperationalError as e: + error = e + else: + conn.close() + time.sleep(1) + + if error: + print("Database connection failure: %s" % error, file=sys.stderr) + sys.exit(1) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml new file mode 100644 index 0000000..14cec13 --- /dev/null +++ b/.github/workflows/docker-publish.yml @@ -0,0 +1,96 @@ +name: Build and Push Odoo Dev Container + +on: + push: + paths: + - '.devcontainer/URL.conf' + workflow_dispatch: + +env: + # Use docker.io for Docker Hub if empty + REGISTRY: ghcr.io + + +jobs: + build: + + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + # This is used to complete the identity challenge + # with sigstore/fulcio when running outside of PRs. + id-token: write + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # Set up BuildKit Docker container builder to be able to build + # multi-platform images and export cache + # https://github.com/docker/setup-buildx-action + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 + + # Login against a Docker registry except on PR + # https://github.com/docker/login-action + - name: Log into registry ${{ env.REGISTRY }} + if: github.event_name != 'pull_request' + uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + # Download .deb package with curl from the provided URL in the ./devcontainer/URL.txt file + - name: Download odoo.deb package + if: github.event_name != 'pull_request' + run: | + curl -sSL -o .devcontainer/odoo.deb $(cat .devcontainer/URL.conf) + + # Set environmet variables based on the downloaded .deb package version number + - name: Set Odoo version environment variable + if: github.event_name != 'pull_request' + run: | + export ODOO_DEB_VERSION=$(dpkg-deb -f .devcontainer/odoo.deb version) + echo "ODOO_DEB_VERSION=${ODOO_DEB_VERSION}" >> $GITHUB_ENV + echo "ODOO_MAIN_VERSION=${ODOO_DEB_VERSION:0:2}" >> $GITHUB_ENV + echo "ODOO_TYPE=$(echo $ODOO_DEB_VERSION | grep -q 'e' && echo 'enterprise' || echo 'community')" >> $GITHUB_ENV + + # Use the tag 'latest' only if the downloaded .deb package is for the Enterprise version (Enterprise download URL only provides the latest build) + # or if the download URL includes the word 'latest' (for Community version you can use either latest or any specific date) + - name: Determine if latest tag should be used + if: github.event_name != 'pull_request' + run: | + if [[ "${{ env.ODOO_TYPE }}" == "enterprise" ]] || grep -q 'latest' .devcontainer/URL.conf; then + echo "IS_LATEST=true" >> $GITHUB_ENV + else + echo "IS_LATEST=false" >> $GITHUB_ENV + fi + + # Extract metadata (tags, labels) for Docker + # https://github.com/docker/metadata-action + - name: Extract Docker metadata + if: ${{ github.event_name != 'pull_request' }} + id: meta + uses: docker/metadata-action@96383f45573cb7f253c731d3b3ab81c87ef81934 # v5.0.0 + with: + images: ${{ env.REGISTRY }}/${{ github.actor }}/odoo-v${{ env.ODOO_MAIN_VERSION }}-${{ env.ODOO_TYPE }} + tags: | + type=raw,value=${{ env.ODOO_DEB_VERSION }} + type=raw,value=latest,enable=${{ env.IS_LATEST }} + + # Build and push Docker image with Buildx (don't push on PR) + # https://github.com/docker/build-push-action + - name: Build and push Docker image + if: ${{ github.event_name != 'pull_request' }} + id: build-and-push + uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09 # v5.0.0 + with: + context: ./.devcontainer + file: ./.devcontainer/Dockerfile + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/README.md b/README.md new file mode 100644 index 0000000..afa1442 --- /dev/null +++ b/README.md @@ -0,0 +1,77 @@ +[![Build and Push Odoo Dev Container](https://github.com/m3r3nix/odoo-dev-container/actions/workflows/docker-publish.yml/badge.svg?branch=v17)](https://github.com/m3r3nix/odoo-dev-container/actions/workflows/docker-publish.yml) + +# Odoo Development Container in GitHub Codespaces + +You can spin up a development-ready environment in just 4 simple steps: +1. Fork this repository or use it as a template and make it private (particularly if you intend to work with the Enterprise Edition). + Ensure that during this process, all branches are copied, not just the default one, if you aim to work with older Odoo versions as well. +2. Go to GitHub Actions and wait for all build processes to complete successfully. (Should you encounter any issues, please refer to the `Troubleshooting` section.) +3. Select the branch corresponding to the Odoo version you wish to develop for and initiate a Codespace. (First boot takes about 2 mins.) + NOTE: If your work involves the Enterprise Edition, please adhere to the instructions in `Create/Update an Enterprise based image`. +4. Within the new VS Code instance, select the `Ports` tab. Then, right-click on port `8069` and choose `Open in Browser`. It will launch your new Odoo instance in your web browser. + +## Important informations + +- Your custom addons must be located in the `/custom` directory of the repository. However, within the Codespaces VS Code editor, this directory will serve as your root folder. See `estate-demo-addon`. +- The build action is triggered by any change to the `.devcontainer/URL.conf` file. However, if you already have the latest Community URL in place and simply need a new build based on the most recent `latest_all.deb` package, you can go to GitHub Actions and trigger the action manually. +- After forking this repository, update the GitHub Actions Badge URL at the top of the `README.md` file to reflect your own build processes. Otherwise, it will always display `no status`. +- Images are tagged not only with `latest` but also with the version number of the downloaded Debian Odoo installer package. This approach allows you to spin up a Codespace with a previous build version in case the latest Odoo version has a serious bug. Simply select an image, for example, `odoo-v17-community`, and look for available tags like `17.0.20240202` in your Container Registry. Then, adjust the tag in `docker-compose.yml` accordingly. + +## How to create/update the development Docker image? + +### Create/Update a Community based image + +1. Update the current URL in `.devcontainer/URL.conf` to the latest Community version: + + Alternatively, select a specific build date from the following link and insert its corresponding URL into the file: + +2. If required, update the image name/tag in the `docker-compose.yml` file accordingly, for example `odoo-v17-community:latest`. +3. Commit and push your changes. This will automatically trigger a new build for the Docker image in GitHub Actions. +4. Look for any errors in the build process. If it's green, then we are fine, you can open a Codespace. + +### Create/Update an Enterprise based image + +1. Obtain the download link for the latest Odoo Enterprise Debian installation package: + + After providing your Odoo Enterprise subscription code, a new page will appear. + Right-click on `Click here` and select `Copy link` from your browser's dropdown menu. + This will give you a temporary download link, valid for approximately 30 minutes. +2. Replace the URL in `.devcontainer/URL.conf` with the new one you have copied to the clipboard. +3. If required, update the image name/tag in the `docker-compose.yml` file accordingly, for example `odoo-v17-enterprise:latest`. +4. Commit and push your changes. This will automatically trigger a new build for the Docker image in GitHub Actions. +5. Look for any errors in the build process. If it's green, then we are fine, you can open a Codespace. + +## In case of a new Odoo main release + +1. The default branch should always contain the latest version. Therefore, create a new branch named after the latest version (e.g., `v18`) before making any changes. +2. Update the `Dockerfile` to reflect the current version from the official repository: +3. Attempt to build it and check for any errors. +4. Change the image tag in `docker-compose.yml` if necessary. +5. Update demo addon version number +6. Update README.md + +## Possible improvements + +You can create a pre-built Codespace template to speed up the initial boot process of a new Codespace. However, I'm still experimenting with this because, in some cases, it can cause more issues than it helps. + +1. Go to repository `Settings` +2. Select `Codespaces` +3. Select `Set up pre-build`. +4. Select the branch. +5. Select `devcontainer.json`. +6. Select your region. +7. Save. + +## Troubleshooting + +- Forking the repository initiates a build process for all available Odoo versions simultaneously. Due to these parallel builds, the GitHub Container Registry might face permission limitations. If this occurs, wait until all builds are complete. Then, identify any failed build and select `Re-run failed job`. +- If you're forking or using this repository as a template more than once, you may encounter a permission issue during the docker image push process. This typically happens because an image with the same name (e.g. `odoo-v17-community`) already exists in your Container Registry, created by a different repository, which means the new repository lacks rights to update the image. + To resolve this issue: + - Navigate to `Packages` and remove the search filter to display all available images in your Container Registry. + - Select `odoo-v17-community`, proceed to `Package settings`, and under `Manage Actions access`, add your current repository with write access. + - Afterwards, re-run the failed job. + +## More info and credits + + + diff --git a/custom/estate-demo-addon/__init__.py b/custom/estate-demo-addon/__init__.py new file mode 100644 index 0000000..9a7e03e --- /dev/null +++ b/custom/estate-demo-addon/__init__.py @@ -0,0 +1 @@ +from . import models \ No newline at end of file diff --git a/custom/estate-demo-addon/__manifest__.py b/custom/estate-demo-addon/__manifest__.py new file mode 100644 index 0000000..0bd10d8 --- /dev/null +++ b/custom/estate-demo-addon/__manifest__.py @@ -0,0 +1,17 @@ +{ + "name": "Real Estate", + "depends": [ + "base", + ], + "version": "17.0.0.1", + "application": "True", + "category": "Sales", + "description": "Manage real estate offerings", + "license": "LGPL-3", + "data": [ + "security/ir.model.access.csv", + + "views/estate_property_views.xml", + "views/estate_menus.xml", + ], +} diff --git a/custom/estate-demo-addon/models/__init__.py b/custom/estate-demo-addon/models/__init__.py new file mode 100644 index 0000000..5e1963c --- /dev/null +++ b/custom/estate-demo-addon/models/__init__.py @@ -0,0 +1 @@ +from . import estate_property diff --git a/custom/estate-demo-addon/models/estate_property.py b/custom/estate-demo-addon/models/estate_property.py new file mode 100644 index 0000000..ab97545 --- /dev/null +++ b/custom/estate-demo-addon/models/estate_property.py @@ -0,0 +1,27 @@ +from odoo import fields, models +from dateutil.relativedelta import relativedelta + +class EstateProperty(models.Model): + _name = "estate.property" + _description = "Real Estate Property details" + + name = fields.Char('Name', required=True) + description = fields.Text() + postcode = fields.Char() + date_availability = fields.Date(default=fields.Date.today() + relativedelta(months=3), copy=False) + expected_price = fields.Float(required=True) + selling_price = fields.Float(readonly=True, copy=False) + bedrooms = fields.Integer(default=2) + living_area = fields.Integer() + facades = fields.Integer() + garage = fields.Boolean() + garden = fields.Boolean() + garden_area = fields.Integer() + garden_orientation = fields.Selection( + string='Orientation', + selection=[('north', 'North'),('south', 'South'),('east', 'East'),('west', 'West')]) + state = fields.Selection( + string='Status', + selection=[('new', 'New'), ('offer_received', 'Offer Received'), ('offer_accepted', 'Offer Accepted'), ('sold', 'Sold'), ('canceled', 'Canceled')], + default='new') + active = fields.Boolean(default=True) diff --git a/custom/estate-demo-addon/security/ir.model.access.csv b/custom/estate-demo-addon/security/ir.model.access.csv new file mode 100644 index 0000000..3238964 --- /dev/null +++ b/custom/estate-demo-addon/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_property,access_estate_property,model_estate_property,base.group_user,1,1,1,1 diff --git a/custom/estate-demo-addon/views/estate_menus.xml b/custom/estate-demo-addon/views/estate_menus.xml new file mode 100644 index 0000000..b709a19 --- /dev/null +++ b/custom/estate-demo-addon/views/estate_menus.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/custom/estate-demo-addon/views/estate_property_views.xml b/custom/estate-demo-addon/views/estate_property_views.xml new file mode 100644 index 0000000..3af8da2 --- /dev/null +++ b/custom/estate-demo-addon/views/estate_property_views.xml @@ -0,0 +1,8 @@ + + + + Properties + estate.property + tree,form + +