diff --git a/models/Strategy.py b/models/Strategy.py index 451a3c1..33f77f8 100644 --- a/models/Strategy.py +++ b/models/Strategy.py @@ -1,11 +1,13 @@ -from dataclasses import dataclass +from dataclasses import dataclass, fields +from datetime import datetime +from typing import Optional @dataclass class Strategy(): id: str enabled: bool fulfilled: bool - created: str + createdAt: Optional[str] @classmethod def get_table_name(cls): @@ -13,4 +15,31 @@ class Strategy(): @classmethod def get_route_prefix(cls): - return "/strategies/" + cls.__name__.lower() \ No newline at end of file + return "/strategies/" + cls.__name__.lower() + + @staticmethod + def get_computed_properties(): + return ["id", "createdAt"] + + @staticmethod + def compute_properties(): + return { + "createdAt": datetime.utcnow().isoformat() + "Z" + } + + @classmethod + def get_order(cls): + return [field.name for field in fields(cls)] + + @classmethod + def format(cls, fields): + for key, value in fields.items(): + if key in cls.get_formatters(): + fields[key] = cls.get_formatters()[key](value) + return fields + + @staticmethod + def get_formatters(): + return { + "createdAt": lambda str: datetime.fromisoformat(str).strftime('%Y-%m-%d %H:%M') + } \ No newline at end of file diff --git a/routes/create.py b/routes/create.py index d9181da..b711f62 100644 --- a/routes/create.py +++ b/routes/create.py @@ -1,8 +1,12 @@ from db import get_connection, getRethinkDB from dataclasses import fields +from typing import List, Type from flask import jsonify, request, redirect, render_template r = getRethinkDB() +def get_bool_attribute_names(cls: Type) -> List[str]: + return [field.name for field in fields(cls) if field.type == bool] + def create_routes(cls, app): print("creating routes for " + cls.__name__) @@ -15,11 +19,34 @@ def create_routes(cls, app): @app.route(cls.get_route_prefix() + "/", methods=['GET']) def get(): cursor = r.table(table_name).run(get_connection()) - items = list(cursor) + fields = list(cursor) return render_template(cls.get_route_prefix() + "/index.html", data={ "title": cls.__name__, - "headers": [field.name for field in fields(cls)], - "items": items, - "prefix": cls.get_route_prefix() - }) \ No newline at end of file + "fields": [cls.format(field) for field in fields], + "prefix": cls.get_route_prefix(), + "order": cls.get_order() + }) + + @app.route(cls.get_route_prefix() + "/create", methods=['GET']) + def get_create(): + return render_template(cls.get_route_prefix() + "/create.html", data={ + "name": cls.__name__, + "prefix": cls.get_route_prefix(), + "computed": cls.get_computed_properties(), + "fields": {field.name: field.type.__name__ for field in fields(cls)} + }) + + @app.route(cls.get_route_prefix() + "/create", methods=['POST']) + def post_create(): + if request.headers['Content-Type'] == 'application/x-www-form-urlencoded': + data = request.form.to_dict() + data.update(cls.compute_properties()) + + for key in get_bool_attribute_names(cls): + data[key] = key in request.form + + r.table(table_name).insert(data).run(get_connection()) + return 201 + + diff --git a/templates/strategies/abc/create.html b/templates/strategies/abc/create.html new file mode 100644 index 0000000..822919c --- /dev/null +++ b/templates/strategies/abc/create.html @@ -0,0 +1,40 @@ + + + + + + + + + + +

Create a {{ data.name }}

+
+
+ {% for key, value in data.fields.items() %} + {% if key is not in data.computed %} + + {% if value == "str" %} + + {% elif value == "float" %} + + {% elif value == "bool" %} + + {% endif %} + {% endif %} + {% endfor %} +
+ +
+ + +
+
+ + + \ No newline at end of file diff --git a/templates/strategies/abc/index.html b/templates/strategies/abc/index.html index 5dd7b07..e430da4 100644 --- a/templates/strategies/abc/index.html +++ b/templates/strategies/abc/index.html @@ -1,51 +1,57 @@ - - - - Trading Zone Website - - - + + + Trading Zone Website + + + -
- - - - - - {% if data.items %} - - {% for header in data.headers %} - +
+ + + +

{{ data.title }}

{{ header }}
+ + + + + {% if data.fields %} + + {% for key in data.order %} + + {% endfor %} + + {% else %} + + + + {% endif %} + + + {% for field in data.fields %} + + {% for key in data.order%} + + {% endfor %} + {% endfor %} - - {% else %} - - - - {% endif %} - - - {% for item in data["items"] %} - - - - {% endfor %} - - - - - - -
+

{{ data.title }}

+
{{ key }}
No Data
{{ field[key] }}
No Data
{{ item }}
- -
-
+ + + + + + + + + + \ No newline at end of file