Web Form: Email Validation for DocType Not Working

Hi Community,

I’m using a public web form for “Membership Application” DocType and need to check if the submitted email exists in the “Member” DocType.

Problem:

My validation code (below) doesn’t work—it doesn’t block submissions even when the email isn’t in “Member”. No errors, but no validation either.

frappe.web_form.validate = function() {
    const email = frappe.web_form.get_value('email');
    return frappe.call({
        method: "frappe.client.get_value",
        args: {
            doctype: "Member",
            fieldname: "name",
            filters: { email: email }
        }
    }).then((response) => {
        if (!response.message) {
            frappe.msgprint("Email not found in Member records.");
            return false; // Fail validation
        }
        return true; // Pass validation
    });
}

What I’ve Tried:

  • Guest User has read access to “Member”.

Question:
Why isn’t the validation blocking submissions? Are there hidden permissions or a better approach?

Thanks for any tips!

I have now the following skript for my webform:

frappe.web_form.validate = function() {
    const email = frappe.web_form.get_value('email');
    console.log("[VALIDIERUNG] Prüfe E-Mail:", email);

    frappe.call({
        method: "frappe.client.get_value",
        args: {
            doctype: "Mitglied",
            fieldname: "name",
            filters: { "email": email }
        }
    }).done(function(response) {
        console.log("[DEBUG] API Antwort:", response);
        console.log(response.message);
        
        if (!response.message.name) {
            console.warn("[FEHLER] Kein Mitglied mit dieser E-Mail gefunden");
            frappe.msgprint("Diese E-Mail ist keinem Mitglied zugeordnet.");
            return false;
        }

        console.log("[SUCCESS] Mitglied gefunden:", response.message.name);
        return true;
    });
};

If i enter an e-mail which is not in Member Database (Doctype: Mitglied) it still allows for submission :(. Makes for me no sense at all. Here my console.log:

image

If i enter email which is in member database it works:
image

Would be very happy about any help :)!

Solution that worked for me with serverskript:

if doc.is_new():
    # Hole die E-Mail-Adresse aus dem aktuellen Dokument (Anteile zeichnen)
    email = doc.email
        
    # Suche das Mitglied, bei dem die E-Mail-Adresse übereinstimmt
    mitglied = frappe.get_all(
        "Mitglied",  # Doctype Name
        filters={"email": email},  # Filter nach E-Mail-Adresse
        fields=["name"],  # Nur den Namen des Mitglieds zurückgeben
        limit=1  # Begrenze die Suche auf ein Ergebnis
    )
    
    # Wenn kein Mitglied gefunden wurde
    if not mitglied:
        frappe.throw("Kein Mitglied mit der E-Mail-Adresse bekannt. Bitte hinterlegen Sie ihre bei uns regestrierte E-Mail oder kontaktieren Sie den Vorstand")  # Wirft eine Exception und bricht den Prozess ab
    else:
        # Mitglied wurde gefunden, Prozess kann fortgesetzt werden
        doc.verknuepftes_mitglied = mitglied[0].name
        frappe.msgprint(f"Mitglied zugewiesen: {mitglied[0].name}")