def execute(id): if Platform.get_by_key_name(key): error[0] = 'Platform "%s" already exists' % key return platform = Platform(id=id, name=name, key_name=key) platform.put() return platform
def __init__(self): # FIXME: This function is massive. Break it up self._test_map = {} platform_id_map = {} branch_id_map = {} for test in Test.all(): if test.hidden: continue branch_ids = [Branch.get(branch_key).id for branch_key in test.branches] platform_ids = [Platform.get(platform_key).id for platform_key in test.platforms] self._test_map[test.id] = { 'name': test.name, 'branchIds': branch_ids, 'platformIds': platform_ids, } for platform_id in platform_ids: platform_id_map.setdefault(platform_id, {'tests': [], 'branches': []}) platform_id_map[platform_id]['tests'].append(test.id) platform_id_map[platform_id]['branches'] += branch_ids for branch_id in branch_ids: branch_id_map.setdefault(branch_id, {'tests': [], 'platforms': []}) branch_id_map[branch_id]['tests'].append(test.id) branch_id_map[branch_id]['platforms'] += platform_ids self._platform_map = {} for platform in Platform.all(): if platform.id not in platform_id_map: continue if platform.hidden: for test_id in platform_id_map[platform.id]['tests']: self._test_map[test_id]['platformIds'].remove(platform.id) for branch_id in platform_id_map[platform.id]['branches']: branch_id_map[branch_id]['platforms'].remove(platform.id) continue self._platform_map[platform.id] = { 'name': platform.name, 'testIds': list(set(platform_id_map[platform.id]['tests'])), 'branchIds': list(set(platform_id_map[platform.id]['branches'])), } self._branch_map = {} for branch in Branch.all(): if branch.id not in branch_id_map: continue self._branch_map[branch.id] = { 'name': branch.name, 'testIds': list(set(branch_id_map[branch.id]['tests'])), 'platformIds': list(set(branch_id_map[branch.id]['platforms'])), }
def test_value_two_platforms(self): webkit_trunk = Branch.create_if_possible('webkit-trunk', 'WebKit trunk') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') other_platform = Platform.create_if_possible('other-platform', 'Other Platform') Test.update_or_insert('some-test', webkit_trunk, some_platform) Test.update_or_insert('some-test', webkit_trunk, other_platform) self.assertEqual(DashboardJSONGenerator().value(), { 'defaultBranch': 'WebKit trunk', 'branchToId': {'WebKit trunk': webkit_trunk.id}, 'platformToId': {'Some Platform': some_platform.id, 'Other Platform': other_platform.id}, 'testToId': {'some-test': Test.get_by_key_name('some-test').id}, })
def test_create_if_possible(self): self.assertThereIsNoInstanceOf(Platform) platform = Platform.create_if_possible('some-platform', 'some platform') self.assertTrue(platform) self.assertTrue(platform.key().name(), 'some-platform') self.assertTrue(platform.name, 'some platform') self.assertOnlyInstance(platform) self.assertFalse(Platform.create_if_possible('some-platform', 'some other platform')) self.assertTrue(platform.name, 'some platform') self.assertOnlyInstance(platform)
def get(self): self.response.headers['Content-Type'] = 'text/plain; charset=utf-8'; cache = memcache.get('manifest') if cache: self.response.out.write(cache) return testMap = {} platformIdMap = {} branchIdMap = {} for test in Test.all(): branchIds = [Branch.get(branchKey).id for branchKey in test.branches] platformIds = [Platform.get(platformKey).id for platformKey in test.platforms] testMap[test.id] = { 'name': test.name, 'branchIds': branchIds, 'platformIds': platformIds, } for platformId in platformIds: platformIdMap.setdefault(platformId, {'tests': [], 'branches': []}) platformIdMap[platformId]['tests'].append(test.id) platformIdMap[platformId]['branches'] += branchIds for branchId in branchIds: branchIdMap.setdefault(branchId, {'tests': [], 'platforms': []}) branchIdMap[branchId]['tests'].append(test.id) branchIdMap[branchId]['platforms'] += platformIds platformMap = {} for platform in Platform.all(): if platform.id not in platformIdMap: continue platformMap[platform.id] = { 'name': platform.name, 'testIds': list(set(platformIdMap[platform.id]['tests'])), 'branchIds': list(set(platformIdMap[platform.id]['branches'])), } branchMap = {} for branch in Branch.all(): if branch.id not in branchIdMap: continue branchMap[branch.id] = { 'name': branch.name, 'testIds': list(set(branchIdMap[branch.id]['tests'])), 'platformIds': list(set(branchIdMap[branch.id]['platforms'])), } result = json.dumps({'testMap': testMap, 'platformMap': platformMap, 'branchMap': branchMap}) self.response.out.write(result) memcache.add('manifest', result)
def test_update_or_insert_to_update(self): branch = Branch.create_if_possible('some-branch', 'Some Branch') platform = Platform.create_if_possible('some-platform', 'Some Platform') test = Test.update_or_insert('some-test', branch, platform) self.assertOnlyInstance(test) other_branch = Branch.create_if_possible('other-branch', 'Other Branch') other_platform = Platform.create_if_possible('other-platform', 'Other Platform') test = Test.update_or_insert('some-test', other_branch, other_platform, 'ms') self.assertOnlyInstance(test) self.assertEqualUnorderedList(test.branches, [branch.key(), other_branch.key()]) self.assertEqualUnorderedList(test.platforms, [platform.key(), other_platform.key()]) self.assertEqualUnorderedList(test.unit, 'ms')
def get(self): self.response.headers["Content-Type"] = "text/plain; charset=utf-8" self.response.out.write('{"testMap":') testMap = {} platformIdMap = {} branchIdMap = {} for test in Test.all(): branchIds = [Branch.get(branchKey).id for branchKey in test.branches] platformIds = [Platform.get(platformKey).id for platformKey in test.platforms] testMap[test.id] = {"name": test.name, "branchIds": branchIds, "platformIds": platformIds} for platformId in platformIds: platformIdMap.setdefault(platformId, {"tests": [], "branches": []}) platformIdMap[platformId]["tests"].append(test.id) platformIdMap[platformId]["branches"] += branchIds for branchId in branchIds: branchIdMap.setdefault(branchId, {"tests": [], "platforms": []}) branchIdMap[branchId]["tests"].append(test.id) branchIdMap[branchId]["platforms"] += platformIds self.response.out.write(json.dumps(testMap)) self.response.out.write(',"platformMap":') platformMap = {} for platform in Platform.all(): if platform.id not in platformIdMap: continue platformMap[platform.id] = { "name": platform.name, "testIds": list(set(platformIdMap[platform.id]["tests"])), "branchIds": list(set(platformIdMap[platform.id]["branches"])), } self.response.out.write(json.dumps(platformMap)) self.response.out.write(',"branchMap":') branchMap = {} for branch in Branch.all(): if branch.id not in branchIdMap: continue branchMap[branch.id] = { "name": branch.name, "testIds": list(set(branchIdMap[branch.id]["tests"])), "platformIds": list(set(branchIdMap[branch.id]["platforms"])), } self.response.out.write(json.dumps(branchMap)) self.response.out.write("}")
def get(self): self.response.headers["Content-Type"] = "application/json; charset=utf-8" cache = memcache.get("dashboard") if cache: self.response.out.write(cache) return webkitTrunk = Branch.get_by_key_name("webkit-trunk") # FIXME: Determine popular branches, platforms, and tests dashboard = { "defaultBranch": "WebKit trunk", "branchToId": {webkitTrunk.name: webkitTrunk.id}, "platformToId": {}, "testToId": {}, } for platform in Platform.all(): dashboard["platformToId"][platform.name] = platform.id for test in Test.all(): dashboard["testToId"][test.name] = test.id result = json.dumps(dashboard) self.response.out.write(result) memcache.add("dashboard", result)
def post(self): self.response.headers['Content-Type'] = 'text/plain; charset=utf-8' try: payload = json.loads(self.request.body) hide = payload['hide'] except: self.response.out.write("Failed to parse the payload: %s" % self.request.body) return if 'platform' in payload: model = Platform.get_by_key_name(payload['platform']) elif 'test' in payload: model = Test.get_by_key_name(payload['test']) else: self.response.out.write('Not supported') return if not model: self.response.out.write('Could not find the model') return model.hidden = hide model.put() schedule_dashboard_update() schedule_manifest_update() self.response.out.write('OK')
def test_chart_params_with_value(self): some_branch = Branch.create_if_possible('some-branch', 'Some Branch') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') some_builder = Builder.get(Builder.create('some-builder', 'Some Builder')) some_test = Test.update_or_insert('some-test', some_branch, some_platform) start_time = datetime(2011, 2, 21, 12, 0, 0) end_time = datetime(2011, 2, 28, 12, 0, 0) results = self._create_results(some_branch, some_platform, some_builder, 'some-test', [50.0, 51.0, 52.0, 49.0, 48.0, 51.9, 50.7, 51.1], [start_time + timedelta(day) for day in range(0, 8)]) # Use int despite of its impreciseness since tests may fail due to rounding errors otherwise. def split_as_int(string): return [int(float(value)) for value in string.split(',')] params = Runs.update_or_insert(some_branch, some_platform, some_test).chart_params(7) self.assertEqual(params['chxl'], '0:|Feb 21|Feb 22|Feb 23|Feb 24|Feb 25|Feb 26|Feb 27|Feb 28') self.assertEqual(split_as_int(params['chxr']), [1, 0, 57, int(52 * 1.1 / 5 + 0.5)]) x_min, x_max, y_min, y_max = split_as_int(params['chds']) self.assertEqual(datetime.fromtimestamp(x_min), start_time) self.assertEqual(datetime.fromtimestamp(x_max), end_time) self.assertEqual(y_min, 0) self.assertEqual(y_max, int(52 * 1.1)) self.assertEqual(split_as_int(params['chg']), [int(100 / 7), 20, 0, 0]) params = Runs.update_or_insert(some_branch, some_platform, some_test).chart_params(14) self.assertEqual(params['chxl'], '0:|Feb 14|Feb 16|Feb 18|Feb 20|Feb 22|Feb 24|Feb 26|Feb 28') self.assertEqual(split_as_int(params['chxr']), [1, 0, 57, int(52 * 1.1 / 5 + 0.5)]) x_min, x_max, y_min, y_max = split_as_int(params['chds']) self.assertEqual(datetime.fromtimestamp(x_min), datetime(2011, 2, 14, 12, 0, 0)) self.assertEqual(datetime.fromtimestamp(x_max), end_time) self.assertEqual(y_min, 0) self.assertEqual(y_max, int(52 * 1.1)) self.assertEqual(split_as_int(params['chg']), [int(100 / 7), 20, 0, 0])
def test_update_incrementally(self): some_branch = Branch.create_if_possible('some-branch', 'Some Branch') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') some_builder = Builder.get(Builder.create('some-builder', 'Some Builder')) some_test = Test.update_or_insert('some-test', some_branch, some_platform) self.assertThereIsNoInstanceOf(Runs) timestamps = [datetime.now(), datetime.now()] builds, results = self._create_results(some_branch, some_platform, some_builder, 'some-test', [50.0, 52.0], timestamps) runs = Runs.update_or_insert(some_branch, some_platform, some_test) self.assertOnlyInstance(runs) self.assertEqual(json.loads('[' + runs.json_runs + ']'), [[5, [4, 0, 100, None], mktime(timestamps[0].timetuple()), 50.0, 0, [], None, None], [7, [6, 1, 101, None], mktime(timestamps[1].timetuple()), 52.0, 0, [], None, None]]) self.assertEqual(json.loads('{' + runs.json_averages + '}'), {"100": 50.0, "101": 52.0}) self.assertEqual(runs.json_min, 50.0) self.assertEqual(runs.json_max, 52.0) timestamps.append(datetime.now()) builds, results = self._create_results(some_branch, some_platform, some_builder, 'some-test', [48.0], timestamps[2:], starting_revision=102) runs.update_incrementally(builds[0], results[0]) self.assertOnlyInstance(runs) self.assertEqual(json.loads('[' + runs.json_runs + ']'), [[5, [4, 0, 100, None], mktime(timestamps[0].timetuple()), 50.0, 0, [], None, None], [7, [6, 1, 101, None], mktime(timestamps[1].timetuple()), 52.0, 0, [], None, None], [9, [8, 0, 102, None], mktime(timestamps[2].timetuple()), 48.0, 0, [], None, None]]) self.assertEqual(json.loads('{' + runs.json_averages + '}'), {"100": 50.0, "101": 52.0, "102": 48.0}) self.assertEqual(runs.json_min, 48.0) self.assertEqual(runs.json_max, 52.0)
def test_update_or_insert(self): some_branch = Branch.create_if_possible('some-branch', 'Some Branch') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') some_builder = Builder.get(Builder.create('some-builder', 'Some Builder')) some_test = Test.update_or_insert('some-test', some_branch, some_platform) self.assertThereIsNoInstanceOf(Runs) runs = Runs.update_or_insert(some_branch, some_platform, some_test) self.assertOnlyInstance(runs) self.assertEqual(runs.json_runs, '') self.assertEqual(runs.json_averages, '') self.assertEqual(runs.json_min, None) self.assertEqual(runs.json_max, None) old_memcache_value = memcache.get(Runs._key_name(some_branch.id, some_platform.id, some_test.id)) self.assertTrue(old_memcache_value) runs.delete() self.assertThereIsNoInstanceOf(Runs) builds, results = self._create_results(some_branch, some_platform, some_builder, 'some-test', [50.0]) runs = Runs.update_or_insert(some_branch, some_platform, some_test) self.assertOnlyInstance(runs) self.assertTrue(runs.json_runs.startswith('[5, [4, 0, 100, null],')) self.assertEqual(json.loads('{' + runs.json_averages + '}'), {"100": 50.0}) self.assertEqual(runs.json_min, 50.0) self.assertEqual(runs.json_max, 50.0) self.assertNotEqual(memcache.get(Runs._key_name(some_branch.id, some_platform.id, some_test.id)), old_memcache_value)
def test_value_single_platform(self): some_branch = Branch.create_if_possible('some-branch', 'Some Branch') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') self.assertEqual(ManifestJSONGenerator().value(), {'branchMap': {}, 'platformMap': {}, 'testMap': {}}) some_test = Test.update_or_insert('some-test', some_branch, some_platform) self._assert_single_test(ManifestJSONGenerator().value(), some_branch, some_platform, some_test)
def test_to_json_with_results(self): some_branch = Branch.create_if_possible('some-branch', 'Some Branch') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') some_builder = Builder.get(Builder.create('some-builder', 'Some Builder')) some_test = Test.update_or_insert('some-test', some_branch, some_platform) builds, results = self._create_results(some_branch, some_platform, some_builder, 'some-test', [50.0, 51.0, 52.0, 49.0, 48.0]) value = json.loads(Runs.update_or_insert(some_branch, some_platform, some_test).to_json()) self.assertEqualUnorderedList(value.keys(), ['test_runs', 'averages', 'min', 'max', 'unit', 'date_range', 'stat']) self.assertEqual(value['stat'], 'ok') self.assertEqual(value['min'], 48.0) self.assertEqual(value['max'], 52.0) self.assertEqual(value['unit'], None) self.assertEqual(value['date_range'], None) # date_range is never given self.assertEqual(len(value['test_runs']), len(results)) for i, run in enumerate(value['test_runs']): result = results[i] self.assertEqual(run[0], result.key().id()) self.assertEqual(run[1][1], i) # Build number self.assertEqual(run[1][2], 100 + i) # Revision self.assertEqual(run[1][3], None) # Supplementary revision self.assertEqual(run[3], result.value) self.assertEqual(run[6], some_builder.key().id()) self.assertEqual(run[7], None) # Statistics
def get(self): self.response.headers['Content-Type'] = 'application/json; charset=utf-8'; cache = memcache.get('dashboard') if cache: self.response.out.write(cache) return webkit_trunk = Branch.get_by_key_name('webkit-trunk') # FIXME: Determine popular branches, platforms, and tests dashboard = { 'defaultBranch': 'WebKit trunk', 'branchToId': {webkit_trunk.name: webkit_trunk.id}, 'platformToId': {}, 'testToId': {}, } for platform in Platform.all(): dashboard['platformToId'][platform.name] = platform.id for test in Test.all(): dashboard['testToId'][test.name] = test.id result = json.dumps(dashboard) self.response.out.write(result) memcache.add('dashboard', result)
def get(self, campaign_id, platform_name): """ Handles incoming clicks for given campaign_id and platform_name. If click is valid then user is redirected to url defined in the campaign and statistic about this click is saved. All invalid clicks (e.g. for non existing campaigns, platforms) users are redirected to http://outfit7.com. """ # cast campaign_id, type checking is done through route definition try: campaign_id = int(campaign_id) except ValueError: return webapp2.redirect("http://outfit7.com", permanent=True) platform_id = "%d-%s" % (campaign_id, platform_name) platform = Platform.get_by_id(platform_id) if platform: memcache.incr(platform_id, 1, namespace="counters", initial_value=0) try: deferred.defer(Platform.increment, platform_id, _countdown=TRACKER_COUNTER_UPDATE_INTERVAL_LENGTH, _name="%s-%d" % (platform_id, get_interval_index())) except (taskqueue.TaskAlreadyExistsError, taskqueue.TombstonedTaskError), e: pass # TODO: optimize with async operations campaign = Campaign.get_by_id(campaign_id) return webapp2.redirect(campaign.link.encode("utf8"))
def test_to_json_with_unit(self): some_branch = Branch.create_if_possible('some-branch', 'Some Branch') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') some_builder = Builder.get(Builder.create('some-builder', 'Some Builder')) some_test = Test.update_or_insert('some-test', some_branch, some_platform, 'runs/s') builds, results = self._create_results(some_branch, some_platform, some_builder, 'some-test', [50.0, 51.0, 52.0, 49.0, 48.0]) value = json.loads(Runs.update_or_insert(some_branch, some_platform, some_test).to_json()) self.assertEqual(value['unit'], 'runs/s')
def test_value_with_hidden_platform_and_tesst(self): webkit_trunk = Branch.create_if_possible('webkit-trunk', 'WebKit trunk') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') hidden_platform = Platform.create_if_possible('hidden-platform', 'Hidden Platform') hidden_platform.hidden = True hidden_platform.put() Test.update_or_insert('some-test', webkit_trunk, some_platform) Test.update_or_insert('some-test', webkit_trunk, hidden_platform) Test.update_or_insert('other-test', webkit_trunk, some_platform) Test.update_or_insert('other-test', webkit_trunk, hidden_platform) Test.update_or_insert('hidden-test', webkit_trunk, some_platform) Test.update_or_insert('hidden-test', webkit_trunk, hidden_platform) hidden_test = Test.get_by_key_name('hidden-test') hidden_test.hidden = True hidden_test.put() self.assertEqual(DashboardJSONGenerator().value()['platformToId'], {'Some Platform': some_platform.id}) self.assertEqual(DashboardJSONGenerator().value()['testToId'], {'some-test': Test.get_by_key_name('some-test').id, 'other-test': Test.get_by_key_name('other-test').id})
def test_platform(self): log = self._create_log_with_payload('{"key": "value"}') self.assertEqual(log.platform(), None) log = self._create_log_with_payload('{"platform": "some-platform"}') self.assertEqual(log.platform(), None) platform = Platform.create_if_possible("some-platform", "Some Platform") log = self._create_log_with_payload('{"platform": "some-platform"}') self.assertEqual(log.platform().key(), platform.key())
def test_update_or_insert(self): branch = Branch.create_if_possible('some-branch', 'Some Branch') platform = Platform.create_if_possible('some-platform', 'Some Platform') self.assertThereIsNoInstanceOf(Test) test = Test.update_or_insert('some-test', branch, platform) self.assertTrue(test) self.assertEqual(test.branches, [branch.key()]) self.assertEqual(test.platforms, [platform.key()]) self.assertOnlyInstance(test)
def test_value_two_platforms(self): some_branch = Branch.create_if_possible('some-branch', 'Some Branch') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') other_platform = Platform.create_if_possible('other-platform', 'Other Platform') some_test = Test.update_or_insert('some-test', some_branch, some_platform) self._assert_single_test(ManifestJSONGenerator().value(), some_branch, some_platform, some_test) some_test = Test.update_or_insert('some-test', some_branch, other_platform) self.assertEqualUnorderedList(some_test.platforms, [some_platform.key(), other_platform.key()]) value = ManifestJSONGenerator().value() expected_platform_ids = [some_platform.id, other_platform.id] self.assertEqualUnorderedList(value.keys(), ['branchMap', 'platformMap', 'testMap']) self.assertEqualUnorderedList(value['branchMap'], {some_branch.id: {'name': some_branch.name, 'testIds': [some_test.id], 'platformIds': expected_platform_ids}}) self.assertEqual(value['platformMap'], {some_platform.id: {'name': some_platform.name, 'branchIds': [some_branch.id], 'testIds': [some_test.id]}, other_platform.id: {'name': other_platform.name, 'branchIds': [some_branch.id], 'testIds': [some_test.id]}}) self.assertEqual(value['testMap'], {some_test.id: {'name': some_test.name, 'branchIds': [some_branch.id], 'platformIds': expected_platform_ids}})
def test_value_without_results(self): some_branch = Branch.create_if_possible('some-branch', 'Some Branch') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') self.assertThereIsNoInstanceOf(Test) self.assertThereIsNoInstanceOf(TestResult) self.assertEqual(Runs(some_branch, some_platform, 'some-test').value(), { 'test_runs': [], 'averages': {}, 'min': None, 'max': None, 'date_range': None, 'stat': 'ok'})
def test_to_json_without_results(self): some_branch = Branch.create_if_possible('some-branch', 'Some Branch') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') some_test = Test.update_or_insert('some-test', some_branch, some_platform) self.assertOnlyInstance(some_test) self.assertThereIsNoInstanceOf(TestResult) self.assertEqual(json.loads(Runs.update_or_insert(some_branch, some_platform, some_test).to_json()), { 'test_runs': [], 'averages': {}, 'min': None, 'max': None, 'date_range': None, 'stat': 'ok'})
def test_to_json_without_results(self): some_branch = Branch.create_if_possible('some-branch', 'Some Branch') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') some_test = Test.update_or_insert('some-test', some_branch, some_platform) self.assertOnlyInstance(some_test) self.assertThereIsNoInstanceOf(TestResult) self.assertEqual(json.loads(Runs.update_or_insert(some_branch, some_platform, some_test).to_json()), { 'test_runs': [], 'averages': {}, 'min': None, 'max': None, 'unit': None, 'date_range': None, 'stat': 'ok'})
def test_generate_runs(self): some_branch = Branch.create_if_possible('some-branch', 'Some Branch') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') some_builder = Builder.get(Builder.create('some-builder', 'Some Builder')) results = self._create_results(some_branch, some_platform, some_builder, 'some-test', [50.0, 51.0, 52.0, 49.0, 48.0]) last_i = 0 for i, (build, result) in enumerate(Runs._generate_runs(some_branch, some_platform, "some-test")): self.assertEqual(build.buildNumber, i) self.assertEqual(build.revision, 100 + i) self.assertEqual(result.name, 'some-test') self.assertEqual(result.value, results[i].value) last_i = i self.assertTrue(last_i + 1, len(results))
def test_platform_games(self): p1 = Platform(name="Commodore 64", short="C64") p2 = Platform(name="Game Boy", short="GB") self.session.add(p1) self.session.add(p2) g1 = Game(name="A Random Game") g2 = Game(name="A Random Game 2") g3 = Game(name="A Random Game 2: Spinoff") g4 = Game(name="A Random Game 3: Return of the Jedi") g1.platforms.append(p1) g2.platforms.append(p1) g3.platforms.append(p2) g4.platforms.append(p1) g4.platforms.append(p2) self.session.add(g1) self.session.add(g2) self.session.add(g3) self.session.add(g4) self.assertEqual(len(p1.games.all()), 3) self.assertEqual(len(p2.games.all()), 2)
def test_value_two_platforms(self): webkit_trunk = Branch.create_if_possible('webkit-trunk', 'WebKit trunk') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') other_platform = Platform.create_if_possible('other-platform', 'Other Platform') Test.update_or_insert('some-test', webkit_trunk, some_platform) Test.update_or_insert('some-test', webkit_trunk, other_platform) self.assertEqual( DashboardJSONGenerator().value(), { 'defaultBranch': 'WebKit trunk', 'branchToId': { 'WebKit trunk': webkit_trunk.id }, 'platformToId': { 'Some Platform': some_platform.id, 'Other Platform': other_platform.id }, 'testToId': { 'some-test': Test.get_by_key_name('some-test').id }, })
def get(self, platform_name): """List all existing campaigns available on a given platform.""" @ndb.tasklet def callback(platform): campaign, platforms = yield platform.campaign.get_async(), \ Platform.query(Platform.campaign == platform.campaign, projection=[Platform.name, Platform.counter]).order( Platform.name).fetch_async(3) raise ndb.Return(campaign_to_dict(campaign, platforms=platforms)) query = Platform.query(Platform.name == platform_name, projection=[Platform.campaign]) output = query.map(callback) return output
def test_game_platform_model_creation_2(self): c = Company.Company(*TestModels.test_company) db.session.add(c) db.session.commit() new_platform = Platform.Platform(1, "test platform") db.session.add(new_platform) db.session.commit() new_game_platform = Game_Platform.Game_Platform(1, 1) try: db.session.add(new_game_platform) db.session.commit() assert (False) except Exception as e: db.session.rollback()
def test_value_single_platform(self): some_branch = Branch.create_if_possible('some-branch', 'Some Branch') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') self.assertEqual(ManifestJSONGenerator().value(), { 'branchMap': {}, 'platformMap': {}, 'testMap': {} }) some_test = Test.update_or_insert('some-test', some_branch, some_platform) self._assert_single_test(ManifestJSONGenerator().value(), some_branch, some_platform, some_test)
def test_value_with_hidden_platform_and_test(self): some_branch = Branch.create_if_possible('some-branch', 'Some Branch') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') hidden_platform = Platform.create_if_possible('hidden-platform', 'Hidden Platform') hidden_platform.hidden = True hidden_platform.put() Test.update_or_insert('some-test', some_branch, some_platform) some_test = Test.update_or_insert('some-test', some_branch, hidden_platform) Test.update_or_insert('hidden-test', some_branch, some_platform) hidden_test = Test.update_or_insert('hidden-test', some_branch, hidden_platform) hidden_test.hidden = True hidden_test.put() value = ManifestJSONGenerator().value() expected_test_ids = [] self.assertEqualUnorderedList(value.keys(), ['branchMap', 'platformMap', 'testMap']) self.assertEqual(value['branchMap'], {some_branch.id: {'name': some_branch.name, 'testIds': [some_test.id], 'platformIds': [some_platform.id]}}) self.assertEqual(value['platformMap'], {some_platform.id: {'name': some_platform.name, 'branchIds': [some_branch.id], 'testIds': [some_test.id]}}) self.assertEqual(value['testMap'], {some_test.id: {'name': some_test.name, 'branchIds': [some_branch.id], 'platformIds': [some_platform.id]}})
def test_generate_runs(self): some_branch = Branch.create_if_possible('some-branch', 'Some Branch') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') some_builder = Builder.get(Builder.create('some-builder', 'Some Builder')) some_test = Test.update_or_insert('some-test', some_branch, some_platform) builds, results = self._create_results(some_branch, some_platform, some_builder, 'some-test', [50.0, 51.0, 52.0, 49.0, 48.0]) last_i = 0 for i, (build, result) in enumerate(Runs._generate_runs(some_branch, some_platform, some_test)): self.assertEqual(build.buildNumber, i) self.assertEqual(build.revision, 100 + i) self.assertEqual(result.name, 'some-test') self.assertEqual(result.value, results[i].value) last_i = i self.assertTrue(last_i + 1, len(results))
def test_chart_params_with_value(self): some_branch = Branch.create_if_possible('some-branch', 'Some Branch') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') some_builder = Builder.get( Builder.create('some-builder', 'Some Builder')) some_test = Test.update_or_insert('some-test', some_branch, some_platform) start_time = datetime(2011, 2, 21, 12, 0, 0) end_time = datetime(2011, 2, 28, 12, 0, 0) results = self._create_results( some_branch, some_platform, some_builder, 'some-test', [50.0, 51.0, 52.0, 49.0, 48.0, 51.9, 50.7, 51.1], [start_time + timedelta(day) for day in range(0, 8)]) # Use int despite of its impreciseness since tests may fail due to rounding errors otherwise. def split_as_int(string): return [int(float(value)) for value in string.split(',')] params = Runs.update_or_insert(some_branch, some_platform, some_test).chart_params(7, end_time) self.assertEqual( params['chxl'], '0:|Feb 21|Feb 22|Feb 23|Feb 24|Feb 25|Feb 26|Feb 27|Feb 28') self.assertEqual(split_as_int(params['chxr']), [1, 0, 57, int(52 * 1.1 / 5 + 0.5)]) x_min, x_max, y_min, y_max = split_as_int(params['chds']) self.assertEqual(datetime.fromtimestamp(x_min), start_time) self.assertEqual(datetime.fromtimestamp(x_max), end_time) self.assertEqual(y_min, 0) self.assertEqual(y_max, int(52 * 1.1)) self.assertEqual(split_as_int(params['chg']), [int(100 / 7), 20, 0, 0]) params = Runs.update_or_insert(some_branch, some_platform, some_test).chart_params(14, end_time) self.assertEqual( params['chxl'], '0:|Feb 14|Feb 16|Feb 18|Feb 20|Feb 22|Feb 24|Feb 26|Feb 28') self.assertEqual(split_as_int(params['chxr']), [1, 0, 57, int(52 * 1.1 / 5 + 0.5)]) x_min, x_max, y_min, y_max = split_as_int(params['chds']) self.assertEqual(datetime.fromtimestamp(x_min), datetime(2011, 2, 14, 12, 0, 0)) self.assertEqual(datetime.fromtimestamp(x_max), end_time) self.assertEqual(y_min, 0) self.assertEqual(y_max, int(52 * 1.1)) self.assertEqual(split_as_int(params['chg']), [int(100 / 7), 20, 0, 0])
def setUp(self): self.pf_source_mock = MagicMock() self.scraper = Scraper("www.platform.url", "Test Platform", "tp", [self.pf_source_mock]) # don't know how to mock properly yet so mocking out db # operations using partial mock. self.scraper.get_platform = MagicMock(name="get_platform") self.db_platform = Platform() self.scraper.get_platform.return_value = self.db_platform self.save_mock = MagicMock(name="save_batch") self.scraper.save_batch = self.save_mock self.logger_mock = Mock() get_logger_mock = Mock(return_value=self.logger_mock) self.scraper.get_logger = get_logger_mock
def test_to_json_with_unit(self): some_branch = Branch.create_if_possible('some-branch', 'Some Branch') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') some_builder = Builder.get( Builder.create('some-builder', 'Some Builder')) some_test = Test.update_or_insert('some-test', some_branch, some_platform, 'runs/s') builds, results = self._create_results(some_branch, some_platform, some_builder, 'some-test', [50.0, 51.0, 52.0, 49.0, 48.0]) value = json.loads( Runs.update_or_insert(some_branch, some_platform, some_test).to_json()) self.assertEqual(value['unit'], 'runs/s')
def test_run_from_build_and_result(self): branch = Branch.create_if_possible('some-branch', 'Some Branch') platform = Platform.create_if_possible('some-platform', 'Some Platform') builder = Builder.get(Builder.create('some-builder', 'Some Builder')) test_name = ' some-test' def create_build(build_number, revision): timestamp = datetime.now().replace(microsecond=0) build = Build(branch=branch, platform=platform, builder=builder, buildNumber=build_number, revision=revision, timestamp=timestamp) build.put() return build build = create_build(1, 101) result = TestResult(name=test_name, value=123.0, build=build) result.put() self._assert_entry(Runs._entry_from_build_and_result(build, result), build, result, 123.0) build = create_build(2, 102) result = TestResult(name=test_name, value=456.0, valueMedian=789.0, build=build) result.put() self._assert_entry(Runs._entry_from_build_and_result(build, result), build, result, 456.0) result.valueStdev = 7.0 result.put() self._assert_entry(Runs._entry_from_build_and_result(build, result), build, result, 456.0) result.valueStdev = None result.valueMin = 123.0 result.valueMax = 789.0 result.put() self._assert_entry(Runs._entry_from_build_and_result(build, result), build, result, 456.0) result.valueStdev = 8.0 result.valueMin = 123.0 result.valueMax = 789.0 result.put() self._assert_entry(Runs._entry_from_build_and_result(build, result), build, result, 456.0, statistics={'stdev': 8.0, 'min': 123.0, 'max': 789.0}) result.valueMedian = 345.0 # Median is never used by the frontend. result.valueStdev = 8.0 result.valueMin = 123.0 result.valueMax = 789.0 result.put() self._assert_entry(Runs._entry_from_build_and_result(build, result), build, result, 456.0, statistics={'stdev': 8.0, 'min': 123.0, 'max': 789.0})
def test_value_two_tests(self): some_branch = Branch.create_if_possible('some-branch', 'Some Branch') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') some_test = Test.update_or_insert('some-test', some_branch, some_platform) self._assert_single_test(ManifestJSONGenerator().value(), some_branch, some_platform, some_test) other_test = Test.update_or_insert('other-test', some_branch, some_platform) value = ManifestJSONGenerator().value() expected_test_ids = [some_test.id, other_test.id] self.assertEqualUnorderedList(value.keys(), ['branchMap', 'platformMap', 'testMap']) self.assertEqual( value['branchMap'], { some_branch.id: { 'name': some_branch.name, 'testIds': expected_test_ids, 'platformIds': [some_platform.id] } }) self.assertEqual( value['platformMap'], { some_platform.id: { 'name': some_platform.name, 'branchIds': [some_branch.id], 'testIds': expected_test_ids } }) self.assertEqual( value['testMap'], { some_test.id: { 'name': some_test.name, 'branchIds': [some_branch.id], 'platformIds': [some_platform.id] }, other_test.id: { 'name': other_test.name, 'branchIds': [some_branch.id], 'platformIds': [some_platform.id] } })
def process_id(upload_id): from run import config # Fetch upload id queued_sample = QueuedSample.query.filter( QueuedSample.id == upload_id).first() if queued_sample is not None: if queued_sample.user_id == g.user.id: # Allowed to process versions = CCExtractorVersion.query.all() form = FinishQueuedSampleForm(request.form) form.version.choices = [(v.id, v.version) for v in versions] if form.validate_on_submit(): # Store in DB db_committed = False temp_path = os.path.join(config.get('SAMPLE_REPOSITORY', ''), 'QueuedFiles', queued_sample.filename) final_path = os.path.join(config.get('SAMPLE_REPOSITORY', ''), 'TestFiles', queued_sample.filename) try: extension = queued_sample.extension[1:] if len( queued_sample.extension) > 0 else "" sample = Sample(queued_sample.sha, extension, queued_sample.original_name) g.db.add(sample) g.db.flush([sample]) uploaded = Upload(g.user.id, sample.id, form.version.data, Platform.from_string(form.platform.data), form.parameters.data, form.notes.data) g.db.add(uploaded) g.db.delete(queued_sample) g.db.commit() db_committed = True except: traceback.print_exc() g.db.rollback() # Move file if db_committed: os.rename(temp_path, final_path) return redirect( url_for('sample.sample_by_id', sample_id=sample.id)) return {'form': form, 'queued_sample': queued_sample} # Raise error raise QueuedSampleNotFoundException()
def delete(self, campaign_id): """Delete the existing campaign.""" campaign_id = int(campaign_id) campaign = Campaign.get_by_id(campaign_id) if campaign: # delete the campaign first, so that updates are not possible futures = [campaign.key.delete_async()] # delete all platforms that correspond to the campaign futures.extend( ndb.delete_multi_async([ platform.key for platform in Platform.query( Platform.campaign == campaign.key).fetch(3) ])) Future.wait_all(futures) else: # the campaign does not exist, just send 204 self.response.status_int = 204
def test_json_by_ids(self): some_branch = Branch.create_if_possible('some-branch', 'Some Branch') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') some_builder = Builder.get(Builder.create('some-builder', 'Some Builder')) some_test = Test.update_or_insert('some-test', some_branch, some_platform) self._create_results(some_branch, some_platform, some_builder, 'some-test', [50.0]) runs = Runs.update_or_insert(some_branch, some_platform, some_test) runs_json = runs.to_json() key_name = Runs._key_name(some_branch.id, some_platform.id, some_test.id) self.assertEqual(Runs.json_by_ids(some_branch.id, some_platform.id, some_test.id), runs_json) self.assertEqual(memcache.get(key_name), runs_json) memcache.set(key_name, 'blah') self.assertEqual(Runs.json_by_ids(some_branch.id, some_platform.id, some_test.id), 'blah') memcache.delete(key_name) self.assertEqual(Runs.json_by_ids(some_branch.id, some_platform.id, some_test.id), runs_json) self.assertEqual(memcache.get(key_name), runs_json)
def __init__(self): # FIXME: Don't hard-code webkit-trunk here; ideally we want this be customizable. webkit_trunk = Branch.get_by_key_name('webkit-trunk') if not webkit_trunk: self._dashboard = None return # FIXME: Determine popular branches, platforms, and tests self._dashboard = { 'defaultBranch': 'WebKit trunk', 'branchToId': {webkit_trunk.name: webkit_trunk.id}, 'platformToId': {}, 'testToId': {}, } for platform in Platform.all(): self._dashboard['platformToId'][platform.name] = platform.id for test in Test.all(): self._dashboard['testToId'][test.name] = test.id
def test_update_or_insert(self): some_branch = Branch.create_if_possible('some-branch', 'Some Branch') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') some_builder = Builder.get( Builder.create('some-builder', 'Some Builder')) some_test = Test.update_or_insert('some-test', some_branch, some_platform) self.assertThereIsNoInstanceOf(Runs) runs = Runs.update_or_insert(some_branch, some_platform, some_test) self.assertOnlyInstance(runs) self.assertEqual(runs.json_runs, '') self.assertEqual(runs.json_averages, '') self.assertEqual(runs.json_min, None) self.assertEqual(runs.json_max, None) old_memcache_value = memcache.get( Runs._key_name(some_branch.id, some_platform.id, some_test.id)) self.assertTrue(old_memcache_value) runs.delete() self.assertThereIsNoInstanceOf(Runs) builds, results = self._create_results(some_branch, some_platform, some_builder, 'some-test', [50.0]) runs = Runs.update_or_insert(some_branch, some_platform, some_test) self.assertOnlyInstance(runs) self.assertTrue(runs.json_runs.startswith('[5, [4, 0, 100, null],')) self.assertEqual(json.loads('{' + runs.json_averages + '}'), {"100": 50.0}) self.assertEqual(runs.json_min, 50.0) self.assertEqual(runs.json_max, 50.0) self.assertNotEqual( memcache.get( Runs._key_name(some_branch.id, some_platform.id, some_test.id)), old_memcache_value)
def increase_user_resource(total_fee: int, out_trade_no: str, transaction_id: str, attach: str): # 根据out_trade_no检查数据库订单 order = Order.get(out_trade_no=out_trade_no) assert order assert not order.is_paid() account = Account.get(user_id=order.user_id, platform_id=order.platform_id) assert account # 计算时长叠加 tariff = Tariff.attach_to_tariff(attach) before = account.expired_at after = tariff.increase_duration(before) with transaction.atomic(): # 变更免费资源 account.update(expired_at=after) # 变更订单状态 和 微信订单号 order.update(status=Order.Status.PAID.value, transaction_id=transaction_id) # 插入免费资源历史变更表 ResourceChange.create(user_id=account.user_id, out_trade_no=order.out_trade_no, before=before, after=after) log.i( f"UPDATE orders SET status = '{order.status}', transaction_id = '{transaction_id}' WHERE out_trade_no = '{out_trade_no}'" ) # 公众号消息通知owner platform = Platform.get(platform_id=account.platform_id) user = User.get(user_id=account.user_id) owner = User.get(user_id=platform.owner_user_id) WePush.notify_owner_order_paid(platform_id=platform.platform_id, openid=owner.openid, total_fee=order.total_fee, nickname=user.nickname, paid_at=order.updated_at, trade_no=out_trade_no)
def __init__(self): # FIXME: Don't hard-code webkit-trunk here; ideally we want this be customizable. webkit_trunk = Branch.get_by_key_name('webkit-trunk') if not webkit_trunk: self._dashboard = None return # FIXME: Determine popular branches, platforms, and tests self._dashboard = { 'defaultBranch': 'WebKit trunk', 'branchToId': { webkit_trunk.name: webkit_trunk.id }, 'platformToId': {}, 'testToId': {}, } for platform in Platform.all(): if not platform.hidden: self._dashboard['platformToId'][platform.name] = platform.id for test in Test.all(): if not test.hidden: self._dashboard['testToId'][test.name] = test.id
def test_results_in_array(self): platform = Platform.create_if_possible("some-platform", "Some Platform") log = self._create_log_with_payload('[{"platform": "some-platform", "build-number": 123, "webkit-revision": 456}]') self.assertEqual(log.platform().key(), platform.key()) self.assertEqual(log.build_number(), 123) self.assertEqual(log.webkit_revision(), 456)
def process_id(upload_id): """ Process the sample that is uploaded to the platform :param upload_id: The identity of uploaded file that will be processed :type upload_id: str :return: Process progress in form and queue the sample :rtype: str """ from run import config, log # Fetch upload id queued_sample = QueuedSample.query.filter( QueuedSample.id == upload_id).first() if queued_sample is not None: if queued_sample.user_id == g.user.id: # Allowed to process versions = CCExtractorVersion.query.all() form = FinishQueuedSampleForm(request.form) form.version.choices = [(v.id, v.version) for v in versions] if form.validate_on_submit(): # Store in DB db_committed = False repo_folder = config.get('SAMPLE_REPOSITORY', '') temp_path = os.path.join(repo_folder, 'QueuedFiles', queued_sample.filename) final_path = os.path.join(repo_folder, 'TestFiles', queued_sample.filename) try: extension = queued_sample.extension[1:] if len( queued_sample.extension) > 0 else "" sample = Sample(queued_sample.sha, extension, queued_sample.original_name) g.db.add(sample) g.db.flush([sample]) uploaded = Upload(g.user.id, sample.id, form.version.data, Platform.from_string(form.platform.data), form.parameters.data, form.notes.data) g.db.add(uploaded) g.db.delete(queued_sample) g.db.commit() db_committed = True except Exception: traceback.print_exc() g.db.rollback() # Move file if db_committed: if form.report.data == 'y': data = "" try: kvm_name = config.get('KVM_LINUX_NAME', '') repo = Repo( os.path.join(repo_folder, 'vm_data', kvm_name, 'unsafe-ccextractor')) data = repo.git.show('{branch}:{file}'.format( branch=repo.heads.master, file='.github/ISSUE_TEMPLATE.md')) except InvalidGitRepositoryError: log.critical( " Could not open CCExtractor's repository ") version = CCExtractorVersion.query.filter( CCExtractorVersion.id == form.version.data).first() data = data.replace('**X.X**', version.version) data = data.replace('[ ] I have read', '[X] I have read') data = data.replace('[ ] I have checked', '[X] I have checked') data = data.replace('[ ] I have used', '[X] I have used') data = data.replace( '[ ] I am an active contributor to CCExtractor.', '[X] I used the platform to submit this issue!') data = data.replace( '`-autoprogram`', '`{param}`'.format(param=form.parameters.data, version=form.version.data)) platform = form.platform.data.title() data = data.replace('[ ] ' + platform, '[X] ' + platform) # Remove everything starting from the video links data = data[:data.find('**Video links**')] # Append our own content here sample_link = url_for('sample.sample_by_id', sample_id=sample.id, _external=True) data += '**Sample**\n\n[Sample {id}]({link}) was uploaded on the sample platform.\n'.format( id=sample.id, link=sample_link) data += '**Extra information**\n\n*Notes:*\n{notes}\n*Description:*\n{desc}'.format( notes=form.notes.data, desc=form.IssueBody.data) issue_title = '[BUG] {data}'.format( data=form.IssueTitle.data) issue_upload = make_github_issue( issue_title, data, ['bug', 'sample' + str(sample.id)]) if issue_upload != 'ERROR': issue_data = json.loads(issue_upload) issue_id = issue_data['number'] issue_title = issue_data['title'] issue_user = issue_data['user']['login'] issue_date = issue_data['created_at'] issue_status = issue_data['state'] issue = Issue(sample.id, issue_id, issue_date, issue_title, issue_user, issue_status) g.db.add(issue) g.db.commit() else: flash( 'Could not submit an issue on GitHub (did you revoke permissions for the platform?).' ' Please submit it manually.') os.rename(temp_path, final_path) return redirect( url_for('sample.sample_by_id', sample_id=sample.id)) return {'form': form, 'queued_sample': queued_sample} # Raise error raise QueuedSampleNotFoundException()
def callback(platform): campaign, platforms = yield platform.campaign.get_async(), \ Platform.query(Platform.campaign == platform.campaign, projection=[Platform.name, Platform.counter]).order( Platform.name).fetch_async(3) raise ndb.Return(campaign_to_dict(campaign, platforms=platforms))
def test_update_incrementally(self): some_branch = Branch.create_if_possible('some-branch', 'Some Branch') some_platform = Platform.create_if_possible('some-platform', 'Some Platform') some_builder = Builder.get( Builder.create('some-builder', 'Some Builder')) some_test = Test.update_or_insert('some-test', some_branch, some_platform) self.assertThereIsNoInstanceOf(Runs) timestamps = [datetime.now(), datetime.now()] builds, results = self._create_results(some_branch, some_platform, some_builder, 'some-test', [50.0, 52.0], timestamps) runs = Runs.update_or_insert(some_branch, some_platform, some_test) self.assertOnlyInstance(runs) self.assertEqual( json.loads('[' + runs.json_runs + ']'), [[ 5, [4, 0, 100, None], mktime(timestamps[0].timetuple()), 50.0, 0, [], None, None ], [ 7, [6, 1, 101, None], mktime(timestamps[1].timetuple()), 52.0, 0, [], None, None ]]) self.assertEqual(json.loads('{' + runs.json_averages + '}'), { "100": 50.0, "101": 52.0 }) self.assertEqual(runs.json_min, 50.0) self.assertEqual(runs.json_max, 52.0) timestamps.append(datetime.now()) builds, results = self._create_results(some_branch, some_platform, some_builder, 'some-test', [48.0], timestamps[2:], starting_revision=102) runs.update_incrementally(builds[0], results[0]) self.assertOnlyInstance(runs) self.assertEqual( json.loads('[' + runs.json_runs + ']'), [[ 5, [4, 0, 100, None], mktime(timestamps[0].timetuple()), 50.0, 0, [], None, None ], [ 7, [6, 1, 101, None], mktime(timestamps[1].timetuple()), 52.0, 0, [], None, None ], [ 9, [8, 0, 102, None], mktime(timestamps[2].timetuple()), 48.0, 0, [], None, None ]]) self.assertEqual(json.loads('{' + runs.json_averages + '}'), { "100": 50.0, "101": 52.0, "102": 48.0 }) self.assertEqual(runs.json_min, 48.0) self.assertEqual(runs.json_max, 52.0)
def get(self, campaign_id, platform_name): """Retrieves the number of clicks for given campaign on the given platform.""" campaign_id = int(campaign_id) platform = Platform.get_by_id("%d-%s" % (campaign_id, platform_name)) return platform_to_dict(platform)
def get_reply_msg(): # 被动回复 https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Passive_user_reply_message.html if isinstance(msg, SubscribeScanEvent) or isinstance( msg, ScanEvent): # 未关注用户扫描带参数二维码事件 - 订阅关注 # 已关注用户扫描带参数二维码事件 platform_id = int(msg.scene_id) platform = Platform.get(platform_id=platform_id) assert platform user = User.get(openid=from_user_openid) if not user: # 创建 user user = User.create(openid=from_user_openid, bind_platform_id=platform.platform_id) else: # user 表记录, 存在 if user.bind_platform_id != platform.platform_id: log.w( f'platform_id change: {user.bind_platform_id} -> {platform.platform_id}, openid: {user.openid}' ) user.update(bind_platform_id=platform.platform_id) account = Account.get(user_id=user.user_id, platform_id=user.bind_platform_id) if not account: # 创建 account username = MyRandom.random_digit(length=8) expired_at = Datetime.localtime() + datetime.timedelta( days=1) # 新账户一天内免费 account = Account.create( user_id=user.user_id, platform_id=user.bind_platform_id, username=username, password=username, radius_password=username, role=Account.Role.PAY_USER.value, expired_at=expired_at, ) sentry_sdk.capture_message( f'有用户扫描带参数二维码, platform_id: {platform.platform_id}, openid: {from_user_openid}' ) # 判断是否允许房东注册 if platform.platform_id == settings.ADMIN_PLATFORM_ID: redis = get_redis() if redis.get('enable_platform_register'): # 新创建平台 new_platform = create_new_platform( user_id=user.user_id) platform_url = f'{settings.API_SERVER_URL}/platform/{new_platform.platform_id}' sentry_sdk.capture_message( f'房东平台已建立, platform_url: {platform_url}') redis.delete('enable_platform_register') # 应答 return TextReply( source=appid, target=from_user_openid, content= f'账号: {account.username}\n密码: {account.password}\n状态: {account.status}' ) if isinstance(msg, ClickEvent): # 点击按钮 - 账号中心 if msg.key == WeClient.ACCOUNT_VIEW_BTN_EVENT: user = User.get(openid=from_user_openid) if not user or user.bind_platform_id is None: # 用户未经扫码, 进入公众号 return TextReply(source=appid, target=from_user_openid, content=f'请先扫描房东的WIFI二维码') else: platform = Platform.get( platform_id=user.bind_platform_id) if platform.is_platform_owner( user_id=user.user_id ) and not settings.is_admin(openid=from_user_openid): # 房东不能打开充值页面, 但 admin 可以 return TextReply(source=appid, target=from_user_openid, content=f'房东不允许打开充值页面') r = ArticlesReply(source=appid, target=from_user_openid) r.add_article({ 'title': f'点击进入', 'description': '查询WIFI密码 / WIFI续费', 'image': 'http://zlxpic.lynatgz.cn/zhuzaiyuan_mini.jpg', 'url': WeClient.ACCOUNT_VIEW_URI, }) return r elif msg.key == WeClient.CUSTOMER_SERVICE_BTN_EVENT: return TextReply(source=appid, target=from_user_openid, content=settings.MP_DEFAULT_REPLY) elif isinstance(msg, SubscribeEvent): # 关注公众号事件 pass elif isinstance(msg, TextMessage): # 文本消息 if msg.content in ['help', '帮助', '命令']: command = [ 'id', '搜索 $name', 'free', '放通mac', '房东注册', ] message = '命令:\n ' + '\n '.join(command) return TextReply(source=appid, target=from_user_openid, content=message) elif msg.content == 'id': # 查看用户ID user = User.get(openid=from_user_openid) messages = [ f'你的信息:', f'openid: {user.openid}', f'user_id: {user.user_id}', ] return TextReply(source=appid, target=from_user_openid, content='\n'.join(messages)) # 以下命令需要 admin 权限 elif msg.content.startswith('搜索') and settings.is_admin( openid=from_user_openid): # 搜索用户信息 name = msg.content.split('搜索')[1].strip() return TextReply( source=appid, target=from_user_openid, content= f'{settings.API_SERVER_URL}/search/user?name={name}') elif msg.content.startswith('放通mac') and settings.is_admin( openid=from_user_openid): redis = get_redis() ex = 60 * 5 redis.set('enable_mac_authentication', str(datetime.datetime.now()), ex=ex) return TextReply(source=appid, target=from_user_openid, content=f'有效时间: {ex}秒') elif msg.content.startswith('房东注册') and settings.is_admin( openid=from_user_openid): redis = get_redis() ex = 60 * 5 redis.set('enable_platform_register', str(datetime.datetime.now()), ex=ex) return TextReply(source=appid, target=from_user_openid, content=f'有效时间: {ex}秒') elif msg.content.startswith('free') and settings.is_admin( openid=from_user_openid): expired_at = Datetime.localtime() + datetime.timedelta( minutes=30) account = Account.get(user_id=0, platform_id=0) if not account: account = Account.create( user_id=0, platform_id=0, username='******', password='******', radius_password='******', role=Account.Role.FREE_USER.value, expired_at=expired_at, ) else: account.update(expired_at=expired_at) content = f'用户名: {account.username}, 密码: {account.password}, 失效时间: {Datetime.to_str(expired_at, fmt="%Y-%m-%d %H:%M:%S")}' return TextReply(source=appid, target=from_user_openid, content=content) else: return TextReply(source=appid, target=from_user_openid, content=settings.MP_DEFAULT_REPLY) return None
def _create_some_builder(): branch = Branch.create_if_possible('some-branch', 'Some Branch') platform = Platform.create_if_possible('some-platform', 'Some Platform') builder_key = Builder.create('some-builder', 'Some Builder') return branch, platform, Builder.get(builder_key)
def __init__(self): # FIXME: This function is massive. Break it up self._test_map = {} platform_id_map = {} branch_id_map = {} for test in Test.all(): if test.hidden: continue branch_ids = [ Branch.get(branch_key).id for branch_key in test.branches ] platform_ids = [ Platform.get(platform_key).id for platform_key in test.platforms ] self._test_map[test.id] = { 'name': test.name, 'branchIds': branch_ids, 'platformIds': platform_ids, } for platform_id in platform_ids: platform_id_map.setdefault(platform_id, { 'tests': [], 'branches': [] }) platform_id_map[platform_id]['tests'].append(test.id) platform_id_map[platform_id]['branches'] += branch_ids for branch_id in branch_ids: branch_id_map.setdefault(branch_id, { 'tests': [], 'platforms': [] }) branch_id_map[branch_id]['tests'].append(test.id) branch_id_map[branch_id]['platforms'] += platform_ids self._platform_map = {} for platform in Platform.all(): if platform.id not in platform_id_map: continue if platform.hidden: for test_id in platform_id_map[platform.id]['tests']: self._test_map[test_id]['platformIds'].remove(platform.id) for branch_id in platform_id_map[platform.id]['branches']: branch_id_map[branch_id]['platforms'].remove(platform.id) continue self._platform_map[platform.id] = { 'name': platform.name, 'testIds': list(set(platform_id_map[platform.id]['tests'])), 'branchIds': list(set(platform_id_map[platform.id]['branches'])), } self._branch_map = {} for branch in Branch.all(): if branch.id not in branch_id_map: continue self._branch_map[branch.id] = { 'name': branch.name, 'testIds': list(set(branch_id_map[branch.id]['tests'])), 'platformIds': list(set(branch_id_map[branch.id]['platforms'])), }
def _create_platform(self, key, name): if not key or not name: return 'Invalid key name' return None if Platform.create_if_possible( key, name) else 'Platform "%s" already exists' % key
def test_update_or_insert_with_unit(self): branch = Branch.create_if_possible('some-branch', 'Some Branch') platform = Platform.create_if_possible('some-platform', 'Some Platform') test = Test.update_or_insert('some-test', branch, platform, 'runs/s') self.assertOnlyInstance(test) self.assertEqualUnorderedList(test.unit, 'runs/s')
def callback(campaign): platforms = yield Platform.query( Platform.campaign == campaign.key, projection=[Platform.name, Platform.counter ]).order(Platform.name).fetch_async(3) raise ndb.Return(campaign_to_dict(campaign, platforms=platforms))
Base.metadata.bind = engine DBSession = sessionmaker(bind=engine) # A DBSession() instance establishes all conversations with the database # and represents a "staging zone" for all the objects loaded into the # database session object. Any change made against the objects in the # session won't be persisted into the database until you call # session.commit(). If you're not happy about the changes, you can # revert all of them back to the last commit by calling # session.rollback() session = DBSession() platform1 = Platform(id=1, user_id=1, name='Playstation', medium='CD', internet_enabled=False, controller_ports=2, manufacturer='Sony', release_date=datetime.date(1994, 12, 3)) session.add(platform1) session.commit() game1 = Game(user_id=1, title='Metal Gear Solid', developer='Konami Computer Entertainment Japan', publisher='Konami', platform_id=1, release_date=datetime.date(1996, 12, 3)) session.add(game1)