code: def activate(
      self,
      data_table_ids: Union[List[str], str],
      commercial_schema: Optional[CommercialSchema] = None,
      trial_limit: Optional[int] = None,
      expires_at: Optional[str] = None,
      listing_type: Optional[ListingType] = None,
      provider: Optional[str] = None,
      provider_link: Optional[str] = None,
      source: Optional[str] = None,
      source_link: Optional[str] = None,
      client_emails: Optional[List[str]] = None,
  ):
      trace_id = str(uuid.uuid4())
      with MDC(trace_id=trace_id):
          try:
              if data_table_ids is None or len(data_table_ids) == 0:
                  raise ValidationError("Empty data table ids")
              if isinstance(data_table_ids, str):
                  data_table_ids = [data_table_ids]
              if not isinstance(data_table_ids, list):
                  raise ValidationError(
                      "data_table_ids should be string or list of strings"
                  )
              # if listing_type == ListingType.PRIVATE and (client_emails is None or len(client_emails) == 0):
              #     raise ValidationError("Empty client emails for private data tables")
              # if listing_type not in [ListingType.PRIVATE, ListingType.TRIAL] and client_emails is not None:
              #     raise ValidationError("Client emails make sense only for private data table")
  
              request = {"dataTableIds": data_table_ids}
              if commercial_schema is not None:
                  request["commercialSchema"] = commercial_schema.value
              if trial_limit is not None:
                  request["trialLimit"] = trial_limit
              if expires_at is not None:
                  try:
                      datetime.strptime(expires_at, "%Y-%m-%d")
                  except Exception:
                      raise ValidationError(
                          "Invalid format of expires_at. It should be like YYYY-MM-DD"
                      )
                  request["expiresAt"] = expires_at
              if listing_type is not None:
                  request["listingType"] = listing_type.value
              if provider is not None:
                  request["provider"] = provider
              if provider_link is not None:
                  request["providerLink"] = provider_link
              if source is not None:
                  request["source"] = source
              if source_link is not None:
                  request["sourceLink"] = source_link
              if client_emails is not None:
                  request["clientEmails"] = client_emails
              self.logger.info(
                  f"Activating data tables with request {request}"
              )
  
              self._rest_client.activate_datatables(request, trace_id)
  
              msg = "Data tables successfully activated"
              self.logger.info(msg)
              print(msg)
          except HttpError as e:
              if e.status_code == 404:
                  raise Exception("One of data tables not found")
          except Exception:
              self.logger.exception("Failed to activate data tables")
              raise
  
imports: import logging
  import time
  import uuid
  from datetime import datetime
  from enum import Enum
  from typing import Dict, List, Optional, Union
  from upgini.errors import HttpError, ValidationError
  from upgini.http import LoggerFactory, get_rest_client
  from upgini.mdc import MDC
  from upgini.metadata import SearchKey
  from upgini.spinner import Spinner
label_desc: Use image node_id 4 for calling the DataSourcePublisher obj's underlying member method code with example usage: obj.activate(data_table_ids, commercial_schema, trial_limit, expires_at, listing_type, provider, provider_link, source, source_link, client_emails) without return types