Changeset 4202
- Timestamp:
- 03/06/08 19:02:57 (5 months ago)
- Files:
-
- branches/1.0/turbogears/toolbox/admi18n/catalog.py (modified) (7 diffs)
- branches/1.0/turbogears/toolbox/admi18n/__init__.py (modified) (11 diffs)
- branches/1.0/turbogears/toolbox/base.py (modified) (5 diffs)
- branches/1.0/turbogears/toolbox/catwalk/browse.py (modified) (5 diffs)
- branches/1.0/turbogears/toolbox/catwalk/__init__.py (modified) (18 diffs)
- branches/1.0/turbogears/toolbox/designer/__init__.py (modified) (7 diffs)
- branches/1.1/turbogears/toolbox/admi18n/catalog.py (modified) (7 diffs)
- branches/1.1/turbogears/toolbox/admi18n/__init__.py (modified) (11 diffs)
- branches/1.1/turbogears/toolbox/base.py (modified) (4 diffs)
- branches/1.1/turbogears/toolbox/catwalk/browse.py (modified) (5 diffs)
- branches/1.1/turbogears/toolbox/catwalk/__init__.py (modified) (18 diffs)
- branches/1.1/turbogears/toolbox/designer/__init__.py (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/1.0/turbogears/toolbox/admi18n/catalog.py
r3366 r4202 1 1 import sys 2 2 import os 3 import re4 import time5 3 import codecs 6 4 import pygettext … … 41 39 new_lang.append(msg) 42 40 43 save(path, new_lang)41 save(path, new_lang) 44 42 45 43 def items(path, sort_by, dir): … … 54 52 group = dict() 55 53 sorted = list() 56 col_map = dict( 57 id='id', 58 string='message', 59 context='path' 60 ) 54 col_map = dict(id='id', string='message', context='path') 61 55 for message in po: 62 56 group.setdefault(message[col_map[sort_by]], []).append(message) … … 103 97 if p['id'].strip() == msg_id.strip(): 104 98 p['message'] = msg_text 105 106 99 save(path, message_list) 107 100 … … 222 215 l = eval(l) 223 216 except Exception, e: 224 print >> sys.stderr, 'Escape error on %s: %d' % (infile, lno), \225 'before:', `l`217 print >> sys.stderr, 'Escape error on %s: %d' % (infile, lno), \ 218 'before:', repr(l) 226 219 raise ParseError(e) 227 220 … … 229 222 l = l.decode('utf8') 230 223 except UnicodeDecodeError: 231 print >> sys.stderr, 'Encoding error on %s: %d' % (infile, lno), \232 'before:', `l`224 print >> sys.stderr, 'Encoding error on %s: %d' % (infile, lno), \ 225 'before:', repr(l) 233 226 raise ParseError(e) 234 227 … … 247 240 # Add last entry 248 241 if section == STR: 249 add(msgid, msgstr, prev_context, fuzzy, MESSAGES)242 add(msgid, msgstr, prev_context, fuzzy, MESSAGES) 250 243 251 244 MESSAGES[0]['message'] = u''.join(header) branches/1.0/turbogears/toolbox/admi18n/__init__.py
r3366 r4202 1 1 """Graphical user interface for i18n administration""" 2 import os,sys 2 3 import os 4 import sys 3 5 import time 4 6 import shutil 5 7 import codecs 6 8 7 import turbogears8 from turbogears import controllers9 10 import cherrypy11 from cherrypy.lib.cptools import serveFile12 13 9 import pygettext 14 10 import msgfmt 15 11 import catalog 16 12 13 import cherrypy 14 from cherrypy.lib.cptools import serveFile 15 16 import turbogears 17 from turbogears import controllers, expose, i18n 18 17 19 18 20 class Internationalization(controllers.RootController): 19 21 """I18N administration tool. 20 Collect your strings, add and manage locales, 21 edit and compile your catalogs 22 23 Collect your strings, add and manage locales, 24 edit and compile your catalogs. 25 22 26 """ 23 __label__ ="admi18n" 27 28 __label__ = "admi18n" 24 29 __version__ = "0.1" 25 30 __author__ = "Ronald Jaramillo" … … 40 45 def get_languages(self): 41 46 if not self.languages: 42 self.languages = turbogears.i18n.get_languages()47 self.languages = i18n.get_languages() 43 48 44 49 return self.languages … … 50 55 51 56 for c in code: 52 path = os.path.join(locales, c)57 path = os.path.join(locales, c) 53 58 try: 54 59 shutil.rmtree(path) … … 100 105 shutil.copy(src, dest) 101 106 107 [expose(format='json')] 102 108 def po_upload(self, myFile, code): 103 109 path = os.path.join(self.locales_directory(), … … 107 113 f.close() 108 114 raise cherrypy.HTTPRedirect(turbogears.url('language', code=code)) 109 po_upload = turbogears.expose(format='json')(po_upload)110 115 111 116 def google_translate(self, code, from_lang, to_lang, args): 112 117 path = os.path.join(self.locales_directory(), 113 code, 'LC_MESSAGES', 'messages.po')118 code, 'LC_MESSAGES', 'messages.po') 114 119 for arg in args: 115 120 if not 'text_' in arg: 116 121 continue 117 118 122 msg_id = args[arg] 119 123 msg_id = msg_id.decode('utf-8') 120 translated = turbogears.i18n.utils.google_translate(124 translated = i18n.utils.google_translate( 121 125 from_lang, to_lang, msg_id) 122 126 translated = translated.encode('utf-8') 123 127 catalog.update(path, msg_id, translated) 124 128 129 [expose(format='json')] 125 130 def update_catalog(self, code, msg_id, msg_text): 126 131 path = os.path.join(self.locales_directory(), 127 132 code, 'LC_MESSAGES', 'messages.po') 128 133 catalog.update(path, msg_id, msg_text) 129 130 134 return 'ok' 131 update_catalog = turbogears.expose(format='json')(update_catalog) 132 135 136 [expose(template='%s.po_view' % baseTemplate)] 133 137 def po_view(self, code, sort_by=None, dir=None, 134 138 from_lang=None, to_lang=None, **kargs): … … 137 141 visible_checkbox = True 138 142 self.google_translate(code, from_lang, to_lang, kargs) 139 140 143 path = os.path.join(self.locales_directory(), 141 144 code, 'LC_MESSAGES', 'messages.po') 142 return dict(code=code, catalog=catalog.items(path, sort_by,dir),145 return dict(code=code, catalog=catalog.items(path, sort_by, dir), 143 146 visible_checkbox=visible_checkbox ) 144 po_view = turbogears.expose(template='%s.po_view'% baseTemplate)(po_view) 145 146 def language(self,code): 147 path = os.path.join(self.locales_directory(), 148 code, 'LC_MESSAGES', 'messages.po') 149 po_message_file = dict( 150 path=path, 151 modified=time.ctime(os.path.getmtime(path)), 152 size=os.path.getsize(path) 153 ) 154 147 148 [expose(template='%s.language' % baseTemplate)] 149 def language(self, code): 150 path = os.path.join(self.locales_directory(), 151 code, 'LC_MESSAGES', 'messages.po') 152 po_message_file = dict(path=path, 153 modified=time.ctime(os.path.getmtime(path)), 154 size=os.path.getsize(path)) 155 155 return dict(code=code, 156 language=self.language_for_code(code), 157 po_message_file=po_message_file 158 ) 159 language= turbogears.expose(template='%s.language'% baseTemplate)(language) 160 156 language=self.language_for_code(code), 157 po_message_file=po_message_file) 158 159 [expose(format='json')] 161 160 def language_list(self): 162 161 return dict(languages=self.get_languages()) 163 language_list = turbogears.expose(format='json')(language_list) 164 162 163 [expose(template='%s.languageManagement' % baseTemplate)] 165 164 def language_management(self, add=None, rem=None, compile=None, merge=None): 166 165 if add: 167 166 self.add_locale(add) 168 169 167 if rem: 170 168 self.remove_locale(rem) 171 172 169 if compile: 173 170 self.compile_catalogs(compile) 174 175 171 if merge: 176 172 self.merge_catalogs(merge) 177 178 return dict( 179 languages=list(), 180 locales=self.project_locales() 181 ) 182 language_management = turbogears.expose( 183 template='%s.languageManagement'% baseTemplate)(language_management) 173 return dict(languages=list(), 174 locales=self.project_locales()) 184 175 185 176 def language_for_code(self, code): … … 240 231 def collect_files(file_list, dirpath, namelist): 241 232 level = len([x for x in dirpath.split(os.sep) if x]) - base_level 242 slot0 = dict(# directory info 243 dir=os.path.dirname(dirpath), 244 file_name=os.path.basename(dirpath), 245 path=dirpath, 246 isdir=True, 247 level=level 248 ) 249 233 slot0 = dict( # directory info 234 dir=os.path.dirname(dirpath), 235 file_name=os.path.basename(dirpath), 236 path=dirpath, isdir=True, level=level) 250 237 slot1 = list() # children directories info 251 238 slot2 = list() # children files info … … 254 241 if level: 255 242 dct[os.path.dirname(dirpath)][1].append(slots) 256 257 243 else: 258 244 file_list.append(slots) … … 264 250 namelist.remove(name) 265 251 continue 266 267 252 p = os.path.join(dirpath, name) 268 253 if os.path.isfile(p) and \ 269 254 os.path.splitext(name)[-1] in ['.py','.kid','.tmpl']: 270 slot2.append(dict( 271 dir=dirpath, 272 file_name=name, 273 path=p, 274 isdir=os.path.isdir(p), 275 level=level+1 276 )) 255 slot2.append(dict(dir=dirpath, file_name=name, 256 path=p, isdir=os.path.isdir(p), level=level+1)) 277 257 # decide if current directory (and ancestors) should be visible 278 258 visibility[dirpath] = bool(slot2) … … 314 294 return 315 295 316 return dict( 317 name='messages.pot', 318 path=pot, 319 modified=time.ctime(os.path.getmtime(pot)), 320 size=os.path.getsize(pot) 321 ) 322 296 return dict(name='messages.pot', path=pot, 297 modified=time.ctime(os.path.getmtime(pot)), 298 size=os.path.getsize(pot)) 299 300 [expose()] 323 301 def lang_file(self, code): 324 # serve static file, the code can be pot or a lang code325 locales = self.locales_directory() 326 if code =='pot':302 # serve static file, the code can be pot or a lang code 303 locales = self.locales_directory() 304 if code == 'pot': 327 305 path = os.path.join(locales, 'messages.pot') 328 306 else: … … 330 308 path = os.path.join(path, 'LC_MESSAGES') 331 309 path = os.path.join(path, 'messages.po') 332 333 310 if 'If-Modified-Since' in cherrypy.request.headers: 334 311 del cherrypy.request.headers['If-Modified-Since'] # see ticket #879 335 336 312 return serveFile(path, "application/x-download", "attachment") 337 lang_file = turbogears.expose()(lang_file) 338 313 314 [expose(template='%s.stringCollection' % baseTemplate)] 339 315 def string_collection(self, files=[]): 340 316 if files: 341 317 if type(files) != type([]): 342 files=[files] 343 318 files = [files] 344 319 self.collect_string_for_files(files) 345 return dict( 346 project_files=self.project_files(), 347 pot_message_file=self.pot_message_file() 348 ) 349 string_collection = turbogears.expose( 350 template='%s.stringCollection'% baseTemplate)(string_collection) 351 320 return dict(project_files=self.project_files(), 321 pot_message_file=self.pot_message_file()) 322 323 [expose(template='%s.internationalization' % baseTemplate)] 352 324 def index(self): 353 325 return dict() 354 index = turbogears.expose(355 template='%s.internationalization'% baseTemplate)(index)branches/1.0/turbogears/toolbox/base.py
r4065 r4202 1 1 """Graphical user interface for managing TurboGears projects""" 2 2 3 from turbogears import controllers4 from turbogears.util import setlike5 from turbogears import identity6 3 import pkg_resources 4 import cherrypy 7 5 import turbogears 8 import cherrypy 9 import shell 10 import admi18n 11 import designer 6 from turbogears.util import get_project_name, setlike 7 from turbogears import controllers, expose 8 12 9 13 10 class Info(controllers.Controller): 14 11 """TurboGears System Information. 15 Lists your TurboGears packages and version information 12 13 Lists your TurboGears packages and version information. 14 16 15 """ 17 __label__ ="System Info" 16 17 __label__ = "System Info" 18 18 __version__ = "0.1" 19 19 __author__ = "Ronald Jaramillo" … … 24 24 icon = "/tg_static/images/info.png" 25 25 26 [expose(template='turbogears.toolbox.info')] 26 27 def index(self): 27 28 from turbogears.command.info import retrieve_info 28 29 packages, plugins = retrieve_info() 29 30 return dict(packages=packages, plugins=plugins) 30 index = turbogears.expose(template='turbogears.toolbox.info')(index) 31 31 32 32 33 class WidgetBrowser(controllers.Controller): 33 """Browse usage samples, description and source code for the available TurboGears Widgets""" 34 __label__ ="Widget Browser" 34 """The widget browser. 35 36 Browse usage samples, description and source code for the available 37 TurboGears Widgets. 38 39 """ 40 41 __label__ = "Widget Browser" 35 42 __version__ = "0.1" 36 43 __author__ = "Kevin Dangoor" … … 42 49 icon = "/tg_static/images/widgets.png" 43 50 44 [ turbogears.expose(template="turbogears.toolbox.widgets")]51 [expose(template="turbogears.toolbox.widgets")] 45 52 def index(self, name=None): 46 53 from turbogears import widgets … … 57 64 all_descs = {name: all_descs[name]} 58 65 desclist = all_descs.values() 59 desclist.sort(cmp=lambda x, y: cmp(x.name.lower(), y.name.lower()))66 desclist.sort(cmp=lambda x, y: cmp(x.name.lower(), y.name.lower())) 60 67 output = dict(descs=desclist, viewing_one=name != None) 61 68 if name: … … 91 98 raise AttributeError(widgetname) 92 99 100 93 101 class Toolbox(controllers.RootController): 102 94 103 def __init__(self): 95 104 self.toolbox = self.get_tools() 96 105 97 def tool_icon(self,tool): 98 icon = getattr(tool,'icon','') 99 if icon: return icon 106 def tool_icon(self, tool): 107 icon = getattr(tool, 'icon', '') 108 if icon: 109 return icon 100 110 101 111 def get_tools(self): 102 tools = [] 112 project_name = get_project_name() 113 toolbox = [] 103 114 for i in pkg_resources.iter_entry_points("turbogears.toolboxcommand"): 104 105 115 tool = i.load() 106 tools.append((tool, i.name))107 setattr(self, i.name, tool())108 toolbox = []109 for tool, name in tools:110 116 args = { 111 'path':name, 112 'label':getattr(tool,'__label__',tool), 113 'description':getattr(tool,'__doc__',''), 114 'version':getattr(tool,'__version__',''), 115 'author':getattr(tool,'__author__',''), 116 'email':getattr(tool,'__email__',''), 117 'copyright':getattr(tool,'__copyright__',''), 118 'license':getattr(tool,'__license__',''), 119 'icon':self.tool_icon(tool), 120 'disabled': False 121 } 122 if not turbogears.util.get_project_name() and getattr(tool, 'need_project', False): 117 'path': i.name, 118 'label': getattr(tool, '__label__', i.name), 119 'description': getattr(tool, '__doc__', ''), 120 'version': getattr(tool, '__version__', ''), 121 'author': getattr(tool, '__author__', ''), 122 'email': getattr(tool, '__email__', ''), 123 'copyright': getattr(tool, '__copyright__', ''), 124 'license': getattr(tool, '__license__', ''), 125 'icon': self.tool_icon(tool), 126 'disabled': False} 127 if project_name or not getattr(tool, 'need_project', False): 128 try: 129 setattr(self, i.name, tool()) 130 except Exception, e: 131 args["description"] = str(e) or 'Tool could not be loaded.' 132 args["disabled"] = 'disabled' 133 else: 134 args["description"] += '\nNeeds project.' 123 135 args["disabled"] = 'disabled' 124 136 toolbox.append(args) 125 137 return toolbox 126 138 127 def arrange_in_pairs(self,tools): 128 p = [[],[]] 129 for idx,tool in enumerate(tools): p[idx%2].append(tool) 130 pairs = zip(p[0],p[1]) 131 if len(p[0]) > len(p[1]): pairs.append([p[0][-1],None]) 132 if len(p[0]) < len(p[1]): pairs.append([p[1][-1],None]) 139 def arrange_in_pairs(self, tools): 140 p = [[], []] 141 for idx, tool in enumerate(tools): 142 p[idx%2].append(tool) 143 pairs = zip(p[0], p[1]) 144 if len(p[0]) > len(p[1]): 145 pairs.append([p[0][-1], None]) 146 if len(p[0]) < len(p[1]): 147 pairs.append([p[1][-1], None]) 133 148 return pairs 134 149 150 [expose(template="turbogears.toolbox.main")] 135 151 def index(self): 136 152 return dict(toolbox = self.arrange_in_pairs(self.toolbox), 137 project = turbogears.util.get_project_name()) 138 index = turbogears.expose(template="turbogears.toolbox.main")(index) 153 project = get_project_name()) 139 154 155 [expose()] 140 156 def noaccess(self): 141 157 return """<h3>No access for %s</h3> 142 <p> 143 By default only localhost (127.0.0.1) 144 has access to the Toolbox 145 </p> 146 <p> 147 You can provide access to your client by passing 148 your host address to Toolbox as a parameter. Ex: 149 </p> 150 <pre> 151 tg-admin toolbox -c %s 152 </pre> 153 """% (cherrypy.request.remoteAddr,cherrypy.request.remoteAddr) 154 noaccess = turbogears.expose()(noaccess) 158 <p> 159 By default only localhost (127.0.0.1) 160 has access to the Toolbox 161 </p> 162 <p> 163 You can provide access to your client by passing 164 your host address to Toolbox as a parameter. Ex: 165 </p> 166 <pre> 167 tg-admin toolbox -c %s 168 </pre> 169 """ % (cherrypy.request.remoteAddr,cherrypy.request.remoteAddr) branches/1.0/turbogears/toolbox/catwalk/browse.py
r3366 r4202 1 import cherrypy 2 3 try: 4 import sqlobject 5 except ImportError: 6 sqlobject = None 7 else: 8 from sqlobject.sqlbuilder import Select, func, AND, IN 9 1 10 import turbogears 2 import sqlobject 3 from sqlobject.sqlbuilder import * 4 import cherrypy 11 from turbogears import expose 12 5 13 6 14 class Browse(object): 7 def __getattr__(self,attrib): 8 """Delegate basic methods to CatWalk""" 9 return getattr(self.catwalk,attrib) 10 11 12 def list_view(sql_class_name,page_size=10,offset=10,fields=[],filters=[],sort_by=None): 15 16 def __getattr__(self, attrib): 17 """Delegate basic methods to CatWalk.""" 18 return getattr(self.catwalk, attrib) 19 20 def list_view(sql_class_name, page_size=10, offset=10, 21 fields=[], filters=[], sort_by=None): 13 22 pass 14 23 15 def index(self,object_name,start=0,page_size=10,context='',filters=''): 24 [expose(template='turbogears.toolbox.catwalk.browse_grid', allow_json=True)] 25 def index(self, object_name, start=0, page_size=10, 26 context='', filters=''): 16 27 total = 0 17 28 headers = [] … … 19 30 start = int(start) 20 31 page_size = int(page_size) 21 if not context: context = object_name 22 headers = self.column_headers(object_name,context) 32 if not context: 33 context = object_name 34 headers = self.column_headers(object_name, context) 23 35 headers = [header for header in headers if header['visible']] 24 total,rows = self.rows_for_model(object_name,start,page_size,filters) 25 26 return dict(object_name=object_name, 27 start=start, 28 page_size=page_size, 29 total=total, 30 headers= headers, 31 rows = rows 32 ) 33 index = turbogears.expose(template='turbogears.toolbox.catwalk.browse_grid', 34 allow_json=True)(index) 35 36 def columns(self,object_name,context=''): 37 if not context:context = object_name 38 return dict(object_name=object_name, 39 context = context, 40 columns=self.extended_column_headers(object_name,context)) 41 columns = turbogears.expose(template='turbogears.toolbox.catwalk.columns', 42 allow_json=True)(columns) 43 44 def save_columns(self,object_name,context,order,hidden_columns,updated_fk_labels): 45 self.save_column_order(context,order) 46 self.hide_columns(context,hidden_columns) 36 total, rows = self.rows_for_model( 37 object_name, start, page_size, filters) 38 return dict(object_name=object_name, start=start, page_size=page_size, 39 total=total, headers= headers, rows = rows) 40 41 [expose(template='turbogears.toolbox.catwalk.columns', allow_json=True)] 42 def columns(self, object_name, context=''): 43 if not context: 44 context = object_name 45 return dict(object_name=object_name, context = context, 46 columns=self.extended_column_headers(object_name, context)) 47 48 [expose(allow_json=True)] 49 def save_columns(self, object_name, context, order, hidden_columns, 50 updated_fk_labels): 51 self.save_column_order(context, order) 52 self.hide_columns(context, hidden_columns) 47 53 if updated_fk_labels: 48 54 for updated_fk_label in updated_fk_labels.split('|'): 49 obj ect,column_name = updated_fk_label.split(':')50 self.column_label_for_object(obj ect,column_name)51 return "<script>parent.cat_browse.columns_saved('%s','%s');</script>"% (object_name,context)52 save_columns= turbogears.expose(allow_json=True)(save_columns)53 54 def extended_column_headers(self, object_name,context):55 cols = [{'name': 'id','title':'#','type':'SOInteger'}]56 cols.extend(self.column_labels(object_name, extended=True))57 cols.extend(self.join_labels(object_name, extended=True))58 cols = self.arrange_columns(cols, context)59 return cols 60 61 def column_headers(self, object_name,context):62 cols = [{'name': 'id','title':'#'}]55 obj, column_name = updated_fk_label.split(':') 56 self.column_label_for_object(obj, column_name) 57 return ("<script>parent.cat_browse.columns_saved('%s','%s');" 58 "</script>" % (object_name, context)) 59 60 def extended_column_headers(self, object_name, context): 61 cols = [{'name': 'id', 'title': '#', 'type': 'SOInteger'}] 62 cols.extend(self.column_labels(object_name, extended=True)) 63 cols.extend(self.join_labels(object_name, extended=True)) 64 cols = self.arrange_columns(cols, context) 65 return cols 66 67 def column_headers(self, object_name, context): 68 cols = [{'name': 'id', 'title': '#'}] 63 69 cols.extend(self.column_labels(object_name)) 64 70 cols.extend(self.join_labels(object_name)) 65 cols = self.arrange_columns(cols, object_name)66 return cols 67 68 def arrange_columns(self, headers,context):69 # arrange order and visibility71 cols = self.arrange_columns(cols, object_name) 72 return cols 73 74 def arrange_columns(self, headers, context): 75 # arrange order and visibility 70 76 hidden_columns = self.load_columns_visibility_state(context) 71 77 order = self.load_column_order(context) 72 78 for col in headers: 73 79 col['visible'] = True 74 if col['name'] in hidden_columns: col['visible'] = False 75 76 if not order:return headers 77 c={} 80 if col['name'] in hidden_columns: 81 col['visible'] = False 82 if not order: 83 return headers 84 c = {} 78 85 for col in headers: 79 86 c[col['name']] = col 80 if col['name'] not in order:order.append(col['name']) 87 if col['name'] not in order: 88 order.append(col['name']) 81 89 rearrenged = [] 82 90 for name in order: 83 if name not in c.keys():continue 91 if name not in c.keys(): 92 continue 84 93 rearrenged.append(c[name]) 85 94 return rearrenged 86 95 87 def prepare_filter(self, obj,filter):96 def prepare_filter(self, obj, filter): 88 97 for column in obj.sqlmeta.columns.values(): 89 98 if column.origName == filter[0]: 90 return getattr(obj.q, column.name) == filter[1]91 92 #if we got so far we couldn't find the column, bark at the moon93 msg='filter_column_error. Could not find the column for filter:%s'% filter[0]99 return getattr(obj.q, column.name) == filter[1] 100 # if we got so far we couldn't find the column, bark at the moon 101 msg = ('filter_column_error.' 102 ' Could not find the column for filter: %s' % filter[0]) 94 103 raise cherrypy.HTTPRedirect(turbogears.url('/error', msg=msg)) 95 104 96 def filtered_query(self,obj,filters): 97 if not ':' in filters: #there should at least be a semicolon 98 msg='filter_format_error. The format is column_name:value, not %s'% filters 105 def filtered_query(self, obj, filters): 106 if not ':' in filters: # there should at least be a semicolon 107 msg = ('filter_format_error.' 108 ' The format is column_name:value, not %s' % filters) 99 109 raise cherrypy.HTTPRedirect(turbogears.url('/error', msg=msg)) 100 110 101 111 filters = [filter.split(':') for filter in filters.split(',')] 102 conditions = tuple([self.prepare_filter(obj, filter) for filter in filters])103 return obj.select(AND(* conditions ))104 105 def rows_for_model(self,object_name,start,page_size,filters): 106 ids = []112 conditions = tuple([self.prepare_filter(obj, filter) 113 for filter in filters]) 114 return obj.select(AND(* conditions)) 115 116 def rows_for_model(self, object_name, start, page_size, filters): 107 117 rows = {} 108 118 obj = self.load_object(object_name) 109 119 110 120 if filters: 111 query = self.filtered_query(obj, filters)121 query = self.filtered_query(obj, filters) 112 122 else: 113 123 query = obj.select() … … 120 130 121 131 for result in results: 122 rows[result.id] = self.fields(object_name, result)123 124 relations = self.relation_values(object_name, rows)125 rows = self.merge_relation_values(rows, relations)126 rows = self.foreign_key_alias_value(object_name, rows)127 return total, rows128 129 def relation_values(self, object_name,rows):132 rows[result.id] = self.fields(object_name, result) 133 134 relations = self.relation_values(object_name, rows) 135 rows = self.merge_relation_values(rows, relations) 136 rows = self.foreign_key_alias_value(object_name, rows) 137 return total, rows 138 139 def relation_values(self, object_name, rows): 130 140 joins = {} 131 141 ids = rows.keys() 132 if not ids: return joins 142 if not ids: 143 return joins 133 144 134 145 obj = self.load_object(object_name) … … 138 149 coltype = self.get_column_type(column) 139 150 if coltype in ('SOMultipleJoin', 'SOSQLMultipleJoin'): 140 query = conn.sqlrepr( Select( [ 141 column.soClass.q.id, 142 func.Count(column.otherClass.q.id) 143 ], 144 where=AND( 145 column.soClass.q.id==self.join_foreign_key(column), 146 IN(column.soClass.q.id,ids) 147 ), groupBy=column.soClass.q.id)) 151 query = conn.sqlrepr(Select([ 152 column.soClass.q.id, 153 func.Count(column.otherClass.q.id)], 154 where=AND( 155 column.soClass.q.id==self.join_foreign_key(column), 156 IN(column.soClass.q.id, ids)), 157 groupBy=column.soClass.q.id)) 148 158 149 159 elif coltype in ('SORelatedJoin', 'SOSQLRelatedJoin'): 150 160 d = (column.intermediateTable, 151 column.joinColumn,152 column.intermediateTable,153 column.otherColumn,154 column.intermediateTable,155 column.intermediateTable,156 column.joinColumn,157 ','.join(['%s' %x for x in ids]),158 column.intermediateTable,159 column.joinColumn)160 161 query = "SELECT %s.%s, Count(%s.%s) FROM %s WHERE %s.%s IN(%s) GROUP BY %s.%s" % d162 161 column.joinColumn, 162 column.intermediateTable, 163 column.otherColumn, 164 column.intermediateTable, 165 column.intermediateTable, 166 column.joinColumn, 167 ','.join(['%s' % x for x in ids]), 168 column.intermediateTable, 169 column.joinColumn) 170 171 query = ("SELECT %s.%s, Count(%s.%s) FROM %s" 172 " WHERE %s.%s IN(%s) GROUP BY %s.%s" % d) 163 173 164 174 elif coltype == 'SOSingleJoin': 165 175 alias = self.load_label_column_for_object(column.otherClassName) 166 query = conn.sqlrepr( Select( [ column.soClass.q.id,getattr(column.otherClass.q,alias)], 167 where=AND( 168 column.soClass.q.id==self.join_foreign_key(column), 169 IN(column.soClass.q.id,ids) 170 ))) 171 172 if not query: continue 176 query = conn.sqlrepr(Select([ 177 column.soClass.q.id, getattr(column.otherClass.q, alias)], 178 where=AND( 179 column.soClass.q.id==self.join_foreign_key(column), 180 IN(column.soClass.q.id,ids)))) 181 182 if not query: 183 continue 173 184 joins[column.joinMethodName] = conn.queryAll(query) 174 185 return joins 175 186 176 def foreign_key_alias_value(self, object_name,rows):187 def foreign_key_alias_value(self, object_name, rows): 177 188 for column in self.foreign_key_columns(object_name): 178 189 alias = self.load_label_column_for_object(column.foreignKey) 179 if alias == 'id':continue 180 column_name = column.name.replace('ID','') 181 fk_values = self.foreign_key_query(column,alias,[x[column_name] for x in rows]) 182 for row in rows: row[column_name] = fk_values.get(row[column_name],'') 190 if alias == 'id': 191 continue 192 column_name = column.name.replace('ID', '') 193 fk_values = self.foreign_key_query(column, alias, 194 [x[column_name] for x in rows]) 195 for row in rows: 196 row[column_name] = fk_values.get(row[column_name], '') 183 197 return rows 184 198 185 def foreign_key_query(self,column,alias,ids): 186 if not ids: return {} 199 def foreign_key_query(self, column, alias, ids): 200 if not ids: 201 return {} 187 202 sql_object = self.load_object(column.foreignKey) 188 203 conn = sql_object._connection 189 query = conn.sqlrepr( Select( [ sql_object.q.id,getattr(sql_object.q,alias) ], 190 where=IN(sql_object.q.id,ids) ) ) 204 query = conn.sqlrepr(Select( 205 [sql_object.q.id, getattr(sql_object.q, alias)], 206 where=IN(sql_object.q.id, ids))) 191 207 fk_values = {} 192 for id,alias in conn.queryAll(query): fk_values[str(id)] = self.encode_label( alias ) 208 for id, alias in conn.queryAll(query): 209 fk_values[str(id)] = self.encode_label(alias) 193 210 return fk_values 194 211 195 def join_foreign_key(self, column):196 foreign_key = '%sID' % column.joinColumn.split('_')[0]197 return getattr(column.otherClass.q, foreign_key)198 199 def column_label_options(self, column):200 foreign_key_labels = [{'name': 'id','title':'#'}]212 def join_foreign_key(self, column): 213 foreign_key = '%sID' % column.joinColumn.split('_')[0] 214 return getattr(column.otherClass.q, foreign_key) 215 216 def column_label_options(self, column): 217 foreign_key_labels = [{'name': 'id', 'title': '#'}] 201 218 foreign_key_labels.extend(self.column_labels(column.foreignKey)) 202 219 return foreign_key_labels 203 220 204 def column_labels(self, object_name,extended=False):221 def column_labels(self, object_name, extended=False): 205 222 cols = [] 206 223 sql_object = self.load_object(object_name) 207 224 for column_name in sql_object.sqlmeta.columns: 208 225 column = sql_object.sqlmeta.columns[column_name] 209 if sql_object._inheritable and column_name == 'childName':continue 210 cols.append({'name':column.name, 'title':self.column_title(column)}) 226 if sql_object._inheritable and column_name == 'childName': 227 continue 228 cols.append({'name': column.name, 229 'title': self.column_title(column)}) 230 col = cols[-1] 211 231 if isinstance(column, sqlobject.col.SOForeignKey): 212 col s[-1]['name'] = cols[-1]['name'].replace('ID','')232 col['name'] = col['name'].replace('ID', '') 213 233 if extended: 214 col s[-1]['type']=self.get_column_type(column)234 col['type'] = self.get_column_type(column) 215 235 if isinstance(column, sqlobject.col.SOForeignKey): 216 cols[-1]['column_label'] = self.load_label_column_for_object(column.foreignKey) 217 cols[-1]['label_options']=self.column_label_options(column) 218 cols[-1]['other_class_name'] = column.foreignKey 219 return cols 220 221 def join_labels(self,object_name,extended=False): 236 col['column_label'] = self.load_label_column_for_object( 237 column.foreignKey) 238 col['label_options'] = self.column_label_options(column) 239 col['other_class_name'] = column.foreignKey 240 return cols 241 242 def join_labels(self, object_name, extended=False): 222 243 cols = [] 223 244 sql_object = self.load_object(object_name) 224 245 for col in sql_object.sqlmeta.joins: 225 cols.append({'name': col.joinMethodName,'title':''})246 cols.append({'name': col.joinMethodName, 'title': ''}) 226 247 if extended: 227 cols[-1]['type'] =self.get_column_type(col)248 cols[-1]['type'] = self.get_column_type(col) 228 249 cols[-1]['other_class_name'] = col.otherClassName 229 250 return cols 230 251 <