1
from flask import Flask
2
from flask import request
3
from flask import render_template, url_for
4
from flask import make_response
5
from flask import jsonify
6
import logging
7
from logging import FileHandler
8
import pymongo
9
import os
10
import lxml.html
11
import urllib2
12
import StringIO
13
import json
14
import urllib
15
16
import conf
17
import sweetmaker
18
19
app = Flask(__name__)
20
21
SWEET_STORE_URL = conf.SWEET_STORE_URL
22
23
24
@app.route('/', methods=['GET'])
25
def index():
26
    if request.args.has_key('url'):
27
        return render_template('index.html', url=request.args['url'])
28
    else:
29
        return render_template('index.html')
30
31
32
@app.route('/fetch', methods=['GET'])
33
def fetch():
34
    connection = pymongo.Connection()
35
    db = connection['mural']
36
    collection = db['data']
37
    ret = {}
38
    x = 0
39
    resource = "default"
40
    if request.args.has_key('uri'):
41
        resource = request.args['uri']
42
    for i in collection.find({'uri':resource}):
43
        del(i['_id'])
44
        ret[x] = i
45
        x = x + 1
46
    else:
47
        for i in collection.find():
48
            del(i['_id'])
49
            ret[x] = i
50
            x = x + 1
51
    if len(ret) == 0:
52
        ret['error'] = "Sorry! No re-treats for you."
53
    return jsonify(ret)
54
55
@app.route('/sweets', methods=['GET'])
56
def displaySweet():
57
    return render_template('sweets.html')
58
59
@app.route('/search', methods=['GET'])
60
def search():
61
    connection = pymongo.Connection()
62
    db = connection['mural']
63
    collection = db['data']
64
    y = 0
65
    ret = {}
66
    keywords_dict = json.loads(request.args['data'])
67
    #keywords = json.loads(keywords_dict)['data']
68
    if 'nodes' in keywords_dict:
69
        for i in collection.find():
70
            try:
71
                if 'how' in i:
72
                    i['nodes'] = i['how']
73
            except:
74
                pass
75
            for node in keywords_dict['nodes']:
76
                try:
77
                    if node in i['nodes']:
78
                        del(i['_id'])
79
                        ret[y] = i
80
                        y = y + 1
81
                except:
82
                    pass
83
    elif 'where' in keywords_dict:
84
        for i in collection.find({'uri': keywords_dict['where']}):
85
            del(i['_id'])
86
            ret[y] = i
87
            y = y + 1
88
        for i in collection.find({'where': {'$regex':\
89
                                            keywords_dict['where']}}):
90
            del(i['_id'])
91
            ret[y] = i
92
            y = y + 1
93
    return render_template('blank.html', content = ret, flag = request.args['flag'])
94
95
96
@app.route('/submit', methods=['POST'])
97
def submit():
98
    c = pymongo.Connection()
99
    db = c['mural']
100
    coll = db['data']
101
    requestData = json.loads(request.form['data'])
102
    try:
103
        for i in requestData:
104
            coll.insert(i)
105
        print 'inserted'
106
        print requestData
107
        response = make_response()
108
        response.headers['Access-Control-Allow-Origin'] = '*'
109
        response.status_code = 200
110
        for i in requestData:
111
            del(i['_id'])
112
            i['how'] = '{concepts: ' + ', '.join(i['how']) + '}'
113
            #i['how'] = attribs
114
        print 'payload for sweet'
115
        print requestData
116
        sweetmaker.sweet(SWEET_STORE_URL, requestData)
117
    except:
118
        response = make_response()
119
        response.status_code = 500
120
        response.data = "Your post could not be saved. Try posting again."
121
122
    return response
123
124
125
@app.route('/web/', methods=['GET'])
126
def web():
127
  return render_template('web.html')
128
129
@app.route('/SWeeText', methods=['GET'])
130
def SWeeText():
131
    if request.args.has_key('url'):
132
        # Log -- comment them
133
        print "Got URL " + request.args['url'] + " .. Fetching and Parsing.."
134
        myhandler1 = urllib2.Request(request.args['url'], headers={'User-Agent': "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:20.0) Gecko/20100101 Firefox/20.0"})
135
        a = urllib2.urlopen(myhandler1)
136
        page = a.read()
137
        a.close()
138
        try:
139
            page = unicode(page, 'utf-8')
140
        except UnicodeDecodeError:
141
            pass
142
        root = lxml.html.parse(StringIO.StringIO(page)).getroot()
143
        root.make_links_absolute(request.args['url'], resolve_base_href = True)
144
        # Log -- comment them
145
        #print "Page parsed.. Preparing to send.."
146
147
        # inject the JS toolbar to annotate text
148
        jq = root.makeelement('script')
149
        jq.set('src', url_for('static', filename='jquery-1.9.1.min.js'))
150
151
        script = root.makeelement('script')
152
        script.set('src', url_for('static', filename='text-annotation.js'))
153
154
155
        config_script = root.makeelement('script')
156
        config_script.set('src', url_for('static', filename='config.js'))
157
158
        tree = root.makeelement('script')
159
        tree.set('src', url_for('static', filename='tree.js'))
160
161
        bs_js = root.makeelement('script')
162
        bs_js.set('src', url_for('static', filename='bootstrap.js'))
163
164
        jit = root.makeelement('script')
165
        jit.set('src', url_for('static', filename='jit.js'))
166
167
        us = root.makeelement('script')
168
        us.set('src', url_for('static', filename='underscore-min-1.4.4.js'))
169
170
        link = root.makeelement('link')
171
        link.set('href', url_for('static', filename='text-annotation.css'))
172
        link.set('type', 'text/css')
173
        link.set('rel', 'stylesheet')
174
175
        bs = root.makeelement('link')
176
        bs.set('href', url_for('static', filename='bootstrap.css'))
177
        bs.set('type', 'text/css')
178
        bs.set('rel', 'stylesheet')
179
180
        tree_css = root.makeelement('link')
181
        tree_css.set('href', url_for('static', filename='tree.css'))
182
        tree_css.set('type', 'text/css')
183
        tree_css.set('rel', 'stylesheet')
184
185
        root.head.append(bs)
186
        root.head.append(link)
187
        root.head.append(tree_css)
188
189
        root.head.append(jq)
190
        root.head.append(bs_js)
191
        root.head.append(jit)
192
        root.head.append(us)
193
        root.head.append(tree)
194
        root.head.append(script)
195
        root.head.append(config_script)
196
197
        return lxml.html.tostring(root)
198
199
200
#Log the errors, don't depend on apache to log it for you.
201
    fil = FileHandler(os.path.join(os.path.dirname(__file__), 'logme'),mode='a')
202
    fil.setLevel(logging.ERROR)
203
    app.logger.addHandler(fil)
204
205
206
if __name__ == "__main__":
207
    app.run(debug=True, host='0.0.0.0')