-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmodels.py
More file actions
135 lines (105 loc) · 5.54 KB
/
models.py
File metadata and controls
135 lines (105 loc) · 5.54 KB
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
130
131
132
133
134
135
import enum
import re
from sqlalchemy_mptt.mixins import BaseNestedSets
from apluslms_shepherd.extensions import db
# db.metadata.clear()
# Association tables for ManyToMany relationships
# For Group model and User model
gm_table = db.Table('gm_table', db.Model.metadata,
db.Column('group_id', db.Integer, db.ForeignKey('group.id')),
db.Column('user_id', db.String, db.ForeignKey('user.id'))
)
# For Group model and Permission model
gp_table = db.Table('gp_table', db.Model.metadata,
db.Column('group_id', db.Integer, db.ForeignKey('group.id')),
db.Column('permission_id', db.Integer, db.ForeignKey('group_permission.id'))
)
# For Group model and CourseInstance model
gc_table = db.Table('gc_table', db.Model.metadata,
db.Column('group_id', db.Integer, db.ForeignKey('group.id')),
db.Column('course_instance_id', db.Integer, db.ForeignKey('course_instance.id'))
)
# CRUD class
class CRUD():
def save(self):
db.session.add(self)
return db.session.commit()
def delete(self):
db.session.delete(self)
return db.session.commit()
class Group(db.Model, BaseNestedSets, CRUD):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), index=True, nullable=False)
members = db.relationship("User", secondary=gm_table,
backref=db.backref('groups', lazy='dynamic'))
# Permissions include 'create subgroups' and 'create courses'
permissions = db.relationship("GroupPermission", secondary=gp_table,
backref=db.backref('groups', lazy='dynamic'))
# Whether the group can manage itself (edit, delete, membership management)
self_admin = db.Column(db.Boolean, default=True)
def __init__(self, name, parent_id=None):
self.name = name
self.parent_id = parent_id
def __repr__(self):
if self.parent is None:
return "Root: <Group (id={0}, name={1}, parent=None)>".format(self.id, self.name)
else:
return "<Group (id={0}, name={1}, parent={2})>".format(self.id, self.name,
self.parent.name)
class PermType(enum.Enum):
subgroups = 1
courses = 2
class GroupPermission(db.Model):
id = db.Column(db.Integer, primary_key=True)
type = db.Column(db.Enum(PermType))
def __repr__(self):
return "<Permission (type={0})>".format(self.type.name)
class CreateGroupPerm(db.Model):
# id = db.Column(db.Integer, primary_key=True)
group_id = db.Column(db.Integer, db.ForeignKey('group.id'), primary_key=True)
target_group_id = db.Column(db.Integer, db.ForeignKey('group.id'), primary_key=True)
# The group whose members have the permission to create subgroups
group = db.relationship('Group',
foreign_keys=[group_id],
# primaryjoin = "CreateGroupPerm.group_id == Group.id",
uselist=False,
backref=db.backref("group_perm", cascade='all,delete'))
# The parent group of the subgroups created by the group with group_id
target_group = db.relationship('Group',
foreign_keys=[target_group_id],
# primaryjoin = "CreateGroupPerm.target_group_id == Group.id",
uselist=False,
backref=db.backref("group_perm_as_target", cascade='all,delete'))
def __repr__(self):
return "<Create Group Permission (group={0}, target_group={1})>,".format(self.group,
self.target_group)
class CreateCoursePerm(db.Model):
group_id = db.Column(db.Integer, db.ForeignKey('group.id'), primary_key=True)
# The group whose members have the permission to create courses
group = db.relationship("Group", backref=db.backref("course_permission",
uselist=False, cascade='all,delete'))
regexp = db.Column(db.Boolean, default=True)
# The course naming rule (a regular expression)
pattern = db.Column(db.String(100))
def __repr__(self):
return "<Create Course Permission (group={0}, pattern={1})>,".format(self.group,
self.pattern)
def pattern_match(self, course_name):
"""Check whether the course_name meet the pattern requirement.
"""
if self.pattern is None: # No pattern requirement needed
return True
return True if re.match(self.pattern, course_name) else False
class CourseOwnerType(enum.Enum):
admin = 1
assistant = 2
class ManageCoursePerm(db.Model):
course__instance_id = db.Column(db.Integer, db.ForeignKey('course_instance.id'), primary_key=True)
group_id = db.Column(db.Integer, db.ForeignKey('group.id'), primary_key=True)
course_instance = db.relationship('CourseInstance', foreign_keys=[course__instance_id],
uselist=False,
backref=db.backref("manage_course_perm", cascade='all,delete'))
group = db.relationship('Group', foreign_keys=[group_id],
uselist=False,
backref=db.backref("manage_course_perm", cascade='all,delete'))
type = db.Column(db.Enum(CourseOwnerType))