NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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), (('&gt;', '>'), ('&lt;', '<')), 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('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;')
    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('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;')
    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 '&curren;'
    363     lvalue = value.lower()
    364     if lvalue == 'usd':
    365         return '&#36;'
    366     if lvalue == 'eur':
    367         return '&euro;'
    368     if lvalue == 'gbp':
    369         return '&pound;'
    370     if lvalue == 'jpy':
    371         return '&yen;'
    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 ''