Changeset - 1963e193d7ca
[Not reviewed]
default
0 5 1
Dennis Fink - 9 years ago 2016-03-16 00:04:03
dennis.fink@c3l.lu
Move state set into ActiveStatus
5 files changed with 129 insertions and 40 deletions:
0 comments (0 inline, 0 general)
spaceapi/state.py
Show inline comments
 
@@ -8,49 +8,17 @@ import tweepy
 

	
 
from .utils import ActiveStatus
 
from .auth import httpauth
 

	
 
state_views = Blueprint('state', __name__)
 

	
 
ALLOWED_STATE_KEYS = frozenset(('open', 'lastchange',
 
                                'trigger_person', 'message'))
 

	
 

	
 
def set_new_state(key, value):
 
    active = ActiveStatus()
 
    if key in ALLOWED_STATE_KEYS:
 
        active['state'][key] = value
 

	
 
        if key == 'open':
 
            active['state']['lastchange'] = int(time())
 

	
 
            if 'twitter_consumer_key' in current_app.config:
 
                auth = tweepy.OAuthHandler(
 
                    current_app.config['twitter_consumer_key'],
 
                    current_app.config['twitter_consumer_secret']
 
                )
 
                auth.set_access_token(
 
                    current_app.config['twitter_access_token_key'],
 
                    current_app.config['twitter.access_token_secret']
 
                )
 
                api = tweepy.API(auth)
 
                
 
                if value:
 
                    api.update_status('The space is now open!')
 
                else:
 
                    api.update_status('The space is now closed!')
 

	
 
        active.save_last_state()
 
        return jsonify(active)
 
    else:
 
        return abort(400)
 

	
 

	
 
@state_views.route('/set/<key>', methods=['POST'])
 
@httpauth.login_required
 
def set_state(key):
 

	
 
    active = ActiveStatus()
 
    value = json.loads(request.data.decode('utf-8'))['value']
 
    current_app.logger.info(value)
 
    current_app.logger.info(type(value))
 

	
 
    return set_new_state(key, value)
 
    active.set_new_state(**{key: value})
 
    active.save_last_state()
 
    return jsonify(active)
spaceapi/templates/base.html
Show inline comments
 
@@ -10,12 +10,14 @@
 
  <div class="container">
 
    <div class="navbar navbar-default">
 
      <div class="navbar-collapse collapse">
 
        <ul class="nav navbar-nav">
 
          <li><a href="{{ url_for('root.index') }}">State</a></li>
 
          <li><a href="{{ url_for('root.open') }}">Change state</a></li>
 
          <li><a href="{{ url_for('root.present') }}">Make me present</a></li>
 
          <li><a href="{{ url_for('root.status_json') }}">status.json</a></li>
 
        </ul>
 
      </div>
 
    </div>
 
    <div class="row" id="content">
 
      <div class="col-md-12">
 
        {% block content %}
spaceapi/templates/present.html
Show inline comments
 
new file 100644
 
{% extends "base.html" %}
 

	
 
{% block content %}
 
  <div class="text-center">
 
    <form method="POST" style="display: inline-block;">
 
      <input type="submit" name="present" value="present" class="btn btn-success btn-lg">
 
      <input type="submit" name="leave" value="leave" class="btn btn-danger btn-lg">
 
    </form>
 
  </div>
 
{% endblock %}
spaceapi/utils.py
Show inline comments
 
import json
 
import os.path
 
from time import time
 

	
 
from flask import request
 
from flask import request, current_app
 

	
 
import tweepy
 

	
 

	
 
default_json_file = os.path.abspath('default.json')
 
last_state_file = os.path.abspath('laststate.json')
 

	
 
if not os.path.exists(default_json_file):
 
@@ -46,12 +49,88 @@ class ActiveStatus(Singleton, dict):
 
        with open(last_state_file, mode='w', encoding='utf-8') as f:
 
            last_state = {}
 
            last_state['state'] = self['state']
 
            last_state['sensors'] = self['sensors']
 
            json.dump(last_state, f, sort_keys=True)
 

	
 
    def add_user_present(self, username):
 
        if self['state']['open']:
 
            if 'people_now_present' not in self['sensors']:
 
                self['sensors']['people_now_present'] = {'value': 0}
 

	
 
            people_now_present = self['sensors']['people_now_present']
 

	
 
            people_now_present['value'] += 1
 

	
 
            if username in current_app.config['PEOPLE_NOW_PRESENT_ALLOWED']:
 
                if 'names' in people_now_present and username not in people_now_present['names']:
 
                    people_now_present['names'].append(username)
 
                else:
 
                    people_now_present['names'] = [username]
 

	
 
            self['sensors']['people_now_present'] = people_now_present
 
        else:
 
            pass
 

	
 
    def remove_user_present(self, username):
 
        if self['state']['open'] and 'people_now_present' in self['sensors']:
 
            people_now_present = self['sensors']['people_now_present']
 

	
 
            if people_now_present['value'] > 0:
 
                people_now_present['value'] -= 1
 

	
 
            if 'names' in people_now_present:
 
                if people_now_present['value'] == 0:
 
                    del people_now_present['names']
 
                elif username in people_now_present['names']:
 
                    people_now_present['names'].remove(username)
 
                    if not people_now_present['names']:
 
                        del people_now_present['names']
 
            self['sensors']['people_now_present'] = people_now_present
 
        else:
 
            pass
 

	
 
    def set_new_state(self, value=None, trigger_person=None, message=None):
 

	
 
        if value is not None:
 
            self['state']['open'] = value
 

	
 
            if 'twitter_consumer_key' in current_app.config:
 
                auth = tweepy.OAuthHandler(
 
                    current_app.config['twitter_consumer_key'],
 
                    current_app.config['twitter_consumer_secret']
 
                )
 
                auth.set_access_token(
 
                    current_app.config['twitter_access_token_key'],
 
                    current_app.config['twitter.access_token_secret']
 
                )
 
                api = tweepy.API(auth)
 

	
 
                if value:
 
                    api.update_status('The space is now open!')
 
                else:
 
                    api.update_status('The space is now closed!')
 

	
 
            if not value:
 
                if 'people_now_present' in self['sensors']:
 
                    self['sensors']['people_now_present']['value'] = 0
 
                    if 'names' in self['sensors']['people_now_present']:
 
                        del self['sensors']['people_now_present']['names']
 

	
 
                if 'message' in self['state']:
 
                    del self['state']['message']
 

	
 
        if trigger_person is not None:
 
            self['state']['trigger_person'] = trigger_person
 

	
 
        if message is not None:
 
            self['state']['message'] = message
 

	
 
        if value is not None or trigger_person is not None or message is not None:
 
            self['state']['lastchange'] = int(time())
 

	
 

	
 
def request_wants_json():
 
    best = request.accept_mimetypes.best_match(
 
        ['application/json', 'text/html']
 
    )
 
    return best == 'application/json' and \
spaceapi/views.py
Show inline comments
 
from flask import Blueprint, jsonify, render_template, abort, request, redirect, url_for
 
from flask import Blueprint, jsonify, render_template, abort, request, redirect, url_for, current_app
 

	
 
from .utils import request_wants_json, ActiveStatus
 
from .auth import httpauth
 
from .state import set_new_state
 

	
 
root_views = Blueprint('root', __name__)
 
@@ -28,14 +28,44 @@ def reload():
 

	
 

	
 
@root_views.route('/open', methods=('GET', 'POST'))
 
@httpauth.login_required
 
def open():
 
    if request.method == 'POST':
 
        active = ActiveStatus()
 

	
 
        try:
 
            if httpauth.username() in current_app.config['STATE_TRIGGER_PERSON_ALLOWED']:
 
                trigger_person = httpauth.username()
 
            else:
 
                trigger_person = None
 
        except KeyError:
 
            trigger_person = None
 

	
 
        if 'close' in request.form:
 
            set_new_state('open', False)
 
            active.set_new_state(value=False, trigger_person=trigger_person)
 
            active.save_last_state()
 
            return redirect(url_for('root.index'))
 
        elif 'open' in request.form:
 
            set_new_state('open', True)
 
            active.set_new_state(value=True, trigger_person=trigger_person)
 
            active.save_last_state()
 
            return redirect(url_for('root.index'))
 

	
 
    return render_template('open.html')
 

	
 

	
 
@root_views.route('/present', methods=('GET', 'POST'))
 
@httpauth.login_required
 
def present():
 
    if request.method == 'POST':
 

	
 
        active = ActiveStatus()
 

	
 
        if active['state']['open']:
 
            if 'present' in request.form:
 
                active.add_user_present(httpauth.username())
 
            elif 'leave' in request.form:
 
                active.remove_user_present(httpauth.username())
 
            active.save_last_state()
 
        return redirect(url_for('root.index'))
 

	
 
    return render_template('present.html')
0 comments (0 inline, 0 general)