""" Models """ import mongoengine_goodjson as gj from mongoengine.fields import ( EmailField, ListField, StringField, URLField ) from mongoengine import ( BooleanField, EmbeddedDocument, EmbeddedDocumentField, ReferenceField, CASCADE, PULL ) from werkzeug.security import ( generate_password_hash, check_password_hash ) class PowerstatsModel(EmbeddedDocument): intelligence = StringField(required=True, max_length=3) strength = StringField(required=True, max_length=3) speed = StringField(required=True, max_length=3) durability = StringField(required=True, max_length=3) power = StringField(required=True, max_length=3) combat = StringField(required=True, max_length=3) class BiographyModel(EmbeddedDocument): fullname = StringField(required=True, unique=True, max_length=100) alteregos = StringField(required=True, max_length=100) aliases = ListField(required=True, max_length=100) placeofbirth = StringField(required=True, max_length=100) firstappearance = StringField(required=True, max_length=100) publisher = StringField(required=True, max_length=50) alignment = StringField(required=True, max_length=10) class AppearanceModel(EmbeddedDocument): gender = StringField(required=True, max_length=10) race = StringField(required=True, max_length=20) height = ListField(required=True, max_length=30) weight = ListField(required=True, max_length=30) eyecolor = StringField(required=True, max_length=20) haircolor = StringField(required=True, max_length=20) class WorkModel(EmbeddedDocument): occupation = StringField(required=True, max_length=200) base = StringField(required=True, max_length=200) class ConnectionModel(EmbeddedDocument): groupaffiliation = StringField(required=True, max_length=255) relatives = StringField(required=True, max_length=255) class ImageModel(EmbeddedDocument): url = URLField(required=True, max_length=255) class HeroeModel(gj.Document): name = StringField(required=True, max_length=50) powerstats = EmbeddedDocumentField(PowerstatsModel, required=True) biography = EmbeddedDocumentField(BiographyModel, required=True) appearance = EmbeddedDocumentField(AppearanceModel, required=True) work = EmbeddedDocumentField(WorkModel, required=True) connections = EmbeddedDocumentField(ConnectionModel, required=True) image = EmbeddedDocumentField(ImageModel, required=True) added_by = ReferenceField('UserModel') class UserModel(gj.Document): username = StringField(required=True, unique=True, max_length=50) email = EmailField(required=True, unique=True, max_length=50) password = StringField(required=True) admin = BooleanField(required=True) heroes = ListField(ReferenceField('HeroeModel', reverse_delete_rule=PULL)) def hash_password(self): self.password = generate_password_hash(self.password).decode('utf8') def check_password(self, password): return check_password_hash(self.password, password) UserModel.register_delete_rule(HeroeModel, 'added_by', CASCADE)