views.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. # -*- coding: utf-8 -*-
  2. from flask import request, g, redirect, url_for, abort, \
  3. render_template, flash, json, session, Response
  4. from flask.ext.babel import gettext as _
  5. from datetime import date, time, timedelta, datetime
  6. from urlparse import urlunsplit
  7. import locale
  8. locale.setlocale(locale.LC_ALL, '')
  9. import string
  10. from time import time
  11. from . import forms
  12. from .constants import *
  13. from . import app, db, cache
  14. from .models import ISP
  15. from .crawler import PrettyValidator
  16. @app.route('/')
  17. def home():
  18. return render_template('index.html', active_button="home")
  19. @app.route('/projects')
  20. def project_list():
  21. return render_template('project_list.html', projects=ISP.query.filter_by(is_disabled=False))
  22. # this needs to be cached
  23. @app.route('/isp/map_data.json', methods=['GET'])
  24. def isp_map_data():
  25. isps=ISP.query.filter_by(is_disabled=False)
  26. data=[]
  27. for isp in isps:
  28. d=dict(isp.json)
  29. for k in d.keys():
  30. if k not in ('name', 'shortname', 'coordinates'):
  31. del d[k]
  32. d['id']=isp.id
  33. d['ffdn_member']=isp.is_ffdn_member
  34. d['popup']=render_template('map_popup.html', isp=isp)
  35. data.append(d)
  36. return Response(json.dumps(data), mimetype='application/json')
  37. @app.route('/isp/<projectid>/covered_areas.json', methods=['GET'])
  38. def isp_covered_areas(projectid):
  39. p=ISP.query.filter_by(id=projectid, is_disabled=False).first()
  40. if not p:
  41. abort(404)
  42. return Response(json.dumps(p.json['coveredAreas']), mimetype='application/json')
  43. @app.route('/isp/<projectid>/')
  44. def project(projectid):
  45. p=ISP.query.filter_by(id=projectid, is_disabled=False).first()
  46. if not p:
  47. abort(404)
  48. return render_template('project_detail.html', project_row=p, project=p.json)
  49. @app.route('/isp/<projectid>/edit', methods=['GET', 'POST'])
  50. def edit_project(projectid):
  51. isp=ISP.query.filter_by(id=projectid, is_disabled=False).first()
  52. if not isp:
  53. abort(404)
  54. form = forms.ProjectForm.edit_json(isp.json)
  55. if form.validate_on_submit():
  56. isp.name = form.name.data
  57. isp.shortname = form.shortname.data or None
  58. isp.json=form.to_json(isp.json)
  59. db.session.add(isp)
  60. db.session.commit()
  61. flash(_(u'Project modified'), 'info')
  62. return redirect(url_for('project', projectid=isp.id))
  63. return render_template('project_form.html', form=form, project=isp)
  64. @app.route('/add-a-project', methods=['GET'])
  65. def add_project():
  66. return render_template('add_project.html')
  67. @app.route('/create/form', methods=['GET', 'POST'])
  68. def create_project_form():
  69. form = forms.ProjectForm()
  70. if form.validate_on_submit():
  71. isp=ISP()
  72. isp.name = form.name.data
  73. isp.shortname = form.shortname.data or None
  74. isp.json=form.to_json(isp.json)
  75. db.session.add(isp)
  76. db.session.commit()
  77. flash(_(u'Project created'), 'info')
  78. return redirect(url_for('project', projectid=isp.id))
  79. return render_template('project_form.html', form=form)
  80. @app.route('/create/json-url/validator', methods=['GET'])
  81. def json_url_validator():
  82. if 'form_json' not in session or \
  83. session['form_json'].get('validated', False):
  84. abort(403)
  85. v=session['form_json'].get('validator')
  86. if v is not None:
  87. if v > time()-5:
  88. abort(429)
  89. else:
  90. session['form_json']['validator']=time()
  91. validator=PrettyValidator(session=session._get_current_object())
  92. return Response(validator(session['form_json']['url']),
  93. mimetype="text/event-stream")
  94. @app.route('/create/json-url', methods=['GET', 'POST'])
  95. def create_project_json():
  96. form = forms.ProjectJSONForm()
  97. if form.validate_on_submit():
  98. u=list(form.url.data)
  99. u[2]='/isp.json' # new path
  100. url=urlunsplit(u)
  101. session['form_json'] = {'url': url}
  102. return render_template('project_json_validator.html')
  103. return render_template('project_json_form.html', form=form)
  104. @app.route('/create/json-url/confirm', methods=['POST'])
  105. def create_project_json_confirm():
  106. if 'form_json' in session and session['form_json'].get('validated', False):
  107. if not forms.is_url_unique(session['form_json']['url']):
  108. abort(409)
  109. jdict=session['form_json']['jdict']
  110. isp=ISP()
  111. isp.name=jdict['name']
  112. isp.shortname=jdict['shortname']
  113. isp.url=session['form_json']['url']
  114. isp.json=jdict
  115. del session['form_json']
  116. db.session.add(isp)
  117. db.session.commit()
  118. flash(_(u'Project created'), 'info')
  119. return redirect(url_for('project', projectid=isp.id))
  120. else:
  121. return redirect(url_for('create_project_json'))
  122. @app.route('/search', methods=['GET', 'POST'])
  123. def search():
  124. if request.method == 'POST':
  125. pass
  126. return render_template('search.html')
  127. #------
  128. # Filters
  129. @app.template_filter('step_to_label')
  130. def step_to_label(step):
  131. if step:
  132. return u"<a href='#' rel='tooltip' data-placement='right' title='" + STEPS[step] + "'><span class='badge badge-" + STEPS_LABELS[step] + "'>" + str(step) + "</span></a>"
  133. else:
  134. return u'-'
  135. @app.template_filter('member_to_label')
  136. def member_to_label(is_member):
  137. if is_member:
  138. 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>'
  139. return ''
  140. @app.template_filter('stepname')
  141. def stepname(step):
  142. return STEPS[step]
  143. @app.template_filter('gpspart')
  144. def gpspart(gps, part):
  145. parts = gps.split(':');
  146. if part == 1:
  147. return parts[0]
  148. elif part == 2:
  149. return parts[1]
  150. return "";