aboutsummaryrefslogtreecommitdiffstats
path: root/database/models.py
blob: 5d6c5a58fe46ba683f446e5e15194b69c2c31d55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
"""
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=4)
    strength = StringField(required=True, max_length=4)
    speed = StringField(required=True, max_length=4)
    durability = StringField(required=True, max_lenth=4)
    power = StringField(required=True, max_length=4)
    combat = StringField(required=True, max_length=4)


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=200)
    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)