dankventskalender migrate to flask
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

131 行
3.7KB

  1. import os
  2. from flask import (
  3. Blueprint, render_template,
  4. flash, request, url_for, redirect, abort, g, send_from_directory, current_app)
  5. from werkzeug.utils import secure_filename
  6. from calender.auth import login_required
  7. from calender.db import get_db
  8. bp = Blueprint('calender', __name__)
  9. ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
  10. @bp.route('/')
  11. def index():
  12. db = get_db()
  13. posts = db.execute(
  14. 'SELECT p.id, title, body, created, author_id, username'
  15. ' FROM post p JOIN user u ON p.author_id = u.id'
  16. ' ORDER BY created DESC'
  17. ).fetchall()
  18. return render_template('calender/index.html', posts=posts)
  19. @bp.route('/create', methods=('GET', 'POST'))
  20. @login_required
  21. def create():
  22. if request.method == 'POST':
  23. title = request.form['title']
  24. body = request.form['body']
  25. error = None
  26. if not title:
  27. error = 'Title is required.'
  28. if error is not None:
  29. flash(error)
  30. else:
  31. db = get_db()
  32. db.execute(
  33. 'INSERT INTO post (title, body, author_id)'
  34. ' VALUES (?, ?, ?)',
  35. (title, body, g.user['id'])
  36. )
  37. db.commit()
  38. # check if the post request has the file part
  39. if 'file' not in request.files:
  40. flash('No file part')
  41. return redirect(request.url)
  42. file = request.files['file']
  43. # if user does not select file, browser also
  44. # submit an empty part without filename
  45. if file.filename == '':
  46. flash('No selected file')
  47. return redirect(request.url)
  48. if file and allowed_file(file.filename):
  49. filename = secure_filename(file.filename)
  50. file.save(os.path.join(current_app.config['UPLOAD_FOLDER'], filename))
  51. return redirect(url_for('calender.uploaded_file',
  52. filename=filename))
  53. return redirect(url_for('calender.index'))
  54. return render_template('calender/create.html')
  55. def get_post(id, check_author=True):
  56. post = get_db().execute(
  57. 'SELECT p.id, title, body, created, author_id, username'
  58. ' FROM post p JOIN user u ON p.author_id = u.id'
  59. ' WHERE p.id = ?',
  60. (id,)
  61. ).fetchone()
  62. if post is None:
  63. abort(404, "Post id {0} doesn't exist.".format(id))
  64. if check_author and post['author_id'] != g.user['id']:
  65. abort(403)
  66. return post
  67. @bp.route('/<int:id>/update', methods=('GET', 'POST'))
  68. @login_required
  69. def update(id):
  70. post = get_post(id)
  71. if request.method == 'POST':
  72. title = request.form['title']
  73. body = request.form['body']
  74. error = None
  75. if not title:
  76. error = 'Title is required.'
  77. if error is not None:
  78. flash(error)
  79. else:
  80. db = get_db()
  81. db.execute(
  82. 'UPDATE post SET title = ?, body = ?'
  83. ' WHERE id = ?',
  84. (title, body, id)
  85. )
  86. db.commit()
  87. return redirect(url_for('calender.index'))
  88. return render_template('calender/update.html', post=post)
  89. @bp.route('/<int:id>/delete', methods=('POST',))
  90. @login_required
  91. def delete(id):
  92. get_post(id)
  93. db = get_db()
  94. db.execute('DELETE FROM post WHERE id = ?', (id,))
  95. db.commit()
  96. return redirect(url_for('calender.index'))
  97. def allowed_file(filename):
  98. return '.' in filename and \
  99. filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
  100. @bp.route('/uploads/<filename>')
  101. def uploaded_file(filename):
  102. return send_from_directory(current_app.config['UPLOAD_FOLDER'],
  103. filename)