# -*- coding: utf-8 -*- from odoo import models, fields, api from .constants import TERRAIN_SELECTION class YtWorldTile(models.Model): """地表地块:本期实际持久化内容(坐标 + 高度 + 属性 + 微观世界关联位)。""" _name = 'yt.world.tile' _description = '地表地块' _rec_name = 'coord' world_id = fields.Many2one('yt.world', string='所属世界', required=True, ondelete='cascade') q = fields.Integer(string='轴向坐标Q', required=True) r = fields.Integer(string='轴向坐标R', required=True) terrain = fields.Selection(TERRAIN_SELECTION, string='地形', index=True) height = fields.Integer(string='高度等级') # heightLevel 1-12 flags = fields.Json(string='地表标记') # {claimed, decorated} micro_world_id = fields.Many2one('yt.world.tile.micro', string='微观世界', ondelete='set null') updated_at = fields.Datetime(string='更新时间', default=fields.Datetime.now) coord = fields.Char(string='坐标标识', compute='_compute_coord', store=True) _sql_constraints = [ ('uniq_tile', 'unique(world_id, q, r)', '同一世界内 (坐标) 的地块必须唯一'), ] @api.depends('q', 'r') def _compute_coord(self): for t in self: t.coord = "%s,%s" % (t.q, t.r) @api.model def create(self, vals): rec = super(YtWorldTile, self).create(vals) rec._ensure_micro() return rec def _ensure_micro(self): """新建地块时同步建 1:1 微观世界占位。""" for t in self: if not t.micro_world_id: m = self.env['yt.world.tile.micro'].create({'tile_id': t.id}) t.micro_world_id = m @api.model def write(self, vals): # 任何编辑都刷新 updated_at if 'updated_at' not in vals: vals['updated_at'] = fields.Datetime.now() return super(YtWorldTile, self).write(vals)