main.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from flask import Flask, request, session, g, redirect, url_for, abort, \
  4. render_template, flash, jsonify
  5. import sqlite3
  6. from datetime import date, time, timedelta, datetime
  7. import locale
  8. locale.setlocale(locale.LC_ALL, '')
  9. import string
  10. from settings import *
  11. app = Flask(__name__)
  12. app.config.from_object(__name__)
  13. def connect_db():
  14. return sqlite3.connect(app.config['DATABASE'])
  15. @app.before_request
  16. def before_request():
  17. g.db = connect_db()
  18. #g.db.execute("PRAGMA foreign_keys = ON")
  19. @app.teardown_request
  20. def teardown_request(exception):
  21. g.db.close()
  22. @app.route('/')
  23. def home():
  24. return render_template('index.html', active_button="home")
  25. def query_db(query, args=(), one=False):
  26. cur = g.db.execute(query, args)
  27. rv = [dict((cur.description[idx][0], value)
  28. for idx, value in enumerate(row)) for row in cur.fetchall()]
  29. return (rv[0] if rv else None) if one else rv
  30. def init_db():
  31. with closing(connect_db()) as db:
  32. with app.open_resource('schema.sql') as f:
  33. db.cursor().executescript(f.read())
  34. db.commit()
  35. @app.route('/members')
  36. def members():
  37. members = query_db('select * from fai where is_member = 1')
  38. return render_template('members.html', members=members)
  39. @app.route('/projects')
  40. def projects():
  41. projects = list()
  42. for project in query_db('select * from fai order by is_member desc,step desc,name'):
  43. project['stepname'] = STEPS[project['step']]
  44. projects.append(project)
  45. return render_template('projects.html', projects=projects)
  46. @app.route('/fai/<projectid>')
  47. def project(projectid):
  48. project = query_db('select * from fai where id = ?', [projectid], one=True)
  49. if project is None:
  50. abort(404)
  51. project['stepname'] = STEPS[project['step']]
  52. return render_template('project.html', project=project)
  53. @app.route('/edit/<projectid>', methods=['GET', 'POST'])
  54. def edit_project(projectid):
  55. project = query_db('select * from fai where id = ?', [projectid], one=True)
  56. if project is None:
  57. abort(404)
  58. if request.method == 'POST':
  59. if request.form['name']:
  60. if request.form['shortname']:
  61. if query_db('select * from fai where id!=? and (name=? or shortname=?)', [projectid, request.form['name'], request.form['shortname']], one=True) is None:
  62. is_member = 0
  63. if 'is_member' in request.form.keys():
  64. is_member = 1
  65. g.db.execute('update fai set name = ?, shortname = ?, description = ?, website = ?, email = ?, irc_channel = ?, irc_server = ?, zone = ?, gps = ?, step = ?, is_member = ? where id = ?',
  66. [request.form['name'], request.form['shortname'], request.form['description'], request.form['website'], request.form['email'], request.form['irc_channel'], request.form['irc_server'], request.form['zone'], request.form['gps1'] + ':' + request.form['gps2'], request.form['step'][:1], is_member, projectid])
  67. g.db.commit()
  68. flash(u"Le projet a bien été mis à jour. Merci pour votre contribution !", "success")
  69. project = query_db('select * from fai where id = ?', [projectid], one=True)
  70. return redirect(url_for('project', projectid=projectid))
  71. else:
  72. flash(u'Le nom complet ou le nom court que vous avez choisi est déjà pris.', 'error')
  73. else:
  74. flash(u'Vous devez spécifier un nom court (éventuellement, le même que le nom complet).', 'error')
  75. else:
  76. flash(u'Vous devez spécifier un nom.', 'error')
  77. project['stepname'] = STEPS[project['step']]
  78. return render_template('edit_project.html', project=project)
  79. @app.route('/create', methods=['GET', 'POST'])
  80. def create_project():
  81. if request.method == 'POST':
  82. if request.form['name']:
  83. if request.form['shortname']:
  84. if query_db('select * from fai where name=? or shortname=?', [request.form['name'], request.form['shortname']], one=True) is None:
  85. g.db.execute('INSERT INTO fai (name, shortname, description, website, email, irc_channel, irc_server, zone, gps, step) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
  86. [request.form['name'], request.form['shortname'], request.form['description'], request.form['website'], request.form['email'], request.form['irc_channel'], request.form['irc_server'], request.form['zone'], request.form['gps1'] + ':' + request.form['gps2'], request.form['step'][:1]])
  87. g.db.commit()
  88. flash(u"Le projet a bien été créé. Merci pour votre contribution !", "success")
  89. project = query_db('select * from fai where name = ?', [request.form['name']], one=True)
  90. if project is not None:
  91. return redirect(url_for('project', projectid=project['id']))
  92. else:
  93. flash(u'Hum… il semble que le projet n\'a pas été créé… vous voulez-bien réessayer ?', 'error')
  94. else:
  95. flash(u'Le nom complet ou le nom court que vous avez choisi est déjà pris.', 'error')
  96. else:
  97. flash(u'Vous devez spécifier un nom court (éventuellement, le même que le nom complet).', 'error')
  98. else:
  99. flash(u'Vous devez spécifier un nom.', 'error')
  100. return render_template('create_project.html')
  101. @app.route('/search', methods=['GET', 'POST'])
  102. def search():
  103. if request.method == 'POST':
  104. pass
  105. return render_template('search.html')
  106. @app.route('/api/<projects>.json')
  107. def projects_json(projects):
  108. if projects == 'projects':
  109. query = 'select * from fai'
  110. elif projects == 'members':
  111. query = 'select * from fai where is_member = 1'
  112. else:
  113. abort(404)
  114. fais = dict()
  115. for fai in query_db(query):
  116. fais[fai['name']] = fai
  117. return jsonify(fais)
  118. @app.route('/api/members_drupal')
  119. def members_drupal():
  120. members = query_db('select * from fai where is_member = 1 order by shortname')
  121. return render_template('members_drupal.html', members=members)
  122. #------
  123. # Filters
  124. @app.template_filter('step_to_label')
  125. def step_to_label(step):
  126. return u"<a href='#' rel='tooltip' data-placement='right' title='" + STEPS[step] + "'><span class='badge badge-" + STEPS_LABELS[step] + "'>" + str(step) + "</span></a>"
  127. @app.template_filter('member_to_label')
  128. def member_to_label(is_member):
  129. if is_member:
  130. return u'<a href="#" rel="tooltip" data-placement="right" title="Membre de la Fédération FDN"><span class="label label-success">FFDN</span></a>'
  131. return ''
  132. @app.template_filter('stepname')
  133. def stepname(step):
  134. return STEPS[step]
  135. @app.template_filter('gpspart')
  136. def gpspart(gps, part):
  137. parts = gps.split(':');
  138. if part == 1:
  139. return parts[0]
  140. elif part == 2:
  141. return parts[1]
  142. return "";
  143. #------
  144. # Main
  145. if __name__ == '__main__':
  146. app.run()