def test_create(self, ): ip = '111.111.111.222' time = datetime.now().replace(microsecond=0) network = Network.create(ip, time) self.assertEqual(network.last_ip, ip) self.assertEqual(network.create_at, time) self.assertEqual(network.last_active, time)
def polymerize(self, ip): r2 = self.get_cache_last(ip) if len(r2) == 0: return None r1 = self.get_cache_start(ip) # find uid has max number of uids r = {} for uid, dt in r2.items(): r[uid] = { 'start': r1[uid], 'end': dt, 'count': 0, 'uids': [], } maxUid = None maxCount = 0 for uid, dt in r1.items(): for uid2, c in r.items(): if dt >= c['start'] and dt <= c['end']: c['count'] += 1 c['uids'].append(uid) if c['count'] > maxCount: maxCount = c['count'] maxUid = uid2 # loop find more uids, use plan2 start_time = r1[maxUid] end_time = r2[maxUid] outer = r1.keys() inner = [] # loop find while True: changed = False for uid in outer: if uid in inner: continue if r1[uid] >= start_time and r1[uid] <= end_time: inner.append(uid) if uid in r2 and r2[uid] > end_time: end_time = r2[uid] changed = True continue if uid in r2 and r2[uid] >= start_time and r2[uid] <= end_time: inner.append(uid) if r1[uid] < start_time: start_time = r1[uid] changed = True continue if not changed: break network = Network.create(ip, start_time, end_time) for uid in inner: dt = r2[uid] if uid in r2 else r1[uid] NetworkUser.create(network.nid, uid, ip, dt) # clear log self.clear_cache(ip) return network