7 from tinydb import TinyDB,Query,where
8 from tinydb.operations import delete
9 from datetime import datetime
11 class BaseHandler(tornado.web.RequestHandler):
12 def get_current_user(self):
13 user = self.get_secure_cookie('admin_user')
14 return tornado.escape.utf8(user)
16 def set_current_user(self,username):
17 self.set_secure_cookie('admin_user',username)
19 def clear_current_user(self):
20 self.clear_cookie('admin_user')
22 class IndexHandler(BaseHandler):
23 def get(self,dbname,page='0'):
24 params = self.application.db.get(where('kinds') == 'conf')
25 if params['mentenance'] == True:
26 self.render('mentenance.htm',title=params['title'],db=dbname)
27 if self.application.collection(dbname) == False:
28 if self.current_user == b'admin':
29 self.application.db.table(dbname)
31 self.render('regist.htm',content='urlが見つかりません')
33 na = self.get_cookie('username')
34 pos = self.application.gpos(dbname,page)
35 table = self.application.db.table(dbname)
41 rec = table.all()[start:start+i]
42 if len(table) >= 10*i:
43 self.render('modules/full.htm',position=pos,records=rec,data=params,db=dbname)
44 self.render('modules/index.htm',position=pos,records=rec,data=params,username=na,db=dbname)
46 class LoginHandler(BaseHandler):
48 self.render('login.htm')
51 pw = self.application.db.get(where('kinds') == 'conf')
52 if self.get_argument('password') == pw['password']:
53 self.set_current_user('admin')
54 dbname = self.get_argument('record')
55 self.redirect('/'+dbname+'/admin/0/')
57 class LogoutHandler(BaseHandler):
59 self.clear_current_user()
60 self.redirect('/login')
62 class NaviHandler(tornado.web.RequestHandler):
64 self.render('top.htm',coll=sorted(self.name()),full=self.full)
67 for x in self.application.db.tables():
71 def full(self,dbname):
72 if dbname in self.application.db.tables():
73 i = 10*self.application.db.get(where('kinds') == 'conf')['count']
74 table = self.application.db.table(dbname)
79 class TitleHandler(NaviHandler):
81 self.render('title.htm',coll=self.name(),full=self.full,
82 count=self.count,title=self.title,update=self.update)
84 def count(self,dbname):
85 if dbname in self.application.db.tables():
86 return len(self.application.db.table(dbname))
90 def title(self,dbname):
91 if dbname in self.application.db.tables():
92 table = self.application.db.table(dbname)
96 return table.all()[0]['title']
98 def update(self,dbname):
99 if dbname in self.application.db.tables():
100 table = self.application.db.table(dbname)
104 return table.all()[len(table)-1]['date']
106 class RegistHandler(tornado.web.RequestHandler):
107 def post(self,dbname):
108 if self.application.collection(dbname) == False:
109 self.render('regist.htm',content='urlが存在しません')
110 words = ['<link','<script','<style','<img']
111 out = ['ばか','死ね','あほ']
112 na = self.get_argument('name')
113 sub = self.get_argument('title')
114 com = self.get_argument('comment')
118 for line in com.splitlines(True):
121 error = error + u'タグ違反.('+word+')'
122 text = text+'<p>'+line
126 error = error + u'禁止ワード.'
128 pw = self.get_argument('password')
134 error = error + u'本文がありません.'
136 error = error +u'文字数が1,000をこえました.'
137 article = self.application.db.table(dbname)
138 if len(article) == 0:
141 item = article.all()[len(article)-1]
142 no = item['number']+1
144 reg = {'number':no,'name':na,'title':sub,'comment':text,'password':pw,'date':datetime.now().strftime('%Y/%D:%M')}
146 self.set_cookie('username',na)
147 self.redirect('/'+dbname+'#article')
149 self.render('regist.htm',content=error)
151 class AdminHandler(BaseHandler):
152 @tornado.web.authenticated
153 def get(self,dbname,page='0'):
155 dbname = self.get_argument('record','')
156 if self.application.collection(dbname) == False:
157 self.render('regist.htm',content='urlが見つかりません')
158 table = self.application.db.table(dbname)
160 mente = self.application.db.get(where('kinds') == 'conf')
161 if mente['mentenance'] == True:
162 check = 'checked=checked'
165 pos = self.application.gpos(dbname,page)
166 self.render('modules/admin.htm',position=pos,records=rec,mente=check,password=mente['password'],db=dbname)
168 class AdminConfHandler(BaseHandler):
169 @tornado.web.authenticated
170 def post(self,dbname,func):
172 if self.get_argument('mente','') == 'on':
176 word = self.get_argument('pass','')
178 self.render('regist.htm',content='パスワードを設定してください')
180 self.application.db.update({'mentenance':mente,'password':word},where('kinds') == 'conf')
182 table = self.application.db.table(dbname)
183 for x in self.get_arguments('item'):
184 table.remove(where('number') == int(x))
185 self.redirect('/'+dbname+'/admin/0/')
187 class UserHandler(tornado.web.RequestHandler):
188 def post(self,dbname):
189 num = int(self.get_argument('number'))
190 pas = self.get_argument('password')
191 table = self.application.db.table(dbname)
193 obj = table.get(qwr.number == num)
194 if obj and(obj['password'] == pas):
195 table.remove(qwr.number == num)
196 self.redirect('/'+dbname)
198 class SearchHandler(tornado.web.RequestHandler):
199 def post(self,dbname):
200 self.word = self.get_argument('word1')
201 self.radiobox = self.get_argument('filter')
202 self.set_cookie('search',self.word)
203 table = self.application.db.table(dbname)
204 self.render('modules/search.htm',records=self.mylist(table.all()),word1=self.word,db=dbname)
206 def get(self,dbname):
207 word = self.get_cookie('search')
208 self.render('modules/search.htm',records={},word1=word,db=dbname)
210 def mylist(self,rec):
211 for searchrec in rec:
212 if self.radiobox == 'name':
213 if searchrec['name'].find(self.word) == True:
216 if searchrec['comment'].find(self.word) == True:
219 class FooterModule(tornado.web.UIModule):
220 def render(self,number,url,link):
221 return self.render_string('modules/footer.htm',index=number,url=url,link=link)
223 class Application(tornado.web.Application):
225 self.db = TinyDB('static/db/db.json')
226 handlers = [(r'/',NaviHandler),(r'/login',LoginHandler),(r'/logout',LogoutHandler),(r'/title',TitleHandler),
227 (r'/([a-zA-Z0-9_]+)',IndexHandler),(r'/([a-zA-Z0-9_]+)/([0-9]+)/',IndexHandler),
228 (r'/([a-zA-Z0-9_]+)/admin/([0-9]+)/',AdminHandler),(r'/([a-zA-Z0-9_]+)/admin/([a-z]+)/',AdminConfHandler),(r'/([a-zA-Z0-9_]+)/userdel',UserHandler),
229 (r'/([a-zA-Z0-9_]+)/search',SearchHandler),(r'/([a-zA-Z0-9_]+)/regist',RegistHandler)]
230 settings = {'template_path':os.path.join(os.path.dirname(__file__),'pybbs'),
231 'static_path':os.path.join(os.path.dirname(__file__),'static'),
232 'ui_modules':{'Footer':FooterModule},
233 'cookie_secret':'bZJc2sWbQLKos6GkHn/VB9oXwQt8SOROkRvJ5/xJ89E=',
238 tornado.web.Application.__init__(self,handlers,**settings)
240 def gpos(self,dbname,page):
241 params = self.db.get(where('kinds') == 'conf')
245 elif (pos-1)*params['count'] >= len(self.db.table(dbname)):
249 def collection(self,name):
250 for x in self.db.tables():