mirror of
https://github.com/GAM-team/GAM.git
synced 2026-06-28 18:01:36 +00:00
1176 lines
32 KiB
Python
1176 lines
32 KiB
Python
#!/usr/bin/python
|
|
#
|
|
# Copyright (C) 2010-2011 Google Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
|
|
"""GData definitions for Content API for Shopping"""
|
|
|
|
|
|
__author__ = 'afshar (Ali Afshar)'
|
|
|
|
|
|
import atom.core
|
|
import atom.data
|
|
import gdata.data
|
|
|
|
|
|
SC_NAMESPACE_TEMPLATE = ('{http://schemas.google.com/'
|
|
'structuredcontent/2009}%s')
|
|
SCP_NAMESPACE_TEMPLATE = ('{http://schemas.google.com/'
|
|
'structuredcontent/2009/products}%s')
|
|
|
|
|
|
class ProductId(atom.core.XmlElement):
|
|
"""sc:id element
|
|
|
|
It is required that all inserted products are provided with a unique
|
|
alphanumeric ID, in this element.
|
|
"""
|
|
_qname = SC_NAMESPACE_TEMPLATE % 'id'
|
|
|
|
|
|
class RequiredDestination(atom.core.XmlElement):
|
|
"""sc:required_destination element
|
|
|
|
This element defines the required destination for a product, namely
|
|
"ProductSearch", "ProductAds" or "CommerceSearch". It should be added to the
|
|
app:control element (ProductEntry's "control" attribute) to specify where the
|
|
product should appear in search APIs.
|
|
|
|
By default, when omitted, the api attempts to upload to as many destinations
|
|
as possible.
|
|
"""
|
|
_qname = SC_NAMESPACE_TEMPLATE % 'required_destination'
|
|
dest = 'dest'
|
|
|
|
|
|
class ExcludedDestination(atom.core.XmlElement):
|
|
"""sc:excluded_destination element
|
|
|
|
This element defines the required destination for a product, namely
|
|
"ProductSearch", "ProductAds" or "CommerceSearch". It should be added to the
|
|
app:control element (ProductEntry's "control" attribute) to specify where the
|
|
product should not appear in search APIs.
|
|
|
|
By default, when omitted, the api attempts to upload to as many destinations
|
|
as possible.
|
|
"""
|
|
_qname = SC_NAMESPACE_TEMPLATE % 'excluded_destination'
|
|
dest = 'dest'
|
|
|
|
|
|
class ProductControl(atom.data.Control):
|
|
"""
|
|
app:control element
|
|
|
|
overridden to provide additional elements in the sc namespace.
|
|
"""
|
|
required_destination = RequiredDestination
|
|
excluded_destination = ExcludedDestination
|
|
|
|
|
|
class ContentLanguage(atom.core.XmlElement):
|
|
"""
|
|
sc:content_language element
|
|
|
|
Language used in the item content for the product
|
|
"""
|
|
_qname = SC_NAMESPACE_TEMPLATE % 'content_language'
|
|
|
|
|
|
class TargetCountry(atom.core.XmlElement):
|
|
"""
|
|
sc:target_country element
|
|
|
|
The target country of the product
|
|
"""
|
|
_qname = SC_NAMESPACE_TEMPLATE % 'target_country'
|
|
|
|
|
|
class ImageLink(atom.core.XmlElement):
|
|
"""sc:image_link element
|
|
|
|
This is the URL of an associated image for a product. Please use full size
|
|
images (400x400 pixels or larger), not thumbnails.
|
|
"""
|
|
_qname = SC_NAMESPACE_TEMPLATE % 'image_link'
|
|
|
|
|
|
class ExpirationDate(atom.core.XmlElement):
|
|
"""sc:expiration_date
|
|
|
|
This is the date when the product listing will expire. If omitted, this will
|
|
default to 30 days after the product was created.
|
|
"""
|
|
_qname = SC_NAMESPACE_TEMPLATE % 'expiration_date'
|
|
|
|
|
|
class Adult(atom.core.XmlElement):
|
|
"""sc:adult element
|
|
|
|
Indicates whether the content is targeted towards adults, with possible
|
|
values of "true" or "false". Defaults to "false".
|
|
"""
|
|
_qname = SC_NAMESPACE_TEMPLATE % 'adult'
|
|
|
|
|
|
class Author(atom.core.XmlElement):
|
|
"""
|
|
scp:author element
|
|
|
|
Defines the author of the information, recommended for books.
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'author'
|
|
|
|
|
|
class Availability(atom.core.XmlElement):
|
|
"""
|
|
scp:availability element
|
|
|
|
The retailer's suggested label for product availability. Supported values
|
|
include: 'in stock', 'out of stock', 'limited availability'.
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'availability'
|
|
|
|
|
|
class Brand(atom.core.XmlElement):
|
|
"""
|
|
scp:brand element
|
|
|
|
The brand of the product
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'brand'
|
|
|
|
|
|
class Color(atom.core.XmlElement):
|
|
"""scp:color element
|
|
|
|
The color of the product.
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'color'
|
|
|
|
|
|
class Condition(atom.core.XmlElement):
|
|
"""scp:condition element
|
|
|
|
The condition of the product, one of "new", "used", "refurbished"
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'condition'
|
|
|
|
|
|
class Edition(atom.core.XmlElement):
|
|
"""scp:edition element
|
|
|
|
The edition of the product. Recommended for products with multiple editions
|
|
such as collectors' editions etc, such as books.
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'edition'
|
|
|
|
|
|
class Feature(atom.core.XmlElement):
|
|
"""scp:feature element
|
|
|
|
A product feature. A product may have multiple features, each being text, for
|
|
example a smartphone may have features: "wifi", "gps" etc.
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'feature'
|
|
|
|
|
|
class FeaturedProduct(atom.core.XmlElement):
|
|
"""scp:featured_product element
|
|
|
|
Used to indicate that this item is a special, featured product; Supported
|
|
values are: "true", "false".
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'featured_product'
|
|
|
|
|
|
class Genre(atom.core.XmlElement):
|
|
"""scp:genre element
|
|
|
|
Describes the genre of a product, eg "comedy". Strongly recommended for media.
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'genre'
|
|
|
|
|
|
class Gtin(atom.core.XmlElement):
|
|
"""scp:gtin element
|
|
|
|
GTIN of the product (isbn/upc/ean)
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'gtin'
|
|
|
|
|
|
class Manufacturer(atom.core.XmlElement):
|
|
"""scp:manufacturer element
|
|
|
|
Manufacturer of the product.
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'manufacturer'
|
|
|
|
|
|
class Mpn(atom.core.XmlElement):
|
|
"""scp:mpn element
|
|
|
|
Manufacturer's Part Number. A unique code determined by the manufacturer for
|
|
the product.
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'mpn'
|
|
|
|
|
|
class Price(atom.core.XmlElement):
|
|
"""scp:price element
|
|
|
|
The price of the product. The unit attribute must be set, and should represent
|
|
the currency.
|
|
|
|
Note: Required Element
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'price'
|
|
unit = 'unit'
|
|
|
|
|
|
class ProductType(atom.core.XmlElement):
|
|
"""scp:product_type element
|
|
|
|
Describes the type of product. A taxonomy of available product types is
|
|
listed at http://www.google.com/basepages/producttype/taxonomy.txt and the
|
|
entire line in the taxonomy should be included, for example "Electronics >
|
|
Video > Projectors".
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'product_type'
|
|
|
|
|
|
class Quantity(atom.core.XmlElement):
|
|
"""scp:quantity element
|
|
|
|
The number of items available. A value of 0 indicates items that are
|
|
currently out of stock.
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'quantity'
|
|
|
|
|
|
class ShippingCountry(atom.core.XmlElement):
|
|
"""scp:shipping_country element
|
|
|
|
The two-letter ISO 3166 country code for the country to which an item will
|
|
ship.
|
|
|
|
This element should be placed inside the scp:shipping element.
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'shipping_country'
|
|
|
|
|
|
class ShippingPrice(atom.core.XmlElement):
|
|
"""scp:shipping_price element
|
|
|
|
Fixed shipping price, represented as a number. Specify the currency as the
|
|
"unit" attribute".
|
|
|
|
This element should be placed inside the scp:shipping element.
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'shipping_price'
|
|
unit = 'unit'
|
|
|
|
|
|
class ShippingRegion(atom.core.XmlElement):
|
|
"""scp:shipping_region element
|
|
|
|
The geographic region to which a shipping rate applies, e.g., in the US, the
|
|
two-letter state abbreviation, ZIP code, or ZIP code range using * wildcard.
|
|
|
|
This element should be placed inside the scp:shipping element.
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'shipping_region'
|
|
|
|
|
|
class ShippingService(atom.core.XmlElement):
|
|
"""scp:shipping_service element
|
|
|
|
A free-form description of the service class or delivery speed.
|
|
|
|
This element should be placed inside the scp:shipping element.
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'shipping_service'
|
|
|
|
|
|
class Shipping(atom.core.XmlElement):
|
|
"""scp:shipping element
|
|
|
|
Container for the shipping rules as provided by the shipping_country,
|
|
shipping_price, shipping_region and shipping_service tags.
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'shipping'
|
|
shipping_price = ShippingPrice
|
|
shipping_country = ShippingCountry
|
|
shipping_service = ShippingService
|
|
shipping_region = ShippingRegion
|
|
|
|
|
|
class ShippingWeight(atom.core.XmlElement):
|
|
"""scp:shipping_weight element
|
|
|
|
The shipping weight of a product. Requires a value and a unit using the unit
|
|
attribute. Valid units include lb, pound, oz, ounce, g, gram, kg, kilogram.
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'shipping_weight'
|
|
unit = 'unit'
|
|
|
|
|
|
class Size(atom.core.XmlElement):
|
|
"""scp:size element
|
|
|
|
Available sizes of an item. Appropriate values include: "small", "medium",
|
|
"large", etc. The product enttry may contain multiple sizes, to indicate the
|
|
available sizes.
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'size'
|
|
|
|
|
|
class TaxRate(atom.core.XmlElement):
|
|
"""scp:tax_rate element
|
|
|
|
The tax rate as a percent of the item price, i.e., number, as a percentage.
|
|
|
|
This element should be placed inside the scp:tax (Tax class) element.
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'tax_rate'
|
|
|
|
|
|
class TaxCountry(atom.core.XmlElement):
|
|
"""scp:tax_country element
|
|
|
|
The country an item is taxed in (as a two-letter ISO 3166 country code).
|
|
|
|
This element should be placed inside the scp:tax (Tax class) element.
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'tax_country'
|
|
|
|
|
|
class TaxRegion(atom.core.XmlElement):
|
|
"""scp:tax_region element
|
|
|
|
The geographic region that a tax rate applies to, e.g., in the US, the
|
|
two-letter state abbreviation, ZIP code, or ZIP code range using * wildcard.
|
|
|
|
This element should be placed inside the scp:tax (Tax class) element.
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'tax_region'
|
|
|
|
|
|
class TaxShip(atom.core.XmlElement):
|
|
"""scp:tax_ship element
|
|
|
|
Whether tax is charged on shipping for this product. The default value is
|
|
"false".
|
|
|
|
This element should be placed inside the scp:tax (Tax class) element.
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'tax_ship'
|
|
|
|
|
|
class Tax(atom.core.XmlElement):
|
|
"""scp:tax element
|
|
|
|
Container for the tax rules for this product. Containing the tax_rate,
|
|
tax_country, tax_region, and tax_ship elements
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'tax'
|
|
tax_rate = TaxRate
|
|
tax_country = TaxCountry
|
|
tax_region = TaxRegion
|
|
tax_ship = TaxShip
|
|
|
|
|
|
class Year(atom.core.XmlElement):
|
|
"""scp:year element
|
|
|
|
The year the product was produced. Expects four digits
|
|
"""
|
|
_qname = SCP_NAMESPACE_TEMPLATE % 'year'
|
|
|
|
|
|
class ProductEntry(gdata.data.BatchEntry):
|
|
"""Product entry containing product information
|
|
|
|
The elements of this entry that are used are made up of five different
|
|
namespaces. They are:
|
|
|
|
atom: - Atom
|
|
app: - Atom Publishing Protocol
|
|
gd: - Google Data API
|
|
sc: - Content API for Shopping, general attributes
|
|
scp: - Content API for Shopping, product attributes
|
|
|
|
Only the sc and scp namespace elements are defined here, but additional useful
|
|
elements are defined in superclasses, and are documented here because they are
|
|
part of the required Content for Shopping API.
|
|
|
|
.. attribute:: title
|
|
|
|
The title of the product.
|
|
|
|
This should be a :class:`atom.data.Title` element, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.title = atom.data.Title(u'32GB MP3 Player')
|
|
|
|
.. attribute:: author
|
|
|
|
The author of the product.
|
|
|
|
This should be a :class:`Author` element, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.author = atom.data.Author(u'Isaac Asimov')
|
|
|
|
.. attribute:: availability
|
|
|
|
The avilability of a product.
|
|
|
|
This should be an :class:`Availability` instance, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.availability = Availability('in stock')
|
|
|
|
.. attribute:: brand
|
|
|
|
The brand of a product.
|
|
|
|
This should be a :class:`Brand` element, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.brand = Brand(u'Sony')
|
|
|
|
.. attribute:: color
|
|
|
|
The color of a product.
|
|
|
|
This should be a :class:`Color` element, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.color = Color(u'purple')
|
|
|
|
.. attribute:: condition
|
|
|
|
The condition of a product.
|
|
|
|
This should be a :class:`Condition` element, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.condition = Condition(u'new')
|
|
|
|
.. attribute:: content_language
|
|
|
|
The language for the product.
|
|
|
|
This should be a :class:`ContentLanguage` element, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.content_language = ContentLanguage('EN')
|
|
|
|
.. attribute:: edition
|
|
|
|
The edition of the product.
|
|
|
|
This should be a :class:`Edition` element, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.edition = Edition('1')
|
|
|
|
.. attribute:: expiration
|
|
|
|
The expiration date of this product listing.
|
|
|
|
This should be a :class:`ExpirationDate` element, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.expiration_date = ExpirationDate('2011-22-03')
|
|
|
|
.. attribute:: feature
|
|
|
|
A list of features for this product.
|
|
|
|
Each feature should be a :class:`Feature` element, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.feature.append(Feature(u'wifi'))
|
|
entry.feature.append(Feature(u'gps'))
|
|
|
|
.. attribute:: featured_product
|
|
|
|
Whether the product is featured.
|
|
|
|
This should be a :class:`FeaturedProduct` element, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.featured_product = FeaturedProduct('true')
|
|
|
|
.. attribute:: genre
|
|
|
|
The genre of the product.
|
|
|
|
This should be a :class:`Genre` element, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.genre = Genre(u'comedy')
|
|
|
|
.. attribute:: image_link
|
|
|
|
A list of links to images of the product. Each link should be an
|
|
:class:`ImageLink` element, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.image_link.append(ImageLink('http://myshop/cdplayer.jpg'))
|
|
|
|
.. attribute:: manufacturer
|
|
|
|
The manufacturer of the product.
|
|
|
|
This should be a :class:`Manufacturer` element, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.manufacturer = Manufacturer('Sony')
|
|
|
|
.. attribute:: mpn
|
|
|
|
The manufacturer's part number for this product.
|
|
|
|
This should be a :class:`Mpn` element, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.mpn = Mpn('cd700199US')
|
|
|
|
.. attribute:: price
|
|
|
|
The price for this product.
|
|
|
|
This should be a :class:`Price` element, including a unit argument to
|
|
indicate the currency, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.price = Price('20.00', unit='USD')
|
|
|
|
.. attribute:: gtin
|
|
|
|
The gtin for this product.
|
|
|
|
This should be a :class:`Gtin` element, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.gtin = Gtin('A888998877997')
|
|
|
|
.. attribute:: product_type
|
|
|
|
The type of product.
|
|
|
|
This should be a :class:`ProductType` element, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.product_type = ProductType("Electronics > Video > Projectors")
|
|
|
|
.. attribute:: publisher
|
|
|
|
The publisher of this product.
|
|
|
|
This should be a :class:`Publisher` element, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.publisher = Publisher(u'Oxford University Press')
|
|
|
|
.. attribute:: quantity
|
|
|
|
The quantity of product available in stock.
|
|
|
|
This should be a :class:`Quantity` element, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.quantity = Quantity('100')
|
|
|
|
.. attribute:: shipping
|
|
|
|
The shipping rules for the product.
|
|
|
|
This should be a :class:`Shipping` with the necessary rules embedded as
|
|
elements, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.shipping = Shipping()
|
|
entry.shipping.shipping_price = ShippingPrice('10.00', unit='USD')
|
|
|
|
.. attribute:: shipping_weight
|
|
|
|
The shipping weight for this product.
|
|
|
|
This should be a :class:`ShippingWeight` element, including a unit parameter
|
|
for the unit of weight, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.shipping_weight = ShippingWeight('10.45', unit='kg')
|
|
|
|
.. attribute:: size
|
|
|
|
A list of the available sizes for this product.
|
|
|
|
Each item in this list should be a :class:`Size` element, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.size.append(Size('Small'))
|
|
entry.size.append(Size('Medium'))
|
|
entry.size.append(Size('Large'))
|
|
|
|
.. attribute:: target_country
|
|
|
|
The target country for the product.
|
|
|
|
This should be a :class:`TargetCountry` element, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.target_country = TargetCountry('US')
|
|
|
|
.. attribute:: tax
|
|
|
|
The tax rules for this product.
|
|
|
|
This should be a :class:`Tax` element, with the tax rule elements embedded
|
|
within, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.tax = Tax()
|
|
entry.tax.tax_rate = TaxRate('17.5')
|
|
|
|
.. attribute:: year
|
|
|
|
The year the product was created.
|
|
|
|
This should be a :class:`Year` element, for example::
|
|
|
|
entry = ProductEntry()
|
|
entry.year = Year('2001')
|
|
|
|
|
|
#TODO Document these atom elements which are part of the required API
|
|
<title>
|
|
<link>
|
|
<entry>
|
|
<id>
|
|
<category>
|
|
<content>
|
|
<author>
|
|
<created>
|
|
<updated>
|
|
"""
|
|
|
|
author = Author
|
|
product_id = ProductId
|
|
availability = Availability
|
|
brand = Brand
|
|
color = Color
|
|
condition = Condition
|
|
content_language = ContentLanguage
|
|
edition = Edition
|
|
expiration_date = ExpirationDate
|
|
feature = [Feature]
|
|
featured_product = FeaturedProduct
|
|
genre = Genre
|
|
image_link = [ImageLink]
|
|
manufacturer = Manufacturer
|
|
mpn = Mpn
|
|
price = Price
|
|
gtin = Gtin
|
|
product_type = ProductType
|
|
quantity = Quantity
|
|
shipping = Shipping
|
|
shipping_weight = ShippingWeight
|
|
size = [Size]
|
|
target_country = TargetCountry
|
|
tax = Tax
|
|
year = Year
|
|
control = ProductControl
|
|
|
|
|
|
# opensearch needs overriding for wrong version
|
|
# see http://code.google.com/p/gdata-python-client/issues/detail?id=483
|
|
class TotalResults(gdata.data.TotalResults):
|
|
|
|
_qname = gdata.data.TotalResults._qname[1]
|
|
|
|
|
|
class ItemsPerPage(gdata.data.ItemsPerPage):
|
|
|
|
_qname = gdata.data.ItemsPerPage._qname[1]
|
|
|
|
|
|
class StartIndex(gdata.data.StartIndex):
|
|
|
|
_qname = gdata.data.StartIndex._qname[1]
|
|
|
|
|
|
class ProductFeed(gdata.data.BatchFeed):
|
|
"""Represents a feed of a merchant's products."""
|
|
entry = [ProductEntry]
|
|
total_results = TotalResults
|
|
items_per_page = ItemsPerPage
|
|
start_index = StartIndex
|
|
|
|
|
|
def build_entry(product_id=None, title=None, content=None, link=None, condition=None,
|
|
target_country=None, content_language=None, price=None,
|
|
price_unit=None, tax_rate=None, shipping_price=None,
|
|
shipping_price_unit=None, image_links=(), expiration_date=None,
|
|
adult=None, author=None, brand=None, color=None, edition=None,
|
|
features=(), featured_product=None, genre=None,
|
|
manufacturer=None, mpn=None, gtin=None, product_type=None,
|
|
quantity=None, shipping_country=None, shipping_region=None,
|
|
shipping_service=None, shipping_weight=None,
|
|
shipping_weight_unit=None, sizes=(), tax_country=None,
|
|
tax_region=None, tax_ship=None, year=None, product=None):
|
|
"""Create a new product with the required attributes.
|
|
|
|
This function exists as an alternative constructor to help alleviate the
|
|
boilerplate involved in creating product definitions. You may well want to
|
|
fine-tune your products after creating them.
|
|
|
|
Documentation of each attribute attempts to explain the "long-hand" way of
|
|
achieving the same goal.
|
|
|
|
:param product_id: The unique ID for this product.
|
|
|
|
This is equivalent to creating and setting an product_id element::
|
|
|
|
entry = ProductEntry()
|
|
entry.product_id = ProductId(product_id)
|
|
|
|
:param title: The title of this product.
|
|
|
|
This is equivalent to creating and setting a title element::
|
|
|
|
entry = ProductEntry
|
|
entry.title = atom.data.Title(title)
|
|
|
|
:param content: The description of this product.
|
|
|
|
This is equivalent to creating and setting the content element::
|
|
|
|
entry.content = atom.data.Content(content)
|
|
|
|
:param link: The uri of the link to a page describing the product.
|
|
|
|
This is equivalent to creating and setting the link element::
|
|
|
|
entry.link = atom.data.Link(href=link, rel='alternate',
|
|
type='text/html')
|
|
|
|
:param condition: The condition of the product.
|
|
|
|
This is equivalent to creating and setting the condition element::
|
|
|
|
entry.condition = Condition(condition)
|
|
|
|
:param target_country: The target country of the product
|
|
|
|
This is equivalent to creating and setting the target_country element::
|
|
|
|
entry.target_country = TargetCountry(target_country)
|
|
|
|
:param content_language: The language of the content
|
|
|
|
This is equivalent to creating and setting the content_language element::
|
|
|
|
entry.content_language = ContentLanguage(content_language)
|
|
|
|
:param price: The price of the product
|
|
|
|
This is equivalent to creating and setting the price element, using the
|
|
price_unit parameter as the unit::
|
|
|
|
entry.price = Price(price, unit=price_unit)
|
|
|
|
:param price_unit: The price unit of the product
|
|
|
|
See price parameter.
|
|
|
|
:param tax_rate: The tax rate for this product
|
|
|
|
This is equivalent to creating and setting the tax element and its required
|
|
children::
|
|
|
|
entry.tax = Tax()
|
|
entry.tax.tax_rate = TaxRate(tax_rate)
|
|
|
|
:param shipping_price: Thie price of shipping for this product
|
|
|
|
This is equivalent to creating and setting the shipping element and its
|
|
required children. The unit for the price is taken from the
|
|
shipping_price_unit parameter::
|
|
|
|
entry.shipping = Shipping()
|
|
entry.shipping.shipping_price = ShippingPrice(shipping_price,
|
|
unit=shipping_price_unit)
|
|
|
|
:param shipping_price_unit: The unit of the shipping price
|
|
|
|
See shipping_price
|
|
|
|
:param image_links: A sequence of links for images for this product.
|
|
|
|
This is equivalent to creating a single image_link element for each image::
|
|
|
|
for image_link in image_links:
|
|
entry.image_link.append(ImageLink(image_link))
|
|
|
|
:param expiration_date: The date that this product listing expires
|
|
|
|
This is equivalent to creating and setting an expiration_date element::
|
|
|
|
entry.expiration_date = ExpirationDate(expiration_date)
|
|
|
|
:param adult: Whether this product listing contains adult content
|
|
|
|
This is equivalent to creating and setting the adult element::
|
|
|
|
entry.adult = Adult(adult)
|
|
|
|
:param author: The author of the product
|
|
|
|
This is equivalent to creating and setting the author element::
|
|
|
|
entry.author = Author(author)
|
|
|
|
:param brand: The brand of the product
|
|
|
|
This is equivalent to creating and setting the brand element::
|
|
|
|
entry.brand = Brand(brand)
|
|
|
|
:param color: The color of the product
|
|
|
|
This is equivalent to creating and setting the color element::
|
|
|
|
entry.color = Color(color)
|
|
|
|
:param edition: The edition of the product
|
|
|
|
This is equivalent to creating and setting the edition element::
|
|
|
|
entry.edition = Edition('1')
|
|
|
|
:param features=(): Features for this product
|
|
|
|
Each feature in the provided sequence will create a Feature element in the
|
|
entry, equivalent to::
|
|
|
|
for feature in features:
|
|
entry.feature.append(Feature(feature)))
|
|
|
|
:param featured_product: Whether this product is featured
|
|
|
|
This is equivalent to creating and setting the featured_product element::
|
|
|
|
entry.featured_product = FeaturedProduct(featured_product)
|
|
|
|
:param genre: The genre of the product
|
|
|
|
This is equivalent to creating and setting the genre element::
|
|
|
|
entry.genre = Genre(genre)
|
|
|
|
:param manufacturer: The manufacturer of the product
|
|
|
|
This is equivalent to creating and setting the manufacturer element::
|
|
|
|
entry.manufacturer = Manufacturer(manufacturer)
|
|
|
|
:param mpn: The manufacturer's part number for a product
|
|
|
|
This is equivalent to creating and setting the mpn element::
|
|
|
|
entry.mpn = Mpn(mpn)
|
|
|
|
:param gtin: The gtin for a product
|
|
|
|
This is equivalent to creating and setting the gtin element::
|
|
|
|
entry.gtin = Gtin(gtin)
|
|
|
|
:param product_type: The type of a product
|
|
|
|
This is equivalent to creating and setting the product_type element::
|
|
|
|
entry.product_type = ProductType(product_type)
|
|
|
|
:param quantity: The quantity of the product in stock
|
|
|
|
This is equivalent to creating and setting the quantity element::
|
|
|
|
entry.quantity = Quantity(quantity)
|
|
|
|
:param shipping_country: The country that this product can be shipped to
|
|
|
|
This is equivalent to creating a Shipping element, and creating and setting
|
|
the required element within::
|
|
|
|
entry.shipping = Shipping()
|
|
entry.shipping.shipping_country = ShippingCountry(shipping_country)
|
|
|
|
:param shipping_region: The region that this product can be shipped to
|
|
|
|
This is equivalent to creating a Shipping element, and creating and setting
|
|
the required element within::
|
|
|
|
entry.shipping = Shipping()
|
|
entry.shipping.shipping_region = ShippingRegion(shipping_region)
|
|
|
|
:param shipping_service: The service for shipping.
|
|
|
|
This is equivalent to creating a Shipping element, and creating and setting
|
|
the required element within::
|
|
|
|
entry.shipping = Shipping()
|
|
entry.shipping.shipping_service = ShippingRegion(shipping_service)
|
|
|
|
:param shipping_weight: The shipping weight of a product
|
|
|
|
Along with the shipping_weight_unit, this is equivalent to creating and
|
|
setting the shipping_weight element::
|
|
|
|
entry.shipping_weight = ShippingWeight(shipping_weight,
|
|
unit=shipping_weight_unit)
|
|
|
|
:param shipping_weight_unit: The unit of shipping weight
|
|
|
|
See shipping_weight.
|
|
|
|
:param: The sizes that are available for this product.
|
|
|
|
Each size of a list will add a size element to the entry, like so::
|
|
|
|
for size in sizes:
|
|
product.size.append(Size(size))
|
|
|
|
:param tax_country: The country that tax rules will apply
|
|
|
|
This is equivalent to creating a Tax element, and creating and setting the
|
|
required sub-element::
|
|
|
|
entry.tax = Tax()
|
|
entry.tax.tax_country = TaxCountry(tax_country)
|
|
|
|
:param tax_region: The region that the tax rule applies in
|
|
|
|
This is equivalent to creating a Tax element, and creating and setting the
|
|
required sub-element::
|
|
|
|
entry.tax = Tax()
|
|
entry.tax.tax_region = TaxRegion(tax_region)
|
|
|
|
:param tax_ship: Whether shipping cost is taxable
|
|
|
|
This is equivalent to creating a Tax element, and creating and setting the
|
|
required sub-element::
|
|
|
|
entry.tax = Tax()
|
|
entry.tax.tax_ship = TaxShip(tax_ship)
|
|
|
|
:param year: The year the product was created
|
|
|
|
This is equivalent to creating and setting a year element::
|
|
|
|
entry.year = Year('2001')
|
|
"""
|
|
|
|
product = product or ProductEntry()
|
|
if product_id is not None:
|
|
product.product_id = ProductId(product_id)
|
|
if content is not None:
|
|
product.content = atom.data.Content(content)
|
|
if title is not None:
|
|
product.title = atom.data.Title(title)
|
|
if condition is not None:
|
|
product.condition = Condition(condition)
|
|
if price is not None:
|
|
product.price = Price(price, unit=price_unit)
|
|
if content_language is not None:
|
|
product.content_language = ContentLanguage(content_language)
|
|
if target_country is not None:
|
|
product.target_country = TargetCountry(target_country)
|
|
if tax_rate is not None:
|
|
product.tax = Tax()
|
|
product.tax.tax_rate = TaxRate(tax_rate)
|
|
if shipping_price is not None:
|
|
if shipping_price_unit is None:
|
|
raise ValueError('Must provide shipping_price_unit if '
|
|
'shipping_price is provided')
|
|
product.shipping = Shipping()
|
|
product.shipping.shipping_price = ShippingPrice(shipping_price,
|
|
unit=shipping_price_unit)
|
|
if link is not None:
|
|
product.link.append(atom.data.Link(href=link, type='text/html',
|
|
rel='alternate'))
|
|
for image_link in image_links:
|
|
product.image_link.append(ImageLink(image_link))
|
|
if expiration_date is not None:
|
|
product.expiration_date = ExpirationDate(expiration_date)
|
|
if adult is not None:
|
|
product.adult = Adult(adult)
|
|
if author is not None:
|
|
product.author = Author(author)
|
|
if brand is not None:
|
|
product.brand = Brand(brand)
|
|
if color is not None:
|
|
product.color = Color(color)
|
|
if edition is not None:
|
|
product.edition = Edition(edition)
|
|
for feature in features:
|
|
product.feature.append(Feature(feature))
|
|
if featured_product is not None:
|
|
product.featured_product = FeaturedProduct(featured_product)
|
|
if genre is not None:
|
|
product.genre = Genre(genre)
|
|
if manufacturer is not None:
|
|
product.manufacturer = Manufacturer(manufacturer)
|
|
if mpn is not None:
|
|
product.mpn = Mpn(mpn)
|
|
if gtin is not None:
|
|
product.gtin = Gtin(gtin)
|
|
if product_type is not None:
|
|
product.product_type = ProductType(product_type)
|
|
if quantity is not None:
|
|
product.quantity = Quantity(quantity)
|
|
if shipping_country is not None:
|
|
product.shipping.shipping_country = ShippingCountry(
|
|
shipping_country)
|
|
if shipping_region is not None:
|
|
product.shipping.shipping_region = ShippingRegion(shipping_region)
|
|
if shipping_service is not None:
|
|
product.shipping.shipping_service = ShippingService(
|
|
shipping_service)
|
|
if shipping_weight is not None:
|
|
product.shipping_weight = ShippingWeight(shipping_weight)
|
|
if shipping_weight_unit is not None:
|
|
product.shipping_weight.unit = shipping_weight_unit
|
|
for size in sizes:
|
|
product.size.append(Size(size))
|
|
if tax_country is not None:
|
|
product.tax.tax_country = TaxCountry(tax_country)
|
|
if tax_region is not None:
|
|
product.tax.tax_region = TaxRegion(tax_region)
|
|
if tax_ship is not None:
|
|
product.tax.tax_ship = TaxShip(tax_ship)
|
|
if year is not None:
|
|
product.year = Year(year)
|
|
return product
|
|
|
|
|
|
class Edited(atom.core.XmlElement):
|
|
"""sc:edited element
|
|
"""
|
|
_qname = SC_NAMESPACE_TEMPLATE % 'edited'
|
|
|
|
|
|
class AttributeLanguage(atom.core.XmlElement):
|
|
"""sc:attribute_language element
|
|
"""
|
|
_qname = SC_NAMESPACE_TEMPLATE % 'attribute_language'
|
|
|
|
|
|
class Channel(atom.core.XmlElement):
|
|
"""sc:channel element
|
|
"""
|
|
_qname = SC_NAMESPACE_TEMPLATE % 'channel'
|
|
|
|
|
|
class FeedFileName(atom.core.XmlElement):
|
|
"""sc:feed_file_name element
|
|
"""
|
|
_qname = SC_NAMESPACE_TEMPLATE % 'feed_file_name'
|
|
|
|
|
|
class FeedType(atom.core.XmlElement):
|
|
"""sc:feed_type element
|
|
"""
|
|
_qname = SC_NAMESPACE_TEMPLATE % 'feed_type'
|
|
|
|
|
|
class UseQuotedFields(atom.core.XmlElement):
|
|
"""sc:use_quoted_fields element
|
|
"""
|
|
_qname = SC_NAMESPACE_TEMPLATE % 'use_quoted_fields'
|
|
|
|
|
|
class FileFormat(atom.core.XmlElement):
|
|
"""sc:file_format element
|
|
"""
|
|
_qname = SC_NAMESPACE_TEMPLATE % 'file_format'
|
|
use_quoted_fields = UseQuotedFields
|
|
format = 'format'
|
|
|
|
|
|
class ProcessingStatus(atom.core.XmlElement):
|
|
"""sc:processing_status element
|
|
"""
|
|
_qname = SC_NAMESPACE_TEMPLATE % 'processing_status'
|
|
|
|
|
|
class DatafeedEntry(gdata.data.GDEntry):
|
|
"""An entry for a Datafeed
|
|
"""
|
|
content_language = ContentLanguage
|
|
target_country = TargetCountry
|
|
feed_file_name = FeedFileName
|
|
file_format = FileFormat
|
|
attribute_language = AttributeLanguage
|
|
processing_status = ProcessingStatus
|
|
edited = Edited
|
|
feed_type = FeedType
|
|
|
|
|
|
class DatafeedFeed(gdata.data.GDFeed):
|
|
"""A datafeed feed
|
|
"""
|
|
entry = [DatafeedEntry]
|
|
|
|
|
|
class AdultContent(atom.core.XmlElement):
|
|
"""sc:adult_content element
|
|
"""
|
|
_qname = SC_NAMESPACE_TEMPLATE % 'adult_content'
|
|
|
|
|
|
class InternalId(atom.core.XmlElement):
|
|
"""sc:internal_id element
|
|
"""
|
|
_qname = SC_NAMESPACE_TEMPLATE % 'internal_id'
|
|
|
|
|
|
class ReviewsUrl(atom.core.XmlElement):
|
|
"""sc:reviews_url element
|
|
"""
|
|
_qname = SC_NAMESPACE_TEMPLATE % 'reviews_url'
|
|
|
|
|
|
class ClientAccount(gdata.data.GDEntry):
|
|
"""A multiclient account entry
|
|
"""
|
|
adult_content = AdultContent
|
|
internal_id = InternalId
|
|
reviews_url = ReviewsUrl
|
|
|
|
|
|
class ClientAccountFeed(gdata.data.GDFeed):
|
|
"""A multiclient account feed
|
|
"""
|
|
entry = [ClientAccount]
|