layout updates, added json views, fixed relationships in schema

This commit is contained in:
evilchili
2024-02-16 01:19:25 -08:00
parent 1baf73a338
commit e231828425
13 changed files with 320 additions and 88 deletions
+17 -3
View File
@@ -1,8 +1,8 @@
import logging
import nanoid
from nanoid_dictionary import human_alphabet
from sqlalchemy import Column
from sqlalchemy import String
from sqlalchemy import String
from pyramid_sqlalchemy import BaseObject
from slugify import slugify
@@ -31,9 +31,23 @@ class IterableMixin:
for attr in self.__mapper__.columns.keys():
if attr in values:
yield attr, values[attr]
for relname in self.__mapper__.relationships.keys():
relvals = []
for rel in self.__getattribute__(relname):
try:
relvals.append({k: v for k, v in vars(rel).items() if not k.startswith('_')})
except TypeError:
relvals.append(rel)
yield relname, relvals
def __repr__(self):
return f"{self.__class__.__name__}: {str(dict(self))}"
def __json__(self, request):
serialized = dict()
for (key, value) in self:
try:
serialized[key] = getattr(self.value, '__json__')(request)
except AttributeError:
serialized[key] = value
return serialized
def multivalue_string_factory(name, column=Column(String), separator=';'):
+16 -2
View File
@@ -62,7 +62,7 @@ data = {
'max_hit_points': 14,
'hit_points': 14,
'temp_hit_points': 0,
'speed': '30 ft.',
'speed': 30,
'str': 16,
'dex': 12,
'con': 18,
@@ -88,18 +88,32 @@ data = {
{
'id': 1,
'ancestry_id': 1,
'description': '+1 to All Ability Scores',
'name': '+1 to All Ability Scores',
'level': 1,
},
{
'id': 2,
'ancestry_id': 2,
'name': 'Breath Weapon',
'level': 1,
},
],
'Modifier': [
# Humans
{'source_table_name': 'ancestry_trait', 'source_table_id': 1, 'value': '+1', 'type': 'stat', 'target': 'str'},
{'source_table_name': 'ancestry_trait', 'source_table_id': 1, 'value': '+1', 'type': 'stat', 'target': 'dex'},
{'source_table_name': 'ancestry_trait', 'source_table_id': 1, 'value': '+1', 'type': 'stat', 'target': 'con'},
{'source_table_name': 'ancestry_trait', 'source_table_id': 1, 'value': '+1', 'type': 'stat', 'target': 'int'},
{'source_table_name': 'ancestry_trait', 'source_table_id': 1, 'value': '+1', 'type': 'stat', 'target': 'wis'},
{'source_table_name': 'ancestry_trait', 'source_table_id': 1, 'value': '+1', 'type': 'stat', 'target': 'cha'},
# Dragonborn
{'source_table_name': 'ancestry_trait', 'source_table_id': 2, 'value': '60', 'type': 'attribute ', 'target': 'Darkvision'},
{'source_table_name': 'ancestry_trait', 'source_table_id': 2, 'value': '+1', 'type': 'stat', 'target': ''},
{'source_table_name': 'ancestry_trait', 'source_table_id': 2, 'value': '+1', 'type': 'stat', 'target': ''},
# Fighting Style: Archery
{'source_table_name': 'class_attribute', 'source_table_id': 1, 'value': '+2', 'type': 'weapon ', 'target': 'ranged'},
],
+19 -11
View File
@@ -7,6 +7,7 @@ from sqlalchemy import ForeignKey
from sqlalchemy import Enum
from sqlalchemy import Text
from sqlalchemy import UniqueConstraint
from sqlalchemy.orm import relationship
from ttfrog.db.base import Bases, BaseObject, IterableMixin
from ttfrog.db.base import multivalue_string_factory
@@ -17,9 +18,18 @@ STATS = ['STR', 'DEX', 'CON', 'INT', 'WIS', 'CHA']
CREATURE_TYPES = ['aberation', 'beast', 'celestial', 'construct', 'dragon', 'elemental', 'fey', 'fiend', 'Giant',
'humanoid', 'monstrosity', 'ooze', 'plant', 'undead']
class EnumField(enum.Enum):
"""
A serializable enum.
"""
def __json__(self, request):
return self.value
# enums for db schemas
StatsEnum = enum.Enum("StatsEnum", ((k, k) for k in STATS))
CreatureTypesEnum = enum.Enum("CreatureTypesEnum", ((k, k) for k in CREATURE_TYPES))
StatsEnum = EnumField("StatsEnum", ((k, k) for k in STATS))
CreatureTypesEnum = EnumField("CreatureTypesEnum", ((k, k) for k in CREATURE_TYPES))
CharacterClassMixin = multivalue_string_factory('character_class', Column(String, nullable=False))
SavingThrowsMixin = multivalue_string_factory('saving_throws')
@@ -50,6 +60,7 @@ class Ancestry(*Bases):
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String, index=True, unique=True)
creature_type = Column(Enum(CreatureTypesEnum))
traits = relationship("AncestryTrait")
def __repr__(self):
return str(self.name)
@@ -59,13 +70,10 @@ class AncestryTrait(BaseObject, IterableMixin):
__tablename__ = "ancestry_trait"
id = Column(Integer, primary_key=True, autoincrement=True)
ancestry_id = Column(Integer, ForeignKey("ancestry.id"), nullable=False)
name = Column(String, nullable="False")
name = Column(String, nullable=False)
description = Column(Text)
level = Column(Integer, nullable=False, info={'min': 1, 'max': 20})
def __repr__(self):
return str(self.name)
class CharacterClass(*Bases, SavingThrowsMixin, SkillsMixin):
__tablename__ = "character_class"
@@ -83,8 +91,8 @@ class ClassAttribute(BaseObject, IterableMixin):
__tablename__ = "class_attribute"
id = Column(Integer, primary_key=True, autoincrement=True)
character_class_id = Column(Integer, ForeignKey("character_class.id"), nullable=False)
name = Column(String, nullable="False")
value = Column(String, nullable="False")
name = Column(String, nullable=False)
value = Column(String, nullable=False)
description = Column(Text)
level = Column(Integer, nullable=False, info={'min': 1, 'max': 20})
@@ -95,14 +103,14 @@ class ClassAttribute(BaseObject, IterableMixin):
class Character(*Bases, CharacterClassMixin, SavingThrowsMixin, SkillsMixin):
__tablename__ = "character"
id = Column(Integer, primary_key=True, autoincrement=True)
ancestry = Column(String, ForeignKey("ancestry.name"), nullable=False)
ancestry = Column(String, ForeignKey("ancestry.name"), nullable=False, default='human')
name = Column(String, default='New Character', nullable=False)
level = Column(Integer, default=1, nullable=False, info={'min': 1, 'max': 20})
armor_class = Column(Integer, default=10, nullable=False, info={'min': 1, 'max': 99})
hit_points = Column(Integer, default=1, nullable=False, info={'min': 0, 'max': 999})
max_hit_points = Column(Integer, default=1, nullable=False, info={'min': 0, 'max': 999})
temp_hit_points = Column(Integer, default=0, nullable=False, info={'min': 0})
speed = Column(String, nullable=False, default="30 ft.")
temp_hit_points = Column(Integer, default=0, nullable=False, info={'min': 0, 'max': 999})
speed = Column(Integer, nullable=False, default=30, info={'min': 0, 'max': 99})
str = Column(Integer, nullable=False, default=10, info={'min': 0, 'max': 30})
dex = Column(Integer, nullable=False, default=10, info={'min': 0, 'max': 30})
con = Column(Integer, nullable=False, default=10, info={'min': 0, 'max': 30})