Skip to content
Snippets Groups Projects
Commit 15ed32bf authored by Jiří Kalvoda's avatar Jiří Kalvoda
Browse files

Util: parse_int_list

Parsuje seznam čísel oddělených čárkou s možným zadáním rozsahů pomocí
pomlčky.
parent 7462f203
No related branches found
No related tags found
1 merge request!88Přdáno filtrování orgů podle rolí
...@@ -13,7 +13,7 @@ import re ...@@ -13,7 +13,7 @@ import re
import secrets import secrets
import subprocess import subprocess
import sys import sys
from typing import Any, Optional, NoReturn, Tuple from typing import Any, Optional, NoReturn, Tuple, List
import textwrap import textwrap
import urllib.parse import urllib.parse
...@@ -247,3 +247,24 @@ def check_points(points: decimal.Decimal, for_task: Optional[db.Task] = None, fo ...@@ -247,3 +247,24 @@ def check_points(points: decimal.Decimal, for_task: Optional[db.Task] = None, fo
else: else:
return f'Podle nastavení kola zadat body jen s krokem {points_step} (hodnota {points} je neplatná)' return f'Podle nastavení kola zadat body jen s krokem {points_step} (hodnota {points} je neplatná)'
return None 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment