mcm-cli 1.4.2__tar.gz → 1.5.1__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {mcm_cli-1.4.2/mcm_cli.egg-info → mcm_cli-1.5.1}/PKG-INFO +1 -1
- {mcm_cli-1.4.2 → mcm_cli-1.5.1/mcm_cli.egg-info}/PKG-INFO +1 -1
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/__main__.py +1 -1
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/command/campaign.py +45 -4
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/data/campaign.py +58 -2
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/setup.py +1 -1
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/LICENSE +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/NOTICE +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/README.md +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcm_cli.egg-info/SOURCES.txt +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcm_cli.egg-info/dependency_links.txt +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcm_cli.egg-info/entry_points.txt +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcm_cli.egg-info/requires.txt +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcm_cli.egg-info/top_level.txt +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/__init__.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/command/account.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/command/admin.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/command/auth.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/command/config.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/command/decision.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/command/report.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/command/wallet.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/data/account.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/data/account_user.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/data/decision.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/data/error.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/data/item.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/data/item_blocking_result.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/data/platform_user.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/data/report.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/data/seller.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/data/token.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/data/user_join_request.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/data/wallet.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/logging.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/mcmcli/requests.py +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/setup.cfg +0 -0
- {mcm_cli-1.4.2 → mcm_cli-1.5.1}/tests/test_config.py +0 -0
@@ -37,7 +37,7 @@ def version():
|
|
37
37
|
"""
|
38
38
|
Show the tool version
|
39
39
|
"""
|
40
|
-
typer.echo(f"Version: mcm-cli v1.
|
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())
|
@@ -20,11 +20,11 @@ from typing import Optional
|
|
20
20
|
#
|
21
21
|
class MicroPrice(BaseModel):
|
22
22
|
currency: str
|
23
|
-
amount_micro:
|
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]
|
@@ -18,7 +18,7 @@ from setuptools import setup, find_packages
|
|
18
18
|
|
19
19
|
setup(
|
20
20
|
name='mcm-cli',
|
21
|
-
version='1.
|
21
|
+
version='1.5.1',
|
22
22
|
description='A command-line interface for Moloco Commerde Media',
|
23
23
|
long_description=open('README.md').read(),
|
24
24
|
long_description_content_type='text/markdown',
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|