From 25ccea90e06220215555fb2e35f4b5e369bcb6bf Mon Sep 17 00:00:00 2001 From: smilerz Date: Mon, 10 Jan 2022 15:05:56 -0600 Subject: [PATCH] WIP --- cookbook/helper/recipe_search.py | 40 +++++++++++++ cookbook/models.py | 96 ++++++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+) diff --git a/cookbook/helper/recipe_search.py b/cookbook/helper/recipe_search.py index 9ad2b81f5..748bc338d 100644 --- a/cookbook/helper/recipe_search.py +++ b/cookbook/helper/recipe_search.py @@ -389,3 +389,43 @@ def old_search(request): queryset=Recipe.objects.filter(space=request.user.userpreference.space).all().order_by('name'), space=request.space) return f.qs + + +# from django.db.models import fields +# from cookbook.models import Food, Recipe, Keyword, RecipeBook, Unit +# many_to_many = {} +# one_to_many = {} +# many_to_one = {} +# char = {} +# boolean = {} +# number = {} +# other = {} +# image = {} +# date = {} +# for model in [Food, Recipe, Keyword, RecipeBook, Unit]: +# print(name:=model.__name__, ":") +# for x in model._meta.get_fields(): + +# if x.name in ['space', 'id']: +# continue +# elif x.many_to_many: +# many_to_many[name]=[*many_to_many.get(name, []), x.name] +# elif x.one_to_many: +# one_to_many[name] = [*one_to_many.get(name, []), x.name] +# elif x.many_to_one: +# many_to_one[name] = [*many_to_one.get(name, []), x.name] +# elif isinstance(x, fields.CharField): +# char[name] = [*char.get(name, []), x.name] +# elif isinstance(x, fields.BooleanField): +# boolean[name] = [*boolean.get(name, []), x.name] +# elif isinstance(x, fields.IntegerField) or isinstance(x, fields.DecimalField): +# number[name] = [*number.get(name, []), x.name] +# elif isinstance(x, fields.DateField): +# date[name] = [*date.get(name, []), x.name] +# elif isinstance(x, fields.files.ImageField): +# image[name] = [*image.get(name, []), x.name] +# else: +# other[name] = [*other.get(name, []), x.name] +# if x.hidden: +# hidden[name] = [*hidden.get(name, []), x.name] +# print('---', x.name, ' - ', x.db_type, x.remote_name) diff --git a/cookbook/models.py b/cookbook/models.py index cfe4ab814..7187db335 100644 --- a/cookbook/models.py +++ b/cookbook/models.py @@ -1090,3 +1090,99 @@ class Automation(ExportModelOperationsMixin('automations'), models.Model, Permis objects = ScopedManager(space='space') space = models.ForeignKey(Space, on_delete=models.CASCADE) + + +class ModelFilter(models.Model): + EQUAL = 'EQUAL' + NOT_EQUAL = 'NOT_EQUAL' + LESS_THAN = 'LESS_THAN' + GREATER_THAN = 'GREATER_THAN' + LESS_THAN_EQ = 'LESS_THAN_EQ' + GREATER_THAN_EQ = 'GREATER_THAN_EQ' + CONTAINS = 'CONTAINS' + NOT_CONTAINS = 'NOT_CONTAINS' + STARTS_WITH = 'STARTS_WITH' + NOT_STARTS_WITH = 'NOT_STARTS_WITH' + ENDS_WITH = 'ENDS_WITH' + NOT_ENDS_WITH = 'NOT_ENDS_WITH' + INCLUDES = 'INCLUDES' + NOT_INCLUDES = 'NOT_INCLUDES' + COUNT_EQ = 'COUNT_EQ' + COUNT_NEQ = 'COUNT_NEQ' + COUNT_LT = 'COUNT_LT' + COUNT_GT = 'COUNT_GT' + + OPERATION = ( + (EQUAL, _('is')), + (NOT_EQUAL, _('is not')), + (LESS_THAN, _('less than')), + (GREATER_THAN, _('greater than')), + (LESS_THAN_EQ, _('less or equal')), + (GREATER_THAN_EQ, _('greater or equal')), + (CONTAINS, _('contains')), + (NOT_CONTAINS, _('does not contain')), + (STARTS_WITH, _('starts with')), + (NOT_STARTS_WITH, _('does not start with')), + (INCLUDES, _('includes')), + (NOT_INCLUDES, _('does not include')), + (COUNT_EQ, _('count equals')), + (COUNT_NEQ, _('count does not equal')), + (COUNT_LT, _('count less than')), + (COUNT_GT, _('count greater than')), + ) + + STRING = 'STRING' + NUMBER = 'NUMBER' + BOOLEAN = 'BOOLEAN' + DATE = 'DATE' + + FIELD_TYPE = ( + (STRING, _('string')), + (NUMBER, _('number')), + (BOOLEAN, _('boolean')), + (DATE, _('date')), + ) + + field = models.CharField(max_length=32) + field_type = models.CharField(max_length=32, choices=(FIELD_TYPE)) + operation = models.CharField(max_length=32, choices=(OPERATION)) + target_value = models.CharField(max_length=128) + sort = models.BooleanField(default=False,) + ascending = models.BooleanField(default=True,) + + def __str__(self): + return f"{self.field} - {self.operation} - {self.target_value}" + + +class SavedFilter(models.Model, PermissionModelMixin): + FOOD = 'FOOD' + UNIT = 'UNIT' + KEYWORD = "KEYWORD" + RECIPE = 'RECIPE' + BOOK = 'BOOK' + + MODELS = ( + (FOOD, _('Food')), + (UNIT, _('Unit')), + (KEYWORD, _('Keyword')), + (RECIPE, _('Recipe')), + (BOOK, _('Book')) + ) + + name = models.CharField(max_length=128, ) + type = models.CharField(max_length=24, choices=(MODELS)), + description = models.CharField(max_length=256, blank=True) + shared = models.ManyToManyField(User, blank=True, related_name='filter_share') + created_by = models.ForeignKey(User, on_delete=models.CASCADE) + filter = models.ForeignKey(ModelFilter, on_delete=models.PROTECT, null=True) + + objects = ScopedManager(space='space') + space = models.ForeignKey(Space, on_delete=models.CASCADE) + + def __str__(self): + return f"{self.type}: {self.name}" + + class Meta: + constraints = [ + models.UniqueConstraint(fields=['space', 'name'], name='sf_unique_name_per_space') + ]