Actually, just updated to the 0.8 branch and things are improved.
Still feels like there should be a faster way, but it's about 2x
faster.
On Nov 26, 1:41 pm, Jack Shedd <[EMAIL PROTECTED]> wrote:
> Notes on how I pulled this off and questions on performance.
>
> First, to make my template work, I devised a dirty template tag called
> group_by that lives in my custom product module. The code is
> relatively boring:
> -----------------------------------------------------
> import os, logging
> from django import template
> from django.template import Library, Node, Variable
> from hss.apps.hssproduct.models import *
> from satchmo.utils import cross_list
>
> log = logging.getLogger('hssproduct.models')
> register = template.Library()
>
> class ProductGroupsNode(Node):
> def __init__(self, product, groups, varname):
> self.product = Variable(product)
> self.groups = groups
> self.varname = varname
> def render(self, context):
> self.product = self.product.resolve(context)
> p_types = self.product.get_subtypes()
> groups = [group.strip() for group in self.groups.split(',')]
> if 'ConfigurableProduct' in p_types:
> cp = self.product.configurableproduct
> og = [group for group in groups if
> cp.option_group.filter
> (name=group)]
> op = [cp.option_group.get(name=option) for option in
> og]
> vr = cp.get_valid_options()
> # build a list containing all possible combinations
> based on the
> groups provided
> masterlist = []
> sublist = []
> for group in op:
> for value in group.option_set.all():
> sublist.append(value)
> masterlist.append(sublist)
> sublist = []
> opt = cross_list(masterlist)
> masterlist = []
> for group in opt:
> ls = {}
> ls['products'] = []
> for option in group:
> ls[option.option_group.name] =
> option.name
> for variant in
> cp.get_variations_for_options(group):
> options = variant.options
> varopt = {}
> varopt['product'] = variant
> for option in variant.options.all():
> if not option.option_group in
> op:
>
> varopt[option.option_group.name] = option.value
> varopt['sort_order']
> = option.sort_order
> ls['products'].append(varopt)
> if len(ls['products']):
> masterlist.append(ls)
> else:
> raise template.TemplateSyntaxError, 'This is not a
> configurable
> product.'
> context[self.varname] = masterlist
> return ''
>
> #group_options for product by "Gender, Colors" as product_options
> @register.tag
> def group_options(parser, token):
> try:
> tag_name, for_string, product, by_string, groupings,
> as_string,
> varname = token.split_contents()
> except:
> raise template.TemplateSyntaxError, 'get_product_photos takes
> exactly four arguments'
> return ProductGroupsNode(product, groupings[1:-1], varname)
> -----------------------------------------------------
>
> Which is handy, and lets me do this in my template:
> {% group_options for product by "Gender, Colors" as product_options %}
>
> Ultra handy, and made my life remarkably easy.
>
> Problem is, with this new code, I'm having to hit the database WAY too
> much. I'd assume that option and options groups were already being
> retrieved for a product, and would therefor be cached, but this does
> not seem to be the case.
>
> A bare bones configurableproduct template requires something akin to
> 200 queries, and my code is doubling that without blinking.
>
> Any insights into how I can do this faster?
>
> Thanks.
>
> On Nov 9, 3:48 pm, Jack Shedd <[EMAIL PROTECTED]> wrote:
>
> > Here's a screen grab of the current template. Hopefully this clarifies
> > what I need to accomplish.
>
> >http://jackshedd.com/examples/hssproductpage.jpg
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Satchmo users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/satchmo-users?hl=en
-~----------~----~----~----~------~----~------~--~---