WIP
This commit is contained in:
@ -389,3 +389,43 @@ def old_search(request):
|
|||||||
queryset=Recipe.objects.filter(space=request.user.userpreference.space).all().order_by('name'),
|
queryset=Recipe.objects.filter(space=request.user.userpreference.space).all().order_by('name'),
|
||||||
space=request.space)
|
space=request.space)
|
||||||
return f.qs
|
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)
|
||||||
|
@ -1090,3 +1090,99 @@ class Automation(ExportModelOperationsMixin('automations'), models.Model, Permis
|
|||||||
|
|
||||||
objects = ScopedManager(space='space')
|
objects = ScopedManager(space='space')
|
||||||
space = models.ForeignKey(Space, on_delete=models.CASCADE)
|
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')
|
||||||
|
]
|
||||||
|
Reference in New Issue
Block a user