Merge pull request #23 from ScriptSorcerer20/test

accidentally pushed small changes to the damen algorithm to test
This commit is contained in:
2026-06-08 20:40:42 +02:00
committed by GitHub
3 changed files with 35 additions and 17 deletions
+11 -3
View File
@@ -178,7 +178,10 @@ def build_queens_trace(board_size):
}) })
return True return True
for col in range(board_size): candidate_columns = list(range(board_size))
random.shuffle(candidate_columns)
for col in candidate_columns:
if not is_queen_position_safe(row, col): if not is_queen_position_safe(row, col):
continue continue
@@ -374,9 +377,14 @@ def check():
@main_bp.route("/solve") @main_bp.route("/solve")
def solve_queens_route(): def solve_queens_route():
"""Return all queens solutions for the requested board size.""" """Return one random queens solution for the requested board size."""
board_size = parse_board_size(request.args.get("size")) board_size = parse_board_size(request.args.get("size"))
return jsonify(solve_queens(board_size)) queen_solutions = solve_queens(board_size)
if not queen_solutions:
return jsonify([])
return jsonify(random.choice(queen_solutions))
@main_bp.route("/solve_trace") @main_bp.route("/solve_trace")
+14 -14
View File
@@ -44,29 +44,29 @@ const translations = {
dataProcessedItem2: "Daten zur Zwei-Faktor-Authentifizierung, falls diese freiwillig aktiviert wird", dataProcessedItem2: "Daten zur Zwei-Faktor-Authentifizierung, falls diese freiwillig aktiviert wird",
dataProcessedItem3: "gespeicherte Spielstände, Notizen, Schrittzahlen, Zeiten und Favoriten", dataProcessedItem3: "gespeicherte Spielstände, Notizen, Schrittzahlen, Zeiten und Favoriten",
dataProcessedItem4: "technische Verbindungsdaten, die durch den Server oder das Hosting entstehen koennen", dataProcessedItem4: "technische Verbindungsdaten, die durch den Server oder das Hosting entstehen koennen",
processingPurposeTitle: "3. Zweck der Verarbeitung", processingPurposeTitle: "2. Zweck der Verarbeitung",
processingPurposeText: "Die Verarbeitung erfolgt, um die Funktionen dieser Anwendung bereitzustellen. Dazu gehoeren insbesondere:", processingPurposeText: "Die Verarbeitung erfolgt, um die Funktionen dieser Anwendung bereitzustellen. Dazu gehoeren insbesondere:",
processingPurposeItem1: "Erstellung und Verwaltung von Benutzerkonten", processingPurposeItem1: "Erstellung und Verwaltung von Benutzerkonten",
processingPurposeItem2: "sicherer Login in das persönliche Dashboard", processingPurposeItem2: "sicherer Login in das persönliche Dashboard",
processingPurposeItem3: "optionale Absicherung des Kontos per Authenticator-App", processingPurposeItem3: "optionale Absicherung des Kontos per Authenticator-App",
processingPurposeItem4: "Speichern und Laden von Spielständen", processingPurposeItem4: "Speichern und Laden von Spielständen",
processingPurposeItem5: "technischer Betrieb, Fehleranalyse und Missbrauchsschutz", processingPurposeItem5: "technischer Betrieb, Fehleranalyse und Missbrauchsschutz",
legalBasisTitle: "4. Rechtsgrundlage", legalBasisTitle: "3. Rechtsgrundlage",
legalBasisText: "Soweit personenbezogene Daten verarbeitet werden, erfolgt dies in der Regel zur Bereitstellung der Anwendung und ihrer Funktionen sowie aufgrund des berechtigten Interesses an einem sicheren und funktionsfähigen Webangebot. Falls eine ausdrückliche Einwilligung erforderlich ist, wird diese gesondert eingeholt.", legalBasisText: "Soweit personenbezogene Daten verarbeitet werden, erfolgt dies in der Regel zur Bereitstellung der Anwendung und ihrer Funktionen sowie aufgrund des berechtigten Interesses an einem sicheren und funktionsfähigen Webangebot. Falls eine ausdrückliche Einwilligung erforderlich ist, wird diese gesondert eingeholt.",
storageTitle: "5. Speicherung und Löschung", storageTitle: "4. Speicherung und Löschung",
storageText: "Personenbezogene Daten werden nur so lange gespeichert, wie sie für den jeweiligen Zweck benötigt werden. Benutzerkonten und zugehörige Spielstände bleiben grundsätzlich gespeichert, bis sie gelöscht oder für das Projekt nicht mehr benötigt werden.", storageText: "Personenbezogene Daten werden nur so lange gespeichert, wie sie für den jeweiligen Zweck benötigt werden. Benutzerkonten und zugehörige Spielstände bleiben grundsätzlich gespeichert, bis sie gelöscht oder für das Projekt nicht mehr benötigt werden.",
thirdPartyTitle: "6. Weitergabe an Dritte", thirdPartyTitle: "5. Weitergabe an Dritte",
thirdPartyText: "Eine Weitergabe personenbezogener Daten erfolgt nur, wenn dies für den Betrieb der Anwendung erforderlich ist, etwa durch einen Hosting-Anbieter oder technische Dienstleister. Ansonsten werden keine Daten weitergegeben.", thirdPartyText: "Eine Weitergabe personenbezogener Daten erfolgt nur, wenn dies für den Betrieb der Anwendung erforderlich ist, etwa durch einen Hosting-Anbieter oder technische Dienstleister. Ansonsten werden keine Daten weitergegeben.",
rightsTitle: "7. Rechte betroffener Personen", rightsTitle: "6. Rechte betroffener Personen",
rightsText: "Betroffene Personen haben im Rahmen des anwendbaren Datenschutzrechts insbesondere das Recht auf:", rightsText: "Betroffene Personen haben im Rahmen des anwendbaren Datenschutzrechts insbesondere das Recht auf:",
rightsItem1: "Auskunft über die verarbeiteten personenbezogenen Daten", rightsItem1: "Auskunft über die verarbeiteten personenbezogenen Daten",
rightsItem2: "Berichtigung unrichtiger Daten", rightsItem2: "Berichtigung unrichtiger Daten",
rightsItem3: "Löschung oder Einschränkung der Verarbeitung", rightsItem3: "Löschung oder Einschränkung der Verarbeitung",
rightsItem4: "Widerspruch gegen die Verarbeitung", rightsItem4: "Widerspruch gegen die Verarbeitung",
rightsItem5: "Herausgabe der bereitgestellten Daten, soweit anwendbar", rightsItem5: "Herausgabe der bereitgestellten Daten, soweit anwendbar",
securityTitle: "8. Datensicherheit", securityTitle: "7. Datensicherheit",
securityText: "Es werden technische und organisatorische Massnahmen getroffen, um gespeicherte Daten vor Verlust, Missbrauch oder unberechtigtem Zugriff zu schützen. Dazu gehoeren insbesondere passwortgeschützte Konten und die Möglichkeit, Zwei-Faktor-Authentifizierung zu aktivieren.", securityText: "Es werden technische und organisatorische Massnahmen getroffen, um gespeicherte Daten vor Verlust, Missbrauch oder unberechtigtem Zugriff zu schützen. Dazu gehoeren insbesondere passwortgeschützte Konten und die Möglichkeit, Zwei-Faktor-Authentifizierung zu aktivieren.",
versionTitle: "9. Stand", versionTitle: "8. Stand",
versionText: "Stand dieser Vorlage: April 2026" versionText: "Stand dieser Vorlage: April 2026"
} }
}, },
@@ -108,29 +108,29 @@ const translations = {
dataProcessedItem2: "two-factor authentication data if this feature is activated voluntarily", dataProcessedItem2: "two-factor authentication data if this feature is activated voluntarily",
dataProcessedItem3: "saved game states, notes, step counts, times, and favorites", dataProcessedItem3: "saved game states, notes, step counts, times, and favorites",
dataProcessedItem4: "technical connection data that may arise through the server or hosting", dataProcessedItem4: "technical connection data that may arise through the server or hosting",
processingPurposeTitle: "3. Purpose of processing", processingPurposeTitle: "2. Purpose of processing",
processingPurposeText: "The processing is carried out to provide the functions of this application. This includes in particular:", processingPurposeText: "The processing is carried out to provide the functions of this application. This includes in particular:",
processingPurposeItem1: "creating and managing user accounts", processingPurposeItem1: "creating and managing user accounts",
processingPurposeItem2: "secure login to the personal dashboard", processingPurposeItem2: "secure login to the personal dashboard",
processingPurposeItem3: "optional account protection using an authenticator app", processingPurposeItem3: "optional account protection using an authenticator app",
processingPurposeItem4: "saving and loading game states", processingPurposeItem4: "saving and loading game states",
processingPurposeItem5: "technical operation, error analysis, and abuse prevention", processingPurposeItem5: "technical operation, error analysis, and abuse prevention",
legalBasisTitle: "4. Legal basis", legalBasisTitle: "3. Legal basis",
legalBasisText: "Where personal data is processed, this is generally done to provide the application and its functions, as well as on the basis of the legitimate interest in a secure and functional web offering. If explicit consent is required, it will be obtained separately.", legalBasisText: "Where personal data is processed, this is generally done to provide the application and its functions, as well as on the basis of the legitimate interest in a secure and functional web offering. If explicit consent is required, it will be obtained separately.",
storageTitle: "5. Storage and deletion", storageTitle: "4. Storage and deletion",
storageText: "Personal data is stored only as long as it is needed for the respective purpose. User accounts and related game states generally remain stored until they are deleted or are no longer needed for the project.", storageText: "Personal data is stored only as long as it is needed for the respective purpose. User accounts and related game states generally remain stored until they are deleted or are no longer needed for the project.",
thirdPartyTitle: "6. Disclosure to third parties", thirdPartyTitle: "5. Disclosure to third parties",
thirdPartyText: "Personal data is shared only if this is necessary for operating the application, for example through a hosting provider or technical service providers. Otherwise, no data is shared.", thirdPartyText: "Personal data is shared only if this is necessary for operating the application, for example through a hosting provider or technical service providers. Otherwise, no data is shared.",
rightsTitle: "7. Rights of data subjects", rightsTitle: "6. Rights of data subjects",
rightsText: "Within the framework of applicable data protection law, data subjects have in particular the right to:", rightsText: "Within the framework of applicable data protection law, data subjects have in particular the right to:",
rightsItem1: "information about the personal data being processed", rightsItem1: "information about the personal data being processed",
rightsItem2: "correction of incorrect data", rightsItem2: "correction of incorrect data",
rightsItem3: "deletion of data or restriction of processing", rightsItem3: "deletion of data or restriction of processing",
rightsItem4: "object to the processing", rightsItem4: "object to the processing",
rightsItem5: "receive the data that has been provided, where applicable", rightsItem5: "receive the data that has been provided, where applicable",
securityTitle: "8. Data security", securityTitle: "7. Data security",
securityText: "Technical and organizational measures are taken to protect stored data against loss, misuse, or unauthorized access. These include password-protected accounts and the option to enable two-factor authentication.", securityText: "Technical and organizational measures are taken to protect stored data against loss, misuse, or unauthorized access. These include password-protected accounts and the option to enable two-factor authentication.",
versionTitle: "9. Version", versionTitle: "8. Version",
versionText: "Version of this template: April 2026" versionText: "Version of this template: April 2026"
} }
} }
+10
View File
@@ -75,6 +75,16 @@ def test_check_endpoint_applies_different_rules_for_queens_and_rooks(client):
assert rooks_response.get_json() == {"valid": True} assert rooks_response.get_json() == {"valid": True}
def test_solve_endpoint_returns_one_valid_4x4_queens_solution(client):
response = client.get("/solve?size=4")
assert response.status_code == 200
assert tuple(response.get_json()) in {
(1, 3, 0, 2),
(2, 0, 3, 1),
}
def test_authenticated_user_can_save_and_load_a_game_state(client, app_instance, user_factory, login_as): def test_authenticated_user_can_save_and_load_a_game_state(client, app_instance, user_factory, login_as):
user_factory(username="alice", password="Password123!") user_factory(username="alice", password="Password123!")