def sort_key_for_name_and_first_letter(x): v1 = icu_upper(x.sort or x.name) v2 = v1 or ' ' # The idea is that '9999999999' is larger than any digit so all digits # will sort in front. Non-digits will sort according to their ICU first letter c = v2[0] return (c if numeric_collation and c.isdigit() else '9999999999', collation_order(v2), sort_key(v1))
def sort_categories(items, sort, first_letter_sort=False): if sort == "popularity": key = lambda x: (-getattr(x, "count", 0), sort_key(x.sort or x.name)) elif sort == "rating": key = lambda x: (-getattr(x, "avg_rating", 0.0), sort_key(x.sort or x.name)) else: if first_letter_sort: key = lambda x: (collation_order(icu_upper(x.sort or x.name or " ")), sort_key(x.sort or x.name)) else: key = lambda x: sort_key(x.sort or x.name) items.sort(key=key) return items
def sort_categories(items, sort, first_letter_sort=False): if sort == 'popularity': key=lambda x:(-getattr(x, 'count', 0), sort_key(x.sort or x.name)) elif sort == 'rating': key=lambda x:(-getattr(x, 'avg_rating', 0.0), sort_key(x.sort or x.name)) else: if first_letter_sort: key=lambda x:(collation_order(icu_upper(x.sort or x.name or ' ')), sort_key(x.sort or x.name)) else: key=lambda x:sort_key(x.sort or x.name) items.sort(key=key) return items
def build_first_letter_list(category_items): # Build a list of 'equal' first letters by noticing changes # in ICU's 'ordinal' for the first letter. In this case, the # first letter can actually be more than one letter long. cl_list = [None] * len(category_items) last_ordnum = 0 last_c = ' ' for idx, tag in enumerate(category_items): if not tag.sort: c = ' ' else: c = icu_upper(tag.sort) ordnum, ordlen = collation_order(c) if last_ordnum != ordnum: last_c = c[0:ordlen] last_ordnum = ordnum cl_list[idx] = last_c return cl_list
new_cats['.'.join(comps)] = user_cats[k] try: if new_cats != user_cats: dbcache.set_pref('user_categories', new_cats) except: pass return new_cats category_sort_keys = {True:{}, False: {}} category_sort_keys[True]['popularity'] = category_sort_keys[False]['popularity'] = \ lambda x:(-getattr(x, 'count', 0), sort_key(x.sort or x.name)) category_sort_keys[True]['rating'] = category_sort_keys[False]['rating'] = \ lambda x:(-getattr(x, 'avg_rating', 0.0), sort_key(x.sort or x.name)) category_sort_keys[True]['name'] = \ lambda x:(collation_order(icu_upper(x.sort or x.name or ' ')), sort_key(x.sort or x.name)) category_sort_keys[False]['name'] = \ lambda x:sort_key(x.sort or x.name) def get_categories(dbcache, sort='name', book_ids=None, first_letter_sort=False): if sort not in CATEGORY_SORTS: raise ValueError('sort ' + sort + ' not a valid value') fm = dbcache.field_metadata book_rating_map = dbcache.fields['rating'].book_value_map lang_map = dbcache.fields['languages'].book_value_map categories = {} book_ids = frozenset(book_ids) if book_ids else book_ids pm_cache = {}