def wrapper(self, *args, **kwargs): if shared: base = self.shared_test_data_dir else: base = self.test_data_dir final_creator = User.objects.get(username=creator) if creator is not None else None final_users = tuple(User.objects.get(username=user) for user in users) final_groups = tuple(Group.objects.get(name=group) for group in groups) for resource in resources: wgt_file = open(os.path.join(base, resource), 'rb') wgt = WgtFile(wgt_file) fix_dev_version(wgt, final_creator) if deploy_only: catalogue.add_packaged_resource(wgt.get_underlying_file(), final_creator, wgt_file=wgt, deploy_only=True) wgt_file.close() continue resource = install_resource(wgt, final_creator) if public: resource.public = True resource.save() resource.users.add(*final_users) resource.groups.add(*final_groups) wgt_file.close() return test_func(self, *args, **kwargs)
def create(self, request): try: if 'file' in request.FILES: request_file = request.FILES['file'] resource = add_packaged_resource(request_file, request.user) elif 'template_uri' in request.POST: template_uri = request.POST['template_uri'] downloaded_file = download_http_content(template_uri, user=request.user) resource = add_packaged_resource(BytesIO(downloaded_file), request.user) else: return build_error_response( request, 400, _("Missing parameter: template_uri or file")) except TemplateParseException as e: return build_error_response(request, 400, e.msg) except IntegrityError: return build_error_response(request, 409, _('Resource already exists')) resource.users.add(request.user) return HttpResponse(resource.json_description, content_type='application/json; charset=UTF-8')
def install_resource(wgt_file, executor_user): if not isinstance(wgt_file, WgtFile): raise TypeError('wgt_file must be a WgtFile') file_contents = wgt_file.get_underlying_file() template_contents = wgt_file.get_template() template = TemplateParser(template_contents) resources = CatalogueResource.objects.filter( vendor=template.get_resource_vendor(), short_name=template.get_resource_name(), version=template.get_resource_version())[:1] # Create/recreate/recover catalogue resource if '-dev' in template.get_resource_version() and len(resources) == 1: # TODO: Update widget visually resources[0].delete() resource = add_packaged_resource(file_contents, executor_user, wgt_file=wgt_file) elif len(resources) == 1: resource = resources[0] else: resource = add_packaged_resource(file_contents, executor_user, wgt_file=wgt_file) return resource
def install_resource(wgt_file, executor_user, restricted=False): if not isinstance(wgt_file, WgtFile): raise TypeError('wgt_file must be a WgtFile') file_contents = wgt_file.get_underlying_file() template_contents = wgt_file.get_template() template = TemplateParser(template_contents) resource_version = template.get_resource_version() if restricted: if '-dev' in resource_version: raise PermissionDenied("dev versions cannot be published") vendor = template.get_resource_vendor() if check_vendor_permissions(executor_user, vendor) is False: raise PermissionDenied("You don't have persmissions to publish in name of {}".format(vendor)) resources = CatalogueResource.objects.filter(vendor=template.get_resource_vendor(), short_name=template.get_resource_name(), version=template.get_resource_version())[:1] # Create/recreate/recover catalogue resource if '-dev' in resource_version and len(resources) == 1: # dev version are automatically overwritten resources[0].delete() resource = add_packaged_resource(file_contents, executor_user, wgt_file=wgt_file) elif len(resources) == 1: resource = resources[0] else: resource = add_packaged_resource(file_contents, executor_user, wgt_file=wgt_file) return resource
def create(self, request): try: if 'file' in request.FILES: request_file = request.FILES['file'] resource = add_packaged_resource(request_file, request.user) elif 'template_uri' in request.POST: template_uri = request.POST['template_uri'] downloaded_file = download_http_content(template_uri, user=request.user) resource = add_packaged_resource(BytesIO(downloaded_file), request.user) else: return build_error_response(request, 400, _("Missing parameter: template_uri or file")) except TemplateParseException as e: return build_error_response(request, 400, e.msg) except IntegrityError: return build_error_response(request, 409, _('Resource already exists')) resource.users.add(request.user) return HttpResponse(resource.json_description, content_type='application/json; charset=UTF-8')
def wrapper(self, *args, **kwargs): if shared: base = self.shared_test_data_dir else: base = self.test_data_dir for resource in resources: wgt_file = open(os.path.join(base, resource), "rb") wgt = WgtFile(wgt_file) if deploy_only: catalogue.add_packaged_resource(wgt_file, None, wgt_file=wgt, deploy_only=True) wgt_file.close() continue resource = install_resource(wgt, None) if public: resource.public = True resource.save() final_users = (User.objects.get(username=user) for user in users) resource.users.add(*final_users) final_groups = (Group.objects.get(name=group) for group in groups) resource.groups.add(*final_groups) wgt_file.close() return test_func(self, *args, **kwargs)
def prepare_temporal_resource_directories(cls): cls.tmp_dir = mkdtemp() # catalogue deployer cls.old_catalogue_deployer = catalogue.wgt_deployer cls.catalogue_tmp_dir_backup = os.path.join(cls.tmp_dir, 'catalogue_backup') cls.catalogue_tmp_dir = os.path.join(cls.tmp_dir, 'catalogue') catalogue.wgt_deployer = WgtDeployer(cls.catalogue_tmp_dir) # showcase deployer cls.old_deployer = showcase.wgt_deployer cls.localcatalogue_tmp_dir_backup = os.path.join(cls.tmp_dir, 'localcatalogue_backup') cls.localcatalogue_tmp_dir = os.path.join(cls.tmp_dir, 'localcatalogue') showcase.wgt_deployer = WgtDeployer(cls.localcatalogue_tmp_dir) # deploy resource files for resource_file in cls.base_resources: resource_file = open(os.path.join(cls.shared_test_data_dir, resource_file), 'rb') resource_wgt = WgtFile(resource_file) catalogue.add_packaged_resource(resource_file, None, wgt_file=resource_wgt, deploy_only=True) showcase.wgt_deployer.deploy(resource_wgt) resource_file.close() # And freeze the resource files backup directories if os.path.exists(cls.localcatalogue_tmp_dir): os.rename(cls.localcatalogue_tmp_dir, cls.localcatalogue_tmp_dir_backup) else: os.mkdir(cls.localcatalogue_tmp_dir_backup) if os.path.exists(cls.catalogue_tmp_dir): os.rename(cls.catalogue_tmp_dir, cls.catalogue_tmp_dir_backup) else: os.mkdir(cls.catalogue_tmp_dir_backup)
def test_add_packaged_resource_invalid_translated_changelog_encoding(self): f, user, wgt_file, template, file_mocks = self.build_add_packaged_resouce_mocks(['index.html', 'DESCRIPTION.md', 'doc/index.md', 'CHANGELOG.es.md', 'CHANGELOG.md'], ['CHANGELOG.es.md']) with patch('wirecloud.catalogue.utils.extract_resource_media_from_package'): try: add_packaged_resource(f, user, wgt_file=wgt_file, template=template, deploy_only=True) self.fail('Expecting InvalidContents exception to be raised') except InvalidContents as e: self.assertIn('CHANGELOG.es.md', str(e))
def test_add_packaged_resource_missing_userguide_file(self): f, user, wgt_file, template, file_mocks = self.build_add_packaged_resouce_mocks(['index.html', 'DESCRIPTION.md', 'CHANGELOG.md'], []) with patch('wirecloud.catalogue.utils.extract_resource_media_from_package'): try: add_packaged_resource(f, user, wgt_file=wgt_file, template=template, deploy_only=True) self.fail('Expecting InvalidContents exception to be raised') except InvalidContents as e: self.assertIn('doc/index.md', six.text_type(e))
def test_add_packaged_resource_invalid_translated_changelog_encoding(self): f, user, wgt_file, template, file_mocks = self.build_add_packaged_resouce_mocks(['index.html', 'DESCRIPTION.md', 'doc/index.md', 'CHANGELOG.es.md', 'CHANGELOG.md'], ['CHANGELOG.es.md']) with patch('wirecloud.catalogue.utils.extract_resource_media_from_package'): try: add_packaged_resource(f, user, wgt_file=wgt_file, template=template, deploy_only=True) self.fail('Expecting InvalidContents exception to be raised') except InvalidContents as e: self.assertIn('CHANGELOG.es.md', six.text_type(e))
def prepare_temporal_resource_directories(cls): from django.conf import settings cls.tmp_dir = mkdtemp() # Whoosh indexes cls.old_index_dir = settings.WIRECLOUD_INDEX_DIR settings.WIRECLOUD_INDEX_DIR = os.path.join(cls.tmp_dir, 'whoosh_indexes') # catalogue deployer cls.old_catalogue_deployer = catalogue.wgt_deployer cls.catalogue_tmp_dir_backup = os.path.join(cls.tmp_dir, 'catalogue_backup') cls.catalogue_tmp_dir = os.path.join(cls.tmp_dir, 'catalogue') catalogue.wgt_deployer = WgtDeployer(cls.catalogue_tmp_dir) # showcase deployer cls.old_deployer = showcase.wgt_deployer cls.localcatalogue_tmp_dir_backup = os.path.join(cls.tmp_dir, 'localcatalogue_backup') cls.localcatalogue_tmp_dir = os.path.join(cls.tmp_dir, 'localcatalogue') showcase.wgt_deployer = WgtDeployer(cls.localcatalogue_tmp_dir) # deploy resource files for resource_file in cls.base_resources: resource_file = open( os.path.join(cls.shared_test_data_dir, resource_file), 'rb') resource_wgt = WgtFile(resource_file) catalogue.add_packaged_resource(resource_file, None, wgt_file=resource_wgt, deploy_only=True) showcase.wgt_deployer.deploy(resource_wgt) resource_file.close() # And freeze the resource files backup directories if os.path.exists(cls.localcatalogue_tmp_dir): os.rename(cls.localcatalogue_tmp_dir, cls.localcatalogue_tmp_dir_backup) else: os.mkdir(cls.localcatalogue_tmp_dir_backup) if os.path.exists(cls.catalogue_tmp_dir): os.rename(cls.catalogue_tmp_dir, cls.catalogue_tmp_dir_backup) else: os.mkdir(cls.catalogue_tmp_dir_backup)
def prepare_temporal_resource_directories(cls): cls.tmp_dir = mkdtemp() # catalogue deployer cls.old_catalogue_deployer = catalogue.wgt_deployer._root_dir cls.catalogue_tmp_dir_backup = os.path.join(cls.tmp_dir, 'catalogue_backup') cls.catalogue_tmp_dir = os.path.join(cls.tmp_dir, 'catalogue') catalogue.wgt_deployer._root_dir = cls.catalogue_tmp_dir # showcase deployer cls.old_deployer = showcase.wgt_deployer._root_dir cls.localcatalogue_tmp_dir_backup = os.path.join(cls.tmp_dir, 'localcatalogue_backup') cls.localcatalogue_tmp_dir = os.path.join(cls.tmp_dir, 'localcatalogue') showcase.wgt_deployer._root_dir = cls.localcatalogue_tmp_dir # deploy resource files for resource_file in cls.base_resources: resource_file = open( os.path.join(cls.shared_test_data_dir, resource_file), 'rb') resource_wgt = WgtFile(resource_file) catalogue.add_packaged_resource(resource_file, None, wgt_file=resource_wgt, deploy_only=True) showcase.wgt_deployer.deploy(resource_wgt) resource_file.close() # And freeze the resource files backup directories if os.path.exists(cls.localcatalogue_tmp_dir): os.rename(cls.localcatalogue_tmp_dir, cls.localcatalogue_tmp_dir_backup) else: os.mkdir(cls.localcatalogue_tmp_dir_backup) if os.path.exists(cls.catalogue_tmp_dir): os.rename(cls.catalogue_tmp_dir, cls.catalogue_tmp_dir_backup) else: os.mkdir(cls.catalogue_tmp_dir_backup)
def prepare_temporal_resource_directories(cls): from django.conf import settings cls.tmp_dir = mkdtemp() # Whoosh indexes cls.old_index_dir = settings.WIRECLOUD_INDEX_DIR settings.WIRECLOUD_INDEX_DIR = os.path.join(cls.tmp_dir, "whoosh_indexes") # catalogue deployer cls.old_catalogue_deployer = catalogue.wgt_deployer cls.catalogue_tmp_dir_backup = os.path.join(cls.tmp_dir, "catalogue_backup") cls.catalogue_tmp_dir = os.path.join(cls.tmp_dir, "catalogue") catalogue.wgt_deployer = WgtDeployer(cls.catalogue_tmp_dir) # showcase deployer cls.old_deployer = showcase.wgt_deployer cls.localcatalogue_tmp_dir_backup = os.path.join(cls.tmp_dir, "localcatalogue_backup") cls.localcatalogue_tmp_dir = os.path.join(cls.tmp_dir, "localcatalogue") showcase.wgt_deployer = WgtDeployer(cls.localcatalogue_tmp_dir) # deploy resource files for resource_file in cls.base_resources: resource_file = open(os.path.join(cls.shared_test_data_dir, resource_file), "rb") resource_wgt = WgtFile(resource_file) catalogue.add_packaged_resource(resource_file, None, wgt_file=resource_wgt, deploy_only=True) showcase.wgt_deployer.deploy(resource_wgt) resource_file.close() # And freeze the resource files backup directories if os.path.exists(cls.localcatalogue_tmp_dir): os.rename(cls.localcatalogue_tmp_dir, cls.localcatalogue_tmp_dir_backup) else: os.mkdir(cls.localcatalogue_tmp_dir_backup) if os.path.exists(cls.catalogue_tmp_dir): os.rename(cls.catalogue_tmp_dir, cls.catalogue_tmp_dir_backup) else: os.mkdir(cls.catalogue_tmp_dir_backup)
def wrapper(self, *args, **kwargs): if shared: base = self.shared_test_data_dir else: base = self.test_data_dir final_creator = User.objects.get( username=creator) if creator is not None else None final_users = tuple( User.objects.get(username=user) for user in users) final_groups = tuple( Group.objects.get(name=group) for group in groups) for resource in resources: wgt_file = open(os.path.join(base, resource), 'rb') wgt = WgtFile(wgt_file) fix_dev_version(wgt, final_creator) if deploy_only: catalogue.add_packaged_resource(wgt.get_underlying_file(), final_creator, wgt_file=wgt, deploy_only=True) wgt_file.close() continue resource = install_resource(wgt, final_creator) if public: resource.public = True resource.save() resource.users.add(*final_users) resource.groups.add(*final_groups) wgt_file.close() return test_func(self, *args, **kwargs)
def install_resource(wgt_file, executor_user): if not isinstance(wgt_file, WgtFile): raise TypeError('wgt_file must be a WgtFile') file_contents = wgt_file.get_underlying_file() template_contents = wgt_file.get_template() template = TemplateParser(template_contents) resources = CatalogueResource.objects.filter(vendor=template.get_resource_vendor(), short_name=template.get_resource_name(), version=template.get_resource_version())[:1] # Create/recreate/recover catalogue resource if '-dev' in template.get_resource_version() and len(resources) == 1: # TODO: Update widget visually resources[0].delete() resource = add_packaged_resource(file_contents, executor_user, wgt_file=wgt_file) elif len(resources) == 1: resource = resources[0] else: resource = add_packaged_resource(file_contents, executor_user, wgt_file=wgt_file) return resource
def wrapper(self, *args, **kwargs): if shared: base = self.shared_test_data_dir else: base = self.test_data_dir for resource in resources: wgt_file = open(os.path.join(base, resource), 'rb') wgt = WgtFile(wgt_file) if deploy_only: catalogue.add_packaged_resource(wgt_file, None, wgt_file=wgt, deploy_only=True) wgt_file.close() continue resource = install_resource(wgt, None) if public: resource.public = True resource.save() final_users = (User.objects.get(username=user) for user in users) resource.users.add(*final_users) final_groups = (Group.objects.get(name=group) for group in groups) resource.groups.add(*final_groups) wgt_file.close() return test_func(self, *args, **kwargs)
def install_resource(file_contents, executor_user): if isinstance(file_contents, string_types): file_contents = BytesIO(file_contents) wgt_file = WgtFile(file_contents) elif isinstance(file_contents, WgtFile): wgt_file = file_contents file_contents = wgt_file.get_underlying_file() else: raise Exception template_contents = wgt_file.get_template() template = TemplateParser(template_contents) resources = CatalogueResource.objects.filter(vendor=template.get_resource_vendor(), short_name=template.get_resource_name(), version=template.get_resource_version())[:1] # Create/recover catalogue resource if len(resources) == 1: resource = resources[0] else: resource = add_packaged_resource(file_contents, executor_user, wgt_file=wgt_file) return resource
def _handle(self, *args, **options): self.verbosity = int(options.get('verbosity', 1)) users = [] groups = [] redeploy = options['redeploy'] public = options['public'] users_string = options['users'].strip() groups_string = options['groups'].strip() if redeploy is False and public is False and users_string == '' and groups_string == '': raise CommandError( _('You must use at least one of the following flags: --redeploy, --users, --groups or --public' )) if not options['redeploy']: if users_string != '': for username in users_string.split(','): users.append(User.objects.get(username=username)) if groups_string != '': for groupname in groups_string.split(','): groups.append(Group.objects.get(name=groupname)) for file_name in options['files']: try: f = open(file_name, 'rb') wgt_file = WgtFile(f) except: self.log(_('Failed to read from %(file_name)s') % {'file_name': file_name}, level=1) continue try: template_contents = wgt_file.get_template() template = TemplateParser(template_contents) if options['redeploy']: add_packaged_resource(f, None, wgt_file=wgt_file, template=template, deploy_only=True) else: install_component(wgt_file, public=public, users=users, groups=groups) wgt_file.close() f.close() self.log(_( 'Successfully imported \"%(name)s\" from \"%(file_name)s\"' ) % { 'name': template.get_resource_processed_info()['title'], 'file_name': file_name }, level=1) except: self.log(_( 'Failed to import the mashable application component from %(file_name)s' ) % {'file_name': file_name}, level=1)