2020-05-29 16:27:36 -04:00
|
|
|
from utilities.querysets import RestrictedQuerySet
|
2017-10-10 17:23:41 -04:00
|
|
|
|
|
|
|
|
2020-05-29 16:27:36 -04:00
|
|
|
class PrefixQuerySet(RestrictedQuerySet):
|
2017-10-10 17:23:41 -04:00
|
|
|
|
2020-08-05 15:55:47 -04:00
|
|
|
def annotate_tree(self):
|
2017-10-10 17:23:41 -04:00
|
|
|
"""
|
2020-08-05 15:55:47 -04:00
|
|
|
Annotate the number of parent and child prefixes for each Prefix. Raw SQL is needed for these subqueries
|
|
|
|
because we need to cast NULL VRF values to integers for comparison. (NULL != NULL).
|
2017-10-10 17:23:41 -04:00
|
|
|
"""
|
2020-08-05 15:55:47 -04:00
|
|
|
return self.extra(
|
|
|
|
select={
|
|
|
|
'parents': 'SELECT COUNT(U0."prefix") AS "c" '
|
|
|
|
'FROM "ipam_prefix" U0 '
|
|
|
|
'WHERE (U0."prefix" >> "ipam_prefix"."prefix" '
|
|
|
|
'AND COALESCE(U0."vrf_id", 0) = COALESCE("ipam_prefix"."vrf_id", 0))',
|
|
|
|
'children': 'SELECT COUNT(U1."prefix") AS "c" '
|
|
|
|
'FROM "ipam_prefix" U1 '
|
|
|
|
'WHERE (U1."prefix" << "ipam_prefix"."prefix" '
|
|
|
|
'AND COALESCE(U1."vrf_id", 0) = COALESCE("ipam_prefix"."vrf_id", 0))',
|
|
|
|
}
|
|
|
|
)
|