#!/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 <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]