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'),
|
||||
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)
|
||||
|
@ -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')
|
||||
]
|
||||
|
Reference in New Issue
Block a user