Пример #1
0
 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)
Пример #2
0
 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)
Пример #3
0
    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)
Пример #4
0
 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'})
Пример #5
0
 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))
Пример #6
0
    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)
Пример #7
0
    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
Пример #8
0
    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
Пример #9
0
 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
Пример #10
0
 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
Пример #11
0
 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
Пример #12
0
 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
Пример #13
0
 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))
Пример #14
0
 def get_metadata_schema(cls):
     return merge_dicts(
         ShopFolder.get_metadata_schema(),
         declinations_enumerates=Enumerate_ListEnumerateTable(
             multiple=True))
Пример #15
0
 def get_metadata_schema(cls):
     return merge_dicts(ShopFolder.get_metadata_schema(), delivery_schema)
Пример #16
0
 def _get_catalog_values(self):
     return merge_dicts(ShopFolder._get_catalog_values(self),
                        is_shop_module=True)
Пример #17
0
 def get_metadata_schema(cls):
     return merge_dicts(ShopFolder.get_metadata_schema(),
                        shippings_schema)
Пример #18
0
 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)
Пример #19
0
 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'})
Пример #20
0
 def get_metadata_schema(cls):
     return merge_dicts(ShopFolder.get_metadata_schema(), cls.edit_schema)
Пример #21
0
 def get_metadata_schema(cls):
     return merge_dicts(ShopFolder.get_metadata_schema(), cls.item_schema)
Пример #22
0
 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
Пример #23
0
 def get_metadata_schema(cls):
     return merge_dicts(ShopFolder.get_metadata_schema(), shippings_schema)
Пример #24
0
 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
Пример #25
0
 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
Пример #26
0
 def _get_catalog_values(self):
     return merge_dicts(ShopFolder._get_catalog_values(self), is_shop_module=True)
Пример #27
0
 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)
Пример #28
0
 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
Пример #29
0
 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))
Пример #30
0
 def _get_catalog_values(self):
     # XXX We do not index data from data
     return ShopFolder._get_catalog_values(self)
Пример #31
0
 def get_metadata_schema(cls):
     return merge_dicts(ShopFolder.get_metadata_schema(),
             declinations_enumerates=Enumerate_ListEnumerateTable(multiple=True))