summaryrefslogtreecommitdiffstats
path: root/models.py
blob: 04698023203b7de3efd466d6c4923ee965f590e3 (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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
from peewee import CharField, DateTimeField, BooleanField, ForeignKeyField
from peewee import create_model_tables
from datetime import datetime, timedelta
from app import db, pad
from padlite import APIException

class User(db.Model):
    username = CharField()
    api_id = CharField(null=True)
    email = CharField()
    last_login = DateTimeField(default=datetime.now)
    active = BooleanField(default=True)
    admin = BooleanField(default=False)

    def __str__(self):
        return self.username

    def __unicode__(self):
        return self.username

class Group(db.Model):
    name = CharField(unique=True)
    api_id = CharField(null=True)
    public = BooleanField(default=False)
    browsable = BooleanField(default=False)

    def __str__(self):
        return self.name

    def __unicode__(self):
        return self.name

    def save(self, force_insert=False, only=None):
        if self.id is None or force_insert:
            self.api_id = pad.createGroup()

        super(Group, self).save(force_insert=force_insert, only=only)

    def delete_instance(self, **kwargs):
        if self.api_id is not None:
            pad.deleteGroup(self.api_id)
            self.api_id = None
            self.save()
        super(Group, self).delete_instance(**kwargs)

class Member(db.Model):
    group = ForeignKeyField(Group, related_name='members')
    user = ForeignKeyField(User, related_name='groups')
    manager = BooleanField(default=False)
    admin = BooleanField(default=False)

    def __str__(self):
        return "%s member of %s" % (self.user.username, self.group.name)

    def __unicode__(self):
        return "%s member of %s" % (self.user.username, self.group.name)

class Session(db.Model):
    api_id = CharField(null=True)
    user = ForeignKeyField(User, related_name='sessions')
    group = ForeignKeyField(Group, related_name='sessions')
    uuid = CharField()
    valid_until = DateTimeField(null=True)

    def save(self, force_insert=False, only=None):
        if self.id is None or force_insert:
            if self.group.api_id is None:
                self.group.api_id = pad.createGroup()
            self.valid_until = datetime.now() + timedelta(hours=4)
            self.api_id = pad.createSession(self.group.api_id, self.user.api_id,
                                            self.valid_until.strftime("%s"))
        super(Session, self).save(force_insert=force_insert, only=only)

    def delete_instance(self, **kwargs):
        if self.api_id is not None:
            try:
                pad.deleteSession(self.api_id)
            except APIException as e:
                # we want to ignore code 1 = sessionID does not exist
                if e.code != 1:
                    raise
            self.api_id = None
            self.save()
        super(Session, self).delete_instance(**kwargs)

    def is_valid(self):
        if self.api_id is None:
            return True

        if self.valid_until is not None:
            if datetime.now() + timedelta(minutes=30) < self.valid_until:
                return True

        return False

class Pad(db.Model):
    name = CharField(verbose_name='pad name')
    api_id = CharField(null=True)
    group = ForeignKeyField(Group, related_name='pads')
    created = DateTimeField(default=datetime.now)
    public = BooleanField(default=False)
    password = CharField(null=True)

    def __str__(self):
        return self.name

    def __unicode__(self):
        return self.name

    def save(self, force_insert=False, only=None):
        if self.id is None or force_insert:
            if self.group.api_id is None:
                self.group.api_id = pad.createGroup()
            self.api_id = pad.createGroupPad(self.group.api_id, self.name, 'testing')

        if self.api_id is not None:
            pad.setPublicStatus(self.api_id, self.public)
            pad.setPassword(self.api_id, self.password)
        super(Pad, self).save(force_insert=force_insert, only=only)

    def delete_instance(self, **kwargs):
        if self.api_id is not None:
            pad.deletePad(self.api_id)
            self.api_id = None
            self.save()
        super(Pad, self).delete_instance(**kwargs)

def create_tables():
    create_model_tables([User, Group, Member, Session, Pad], fail_silently = True)