filters.py (17284B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\scriber\filters.py 2 import datetime 3 import json 4 import datetimeutils 5 import typeutils 6 from scriber import htmlutils 7 from scriber import utils 8 from scriber import widgets 9 from scriber import ff 10 from scriber.widgets import inputfields 11 from scriber.esp_filters import * 12 from functools import reduce 13 14 def date(date_obj, str_format = '%Y-%m-%d'): 15 return datetime_filter(date_obj, str_format) 16 17 18 def time(date_obj, str_format = '%H:%M:%S'): 19 return datetime_filter(date_obj, str_format) 20 21 22 def dt_sec(temporal_object): 23 return datetime_filter(temporal_object, '%Y-%m-%d %H:%M:%S') 24 25 26 def dt_micro(temporal_object): 27 return datetime_filter(temporal_object, '%Y-%m-%d %H:%M:%S.%f') 28 29 30 def dt(temporal_object): 31 return datetime_filter(temporal_object) 32 33 34 def s2hms(seconds): 35 if not isinstance(seconds, (int, long, float)): 36 return seconds 37 s = seconds % 60 38 m = seconds / 60 39 h = m / 60 40 m %= 60 41 return '%02d:%02d:%02d' % (h, m, s) 42 43 44 def s2ms(seconds): 45 if not isinstance(seconds, (int, long, float)): 46 return seconds 47 s = seconds % 60 48 m = seconds / 60 49 return '%02d:%02d' % (m, s) 50 51 52 @utils.filter_name('datetime') 53 def datetime_filter(temporal_object, str_format = '%Y-%m-%d %H:%M'): 54 temporal_object = datetimeutils.any_to_datetime(temporal_object) 55 if isinstance(temporal_object, datetime.datetime): 56 return temporal_object.strftime(str_format) 57 else: 58 return temporal_object 59 60 61 def hide(content): 62 return '<span style="display:none;text-indent:-10000;overflow:hidden;font-size:1px;color:#ffffff;">%s</span>' % content 63 64 65 def nl2br(content): 66 return htmlutils.newline_to_html(content) 67 68 69 def unsanitize_html(content): 70 return reduce(lambda h, n: h.replace(*n), (('>', '>'), ('<', '<')), content) 71 72 73 def a(model, icon_class = ''): 74 url = None 75 href_call = getattr(model, 'get_href', None) 76 if href_call and hasattr(href_call, '__call__'): 77 url = href_call() 78 else: 79 href = getattr(model._meta, 'href', None) 80 if href and isinstance(href, (str, unicode)): 81 url = href % model.get_id() 82 if url: 83 if icon_class == '': 84 icon_class = getattr(model._meta, 'icon', '') 85 if icon_class: 86 icon_class = '<i class="icon icon-%s"></i> ' % icon_class 87 return '<a href="%s">%s%s</a>' % (url, icon_class, model) 88 return model 89 90 91 def itemurl(item_model): 92 try: 93 return htmlutils.esp_item_link(item_model) 94 except Exception: 95 item_id = getattr(item_model, 'item_id', None) 96 if item_id: 97 return '/gm/inventory.py?action=Item&itemID=%d' % item_id 98 99 return item_model 100 101 102 def btn_model(model, icon_class = ''): 103 href = getattr(model._meta, 'href', None) 104 if href: 105 if icon_class == '': 106 icon_class = getattr(model._meta, 'icon', '') 107 if icon_class: 108 icon_class = '<i class="icon icon-white icon-%s"></i> ' % icon_class 109 return '<a class="btn btn-mini btn-info" href="%s">%s%s <i class="icon icon-share icon-white"></i></a>' % (href % model.get_id(), icon_class, model) 110 return model 111 112 113 def btn(model_or_text, *args, **kwargs): 114 if not isinstance(model_or_text, basestring): 115 return btn_model(model_or_text) 116 return model_or_text 117 118 119 def label(text, label_type = widgets.BADGE_DEFAULT): 120 return widgets.Label.get(text, label_type) 121 122 123 def label_green(text): 124 return widgets.Label.green(text) 125 126 127 def label_yellow(text): 128 return widgets.Label.yellow(text) 129 130 131 def label_red(text): 132 return widgets.Label.red(text) 133 134 135 def label_black(text): 136 return widgets.Label.black(text) 137 138 139 def label_blue(text): 140 return widgets.Label.blue(text) 141 142 143 def badge(text, label_type = widgets.BADGE_DEFAULT): 144 return widgets.Badge.get(text, label_type) 145 146 147 def badge_green(text): 148 return widgets.Badge.green(text) 149 150 151 def badge_yellow(text): 152 return widgets.Badge.yellow(text) 153 154 155 def badge_red(text): 156 return widgets.Badge.red(text) 157 158 159 def badge_black(text): 160 return widgets.Badge.black(text) 161 162 163 def badge_blue(text): 164 return widgets.Badge.blue(text) 165 166 167 def pl(value, one_format = '', many_format = None, zero_format = None): 168 return ff.pl(value, one_format, many_format, zero_format) 169 170 171 def enum(model, field_name): 172 try: 173 return model._meta.field_map[field_name].enum_map[getattr(model, field_name)] 174 except (KeyError, AttributeError): 175 return getattr(model, field_name, model) 176 177 178 def seconds_ago(datetime_object): 179 datetime_object = datetimeutils.any_to_datetime(datetime_object) 180 if isinstance(datetime_object, datetime.datetime): 181 return (datetime.datetime.now() - datetime_object).total_seconds() 182 183 184 def ago(delta_or_date): 185 return datetimeutils.ago(delta_or_date, str(delta_or_date)) 186 187 188 def ago_plus(datetime_object, ago_text = 'ago', str_format = '%Y-%m-%d %H:%M'): 189 datetime_object = datetimeutils.any_to_datetime(datetime_object) 190 if isinstance(datetime_object, datetime.datetime): 191 return '%s %s <span class="muted">(%s)</span>' % (datetimeutils.ago(datetime_object, str(datetime_object)), ago_text, datetime_object.strftime(str_format)) 192 else: 193 return '%s %s <span class="muted">(%s)</span>' % (datetimeutils.ago(datetime_object, str(datetime_object)), ago_text, str(datetime_object)) 194 195 196 def ago_ttip(datetime_object, ago_text = 'ago', str_format = '%Y-%m-%d %H:%M'): 197 datetime_object = datetimeutils.any_to_datetime(datetime_object) 198 if isinstance(datetime_object, datetime.datetime): 199 return '<span class="ttip" title="%s">%s %s</span>' % (datetime_object.strftime(str_format), datetimeutils.ago(datetime_object, str(datetime_object)), ago_text) 200 else: 201 return '<span class="ttip" title="%s">%s %s</span>' % (str(datetime_object), datetimeutils.ago(datetime_object, str(datetime_object)), ago_text) 202 203 204 def ago_ttip_sec(datetime_object, ago_text = 'ago'): 205 return ago_ttip(datetime_object, ago_text, '%Y-%m-%d %H:%M:%S') 206 207 208 def deltastr(delta): 209 return datetimeutils.deltastr(delta, str(delta)) 210 211 212 def floatformat(value, precision = 2): 213 value = typeutils.float_eval(value, None) 214 if value is None: 215 return '' 216 return ('{:,.' + str(precision) + 'f}').format(value) 217 218 219 def floatformatm(value, precision = 2): 220 str_value = floatformat(value) 221 if precision and str_value: 222 idx = precision + 1 223 return '%s<span class="muted">%s</span>' % (str_value[:-idx], str_value[-idx:]) 224 return str_value 225 226 227 def iif(value, if_true, if_false = ''): 228 if value: 229 return if_true 230 return if_false 231 232 233 def yn(value): 234 return iif(value, 'Yes', 'No') 235 236 237 def ynlabel(value): 238 return iif(value, widgets.Label.green('Yes'), widgets.Label.red('No')) 239 240 241 def ynico(value): 242 return iif(value, '<i class="fa fa-check"></i>', '<i class="fa fa-times"></i>') 243 244 245 def ynoico(value): 246 return iif(value, '<i class="fa fa-check-circle"></i>', '<i class="fa fa-times-circle"></i>') 247 248 249 def yncico(value): 250 return iif(value, '<i class="fa fa-check text-success"></i>', '<i class="fa fa-times text-error"></i>') 251 252 253 def yncoico(value): 254 return iif(value, '<i class="fa fa-check-circle text-success"></i>', '<i class="fa fa-times-circle text-error"></i>') 255 256 257 def sel(value): 258 return iif(value, ' selected') 259 260 261 def chk(value): 262 return iif(value, ' checked') 263 264 265 def qtable(data, dom_id = None, dom_classes = '+', dom_style = None, has_header = None, **kwargs): 266 class_list = [] 267 if isinstance(dom_classes, (list, tuple)): 268 if '+' in dom_classes: 269 class_list.extend(widgets.QuickTable.DEFAULT_DOM_CLASSES) 270 dom_classes.remove('+') 271 class_list.extend(dom_classes) 272 elif isinstance(dom_classes, str): 273 if dom_classes.startswith('+'): 274 class_list.extend(widgets.QuickTable.DEFAULT_DOM_CLASSES) 275 dom_classes = dom_classes[1:] 276 if len(dom_classes) > 0: 277 class_list.extend(dom_classes.strip().split(' ')) 278 return widgets.QuickTable.get(data, dom_id, class_list, dom_style, has_header, **kwargs) 279 280 281 def jsontable(data, dom_id = None, dom_classes = '+', dom_style = None, recursive = True, **kwargs): 282 if isinstance(data, dict): 283 return dicttable(data, dom_id, dom_classes, dom_style, recursive, **kwargs) 284 if isinstance(data, (list, tuple)): 285 return listtable(data, dom_id, dom_classes, dom_style, recursive, **kwargs) 286 if isinstance(data, (str, unicode)): 287 data = data.strip() 288 try: 289 if data.startswith('{') and data.endswith('}'): 290 data = json.loads(data) 291 return dicttable(data, dom_id, dom_classes, dom_style, recursive, **kwargs) 292 if data.startswith('[') and data.endswith(']'): 293 data = json.loads(data) 294 return listtable(data, dom_id, dom_classes, dom_style, recursive, **kwargs) 295 except ValueError as ex: 296 return listtable([data], dom_id, dom_classes, dom_style, recursive, **kwargs) 297 298 else: 299 return listtable([data], dom_id, dom_classes, dom_style, recursive, **kwargs) 300 301 302 def listtable(data_list, dom_id = None, dom_classes = '+', dom_style = None, recursive = True, html_safe = False, **kwargs): 303 if recursive: 304 if not isinstance(recursive, bool): 305 recursive -= 1 306 parsed_list = [] 307 for i, line in enumerate(data_list): 308 if isinstance(line, dict): 309 parsed_list.append(dicttable(line, dom_id, dom_classes, dom_style, recursive, html_safe, **kwargs)) 310 elif isinstance(line, (list, tuple)): 311 parsed_list.append(listtable(line, dom_id, dom_classes, dom_style, recursive, html_safe, **kwargs)) 312 else: 313 if not html_safe: 314 line = ('%s' % line).replace('&', '&').replace('<', '<').replace('>', '>') 315 parsed_list.append(line) 316 317 else: 318 parsed_list = data_list 319 return qtable(parsed_list, dom_id, dom_classes, dom_style, False, **kwargs) 320 321 322 def dicttable(data_dict, dom_id = None, dom_classes = '+', dom_style = None, recursive = True, html_safe = False, **kwargs): 323 if recursive: 324 if not isinstance(recursive, bool): 325 recursive -= 1 326 parsed_dict = {} 327 for k, val in data_dict.iteritems(): 328 if isinstance(val, dict): 329 parsed_dict[k] = dicttable(val, dom_id, dom_classes, dom_style, recursive, html_safe, **kwargs) 330 elif isinstance(val, (list, tuple)): 331 parsed_dict[k] = listtable(val, dom_id, dom_classes, dom_style, recursive, html_safe, **kwargs) 332 else: 333 if not html_safe: 334 val = ('%s' % val).replace('&', '&').replace('<', '<').replace('>', '>') 335 parsed_dict[k] = val 336 337 else: 338 parsed_dict = data_dict 339 return qtable(parsed_dict, dom_id, dom_classes, dom_style, False, **kwargs) 340 341 342 @utils.filter_name('json') 343 def to_json(dict_or_list): 344 try: 345 if isinstance(dict_or_list, basestring): 346 dict_or_list = json.loads(dict_or_list) 347 return json.dumps(dict_or_list, indent=4) 348 except ValueError as ex: 349 return dict_or_list 350 351 352 def pyid(obj): 353 return str(id(obj)) 354 355 356 def pyhash(obj): 357 return str(hash(obj)) 358 359 360 def currsym(value): 361 if not value: 362 return '¤' 363 lvalue = value.lower() 364 if lvalue == 'usd': 365 return '$' 366 if lvalue == 'eur': 367 return '€' 368 if lvalue == 'gbp': 369 return '£' 370 if lvalue == 'jpy': 371 return '¥' 372 return value 373 374 375 def numformat(value): 376 value = typeutils.int_eval(value, None) 377 if not value: 378 return '' 379 return '{:,.0f}'.format(value) 380 381 382 def idx(value, *args): 383 if not isinstance(value, int) or value < 0: 384 return '' 385 if isinstance(args, (list, tuple)): 386 if len(args) == 1: 387 if isinstance(args[0], (list, tuple)): 388 args = args[0] 389 if len(args) > value: 390 return args[value] 391 return '' 392 393 394 def rangeidx(value, *args): 395 if not isinstance(value, (bytes, 396 int, 397 long, 398 float)): 399 return -1 400 if isinstance(args, (list, tuple)): 401 for i, check in enumerate(args): 402 if isinstance(check, (list, tuple)) and len(check) == 2: 403 i = check[1] 404 check = check[0] 405 if isinstance(check, (bytes, 406 int, 407 long, 408 float)): 409 if value <= check: 410 return i 411 412 return len(args) 413 return -1 414 415 416 def stdtext(value, word_caps = True, acronym_length = 3): 417 parts = value.split(' ') 418 buff = [] 419 for part in parts: 420 part = part.strip() 421 if part.isupper(): 422 part = part.replace('_', ' ') 423 else: 424 partbuff = [] 425 for i, c in enumerate(part): 426 if i != 0: 427 if c.isupper(): 428 partbuff.append(' ') 429 partbuff.append(c) 430 431 part = ''.join(partbuff) 432 buff.append(part) 433 434 buff2 = [] 435 for w in ' '.join(buff).split(' '): 436 if w.isupper(): 437 if 1 < len(w) <= acronym_length: 438 buff2.append(w) 439 elif word_caps: 440 buff2.append(w.capitalize()) 441 else: 442 buff2.append(w.lower()) 443 elif word_caps: 444 buff2.append(w.capitalize()) 445 else: 446 buff2.append(w.lower()) 447 448 if not word_caps: 449 return ' '.join(buff).capitalize() 450 else: 451 return ' '.join(buff) 452 453 454 def inp_date(value, name, dom_id = None, end_date = None, start_date = None): 455 if end_date and isinstance(end_date, (str, unicode)): 456 try_parse = datetimeutils.str_to_relative_datetime(end_date) 457 if try_parse: 458 end_date = try_parse 459 else: 460 end_date = datetimeutils.any_to_datetime(end_date) 461 if start_date and isinstance(start_date, (str, unicode)): 462 try_parse = datetimeutils.str_to_relative_datetime(start_date) 463 if try_parse: 464 start_date = try_parse 465 else: 466 start_date = datetimeutils.any_to_datetime(start_date) 467 return inputfields.DateInputField.get(name, value, dom_id, end_date, start_date).render() 468 469 470 def inp_daterange(value, name, dom_id = None, end_date = None, start_date = None): 471 if end_date and isinstance(end_date, (str, unicode)): 472 try_parse = datetimeutils.str_to_relative_datetime(end_date) 473 if try_parse: 474 end_date = try_parse 475 else: 476 end_date = datetimeutils.any_to_datetime(end_date) 477 if start_date and isinstance(start_date, (str, unicode)): 478 try_parse = datetimeutils.str_to_relative_datetime(start_date) 479 if try_parse: 480 start_date = try_parse 481 else: 482 start_date = datetimeutils.any_to_datetime(start_date) 483 return inputfields.DateRangeInputField.get(name, value, dom_id, end_date, start_date).render() 484 485 486 def dt_mod(value, d = 0, s = 0, m = 0, h = 0, w = 0): 487 value = datetimeutils.any_to_datetime(value) 488 if isinstance(value, (datetime.date, datetime.datetime)): 489 return value + datetime.timedelta(days=d, seconds=s, minutes=m, hours=h, weeks=w) 490 return value 491 492 493 def dt_rel(value): 494 if isinstance(value, (str, unicode)): 495 try_parse = datetimeutils.str_to_relative_datetime(value) 496 if not try_parse: 497 try_parse = datetimeutils.any_to_datetime(value) 498 else: 499 try_parse = datetimeutils.any_to_datetime(value) 500 return try_parse 501 502 503 def joinlist(list_or_dict, format_str = '%s<br>', use_key_as_value = False): 504 if list_or_dict: 505 buff = [] 506 if isinstance(list_or_dict, dict): 507 if use_key_as_value: 508 list_or_dict = list_or_dict.keys() 509 else: 510 list_or_dict = list_or_dict.values() 511 try: 512 for i in list_or_dict: 513 buff.append(format_str % i) 514 515 return '\n\t'.join(buff) 516 except Exception as ex: 517 return '' 518 519 else: 520 return '' 521 522 523 def ul(list_or_dict, format_str = '%s', use_key_as_value = False, **kwargs): 524 items = joinlist(list_or_dict, '<li>%s</li>' % format_str, use_key_as_value) 525 if items: 526 if kwargs: 527 attribs = ' %s' % ' '.join([ '%s="%s"' % (k, v) for k, v in kwargs.iteritems() ]) 528 else: 529 attribs = '' 530 return '<ul%s>\n\t%s\n</ul>\n' % (attribs, items) 531 return '' 532 533 534 def ol(list_or_dict, format_str = '%s', use_key_as_value = False, **kwargs): 535 items = joinlist(list_or_dict, '<li>%s</li>' % format_str, use_key_as_value) 536 if items: 537 if kwargs: 538 attribs = ' %s' % ' '.join([ '%s="%s"' % (k, v) for k, v in kwargs.iteritems() ]) 539 else: 540 attribs = '' 541 return '<ol%s>\n\t%s\n</ol>\n' % (attribs, items) 542 return '' 543 544 545 def plus(value): 546 if value > 0: 547 return '+%s' % value 548 return value 549 550 551 def parse_markdown(value): 552 if value: 553 return htmlutils.parse_markdown_link(value) 554 return '' 555 556 557 def sanitize(value): 558 if value: 559 return htmlutils.sanitize(value, keep_amp=True) 560 return ''