Package ajango :: Package generator
[hide private]
[frames] | no frames]

Source Code for Package ajango.generator

  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 generujacy kod tworzonej aplikacji. 
 21   
 22  Opis pliku szkieletowego 
 23  ======================== 
 24   
 25  Modul analizuje skrypt szkieletu i generuje na jego podstawie aplikacje zgodne 
 26  z frameworkiem Django. Przykladowy plik XML moze wygladac nastepujaco:: 
 27   
 28      <ajango> 
 29          <application name="myfirstapp"> 
 30              <view type="empty" id="nowa"> 
 31                  <echo> Ta strona nie jest jeszcze gotowa</echo> 
 32              </view> 
 33          </application> 
 34      </ajango> 
 35   
 36  Poprawnie sformatowany plik sklada sie noda glownego o nazwie B{AJANGO}. 
 37  Wewnatrz niego nalezy zdefinowac odpowiednie aplikacje (node B{APPLICATION}), 
 38  ktore skladaja sie z widokow (node B{VIEW}). Poszczegolne widoki definiowane 
 39  sa niezaleznie a ich struktura zalezna jest od typu. 
 40   
 41  Dostepne widoki 
 42  =============== 
 43   
 44  System pozwala na wygenerowanie nastepujacych 
 45  L{widokow<ajango.generator.views>}. 
 46   
 47      - L{widok pusty <ajango.generator.views.empty>} 
 48      - L{widok wprowadzania danych <ajango.generator.views.input>} 
 49      - L{widok wyswietlania danych <ajango.generator.views.display>} 
 50      - L{widok listy <ajango.generator.views.list>} 
 51      - L{widok edycji danych <ajango.generator.views.editable>} (niedostepne) 
 52      - L{widok raportu <ajango.generator.views.raport>} 
 53      - L{agregacja widoku <ajango.generator.views.container>} 
 54  """ 
 55   
 56  from __future__                       import print_function 
 57  from django.core.management.base      import CommandError 
 58  from ajango.generator.project_manager import ProjectManager 
 59  from ajango.generator.application     import Application 
 60  from ajango.generator.config_global   import ConfigGlobal 
 61  from xml.dom                          import minidom 
 62  import os.path 
 63   
64 -class AjangoGenerator(object):
65 """ Obiekt generujacy aplikacje na podstawie pliku szkieletowego. """
66 - def __init__(self, project_name, skeleton_file):
67 self.project = ProjectManager(project_name) 68 ConfigGlobal().set('project_manager', self.project) 69 self.options = None 70 self.apps = [] 71 self.main_app = None 72 self.render(skeleton_file)
73 - def set_options(self, options):
74 """ Ustawienie opcji dla obiektu. """ 75 self.options = options
76 - def render(self, skeleton_file):
77 """ Budowanie zestawu obiektow dla pliku XML. """ 78 if not os.path.isfile(skeleton_file): 79 raise CommandError( 80 "%r: File doesn't exist" % skeleton_file 81 ) 82 print("Render: "+ skeleton_file) 83 xmldoc_main = minidom.parse(skeleton_file) 84 xmldoc = xmldoc_main.childNodes[0] 85 if xmldoc.tagName.upper() != 'AJANGO': 86 raise CommandError("This Ajango skeleton is not Valid") 87 for elem in xmldoc.childNodes: 88 if isinstance(elem, minidom.Element): 89 # Renderowanie aplikacji 90 if elem.tagName.upper() == 'APPLICATION': 91 app = Application(elem) 92 for once in self.apps: 93 # Sprawdzanie czy aplikacje sie nie powtarzaja 94 if app.get_name() == once.get_name(): 95 raise CommandError("There are two or more " 96 "application named: %r" % 97 app.get_name()) 98 if app.getAttribute("main").lower() == "main": 99 # Sprawdzanie czy aplikacja nie jest glowna 100 if self.main_app != None: 101 raise CommandError("There are two or more " 102 "application signed as 'main'") 103 self.main_app = app 104 self.apps.append(app) 105 self.project.add_main_view_url(app) 106 else: 107 raise CommandError("Unknown tag name: %r " % elem.tagName) 108 if self.main_app == None: 109 # Jesli brak glownej aplikacji to pierwsza jest glowna. 110 self.main_app = self.apps[0] 111 self.project.add_main_url(self.main_app)
112 - def make_apps(self):
113 """ Stworzenie wszystkich aplikacji. """ 114 for app in self.apps: 115 if self.options != None: 116 app.set_options(self.options) 117 app.make_new() 118 print("Building app: " + app.get_name()) 119 app.execution() 120 project = ConfigGlobal().get('project_manager') 121 project.execute()
122