|
1 | 1 | # coding: utf-8 |
2 | | -import math |
3 | 2 |
|
4 | | -from django.db.models.base import Model |
5 | 3 | from django.db.models.query import QuerySet |
6 | 4 |
|
7 | 5 |
|
8 | | -SI_PREFIXES = ['', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'] |
9 | | - |
10 | | - |
11 | | -# Arithmétique |
12 | | -def subtract(value, amount): |
13 | | - """ Soustraire """ |
14 | | - return value - amount |
15 | | - |
16 | | - |
17 | | -def delta(value, amount): |
18 | | - """ |
19 | | - Renvoyer le cardinal de la soustraction |
20 | | -
|
21 | | - :returns: la valeur positive de la différence entre value et amount |
22 | | - """ |
23 | | - return abs(value - amount) |
24 | | - |
25 | | - |
26 | | -def round_multiple(x, base=1): |
27 | | - """ |
28 | | - Renvoyer le multiple de *base* le plus proche de *x** |
29 | | -
|
30 | | - :param base: un multiple de cette valeur doit être renvoyé |
31 | | - :param x: nombre à arrondir |
32 | | - :type base: float | int |
33 | | - ex. : |
34 | | - round_multiple(0, 25) == 0 |
35 | | - round_multiple(12, 25) == 0 |
36 | | - round_multiple(13, 25) == 25 |
37 | | - round_multiple(-12, 25) == 0 |
38 | | -
|
39 | | - """ |
40 | | - return (base * round(float(x) / base)) if type(base) in {int, float} and base > 0 else None |
41 | | - |
42 | | - |
43 | | -def modulo(value, br): |
44 | | - """ |
45 | | - Renvoyer un modulo ou comparer un modulo |
46 | | -
|
47 | | - :param value: valeur |
48 | | - :param br: int, float ou chaîne de 2 nombres b et r séparés par une virgule |
49 | | - :returns: value % br si br est un nombre, sinon renvoie si value % b est égal à r |
50 | | - """ |
51 | | - try: |
52 | | - if isinstance(br, str) and "," in br: |
53 | | - b, r = br.split(",") |
54 | | - return float(r) - 0.000000001 <= value % float(b) <= float(r) + 0.000000001 |
55 | | - else: |
56 | | - b = float(br) |
57 | | - if b > 0: |
58 | | - result = value % b |
59 | | - return result |
60 | | - except ValueError: |
61 | | - pass |
62 | | - return False |
63 | | - |
64 | | - |
65 | | -def to_percent(value, ratio=None): |
66 | | - """ |
67 | | - Convertir une valeur en pourcentage |
68 | | -
|
69 | | - :param ratio: définit quelle valeur de `value` correspond à 100%. 1.0 par défaut |
70 | | - :type ratio: int | float |
71 | | - """ |
72 | | - return (value * 100.0) / (float(ratio or 1)) |
73 | | - |
74 | | - |
75 | | -def si_prefix(value): |
76 | | - """ |
77 | | - Renvoyer une représentation d'un nombre avec les unités du système international |
78 | | -
|
79 | | - Ex. 234 567 renvoie 234k, 123 567 890 renvoie 123M |
80 | | - """ |
81 | | - level = math.floor(math.log(value, 1000)) |
82 | | - unit_count = int(value / (1000 ** level)) |
83 | | - return "{count:d}{unit}".format(count=unit_count, unit=SI_PREFIXES[int(level)]) |
84 | | - |
85 | | - |
86 | | -def invert(value): |
87 | | - """ Renvoyer le contraire d'un booléen """ |
88 | | - return not value |
89 | | - |
90 | | - |
91 | | -def percent_status(value, asc=True): |
92 | | - """ Renvoyer un statut de santé depuis un flottant entre 0 et 100 """ |
93 | | - if asc is True: |
94 | | - if value < 33.33: |
95 | | - return 'success' |
96 | | - elif value < 66.67: |
97 | | - return 'warning' |
98 | | - else: |
99 | | - return 'danger' |
100 | | - else: |
101 | | - if value > 66.67: |
102 | | - return 'success' |
103 | | - elif value > 33.33: |
104 | | - return 'warning' |
105 | | - else: |
106 | | - return 'danger' |
107 | | - |
108 | | - |
109 | | -def nestedsort(value, item_index=0): |
110 | | - """ Trier un tuple de tuples en utilisant l'élément de tuple d'index *item_index* """ |
111 | | - try: |
112 | | - item_index = int(item_index) |
113 | | - value.sort(key=lambda item: item[item_index]) |
114 | | - return value |
115 | | - except ValueError: |
116 | | - return value |
117 | | - |
118 | | - |
119 | | -def model_name(value): |
120 | | - """ Renvoyer le nom du modèle de l'objet """ |
121 | | - if isinstance(value, Model): |
122 | | - return value._meta.verbose_name |
123 | | - return None |
124 | | - |
125 | | - |
126 | | -def str_to(value, newtype, default=0): |
127 | | - """ Renvoyer une chaîne convertie en un autre type ou une valeur par défaut (0) """ |
128 | | - try: |
129 | | - return newtype(value) |
130 | | - except ValueError: |
131 | | - return default |
132 | | - |
133 | | - |
134 | | -def string_to_dict(options): |
135 | | - """ |
136 | | - Convertir une chaîne d'options k=v en dictionnaire |
137 | | -
|
138 | | - :param options: chaîne du type 'a1 a2=v2 a3=v3' |
139 | | - """ |
140 | | - output = dict() |
141 | | - tokens = (options or '').split() |
142 | | - for token in tokens: |
143 | | - if token.strip(): |
144 | | - if '=' in token: |
145 | | - arg, value = token.split('=') |
146 | | - output[arg] = value |
147 | | - else: |
148 | | - output[token] = True |
149 | | - return output |
150 | | - |
151 | | - |
152 | 6 | def make_iterable(value, output_type=list): |
153 | 7 | """ |
154 | | - Renvoyer un type d'itérable depuis un objet seul ou un itérable |
| 8 | + Return an iterable of provided type, starting from an object or an iterable |
| 9 | +
|
| 10 | + :type value: list|set|tuple|django.db.models.QuerySet |
| 11 | + :param output_type: list|tuple|set or any compatible iterable type |
155 | 12 |
|
156 | | - Renvoie un itérable vide si value est None |
| 13 | + If value is None, the function returns an empty iterable. |
157 | 14 | """ |
158 | 15 | if type(value) is output_type: |
159 | 16 | return value |
160 | 17 | if isinstance(value, (list, set, tuple, QuerySet)) and type(value) != output_type: |
161 | 18 | return output_type(value) |
162 | 19 | return output_type([value]) if value is not None else output_type() |
163 | | - |
164 | | - |
165 | | -def list_contains(t, text): |
166 | | - """ Renvoyer si un itérable de chaînes contient une sous-chaîne """ |
167 | | - for i in t: |
168 | | - if text in i: |
169 | | - return True |
170 | | - return False |
171 | | - |
172 | | - |
173 | | -def is_multi_dimensional(value): |
174 | | - """ Renvoyer si une liste ou un tuple contient des listes ou des tuples """ |
175 | | - if isinstance(value, (list, tuple)) and value: |
176 | | - return isinstance(value[0], (list, tuple)) |
177 | | - return False |
0 commit comments