##|TYPE Template
##|UNIQUEID 91678e47-f988-4621-860e-ccb7e6c486b9
##|TITLE Turbogears Crud
##|NAMESPACE
##|SOURCE_TYPE Source
##|OUTPUT_LANGUAGE C#
##|GUI_ENGINE Microsoft Script
##|GUI_LANGUAGE VBScript
##|GUI_BEGIN
Dim lblAdd
Dim cmbDatabases
Dim cmbTables
Dim lblColumns
Dim lstColumns
Dim lblOrderBy
Dim cmbOrderDir
Dim lblEditColumns
Dim lstEditColumns
Dim lblSearchColumns
Dim chkWebConfig
Dim lblCulture
Dim cmbCulture
Sub setup()
If Not input.Contains("cmbTables") Or Not input.Contains("txtPath") Then
ui.Title = "Turbogears Crud Grid"
ui.Width = 480
ui.Height = 480
' Grab default output path
Dim sOutputPath
DIM sOutputProject
sOutputProject = "project1"
sOutputPath = ""
If input.Contains("defaultOutputPath") Then
sOutputPath = input.Item("defaultOutputPath")
End If
ui.AddLabel "lblPath", "Output file path: ", "Select the output path."
ui.AddTextBox "txtPath", sOutputPath, "Select the Output Path."
ui.AddLabel "lblProject", "ProjectName: ", "Select the Project Name."
ui.AddTextBox "txtProjectName", sOutputProject, "Define your Project Name."
ui.AddFilePicker "btnPath", "Select Path", "Select the Output Path.", "txtPath", true
' List Databases in a ComboBox
ui.AddLabel "lblDatabases", "Select a database:", "Select a database in the dropdown below."
Set cmbDatabases = ui.AddComboBox("cmbDatabase", "Select a database.")
' List Tables in a ComboBox
ui.AddLabel "lblTables", "Select a table:", "Select a table in the dropdown below."
Set cmbTables = ui.AddComboBox("cmbTables", "Select a table.")
cmbTables.Item("Alerts") = "Alerts"
cmbTables.SelectedValue = "Alerts"
cmbTables.AttachEvent "onchange", "cmbTables_onchange"
' List Columns in a listbox
Set lblColumns = ui.AddLabel("lblColumns", "Columns in Grid:", "")
Set lstColumns = ui.AddListBox ("lstColumns", "Select which columns you wish to see in the DataGrid")
' List Columns in a listbox
Set lblEditColumns = ui.AddLabel("lblEditColumns", "Columns for viewing/editing:", "")
Set lstEditColumns = ui.AddListBox ("lstEditColumns", "Select which columns are editable when adding/updating records, or which are viewed when not in admin mode.")
' set list dimensions
lstColumns.Height = 120
lstColumns.Width = 225
lblColumns.Width = 225
lstEditColumns.Height = 120
lstEditColumns.Width = 225
lblEditColumns.Width = 225
' position edit columns list
lstEditColumns.Top = lstColumns.Top
lstEditColumns.Left = lstColumns.Left + lstColumns.Width
lblEditColumns.Top = lblColumns.Top
lblEditColumns.Left = lblColumns.Left + lblColumns.Width
' checkbox for web.config
'Set chkWebConfig = ui.AddCheckBox("chkWebConfig", "Custom Web.Config", true, "Use custom setting in Web.Config to connect to database (not the default dbConnection under appSettings)")
'chkWebConfig.Width = 150
' Attach the onchange event to the cmbDatabases control.
setupDatabaseDropdown cmbDatabases
cmbDatabases.AttachEvent "onchange", "cmbDatabases_onchange"
ui.ShowGUI = true
Else
ui.ShowGUI = false
End if
End Sub
Sub setupDatabaseDropdown(cmbDatabases)
cmbDatabases.BindData MyMeta.Databases
If IsObject(MyMeta.DefaultDatabase) Then
cmbDatabases.SelectedValue = MyMeta.DefaultDatabase.Name
bindTables cmbDatabases.SelectedValue
End If
End Sub
Sub bindTables(sDatabase)
Set db = MyMeta.Databases.Item(sDatabase)
cmbTables.BindData(db.Tables)
End Sub
' Event Handler
Sub cmbDatabases_onchange(control)
Set cmbDatabases = ui.item("cmbDatabase")
bindTables cmbDatabases.SelectedText
End Sub
' Event Handler
Sub cmbTables_onchange(control)
Dim table
Set cmbDatabases = ui.item("cmbDatabase")
Set cmbTables = ui.item("cmbTables")
Set table = MyMeta.Databases.Item(cmbDatabases.SelectedText).Tables.Item(cmbTables.SelectedText)
lstColumns.BindData(table.Columns)
lstEditColumns.BindData(table.Columns)
End Sub
##|GUI_END
##|BODY_MODE Markup
##|BODY_ENGINE Microsoft Script
##|BODY_LANGUAGE VBScript
##|BODY_TAG_START <%
##|BODY_TAG_END %>
##|BODY_BEGIN
<%
' -----------------------------------------------------------------------------
' Turbogears Crud
' Last Update: 18. Juli 2008
' Author: Ivo Looser
'
'-----------------------------------------------------------------------------
Dim cultureFormat
Dim dateRegExp
Dim dateFormat
Dim database
Dim tableName
Dim columnNames
Dim objTable
Dim columnName
Dim editColumnNames
Dim objColumn
Dim tableAlias
Dim primaryKey
Dim primaryKeyAlias
Dim webConfig
Dim orderDir
Dim orderBy
Dim orderByAlias
Dim intLp
Dim foreignTable
Dim buffer
Dim projectName
' get database from combo list
Set database = MyMeta.Databases.Item(input.Item("cmbDatabase"))
' get table name from combolist
tableName = input.Item("cmbTables")
' get list of columns
Set columnNames = input.Item("lstColumns")
Set editColumnNames = input.Item("lstEditColumns")
' get table
Set objTable = database.Tables.Item(tableName)
' get table alias
tableAlias = objTable.Alias
' get primary key for table
primaryKey = objTable.PrimaryKeys.Item(0).Name
' primary key alias
primaryKeyAlias = objTable.PrimaryKeys.Item(0).Alias
projectName = input.item("txtProjectName")
strProcNameInsert = "usp_Insert" & objTable.Name
strProcNameUpdate = "usp_Update" & objTable.Name
strProcNameDelete = "usp_Delete" & objTable.Name
strProcLoadByPrimaryKey = "usp_Get" & objTable.Name & "LoadByPrimaryKey"
For Each objColumn in objTable.Columns
If objColumn.IsInPrimaryKey Then
Dim cPrimaryKey
cPrimaryKey = objColumn
End If
Next
SaveOutput FilePath(CamelCase(tableAlias) + "Controller/templates/__init__.py")
%>from controllers import <%=CamelCase(tableAlias)%>Controller
<%
SaveOutput FilePath(CamelCase(tableAlias) + "Controller/__init__.py")
%>
from turbogears import controllers, expose, redirect
from turbogears import validate, validators, flash, error_handler
from turbogears.database import session
from <%=projectName%>.model import <%=CamelCase(tableAlias)%>
from tw.api import WidgetsList
from tw.forms import DataGrid, TableForm
# fields for Widgets
from tw.forms.fields import *
# Requirements for Logging
import logging
log = logging.getLogger("<%=projectName%>")
# Sample for Date Localization
#from turbogears import i18n
#def getdate(self):
# return i18n.format.format_date(self.date)
# Sample User Callable
#def getuser(self):
# if self.users:
# return self.users.user_name
# else:
# return ""
def FieldFrom<%=CamelCase(tableAlias)%>():
return [
<%
Dim cListString
cListString = ""
' Loop through columns in table
For Each objColumn in objTable.Columns
If InColumns(objColumn) Then
cListString = cListString & " ('" & GetAlias(objColumn) & "','" & objColumn & "')," & vbCrLf
End If
Next
output.write Left(cListString, Len(cListString)-3)
%>
]
class <%=CamelCase(tableAlias)%>Fields(WidgetsList):
<%
For Each objColumn in objTable.Columns
'output.write vbCrLf & " # Column: " & GetAlias(objColumn) & " -> Type: " & objColumn.DataTypeName & "MaxLength: " & objColumn.CharacterMaxLength & vbCrLf
If objColumn.IsInPrimaryKey Then
output.write " " & objColumn & " = HiddenField(name='" & objColumn & "')" & vbCrLf
elseif InEditColumns(objColumn) Then
'output.write "Column Name - " & GetName(objColumn) & ":" & objColumn.DataTypeName & ":len" & objColumn.CharacterMaxLength & vbCrLf
if objColumn.DataTypeName = "int" or objColumn.DataTypeName = "smallint" Then 'and (not objColumn.IsInForeignKey) then 'objColumn.IsNullable
If objColumn.IsNullable Then
output.write " " & objColumn & " = TextField('" & objColumn & "', label='" & GetAlias(objColumn) & ":', attrs={'size':3})" & vbCrLf
else
output.write " " & objColumn & " = TextField('" & objColumn & "', label='" & GetAlias(objColumn) & ":', validator=validators.NotEmpty, attrs={'size':3})" & vbCrLf
End if
elseIf objColumn.DataTypeName = "int" and objColumn.IsInForeignKey Then
' Is ForeignKey
Set objForeignTable = objColumn.ForeignKeys.Item(0).PrimaryTable
output.write " " & objColumn & " = SingleSelectField(""" & objColumn & """, label='" & GetAlias(objColumn) & ":', validator=validators.NotEmpty,"
output.write "options = get" & objForeignTable.Name & "options)" & vbCrLf
ElseIf objColumn.DataTypeName = "DATETIME" Then
If objColumn.IsNullable Then
output.write " " & objColumn & " = CalendarDatePicker(label='" & GetAlias(objColumn) & ":') #CalendarDateTimePicker(label='Datum:', format=""%d.%m.%Y %H:%M"")" & vbCrLf
else
output.write " " & objColumn & " = CalendarDatePicker(label='" & GetAlias(objColumn) & ":',validator=validators.NotEmpty()) #CalendarDateTimePicker(label='Datum:', format=""%d.%m.%Y %H:%M"")" & vbCrLf
End if
ElseIf objColumn.DataTypeName = "TINYINT" then
output.write " " & objColumn & " = CheckBox(label='" & objColumn & ":',validator=validators.Bool())" & vbCrLf
ElseIf objColumn.CharacterMaxLength > 255 Then
If objColumn.IsNullable Then
output.write " " & objColumn & " = TextArea('" & objColumn & "', label='" & GetAlias(objColumn) & ":')" & vbCrLf
Else
output.write " " & objColumn & " = TextArea('" & objColumn & "', label='" & GetAlias(objColumn) & ":', validator=validators.NotEmpty)" & vbCrLf
End if
ElseIf objColumn.CharacterMaxLength <= 255 Then
If objColumn.IsNullable Then
output.write " " & objColumn & " = TextField('" & objColumn & "', label='" & GetAlias(objColumn) & ":')" & vbCrLf
Else
output.write " " & objColumn & " = TextField('" & objColumn & "', label='" & GetAlias(objColumn) & ":', validator=validators.NotEmpty)" & vbCrLf
End if
End If
End If
Next
%>
class <%=CamelCase(tableAlias)%>Schema(WidgetsList):
"""
separate validation schema from the fields definition
make it possible to define a more complex schema
that involves field dependency or logical operators
"""
#group = validators.String(not_empty=True, max=16)
#url = validators.URL(add_http=True, check_exists=True)
class <%=CamelCase(tableAlias)%>Form(TableForm):
#name="Group"
fields = <%=CamelCase(tableAlias)%>Fields()
#validator = <%=CamelCase(tableAlias)%>Schema() # define schema outside of GroupFields
#method="post"
submit_text = "Create"
model_form = <%=CamelCase(tableAlias)%>Form()
class <%=CamelCase(tableAlias)%>Controller(controllers.Controller):
"""Basic model admin interface"""
modelname="<%=CamelCase(tableAlias)%>"
@expose()
def default(self, tg_errors=None):
"""handle non exist urls"""
raise redirect("list")
#require = identity.in_group("admin")
@expose()
def index(self):
raise redirect("list")
@expose(template='genshi:<%=projectName%>.<%=CamelCase(tableAlias)%>Controller.templates.list')
def list(self):
"""List records in model"""
log.debug("List <%=CamelCase(tableAlias)%> ...")
grid = DataGrid("Grid<%=CamelCase(tableAlias)%>",
template='<%=projectName%>.<%=CamelCase(tableAlias)%>Controller.templates.datagrid',
fields=FieldFrom<%=CamelCase(tableAlias)%>())
records = [g for g in session.query(<%=CamelCase(tableAlias)%>)]
return dict(modelname = self.modelname, records = records, context=grid)
@expose(template='genshi:<%=projectName%>.<%=CamelCase(tableAlias)%>Controller.templates.new')
def new(self, **kw):
"""Create new records in model"""
return dict(modelname = self.modelname, context = model_form)
@expose(template='genshi:<%=projectName%>.<%=CamelCase(tableAlias)%>Controller.templates.edit')
def edit(self, id, **kw):
"""Edit record in model"""
try:
record = session.query(<%=CamelCase(tableAlias)%>).get(int(id))
except:
flash = "Not valid edit"
return dict(modelname = self.modelname,
record = record,
context = model_form)
@expose()
def delete(self, id=0):
session.begin()
<%=LCase(tableAlias)%> = session.query(<%=CamelCase(tableAlias)%>).get(id)
session.delete(<%=LCase(tableAlias)%>)
session.commit()
flash("<%=CamelCase(tableAlias)%> was successfully destroyed.")
raise redirect("list")
#@validate(model_form)
@error_handler(new)
@expose()
def saveadd(self, **kw):
"""Create record to model"""
#create
session.begin()
<%=CamelCase(tableAlias)%>(**kw)
session.commit()
flash("<%=CamelCase(tableAlias)%> was successfully created.")
raise redirect("list")
#@validate(model_form)
@error_handler(new)
@expose()
def saveedit(self, id=None, **kw):
"""Save record to model"""
#update
record = session.query(<%=CamelCase(tableAlias)%>).get(int(id))
for attr in kw:
setattr(record, attr, kw[attr])
flash("<%=CamelCase(tableAlias)%> was successfully updated.")
raise redirect("list")
<%
SaveOutput FilePath(CamelCase(tableAlias) + "Controller/controllers.py")
%>
| ${col.title} | ||
|---|---|---|
| edit | delete | ${col.get_field(row)} |