summaryrefslogtreecommitdiffstats
path: root/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'models.py')
-rw-r--r--models.py235
1 files changed, 140 insertions, 95 deletions
diff --git a/models.py b/models.py
index d2f1ae4..564c27c 100644
--- a/models.py
+++ b/models.py
@@ -1,89 +1,132 @@
-from peewee import CharField, DateTimeField, BooleanField, ForeignKeyField, TextField
-from peewee import create_model_tables
from datetime import datetime, timedelta
-from app import db, pad
+from flask.ext.login import UserMixin
+from sqlalchemy.orm import backref
+from sqlalchemy.sql import func, expression
+
+from app import db, pad, login
from padlite import APIException
+from utils.apimixin import APIMixin
+from utils.login import user_cls
-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 column(*args, **kwargs):
+ """ I want to have a Column with nullable defaults to True. """
+ kwargs["nullable"] = kwargs.get("nullable", False)
+ return db.Column(*args, **kwargs)
+
+
+class SessionMixin(object):
+ @classmethod
+ def create(cls, *args, **kwargs):
+ obj = cls(*args, **kwargs)
+ db.session.add(obj)
+ return obj
+
- def __unicode__(self):
- return self.username
+@user_cls(login)
+class User(UserMixin, APIMixin, SessionMixin, db.Model):
+ __tablename__ = 'users'
-class Group(db.Model):
- name = CharField(unique=True)
- api_id = CharField(null=True)
- public = BooleanField(default=False)
- browsable = BooleanField(default=False)
- description = TextField(null=True)
+ id = column(db.Integer, primary_key=True)
+ name = column(db.String(255), unique=True)
+ email = column(db.String(255))
+ last_login = column(db.DateTime(timezone=True), server_default=func.now())
+ active = column(db.Boolean, default=True,
+ server_default=expression.true())
+ admin = column(db.Boolean, default=False,
+ server_default=expression.false())
def __str__(self):
return self.name
- def __unicode__(self):
+ def __repr__(self):
+ return '<User: %r>' % self.name
+
+ def create_api_object(self):
+ self.api_id = pad.createAuthor(self.name)
+
+ def remove_api_object(self):
+ # authors could not be deleted with padlite api
+ pass
+
+
+class Group(APIMixin, SessionMixin, db.Model):
+ __tablename__ = 'groups'
+
+ id = column(db.Integer, primary_key=True)
+ name = column(db.String(255), unique=True)
+ public = column(db.Boolean, default=False,
+ server_default=expression.false())
+ browsable = column(db.Boolean, default=False,
+ server_default=expression.false())
+ description = column(db.Text, nullable=True)
+
+ def __str__(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()
+ def __repr__(self):
+ return '<Group: %r>' % self.name
- super(Group, self).save(force_insert=force_insert, only=only)
+ def create_api_object(self):
+ self.api_id = pad.createGroup()
- 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)
- active = BooleanField(default=False)
+ def remove_api_object(self):
+ pad.deleteGroup(self.api_id)
+
+
+class Member(SessionMixin, db.Model):
+ __tablename__ = 'members'
+
+ id = column(db.Integer, primary_key=True)
+ group_id = column(db.Integer, db.ForeignKey('groups.id'))
+ user_id = column(db.Integer, db.ForeignKey('users.id'))
+ manager = column(db.Boolean, server_default=expression.false())
+ admin = column(db.Boolean, server_default=expression.false())
+ active = column(db.Boolean, server_default=expression.false())
+
+ user = db.relationship(
+ "User", backref=backref("memberships", cascade="delete"))
+ group = db.relationship(
+ "Group", backref=backref("members", cascade="delete"))
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)
+ return "%s member of %s" % (self.user.name, self.group.name)
+
+ def __repr__(self):
+ return "<Member: %r of %r>" % (self.user, self.group)
+
+
+class Session(APIMixin, SessionMixin, db.Model):
+ __tablename__ = 'sessions'
+
+ id = column(db.Integer, primary_key=True)
+ user_id = column(db.Integer, db.ForeignKey('users.id'))
+ group_id = column(db.Integer, db.ForeignKey('groups.id'))
+ uuid = column(db.String(36))
+ valid_until = column(db.DateTime(timezone=True))
+
+ user = db.relationship(
+ "User", backref=backref("sessions", cascade="delete"))
+ group = db.relationship(
+ "Group", backref=backref("sessions", cascade="delete"))
+
+ def __repr__(self):
+ return "<Session: %r>" % (self.user)
+
+ def create_api_object(self):
+ self.valid_until = datetime.now() + timedelta(hours=4)
+ self.api_id = pad.createSession(
+ self.group.get_api_id(),
+ self.user.get_api_id(),
+ self.valid_until.strftime("%s"))
+
+ def remove_api_object(self):
+ 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
def is_valid(self):
if self.api_id is None:
@@ -95,37 +138,39 @@ class Session(db.Model):
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)
+
+class Pad(APIMixin, SessionMixin, db.Model):
+ __tablename__ = 'pads'
+ __table_args__ = (
+ db.UniqueConstraint('name', 'group_id'),
+ )
+
+ id = column(db.Integer, primary_key=True)
+ name = column(db.String(255))
+ group_id = column(db.Integer, db.ForeignKey('groups.id'))
+ created = column(db.DateTime(timezone=True), server_default=func.now())
+ public = column(db.Boolean, default=False,
+ server_default=expression.false())
+ password = column(db.String(255), default='',
+ nullable=True)
+
+ group = db.relationship(
+ "Group", backref=backref("pads", cascade="delete"))
def __str__(self):
return self.name
- def __unicode__(self):
- return self.name
+ def __repr__(self):
+ return "<Pad: %r for %r>" % (self.name, self.group)
- 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')
+ def create_api_object(self):
+ self.api_id = pad.createGroupPad(
+ self.group.get_api_id(), self.name, 'testing')
+ def remove_api_object(self):
+ pad.deletePad(self.api_id)
+
+ def after_commit(self):
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)