Пример #1
0
    def dv_insertion_order_load_multiple():
        campaigns = set([
            lookup_id(row[0]) for row in get_rows(
                config, task["auth_sheets"], {
                    "sheets": {
                        "sheet": task["sheet"],
                        "tab": "DV Campaigns",
                        "header": False,
                        "range": "A2:A"
                    }
                })
        ])

        rows = get_rows(
            config, task["auth_sheets"], {
                "sheets": {
                    "sheet": task["sheet"],
                    "tab": "DV Advertisers",
                    "header": False,
                    "range": "A2:A"
                }
            })

        # String for filtering which entityStatus enums we want to see in the sheet
        for row in rows:
            for record in API_DV360(
                    config, task["auth_dv"], iterate=True
            ).advertisers().insertionOrders(
            ).list(advertiserId=lookup_id(row[0]),
                   filter=
                   'entityStatus="ENTITY_STATUS_PAUSED" OR entityStatus="ENTITY_STATUS_ACTIVE" OR entityStatus="ENTITY_STATUS_DRAFT"'
                   ).execute():
                if not campaigns or record['campaignId'] in campaigns:
                    yield record
Пример #2
0
def frequency_cap_patch(commit=False):
  patches = []

  rows = get_rows(
    project.task["auth_bigquery"],
    { "bigquery": {
      "dataset": project.task["dataset"],
      "table":"PATCH_FrequencyCaps",
    }},
    as_object=True
  )

  for row in rows:

    frequency_cap = {}

    if row['Unlimited'] != row['Unlimited_Edit']:
      frequency_cap.setdefault("frequencyCap", {})
      frequency_cap["frequencyCap"]["unlimited"] = row['Unlimited_Edit']
    if row['Time_Unit'] != row['Time_Unit_Edit']:
      frequency_cap.setdefault("frequencyCap", {})
      frequency_cap["frequencyCap"]["timeUnit"] = row['Time_Unit_Edit']
    if row['Time_Count'] != row['Time_Count_Edit']:
      frequency_cap.setdefault("frequencyCap", {})
      frequency_cap["frequencyCap"]["timeUnitCount"] = row['Time_Count_Edit']
    if row['Max_impressions'] != row['Max_impressions_Edit']:
      frequency_cap.setdefault("frequencyCap", {})
      frequency_cap["frequencyCap"]["maxImpressions"] = row['Max_impressions_Edit']

    if frequency_cap:
      patch = {
          "operation": "Frequency Caps",
          "action": "PATCH",
          "partner": row['Partner'],
          "advertiser": row['Advertiser'],
          "parameters": {
              "advertiserId": lookup_id(row['Advertiser']),
              "body": frequency_cap
          }
      }

      if row['Line_Item']:
        patch["line_item"] = row['Line_Item']
        patch["parameters"]["lineItemId"] = lookup_id(row['Line_Item'])
      elif row['Insertion_Order']:
        patch["insertion_order"] = row['Insertion_Order']
        patch["parameters"]["insertionOrderId"] = lookup_id(row['Insertion_Order'])
      else:
        patch["campaign"] = row['Campaign']
        patch["parameters"]["campaignId"] = lookup_id(row['Campaign'])

      patches.append(patch)

  patch_masks(patches)
  patch_preview(patches)

  if commit:
    insertion_order_commit(patches)
    line_item_commit(patches)
    campaign_commit(patches)
Пример #3
0
    def load_multiple():
        partners = get_rows(
            project.task['auth_sheets'], {
                'sheets': {
                    'sheet': project.task['sheet'],
                    'tab': 'Partners',
                    'range': 'A2:A'
                }
            })

        for partner in partners:
            yield from API_DV360(
                project.task['auth_dv'],
                iterate=True).partners().channels().list(
                    partnerId=lookup_id(partner[0])).execute()

        advertisers = get_rows(
            project.task['auth_sheets'], {
                'sheets': {
                    'sheet': project.task['sheet'],
                    'tab': 'Advertisers',
                    'range': 'A2:A'
                }
            })

        for advertiser in advertisers:
            yield from API_DV360(
                project.task['auth_dv'],
                iterate=True).advertisers().channels().list(
                    advertiserId=lookup_id(advertiser[0])).execute()
Пример #4
0
    def line_item_load_multiple():
        campaigns = set([
            lookup_id(row[0]) for row in get_rows(
                project.task["auth_sheets"], {
                    "sheets": {
                        "sheet": project.task["sheet"],
                        "tab": "Campaigns",
                        "range": "A2:A"
                    }
                })
        ])

        rows = get_rows(
            project.task["auth_sheets"], {
                "sheets": {
                    "sheet": project.task["sheet"],
                    "tab": "Advertisers",
                    "range": "A2:A"
                }
            })

        # String for filtering which entityStatus enums we want to see in the sheet
        for row in rows:
            for record in API_DV360(
                    project.task["auth_dv"], iterate=True
            ).advertisers().lineItems(
            ).list(advertiserId=lookup_id(row[0]),
                   filter=
                   'entityStatus = "ENTITY_STATUS_ARCHIVED" OR entityStatus="ENTITY_STATUS_PAUSED" OR entityStatus="ENTITY_STATUS_ACTIVE" OR entityStatus="ENTITY_STATUS_DRAFT"'
                   ).execute():
                if not campaigns or record['campaignId'] in campaigns:
                    yield record
Пример #5
0
    def load_multiple():
        partners = get_rows(
            config, task['auth_sheets'], {
                'sheets': {
                    'sheet': task['sheet'],
                    'tab': 'Partners',
                    'header': False,
                    'range': 'A2:A'
                }
            })

        for partner in partners:
            yield from API_DV360(
                config, task['auth_dv'], iterate=True).inventorySources().list(
                    partnerId=lookup_id(partner[0])).execute()

        advertisers = get_rows(
            config, task['auth_sheets'], {
                'sheets': {
                    'sheet': task['sheet'],
                    'tab': 'Advertisers',
                    'header': False,
                    'range': 'A2:A'
                }
            })

        for advertiser in advertisers:
            yield from API_DV360(
                config, task['auth_dv'], iterate=True).inventorySources().list(
                    advertiserId=lookup_id(advertiser[0])).execute()
Пример #6
0
def integration_detail_patch(commit=False):
    patches = []

    rows = get_rows(project.task["auth_bigquery"], {
        "bigquery": {
            "dataset": project.task["dataset"],
            "table": "PATCH_IntegrationDetails",
        }
    },
                    as_object=True)

    for row in rows:

        integration_details = {}

        if row['Integration_Code'] != row['Integration_Code_Edit']:
            integration_details.setdefault("integrationDetails", {})
            integration_details["integrationDetails"]["integrationCode"] = row[
                'Integration_Code_Edit']
        if row['Details'] != row['Details_Edit']:
            integration_details.setdefault("integrationDetails", {})
            integration_details["integrationDetails"]["details"] = row[
                'Details_Edit']

        if integration_details:
            patch = {
                "operation": "Pacing",
                "action": "PATCH",
                "partner": row['Partner'],
                "parameters": {
                    "advertiserId": lookup_id(row['Advertiser']),
                    "body": integration_details
                }
            }

            if row['Line_Item']:
                patch["line_item"] = row['Line_Item']
                patch["parameters"]["lineItemId"] = lookup_id(row['Line_Item'])

            elif row['Insertion_Order']:
                patch["insertion_order"] = row['Insertion_Order']
                patch["parameters"]["insertionOrderId"] = lookup_id(
                    row['Insertion_Order'])

            else:
                patch["advertiser"] = row['Advertiser']
                patch["parameters"]["advertiserId"] = lookup_id(
                    row['Advertiser'])

            patches.append(patch)

    patch_masks(patches)

    if commit:
        insertion_order_commit(patches)
        line_item_commit(patches)
        advertiser_commit(patches)
    else:
        patch_preview(patches)
Пример #7
0
    def load_bulk():
        # TODO: incorporate filters into line item fetch
        line_items = [
            lookup_id(p[0]) for p in get_rows(
                project.task['auth_sheets'], {
                    'sheets': {
                        'sheet': project.task['sheet'],
                        'tab': 'Line Items',
                        'range': 'A2:A'
                    }
                })
        ]

        parameters = get_rows(project.task["auth_bigquery"], {
            "bigquery": {
                "dataset":
                project.task["dataset"],
                "query":
                "SELECT advertiserId, lineItemId FROM `{dataset}.DV_LineItems`"
                .format(**project.task)
            }
        },
                              as_object=True)

        for parameter in parameters:
            yield from API_DV360(
                project.task["auth_dv"], iterate=True).advertisers().lineItems(
                ).bulkListLineItemAssignedTargetingOptions(
                    advertiserId=str(parameter['advertiserId']),
                    lineItemId=str(parameter['lineItemId']),
                ).execute()
Пример #8
0
    def load_multiple():
        #partners = get_rows(
        #  project.task['auth_sheets'],
        #  { 'sheets': {
        #    'sheet': project.task['sheet'],
        #    'tab': 'Partners',
        #    'range': 'A2:A'
        #  }}
        #)

        #for partner in partners:
        #  yield from API_DV360(
        #    project.task['auth_dv'],
        #    iterate=True
        #  ).firstAndThirdPartyAudiences().list(
        #    partnerId=lookup_id(partner[0])
        #  ).execute()

        advertisers = get_rows(
            project.task['auth_sheets'], {
                'sheets': {
                    'sheet': project.task['sheet'],
                    'tab': 'Advertisers',
                    'range': 'A2:A'
                }
            })

        for advertiser in advertisers:
            yield from API_DV360(
                project.task['auth_dv'],
                iterate=True).firstAndThirdPartyAudiences().list(
                    advertiserId=lookup_id(advertiser[0])).execute()
Пример #9
0
    def load_multiple():

        campaigns = [
            str(lookup_id(r)) for r in set(
                get_rows(config,
                         task['auth_cm'], {
                             'sheets': {
                                 'sheet': task['sheet'],
                                 'tab': 'CM Campaigns',
                                 'header': False,
                                 'range': 'A2:A'
                             }
                         },
                         unnest=True))
        ]

        for row in get_rows(
                config, task['auth_sheets'], {
                    'sheets': {
                        'sheet': task['sheet'],
                        'tab': 'CM Accounts',
                        'header': False,
                        'range': 'A2:A'
                    }
                }):
            if row:
                account_id = lookup_id(row[0])

                is_superuser, profile_id = get_profile_for_api(
                    config, task['auth_cm'], account_id)
                kwargs = {
                    'profileId': profile_id,
                    'campaignIds': campaigns,
                    'archived': False
                }
                if is_superuser:
                    kwargs['accountId'] = account_id

                yield from API_DCM(
                    config,
                    task['auth_cm'],
                    iterate=True,
                    internal=is_superuser).placementGroups().list(
                        **kwargs).execute()
Пример #10
0
 def load_multiple():
     for row in get_rows(
             project.task['auth_sheets'], {
                 'sheets': {
                     'sheet': project.task['sheet'],
                     'tab': 'Partners',
                     'header': False,
                     'range': 'A2:A'
                 }
             }):
         if row:
             yield from API_DV360(
                 project.task['auth_dv'], iterate=True).advertisers().list(
                     partnerId=lookup_id(row[0])).execute()
Пример #11
0
    def creative_load_multiple():
        rows = get_rows(
            project.task["auth_sheets"], {
                "sheets": {
                    "sheet": project.task["sheet"],
                    "tab": "Advertisers",
                    "range": "A2:A"
                }
            })

        for row in rows:
            yield from API_DV360(project.task["auth_dv"],
                                 iterate=True).advertisers().creatives().list(
                                     advertiserId=lookup_id(row[0])).execute()
Пример #12
0
    def campaign_load_multiple():
        rows = get_rows(
            project.task['auth_sheets'], {
                'sheets': {
                    'sheet': project.task['sheet'],
                    'tab': 'Advertisers',
                    'range': 'A2:A'
                }
            })

        for row in rows:
            yield from API_DV360(project.task['auth_dv'],
                                 iterate=True).advertisers().campaigns().list(
                                     advertiserId=lookup_id(row[0])).execute()
Пример #13
0
 def insertion_order_load_multiple():
     for row in get_rows(
             project.task["auth_sheets"], {
                 "sheets": {
                     "sheet": project.task["sheet"],
                     "tab": "Advertisers",
                     "header": False,
                     "range": "A2:A"
                 }
             }):
         if row:
             yield from API_DV360(
                 project.task["auth_dv"],
                 iterate=True).advertisers().insertionOrders().list(
                     advertiserId=lookup_id(row[0])).execute()
    def load_multiple():
        advertisers = get_rows(
            project.task['auth_sheets'], {
                'sheets': {
                    'sheet': project.task['sheet'],
                    'tab': 'Advertisers',
                    'range': 'A2:A'
                }
            })

        for advertiser in advertisers:
            yield from API_DV360(
                project.task['auth_dv'],
                iterate=True).advertisers().negativeKeywordLists().list(
                    advertiserId=lookup_id(advertiser[0])).execute()
Пример #15
0
 def load_multiple():
     for row in get_rows(
             config, task['auth_sheets'], {
                 'sheets': {
                     'sheet': task['sheet'],
                     'tab': 'DV Partners',
                     'header': False,
                     'range': 'A2:A'
                 }
             }):
         if row:
             yield from API_DV360(
                 config, task['auth_dv'],
                 iterate=True).customBiddingAlgorithms().list(
                     partnerId=lookup_id(row[0])).execute()
Пример #16
0
    def load_multiple():
        advertisers = get_rows(
            project.task['auth_sheets'], {
                'sheets': {
                    'sheet': project.task['sheet'],
                    'tab': 'Advertisers',
                    'header': False,
                    'range': 'A2:A'
                }
            })

        for advertiser in advertisers:
            yield from API_DV360(
                project.task['auth_dv'],
                iterate=True).combinedAudiences().list(
                    advertiserId=lookup_id(advertiser[0])).execute()
Пример #17
0
    def load_multiple():
        advertisers = get_rows(
            config, task['auth_sheets'], {
                'sheets': {
                    'sheet': task['sheet'],
                    'tab': 'Advertisers',
                    'header': False,
                    'range': 'A2:A'
                }
            })

        for advertiser in advertisers:
            yield from API_DV360(
                config, task['auth_dv'],
                iterate=True).firstAndThirdPartyAudiences().list(
                    advertiserId=lookup_id(advertiser[0])).execute()
Пример #18
0
 def load_multiple():
     for row in get_rows(
             config, task['auth_sheets'], {
                 'sheets': {
                     'sheet': task['sheet'],
                     'tab': 'DV Partners',
                     'header': False,
                     'range': 'A2:A'
                 }
             }):
         if row:
             yield from API_DV360(
                 config, task['auth_dv'], iterate=True).advertisers().list(
                     partnerId=lookup_id(row[0]),
                     filter='entityStatus="ENTITY_STATUS_ACTIVE"').execute(
                     )
Пример #19
0
    def load_multiple():
        advertisers = get_rows(
            project.task['auth_sheets'], {
                'sheets': {
                    'sheet': project.task['sheet'],
                    'tab': 'Advertisers',
                    'range': 'A1:A'
                }
            })

        for advertiser in advertisers:
            for targeting_type in TARGETING_TYPES:
                yield from API_DV360(
                    project.task['auth_dv'],
                    iterate=True).targetingTypes().targetingOptions().list(
                        advertiserId=lookup_id(advertiser[0]),
                        targetingType=targeting_type).execute()
Пример #20
0
    def load_bulk():
        advertisers = [
            lookup_id(p[0]) for p in get_rows(
                project.task['auth_sheets'], {
                    'sheets': {
                        'sheet': project.task['sheet'],
                        'tab': 'Advertisers',
                        'range': 'A2:A'
                    }
                })
        ]

        for advertiser in advertisers:
            yield from API_DV360(project.task["auth_dv"],
                                 iterate=True).advertisers(
                                 ).bulkListAdvertiserAssignedTargetingOptions(
                                     advertiserId=str(advertiser)).execute()
Пример #21
0
  def line_item_load_multiple():
    rows = get_rows(
        project.task["auth_sheets"], {
            "sheets": {
                "sheet": project.task["sheet"],
                "tab": "Advertisers",
                "range": "A2:A"
            }
        })

    # String for filtering which entityStatus enums we want to see in the sheet
    filter_string = 'entityStatus = "ENTITY_STATUS_ARCHIVED" OR entityStatus="ENTITY_STATUS_PAUSED" OR entityStatus="ENTITY_STATUS_ACTIVE" OR entityStatus="ENTITY_STATUS_DRAFT"'
    for row in rows:
      yield from API_DV360(
          project.task["auth_dv"], iterate=True).advertisers().lineItems().list(
              advertiserId=lookup_id(row[0]),
              filter=filter_string).execute()
Пример #22
0
    def load_bulk():
        partners = [
            lookup_id(p[0]) for p in get_rows(
                project.task['auth_sheets'], {
                    'sheets': {
                        'sheet': project.task['sheet'],
                        'tab': 'Partners',
                        'range': 'A2:A'
                    }
                })
        ]

        for partner in partners:
            yield from API_DV360(
                project.task["auth_dv"], iterate=True).partners(
                ).targetingTypes().assignedTargetingOptions().list(
                    partnerId=str(partner),
                    targetingType='TARGETING_TYPE_CHANNEL').execute()
Пример #23
0
 def insertion_order_load_multiple():
     for row in get_rows(
             config, task["auth_sheets"], {
                 "sheets": {
                     "sheet": task["sheet"],
                     "tab": "Advertisers",
                     "header": False,
                     "range": "A2:A"
                 }
             }):
         if row:
             yield from API_DV360(
                 config, task["auth_dv"], iterate=True
             ).advertisers().insertionOrders().list(
                 advertiserId=lookup_id(row[0]),
                 filter=
                 'entityStatus="ENTITY_STATUS_PAUSED" OR entityStatus="ENTITY_STATUS_ACTIVE" OR entityStatus="ENTITY_STATUS_DRAFT"'
             ).execute()
Пример #24
0
    def creative_load_multiple():
        rows = get_rows(
            config, task["auth_sheets"], {
                "sheets": {
                    "sheet": task["sheet"],
                    "tab": "Advertisers",
                    "header": False,
                    "range": "A2:A"
                }
            })

        for row in rows:
            yield from API_DV360(
                config, task["auth_dv"], iterate=True
            ).advertisers().creatives().list(
                advertiserId=lookup_id(row[0]),
                filter='entityStatus="ENTITY_STATUS_ACTIVE"',
                fields=
                'creatives.displayName,creatives.creativeId,creatives.entityStatus,creatives.creativeType,creatives.dimensions,creatives.reviewStatus,nextPageToken'
            ).execute(limit=CREATIVE_COUNT_LIMIT)
Пример #25
0
 def campaign_load_multiple():
   for row in get_rows(
     config,
     task['auth_sheets'],
     { 'sheets': {
       'sheet': task['sheet'],
       'tab': 'Advertisers',
       'header':False,
       'range': 'A2:A'
     }}
   ):
     if row:
       yield from API_DV360(
         config,
         task['auth_dv'],
         iterate=True
       ).advertisers().campaigns().list(
         advertiserId=lookup_id(row[0]),
         filter='entityStatus="ENTITY_STATUS_PAUSED" OR entityStatus="ENTITY_STATUS_ACTIVE" OR entityStatus="ENTITY_STATUS_DRAFT"',
         fields='campaigns.displayName,campaigns.campaignId,campaigns.advertiserId,nextPageToken'
       ).execute()
Пример #26
0
 def load_multiple():
   for row in get_rows(
     config,
     task['auth_sheets'],
     { 'sheets': {
       'sheet': task['sheet'],
       'tab': 'CM Profiles',
       'header':False,
       'range': 'A2:A'
     }}
   ):
     if row:
       account_id = lookup_id(row[0])
       is_superuser, profile_id = get_profile_for_api(config, task['auth_cm'], account_id)
       kwargs = { 'profileId': profile_id, 'accountId': account_id } if is_superuser else { 'profileId': profile_id }
       yield from API_DCM(
         config,
         task['auth_cm'],
         iterate=True,
         internal=is_superuser
       ).accounts().list(**kwargs).execute()
Пример #27
0
def partner_cost_patch(commit=False):
    patches = {}
    changed = set()

    rows = get_rows(project.task["auth_bigquery"], {
        "bigquery": {
            "dataset": project.task["dataset"],
            "table": "PATCH_PartnerCosts",
        }
    },
                    as_object=True)

    for row in rows:

        lookup = row['Line_Item'] or row['Insertion_Order']

        patches.setdefault(
            lookup, {
                "operation": "Partner Costs",
                "action": "PATCH",
                "partner": row['Partner'],
                "advertiser": row['Advertiser'],
                "campaign": row['Campaign'],
                "parameters": {
                    "advertiserId": lookup_id(row['Advertiser']),
                    "body": {
                        "partnerCosts": []
                    }
                }
            })

        if row['Line_Item']:
            patches[lookup]["line_item"] = row['Line_Item']
            patches[lookup]["parameters"]["lineItemId"] = lookup_id(
                row['Line_Item'])
        else:
            patches[lookup]["insertion_order"] = row['Insertion_Order']
            patches[lookup]["parameters"]["insertionOrderId"] = lookup_id(
                row['Insertion_Order'])

        patches[lookup]["parameters"]["body"]["partnerCosts"].append({
            "costType":
            row['Cost_Type_Edit'],
            "feeType":
            row['Fee_Type_Edit'],
            "invoiceType":
            row['Invoice_Type_Edit'],
            "feeAmount":
            int(float(row['Fee_Amount_Edit']) *
                100000) if row['Fee_Amount_Edit'] else None,
            "feePercentageMillis":
            int(float(row['Fee_Percent_Edit']) *
                1000) if row['Fee_Percent_Edit'] else None
        })

        if row['Cost_Type'] != row['Cost_Type_Edit'] \
          or row['Fee_Type'] != row['Fee_Type_Edit'] \
          or row['Invoice_Type'] != row['Invoice_Type_Edit'] \
          or row['Fee_Amount'] != row['Fee_Amount_Edit'] \
          or row['Fee_Percent'] != row['Fee_Percent_Edit']:
            changed.add(lookup)

    # Remove any patches where partner costs have not changed
    for pc in list(patches.keys()):
        if pc not in changed:
            del patches[pc]
    patches = list(patches.values())

    patch_masks(patches)

    if commit:
        insertion_order_commit(patches)
        line_item_commit(patches)
    else:
        patch_preview(patches)
Пример #28
0
def pacing_patch(commit=False):

  patches = []

  rows = get_rows(
    project.task["auth_bigquery"],
    { "bigquery": {
      "dataset": project.task["dataset"],
      "table":"PATCH_Pacing",
    }},
    as_object=True
  )

  for row in rows:

    pacing = {}

    if row['Period'] != row['Period_Edit']:
      pacing.setdefault("pacing", {})
      pacing["pacing"]["pacingPeriod"] = row['Period_Edit']

    if row['Type'] != row['Type_Edit']:
      pacing.setdefault("pacing", {})
      pacing["pacing"]["pacingType"] = row['Type_Edit']

    if row['Daily_Budget'] != row['Daily_Budget_Edit']:
      pacing.setdefault("pacing", {})
      pacing["pacing"]["dailyMaxMicros"] = int(float(row['Daily_Budget_Edit']) * 100000)

    if row['Daily_Impressions'] != row['Daily_Impressions_Edit']:
      pacing.setdefault("pacing", {})
      pacing["pacing"]["dailyMaxImpressions"] = row['Daily_Impressions_Edit']

    if pacing:
      patch = {
          "operation": "Pacing",
          "action": "PATCH",
          "partner": row['Partner'],
          "advertiser": row['Advertiser'],
          "campaign": row['Campaign'],
          "parameters": {
              "advertiserId": lookup_id(row['Advertiser']),
              "body": pacing
          }
      }

      if row['Line_Item']:
        patch["line_item"] = row['Line_Item']
        patch["parameters"]["lineItemId"] = lookup_id(row['Line_Item'])
      else:
        patch["insertion_order"] = row['Insertion_Order']
        patch["parameters"]["insertionOrderId"] = lookup_id(row['Insertion_Order'])

      patches.append(patch)

  patch_masks(patches)

  if commit:
    insertion_order_commit(patches)
    line_item_commit(patches)
  else:
    patch_preview(patches)
Пример #29
0
def line_item_patch(commit=False):

  def date_edited(value):
    y, m, d = value.split("-")
    return {"year": y, "month": m, "day": d}

  patches = []

  rows = get_rows(
    project.task["auth_bigquery"],
    { "bigquery": {
      "dataset": project.task["dataset"],
      "table":"PATCH_LineItems",
    }},
    as_object=True
  )

  for row in rows:

    if row['Action'] == "DELETE":
      patches.append({
        "operation": "Line Items",
        "action": "DELETE",
        "partner": row['Partner'],
        "advertiser": row['Advertiser'],
        "campaign": row['Campaign'],
        "line_item": row['Line_Item'],
        "parameters": {
          "advertiserId": lookup_id(row['Advertiser']),
          "lineItemId": lookup_id(row['Line_Item'])
        }
      })

    elif row['Action'] == "PATCH":
      line_item = {}

      if row['Line_Item_Type'] != row['Line_Item_Type_Edit']:
        line_item["lineItemType"] = row['Line_Item_Type_Edit']

      if row['Status'] != row['Status_Edit']:
        line_item['entityStatus'] = row['Status_Edit']

      if row['Flight_Data_Type'] != row['Flight_Data_Type_Edit']:
        line_item.setdefault("flight", {})
        line_item["flight"]["flightDateType"] = row['Flight_Data_Type_Edit']

      if row['Flight_Start_Date'] != row['Flight_Start_Date_Edit']:
        line_item.setdefault("flight", {}).setdefault("dateRange", {})
        line_item["flight"]["dateRange"]["startDate"] = date_edited(row['Flight_Start_Date_Edit'])

      if row['Flight_End_Date'] != row['Flight_End_Date_Edit']:
        line_item.setdefault("flight", {}).setdefault("endDate", {})
        line_item["flight"]["dateRange"]["endDate"] = date_edited(row['Flight_End_Date_Edit'])

      if row['Flight_Trigger'] != row['Flight_Trigger_Edit']:
        line_item.setdefault("flight", {})
        line_item["flight"]["triggerId"] = row['Flight_Trigger_Edit']

      if row['Budget_Allocation_Type'] != row['Budget_Allocation_Type_Edit']:
        line_item.setdefault("budget", {})
        line_item["budget"]["budgetAllocationType"] = row['Budget_Allocation_Type_Edit']

      if row['Budget_Unit'] != row['Budget_Unit_Edit']:
        line_item.setdefault("budget", {})
        line_item["budget"]["budgetUnit"] = row['Budget_Unit_Edit']

      if row['Budget_Max'] != row['Budget_Max_Edit']:
        line_item.setdefault("budget", {})
        line_item["budget"]["maxAmount"] = int(
          float(row['Budget_Max_Edit']) * 100000
        )

      if row['Partner_Revenue_Model'] != row['Partner_Revenue_Model_Edit']:
        line_item.setdefault("partnerRevenueModel", {})
        line_item["partnerRevenueModel"]["markupType"] = row['Partner_Revenue_Model_Edit']

      if row['Partner_Markup'] != row['Partner_Markup_Edit']:
        line_item.setdefault("partnerRevenueModel", {})
        line_item["partnerRevenueModel"]["markupAmount"] = int(
          float(row['Partner_Markup_Edit']) * 100000
        )

      if row['Conversion_Percent'] != row['Conversion_Percent_Edit']:
        line_item.setdefault("conversionCounting", {})
        line_item["conversionCounting"]["postViewCountPercentageMillis"] = int(
          float(row['Conversion_Percent_Edit']) * 1000
        )

      if row['Targeting_Expansion_Level'] != row['Targeting_Expansion_Level_Edit']:
        line_item.setdefault("targetingExpansion", {})
        line_item["targetingExpansion"]["targetingExpansionLevel"] = row['Targeting_Expansion_Level_Edit']

      if row['Exclude_1P'] != row['Exclude_1P_Edit']:
        line_item.setdefault("targetingExpansion", {})
        line_item["targetingExpansion"]["excludeFirstPartyAudience"] = row['Exclude_1P_Edit']

      if line_item:
        patches.append({
          "operation": "Line Items",
          "action": "PATCH",
          "partner": row['Partner'],
          "advertiser": row['Advertiser'],
          "campaign": row['Campaign'],
          "line_item": row['Line_Item'],
          "parameters": {
            "advertiserId": lookup_id(row['Advertiser']),
            "lineItemId": lookup_id(row['Line_Item']),
            "body": line_item
          }
        })

  patch_masks(patches)
  patch_preview(patches)

  if commit:
    line_item_commit(patches)
Пример #30
0
def targeting_edit(commit=False):
    edits = []
    targetings = {}

    targeting_combine()

    rows = get_rows(project.task["auth_bigquery"], {
        "bigquery": {
            "dataset": project.task["dataset"],
            "table": "SHEET_Combined_Targeting",
        }
    },
                    as_object=True)

    for row in rows:
        for layer in ['Partner', 'Advertiser', 'LineItem']:

            targeting = None
            partner = None
            advertiser = None
            lineitem = None

            if row[layer]:

                if layer == 'Partner':
                    partner = lookup_id(row['Partner'])
                if layer == 'Advertiser':
                    advertiser = lookup_id(row['Advertiser'])
                if layer == 'LineItem':
                    advertiser = row['Advertiser_Lookup']
                    lineitem = lookup_id(row['LineItem'])

                targeting = targetings.setdefault(
                    (layer, row[layer]),
                    Assigned_Targeting(project.task["auth_dv"], partner,
                                       advertiser, lineitem))

            if targeting:
                if row['Authorized_Seller']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_authorized_seller(
                            row['Authorized_Seller'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_authorized_seller(
                            row['Authorized_Seller'])

                if row['User_Rewarded_Content']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_user_rewarded_content(
                            row['User_Rewarded_Content'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_user_rewarded_content(
                            row['User_Rewarded_Content'])

                if row['Exchange']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_exchange(row['Exchange'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_exchange(row['Exchange'])

                if row['Sub_Exchange']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_sub_exchange(row['Sub_Exchange'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_sub_exchange(row['Sub_Exchange'])

                if row['Channel']:
                    identifier = lookup_id(row['Channel'])
                    if row['Action'].upper() == 'ADD':
                        targeting.add_channel(identifier,
                                              row['Channel_Negative'] or False)
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_channel(identifier)

                if row['Inventory_Source']:
                    identifier = lookup_id(row['Inventory_Source'])
                    if row['Action'].upper() == 'ADD':
                        targeting.add_inventory_source(identifier)
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_inventory_source(identifier)

                if row['Inventory_Group']:
                    identifier = lookup_id(row['Inventory_Group'])
                    if row['Action'].upper() == 'ADD':
                        targeting.add_inventory_source_group(identifier)
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_inventory_source_group(identifier)

                if row['URL']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_url(row['URL'], row['Url_Negative']
                                          or False)
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_url(row['URL'])

                if row['App']:
                    identifier = lookup_id(row['App'])
                    if row['Action'].upper() == 'ADD':
                        targeting.add_app(identifier, row['App_Negative']
                                          or False)
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_app(identifier)

                if row['App_Category']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_app_category(
                            row['App_Category'], row['App_Category_Negative']
                            or False)
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_app_category(row['App_Category'])

                if row['Content_Label']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_content_label(row['Content_Label'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_content_label(row['Content_Label'])

                if row['Sensitive_Category']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_sensitive_category(
                            row['Sensitive_Category'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_sensitive_category(
                            row['Sensitive_Category'])

                if row['Negative_Keyword_List']:
                    identifier = lookup_id(row['Negative_Keyword_List'])
                    if row['Action'].upper() == 'ADD':
                        targeting.add_negative_keyword_list(identifier)
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_negative_keyword_list(identifier)

                if row['Keyword']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_keyword(row['Keyword'],
                                              row['Keyword_Negative'] or False)
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_keyword(row['Keyword'])

                if row['Category']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_category(
                            row['Category'], row['Category_Negative'] or False)
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_category(row['Category'])

                if row['Age_Range']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_age_range(row['Age_Range'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_age_range(row['Age_Range'])

                if row['Gender']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_gender(row['Gender'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_gender(row['Gender'])

                if row['Parental_Status']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_parental_status(row['Parental_Status'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_parental_status(
                            row['Parental_Status'])

                if row['Household_Income']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_household_income(row['Household_Income'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_household_income(
                            row['Household_Income'])

                if row['Language']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_language(
                            row['Language'], row['Language_Negative'] or False)
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_language(row['Language'])

                if row['Included_1P_And_3P']:
                    identifier = lookup_id(row['Included_1P_And_3P'])
                    if row['Action'].upper() == 'ADD':
                        targeting.add_included_1p_and_3p_audience(
                            identifier, row['Included_1P_And_3P_Recency'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_included_1p_and_3p_audience(
                            identifier)

                if row['Excluded_1P_And_3P']:
                    identifier = lookup_id(row['Excluded_1P_And_3P'])
                    if row['Action'].upper() == 'ADD':
                        targeting.add_excluded_1p_and_3p_audience(
                            identifier, row['Excluded_1P_And_3P_Recency'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_excluded_1p_and_3p_audience(
                            identifier)

                if row['Included_Google']:
                    identifier = lookup_id(row['Included_Google'])
                    if row['Action'].upper() == 'ADD':
                        targeting.add_included_google_audience(identifier)
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_included_google_audience(identifier)

                if row['Excluded_Google']:
                    identifier = lookup_id(row['Excluded_Google'])
                    if row['Action'].upper() == 'ADD':
                        targeting.add_excluded_google_audience(identifier)
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_excluded_google_audience(identifier)

                if row['Included_Custom']:
                    identifier = lookup_id(row['Included_Custom'])
                    if row['Action'].upper() == 'ADD':
                        targeting.add_included_custom_audience(identifier)
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_included_custom_audience(identifier)

                if row['Included_Combined']:
                    identifier = lookup_id(row['Included_Combined'])
                    if row['Action'].upper() == 'ADD':
                        targeting.add_included_combined_audience(identifier)
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_included_combined_audience(identifier)

                if row['Device_Type']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_device_type(row['Device_Type'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_device_type()

                if row['Make_Model']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_make_model(
                            row['Make_Model'], row['Make_Model_Negative']
                            or False)
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_make_model()

                if row['Operating_System']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_operating_system(
                            row['Operating_System'],
                            row['Operating_System_Negative'] or False)
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_operating_system(
                            row['Operating_System'])

                if row['Browser']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_browser(row['Browser'],
                                              row['Browser_Negative'] or False)
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_browser(row['Browser'])

                if row['Environment']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_environment(row['Environment'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_environment(row['Environment'])

                if row['Carrier_And_ISP']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_carrier_and_isp(row['Carrier_And_ISP'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_carrier_and_isp(
                            row['Carrier_And_ISP'])

                if row['Day_Of_Week']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_day_and_time(row['Day_Of_Week'],
                                                   row['Hour_Start'],
                                                   row['Hour_End'],
                                                   row['Timezone'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_day_and_time(row['Day_Of_Week'])

                if row['Geo_Region']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_geo_region(
                            row['Geo_Region'], row['Geo_Region_Type'],
                            row['Geo_Region_Negative'] or False)
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_geo_region(row['Geo_Region'])

                if row['Proximity_Location_List']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_proximity_location_list(
                            row['Proximity_Location_List'],
                            row['Proximity_Location_List_Radius_Range'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_proximity_location_list(
                            row['Proximity_Location_List'])

                if row['Regional_Location_List']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_regional_location_list(
                            row['Regional_Location_List'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_regional_location_list(
                            row['Regional_Location_List'])

                if row['Video_Player_Size']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_video_player_size(
                            row['Video_Player_Size'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_video_player_size()

                if row['In_Stream_Position']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_instream_position(
                            row['In_Stream_Position'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_instream_position()

                if row['Out_Stream_Position']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_outstream_position(
                            row['Out_Stream_Position'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_outstream_position()

                if row['On_Screen_Position']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_on_screen_position(
                            row['On_Screen_Position'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_on_screen_position()

                if row['Viewability']:
                    if row['Action'].upper() == 'ADD':
                        targeting.add_viewability(row['Viewability'])
                    elif row['Action'].upper() == 'DELETE':
                        targeting.delete_viewability()

    for layer_and_name, targeting in targetings.items():
        layer, name = layer_and_name
        body = targeting.get_body()
        if body:
            parameters = {'body': body}

            if layer == 'Partner':
                parameters['partnerId'] = str(targeting.partner)
            elif layer == 'Advertiser':
                parameters['advertiserId'] = str(targeting.advertiser)
            elif layer == 'LineItem':
                parameters['advertiserId'] = str(targeting.advertiser)
                parameters['lineItemId'] = str(targeting.lineitem)

            edits.append({
                "layer": layer,
                "partner": name if layer == 'Partner' else '',
                "advertiser": name if layer == 'Advertiser' else '',
                "line_item": name if layer == 'LineItem' else '',
                "parameters": parameters
            })

    edit_preview(edits)

    if commit:
        targeting_commit(edits)