managers.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from netaddr import IPNetwork
  2. from django import VERSION
  3. from django.db import models, connection
  4. from django.db.backends.postgresql_psycopg2.base import DatabaseWrapper
  5. from django.db.models.fields import DateTimeField, Field
  6. from django.db.models import sql, query, Lookup
  7. from django.db.models.query_utils import QueryWrapper
  8. from django.utils import tree
  9. import datetime
  10. NET_OPERATORS = DatabaseWrapper.operators.copy()
  11. for operator in ['contains', 'startswith', 'endswith']:
  12. NET_OPERATORS[operator] = 'ILIKE %s'
  13. NET_OPERATORS['i%s' % operator] = 'ILIKE %s'
  14. NET_OPERATORS['iexact'] = NET_OPERATORS['exact']
  15. NET_OPERATORS['regex'] = NET_OPERATORS['iregex']
  16. NET_TEXT_OPERATORS = ['ILIKE %s', '~* %s']
  17. class NetContainsOrEqual(Lookup):
  18. lookup_name = 'net_contains_or_equals'
  19. def as_sql(self, qn, connection):
  20. lhs, lhs_params = self.process_lhs(qn, connection)
  21. rhs, rhs_params = self.process_rhs(qn, connection)
  22. params = lhs_params + rhs_params
  23. return "%s >>= %s" % (lhs, rhs), params
  24. Field.register_lookup(NetContainsOrEqual)
  25. class NetContains(Lookup):
  26. lookup_name = 'net_contains'
  27. def as_sql(self, qn, connection):
  28. lhs, lhs_params = self.process_lhs(qn, connection)
  29. rhs, rhs_params = self.process_rhs(qn, connection)
  30. params = lhs_params + rhs_params
  31. return "%s >> %s" % (lhs, rhs), params
  32. Field.register_lookup(NetContains)
  33. class NetContained(Lookup):
  34. lookup_name = 'net_contained'
  35. def as_sql(self, qn, connection):
  36. lhs, lhs_params = self.process_lhs(qn, connection)
  37. rhs, rhs_params = self.process_rhs(qn, connection)
  38. params = lhs_params + rhs_params
  39. return "%s << %s" % (lhs, rhs), params
  40. Field.register_lookup(NetContained)
  41. class NetContainedOrEqual(Lookup):
  42. lookup_name = 'net_contained_or_equal'
  43. def as_sql(self, qn, connection):
  44. lhs, lhs_params = self.process_lhs(qn, connection)
  45. rhs, rhs_params = self.process_rhs(qn, connection)
  46. params = lhs_params + rhs_params
  47. return "%s <<= %s" % (lhs, rhs), params
  48. Field.register_lookup(NetContainedOrEqual)
  49. class NetManager(models.Manager):
  50. use_for_related_fields = True
  51. def get_query_set(self):
  52. return super(NetManager, self).get_queryset()
  53. def get_queryset(self):
  54. return super(NetManager, self).get_queryset()