π What's MyMagento? |
---|
|
If you've worked with the Magento 2 API, you'll know that not all endpoints are created equally.
MyMagento
aims to streamline your workflow by simplifying a
variety of commonly needed API operations.
...
π» The |
---|
|
π The |
---|
|
π§ The |
---|
|
...
MyMagento
is compatible with every API endpoint
Endpoints are wrapped with a Model
and SearchQuery
subclass as follows:
Endpoint | Client Shortcut | SearchQuery Subclass |
Model Subclass |
---|---|---|---|
orders |
Client.orders |
OrderSearch |
Order |
orders/items |
Client.order_items |
OrderItemSearch |
OrderItem |
invoices |
Client.invoices |
InvoiceSearch |
Invoice |
products |
Client.products |
ProductSearch |
Product |
products/attributes |
Client.product_attributes |
ProductAttributeSearch |
ProductAttribute |
categories |
Client.categories |
CategorySearch |
Category |
customers |
Client.customers |
CustomerSearch |
Customer |
endpoint |
Client.search('endpoint') |
SearchQuery |
APIResponse |
...
To install using pip
:
pip install my-magento
Please note that MyMagento
requires Python >= 3.10
...
Full documentation can be found on ReadTheDocs
MyMagento
uses the Client
class to handle all interactions with the API.
π‘ Tip |
---|
See Get a Magento 2 REST API Token With MyMagento for full details on generating an access token |
To generate an ACCESS_TOKEN
you'll need to authenticate()
your USER_CREDENTIALS
.
Creating a Client
requires a domain
, username
, and password
at minimum.
>>> domain = 'website.com'
>>> username ='username'
>>> password = 'password'
If you're using a local installation of Magento you'll need to set local=True
. Your domain should look like this:
>>> domain = '127.0.0.1/path/to/magento'
...
Getting a Client
Option 1: Initialize a Client
Directly
from magento import Client
>>> api = Client(domain, username, password, **kwargs)
Option 2: Call get_api()
import magento
>>> api = magento.get_api(**kwargs)
get_api()
takes the same keyword arguments as the Client
- If the
domain
,username
, orpassword
are missing, it will attempt to use the following environment variables:
import os
os.environ['MAGENTO_DOMAIN'] = domain
os.environ['MAGENTO_USERNAME']= username
os.environ['MAGENTO_PASSWORD']= password
...
Getting an ACCESS_TOKEN
Unless you specify login=False
, the Client
will automatically call authenticate()
once initialized:
>> api.authenticate()
|[ MyMagento | website_username ]|: Authenticating username on website.com...
|[ MyMagento | website_username ]|: Logged in to username
Performing a search()
The Client.search()
method lets you execute()
a query on
any API endpoint
It creates a SearchQuery
for the endpoint,
allowing you to retrieve data about
- An individual item (ex.
by_id()
) - A list of items (ex.
by_list()
) - Any search criteria you desire (see Building Custom Search Queries)
...
# Query the "invoices" endpoint (also: api.invoices)
>>> api.search("invoices").by_id(1)
<Magento Invoice: "#000000001"> for <Magento Order: "#000000001" placed on 2022-11-01 03:27:33>
# Retrieve invoices from a list of invoice ids
>>> ids = list(range(1,101))
>>> api.invoices.by_list("entity_id", ids)
[<Magento Invoice: "#000000001"> for <Magento Order: "#000000001" placed on 2022-11-01 03:27:33>, ...]
...
Search Results: The Model
Classes
The result
of any SearchQuery
will be parsed and wrapped by a
Model
class in the magento.models
subpackage.
These classes make the API response data easier to work with.
They also provide endpoint-specific methods to update store data and search for related items.
Let's retrieve a Product
using by_sku()
>>> product = api.products.by_sku("24-MB01")
We can search for orders containing this product in multiple ways:
# Using the Product itself
>>> product.get_orders()
[<Magento Order: "#000000003" placed on 2022-12-21 08:09:33>, ... ]
# Using an OrderSearch
>>> api.orders.by_product(product)
>>> api.orders.by_product_id(product.id)
>>> api.orders.by_sku(product.sku)
[<Magento Order: "#000000003" placed on 2022-12-21 08:09:33>, ... ]
>>> category = api.categories.by_name("Watches")
>>> category.get_products()
>>> category.get_invoices()
[<Magento Product: 24-MG04>, <Magento Product: 24-MG01>, <Magento Product: 24-MG03>, ... ]
[<Magento Invoice: "#000000004"> for <Magento Order: "#000000004" placed on 2022-11-14 03:27:33>, ... ]
Example: Updating the Thumbnail MediaEntry
of a Product
# Update product thumbnail label on specific store view
>>> product.thumbnail.set_alt_text("bonjour", scope="FR")
>>> print(product.thumbnail)
<MediaEntry 3417 for <Magento Product: 24-MB01>: bonjour>
...
π‘ Tip: Set the Store Scope |
---|
If you have multiple store views, a
|
...
In addition to the predefined methods, you can also build your own queries
- Simply
add_criteria()
,restrict_fields()
, andexecute()
the search - The
since()
anduntil()
methods allow you to further filter your query by date
π Example: Retrieve Orders Over $50 Placed Since the Start of 2023 |
---|
>>> api.orders.add_criteria(
... field="grand_total",
... value="50",
... condition="gt"
... ).since("2023-01-01").execute()
[<Magento Order: "#000000012" placed on 2023-01-02 05:19:55>, ...] |
...
The Client
can be used to generate the url_for()
any API endpoint,
including a store scope
.
You can use this URL to make an authorized
get()
, post()
, put()
, or delete()
request.
Example: Making a get()
Request
# Request the data for credit memo with id 7
>>> url = api.url_for('creditmemo/7')
>>> response = api.get(url)
>>> print(response.json())
{'adjustment': 1.5, 'adjustment_negative': 0, 'adjustment_positive': 1.5, 'base_adjustment': 1.5, ... }
π Note |
---|
A # Retrieve credit memo with id 7 using a search
>>> memo = api.search("creditmemo").by_id(7)
>>> print(memo.data)
>>> print(memo)
{'adjustment': 1.5, 'adjustment_negative': 0, 'adjustment_positive': 1.5, 'base_adjustment': 1.5, ... }
<magento.models.model.APIResponse object at 0x000001BA42FD0FD1> |