From d95f80636b3adddc08f542aaacd36b0a16c4d486 Mon Sep 17 00:00:00 2001 From: mtpc4s9 Date: Wed, 19 Nov 2025 00:00:02 +0700 Subject: [PATCH] ok --- addons/zoo/__init__.py | 1 + addons/zoo/__manifest__.py | 22 ++++++++++++++++++++++ addons/zoo/models/__init__.py | 1 + addons/zoo/models/zoo_animal.py | 23 +++++++++++++++++++++++ addons/zoo/static/description/icon.png | Bin 0 -> 5832 bytes 5 files changed, 47 insertions(+) create mode 100644 addons/zoo/__init__.py create mode 100644 addons/zoo/__manifest__.py create mode 100644 addons/zoo/models/__init__.py create mode 100644 addons/zoo/models/zoo_animal.py create mode 100644 addons/zoo/static/description/icon.png diff --git a/addons/zoo/__init__.py b/addons/zoo/__init__.py new file mode 100644 index 0000000..9a7e03e --- /dev/null +++ b/addons/zoo/__init__.py @@ -0,0 +1 @@ +from . import models \ No newline at end of file diff --git a/addons/zoo/__manifest__.py b/addons/zoo/__manifest__.py new file mode 100644 index 0000000..4fdcfeb --- /dev/null +++ b/addons/zoo/__manifest__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# https://www.odoo.com/documentation/18.0/developer/reference/backend/module.html +{ + 'name': 'Zoo City', + 'summary': """Zoo City Tutorials""", + 'description': """Building my own zoo city""", + 'author': 'minhng.info', + 'maintainer': 'minhng.info', + 'website': 'https://minhng.info', + 'category': 'Uncategorized', # https://github.com/odoo/odoo/blob/18.0/odoo/addons/base/data/ir_module_category_data.xml + 'version': '0.1', + 'depends': [ + 'product', + ], + 'data': [], + 'demo': [], + 'css': [], + # 'qweb': ['static/src/xml/*.xml'], + 'installable': True, + 'auto_install': False, + 'application': True, +} \ No newline at end of file diff --git a/addons/zoo/models/__init__.py b/addons/zoo/models/__init__.py new file mode 100644 index 0000000..b3a9fb6 --- /dev/null +++ b/addons/zoo/models/__init__.py @@ -0,0 +1 @@ +from . import zoo_animal \ No newline at end of file diff --git a/addons/zoo/models/zoo_animal.py b/addons/zoo/models/zoo_animal.py new file mode 100644 index 0000000..a3e2b08 --- /dev/null +++ b/addons/zoo/models/zoo_animal.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +from odoo import api, fields, models, tools, _ +from odoo.exceptions import UserError, ValidationError + +import datetime + +class ZooAnimal(models.Model): + _name = "zoo.animal" + _description = "Animal in the zoo" + + name = fields.Char('Animal Name', required=True) + description = fields.Text('Description') + dob = fields.Date('DOB', required=False) + gender = fields.Selection([ + ('male', 'Male'), + ('female', 'Female') + ], string='Gender', default='male', required=True) + feed_time = fields.Datetime('Feed Time', copy=False) + is_alive = fields.Boolean('Is Alive', default=True) + image = fields.Binary("Image", attachment=True, help="Animal Image") + weight = fields.Float('Weight (kg)') + weight_pound = fields.Float('Weight (pounds)') + introduction = fields.Text('Introduction (EN)') \ No newline at end of file diff --git a/addons/zoo/static/description/icon.png b/addons/zoo/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1b45871e3f4d750c907934443afbdb69c28572fc GIT binary patch literal 5832 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 E0dTP^%>V!Z literal 0 HcmV?d00001