-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathapp.py
More file actions
98 lines (66 loc) · 2.68 KB
/
app.py
File metadata and controls
98 lines (66 loc) · 2.68 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
from flask import Flask
from config import Configuration
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager
from flask_login import LoginManager
from flask_admin import Admin
from flask_admin import AdminIndexView
from flask_admin.contrib.sqla import ModelView
from flask_security import SQLAlchemyUserDatastore
from flask_security import Security
from flask_security import current_user
from flask import redirect, url_for, request
app = Flask(__name__)
app.config.from_object(Configuration)
db = SQLAlchemy(app)
# from sqlalchemy import text
#
# sql = text('alter table "user" auto_increment=1')
# result = db.engine.execute(sql)
# names = [row[0] for row in result]
# print(names)
migrate = Migrate(app, db)
login_manager = LoginManager(app)
manager = Manager(app)
manager.add_command('db', MigrateCommand)
### Admin ###
from models import *
class AdminMixin:
"""Class AdminMixin for admin panel"""
def is_accessible(self):
return current_user.has_role('admin')
def inaccessible_callback(self, name, **kwargs):
return redirect(url_for('security.login', next=request.url))
class BaseModelView(ModelView):
"""Class BaseModelView for admin panel"""
def on_model_change(self, form, model, is_created):
model.generate_slug()
return super(BaseModelView, self).on_model_change(form, model, is_created)
class AdminView(AdminMixin, ModelView):
"""Class AdminView for admin panel"""
pass
class HomeAdminView(AdminMixin, AdminIndexView):
"""Class HomeAdminView for admin panel"""
pass
class PostAdminView(AdminMixin, BaseModelView):
"""Class PostAdminView for admin panel"""
form_columns = ['title', 'body', 'tags']
class TagAdminView(AdminMixin, BaseModelView):
"""Class TagAdminView for admin panel"""
form_columns = ['name', 'posts']
class ProjectAdminView(AdminMixin, BaseModelView):
"""Class ProjectAdminView for admin panel"""
form_columns = ['name', 'description', 'users', 'slug', 'created_by', 'created']
class TaskAdminView(AdminMixin, BaseModelView):
form_columns = ['title', 'description', 'state', 'slug', 'role', 'created', 'deadline', 'artefacts', 'user_email']
admin = Admin(app, 'FlaskApp', url='/', index_view=HomeAdminView(name='Home'))
admin.add_view(PostAdminView(Post, db.session))
admin.add_view(TagAdminView(Tag, db.session))
admin.add_view(AdminView(User, db.session))
admin.add_view(AdminView(Role, db.session))
admin.add_view(ProjectAdminView(Project, db.session))
admin.add_view(TaskAdminView(Task, db.session))
### Flask-security
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)