3232
3333from .managers import LiveSegmentManager , SegmentManager
3434
35+ ModelT = typing .TypeVar ("ModelT" , bound = models .Model )
36+
3537logger = logging .getLogger (__name__ )
3638
3739
40+ class ConfiguredOrderManager (SoftDeleteExportableManager , models .Manager [ModelT ]):
41+ def get_queryset (
42+ self ,
43+ ) -> models .QuerySet [ModelT ]:
44+ # Effectively `<ModelT>.Meta.ordering = ("id",) if ... else ()`,
45+ # but avoid the weirdness of a setting-dependant migration
46+ # and having to reload everything in tests
47+ qs : models .QuerySet [ModelT ]
48+ if settings .SEGMENT_RULES_CONDITIONS_EXPLICIT_ORDERING_ENABLED :
49+ qs = super ().get_queryset ().order_by ("id" )
50+ else :
51+ qs = super ().get_queryset ()
52+ return qs
53+
54+
3855class Segment (
3956 LifecycleModelMixin , # type: ignore[misc]
4057 SoftDeleteExportableModel ,
@@ -168,7 +185,8 @@ def copy_rules_and_conditions_from(self, source_segment: "Segment") -> None:
168185 cloned_rule .pk = None
169186 cloned_rule .uuid = uuid .uuid4 ()
170187 cloned_rule .segment = self if rule .segment else None
171- cloned_rule .rule = rule_to_cloned_rule_map .get (rule .rule )
188+ if rule .rule in rule_to_cloned_rule_map :
189+ cloned_rule .rule = rule_to_cloned_rule_map [rule .rule ]
172190 cloned_rule .save ()
173191 rule_to_cloned_rule_map [rule ] = cloned_rule
174192
@@ -217,6 +235,10 @@ class SegmentRule(
217235
218236 history_record_class_path = "segments.models.HistoricalSegmentRule"
219237
238+ objects : typing .ClassVar [ConfiguredOrderManager ["SegmentRule" ]] = (
239+ ConfiguredOrderManager ()
240+ )
241+
220242 def __str__ (self ): # type: ignore[no-untyped-def]
221243 return "%s rule for %s" % (
222244 self .type ,
@@ -241,21 +263,6 @@ def get_skip_create_audit_log(self) -> bool:
241263 return True
242264
243265
244- class ConditionManager (SoftDeleteExportableManager ):
245- def get_queryset (
246- self ,
247- ) -> models .QuerySet ["Condition" ]:
248- # Effectively `Condition.Meta.ordering = ("id",) if ... else ()`,
249- # but avoid the weirdness of a setting-dependant migration
250- # and having to reload everything in tests
251- qs : models .QuerySet ["Condition" ]
252- if settings .SEGMENT_RULES_CONDITIONS_EXPLICIT_ORDERING_ENABLED :
253- qs = super ().get_queryset ().order_by ("id" )
254- else :
255- qs = super ().get_queryset ()
256- return qs
257-
258-
259266class Condition (
260267 SoftDeleteExportableModel ,
261268 abstract_base_auditable_model_factory (["uuid" ]), # type: ignore[misc]
@@ -299,7 +306,9 @@ class Condition(
299306 created_at = models .DateTimeField (null = True , auto_now_add = True )
300307 updated_at = models .DateTimeField (null = True , auto_now = True )
301308
302- objects : typing .ClassVar [ConditionManager ] = ConditionManager ()
309+ objects : typing .ClassVar [ConfiguredOrderManager ["Condition" ]] = (
310+ ConfiguredOrderManager ()
311+ )
303312
304313 def __str__ (self ) -> str :
305314 return "Condition for %s: %s %s %s" % (
0 commit comments