53 lines
2.0 KiB
Python
53 lines
2.0 KiB
Python
# -*- 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)
|