-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')
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)
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')
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
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
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')
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
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()
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:
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):
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):
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():
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):
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),
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()