Beispiel #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)
Beispiel #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)
Beispiel #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)
Beispiel #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'})
Beispiel #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))
Beispiel #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)
Beispiel #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
Beispiel #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
Beispiel #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
Beispiel #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
Beispiel #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
Beispiel #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
Beispiel #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))
Beispiel #14
0
 def get_metadata_schema(cls):
     return merge_dicts(
         ShopFolder.get_metadata_schema(),
         declinations_enumerates=Enumerate_ListEnumerateTable(
             multiple=True))
Beispiel #15
0
 def get_metadata_schema(cls):
     return merge_dicts(ShopFolder.get_metadata_schema(), delivery_schema)
Beispiel #16
0
 def _get_catalog_values(self):
     return merge_dicts(ShopFolder._get_catalog_values(self),
                        is_shop_module=True)
Beispiel #17
0
 def get_metadata_schema(cls):
     return merge_dicts(ShopFolder.get_metadata_schema(),
                        shippings_schema)
Beispiel #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)
Beispiel #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'})
Beispiel #20
0
 def get_metadata_schema(cls):
     return merge_dicts(ShopFolder.get_metadata_schema(), cls.edit_schema)
Beispiel #21
0
 def get_metadata_schema(cls):
     return merge_dicts(ShopFolder.get_metadata_schema(), cls.item_schema)
Beispiel #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
Beispiel #23
0
 def get_metadata_schema(cls):
     return merge_dicts(ShopFolder.get_metadata_schema(), shippings_schema)
Beispiel #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
Beispiel #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
Beispiel #26
0
 def _get_catalog_values(self):
     return merge_dicts(ShopFolder._get_catalog_values(self), is_shop_module=True)
Beispiel #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)
Beispiel #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
Beispiel #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))
Beispiel #30
0
 def _get_catalog_values(self):
     # XXX We do not index data from data
     return ShopFolder._get_catalog_values(self)
Beispiel #31
0
 def get_metadata_schema(cls):
     return merge_dicts(ShopFolder.get_metadata_schema(),
             declinations_enumerates=Enumerate_ListEnumerateTable(multiple=True))