Source code for yandex_market_language.models.shop

from typing import List

from yandex_market_language import models, exceptions
from yandex_market_language.models import fields
from yandex_market_language.models.abstract import XMLElement, XMLSubElement

from yandex_market_language.exceptions import ValidationError


[docs]class Shop( fields.EnableAutoDiscountField, fields.DeliveryOptionsField, fields.PickupOptionsField, models.AbstractModel ): """ Shop model. Docs: https://yandex.ru/support/partnermarket/elements/shop.html """ __slots__ = [ '_url', 'name', 'company', 'currencies', 'categories', 'offers', 'platform', 'version', 'agency', 'email', '_delivery_options', '_pickup_options', '_enable_auto_discounts', 'gifts', 'promos' ] def __init__( self, name: str, company: str, url: str, currencies: List["models.Currency"], categories: List["models.Category"], offers: List["models.offers.AbstractOffer"], platform: str = None, version: str = None, agency: str = None, email: str = None, delivery_options: List["models.Option"] = None, pickup_options: List["models.Option"] = None, enable_auto_discounts=None, gifts: List["models.Gift"] = None, promos: List["models.Promo"] = None, ): self.name = name self.company = company self.url = url self.platform = platform self.version = version self.agency = agency self.email = email self.currencies = currencies self.categories = categories self.delivery_options = delivery_options self.pickup_options = pickup_options self.enable_auto_discounts = enable_auto_discounts self.offers = offers self.gifts = gifts self.promos = promos @property def url(self): return self._url @url.setter def url(self, value: str): if len(value) > 512: raise ValidationError("The maximum url length is 512 characters.") self._url = value
[docs] def create_dict(self, **kwargs) -> dict: return dict( name=self.name, company=self.company, url=self.url, platform=self.platform, version=self.version, agency=self.agency, email=self.email, currencies=[c.to_dict() for c in self.currencies], categories=[c.to_dict() for c in self.categories], delivery_options=[o.to_dict() for o in self.delivery_options], pickup_options=[o.to_dict() for o in self.pickup_options], enable_auto_discounts=self.enable_auto_discounts, offers=[o.to_dict() for o in self.offers], gifts=[g.to_dict() for g in self.gifts] if self.gifts else [], promos=[p.to_dict() for p in self.promos] if self.promos else [], )
[docs] def create_xml(self, **kwargs) -> XMLElement: shop_el = XMLElement("shop") # Add simple elements for tag in ( "name", "company", "url", "platform", "version", "agency", "email", ): value = getattr(self, tag) if value: el = XMLSubElement(shop_el, tag) el.text = value # Add currencies currencies_el = XMLSubElement(shop_el, "currencies") for c in self.currencies: c.to_xml(currencies_el) # Add categories categories_el = XMLSubElement(shop_el, "categories") for c in self.categories: c.to_xml(categories_el) # Add delivery options if self.delivery_options: delivery_options_el = XMLSubElement(shop_el, "delivery-options") for o in self.delivery_options: o.to_xml(delivery_options_el) # Add pickup options if self.pickup_options: pickup_options_el = XMLSubElement(shop_el, "pickup-options") for o in self.pickup_options: o.to_xml(pickup_options_el) # Add enable_auto_discounts if self._enable_auto_discounts: enable_auto_discounts_el = XMLSubElement( shop_el, "enable_auto_discounts" ) enable_auto_discounts_el.text = self._enable_auto_discounts # Add offers offers_el = XMLSubElement(shop_el, "offers") for o in self.offers: o.to_xml(offers_el) # Add gifts if self.gifts: gifts_el = XMLSubElement(shop_el, "gifts") for g in self.gifts: g.to_xml(gifts_el) # Add promos if self.promos: promos_el = XMLSubElement(shop_el, "promos") for p in self.promos: p.to_xml(promos_el) return shop_el
[docs] @staticmethod def from_xml(shop_el: XMLElement) -> "Shop": kwargs = {} for el in shop_el: if el.tag == "currencies": currencies = [] for currency_el in el: currencies.append(models.Currency.from_xml(currency_el)) kwargs["currencies"] = currencies elif el.tag == "categories": categories = [] for category_el in el: categories.append(models.Category.from_xml(category_el)) kwargs["categories"] = categories elif el.tag == "delivery-options": delivery_options = [] for option_el in el: delivery_options.append(models.Option.from_xml(option_el)) kwargs["delivery_options"] = delivery_options elif el.tag == "pickup-options": pickup_options = [] for option_el in el: pickup_options.append(models.Option.from_xml(option_el)) kwargs["pickup_options"] = pickup_options elif el.tag == "offers": offers = [] for offer_el in el: offer_type = offer_el.attrib.get("type") if offer_type is None: offer = models.SimplifiedOffer.from_xml(offer_el) elif offer_type == "vendor.model": offer = models.ArbitraryOffer.from_xml(offer_el) elif offer_type == "book": offer = models.BookOffer.from_xml(offer_el) elif offer_type == "audiobook": offer = models.AudioBookOffer.from_xml(offer_el) elif offer_type == "artist.title": offer = models.MusicVideoOffer.from_xml(offer_el) elif offer_type == "medicine": offer = models.MedicineOffer.from_xml(offer_el) elif offer_type == "event-ticket": offer = models.EventTicketOffer.from_xml(offer_el) elif offer_type == "alco": offer = models.AlcoholOffer.from_xml(offer_el) else: raise exceptions.ParseError( "Got unexpected offer type: {0}".format(offer_type) ) offers.append(offer) kwargs["offers"] = offers elif el.tag == "gifts": gifts = [] for gift_el in el: gifts.append(models.Gift.from_xml(gift_el)) if gifts: kwargs["gifts"] = gifts elif el.tag == "promos": promos = [] for promo_el in el: promos.append(models.Promo.from_xml(promo_el)) if promos: kwargs["promos"] = promos else: kwargs[el.tag] = el.text return Shop(**kwargs)