def create(self, request, workspace_id): content_type = get_content_type(request)[0] image_file = None if content_type == 'application/json': received_json = request.body else: received_json = request.POST['json'] image_file = request.FILES.get('image', None) try: options = json.loads(received_json) except ValueError as e: msg = _("malformed json data: %s") % unicode(e) return build_error_response(request, 400, msg) missing_fields = check_json_fields(options, ('name', 'vendor', 'version', 'email')) 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: image_filename = 'images/catalogue' + os.path.splitext(image_file.name)[1] options['image'] = image_filename description = build_rdf_template_from_workspace(options, workspace, request.user) f = StringIO() zf = zipfile.ZipFile(f, 'w') zf.writestr('config.xml', bytes(description.serialize(format='pretty-xml'))) if image_file is not None: zf.writestr(image_filename, image_file.read()) zf.close() wgt_file = WgtFile(f) market_managers = get_market_managers(request.user) try: market_managers['local'].publish(None, wgt_file, request.user, options, request) except Exception, e: return build_error_response(request, 502, unicode(e))
def create(self, request): data = parse_json_request(request) workspace_name = data.get('name', '').strip() workspace_id = data.get('workspace', '') mashup_id = data.get('mashup', '') initial_pref_values = data.get('preferences', {}) allow_renaming = normalize_boolean_param(request, 'allow_renaming', data.get('allow_renaming', False)) dry_run = normalize_boolean_param(request, 'dry_run', data.get('dry_run', False)) if mashup_id == '' and workspace_id == '' and workspace_name == '': return build_error_response(request, 422, _('Missing name parameter')) elif mashup_id != '' and workspace_id != '': return build_error_response(request, 422, _('Workspace and mashup parameters cannot be used at the same time')) if mashup_id == '' and workspace_id == '': if not is_valid_name(workspace_name): return build_error_response(request, 422, _('invalid workspace name')) if dry_run: return HttpResponse(status=204) try: workspace = createEmptyWorkspace(workspace_name, request.user, allow_renaming=allow_renaming) except IntegrityError: msg = _('A workspace with the given name already exists') return build_error_response(request, 409, msg) else: if mashup_id != '': values = mashup_id.split('/', 3) if len(values) != 3: return build_error_response(request, 422, _('invalid mashup id')) (mashup_vendor, mashup_name, mashup_version) = values try: resource = CatalogueResource.objects.get(vendor=mashup_vendor, short_name=mashup_name, version=mashup_version) if not resource.is_available_for(request.user) or resource.resource_type() != 'mashup': raise CatalogueResource.DoesNotExist except CatalogueResource.DoesNotExist: return build_error_response(request, 422, _('Mashup not found: %(mashup_id)s') % {'mashup_id': mashup_id}) base_dir = catalogue.wgt_deployer.get_base_dir(mashup_vendor, mashup_name, mashup_version) wgt_file = WgtFile(os.path.join(base_dir, resource.template_uri)) template = TemplateParser(wgt_file.get_template()) else: from_ws = get_object_or_404(Workspace, id=workspace_id) if from_ws.public is False and not request.user.is_superuser and from_ws.creator != request.user: return build_error_response(request, 403, _('You are not allowed to read from workspace %s') % workspace_id) options = { 'vendor': 'api', 'name': from_ws.name, 'version': '1.0', 'title': '', 'description': 'Temporal mashup for the workspace copy operation', 'email': '*****@*****.**', } template = TemplateParser(build_json_template_from_workspace(options, from_ws, from_ws.creator)) try: check_mashup_dependencies(template, request.user) except MissingDependencies as e: details = { 'missingDependencies': e.missing_dependencies, } return build_error_response(request, 422, e, details=details) if dry_run: return HttpResponse(status=204) if workspace_name == '': workspace_name = None try: workspace, _junk = buildWorkspaceFromTemplate(template, request.user, allow_renaming=allow_renaming, new_name=workspace_name) except IntegrityError: msg = _('A workspace with the given name already exists') return build_error_response(request, 409, msg) if len(initial_pref_values) > 0: update_workspace_preferences(workspace, initial_pref_values, invalidate_cache=False) workspace_data = get_global_workspace_data(workspace, request.user) return workspace_data.get_response(status_code=201, cacheable=False)
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): data = parse_json_request(request) workspace_name = data.get('name', '').strip() workspace_title = data.get('title', '').strip() workspace_id = data.get('workspace', '') mashup_id = data.get('mashup', '') initial_pref_values = data.get('preferences', {}) allow_renaming = normalize_boolean_param( request, 'allow_renaming', data.get('allow_renaming', False)) dry_run = normalize_boolean_param(request, 'dry_run', data.get('dry_run', False)) if mashup_id == '' and workspace_id == '' and (workspace_name == '' and workspace_title == ''): return build_error_response(request, 422, _('Missing name or title parameter')) elif mashup_id != '' and workspace_id != '': return build_error_response( request, 422, _('Workspace and mashup parameters cannot be used at the same time' )) if mashup_id == '' and workspace_id == '': if workspace_title == '': workspace_title = workspace_name if workspace_name != '' and not is_valid_name(workspace_name): return build_error_response(request, 422, _('invalid workspace name')) if dry_run: return HttpResponse(status=204) try: workspace = createEmptyWorkspace(workspace_title, request.user, name=workspace_name, allow_renaming=allow_renaming) except IntegrityError: msg = _('A workspace with the given name already exists') return build_error_response(request, 409, msg) else: if mashup_id != '': values = mashup_id.split('/', 3) if len(values) != 3: return build_error_response(request, 422, _('invalid mashup id')) (mashup_vendor, mashup_name, mashup_version) = values try: resource = CatalogueResource.objects.get( vendor=mashup_vendor, short_name=mashup_name, version=mashup_version) if not resource.is_available_for( request.user ) or resource.resource_type() != 'mashup': raise CatalogueResource.DoesNotExist except CatalogueResource.DoesNotExist: return build_error_response( request, 422, _('Mashup not found: %(mashup_id)s') % {'mashup_id': mashup_id}) base_dir = catalogue.wgt_deployer.get_base_dir( mashup_vendor, mashup_name, mashup_version) wgt_file = WgtFile( os.path.join(base_dir, resource.template_uri)) template = TemplateParser(wgt_file.get_template()) else: from_ws = get_object_or_404(Workspace, id=workspace_id) if from_ws.public is False and not request.user.is_superuser and from_ws.creator != request.user: return build_error_response( request, 403, _('You are not allowed to read from workspace %s') % workspace_id) options = { 'vendor': 'api', 'name': from_ws.name, 'version': '1.0', 'title': from_ws.title if from_ws.title is not None and from_ws.title.strip() != "" else from_ws.name, 'description': 'Temporal mashup for the workspace copy operation', 'email': '*****@*****.**', } template = TemplateParser( build_json_template_from_workspace(options, from_ws, from_ws.creator)) try: check_mashup_dependencies(template, request.user) except MissingDependencies as e: details = { 'missingDependencies': e.missing_dependencies, } return build_error_response(request, 422, e, details=details) if dry_run: return HttpResponse(status=204) try: workspace, _junk = buildWorkspaceFromTemplate( template, request.user, allow_renaming=allow_renaming, new_name=workspace_name, new_title=workspace_title) except IntegrityError: msg = _('A workspace with the given name already exists') return build_error_response(request, 409, msg) if len(initial_pref_values) > 0: update_workspace_preferences(workspace, initial_pref_values, invalidate_cache=False) workspace_data = get_global_workspace_data(workspace, request.user) return workspace_data.get_response(status_code=201, cacheable=False)
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')