From 15ed32bf15620f1db8c902615be8e9356eff92f0 Mon Sep 17 00:00:00 2001
From: Jiri Kalvoda <jirikalvoda@kam.mff.cuni.cz>
Date: Fri, 23 Jul 2021 18:27:16 +0200
Subject: [PATCH] Util: parse_int_list
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Parsuje seznam čísel oddělených čárkou s možným zadáním rozsahů pomocí
pomlčky.
---
mo/util.py | 23 ++++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/mo/util.py b/mo/util.py
index a72c5bd6..10c2d638 100644
--- a/mo/util.py
+++ b/mo/util.py
@@ -13,7 +13,7 @@ import re
import secrets
import subprocess
import sys
-from typing import Any, Optional, NoReturn, Tuple
+from typing import Any, Optional, NoReturn, Tuple, List
import textwrap
import urllib.parse
@@ -247,3 +247,24 @@ def check_points(points: decimal.Decimal, for_task: Optional[db.Task] = None, fo
else:
return f'Podle nastavení kola zadat body jen s krokem {points_step} (hodnota {points} je neplatná)'
return None
+
+
+def parse_int_list(a: str, maxim: int = 200) -> List[int]:
+ """Parsuje "1-3,5,7-9" na [1,2,3,5,7,9].
+ Aby nešlo generovat moc velká pole (obrana proti DDoSu),
+ existuje omezení na velikost."""
+ r: List[int] = []
+ for i in a.split(","):
+ b = i.split("-")
+ if len(b) > 2:
+ raise mo.CheckError("Nadměrný počet pomlček")
+ try:
+ c = list(map(int, b))
+ except ValueError:
+ raise mo.CheckError("Převod na číslo se nezdařil")
+ if any(x < 0 or x > maxim for x in c):
+ raise mo.CheckError("Překročen limit na velikost čísla")
+ if len(c) == 2 and c[0] > c[1]:
+ raise mo.CheckError("Větší číslo nemůže být před menším")
+ r += [c[0]] if len(c) == 1 else range(c[0], c[1] + 1)
+ return r
--
GitLab