Package ajango :: Package core :: Module factory
[hide private]
[frames] | no frames]

Source Code for Module ajango.core.factory

  1  ########################################################################### 
  2  #                                                                         # 
  3  #  Copyright (C) 2016  Rafal Kobel <rafyco1@gmail.com>                    # 
  4  #                                                                         # 
  5  #  This program is free software: you can redistribute it and/or modify   # 
  6  #  it under the terms of the GNU General Public License as published by   # 
  7  #  the Free Software Foundation, either version 3 of the License, or      # 
  8  #  (at your option) any later version.                                    # 
  9  #                                                                         # 
 10  #  This program is distributed in the hope that it will be useful,        # 
 11  #  but WITHOUT ANY WARRANTY; without even the implied warranty of         # 
 12  #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the           # 
 13  #  GNU General Public License for more details.                           # 
 14  #                                                                         # 
 15  #  You should have received a copy of the GNU General Public License      # 
 16  #  along with this program.  If not, see <http://www.gnu.org/licenses/>.  # 
 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   
54 -class FactoryBase(object):
55 """ Klasa bazowa tworzaca fabryke. """ 56 __metaclass__ = ABCMeta
57 - def __init__(self, param=None):
58 self.class_name = '' 59 self.base_address = {} 60 self.object = param 61 self.str = None 62 self.init()
63 - def init(self):
64 """ 65 Metoda inicjalizujaca. 66 67 @param self: Obiekt fabryki 68 """ 69 pass
70 - def execution(self, fun):
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)
78 - def _get_base_address(self):
79 """ 80 Pobierz tabele z klasami inicjalizujacymi. 81 82 @param self: Obiekt fabryki 83 """ 84 return self.base_address
85 - def _create_object(self, key):
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)
105 - def get_class_factory(self, key):
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)
120 - def get_from_params(self):
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)
133 - def __add_modules(self, modules):
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]
147 - def __set_class_name(self, class_name):
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()
165 - def set_items(self, class_name, modules):
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 # fabyrka nie ma zdefiniowanych elementow dodatkowych 197 return 198 tab = settings.AJANGO_FACTORY[self.class_name] 199 self.__add_modules(tab) 200 except AttributeError: 201 # Brak definicji dla dodatkowych obiektow fabryki 202 return 203 except ImproperlyConfigured: 204 # Plik settings.py nie ma poprawnej konfiguracji 205 return
206