|
1 | 1 | from bingads.v12.bulk.entities import * |
2 | 2 | from bingads.service_client import _CAMPAIGN_OBJECT_FACTORY_V12 |
3 | 3 | from bingads.v12.internal.bulk.entities.single_record_bulk_entity import _SingleRecordBulkEntity |
4 | | -from bingads.v12.internal.bulk.mappings import _SimpleBulkMapping |
| 4 | +from bingads.v12.internal.bulk.mappings import _SimpleBulkMapping, _ComplexBulkMapping |
5 | 5 | from bingads.v12.internal.bulk.string_table import _StringTable |
6 | 6 | from bingads.v12.bulk.entities.common import PerformanceData |
7 | 7 | # from bingads.v12.internal.extensions import bulk_str |
8 | 8 | from bingads.v12.internal.extensions import * |
9 | 9 |
|
10 | 10 | _BiddableAdGroupCriterion = type(_CAMPAIGN_OBJECT_FACTORY_V12.create('BiddableAdGroupCriterion')) |
11 | 11 | _NegativeAdGroupCriterion = type(_CAMPAIGN_OBJECT_FACTORY_V12.create('NegativeAdGroupCriterion')) |
12 | | - |
| 12 | +_FixedBid = type(_CAMPAIGN_OBJECT_FACTORY_V12.create('FixedBid')) |
| 13 | + |
| 14 | +def csv_to_bidding(row_values, entity): |
| 15 | + success, exclude = row_values.try_get_value(_StringTable.IsExcluded) |
| 16 | + if exclude is None: |
| 17 | + exclude = '' |
| 18 | + exclude = exclude.lower() |
| 19 | + if exclude == 'yes' or exclude == 'true': |
| 20 | + is_excluded = True |
| 21 | + elif exclude == 'no' or exclude == 'false': |
| 22 | + is_excluded = False |
| 23 | + else: |
| 24 | + raise ValueError('IsExcluded can only be set to TRUE|FALSE in Ad Group Product Partition row') |
| 25 | + if is_excluded: |
| 26 | + product_partition = _CAMPAIGN_OBJECT_FACTORY_V12.create('ProductPartition') |
| 27 | + product_partition.Condition = _CAMPAIGN_OBJECT_FACTORY_V12.create('ProductCondition') |
| 28 | + product_partition.Type = 'ProductPartition' |
| 29 | + |
| 30 | + negative_ad_group_criterion = _CAMPAIGN_OBJECT_FACTORY_V12.create('NegativeAdGroupCriterion') |
| 31 | + negative_ad_group_criterion.Criterion = product_partition |
| 32 | + negative_ad_group_criterion.Type = 'NegativeAdGroupCriterion' |
| 33 | + |
| 34 | + entity.ad_group_criterion = negative_ad_group_criterion |
| 35 | + else: |
| 36 | + product_partition = _CAMPAIGN_OBJECT_FACTORY_V12.create('ProductPartition') |
| 37 | + product_partition.Condition = _CAMPAIGN_OBJECT_FACTORY_V12.create('ProductCondition') |
| 38 | + product_partition.Type = 'ProductPartition' |
| 39 | + |
| 40 | + bid = _CAMPAIGN_OBJECT_FACTORY_V12.create('FixedBid') |
| 41 | + bid.Type = 'FixedBid' |
| 42 | + |
| 43 | + biddable_ad_group_criterion = _CAMPAIGN_OBJECT_FACTORY_V12.create('BiddableAdGroupCriterion') |
| 44 | + biddable_ad_group_criterion.Criterion = product_partition |
| 45 | + |
| 46 | + success, bid_value = row_values.try_get_value(_StringTable.Bid) |
| 47 | + if success and bid_value is not None and bid_value != '': |
| 48 | + bid.Amount = float(bid_value) |
| 49 | + else: |
| 50 | + success, bid_value = row_values.try_get_value(_StringTable.BidAdjustment) |
| 51 | + if success and bid_value is not None and bid_value != '': |
| 52 | + bid = _CAMPAIGN_OBJECT_FACTORY_V12.create('BidMultiplier') |
| 53 | + bid.Type = 'BidMultiplier' |
| 54 | + bid.Multiplier = float(bid_value) |
| 55 | + |
| 56 | + biddable_ad_group_criterion.CriterionBid = bid |
| 57 | + biddable_ad_group_criterion.Type = 'BiddableAdGroupCriterion' |
| 58 | + |
| 59 | + entity.ad_group_criterion = biddable_ad_group_criterion |
| 60 | + |
| 61 | +def bidding_to_csv(entity, row_values): |
| 62 | + if isinstance(entity.ad_group_criterion, _NegativeAdGroupCriterion): |
| 63 | + row_values[_StringTable.IsExcluded] = 'True' |
| 64 | + else: |
| 65 | + row_values[_StringTable.IsExcluded] = 'False' |
| 66 | + bid = entity.ad_group_criterion.CriterionBid |
| 67 | + if bid is None: |
| 68 | + return |
| 69 | + if isinstance(bid, _FixedBid): |
| 70 | + row_values[_StringTable.Bid] = fixed_bid_bulk_str(bid) |
| 71 | + else: |
| 72 | + row_values[_StringTable.BidAdjustment] = bid_multiplier_bulk_str(bid) |
13 | 73 |
|
14 | 74 | class BulkAdGroupProductPartition(_SingleRecordBulkEntity): |
15 | 75 | """ Represents an Ad Group Criterion that can be read or written in a bulk file. |
@@ -38,56 +98,7 @@ def __init__(self, |
38 | 98 | self._ad_group_name = ad_group_name |
39 | 99 | self._performance_data = None |
40 | 100 |
|
41 | | - @classmethod |
42 | | - def _read_is_excluded(cls, entity, row_value): |
43 | | - if row_value is None: |
44 | | - row_value = '' |
45 | | - row_value = row_value.lower() |
46 | | - if row_value == 'yes' or row_value == 'true': |
47 | | - is_excluded = True |
48 | | - elif row_value == 'no' or row_value == 'false': |
49 | | - is_excluded = False |
50 | | - else: |
51 | | - raise ValueError('IsExcluded can only be set to TRUE|FALSE in Ad Group Product Partition row') |
52 | | - if is_excluded: |
53 | | - product_partition = _CAMPAIGN_OBJECT_FACTORY_V12.create('ProductPartition') |
54 | | - product_partition.Condition = _CAMPAIGN_OBJECT_FACTORY_V12.create('ProductCondition') |
55 | | - product_partition.Type = 'ProductPartition' |
56 | | - |
57 | | - negative_ad_group_criterion = _CAMPAIGN_OBJECT_FACTORY_V12.create('NegativeAdGroupCriterion') |
58 | | - negative_ad_group_criterion.Criterion = product_partition |
59 | | - negative_ad_group_criterion.Type = 'NegativeAdGroupCriterion' |
60 | | - |
61 | | - entity.ad_group_criterion = negative_ad_group_criterion |
62 | | - else: |
63 | | - product_partition = _CAMPAIGN_OBJECT_FACTORY_V12.create('ProductPartition') |
64 | | - product_partition.Condition = _CAMPAIGN_OBJECT_FACTORY_V12.create('ProductCondition') |
65 | | - product_partition.Type = 'ProductPartition' |
66 | | - |
67 | | - fixed_bid = _CAMPAIGN_OBJECT_FACTORY_V12.create('FixedBid') |
68 | | - fixed_bid.Type = 'FixedBid' |
69 | | - |
70 | | - biddable_ad_group_criterion = _CAMPAIGN_OBJECT_FACTORY_V12.create('BiddableAdGroupCriterion') |
71 | | - biddable_ad_group_criterion.Criterion = product_partition |
72 | | - biddable_ad_group_criterion.CriterionBid = fixed_bid |
73 | | - biddable_ad_group_criterion.Type = 'BiddableAdGroupCriterion' |
74 | | - |
75 | | - entity.ad_group_criterion = biddable_ad_group_criterion |
76 | | - |
77 | | - @classmethod |
78 | | - def _write_bid(cls, entity): |
79 | | - criterion = entity.ad_group_criterion |
80 | | - if isinstance(criterion, _BiddableAdGroupCriterion) and \ |
81 | | - criterion.CriterionBid is not None: |
82 | | - return fixed_bid_bulk_str(entity.ad_group_criterion.CriterionBid) |
83 | | - |
84 | | - @classmethod |
85 | | - def _read_bid(cls, entity, row_value): |
86 | | - if isinstance(entity.ad_group_criterion, _BiddableAdGroupCriterion): |
87 | | - entity.ad_group_criterion.CriterionBid = parse_fixed_bid(row_value) |
88 | | - else: |
89 | | - pass |
90 | | - |
| 101 | + |
91 | 102 | @classmethod |
92 | 103 | def _write_destination_url(cls, entity): |
93 | 104 | if isinstance(entity.ad_group_criterion, _BiddableAdGroupCriterion): |
@@ -135,11 +146,9 @@ def _read_destination_url(cls, entity, row_value): |
135 | 146 | pass |
136 | 147 |
|
137 | 148 | _MAPPINGS = [ |
138 | | - _SimpleBulkMapping( |
139 | | - _StringTable.IsExcluded, |
140 | | - field_to_csv=lambda c: 'True' if isinstance(c.ad_group_criterion, _NegativeAdGroupCriterion) else 'False', |
141 | | - csv_to_field=lambda c, v: BulkAdGroupProductPartition._read_is_excluded(c, v) |
142 | | - ), |
| 149 | + |
| 150 | + _ComplexBulkMapping(bidding_to_csv, csv_to_bidding), |
| 151 | + |
143 | 152 | _SimpleBulkMapping( |
144 | 153 | _StringTable.Status, |
145 | 154 | field_to_csv=lambda c: c.ad_group_criterion.Status, |
@@ -186,11 +195,7 @@ def _read_destination_url(cls, entity, row_value): |
186 | 195 | field_to_csv=lambda c: BulkAdGroupProductPartition._get_condition_attribute(c), |
187 | 196 | csv_to_field=lambda c, v: setattr(c.ad_group_criterion.Criterion.Condition, 'Attribute', v) |
188 | 197 | ), |
189 | | - _SimpleBulkMapping( |
190 | | - _StringTable.Bid, |
191 | | - field_to_csv=lambda c: BulkAdGroupProductPartition._write_bid(c), |
192 | | - csv_to_field=lambda c, v: BulkAdGroupProductPartition._read_bid(c, v) |
193 | | - ), |
| 198 | + |
194 | 199 | _SimpleBulkMapping( |
195 | 200 | _StringTable.DestinationUrl, |
196 | 201 | field_to_csv=lambda c: BulkAdGroupProductPartition._write_destination_url(c), |
|
0 commit comments