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(include_system_collections=False)
67 self.render('top.htm',coll=coll,full=self.full)
69 def full(self,dbname):
70 if dbname in self.application.db.collection_names(include_system_collections=False):
71 i = 10*self.application.db['params'].find_one()['count']
72 table = self.application.db[dbname]
73 if table.count() >= i:
77 class TitleHandler(NaviHandler):
79 rec = sorted(self.title(),key=lambda x: x['date2'])
80 self.render('title.htm',coll=rec,full=self.full)
83 for x in self.application.db.collection_names(include_system_collections=False):
86 table = self.application.db[x]
89 tmp = table.find_one({'number':1})
99 rec = table.find().sort('number')
102 i = datetime.strptime(s,'%Y/%m/%d %H:%M')
103 year = datetime.now().year-i.year
110 item['date2'] = j+31*(i.month-1)+i.day
113 class RegistHandler(tornado.web.RequestHandler):
114 def post(self,dbname):
115 if self.application.collection(dbname) == False:
116 raise tornado.web.HTTPError(404)
118 rec = self.application.db[dbname].find_one()
119 words = rec['bad_words']
120 out = rec['out_words']
121 na = self.get_argument('name')
122 sub = self.get_argument('title')
123 com = self.get_argument('comment')
129 error = error + u'禁止ワード.'
131 for line in com.splitlines(True):
134 error = error + u'タグ違反.('+word+')'
136 text = text+'<p>'+self.link(line)+'<br></p>'
137 pw = self.get_argument('password')
141 error = error + u'本文がありません.'
143 error = error +u'文字数が1,000をこえました.'
144 article = self.application.db[dbname]
145 if article.count() == 0:
148 items = article.find()
149 item = items.sort('number')[article.count()-1]
150 no = item['number']+1
153 reg = {'number':no,'name':na,'title':sub,'comment':text,'raw':com,'password':pw,'date':s.strftime('%Y/%m/%d %H:%M')}
155 self.set_cookie('username',tornado.escape.url_escape(na))
156 self.redirect('/'+dbname+'#article')
158 self.render('regist.htm',content=error)
160 def link(self,command):
164 for x in command.split():
165 if (y == '>>')and(x.isdecimal() == True):
166 s = '<a href=#'+x+'>'+x+'</a>'
167 while -1 < command.find(x,i):
168 j = command.find(x,i)
171 k = tmp.rsplit(None,1)
172 if ((len(k) > 1)and(k[1] == y))or(k[0] == y):
182 return text+command[i:]
186 class AdminHandler(BaseHandler):
187 @tornado.web.authenticated
188 def get(self,dbname,page='0'):
190 dbname = self.get_argument('record','')
191 if self.application.collection(dbname) == False:
192 raise tornado.web.HTTPError(404)
194 table = self.application.db[dbname]
195 rec = table.find().sort('number')
196 mente = self.application.db['params'].find_one()
197 if mente['mentenance'] == True:
198 check = 'checked=checked'
201 pos = self.application.gpos(dbname,page)
205 start = table.count()-i
208 rec.skip(start).limit(i)
209 self.render('modules/admin.htm',position=pos,records=rec,mente=check,password=mente['password'],db=dbname)
211 class AdminConfHandler(BaseHandler):
212 @tornado.web.authenticated
213 def post(self,dbname,func):
215 param = self.application.db['params'].find_one()
216 if self.get_argument('mente','') == 'on':
220 word = self.get_argument('pass','')
222 self.render('regist.htm',content='パスワードを設定してください')
225 param.update({'mentenance':mente,'password':word})
228 table = self.application.db[dbname]
229 for x in self.get_arguments('item'):
230 table.remove({'number':int(x)})
231 self.redirect('/'+dbname+'/admin/0/')
233 class UserHandler(tornado.web.RequestHandler):
234 def post(self,dbname):
235 num = int(self.get_argument('number'))
236 pas = self.get_argument('password')
237 table = self.application.db[dbname]
238 obj = table.find_one({'number':num})
239 if obj and(obj['password'] == pas):
240 table.remove({'number':num})
241 self.redirect('/'+dbname)
243 class SearchHandler(tornado.web.RequestHandler):
244 def post(self,dbname):
245 self.word = tornado.escape.url_unescape(self.get_argument('word1'))
246 self.radiobox = self.get_argument('filter')
247 self.set_cookie('search',tornado.escape.url_escape(self.word))
248 rec = sorted(self.search(dbname),key=lambda x: x['number'])
249 self.render('modules/search.htm',records=rec,word1=self.word,db=dbname)
251 def get(self,dbname):
252 if self.application.collection(dbname) == False:
253 raise tornado.web.HTTPError(404)
255 word = self.get_cookie('search','')
256 word = tornado.escape.url_unescape(word)
257 self.render('modules/search.htm',records=[],word1=word,db=dbname)
259 def search(self,dbname):
260 table = self.application.db[dbname]
261 element = self.word.split()
262 if len(element) == 0:
264 while len(element) < 3:
265 element.append(element[0])
266 if self.radiobox == 'comment':
267 for x in table.find({'$or':[{'name':re.compile(element[0])},{'name':re.compile(element[1])},{'name':re.compile(element[2])}]}):
269 for text in x['raw'].splitlines(True):
270 for word in self.word.split():
271 if text.find(word) > -1:
272 com = com +'<p style=background-color:yellow>'+text+'<br></p>'
275 com = com+'<p>'+text+'<br></p>'
279 for x in table.find({'$or':[{'name':element[0]},{'name':element[1]},{'name':element[2]}]}):
282 class FooterModule(tornado.web.UIModule):
283 def render(self,number,url,link):
284 return self.render_string('modules/footer.htm',index=number,url=url,link=link)
286 class Application(tornado.web.Application):
288 handlers = [(r'/',NaviHandler),(r'/login',LoginHandler),(r'/logout',LogoutHandler),(r'/title',TitleHandler),
289 (r'/([a-zA-Z0-9_]+)',IndexHandler),(r'/([a-zA-Z0-9_]+)/([0-9]+)/',IndexHandler),
290 (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),
291 (r'/([a-zA-Z0-9_]+)/search',SearchHandler),(r'/([a-zA-Z0-9_]+)/regist',RegistHandler)]
292 settings = {'template_path':os.path.join(os.path.dirname(__file__),'pybbs'),
293 'static_path':os.path.join(os.path.dirname(__file__),'static'),
294 'ui_modules':{'Footer':FooterModule},
295 'cookie_secret':'bZJc2sWbQLKos6GkHn/VB9oXwQt8SOROkRvJ5/xJ89E=',
300 tornado.web.Application.__init__(self,handlers,**settings)
302 def gpos(self,dbname,page):
303 params = self.db['params'].find_one()
307 elif (pos-1)*params['count'] >= self.db[dbname].count():
311 def collection(self,name):
312 if name in self.db.collection_names():
318 MONGOLAB_URI = os.environ.get('mongodb://kainushi:1234abcd@ds113678.mlab.com:13678/heroku_n905jfw2')
320 conn = pymongo.MongoClient(MONGOLAB_URI)
321 app.db = conn.heroku_n905jfw2
323 conn = pymongo.MongoClient()
324 app.db = conn.mydatabase