commit 33de4999ce0bf42abcad55bd5d9b58218834cfef Author: Timon Horlboge Date: Sun Feb 22 15:01:18 2026 +0100 initial commit diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml new file mode 100644 index 0000000..b8e471c --- /dev/null +++ b/.gitea/workflows/build.yml @@ -0,0 +1,26 @@ +name: Build, +run-name: ${{ gitea.actor }} is building, testing and deploying the static page +on: [push] + +jobs: + build-image: + runs-on: ubuntu-latest + if: gitea.ref == 'refs/heads/main' + steps: + - name: Check out repository code + uses: actions/checkout@v3 + with: + github-server-url: 'https://git.secretmine.de/' + - name: Login to Registry + uses: docker/login-action@v3 + with: + registry: git.secretmine.de + username: ${{ secrets.REGISTRY_USER }} + password: ${{ secrets.REGISTRY_TOKEN }} + - name: Build Image + uses: docker/build-push-action@v5 + with: + file: Containerfile + context: . + push: true + tags: git.secretmine.de/secretminede/couplequestions:latest diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fa29d9b --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +venv/ +data/ +__pycache__/ diff --git a/Containerfile b/Containerfile new file mode 100644 index 0000000..8df32e5 --- /dev/null +++ b/Containerfile @@ -0,0 +1,14 @@ +FROM python:3-slim-trixie +RUN apt-get update && \ + apt-get install -y \ + locales && \ + rm -r /var/lib/apt/lists/* +RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \ + sed -i -e 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/' /etc/locale.gen && \ + dpkg-reconfigure --frontend=noninteractive locales + +COPY * /app/ +COPY requirements.txt requirements.txt +RUN pip3 install -r requirements.txt + +CMD ["python", "/app/main.py"] diff --git a/main.py b/main.py new file mode 100644 index 0000000..3f0b067 --- /dev/null +++ b/main.py @@ -0,0 +1,54 @@ +from flask_bootstrap import Bootstrap5 +from flask import Flask, render_template, request +import utils +import random + +app = Flask(__name__) +bootstrap = Bootstrap5(app) + +def get_questions(categories, num): + question_pool = [] + weights = [] + for c in categories: + for q in utils.get_questions_by_category(c): + weight = utils.get_question_weights(c, q) + question_pool.append((c, q)) + weights.append(weight) + + + if num > len(question_pool): + num = len(question_pool) + if num == 0: + return {} + selected_question_tuples = [] + while len(selected_question_tuples) < num: + selected = random.choices(question_pool, weights)[0] + if selected not in selected_question_tuples: + selected_question_tuples.append(selected) + + questions = {} + for category, question in selected_question_tuples: + utils.set_question_selected(category, question) + if category not in questions: + questions[category] = [] + questions[category].append(question) + utils.save_weights() + return questions + + +@app.route("/", methods=["POST", "GET"]) +def index(): + categories = utils.get_categories() + selected = categories + n = 2 + questions = {} + if request.method == "POST": + selected = request.form.getlist("categories[]") + n = int(request.form.get("num")) + questions = get_questions(selected, n) + print(selected, n) + return render_template("index.html", categories=categories, selected=selected, n=n, questions=questions) + + +if __name__ == '__main__': + app.run(debug=True) diff --git a/questions/main.yml b/questions/main.yml new file mode 100644 index 0000000..8b213a6 --- /dev/null +++ b/questions/main.yml @@ -0,0 +1,114 @@ +Romantisch: + - Wann hast du das erste Mal gespürt, dass zwischen uns etwas Besonderes ist? + - Welche gemeinsame Erinnerung lässt dein Herz sofort warm werden? + - Welche kleine Geste von mir bedeutet dir am meisten? + - Wann fühlst du dich von mir am meisten geliebt? + - Welche Eigenschaft von mir hat dich am stärksten angezogen? + - Was ist dein Lieblingsmoment zwischen uns beiden? + - Wann war ein Moment mit mir für dich wie aus einem Film? + - Welche gemeinsame Tradition würdest du gerne mit mir haben? + - Was würdest du gerne öfter mit mir erleben? + - Wann hast du dich in unserer Beziehung besonders glücklich gefühlt? + - Welche Erinnerung mit mir würdest du gerne noch einmal erleben? + - Wann hast du dich mir emotional besonders nah gefühlt? + - Was bedeutet unsere Beziehung für dich? + - Welche Seite von mir liebst du am meisten? + - Wann hast du dich das letzte Mal in mich „neu“ verliebt? + +Tiefgehend: + - Wann hast du dich von mir wirklich verstanden gefühlt? + - Was glaubst du, macht unsere Beziehung besonders? + - Welche Seite von dir zeigst du nur mir? + - Wann hast du dich in unserer Beziehung am sichersten gefühlt? + - Was hast du durch unsere Beziehung über dich gelernt? + - Wann warst du stolz auf uns als Paar? + - Welche Herausforderung hat uns stärker gemacht? + - Wann hast du dich bei mir vollständig angenommen gefühlt? + - Was möchtest du, dass ich über dein Herz besser verstehe? + - Welche deiner Ängste konntest du mit mir leichter tragen? + - Wann hast du gespürt, dass wir ein gutes Team sind? + - Welche Stärke bringe ich in unsere Beziehung? + - Was haben wir gemeinsam aufgebaut, das dir wichtig ist? + - Welche Seite von mir siehst du klarer als ich selbst? + - Was bedeutet Vertrauen für dich in unserer Beziehung? + +Verletzlichkeit: + - Was fällt dir manchmal schwer, mir zu sagen? + - Wann hast du dich in unserer Beziehung einmal verletzlich gefühlt? + - Welche Angst hast du manchmal in Beziehungen? + - Wann hattest du Sorge, mich zu verlieren? + - Wann hast du dich von mir besonders aufgefangen gefühlt? + - Welche Unsicherheit begleitet dich manchmal in der Liebe? + - Wann hast du dich bei mir vollkommen öffnen können? + - Was würdest du mir gerne sagen, hast dich aber noch nie getraut? + - Wann fühlst du dich emotional am empfindlichsten? + - Welche Erfahrung aus deiner Vergangenheit prägt deine Art zu lieben? + - Wann hast du dich von mir besonders unterstützt gefühlt? + - Was hilft dir, dich sicher in einer Beziehung zu fühlen? + - Wann hast du das Gefühl, dich wirklich zeigen zu können? + - Welche deiner Gefühle verstehe ich vielleicht noch nicht ganz? + - Wann hast du das Gefühl, dass ich dich wirklich sehe? + +Zukunft: + - Wo siehst du uns in fünf Jahren? + - Welche Träume würdest du gerne mit mir verwirklichen? + - Welche Reise sollten wir unbedingt zusammen machen? + - Wie stellst du dir unser gemeinsames Leben vor? + - Welche Erinnerungen möchtest du mit mir schaffen? + - Was wäre ein gemeinsames Abenteuer, das wir erleben sollten? + - Welche Ziele könnten wir als Paar verfolgen? + - Welche Tradition würdest du gerne mit mir aufbauen? + - Wie würde unser ideales gemeinsames Zuhause aussehen? + - Welche Werte sollen unsere Zukunft prägen? + - Was möchtest du später einmal über unsere Beziehung erzählen? + - Welche neue Erfahrung würdest du gerne mit mir teilen? + - Wie können wir unser Leben gemeinsam erfüllend gestalten? + - Was wäre für dich ein Zeichen, dass wir gemeinsam angekommen sind? + - Welche Träume sollten wir uns gegenseitig ermöglichen? + +Erotisch und verspielt: + - Wann fandest du mich zuletzt besonders sexy? + - Welche meiner Gesten findest du besonders verführerisch? + - Was ist eine kleine Sache, die ich tue und die dich sofort anzieht? + - In welchem Outfit findest du mich am attraktivsten? + - Wann war ein Moment zwischen uns besonders knisternd? + - Was würdest du gerne einmal Neues mit mir ausprobieren? + - Welche Atmosphäre bringt dich am meisten in Stimmung? + - Was macht einen Moment zwischen uns besonders leidenschaftlich? + - Welche Überraschung von mir würdest du spannend finden? + - Wann hast du gespürt, dass die Chemie zwischen uns stark ist? + - Was macht einen Kuss für dich unvergesslich? + - Welche Art von Date sorgt sofort für Spannung? + - Wann fühlst du dich von mir besonders begehrt? + - Was würdest du gerne öfter zwischen uns erleben? + - Was wäre für dich ein perfektes sinnliches Date? + +Romantisch: + - Wer von uns beiden ist romantischer? + - Wer von uns würde eher ein spontanes Abenteuer starten? + - Welche Macke von mir findest du heimlich süß? + - In welcher Situation sind wir zusammen am lustigsten? + - Was war der peinlichste Moment, den wir zusammen erlebt haben? + - Wenn wir ein berühmtes Paar wären, welches wären wir? + - Wer von uns ist chaotischer? + - Welche Angewohnheit von mir bringt dich zum Lachen? + - Wann waren wir zusammen völlig albern? + - Wenn unsere Beziehung ein Film wäre, welches Genre wäre es? + - Wer von uns würde eher ein verrücktes Projekt anfangen? + - Welche gemeinsame Erinnerung bringt dich sofort zum Lachen? + - Welche Superkraft hätten wir als Paar? + - Welche Aktivität sollten wir öfter zusammen machen? + - Was wäre unser perfekter spontaner Wochenendplan? + +Wertschätzung: + - Wofür bist du mir besonders dankbar? + - Welche Eigenschaft an mir schätzt du am meisten? + - Wann habe ich dich positiv überrascht? + - Was habe ich getan, das du nie vergessen wirst? + - Wann warst du zuletzt stolz auf mich? + - Welche meiner Stärken helfen unserer Beziehung? + - Wann habe ich dir das Gefühl gegeben, wichtig zu sein? + - Welche Unterstützung von mir bedeutet dir besonders viel? + - Wann habe ich dir Mut gemacht? + - Welche meiner Gewohnheiten machen dein Leben schöner? + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..71933c7 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +flask +pyyaml +bootstrap-flask diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..bb91c6d --- /dev/null +++ b/templates/index.html @@ -0,0 +1,87 @@ + + + + {% block head %} + + + + + {% block styles %} + + {{ bootstrap.load_css() }} + {% endblock %} + + CoupleQuestions + {% endblock %} + + + {% block content %} +
+

CoupleQuestions

+
+
+
+

Fragenkategorien auswählen

+
+
+ + {% for c in categories %} +
+ + +
+ {% endfor %} +
+ +
+ +
+ + +
+
+ +
+
+
+ + {% if questions | length > 0 %} +
+

Fragen

+
+ {% for category, c_questions in questions.items() %} +
+
+

{{ category }}

+
    + {% for q in c_questions %} +
  • {{ q }}
  • + {% endfor %} +
+
+
+
+ {% endfor %} + {% endif %} + +
+ + {% endblock %} + + {% block scripts %} + {{ bootstrap.load_js() }} + {% endblock %} + + diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..6c1df33 --- /dev/null +++ b/utils.py @@ -0,0 +1,85 @@ +import os +import yaml +import json +from datetime import datetime + +def get_questions(): + folders = ["questions", "questions_custom"] + questions = {} + for folder in folders: + if not os.path.exists(folder): + continue + for filename in os.listdir(folder): + if filename.endswith(".yml") or filename.endswith(".yaml"): + file_path = os.path.join(folder, filename) + with open(file_path, "r") as f: + file_questions = yaml.safe_load(f) + for category, category_questions in file_questions.items(): + if category not in questions: + questions[category] = [] + questions[category].extend(category_questions) + questions[category] = list(set(questions[category])) + + return questions + + +def get_categories(): + return get_questions().keys() + +def get_questions_by_category(category): + questions = get_questions() + if category not in questions: + return [] + return questions[category] + + +weights = None +def load_weights(): + os.makedirs("data/", exist_ok=True) + fname = "data/weights.json" + if os.path.exists(fname): + with open(fname, "r") as fp: + return json.load(fp) + return {} + + +def get_all_weights(): + global weights + if weights is None: + weights = load_weights() + return weights + + +def save_weights(): + weights = get_all_weights() + os.makedirs("data/", exist_ok=True) + fname = "data/weights.json" + with open(fname, "w") as fp: + json.dump(weights, fp, indent=2) + + +def get_weight_index(c, q): + return f"{c}_{q}" + + +def get_question_weights(c, q): + max_weight = 10 + min_weight = 1 + weights = get_all_weights() + c_index = get_weight_index(c, q) + last_selected_ts = 0 + if c_index in weights: + last_selected_ts = weights[c_index] + last_selected = datetime.fromtimestamp(last_selected_ts) + now = datetime.now() + days_passed = (now - last_selected).days + days_passed = min(max_weight, days_passed) + days_passed = max(min_weight, days_passed) + return days_passed + + +def set_question_selected(c, q): + weights = get_all_weights() + c_index = get_weight_index(c, q) + ts = datetime.timestamp(datetime.now()) + weights[c_index] = int(ts)