6 from tinydb import TinyDB,Query,where
7 from tinydb.operations import delete
8 from datetime import datetime
10 class BaseHandler(tornado.web.RequestHandler):
11 def get_current_user(self):
12 user = self.get_secure_cookie('admin_user')
13 return tornado.escape.utf8(user)
15 def set_current_user(self,username):
16 self.set_secure_cookie('admin_user',username)
18 def clear_current_user(self):
19 self.clear_cookie('admin_user')
21 class IndexHandler(BaseHandler):
22 def get(self,dbname,page='0'):
23 params = self.application.db.get(where('kinds') == 'conf')
24 if params['mentenance'] == True:
25 self.render('mentenance.htm',title=params['title'],db=dbname)
26 if self.application.collection(dbname) == False:
27 if self.current_user == b'admin':
28 self.application.db.table(dbname)
30 self.render('regist.htm',content='urlが見つかりません')
32 na = tornado.escape.url_unescape(self.get_cookie('username'))
33 pos = self.application.gpos(dbname,page)
34 table = self.application.db.table(dbname)
40 rec = sorted(table.all(),key=lambda x: x['number'])[start:start+i]
41 if len(table) >= 10*i:
42 self.render('modules/full.htm',position=pos,records=rec,data=params,db=dbname)
43 self.render('modules/index.htm',position=pos,records=rec,data=params,username=na,db=dbname)
45 class LoginHandler(BaseHandler):
47 self.render('login.htm')
50 pw = self.application.db.get(where('kinds') == 'conf')
51 if self.get_argument('password') == pw['password']:
52 self.set_current_user('admin')
53 dbname = self.get_argument('record')
54 self.redirect('/'+dbname+'/admin/0/')
56 class LogoutHandler(BaseHandler):
58 self.clear_current_user()
59 self.redirect('/login')
61 class NaviHandler(tornado.web.RequestHandler):
63 self.render('top.htm',coll=sorted(self.name()),full=self.full)
66 for x in self.application.db.tables():
70 def full(self,dbname):
71 if dbname in self.application.db.tables():
72 i = 10*self.application.db.get(where('kinds') == 'conf')['count']
73 table = self.application.db.table(dbname)
78 class TitleHandler(NaviHandler):
80 self.render('title.htm',coll=self.name(),full=self.full,
81 count=self.count,title=self.title,update=self.update)
83 def count(self,dbname):
84 if dbname in self.application.db.tables():
85 return len(self.application.db.table(dbname))
89 def title(self,dbname):
90 if dbname in self.application.db.tables():
91 table = self.application.db.table(dbname)
92 if table.contains(where('number') == 1) == True:
93 dic = table.get(where('number') == 1)
98 def update(self,dbname):
99 if dbname in self.application.db.tables():
100 table = self.application.db.table(dbname)
105 rec = sorted(table.all(),key=lambda x: x['number'])
106 return rec[i-1]['date']
108 class RegistHandler(tornado.web.RequestHandler):
109 def post(self,dbname):
110 if self.application.collection(dbname) == False:
111 self.render('regist.htm',content='urlが存在しません')
112 words = ['<link','<script','<style','<img']
113 out = ['ばか','死ね','あほ']
114 na = self.get_argument('name')
115 sub = self.get_argument('title')
116 com = self.get_argument('comment')
120 for line in com.splitlines(True):
123 error = error + u'タグ違反.('+word+')'
124 text = text+'<p>'+line
128 error = error + u'禁止ワード.'
130 pw = self.get_argument('password')
136 error = error + u'本文がありません.'
138 error = error +u'文字数が1,000をこえました.'
139 article = self.application.db.table(dbname)
140 if len(article) == 0:
143 item = article.all()[len(article)-1]
144 no = item['number']+1
146 reg = {'number':no,'name':na,'title':sub,'comment':text,'password':pw,'date':datetime.now().strftime('%Y/%D:%M')}
148 self.set_cookie('username',tornado.escape.url_escape(na))
149 self.redirect('/'+dbname+'#article')
151 self.render('regist.htm',content=error)
153 class AdminHandler(BaseHandler):
154 @tornado.web.authenticated
155 def get(self,dbname,page='0'):
157 dbname = self.get_argument('record','')
158 if self.application.collection(dbname) == False:
159 self.render('regist.htm',content='urlが見つかりません')
160 table = self.application.db.table(dbname)
161 rec = sorted(table.all(),key=lambda x: x['number'])
162 mente = self.application.db.get(where('kinds') == 'conf')
163 if mente['mentenance'] == True:
164 check = 'checked=checked'
167 pos = self.application.gpos(dbname,page)
168 self.render('modules/admin.htm',position=pos,records=rec,mente=check,password=mente['password'],db=dbname)
170 class AdminConfHandler(BaseHandler):
171 @tornado.web.authenticated
172 def post(self,dbname,func):
174 if self.get_argument('mente','') == 'on':
178 word = self.get_argument('pass','')
180 self.render('regist.htm',content='パスワードを設定してください')
182 self.application.db.update({'mentenance':mente,'password':word},where('kinds') == 'conf')
184 table = self.application.db.table(dbname)
185 for x in self.get_arguments('item'):
186 table.remove(where('number') == int(x))
187 self.redirect('/'+dbname+'/admin/0/')
189 class UserHandler(tornado.web.RequestHandler):
190 def post(self,dbname):
191 num = int(self.get_argument('number'))
192 pas = self.get_argument('password')
193 table = self.application.db.table(dbname)
195 obj = table.get(qwr.number == num)
196 if obj and(obj['password'] == pas):
197 table.remove(qwr.number == num)
198 self.redirect('/'+dbname)
200 class SearchHandler(tornado.web.RequestHandler):
201 def post(self,dbname):
202 word = self.get_argument('word1')
203 radiobox = self.get_argument('filter')
204 self.set_cookie('search',word)
205 table = self.application.db.table(dbname)
206 self.render('modules/search.htm',records=table.search(where(radiobox).matches(word)),word1=word,db=dbname)
208 def get(self,dbname):
209 word = self.get_cookie('search')
210 self.render('modules/search.htm',records={},word1=word,db=dbname)
212 class FooterModule(tornado.web.UIModule):
213 def render(self,number,url,link):
214 return self.render_string('modules/footer.htm',index=number,url=url,link=link)
216 class Application(tornado.web.Application):
218 self.db = TinyDB('static/db/db.json')
219 handlers = [(r'/',NaviHandler),(r'/login',LoginHandler),(r'/logout',LogoutHandler),(r'/title',TitleHandler),
220 (r'/([a-zA-Z0-9_]+)',IndexHandler),(r'/([a-zA-Z0-9_]+)/([0-9]+)/',IndexHandler),
221 (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),
222 (r'/([a-zA-Z0-9_]+)/search',SearchHandler),(r'/([a-zA-Z0-9_]+)/regist',RegistHandler)]
223 settings = {'template_path':os.path.join(os.path.dirname(__file__),'pybbs'),
224 'static_path':os.path.join(os.path.dirname(__file__),'static'),
225 'ui_modules':{'Footer':FooterModule},
226 'cookie_secret':'bZJc2sWbQLKos6GkHn/VB9oXwQt8SOROkRvJ5/xJ89E=',
231 tornado.web.Application.__init__(self,handlers,**settings)
233 def gpos(self,dbname,page):
234 params = self.db.get(where('kinds') == 'conf')
238 elif (pos-1)*params['count'] >= len(self.db.table(dbname)):
242 def collection(self,name):
243 for x in self.db.tables():