1. Kai Diefenbach
  2. django-lfs


django-lfs / lfs / criteria / base.py

# django imports
from django.contrib.contenttypes.models import ContentType

# lfs imports
from lfs.core.utils import import_symbol

class Criteria(object):
    Base class for objects which have criteria.
    def is_valid(self, request, product=None):
        Returns ``True`` if the object is valid, otherwise ``False``.
        for criterion in self.get_criteria():
            criterion.request = request
            criterion.product = product
            if criterion.is_valid() == False:
                return False
        return True

    def get_criteria(self):
        Returns all criteria of the object.
        content_type = ContentType.objects.get_for_model(self)

        criteria = []
        from lfs.criteria.models import Criterion
        for criterion in Criterion.objects.filter(content_id=self.id, content_type=content_type):
        return criteria

    def save_criteria(self, request):
        Saves all passed criteria (via request.POST) to the object.
        # First we delete all existing criteria objects for the given object.
        for co in self.get_criteria():

        # Then we add all passed criteria to the object.
        for key, model in request.POST.items():
            if key.startswith("type"):
                    id = key.split("-")[1]
                except KeyError:

                # Get the values for the criterion
                operator = request.POST.get("operator-%s" % id)
                position = request.POST.get("position-%s" % id)

                criterion_class = import_symbol(model)
                criterion = criterion_class.objects.create(content=self, operator=operator, position=position)

                if criterion.get_value_type() == criterion.MULTIPLE_SELECT:
                    value = request.POST.getlist("value-%s" % id)
                    value = request.POST.get("value-%s" % id)