1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 """
20 Modul fabryki.
21
22 Fabryka umozliwia wczytanie dowolnych obiektow danego typu za pomoca klucza.
23 Kazda z fabryk dostepnych w bibliotece powinna miec zadeklarowany zestaw
24 obiektow dostepnych dla uzytkownika.
25
26 Rozbudowa Fabryki
27 =================
28
29 W celu rozbudowy wybranej fabryki o dodatkowe opcje nalezy w pliku
30 I{settings.py} odpowiednim dla danego projektu dodac opcje C{AJANGO_FACTORY}.
31 Opcja ta ma przyjmowac slownik w ktorym kluczami sa opisy obiektow zdefiniowane
32 w przez funkcje L{set_items() <ajango.core.factory.FactoryBase.set_items>}.
33 Wartosci stanowia slowniki z opisem obiektow ktore moga byc pobierane przez
34 fabryke.
35
36 W ramach tych obiektow nalezy zadeklarowac jako klucz nazwe po ktorej fabryka
37 wybierze obiekt, a jako wartosc nazwe modulu w ktorym wystepuje dany obiekt.
38
39 Przyklad dodania wywolania obiektu do fabryki o nazwie Site::
40
41 AJANGO_FACTORY = {
42 'Site' : {'panel' : 'example.sites.panel'},
43 }
44 """
45
46 import importlib
47 from django.core.management.base import CommandError
48 from django.core.exceptions import ImproperlyConfigured
49 from django.utils.termcolors import make_style
50 from django.core.management.color import supports_color
51 from django.conf import settings
52 from abc import ABCMeta
53
55 """ Klasa bazowa tworzaca fabryke. """
56 __metaclass__ = ABCMeta
58 self.class_name = ''
59 self.base_address = {}
60 self.object = param
61 self.str = None
62 self.init()
64 """
65 Metoda inicjalizujaca.
66
67 @param self: Obiekt fabryki
68 """
69 pass
71 """
72 Wykonanie zadan obiektu.
73
74 @param self: Obiekt fabryki
75 @param fun: Funkcja inicjalizujaca obiekt utworzony przez fabryke
76 """
77 return fun(self.object)
79 """
80 Pobierz tabele z klasami inicjalizujacymi.
81
82 @param self: Obiekt fabryki
83 """
84 return self.base_address
86 """
87 Tworzenie obiektu.
88
89 @param self: Obiekt fabryki
90 @param key: Klucz obiektu
91 @type key: str
92 """
93 obj = "unKnown"
94 try:
95 base_address = self._get_base_address()
96 obj = base_address[key]
97 module = importlib.import_module(obj)
98 fun = getattr(module, self.class_name)
99 return self.execution(fun)
100 except KeyError:
101 raise CommandError("Doesn't know %s type: %r" %
102 (self.class_name, key))
103 except ImportError:
104 raise CommandError("Module %r doesn't exist" % obj)
106 """
107 Pobranie obiektu na podstawie klucza.
108
109 @param self: Obiekt fabryki
110 @param key: Klucz obiektu
111 @type key: str
112 """
113 if supports_color():
114 blue = make_style(fg='cyan')
115 else:
116 blue = lambda text: text
117 print("Create '" + blue(key) + "' from '" +
118 blue(type(self).__name__) + "'")
119 return self._create_object(key)
121 """
122 Pobranie obiektu na podstawie danych fabryki.
123
124 @param self: Obiekt fabryki
125 """
126 if supports_color():
127 blue = make_style(fg='cyan')
128 else:
129 blue = lambda text: text
130 print("Create '" + blue(self.str) + "' from '" +
131 blue(type(self).__name__) + "'")
132 return self._create_object(self.str)
134 """
135 Dodanie nowego modulu w fabryce.
136
137 @param self: Obiekt fabryki
138
139 @param modules: Zestaw obiektow dostepnych w fabryce
140 @type modules: Slownik w ktorym B{klucz} jest kluczem dla fabryki,
141 a B{wartosc} jest adresem modulu w ktorym znajduje sie obiekt.
142 """
143 for elem in modules.keys():
144 if elem in self.base_address:
145 raise CommandError("Cannot rewrite %r key" % elem)
146 self.base_address[elem] = modules[elem]
148 """
149 Ustawienie nazwy klasy obiektu dostepnego dla fabryki w module.
150
151 Metoda wprowadza nazwe obiektu i probuje wczytac dane poczatkowe z
152 pliku settingsow.
153
154 @param self: Obiekt fabryki
155 self.class_name = class_name
156
157 @param class_name: Nazwa klasy znajdujacej sie w pliku modulu
158 @type class_name: str
159 """
160 if self.class_name != "":
161 raise CommandError("Cannot update class_name for factory [%r]" %
162 class_name)
163 self.class_name = class_name
164 self.__read_items_from_settings()
166 """
167 Ustwienie opcji fabryki.
168
169 Metoda ta powinna byc wywolana w ramach metody
170 L{init(self) <ajango.core.factory.FactoryBase.init>} w klasie
171 fabryki. Moze ona byc wywolana jednokrotnie. Ponowne wywolanie moze
172 spowodowac nieokreslone bledy.
173
174 @param self: Obiekt fabryki
175
176 @param class_name: Nazwa klasy znajdujacej sie w pliku modulu
177 @type class_name: str
178
179 @param modules: Zestaw obiektow dostepnych w fabryce
180 @type modules: Slownik w ktorym B{klucz} jest kluczem dla fabryki,
181 a B{wartosc} jest adresem modulu w ktorym znajduje sie obiekt.
182 """
183 self.__set_class_name(class_name)
184 self.__add_modules(modules)
186 """
187 Wczytanie obiektow do fabryki z settingsow.
188
189 Wiecej informacji na temat dodawania obiektow do fabryki w opisie
190 modulu L{Factory <ajango.core.factory>}
191
192 @param self: Obiekt fabryki
193 """
194 try:
195 if not self.class_name in settings.AJANGO_FACTORY:
196
197 return
198 tab = settings.AJANGO_FACTORY[self.class_name]
199 self.__add_modules(tab)
200 except AttributeError:
201
202 return
203 except ImproperlyConfigured:
204
205 return
206