Passed
Push — master ( b554d9...0f1c51 )
by Alexander
01:17
created

things3.things3_api.Things3API.api_toggle()   A

Complexity

Conditions 1

Size

Total Lines 4
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
nop 1
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
#!/usr/bin/env python3
2
# -*- coding: utf-8 -*-
3
4
"""Simple read-only Things 3 Web Serivce."""
5
6
from __future__ import print_function
7
8
__author__ = "Alexander Willner"
9
__copyright__ = "Copyright 2020 Alexander Willner"
10
__credits__ = ["Alexander Willner"]
11
__license__ = "Apache License 2.0"
12
__version__ = "2.3.0"
13
__maintainer__ = "Alexander Willner"
14
__email__ = "[email protected]"
15
__status__ = "Development"
16
17
import sys
18
from os import getcwd
19
import json
20
from flask import Flask
21
from flask import Response
22
from werkzeug.serving import make_server
23
from things3.things3 import Things3
24
25
26
class Things3API():
27
    """API Wrapper for the simple read-only API for Things 3."""
28
29
    HOST = 'localhost'
30
    PORT = 15000
31
    PATH = getcwd() + '/resources/'
32
    things3 = None
33
34
    def on_get(self, url):
35
        """Handles other GET requests"""
36
        filename = self.PATH + url
37
        content_type = 'application/json'
38
        if filename.endswith('css'):
39
            content_type = 'text/css'
40
        if filename.endswith('html'):
41
            content_type = 'text/html'
42
        if filename.endswith('js'):
43
            content_type = 'text/javascript'
44
        if filename.endswith('png'):
45
            content_type = 'image/png'
46
        if filename.endswith('jpg'):
47
            content_type = 'image/jpeg'
48
        if filename.endswith('ico'):
49
            content_type = 'image/x-ico'
50
        with open(filename, 'rb') as source:
51
            data = source.read()
52
        return Response(response=data, content_type=content_type)
53
54
    def api(self, command):
55
        """Return database as JSON strings."""
56
        if command in self.things3.functions:
57
            func = self.things3.functions[command]
58
            data = json.dumps(
59
                self.things3.convert_tasks_to_model(func(self.things3)))
60
            return Response(response=data, content_type='application/json')
61
62
        data = json.dumps(self.things3.convert_tasks_to_model(
63
            self.things3.get_not_implemented()))
64
        return Response(response=data, content_type='application/json',
65
                        status=404)
66
67
    def api_toggle(self):
68
        """Toggle between task and project view"""
69
        self.things3.toggle_mode()
70
        return Response(status=200)
71
72
    def __init__(self, database=None):
73
        self.things3 = Things3(database=database)
74
        self.flask = Flask(__name__)
75
        self.flask.add_url_rule('/api/<command>', view_func=self.api)
76
        self.flask.add_url_rule('/api/togglemode', view_func=self.api_toggle)
77
        self.flask.add_url_rule('/<url>', view_func=self.on_get)
78
        self.flask.app_context().push()
79
        self.flask_context = None
80
81
    def main(self):
82
        """"Main function."""
83
        print(f"Serving at http://{self.HOST}:{self.PORT} ...")
84
85
        try:
86
            self.flask_context = make_server(self.HOST, self.PORT, self.flask)
87
            self.flask_context.serve_forever()
88
        except KeyboardInterrupt:
89
            print("Shutting down...")
90
            sys.exit(0)
91
92
93
def main():
94
    """Main entry point for CLI installation"""
95
    Things3API().main()
96
97
98
if __name__ == "__main__":
99
    main()
100