def get_context(self, context): '''Build context to render the `web_form.html` template''' self.set_web_form_module() context._login_required = False if self.login_required and frappe.session.user == "Guest": context._login_required = True doc, delimeter = make_route_string(frappe.form_dict) context.doc = doc context.delimeter = delimeter # check permissions if frappe.session.user == "Guest" and frappe.form_dict.name: frappe.throw(_("You need to be logged in to access this {0}.").format(self.doc_type), frappe.PermissionError) if frappe.form_dict.name and not has_web_form_permission(self.doc_type, frappe.form_dict.name): frappe.throw(_("You don't have the permissions to access this document"), frappe.PermissionError) self.reset_field_parent() if self.is_standard: self.use_meta_fields() if not context._login_required: if self.allow_edit: if self.allow_multiple: if not frappe.form_dict.name and not frappe.form_dict.new: self.build_as_list(context) else: name = None if frappe.session.user != 'Guest': name = frappe.db.get_value(self.doc_type, {"owner": frappe.session.user}, "name") if name: frappe.form_dict.name = name else: # only a single doc allowed and no existing doc, hence new frappe.form_dict.new = 1 # always render new form if login is not required or doesn't allow editing existing ones if not self.login_required or not self.allow_edit: frappe.form_dict.new = 1 self.load_document(context) context.parents = self.get_parents(context) if self.breadcrumbs: context.parents = eval(self.breadcrumbs) context.has_header = ((frappe.form_dict.name or frappe.form_dict.new) and (frappe.session.user!="Guest" or not self.login_required)) if context.success_message: context.success_message = context.success_message.replace("\n", "<br>").replace("'", "\'") self.add_custom_context_and_script(context) if not context.max_attachment_size: context.max_attachment_size = get_max_file_size() / 1024 / 1024
class WebForm(WebsiteGenerator): website = frappe._dict( no_cache = 1 ) def onload(self): super(WebForm, self).onload() if self.is_standard and not frappe.conf.developer_mode: self.use_meta_fields() def validate(self): super(WebForm, self).validate() if not self.module: self.module = frappe.db.get_value('DocType', self.doc_type, 'module') if (not (frappe.flags.in_install or frappe.flags.in_patch or frappe.flags.in_test or frappe.flags.in_fixtures) and self.is_standard and not frappe.conf.developer_mode): frappe.throw(_("You need to be in developer mode to edit a Standard Web Form")) if not frappe.flags.in_import: self.validate_fields() if self.accept_payment: self.validate_payment_amount() def validate_fields(self): '''Validate all fields are present''' from frappe.model import no_value_fields missing = [] meta = frappe.get_meta(self.doc_type) for df in self.web_form_fields: if df.fieldname and (df.fieldtype not in no_value_fields and not meta.has_field(df.fieldname)): missing.append(df.fieldname) if missing: frappe.throw(_('Following fields are missing:') + '<br>' + '<br>'.join(missing)) def validate_payment_amount(self): if self.amount_based_on_field and not self.amount_field: frappe.throw(_("Please select a Amount Field.")) elif not self.amount_based_on_field and not self.amount > 0: frappe.throw(_("Amount must be greater than 0.")) def reset_field_parent(self): '''Convert link fields to select with names as options''' for df in self.web_form_fields: df.parent = self.doc_type def use_meta_fields(self): '''Override default properties for standard web forms''' meta = frappe.get_meta(self.doc_type) for df in self.web_form_fields: meta_df = meta.get_field(df.fieldname) if not meta_df: continue for prop in docfield_properties: if df.fieldtype==meta_df.fieldtype and prop not in ("idx", "reqd", "default", "description", "default", "options", "hidden", "read_only", "label"): df.set(prop, meta_df.get(prop)) # TODO translate options of Select fields like Country # export def on_update(self): """ Writes the .txt for this page and if write_content is checked, it will write out a .html file """ path = export_module_json(self, self.is_standard, self.module) if path: # js if not os.path.exists(path + '.js'): with open(path + '.js', 'w') as f: f.write("""frappe.ready(function() { // bind events here })""") # py if not os.path.exists(path + '.py'): with open(path + '.py', 'w') as f: f.write("""from __future__ import unicode_literals import frappe def get_context(context): # do your magic here pass """) def get_context(self, context): '''Build context to render the `web_form.html` template''' self.set_web_form_module() context._login_required = False if self.login_required and frappe.session.user == "Guest": context._login_required = True doc, delimeter = make_route_string(frappe.form_dict) context.doc = doc context.delimeter = delimeter context.user=frappe.session.user # check permissions if frappe.session.user == "Guest" and frappe.form_dict.name: frappe.throw(_("You need to be logged in to access this {0}.").format(self.doc_type), frappe.PermissionError) if frappe.form_dict.name and not has_web_form_permission(self.doc_type, frappe.form_dict.name): frappe.throw(_("You don't have the permissions to access this document"), frappe.PermissionError) self.reset_field_parent() if self.is_standard: self.use_meta_fields() if not context._login_required: if self.allow_edit: if self.allow_multiple: if not frappe.form_dict.name and not frappe.form_dict.new: self.build_as_list(context) else: if frappe.session.user != 'Guest' and not frappe.form_dict.name: frappe.form_dict.name = frappe.db.get_value(self.doc_type, {"owner": frappe.session.user}, "name") if not frappe.form_dict.name: # only a single doc allowed and no existing doc, hence new frappe.form_dict.new = 1 # always render new form if login is not required or doesn't allow editing existing ones if not self.login_required or not self.allow_edit: frappe.form_dict.new = 1 self.load_document(context) context.parents = self.get_parents(context) if self.breadcrumbs: context.parents = frappe.safe_eval(self.breadcrumbs, { "_": _ }) context.has_header = ((frappe.form_dict.name or frappe.form_dict.new) and (frappe.session.user!="Guest" or not self.login_required)) if context.success_message: context.success_message = frappe.db.escape(context.success_message.replace("\n", "<br>")) self.add_custom_context_and_script(context) if not context.max_attachment_size: context.max_attachment_size = get_max_file_size() / 1024 / 1024