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