Completed
Pull Request — master (#27)
by
unknown
01:14
created

CrudBuilderRegistry._class_key()   A

Complexity

Conditions 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 4
rs 10
cc 1
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._class_key(crudbuilder)
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 _class_key(self, crudbuilder):
62
        app_label = crudbuilder.model._meta.app_label
63
        crud_class_name = crudbuilder.get_class_name()
64
        return '{}-{}'.format(app_label, crud_class_name)
65
66
    def unregister(self, crudbuilder):
67
        key = self._class_key(crudbuilder)
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