Pembuatan Wizard pada Pengembangan Aplikasi Odoo 17

Jun 3, 2025 | Odoo 17 Development

Dalam pengisian form pada aplikasi berbasis Odoo 17 kita dapat menggunakan serangkaian wizard untuk mengarahkan pengisian form secara tepat.

Pembuatan wizard pada pengembangan aplikasi Odoo 17 adalah seperti pada langkah-langkah berikut ini

  1. Memulai SSH file system

  2. Model untuk wizard

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    from odoo import models, fields
    from datetime import datetime
     
    class AssignRoomStudentWizard(models.TransientModel):
        _name = 'assign.room.student.wizard'
         
        room_id = fields.Many2one('asrama.room', 'Room', required=True)
     
        def add_room_in_student(self):
            asrama_room_student = self.env['asrama.student'].browse(self.env.context.get('active_id'))
            if (asrama_room_student):
                asrama_room_student.update({
                    'hostel_id' : self.room_id.hostel_id.id,
                    'room_id' : self.room_id.id,
                    'admission_date' : datetime.today()
                })
  3. View untuk wizard

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <?xml version="1.0" encoding="utf-8"?>
    <odoo>
        <!-- assign.room.student.wizard form view -->
        <record id="assign_room_student_wizard_view_form" model="ir.ui.view">
            <field name="name">Assign room student wizard view.form</field>
            <field name="model">assign.room.student.wizard</field>
            <field name="arch" type="xml">
                <form string="Assign Room">
                    <sheet>
                        <group>
                            <field name="room_id" />                   
                        </group>
                    </sheet>
                    <footer>
                        <button string="Update" name="add_room_in_student" class="btn-primary" type="object" />
                        <button string="Cancel" class="btn-default" special='cancel' />
                    </footer>
                </form>
            </field>
        </record>
     
        <!-- assign.room.student.wizard action window -->
        <record id="assign_room_student_wizard_action" model="ir.actions.act_window">
            <field name="name">Assign Room</field>
            <field name="res_model">assign.room.student.wizard</field>
            <field name="view_mode">form</field>
            <field name="target">new</field>
        </record>
     
        <menuitem id="wizard_assign_room_menu" name="Wizard Assign Room" parent="hostel_main_menu" action="assign_room_student_wizard_action" sequence="4"/>
    </odoo>
  4. Pengisian ir.model.access.csv

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
    access_hostel_manager_id,access.hostel.manager,asramaku.model_asrama_hostel,group_hostel_manager,1,1,1,1
    access_hostel_user_id,access.hostel.user,asramaku.model_asrama_hostel,group_hostel_user,1,0,0,0
    access_hostel_room_manager_id,access.hostel.room.manager,asramaku.model_asrama_room,asramaku.group_hostel_manager,1,1,1,1
    access_hostel_room_user_id,access.hostel.room.user,asramaku.model_asrama_room,asramaku.group_hostel_user,1,0,0,0
    access_hostel_amenities_manager_id,access.hostel.amenities.manager,asramaku.model_asrama_amenities,asramaku.group_hostel_manager,1,1,1,1
    access_hostel_amenities_user_id,access.hostel.amenities.user,asramaku.model_asrama_amenities,asramaku.group_hostel_user,1,0,0,0
    access_hostel_student_manager_id,access.hostel.student.manager,asramaku.model_asrama_student,asramaku.group_hostel_manager,1,1,1,1
    access_hostel_student_user_id,access.hostel.student.user,asramaku.model_asrama_student,asramaku.group_hostel_user,1,0,0,0
    access_hostel_category_manager_id,access.hostel.category.manager,asramaku.model_asrama_category,asramaku.group_hostel_manager,1,1,1,1
    access_hostel_category_user_id,access.hostel.category.user,asramaku.model_asrama_category,asramaku.group_hostel_user,1,0,0,0
    access_hostel_assign_room_student_wizard_id,access.hostel.assign.room.student.wizard,asramaku.model_assign_room_student_wizard,asramaku.group_hostel_manager,1,1,1,1
  5. Model asrama.student

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    from datetime import datetime, timedelta
    from odoo import  _, fields, models, api
    from odoo.exceptions import UserError
     
    class AsramaStudent(models.Model):
        _name = 'asrama.student'
        _description = 'Informasi Asrama Student'
        partner_id = fields.Many2one('res.partner', ondelete='cascade', delegate=True)
     
        #name = fields.Char('Nama pelajar')
        gender = fields.Selection(
            [('male','Male'),('female','Female'),('other','Other')],
            string='Jenis kelamin',
            help='Jenis kelamin pelajar',
        )
        active = fields.Boolean('Active',default=True,help='Activate/Deactive record')
     
        room_id = fields.Many2one('asrama.room','Room',help='Pilih room')
        hostel_id = fields.Many2one('asrama.hostel',related='room_id.hostel_id')
         
        status = fields.Selection(
            [('draft','Draft'),('reservation','Reservation'),('pending','Pending'),('paid','Paid'),('discharge','Discharge'),('cancel','Cancel')],
            string='Status',copy=False,default='draft',
            help='Status asrama student'
        )
     
        @api.depends('admission_date','discharge_date')
         
        def _compute_check_duration(self):
            """Mengecek durasi"""
            for rec in self:
                if rec.discharge_date and rec.admission_date:
                    rec.duration = (rec.discharge_date - rec.admission_date).days
     
        def _inverse_duration(self):
            for stu in self:
                if stu.discharge_date and stu.admission_date:
                    duration = (stu.discharge_date - stu.admission_date).days
                    if duration != stu.duration:
                        stu.discharge_date = (stu.admission_date + timedelta(days=stu.duration)).strftime('%Y-%m-%d')
                         
        admission_date = fields.Date('Tanggal masuk',help='Tangga di mana pelajar masuk asrama',
            default=fields.Datetime.today())
     
        discharge_date = fields.Date('Tanggal keluar',help='Tanggal di mana pelajar keluar asrama')
     
        duration = fields.Integer('Durasi', compute='_compute_check_duration',inverse='_inverse_duration',
            help='Durasi lamanya tinggal')
         
        def action_assign_room(self):
            self.ensure_one()
            if self.status != 'paid':
                raise UserError(_("Tidak bisa memberikan room jika belum Paid!"))
            room_as_super_user = self.env['asrama.room'].sudo()
            room_rec = room_as_super_user.create({
                'name': 'Kamar A-505',
                'room_no': 'A-505',
                'floor_no': 1,
                'student_per_room' : 5,
                'category_id' : self.env.ref("asramaku.kategori_elite").id,
                'hostel_id': self.hostel_id.id,
            })
     
            if room_rec:
                self.sudo().room_id = room_rec.id
             
        def action_wizard_assign_room(self):
            return {
                'type' : 'ir.actions.act_window',
                'name' : _('Assign Room'),
                'res_model' : 'assign.room.student.wizard',
                'view_type' : 'form',
                'view_mode' : 'form' ,
                'views' : [[False,'form']],
                'target': 'new',
            }
         
        def action_remove_room(self):
            if self.env.context.get('is_hostel_room'):
                self.room_id = False
  6. View asrama_student.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    <?xml version="1.0" encoding="utf-8"?>
    <odoo>
        <!-- asrama.student form view -->
        <record id="asrama_student_view_form" model="ir.ui.view">
            <field name="name">asrama.student.view.form</field>
            <field name="model">asrama.student</field>
            <field name="arch" type="xml">
                <form string="">
                    <sheet>
                    <header>
                        <button name="action_assign_room"  string="Assign Room" type="object" class="btn-primary"/>
                        <button name="action_wizard_assign_room"  string="Wizard Assign Room" type="object" class="btn-primary"/>
                    </header>
                        <group>
                                <group>
                                    <field name="name"/>
                                    <field name="city"/>
                                    <field name="zip"/>
                                    <field name="country_id"/>
                                    <field name="gender"/>
                                    <field name="active"/>
                                </group>
                                <group>
                                    <field name="room_id"/>
                                    <field name="hostel_id"/>
                                    <field name="status"/>
                                    <field name="admission_date"/>
                                    <field name="discharge_date"/>
                                    <field name="duration"/>
                                </group>                   
                        </group>
                    </sheet>
                </form>
            </field>
        </record>
     
       <record model="ir.actions.act_window" id="action_asrama_student">
                <field name="name">Students</field>
                <field name="type">ir.actions.act_window</field>
                <field name="res_model">asrama.student</field>
                <field name="view_mode">tree,form</field>
                <field name="domain">[]</field>
                <field name="context">{}</field>
                 <field name="help" type="html">
                    <p class="oe_view_nocontent_create">
                        Create Student.
                    </p>
                 </field>
        </record>
     
         
            <!-- This Menu Item must have a parent and an action -->
        <menuitem id="asrama_student_menu" name="Pelajar-pelajar" parent="hostel_main_menu" action="action_asrama_student" sequence="3"/>
     
    </odoo>
  7. Wizard init

    1
    from . import assign_room_student
  8. Init

    1
    2
    3
    from . import models
    from . import controllers
    from . import wizard
  9. Manifest

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    {
        'name': 'Manajemen Asrama',
        "data":[
            "security/hostel_security.xml",
            "security/ir.model.access.csv",
            "data/data.xml",
            "wizard/assign_room_student.xml",
            "views/hostel.xml",
            "views/asrama_room.xml",
            "views/asrama_student.xml",
        ],
    }
  10. Memulai Odoo dengan upgrade modul

  11. Menjalankan wizard
    Room awal suatu murid kemudian klik Wizard Assign Room:


    Pengupdatean kamar menggunakan wizard:


    Hasil pemanggilan wizard:

Kunjungi www.proweb.co.id/implementasi-odoo/ jika anda membutuhkan layanan mplementasi Odoo ERP.