Completed
Push — master ( 21b94f...0c3366 )
by Asif
01:28
created

CrudBuilderRegistry   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 68
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
wmc 13
c 1
b 0
f 1
dl 0
loc 68
rs 10
1
from django.db import models
2
3
from crudbuilder.exceptions import(
4
    NotModelException,
5
    AlreadyRegistered,
6
    NotRegistered
7
)
8
9
__all__ = ('CrudBuilderRegistry', 'register', 'registry')
10
11
12
class CrudBuilderRegistry(dict):
13
    """Dictionary like object representing a collection of objects."""
14
15
    @classmethod
16
    def extract_args(cls, *args):
17
        """
18
        Takes any arguments like a model and crud, or just one of
19
        those, in any order, and return a model and crud.
20
        """
21
        model = None
22
        crudbuilder = None
23
24
        for arg in args:
25
            if issubclass(arg, models.Model):
26
                model = arg
27
            else:
28
                crudbuilder = arg
29
30
        return [model, crudbuilder]
31
32
    def register(self, *args, **kwargs):
33
        """
34
        Register a crud.
35
36
        Two unordered arguments are accepted, at least one should be passed:
37
        - a model,
38
        - a crudbuilder class
39
        """
40
41
        assert len(args) <= 2, 'register takes at most 2 args'
42
        assert len(args) > 0, 'register takes at least 1 arg'
43
44
        model, crudbuilder = self.__class__.extract_args(*args)
45
46
        if not issubclass(model, models.Model):
47
            msg = "First argument should be Django Model"
48
            raise NotModelException(msg)
49
50
        key = self._model_key(model)
51
52
        if key in self:
53
            msg = "Key '{key}' has already been registered.".format(
54
                key=key
55
                )
56
            raise AlreadyRegistered(msg)
57
58
        self.__setitem__(key, crudbuilder)
59
        return crudbuilder
60
61
    def _model_key(self, model):
62
        app_label = model._meta.app_label
63
        model_name = model.__name__.lower()
64
        return '{}-{}'.format(app_label, model_name)
65
66
    def unregister(self, model):
67
        key = self._model_key(model)
68
        if key in self:
69
            self.__delitem__(key)
70
71
    def __getitem__(self, name):
72
        """
73
        Return the CrudBuilder class registered for this name. If none is
74
        registered, raise NotRegistered.
75
        """
76
        try:
77
            return super(CrudBuilderRegistry, self).__getitem__(name)
78
        except KeyError:
79
            raise NotRegistered(name, self)
80
81
82
registry = CrudBuilderRegistry()
83
84
85
def register(*args, **kwargs):
86
    """
87
    Proxy method :py:meth:`CrudBuilderRegistry.register` of the
88
    :py:data:`registry` module level instance.
89
    """
90
    return registry.register(*args, **kwargs)
91