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)
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)
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