This commit is contained in:
26
.gitea/workflows/build.yml
Normal file
26
.gitea/workflows/build.yml
Normal file
@@ -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
|
||||||
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
venv/
|
||||||
|
data/
|
||||||
|
__pycache__/
|
||||||
14
Containerfile
Normal file
14
Containerfile
Normal file
@@ -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"]
|
||||||
54
main.py
Normal file
54
main.py
Normal file
@@ -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)
|
||||||
114
questions/main.yml
Normal file
114
questions/main.yml
Normal file
@@ -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?
|
||||||
|
|
||||||
3
requirements.txt
Normal file
3
requirements.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
flask
|
||||||
|
pyyaml
|
||||||
|
bootstrap-flask
|
||||||
87
templates/index.html
Normal file
87
templates/index.html
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
{% block head %}
|
||||||
|
<!-- Required meta tags -->
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport"
|
||||||
|
content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
|
||||||
|
{% block styles %}
|
||||||
|
<!-- Bootstrap CSS -->
|
||||||
|
{{ bootstrap.load_css() }}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
<title>CoupleQuestions</title>
|
||||||
|
{% endblock %}
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
{% block content %}
|
||||||
|
<div class="container">
|
||||||
|
<h1>CoupleQuestions</h1>
|
||||||
|
<br>
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-body">
|
||||||
|
<h4 class="card-title mb-4">Fragenkategorien auswählen</h4>
|
||||||
|
<form method="post">
|
||||||
|
<div class="mb-3">
|
||||||
|
<label class="form-label">Kategorien</label>
|
||||||
|
{% for c in categories %}
|
||||||
|
<div class="form-check">
|
||||||
|
<input class="form-check-input" type="checkbox"
|
||||||
|
value="{{ c }}" id="cat_{{ loop.index }}"
|
||||||
|
name="categories[]" {% if c in selected
|
||||||
|
%}checked{% endif %}>
|
||||||
|
<label class="form-check-label"
|
||||||
|
for="cat_{{ loop.index }}">
|
||||||
|
{{ c }}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label class="form-label">Einstellungen</label>
|
||||||
|
<div class="form-check">
|
||||||
|
<input class="form-control" type="number"
|
||||||
|
value="{{ n }}" id="num" name="num">
|
||||||
|
<label class="form-label" for="num">
|
||||||
|
Anzahl der Fragen
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button type="submit" class="btn btn-primary">
|
||||||
|
Fragen auswählen!
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if questions | length > 0 %}
|
||||||
|
<hr>
|
||||||
|
<h2>Fragen</h2>
|
||||||
|
<br>
|
||||||
|
{% for category, c_questions in questions.items() %}
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-body">
|
||||||
|
<h4 class="card-title mb-4">{{ category }}</h4>
|
||||||
|
<ul>
|
||||||
|
{% for q in c_questions %}
|
||||||
|
<li>{{ q }}</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block scripts %}
|
||||||
|
{{ bootstrap.load_js() }}
|
||||||
|
{% endblock %}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
85
utils.py
Normal file
85
utils.py
Normal file
@@ -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)
|
||||||
Reference in New Issue
Block a user