- 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 一键部署脚本
52 lines
2.0 KiB
Python
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)
|