def update(self):
     self.buttons = button.Buttons(
         self.buttons,
         button.Button('catalogupdate', _(u'Catalog Update')),
         button.Button('reindex', _(u'Catalog Reindex')),
         button.Button('unindex', _(u'Catalog Unindex')))
     super(SQLTypeOverviewForm, self).update()
class IFieldSQLBehavior(model.Schema):

    sql_column = schema.Choice(
        title=_(u"label_column", default=u"Column"),
        description=_(
            u"help_column",
            default=u"Corresponding column in database source table."),
        required=False,
        vocabulary="collective.behavior.sql.AvailableSQLAlchemyColumns")
class ISQLContent(model.Schema):
    """Add SQL content"""

    sql_id = schema.Choice(
        title=_(u"label_sql_id", default=u"SQL Item ID"),
        description=_(u"help_sql_id_column",
                      default=u"The ID of the SQL content item"),
        required=False,
        vocabulary="collective.behavior.sql.AvailableSQLAlchemyItemIDs")

    form.omitted('sql_virtual')
    sql_virtual = schema.Bool(title=_(u"label_sql_virtual",
                                      default=u"SQL Virtual"),
                              default=False)
Example #4
0
class ITestForm(form.Schema):
    """ Define form fields """

    connection = schema.Choice(title=_(u"label_connection",
                                       default=u"Connection"),
                               vocabulary=SimpleVocabulary([]))

    table = schema.Choice(title=_(u"label_table", default=u"Table"),
                          required=False,
                          values=[u'a', u'b', u'c'])

    columns = schema.List(title=_(u"label_columns", default=u"Columns"),
                          required=False,
                          value_type=schema.Choice(values=[]))
class SQLTypeDataListingPage(SQLTypeFormLayout):
    label = _(u'Data')
    form = SQLTypeDataListingForm

    @property
    def tabs(self):
        return super(SQLTypeDataListingPage, self).tabs
Example #6
0
class ISQLTypeSettings(ITypeSettings):

    sql_connection = schema.Choice(
        title=_(u"label_connection", default=u"Connection"),
        vocabulary="collective.behavior.sql.AvailableSQLAlchemyConnections"
        )

    sql_table = schema.Choice(
        title=_(u"label_table", default=u"Table"),
        required=False,
        vocabulary="collective.behavior.sql.AvailableSQLAlchemyTables"
        )
    
    sql_id_column = schema.Choice(
        title=_(u"label_id_column", default=u"ID Column"),
        description=_(u"help_id_column", default=u"The PrimaryKey column that will give the id to the item."),
        required=False,
        vocabulary="collective.behavior.sql.AvailableSQLAlchemyColumnsUnique"
        )
    
    sql_WHERE = schema.TextLine(
        title=_(u"label_sql_WHERE", default=u"WHERE"),
        description=_(u"help_sql_WHERE", default=u"Use a custom WHERE clause to filter the sql table. You must specify only the WHERE clause and not the whole query clause. Example:type = 'public'"),
        required=False,
        )
    
    sql_modification_timestamp_column = schema.Choice(
        title=_(u"label_sql_modification_timestamp_column", default=u"Modification date time column"),
        description=_(u"help_sql_modification_timestamp_column", default=u"The last modificaion date time column that will be taken into account to know which items have to be updated in the catalog."),
        required=False,
        vocabulary="collective.behavior.sql.AvailableSQLAlchemyTimestampColumns"
        )
    
    sql_modification_last_timestamp = schema.Datetime(
        title=_(u"label_sql_modification_last_timestamp", default=u"Last modification date time"),
        description=_(u"help_sql_modification_last_timestamp", default=u"Modification date of the last modified item in the selected table."),
        required=False,
        )

    sql_folder_id = schema.Choice(
        title=_(u'label_sql_folder_id', default=u'Folder for SQL items'),
        description=_(u"help_sql_folder_id", default=u"Choose a folder where the sql items will be located. If empty, a virtual folder named 'data-'+ type.id will be registered."),
        required=False,
        source=CatalogSource(portal_type=['Folder'])
        )
 def tabs(self):
     tabs = super(SQLTypeFormLayout, self).tabs
     tabs += ((_('Data'), '@@data'),)
     return tabs
 def tabs(self):
     tabs = super(SQLTypeBehaviorsPage, self).tabs
     tabs += ((_('Data'), '@@data'),)
     return tabs
Example #9
0
 def tabs(self):
     tabs = super(SQLTypeOverviewPage, self).tabs
     tabs += ((_('Data'), '@@data'), )
     return tabs
Example #10
0
 def update(self):
     self.buttons = button.Buttons(
         self.buttons, button.Button('catalogupdate', _(u'Catalog Update')),
         button.Button('reindex', _(u'Catalog Reindex')),
         button.Button('unindex', _(u'Catalog Unindex')))
     super(SQLTypeOverviewForm, self).update()
 def tabs(self):
     tabs = super(SQLTypeFieldsPage, self).tabs
     tabs += ((_('Data'), '@@data'), )
     return tabs
    @property
    def tabs(self):
        tabs = super(SQLTypeFieldsPage, self).tabs
        tabs += ((_('Data'), '@@data'), )
        return tabs

    @property
    def form(self):
        if self.context.fti.hasDynamicSchema:
            return SQLEnhancedSchemaListing
        else:
            return ReadOnlySchemaListing


TupleFactory = FieldFactory(schema.Tuple,
                            _(u'label_tuple_field', default=u'Tuple'),
                            value_type=schema.Choice(values=[]))


class ITuple(schema.interfaces.ITuple, schema.interfaces.IFromUnicode):
    pass


class SQLCollectionTermsVocabulary(CollectionTermsVocabulary):
    """ITerms adapter for zope.schema.ICollection based implementations using
    vocabulary."""

    zope.component.adapts(ISQLDexterityItem, iz3cform.IFormLayer,
                          zope.interface.Interface,
                          zope.schema.interfaces.ICollection,
                          zope.schema.interfaces.IBaseVocabulary,
 def tabs(self):
     tabs = super(SQLTypeOverviewPage, self).tabs
     tabs += ((_('Data'), '@@data'),)
     return tabs
Example #14
0
class TestView(form.Form):
    ignoreContext = True
    template = ViewPageTemplateFile('templates/sql_test.pt')

    def __init__(self, context, request):
        super(TestView, self).__init__(context, request)
        self.saconnect = ISQLAlchemyConnectionStrings(
            component.getUtility(ISiteRoot))
        self.Base = None
        self.tablesVoc = []
        self.table = []
        self.columnsVoc = []
        self.columns = []
        self.items = []

    def updateFields(self):
        fields = field.Fields(ITestForm)
        connections = []
        for name, url in self.saconnect.items():
            connections.append(SimpleTerm(url, url, name))
        fields['connection'].field.vocabulary = SimpleVocabulary(connections)
        if len(connections) == 1:
            if self.Base == None:
                self.initBase(connections[0].value)
            self.tablesVoc = self.getTables()
            fields['table'].field.vocabulary = SimpleVocabulary.fromValues(
                self.tablesVoc)
            if len(self.tablesVoc) == 1:
                self.columnsVoc = self.getColumns(self.tablesVoc[0])
                fields[
                    'columns'].field.value_type.vocabulary = SimpleVocabulary.fromValues(
                        self.columnsVoc)
                fields['columns'].field.default = fields[
                    'columns'].field.values
        self.fields = fields

    def update(self):
        self.updateFields()
        self.updateWidgets()
        data, errors = self.extractData()
        table = data.get('table')
        if data.get('connection'):
            if self.Base == None:
                self.initBase(data.get('connection'))
            if not self.tablesVoc:
                self.tablesVoc = self.getTables()
            self.fields[
                'table'].field.vocabulary = SimpleVocabulary.fromValues(
                    self.tablesVoc)
            if len(self.tablesVoc) == 1 and table == None:
                table = self.tablesVoc[0]
        if table:
            if not self.columnsVoc:
                self.columnsVoc = self.getColumns(table)
            self.fields[
                'columns'].field.value_type.vocabulary = SimpleVocabulary.fromValues(
                    self.columnsVoc)
#            self.fields['columns'].field.value_type.default = self.columnsVoc
        super(TestView, self).update()

    def initBase(self, url):
        engine = create_engine(url, echo=True)
        self.Base = automap_base(bind=engine)

    def getTables(self):
        conn = self.Base.metadata.bind.connect()
        return self.Base.metadata.bind.engine.table_names([], connection=conn)

    def getColumns(self, table):
        self.Base.metadata.reflect(only=[table])
        return [a.name for a in self.Base.metadata.tables[table].c]

    def getItems(self, table, columns):
        self.Base.prepare(self.Base.metadata.bind)
        Session = scoped_session(
            sessionmaker(bind=self.Base.metadata.bind,
                         extension=ZopeTransactionExtension()))
        session = Session()
        item = getattr(self.Base.classes, table, None)
        return session.query(item).all()

    @button.buttonAndHandler(_('Apply'), name='apply')
    def handleApply(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return
        if data.get('table') and data.get('columns'):
            self.table = data.get('table')
            self.columns = data.get('columns')
            self.items = self.getItems(self.table, self.columns)
            # limit size of the preview for text areas
            if hasattr(widget, 'rows'):
                if widget.rows is None or widget.rows > 5:
                    widget.rows = 5

        return form.Form.render(self)


class SQLTypeFieldsPage(TypeFieldsPage):
    
    @property
    def tabs(self):
        tabs = super(SQLTypeFieldsPage, self).tabs
        tabs += ((_('Data'), '@@data'),)
        return tabs

    @property
    def form(self):
        if self.context.fti.hasDynamicSchema:
            return SQLEnhancedSchemaListing
        else:
            return ReadOnlySchemaListing


TupleFactory = FieldFactory(
    schema.Tuple, _(u'label_tuple_field', default=u'Tuple'))

class ITuple(schema.interfaces.ITuple,
              schema.interfaces.IFromUnicode):
    pass
Example #16
0
 def tabs(self):
     tabs = super(SQLTypeFormLayout, self).tabs
     tabs += ((_('Data'), '@@data'), )
     return tabs