OSDN Git Service

df2b304a04582004bc6236fed089af32bd44a21e
[pybbs/pybbs.git] / index.py
1
2 import os.path
3 import tornado.auth
4 import tornado.escape
5 import tornado.options
6 import tornado.web
7 from tinydb import TinyDB,Query,where
8 from tinydb.operations import delete
9 from datetime import datetime
10
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)
15     
16     def set_current_user(self,username):
17         self.set_secure_cookie('admin_user',username)
18         
19     def clear_current_user(self):
20         self.clear_cookie('admin_user')
21
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)
30             else:
31                 self.render('regist.htm',content='urlが見つかりません')
32         i = params['count']      
33         na = self.get_cookie('username')
34         pos = self.application.gpos(dbname,page)
35         table = self.application.db.table(dbname)
36         start = (pos-1)*i
37         if start < 0:
38             start = len(table)-i
39             if start < 0:
40                 start = 0
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)
45         
46 class LoginHandler(BaseHandler):
47     def get(self):
48         self.render('login.htm')
49         
50     def post(self):
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/')
56         
57 class LogoutHandler(BaseHandler):
58     def get(self):
59         self.clear_current_user()
60         self.redirect('/login')
61         
62 class NaviHandler(tornado.web.RequestHandler):
63     def get(self):
64         self.render('top.htm',coll=sorted(self.name()),full=self.full)
65         
66     def name(self):
67         for x in self.application.db.tables():
68             if x != '_default':
69                 yield x
70                 
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)
75             if len(table) >= i:
76                 return True
77         return False
78
79 class TitleHandler(NaviHandler):
80     def get(self):
81         self.render('title.htm',coll=self.name(),full=self.full,
82                     count=self.count,title=self.title,update=self.update)
83
84     def count(self,dbname):
85         if dbname in self.application.db.tables():
86             return len(self.application.db.table(dbname))
87         else:
88             return ''
89
90     def title(self,dbname):
91         if dbname in self.application.db.tables():
92             table = self.application.db.table(dbname)
93             if len(table) == 0:
94                 return ''
95             else:
96                 return table.all()[0]['title']
97
98     def update(self,dbname):
99         if dbname in self.application.db.tables():
100             table = self.application.db.table(dbname)
101             if len(table) == 0:
102                 return ''
103             else:
104                 return table.all()[len(table)-1]['date']
105         
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')
115         text = ''
116         i = 0
117         error = ''
118         for line in com.splitlines(True):
119             for word in words:
120                 if word in line:
121                     error = error + u'タグ違反.('+word+')'       
122             text = text+'<p>'+line
123             i += len(line)
124         for word in out:
125             if word in text:
126                 error = error + u'禁止ワード.'
127                 break
128         pw = self.get_argument('password')
129         if na == '':
130             na = u'誰かさん'
131         if sub == '':
132             sub = u'タイトルなし.'
133         if i == 0:
134             error = error + u'本文がありません.'
135         elif i > 1000:
136             error = error +u'文字数が1,000をこえました.'
137         article = self.application.db.table(dbname)
138         if len(article) == 0:
139             no = 1
140         else:
141             item = article.all()[len(article)-1]
142             no = item['number']+1
143         if error == '':
144             reg = {'number':no,'name':na,'title':sub,'comment':text,'password':pw,'date':datetime.now().strftime('%Y/%D:%M')}
145             article.insert(reg)
146             self.set_cookie('username',na)
147             self.redirect('/'+dbname+'#article')
148         else:
149             self.render('regist.htm',content=error)
150
151 class AdminHandler(BaseHandler):
152     @tornado.web.authenticated               
153     def get(self,dbname,page='0'):
154         if dbname == '':
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) 
159         rec = table.all()                   
160         mente = self.application.db.get(where('kinds') == 'conf')
161         if mente['mentenance'] == True:
162             check = 'checked=checked'
163         else:
164             check = ''
165         pos = self.application.gpos(dbname,page)
166         self.render('modules/admin.htm',position=pos,records=rec,mente=check,password=mente['password'],db=dbname)
167
168 class AdminConfHandler(BaseHandler):
169     @tornado.web.authenticated
170     def post(self,dbname,func):
171         if func == 'set':
172             if self.get_argument('mente','') == 'on':
173                 mente = True
174             else:
175                 mente = False  
176             word = self.get_argument('pass','')
177             if word == '':
178                 self.render('regist.htm',content='パスワードを設定してください')
179             else:
180                 self.application.db.update({'mentenance':mente,'password':word},where('kinds') == 'conf')     
181         elif func == 'del':
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/')
186           
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)
192         qwr = Query()
193         obj = table.get(qwr.number == num)
194         if obj and(obj['password'] == pas):
195             table.remove(qwr.number == num)
196         self.redirect('/'+dbname)
197       
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)
205     
206     def get(self,dbname):
207         word = self.get_cookie('search')
208         self.render('modules/search.htm',records={},word1=word,db=dbname)
209         
210     def mylist(self,rec):
211         for searchrec in rec:       
212             if self.radiobox == 'name':
213                 if searchrec['name'].find(self.word) == True:
214                     yield searchrec
215             else:
216                 if searchrec['comment'].find(self.word) == True:
217                     yield searchrec
218         
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)
222     
223 class Application(tornado.web.Application):    
224     def __init__(self):
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=',
234                         'xsrf_cookies':True,
235                         #'debug':True,
236                         'login_url':'/login'
237                         }
238         tornado.web.Application.__init__(self,handlers,**settings)
239  
240     def gpos(self,dbname,page):
241         params = self.db.get(where('kinds') == 'conf')
242         pos = int(page)
243         if pos <= 0:
244             pos = 0
245         elif (pos-1)*params['count'] >= len(self.db.table(dbname)):
246             pos = 0
247         return pos
248     
249     def collection(self,name):
250         for x in self.db.tables():
251             if x == name:
252                 return True
253         else:
254             return False
255         
256 app = Application()
257