def publish_offering(offering, data): # Validate data if not 'marketplaces' in data: raise ValueError('Publication error: missing required field, marketplaces') # Validate the state of the offering if not offering.state == 'uploaded': raise PermissionDenied('Publication error: The offering ' + offering.name + ' ' + offering.version +' cannot be published') # Validate the offering has enough content to be published # Open offerings cannot be published in they do not contain # digital assets (applications or resources) if offering.open and not len(offering.resources) and not len(offering.applications): raise PermissionDenied('Publication error: Open offerings cannot be published if they do not contain at least a digital asset (resource or application)') # Publish the offering in the selected marketplaces for market in data['marketplaces']: try: m = Marketplace.objects.get(name=market) except: raise ValueError('Publication error: The marketplace ' + market + ' does not exist') market_adaptor = MarketAdaptor(m.host) info = { 'name': offering.name, 'url': offering.description_url } market_adaptor.add_service(settings.STORE_NAME, info) offering.marketplaces.append(m.pk) offering.state = 'published' offering.publication_date = datetime.now() offering.save() # Update offering indexes index_path = os.path.join(settings.BASEDIR, 'wstore') index_path = os.path.join(index_path, 'search') index_path = os.path.join(index_path, 'indexes') se = SearchEngine(index_path) se.update_index(offering)
def unregister_from_market(market): marketplace = None try: marketplace = Marketplace.objects.get(name=market) except: raise Exception('Not found') host = marketplace.host if host[-1] != '/': host += '/' marketadaptor = MarketAdaptor(host) try: marketadaptor.delete_store(settings.STORE_NAME) except HTTPError: raise Exception('Bad Gateway') marketplace.delete()
def register_on_market(name, host, site): # Check that the market name is not in use existing = True if host[-1] != '/': host += '/' try: Marketplace.objects.get(name=name) Marketplace.objects.get(host=host) except: existing = False if existing: raise Exception('Marketplace already registered') store_name = settings.STORE_NAME marketadaptor = MarketAdaptor(host) store_info = { 'store_name': store_name, 'store_uri': site, } try: marketadaptor.add_store(store_info) except HTTPError: raise Exception('Bad Gateway') try: Marketplace.objects.create(name=name, host=host) except Exception, e: # If the marketplace model creation fails it is necesary to unregister the store # in order to avoid an inconsistent state marketadaptor.delete_store(store_name) raise e
def delete_offering(offering): # If the offering has been purchased it is not deleted # it is marked as deleted in order to allow customers that # have purchased the offering to install it if needed #delete the usdl description from the repository if offering.state == 'deleted': raise PermissionDenied('The offering is already deleted') parsed_url = urlparse(offering.description_url) path = parsed_url.path host = parsed_url.scheme + '://' + parsed_url.netloc path = path.split('/') host += '/' + path[1] + '/' + path[2] collection = path[3] repository_adaptor = RepositoryAdaptor(host, collection) repository_adaptor.delete(path[4]) index_path = os.path.join(settings.BASEDIR, 'wstore') index_path = os.path.join(index_path, 'search') index_path = os.path.join(index_path, 'indexes') se = SearchEngine(index_path) if offering.state == 'uploaded': _remove_offering(offering, se) else: offering.state = 'deleted' offering.save() # Delete the offering from marketplaces for market in offering.marketplaces: m = Marketplace.objects.get(pk=market) market_adaptor = MarketAdaptor(m.host) market_adaptor.delete_service(settings.STORE_NAME, offering.name) # Update offering indexes if not offering.open: se.update_index(offering) context = Context.objects.all()[0] # Check if the offering is in the newest list if offering.pk in context.newest: # Remove the offering from the newest list newest = context.newest if len(newest) < 8: newest.remove(offering.pk) else: # Get the 8 newest offerings using the publication date for sorting connection = MongoClient() db = connection[settings.DATABASES['default']['NAME']] offerings = db.wstore_offering newest_off = offerings.find({'state': 'published'}).sort('publication_date', -1).limit(8) newest = [] for n in newest_off: newest.append(str(n['_id'])) context.newest = newest context.save() # Check if the offering is in the top rated list if offering.pk in context.top_rated: # Remove the offering from the top rated list top_rated = context.top_rated if len(top_rated) < 8: top_rated.remove(offering.pk) else: # Get the 4 top rated offerings connection = MongoClient() db = connection[settings.DATABASES['default']['NAME']] offerings = db.wstore_offering top_off = offerings.find({'state': 'published', 'rating': {'$gt': 0}}).sort('rating', -1).limit(8) top_rated = [] for t in top_off: top_rated.append(str(t['_id'])) context.top_rated = top_rated context.save() if offering.open: _remove_offering(offering, se)