PKs)72EGG-INFO/dependency_links.txt PKs)7ݡBBEGG-INFO/entry_points.txt [turbogears.extensions] fastdata = tgfastdata.plugin PK62EGG-INFO/not-zip-safe PKs)7cEGG-INFO/PKG-INFOMetadata-Version: 1.0 Name: TGFastData Version: 0.9a7 Summary: Automatic user interface generation for TurboGears Home-page: http://www.turbogears.org Author: Kevin Dangoor Author-email: dangoor+turbogears@gmail.com License: MIT Download-URL: http://www.turbogears.org/download/ Description: FastData generates a user interface based upon model objects in user projects. Platform: UNKNOWN Classifier: Development Status :: 3 - Alpha Classifier: Environment :: Console Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Topic :: Software Development :: Libraries :: Python Modules PKs)79ۥEGG-INFO/requires.txtTurboGears > 0.9a6PKs)7zQNNEGG-INFO/SOURCES.txtLICENSE.txt README.txt setup.cfg setup.py TGFastData.egg-info/PKG-INFO TGFastData.egg-info/SOURCES.txt TGFastData.egg-info/dependency_links.txt TGFastData.egg-info/entry_points.txt TGFastData.egg-info/not-zip-safe TGFastData.egg-info/requires.txt TGFastData.egg-info/top_level.txt tgfastdata/__init__.py tgfastdata/datacontroller.py tgfastdata/datawidgets.py tgfastdata/formmaker.py tgfastdata/plugin.py tgfastdata/release.py tgfastdata/templates/__init__.py tgfastdata/templates/datagrid.kid tgfastdata/templates/editform.kid tgfastdata/templates/form.kid tgfastdata/templates/item.kid tgfastdata/templates/list.kid tgfastdata/templates/master.kid tgfastdata/tests/__init__.py tgfastdata/tests/formmodel.py tgfastdata/tests/test_datacontroller.py tgfastdata/tests/test_fastdata.py tgfastdata/tests/test_formmaker.py PKs)7a`H EGG-INFO/top_level.txttgfastdata PK6WCM3M3tgfastdata/datacontroller.py#import logging import re from turbogears import widgets, database, validators import turbogears import formmaker from datawidgets import FastDataGrid, EditForm import cherrypy import simplejson import formencode from sqlobject import SQLObjectNotFound, IN from sqlobject.sresults import SelectResults from sqlobject.sqlbuilder import SQLExpression #log = logging.getLogger("fastdata") def join_items(sobj): d = {} for join in database.so_joins(sobj): attr_name = join.joinMethodName d[attr_name] = list(getattr(sobj, attr_name)) return d _mangle_rx = re.compile(r'_.') def col2attrname(name): if name.endswith('_id'): name = name[:-3] return _mangle_rx.sub(lambda x: x.group(0)[1].upper(), name) class BaseDataController(object): sql_class = None getter = None def __init__(self, sql_class=None, id_column=None, list_filter=None): if not (self.sql_class or sql_class): raise ValueError("You must set an sql_class to use a DataController") if sql_class: self.sql_class = sql_class if id_column: getterName = sql_class.sqlmeta.columns[id_column].alternateMethodName self.getter = getattr(self.sql_class, getterName) else: self.getter = self.sql_class.get self._list_filter = list_filter def _get_item(self, atom): ''' Hook to allow retrieval by something other than meaningless (lame) integer primary key. ''' # Coerce the ID to the correct db type try: #id = int(atom) return self.getter(int(atom)) except SQLObjectNotFound: return None def default(self, *vpath, **params): """Do RESTful-style access to database objects. Based on the RESTful resource recipe by Robert Brewer.""" if not vpath: return self.index(**params) # Make a copy of vpath in a list vpath = list(vpath) atom = vpath.pop(0) # See if the first virtual path member is a container action method = getattr(self, atom, None) if method and getattr(method, "expose_container"): return method(*vpath, **params) # Not a container action; the URI atom must be an existing ID item = self._get_item(atom) if item is None: raise cherrypy.NotFound # There may be further virtual path components. # Try to map them to methods in this class. if vpath: method = getattr(self, vpath[0], None) if method and getattr(method, "exposed"): return method(item, *vpath[1:], **params) # No further known vpath components. Call a default handler. return self.show(item, *vpath, **params) default = turbogears.expose()(default) def _filterJoins(self, obj, data): # check if the object has joins jdata = [] for join in database.so_joins(self.sql_class): jname = join.joinMethodName # is join data present in the form? if jname in data.keys(): # keep the data and update joins after object's update jdata.append((join, data.pop(jname))) return data, jdata def _updateJoins(self, obj, jdata): obj_id = getattr(obj, obj.sqlmeta.idName) for join, data in jdata: jname = join.joinMethodName addRelation = 'add' + join.addRemoveName removeRelation = 'remove' + join.addRemoveName if join.hasIntermediateTable(): # many-to-many join # remove all relations relations = getattr(obj, jname) for relation in relations: getattr(obj, removeRelation)(relation) # add selected relations if data: relations = join.otherClass.select(IN(join.otherClass.q.id, data)) for relation in relations: getattr(obj, addRelation)(relation) else: # one-to-many # get all current relations oldrelations = set(getattr(obj, jname)) newrelations = [] # KLUDGE: get attribute name of related class # referring to this class join_attr = col2attrname(join.joinColumn) for item in data: try: newrelation = join.otherClass.get(item) except SQLObjectNotFound: raise ValueError, 'Invalid ID for related object.' else: if newrelation not in oldrelations: setattr(newrelation, join_attr, obj) newrelations.append(newrelation) for relation in oldrelations.difference(newrelations): setattr(relation, join_attr, None) def _update(self, obj=None, **data): data, join_data = self._filterJoins(self.sql_class, data) #log.debug(data) if obj: obj.set(**data) else: obj = self.sql_class(**data) self._updateJoins(obj, join_data) return obj def _get_instances(self): if self._list_filter: lfilter = self._list_filter if isinstance(lfilter, SelectResults): return lfilter if callable(lfilter): lfilter = lfilter() if isinstance(lfilter, (SQLExpression, basestring)): lfilter = self.sql_class.select(lfilter) return lfilter else: return self.sql_class.select() class AjaxDataController(BaseDataController): ''' A DataController specifically for use with Ajax requests. ''' def __init__(self, sql_class=None, id_column=None, schema=None): super(AjaxDataController,self).__init__(sql_class, id_column) self.schema= schema def _read_incoming_data(): ''' Returns a tuple containing the incoming data and any errors ''' values = simple_json.load(cherrypy.request.body) if self.schema: try: values= self.schema.to_python( values ) except validators.Invalid, e: errors= {} for key,error in e.error_dict.items(): errors[key]= dict(message=str(error), invalid_value=e.value) # Return error code and info cherrypy.response.status=400 # Bad request return (None,errors) return (values,None) def index(self): return dict(objects=self._get_instances(), errors=None ) index = turbogears.expose( format="json" )(index) def create(self, **data): obj_data,errors= self._read_incoming_data() if errors: cherrypy.response.status=400 # Bad request return dict( id=None, errors=errors ) obj= self.sql_class(obj_data) return dict( id=obj.id, errors=None ) create = turbogears.expose( format="json" )(create) def update(self, obj, **data): obj_data,errors= self._read_incoming_data() if errors: cherrypy.response.status=400 # Bad request return dict( id=obj.id, errors=errors ) # If the update data specifies an ID, it *must* match the object's ID. if "id" in obj_data: if obj_data["id"]!=obj.id: # IDs don't match. Can't update this object. cherrypy.response.status=409 # Conflict return dict( id=obj.id, errors= dict( id=dict( message="Object ID invalid", value=obj_data["id"] ) ) ) # IDs match, but we don't need to update the ID. del obj_data["id"] # Validate/convert the JSON data to data ready for SQLObject errors= dict() for key in obj_data.keys(): try: col= obj.sqlmeta.columns[key] validator= col.validator values[key] = validator.to_python( obj_data[key], None ) except formencode.Invalid, e: # if the value doesn't validate correctly, then note it errors[key]= dict( message=str(e), invalid_value=e.value ) except KeyError: # remove entries in updateValues that don't appear in the object del obj_data[key] # If any values didn't validate correctly, return a Bad Request (400) # status code and indicate the errors. if errors: cherrypy.response.status=400 # Bad request return dict( id=obj.id, errors=errors ) # Update the SQLObject object obj.set( obj_data ) return dict( id=obj.id, errors=None ) update = turbogears.expose( format="json" )(update) def delete(self, obj): obj.destroySelf() return dict( id=obj.id, errors=None ) delete = turbogears.expose( format="json" )(delete) def show(self, obj): return dict( object=obj, errors=None ) show = turbogears.expose( format="json" )(show) class DataController(BaseDataController): """Provides basic add/edit/delete capability""" list_widget = FastDataGrid() form_widget_class = EditForm form_template = "tgfastdata.templates.form" list_template = "tgfastdata.templates.list" item_template = "tgfastdata.templates.item" form_fields = None list_fields = None object_name = 'Record' def __init__(self, sql_class=None, form_widget_class=None, id_column=None, list_widget=None, form_widget=None, object_name=None, form_template=None, list_template=None, item_template=None, form_fields=None, list_fields=None, list_filter=None): super(DataController,self).__init__(sql_class, id_column, list_filter) if list_fields: self.list_fields = list_fields if form_fields: self.form_fields = form_fields if form_widget_class: self.form_widget_class = form_widget_class if form_widget: self.form_widget = form_widget self.form_widget_class = form_widget.__class__ else: self.form_widget = self.form_widget_class( fields=formmaker.fields_for(self.sql_class, self.form_fields)) if object_name: self.object_name = object_name if list_widget: self.list_widget = list_widget elif self.list_fields: self.list_widget = FastDataGrid(self.list_fields or self.form_fields) if form_template: self.form_template = form_template if list_template: self.list_template = list_template if item_template: self.item_template = item_template def _get_form(self): return self.form_widget def index(self): return dict(tg_template=self.list_template, list_widget=self.list_widget, data=self._get_instances()) index = turbogears.expose()(index) def add(self): return dict(tg_template=self.form_template, obj=None, form=self.form_widget, action="create") add = turbogears.expose()(add) add.expose_container = True def create(self, **data): self._update(**data) turbogears.flash("%s Added!" % self.object_name) turbogears.redirect('./') create = turbogears.expose()(create) create = turbogears.validate(form=_get_form)(create) create = turbogears.error_handler(add)(create) def edit(self, obj): values = database.so_to_dict(obj) values.update(join_items(obj)) return dict(tg_template=self.form_template, form=self.form_widget, obj=values, action="update") edit = turbogears.expose()(edit) def update(self, obj, **data): self._update(obj, **data) turbogears.flash("Changes Saved!") turbogears.redirect('../') update = turbogears.expose()(update) update = turbogears.validate(form=_get_form)(update) update = turbogears.error_handler(edit)(update) def delete(self, obj): obj.destroySelf() turbogears.flash("%s deleted!" % self.object_name) turbogears.redirect('../') delete = turbogears.expose()(delete) def show(self, obj): value = database.so_to_dict(obj) columns = obj.sqlmeta.columns if self.form_fields: column_keys = self.form_fields else: column_keys = columns.keys() # Get the title from the sqlcolumn column_list = [ (formmaker.column_parms(columns[key])['label'], key) for key in column_keys ] value["tg_columns"] = column_list value["tg_template"] = self.item_template return value show = turbogears.expose()(show) PKs)7XE==tgfastdata/datacontroller.pyc; Fc@sdkZdklZlZlZdkZdkZdklZlZdk Z dk Z dk Z dk l Z lZdklZdklZdZeidZdZd efd YZd efd YZd efdYZdS(N(swidgetssdatabases validators(s FastDataGridsEditForm(sSQLObjectNotFoundsIN(s SelectResults(s SQLExpressioncCsJh}x9ti|D](}|i}tt||||s(snamesendswiths _mangle_rxssub(sname((s2build\bdist.win32\egg\tgfastdata\datacontroller.pys col2attrnamessBaseDataControllercBsqtZeZeZeeedZdZdZei eZdZ dZ edZ dZ RS(NcCs|ip| otdn|o ||_n|o,|ii|i}t|i||_ n|ii |_ ||_ dS(Ns1You must set an sql_class to use a DataController( sselfs sql_classs ValueErrors id_columnssqlmetascolumnssalternateMethodNames getterNamesgetattrsgettersgets list_filters _list_filter(sselfs sql_classs id_columns list_filters getterName((s2build\bdist.win32\egg\tgfastdata\datacontroller.pys__init__"s cCs5y|it|SWntj o tSnXdS(sq Hook to allow retrieval by something other than meaningless (lame) integer primary key. N(sselfsgettersintsatomsSQLObjectNotFoundsNone(sselfsatom((s2build\bdist.win32\egg\tgfastdata\datacontroller.pys _get_item.s cOs| o|i|Snt|}|id}t||t}|o t|do|||Sn|i |}|tjo t i n|oIt||dt}|o t|do|||d|Sqn|i|||SdS(skDo RESTful-style access to database objects. Based on the RESTful resource recipe by Robert Brewer.isexpose_containersexposediN(svpathsselfsindexsparamsslistspopsatomsgetattrsNonesmethods _get_itemsitemscherrypysNotFoundsshow(sselfsvpathsparamssitemsatomsmethod((s2build\bdist.win32\egg\tgfastdata\datacontroller.pysdefault:s    cCsmg}xVti|iD]B}|i}||i jo |i ||i |fqqW||fSdS(N( sjdatasdatabasesso_joinssselfs sql_classsjoinsjoinMethodNamesjnamesdataskeyssappendspop(sselfsobjsdatasjdatasjoinsjname((s2build\bdist.win32\egg\tgfastdata\datacontroller.pys _filterJoinsXs $cCst||ii} x|D]\} } | i}d| i }d| i }| i ot||}x!|D]}t|||qnW| oL| iit| iii| }x%|D]}t|||qWqqtt||}g} t| i}xq| D]i} y| ii| }Wntj otdqX||jot |||n| i!|qWx'|i"| D]}t ||t#qWqWdS(NsaddsremovesInvalid ID for related object.($sgetattrsobjssqlmetasidNamesobj_idsjdatasjoinsdatasjoinMethodNamesjnames addRemoveNames addRelationsremoveRelationshasIntermediateTables relationssrelations otherClasssselectsINsqsidssets oldrelationss newrelationss col2attrnames joinColumns join_attrsitemsgets newrelationsSQLObjectNotFounds ValueErrorssetattrsappends differencesNone(sselfsobjsjdatas join_attrsremoveRelationsrelations relationss newrelationsjnamesdatasjoinsobj_ids newrelationssitems addRelations oldrelations((s2build\bdist.win32\egg\tgfastdata\datacontroller.pys _updateJoinscs>     $ cKsZ|i|i|\}}|o|i|n|i|}|i|||SdS(N(sselfs _filterJoinss sql_classsdatas join_datasobjssets _updateJoins(sselfsobjsdatas join_data((s2build\bdist.win32\egg\tgfastdata\datacontroller.pys_updates cCs|ioo|i}t|to|Snt|o |}nt|ttfo|ii |}n|Sn|ii SdS(N( sselfs _list_filterslfilters isinstances SelectResultsscallables SQLExpressions basestrings sql_classsselect(sselfslfilter((s2build\bdist.win32\egg\tgfastdata\datacontroller.pys_get_instancess    (s__name__s __module__sNones sql_classsgetters__init__s _get_itemsdefaults turbogearssexposes _filterJoinss _updateJoinss_updates_get_instances(((s2build\bdist.win32\egg\tgfastdata\datacontroller.pysBaseDataControllers  % sAjaxDataControllercBstZdZeeedZdZdZeiddeZdZ eidde Z dZ eidde Z dZ eidde Z d Z eidde Z RS( sC A DataController specifically for use with Ajax requests. cCs&tt|i||||_dS(N(ssupersAjaxDataControllersselfs__init__s sql_classs id_columnsschema(sselfs sql_classs id_columnsschema((s2build\bdist.win32\egg\tgfastdata\datacontroller.pys__init__scCstitii}tioytii|}Wqt i j og}h}x?|i iD].\}}tdt|d|i||  (s__name__s __module__s__doc__s FastDataGrids list_widgetsEditFormsform_widget_classs form_templates list_templates item_templatesNones form_fieldss list_fieldss object_names__init__s _get_formsindexs turbogearssexposesaddsTruesexpose_containerscreatesvalidates error_handlerseditsupdatesdeletesshow(((s2build\bdist.win32\egg\tgfastdata\datacontroller.pysDataControllers<  -         (sres turbogearsswidgetssdatabases validatorss formmakers datawidgetss FastDataGridsEditFormscherrypys simplejsons formencodes sqlobjectsSQLObjectNotFoundsINssqlobject.sresultss SelectResultsssqlobject.sqlbuilders SQLExpressions join_itemsscompiles _mangle_rxs col2attrnamesobjectsBaseDataControllersAjaxDataControllersDataController(scherrypys validatorss turbogearss formencodes col2attrnames FastDataGrids SelectResultssreswidgetssSQLObjectNotFounds simplejsonsINsEditForms join_itemssdatabasesDataControllers _mangle_rxs formmakersBaseDataControllersAjaxDataControllers SQLExpression((s2build\bdist.win32\egg\tgfastdata\datacontroller.pys?s          WPK79ܨtgfastdata/datawidgets.py#import logging import turbogears from turbogears import widgets, validators from turbogears.widgets.datagrid import DataGrid from sqlobject import SQLObject from turbogears.database import so_columns, so_joins #log = logging.getLogger("fastdata") class EditForm(widgets.TableForm): template = 'tgfastdata.templates.editform' class FastDataGrid(DataGrid): """Grid that displays SQLObject's SelectResults with add/edit/delete controls. """ css = [widgets.CSSLink(widgets.static, "grid.css")] template = "tgfastdata.templates.datagrid" params = ["show_actions", "show_add_link", "add_link_title", "delete_link_msg", "get_edit_url", "get_delete_url", "get_add_url"] add_link_title = "Add a record" show_actions = True show_add_link = True delete_link_msg = "Are you sure you want to delete this?" def __init__(self, fields=None, **kw): """Ctor. You can pass fields to control what and how is displayed to override sqlmeta. """ super(FastDataGrid, self).__init__([], **kw) self.fields = fields def get_add_url(): return lambda row=None: turbogears.url('add') get_add_url = staticmethod(get_add_url) def get_edit_url(): def _get_edit_url(row): return turbogears.url([str(row.id), 'edit']) return _get_edit_url get_edit_url = staticmethod(get_edit_url) def get_delete_url(): def _get_delete_url(row): return turbogears.url([str(row.id), 'delete']) return _get_delete_url get_delete_url = staticmethod(get_delete_url) def update_params(self, d): "Sets up headers based on the select results columns" fields = d.get('fields') or self.fields d['fields'] = self._prepare_fields(d['value'], fields) super(FastDataGrid, self).update_params(d) def _prepare_fields(self, value, fields): if hasattr(value, 'sourceClass'): # check if we have SelectResults columns_meta = so_columns(value.sourceClass) else: columns_meta = {} collist_raw = fields or columns_meta.keys() if not collist_raw: raise ValueError, 'no fields information can be found' if columns_meta: # transform old-style collist_raw to new-style if needed def f(col): if not (isinstance(col, tuple) or \ isinstance(col, DataGrid.Column)): # backward compatibility name = col # assume col is just a name of the column if columns_meta.has_key(name): column = columns_meta[name] # get columns' metadata header = column.title or column.name.capitalize() elif columns_meta.has_key(name + 'ID'): # key column column = columns_meta[name + 'ID'] header = column.title or column.name[:-2].capitalize() else: header = name # assume col is a property col = DataGrid.Column(name=name, title=header) return col collist_raw = [f(col) for col in collist_raw] return collist_raw #class LoggingValidator(validators.FancyValidator): # def _to_python(self, value, state): # log.debug('Type: %s' % type(value)) # log.debug('Unicode?: %s' % isinstance(value, unicode)) # log.debug('Repr: %s' % value.encode('utf-8')) # return value class EmptyStringConverter(validators.FancyValidator): """ Converts empty string to None value. Doesn't change any other values. """ def _to_python(self, value, state): if isinstance(value, basestring) and len(value) == 0: return None # Workaround for SQLObject quirk (bug?): # When setting an integer ForeignKey column, SO will accept a # numerical string but not unicode, so we try to convert to string. if isinstance(value, unicode): try: return value.encode() except: return value else: return value class SaneDateConverter(validators.DateConverter): """Converts string to dates and vice versa for DataCol columns. FIXME: This is crudely hacked to work in conjunction with CalendarDatePicker widget. Should really implement a proper DateConverter and submit it to FormEncode. """ month_style = 'dd.mm.yyy' format = '%d.%m.%Y' def __init__(self, format=None, **kw): if format: self.format = format super(SaneDateConverter, self).__init__(**kw) def _from_python(self, value, state): if self.if_empty is not validators.NoDefault and not value: return '' return value.strftime(self.format) class SaneCalendarDatePicker(widgets.CalendarDatePicker): """DatePicker wiget with nicer date format.""" format = '%d.%m.%Y' def __init__(self, format=None, **kw): if format: self.format = format super(SaneCalendarDatePicker, self).__init__(**kw) def option_selected(input_value, option_value): if hasattr(input_value, '__getitem__') and \ not isinstance(input_value, basestring): return option_value in [row.id for row in input_value] elif isinstance(input_value, SQLObject): return option_value==input_value.id else: return option_value==input_value class DataCheckBoxList(widgets.CheckBoxList): validator = validators.Set() def checked(self, input_value, option_value): return self._is_option_selected(option_value, input_value) def _is_option_selected(self, option_value, value): if option_selected(value, option_value): return True return False class JoinSelect(widgets.MultipleSelectField): validator = validators.Set() def checked(self, input_value, option_value): return self._is_option_selected(option_value, input_value) def _is_option_selected(self, option_value, value): if option_selected(value, option_value): return True return False class DataSelectField(widgets.SingleSelectField): def selected(self, input_value, option_value): return self._is_option_selected(option_value, input_value) def _is_option_selected(self, option_value, value): if option_selected(value, option_value): return True return False PKs)7**tgfastdata/datawidgets.pyc; Fc@sdkZdklZlZdklZdklZdklZl Z dei fdYZ defdYZ d ei fd YZd eifd YZd eifdYZdZdeifdYZdeifdYZdeifdYZdS(N(swidgetss validators(sDataGrid(s SQLObject(s so_columnssso_joinssEditFormcBstZdZRS(Nstgfastdata.templates.editform(s__name__s __module__stemplate(((s/build\bdist.win32\egg\tgfastdata\datawidgets.pysEditForm ss FastDataGridcBstZdZeieidgZdZddddddd gZd Z e Z e Z d Z ed Zd ZeeZdZeeZdZeeZdZdZRS(sPGrid that displays SQLObject's SelectResults with add/edit/delete controls. sgrid.cssstgfastdata.templates.datagrids show_actionss show_add_linksadd_link_titlesdelete_link_msgs get_edit_urlsget_delete_urls get_add_urls Add a records%Are you sure you want to delete this?cKs&tt|ig|||_dS(sdCtor. You can pass fields to control what and how is displayed to override sqlmeta. N(ssupers FastDataGridsselfs__init__skwsfields(sselfsfieldsskw((s/build\bdist.win32\egg\tgfastdata\datawidgets.pys__init__scCstdSdS(NcCs tidS(Nsadd(s turbogearssurl(srow((s/build\bdist.win32\egg\tgfastdata\datawidgets.pys$s(sNone(((s/build\bdist.win32\egg\tgfastdata\datawidgets.pys get_add_url#scCsd}|SdS(NcCs tit|idgSdS(Nsedit(s turbogearssurlsstrsrowsid(srow((s/build\bdist.win32\egg\tgfastdata\datawidgets.pys _get_edit_url(s(s _get_edit_url(s _get_edit_url((s/build\bdist.win32\egg\tgfastdata\datawidgets.pys get_edit_url's cCsd}|SdS(NcCs tit|idgSdS(Nsdelete(s turbogearssurlsstrsrowsid(srow((s/build\bdist.win32\egg\tgfastdata\datawidgets.pys_get_delete_url.s(s_get_delete_url(s_get_delete_url((s/build\bdist.win32\egg\tgfastdata\datawidgets.pysget_delete_url-s cCsM|idp|i}|i|d||d>tgfastdata/__init__.pyfrom datacontroller import DataController, AjaxDataController PKs)75%%tgfastdata/__init__.pyc; Fc@sdklZlZdS((sDataControllersAjaxDataControllerN(sdatacontrollersDataControllersAjaxDataController(sAjaxDataControllersDataController((s,build\bdist.win32\egg\tgfastdata\__init__.pys?sPK63!tgfastdata/templates/datagrid.kid
  ${col.title}
${col.get_field(row)}

${add_link_title}

PK7 0dd!tgfastdata/templates/editform.kid
 
PK6&tgfastdata/templates/form.kid Welcome to TurboGears ${form.display(obj, action=action)} PK6Z1ZZtgfastdata/templates/item.kid Welcome to TurboGears
Column Name Column Data
PK6+tgfastdata/templates/list.kid Welcome to TurboGears ${list_widget.display(data)} PK6<tgfastdata/templates/master.kid Your title goes here
PK6 tgfastdata/templates/__init__.pyPKs)7f!tgfastdata/templates/__init__.pyc; Fc@sdS(N((((s6build\bdist.win32\egg\tgfastdata\templates\__init__.pys?sPK6=tgfastdata/tests/formmodel.pyfrom sqlobject import * from sqlobject.inheritance import InheritableSQLObject from turbogears.database import PackageHub hub = PackageHub("turbogears.widgets.tests.formmodel") __connection__ = hub class Person(SQLObject): form_order = ["name", "age", "date", "friends","company", "status", "salary"] name = StringCol(title='Full Name') age = IntCol(default=30) date = DateCol() friends = RelatedJoin('Person', otherColumn="friend_id") company = ForeignKey('Company', title='Company', default=None) status = EnumCol(enumValues=['Employed','Unemployed'], default='Unemployed', title='Status') salary = FloatCol() def __unicode__(self): return unicode(self.name) class Company(SQLObject): name = UnicodeCol(title='Company name') employees = MultipleJoin('Person') def __unicode__(self): return self.name class TestStringColWithTitle(SQLObject): """ Test model for ticket #272 and #300 """ name = StringCol(title="This is the name") age = IntCol(title='Edad') class BaseSO(InheritableSQLObject): parent_col = StringCol() class ChildSO(BaseSO): child_col = StringCol() PKs)7„ tgfastdata/tests/formmodel.pyc; Fc@sdkTdklZdklZedZeZdefdYZdefdYZ defd YZ d efd YZ d e fd YZ dS((s*(sInheritableSQLObject(s PackageHubs"turbogears.widgets.tests.formmodelsPersoncBstZdddddddgZedd Zed d ZeZe d d dZ e dddd e Z edddgd dddZeZdZRS(Nsnamesagesdatesfriendsscompanysstatusssalarystitles Full NamesdefaultisPersons otherColumns friend_idsCompanys enumValuessEmployeds UnemployedsStatuscCst|iSdS(N(sunicodesselfsname(sself((s3build\bdist.win32\egg\tgfastdata\tests\formmodel.pys __unicode__s(s__name__s __module__s form_orders StringColsnamesIntColsagesDateColsdates RelatedJoinsfriendss ForeignKeysNonescompanysEnumColsstatussFloatColssalarys __unicode__(((s3build\bdist.win32\egg\tgfastdata\tests\formmodel.pysPersons ! sCompanycBs,tZeddZedZdZRS(Nstitles Company namesPersoncCs |iSdS(N(sselfsname(sself((s3build\bdist.win32\egg\tgfastdata\tests\formmodel.pys __unicode__s(s__name__s __module__s UnicodeColsnames MultipleJoins employeess __unicode__(((s3build\bdist.win32\egg\tgfastdata\tests\formmodel.pysCompanys sTestStringColWithTitlecBs,tZdZeddZeddZRS(s% Test model for ticket #272 and #300 stitlesThis is the namesEdad(s__name__s __module__s__doc__s StringColsnamesIntColsage(((s3build\bdist.win32\egg\tgfastdata\tests\formmodel.pysTestStringColWithTitle!s sBaseSOcBstZeZRS(N(s__name__s __module__s StringCols parent_col(((s3build\bdist.win32\egg\tgfastdata\tests\formmodel.pysBaseSO&ssChildSOcBstZeZRS(N(s__name__s __module__s StringCols child_col(((s3build\bdist.win32\egg\tgfastdata\tests\formmodel.pysChildSO)sN( s sqlobjectssqlobject.inheritancesInheritableSQLObjectsturbogears.databases PackageHubshubs__connection__s SQLObjectsPersonsCompanysTestStringColWithTitlesBaseSOsChildSO( shubsChildSOsCompanysBaseSOs PackageHubsPersonsTestStringColWithTitles__connection__sInheritableSQLObject((s3build\bdist.win32\egg\tgfastdata\tests\formmodel.pys?s   PK69vf**'tgfastdata/tests/test_datacontroller.pyimport turbogears import cherrypy import formmodel import turbogears.testutil as testutil import tgfastdata as fastdata class TestDataController(testutil.DBTest): model = formmodel class MyRoot(turbogears.controllers.RootController): test = fastdata.DataController( sql_class = formmodel.TestStringColWithTitle) def test_string_col_with_title(self): """ Test case for ticket #272 """ root = self.MyRoot() cherrypy.root = root cherrypy.tree.mount_points = {} print "\n\nRequest 1" testutil.createRequest("/test/") print cherrypy.response.body[0] assert "This is the name" in cherrypy.response.body[0] print "\n\nRequest 2" testutil.createRequest("/test/add") print cherrypy.response.body[0] assert "This is the name" in cherrypy.response.body[0] formmodel.TestStringColWithTitle(name="testName", age=25) testutil.createRequest("/test/1/edit") print cherrypy.response.body[0] assert "This is the name" in cherrypy.response.body[0] assert "testName" in cherrypy.response.body[0] testutil.createRequest("/test/1/show") print cherrypy.response.body[0] assert "testName" in cherrypy.response.body[0] PKs)76(tgfastdata/tests/test_datacontroller.pyc; Fc@sMdkZdkZdkZdkiZdkZdeifdYZdS(NsTestDataControllercBs3tZeZdeiifdYZdZRS(NsMyRootcBstZeideiZRS(Ns sql_class(s__name__s __module__sfastdatasDataControllers formmodelsTestStringColWithTitlestest(((s=build\bdist.win32\egg\tgfastdata\tests\test_datacontroller.pysMyRoot scCsK|i}|t_hti_dGHtidtii dGHdtii djpt dGHtidtii dGHdtii djpt t i ddd d tid tii dGHdtii djpt dtii djpt tid tii dGHdtii djpt d S(s Test case for ticket #272 s Request 1s/test/isThis is the names Request 2s /test/addsnamestestNamesageis /test/1/edits /test/1/showN( sselfsMyRootsrootscherrypystrees mount_pointsstestutils createRequestsresponsesbodysAssertionErrors formmodelsTestStringColWithTitle(sselfsroot((s=build\bdist.win32\egg\tgfastdata\tests\test_datacontroller.pystest_string_col_with_titles(       ( s__name__s __module__s formmodelsmodels turbogearss controllerssRootControllersMyRootstest_string_col_with_title(((s=build\bdist.win32\egg\tgfastdata\tests\test_datacontroller.pysTestDataControllers( s turbogearsscherrypys formmodelsturbogears.testutilstestutils tgfastdatasfastdatasDBTestsTestDataController(stestutilsfastdatas turbogearsscherrypys formmodelsTestDataController((s=build\bdist.win32\egg\tgfastdata\tests\test_datacontroller.pys?s     PK6"#C  !tgfastdata/tests/test_fastdata.py from sqlobject import SQLObject, StringCol, IntCol, connectionForURI from tgfastdata.datawidgets import FastDataGrid class FakeUser(SQLObject): _connection = connectionForURI("sqlite:///:memory:") userId = IntCol() name = StringCol() def _get_displayName(self): return self.name.capitalize() FakeUser.createTable() class TestFastDataGrid: def setup(self): self.grid = FastDataGrid(template = "tgfastdata.templates.datagrid") def test_dynamic_fields(self): fields = [ 'userId', 'displayName', ('Name', FakeUser._get_displayName), ('Name', 'displayName'), ] sr = FakeUser.select() d = dict(value=sr, fields=fields) self.grid.update_params(d) get_field = d['get_field'] assert ['userId', 'displayName', 'column-2', 'column-3'] == d['collist'] row = FakeUser(userId=123, name='john') assert 123 == get_field(row, 'userId') assert 'John' == get_field(row, 'displayName') assert 'John' == get_field(row, 'column-2') assert 'John' == get_field(row, 'column-3') def test_derive_fields_from_sr(self): sr = FakeUser.select() d = dict(value=sr) self.grid.update_params(d) get_field = d['get_field'] assert ['userId', 'name'] == d['collist'] row = FakeUser(userId=123, name='john') assert 123 == get_field(row, 'userId') assert 'john' == get_field(row, 'name') PKs)7E "tgfastdata/tests/test_fastdata.pyc; Fc@scdklZlZlZlZdklZdefdYZeidfdYZ dS((s SQLObjects StringColsIntColsconnectionForURI(s FastDataGridsFakeUsercBs/tZedZeZeZdZRS(Nssqlite:///:memory:cCs|iiSdS(N(sselfsnames capitalize(sself((s7build\bdist.win32\egg\tgfastdata\tests\test_fastdata.pys_get_displayName s( s__name__s __module__sconnectionForURIs _connectionsIntColsuserIds StringColsnames_get_displayName(((s7build\bdist.win32\egg\tgfastdata\tests\test_fastdata.pysFakeUsers   sTestFastDataGridcBs#tZdZdZdZRS(NcCstdd|_dS(Nstemplatestgfastdata.templates.datagrid(s FastDataGridsselfsgrid(sself((s7build\bdist.win32\egg\tgfastdata\tests\test_fastdata.pyssetupscCs dddtifddfg}ti}td|d|}|ii ||d}ddddg|d jpt tdd d d }d ||djpt d ||djpt d ||djpt d ||djpt dS(NsuserIds displayNamesNamesvaluesfieldss get_fieldscolumn-2scolumn-3scollisti{snamesjohnsJohn( sFakeUsers_get_displayNamesfieldssselectssrsdictsdsselfsgrids update_paramss get_fieldsAssertionErrorsrow(sselfsdsfieldsssrs get_fieldsrow((s7build\bdist.win32\egg\tgfastdata\tests\test_fastdata.pystest_dynamic_fieldss!  $cCsti}td|}|ii||d}ddg|djpt tdddd}d||djpt d||djpt dS(Nsvalues get_fieldsuserIdsnamescollisti{sjohn( sFakeUsersselectssrsdictsdsselfsgrids update_paramss get_fieldsAssertionErrorsrow(sselfsdssrs get_fieldsrow((s7build\bdist.win32\egg\tgfastdata\tests\test_fastdata.pystest_derive_fields_from_sr%s  (s__name__s __module__ssetupstest_dynamic_fieldsstest_derive_fields_from_sr(((s7build\bdist.win32\egg\tgfastdata\tests\test_fastdata.pysTestFastDataGrids  N( s sqlobjects SQLObjects StringColsIntColsconnectionForURIstgfastdata.datawidgetss FastDataGridsFakeUsers createTablesTestFastDataGrid(s SQLObjectsconnectionForURIs FastDataGridsIntCols StringColsFakeUsersTestFastDataGrid((s7build\bdist.win32\egg\tgfastdata\tests\test_fastdata.pys?s  PK6HUII"tgfastdata/tests/test_formmaker.pyfrom turbogears.testutil import DBTest import formencode from tgfastdata import formmaker from turbogears import validators from turbogears import widgets import formmodel class TestSQLObjectWidgets(DBTest): model = formmodel def test_simpleWidgets(self): fields = formmaker.fields_for(formmodel.Person) assert len(fields) == 7 assert fields[1].name == "age" assert fields[1].default == 30 assert isinstance(fields[1].validator, validators.Int) assert fields[0].label == "Full Name" assert isinstance(fields[2], widgets.CalendarDatePicker) assert fields[3].name == "friends" assert isinstance(fields[3].validator, formencode.ForEach) assert fields[4].name == "company" assert len(fields[4].options) > 0 assert fields[5].name == "status" assert isinstance(fields[5], widgets.SingleSelectField) assert isinstance(fields[5].validator, validators.OneOf) assert fields[6].name == "salary" assert isinstance(fields[6].validator, validators.Number) def test_inheritable_so(self): fields = formmaker.fields_for(formmodel.ChildSO) assert len(fields) == 2 # Quick test of name capitalization ltests = ( ('first_name', "First Name"), ('firstName', "First Name"), ('ADDRESS1', "Address1"), ('email', "Email"), ('secureID', "Secure Id"), ('PhoneNO', "Phone No"), ('floor1id', "Floor1id"), ) for ltest in ltests: # print "'%s' --> '%s (%s)'" % (ltest[0], formmaker.name2label(ltest[0]), ltest[1]) assert formmaker.name2label(ltest[0]) == ltest[1] PKs)7eP P #tgfastdata/tests/test_formmaker.pyc; Fc@sdklZdkZdklZdklZdklZdkZdefdYZ ddfd dfd d fd d fddfddfddffZ x3e D]+Z ei e de djpt qWdS((sDBTestN(s formmaker(s validators(swidgetssTestSQLObjectWidgetscBs tZeZdZdZRS(NcCstiti}t|djpt|didjpt|didjptt |di t i pt|di djptt |dtipt|did jptt |di tipt|d id jptt|d idjpt|d id jptt |d tiptt |d i t ipt|didjptt |di t iptdS(Niisageiis Full Nameiisfriendsiscompanyisstatusissalary(s formmakers fields_fors formmodelsPersonsfieldsslensAssertionErrorsnamesdefaults isinstances validators validatorssIntslabelswidgetssCalendarDatePickers formencodesForEachsoptionssSingleSelectFieldsOneOfsNumber(sselfsfields((s8build\bdist.win32\egg\tgfastdata\tests\test_formmaker.pystest_simpleWidgets s !!!!cCs0titi}t|djptdS(Ni(s formmakers fields_fors formmodelsChildSOsfieldsslensAssertionError(sselfsfields((s8build\bdist.win32\egg\tgfastdata\tests\test_formmaker.pystest_inheritable_sos(s__name__s __module__s formmodelsmodelstest_simpleWidgetsstest_inheritable_so(((s8build\bdist.win32\egg\tgfastdata\tests\test_formmaker.pysTestSQLObjectWidgetss s first_names First Names firstNamesADDRESS1sAddress1semailsEmailssecureIDs Secure IdsPhoneNOsPhone Nosfloor1idsFloor1idii(sturbogears.testutilsDBTests formencodes tgfastdatas formmakers turbogearss validatorsswidgetss formmodelsTestSQLObjectWidgetssltestssltests name2labelsAssertionError( sltestss formencodes formmodels formmakersTestSQLObjectWidgetsswidgetssltests validatorssDBTest((s8build\bdist.win32\egg\tgfastdata\tests\test_formmaker.pys?s      E PK6tgfastdata/tests/__init__.pyPKs)7V$tgfastdata/tests/__init__.pyc; Fc@sdS(N((((s2build\bdist.win32\egg\tgfastdata\tests\__init__.pys?sPKs)72EGG-INFO/dependency_links.txtPKs)7ݡBB<EGG-INFO/entry_points.txtPK62EGG-INFO/not-zip-safePKs)7cEGG-INFO/PKG-INFOPKs)79ۥEGG-INFO/requires.txtPKs)7zQNNXEGG-INFO/SOURCES.txtPKs)7a`H EGG-INFO/top_level.txtPK6WCM3M3tgfastdata/datacontroller.pyPKs)7XE==;tgfastdata/datacontroller.pycPK79ܨytgfastdata/datawidgets.pyPKs)7**^tgfastdata/datawidgets.pycPK6  ltgfastdata/formmaker.pyPK65%LLtgfastdata/plugin.pyPKs)7zegg=tgfastdata/plugin.pycPK7$tgfastdata/release.pyPKs)7otgfastdata/release.pycPK61Dd]>>Itgfastdata/__init__.pyPKs)75%%tgfastdata/__init__.pycPK63!tgfastdata/templates/datagrid.kidPK7 0dd!*tgfastdata/templates/editform.kidPK6&tgfastdata/templates/form.kidPK6Z1ZZtgfastdata/templates/item.kidPK6+Rtgfastdata/templates/list.kidPK6<?tgfastdata/templates/master.kidPK6 Htgfastdata/templates/__init__.pyPKs)7f!tgfastdata/templates/__init__.pycPK6=Ktgfastdata/tests/formmodel.pyPKs)7„ tgfastdata/tests/formmodel.pycPK69vf**'( tgfastdata/tests/test_datacontroller.pyPKs)76(tgfastdata/tests/test_datacontroller.pycPK6"#C  !tgfastdata/tests/test_fastdata.pyPKs)7E "tgfastdata/tests/test_fastdata.pycPK6HUII";*tgfastdata/tests/test_formmaker.pyPKs)7eP P #0tgfastdata/tests/test_formmaker.pycPK6U;tgfastdata/tests/__init__.pyPKs)7V$;tgfastdata/tests/__init__.pycPK$$[ L<