-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathadmin.py
More file actions
86 lines (65 loc) · 2.75 KB
/
admin.py
File metadata and controls
86 lines (65 loc) · 2.75 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
from app import app, db
from wtforms.fields import SelectField,PasswordField
from flask import g, url_for,redirect, request
from flask_admin import Admin, AdminIndexView, expose
from flask_admin.contrib.sqla import ModelView
from flask_admin.contrib.fileadmin import FileAdmin
from models import Entry, Tag, User
class IndexView(AdminIndexView):
@expose('/')
def index(self):
if not (g.user.is_authenticated and g.user.is_admin):
return redirect(url_for('login',next = request.path))
return self.render('admin/index.html')
class AdminAuthentication(object):
def is_accessible(self):
return g.user.is_authenticated and g.user.is_admin()
class BlogFileAdmin(AdminAuthentication,FileAdmin):
pass
class BaseModelView(AdminAuthentication,ModelView):
pass
class SlugModelView(BaseModelView):
def on_model_change(self, form, model, is_created):
model.generate_slug()
return super(SlugModelView,self).on_model_change(form, model, is_created)
class EntryModelView(SlugModelView):
_status_choices = [(choice,label)for choice,label in [(Entry.public,'Public'),(Entry.draft,'Draft'),(Entry.deleted,'Deleted'),]]
column_list = ['title','status','author','tease','tag_list','created_timestamp']
column_choices = {
'status':_status_choices,
}
column_filters = ['status',User.name, User.email, 'created_timestamp']
column_searchable_list = ['title','body','status']
column_select_related_list = ['author']
form_columns = ['title','body','status','author','tags']
form_args = {
'status':{'choices':_status_choices,'coerce':int}
}
form_overrides = {
'status':SelectField
}
form_ajax_refs = {
'author':{
'fields':(User.name, User.email),
}
}
class TagModelView(BaseModelView):
column_list=['id','name','slug']
column_searchable_list = ['name']
class UserModelView(BaseModelView):
column_filters = ('email', 'name', 'active','admin')
column_list = ['email', 'name', 'active','admin', 'created_timestamp']
column_searchable_list = ['email', 'name','admin']
form_columns = ['email', 'password', 'name', 'active','admin']
form_extra_fields = {
'password': PasswordField('New password'),
}
def on_model_change(self, form, model, is_created):
if form.password.data:
model.password_hash = User.make_password(form.password.data)
return super(UserModelView, self).on_model_change(form, model, is_created)
admin = Admin(app, 'Blog Admin', index_view = IndexView())
admin.add_view(EntryModelView(Entry, db.session))
admin.add_view(TagModelView(Tag, db.session))
admin.add_view(UserModelView(User, db.session))
admin.add_view(BlogFileAdmin(app.config['STATIC_DIR'],'/static/',name = 'Static Files'))