예제 #1
0
 def _get_dynamic_catalog_values(self):
     values = {}
     dynamic_schema = self.get_dynamic_schema()
     for key, datatype in get_product_filters().items():
         register_key = 'DFT-%s' % key
         if key in dynamic_schema:
             value = self.get_dynamic_property(key, dynamic_schema)
             if value and getattr(datatype, 'is_range', False):
                 value = int(value * 100)
             if value:
                 values[register_key] = value
     # Dynamic indexation
     register_fields = get_register_fields()
     model = self.get_product_model()
     if model is None:
         return {}
     for key, datatype in self.get_dynamic_schema().items():
         # We index dynamic properties that correspond to
         # an EnumerateTable datatype.
         # So we are able to know if enumerate value is used or not
         if issubclass(datatype, EnumerateTable_to_Enumerate) is True:
             register_key = 'DFT-%s' % datatype.enumerate_name
             if register_key not in register_fields:
                 register_field(register_key, String(is_indexed=True))
             if datatype.multiple is True:
                 values[register_key] = ' '.join(self.get_property(key))
             else:
                 values[register_key] = self.get_property(key)
     return values
예제 #2
0
파일: product.py 프로젝트: hforge/shop
 def _get_dynamic_catalog_values(self):
     values = {}
     dynamic_schema = self.get_dynamic_schema()
     for key, datatype in get_product_filters().items():
         register_key = 'DFT-%s' % key
         if key in dynamic_schema:
             value = self.get_dynamic_property(key, dynamic_schema)
             if value and getattr(datatype, 'is_range', False):
                 value = int(value * 100)
             if value:
                 values[register_key] = value
     # Dynamic indexation
     register_fields = get_register_fields()
     model = self.get_product_model()
     if model is None:
         return {}
     for key, datatype in self.get_dynamic_schema().items():
         # We index dynamic properties that correspond to
         # an EnumerateTable datatype.
         # So we are able to know if enumerate value is used or not
         if issubclass(datatype, EnumerateTable_to_Enumerate) is True:
             register_key = 'DFT-%s' % datatype.enumerate_name
             if register_key not in register_fields:
                 register_field(register_key, String(is_indexed=True))
             if datatype.multiple is True:
                 values[register_key] = ' '.join(self.get_property(key))
             else:
                 values[register_key] = self.get_property(key)
     return values
예제 #3
0
def register_dynamic_fields(context):
    root = context.root
    if not context.database.catalog:
        print '==========================='
        print '= You have to index twice ='
        print '==========================='
        return
    # XXX Should not do a search since catalog can be break
    for brain in root.search(format='shop').get_documents():
        shop = root.get_resource(brain.abspath)
        website = shop.parent
        print '==============================='
        print ' => Initialize catalog'
        print ' => %s' % website.get_title()
        print '==============================='
        # Register field for each dynamic table
        fields = []
        for enumerate_table in website.get_resources('shop/enumerates'):
            register_key = 'DFT-%s' % enumerate_table.name
            register_field(register_key, String(is_indexed=True,
                                                multiple=True))
            fields.append(register_key)
        dynamic_fields[website.name] = fields
        print '=> %s dynamic fields' % len(fields)
        pprint(fields)
예제 #4
0
 def _get_dynamic_catalog_values(self):
     values = {}
     register_fields = get_register_fields()
     for key, datatype in self.get_dynamic_schema().items():
         if issubclass(datatype, EnumerateTable_to_Enumerate) is True:
             register_key = 'DFT-DECL-%s' % datatype.enumerate_name
             if register_key not in register_fields:
                 register_field(register_key, String(is_indexed=True))
             if datatype.multiple is True:
                 values[register_key] = ' '.join(self.get_property(key))
             else:
                 values[register_key] = self.get_property(key)
     return values
예제 #5
0
파일: declination.py 프로젝트: hforge/shop
 def _get_dynamic_catalog_values(self):
     values = {}
     register_fields = get_register_fields()
     for key, datatype in self.get_dynamic_schema().items():
         if issubclass(datatype, EnumerateTable_to_Enumerate) is True:
             register_key = 'DFT-DECL-%s' % datatype.enumerate_name
             if register_key not in register_fields:
                 register_field(register_key, String(is_indexed=True))
             if datatype.multiple is True:
                 values[register_key] = ' '.join(self.get_property(key))
             else:
                 values[register_key] = self.get_property(key)
     return values
예제 #6
0
 def get_quantity(self, resource, context, item):
     get_value = resource.handler.get_record_value
     name = get_value(item, "name")
     # On products
     quantity = 0
     register_key = "DFT-%s" % resource.name
     if register_key not in get_register_fields():
         register_field(register_key, String(is_indexed=True))
     query = PhraseQuery(register_key, name)
     quantity += len(context.root.search(query))
     # On declination
     register_key = "DFT-DECL-%s" % resource.name
     if register_key not in get_register_fields():
         register_field(register_key, String(is_indexed=True))
     query = PhraseQuery(register_key, name)
     quantity += len(context.root.search(query))
     return quantity
예제 #7
0
 def get_quantity(self, resource, context, item):
     get_value = resource.handler.get_record_value
     name = get_value(item, 'name')
     # On products
     quantity = 0
     register_key = 'DFT-%s' % resource.name
     if register_key not in get_register_fields():
         register_field(register_key, String(is_indexed=True))
     query = PhraseQuery(register_key, name)
     quantity += len(context.root.search(query))
     # On declination
     register_key = 'DFT-DECL-%s' % resource.name
     if register_key not in get_register_fields():
         register_field(register_key, String(is_indexed=True))
     query = PhraseQuery(register_key, name)
     quantity += len(context.root.search(query))
     return quantity
예제 #8
0
파일: catalog.py 프로젝트: hforge/shop
def register_dynamic_fields(context):
    root = context.root
    if not context.database.catalog:
        print '==========================='
        print '= You have to index twice ='
        print '==========================='
        return
    # XXX Should not do a search since catalog can be break
    for brain in root.search(format='shop').get_documents():
        shop = root.get_resource(brain.abspath)
        website = shop.parent
        print '==============================='
        print ' => Initialize catalog'
        print ' => %s' % website.get_title()
        print '==============================='
        # Register field for each dynamic table
        fields = []
        for enumerate_table in website.get_resources('shop/enumerates'):
            register_key = 'DFT-%s' % enumerate_table.name
            register_field(register_key, String(is_indexed=True, multiple=True))
            fields.append(register_key)
        dynamic_fields[website.name] = fields
        print '=> %s dynamic fields' % len(fields)
        pprint(fields)
예제 #9
0
파일: declination.py 프로젝트: hforge/shop

    def get_price_impact(self, prefix):
        if prefix is None:
            prefix = self.parent.get_price_prefix()
        return self.get_property('%simpact_on_price' % prefix)


    def get_weight(self):
        base_weight = self.parent.get_property('weight')
        weight_impact = self.get_property('impact-on-weight')
        weight_value = self.get_property('weight-impact-value')
        if weight_impact == 'none':
            return base_weight
        elif weight_impact == 'increase':
            return base_weight + weight_value
        elif weight_impact == 'decrease':
            return base_weight - weight_value



    def get_document_types(self):
        return []




register_resource_class(Declination)
register_field('declination_title', Unicode(is_indexed=True, is_stored=True))
register_field('is_default', Boolean(is_indexed=True))
예제 #10
0
    def get_quantity_in_stock(self):
        return self.get_property('stock-quantity')

    def get_reference(self):
        return self.get_property('reference')

    def get_price_impact(self, prefix):
        if prefix is None:
            prefix = self.parent.get_price_prefix()
        return self.get_property('%simpact_on_price' % prefix)

    def get_weight(self):
        base_weight = self.parent.get_property('weight')
        weight_impact = self.get_property('impact-on-weight')
        weight_value = self.get_property('weight-impact-value')
        if weight_impact == 'none':
            return base_weight
        elif weight_impact == 'increase':
            return base_weight + weight_value
        elif weight_impact == 'decrease':
            return base_weight - weight_value

    def get_document_types(self):
        return []


register_resource_class(Declination)
register_field('declination_title', Unicode(is_indexed=True, is_stored=True))
register_field('is_default', Boolean(is_indexed=True))
예제 #11
0
파일: models.py 프로젝트: nicolasderam/shop
            kw = {'value': value, 'real_value': real_value}
            for key in ['name', 'title', 'multiple', 'visible']:
                kw[key] = get_value(record, key)
            # Add to namespace
            namespace['specific_dict'][name] = kw
            namespace['specific_list_complete'].append(kw)
            if kw['visible'] and kw['value']:
                namespace['specific_list'].append(kw)
        return namespace


class ProductModels(ShopFolder):

    class_id = 'product-models'
    class_title = MSG(u'Product Models')
    class_views = ['browse_content', 'new_resource?type=product-model']

    # Views
    browse_content = ProductModels_View()

    def get_document_types(self):
        return [ProductModel]


register_resource_class(ProductModel)
register_resource_class(ProductModelSchema)
register_resource_class(ProductModels)

register_field('declinations_enumerates', String(is_indexed=True,
                                                 multiple=True))
예제 #12
0
    class_version = '20100229'

    # Views
    browse_content = Products_View()
    stock = Products_Stock()
    new_product = Product_NewProduct()

    def can_paste(self, source):
        return isinstance(source, Product)

    def get_document_types(self):
        return []


# Register fields
register_field('reference', String(is_indexed=True, is_stored=True))
register_field('stock_quantity', Integer(is_indexed=True, is_stored=True))
register_field('manufacturer', String(is_indexed=True))
register_field('supplier', String(is_indexed=True, multiple=True))
register_field('product_model', String(is_indexed=True, is_stored=True))
register_field('has_images', Boolean(is_indexed=True, is_stored=True))
register_field('has_reduction', Boolean(is_indexed=True))
register_field('not_buyable_by_groups', String(is_indexed=True, multiple=True))
register_field('ctime', DateTime(is_stored=True, is_indexed=True))
register_field('data', Unicode(is_indexed=True))
register_field('ht_price', Decimal(is_indexed=True, is_stored=True))
register_field('ttc_price', Decimal(is_indexed=True, is_stored=True))
# XXX xapian can't sort decimal
register_field('stored_price', Integer(is_indexed=False, is_stored=True))
register_field('stored_weight', Integer(is_indexed=False, is_stored=True))
예제 #13
0
    def render_for_user(self, resource, context):
        # Get review that belong to user
        query = [
            PhraseQuery('shop_module_review_author', resource.name),
            PhraseQuery('workflow_state', 'public'),
            PhraseQuery('format', 'shop_module_a_review')
        ]
        search = context.root.search(AndQuery(*query))
        brains = list(search.get_documents(sort_by='mtime', reverse=True))
        nb_reviews = len(brains)
        # Get viewboxes
        viewboxes = []
        for brain in brains[:5]:
            review = context.root.get_resource(brain.abspath)
            viewbox = Review_Viewbox().GET(review, context)
            viewboxes.append(viewbox)
        # Return namespace
        return {'nb_reviews': nb_reviews, 'viewboxes': viewboxes}

    def get_document_types(self):
        return []


register_resource_class(ShopModule_Review)
register_resource_class(ShopModule_AReview)
register_field('shop_module_review_author', String(is_indexed=True))
register_field('shop_module_review_note',
               Integer(is_indexed=True, is_stored=True))
register_field('shop_module_review_description', Unicode(is_stored=True))
예제 #14
0
파일: issue.py 프로젝트: Ramel/tchacker
    # Views
    edit = TchackIssue_Edit()

    def _get_catalog_values(self):
        values = Issue._get_catalog_values(self)
        history = self.get_history()
        # Get the last record
        record = history.get_record(-1)
        if record:
            values['issue_last_author'] = history.get_record_value(record, 'username')
        # Get last attachment
        values['issue_last_attachment'] = None
        for record in self.get_history_records():
            if record.file:
                values['issue_last_attachment'] = record.file
        return values


    #def get_context_menus(self):
    #    return self.parent.get_context_menus() + [IssueTrackerMenu()]



###########################################################################
# Register
###########################################################################
# The class
register_resource_class(Tchack_Issue)
register_field('issue_last_attachment', String(is_stored=True))
register_field('issue_last_author', String(is_stored=True))
예제 #15
0
        abspath = self.get_canonical_path()
        query = AndQuery(PhraseQuery('parent_paths', str(abspath)),
                         PhraseQuery('format', 'category'))
        return len(root.search(query))

    @property
    def nb_products(self):
        return self.get_nb_products()

    @property
    def nb_categories(self):
        return self.get_nb_categories()

    #############################
    # Export
    #############################
    export = Export(export_resource=Product,
                    access='is_allowed_to_edit',
                    file_columns=[
                        'reference', 'state', 'frontoffice_uri', 'cover_uri',
                        'manufacturer', 'price_with_tax', 'description'
                    ])


register_resource_class(Category)

# Add m_title field if it does not already exist
if 'm_title' in get_register_fields() is False:
    register_field('m_title', Unicode(is_stored=True, is_indexed=True))
register_field('m_breadcrumb_title', Unicode(is_stored=True, is_indexed=True))
예제 #16
0
파일: orders.py 프로젝트: hforge/shop
    class_id = 'orders'
    class_title = MSG(u'Orders')
    class_views = ['view'] # 'export']
    class_version = '20091127'

    # Views
    view = OrdersView()


    def get_document_types(self):
        return [Order]

    #############################
    # Export
    #############################
    export = Export(
        export_resource=Order,
        access='is_allowed_to_edit',
        file_columns=['name', 'state', 'total_price', 'creation_datetime'])


# Register catalog fields
register_field('customer_id', String(is_indexed=True))
register_field('is_payed', Boolean(is_stored=True))
register_field('creation_datetime', DateTime(is_stored=True, is_indexed=True))

# Register resources
register_resource_class(Order)
register_resource_class(Orders)
register_resource_class(OrdersProducts)
예제 #17
0
파일: categories.py 프로젝트: hforge/shop
        return len(root.search(query))


    @property
    def nb_products(self):
        return self.get_nb_products()


    @property
    def nb_categories(self):
        return self.get_nb_categories()

    #############################
    # Export
    #############################
    export = Export(export_resource=Product,
                    access='is_allowed_to_edit',
                    file_columns=['reference', 'state',
                                  'frontoffice_uri', 'cover_uri',
                                  'manufacturer', 'price_with_tax',
                                  'description'])



register_resource_class(Category)

# Add m_title field if it does not already exist
if 'm_title' in get_register_fields() is False:
    register_field('m_title', Unicode(is_stored=True, is_indexed=True))
register_field('m_breadcrumb_title', Unicode(is_stored=True, is_indexed=True))
예제 #18
0
파일: models.py 프로젝트: hforge/shop
            # Add to namespace
            namespace['specific_dict'][name] = kw
            namespace['specific_list_complete'].append(kw)
            if kw['visible'] and kw['value']:
                namespace['specific_list'].append(kw)
        return namespace




class ProductModels(ShopFolder):

    class_id = 'product-models'
    class_title = MSG(u'Product Models')
    class_views = ['browse_content', 'new_resource?type=product-model']

    # Views
    browse_content = ProductModels_View()


    def get_document_types(self):
        return [ProductModel]



register_resource_class(ProductModel)
register_resource_class(ProductModelSchema)
register_resource_class(ProductModels)

register_field('declinations_enumerates', String(is_indexed=True, multiple=True))
예제 #19
0
    class_views = ['view']

    view = Modules_View()

    def get_document_types(self):
        return []



class ModuleLoader(dict):

    context = None
    here = None

    def __getitem__(self, key):
        shop = get_shop(self.context.resource)
        module = shop.get_resource('modules/%s' % key, soft=True)
        if module is None:
            # XXX Log it
            ac = shop.get_access_control()
            user = self.context.user
            if ac.is_admin(user, shop) is False:
                return None
            return MSG(u'Module {name} not initialized').gettext(name=key)
        return module.render(self.here, self.context)



register_field('is_shop_module', Boolean(is_indexed=True))
register_field('is_shop_user_module', Boolean(is_indexed=True))
예제 #20
0
파일: user.py 프로젝트: hforge/shop
        user = cls.make_resource(cls, self, user_id)
        # Set the email and paswword
        if email is not None:
            user.set_property('email', email)
        if password is not None:
            user.set_password(password)
        # Set default group
        root = context.root
        query = [PhraseQuery('format', 'user-group'),
                 PhraseQuery('name', 'default')]
        search = root.search(AndQuery(*query))
        documents = search.get_documents()
        group = documents[0]
        group = root.get_resource(group.abspath)
        user.set_property('user_group', str(group.get_abspath()))
        user_is_enabled = group.get_property('user_is_enabled_when_register')
        user.set_property('is_enabled', user_is_enabled)
        # Return the user
        return user



register_resource_class(ShopUser)
register_resource_class(ShopUserFolder)
register_resource_class(Customers)
register_resource_class(AuthentificationLogs)

register_field('last_time', DateTime(is_stored=True))
register_field('user_group', String(is_indexed=True))
register_field('is_enabled', Boolean(is_indexed=True))
예제 #21
0
파일: review.py 프로젝트: hforge/shop
    def render_for_user(self, resource, context):
        # Get review that belong to user
        query = [PhraseQuery('shop_module_review_author', resource.name),
                 PhraseQuery('workflow_state', 'public'),
                 PhraseQuery('format', 'shop_module_a_review')]
        search = context.root.search(AndQuery(*query))
        brains = list(search.get_documents(sort_by='mtime', reverse=True))
        nb_reviews = len(brains)
        # Get viewboxes
        viewboxes = []
        for brain in brains[:5]:
            review = context.root.get_resource(brain.abspath)
            viewbox = Review_Viewbox().GET(review, context)
            viewboxes.append(viewbox)
        # Return namespace
        return {'nb_reviews': nb_reviews,
                'viewboxes': viewboxes}


    def get_document_types(self):
        return []




register_resource_class(ShopModule_Review)
register_resource_class(ShopModule_AReview)
register_field('shop_module_review_author', String(is_indexed=True))
register_field('shop_module_review_note', Integer(is_indexed=True, is_stored=True))
register_field('shop_module_review_description', Unicode(is_stored=True))
예제 #22
0
파일: folder.py 프로젝트: hforge/shop
                    self.set_property(key, events, language=lang)
            elif issubclass(datatype, PathDataType):
                # Relative path
                for lang in langs:
                    path = self.get_property(key, language=lang)
                    if path is None:
                        continue
                    # Calcul the old absolute path
                    old_abs_path = source.resolve2(path)
                    # Check if the target path has not been moved
                    new_abs_path = resources_old2new.get(old_abs_path, old_abs_path)
                    # Build the new path
                    # Absolute path allow to call get_pathto with the target
                    new_path = str(target.get_pathto(new_abs_path))
                    self.set_property(key, new_path, language=lang)
            elif issubclass(datatype, AbsolutePathDataTypeEnumerate):
                # Absolute path
                for lang in langs:
                    path = self.get_property(key, language=lang)
                    if path is None:
                        continue
                    # Calcul the old absolute path
                    path = str(path)
                    old_abs_path = resources_new2old.get(path, path)
                    # Check if the target path has not been moved
                    new_abs_path = resources_old2new.get(old_abs_path, old_abs_path)
                    self.set_property(key, new_abs_path, language=lang)


register_field('parent_paths', String(is_indexed=True, multiple=True))
예제 #23
0
파일: user.py 프로젝트: nicolasderam/shop
        # Set the email and paswword
        if email is not None:
            user.set_property('email', email)
        if password is not None:
            user.set_password(password)
        # Set default group
        root = context.root
        query = [
            PhraseQuery('format', 'user-group'),
            PhraseQuery('name', 'default')
        ]
        search = root.search(AndQuery(*query))
        documents = search.get_documents()
        group = documents[0]
        group = root.get_resource(group.abspath)
        user.set_property('user_group', str(group.get_abspath()))
        user_is_enabled = group.get_property('user_is_enabled_when_register')
        user.set_property('is_enabled', user_is_enabled)
        # Return the user
        return user


register_resource_class(ShopUser)
register_resource_class(ShopUserFolder)
register_resource_class(Customers)
register_resource_class(AuthentificationLogs)

register_field('last_time', DateTime(is_stored=True))
register_field('user_group', String(is_indexed=True))
register_field('is_enabled', Boolean(is_indexed=True))
예제 #24
0
파일: orders.py 프로젝트: nicolasderam/shop
    class_id = 'orders'
    class_title = MSG(u'Orders')
    class_views = ['view']  # 'export']
    class_version = '20091127'

    # Views
    view = OrdersView()

    def get_document_types(self):
        return [Order]

    #############################
    # Export
    #############################
    export = Export(
        export_resource=Order,
        access='is_allowed_to_edit',
        file_columns=['name', 'state', 'total_price', 'creation_datetime'])


# Register catalog fields
register_field('customer_id', String(is_indexed=True))
register_field('is_payed', Boolean(is_stored=True))
register_field('creation_datetime', DateTime(is_stored=True, is_indexed=True))

# Register resources
register_resource_class(Order)
register_resource_class(Orders)
register_resource_class(OrdersProducts)
예제 #25
0
    class_id = "modules"
    class_title = MSG(u"Modules")
    class_views = ["view"]

    view = Modules_View()

    def get_document_types(self):
        return []


class ModuleLoader(dict):

    context = None
    here = None

    def __getitem__(self, key):
        shop = get_shop(self.context.resource)
        module = shop.get_resource("modules/%s" % key, soft=True)
        if module is None:
            # XXX Log it
            ac = shop.get_access_control()
            user = self.context.user
            if ac.is_admin(user, shop) is False:
                return None
            return MSG(u"Module {name} not initialized").gettext(name=key)
        return module.render(self.here, self.context)


register_field("is_shop_module", Boolean(is_indexed=True))
register_field("is_shop_user_module", Boolean(is_indexed=True))
예제 #26
0
파일: product.py 프로젝트: hforge/shop
    # Views
    browse_content = Products_View()
    stock = Products_Stock()
    new_product = Product_NewProduct()

    def can_paste(self, source):
        return isinstance(source, Product)


    def get_document_types(self):
        return []



# Register fields
register_field('reference', String(is_indexed=True, is_stored=True))
register_field('stock_quantity', Integer(is_indexed=True, is_stored=True))
register_field('manufacturer', String(is_indexed=True))
register_field('supplier', String(is_indexed=True, multiple=True))
register_field('product_model', String(is_indexed=True, is_stored=True))
register_field('has_images', Boolean(is_indexed=True, is_stored=True))
register_field('has_reduction', Boolean(is_indexed=True))
register_field('not_buyable_by_groups', String(is_indexed=True, multiple=True))
register_field('ctime', DateTime(is_stored=True, is_indexed=True))
register_field('data', Unicode(is_indexed=True))
register_field('ht_price', Decimal(is_indexed=True, is_stored=True))
register_field('ttc_price', Decimal(is_indexed=True, is_stored=True))
# XXX xapian can't sort decimal
register_field('stored_price', Integer(is_indexed=False, is_stored=True))
register_field('stored_weight', Integer(is_indexed=False, is_stored=True))