Commit 5185b44df4afa40c07338b62985bf393fd6ab53a

  • avatar
  • arvind
  • Fri Apr 04 22:42:18 IST 2014
Fix: A user who owns a sweet can edit the sweet, after logging in to
sweet store.  Admin can edit sweets of others.
Adding new bootstrap and changing icons to glyphicons, re-styled
login.html to adapt to the changes in bootstrap.
/login now allows users to login too.

FIXME: macro of jinja templates is an alternative to underscore
templates. Refactor show_posts.html to use macros.

Comments:
swtr.py
(58 / 19)
  
5353
5454def validateSweet(payload):
5555 for i in payload:
56 print i
5657 try:
5758 if len(i['who']) and len(i['what']) and len(i['where']) and\
5859 len(i['how']) and len(i['created']):
9797def show_entries():
9898 print 'request:'
9999 print request.method
100 res = g.collection.find().sort('_id',direction=-1)
100 print session
101 res = g.collection.find().sort('_id', direction=-1)
101102 entries = make_list(res)
102103 return render_template('show_entries.html', entries=entries)
103104
131131 try:
132132 payload = [{'who': request.form['who'], 'what': request.form['what'],
133133 'where': request.form['where'], 'how': request.form['how']}]
134 print payload
134135 except:
135136 try:
136137 payload = request.json
137138 except:
138139 payload = json.loads(request.data)
139140
141 if type(payload) is dict:
142 payload = [payload]
140143
141144 valid = validateSweet(payload)
142145 if not valid:
166166def login():
167167 error = None
168168 if request.method == 'POST':
169 db = g.connection[app.config['DATABASE']]
170 collection = db['sweet_users']
171 for i in collection.find():
172 if i['user'] == request.form['username'] and i['key'] == request.form['password']:
173 session['logged_in'] = True
174 session['username'] = request.form['username']
175 flash('You were logged in')
176 res = g.collection.find({'who': request.form['username']})
177
178 if res.count() < 1:
179 return render_template('show_entries.html', entries=[])
180 swt_list = []
181 for swt in res:
182 _id = swt['_id']
183 del(swt['_id'])
184 swt['id'] = str(_id)
185 swt_list.append(swt)
186 return render_template('show_entries.html', entries=swt_list)
187 else:
188 pass
189
169190 if request.form['username'] != app.config['USERNAME']:
170191 error = 'Invalid username'
171192 elif request.form['password'] != app.config['PASSWORD']:
172193 error = 'Invalid password'
173194 else:
174195 session['logged_in'] = True
196 session['isAdmin'] = True
175197 flash('You were logged in')
176198 return redirect(url_for('show_entries'))
177199 return render_template('login.html', error=error)
261261
262262
263263
264@app.route('/posts/<post_id>',methods=['GET'])
264@app.route('/posts/<post_id>', methods=['GET', 'POST'])
265265def show_specific_entry(post_id):
266 try:
267 res = g.collection.find({'_id':ObjectId(post_id)})
268 if(res.count() > 0):
269 #entries = make_list(res)
270 entries = []
271 for i in res:
272 _id = i['_id']
273 del(i['_id'])
274 i['id'] = _id
275 entries.append(i)
276 return render_template('show_posts.html', entries=entries, str=str)
277 else:
266 if request.method == 'GET':
267 try:
268 res = g.collection.find({'_id': ObjectId(post_id)})
269 if(res.count() > 0):
270 #entries = make_list(res)
271 entries = []
272 for i in res:
273 _id = i['_id']
274 del(i['_id'])
275 i['id'] = _id
276 entries.append(i)
277 return render_template('show_posts.html', entries=entries, str=str)
278 else:
279 abort(404)
280 except InvalidId:
278281 abort(404)
279 except InvalidId:
280 abort(404)
282 else:
283 how = {}
284 for item in request.form:
285 how[item] = request.form[item]
286 try:
287 g.collection.update({'_id': ObjectId(post_id)}, {"$set":{'how':how}})
288 response = make_response()
289 return response
290 except:
291 abort(404)
281292
282
283293@app.route('/posts/delete/', methods=['POST'])
284294def delete_post():
285295 try:
286 g.collection.remove({'_id':ObjectId(request.form['post_id'])})
296 g.collection.remove({'_id': ObjectId(request.form['post_id'])})
287297 return jsonify(status='ok')
288298 except:
289299 abort(500)
301301@app.route('/logout')
302302def logout():
303303 session.pop('logged_in', None)
304 session.pop('username', None)
305 session.pop('isAdmin', None)
304306 flash('You were logged out')
305307 return redirect(url_for('show_entries'))
306308
351351 return render_template("users.html", users=users)
352352
353353
354@app.route('/authenticate', methods=['POST','GET'])
354@app.route('/authenticate', methods=['POST', 'GET'])
355355def authenticate():
356356 if request.method == "POST":
357357 response = make_response()
  
33 <head>
44 <title>SWeeT Store</title>
55 <link rel=stylesheet type=text/css href="{{ url_for('static', filename='css/style.css') }}">
6 <link rel=stylesheet type=text/css href="{{ url_for('static', filename='css/bootstrap.min.css') }}">
6 <link rel=stylesheet type=text/css href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
7 <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
8 <script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
9 <script type="text/javascript" src="//underscorejs.org/underscore-min.js"></script>
710 {% block head %}{% endblock %}
811 </head>
912 <body>
2929 {% block body %}{% endblock %}
3030 </div>
3131 </div>
32 <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
32 <!-- <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> -->
3333 <!--script>window.jQuery || document.write('<script src="{{ url_for('static', filename='js/jquery-1.9.1.min.js')}}"><\/script>')</script-->
3434 </body>
3535</html>
  
22{% block body %}
33 <h2>Login</h2>
44 {% if error %}<p class=error><strong>Error:</strong> {{ error }}{% endif %}
5 <form action="{{ url_for('login') }}" method=post>
6 <dl>
7 <dt>Username:
8 <dd><input type=text name=username>
9 <dt>Password:
10 <dd><input type=password name=password>
11 <dd><input type=submit value=Login>
12 </dl>
5 <form class="form-horizontal" role="form" action="{{ url_for('login') }}" method=post>
6 <div class="form-group">
7 <label for="username" class="col-sm-2 control-label">Username</label>
8 <div class="col-sm-10">
9 <input type="text" class="form-control" name="username" id="username" placeholder="murugan">
10 </div>
11 </div>
12 <div class="form-group">
13 <label for="password" class="col-sm-2 control-label">Password</label>
14 <div class="col-sm-10">
15 <input type="password" class="form-control" id="password" name="password" placeholder="Password">
16 </div>
17 </div>
18 <div class="form-group">
19 <div class="col-sm-offset-2 col-sm-10">
20 <button type="submit" class="btn btn-default">Sign in</button>
21 </div>
22 </div>
1323 </form>
1424{% endblock %}
  
1818 <small>created: {{entry.created }} UTC</small>
1919 {% endif %}
2020 <a class="pull-right" href={{ "/posts/" + entry.id }}>
21 <i class="icon-share-alt"></i>
21 <i class="glyphicon glyphicon-share-alt"></i>
2222 </a>
2323 </li>
2424 {% endif %}
  
1313 }
1414 return false;
1515 }
16 function editPost(entry) {
17 t = _.template($("#editTemplate").html());
18 $(".modal-body").append(t(items=entry));
19 $("input").each(function(item) {
20 $(this).val(entry[$(this).attr('for')]);
21
22 }, this);
23 $("#editModal").modal();
24 }
1625</script>
1726<ul class="entries">
1827 {% for entry in entries %}
2929 @<b>{{ entry.who }}</b>
3030 <b>#{{ entry.what }}</b> /{{ entry.where }} {{ entry.how|safe }}
3131 {% if session.logged_in %}
32 {% if session.isAdmin or session.username == entry.who %}
33 <button class="right btn btn-sm btn-default" onclick='editPost({{entry.how|tojson|safe}})'>
34 <i class="glyphicon glyphicon-edit"></i>
35 </button>
3236 <a class="pull-right" href="#" onclick='deletePost({{entry.id|string|tojson|safe}})'>
33 <i class="icon-trash"></i>
37 <i class="glyphicon glyphicon-trash"></i>
3438 </a>
3539 {% endif %}
40 {% endif %}
3641 </li>
3742 {% endfor %}
3843</ul>
44
45<div class="modal fade" id="editModal" tabindex="-1" role="dialog" aria-labelledby="ModalLabel" aria-hidden="true">
46 <div class="modal-dialog modal-lg">
47 <div class="modal-content">
48 <div class="modal-header">
49 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
50 <h4 class="modal-title">Edit SWeeT</h4>
51 </div>
52 <div class="modal-body row">
53
54 </div>
55 <div class="modal-footer">
56 <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
57 </div>
58 </div><!-- /.modal-content -->
59 </div><!-- /.modal-dialog -->
60</div><!-- /.modal -->
61
62<script type="text/template" id="editTemplate">
63<form action="" method="post">
64 <% _.each(items, function(item, key) { %>
65 <div class="input-group col-md-12">
66 <label> <%= key %> </label>
67 <input name=<%= key %> for=<%= key %> class="form-control" type="text"> </input>
68 </div>
69 </br>
70 <% }) %>
71 <button class="btn btn-default" type="submit">Save</button>
72</form>
73</script>
3974{% endblock %}