OSDN Git Service

origin master -> tined
authoryamat0jp <yamat0jp@yahoo.co.jp>
Tue, 6 Dec 2016 12:07:16 +0000 (21:07 +0900)
committeryamat0jp <yamat0jp@yahoo.co.jp>
Tue, 6 Dec 2016 12:07:16 +0000 (21:07 +0900)
index.py

index 3345183..30593b8 100755 (executable)
--- a/index.py
+++ b/index.py
@@ -1,11 +1,18 @@
 
-import os
-import re
+import os.path
+import shutil
 import tornado.escape
 import tornado.web
-import pymongo
+import tornado.httpserver
+import tornado.ioloop
+import tornado.options
+from tornado.options import define,options
+from tinydb import TinyDB,Query,where
+from tinydb.operations import delete
 from datetime import datetime
 
+define('port',default=8000,help='run on the given port',type=int)
+
 class BaseHandler(tornado.web.RequestHandler):
     def get_current_user(self):
         user = self.get_secure_cookie('admin_user')
@@ -19,30 +26,26 @@ class BaseHandler(tornado.web.RequestHandler):
 
 class IndexHandler(BaseHandler):
     def get(self,dbname,page='0'):
-        params = self.application.db['params'].find_one()
+        params = self.application.db.get(where('kinds') == 'conf')
         if params['mentenance'] == True:
             self.render('mentenance.htm',title=params['title'],db=dbname)
         if self.application.collection(dbname) == False:
             if self.current_user == b'admin':
-                coll = self.application.db[dbname]
-                coll.insert({})
-                coll.remove({})
+                self.application.db.table(dbname)
             else:
                 raise tornado.web.HTTPError(404)
                 return
         i = params['count']      
         na = tornado.escape.url_unescape(self.get_cookie("username",u"誰かさん"))
         pos = self.application.gpos(dbname,page)
-        table = self.application.db[dbname]
+        table = self.application.db.table(dbname)
         start = (pos-1)*i
         if start < 0:
-            start = table.count()-i
+            start = len(table)-i
             if start < 0:
                 start = 0
-        rec = table.find()
-        rec.sort('number')
-        rec.skip(start).limit(i)
-        if table.count() >= 10*i:
+        rec = sorted(table.all(),key=lambda x: x['number'])[start:start+i]
+        if len(table) >= 10*i:
             self.render('modules/full.htm',position=pos,records=rec,data=params,db=dbname)
             return
         self.render('modules/index.htm',position=pos,records=rec,data=params,username=na,db=dbname)
@@ -52,7 +55,7 @@ class LoginHandler(BaseHandler):
         self.render('login.htm')
         
     def post(self):
-        pw = self.application.db['params'].find_one()
+        pw = self.application.db.get(where('kinds') == 'conf')
         if self.get_argument('password') == pw['password']:
             self.set_current_user('admin')
         dbname = self.get_argument('record')
@@ -64,15 +67,19 @@ class LogoutHandler(BaseHandler):
         self.redirect('/login')
         
 class NaviHandler(tornado.web.RequestHandler):
-    def get(self):                  
-        coll = sorted(self.application.coll(),key=str.lower)                
-        self.render('top.htm',coll=coll,full=self.full)
-                      
+    def get(self):
+        self.render('top.htm',coll=sorted(self.name()),full=self.full)
+        
+    def name(self):
+        for x in self.application.db.tables():
+            if x != '_default':
+                yield x
+                
     def full(self,dbname):
-        if dbname in self.application.db.collection_names():
-            i = 10*self.application.db['params'].find_one()['count']
-            table = self.application.db[dbname]
-            if table.count() >= i:
+        if dbname in self.application.db.tables():
+            i = 10*self.application.db.get(where('kinds') == 'conf')['count']
+            table = self.application.db.table(dbname)
+            if len(table) >= i:
                 return True
         return False
 
@@ -82,16 +89,14 @@ class TitleHandler(NaviHandler):
         self.render('title.htm',coll=rec,full=self.full)  
         
     def title(self):
-        name = self.application.coll()
-        for x in name:
+        for x in self.name():
             item = {}
             item['name'] = x
-            table = self.application.db[x]
-            i = table.count()
+            table = self.application.db.table(x)
+            i = len(table)
             item['count'] = i            
-            tmp = table.find_one({'number':1})
-            if tmp:
-                s = tmp['title']
+            if table.contains(where('number') == 1) == True:
+                s = table.get(where('number') == 1)['title']
             else:
                 s = ''
             item['title'] = s   
@@ -99,7 +104,7 @@ class TitleHandler(NaviHandler):
                 item['date'] = ''
                 item['date2'] = 0
             else:
-                rec = table.find().sort('number')
+                rec = sorted(table.all(),key=lambda k: k['number'])
                 s = rec[i-1]['date']
                 item['date'] = s
                 i = datetime.strptime(s,'%Y/%m/%d %H:%M')
@@ -118,11 +123,11 @@ class RegistHandler(tornado.web.RequestHandler):
         if self.application.collection(dbname) == False:
             raise tornado.web.HTTPError(404)
             return
-        rec = self.application.db['params'].find_one()
+        rec = self.application.db.get(where('kinds') == 'conf')
         words = rec['bad_words']
         out = rec['out_words']
-        na = self.get_argument('name')
-        sub = self.get_argument('title')
+        na = self.get_argument('name',u'誰かさん')
+        sub = self.get_argument('title',u'タイトルなし')
         com = self.get_argument('comment')
         text = ''
         i = 0
@@ -138,18 +143,15 @@ class RegistHandler(tornado.web.RequestHandler):
             i += len(line)
             text = text+'<p>'+self.link(line)+'<br></p>'
         pw = self.get_argument('password')
-        if sub == '':
-            sub = u'タイトルなし.'
         if i == 0:
             error = error + u'本文がありません.'
         elif i > 1000:
             error = error +u'文字数が1,000をこえました.'
-        article = self.application.db[dbname]
-        if article.count() == 0:
+        article = self.application.db.table(dbname)
+        if len(article) == 0:
             no = 1
-        else:            
-            items = article.find()
-            item = items.sort('number')[article.count()-1]
+        else:
+            item = sorted(article.all(),key=lambda x: x['number'])[len(article)-1]
             no = item['number']+1
         if error == '':
             s = datetime.now()
@@ -194,9 +196,9 @@ class AdminHandler(BaseHandler):
         if self.application.collection(dbname) == False:
             raise tornado.web.HTTPError(404)
             return
-        table = self.application.db[dbname] 
-        rec = table.find().sort('number')                   
-        mente = self.application.db['params'].find_one()
+        table = self.application.db.table(dbname) 
+        rec = sorted(table.all(),key=lambda x: x['number'])                   
+        mente = self.application.db.get(where('kinds') == 'conf')
         if mente['mentenance'] == True:
             check = 'checked=checked'
         else:
@@ -205,34 +207,50 @@ class AdminHandler(BaseHandler):
         i = mente['count']
         start = (pos-1)*i
         if start < 0:
-            start = table.count()-i
+            start = len(table)-i
             if start < 0:
                 start = 0
-        rec.skip(start).limit(i)
-        self.render('modules/admin.htm',position=pos,records=rec,mente=check,password=mente['password'],db=dbname)
+        self.render('modules/admin.htm',position=pos,records=rec[start:start+i],mente=check,password=mente['password'],db=dbname)
 
 class AdminConfHandler(BaseHandler):
     @tornado.web.authenticated
     def post(self,dbname,func):
         if func == 'set':
-            param = self.application.db['params'].find_one()
+            param = self.application.db.get(where('kinds') == 'conf')['mentenance']
             if self.get_argument('mente','') == 'on':
                 mente = True
+                if param != mente:
+                    self.store()
             else:
                 mente = False  
+                if param != mente:
+                    self.restore()
             word = self.get_argument('pass','')
             if word == '':
                 self.render('regist.htm',content='パスワードを設定してください')
                 return
             else:
-                param['mentenance']=mente
-                param['password']=word  
-                self.application.db['params'].save(param)
+                self.application.db.update({'mentenance':mente,'password':word},where('kinds') == 'conf')  
         elif func == 'del':
-            table = self.application.db[dbname]
+            table = self.application.db.table(dbname)
             for x in self.get_arguments('item'):
-                table.remove({'number':int(x)})
+                table.remove(where('number') == int(x))
         self.redirect('/'+dbname+'/admin/0/')
+        
+    def store(self):
+        self.application.db.close()
+        shutil.copy(st.json,st.bak)
+        self.application.db = TinyDB(st.json)
+        
+    def restore(self):
+        database = self.application.db
+        bak = TinyDB(st.bak)
+        for x in database.tables():
+            if self.application.collection(x) == True:
+                database.purge_table(x)
+                if x in bak.tables():
+                    table = database.table(x)
+                    table.insert_multiple(bak.table(x).all())
           
 class UserHandler(tornado.web.RequestHandler):
     def post(self,dbname):
@@ -240,10 +258,11 @@ class UserHandler(tornado.web.RequestHandler):
         if num.isdigit() == True:
             num = int(num)
             pas = self.get_argument('password')
-            table = self.application.db[dbname]
-            obj = table.find_one({'number':num})
+            table = self.application.db.table(dbname)
+            qwr = Query()
+            obj = table.get(qwr.number == num)
             if obj and(obj['password'] == pas):
-                table.remove({'number':num})
+                table.remove(qwr.number == num)
         self.redirect('/'+dbname)
       
 class SearchHandler(tornado.web.RequestHandler):       
@@ -263,14 +282,18 @@ class SearchHandler(tornado.web.RequestHandler):
         self.render('modules/search.htm',records=[],word1=word,db=dbname)
         
     def search(self,dbname):
-        table = self.application.db[dbname]    
+        table = self.application.db.table(dbname)    
         element = self.word.split()
         if len(element) == 0:
             element = ['']
         while len(element) < 3:
             element.append(element[0])
+        if self.radiobox == 'comment':
+            query = (Query().raw.search(element[0])) | (Query().raw.search(element[1])) | (Query().raw.search(element[2]))
+        else:
+            query = (Query().name == element[0]) | (Query().name == element[1]) | (Query().name == element[2])
         if self.radiobox == 'comment':    
-            for x in table.find({'$or':[{'raw':re.compile(element[0])},{'raw':re.compile(element[1])},{'raw':re.compile(element[2])}]}):
+            for x in table.search(query):
                 com = ''
                 for text in x['raw'].splitlines(True):                  
                     for word in self.word.split():                        
@@ -282,8 +305,8 @@ class SearchHandler(tornado.web.RequestHandler):
                 x['comment'] = com
                 yield x       
         else:
-            for x in table.find({'$or':[{'name':element[0]},{'name':element[1]},{'name':element[2]}]}):
-                yield x    
+            for x in table.search(query):
+                yield x
                                         
 class FooterModule(tornado.web.UIModule):
     def render(self,number,url,link):
@@ -291,6 +314,7 @@ class FooterModule(tornado.web.UIModule):
     
 class Application(tornado.web.Application):    
     def __init__(self):
+        self.db = TinyDB(st.json)
         handlers = [(r'/',NaviHandler),(r'/login',LoginHandler),(r'/logout',LogoutHandler),(r'/title',TitleHandler),
                     (r'/([a-zA-Z0-9_]+)',IndexHandler),(r'/([a-zA-Z0-9_]+)/([0-9]+)/',IndexHandler),
                     (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),
@@ -306,28 +330,27 @@ class Application(tornado.web.Application):
         tornado.web.Application.__init__(self,handlers,**settings)
  
     def gpos(self,dbname,page):
-        params = self.db['params'].find_one()
+        params = self.db.get(where('kinds') == 'conf')
         pos = int(page)
         if pos <= 0:
             pos = 0
-        elif (pos-1)*params['count'] >= self.db[dbname].count():
+        elif (pos-1)*params['count'] >= len(self.db.table(dbname)):
             pos = 0
         return pos
     
     def collection(self,name):
-        if name in self.db.collection_names():
+        if name in self.db.tables():
             return True
         else:
             return False
 
-    def coll(self):
-        name = self.db.collection_names()
-        for x in ['params','objectlabs-system.admin.collections','objectlabs-system','system.indexes']:
-            if x in name:
-                name.remove(x)
-        return name
+class static():
+    json = 'static/db/db.json'
+    bak = 'static/db/bak.json'
 
-app = Application()
-MONGOLAB_URI = 'mongodb://kainushi:1234abcd@ds113678.mlab.com:13678/heroku_n905jfw2'
-conn = pymongo.MongoClient(MONGOLAB_URI,13678)
-app.db = conn.heroku_n905jfw2
+st = static()
+if __name__ == '__main__':
+    tornado.options.parse_command_line()
+    http_server = tornado.httpserver.HTTPServer(Application())
+    http_server.listen(options.port)
+    tornado.ioloop.IOLoop.instance().start()