1
- from flask import Flask , request
1
+ import os
2
+ from flask import Flask , request , redirect , session , send_from_directory
2
3
from flask import render_template , send_from_directory
3
4
from dlmonitor .db import close_global_session
4
5
from dlmonitor .fetcher import get_posts
6
+ from dlmonitor import settings
5
7
from urllib2 import unquote
6
8
import datetime as DT
7
9
10
+ from mendeley import Mendeley
11
+ from mendeley .session import MendeleySession
12
+ import oauthlib
13
+
14
+
15
+
8
16
app = Flask (__name__ , static_url_path = '/static' )
17
+ app .secret_key = settings .SESSION_KEY
18
+ app .config ['SESSION_TYPE' ] = 'filesystem'
19
+
9
20
10
21
NUMBER_EACH_PAGE = 30
11
22
DEFAULT_KEYWORDS = "Hot Tweets,Hot Papers,Fresh Papers,reinforcement learning,language"
12
-
13
23
DATE_TOKEN_SET = set (['1-week' , '2-week' , '1-month' ])
14
24
25
+ # Mendeley
26
+ MENDELEY_REDIRECT = "{}/oauth" .format (settings .HOME_URL )
27
+ mendeley = Mendeley (settings .MENDELEY_CLIENTID , settings .MENDELEY_SECRET , MENDELEY_REDIRECT )
28
+
15
29
def get_date_str (token ):
16
30
"""
17
31
Convert token to date string.
@@ -43,7 +57,25 @@ def index():
43
57
posts = get_posts (src , keywords = kw , since = target_date , start = 0 , num = num_page )
44
58
column_list .append ((src , kw , posts ))
45
59
46
- return render_template ("index.html" , columns = column_list )
60
+ # Mendeley
61
+ auth = mendeley .start_authorization_code_flow ()
62
+ if "ma_token" in session and session ["ma_token" ] is not None :
63
+ ma_session = MendeleySession (mendeley , session ['ma_token' ])
64
+ try :
65
+ ma_firstname = ma_session .profiles .me .first_name
66
+ except :
67
+ session ['ma_token' ] = None
68
+ ma_session = None
69
+ ma_firstname = None
70
+ else :
71
+ ma_session = None
72
+ ma_firstname = None
73
+
74
+ ma_authorized = ma_session is not None and ma_session .authorized
75
+ return render_template (
76
+ "index.html" , columns = column_list , mendeley_login = auth .get_login_url (),
77
+ ma_session = ma_session , ma_authorized = ma_authorized , ma_firstname = ma_firstname
78
+ )
47
79
48
80
@app .route ('/fetch' , methods = ['POST' ])
49
81
def fetch ():
@@ -64,15 +96,25 @@ def fetch():
64
96
65
97
num_page = 80 if src == "twitter" else NUMBER_EACH_PAGE
66
98
99
+ # Mendeley
100
+ ma_authorized = "ma_token" in session and session ["ma_token" ] is not None
101
+
67
102
return render_template (
68
103
"post_{}.html" .format (src ),
69
- posts = get_posts (src , keywords = kw , since = target_date , start = start , num = num_page ))
104
+ posts = get_posts (src , keywords = kw , since = target_date , start = start , num = num_page ),
105
+ ma_authorized = ma_authorized )
70
106
71
107
@app .route ("/arxiv/<int:arxiv_id>/<paper_str>" )
72
108
def arxiv (arxiv_id , paper_str ):
73
109
from dlmonitor .sources .arxivsrc import ArxivSource
110
+ from dlmonitor .latex import retrieve_paper_html
74
111
post = ArxivSource ().get_one_post (arxiv_id )
75
- return render_template ("single.html" , post = post )
112
+ arxiv_token = post .arxiv_url .split ("/" )[- 1 ]
113
+
114
+ # Check the HTML page
115
+ html_body = retrieve_paper_html (arxiv_token )
116
+ return render_template ("single.html" ,
117
+ post = post , arxiv_token = arxiv_token , html_body = html_body )
76
118
77
119
@app .route ("/about" )
78
120
def about ():
@@ -82,5 +124,61 @@ def about():
82
124
def search ():
83
125
return render_template ("search.html" )
84
126
127
+ @app .route ('/oauth' )
128
+ def auth_return ():
129
+ auth = mendeley .start_authorization_code_flow (state = request .args .get ("state" ))
130
+ mendeley_session = auth .authenticate (request .url )
131
+
132
+ session ["ma_token" ] = mendeley_session .token
133
+ session ["ma_state" ] = request .args .get ("state" )
134
+
135
+ return redirect ('/' )
136
+
137
+ @app .route ("/save_mendeley" )
138
+ def save_mendeley ():
139
+ import urllib
140
+ if "ma_token" in session and session ["ma_token" ] is not None :
141
+ ma_session = MendeleySession (mendeley , session ['ma_token' ])
142
+ else :
143
+ ma_session = None
144
+
145
+ ma_authorized = ma_session is not None and ma_session .authorized
146
+ if not ma_authorized :
147
+ return "Please log in into Mendeley."
148
+
149
+ pdf_url = request .args .get ('url' )
150
+ # Retrieve pdf file
151
+ arxiv_id = pdf_url .split ("/" )[- 1 ].replace (".pdf" , "" )
152
+ local_pdf = "{}/{}.pdf" .format (settings .PDF_PATH , arxiv_id )
153
+ remote_pdf = "http://arxiv.org/pdf/{}.pdf" .format (arxiv_id )
154
+ if not os .path .exists (local_pdf ):
155
+ urllib .urlretrieve (remote_pdf , local_pdf )
156
+
157
+ # Create file
158
+ ma_session .documents .create_from_file (local_pdf )
159
+
160
+ return "{} is saved into Mendeley" .format (os .path .basename (local_pdf ))
161
+
162
+ @app .route ("/load_fulltext/<arxiv_token>" )
163
+ def load_fulltext (arxiv_token ):
164
+ from dlmonitor .latex import build_paper_html , retrieve_paper_html
165
+ build_paper_html (arxiv_token )
166
+
167
+ return retrieve_paper_html (arxiv_token )
168
+
169
+ @app .route ("/arxiv_files/<arxiv_token>/<path:fp>" )
170
+ def arxiv_files (arxiv_token , fp ):
171
+ fp = "{}/{}/{}" .format (settings .SOURCE_PATH , arxiv_token , fp )
172
+ if os .path .exists (fp ):
173
+ return send_from_directory (os .path .dirname (fp ), os .path .basename (fp ))
174
+ else :
175
+ return ""
176
+
177
+ @app .route ("/logout" )
178
+ def logout ():
179
+ session ["ma_token" ] = None
180
+ return redirect ("/" )
181
+
85
182
if __name__ == '__main__' :
183
+ # app.run(host='0.0.0.0', debug=True, ssl_context='adhoc')
86
184
app .run (host = '0.0.0.0' , debug = True )
0 commit comments