game/addons/yt_world/models/yt_world_tile.py
李鹏宇 c6ccc1d50b deploy: 后端模块+前端网站更新,统一线上库名为 game
- game_base: 新增 game.page/page.item 模型(page.py),密码策略加严(>=8位且含字母+数字)
- yt_world: create 改 create_multi;权限扩至 public/portal/user;新增微观世界/资源视图与菜单
- 前端: website/auth/index 等 ?db=yt_game 统一改为 ?db=game(线上库名)
- 新增 deploy_server.sh 一键部署脚本
2026-07-24 10:00:51 +08:00

52 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_create_multi
def create(self, vals_list):
records = super(YtWorldTile, self).create(vals_list)
records._ensure_micro()
return records
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
def write(self, vals):
# 任何编辑都刷新 updated_at
if 'updated_at' not in vals:
vals['updated_at'] = fields.Datetime.now()
return super(YtWorldTile, self).write(vals)