Changeset - ceb89e14107f
[Not reviewed]
default
0 5 0
Dennis Fink - 11 years ago 2013-11-18 23:23:51
dennis.fink@c3l.lu
updated ennstatus
5 files changed with 8 insertions and 8 deletions:
0 comments (0 inline, 0 general)
ennstatus/api/views.py
Show inline comments
 
@@ -4,104 +4,104 @@ from flask import (Blueprint, request, c
 
from ennstatus.api.functions import check_json_format, update_server
 
from ennstatus.status.functions import (single_server, all_servers,
 
                                        all_servers_by_type)
 

	
 
api_page = Blueprint('api', __name__)
 

	
 

	
 
@api_page.route('/update', methods=('POST',))
 
def update():
 

	
 
    current_app.logger.info('Handling update')
 
    if current_app.debug:
 
        accepted_ips = ['127.0.0.1']
 
    else:
 
        accepted_ips = current_app.config.get('ENNSTATUS_ACCEPTED_IPS', [])
 

	
 
    json = request.get_json()
 
    if json is None:
 
        current_app.logger.info('No JSON data supplied!')
 
        return 'No JSON data supplied!\n', 400, {'Content-Type': 'text/plain'}
 

	
 
    try:
 
        check_json_format(json)
 
    except ValueError as e:
 
        current_app.logger.warning(' '.join([str(e), str(json)]))
 
        return str(e), 409, {'Content-Type': 'text/plain'}
 

	
 
    if 'ip' in json:
 
        ip = json['ip']
 
    else:
 
        ip = request.remote_addr
 

	
 
    if request.remote_addr not in accepted_ips:
 
        current_app.logger.warn("Unallowed IP %s tried to update data!"
 
                                % ip)
 
        return 'IP not allowed!\n', 403, {'Content-Type': 'text/plain'}
 

	
 
    current_app.logger.info(str(json))    
 
    server = update_server(server=json, ip=ip)
 

	
 
    if server:
 
        current_app.logger.info('Return result')
 
        current_app.logger.info(str(server))
 
        return (jsonify(server), 201,
 
                {'Location': '/api/export/json/single?server_name=%s'
 
                 % server['server_name']})
 

	
 
    else:
 
        current_app.logger.error("Unexpected error: %s" % server,
 
                                 exc_info=True)
 
        return abort(500)
 

	
 

	
 
@api_page.route('/export', defaults={'server_type': 'all',
 
                                     'export_format': 'json'})
 
@api_page.route('/export/<any("json", "xml"):export_format>',
 
                defaults={'server_type': 'all'})
 
@api_page.route(('/export/<any("json", "xml"):export_format>'
 
                 '/<any("all", "exit", "bridge", "relay", "single")'
 
                 ':server_type>'))
 
def export(export_format, server_type):
 

	
 
    current_app.logger.info('Handling export')
 
    if server_type == 'single':
 
        server_name = request.args.get('server_name', None)
 
        if server_name is not None:
 
            server = single_server(server_name)
 
            if server:
 
                if export_format == 'json':
 
                    current_app.logger.info('Returning server as json!')
 
                    return jsonify(server)
 
                else:
 
                    current_app.logger.info('Returning server as xml!')
 
                    return (
 
                        render_template(
 
                            'api/extract/xml/single_server.xml',
 
                            server=server),
 
                        200, {'Content-Type': 'text/xml'})
 
            else:
 
                current_app.logger.warning('Server not found!')
 
                return ('Server not found!\n',
 
                        404, {'Content-Type': 'text/plain'})
 
        else:
 
            current_app.logger.warning('No server_name specified!')
 
            return ('No server_name specified!\n',
 
                    400, {'Content-Type': 'text/plain'})
 

	
 
    else:
 
        if server_type == 'all':
 
            current_app.logger.info('Getting all servers!')
 
            servers = list(all_servers())
 
        else:
 
            current_app.logger.info('Getting all %s!' % server_type)
 
            servers = list(all_servers_by_type(server_type.capitalize()))
 

	
 
        if export_format == 'json':
 
            response = {'enn-network': servers}
 
            response = {'enn_network': servers}
 
            current_app.logger.info('Returning as json!')
 
            return jsonify(response)
 
        else:
 
            current_app.logger.info('Returning as xml!')
 
            return (render_template('api/extract/xml/network.xml',
 
                                    servers=servers),
 
                    200, {'Content-Type': 'text/xml'})
ennstatus/donate/functions.py
Show inline comments
 
import os
 
import os.path
 
import csv
 

	
 

	
 
def load_csv(date):
 

	
 
    filename = '.'.join([date, 'csv'])
 
    path = os.path.join('donations', filename)
 

	
 
    with open(path, newline='') as csvfile:
 
    with open(path) as csvfile:
 
        csvreader = csv.reader(csvfile, delimiter=',')
 

	
 
        for row in csvreader:
 
            yield row
 

	
 

	
 
def get_choices():
 

	
 
    files = os.listdir('donations')
 

	
 
    for file in files:
 
        if not file.startswith('.') \
 
           and file.endswith('.csv'):
 
            yield os.path.splitext(file)[0]
ennstatus/donate/views.py
Show inline comments
 
from flask import (Blueprint, render_template, request,
 
                   redirect, url_for, current_app)
 

	
 
from ennstatus.donate.forms import DateForm
 
from ennstatus.donate.functions import load_csv, get_choices
 

	
 
donate_page = Blueprint('donate', __name__)
 

	
 

	
 
@donate_page.route('/')
 
def index():
 
    return render_template('donate/index.html')
 

	
 

	
 
@donate_page.route('/wiretransfer')
 
def wiretransfer():
 
    return render_template('donate/wiretransfer.html')
 

	
 

	
 
@donate_page.route('/snailmail')
 
def snailmail():
 
    return render_template('donate/snailmail.html')
 

	
 

	
 
@donate_page.route('/paypal')
 
def paypal():
 
    return render_template('donate/paypal.html')
 

	
 

	
 
@donate_page.route('/bitcoin')
 
def bitcoin():
 
    return render_template('donate/bitcoin.html')
 

	
 

	
 
@donate_page.route('/flattr')
 
def flattr():
 
    return render_template('donate/flattr.html')
 

	
 

	
 
@donate_page.route('/received',
 
                   methods=('GET', 'POST'))
 
def received():
 

	
 
    current_app.logger.info('Handling received')
 
    form = DateForm()
 

	
 
    current_app.logger.debug('Creating choices')
 
    choices = [name for name in get_choices()]
 
    choices.sort()
 
    form.date.choices = [(name, name) for name in choices]
 

	
 
    if not choices:
 
        current_app.logger.warn('No donations found!')
 
        return render_template('donate/received.html',
 
                               form=form, csv_file=None,
 
                               date=None)
 

	
 
    if request.method == 'POST':
 
        current_app.logger.debug('Validating form')
 
        if form.validate_on_submit():
 
            date = form.date.data
 
            return redirect(url_for('donate.received', date=date))
 
    else:
 
        if 'date' in request.args:
 
            date = request.args['date']
 
            if request.args['date'] in choices:
 
                current_app.logger.info('Showing date %s' % date)
 
                form.date.data = date
 
                csv_file = load_csv(date)
 
            else:
 
                current_app.logger.warn('Date %s not found' % date)
 
                return ('Date %s not found!', 500,
 
                return ('Date %s not found!' % date, 500,
 
                        {'Content-Type': 'text/plain'})
 
        else:
 
            current_app.logger.info('Showing last date %s' % choices[-1])
 
            form.date.data = choices[-1]
 
            csv_file = load_csv(choices[-1])
 
            date = choices[-1]
 

	
 
        current_app.logger.info('Return result')
 
        return render_template('donate/received.html',
 
                               form=form, csv_file=csv_file,
 
                               date=date)
ennstatus/templates/api/extract/xml/network.xml
Show inline comments
 
<?xml version="1.0" encoding="UTF-8" ?>
 
<enn-network>
 
<enn_network>
 
  {% for server in servers %}
 
    {%- include "api/extract/xml/server.xml" %}
 
  {% endfor %}
 
</enn-network>
 
</enn_network>
ennstatus/templates/donate/macros.html
Show inline comments
 
{% macro colorize_numbers(number) %}
 
  {% if number.startswith('-') %}
 
    {% set color = "text-danger" %}
 
  {% else %}
 
    {% if not number.startswith('+') %}
 
      {% set number = ''.join(['+', number]) %}
 
    {% endif %}
 
    {% set color = "text-success" %}
 
  {% endif %}
 
  <span class="{{ color }}">{{ number }}</span>
 
{% endmacro %}
 

	
 
{% macro create_donations_table(csv_file) %}
 
  <table class="table table-bordered table-striped">
 
    <thead>
 
      <tr>
 
        <th>#</th>
 
        <th>Date</th>
 
        <th>Statement</th>
 
        <th>Amount</th>
 
      </tr>
 
    </thead>
 
    <tbody>
 
      {% for row in csv_file %}
 
        <tr>
 
          <td>{{ loop.index }}</td>
 
          <td>{{ row[0] }}</td>
 
          <td>{{ row[1] }}</td>
 
          <td>{{ colorize_numbers(row[2]) }}</td>
 
          <td>{{ row[0].decode('utf-8') }}</td>
 
          <td>{{ row[1].decode('utf-8') }}</td>
 
          <td>{{ colorize_numbers(row[2].decode('utf-8')) }}</td>
 
        </tr>
 
      {% endfor %}
 
    </tbody>
 
  </table>
 
{% endmacro %}
0 comments (0 inline, 0 general)