@@ -37,15 +37,26 @@ def get_lookup(self, path, operator, value):
37
37
def get_nested_options (self ):
38
38
"""Get keys of all nested objects to show autocomplete"""
39
39
keys = (
40
- self .model .objects .annotate (
41
- keys = models .Func (models .F (self .name ), function = "jsonb_object_keys" )
40
+ # self.model.objects.annotate(
41
+ # keys=models.Func(models.F("user"), function="jsonb_object_keys"),
42
+ # values=models.Func(models.Expression(), function="jsonb_each"),
43
+ # )
44
+ # .values("keys")
45
+ # .distinct("keys")
46
+ # .order_by("keys")
47
+ # .values_list("keys", flat=True)
48
+ self .model .objects .raw (
49
+ 'SELECT event_uuid, key, context->key AS value FROM authentik_events_event, jsonb_object_keys("context") as key;'
42
50
)
43
- .values ("keys" )
44
- .distinct ("keys" )
45
- .order_by ("keys" )
46
- .values_list ("keys" , flat = True )
47
51
)
48
- return list (keys )
52
+ fields = {}
53
+ for evt in keys :
54
+ fields [evt .key ] = {
55
+ "type" : "str" ,
56
+ "nullable" : False ,
57
+ "options" : evt .value ,
58
+ }
59
+ return fields
49
60
50
61
def relation (self ) -> str :
51
62
return f"{ self .model ._meta .app_label } .{ self .model ._meta .model_name } _{ self .name } "
@@ -96,14 +107,10 @@ def serialize(self, schema):
96
107
if not isinstance (field , JSONSearchField ):
97
108
continue
98
109
nested_model = OrderedDict ()
99
- for nested_field in field .get_nested_options ():
110
+ for nested_field_name , nested_field in field .get_nested_options (). items ():
100
111
# Can't generate a temporary StrField instance here as that requires a
101
112
# model, and we're only pretending there's a model
102
- nested_model [nested_field ] = {
103
- "type" : "str" ,
104
- "nullable" : True ,
105
- "options" : [],
106
- }
113
+ nested_model [nested_field_name ] = nested_field
107
114
serialization ["models" ][field .relation ()] = nested_model
108
115
return serialization
109
116
0 commit comments