def plugins(request): pm = PluginManager() lisa_all_plugins = _get_global_plugins() if lisa_all_plugins: request.session['lisa_all_plugins'] = lisa_all_plugins lisa_template_plugins = {} for plugin_name in lisa_all_plugins: plugin = lisa_all_plugins[plugin_name] local_version = pm.get_version(plugin_name=plugin_name) if not local_version: local_version = False is_enabled = False if plugin_name in pm.plugins: is_enabled = True should_upgrade = False if local_version: if StrictVersion(local_version) < StrictVersion(plugin['version']): should_upgrade = True lisa_template_plugins[plugin_name] = { 'name': plugin['name'], 'remote_version': plugin['version'], 'local_version': local_version, 'summary': plugin['summary'], 'is_enabled': is_enabled, 'should_upgrade': should_upgrade, 'author': plugin['author'], 'repo_url': plugin['repo_url'], 'keywords': plugin['keywords'] } context = { 'lisa_plugins': lisa_template_plugins } else: context = {'error': 'Could not retrieve the plugin list'} context_instance = RequestContext(request) return render(request, 'plugins.html', context, context_instance)
def plugins(request): pm = PluginManager() lisa_all_plugins = _get_global_plugins() if lisa_all_plugins: request.session['lisa_all_plugins'] = lisa_all_plugins lisa_template_plugins = {} for plugin_name in lisa_all_plugins: plugin = lisa_all_plugins[plugin_name] local_version = pm.get_version(plugin_name=plugin_name) if not local_version: local_version = False is_enabled = False if plugin_name in pm.plugins: is_enabled = True should_upgrade = False if local_version: if StrictVersion(local_version) < StrictVersion( plugin['version']): should_upgrade = True lisa_template_plugins[plugin_name] = { 'name': plugin['name'], 'remote_version': plugin['version'], 'local_version': local_version, 'summary': plugin['summary'], 'is_enabled': is_enabled, 'should_upgrade': should_upgrade, 'author': plugin['author'], 'repo_url': plugin['repo_url'], 'keywords': plugin['keywords'] } context = {'lisa_plugins': lisa_template_plugins} else: context = {'error': 'Could not retrieve the plugin list'} context_instance = RequestContext(request) return render(request, 'plugins.html', context, context_instance)
STATIC_ROOT = os.path.join(BASE_DIR, 'static') COMPRESS_ROOT = os.path.join(BASE_DIR, 'static') COMPRESS_PRECOMPILERS = ( ('text/x-scss', 'django_libsass.SassCompiler'), ) # COMPRESS_ENABLED = True # COMPRESS_OFFLINE = True PROJECT_APPS = [ 'lisa_api.api', 'lisa_api.frontend', ] PM = PluginManager() INSTALLED_APPS = PREREQ_APPS + PROJECT_APPS + PluginManager().django_plugins MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.middleware.locale.LocaleMiddleware', )
""" WSGI config for lisa_api project. It exposes the WSGI callable as a module-level variable named ``application``. For more information on this file, see https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/ """ import os from django.core.wsgi import get_wsgi_application os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lisa_api.lisa.settings") application = get_wsgi_application() from lisa_api.lisa.plugin_manager import PluginManager from django.core.management import call_command call_command("migrate") PM = PluginManager() PM.load_intents()
""" from django.conf.urls import include, url from django.contrib import admin from lisa_api.api import views as api_views from rest_framework import routers from lisa_api.lisa.plugin_manager import PluginManager router = routers.DefaultRouter() router.register(r'clients', api_views.ClientViewSet) router.register(r'groups', api_views.GroupViewSet) router.register(r'intents', api_views.IntentViewSet) router.register(r'plugins', api_views.PluginViewSet) router.register(r'users', api_views.UserViewSet) router.register(r'zones', api_views.ZoneViewSet) # Wire up our API using automatic URL routing. # Additionally, we include login URLs for the browsable API. urlpatterns = [ url(r'^', include('lisa_api.frontend.urls', namespace='frontend')), url(r'^api/v1/core/', include(router.urls)), url(r'^api/v1/core/speak/', api_views.SpeakView), url(r'^api/v1/core/tts/', api_views.TTSView), url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), url(r'^admin/', include(admin.site.urls)), url(r'^docs/', include('rest_framework_swagger.urls')), ] for plugin in PluginManager().plugins: urlpatterns.append(url(r'^api/v1/plugin-%s' % plugin, include('lisa_plugins_%s.urls' % plugin)))
def setUp(self): # Every test needs access to the request factory. self.plugin = Plugin.objects.create(name="testplugin") self.plugin_url = '/api/v1/core/plugins/%s/' % self.plugin.name self.plugin_manager = PluginManager()
class CoreTests(APITestCase): def setUp(self): # Every test needs access to the request factory. self.plugin = Plugin.objects.create(name="testplugin") self.plugin_url = '/api/v1/core/plugins/%s/' % self.plugin.name self.plugin_manager = PluginManager() @mock.patch.object(pip, 'main') def test_v1_create_plugin(self, mock_pip_main): """ Ensure we can install a new plugin """ url = '/api/v1/core/plugins/' data = { 'name': u'shopping', 'version': u'1.8.3' } response = self.client.post(url, data, format='json') mock_pip_main.assert_called_once_with(['install', 'lisa-plugins-' + ''.join([data.get('name'), "==", data.get('version')])]) self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(response.data.get('name'), data.get('name')) @mock.patch.object(pip, 'main') def test_v1_destroy_plugin(self, mock_pip_main): """ Ensure we can uninstall a plugin """ response = self.client.delete(self.plugin_url, format='json') mock_pip_main.assert_called_once_with(['uninstall', '--yes', 'lisa-plugins-' + self.plugin.name]) self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) @mock.patch.object(pip, 'main') def test_v1_modify_plugin(self, mock_pip_main): """ Ensure we can modify a plugin """ data = { 'name': u'testplugin', 'version': u'1.0' } response = self.client.put(self.plugin_url, data, format='json') mock_pip_main.assert_called_once_with(['install', 'lisa-plugins-' + ''.join([data.get('name'), "==", data.get('version')])]) self.assertEqual(response.data.get('version'), data.get('version')) @log_capture() def test_v1_load_intent_plugin(self, l): """ Load plugin intents """ self.plugin_manager.load_intents() l.check( ('lisa_api', 'INFO', 'There is no plugin loaded') ) @log_capture() def test_v1_get_version_plugin(self, l): """ Load plugin version """ version = self.plugin_manager.get_version(plugin_name='shopping') # As we don't have plugin loaded, it should use the # default value of the base class which is None self.assertEqual(version, None)