-
Notifications
You must be signed in to change notification settings - Fork 1
/
tears.py
159 lines (119 loc) · 4.26 KB
/
tears.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
import os
import pymongo
import markdown2
from functools import partial
from bottle import Bottle
from bottle import jinja2_template
from bottle import TEMPLATE_PATH
from bottle import static_file, abort
from bottle.ext.mongo import MongoPlugin
app = Bottle()
# Basedir
basedir = os.path.abspath(os.path.dirname(__file__))
# Template location
TEMPLATE_PATH.append(basedir + "/templates")
###############################################################################
# filters ######################################################################
###############################################################################
def datetime_to_date(datetime):
return str(datetime)[:10]
def markdown(string):
return markdown2.markdown(string, extras=["fenced-code-blocks"])
def generate_post_url():
return
# Template filter and setting
template_settings = dict(filters={"datetime_to_date": datetime_to_date,
"markdown": markdown})
template = partial(jinja2_template, template_settings=template_settings)
# Database
plugin = MongoPlugin(uri='mongodb:https://127.0.0.1', db='tears', json_mongo=True)
app.install(plugin)
client = pymongo.MongoClient("localhost", 27017)
db = client.tears
###############################################################################
# core #########################################################################
###############################################################################
@app.route('/static/:filename#.*#')
def serve_static(filename):
return static_file(filename, root='./static/')
@app.error(404)
def error404(error):
return template('error.html')
@app.error(500)
def error500(error):
return template('error.html')
@app.route('/')
@app.route('/index')
@app.route('/posts/<page_num:int>')
def index(page_num=1):
page_size = 5
post_list = []
for p in db.posts.find().sort("date", -1):
post_list.append(p)
if len(post_list) % page_size == 0 and post_list:
total = len(post_list) // page_size
else:
total = len(post_list) // page_size + 1
if page_num > total:
abort(404, "No such database.")
final_list = post_list[(page_num - 1) * page_size: page_num * page_size]
return template('index.html',
posts=final_list,
page_num=page_num,
total=total,
earlier=page_num + 1,
later=page_num - 1)
@app.route('/post/<year>/<month>/<day>/<name>')
def posts(year, month, day, name):
url = '/' + year + '/' + month + '/' + day + '/' + name
current_post = db.posts.find_one({'url': url})
print(url)
return template('post.html',
post=current_post,
)
@app.route('/archive')
def archive():
final_dict = {}
for p in db.posts.find().sort("date", -1):
year = p.get('date').year
if year in final_dict:
final_dict[year].append({'url': p.get('url'), 'title': p.get('title')})
else:
final_dict[year] = []
final_dict[year].append({'url': p.get('url'), 'title': p.get('title')})
total = db.posts.find().count()
years = len(final_dict)
time_line_height = 50 * total + 75 * years
return template('archive.html', archives=final_dict, height=time_line_height)
@app.route('/tag/<tag_name>')
def tag(tag_name):
pass
@app.route('/category/<category_name>')
def category(category_name):
current_category = db.categories.find_one({'name': category_name})
ids = current_category.get('posts')
post_list = []
for p in db.posts.find({"_id": {"$in": ids}}).sort("date", -1):
post_list.append(p)
return template('category.html', posts=post_list, category_name=category_name)
@app.route('/about')
def about():
_about = db.about.find_one()
if _about:
return template('about.html', about=_about)
else:
return template('about.html')
@app.route('/link')
def link():
_link = db.link.find_one()
if _link:
return template('link.html', link=_link)
else:
return template('link.html')
if __name__ == '__main__':
from bottle import run, debug
# Active debug
DEBUG = True
debug(DEBUG)
# Run WSGI web-server
run(app, host='localhost', port=8080, reloader=DEBUG)