def get_view(self, request): params = self.get_params(request) view = params.get('view') # Explicit request to not use a view if view != 'null': kwargs = { 'archived': False, } if hasattr(request, 'user') and request.user.is_authenticated(): kwargs['user'] = request.user else: if request.session.session_key is None: return DataView() kwargs['session_key'] = request.session.session_key # Assume it is a primary key and fallback to the sesssion try: kwargs['pk'] = int(view) except (ValueError, TypeError): kwargs['session'] = True try: return DataView.objects.get(**kwargs) except DataView.DoesNotExist: pass return DataView()
def test_put(self): # Add a view so we can try to update it later view = DataView(user=self.user, name='Initial Name') view.save() response = self.client.get('/api/views/1/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertTrue(response.content) # Attempt to update the name via a PUT request response = self.client.put('/api/views/1/', data=u'{"name":"New Name"}', content_type='application/json') self.assertEqual(response.status_code, codes.ok) # Make sure our changes from the PUT request are persisted response = self.client.get('/api/views/1/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertTrue(response.content) self.assertEqual(json.loads(response.content)['name'], 'New Name') # Make a PUT request with invalid JSON and make sure we get an # unprocessable status code back. response = self.client.put('/api/views/1/', data=u'{"json":"]]]"}', content_type='application/json') self.assertEqual(response.status_code, codes.unprocessable_entity)
def test_sort_related(self): "Sorts on a reverse foreign key property." view = DataView(json=[ { 'concept': self.first_name.pk }, { 'concept': self.last_name.pk }, { 'concept': self.project_name.pk, 'sort': 'asc', 'visible': False }, ]) queryset = view.apply() exporter = export.BaseExporter(view) exporter.params.insert(0, (RawFormatter(keys=['pk']), 1)) exporter.row_length += 1 self.assertEqual(list(exporter.write(queryset.raw())), [(3, u'Erick', u'Smith'), (4, u'Aaron', u'Harris'), (5, u'Zac', u'Cook'), (6, u'Mel', u'Brooks'), (1, u'Eric', u'Smith'), (2, u'Erin', u'Jones')])
def test_get(self): view = DataView(user=self.user) view.save() view.name = "Fake name" view.save() target_revision_id = Revision.objects.latest().pk view.description = "Terribly vague description" view.save() url = '/api/views/{0}/revisions/{1}/'.format(view.id, target_revision_id) response = self.client.get(url, HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertTrue(response.content) revision = json.loads(response.content) self.assertEqual( revision['changes'], {'name': { 'old_value': None, 'new_value': 'Fake name' }}) self.assertFalse("description" in revision['changes'])
def test_embedded(self): view = DataView(user=self.user, name='My View', description='This is not a descriptive description') view.save() # Retrieve the revisions the normal way and make sure the object # itself is not included. response = self.client.get('/api/views/revisions/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertEqual(len(json.loads(response.content)), 1) no_embed_revision = json.loads(response.content)[0] self.assertFalse('object' in no_embed_revision) # Now retrieve the revisiosn with the embed flag enabled and verify # that the object is now included with the revision. response = self.client.get('/api/views/revisions/', {'embed': True}, HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertEqual(len(json.loads(response.content)), 1) embed_revision = json.loads(response.content)[0] self.assertTrue('object' in embed_revision) # Make sure the included object matches the copy of the object directly # from the object resource itself. response = self.client.get('/api/views/{0}/'.format(view.pk), HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) revision_view = json.loads(response.content) self.assertEqual(revision_view, embed_revision['object'])
def test_put(self): # Add a view so we can try to update it later view = DataView(user=self.user, name='Initial Name') view.save() response = self.client.get('/api/views/{0}/'.format(view.pk), HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertTrue(response.content) # Attempt to update the name via a PUT request response = self.client.put('/api/views/{0}/'.format(view.pk), data=u'{"name":"New Name"}', content_type='application/json') self.assertEqual(response.status_code, codes.ok) # Make sure our changes from the PUT request are persisted response = self.client.get('/api/views/{0}/'.format(view.pk), HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertTrue(response.content) self.assertEqual(json.loads(response.content)['name'], 'New Name') # Make a PUT request with invalid JSON and make sure we get an # unprocessable status code back. response = self.client.put('/api/views/{0}/'.format(view.pk), data=u'{"json":"]]]"}', content_type='application/json') self.assertEqual(response.status_code, codes.unprocessable_entity)
def test_sort_related(self): "Sorts on a reverse foreign key property." view = DataView( json=[ {"concept": self.first_name.pk}, {"concept": self.last_name.pk}, {"concept": self.project_name.pk, "sort": "asc", "visible": False}, ] ) queryset = view.apply() exporter = export.BaseExporter(view) exporter.params.insert(0, (RawFormatter(keys=["pk"]), 1)) exporter.row_length += 1 self.assertEqual( list(exporter.write(queryset.raw())), [ (3, u"Erick", u"Smith"), (4, u"Aaron", u"Harris"), (5, u"Zac", u"Cook"), (6, u"Mel", u"Brooks"), (1, u"Eric", u"Smith"), (2, u"Erin", u"Jones"), ], )
def setUp(self): management.call_command("avocado", "init", "tests", quiet=True) salary_concept = DataField.objects.get(field_name="salary").concepts.all()[0] view = DataView(json={"ordering": [[salary_concept.pk, "desc"]]}) self.query = view.apply(tree=models.Employee).raw() # Ick.. self.exporter = export.BaseExporter(view) self.exporter.params.insert(0, (RawFormatter(keys=["pk"]), 1)) self.exporter.row_length += 1
def test_delete(self): view = DataView(user=self.user, name='View 1') view.save() view = DataView(user=self.user, name='View 2') view.save() view = DataView(user=self.user, name='View 3', session=True) view.save() response = self.client.get('/api/views/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertEqual(len(json.loads(response.content)), 3) response = self.client.delete('/api/views/1/') self.assertEqual(response.status_code, codes.no_content) response = self.client.get('/api/views/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertEqual(len(json.loads(response.content)), 2) response = self.client.delete('/api/views/3/') self.assertEqual(response.status_code, codes.bad_request) response = self.client.get('/api/views/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertEqual(len(json.loads(response.content)), 2)
def test_get(self): view = DataView(user=self.user) view.save() view.name = "Fake name" view.save() target_revision_id = Revision.objects.all().count() view.description = "Terribly vague description" view.save() url = '/api/views/{0}/revisions/{1}/'.format(view.id, target_revision_id) response = self.client.get(url, HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertTrue(response.content) revision = json.loads(response.content) self.assertEqual(revision['changes'], { 'name': { 'old_value': None, 'new_value': 'Fake name' } }) self.assertFalse("description" in revision['changes'])
def setUp(self): management.call_command('avocado', 'init', 'tests', quiet=True) salary_concept = DataField.objects.get( field_name='salary').concepts.all()[0] view = DataView(json={'ordering': [[salary_concept.pk, 'desc']]}) self.query = view.apply(tree=models.Employee).raw() # Ick.. self.exporter = export.BaseExporter(view) self.exporter.params.insert(0, (RawFormatter(keys=['pk']), 1)) self.exporter.row_length += 1
def test_get(self): view = DataView(user=self.user) view.save() response = self.client.get('/api/views/revisions/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertEqual(len(json.loads(response.content)), 1) response = self.client.get('/api/viewss/999/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.not_found)
def test_no_object_model(self): # This will trigger a revision to be created view = DataView(user=self.user) view.save() # Make sure we have a revision for this user self.assertEqual(Revision.objects.filter(user=self.user).count(), 1) response = self.client.get('/api/test/no_model/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertEqual(len(json.loads(response.content)), 0)
def test_bad_urls(self): view = DataView(user=self.user) view.save() target_revision_id = Revision.objects.all().count() url = '/api/test/revisions/{0}/'.format(target_revision_id) response = self.client.get(url, HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.not_found) url = '/api/test/{0}/revisions/'.format(view.id) response = self.client.get(url, HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.not_found)
def test_custom_template(self): view = DataView(user=self.user) view.save() response = self.client.get('/api/test/template/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertEqual(len(json.loads(response.content)), 1) revision = json.loads(response.content)[0] self.assertEqual(revision['id'], 1) self.assertEqual(revision['object_id'], 1) self.assertTrue(response['Link-Template']) self.assertFalse('content_type' in revision)
def test_custom_template(self): view = DataView(user=self.user) view.save() response = self.client.get('/api/test/template/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertEqual(len(json.loads(response.content)), 1) revision = json.loads(response.content)[0] self.assertEqual(revision['id'], 1) self.assertEqual(revision['object_id'], 1) self.assertTrue('_links' in revision) self.assertFalse('content_type' in revision)
def test_dataview_order_by(self): f = DataField(app_name='lexicon', model_name='month', field_name='id') f.save() c = DataConcept() c.save() cf = DataConceptField(field=f, concept=c) cf.save() v = DataView({'ordering': [c.pk]}) qs = Month.objects.filter(label__startswith='J').values('id') self.assertEqual(str(v.apply(qs).query), 'SELECT "lexicon_month"."id" FROM "lexicon_month" WHERE "lexicon_month"."label" LIKE J% ESCAPE \'\\\' ORDER BY "lexicon_month"."order" ASC')
def test_session(self): # This session mumbo-jumbo is from: # https://code.djangoproject.com/ticket/10899 self.client = Client() from django.conf import settings from django.utils.importlib import import_module engine = import_module(settings.SESSION_ENGINE) store = engine.SessionStore() store.save() # we need to make load() work, or the cookie is worthless session_key = store.session_key self.client.cookies[settings.SESSION_COOKIE_NAME] = session_key view = DataView(session_key=self.client.session.session_key) view.save() view2 = DataView(session_key='XYZ') view2.save() self.assertEqual( Revision.objects.filter(content_type=ContentType.objects. get_for_model(DataView)).count(), 2) response = self.client.get('/api/views/revisions/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertEqual(len(json.loads(response.content)), 1)
def test_get(self): view = DataView(user=self.user) view.save() view.name = "Fake name" view.save() view.description = "Terribly vague description" view.save() url = '/api/views/{0}/revisions/'.format(view.id) response = self.client.get(url, HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertEqual(len(json.loads(response.content)), 3)
def test_get(self): view = DataView(user=self.user) view.save() response = self.client.get('/api/views/1/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertTrue(response.content) self.assertLess(view.accessed, DataView.objects.get(pk=view.pk).accessed) # Make sure that accessing a non-existent view returns a 404 error # indicating that it wasn't found. response = self.client.get('/api/views/999/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.not_found)
def test_get(self): view = DataView(user=self.user) view.save() response = self.client.get('/api/views/{0}/'.format(view.pk), HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertTrue(response.content) self.assertLess(view.accessed, DataView.objects.get(pk=view.pk).accessed) # Make sure that accessing a non-existent view returns a 404 error # indicating that it wasn't found. response = self.client.get('/api/views/999/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.not_found)
def test_sort_related(self): "Sorts on a reverse foreign key property." view = DataView(json=[ { 'concept': self.first_name.pk }, { 'concept': self.last_name.pk }, { 'concept': self.project_name.pk, 'sort': 'asc', 'visible': False }, ]) proc = QueryProcessor(view=view) queryset = proc.get_queryset() exporter = proc.get_exporter(export.BaseExporter) iterable = proc.get_iterable(queryset=queryset) reader = exporter.manual_read(iterable) self.assertEqual(list(exporter.write(reader)), [(3, u'Erick', u'Smith'), (4, u'Aaron', u'Harris'), (5, u'Zac', u'Cook'), (6, u'Mel', u'Brooks'), (1, u'Eric', u'Smith'), (2, u'Erin', u'Jones')])
def test_multiple_views(self): dv1 = DataView(session=True, user=self.user) dv1.save() dv2 = DataView(session=True, user=self.user) dv2.save() response = self.client.get('/api/data/preview/', HTTP_ACCEPT='application/json') self.assertTrue(response.content) self.assertEqual(response.status_code, codes.ok)
def test_dataview_order_by(self): f = DataField(app_name='tests', model_name='month', field_name='id') f.save() c = DataConcept() c.save() cf = DataConceptField(field=f, concept=c) cf.save() v = DataView({'ordering': [[c.pk, 'asc']]}) qs = Month.objects.filter(label__startswith='J').values('id') self.assertEqual( unicode(v.apply(qs).query), 'SELECT "tests_month"."id" FROM "tests_month" WHERE "tests_month"."label" LIKE J% ESCAPE \'\\\' ORDER BY "tests_month"."order" ASC' )
def test_no_identifier(self): view = DataView() view.save() # Make sure the revision was created but has nothing useful in # either of the "owner" properties. self.assertEqual(Revision.objects.filter( content_type=ContentType.objects.get_for_model(DataView), user=None, session_key=None).count(), 1) # We want this request to come from an anonymous user self.client.logout() response = self.client.get('/api/views/revisions/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertEqual(len(json.loads(response.content)), 0)
def setUp(self): management.call_command('avocado', 'init', 'tests', quiet=True) # The init command creates concepts named after the fields # by default. c = DataConcept.objects.get(name='First Name') self.v = DataView(json=[{'concept': c.pk}])
def test_clean(self): # Save a default template view = DataView(template=True, default=True) view.save() # Save new template (not default) view2 = DataView(template=True) view2.save() # Try changing it to default view2.default = True self.assertRaises(ValidationError, view2.save) view.save()
def test_export_type(self): context = DataContext() view = DataView() export_type = 'json' query_options = { 'export_type': export_type, } result = utils.get_result_rows(context, view, query_options) self.assertEqual(len(list(result['rows'])), Employee.objects.count()) self.assertEqual(result['export_type'], export_type)
def test_no_identifier(self): view = DataView() view.save() # Make sure the revision was created but has nothing useful in # either of the "owner" properties. self.assertEqual( Revision.objects.filter( content_type=ContentType.objects.get_for_model(DataView), user=None, session_key=None).count(), 1) # We want this request to come from an anonymous user self.client.logout() response = self.client.get('/api/views/revisions/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertEqual(len(json.loads(response.content)), 0)
def test_limit(self): context = DataContext() view = DataView() limit = 2 query_options = { 'limit': limit, 'page': 1, } result = utils.get_result_rows(context, view, query_options) self.assertEqual(len(list(result['rows'])), limit) self.assertEqual(result['limit'], limit)
def test_processor(self): context = DataContext() view = DataView() processor = 'manager' query_options = { 'processor': processor, } result = utils.get_result_rows(context, view, query_options) self.assertEqual(len(list(result['rows'])), Employee.objects.filter(is_manager=True).count()) self.assertTrue(isinstance(result['processor'], ManagerQueryProcessor))
def test_view(self): salary_field = DataField.objects.get_by_natural_key('exporting', 'title', 'salary') salary_concept = DataConcept() salary_concept.save() DataConceptField(concept=salary_concept, field=salary_field, order=1).save() view = DataView(json={'ordering': [[salary_concept.pk, 'desc']]}) query = view.apply(tree=models.Employee).raw() # Ick.. exporter = export.CSVExporter(view) exporter.params.insert(0, (RawFormatter(keys=['pk']), 1)) exporter.row_length += 1 buff = exporter.write(query) buff.seek(0) lines = buff.read().splitlines() # Skip the header self.assertEqual([int(x) for x in lines[1:]], [2, 4, 6, 1, 3, 5])
def test_get_rows(self): context = DataContext() view = DataView() # Unless we tell the function to evaluate the rows, it should return # rows as a generator so we need to exclicitly evaluate it here. result = utils.get_result_rows(context, view, {}) self.assertEqual(len(list(result['rows'])), Employee.objects.count()) # Now, have the method evaluate the rows. result = utils.get_result_rows(context, view, {}, evaluate_rows=True) self.assertEqual(len(result['rows']), Employee.objects.count())
def test_get_order_only(self): field = DataField.objects.get(field_name='salary') concept = field.concepts.all()[0] context = DataContext() view = DataView(json=[{ 'concept': concept.pk, 'visible': False, 'sort': 'desc', }]) result = utils.get_result_rows(context, view, {}) self.assertEqual(len(list(result['rows'])), Employee.objects.count())
def test_session(self): # This session mumbo-jumbo is from: # https://code.djangoproject.com/ticket/10899 self.client = Client() from django.conf import settings from django.utils.importlib import import_module engine = import_module(settings.SESSION_ENGINE) store = engine.SessionStore() store.save() # we need to make load() work, or the cookie is worthless session_key = store.session_key self.client.cookies[settings.SESSION_COOKIE_NAME] = session_key view = DataView(session_key=self.client.session.session_key) view.save() view2 = DataView(session_key='XYZ') view2.save() self.assertEqual(Revision.objects.filter( content_type=ContentType.objects.get_for_model(DataView)).count(), 2) response = self.client.get('/api/views/revisions/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertEqual(len(json.loads(response.content)), 1)
def test_non_existent_revision(self): view = DataView(user=self.user) view.save() view.name = "Fake name" view.save() url = '/api/views/{0}/revisions/{1}/'.format(view.id, 123456789) response = self.client.get(url, HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.not_found)
def test_invalid_job_result(self): context = DataContext() view = DataView() query_options = { 'page': 0, } job_id = utils.async_get_result_rows(context, view, query_options) self.assertTrue(async_utils.get_job_count(), 1) async_utils.run_jobs() time.sleep(1) self.assertEqual(async_utils.get_job_result(job_id), None) self.assertEqual(async_utils.get_job(job_id).status, JobStatus.FAILED)
def test_multiple_context_and_view(self): # Create two Contexts and views, an illegal action that # Our base resource should handle cxt3 = DataContext(session=True, user=self.user) cxt3.save() cxt4 = DataContext(user=self.user, session=True) cxt4.save() dv3 = DataView(session=True, user=self.user) dv3.save() dv4 = DataView(session=True, user=self.user) dv4.save() response = self.client.get('/api/data/preview/', HTTP_ACCEPT='application/json') self.assertTrue(response.content) self.assertEqual(response.status_code, codes.ok)
def test_user(self): view = DataView(user=self.user) view.save() user2 = User.objects.create_user(username='******', password='******') view2 = DataView(user=user2) view2.save() self.assertEqual( Revision.objects.filter(content_type=ContentType.objects. get_for_model(DataView)).count(), 2) response = self.client.get('/api/views/revisions/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertEqual(len(json.loads(response.content)), 1)
def test_embedded(self): view = DataView(user=self.user, name='My View', description='This is not a descriptive description') view.save() # Retrieve the revisions the normal way and make sure the object # itself is not included. response = self.client.get('/api/views/revisions/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertEqual(len(json.loads(response.content)), 1) no_embed_revision = json.loads(response.content)[0] self.assertFalse('object' in no_embed_revision) # Now retrieve the revisiosn with the embed flag enabled and verify # that the object is now included with the revision. response = self.client.get('/api/views/revisions/', {'embed': True}, HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertEqual(len(json.loads(response.content)), 1) embed_revision = json.loads(response.content)[0] self.assertTrue('object' in embed_revision) # Make sure the included object matches the copy of the object directly # from the object resource itself. response = self.client.get('/api/views/1/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) revision_view = json.loads(response.content) # We can't just compare the objects directly to one another because the # object returned from the call to /api/views/1/ will have '_links' # while the embeded object will not because the link location is # different for Revisions. for key in embed_revision['object']: self.assertEqual(revision_view[key], embed_revision['object'][key])
def test_pages(self): context = DataContext() view = DataView() query_options = { 'page': 1, 'stop_page': 10, } result = utils.get_result_rows(context, view, query_options) self.assertEqual(len(list(result['rows'])), Employee.objects.count()) query_options = { 'page': 1, 'stop_page': 1, } result = utils.get_result_rows(context, view, query_options) self.assertEqual(len(list(result['rows'])), Employee.objects.count())
def test_non_existent_object(self): view = DataView(user=self.user) view.save() view.name = "Fake name" view.save() target_revision_id = Revision.objects.latest().pk url = '/api/views/{0}/revisions/{1}/'.format(123456789, target_revision_id) response = self.client.get(url, HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.not_found)
def test_non_existent_object(self): view = DataView(user=self.user) view.save() view.name = "Fake name" view.save() target_revision_id = Revision.objects.all().count() url = '/api/views/{0}/revisions/{1}/'.format(123456789, target_revision_id) response = self.client.get(url, HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.not_found)
def test_user(self): view = DataView(user=self.user) view.save() user2 = User.objects.create_user(username='******', password='******') view2 = DataView(user=user2) view2.save() self.assertEqual(Revision.objects.filter( content_type=ContentType.objects.get_for_model(DataView)).count(), 2) response = self.client.get('/api/views/revisions/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertEqual(len(json.loads(response.content)), 1)
def test_get_session(self): view = DataView(user=self.user, name='Session View', session=True) view.save() response = self.client.get('/api/views/session/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.ok) self.assertTrue(response.content) view.session = False view.save() response = self.client.get('/api/views/session/', HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, codes.not_found)
def test_get_all_default(self): view = DataView(template=True, default=True, json=[]) view.save() response = self.client.get('/api/views/', HTTP_ACCEPT='application/json') self.assertEqual(len(json.loads(response.content)), 1)