lookups.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. from django.db.models import Lookup
  2. from django.db.models.lookups import BuiltinLookup
  3. class NetFieldDecoratorMixin(object):
  4. def process_lhs(self, qn, connection, lhs=None):
  5. lhs = lhs or self.lhs
  6. lhs_string, lhs_params = qn.compile(lhs)
  7. lhs_string = 'TEXT(%s)' % lhs_string
  8. return lhs_string, lhs_params
  9. class EndsWith(NetFieldDecoratorMixin, BuiltinLookup):
  10. lookup_name = 'endswith'
  11. class IEndsWith(NetFieldDecoratorMixin, BuiltinLookup):
  12. lookup_name = 'iendswith'
  13. class StartsWith(NetFieldDecoratorMixin, BuiltinLookup):
  14. lookup_name = 'startswith'
  15. class IStartsWith(NetFieldDecoratorMixin, BuiltinLookup):
  16. lookup_name = 'istartswith'
  17. class Regex(NetFieldDecoratorMixin, BuiltinLookup):
  18. lookup_name = 'regex'
  19. class IRegex(NetFieldDecoratorMixin, BuiltinLookup):
  20. lookup_name = 'iregex'
  21. class NetContainsOrEquals(Lookup):
  22. lookup_name = 'net_contains_or_equals'
  23. def as_sql(self, qn, connection):
  24. lhs, lhs_params = self.process_lhs(qn, connection)
  25. rhs, rhs_params = self.process_rhs(qn, connection)
  26. params = lhs_params + rhs_params
  27. return '%s >>= %s' % (lhs, rhs), params
  28. class NetContains(Lookup):
  29. lookup_name = 'net_contains'
  30. def as_sql(self, qn, connection):
  31. lhs, lhs_params = self.process_lhs(qn, connection)
  32. rhs, rhs_params = self.process_rhs(qn, connection)
  33. params = lhs_params + rhs_params
  34. return '%s >> %s' % (lhs, rhs), params
  35. class NetContained(Lookup):
  36. lookup_name = 'net_contained'
  37. def as_sql(self, qn, connection):
  38. lhs, lhs_params = self.process_lhs(qn, connection)
  39. rhs, rhs_params = self.process_rhs(qn, connection)
  40. params = lhs_params + rhs_params
  41. return '%s << %s' % (lhs, rhs), params
  42. class NetContainedOrEqual(Lookup):
  43. lookup_name = 'net_contained_or_equal'
  44. def as_sql(self, qn, connection):
  45. lhs, lhs_params = self.process_lhs(qn, connection)
  46. rhs, rhs_params = self.process_rhs(qn, connection)
  47. params = lhs_params + rhs_params
  48. return '%s <<= %s' % (lhs, rhs), params
  49. class NetHost(Lookup):
  50. lookup_name = 'net_host'
  51. def as_sql(self, qn, connection):
  52. lhs, lhs_params = self.process_lhs(qn, connection)
  53. rhs, rhs_params = self.process_rhs(qn, connection)
  54. # Query parameters are automatically converted to IPNetwork objects, which are then turned to strings. We need
  55. # to omit the mask portion of the object's string representation to match PostgreSQL's HOST() function.
  56. if rhs_params:
  57. rhs_params[0] = rhs_params[0].split('/')[0]
  58. params = lhs_params + rhs_params
  59. return 'HOST(%s) = %s' % (lhs, rhs), params