class Base(db.Model): __abstract__ = True id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80)) slug = db.Column(db.String(80), unique=True) def __unicode__(self): return self.name @declared_attr def __tablename__(cls): return cls.__name__.lower() def set_name(self, name): slug = slugify(name) counter = 2 while self.query.filter_by(slug=slug).first() is not None: slug = slugify(name) + "-" + str(counter) counter = counter + 1 self.name = name self.slug = slug def __init__(self, *args, **kwargs): if not 'slug' in kwargs: self.set_name(kwargs.get('name', '')) super().__init__(*args, **kwargs)
class Attack(db.Model): __tablename__ = 'attack' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(32)) damage = db.relationship("Dice", uselist=False, backref="damage_dice") to_hit_mod = db.Column(db.Integer, default=0) damage_mod = db.Column(db.Integer, default=0)
class Trap(db.Model): __tablename__ = 'trap' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(32)) statistics = db.relationship("Statistics", uselist=False, backref="trap_statistics")
class Character(db.Model): __tablename__ = 'character' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(32)) player_character = db.Column(db.Boolean, default=False) race = db.relationship("Race", backref="characters") race_id = db.Column(db.Integer, db.ForeignKey('race.id')) character_classes = db.relationship("CharacterClass", lazy='dynamic') abilities = db.relationship("CharacterAbility", lazy='dynamic') skills = db.relationship("CharacterSkill", lazy='dynamic') def get_ability(self, ability): return self.abilities.filter( CharacterAbility.ability.has(name=ability)).first() def get_skill(self, skill): return self.skills.filter(CharacterSkill.skill.has(name=skill)).first() def add_race_modifiers(self): for ability_mod in self.race.ability_mods: iterator = ( char_ability for char_ability in self.abilities if ability_mod.ability.name in char_ability.ability.name) for ability in iterator: ability.score = ability.score + ability_mod.modifier
class CharacterLog(Base, TimestampMixin): character_id = db.Column(db.ForeignKey('character.id'), index=True) character = db.relationship('Character', backref=backref("logs", cascade="all, delete")) log_id = db.Column(db.ForeignKey('adventurelog.id'), index=True) log = db.relationship('AdventureLog', backref=backref("characters", cascade="all, delete")) xp = db.Column(db.Integer, default=0) gold = db.Column(db.Integer, default=0)
class Player(db.Model): __tablename__ = 'player' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(32)) active = db.Column(db.Boolean, default=True) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) user = db.relationship('User', backref=db.backref('players', lazy='dynamic'))
class ClassInfo(db.Model): __tablename__ = 'class_info' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(32)) spell_ability = db.relationship("Ability") spell_ability_id = db.Column(db.Integer, db.ForeignKey('ability.id')) skill_proficiencies = db.relationship("Skill", secondary=class_skill_table, backref="class_skills")
class Character(db.Model): __tablename__ = 'character' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(32)) theme = db.Column(db.String(32)) hostile = db.Column(db.Boolean, default=False) current_health = db.Column(db.Integer, null=True) statistics = db.relationship("Statistics", uselist=False, backref="character_statistics")
class TimestampMixin(object): created = db.Column(db.DateTime, default=datetime.utcnow) updated = db.Column(db.DateTime, default=datetime.utcnow) @declared_attr def __mapper_args__(cls): return {'order_by': 'created desc'} def readable_date(self, date, format=DATETIMEFORMAT): """Format the given date using the given format.""" return date.strftime(format)
class Room(db.Model): __tablename__ = 'room' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(32)) dungeon_id = db.Column(db.Integer, db.ForeignKey('dungeon.id')) dungeon = db.relationship('Dungeon', backref=db.backref('rooms', lazy='dynamic')) doors = db.relationship('Room', secondary=door, primaryjoin=id == door.c.room_id, secondaryjoin=id == door.c.door_id)
class RaceAbility(db.Model): __tablename__ = 'race_ability' race_id = db.Column(db.Integer, db.ForeignKey('race.id'), primary_key=True) ability_id = db.Column(db.Integer, db.ForeignKey('ability.id'), primary_key=True) modifier = db.Column(db.Integer) ability = db.relationship("Ability") def __init__(self, ability, modifier): self.ability = ability self.modifier = modifier
class Entity(db.Model): __tablename__ = 'entity' id = db.Column(db.Integer, primary_key=True) active = db.Column(db.Boolean, default=True) room_id = db.Column(db.Integer, db.ForeignKey('room.id')) room = db.relationship('Room', backref=db.backref('entities', lazy='dynamic')) character_id = db.Column(db.Integer, db.ForeignKey('character.id')) character = db.relationship('Character', backref=db.backref('entities', lazy='dynamic')) trap_id = db.Column(db.Integer, db.ForeignKey('trap.id')) trap = db.relationship('Trap', backref=db.backref('entities', lazy='dynamic'))
class Race(db.Model): __tablename__ = 'race' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(32)) size = db.Column(db.String(32)) speed = db.Column(db.Integer, default=30) ability_mods = db.relationship("RaceAbility") def get_ability_modifier(self, ability): iterator = (modifier for modifier in self.ability_mods if ability in modifier.ability.name) for modifier in iterator: return modifier return RaceAbility(get_ability(ability), modifier=0)
class Host(db.Model): __tablename__ = 'host' id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) preference = db.relationship("Preference", uselist=False, backref="host") def is_available(self, date): if type(date) is not datetime.date: raise TypeError('arg must be a datetime.date, not a %s' % type(date)) for suspended_date in self.suspended_dates: if date >= suspended_date.from_date and date <= suspended_date.to_date: return False return True
class CharacterSkill(db.Model): __tablename__ = 'character_skill' character_id = db.Column(db.Integer, db.ForeignKey('character.id'), primary_key=True) proficient = db.Column(db.Boolean, default=False) modifier = db.Column(db.Integer) skill_id = db.Column(db.Integer, db.ForeignKey('skill.id'), primary_key=True) skill = db.relationship("Skill") def __init__(self, skill): self.skill = skill self.proficient = True
class AdventureLog(Base, TimestampMixin): date_ran = db.Column(db.DateTime, default=datetime.utcnow) length = db.Column(db.Integer) author_id = db.Column(db.ForeignKey('user.id'), index=True) author = db.relationship('User', backref='logs') def xp_total(self): xp = 0 for character in self.characters: xp = character.xp + xp return xp def gold_total(self): gold = 0 for character in self.characters: gold = character.gold + gold return gold
class CharacterClass(db.Model): __tablename__ = 'character_class' character_id = db.Column(db.Integer, db.ForeignKey('character.id'), primary_key=True) starting = db.Column(db.Boolean, default=False) level = db.Column(db.Integer) class_info_id = db.Column(db.Integer, db.ForeignKey('class_info.id'), primary_key=True) class_info = db.relationship("ClassInfo") def __init__(self, class_info, level, starting=False): self.class_info = class_info self.level = level self.starting = starting
class Preference(db.Model): __tablename__ = 'preference' id = db.Column(db.Integer, primary_key=True) language = db.Column(db.String(32)) wheelchair_access = db.Column(db.Boolean, default=False) smoking_allowed = db.Column(db.Boolean, default=False) pets_allowed = db.Column(db.Boolean, default=False) has_pets = db.Column(db.Boolean, default=False) overnight_stays_allowed = db.Column(db.Boolean, default=False) host_id = db.Column(db.Integer, db.ForeignKey('host.id'))
class Spell(db.Model): __tablename__ = 'spell' id = db.Column(db.Integer, primary_key=True) casting_time = db.Column(db.String(32)) components = db.Column(db.String(32)) description = db.Column(db.String(256)) duration = db.Column(db.String(32)) level = db.Column(db.Integer, default=0) range_distance = db.Column(db.Integer, default=0) school = db.Column(db.String(32))
class Trait(db.Model): __tablename__ = 'trait' id = db.Column(db.Integer, primary_key=True) language = db.Column(db.String(32)) disabled = db.Column(db.Boolean, default=False) smoker = db.Column(db.Boolean, default=False) pets_allowed = db.Column(db.Boolean, default=False) has_pets = db.Column(db.Boolean, default=False) overnight_stay = db.Column(db.Boolean, default=False) guest_id = db.Column(db.Integer, db.ForeignKey('guest.id'))
class Suspend(db.Model): __tablename__ = 'suspend' id = db.Column(db.Integer, primary_key=True) host_id = db.Column(db.Integer, db.ForeignKey('host.id')) host = db.relationship('Host', backref=db.backref('suspended_dates', lazy='dynamic')) from_date = db.Column(db.Date) to_date = db.Column(db.Date) def is_available(self, date): if type(date) is not datetime.date: raise TypeError('arg must be a datetime.date, not a %s' % type(date)) if date >= self.from_date and date <= self.to_date: return False else: return True
class CharacterAbility(db.Model): __tablename__ = 'character_ability' character_id = db.Column(db.Integer, db.ForeignKey('character.id'), primary_key=True) score = db.Column(db.Integer) modifier = db.Column(db.Integer) ability_id = db.Column(db.Integer, db.ForeignKey('ability.id'), primary_key=True) ability = db.relationship("Ability") def __init__(self, ability, score): self.ability = ability self.score = score def __setattr__(self, name, value): # Call the parent class method first. super(CharacterAbility, self).__setattr__(name, value) if (name == "score"): self.modifier = int((self.score - 10) / 2)
class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(32), index=True) password_hash = db.Column(db.String(128)) first_name = db.Column(db.String(32)) last_name = db.Column(db.String(32)) email = db.Column(db.String(64)) gender = db.Column(db.String(32)) admin = db.Column(db.Boolean, default=False) def hash_password(self, password): self.password_hash = pwd_context.hash(password) def verify_password(self, password): return pwd_context.verify(password, self.password_hash)
class Location(db.Model): __tablename__ = 'address' id = db.Column(db.Integer, primary_key=True) address1 = db.Column(db.String(64)) address2 = db.Column(db.String(64)) city = db.Column(db.String(32)) state = db.Column(db.String(32)) host_id = db.Column(db.Integer, db.ForeignKey('host.id')) host = db.relationship('Host', backref=db.backref('location', lazy='dynamic'))
class Dungeon(db.Model): __tablename__ = 'dungeon' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(32))
from v1.apps import db door = db.Table( 'doors', db.Model.metadata, db.Column('room_id', db.Integer, db.ForeignKey('room.id'), index=True), db.Column('door_id', db.Integer, db.ForeignKey('room.id')), db.UniqueConstraint('room_id', 'door_id', name='unique_door')) class Dungeon(db.Model): __tablename__ = 'dungeon' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(32)) class Room(db.Model): __tablename__ = 'room' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(32)) dungeon_id = db.Column(db.Integer, db.ForeignKey('dungeon.id')) dungeon = db.relationship('Dungeon', backref=db.backref('rooms', lazy='dynamic')) doors = db.relationship('Room', secondary=door, primaryjoin=id == door.c.room_id, secondaryjoin=id == door.c.door_id)
class Guest(db.Model): __tablename__ = 'guest' id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) trait = db.relationship("Trait", uselist=False, backref="guest")
class Statistics(db.Model): __tablename__ = 'statistics' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(32)) level = db.Column(db.Integer, default=1) max_health = db.Column(db.Integer, default=1) damage_min = db.Column(db.Integer, default=1) damage_max = db.Column(db.Integer, default=4) armor_class = db.Column(db.Integer, default=10) strength = db.Column(db.Integer, default=8) dexterity = db.Column(db.Integer, default=8) consitution = db.Column(db.Integer, default=8) intelligence = db.Column(db.Integer, default=8) wisdom = db.Column(db.Integer, default=8) charisma = db.Column(db.Integer, default=8) character_id = db.Column(db.Integer, db.ForeignKey('character.id')) trap_id = db.Column(db.Integer, db.ForeignKey('trap.id'))
class SkillEntity(db.Model): __tablename__ = 'skill_entity' statistics_id = db.Column(db.Integer, db.ForeignKey('statistics.id'), primary_key=True) modifier = db.Column(db.Integer, default=0) skill_id = db.Column(db.Integer, db.ForeignKey('skill.id')) skill = db.relationship("Skill")
class AbilityEntity(db.Model): __tablename__ = 'ability_entity' statistics_id = db.Column(db.Integer, db.ForeignKey('statistics.id'), primary_key=True) modifier = db.Column(db.Integer, default=0) ability_id = db.Column(db.Integer, db.ForeignKey('ability.id')) ability = db.relationship("Ability")