Quellcode durchsuchen

Implement project listing

ghorsington vor 4 Jahren
Ursprung
Commit
3c6b16b871
3 geänderte Dateien mit 50 neuen und 7 gelöschten Zeilen
  1. 46 4
      src/app.py
  2. 1 1
      src/templates/main.html
  3. 3 2
      src/templates/nav.html

+ 46 - 4
src/app.py

@@ -1,23 +1,65 @@
-from flask import Flask, render_template
+from flask import Flask, render_template, abort
 from flask_assets import Environment, Bundle
 import os
+import json
+from typing import List
 
 app = Flask(__name__)
 assets = Environment(app)
 assets.url = app.static_url_path
 scss = Bundle('style/main.scss', filters='libsass', output='all.css', depends='**/*.scss')
-
 assets.config['PYSCSS_LOAD_PATHS'] = assets.load_path
 assets.config['PYSCSS_STATIC_URL'] = assets.url
 assets.config['PYSCSS_STATIC_ROOT'] = assets.directory
 assets.config['PYSCSS_ASSETS_URL'] = assets.url
 assets.config['PYSCSS_ASSETS_ROOT'] = assets.directory
-
 assets.register('scss_all', scss)
 
+class ProjectInfo:
+    name: str
+    
+    def __init__(self, name):
+        self.name = name
+
+    @classmethod
+    def from_json(cls, json_str):
+        json_dict = json.loads(json_str)
+        return cls(**json_dict)
+
+
+class Project:
+    id: str
+    info: ProjectInfo
+
+def get_projects() -> List[Project]:
+    result = []
+    projects = [f.path for f in os.scandir("../builds") if f.is_dir()]
+    for project in projects:
+        info_path = os.path.join(project, "info.json")
+        if not os.path.exists(info_path):
+            continue
+        try:
+            proj = Project()
+            _, proj.id = os.path.split(project)
+            with open(info_path, "r", encoding="utf-8") as f:
+                proj.info = ProjectInfo.from_json(f.read())
+            result.append(proj)
+        except:
+            continue
+    return result
+
+@app.route("/projects/<string:project_id>")
+def display_project(project_id):
+    projects = get_projects()
+    selected_project = next((project for project in projects if project.id == project_id), None)
+    if not selected_project:
+        return abort(404)
+    return render_template("main.html", projects=projects, selected_project=selected_project.id)
+
 @app.route("/")
 def test():
-    return render_template("main.html")
+    projects = get_projects()
+    return render_template("main.html", projects=projects)
 
 if __name__ == "__main__":
     app.run(host='0.0.0.0')

+ 1 - 1
src/templates/main.html

@@ -1,6 +1,6 @@
 {% extends "base.html" %}
 
-{% block title%}Main{%endblock%}
+{%block title%}Main{%endblock%}
 
 {%block content%}
 

+ 3 - 2
src/templates/nav.html

@@ -3,7 +3,8 @@
         Available projects
     </p>
     <ul class="menu-list">
-        <li><a class="is-active">BepInEx Bleeding Edge</a></li>
-        <li><a>BepisPlugins</a></li>
+        {%for project in projects%}
+        <li><a {%if project.id == selected_project -%} class="is-active" {%- endif %} href="{{ url_for('display_project', project_id=project.id) }}">{{project.info.name}}</a></li>
+        {%endfor%}
     </ul>
 </aside>