mcm-cli 1.4.2__py3-none-any.whl → 1.5.1__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mcm-cli
3
- Version: 1.4.2
3
+ Version: 1.5.1
4
4
  Summary: A command-line interface for Moloco Commerde Media
5
5
  Home-page: https://github.com/moloco-mcm/mcm-cli
6
6
  Author: Moloco MCM Team
@@ -1,18 +1,18 @@
1
1
  mcmcli/__init__.py,sha256=-U6lMZ9_99IXAKwnqnYXYr6NcO6TSmG-kxewgvJjU4k,575
2
- mcmcli/__main__.py,sha256=8rr--sz02pkM_Z6u90JYm8f1s6sbHmgXF82xfIF6rqg,1844
2
+ mcmcli/__main__.py,sha256=a4A9mxOQMsB-6DK_5mABC-ersAhxnVFjqQ-u-TZ99hY,1844
3
3
  mcmcli/logging.py,sha256=xjRS5ey1ONx_d34qB1Fetb_SwPysoh2hzNDuNAaYYWQ,1739
4
4
  mcmcli/requests.py,sha256=IuySBQ8P_GoGF3f_TRysfgQNOhi2n9M84WK_eRXnoEU,2945
5
5
  mcmcli/command/account.py,sha256=FWXmzOLj4rVLVLEv-w0eDVlQVrkONvR1UewZbcTDgE4,24994
6
6
  mcmcli/command/admin.py,sha256=2GC0B3oqQsT5N5mHUyezgZvzPkB4-oGtddguOWfdLJs,15980
7
7
  mcmcli/command/auth.py,sha256=Ak7ZNEskWPpMoeTJcbYlEpDBgzxn8N33Q2dNf67SsCs,2926
8
- mcmcli/command/campaign.py,sha256=SU6TrDy6YhqM0JWPzbYWLpXZrz7Ymw31pd168dK2LZk,10638
8
+ mcmcli/command/campaign.py,sha256=wh6WU19dCw0NBTp521g5wK6_0GraviWZxxahIcSlD44,12364
9
9
  mcmcli/command/config.py,sha256=08C5ftAvdvpQ26Z329LqhP8AxTI629LS7Ou6glzrRgw,4396
10
10
  mcmcli/command/decision.py,sha256=iLvEDEa2k0LAgoXrOvcdn-HcFRo90E8Dxht_Ls9EGCY,8690
11
11
  mcmcli/command/report.py,sha256=N8IMyDZ5QpY11-KkZG-n5_ZzEeh-ME5s2s3wrAKEGjY,5387
12
12
  mcmcli/command/wallet.py,sha256=vG2rg7tPwGsV9YB7cpvkiocbqtB1reqXn7dmolFmzD4,11536
13
13
  mcmcli/data/account.py,sha256=pe7tPapP6vlUD5D5L5Nh5k2bkWdYOK01Mpt5fBYFnJs,1782
14
14
  mcmcli/data/account_user.py,sha256=27nQp52nMma5a3QszSJGqgq5Z0ivIb-nMZcZuhEgbEg,1328
15
- mcmcli/data/campaign.py,sha256=-HR-SbEfe44Ys_UXnYr9HRG0TPcGkO2k61iEsz9uET0,2284
15
+ mcmcli/data/campaign.py,sha256=jwExzdEHLanhYTfR4-rkL3mGheROoRi3bkGnD-5nKCg,3496
16
16
  mcmcli/data/decision.py,sha256=bQ5j_PbPRSFa0sY5g9UVqdNzl_2epchcz1lHoDVuV90,2880
17
17
  mcmcli/data/error.py,sha256=d6xa_jTXumlA0EzXy2PJQ86ajBb0Pm90fss9R3LuHUc,1094
18
18
  mcmcli/data/item.py,sha256=Z2xTRhU8T4vyJADO0l6-XPyQXvb9DX_OAjExhSXpW2A,1091
@@ -23,10 +23,10 @@ mcmcli/data/seller.py,sha256=40SA7QekM3a3svDrDYLo_QYJ68VUxDO0KeGejJMp4k4,1004
23
23
  mcmcli/data/token.py,sha256=11wtyLHCAZHu0LVbNDPa-yipcL6lenxoYIKEI58VzFs,1744
24
24
  mcmcli/data/user_join_request.py,sha256=lXMO2hE_VpRg0JofVrYAVM82S-RLFkPrZk8-drvhoDI,1251
25
25
  mcmcli/data/wallet.py,sha256=eMUi8N0vJdg_E10TPhSPoZkZtmIG7gHyqgabQ8C5Lg8,3217
26
- mcm_cli-1.4.2.dist-info/LICENSE,sha256=RFhQPdSOiMTguUX7JSoIuTxA7HVzCbj_p8WU36HjUQQ,10947
27
- mcm_cli-1.4.2.dist-info/METADATA,sha256=6Y7vHnYzLC2-4-7AHMDyL2mprCj0BKVMCUAP8sOGob8,3056
28
- mcm_cli-1.4.2.dist-info/NOTICE,sha256=Ldnl2MjRaXPxcldUdbI2NTybq60XAa2LowRhFrRTuiI,76
29
- mcm_cli-1.4.2.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
30
- mcm_cli-1.4.2.dist-info/entry_points.txt,sha256=qTHAWZ-ejSiU4t11RYwtAU8ScqhQPDeMVTG9y4wMVLg,60
31
- mcm_cli-1.4.2.dist-info/top_level.txt,sha256=sh7oqIaqLQlMtKHlxHHgpV2xGMrBMPFWpSp0C6nvJ_Y,7
32
- mcm_cli-1.4.2.dist-info/RECORD,,
26
+ mcm_cli-1.5.1.dist-info/LICENSE,sha256=RFhQPdSOiMTguUX7JSoIuTxA7HVzCbj_p8WU36HjUQQ,10947
27
+ mcm_cli-1.5.1.dist-info/METADATA,sha256=mnhJv3rIBrVgGmBCGcUl9ACei2q4QVHhL34PKgxq2H4,3056
28
+ mcm_cli-1.5.1.dist-info/NOTICE,sha256=Ldnl2MjRaXPxcldUdbI2NTybq60XAa2LowRhFrRTuiI,76
29
+ mcm_cli-1.5.1.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
30
+ mcm_cli-1.5.1.dist-info/entry_points.txt,sha256=qTHAWZ-ejSiU4t11RYwtAU8ScqhQPDeMVTG9y4wMVLg,60
31
+ mcm_cli-1.5.1.dist-info/top_level.txt,sha256=sh7oqIaqLQlMtKHlxHHgpV2xGMrBMPFWpSp0C6nvJ_Y,7
32
+ mcm_cli-1.5.1.dist-info/RECORD,,
mcmcli/__main__.py CHANGED
@@ -37,7 +37,7 @@ def version():
37
37
  """
38
38
  Show the tool version
39
39
  """
40
- typer.echo(f"Version: mcm-cli v1.4.2")
40
+ typer.echo(f"Version: mcm-cli v1.5.1")
41
41
 
42
42
  app.add_typer(mcmcli.command.account.app, name="account", help="Ad account management")
43
43
  app.add_typer(mcmcli.command.admin.app, name="admin", help="Platform administration")
@@ -51,7 +51,7 @@ def list_campaigns(
51
51
  print(curl)
52
52
  return
53
53
  if error:
54
- print(f"ERROR: {error.message}")
54
+ print(f"ERROR: {error.message}", file=sys.stderr, flush=True)
55
55
  return
56
56
  if to_json:
57
57
  json_dumps = [x.model_dump_json() for x in campaigns]
@@ -103,6 +103,47 @@ def read_campaign(
103
103
 
104
104
  return
105
105
 
106
+ @app.command()
107
+ def archive_campaign(
108
+ account_id: str = typer.Option(help="Ad account ID"),
109
+ campaign_id: str = typer.Option(help="Campaign ID"),
110
+ profile: str = typer.Option("default", help="Profile name of the MCM CLI."),
111
+ ):
112
+ """
113
+ Turn off (pause and disable) the campaign and archive it.
114
+ """
115
+ c = _create_campaign_command(profile)
116
+ if c is None:
117
+ return
118
+
119
+ _, error, campaign = c.read_campaign(account_id, campaign_id)
120
+ if error:
121
+ print(f"ERROR: Failed to read the campaign {campaign_id} of the ad account {account_id}: {error.message}", file=sys.stderr, flush=True)
122
+ return
123
+
124
+ if campaign.state == 'ARCHIVED':
125
+ print(f"The campaign {campaign_id} of the ad account {account_id} is already archived.")
126
+ return
127
+
128
+ # Turn off the campaign
129
+ campaign.enabling_state = 'DISABLED'
130
+ campaign.state = 'PAUSED'
131
+ #campaign.daily_budget.amount_micro = (campaign.daily_budget.amount_micro // 10000) * 10000
132
+ _, error, campaign = c.update_campaign(campaign)
133
+ if error:
134
+ print(f"ERROR: Failed to turn off the campaign {campaign_id} of the ad account {account_id}: {error.message}", file=sys.stderr, flush=True)
135
+ return
136
+
137
+ # Archive the campaign
138
+ campaign.hidden = True
139
+ campaign.state = 'ARCHIVED'
140
+ _, error, campaign = c.update_campaign(campaign)
141
+ if error:
142
+ print(f"ERROR: Failed to archive the campaign {campaign_id} of the ad account {account_id}: {error.message}", file=sys.stderr, flush=True)
143
+ return
144
+
145
+ print(f"Archived the campaign {campaign_id} of the ad account {account_id}.")
146
+
106
147
  @app.command()
107
148
  def list_campaign_items(
108
149
  account_id: str = typer.Option(help="Ad account ID"),
@@ -124,7 +165,7 @@ def list_campaign_items(
124
165
  print(curl)
125
166
  return
126
167
  if error:
127
- print(f"ERROR: {error.message}")
168
+ print(f"ERROR: {error.message}", file=sys.stderr, flush=True)
128
169
  return
129
170
  if to_json:
130
171
  json_dumps = [x.model_dump_json() for x in items]
@@ -156,7 +197,7 @@ def add_items_to_campaign(
156
197
 
157
198
  _, error, campaign = c.read_campaign(account_id, campaign_id)
158
199
  if error:
159
- print(f"ERROR: {error.message}")
200
+ print(f"ERROR: {error.message}", file=sys.stderr, flush=True)
160
201
  return
161
202
 
162
203
  #
@@ -173,7 +214,7 @@ def add_items_to_campaign(
173
214
  print(curl)
174
215
  return
175
216
  if error:
176
- print(f"ERROR: {error.message}")
217
+ print(f"ERROR: {error.message}", file=sys.stderr, flush=True)
177
218
  return
178
219
  if to_json:
179
220
  print(campaign.model_dump_json())
mcmcli/data/campaign.py CHANGED
@@ -20,11 +20,11 @@ from typing import Optional
20
20
  #
21
21
  class MicroPrice(BaseModel):
22
22
  currency: str
23
- amount_micro: str
23
+ amount_micro: int
24
24
 
25
25
  class Schedule(BaseModel):
26
26
  start: str
27
- end: Optional[str]
27
+ end: Optional[str] = None
28
28
 
29
29
  class Budget(BaseModel):
30
30
  period: str
@@ -58,6 +58,56 @@ class Targeting(BaseModel):
58
58
  placement_setting: Optional[str]
59
59
  audience_setting: Optional[AudienceSetting]
60
60
 
61
+ class TargetInventoryDimension(BaseModel):
62
+ width: int
63
+ height: int
64
+
65
+ class BannerAsset(BaseModel):
66
+ creative_id: str
67
+ image_url: str
68
+ width: int
69
+ height: int
70
+ target_inventory_dimension: TargetInventoryDimension
71
+
72
+ class LogoAsset(BaseModel):
73
+ creative_id: str
74
+ image_url: str
75
+
76
+ class HeadlineAsset(BaseModel):
77
+ text: str
78
+
79
+ class CTAAsset(BaseModel):
80
+ text: str
81
+
82
+ class ReviewInformation(BaseModel):
83
+ status: str
84
+ rejection_reason: str
85
+ updated_at: str
86
+
87
+ class Asset(BaseModel):
88
+ id: str
89
+ banner: BannerAsset
90
+ logo: LogoAsset
91
+ headline: HeadlineAsset
92
+ cta: CTAAsset
93
+ review_information: ReviewInformation
94
+ created_at: str
95
+ updated_at: str
96
+
97
+ class CustomURLSetting(BaseModel):
98
+ url: str
99
+
100
+ class LandPage(BaseModel):
101
+ type: str
102
+ custom_url_setting: CustomURLSetting
103
+ id: str
104
+ review_information: ReviewInformation
105
+ created_at: str
106
+ updated_at: str
107
+
108
+ class ItemSelection(BaseModel):
109
+ type: str
110
+
61
111
  class Campaign(BaseModel):
62
112
  id: str
63
113
  title: str
@@ -80,6 +130,12 @@ class Campaign(BaseModel):
80
130
  updated_at: str
81
131
  audience_types: list[str]
82
132
  offsite_setting: Optional[str]
133
+ item_selection: Optional[ItemSelection]
134
+ assets: Optional[list[Asset]]
135
+ landing_pages: Optional[list[LandPage]]
136
+ landing_url_suffix: Optional[str]
137
+ catalog_brand_id: Optional[str]
138
+ catalog_category: Optional[str]
83
139
 
84
140
  class CampaignList(BaseModel):
85
141
  campaigns: list[Campaign]