summaryrefslogtreecommitdiffstats
path: root/models.py
blob: fd33a478c4028515977dd49151bd8da8014cebf7 (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
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 __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 __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 __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 __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)