· 7 years ago · Oct 25, 2018, 09:32 PM
1import sys
2from flask_appbuilder import SQLA, AppBuilder, ModelView, Model
3from flask_appbuilder.models.sqla.interface import SQLAInterface
4from sqlalchemy import Column, Integer, String, ForeignKey, Table
5from sqlalchemy.orm import relationship
6from flask import Flask
7
8config = {
9 'SQLALCHEMY_DATABASE_URI': 'postgres:///test',
10 'CSRF_ENABLED': True,
11 'SECRET_KEY': '\2\1thisismyscretkey\1\2\e\y\y\h',
12 'APP_NAME': 'Issue #759'
13}
14
15app = Flask('issue#759')
16app.config.update(config)
17db = SQLA(app)
18appbuilder = AppBuilder(app, db.session)
19
20
21program_registration = Table(
22 'program_registration',
23 Model.metadata,
24 Column('program_id', Integer, ForeignKey('program.id')),
25 Column('student_id', Integer, ForeignKey('student.id')))
26
27
28course_registration = Table(
29 'course_registration',
30 Model.metadata,
31 Column('course_id', Integer, ForeignKey('course.id')),
32 Column('student_id', Integer, ForeignKey('student.id')))
33
34
35class Teacher(Model):
36 id = Column(Integer, primary_key=True)
37 name = Column(String, nullable=False)
38
39 def __repr__(self):
40 return self.name
41
42
43class Program(Model):
44 id = Column(Integer, primary_key=True)
45 name = Column(String, nullable=False)
46
47 def __repr__(self):
48 return self.name
49
50
51class Student(Model):
52 id = Column(Integer, primary_key=True)
53 name = Column(String, nullable=False)
54 program = relationship(Program, secondary=program_registration,
55 backref='students')
56
57 def __repr__(self):
58 return self.name
59
60
61class Course(Model):
62 id = Column(Integer, primary_key=True)
63 title = Column(String, nullable=False)
64 teacher_id = Column(Integer, ForeignKey('teacher.id'), nullable=False)
65 teacher = relationship(Teacher, backref='courses')
66 students = relationship(Student, secondary=course_registration,
67 backref='courses')
68
69 def __repr__(self):
70 return self.title
71
72
73class CourseView(ModelView):
74 datamodel = SQLAInterface(Course)
75
76 list_columns = ['title', 'teacher']
77 show_columns = ['title', 'teacher']
78
79
80class ProgramView(ModelView):
81 datamodel = SQLAInterface(Program)
82 list_columns = ['name']
83 show_columns = ['name', 'students']
84 add_columns = ['name']
85
86
87class StudentView(ModelView):
88 datamodel = SQLAInterface(Student)
89 related_views = [CourseView, ProgramView]
90
91 list_columns = ['name']
92
93
94class TeacherView(ModelView):
95 datamodel = SQLAInterface(Teacher)
96 related_views = [StudentView]
97
98 list_columns = ['name']
99
100
101db.create_all()
102
103appbuilder.add_view(TeacherView, 'Teachers')
104appbuilder.add_view(CourseView, 'Courses')
105appbuilder.add_view(StudentView, 'Students')
106appbuilder.add_view(ProgramView, 'Programs')
107
108def add_data():
109
110 db.session.add(Program(name="Bachelor of Science IT"))
111 db.session.add(Program(name="Bachelor of Science Computer Science"))
112 dolf = Teacher(name='Dolf Andringa')
113 db.session.add(dolf)
114 db.session.add(Course(title="Introduction to Programming using Pyhon",
115 teacher=dolf))
116 db.session.add(Course(title="Mathematics I", teacher=dolf))
117 db.session.commit()
118
119
120if __name__ == '__main__':
121 if len(sys.argv) > 1 and sys.argv[1] == '--add_data':
122 add_data()
123 else:
124 app.run()