[ADD]Hylang base with XML and Odoo macros

This commit is contained in:
Fabien BOURGEOIS 2019-09-16 16:20:08 +02:00
parent 2d383c2eb4
commit 8eb4c0e294
4 changed files with 165 additions and 0 deletions

19
hy_base/__init__.py Normal file
View File

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# Copyright 2019 Fabien Bourgeois <fabien@yaltik.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import hy
from . import odoo

31
hy_base/__manifest__.py Normal file
View File

@ -0,0 +1,31 @@
# -*- coding: utf-8 -*-
# Copyright 2019 Fabien Bourgeois <fabien@yaltik.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
{
'name': 'HY base module and macros',
'summary': 'Hylang base module and macros',
'description': """ Hylang base module and macros """,
'version': '10.0.0.1.0',
'category': 'HY',
'author': 'Fabien Bourgeois',
'license': 'AGPL-3',
'application': False,
'installable': True,
'depends': ['base'],
'data': [],
"external_dependencies": {'python' : ['hy']}
}

50
hy_base/odoo.hy Normal file
View File

@ -0,0 +1,50 @@
;; -*- coding: utf-8 -*-
;;
;; Copyright 2019 Fabien Bourgeois <fabien@yaltik.com>
;;
;; This program is free software: you can redistribute it and/or modify
;; it under the terms of the GNU Affero General Public License as
;; published by the Free Software Foundation, either version 3 of the
;; License, or (at your option) any later version.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU Affero General Public License for more details.
;;
;; You should have received a copy of the GNU Affero General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
" Odoo XML macros "
(require [odoo.addons.hy_base.xml [*]])
(defmacro odoo [&rest args] `(xmlr "odoo" ~@args))
(defmacro data [&rest args] `(xmlnc "data" ~@args))
(defmacro record [&rest args] `(xmlnc "record" ~@args))
(defmacro view [xmlid children] `(record {"id" ~xmlid "model" "ir.ui.view"} ~children))
(defmacro view-def [xmlid name model &rest body]
"View and first fields simplification with record xmlid, name, targeted model"
`(do
(view ~xmlid
[(field-name ~name)
(field-model ~model)
(field-arch ~@body)])))
(defmacro view-inherit [name model inherit &rest body]
"Inherited View simplification with name of the record, xmlid for model and
inherited view"
(setv module (get (.split __name__ ".") 2))
(setv xmlid (+ (get (.split inherit ".") 1) "_inherit_" module))
`(do
(view ~xmlid
[(field-name ~name)
(field-model ~model)
(field-inherit ~inherit)
(field-arch ~@body)])))
(defmacro field [&rest args] `(xmlna "field" ~@args))
(defmacro field-name [name] `(field {"name" "name"} [~name]))
(defmacro field-model [model] `(field {"name" "model"} [~model]))
(defmacro field-inherit [xmlid] `(field {"name" "inherit_id" "ref" ~xmlid} []))
(defmacro field-arch [&rest args] `(field {"name" "arch" "type" "xml"} ~@args))

65
hy_base/xml.hy Normal file
View File

@ -0,0 +1,65 @@
;; -*- coding: utf-8 -*-
;;
;; Copyright 2019 Fabien Bourgeois <fabien@yaltik.com>
;;
;; This program is free software: you can redistribute it and/or modify
;; it under the terms of the GNU Affero General Public License as
;; published by the Free Software Foundation, either version 3 of the
;; License, or (at your option) any later version.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU Affero General Public License for more details.
;;
;; You should have received a copy of the GNU Affero General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
" XML helpers and macros "
(import [xml.etree.ElementTree :as ET])
(defn xmlroot [tree]
"Special process for root XML Node"
(setv root (first tree))
(setv rootel (.Element ET (get root "tag") (get root "attrs")))
(setv children (get root "children"))
(if children (xmlchild rootel children))
(return rootel))
(defn xmlchild [parent children]
"Handling of children (ie non root) XML Nodes with/o text and subchildren
(recursive)"
(for [c children]
(if (string? c)
(setv (. parent text) c)
(do
(setv attrs (dfor [k v] (.items (get c "attrs")) [k (str v)]))
(setv new_parent (.SubElement ET parent (get c "tag") attrs))
(setv subchildren (get c "children"))
(if subchildren (xmlchild new_parent subchildren))))))
(defmacro xmlnc [&rest args]
"XMLNode with default children, not attributes"
(cond [(= (len args) 1) (setv tag (first args) attrs {} children [])]
[(= (len args) 2) (setv tag (first args) attrs {} children (last args))]
[(= (len args) 3) (setv tag (first args) attrs (get args 1) children (last args))])
`{"tag" ~tag "attrs" ~attrs "children" ~children})
(defmacro xmlna [&rest args]
"XMLNode with default attributes, not children"
(cond [(= (len args) 1) (setv tag (first args) attrs {} children [])]
[(= (len args) 2) (setv tag (first args) attrs (last args) children [])]
[(= (len args) 3) (setv tag (first args) attrs (get args 1) children (last args))])
`{"tag" ~tag "attrs" ~attrs "children" ~children})
(defmacro xmlnt [&rest args]
"XMLNode with no child but maybe some text"
(cond [(= (len args) 1) (setv tag (first args) attrs {} text "")]
[(= (len args) 2) (setv tag (first args) attrs {} text (last args))]
[(= (len args) 3) (setv tag (first args) attrs (get args 1) text (last args))])
`(xmln ~tag ~attrs [~text]))
(defmacro xmlr [&rest args]
"XML Root node"
(setv expr `(xmlnc ~@args)) `(xmlroot [~expr]))