/usr/lib/python2.7/dist-packages/maasserver/utils/orm.py is in python-django-maas 1.5+bzr2252-0ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | # Copyright 2012 Canonical Ltd. This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).
"""ORM-related utilities."""
from __future__ import (
absolute_import,
print_function,
unicode_literals,
)
str = None
__metaclass__ = type
__all__ = [
'macs_contain',
'macs_do_not_contain',
'get_exception_class',
'get_first',
'get_one',
]
from itertools import islice
from django.core.exceptions import MultipleObjectsReturned
def get_exception_class(items):
"""Return exception class to raise.
If `items` looks like a Django ORM result set, returns the
`MultipleObjectsReturned` class as defined in that model. Otherwise,
returns the generic class.
"""
model = getattr(items, 'model', None)
return getattr(model, 'MultipleObjectsReturned', MultipleObjectsReturned)
def get_one(items):
"""Assume there's at most one item in `items`, and return it (or None).
If `items` contains more than one item, raise an error. If `items` looks
like a Django ORM result set, the error will be of the same model-specific
Django `MultipleObjectsReturned` type that `items.get()` would raise.
Otherwise, a plain Django :class:`MultipleObjectsReturned` error.
:param items: Any sequence.
:return: The one item in that sequence, or None if it was empty.
"""
# The only numbers we care about are zero, one, and "many." Fetch
# just enough items to distinguish between these. Use islice so as
# to support both sequences and iterators.
retrieved_items = tuple(islice(items, 0, 2))
length = len(retrieved_items)
if length == 0:
return None
elif length == 1:
return retrieved_items[0]
else:
raise get_exception_class(items)("Got more than one item.")
def get_first(items):
"""Get the first of `items`, or None."""
first_item = tuple(islice(items, 0, 1))
if len(first_item) == 0:
return None
else:
return first_item[0]
def macs_contain(key, macs):
"""Get the "Django ORM predicate: 'key' contains all the given macs.
This method returns a tuple of the where clause (as a string) and the
parameters (as a list of strings) used to format the where clause.
This is typically used with Django's QuerySet's where() method::
>>> from maasserver.models.node import Node
>>> where, params = macs_contain('router', ["list", "of", "macs"])
>>> all_nodes = Node.objects.all()
>>> filtered_nodes = all_nodes.extra(where=[where], params=params)
"""
where_clause = (
"%s @> ARRAY[" % key +
', '.join(["%s"] * len(macs)) +
"]::macaddr[]")
return where_clause, macs
def macs_do_not_contain(key, macs):
"""Get the Django ORM predicate: 'key' doesn't contain any macs.
This method returns a tuple of the where clause (as a string) and the
parameters (as a list of strings) used to format the where clause.
This is typically used with Django's QuerySet's where() method::
>>> from maasserver.models.node import Node
>>> where, params = macs_do_not_contain(
... 'routers', ["list", "of", "macs"])
>>> all_nodes = Node.objects.all()
>>> filtered_nodes = all_nodes.extra(where=[where], params=params)
"""
contains_any = " OR ".join([
"%s " % key + "@> ARRAY[%s]::macaddr[]"] * len(macs))
where_clause = "((%s IS NULL) OR NOT (%s))" % (key, contains_any)
return where_clause, macs
|