Changeset - 9f0c38d326dc
[Not reviewed]
ennstatus/donate/forms.py
Show inline comments
 
from flask_wtf import Form
 
from wtforms import SelectField
 
from wtforms import SelectField, SubmitField
 
from wtforms.validators import DataRequired
 

	
 

	
 
class DateForm(Form):
 
    year = SelectField('Year', validators=[DataRequired()])
 
    month = SelectField('Month',
 
                        choices=[
 
                            ('{:02d}'.format(i), str(i)) for i in range(1, 13)
 
                        ],
 
                        validators=[DataRequired()])
 

	
 
    submit = SubmitField('Submit')
ennstatus/root/forms.py
Show inline comments
 
from flask_wtf import Form
 
from wtforms import (SelectField,
 
                     StringField,
 
                     RadioField,
 
                     BooleanField,
 
                     SubmitField
 
                     )
 
from wtforms.validators import InputRequired, Email, Length, DataRequired
 

	
 

	
 
COUNTRIES = [
 
    ('luxembourg', 'Luxembourg'),
 
    ('belgium', 'Belgium'),
 
    ('france', 'France'),
 
    ('germany', 'Germany'),
 
]
 

	
 

	
 
class BPMForm(Form):
 
    country = SelectField('Country',
 
                          validators=[DataRequired()],
 
                          choices=COUNTRIES)
 
    submit = SubmitField('Submit')
 

	
 

	
 
class MembershipForm(Form):
 

	
 
    username = StringField('Username*',
 
                           validators=[
 
                               InputRequired('This field is required!'),
 
                               Length(max=255)
 
                           ]
 
                           )
 
    email = StringField('E-Mail*',
 
                        validators=[
 
                            InputRequired('This field is required!'),
 
                            Email()
 
                        ]
 
                        )
 
    fullname = StringField('Full name',
 
                           validators=[Length(max=65536)],
 
                           )
 
    street = StringField('Nr., Street',
 
                         validators=[Length(max=4000)],
 
                         )
 
    zip = StringField('ZIP-Code',
 
                      validators=[Length(max=30)],
ennstatus/static/css/ennstatus.css
Show inline comments
 
@@ -40,99 +40,48 @@ h1, h2, h3, h4 {
 
}
 

	
 
.dropdown-menu > li > a {
 
  color: #fff;
 
}
 

	
 
.dropdown-menu > li > a:hover {
 
   background-color: #00bf1a;
 
   color: #333;
 
}
 

	
 
.navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus {
 
   background-color: #00bf1a;
 
   color: #fff;
 
}
 

	
 
.dropdown-menu .divider {
 
    background-color: #00bf1a;
 
}
 

	
 
a, a:hover, a:active, a:visited {
 
    color: #af24cb;
 
}
 

	
 

	
 
/* Multi level dropdown menu http://bootsnipp.com/snippets/featured/multi-level-dropdown-menu-bs3 */
 

	
 
.dropdown-submenu {
 
    position: relative;
 
}
 

	
 
.dropdown-submenu > .dropdown-menu {
 
    top: 0;
 
    left: 100%;
 
    margin-top: -6px;
 
    margin-left: -1px;
 
    -webkit-border-radius: 0 6px 6px 6px;
 
    -moz-border-radius: 0 6px 6px 6px;
 
    border-radius: 0 6px 6px 6px;
 
}
 

	
 
.dropdown-submenu:hover > .dropdown-menu {
 
    display: block;
 
}
 

	
 
.dropdown-submenu > a:after {
 
    display: block;
 
    content: " ";
 
    float: right;
 
    width: 0;
 
    height: 0;
 
    border-color: transparent;
 
    border-style: solid;
 
    border-width: 5px 0 5px 5px;
 
    border-left-color: #ccc;
 
    margin-top: 5px;
 
    margin-right: -10px;
 
}
 

	
 
.dropdown-submenu:hover > a:after {
 
    border-left-color: #fff;
 
}
 

	
 
.dropdown-submenu .pull-left {
 
    float: none;
 
}
 

	
 
.dropdown-submenu .pull-left > .dropdown-menu {
 
    left: -100%;
 
    margin-left: 10px;
 
    -webkit-border-radius: 6px 0 6px 6px;
 
    -moz-border-radius: 6px 0 6px 6px;
 
    border-radius: 6px 0 6px 6px;
 
}
 

	
 
/* fancy bootstrap checkboxes */
 

	
 
.form-group input[type="checkbox"] {
 
    display: none;
 
}
 

	
 
.form-group input[type="checkbox"] + .btn-group > label span {
 
    width: 20px;
 
}
 

	
 
.form-group input[type="checkbox"] + .btn-group > label span:first-child {
 
    display: none;
 
}
 

	
 
.form-group input[type="checkbox"] + .btn-group > label span:last-child {
 
    display: inline-block;
 
}
 

	
 
.form-group input[type="checkbox"]:checked + .btn-group > label span:first-child {
 
    display: inline-block;
 
}
 

	
 
.form-group input[type="checkbox"]:checked + .btn-group > label span:last-child {
 
    display: none;
ennstatus/status/forms.py
Show inline comments
 
new file 100644
 
from flask_wtf import Form
 
from wtforms import SelectField, SubmitField
 
from wtforms.validators import DataRequired
 

	
 
SERVERTYPES = [
 
    ('all', 'All'),
 
    ('exit', 'Exits'),
 
    ('relay', 'Relays'),
 
    ('bridge', 'Bridges')
 
]
 

	
 

	
 
class ServerTypeForm(Form):
 
    servertype = SelectField(
 
        'Servertype',
 
        validators=[DataRequired()],
 
        choices=SERVERTYPES
 
    )
 
    submit = SubmitField('Submit')
ennstatus/status/views.py
Show inline comments
 
from flask import Blueprint, render_template, current_app
 
from flask import (Blueprint,
 
                   render_template,
 
                   current_app,
 
                   request,
 
                   redirect,
 
                   url_for)
 

	
 
from ennstatus.status.functions import (all_servers_by_type, single_server,
 
                                        split_all_servers_to_types)
 

	
 
from .forms import ServerTypeForm
 

	
 
status_page = Blueprint('status', __name__)
 

	
 

	
 
@status_page.route('/')
 
@status_page.route('/', methods=('GET', 'POST'))
 
def index():
 
    current_app.logger.info('Handling status index!')
 

	
 
    form = ServerTypeForm()
 

	
 
    if request.method == 'POST':
 
        current_app.logger.debug('Validating form')
 
        if form.validate_on_submit():
 
            servertype = form.servertype.data
 
            if servertype != 'all':
 
                return redirect(url_for('status.' + servertype))
 

	
 
    servers = split_all_servers_to_types()
 

	
 
    current_app.logger.info('Returning servers')
 
    return render_template('status/index.html', exit=servers['exit'],
 
                           relay=servers['relay'], bridge=servers['bridge'])
 
                           relay=servers['relay'], bridge=servers['bridge'],
 
                           form=form)
 

	
 

	
 
@status_page.route('/exit')
 
def exit():
 
    servers = list(all_servers_by_type('exit'))
 
    return render_template('status/index.html', exit=servers)
 
    form = ServerTypeForm()
 
    form.servertype.data = 'exit'
 
    return render_template('status/index.html', exit=servers, form=form)
 

	
 

	
 
@status_page.route('/relay')
 
def relay():
 
    servers = list(all_servers_by_type('relay'))
 
    return render_template('status/index.html', relay=servers)
 
    form = ServerTypeForm()
 
    form.servertype.data = 'relay'
 
    return render_template('status/index.html', relay=servers, form=form)
 

	
 

	
 
@status_page.route('/bridge')
 
def bridge():
 
    servers = list(all_servers_by_type('bridge'))
 
    return render_template('status/index.html', bridge=servers)
 
    form = ServerTypeForm()
 
    form.servertype.data = 'bridge'
 
    return render_template('status/index.html', bridge=servers, form=form)
 

	
 

	
 
@status_page.route('/single/<server_name>')
 
def single(server_name):
 
    server = single_server(server_name.lower())
 
    kwargs = {server['server_type'].lower(): [server]}
 
    return render_template('status/index.html', **kwargs)
ennstatus/templates/base.html
Show inline comments
 
@@ -40,59 +40,50 @@
 
  <div class="navbar navbar-default">
 
    <div class="navbar-header">
 
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
 
        <span class="icon-bar"></span>
 
        <span class="icon-bar"></span>
 
        <span class="icon-bar"></span>
 
      </button>
 
      <img class="navbar-brand" src="{{ url_for('static', filename='images/logo/FVDE_logo_thumbnail.png') }}"></img>
 
      <a class="navbar-brand" href="{{ url_for('root.index') }}">Enn.lu</a>
 
    </div>
 
    <div class="navbar-collapse collapse">
 
      <ul class="nav navbar-nav">
 
        <li class="dropdown">
 
          <a href="#" class="dropdown-toggle" data-toggle="dropdown">About <b class="caret"></b></a>
 
          <ul class="dropdown-menu">
 
            <li><a href="//{{ wiki_url }}/doku.php?id=news" target="blank">News</a></li>
 
            <li class="divider"></li>
 
            <li><a href="{{ url_for('root.about') }}">Organization</a></li>
 
            <li><a href="{{ url_for('root.partners') }}">Partners</a></li>
 
          </ul>
 
        </li>
 
        <li class="dropdown">
 
          <a href="#" class="dropdown-toggle" data-toggle="dropdown">Services <b class="caret"></b></a>
 
          <ul class="dropdown-menu">
 
            <li class="dropdown-submenu">
 
              <a>Tor Servers</a>
 
              <ul class="dropdown-menu">
 
                <li><a href="{{ url_for('status.index') }}">All servers</a></li>
 
                <li class="divider"></li>
 
                <li><a href="{{ url_for('status.exit') }}">Exits</a></li>
 
                <li><a href="{{ url_for('status.relay') }}">Relays</a></li>
 
                <li><a href="{{ url_for('status.bridge') }}">Bridges</a></li>
 
              </ul>
 
            <li><a href="{{ url_for('status.index') }}">Tor Servers</a></li>
 
            <li class="divider"></li>
 
            </li>
 
            <li><a href="{{ url_for('root.mirrors') }}">Mirrors</a></li>
 
            <li><a href="//{{ wiki_url }}">Wiki</a></li>
 
            <li class="divider"></li>
 
            <li><a href="{{ url_for('root.ennstatus') }}">About Ënnstatus</a></li>
 
          </ul>
 
        </li>
 
        <li class="dropdown">
 
          <a href="#" class="dropdown-toggle" data-toggle="dropdown">Support <b class="caret"></b></a>
 
          <ul class="dropdown-menu">
 
            <li><a href="{{ url_for('donate.index') }}">Donate</a></li>
 
            <li><a href="{{ url_for('donate.received') }}">Donation history</a></li>
 
            <li><a href="{{ url_for('root.bridgeprogram')}}">Adopt a Bridge</a></li>
 
            <li class="divider"></li>
 
            <li><a href="{{ url_for('root.member') }}">Join Us</a></li>
 
            <li class="dropdown-submenu">
 
            </li>
 
          </ul>
 
        </li>
 
        <li class="dropdown">
 
          <a href="#" class="dropdown-toggle" data-toggle="dropdown">Contact <b class="caret"></b></a>
 
          <ul class="dropdown-menu">
 
            <li><a href="{{ url_for('root.contact') }}">General</a></li>
 
            <li><a href="{{ url_for('root.abuse') }}">Abuse</a></li>
 
            <li class="divider"></li>
ennstatus/templates/donate/index.html
Show inline comments
 
@@ -50,49 +50,49 @@
 
            <strong>IBAN:</strong> LU65 0019 4055 6782 7000<br>
 
          </p>
 
       </div>
 
       <div class="well well-sm">
 
       <p>
 
         <strong>Account holder:</strong> Chaos Computer Club Lëtzebuerg A.S.B.L.<br>
 
         <strong>BIC/SWIFT:</strong> BCEELULL<br>
 
         <strong>IBAN:</strong> LU29 0019 2855 3890 4000<br>
 
         <strong>Subject:</strong> * to FVDE<br>
 
       </p>
 
       </div>
 
      </div>
 
    </div>
 
    <div class="col-md-4 clearfix">
 
      <div class="thumbnail">
 
        <center>
 
          <h3>SnailMail</h3>
 
        </center>
 
        <div class="well well-sm">
 
          <div class="pull-right">
 
            <form class="form-inline" role="form" method="POST" action"{{ url_for('donate.index') }}">
 
              {{ form.hidden_tag() }}
 
              <div class="form-group">
 
                {{ form.country(class_='form-control input-sm', onchange='this.form.submit()') }}
 
                <noscript><input type="submit" class="btn btn-enn btn-sm" value="Submit"></noscript>
 
                <noscript>{{ form.submit(class_='btn btn-enn btn-sm') }}</noscript>
 
              </div>
 
            </form>
 
          </div>
 
          <address>
 
            <strong>Frënn vun der Ënn, ASBL</strong><br>
 
                    BPM 381892<br>
 
                    {{ address['address'] }}<br>
 
                    {{ address['postal_code'] }}, {{ address['city'] }}<br>
 
                    {{ address['country'] }}
 
          </address>
 
        </div>
 
      </div>
 
    </div>
 
    <div class="col-md-4">
 
      <div class="thumbnail">
 
        <center>
 
          <h3>Bitcoin</h3>
 
        </center>
 
        <div class="well well-sm">
 
          <p>
 
            <strong>Bitcoin Address:</strong> 1EYZCq2ZL6chWXYYkJoDo7fz39UC7do5cC
 
          </p>
 
        </div>
 
        <form class="bitpay-donate form-horizontal" action="https://bitpay.com/checkout" method="POST" onsubmit="return checkRequiredFields(this);">
ennstatus/templates/donate/received.html
Show inline comments
 
@@ -2,41 +2,41 @@
 
{% import "donate/macros.html" as macros %}
 

	
 
{% set title = "Donate - Received donations" %}
 

	
 
{% block content %}
 
  <div class="col-md-12">
 
    <h2>Received Donations</h2>
 
  </div>
 
  <div class="col-md-12 clearfix">
 
    <div class="pull-left">
 
      {% if csv_file %}
 
        <h3>{{ '-'.join([year, month]) }}</h3>
 
      {% else %}
 
        <h3>Error!</h3>
 
      {% endif %}
 
    </div>
 
    <div class="pull-right">
 
      <form class="form-inline" role="form" method="POST" action="/donate/received">
 
        {{ form.hidden_tag() }}
 
        <div class="form-group">
 
          {{ form.year.label }}
 
          {{ form.year(class_='form-control input-sm') }}
 
          {{ form.month.label }}
 
          {{ form.month(class_='form-control input-sm') }}
 
          <input type="submit" class="btn btn-enn btn-sm" value="Submit">
 
          {{ form.submit(class_='btn btn-enn btn-sm') }}
 
        </div>
 
      </form> 
 
    </div>
 
  </div>
 
  <div class="col-md-12">
 
    {% if csv_file %}
 
      {{ macros.create_donations_table(csv_file) }}
 
    {% else %}
 
      {% if year and month %}
 
        <p>No donations found for {{ '-'.join([year, month]) }}!</p>
 
      {% else %}
 
        <p>No donations found!</p>
 
      {% endif %}
 
    {% endif %}
 
  </div>
 
{% endblock %}
ennstatus/templates/root/contact.html
Show inline comments
 
{% extends "base.html" %}
 

	
 
{% set title = "Contact" %}
 

	
 
{% block content %}
 
  <div class="col-md-4">
 
    <img src="{{ url_for('static', filename='images/Contact.png') }}" class="img-responsive img-rounded center-block" alt="WhoIs" width="160"></img>
 
    <div class="text-center">
 
      <h2>Contact</h2>
 
    </div>
 
  </div>
 
  <div class="col-md-8 clearfix">
 
    <h2 class="pull-left">General</h2>
 
    <div class="pull-right">
 
      <form class="form-inline" role="form" method="POST" action="{{ url_for('root.contact') }}">
 
        {{ form.hidden_tag()}}
 
        <div class="form-group">
 
          {{ form.country(class_='form-control input-sm', onchange='this.form.submit()') }}
 
          <noscript><input type="submit" class="btn btn-enn btn-sm" value="Submit"></noscript>
 
          <noscript>{{ form.submit(class_='btn btn-enn btn-sm') }}</noscript>
 
        </div>
 
      </form>
 
    </div>
 
  </div>
 
  <div class="col-md-8">
 
    <p>Please mail all general inquiries to:</p>
 
    <address>
 
      <strong>Frënn vun der Ënn, ASBL</strong><br>
 
        BPM 381892<br>
 
        {{ address['address'] }}<br>
 
        {{ address['postal_code'] }}, {{ address['city'] }}<br>
 
        {{ address['country'] }}<br>
 
        <br>
 
      <abbr title="E-Mail"><span class="glyphicon glyphicon-envelope"></span></abbr> : <a href="mailto:info@enn.lu">info@enn.lu</a> <span class="glyphicon glyphicon-lock"></span> GPG: <a href="http://keyserver.cypherpunk.lu:11371/pks/lookup?search=info@enn.lu&op=vindex" target="_blank">0x02225522</a><br>
 
      <abbr title="Website"><span class="glyphicon glyphicon-cloud"></span></abbr> : <a href="//enn.lu/">enn.lu/</a> <strong>or</strong> <a href="//{{ config['ENNSTATUS_ONION_ADDRESS'] }}/" target="_blank">{{ config['ENNSTATUS_ONION_ADDRESS'] }}</a><br>
 
      <abbr title="Phone"><span class="glyphicon glyphicon-earphone"></span></abbr> : +352-691-71-77-44<br>
 
      <abbr title="Fax"><span class="glyphicon glyphicon-phone-alt"></span></abbr> : +352-20-21-18-60
 
    </address>
 

	
 
    <h2>Abuse</h2>
 
    <p>For further details about abuse handling, have a look over <a href="{{ url_for('root.abuse') }}">here</a>.</p>
 
    <address>
 
      <abbr title="E-Mail"><span class="glyphicon glyphicon-envelope"></span></abbr> : <a href="mailto:abuse@enn.lu">abuse@enn.lu</a> <span class="glyphicon glyphicon-lock"></span> GPG: <a href="http://keyserver.cypherpunk.lu:11371/pks/lookup?search=info@enn.lu&op=vindex" target="_blank">0x02225522</a><br>
 
      <abbr title="Phone"><span class="glyphicon glyphicon-earphone"></span></abbr> : </strong>+352-691-71-77-44<br>
ennstatus/templates/root/ennstatus.html
Show inline comments
 
@@ -8,28 +8,29 @@
 
    <div class="col-md-6">
 
      <h3>API</h3>
 
      <p>We provide a <a href="http://json.org/">JSON</a> API for exporting the current status of our servers</p>
 
      <h4>Exporting all servers</h4>
 
      <p>Under the endpoint <a href="{{ url_for('api.export') }}">/api/export</a>, you can find an export of all our servers</p>
 
    </div>
 
    <div class="col-md-6">
 
      <h3>Used libraries:</h3>
 
      <ul>
 
        <li><a href="http://flask.pocoo.org/">Flask</a></li>
 
        <li><a href="https://github.com/mbr/flask-bootstrap">Flask-Bootstrap</a></li>
 
        <li><a href="http://flask-httpauth.readthedocs.org/en/latest/">Flask-HTTPAuth</a></li>
 
        <li><a href="http://packages.python.org/Flask-Mail/">Flask-Mail</a></li>
 
        <li><a href="http://https://github.com/miguelgrinberg/flask-moment/">Flask-Moment</a></li>
 
        <li><a href="https://flask-wtf.readthedocs.org/en/latest/">Flask-WTF</a></li>
 
        <li><a href="https://pypi.python.org/pypi/pygeoip/">pygeoip</a></li>
 
        <li><a href="https://pypi.python.org/pypi/jsonschema/">jsonschema</a></li>
 
        <li><a href="https://pypi.python.org/pypi/strict-rfc3339">strict-rfc3339</a></li>
 
        <li><a href="http://docs.python-requests.org/en/latest/">requests</a></li>
 
        <li><a href="https://github.com/isislovecruft/python-gnupg">python-gnupg</a></li>
 
        <li><a href="http://click.pocoo.org/">click</a></li>
 
        <li><a href="http://videojs.com/">video.js</a></li>
 
      </ul>
 
      <p>Flag icons provided by: <a href="http://www.famfamfam.com/lab/icons/flags/">famfamfam</a></p>
 
      <p>Other icons provided by: <a href="http://glyphicons.com/">Glyphicons</a></p>
 
      <p>Fork us on <a href="https://bitbucket.org/fvde/ennstatus-relaunched">Bitbucket</a></p>
 
    </div>
 
  </div>
 
{% endblock %}
ennstatus/templates/status/index.html
Show inline comments
 
{% extends "base.html" %}
 
{% import "status/macros.html" as macros with context%}
 

	
 
{% set title = "Ënnstatus" %}
 

	
 
{% block styles %}
 
  {{ super() }}
 
  <link rel="stylesheet" href="{{ url_for('static', filename='css/flags/flags.png.min.css') }}" />
 
{% endblock %}
 

	
 
{% block content %}
 
  <div class="col-md-12">
 
  <div class="col-md-12 clearfix">
 
    <div class="pull-right">
 
      <form class="form-inline" role="form" method="POST" action="{{ url_for('status.index') }}">
 
        {{ form.hidden_tag() }}
 
        <div class="form-group">
 
          {{ form.servertype(class_='form-control input-sm', onchange='this.form.submit()') }}
 
          <noscript>{{ form.submit(class_='btn btn-enn btn-sm') }}</noscript>
 
        </div>
 
      </form>
 
    </div>
 
    {% if not (exit or relay or bridge) %}
 
      <p>No servers found!</p>
 
    {% else %}
 
      {% if exit %}
 
        {{ macros.create_server_table('exit', exit) }}
 
      {% endif %}
 
      {% if relay %}
 
        {{ macros.create_server_table('relay', relay) }}
 
      {% endif %}
 
      {% if bridge %}
 
        {{ macros.create_server_table('bridge', bridge) }}
 
      {% endif %}
 
    {% endif %}
 
  </div>
 
{% endblock %}
 

	
 
{% block scripts %}
 
  {{ super() }}
 
  {{ moment.include_moment(local_js=url_for('static', filename='js/momentjs/moment.js')) }}
 
  <script src="{{ url_for('static', filename='js/sorttable.js') }}"></script>
 
{% endblock %}
0 comments (0 inline, 0 general)