Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .github/helper/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,12 @@ bench start &> bench_run_logs.txt &
CI=Yes &
bench --site test_site reinstall --yes --admin-password admin

# Create a minimal assets manifest so that frappe.get_print can render
# printview.html (which calls include_style → get_assets_json) without
# crashing when the bench was initialised with --skip-assets.
mkdir -p ~/frappe-bench/sites/assets
echo '{}' > ~/frappe-bench/sites/assets/assets.json

bench setup requirements --dev

echo "BENCH VERSION NUMBERS:"
Expand Down
104 changes: 0 additions & 104 deletions .github/workflows/pytest.yaml

This file was deleted.

5 changes: 5 additions & 0 deletions .github/workflows/pytest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@ jobs:
- name: Install App Dependencies
run: bash ${{ github.workspace }}/.github/helper/install_dependencies.sh

- name: Install Poetry
uses: snok/install-poetry@v1

- name: Install Bench Site and Apps
env:
MYSQL_HOST: 'localhost'
Expand All @@ -80,8 +83,10 @@ jobs:
- name: Run Tests
working-directory: /home/runner/frappe-bench
run: |
set -o pipefail
source env/bin/activate
cd apps/communications
poetry install
pytest --cov=communications --cov-report=xml -s | tee pytest-coverage.txt

- name: Pytest coverage comment
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Messaging and telephony extensions for Frappe
- [Public calendar, scheduling, RSVP, notifications](docs/calendar.md)
- [Video conferencing, Appointment Settings, Zoom / Google Meet](docs/video-conferencing.md)
- [Slack/Teams Notification channels, assignment patch, phone helpers](docs/integrations.md)
- [Electronic Signature: desk connections and per-site customization](docs/electronic_signature.md)
- [Sendmail route overrides (`send_notification_email` scope)](docs/sendmail-routes.md)

#### License
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Copyright (c) 2026, AgriTheory and contributors
# For license information, please see license.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// Copyright (c) 2026, AgriTheory and contributors
// For license information, please see license.txt

frappe.ui.form.on('Electronic Signature', {
onload_post_render(frm) {
if (['Draft', 'Out for Signature'].includes(frm.doc.status)) {
add_send_signature_invitations_button(frm)
}
},
refresh(frm) {
if (['Draft', 'Out for Signature'].includes(frm.doc.status)) {
add_send_signature_invitations_button(frm)
}
},
})

function add_send_signature_invitations_button(frm) {
frm.page.add_action_item(__('Send signature invitations'), () => {
if (!frm.doc.signers || !frm.doc.signers.length) {
frappe.msgprint(__('Add at least one signer first.'))
return
}
frm.doc.signers.forEach(row => {
const recipient = row.email
if (!recipient) {
return
}
frappe
.xcall('communications.communications.signatures.fetch_signature_invitation_email', {
doc: frm.doc,
recipient: recipient,
})
.then(r => {
return new frappe.views.CommunicationComposer({
doc: frm.doc,
frm: frm,
subject: r.subject || __('Signature requested'),
recipients: r.recipients,
attach_document_print: false,
message: r.email_message || '',
})
})
})
})
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
{
"actions": [],
"allow_import": 1,
"allow_rename": 1,
"autoname": "naming_series:",
"creation": "2026-04-16 12:00:00",
"doctype": "DocType",
"engine": "InnoDB",
"field_order": [
"naming_series",
"title",
"status",
"column_break_pooc",
"reference_doctype",
"reference_name",
"print_format",
"letter_head",
"attach_signed_pdf_to_reference",
"intro_section",
"introduction",
"signers_section",
"signers"
],
"fields": [
{
"fieldname": "naming_series",
"fieldtype": "Select",
"label": "Series",
"no_copy": 1,
"options": "ESIG-.YYYY.-",
"print_hide": 1,
"reqd": 1,
"set_only_once": 1
},
{
"fieldname": "title",
"fieldtype": "Data",
"in_list_view": 1,
"label": "Title",
"reqd": 1
},
{
"default": "Draft",
"fieldname": "status",
"fieldtype": "Select",
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Status",
"options": "Draft\nOut for Signature\nCompleted\nCancelled",
"reqd": 1
},
{
"fieldname": "reference_doctype",
"fieldtype": "Link",
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Reference DocType",
"options": "DocType"
},
{
"fieldname": "reference_name",
"fieldtype": "Dynamic Link",
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Reference Name",
"options": "reference_doctype"
},
{
"fieldname": "introduction",
"fieldtype": "Text Editor",
"label": "Introduction"
},
{
"fieldname": "signers_section",
"fieldtype": "Section Break",
"label": "Signers"
},
{
"fieldname": "signers",
"fieldtype": "Table",
"label": "Signers",
"options": "Electronic Signature Signer"
},
{
"fieldname": "column_break_pooc",
"fieldtype": "Column Break"
},
{
"fieldname": "intro_section",
"fieldtype": "Section Break"
},
{
"fieldname": "print_format",
"fieldtype": "Link",
"in_list_view": 1,
"label": "Print Format",
"options": "Print Format"
},
{
"description": "Letter head used when rendering the reference document (portal preview, unsigned PDF/print, and content wrapped in the signed PDF). Leave blank to use the reference document\u2019s Letter Head field or the default Letter Head from Print Settings.",
"fieldname": "letter_head",
"fieldtype": "Link",
"label": "Letter Head",
"options": "Letter Head"
},
{
"default": "1",
"description": "When the request is Completed, render the signed record to PDF and attach it to the reference document (for example a Task).",
"fieldname": "attach_signed_pdf_to_reference",
"fieldtype": "Check",
"label": "Attach signed PDF to reference"
}
],
"grid_page_length": 50,
"links": [],
"modified": "2026-05-07 09:46:46.137864",
"modified_by": "Administrator",
"module": "Communications",
"name": "Electronic Signature",
"naming_rule": "By \"Naming Series\" field",
"owner": "Administrator",
"permissions": [
{
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"share": 1,
"write": 1
},
{
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "Projects User",
"share": 1,
"write": 1
},
{
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "Projects Manager",
"share": 1,
"write": 1
}
],
"row_format": "Dynamic",
"sort_field": "modified",
"sort_order": "DESC",
"states": [],
"title_field": "title",
"track_changes": 1
}
Loading
Loading