def _make_resource(cls, folder, name, *args, **kw): ShopFolder._make_resource(cls, folder, name, *args, **kw) # Image body = lfs.open(get_abspath(cls.img)).read() img = Image._make_resource(Image, folder, '%s/logo.png' % name, body=body, **{'state': 'public'}) # Load zones shop = get_context().resource.parent zones = [] handler = shop.get_resource('countries-zones').handler for record in handler.get_records(): zones.append(handler.get_record_value(record, 'title')) # Create history cls.shipping_history_cls._make_resource(cls.shipping_history_cls, folder, '%s/history' % name) # Import CSV with prices ShippingPrices._make_resource(ShippingPrices, folder, '%s/prices' % name) if getattr(cls, 'csv', None): table = ShippingPricesTable() csv = ro_database.get_handler(get_abspath(cls.csv), ShippingPricesCSV) for row in csv.get_rows(): table.add_record( {'zone': str(zones.index(row.get_value('zone'))), 'max-weight': row.get_value('max-weight'), 'price': row.get_value('price')}) folder.set_handler('%s/prices' % name, table)
def _make_resource(cls, folder, name, *args, **kw): # Create resource kw['title'] = {'en': cls.class_title.gettext()} kw['description'] = {'en': cls.class_description.gettext()} ShopFolder._make_resource(cls, folder, name, *args, **kw) cls.payment_table._make_resource(cls.payment_table, folder, '%s/payments' % name)
def set_property(self, name, value, language=None, with_dynamic=True): """Added to handle dynamic properties. The value is encoded because metadata won't know about its datatype. The multilingual status must be detected to give or not the "language" argument. """ dynamic_schema = self.get_dynamic_schema() if with_dynamic else None # Fire listeners if dynamic_schema and name in dynamic_schema: # dynamic value old_value = self.get_dynamic_property(name, dynamic_schema, language) else: old_value = self.get_property(name) new_value = value alert_listerners('set_property', self, self.class_id, name, old_value, new_value) # Dynamic property? if with_dynamic is True: if name in dynamic_schema: datatype = dynamic_schema[name] if getattr(datatype, 'multiple', False): return ShopFolder.set_property(self, name, Tokens.encode(value)) elif getattr(datatype, 'multilingual', False): # If the value equals the default value # set the property to None (String's default value) # to avoid problems during the language negociation if value == datatype.get_default(): # XXX Should not be hardcoded # Default value for String datatype is None value = None else: value = datatype.encode(value) return ShopFolder.set_property(self, name, value, language) # Even if the language was not None, this property is not # multilingual so ignore it. return ShopFolder.set_property(self, name, datatype.encode(value)) # Standard property schema = self.get_metadata_schema() datatype = schema[name] if getattr(datatype, 'multilingual', False): return ShopFolder.set_property(self, name, value, language) return ShopFolder.set_property(self, name, value)
def _make_resource(cls, folder, name, *args, **kw): root = ShopFolder._make_resource(cls, folder, name, **kw) # Base schema ProductModelSchema._make_resource(ProductModelSchema, folder, '%s/schema' % name, title={'en': u'Model schema'})
def get_metadata_schema(cls): return merge_dicts(ShopFolder.get_metadata_schema(), data=XHTMLBody(multilingual=True), title=Unicode(multilingual=True), enabled=Boolean(default=True), only_this_groups=UserGroup_Enumerate(multiple=True), logo=ImagePathDataType(multilingual=True))
def set_property(self, name, value, language=None, with_dynamic=True): """Added to handle dynamic properties. The value is encoded because metadata won't know about its datatype. The multilingual status must be detected to give or not the "language" argument. """ dynamic_schema = self.get_dynamic_schema() if with_dynamic else None # Fire listeners if dynamic_schema and name in dynamic_schema: # dynamic value old_value = self.get_dynamic_property(name, dynamic_schema, language) else: old_value = self.get_property(name) new_value = value alert_listerners("set_property", self, self.class_id, name, old_value, new_value) # Dynamic property? if with_dynamic is True: if name in dynamic_schema: datatype = dynamic_schema[name] if getattr(datatype, "multiple", False): return ShopFolder.set_property(self, name, Tokens.encode(value)) elif getattr(datatype, "multilingual", False): # If the value equals the default value # set the property to None (String's default value) # to avoid problems during the language negociation if value == datatype.get_default(): # XXX Should not be hardcoded # Default value for String datatype is None value = None else: value = datatype.encode(value) return ShopFolder.set_property(self, name, value, language) # Even if the language was not None, this property is not # multilingual so ignore it. return ShopFolder.set_property(self, name, datatype.encode(value)) # Standard property schema = self.get_metadata_schema() datatype = schema[name] if getattr(datatype, "multilingual", False): return ShopFolder.set_property(self, name, value, language) return ShopFolder.set_property(self, name, value)
def get_property_and_language(self, name, language=None): value, language = ShopFolder.get_property_and_language(self, name, language) # Default properties first (we need "product_model") if name in self.get_metadata_schema(): return value, language # Fallback on dynamic property if defined dynamic_schema = self.get_dynamic_schema() if name in dynamic_schema: return self.get_dynamic_property_and_language(name, dynamic_schema, language) # Just to detect errors raise ValueError, name
def get_property_and_language(self, name, language=None): value, language = ShopFolder.get_property_and_language( self, name, language) # Default properties first (we need "product_model") if name in self.get_metadata_schema(): return value, language # Fallback on dynamic property if defined dynamic_schema = self.get_dynamic_schema() if name in dynamic_schema: return self.get_dynamic_property_and_language( name, dynamic_schema, language) # Just to detect errors raise ValueError, name
def get_dynamic_property_and_language(self, name, dynamic_schema, language=None): value, language = ShopFolder.get_property_and_language(self, name, language) datatype = dynamic_schema[name] # Default value if value is None: value = datatype.get_default() elif getattr(datatype, "multiple", False): if not isinstance(value, list): # Decode the property # Only support list of strings value = list(Tokens.decode(value)) # Else a list was already set by "set_property" else: value = datatype.decode(value) return value, language
def get_metadata_schema(cls): schema = ShopFolder.get_metadata_schema() schema.update(WorkflowAware.get_metadata_schema()) schema['total_price'] = Decimal(title=MSG(u'Total price')) schema['shipping_price'] = Decimal schema['total_weight'] = Decimal schema['creation_datetime'] = ISODateTime(title=MSG(u'Creation date')) schema['customer_id'] = Users_Enumerate schema['payment_mode'] = PaymentWaysEnumerate schema['shipping'] = ShippingWaysEnumerate schema['delivery_address'] = Integer schema['bill_address'] = Integer # States schema['is_payed'] = Boolean(default=False) schema['is_sent'] = Boolean(default=False) return schema
def get_metadata_schema(cls): schema = ShopFolder.get_metadata_schema() schema.update(WorkflowAware.get_metadata_schema()) schema['total_price'] = Decimal(title=MSG(u'Total price')) schema['shipping_price'] = Decimal schema['total_weight'] = Decimal schema['creation_datetime'] = ISODateTime(title=MSG(u'Creation date')) schema['customer_id'] = Users_Enumerate schema['payment_mode'] = PaymentWaysEnumerate schema['shipping'] = ShippingWaysEnumerate schema['delivery_address'] = Integer schema['bill_address'] = Integer # States schema['is_payed'] = Boolean(default=False) schema['is_sent'] = Boolean(default=False) return schema
def get_dynamic_property_and_language(self, name, dynamic_schema, language=None): value, language = ShopFolder.get_property_and_language( self, name, language) datatype = dynamic_schema[name] # Default value if value is None: value = datatype.get_default() elif getattr(datatype, 'multiple', False): if not isinstance(value, list): # Decode the property # Only support list of strings value = list(Tokens.decode(value)) # Else a list was already set by "set_property" else: value = datatype.decode(value) return value, language
def _make_resource(cls, folder, name, *args, **kw): ShopFolder._make_resource(cls, folder, name, **kw) # Init payment ways for payment_way_name, payment_way_cls in payment_ways_registry.items(): payment_way_cls._make_resource(payment_way_cls, folder, '%s/%s' % (name, payment_way_name))
def get_metadata_schema(cls): return merge_dicts( ShopFolder.get_metadata_schema(), declinations_enumerates=Enumerate_ListEnumerateTable( multiple=True))
def get_metadata_schema(cls): return merge_dicts(ShopFolder.get_metadata_schema(), delivery_schema)
def _get_catalog_values(self): return merge_dicts(ShopFolder._get_catalog_values(self), is_shop_module=True)
def get_metadata_schema(cls): return merge_dicts(ShopFolder.get_metadata_schema(), shippings_schema)
def _make_resource(cls, folder, name, *args, **kw): context = get_context() shop = kw['shop'] user = kw['user'] shop_uri = kw['shop_uri'] cart = kw['cart'] # Email user_email = user.get_property('email') # Build metadata/order metadata = {} for key in ['payment_mode', 'shipping_price', 'total_price', 'total_weight']: metadata[key] = kw[key] # Has tax ? id_zone = cart.id_zone zones = shop.get_resource('countries-zones').handler zone_record = zones.get_record(int(id_zone)) has_tax = zones.get_record_value(zone_record, 'has_tax') # Addresses metadata['delivery_address'] = cart.addresses['delivery_address'] metadata['bill_address'] = cart.addresses['bill_address'] or \ cart.addresses['delivery_address'] metadata['customer_id'] = user.name metadata['creation_datetime'] = datetime.now() metadata['shipping'] = cart.shipping ShopFolder._make_resource(cls, folder, name, *args, **metadata) # Save products handler = BaseOrdersProducts() for product_cart in cart.products: product = context.root.get_resource(product_cart['name']) declination = product_cart['declination'] if has_tax: tax = TaxesEnumerate.get_value(product.get_property('tax')) else: tax = decimal(0) handler.add_record( {'name': str(product.get_abspath()), 'reference': product.get_reference(declination), 'title': product.get_title(), 'declination': declination, 'pre-tax-price': product.get_price_without_tax(declination), 'tax': tax, 'weight': product.get_weight(declination), 'quantity': product_cart['quantity']}) metadata = OrdersProducts.build_metadata(title={'en': u'Products'}) folder.set_handler('%s/products.metadata' % name, metadata) folder.set_handler('%s/products' % name, handler) # Get bill and delivery addresses addresses = shop.get_resource('addresses').handler delivery_record = addresses.get_record_kw(cart.addresses['delivery_address']) bill_record = addresses.get_record_kw(cart.addresses['bill_address'] or 0) # Save addresses handler = BaseAddresses() handler.add_record(delivery_record) handler.add_record(bill_record) metadata = Addresses.build_metadata(title={'en': u'Addresses'}) folder.set_handler('%s/addresses.metadata' % name, metadata) folder.set_handler('%s/addresses' % name, handler) # Add messages resource Messages_TableResource._make_resource(Messages_TableResource, folder, '%s/messages' % name, **{'title': {'en': u'Messages'}}) # Generate barcode from shop.utils import generate_barcode order = shop.get_resource('orders/%s' % name) barcode = generate_barcode(shop.get_property('barcode_format'), name) metadata = {'title': {'en': u'Barcode'}, 'filename': 'barcode.png', 'format': 'image/png'} Image.make_resource(Image, order, 'barcode', body=barcode, **metadata)
def _make_resource(cls, folder, name, *args, **kw): root = ShopFolder._make_resource(cls, folder, name, **kw) # Base schema ProductModelSchema._make_resource(ProductModelSchema, folder, '%s/schema' % name, title={'en': u'Model schema'})
def get_metadata_schema(cls): return merge_dicts(ShopFolder.get_metadata_schema(), cls.edit_schema)
def get_metadata_schema(cls): return merge_dicts(ShopFolder.get_metadata_schema(), cls.item_schema)
def _get_catalog_values(self): values = ShopFolder._get_catalog_values(self) for key in ['customer_id', 'creation_datetime', 'is_payed']: values[key] = self.get_property(key) return values
def get_metadata_schema(cls): return merge_dicts(ShopFolder.get_metadata_schema(), shippings_schema)
def make_resource(cls, container, name, *args, **kw): order = ShopFolder.make_resource(cls, container, name, *args, **kw) # XXX Workflow (Should be done in ikaaro) order.onenter_open() return order
def make_resource(cls, container, name, *args, **kw): order = ShopFolder.make_resource(cls, container, name, *args, **kw) # XXX Workflow (Should be done in ikaaro) order.onenter_open() return order
def _get_catalog_values(self): return merge_dicts(ShopFolder._get_catalog_values(self), is_shop_module=True)
def _make_resource(cls, folder, name, *args, **kw): context = get_context() shop = kw['shop'] user = kw['user'] shop_uri = kw['shop_uri'] cart = kw['cart'] # Email user_email = user.get_property('email') # Build metadata/order metadata = {} for key in [ 'payment_mode', 'shipping_price', 'total_price', 'total_weight' ]: metadata[key] = kw[key] # Has tax ? id_zone = cart.id_zone zones = shop.get_resource('countries-zones').handler zone_record = zones.get_record(int(id_zone)) has_tax = zones.get_record_value(zone_record, 'has_tax') # Addresses metadata['delivery_address'] = cart.addresses['delivery_address'] metadata['bill_address'] = cart.addresses['bill_address'] or \ cart.addresses['delivery_address'] metadata['customer_id'] = user.name metadata['creation_datetime'] = datetime.now() metadata['shipping'] = cart.shipping ShopFolder._make_resource(cls, folder, name, *args, **metadata) # Save products handler = BaseOrdersProducts() for product_cart in cart.products: product = context.root.get_resource(product_cart['name']) declination = product_cart['declination'] if has_tax: tax = TaxesEnumerate.get_value(product.get_property('tax')) else: tax = decimal(0) handler.add_record({ 'name': str(product.get_abspath()), 'reference': product.get_reference(declination), 'title': product.get_title(), 'declination': declination, 'pre-tax-price': product.get_price_without_tax(declination), 'tax': tax, 'weight': product.get_weight(declination), 'quantity': product_cart['quantity'] }) metadata = OrdersProducts.build_metadata(title={'en': u'Products'}) folder.set_handler('%s/products.metadata' % name, metadata) folder.set_handler('%s/products' % name, handler) # Get bill and delivery addresses addresses = shop.get_resource('addresses').handler delivery_record = addresses.get_record_kw( cart.addresses['delivery_address']) bill_record = addresses.get_record_kw(cart.addresses['bill_address'] or 0) # Save addresses handler = BaseAddresses() handler.add_record(delivery_record) handler.add_record(bill_record) metadata = Addresses.build_metadata(title={'en': u'Addresses'}) folder.set_handler('%s/addresses.metadata' % name, metadata) folder.set_handler('%s/addresses' % name, handler) # Add messages resource Messages_TableResource._make_resource(Messages_TableResource, folder, '%s/messages' % name, **{'title': { 'en': u'Messages' }}) # Generate barcode from shop.utils import generate_barcode order = shop.get_resource('orders/%s' % name) barcode = generate_barcode(shop.get_property('barcode_format'), name) metadata = { 'title': { 'en': u'Barcode' }, 'filename': 'barcode.png', 'format': 'image/png' } Image.make_resource(Image, order, 'barcode', body=barcode, **metadata)
def _get_catalog_values(self): values = ShopFolder._get_catalog_values(self) for key in ['customer_id', 'creation_datetime', 'is_payed']: values[key] = self.get_property(key) return values
def _make_resource(cls, folder, name, *args, **kw): ShopFolder._make_resource(cls, folder, name, **kw) # Init payment ways for payment_way_name, payment_way_cls in payment_ways_registry.items(): payment_way_cls._make_resource(payment_way_cls, folder, '%s/%s' % (name, payment_way_name))
def _get_catalog_values(self): # XXX We do not index data from data return ShopFolder._get_catalog_values(self)
def get_metadata_schema(cls): return merge_dicts(ShopFolder.get_metadata_schema(), declinations_enumerates=Enumerate_ListEnumerateTable(multiple=True))