views.py 6.2 KB

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