Permalink
Browse files

Add publish/unpublish API

  • Loading branch information...
akariv committed Jul 6, 2016
1 parent 0998168 commit adbdfffc866b4400d7c91a6adc660075950e13ea
@@ -16,7 +16,7 @@ def verify(auth_token, owner):
return True
global public_key
if public_key is None:
url = 'http://localhost:8000'+url_for('authorization.public-key')
url = 'http://localhost:8000'+url_for('user.public-key')
public_key = requests.get(url).text
try:
token = jwt.decode(auth_token.encode('ascii'),
@@ -1,4 +1,8 @@
from flask import Blueprint
import json
from flask import Blueprint, request, Response
from flask.ext.jsonpify import jsonpify
from . import controllers
@@ -9,6 +13,22 @@ def create():
# Create instance
blueprint = Blueprint('package', 'package')
# Controller Proxies
def toggle_publish():
id = request.values.get('id')
value = request.values.get('publish', '')
value = value.lower()
toggle = None
publish = None
if value == 'toggle':
toggle = True
else:
if value in ['true', 'false']:
publish = json.loads(value)
if publish is None and toggle is None:
return Response(status=400)
return jsonpify(controllers.toggle_publish(id, toggle, publish))
# Register routes
blueprint.add_url_rule(
'upload', 'load', controllers.upload, methods=['POST'])
@@ -17,6 +37,8 @@ def create():
blueprint.add_url_rule(
'callback', 'callback',
controllers.upload_status_update, methods=['GET'])
blueprint.add_url_rule(
'publish', 'publish', toggle_publish, methods=['POST'])
# Return blueprint
return blueprint
@@ -4,6 +4,7 @@
from flask import request, abort, url_for
from flask.ext.jsonpify import jsonpify
from werkzeug.contrib.cache import MemcachedCache, SimpleCache
from .models import package_registry
if 'OS_CONDUCTOR_CACHE' in os.environ:
cache = MemcachedCache([os.environ['OS_CONDUCTOR_CACHE']])
@@ -22,12 +23,12 @@ def upload():
abort(400)
params = {
'package': datapackage,
'callback': 'http://'+os_conductor+url_for('apiload.callback')
'callback': 'http://'+os_conductor+url_for('.callback')
}
load_url = 'http://'+os_api+'/api/3/loader/'
response = requests.get(load_url, params=params)
if response.status_code == 200:
key = 'os-conductor:apiload:'+datapackage
key = 'os-conductor:package:'+datapackage
ret = {
"progress": 0,
"status": "queued"
@@ -47,7 +48,7 @@ def upload_status():
datapackage = request.values.get('datapackage')
if datapackage is None:
abort(400)
key = 'os-conductor:apiload:'+datapackage
key = 'os-conductor:package:'+datapackage
ret = cache.get(key)
if ret is None:
abort(404)
@@ -62,7 +63,7 @@ def upload_status_update():
error = request.values.get('error')
progress = request.values.get('progress', 0)
if datapackage is not None and status is not None:
key = 'os-conductor:apiload:'+datapackage
key = 'os-conductor:package:'+datapackage
ret = cache.get(key)
if ret is None:
ret = {
@@ -76,3 +77,17 @@ def upload_status_update():
ret['status'] = status
cache.set(key, ret, 3600)
return ""
def toggle_publish(id, toggle=False, publish=False):
name, datapackage_url, datapackage, \
model, dataset_name, author = package_registry.get_raw(id)
private = datapackage.get('private', False)
if toggle:
private = not private
else:
private = not publish
datapackage['private'] = private
package_registry.save_model(name, datapackage_url, datapackage,
model, dataset_name, author)
return {'success': True, 'published': not private}
@@ -0,0 +1,20 @@
import os
from elasticsearch import Elasticsearch
from os_package_registry import PackageRegistry
# ## ElasticSearch
_es_engine = None
def _get_es_engine():
global _es_engine
if _es_engine is None:
es_host = os.environ['OS_ELASTICSEARCH_ADDRESS']
_es_engine = Elasticsearch(hosts=[es_host], use_ssl='https' in es_host)
return _es_engine
# Package Registry
package_registry = PackageRegistry(es_instance=_get_es_engine())
View
@@ -11,4 +11,4 @@ sqlalchemy
psycopg2
cryptography
elasticsearch>=1.0.0,<2.0.0
os-package-registry>=0.0.2
@@ -1,6 +1,11 @@
from collections import namedtuple
import unittest
import time
from elasticsearch import Elasticsearch, NotFoundError
from os_package_registry import PackageRegistry
from ..config import LOCAL_ELASTICSEARCH
from werkzeug.exceptions import BadRequest, NotFound
try:
@@ -132,18 +137,55 @@ def test___callback___error_good_status(self):
self.assertResponse(api_poll(), 'fail', 0, 'wtf2')
#
# def test___call___good_request(self):
# authorize = module.Authorize()
# self.assertEqual(json.loads(authorize()), {
# 'filedata': {
# 'data/file1': {
# 'name': 'file1',
# 'length': 100,
# 'md5': 'aaa',
# 'upload_url': 'http://test.com',
# 'upload_query': {'key': ['value']},
# },
# },
# })
# self.bucket.new_key.assert_called_with('owner/name/data/file1')
class PublishAPITests(unittest.TestCase):
def setUp(self):
# Clean index
self.es = Elasticsearch(hosts=[LOCAL_ELASTICSEARCH])
try:
self.es.indices.delete(index='users')
except NotFoundError:
pass
self.es.indices.create('users')
time.sleep(1)
self.pr = PackageRegistry(es_connection_string=LOCAL_ELASTICSEARCH)
self.pr.save_model('name','datapackage_url',{},{},'dataset','author')
def test__initial_value__none(self):
pkg = self.pr.get_package('name')
assert(pkg.get('private') is None)
def test__toggle__published(self):
module.toggle_publish('name', toggle=True)
pkg = self.pr.get_package('name')
assert(pkg.get('private') is True)
def test__toggle_twice__not_published(self):
module.toggle_publish('name', toggle=True)
module.toggle_publish('name', toggle=True)
pkg = self.pr.get_package('name')
assert(pkg.get('private') is False)
def test__force_publish_initial__correct(self):
module.toggle_publish('name', publish=True)
pkg = self.pr.get_package('name')
assert(pkg.get('private') is False)
def test__force_publish__correct(self):
module.toggle_publish('name', toggle=True)
module.toggle_publish('name', publish=True)
pkg = self.pr.get_package('name')
assert(pkg.get('private') is False)
def test__force_unpublish_initial__correct(self):
module.toggle_publish('name', publish=False)
pkg = self.pr.get_package('name')
assert(pkg.get('private') is True)
def test__force_unpublish__correct(self):
module.toggle_publish('name', toggle=True)
module.toggle_publish('name', toggle=True)
module.toggle_publish('name', publish=False)
pkg = self.pr.get_package('name')
assert(pkg.get('private') is True)

0 comments on commit adbdfff

Please sign in to comment.