PageRenderTime 44ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/dbsprockets/dbmechanic/frameworks/pylons/dbmechanic.py

http://dbsprockets.googlecode.com/
Python | 161 lines | 131 code | 3 blank | 27 comment | 0 complexity | f44771ebc907513f9652e456e5435b87 MD5 | raw file
  1. """
  2. dbmechanic module for Pylons
  3. Initial version by Isaac Csandl <nerkles _at_ gmail {d0t} com> based on the tg2 version.
  4. """
  5. import os
  6. import pkg_resources
  7. import sqlalchemy
  8. from tw.api import Widget
  9. import pylons
  10. from pylons.templating import cached_template, pylons_globals
  11. from pylons.controllers import WSGIController
  12. from pylons import c, request
  13. from dbsprockets.sprockets import Sprockets
  14. #from dbsprockets.decorators import crudErrorCatcher, validate
  15. from tw.api import WidgetBunch
  16. from genshi.template import TemplateLoader
  17. def render_genshi(template_name, genshi_loader, cache_key=None, cache_type=None,
  18. cache_expire=None, fragment=False, format='xhtml'):
  19. """
  20. Copied out of Pylons so that we can specify the path to genshi templates.
  21. Render a template with Genshi
  22. Accepts the cache options ``cache_key``, ``cache_type``, and
  23. ``cache_expire`` in addition to fragment and format which are
  24. passed to Genshi's render function.
  25. """
  26. # Create a render callable for the cache function
  27. def render_template():
  28. # First, get the globals
  29. globs = pylons_globals()
  30. # Grab a template reference
  31. template = genshi_loader.load(template_name)
  32. return template.generate(**globs).render()
  33. return cached_template(template_name, render_template, cache_key=cache_key,
  34. cache_type=cache_type, cache_expire=cache_expire,
  35. ns_options=('fragment', 'format'),
  36. fragment=fragment, format=format)
  37. class DBMechanic(WSGIController):
  38. sprockets = None
  39. def __init__(self, provider, controller, *args, **kwargs):
  40. self.provider = provider
  41. self.sprockets = Sprockets(provider, controller)
  42. self.controller = controller
  43. #commonly used views
  44. c.w = WidgetBunch()
  45. sprocket = self.sprockets['databaseView']
  46. self.databaseValue = sprocket.session.get_value()
  47. self.databaseView = sprocket.view.widget
  48. print 'controller:', self.controller
  49. self.databaseDict = dict(controller=self.controller)
  50. self.genshi_loader = TemplateLoader([pkg_resources.resource_filename('dbsprockets.dbmechanic.frameworks.pylons', 'templates')])
  51. WSGIController.__init__(self, *args, **kwargs)
  52. def index(self):
  53. c.w.databaseView = self.databaseView
  54. c.w.mainView=Widget("widget")
  55. return render_genshi('index.html', self.genshi_loader)
  56. def tableDef(self, id): #table_name):
  57. c.table_name = id
  58. sprocket = self.sprockets['table_def__'+c.table_name]
  59. c.w.mainView = sprocket.view.widget
  60. c.w.databaseView = self.databaseView
  61. c.mainValue = sprocket.session.get_value()
  62. for key, value in self.databaseDict.iteritems():
  63. setattr(c, key, value)
  64. return render_genshi('index.html', self.genshi_loader)
  65. def tableView(self, id):
  66. c.table_name = id
  67. c.page = request.params.get('page', 1)
  68. c.recordsPerPage = request.params.get('recordsPerPage', 25)
  69. #this should probably be a decorator
  70. c.page = int(c.page)
  71. c.recordsPerPage = int(c.recordsPerPage)
  72. sprocket = self.sprockets['table_view__'+c.table_name]
  73. c.w.mainView = sprocket.view.widget
  74. c.w.databaseView = self.databaseView
  75. c.mainValue = sprocket.session.get_value(values=request.params, page=c.page, recordsPerPage=c.recordsPerPage)
  76. c.main_count = sprocket.session.get_count(values=request.params)
  77. for key, value in self.databaseDict.iteritems():
  78. setattr(c, key, value)
  79. return render_genshi('tableView.html', self.genshi_loader)
  80. def addRecord(self, id): #table_name, **kw):
  81. c.table_name = id
  82. sprocket = self.sprockets['add_record__'+c.table_name]
  83. c.w.mainView = sprocket.view.widget
  84. c.w.databaseView = self.databaseView
  85. kw = {}
  86. for key, value in request.params.iteritems():
  87. if key and value:
  88. setattr(kw, key, value)
  89. c.mainValue = sprocket.session.get_value(values=kw)
  90. for key, value in self.databaseDict.iteritems():
  91. setattr(c, key, value)
  92. return render_genshi('index.html', self.genshi_loader)
  93. def editRecord(self, id): #table_name, **kw):
  94. c.table_name = request.params.get('table_name', None)
  95. sprocket = self.sprockets['edit_record__'+c.table_name]
  96. c.w.mainView = sprocket.view.widget
  97. c.w.databaseView = self.databaseView
  98. kw = {}
  99. kw.update(request.params.__dict__)
  100. c.mainValue = sprocket.session.get_value(values=kw)
  101. for key, value in self.databaseDict.iteritems():
  102. setattr(c, key, value)
  103. return render_genshi('index.html', self.genshi_loader)
  104. def _createRelationships(self, table_name, params):
  105. #this might become a decorator
  106. #check to see if the table is a many-to-many table first
  107. if table_name in self.provider.get_many_to_many_tables():
  108. return
  109. #right now many-to-many only supports single primary keys
  110. id = params[self.provider.get_primary_keys(table_name)[0]]
  111. relationships = {}
  112. for key, value in params.iteritems():
  113. if key.startswith('many_many_'):
  114. relationships.setdefault(key[10:], []).append(value)
  115. for key, value in relationships.iteritems():
  116. self.provider.set_many_to_many(table_name, id, key, value)
  117. # @validate(error_handler=editRecord)
  118. #@crudErrorCatcher(errorType=sqlalchemy.exceptions.IntegrityError, error_handler='editRecord')
  119. #@crudErrorCatcher(errorType=sqlalchemy.exceptions.ProgrammingError, error_handler='editRecord')
  120. def edit(self, id): # table_name, *args, **kw):
  121. table_name = request.params.get('table_name', None)
  122. params = pylons.request.params.copy()
  123. self._createRelationships(table_name, params)
  124. self.provider.edit(table_name, values=params)
  125. raise redirect(self.controller+'/tableView/'+table_name)
  126. # @validate(error_handler=addRecord)
  127. #@crudErrorCatcher(errorType=sqlalchemy.exceptions.IntegrityError, error_handler='addRecord')
  128. #@crudErrorCatcher(errorType=sqlalchemy.exceptions.ProgrammingError, error_handler='addRecord')
  129. def add(self, id): #table_name, **kw):
  130. table_name = request.params.get('table_name', None)
  131. params = pylons.request.params.copy()
  132. self._createRelationships(table_name, params)
  133. self.provider.add(table_name, values=params)
  134. raise redirect(self.controller+'/tableView/'+table_name)
  135. def delete(self, id): # table_name, **kw):
  136. table_name = request.params.get('table_name', None)
  137. self.provider.delete(table_name, values=kw)
  138. raise redirect(self.controller+'/tableView/'+table_name)