def test_views_update(self): cra = Dataset.by_name('cra') views = cra.data['views'] views[0]['label'] = 'Banana' response = self.app.post(url(controller='editor', action='views_update', dataset='cra'), params={'views': json.dumps(views)}, extra_environ={'REMOTE_USER': '******'}, expect_errors=True) assert '200' in response.status, response.status cra = Dataset.by_name('cra') assert 'Banana' in repr(cra.data['views'])
def test_retract(self): cra = Dataset.by_name('cra') assert cra.private is False, cra.private response = self.app.post(url(controller='editor', action='retract', dataset='cra'), extra_environ={'REMOTE_USER': '******'}) cra = Dataset.by_name('cra') assert cra.private is True, cra.private response = self.app.post(url(controller='editor', action='retract', dataset='cra'), extra_environ={'REMOTE_USER': '******'}, expect_errors=True) assert '400' in response.status, response.status
def test_publish(self): cra = Dataset.by_name('cra') cra.private = True db.session.commit() response = self.app.post(url(controller='editor', action='publish', dataset='cra'), extra_environ={'REMOTE_USER': '******'}) cra = Dataset.by_name('cra') assert cra.private is False, cra.private response = self.app.post(url(controller='editor', action='publish', dataset='cra'), extra_environ={'REMOTE_USER': '******'}, expect_errors=True) assert '400' in response.status, response.status
def test_delete(self): cra = Dataset.by_name('cra') assert len(cra) == 36, len(cra) # double-check authz response = self.app.post(url(controller='editor', action='delete', dataset='cra'), expect_errors=True) assert '403' in response.status cra = Dataset.by_name('cra') assert len(cra) == 36, len(cra) response = self.app.post(url(controller='editor', action='delete', dataset='cra'), extra_environ={'REMOTE_USER': '******'}) cra = Dataset.by_name('cra') assert cra is None, cra
def archive_one(dataset_name, archive_dir): """ Find the dataset, create the archive directory and start archiving """ # Find the dataset dataset = Dataset.by_name(dataset_name) # If no dataset found, exit with error message if dataset is None: exit_with_error("Dataset not found. Unable to archive it.") # If the archive_dir exists we have to ask the user if we should overwrite if os.path.exists(archive_dir): # If user doesn't want to write over it we exit if not get_confirmation( "%s exists. Do you want to overwrite?" % archive_dir): sys.exit(0) # If the archive dir is a file we don't do anything if os.path.isfile(archive_dir): exit_with_error("Cannot overwrite a file (need a directory).") # If the archive_dir doesn't exist we create it else: try: os.makedirs(archive_dir) except OSError: # If we couldn't create it, we exit with an error message exit_with_error("Couldn't create archive directory.") # Archive the model (dataset metadata) archive_model(dataset, archive_dir) # Archive the visualisations archive_visualisations(dataset, archive_dir) # Download all sources update(os.path.join(archive_dir, 'sources'), dataset)
def test_index_hide_private(self): cra = Dataset.by_name("cra") cra.private = True db.session.commit() response = self.app.get(url(controller="dataset", action="index", format="json")) obj = json.loads(response.body) h.assert_equal(len(obj["datasets"]), 0)
def create(self): require.dataset.create() try: dataset = dict(request.params) dataset['territories'] = request.params.getall('territories') dataset['languages'] = request.params.getall('languages') model = {'dataset': dataset} schema = dataset_schema(ValidationState(model)) data = schema.deserialize(dataset) if Dataset.by_name(data['name']) is not None: raise Invalid( SchemaNode(String(), name='dataset.name'), _("A dataset with this identifer already exists!")) dataset = Dataset({'dataset': data}) dataset.private = True dataset.managers.append(c.account) db.session.add(dataset) db.session.commit() redirect( h.url_for(controller='editor', action='index', dataset=dataset.name)) except Invalid, i: errors = i.asdict() return self.new(errors)
def test_new_wrong_user(self): # First we add a Dataset with user 'test_new' user = Account.by_name('test_new') assert user.api_key == 'd0610659-627b-4403-8b7f-6e2820ebc95d' u = url(controller='api/version2', action='create') params = { 'metadata': 'https://dl.dropbox.com/u/3250791/sample-openspending-model.json', 'csv_file': 'http://mk.ucant.org/info/data/sample-openspending-dataset.csv' } apikey_header = 'apikey {0}'.format(user.api_key) response = self.app.post(u, params, {'Authorization': apikey_header}) assert "200" in response.status assert Dataset.by_name('openspending-example') # After that we try to update the Dataset with user 'test_new2' user = Account.by_name('test_new2') assert user.api_key == 'c011c340-8dad-419c-8138-1c6ded86ead5' u = url(controller='api/version2', action='create') params = { 'metadata': 'https://dl.dropbox.com/u/3250791/sample-openspending-model.json', 'csv_file': 'http://mk.ucant.org/info/data/sample-openspending-dataset.csv' } apikey_header = 'apikey {0}'.format(user.api_key) response = self.app.post(u, params, {'Authorization': apikey_header}, expect_errors=True) assert '403' in response.status
def permissions(self): """ Check a user's permissions for a given dataset. This could also be done via request to the user, but since we're not really doing a RESTful service we do this via the api instead. """ # Check the parameters. Since we only use one parameter we check it # here instead of creating a specific parameter parser if len(request.params) != 1 or 'dataset' not in request.params: return to_jsonp({'error': 'Parameter dataset missing'}) # Get the dataset we want to check permissions for dataset = Dataset.by_name(request.params['dataset']) # Return permissions return to_jsonp({ "create":\ can.dataset.create() and dataset is None, "read":\ False if dataset is None else can.dataset.read(dataset), "update":\ False if dataset is None else can.dataset.update(dataset), "delete":\ False if dataset is None else can.dataset.delete(dataset) })
def test_index_hide_private(self): cra = Dataset.by_name('cra') cra.private = True db.session.commit() response = self.app.get(url(controller='dataset', action='index', format='json')) obj = json.loads(response.body) h.assert_equal(len(obj['datasets']), 0)
def permissions(self): """ Check a user's permissions for a given dataset. This could also be done via request to the user, but since we're not really doing a RESTful service we do this via the api instead. """ # Check the parameters. Since we only use one parameter we check it # here instead of creating a specific parameter parser if len(request.params) != 1 or 'dataset' not in request.params: return to_jsonp({'error': 'Parameter dataset missing'}) # Get the dataset we want to check permissions for dataset = Dataset.by_name(request.params['dataset']) # Return permissions return to_jsonp({ "create": can.dataset.create() and dataset is None, "read": False if dataset is None else can.dataset.read(dataset), "update": False if dataset is None else can.dataset.update(dataset), "delete": False if dataset is None else can.dataset.delete(dataset) })
def remove_dataset(dataset_name): log.warn("Dropping dataset '%s'", dataset_name) from openspending.model import Dataset, meta as db dataset = Dataset.by_name(dataset_name) dataset.drop() db.session.delete(dataset) db.session.commit()
def test_drop(self): cra = Dataset.by_name('cra') assert len(cra)==36, len(cra) # double-check authz response = self.app.post(url(controller='editor', action='drop', dataset='cra'), expect_errors=True) assert '403' in response.status cra = Dataset.by_name('cra') assert len(cra)==36, len(cra) response = self.app.post(url(controller='editor', action='drop', dataset='cra'), extra_environ={'REMOTE_USER': '******'}) cra = Dataset.by_name('cra') assert len(cra)==0, len(cra)
def archive_one(dataset_name, archive_dir): """ Find the dataset, create the archive directory and start archiving """ # Find the dataset dataset = Dataset.by_name(dataset_name) # If no dataset found, exit with error message if dataset is None: exit_with_error("Dataset not found. Unable to archive it.") # If the archive_dir exists we have to ask the user if we should overwrite if os.path.exists(archive_dir): # If user doesn't want to write over it we exit if not get_confirmation("%s exists. Do you want to overwrite?" % archive_dir): sys.exit(0) # If the archive dir is a file we don't do anything if os.path.isfile(archive_dir): exit_with_error("Cannot overwrite a file (need a directory).") # If the archive_dir doesn't exist we create it else: try: os.makedirs(archive_dir) except OSError: # If we couldn't create it, we exit with an error message exit_with_error("Couldn't create archive directory.") # Archive the model (dataset metadata) archive_model(dataset, archive_dir) # Archive the visualisations archive_visualisations(dataset, archive_dir) # Download all sources update(os.path.join(archive_dir, 'sources'), dataset)
def test_index_hide_private(self): cra = Dataset.by_name('cra') cra.private = True db.session.commit() response = self.app.get(url(controller='dataset', action='index', format='json')) obj = json.loads(response.body) h.assert_equal(len(obj), 0)
def test_new_wrong_user(self): # First we add a Dataset with user 'test_new' user = Account.by_name('test_new') assert user.api_key == 'd0610659-627b-4403-8b7f-6e2820ebc95d' u = url(controller='api/version2', action='create') params = { 'metadata': 'https://dl.dropbox.com/u/3250791/sample-openspending-model.json', 'csv_file': 'http://mk.ucant.org/info/data/sample-openspending-dataset.csv' } apikey_header = 'apikey {0}'.format(user.api_key) response = self.app.post(u, params, {'Authorization':apikey_header}) #Dataset.by_name('openspending-example').private = False assert "200" in response.status assert Dataset.by_name('openspending-example') # After that we try to update the Dataset with user 'test_new2' user = Account.by_name('test_new2') assert user.api_key == 'c011c340-8dad-419c-8138-1c6ded86ead5' u = url(controller='api/version2', action='create') params = { 'metadata': 'https://dl.dropbox.com/u/3250791/sample-openspending-model.json', 'csv_file': 'http://mk.ucant.org/info/data/sample-openspending-dataset.csv' } apikey_header = 'apikey {0}'.format(user.api_key) response = self.app.post(u, params, {'Authorization':apikey_header}, expect_errors=True) assert '403' in response.status
def create(self): """ Adds a new dataset dynamically through a POST request """ # User must be authenticated so we should have a user object in # c.account, if not abort with error message if not c.account: abort(status_code=400, detail='user not authenticated') # Check if the params are there ('metadata', 'csv_file') if len(request.params) != 2: abort(status_code=400, detail='incorrect number of params') metadata = request.params['metadata'] \ if 'metadata' in request.params \ else abort(status_code=400, detail='metadata is missing') csv_file = request.params['csv_file'] \ if 'csv_file' in request.params \ else abort(status_code=400, detail='csv_file is missing') # We proceed with the dataset try: model = json.load(urllib2.urlopen(metadata)) except: abort(status_code=400, detail='JSON model could not be parsed') try: log.info("Validating model") model = validate_model(model) except Invalid as i: log.error("Errors occured during model validation:") for field, error in i.asdict().items(): log.error("%s: %s", field, error) abort(status_code=400, detail='Model is not well formed') dataset = Dataset.by_name(model['dataset']['name']) if dataset is None: dataset = Dataset(model) require.dataset.create() dataset.managers.append(c.account) dataset.private = True # Default value db.session.add(dataset) else: require.dataset.update(dataset) log.info("Dataset: %s", dataset.name) source = Source(dataset=dataset, creator=c.account, url=csv_file) log.info(source) for source_ in dataset.sources: if source_.url == csv_file: source = source_ break db.session.add(source) db.session.commit() # Send loading of source into celery queue load_source.delay(source.id) return to_jsonp(dataset_apply_links(dataset.as_dict()))
def test_view_private(self): cra = Dataset.by_name('cra') cra.private = True db.session.commit() response = self.app.get(url(controller='dataset', action='view', dataset='cra'), status=403) h.assert_false('Country Regional Analysis v2009' in response, "'Country Regional Analysis v2009' not in response!") h.assert_false('36 spending entries' in response, "'36 spending entries' not in response!")
def test_core_update_invalid_label(self): response = self.app.post(url(controller='editor', action='core_update', dataset='cra'), params={'name': 'cra', 'label': '', 'description': 'I\'m a banana', 'currency': 'GBP'}, extra_environ={'REMOTE_USER': '******'}) assert 'Required' in response.body cra = Dataset.by_name('cra') assert cra.label!='', cra.label
def test_team_update(self): response = self.app.post(url(controller='editor', action='team_update', dataset='cra'), params={}, extra_environ={'REMOTE_USER': '******'}, expect_errors=True) assert '200' in response.status, response.status cra = Dataset.by_name('cra') assert len(cra.managers.all()) == 1, cra.managers
def test_templates_update(self): response = self.app.post(url(controller='editor', action='templates_update', dataset='cra'), params={'serp_title': 'BANANA'}, extra_environ={'REMOTE_USER': '******'}, expect_errors=True) assert '200' in response.status, response.status cra = Dataset.by_name('cra') assert cra.serp_title == 'BANANA', cra.serp_title
def test_view_private(self): cra = Dataset.by_name("cra") cra.private = True db.session.commit() response = self.app.get(url(controller="dataset", action="view", dataset="cra"), status=403) h.assert_false( "Country Regional Analysis v2009" in response, "'Country Regional Analysis v2009' not in response!" ) h.assert_false("openspending_browser" in response, "'openspending_browser' not in response!")
def test_core_update_invalid_territory(self): response = self.app.post(url(controller='editor', action='core_update', dataset='cra'), params={'name': 'cra', 'label': 'CRA', 'territories': 'su', 'description': 'I\'m a banana', 'currency': 'GBP'}, extra_environ={'REMOTE_USER': '******'}) assert not 'updated' in response.body cra = Dataset.by_name('cra') assert not 'su' in cra.territories
def test_core_update_invalid_currency(self): response = self.app.post(url(controller='editor', action='core_update', dataset='cra'), params={'name': 'cra', 'label': 'Common Rough Act', 'description': 'I\'m a banana', 'currency': 'glass pearls'}, extra_environ={'REMOTE_USER': '******'}) assert 'not a valid currency' in response.body cra = Dataset.by_name('cra') assert cra.currency=='GBP', cra.label
def test_view_private(self): cra = Dataset.by_name('cra') cra.private = True db.session.commit() response = self.app.get(url(controller='dataset', action='view', dataset='cra'), status=403) h.assert_false('Country Regional Analysis v2009' in response, "'Country Regional Analysis v2009' not in response!") h.assert_false('openspending_browser' in response, "'openspending_browser' not in response!")
def test_feeds(self): # Anonymous user with one public dataset response = self.app.get(url(controller='dataset', action='feed_rss'), expect_errors=True) assert 'application/xml' in response.content_type assert '<title>Recently Created Datasets</title>' in response assert '<item><title>Country Regional Analysis v2009' in response cra = Dataset.by_name('cra') cra.private = True db.session.add(cra) db.session.commit() # Anonymous user with one private dataset response = self.app.get(url(controller='dataset', action='feed_rss'), expect_errors=True) assert 'application/xml' in response.content_type assert '<title>Recently Created Datasets</title>' in response assert '<item><title>Country Regional Analysis v2009' not in response # Logged in user with one public dataset cra.private = False db.session.add(cra) db.session.commit() response = self.app.get(url(controller='dataset', action='feed_rss'), expect_errors=True, extra_environ={'REMOTE_USER': '******'}) assert 'application/xml' in response.content_type assert '<title>Recently Created Datasets</title>' in response assert '<item><title>Country Regional Analysis v2009' in response # Logged in user with one private dataset cra.private = True db.session.add(cra) db.session.commit() response = self.app.get(url(controller='dataset', action='feed_rss'), expect_errors=True, extra_environ={'REMOTE_USER': '******'}) assert 'application/xml' in response.content_type assert '<title>Recently Created Datasets</title>' in response assert '<item><title>Country Regional Analysis v2009' not in response # Logged in admin user with one private dataset admin_user = h.make_account('admin') admin_user.admin = True db.session.add(admin_user) db.session.commit() response = self.app.get(url(controller='dataset', action='feed_rss'), extra_environ={'REMOTE_USER': '******'}) assert '<title>Recently Created Datasets</title>' in response assert '<item><title>Country Regional Analysis v2009' in response assert 'application/xml' in response.content_type response = self.app.get(url(controller='dataset', action='index')) assert ('<link rel="alternate" type="application/rss+xml" title="' 'Latest Datasets on OpenSpending" href="/datasets.rss"' in response)
def test_core_update_invalid_language(self): response = self.app.post(url(controller='editor', action='core_update', dataset='cra'), params={'name': 'cra', 'label': 'CRA', 'languages': 'esperanto', 'description': 'I\'m a banana', 'currency': 'GBP', 'default_time': 2009}, extra_environ={'REMOTE_USER': '******'}) assert not 'updated' in response.body cra = Dataset.by_name('cra') assert not 'esperanto' in cra.languages
def test_core_update(self): response = self.app.post(url(controller='editor', action='core_update', dataset='cra'), params={'name': 'cra', 'label': 'Common Rough Act', 'description': 'I\'m a banana', 'currency': 'EUR', 'languages': 'en', 'territories': 'gb'}, extra_environ={'REMOTE_USER': '******'}) cra = Dataset.by_name('cra') assert cra.label=='Common Rough Act', cra.label assert cra.currency=='EUR', cra.currency
def setup(self): super(TestDimensionController, self).setup() h.load_fixture("cra") h.clean_and_reindex_solr() self.cra = Dataset.by_name("cra") for dimension in self.cra.dimensions: if isinstance(dimension, CompoundDimension) and dimension.name == "cofog1": members = list(dimension.members(dimension.alias.c.name == "3", limit=1)) self.member = members.pop() break
def test_new_no_apikey(self): u = url(controller='api/version2', action='create') params = { 'metadata': 'https://dl.dropbox.com/u/3250791/sample-openspending-model.json', 'csv_file': 'http://mk.ucant.org/info/data/sample-openspending-dataset.csv' } response = self.app.post(u, params, expect_errors=True) assert "400" in response.status assert not Dataset.by_name('openspending-example')
def test_core_update_invalid_category(self): response = self.app.post(url(controller='editor', action='core_update', dataset='cra'), params={'name': 'cra', 'label': 'Common Rough Act', 'description': 'I\'m a banana', 'currency': 'EUR', 'languages': 'en', 'territories': 'gb', 'category': 'foo', 'default_time': 2009}, extra_environ={'REMOTE_USER': '******'}) assert 'valid category' in response.body cra = Dataset.by_name('cra') assert cra.label != 'Common Rough Act', cra.label
def test_feeds(self): # Anonymous user with one public dataset response = self.app.get(url(controller="dataset", action="feed_rss"), expect_errors=True) assert "application/xml" in response.content_type assert "<title>Recently Created Datasets</title>" in response assert "<item><title>Country Regional Analysis v2009" in response cra = Dataset.by_name("cra") cra.private = True db.session.add(cra) db.session.commit() # Anonymous user with one private dataset response = self.app.get(url(controller="dataset", action="feed_rss"), expect_errors=True) assert "application/xml" in response.content_type assert "<title>Recently Created Datasets</title>" in response assert "<item><title>Country Regional Analysis v2009" not in response # Logged in user with one public dataset cra.private = False db.session.add(cra) db.session.commit() response = self.app.get( url(controller="dataset", action="feed_rss"), expect_errors=True, extra_environ={"REMOTE_USER": "******"} ) assert "application/xml" in response.content_type assert "<title>Recently Created Datasets</title>" in response assert "<item><title>Country Regional Analysis v2009" in response # Logged in user with one private dataset cra.private = True db.session.add(cra) db.session.commit() response = self.app.get( url(controller="dataset", action="feed_rss"), expect_errors=True, extra_environ={"REMOTE_USER": "******"} ) assert "application/xml" in response.content_type assert "<title>Recently Created Datasets</title>" in response assert "<item><title>Country Regional Analysis v2009" not in response # Logged in admin user with one private dataset admin_user = h.make_account("admin") admin_user.admin = True db.session.add(admin_user) db.session.commit() response = self.app.get(url(controller="dataset", action="feed_rss"), extra_environ={"REMOTE_USER": "******"}) assert "<title>Recently Created Datasets</title>" in response assert "<item><title>Country Regional Analysis v2009" in response assert "application/xml" in response.content_type response = self.app.get(url(controller="dataset", action="index")) assert ( '<link rel="alternate" type="application/rss+xml" title="' 'Latest Datasets on OpenSpending" href="/datasets.rss"' in response )
def test_dimensions_update_invalid_json(self): cra = Dataset.by_name('cra') cra.drop() cra.init() cra.generate() response = self.app.post(url(controller='editor', action='dimensions_update', dataset='cra'), params={'mapping': 'banana'}, extra_environ={'REMOTE_USER': '******'}, expect_errors=True) assert '400' in response.status, response.status
def test_dimensions_edit_mask_with_data(self): cra = Dataset.by_name('cra') src = Source(cra, self.user, 'file:///dev/null') src.analysis = {'columns': ['amount', 'etc']} db.session.add(src) db.session.commit() response = self.app.get(url(controller='editor', action='dimensions_edit', dataset='cra'), extra_environ={'REMOTE_USER': '******'}) assert 'cannot edit dimensions' in response.body assert '"amount"' not in response.body assert 'Update' not in response.body
def test_view_private(self): cra = Dataset.by_name('cra') cra.private = True db.session.commit() response = self.app.get(url(controller='dataset', action='view', dataset='cra'), status=403) assert 'Country Regional Analysis v2009' not in response, \ "'Country Regional Analysis v2009' in response!" assert 'openspending_browser' not in response, \ "'openspending_browser' in response!"
def setup(self): super(TestDimensionController, self).setup() h.load_fixture('cra') h.clean_and_reindex_solr() self.cra = Dataset.by_name('cra') for dimension in self.cra.dimensions: if isinstance(dimension, CompoundDimension) and \ dimension.name == 'cofog1': members = list( dimension.members(dimension.alias.c.name == '3', limit=1)) self.member = members.pop() break
def test_create_dataset(self): response = self.app.post(url(controller='dataset', action='create')) assert "Import a dataset" in response.body assert "Required" in response.body params = {'name': 'testds', 'label': 'Test Dataset', 'description': 'I\'m a banana!', 'currency': 'EUR'} response = self.app.post(url(controller='dataset', action='create'), params=params, extra_environ={'REMOTE_USER': '******'}) assert "302" in response.status ds = Dataset.by_name('testds') assert ds.label == params['label'], ds
def mine(dataset_name, code): dataset = Dataset.by_name(dataset_name) class Global(PyV8.JSClass): def __init__(self): self.console = Console() self.dimensions = safe_strings(dataset.mapping) self.dataset = safe_strings(dataset.as_dict()) def entries(self): try: return Cursor(dataset.entries()) except Exception, e: print e
def test_create_dataset(self): response = self.app.post(url(controller="dataset", action="create")) assert "Import a dataset" in response.body assert "Required" in response.body params = {"name": "testds", "label": "Test Dataset", "description": "I'm a banana!", "currency": "EUR"} response = self.app.post( url(controller="dataset", action="create"), params=params, extra_environ={"REMOTE_USER": "******"} ) assert "302" in response.status ds = Dataset.by_name("testds") assert ds.label == params["label"], ds
def test_new_dataset(self): user = Account.by_name('test_new') assert user.api_key == 'd0610659-627b-4403-8b7f-6e2820ebc95d' u = url(controller='api/version2', action='create') params = { 'metadata': 'https://dl.dropbox.com/u/3250791/sample-openspending-model.json', 'csv_file': 'http://mk.ucant.org/info/data/sample-openspending-dataset.csv' } apikey_header = 'apikey {0}'.format(user.api_key) response = self.app.post(u, params, {'Authorization': apikey_header}) assert "200" in response.status assert Dataset.by_name('openspending-example')
def test_delete(self): # TODO: Create the view using a fixture self.app.post(url(controller='view', action='create', dataset='cra'), params={'widget': 'treemap', 'label': 'I am a banana!', 'state': '{"foo":"banana"}'}, extra_environ={'REMOTE_USER': '******'}) response = self.app.delete(url(controller='view', action='delete', dataset='cra', name='i-am-a-banana'), extra_environ={'REMOTE_USER': '******'}) dataset = Dataset.by_name('cra') view = View.by_name(dataset, 'i-am-a-banana') assert view is None assert '302' in response.status
def test_core_update_invalid_language(self): response = self.app.post(url(controller='editor', action='core_update', dataset='cra'), params={ 'name': 'cra', 'label': 'CRA', 'languages': 'esperanto', 'description': 'I\'m a banana', 'currency': 'GBP', 'default_time': 2009 }, extra_environ={'REMOTE_USER': '******'}) assert not 'updated' in response.body cra = Dataset.by_name('cra') assert not 'esperanto' in cra.languages
def create(): """ This takes a json format post with label, name, description and creates a private dataset to put sources in The json_errors return a json object """ if not require.dataset.create(): return jsonify( {"errors": ["Can not create new dataset. Permission denied"]}) try: dataset = api_form_data() if not dataset.get("dataorg", None): return jsonify( {"errors": ["You must select the data source organization"]}) model = {'data': dataset} schema = dataset_schema(ValidationState(model)) data = schema.deserialize(dataset) #should have a better place for sluggify if (data.get('name', None)): tempname = slugify(str(data.get('name')), max_length=50) else: tempname = slugify(str(data.get('label')), max_length=50) if Dataset.by_name(tempname) is not None: return jsonify( {"errors": ["A dataset with this name already exists "]}) dataset = Dataset(data=data) dataset.managers.append(current_user) db.session.add(dataset) dataset_source = Source.by_source_name(dataset.name) if not dataset_source: dataset_source = Source(dataset=dataset, name=dataset.name) db.session.add(dataset_source) else: dataset_source.dataset = dataset #creating a new dataset so we have to create a source as well db.session.commit() return jsonify({"success": True, "dataset": dataset.name}) except Exception, e: ex_type, ex, tb = sys.exc_info() print traceback.print_tb(tb) return jsonify({"errors": ['Unknown Error has occurred: ' + str(e)]})
def get_or_create_dataset(model): """ Based on a provided model we get the model (if it doesn't exist we create it). """ # Get the dataset by the name provided in the model dataset = Dataset.by_name(model['dataset']['name']) # If the dataset wasn't found we create it if dataset is None: dataset = Dataset(model) db.session.add(dataset) db.session.commit() # Log information about the dataset and return it log.info("Dataset: %s", dataset.name) return dataset
def test_core_update_invalid_category(self): response = self.app.post(url(controller='editor', action='core_update', dataset='cra'), params={ 'name': 'cra', 'label': 'Common Rough Act', 'description': 'I\'m a banana', 'currency': 'EUR', 'languages': 'en', 'territories': 'gb', 'category': 'foo', 'default_time': 2009 }, extra_environ={'REMOTE_USER': '******'}) assert 'valid category' in response.body cra = Dataset.by_name('cra') assert cra.label != 'Common Rough Act', cra.label