def test_build_xml_template_from_workspace(self): options = { 'vendor': 'Wirecloud Test Suite', 'name': 'Test Mashup', 'version': '1', 'authors': 'test', 'email': '*****@*****.**', } template = build_xml_template_from_workspace(options, self.workspace, self.user) self.check_basic_xml_workspace_template_info(template) self.check_empty_xml_wiring_info(template) # IWidgets self.assertXPathCount(template, '/Template/Catalog.ResourceDescription/IncludedResources/Tab', 1) self.assertXPathAttr(template, '/Template/Catalog.ResourceDescription/IncludedResources/Tab[1]', 'name', 'Tab') self.assertXPathCount(template, '/Template/Catalog.ResourceDescription/IncludedResources/Tab[1]/IWidget', 0) # Workspace with iwidgets options = { 'vendor': 'Wirecloud Test Suite', 'name': 'Test Mashup', 'version': '1', 'authors': 'test', 'email': '*****@*****.**', 'doc': 'http://example.com/test-mashup/docs/index.html', 'readOnlyWidgets': False, } template = build_xml_template_from_workspace(options, self.workspace_with_iwidgets, self.user) self.check_basic_xml_workspace_template_info(template) # IWidgets self.assertXPathCount(template, '/Template/Catalog.ResourceDescription/IncludedResources/Tab', 1) self.assertXPathAttr(template, '/Template/Catalog.ResourceDescription/IncludedResources/Tab[1]', 'name', 'tab') self.assertXPathCount(template, '/Template/Catalog.ResourceDescription/IncludedResources/Tab[1]/Resource', 2) self.assertXPathAttr(template, '/Template/Catalog.ResourceDescription/IncludedResources/Tab[1]/Resource[1]', 'readonly', 'false', optional=True) self.assertXPathAttr(template, '/Template/Catalog.ResourceDescription/IncludedResources/Tab[1]/Resource[2]', 'readonly', 'false', optional=True) self.check_empty_xml_wiring_info(template)
def test_build_xml_template_from_workspace_forced_values(self): # Workspace with iwidgets options = { 'vendor': 'Wirecloud Test Suite', 'name': 'Test Mashup', 'version': '1', 'authors': 'test', 'email': '*****@*****.**', 'readOnlyWidgets': False, 'parametrization': { 'iwidgets': { '1': { 'username': {'source': 'current', 'status': 'readonly', 'value': 'default'}, 'password': {'source': 'current', 'status': 'hidden', 'value': 'initial text'}, } }, 'ioperators': {} }, } template = build_xml_template_from_workspace(options, self.workspace_with_iwidgets, self.user) self.check_basic_xml_workspace_template_info(template) self.assertXPathAttr(template, '/Template/Catalog.ResourceDescription/IncludedResources/Tab[1]/Resource[@id="1"]/Preference[@name="username"]', 'readonly', 'true') self.assertXPathAttr(template, '/Template/Catalog.ResourceDescription/IncludedResources/Tab[1]/Resource[@id="1"]/Preference[@name="username"]', 'hidden', 'false', optional=True) self.assertXPathAttr(template, '/Template/Catalog.ResourceDescription/IncludedResources/Tab[1]/Resource[@id="1"]/Preference[@name="username"]', 'value', 'default') self.assertXPathAttr(template, '/Template/Catalog.ResourceDescription/IncludedResources/Tab[1]/Resource[@id="1"]/Preference[@name="password"]', 'readonly', 'true') self.assertXPathAttr(template, '/Template/Catalog.ResourceDescription/IncludedResources/Tab[1]/Resource[@id="1"]/Preference[@name="password"]', 'hidden', 'true') self.assertXPathAttr(template, '/Template/Catalog.ResourceDescription/IncludedResources/Tab[1]/Resource[@id="1"]/Preference[@name="password"]', 'value', 'initial text') self.assertXPathAttr(template, '/Template/Catalog.ResourceDescription/IncludedResources/Tab[1]/Resource[@id="2"]/Preference[@name="username"]', 'readonly', 'false', optional=True) self.assertXPathAttr(template, '/Template/Catalog.ResourceDescription/IncludedResources/Tab[1]/Resource[@id="2"]/Preference[@name="username"]', 'hidden', 'false', optional=True) self.assertXPathAttr(template, '/Template/Catalog.ResourceDescription/IncludedResources/Tab[1]/Resource[@id="2"]/Preference[@name="username"]', 'value', 'test_username') self.assertXPathAttr(template, '/Template/Catalog.ResourceDescription/IncludedResources/Tab[1]/Resource[@id="2"]/Preference[@name="password"]', 'readonly', 'false', optional=True) self.assertXPathAttr(template, '/Template/Catalog.ResourceDescription/IncludedResources/Tab[1]/Resource[@id="2"]/Preference[@name="password"]', 'hidden', 'false', optional=True) self.assertXPathAttr(template, '/Template/Catalog.ResourceDescription/IncludedResources/Tab[1]/Resource[@id="2"]/Preference[@name="password"]', 'value', 'test_password') self.check_empty_xml_wiring_info(template)
def create(self, request, workspace_id): import wirecloud.catalogue.utils as catalogue_utils content_type = get_content_type(request)[0] image_file = None smartphoneimage_file = None extra_files = [] if content_type == 'application/json': received_json = request.body.decode('utf-8') else: received_json = request.POST['json'] image_file = request.FILES.get('image', None) smartphoneimage_file = request.FILES.get('smartphoneimage', None) try: options = json.loads(received_json) except ValueError as e: msg = _("malformed json data: %s") % e return build_error_response(request, 400, msg) missing_fields = check_json_fields(options, ('name', 'vendor', 'version')) if len(missing_fields) > 0: return build_error_response(request, 400, _('Malformed JSON. The following field(s) are missing: %(fields)s.') % {'fields': missing_fields}) if not is_valid_vendor(options['vendor']): return build_error_response(request, 400, _('Invalid vendor')) if not is_valid_name(options['name']): return build_error_response(request, 400, _('Invalid name')) if not is_valid_version(options['version']): return build_error_response(request, 400, _('Invalid version number')) workspace = get_object_or_404(Workspace, id=workspace_id) if image_file is not None: options['image'] = 'images/catalogue' + os.path.splitext(image_file.name)[1] extra_files.append((options['image'], image_file)) if smartphoneimage_file is not None: options['smartphoneimage'] = 'images/smartphone' + os.path.splitext(smartphoneimage_file.name)[1] extra_files.append((options['smartphoneimage'], smartphoneimage_file)) if 'longdescription' in options: extra_files.append(('DESCRIPTION.md', BytesIO(options['longdescription'].encode('utf-8')))) options['longdescription'] = 'DESCRIPTION.md' description = build_xml_template_from_workspace(options, workspace, request.user) # Build mashup wgt file f = BytesIO() zf = zipfile.ZipFile(f, 'w') zf.writestr('config.xml', description.encode('utf-8')) for filename, extra_file in extra_files: zf.writestr(filename, extra_file.read()) for resource_info in options['embedded']: (vendor, name, version) = (resource_info['vendor'], resource_info['name'], resource_info['version']) resource = CatalogueResource.objects.get(vendor=vendor, short_name=name, version=version) base_dir = catalogue_utils.wgt_deployer.get_base_dir(vendor, name, version) zf.write(os.path.join(base_dir, resource.template_uri), resource_info['src']) zf.close() wgt_file = WgtFile(f) resource = get_local_catalogue().publish(None, wgt_file, request.user, options, request) return HttpResponse(json.dumps(resource.get_processed_info(request), ensure_ascii=False), status=201, content_type='application/json; charset=utf-8')
def create(self, request, workspace_id): import wirecloud.catalogue.utils as catalogue_utils content_type = get_content_type(request)[0] image_file = None smartphoneimage_file = None extra_files = [] if content_type == 'application/json': received_json = request.body.decode('utf-8') else: received_json = request.POST['json'] image_file = request.FILES.get('image', None) smartphoneimage_file = request.FILES.get('smartphoneimage', None) try: options = json.loads(received_json) except ValueError as e: msg = _("malformed json data: %s") % e return build_error_response(request, 400, msg) missing_fields = check_json_fields(options, ('name', 'vendor', 'version')) if len(missing_fields) > 0: return build_error_response( request, 400, _('Malformed JSON. The following field(s) are missing: %(fields)s.' ) % {'fields': missing_fields}) if not is_valid_vendor(options['vendor']): return build_error_response(request, 400, _('Invalid vendor')) if not is_valid_name(options['name']): return build_error_response(request, 400, _('Invalid name')) if not is_valid_version(options['version']): return build_error_response(request, 400, _('Invalid version number')) workspace = get_object_or_404(Workspace, id=workspace_id) if image_file is not None: options['image'] = 'images/catalogue' + os.path.splitext( image_file.name)[1] extra_files.append((options['image'], image_file)) if smartphoneimage_file is not None: options[ 'smartphoneimage'] = 'images/smartphone' + os.path.splitext( smartphoneimage_file.name)[1] extra_files.append( (options['smartphoneimage'], smartphoneimage_file)) if 'longdescription' in options: extra_files.append( ('DESCRIPTION.md', BytesIO(options['longdescription'].encode('utf-8')))) options['longdescription'] = 'DESCRIPTION.md' description = build_xml_template_from_workspace( options, workspace, request.user) # Build mashup wgt file f = BytesIO() zf = zipfile.ZipFile(f, 'w') zf.writestr('config.xml', description.encode('utf-8')) for filename, extra_file in extra_files: zf.writestr(filename, extra_file.read()) for resource_info in options['embedded']: (vendor, name, version) = (resource_info['vendor'], resource_info['name'], resource_info['version']) resource = CatalogueResource.objects.get(vendor=vendor, short_name=name, version=version) base_dir = catalogue_utils.wgt_deployer.get_base_dir( vendor, name, version) zf.write(os.path.join(base_dir, resource.template_uri), resource_info['src']) zf.close() wgt_file = WgtFile(f) resource = get_local_catalogue().publish(None, wgt_file, request.user, options, request) return HttpResponse(json.dumps(resource.get_processed_info(request), ensure_ascii=False), status=201, content_type='application/json; charset=utf-8')