def testGet_WithNamespacedKey_ShowsPageWithBothVersions(self): namespaced_stored_object.Set('foo', 'XXXYYY') namespaced_stored_object.SetExternal('foo', 'XXXinternalYYY') response = self.testapp.get('/edit_site_config?key=foo') self.assertEqual(1, len(response.html('form'))) self.assertIn('XXXYYY', response.body) self.assertIn('XXXinternalYYY', response.body)
def testPost_WithKey_UpdatesNamespacedValues(self): namespaced_stored_object.Set('foo', 'XXXinternalYYY') namespaced_stored_object.SetExternal('foo', 'XXXYYY') self.testapp.post('/edit_site_config', { 'key': 'foo', 'external_value': '{"x": "y"}', 'internal_value': '{"x": "yz"}', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) self.assertEqual({'x': 'yz'}, namespaced_stored_object.Get('foo')) self.assertEqual({'x': 'y'}, namespaced_stored_object.GetExternal('foo'))
def SetCache(test_path, rows): """Sets the saved graph revisions data for a test. Args: test_path: A test path string. rows: A list of [revision, value, timestamp] triplets. """ # This first set generally only sets the internal-only cache. namespaced_stored_object.Set(_CACHE_KEY % test_path, rows) # If this is an internal_only query for externally available data, # set the cache for that too. if datastore_hooks.IsUnalteredQueryPermitted(): test = utils.TestKey(test_path).get() if test and not test.internal_only: namespaced_stored_object.SetExternal(_CACHE_KEY % test_path, rows)
def post(self): """Accepts posted values, makes changes, and shows the form again.""" key = self.request.get('key') if not utils.IsInternalUser(): self.RenderHtml('edit_site_config.html', { 'error': 'Only internal users can post to this end-point.' }) return if not key: self.RenderHtml('edit_site_config.html', {}) return new_value_json = self.request.get('value').strip() new_external_value_json = self.request.get('external_value').strip() new_internal_value_json = self.request.get('internal_value').strip() template_params = { 'key': key, 'value': new_value_json, 'external_value': new_external_value_json, 'internal_value': new_internal_value_json, } try: new_value = json.loads(new_value_json or 'null') new_external_value = json.loads(new_external_value_json or 'null') new_internal_value = json.loads(new_internal_value_json or 'null') except ValueError: template_params['error'] = 'Invalid JSON in at least one field.' self.RenderHtml('edit_site_config.html', template_params) return old_value = stored_object.Get(key) old_external_value = namespaced_stored_object.GetExternal(key) old_internal_value = namespaced_stored_object.Get(key) stored_object.Set(key, new_value) namespaced_stored_object.SetExternal(key, new_external_value) namespaced_stored_object.Set(key, new_internal_value) _SendNotificationEmail( key, old_value, old_external_value, old_internal_value, new_value, new_external_value, new_internal_value) self.RenderHtml('edit_site_config.html', template_params)
def testPost_SendsNotificationEmail(self): namespaced_stored_object.SetExternal('foo', {'x': 10, 'y': 2}) namespaced_stored_object.Set('foo', {'z': 3, 'x': 1}) self.testapp.post( '/edit_site_config', { 'key': 'foo', 'external_value': '{"x": 1, "y": 2}', 'internal_value': '{"x": 1, "z": 3, "y": 2}', 'xsrf_token': xsrf.GenerateToken(users.get_current_user()), }) messages = self.mail_stub.get_sent_messages() self.assertEqual(1, len(messages)) self.assertEqual('*****@*****.**', messages[0].sender) self.assertEqual('*****@*****.**', messages[0].to) self.assertEqual('Config "foo" changed by [email protected]', messages[0].subject) self.assertIn( 'Non-namespaced value diff:\n' ' null\n' '\n' 'Externally-visible value diff:\n' ' {\n' '- "x": 10, \n' '? -\n' '\n' '+ "x": 1, \n' ' "y": 2\n' ' }\n' '\n' 'Internal-only value diff:\n' ' {\n' ' "x": 1, \n' '+ "y": 2, \n' ' "z": 3\n' ' }\n', str(messages[0].body))
def post(self): """Accepts posted values, makes changes, and shows the form again.""" key = self.request.get('key') if not utils.IsInternalUser(): self.RenderHtml('edit_site_config.html', { 'error': 'Only internal users can post to this end-point.' }) return if not key: self.RenderHtml('edit_site_config.html', {}) return value = self.request.get('value').strip() external_value = self.request.get('external_value').strip() internal_value = self.request.get('internal_value').strip() template_params = { 'key': key, 'value': value, 'external_value': external_value, 'internal_value': internal_value, } try: if value: stored_object.Set(key, json.loads(value)) if external_value: namespaced_stored_object.SetExternal(key, json.loads(external_value)) if internal_value: namespaced_stored_object.Set(key, json.loads(internal_value)) except ValueError: template_params['error'] = 'Invalid JSON in at least one field.' _SendNotificationEmail(key, template_params) self.RenderHtml('edit_site_config.html', template_params)
def testSetExternal_InternalUser_ExternalVersionSet(self): self.SetCurrentUser('*****@*****.**') namespaced_stored_object.SetExternal('foo', 12345) self.assertIsNone(stored_object.Get('internal_only__foo')) self.assertEqual(12345, stored_object.Get('externally_visible__foo'))