From 20d046ad665dd0608aafebc1603b0433081feb81 Mon Sep 17 00:00:00 2001 From: Mantavya Gajjar Date: Wed, 3 Dec 2008 15:33:54 +0530 Subject: [PATCH 1/2] add sorting algorithm bzr revid: mga@tinyerp.com-20081203100354-rylbn3xsaupeykpy --- addons/wiki/wizard/sort_algo.py | 133 ++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 addons/wiki/wizard/sort_algo.py diff --git a/addons/wiki/wizard/sort_algo.py b/addons/wiki/wizard/sort_algo.py new file mode 100644 index 00000000000..9579b8ff6b7 --- /dev/null +++ b/addons/wiki/wizard/sort_algo.py @@ -0,0 +1,133 @@ +def sort(data, index): + for i in range(len(data)): + j = i + 1 + for j in range(len(data)-1): + d1 = data[i].split('.') + d2 = data[j].split('.') + + l1 = len(d1) + l2 = len(d2) + max = 0 + if l1 < l2: + max = l1 + elif l2 < l1: + max = l2 + else: + max = l1 + + if max == 1: + if int(d1[0]) == int(d2[0]): + if len(d1) < len(d2): + tmp = data[i] + data[i] = data[j] + data[j] = tmp + continue + + for p in range(0, max): + val1 = val2 = 0 + try: + val1 = int(d1[p]) + except: + val1 = 0 + + try: + val2 = int(d2[p]) + except: + val2 = 0 + + if val1 < val2: + tmp = data[i] + data[i] = data[j] + data[j] = tmp + if data[i].startswith(data[j]): + tmp = data[i] + tmp = tmp.replace(data[j],'') + +def group(data): + gp = {} + for i in range(len(data)): + d1 = data[i].split('.')[0] + if gp.has_key(d1): + gp[d1].append(data[i]) + else: + gp[d1] = [data[i]] + return gp + +def max(data): + max = 0 + for i in range(len(data)): + d = str(data[i]).split('.') + if len(d) > max: + max = len(d) + + return max + +def toint(data): + for i in range(len(data)): + data[i] = int(data[i]) + +def rearrange(key, groups): + i = 1 + new = {} + for ky in key: + new[i] = groups[str(ky)] + i += 1 + return new + +def reindex(key, groups): + if groups[0] != key: + groups[0] = key + + lvl_group = {} + level = max(groups) + for i in range(len(groups)): + dg = str(groups[i]).split('.') + index = len(dg) + if lvl_group.has_key(str(index)): + lvl_group[str(index)].append(groups[i]) + else: + lvl_group[str(index)] = [groups[i]] + + for i in range(2, level+1): + ixd = 1 + gps = lvl_group[str(i)] + for j in range(len(gps)): + dt = gps[j].split('.') + new ="" + for k in range(i-1): + new += str(dt[k]) + new += '.' + + new += str(ixd) + ixd += 1 + gps[j] = new + + print lvl_group + +if __name__ == '__main__': + + data = ['1', '10.1', '10.3', '1.1', '1.2.3', '1.7', '3.1.8', '1.2.2', '1.2.10', '1.3', '1.4', '2', '20.2', '2.1', '2.2', '3', '3.1', '1.2.1', '2.1.2'] + + sort(data, 0) + + grp = group(data) + + for gp in grp: + loop = max(grp[gp]) + for lp in range(1, loop): + sort(grp[gp],lp) + + key = grp.keys() + toint(key) + key.sort() + + groups = rearrange(key, grp) + + new_data = [] + for key in groups: + new_data.extend(groups[key]) + #print groups[key] + + print 'XXXXXXXXXXXXXXXXX : ', new_data +# print groups +# From 452c12f8ed8997e687999c2149ed8c33cf99e8ef Mon Sep 17 00:00:00 2001 From: Mantavya Gajjar Date: Wed, 3 Dec 2008 17:27:53 +0530 Subject: [PATCH 2/2] write code for the reindexing : by fabien bzr revid: mga@tinyerp.com-20081203115753-32atuyr9t53exq2p --- addons/wiki/wizard/make_index.py | 49 ++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/addons/wiki/wizard/make_index.py b/addons/wiki/wizard/make_index.py index 34a333911dd..1f2745448e4 100644 --- a/addons/wiki/wizard/make_index.py +++ b/addons/wiki/wizard/make_index.py @@ -39,11 +39,50 @@ def wiki_do_index(self, cr, uid, data, context): iid = ','.join([str(x) for x in ids]) sSQL = "Select id, section from wiki_wiki where id in (%s) order by section " % (iid) cr.execute(sSQL) - wiki = cr.fetchall() - i = 1 - for wk in wiki: - wiki_pool.write(cr, uid, [wk[0]], {'section':i}) - i+=1 + lst0 = cr.fetchall() + lst = [] + ids = {} + for l in lst0: + ids[l[1]] = l[0] + lst.append(l[1]) + + lst.sort() + val = None + def toint(x): + try: + return int(x) + except: + return 1 + + lst = map(lambda x: map(toint, x.split('.')), lst) + + result = [] + current = ['0'] + current2 = [] + + for l in lst: + for pos in range(len(l)): + if pos >= len(current): + current.append('1') + continue + if (pos == len(l) - 1) or (pos >= len(current2)) or (toint(l[pos]) > toint(current2[pos])): + current[pos] = str(toint(current[pos]) + 1) + current = current[:pos + 1] + if pos == len(l) - 1: + break + + key = ('.'.join([str(x) for x in l])) + id = ids[key] + val = ('.'.join([str(x) for x in current[:]]), id) + + if val: + result.append(val) + current2 = l + + print 'OLD', lst + print 'NEW', result + for rs in result: + wiki_pool.write(cr, uid, [rs[1]], {'section':rs[0]}) return {}