diff --git a/spaceapi/sensors.py b/spaceapi/sensors.py --- a/spaceapi/sensors.py +++ b/spaceapi/sensors.py @@ -14,7 +14,7 @@ sensors_views = Blueprint('sensors', __n ALLOWED_SENSORS_KEYS = json.load( open(resource_filename('spaceapi', 'schema/sensors.json'), - encoding='utf-8') + encoding='utf-8') ) RADIATON_SUBKEYS = frozenset(('alpha', 'beta', 'gamma', 'beta_gamma')) diff --git a/spaceapi/state.py b/spaceapi/state.py --- a/spaceapi/state.py +++ b/spaceapi/state.py @@ -11,46 +11,14 @@ 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/', 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) diff --git a/spaceapi/templates/base.html b/spaceapi/templates/base.html --- a/spaceapi/templates/base.html +++ b/spaceapi/templates/base.html @@ -13,6 +13,8 @@ diff --git a/spaceapi/templates/present.html b/spaceapi/templates/present.html new file mode 100644 --- /dev/null +++ b/spaceapi/templates/present.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} + +{% block content %} +
+
+ + +
+
+{% endblock %} diff --git a/spaceapi/utils.py b/spaceapi/utils.py --- a/spaceapi/utils.py +++ b/spaceapi/utils.py @@ -1,7 +1,10 @@ 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') @@ -49,6 +52,82 @@ class ActiveStatus(Singleton, dict): 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( diff --git a/spaceapi/views.py b/spaceapi/views.py --- a/spaceapi/views.py +++ b/spaceapi/views.py @@ -1,4 +1,4 @@ -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 @@ -31,11 +31,41 @@ def reload(): @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')