7 from datetime import datetime
9 class BaseHandler(tornado.web.RequestHandler):
10 def get_current_user(self):
11 user = self.get_secure_cookie('admin_user')
12 return tornado.escape.utf8(user)
14 def set_current_user(self,username):
15 self.set_secure_cookie('admin_user',username)
17 def clear_current_user(self):
18 self.clear_cookie('admin_user')
20 class IndexHandler(BaseHandler):
21 def get(self,dbname,page='0'):
22 params = self.application.db['params'].find_one()
23 if params['mentenance'] == True:
24 self.render('mentenance.htm',title=params['title'],db=dbname)
25 if self.application.collection(dbname) == False:
26 if self.current_user == b'admin':
27 self.application.db[dbname]
29 raise tornado.web.HTTPError(404)
32 na = tornado.escape.url_unescape(self.get_cookie("username",u"誰かさん"))
33 pos = self.application.gpos(dbname,page)
34 table = self.application.db[dbname]
37 start = table.count()-i
42 rec.skip(start).limit(i)
43 if table.count() >= 10*i:
44 self.render('modules/full.htm',position=pos,records=rec,data=params,db=dbname)
46 self.render('modules/index.htm',position=pos,records=rec,data=params,username=na,db=dbname)
48 class LoginHandler(BaseHandler):
50 self.render('login.htm')
53 pw = self.application.db['params'].find_one()
54 if self.get_argument('password') == pw['password']:
55 self.set_current_user('admin')
56 dbname = self.get_argument('record')
57 self.redirect('/'+dbname+'/admin/0/')
59 class LogoutHandler(BaseHandler):
61 self.clear_current_user()
62 self.redirect('/login')
64 class NaviHandler(tornado.web.RequestHandler):
66 coll = self.application.db.collection_names()
69 self.render('top.htm',coll=coll,full=self.full)
71 def full(self,dbname):
72 if dbname in self.application.db.collection_names():
73 i = 10*self.application.db['params'].find_one()['count']
74 table = self.application.db[dbname]
75 if table.count() >= i:
79 class TitleHandler(NaviHandler):
81 rec = sorted(self.title(),key=lambda x: x['date2'])
82 self.render('title.htm',coll=rec,full=self.full)
85 name = self.application.db.collection_names()
91 table = self.application.db[x]
94 tmp = table.find_one({'number':1})
104 rec = table.find().sort('number')
107 i = datetime.strptime(s,'%Y/%m/%d %H:%M')
108 year = datetime.now().year-i.year
115 item['date2'] = j+31*(i.month-1)+i.day
118 class RegistHandler(tornado.web.RequestHandler):
119 def post(self,dbname):
120 if self.application.collection(dbname) == False:
121 raise tornado.web.HTTPError(404)
123 rec = self.application.db[dbname].find_one()
124 words = rec['bad_words']
125 out = rec['out_words']
126 na = self.get_argument('name')
127 sub = self.get_argument('title')
128 com = self.get_argument('comment')
134 error = error + u'禁止ワード.'
136 for line in com.splitlines(True):
138 if word in line.lower():
139 error = error + u'タグ違反.('+word+')'
141 text = text+'<p>'+self.link(line)+'<br></p>'
142 pw = self.get_argument('password')
146 error = error + u'本文がありません.'
148 error = error +u'文字数が1,000をこえました.'
149 article = self.application.db[dbname]
150 if article.count() == 0:
153 items = article.find()
154 item = items.sort('number')[article.count()-1]
155 no = item['number']+1
158 reg = {'number':no,'name':na,'title':sub,'comment':text,'raw':com,'password':pw,'date':s.strftime('%Y/%m/%d %H:%M')}
160 self.set_cookie('username',tornado.escape.url_escape(na))
161 self.redirect('/'+dbname+'#article')
163 self.render('regist.htm',content=error)
165 def link(self,command):
169 for x in command.split():
170 if (y == '>>')and(x.isdecimal() == True):
171 s = '<a href=#'+x+'>'+x+'</a>'
172 while -1 < command.find(x,i):
173 j = command.find(x,i)
176 k = tmp.rsplit(None,1)
177 if ((len(k) > 1)and(k[1] == y))or(k[0] == y):
187 return text+command[i:]
191 class AdminHandler(BaseHandler):
192 @tornado.web.authenticated
193 def get(self,dbname,page='0'):
195 dbname = self.get_argument('record','')
196 if self.application.collection(dbname) == False:
197 raise tornado.web.HTTPError(404)
199 table = self.application.db[dbname]
200 rec = table.find().sort('number')
201 mente = self.application.db['params'].find_one()
202 if mente['mentenance'] == True:
203 check = 'checked=checked'
206 pos = self.application.gpos(dbname,page)
210 start = table.count()-i
213 rec.skip(start).limit(i)
214 self.render('modules/admin.htm',position=pos,records=rec,mente=check,password=mente['password'],db=dbname)
216 class AdminConfHandler(BaseHandler):
217 @tornado.web.authenticated
218 def post(self,dbname,func):
220 param = self.application.db['params'].find_one()
221 if self.get_argument('mente','') == 'on':
225 word = self.get_argument('pass','')
227 self.render('regist.htm',content='パスワードを設定してください')
230 param['mentenance']=mente
231 param['password']=word
232 self.application.db['params'].save(param)
234 table = self.application.db[dbname]
235 for x in self.get_arguments('item'):
236 table.remove({'number':int(x)})
237 self.redirect('/'+dbname+'/admin/0/')
239 class UserHandler(tornado.web.RequestHandler):
240 def post(self,dbname):
241 num = int(self.get_argument('number'))
242 pas = self.get_argument('password')
243 table = self.application.db[dbname]
244 obj = table.find_one({'number':num})
245 if obj and(obj['password'] == pas):
246 table.remove({'number':num})
247 self.redirect('/'+dbname)
249 class SearchHandler(tornado.web.RequestHandler):
250 def post(self,dbname):
251 self.word = tornado.escape.url_unescape(self.get_argument('word1'))
252 self.radiobox = self.get_argument('filter')
253 self.set_cookie('search',tornado.escape.url_escape(self.word))
254 rec = sorted(self.search(dbname),key=lambda x: x['number'])
255 self.render('modules/search.htm',records=rec,word1=self.word,db=dbname)
257 def get(self,dbname):
258 if self.application.collection(dbname) == False:
259 raise tornado.web.HTTPError(404)
261 word = self.get_cookie('search','')
262 word = tornado.escape.url_unescape(word)
263 self.render('modules/search.htm',records=[],word1=word,db=dbname)
265 def search(self,dbname):
266 table = self.application.db[dbname]
267 element = self.word.split()
268 if len(element) == 0:
270 while len(element) < 3:
271 element.append(element[0])
272 if self.radiobox == 'comment':
273 for x in table.find({'$or':[{'name':re.compile(element[0])},{'name':re.compile(element[1])},{'name':re.compile(element[2])}]}):
275 for text in x['raw'].splitlines(True):
276 for word in self.word.split():
277 if text.find(word) > -1:
278 com = com +'<p style=background-color:yellow>'+text+'<br></p>'
281 com = com+'<p>'+text+'<br></p>'
285 for x in table.find({'$or':[{'name':element[0]},{'name':element[1]},{'name':element[2]}]}):
288 class FooterModule(tornado.web.UIModule):
289 def render(self,number,url,link):
290 return self.render_string('modules/footer.htm',index=number,url=url,link=link)
292 class Application(tornado.web.Application):
294 handlers = [(r'/',NaviHandler),(r'/login',LoginHandler),(r'/logout',LogoutHandler),(r'/title',TitleHandler),
295 (r'/([a-zA-Z0-9_]+)',IndexHandler),(r'/([a-zA-Z0-9_]+)/([0-9]+)/',IndexHandler),
296 (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),
297 (r'/([a-zA-Z0-9_]+)/search',SearchHandler),(r'/([a-zA-Z0-9_]+)/regist',RegistHandler)]
298 settings = {'template_path':os.path.join(os.path.dirname(__file__),'pybbs'),
299 'static_path':os.path.join(os.path.dirname(__file__),'static'),
300 'ui_modules':{'Footer':FooterModule},
301 'cookie_secret':'bZJc2sWbQLKos6GkHn/VB9oXwQt8SOROkRvJ5/xJ89E=',
306 tornado.web.Application.__init__(self,handlers,**settings)
308 def gpos(self,dbname,page):
309 params = self.db['params'].find_one()
313 elif (pos-1)*params['count'] >= self.db[dbname].count():
317 def collection(self,name):
318 if name in self.db.collection_names():
324 MONGOLAB_URI = 'mongodb://kainushi:1234abcd@ds113678.mlab.com:13678/heroku_n905jfw2'
325 conn = pymongo.MongoClient(MONGOLAB_URI,13678)
326 app.db = conn.heroku_n905jfw2