Example #1
0
    def rowstyle(self, form, fields, *args, **kwargs):
        """
            Formstyle for subform edit-rows, using a vertical
            formstyle because multiple fields combined with
            location-selector are too complex for horizontal
            layout.
        """

        # Use standard foundation formstyle
        from s3theme import formstyle_foundation as formstyle
        if args:
            col_id = form
            label = fields
            widget, comment = args
            hidden = kwargs.get("hidden", False)
            return formstyle(col_id, label, widget, comment, hidden)
        else:
            parent = TD(_colspan=len(fields))
            for col_id, label, widget, comment in fields:
                parent.append(formstyle(col_id, label, widget, comment))
            return TR(parent)
Example #2
0
    def rowstyle(self, form, fields, *args, **kwargs):
        """
            Formstyle for subform edit-rows, using a vertical
            formstyle because multiple fields combined with
            location-selector are too complex for horizontal
            layout.
        """

        # Use standard foundation formstyle
        from s3theme import formstyle_foundation as formstyle
        if args:
            col_id = form
            label = fields
            widget, comment = args
            hidden = kwargs.get("hidden", False)
            return formstyle(col_id, label, widget, comment, hidden)
        else:
            parent = TD(_colspan = len(fields))
            for col_id, label, widget, comment in fields:
                parent.append(formstyle(col_id, label, widget, comment))
            return TR(parent)
Example #3
0
    def _manage_subscriptions(self, resources, filters):
        """
            Custom form to manage subscriptions

            @param resources: available resources config
            @param filters: filter widgets
        """

        # Uses Default Eden formstyle
        from s3theme import formstyle_foundation as formstyle
        from gluon.validators import IS_IN_SET
        from s3.s3widgets import S3GroupedOptionsWidget, S3MultiSelectWidget
        from s3layouts import S3PopupLink

        # L10n
        T = current.T
        db = current.db
        s3db = current.s3db
        response = current.response
        labels = Storage(
            #RESOURCES = T("Subscribe To"),
            #NOTIFY_ON = T("Notify On"),
            #FREQUENCY = T("Frequency"),
            NOTIFY_BY = T("Notify By"),
            #MORE = T("More Options"),
            #LESS = T("Less Options"),
        )
        messages = Storage(
            ERROR = T("Error: could not update notification settings"),
            SUCCESS = T("Notification settings updated"),
        )

        # Get current subscription settings resp. form defaults
        subscription = self._get_subscription()

        # Initialize form
        form = FORM(_id="subscription-form",
                    hidden={"subscription-filters": ""})

        # Filters
        filter_form = S3FilterForm(filters, clear=False)
        fieldset = FIELDSET(filter_form.fields(None,
                                               subscription["get_vars"]),
                            _id="subscription-filter-form")
        form.append(fieldset)

        # Notification options
        rows = []
        stable = s3db.pr_subscription

        selector = S3GroupedOptionsWidget(cols=1)
        # Deactivated trigger selector
        #rows.append(("trigger_selector__row",
        #             "%s:" % labels.NOTIFY_ON,
        #             selector(stable.notify_on,
        #                      subscription["notify_on"],
        #                      _id="trigger_selector"),
        #             ""))

        #switch = S3GroupedOptionsWidget(cols=1, multiple=False, sort=False)
        # Deactivated: frequency selector
        #rows.append(("frequency_selector__row",
        #             "%s:" % labels.FREQUENCY,
        #             switch(stable.frequency,
        #                    subscription["frequency"],
        #                    _id="frequency_selector"),
        #             ""))

        methods = [("EMAIL", T("Email")),
                   ("SMS", T("SMS")),
                   ("Sync", T("FTP")),
                   ]

        method_options = Storage(name = "method", requires = IS_IN_SET(methods))

        rows.append(("method_selector__row",
                     "%s:" % labels.NOTIFY_BY,
                     selector(method_options,
                              subscription["method"],
                              _id="method_selector"),
                     ""))

        # Sync Row
        properties = subscription["comments"]
        if properties:
            properties = json.loads(properties)

        synctable = s3db.sync_repository
        query = (synctable.apitype == "ftp") & \
                (synctable.deleted != True) & \
                (synctable.owned_by_user == current.auth.user.id)

        ftp_rows = db(query).select(synctable.id,
                                    synctable.name,
                                    orderby = synctable.id)

        multiselect = S3MultiSelectWidget(header = False,
                                          multiple = False,
                                          create = {"c": "sync",
                                                    "f": "repository",
                                                    "label": "Create Repository",
                                                    },
                                          )
        if ftp_rows:
            if properties:
                user_repository_id = properties["repository_id"]
            else:
                user_repository_id = ftp_rows.first().id

            if current.auth.s3_has_permission("update", "sync_repository",
                                              record_id = user_repository_id):
                repository_comment = S3PopupLink(c = "sync",
                                                 f = "repository",
                                                 m = "update",
                                                 args = [user_repository_id],
                                                 title = T("Update Repository"),
                                                 tooltip = T("You can edit your FTP repository here"),
                                                 )
            field = s3db.sync_task.repository_id
            ftp_ids = [(r.id, T(r.name)) for r in ftp_rows]
            field.requires = IS_IN_SET(ftp_ids)

            rows.append(("sync_task_repository_id__row",
                         "",
                         multiselect(field,
                                     user_repository_id,
                                     _id="sync_task_repository_id"),
                         repository_comment))
        else:
            if current.auth.s3_has_permission("create", "sync_repository"):
                repository_comment = S3PopupLink(c = "sync",
                                                 f = "repository",
                                                 title = T("Create Repository"),
                                                 tooltip = T("Click on the link to begin creating your FTP repository"),
                                                 )

            rows.append(("sync_task_repository_id__row",
                         "",
                         "",
                         repository_comment))

        parent = FIELDSET()

        for row in rows:
            parent.append(formstyle(form, [row]))

        # Deactivated Toggle
        #parent.insert(0,
        #              DIV(SPAN([I(_class="icon-reorder"), labels.MORE],
        #                       _class="toggle-text",
        #                       _style="display:none"),
        #                  SPAN([I(_class="icon-reorder"), labels.LESS],
        #                       _class="toggle-text"),
        #                  _id="notification-options",
        #                  _class="control-group"))
        form.append(parent)

        # Submit button
        submit_fieldset = FIELDSET(DIV("",
                                       INPUT(_type="submit", _value="Update Settings"),
                                       _id = "submit__row"))

        form.append(submit_fieldset)

        # Script (to extract filters on submit and toggle options visibility)
        script = URL(c="static", f="scripts", args=["S3", "s3.subscriptions.js"])
        response.s3.scripts.append(script)

        # Script to show/hide the ftp repo row for FTP checkbox on/off
        repository_script = '''
if($('#method_selector option[value=Sync]').is(':selected')){
    $('#sync_task_repository_id__row').show();
} else {
    $('#sync_task_repository_id__row').hide();
}

$('#method_selector').change(function(){
    if($(this).val().indexOf('Sync') != -1){
        $('#sync_task_repository_id__row').show();
    } else {
        $('#sync_task_repository_id__row').hide();
    }
})
'''
        response.s3.jquery_ready.append(repository_script)

        # Accept form
        if form.accepts(current.request.post_vars,
                        current.session,
                        formname="subscription",
                        keepvalues=True):

            formvars = form.vars

            listify = lambda x: None if not x else x if type(x) is list else [x]

            # Fixed resource selection:
            subscription["subscribe"] = [resources[0]]
            # Alternatively, with resource selector:
            #subscribe = listify(formvars.resources)
            #if subscribe:
                #subscription["subscribe"] = \
                        #[r for idx, r in enumerate(resources)
                           #if str(idx) in subscribe]

            subscription["filters"] = form.request_vars \
                                      .get("subscription-filters", None)

            # Fixed method
            subscription["method"] = formvars.method
            # Fixed Notify On and Frequency
            subscription["notify_on"] = ["new"]
            subscription["frequency"] = "immediately"
            # Alternatively, with notify and frequency selector
            #subscription["notify_on"] = listify(formvars.notify_on
            #subscription["frequency"] = formvars.frequency

            success_subscription = self._update_subscription(subscription)

            if "Sync" in subscription["method"] and formvars.repository_id:
                properties = self._update_sync(subscription["subscribe"][0]['resource'],
                                               subscription.get("filters"),
                                               int(formvars.repository_id),
                                               properties)
                properties = json.dumps(properties)
                db(stable.pe_id == current.auth.user.pe_id).update(comments=properties)
            else:
                self._remove_sync(properties)
                db(stable.pe_id == current.auth.user.pe_id).update(comments=None)

            if success_subscription:
                response.confirmation = messages.SUCCESS
            else:
                response.error = messages.ERROR

        return form
Example #4
0
    def _manage_subscriptions(self, resources, filters):
        """
            Custom form to manage subscriptions

            @param resources: available resources config
            @param filters: filter widgets
        """

        # Uses Default Eden formstyle
        from s3theme import formstyle_foundation as formstyle
        from gluon.validators import IS_IN_SET
        from s3.s3widgets import S3GroupedOptionsWidget, S3MultiSelectWidget
        from s3layouts import S3PopupLink

        # L10n
        T = current.T
        db = current.db
        s3db = current.s3db
        response = current.response
        labels = Storage(
            #RESOURCES = T("Subscribe To"),
            #NOTIFY_ON = T("Notify On"),
            #FREQUENCY = T("Frequency"),
            NOTIFY_BY = T("Notify By"),
            #MORE = T("More Options"),
            #LESS = T("Less Options"),
        )
        messages = Storage(
            ERROR = T("Error: could not update notification settings"),
            SUCCESS = T("Notification settings updated"),
        )

        # Get current subscription settings resp. form defaults
        subscription = self._get_subscription()

        # Initialize form
        form = FORM(_id="subscription-form",
                    hidden={"subscription-filters": ""})

        # Filters
        filter_form = S3FilterForm(filters, clear=False)
        fieldset = FIELDSET(filter_form.fields(None,
                                               subscription["get_vars"]),
                            _id="subscription-filter-form")
        form.append(fieldset)

        # Notification options
        rows = []
        stable = s3db.pr_subscription

        selector = S3GroupedOptionsWidget(cols=1)
        # Deactivated trigger selector
        #rows.append(("trigger_selector__row",
        #             "%s:" % labels.NOTIFY_ON,
        #             selector(stable.notify_on,
        #                      subscription["notify_on"],
        #                      _id="trigger_selector"),
        #             ""))

        #switch = S3GroupedOptionsWidget(cols=1, multiple=False, sort=False)
        # Deactivated: frequency selector
        #rows.append(("frequency_selector__row",
        #             "%s:" % labels.FREQUENCY,
        #             switch(stable.frequency,
        #                    subscription["frequency"],
        #                    _id="frequency_selector"),
        #             ""))

        methods = [("EMAIL", T("Email")),
                   ("SMS", T("SMS")),
                   ("Sync", T("FTP")),
                   ]

        method_options = Storage(name = "method", requires = IS_IN_SET(methods))

        rows.append(("method_selector__row",
                     "%s:" % labels.NOTIFY_BY,
                     selector(method_options,
                              subscription["method"],
                              _id="method_selector"),
                     ""))

        # Sync Row
        properties = subscription["comments"]
        if properties:
            properties = json.loads(properties)

        synctable = s3db.sync_repository
        query = (synctable.apitype == "ftp") & \
                (synctable.deleted != True) & \
                (synctable.owned_by_user == current.auth.user.id)

        ftp_rows = db(query).select(synctable.id,
                                    synctable.name,
                                    orderby = synctable.id)

        multiselect = S3MultiSelectWidget(header = False,
                                          multiple = False,
                                          create = {"c": "sync",
                                                    "f": "repository",
                                                    "label": "Create Repository",
                                                    },
                                          )
        if ftp_rows:
            if properties:
                user_repository_id = properties["repository_id"]
            else:
                user_repository_id = ftp_rows.first().id

            if current.auth.s3_has_permission("update", "sync_repository",
                                              record_id = user_repository_id):
                repository_comment = S3PopupLink(c = "sync",
                                                 f = "repository",
                                                 m = "update",
                                                 args = [user_repository_id],
                                                 title = T("Update Repository"),
                                                 tooltip = T("You can edit your FTP repository here"),
                                                 )
            field = s3db.sync_task.repository_id
            ftp_ids = [(r.id, T(r.name)) for r in ftp_rows]
            field.requires = IS_IN_SET(ftp_ids)

            rows.append(("sync_task_repository_id__row",
                         "",
                         multiselect(field,
                                     user_repository_id,
                                     _id="sync_task_repository_id"),
                         repository_comment))
        else:
            if current.auth.s3_has_permission("create", "sync_repository"):
                repository_comment = S3PopupLink(c = "sync",
                                                 f = "repository",
                                                 title = T("Create Repository"),
                                                 tooltip = T("Click on the link to begin creating your FTP repository"),
                                                 )

            rows.append(("sync_task_repository_id__row",
                         "",
                         "",
                         repository_comment))

        parent = FIELDSET()

        for row in rows:
            parent.append(formstyle(form, [row]))

        # Deactivated Toggle
        #parent.insert(0,
        #              DIV(SPAN([I(_class="icon-reorder"), labels.MORE],
        #                       _class="toggle-text",
        #                       _style="display:none"),
        #                  SPAN([I(_class="icon-reorder"), labels.LESS],
        #                       _class="toggle-text"),
        #                  _id="notification-options",
        #                  _class="control-group"))
        form.append(parent)

        # Submit button
        submit_fieldset = FIELDSET(DIV("",
                                       INPUT(_type="submit", _value="Update Settings"),
                                       _id = "submit__row"))

        form.append(submit_fieldset)

        # Script (to extract filters on submit and toggle options visibility)
        script = URL(c="static", f="scripts", args=["S3", "s3.subscriptions.js"])
        response.s3.scripts.append(script)

        # Script to show/hide the ftp repo row for FTP checkbox on/off
        repository_script = '''
if($('#method_selector option[value=Sync]').is(':selected')){
    $('#sync_task_repository_id__row').show();
} else {
    $('#sync_task_repository_id__row').hide();
}

$('#method_selector').change(function(){
    if($(this).val().indexOf('Sync') != -1){
        $('#sync_task_repository_id__row').show();
    } else {
        $('#sync_task_repository_id__row').hide();
    }
})
'''
        response.s3.jquery_ready.append(repository_script)

        # Accept form
        if form.accepts(current.request.post_vars,
                        current.session,
                        formname="subscription",
                        keepvalues=True):

            formvars = form.vars

            listify = lambda x: None if not x else x if type(x) is list else [x]

            # Fixed resource selection:
            subscription["subscribe"] = [resources[0]]
            # Alternatively, with resource selector:
            #subscribe = listify(formvars.resources)
            #if subscribe:
                #subscription["subscribe"] = \
                        #[r for idx, r in enumerate(resources)
                           #if str(idx) in subscribe]

            subscription["filters"] = form.request_vars \
                                      .get("subscription-filters", None)

            # Fixed method
            subscription["method"] = formvars.method
            # Fixed Notify On and Frequency
            subscription["notify_on"] = ["new"]
            subscription["frequency"] = "immediately"
            # Alternatively, with notify and frequency selector
            #subscription["notify_on"] = listify(formvars.notify_on
            #subscription["frequency"] = formvars.frequency

            success_subscription = self._update_subscription(subscription)

            if "Sync" in subscription["method"] and formvars.repository_id:
                properties = self._update_sync(subscription["subscribe"][0]['resource'],
                                               subscription.get("filters"),
                                               int(formvars.repository_id),
                                               properties)
                properties = json.dumps(properties)
                db(stable.pe_id == current.auth.user.pe_id).update(comments=properties)
            else:
                self._remove_sync(properties)
                db(stable.pe_id == current.auth.user.pe_id).update(comments=None)

            if success_subscription:
                response.confirmation = messages.SUCCESS
            else:
                response.error = messages.ERROR

        return form