Browse Source

[ADD]新增hostel_room_category模型,增加对应视图文件,修改hostel_room_view.xml,为主菜单添加新menu,修改hostel_room.py中room_id是整数的部分

longyuan 1 month ago
parent
commit
f24ca6ab73

+ 2 - 1
__manifest__.py

@@ -11,9 +11,10 @@
     "data": [
         "security/res.groups.xml",
         "security/ir.model.access.csv",
+        "views/hostel_room_category_views.xml",
+        "views/hostel_room_views.xml",
         "views/parent.menus.xml",
         "views/hostel_views.xml",
-        "views/hostel_room_views.xml"
     ],
     "assets": {
         "web.assets_backend": [

+ 64 - 2
models/hostel_room.py

@@ -1,4 +1,6 @@
 from odoo import models, fields, api
+from odoo.exceptions import UserError
+from odoo.tools.translate import _
 
 
 class HostelStudent(models.Model):
@@ -19,12 +21,72 @@ class HostelRoom(models.Model):
 
     floor_number = fields.Integer("楼层", required=True)
     room_name = fields.Char("房间名称", required=True)
-    room_id = fields.Integer("房间编号", required=True)
+    room_id = fields.Char("房间编号", required=True)
+    currency_id = fields.Many2one('res.currency', string="货币种类")  # 货币字段种类,要放到租金字段前面,否则会有None这个问题,而且不好排查
     rent_amount = fields.Monetary("租金", help="输入每月租金", currency_field="currency_id")
-    currency_id = fields.Many2one('res.currency', string="货币种类")
     hostel_id = fields.Many2one("hostel.hostel", "hostel", help='输入宿舍名称')
     student_ids = fields.One2many("hostel.student", "room_id", "学生")
     
     hostel_amenities_ids = fields.Many2many("hostel.amenities", "hostel_room_amenities_rel", "room_id", "amenitily_id",
     string="设施", domain="[('active', '=', True)]", help="选择宿舍设施")
+    # 添加状态字段
+    state = fields.Selection([('draft', 'Unavailable'), ('available', 'Available'), ('closed', 'Closed')],
+                              'State', default='draft')
 
+    @api.model
+    def is_allowed_transition(self, old_state, new_state):
+        allowed = {
+            'draft': ['available'],
+            'available': ['closed'],
+            'closed': []
+        }
+        return (old_state, new_state) in allowed
+
+    @api.model
+    def rooms_with_multiple_memebers(self, all_rooms):
+        def predicate(room):
+            if len(room.member_ids) > 1:
+                return True
+            return False
+        return all_rooms.filter(lambda b : len(b.member_ids)>1)
+
+    def change_state(self, new_state):
+        for room in self:
+            if room.is_allowed_transition(room.state, new_state):
+                room.state = new_state
+            else:
+                msg = _("Moving from %s to %s is not allowed.") % (room.state, new_state)
+                raise UserError(msg)
+
+    def make_available(self):
+        self.change_state('available')
+
+    def make_closed(self):
+        self.change_state('closed')
+
+    def log_all_room_members(self):
+        hostel_room_obj = self.env['hostel.room']
+        all_members = hostel_room_obj.search([])
+        print("宿舍房间成员信息:", all_members)
+        return True
+
+    def update_room_id(self):
+        self.ensure_one()
+        self.update({
+            'room_id':'RM002',
+            'room_name': '荷兰风情'
+        })
+    
+    def find_room(self):
+        domain = ['|', '&', ('name', 'ilike', 'Room Name'), 
+        ('category_id', 'ilike', 'Category name'),
+        '&', ('name', 'ilike', 'Second Room Name'),
+        ('category_id.name', 'ilike', 'SecondCategory Name 2')
+        ]
+        rooms = self.search(domain)
+        return rooms
+    
+    def filter_members(self, room):
+        all_rooms = self.search([])
+        filtered_rooms = self.rooms_with_multiple_members(all_rooms)
+        return filtered_rooms

+ 29 - 0
models/hostel_room_category.py

@@ -0,0 +1,29 @@
+from odoo import fields, models
+
+class hostelCategory(models.Model):
+    _name = "hostel.room.category"
+    _description = "宿舍房间类别"
+
+    name = fields.Char("类别名称")
+    description = fields.Text("描述")
+    parent_id = fields.Many2one("hostel.room.category", string="父类别",ondelete="restrict", index=True)
+    child_ids = fields.One2many("hostel.room.category", "parent_id", string="子类别")
+    
+    def create_categories(self):
+        categ1 = {
+            'name':'child category1',
+            'description': "description for child 1"
+        }
+        categ2 = {
+            'name':'child category2',
+            'description': "description for child 2"
+        
+        }
+        parent_categ = {
+            'name' : "parent category",
+            'description': "description for parent category",
+            'child_ids': [(0, 0, categ1), (0, 0, categ2)]
+        }
+        self.env['hostel.room.category'].create(parent_categ)
+        return True
+

+ 3 - 1
security/ir.model.access.csv

@@ -1,3 +1,5 @@
 id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
 access_hostel_manager_id,access.hostel.manager,model_hostel_hostel,my_hostel.group_hostel_manager,1,1,1,1
-access_hostel_user_id,access.hostel.user,model_hostel_hostel,my_hostel.group_hostel_user,1,0,0,0
+access_hostel_user_id,access.hostel.user,model_hostel_hostel,my_hostel.group_hostel_user,1,0,0,0
+access_hostel_room_user,hostel_room.user,model_hostel_room,base.group_user, 1,1,1,1
+access_hostel_room_category_user, hostel.room.category.user,model_hostel_room_category,base.group_user,1,1,1,1

+ 38 - 0
views/hostel_room_category_views.xml

@@ -0,0 +1,38 @@
+<odoo>
+    <data>
+        <record id='hostel_room_category_view_form' model='ir.ui.view'>
+            <field name='name'>宿舍房间类别表单</field>
+            <field name='model'>hostel.room.category</field>
+            <field name='arch' type='xml'>
+                <form string="宿舍房间类别表单">
+                    <sheet>
+                        <group>
+                            <field name='name' string='类别名称'/>
+                            <field name="parent_id" string="父类别"/>
+                            <field name="description" string="描述"/>
+                            <field name="child_ids" string="子类别" widget="many2many_tags"/>
+                        </group>
+                        <button name="create_categories" string="创建类别" type="object"/>
+                    </sheet>
+                </form>
+            </field>
+        </record>
+        <record id="hostel_room_category_view_tree" model="ir.ui.view">
+            <field name="name">宿舍房间类别列表</field>
+            <field name="model">hostel.room.category</field>
+            <field name="arch" type="xml">
+                <tree>
+                    <field name="name"/>
+                    <field name="parent_id"/>
+                    <field name="description"/>
+                </tree>
+            </field>
+        </record>
+        <!-- 添加 action 定义 -->
+        <record id="action_hostel_room_category" model="ir.actions.act_window">
+            <field name="name">房间类别</field>
+            <field name="res_model">hostel.room.category</field>
+            <field name="view_mode">tree,form</field>
+        </record>
+    </data>
+</odoo>

+ 39 - 14
views/hostel_room_views.xml

@@ -1,35 +1,60 @@
 <odoo>
     <data>
         <record id="hostel_room_view_form" model="ir.ui.view">
-            <field name="name">宿舍房间表单</field>
+            <field name="name">hostel.room.form</field>
             <field name="model">hostel.room</field>
             <field name="arch" type="xml">
                 <form string="宿舍房间表单">
+                <sheet>
                     <group>
                         <field name="room_name" string="房间名字" required="True"/>
                         <field name="room_id" string="房间编号" required="True"/>
                         <field name="floor_number" string="房间楼层" required="True"/>
                         <field name="rent_amount" string="租金" required="True" currency_field="currency_id"/>
                         <field name="currency_id" string="货币种类" required="True"/>
+                        <field name="hostel_id" string="宿舍"/>
+                        <field name="state" widget="statusbar"/>
                     </group>
+                    
+                    <notebook>
+                        <page string="设施">
+                            <field name="hostel_amenities_ids" widget="many2many_tags"/>
+                        </page>
+                        <page string="学生">
+                            <field name="student_ids">
+                                <tree>
+                                    <field name="name"/>
+                                    <field name="gender"/>
+                                    <field name="age"/>
+                                </tree>
+                            </field>
+                        </page>
+                    </notebook>
+                    
+                    <div class="oe_button_box" name="button_box">
+                        <button name="make_available" string="设为可用" type="object" class="btn-primary"/>
+                        <button name="make_closed" string="设为不可用" type="object" class="btn-primary"/>
+                        <button name="update_room_id" string="更新房间编号" type="object" class="btn-secondary"/>
+                    </div>
+                </sheet>
                 </form>
             </field>
         </record>
         
         <!-- 添加tree视图 -->
-<!--        <record id="hostel_room_view_tree" model="ir.ui.view">-->
-<!--&lt;!&ndash;            <field name="name">宿舍房间列表</field>&ndash;&gt;-->
-<!--            <field name="model">hostel.room</field>-->
-<!--            <field name="arch" type="xml">-->
-<!--                <tree>-->
-<!--                    <field name="room_name"/>-->
-<!--                    <field name="room_id"/>-->
-<!--                    <field name="floor_number"/>-->
-<!--                    <field name="rent_amount" currency_field="currency_id"/>-->
-<!--                    <field name="currency_id" invisible="1"/>-->
-<!--                </tree>-->
-<!--            </field>-->
-<!--        </record>-->
+        <record id="hostel_room_view_tree" model="ir.ui.view">
+            <field name="name">宿舍房间列表</field>
+            <field name="model">hostel.room</field>
+            <field name="arch" type="xml">
+                <tree>
+                    <field name="room_id" string="房间编号"/>
+                    <field name="room_name" string="房间名字"/>
+                    <!-- <field name="floor_number" string="楼层"/> -->
+                    <field name="rent_amount" string="租金"/>
+                    <field name="state" string="状态"/>
+                </tree>
+            </field>
+        </record>
         
         <!-- 添加action -->
         <record id="action_hostel_room" model="ir.actions.act_window">

+ 7 - 1
views/hostel_views.xml

@@ -96,7 +96,13 @@
         <menuitem id="hostel_main_menu" name="宿舍管理" sequence="50"/>
         <!-- Hostel 子列表 -->
         <menuitem id="menu_hostel" name="宿舍列表" action="action_hostel" parent="hostel_main_menu"/>
-        <menuitem id="hostel_type_menu" name="宿舍" parent="hostel_main_menu" action="my_hostel.action_hostel"
+        <menuitem id="hostel_type_menu" name="宿舍" parent="hostel_main_menu" action="action_hostel"
                   groups="my_hostel.group_hostel_manager" sequence="1"/>
+        <menuitem id="hostel_room_menu" name="房间列表" parent="hostel_main_menu"
+                  action="action_hostel_room"
+                  groups="my_hostel.group_hostel_manager" sequence="1"/>
+        <menuitem id="hostel_room_categroy_menu"  name="宿舍类别"  parent="hostel_main_menu" 
+                  action="action_hostel_room_category"
+                  groups="my_hostel.group_hostel_manager" sequence="2"/>
     </data>
 </odoo>

+ 13 - 0
views/my_hostel.code-workspace

@@ -0,0 +1,13 @@
+{
+	"folders": [
+		{
+			"name": "my_hostel",
+			"path": ".."
+		},
+		{
+			"name": "odoo",
+			"path": "../../../odoo"
+		}
+	],
+	"settings": {}
+}