update Frappe - Jingrow

This commit is contained in:
jingrow 2025-12-23 20:42:58 +08:00
parent 65265b0ace
commit 07adcfc9c7
547 changed files with 829 additions and 829 deletions

View File

@ -3,7 +3,7 @@
<img src="https://framework.jingrow.com/files/Group%202%20(1).png" alt="Press logo" width="80"/> <img src="https://framework.jingrow.com/files/Group%202%20(1).png" alt="Press logo" width="80"/>
<h1>Press</h1> <h1>Press</h1>
**Full Service Cloud Hosting For The Frappe Stack - Powers Frappe Cloud** **Full Service Cloud Hosting For The Jingrow Stack - Powers Jingrow Cloud**
[![codecov](https://codecov.io/gh/jingrow/press/branch/master/graph/badge.svg?token=0puvH0jUx9)](https://codecov.io/gh/jingrow/press) [![codecov](https://codecov.io/gh/jingrow/press/branch/master/graph/badge.svg?token=0puvH0jUx9)](https://codecov.io/gh/jingrow/press)
[![unittests](http://git.jingrow.com/jingrow/jcloude/actions/workflows/main.yaml/badge.svg)](http://git.jingrow.com/jingrow/jcloude/actions/workflows/main.yaml) [![unittests](http://git.jingrow.com/jingrow/jcloude/actions/workflows/main.yaml/badge.svg)](http://git.jingrow.com/jingrow/jcloude/actions/workflows/main.yaml)
@ -22,13 +22,13 @@
## Press ## Press
Press is a 100% open-source cloud hosting for the Frappe stack. Press is a 100% open-source cloud hosting for the Jingrow stack.
### Motivation ### Motivation
We originally hosted our customer sites on an internal cloud platform called "Central," designed to automate creating and hosting sites when customers signed up on our website. Central was primarily built to host ERPNext, our flagship product. However, as our customers' needs evolved, they began requesting the ability to host custom applications, a feature that was not a priority in Central. We originally hosted our customer sites on an internal cloud platform called "Central," designed to automate creating and hosting sites when customers signed up on our website. Central was primarily built to host ERPNext, our flagship product. However, as our customers' needs evolved, they began requesting the ability to host custom applications, a feature that was not a priority in Central.
Additionally, customers lacked full control over their servers—no SSH access, no ability to manage updates, and limited flexibility in interacting with their environment. This led us to launch Frappe Cloud, to build a self-serve cloud platform that would empower our customers with complete control over their hosting experience. Additionally, customers lacked full control over their servers—no SSH access, no ability to manage updates, and limited flexibility in interacting with their environment. This led us to launch Jingrow Cloud, to build a self-serve cloud platform that would empower our customers with complete control over their hosting experience.
### Key Features ### Key Features
@ -37,7 +37,7 @@ Additionally, customers lacked full control over their servers—no SSH access,
- **Permissions**: Granular access controls let team owners manage roles and resources efficiently, ensuring users have access only to relevant information and actions for their roles. - **Permissions**: Granular access controls let team owners manage roles and resources efficiently, ensuring users have access only to relevant information and actions for their roles.
- **Simplified Management**: Press streamlines site management with automated backups, real-time monitoring, role-based access, and easy scaling, making it ideal for growing Frappe environments. - **Simplified Management**: Press streamlines site management with automated backups, real-time monitoring, role-based access, and easy scaling, making it ideal for growing Jingrow environments.
- **Billing**: Automated billing supports daily or monthly subscriptions, flexible payment methods, wallet credits, and ERP integration, simplifying customer invoicing and payments. - **Billing**: Automated billing supports daily or monthly subscriptions, flexible payment methods, wallet credits, and ERP integration, simplifying customer invoicing and payments.
@ -55,9 +55,9 @@ Additionally, customers lacked full control over their servers—no SSH access,
### Under the Hood ### Under the Hood
- [**Frappe Framework**](http://git.jingrow.com/jingrow/jingrow): A full-stack web application framework written in Python and Javascript. The framework provides a robust foundation for building web applications, including a database abstraction layer, user authentication, and a REST API. - [**Jingrow Framework**](http://git.jingrow.com/jingrow/jingrow): A full-stack web application framework written in Python and Javascript. The framework provides a robust foundation for building web applications, including a database abstraction layer, user authentication, and a REST API.
- [**Frappe UI**](http://git.jingrow.com/jingrow/jingrow-ui): A Vue-based UI library, to provide a modern user interface. The Frappe UI library provides a variety of components that can be used to build single-page applications on top of the Frappe Framework. - [**Jingrow UI**](http://git.jingrow.com/jingrow/jingrow-ui): A Vue-based UI library, to provide a modern user interface. The Jingrow UI library provides a variety of components that can be used to build single-page applications on top of the Jingrow Framework.
- [**Agent**](http://git.jingrow.com/jingrow/agent): A flask app designed to work along with Press. It provides a CLI interface for Press to communicate with the sites and benches. - [**Agent**](http://git.jingrow.com/jingrow/agent): A flask app designed to work along with Press. It provides a CLI interface for Press to communicate with the sites and benches.
@ -88,8 +88,8 @@ pre-commit install
<div align="center" style="padding-top: 0.75rem;"> <div align="center" style="padding-top: 0.75rem;">
<a href="https://framework.jingrow.com" target="_blank"> <a href="https://framework.jingrow.com" target="_blank">
<picture> <picture>
<source media="(prefers-color-scheme: dark)" srcset="https://framework.jingrow.com/files/Frappe-white.png"> <source media="(prefers-color-scheme: dark)" srcset="https://framework.jingrow.com/files/Jingrow-white.png">
<img src="https://framework.jingrow.com/files/Frappe-black.png" alt="Frappe Technologies" height="28"/> <img src="https://framework.jingrow.com/files/Jingrow-black.png" alt="Jingrow Technologies" height="28"/>
</picture> </picture>
</a> </a>
</div> </div>

View File

@ -1,6 +1,6 @@
# Backbone # Backbone
> Note: Not to be confused with the scrapped project **Frappe Backbone** > Note: Not to be confused with the scrapped project **Jingrow Backbone**
## Installation ## Installation

View File

@ -7,7 +7,7 @@ users:
shell: /usr/bin/bash shell: /usr/bin/bash
- name: jingrow - name: jingrow
gecos: Frappe gecos: Jingrow
groups: sudo groups: sudo
lock_passwd: false lock_passwd: false
passwd: $6$rounds=4096$GytYXpLxIgl5SZ$C3zfa5zfD66lfm/TEgtlAVYbl3IjEK9ZAND4qnI7fXGWGhqUFl7m2DD25VjimMfqH3SepUBTUwuyiubwpTUtc/ passwd: $6$rounds=4096$GytYXpLxIgl5SZ$C3zfa5zfD66lfm/TEgtlAVYbl3IjEK9ZAND4qnI7fXGWGhqUFl7m2DD25VjimMfqH3SepUBTUwuyiubwpTUtc/

View File

@ -28,7 +28,7 @@ Vagrant.configure("2") do |config|
# IP Pattern based on server types # IP Pattern based on server types
# Proxy x.x.1.x # Proxy x.x.1.x
# Frappe x.x.2.x # Jingrow x.x.2.x
# Database x.x.3.x # Database x.x.3.x
# Other x.x.4.x # Other x.x.4.x

View File

@ -1,6 +1,6 @@
# Dashboard # Dashboard
Dashboard is a VueJS application that is the face of Frappe Cloud. This is what the end users (tenants) see and manage their FC stuff in. The tenants does not have access to the desk, so, this is their dashboard for managing sites, apps, updates etc. Dashboard is a VueJS application that is the face of Jingrow Cloud. This is what the end users (tenants) see and manage their FC stuff in. The tenants does not have access to the desk, so, this is their dashboard for managing sites, apps, updates etc.
Technologies at the heart of dashboard: Technologies at the heart of dashboard:

View File

@ -4,14 +4,14 @@
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" /> <meta name="viewport" content="width=device-width,initial-scale=1.0" />
<title>Frappe Cloud</title> <title>Jingrow Cloud</title>
<link rel="icon" href="/assets/press/dashboard/favicon.png" type="image/x-icon" /> <link rel="icon" href="/assets/press/dashboard/favicon.png" type="image/x-icon" />
</head> </head>
<body class="h-full"> <body class="h-full">
<noscript> <noscript>
<strong> <strong>
Frappe Cloud Dashboard doesn't work properly without JavaScript enabled. Jingrow Cloud Dashboard doesn't work properly without JavaScript enabled.
Please enable it to continue. Please enable it to continue.
</strong> </strong>
</noscript> </noscript>

View File

@ -1,7 +1,7 @@
<template> <template>
<div> <div>
<AlertBanner <AlertBanner
title="Please add your billing address to complete your Frappe Cloud profile." title="Please add your billing address to complete your Jingrow Cloud profile."
type="warning" type="warning"
> >
<Button <Button

View File

@ -17,7 +17,7 @@ export default {
}, },
computed: { computed: {
budgetAlertMessage() { budgetAlertMessage() {
return `Budget Alert: Your Frappe Cloud cost has exceeded the monthly budget alert threshold by <strong>${this.currency}${this.amount}</strong>`; return `Budget Alert: Your Jingrow Cloud cost has exceeded the monthly budget alert threshold by <strong>${this.currency}${this.amount}</strong>`;
}, },
}, },
}; };

View File

@ -37,7 +37,7 @@
<FCLogo class="mb-1 h-8 w-8 shrink-0 rounded" /> <FCLogo class="mb-1 h-8 w-8 shrink-0 rounded" />
<div class="ml-2 flex flex-1 flex-col overflow-hidden"> <div class="ml-2 flex flex-1 flex-col overflow-hidden">
<div class="text-base font-medium leading-none text-gray-900"> <div class="text-base font-medium leading-none text-gray-900">
Frappe Cloud Jingrow Cloud
</div> </div>
<Tooltip :text="$team?.pg?.user || null"> <Tooltip :text="$team?.pg?.user || null">
<div <div

View File

@ -98,7 +98,7 @@ export default {
const options = { const options = {
key: data.key_id, key: data.key_id,
order_id: data.order_id, order_id: data.order_id,
name: 'Frappe Cloud', name: 'Jingrow Cloud',
image: '/assets/press/images/jingrow-cloud-logo.png', image: '/assets/press/images/jingrow-cloud-logo.png',
prefill: { prefill: {
email: this.$team.pg.user, email: this.$team.pg.user,

View File

@ -41,7 +41,7 @@
class="mt-4" class="mt-4"
type="textarea" type="textarea"
variant="outline" variant="outline"
placeholder="I am leaving Frappe Cloud because..." placeholder="I am leaving Jingrow Cloud because..."
size="md" size="md"
v-model="note" v-model="note"
/> />
@ -120,16 +120,16 @@ export default {
return [ return [
'I was testing the product', 'I was testing the product',
'I prefer self-hosting my instance', 'I prefer self-hosting my instance',
'Moved site to another Frappe Cloud account', 'Moved site to another Jingrow Cloud account',
'Frappe Cloud is too expensive for me', 'Jingrow Cloud is too expensive for me',
'Payment issues', 'Payment issues',
'Missing Integration App', 'Missing Integration App',
'Poor partner experience', 'Poor partner experience',
'Missing Country Compliance App', 'Missing Country Compliance App',
'Apps are too complex to use and setup', 'Apps are too complex to use and setup',
'Frappe Cloud is complex and difficult to use', 'Jingrow Cloud is complex and difficult to use',
'ERPNext is too complex for my needs', 'ERPNext is too complex for my needs',
'Unable to migrate to Frappe Cloud', 'Unable to migrate to Jingrow Cloud',
'My reason is not listed here', 'My reason is not listed here',
]; ];
}, },

View File

@ -33,8 +33,8 @@
> >
<lucide-badge-check class="mr-2 h-5 w-12 text-gray-600" /> <lucide-badge-check class="mr-2 h-5 w-12 text-gray-600" />
<span> <span>
<strong>Support</strong> covers only issues of Frappe apps and not <strong>Support</strong> covers only issues of Jingrow apps and not
functional queries. You can raise a support ticket for Frappe functional queries. You can raise a support ticket for Jingrow
Cloud issues for all plans. Cloud issues for all plans.
</span> </span>
</div> </div>

View File

@ -6,7 +6,7 @@
<img <img
:src="`/assets/press/images/frappecloud-logo.png`" :src="`/assets/press/images/frappecloud-logo.png`"
class="h-7 w-7 shrink-0" class="h-7 w-7 shrink-0"
alt="Frappe Cloud Logo" alt="Jingrow Cloud Logo"
/> />
</router-link> </router-link>
</span> </span>

View File

@ -1,9 +1,9 @@
<template> <template>
<div class="mx-auto max-w-2xl rounded-lg border-0 px-2 sm:border sm:p-8"> <div class="mx-auto max-w-2xl rounded-lg border-0 px-2 sm:border sm:p-8">
<div class="prose prose-sm max-w-none"> <div class="prose prose-sm max-w-none">
<h1 class="text-2xl font-semibold">Welcome to Frappe Cloud</h1> <h1 class="text-2xl font-semibold">Welcome to Jingrow Cloud</h1>
<p> <p>
Frappe Cloud makes it easy to manage sites and apps like ERPNext in an Jingrow Cloud makes it easy to manage sites and apps like ERPNext in an
easy to use dashboard with powerful features like automatic backups, easy to use dashboard with powerful features like automatic backups,
custom domains, SSL certificates, custom apps, automatic updates and custom domains, SSL certificates, custom apps, automatic updates and
more. more.
@ -48,7 +48,7 @@
</div> </div>
<div class="mt-2 pl-7" v-if="pendingSiteRequest.status == 'Error'"> <div class="mt-2 pl-7" v-if="pendingSiteRequest.status == 'Error'">
<p class="mt-2 text-p-base text-gray-800"> <p class="mt-2 text-p-base text-gray-800">
Please contact Frappe Cloud support by clicking on the button below. Please contact Jingrow Cloud support by clicking on the button below.
</p> </p>
<Button class="mt-2" link="/support"> Contact Support </Button> <Button class="mt-2" link="/support"> Contact Support </Button>
</div> </div>

View File

@ -115,7 +115,7 @@ function processOrder(data) {
const options = { const options = {
key: data.key_id, key: data.key_id,
order_id: data.order_id, order_id: data.order_id,
name: 'Frappe Cloud', name: 'Jingrow Cloud',
image: 'https://framework.jingrow.com/files/cloud.png', image: 'https://framework.jingrow.com/files/cloud.png',
prefill: { email: team.pg?.user }, prefill: { email: team.pg?.user },
handler: handlePaymentSuccess, handler: handlePaymentSuccess,

View File

@ -30,7 +30,7 @@
class="mt-4" class="mt-4"
type="autocomplete" type="autocomplete"
label="Choose Version" label="Choose Version"
:options="{ doctype: 'Frappe Version', filters: { public: 1 } }" :options="{ doctype: 'Jingrow Version', filters: { public: 1 } }"
v-model="selectedVersion" v-model="selectedVersion"
/> />
<div class="mt-4 space-y-2"> <div class="mt-4 space-y-2">

View File

@ -103,7 +103,7 @@ function processOrder(data) {
const options = { const options = {
key: data.key_id, key: data.key_id,
order_id: data.order_id, order_id: data.order_id,
name: 'Frappe Cloud', name: 'Jingrow Cloud',
image: 'https://framework.jingrow.com/files/cloud.png', image: 'https://framework.jingrow.com/files/cloud.png',
prefill: { email: team.pg?.user }, prefill: { email: team.pg?.user },
handler: handlePaymentSuccess, handler: handlePaymentSuccess,

View File

@ -41,7 +41,7 @@ export default {
}, },
}, },
{ {
label: 'Frappe Approval', label: 'Jingrow Approval',
fieldname: 'approved_by_jingrow', fieldname: 'approved_by_jingrow',
type: 'Component', type: 'Component',
align: 'center', align: 'center',
@ -125,7 +125,7 @@ export default {
}), }),
{ {
loading: 'Approving...', loading: 'Approving...',
success: 'Approval request sent to Frappe', success: 'Approval request sent to Jingrow',
error: 'Failed to Approve', error: 'Failed to Approve',
}, },
); );
@ -136,7 +136,7 @@ export default {
row.approved_by_jingrow === 0 row.approved_by_jingrow === 0
) { ) {
return h(Badge, { return h(Badge, {
label: "Waiting for Frappe's approval", label: "Waiting for Jingrow's approval",
theme: 'blue', theme: 'blue',
variant: 'subtle', variant: 'subtle',
size: 'md', size: 'md',

View File

@ -46,7 +46,7 @@
@closeDialog="showAddPaymentGatewayDialog = false" @closeDialog="showAddPaymentGatewayDialog = false"
/> />
<!--Submit Payment Transaction To Frappe--> <!--Submit Payment Transaction To Jingrow-->
<div class="flex flex-col gap-2 rounded-md border p-4 shadow"> <div class="flex flex-col gap-2 rounded-md border p-4 shadow">
<div class="flex justify-between items-center text-sm text-gray-700"> <div class="flex justify-between items-center text-sm text-gray-700">
<div>Partner Payment Payout</div> <div>Partner Payment Payout</div>

View File

@ -181,7 +181,7 @@
href="https://framework.jingrow.com/partners/terms" href="https://framework.jingrow.com/partners/terms"
target="_blank" target="_blank"
class="underline" class="underline"
><strong>Frappe Partnership Agreement</strong></a ><strong>Jingrow Partnership Agreement</strong></a
>. >.
</p> </p>
</template> </template>

View File

@ -16,7 +16,7 @@
name="hosting_type" name="hosting_type"
:options="[ :options="[
{ label: 'Self-Hosted', value: 'Self-Hosted' }, { label: 'Self-Hosted', value: 'Self-Hosted' },
{ label: 'Frappe Cloud', value: 'Frappe Cloud' }, { label: 'Jingrow Cloud', value: 'Jingrow Cloud' },
]" ]"
:required="true" :required="true"
/> />

View File

@ -20,7 +20,7 @@
<p <p
class="rounded mb-4 p-2 text-sm text-gray-700 bg-gray-100 border" class="rounded mb-4 p-2 text-sm text-gray-700 bg-gray-100 border"
> >
Frappe Cloud will start temporary servers from the snapshot and Jingrow Cloud will start temporary servers from the snapshot and
<b>backup the selected sites from the snapshot</b>. You will be <b>backup the selected sites from the snapshot</b>. You will be
able to download the backup files for next <b>48 hours</b> once able to download the backup files for next <b>48 hours</b> once
the recovery gets completed. <br /><br /> the recovery gets completed. <br /><br />

View File

@ -63,7 +63,7 @@
<div v-else class="text-base text-gray-700"> <div v-else class="text-base text-gray-700">
API key and API secret pairs can be used to access the API key and API secret pairs can be used to access the
<a href="/docs/api" class="underline" target="_blank" <a href="/docs/api" class="underline" target="_blank"
>Frappe Cloud API</a >Jingrow Cloud API</a
>. >.
</div> </div>
</template> </template>

View File

@ -1,8 +1,8 @@
<template> <template>
<Card <Card
v-if="!$team.pg?.erpnext_partner" v-if="!$team.pg?.erpnext_partner"
title="Frappe Partner" title="Jingrow Partner"
subtitle="Frappe Partner associated with your account" subtitle="Jingrow Partner associated with your account"
class="mx-auto max-w-3xl" class="mx-auto max-w-3xl"
> >
<template #actions> <template #actions>
@ -26,7 +26,7 @@
class="text-base font-medium text-gray-700" class="text-base font-medium text-gray-700"
v-if="!$team.pg?.partner_email" v-if="!$team.pg?.partner_email"
> >
Have a Frappe Partner Referral Code? Click on Have a Jingrow Partner Referral Code? Click on
<strong>Add Partner Code</strong> to link with your Partner team. <strong>Add Partner Code</strong> to link with your Partner team.
</span> </span>
<ListItem <ListItem

View File

@ -8,10 +8,10 @@
<div class="flex flex-col space-y-4 overflow-hidden"> <div class="flex flex-col space-y-4 overflow-hidden">
<ClickToCopyField :textContent="referralLink" /> <ClickToCopyField :textContent="referralLink" />
<span class="text-sm font-medium leading-4 text-gray-700"> <span class="text-sm font-medium leading-4 text-gray-700">
Invite someone to Frappe Cloud and Invite someone to Jingrow Cloud and
<strong> <strong>
get get
{{ creditAmountInTeamCurrency }} in Frappe Cloud credits</strong {{ creditAmountInTeamCurrency }} in Jingrow Cloud credits</strong
> >
when they sign up and spend at least {{ minimumSpentAmount }}! when they sign up and spend at least {{ minimumSpentAmount }}!
</span> </span>

View File

@ -134,7 +134,7 @@ export default {
}, },
}, },
{ {
title: 'Frappe Logs', title: 'Jingrow Logs',
route: { route: {
name: 'Site Logs', name: 'Site Logs',
params: { params: {

View File

@ -85,7 +85,7 @@ const feedbackOptions = [
'Was just testing, not a long-term user', 'Was just testing, not a long-term user',
'Missing features I needed', 'Missing features I needed',
'Setup and onboarding were too complex', 'Setup and onboarding were too complex',
'Prefer self-hosting over Frappe Cloud', 'Prefer self-hosting over Jingrow Cloud',
'Too expensive for my use case', 'Too expensive for my use case',
'Other', 'Other',
].map((option) => ({ label: option, value: option })); ].map((option) => ({ label: option, value: option }));

View File

@ -8,7 +8,7 @@ export default async function call(method, args) {
let headers = { let headers = {
Accept: 'application/json', Accept: 'application/json',
'Content-Type': 'application/json; charset=utf-8', 'Content-Type': 'application/json; charset=utf-8',
'X-Frappe-Site-Name': window.location.hostname 'X-Jingrow-Site-Name': window.location.hostname
}; };
let team = localStorage.getItem('current_team') || null; let team = localStorage.getItem('current_team') || null;
@ -17,7 +17,7 @@ export default async function call(method, args) {
} }
if (window.csrf_token && window.csrf_token !== '{{ csrf_token }}') { if (window.csrf_token && window.csrf_token !== '{{ csrf_token }}') {
headers['X-Frappe-CSRF-Token'] = window.csrf_token; headers['X-Jingrow-CSRF-Token'] = window.csrf_token;
} }
updateState(this, 'RequestStarted', null); updateState(this, 'RequestStarted', null);

View File

@ -67,7 +67,7 @@ export default class FileUploader {
xhr.open('POST', '/api/method/upload_file', true); xhr.open('POST', '/api/method/upload_file', true);
xhr.setRequestHeader('Accept', 'application/json'); xhr.setRequestHeader('Accept', 'application/json');
if (window.csrf_token && window.csrf_token !== '{{ csrf_token }}') { if (window.csrf_token && window.csrf_token !== '{{ csrf_token }}') {
xhr.setRequestHeader('X-Frappe-CSRF-Token', window.csrf_token); xhr.setRequestHeader('X-Jingrow-CSRF-Token', window.csrf_token);
} }
let form_data = new FormData(); let form_data = new FormData();

View File

@ -52,7 +52,7 @@ export default {
label: 'Version', label: 'Version',
fieldname: 'version', fieldname: 'version',
options: { options: {
doctype: 'Frappe Version', doctype: 'Jingrow Version',
}, },
}, },
{ {

View File

@ -332,7 +332,7 @@ export default {
label: 'Version', label: 'Version',
fieldname: 'group.version', fieldname: 'group.version',
options: { options: {
doctype: 'Frappe Version', doctype: 'Jingrow Version',
}, },
}, },
{ {
@ -452,7 +452,7 @@ export default {
label: 'Version', label: 'Version',
fieldname: 'version', fieldname: 'version',
options: { options: {
doctype: 'Frappe Version', doctype: 'Jingrow Version',
}, },
}, },
{ {

View File

@ -105,7 +105,7 @@ export default {
label: 'Version', label: 'Version',
fieldname: 'group.version', fieldname: 'group.version',
options: { options: {
doctype: 'Frappe Version', doctype: 'Jingrow Version',
}, },
}, },
{ {

View File

@ -91,7 +91,7 @@ export default {
}, },
pageMeta() { pageMeta() {
return { return {
title: `Install ${this.appDoc.title} - Frappe Cloud`, title: `Install ${this.appDoc.title} - Jingrow Cloud`,
}; };
}, },
components: { components: {

View File

@ -6,7 +6,7 @@
<div class="prose prose-sm max-w-none"> <div class="prose prose-sm max-w-none">
<h1 class="text-2xl font-semibold">Servers</h1> <h1 class="text-2xl font-semibold">Servers</h1>
<p class="text-p-base"> <p class="text-p-base">
With Servers on Frappe Cloud, you now get dedicated compute resources With Servers on Jingrow Cloud, you now get dedicated compute resources
for your sites. Servers come in pairs (Application + Database). You for your sites. Servers come in pairs (Application + Database). You
can run as many sites and bench groups as you want. All other features can run as many sites and bench groups as you want. All other features
like Private Bench Groups, SSH Access, Database Access work as is with like Private Bench Groups, SSH Access, Database Access work as is with
@ -56,7 +56,7 @@ export default {
features: [ features: [
'Unlimited sites & benches (no extra cost)', 'Unlimited sites & benches (no extra cost)',
'Isolated benches as separate environments', 'Isolated benches as separate environments',
'Frappe Product Warranty for any 5 opted-in sites', 'Jingrow Product Warranty for any 5 opted-in sites',
'One-click vertical scaling to higher plans', 'One-click vertical scaling to higher plans',
'Alerts for resource consumption', 'Alerts for resource consumption',
'Features to install, upgrade, backup, monitor & develop apps', 'Features to install, upgrade, backup, monitor & develop apps',

View File

@ -146,7 +146,7 @@
v-model="agreedToRegionConsent" v-model="agreedToRegionConsent"
:label="`I agree that the laws of the region selected by me ${ :label="`I agree that the laws of the region selected by me ${
this.cluster ? `(${this.cluster})` : '' this.cluster ? `(${this.cluster})` : ''
} shall stand applicable to me and Frappe.`" } shall stand applicable to me and Jingrow.`"
/> />
<ErrorMessage class="my-2" :message="$resources.newSite.error" /> <ErrorMessage class="my-2" :message="$resources.newSite.error" />
<Button <Button
@ -197,7 +197,7 @@ export default {
}, },
pageMeta() { pageMeta() {
return { return {
title: `Install ${this.appDoc.title} - Frappe Cloud`, title: `Install ${this.appDoc.title} - Jingrow Cloud`,
}; };
}, },
components: { components: {

View File

@ -878,7 +878,7 @@ export default {
return `Sign up to create your ${this.saasProduct.title} site`; return `Sign up to create your ${this.saasProduct.title} site`;
} }
return 'Create your Frappe Cloud account'; return 'Create your Jingrow Cloud account';
} }
}, },
subtitle() { subtitle() {
@ -888,7 +888,7 @@ export default {
if (this.saasProduct) { if (this.saasProduct) {
return `Get started and explore the easiest way to use ${this.saasProduct.title}`; return `Get started and explore the easiest way to use ${this.saasProduct.title}`;
} }
return 'Get started and explore the easiest way to use all Frappe apps'; return 'Get started and explore the easiest way to use all Jingrow apps';
} }
}, },
}, },

View File

@ -40,7 +40,7 @@
<div> <div>
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<h2 class="text-sm font-medium leading-6 text-gray-900"> <h2 class="text-sm font-medium leading-6 text-gray-900">
Select Frappe Framework Version Select Jingrow Framework Version
</h2> </h2>
</div> </div>
<div class="mt-2"> <div class="mt-2">
@ -116,7 +116,7 @@
<FormControl <FormControl
type="checkbox" type="checkbox"
v-model="agreedToRegionConsent" v-model="agreedToRegionConsent"
:label="`I agree that the laws of the region selected by me shall stand applicable to me and Frappe.`" :label="`I agree that the laws of the region selected by me shall stand applicable to me and Jingrow.`"
/> />
<ErrorMessage class="my-2" :message="$resources.createBench.error" /> <ErrorMessage class="my-2" :message="$resources.createBench.error" />
<Button <Button
@ -267,7 +267,7 @@ export default {
summaryOptions() { summaryOptions() {
return [ return [
{ {
label: 'Frappe Framework Version', label: 'Jingrow Framework Version',
value: this.benchVersion, value: this.benchVersion,
}, },
{ {

View File

@ -314,7 +314,7 @@
<FormControl <FormControl
type="checkbox" type="checkbox"
v-model="agreedToRegionConsent" v-model="agreedToRegionConsent"
:label="`I agree that the laws of the region selected by me shall stand applicable to me and Frappe.`" :label="`I agree that the laws of the region selected by me shall stand applicable to me and Jingrow.`"
/> />
<ErrorMessage <ErrorMessage
class="my-2" class="my-2"

View File

@ -52,7 +52,7 @@
<div v-if="!bench"> <div v-if="!bench">
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<h2 class="text-base font-medium leading-6 text-gray-900"> <h2 class="text-base font-medium leading-6 text-gray-900">
Select Frappe Framework Version Select Jingrow Framework Version
</h2> </h2>
</div> </div>
<div class="mt-2"> <div class="mt-2">
@ -169,8 +169,8 @@
> >
<lucide-badge-check class="h-4 w-8 text-gray-600" /> <lucide-badge-check class="h-4 w-8 text-gray-600" />
<span class="ml-4"> <span class="ml-4">
<strong>Support</strong> covers only issues of Frappe apps and not <strong>Support</strong> covers only issues of Jingrow apps and not
functional queries. You can raise a support ticket for Frappe functional queries. You can raise a support ticket for Jingrow
Cloud issues for all plans. Cloud issues for all plans.
</span> </span>
</div> </div>
@ -237,7 +237,7 @@
<FormControl <FormControl
type="checkbox" type="checkbox"
v-model="agreedToRegionConsent" v-model="agreedToRegionConsent"
:label="`I agree that the laws of the region selected by me (${selectedClusterTitle}) shall stand applicable to me and Frappe.`" :label="`I agree that the laws of the region selected by me (${selectedClusterTitle}) shall stand applicable to me and Jingrow.`"
/> />
<FormControl <FormControl
class="checkbox" class="checkbox"
@ -715,7 +715,7 @@ export default {
return [ return [
{ {
label: 'Frappe Framework Version', label: 'Jingrow Framework Version',
value: this.selectedVersion?.name, value: this.selectedVersion?.name,
}, },
{ {

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="h-screen overflow-hidden"> <div class="h-screen overflow-hidden">
<LoginBox title="Log in to your site on Frappe Cloud" :subtitle="subtitle"> <LoginBox title="Log in to your site on Jingrow Cloud" :subtitle="subtitle">
<template v-slot:default> <template v-slot:default>
<div> <div>
<div v-if="sitePrePicked"> <div v-if="sitePrePicked">
@ -203,7 +203,7 @@
name: 'Login', name: 'Login',
}" }"
> >
Go to Frappe Cloud dashboard Go to Jingrow Cloud dashboard
</router-link> </router-link>
</div> </div>
</div> </div>

View File

@ -813,7 +813,7 @@ export default {
title: 'Optimize Database Tables', title: 'Optimize Database Tables',
message: tableName message: tableName
? `Do you want to optimize the table <strong>${tableName}</strong> to reclaim space ?<br>` ? `Do you want to optimize the table <strong>${tableName}</strong> to reclaim space ?<br>`
: `Frappe Cloud will find tables where reclaimable space exceeds 100 MB or 20% of the table size.<br>Are you sure you want to optimize the database tables ?<br>`, : `Jingrow Cloud will find tables where reclaimable space exceeds 100 MB or 20% of the table size.<br>Are you sure you want to optimize the database tables ?<br>`,
primaryAction: { primaryAction: {
label: 'Optimize', label: 'Optimize',
variant: 'solid', variant: 'solid',

View File

@ -48,7 +48,7 @@
v-model="terms_accepted" v-model="terms_accepted"
class="mr-0.5 py-1 align-baseline" class="mr-0.5 py-1 align-baseline"
/> />
I agree to Frappe&nbsp; I agree to Jingrow&nbsp;
<Link href="https://jcloud.jingrow.com/terms" target="_blank"> <Link href="https://jcloud.jingrow.com/terms" target="_blank">
Terms of Service </Link Terms of Service </Link
>,&nbsp; >,&nbsp;

View File

@ -65,7 +65,7 @@
v-model="terms_accepted" v-model="terms_accepted"
class="mr-0.5 py-1 align-baseline" class="mr-0.5 py-1 align-baseline"
/> />
I agree to Frappe&nbsp; I agree to Jingrow&nbsp;
<Link href="https://jcloud.jingrow.com/terms" target="_blank"> <Link href="https://jcloud.jingrow.com/terms" target="_blank">
Terms of Service </Link Terms of Service </Link
>,&nbsp; >,&nbsp;

View File

@ -107,7 +107,7 @@ async function runSignupFlow(page: Page, product: string) {
try { try {
const baseHost = new URL(process.env.BASE_URL || 'http://localhost:8010').hostname; const baseHost = new URL(process.env.BASE_URL || 'http://localhost:8010').hostname;
const otpRes = await fetch(`${otpHelper}?account_request=${encodeURIComponent(accountRequestId)}`, { const otpRes = await fetch(`${otpHelper}?account_request=${encodeURIComponent(accountRequestId)}`, {
headers: { 'X-Frappe-Site-Name': baseHost } headers: { 'X-Jingrow-Site-Name': baseHost }
}); });
const txt = await otpRes.text(); const txt = await otpRes.text();
if (otpRes.ok) { if (otpRes.ok) {

View File

@ -78,7 +78,7 @@ References: https://mariadb.com/kb/en/building-mariadb-on-ubuntu/
We need to [sign the packages with OpenPGP](https://ubuntu.com/server/docs/third-party-apt-repositories) We need to [sign the packages with OpenPGP](https://ubuntu.com/server/docs/third-party-apt-repositories)
1. Create a OpenPGP key for `Frappe Developers <developers@framework.jingrow.com>`. This is an interactive step. Refer framework.jingrow.com/app/jingrow-asset for Paasphrase. 1. Create a OpenPGP key for `Jingrow Developers <developers@framework.jingrow.com>`. This is an interactive step. Refer framework.jingrow.com/app/jingrow-asset for Paasphrase.
```sh ```sh
gpg --full-gen-key gpg --full-gen-key
@ -92,7 +92,7 @@ $ gpg --list-secret-key --with-subkey-fingerprint
------------------------------- -------------------------------
sec rsa4096 2024-01-29 [SC] sec rsa4096 2024-01-29 [SC]
2AADEF02BE446B0FA3B0AC3DF38C274AC216D014 2AADEF02BE446B0FA3B0AC3DF38C274AC216D014
uid [ultimate] Frappe Developers <developers@framework.jingrow.com> uid [ultimate] Jingrow Developers <developers@framework.jingrow.com>
``` ```
Export the public key in the repository directory Export the public key in the repository directory

View File

@ -174,7 +174,7 @@ server {
proxy_http_version 1.1; proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frappe-Site-Name $site_name_sxjfjnv; proxy_set_header X-Jingrow-Site-Name $site_name_sxjfjnv;
proxy_set_header Host $host; proxy_set_header Host $host;
proxy_set_header X-Use-X-Accel-Redirect True; proxy_set_header X-Use-X-Accel-Redirect True;
proxy_read_timeout 120; proxy_read_timeout 120;
@ -246,7 +246,7 @@ server {
proxy_http_version 1.1; proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade"; proxy_set_header Connection "upgrade";
proxy_set_header X-Frappe-Site-Name $site_name_sxjfjnv; proxy_set_header X-Jingrow-Site-Name $site_name_sxjfjnv;
proxy_set_header Origin $scheme://$http_host; proxy_set_header Origin $scheme://$http_host;
proxy_set_header Host $host; proxy_set_header Host $host;
@ -262,7 +262,7 @@ server {
proxy_set_header X-Forwarded-For $REMOTE_ADDR; proxy_set_header X-Forwarded-For $REMOTE_ADDR;
proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frappe-Site-Name $site_name_sxjfjnv; proxy_set_header X-Jingrow-Site-Name $site_name_sxjfjnv;
proxy_set_header Host $host; proxy_set_header Host $host;
proxy_read_timeout 120; proxy_read_timeout 120;
proxy_redirect off; proxy_redirect off;
@ -290,7 +290,7 @@ server {
proxy_set_header X-Forwarded-For $REMOTE_ADDR; proxy_set_header X-Forwarded-For $REMOTE_ADDR;
proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frappe-Site-Name $site_name_sxjfjnv; proxy_set_header X-Jingrow-Site-Name $site_name_sxjfjnv;
proxy_set_header Host $host; proxy_set_header Host $host;
proxy_set_header X-Use-X-Accel-Redirect True; proxy_set_header X-Use-X-Accel-Redirect True;
proxy_read_timeout 120; proxy_read_timeout 120;
@ -315,7 +315,7 @@ server {
proxy_set_header X-Forwarded-For $REMOTE_ADDR; proxy_set_header X-Forwarded-For $REMOTE_ADDR;
proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frappe-Site-Name $site_name_sxjfjnv; proxy_set_header X-Jingrow-Site-Name $site_name_sxjfjnv;
proxy_set_header Host $host; proxy_set_header Host $host;
proxy_set_header X-Use-X-Accel-Redirect True; proxy_set_header X-Use-X-Accel-Redirect True;
proxy_read_timeout 120; proxy_read_timeout 120;
@ -340,7 +340,7 @@ server {
proxy_set_header X-Forwarded-For $REMOTE_ADDR; proxy_set_header X-Forwarded-For $REMOTE_ADDR;
proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frappe-Site-Name $site_name_sxjfjnv; proxy_set_header X-Jingrow-Site-Name $site_name_sxjfjnv;
proxy_set_header Host $host; proxy_set_header Host $host;
proxy_set_header X-Use-X-Accel-Redirect True; proxy_set_header X-Use-X-Accel-Redirect True;
proxy_read_timeout 120; proxy_read_timeout 120;
@ -374,7 +374,7 @@ server {
proxy_set_header X-Forwarded-For $REMOTE_ADDR; proxy_set_header X-Forwarded-For $REMOTE_ADDR;
proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frappe-Site-Name $site_name_sxjfjnv; proxy_set_header X-Jingrow-Site-Name $site_name_sxjfjnv;
proxy_set_header Host $host; proxy_set_header Host $host;
proxy_set_header X-Use-X-Accel-Redirect True; proxy_set_header X-Use-X-Accel-Redirect True;
proxy_read_timeout 120; proxy_read_timeout 120;
@ -408,7 +408,7 @@ server {
proxy_http_version 1.1; proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $REMOTE_ADDR; proxy_set_header X-Forwarded-For $REMOTE_ADDR;
proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frappe-Site-Name $site_name_sxjfjnv; proxy_set_header X-Jingrow-Site-Name $site_name_sxjfjnv;
proxy_set_header Host $host; proxy_set_header Host $host;
proxy_set_header X-Use-X-Accel-Redirect True; proxy_set_header X-Use-X-Accel-Redirect True;
proxy_read_timeout 120; proxy_read_timeout 120;

View File

@ -41,7 +41,7 @@ We have `earlyoom` installed on all servers, which should kill processes that ab
### Alerts ### Alerts
We have alerts set up for different criteria. Eg: Sites Down. These alerts are sent to our Telegram group: **Frappe Cloud Alerts**. Members of the group are advised to monitor the group for alerts posted by **Frappe Cloud Alert Bot**. We have alerts set up for different criteria. Eg: Sites Down. These alerts are sent to our Telegram group: **Jingrow Cloud Alerts**. Members of the group are advised to monitor the group for alerts posted by **Jingrow Cloud Alert Bot**.
Categories of alerts exist: Categories of alerts exist:

View File

@ -143,7 +143,7 @@ In case when you have to upgrade an AWS EC2 instance, you can follow below steps
Increasing the Storage on AWS Server Increasing the Storage on AWS Server
------------------------------------ ------------------------------------
You can increase the storage of the AWS Server by using **Frappe Cloud Alerts Telegram Bot**. You can do this by invoking the bot in the group. You can increase the storage of the AWS Server by using **Jingrow Cloud Alerts Telegram Bot**. You can do this by invoking the bot in the group.
`@jingrow_cloud_bot server f29-mumbai.jingrow.cloud execute increase_disk_size <size in gb>` `@jingrow_cloud_bot server f29-mumbai.jingrow.cloud execute increase_disk_size <size in gb>`
The server name can be any server on AWS present in the server doctype and `increase_disk_size` can be changed to any whitelisted method on the doctype(server). An EBS instance of 50GB will be attached to the server if no size is specified. The server name can be any server on AWS present in the server doctype and `increase_disk_size` can be changed to any whitelisted method on the doctype(server). An EBS instance of 50GB will be attached to the server if no size is specified.

View File

@ -13,9 +13,9 @@ This documentation is intended to help consultants carry out daily operational t
| Term | Description | | Term | Description |
| --- | --- | | --- | --- |
| FrappeCloud | Platform for hosting customer sites | | FrappeCloud | Platform for hosting customer sites |
| Team | A team represents a group of people. Every account created on Frappe Cloud belongs to a team. If a user signs up on Frappe Cloud without an invite, theyll belong to their own team. A Team document has a child table of user emails | | Team | A team represents a group of people. Every account created on Jingrow Cloud belongs to a team. If a user signs up on Jingrow Cloud without an invite, theyll belong to their own team. A Team document has a child table of user emails |
| Desk Page/Document/Pg | Any webpage that starts with *jcloud.jingrow.com/app* in the url, powered by Frappe Framework, similar to the one you see on framework.jingrow.com. Customers of Frappe Cloud cannot access these pages | | Desk Page/Document/Pg | Any webpage that starts with *jcloud.jingrow.com/app* in the url, powered by Jingrow Framework, similar to the one you see on framework.jingrow.com. Customers of Jingrow Cloud cannot access these pages |
| Dashboard Page | Any webpage that starts with *jcloud.jingrow.com/dashboard* in the url, powered by Vue js, custom UI for users. Customers of Frappe Cloud only see these pages. | | Dashboard Page | Any webpage that starts with *jcloud.jingrow.com/dashboard* in the url, powered by Vue js, custom UI for users. Customers of Jingrow Cloud only see these pages. |
### Site Desk Page ### Site Desk Page
@ -76,7 +76,7 @@ From the dashboard page of the site, go to apps section and click on **Add app**
![App List](../files/apps.png) ![App List](../files/apps.png)
Then you can select an app from the list shown. If the app you desire is not found on the list, contact a Frappe Cloud developer. Then you can select an app from the list shown. If the app you desire is not found on the list, contact a Jingrow Cloud developer.
### Change Plan ### Change Plan
@ -199,7 +199,7 @@ DEL <db_name>|rate-limit-counter-XXXXX
> >
> >
### Transferring Central Site to Frappe Cloud customer ### Transferring Central Site to Jingrow Cloud customer
1. From Site pg, go to Subscription > Change Team and select the team you want to move the account to 1. From Site pg, go to Subscription > Change Team and select the team you want to move the account to
2. From Site pg, go to Subscription > Change Plan and select desired plan 2. From Site pg, go to Subscription > Change Plan and select desired plan

View File

@ -4,7 +4,7 @@ allow_guest: 1
published: 1 published: 1
--- ---
This page describes how Subscription Management works in Frappe Cloud. This page describes how Subscription Management works in Jingrow Cloud.
## DocTypes ## DocTypes
@ -36,7 +36,7 @@ Now, he creates a site called **tennismart.jingrow.cloud** on the $10 plan.
- A site record of tennismart.jingrow.cloud will be created. - A site record of tennismart.jingrow.cloud will be created.
- A subscription record saying that this site is on $10 plan will be created. - A subscription record saying that this site is on $10 plan will be created.
Frappe Cloud charges you based on how many active sites you have per day. So, Jingrow Cloud charges you based on how many active sites you have per day. So,
the per day charge of an active site is $10 / 31 = $0.32. We divide by 31 since the per day charge of an active site is $10 / 31 = $0.32. We divide by 31 since
that is the total number of days in January. that is the total number of days in January.
@ -70,7 +70,7 @@ days of usage, this is how his invoice will look:
| cafelegals.jingrow.cloud | $50 | 10 | $16.1 | | cafelegals.jingrow.cloud | $50 | 10 | $16.1 |
Now, John deletes the site cafelegals.jingrow.cloud because he doesn't have any Now, John deletes the site cafelegals.jingrow.cloud because he doesn't have any
use for it. Frappe Cloud will stop charging for the site. After 2 days, this is use for it. Jingrow Cloud will stop charging for the site. After 2 days, this is
how his invoice will look: how his invoice will look:
| Site | Plan | Days | Amount | | Site | Plan | Days | Amount |
@ -91,7 +91,7 @@ his invoice will look like:
| cafelegals.jingrow.cloud.archived | $50 | 10 | $16.1 | | cafelegals.jingrow.cloud.archived | $50 | 10 | $16.1 |
| | | **Total** | $35.3 | | | | **Total** | $35.3 |
Notice that since he started using the Frappe Cloud service from 5 January, he Notice that since he started using the Jingrow Cloud service from 5 January, he
was only charged from that day. was only charged from that day.
Now, at 6pm IST his invoice will be finalized with the total usage amount $35.3. Now, at 6pm IST his invoice will be finalized with the total usage amount $35.3.

View File

@ -4,7 +4,7 @@ allow_guest: 1
published: 1 published: 1
--- ---
Typical Frappe Cloud (FC) cluster has a similar architecture: Typical Jingrow Cloud (FC) cluster has a similar architecture:
![FC Cluster](../files/fc-cluster.png) ![FC Cluster](../files/fc-cluster.png)

View File

@ -4,14 +4,14 @@ allow_guest: 1
published: 1 published: 1
--- ---
This guide shows you how to setup your development machine for Frappe Cloud development. By the end of this guide, you will have a replica of the FC production environment. This guide shows you how to setup your development machine for Jingrow Cloud development. By the end of this guide, you will have a replica of the FC production environment.
> “Patience is bitter, but its fruit is sweet.” Aristotle > “Patience is bitter, but its fruit is sweet.” Aristotle
Introduction Introduction
------------ ------------
- `f` servers: These host your bench (`f` is for Frappe Apps) - `f` servers: These host your bench (`f` is for Jingrow Apps)
- `m` servers: These host the database (`m` is for MariaDB) - `m` servers: These host the database (`m` is for MariaDB)
- `n` servers: These are proxy servers (`n` is Nginx, which does the proxying) - `n` servers: These are proxy servers (`n` is Nginx, which does the proxying)
@ -27,9 +27,9 @@ You should have the following software packages installed on your computer befor
3. dns-route53 plugin for certbot: `pip3 install certbot-dns-route53` 3. dns-route53 plugin for certbot: `pip3 install certbot-dns-route53`
### Credentials from Frappe Assets ### Credentials from Jingrow Assets
You will need access to the following IAM accounts. If you're working at Frappe, you can request them from `Frappe Assets` at framework.jingrow.com: You will need access to the following IAM accounts. If you're working at Jingrow, you can request them from `Jingrow Assets` at framework.jingrow.com:
1. Hetzner 1. Hetzner
2. Digital Ocean 2. Digital Ocean
@ -63,7 +63,7 @@ Note down the Public and Private IP Addresses of all the three servers.
Creating DNS records in AWS Route53 Creating DNS records in AWS Route53
----------------------------------- -----------------------------------
1. Go to the AWS Console (again, credentials are in Frappe Assets), navigate to `Route 53 > Hosted Zones`. Click on `fc.jingrow.dev` domain name. 1. Go to the AWS Console (again, credentials are in Jingrow Assets), navigate to `Route 53 > Hosted Zones`. Click on `fc.jingrow.dev` domain name.
2. You have to create 4 DNS `A` records here. 2. You have to create 4 DNS `A` records here.
a. One record will be a wild-card sub-domain: `*.<name-initial>.fc.jingrow.dev` pointing to the IP address of the `n` server created in the previous section. a. One record will be a wild-card sub-domain: `*.<name-initial>.fc.jingrow.dev` pointing to the IP address of the `n` server created in the previous section.
b. The other 3 records will be for `f1`, `n1` and `m1` respectively. Use the IP address from the previous step. You can have a look at other such records if you get confused at any point. b. The other 3 records will be for `f1`, `n1` and `m1` respectively. Use the IP address from the previous step. You can have a look at other such records if you get confused at any point.
@ -308,7 +308,7 @@ Now under Roles, add `Press Admin` and `Press Member`.
Creating an App Creating an App
--------------- ---------------
The next step is to create an App that will ultimately be installed on our site. The first app in any release group must be `jingrow` (Frappe Framework), the name is case sensitive. Navigate to `App List` page and click on `'+ Add new App'` button on the top-right corner. Fill in the details as below: The next step is to create an App that will ultimately be installed on our site. The first app in any release group must be `jingrow` (Jingrow Framework), the name is case sensitive. Navigate to `App List` page and click on `'+ Add new App'` button on the top-right corner. Fill in the details as below:
![new app jingrow](../files/new-app-jingrow.png) ![new app jingrow](../files/new-app-jingrow.png)
@ -416,7 +416,7 @@ Call `_obtain_certificate` method on the TLS Certificate document
Testing Testing
------- -------
When you run `bench init` or `bench setup requirements`, Frappe installs only the runtime dependencies listed in `requirements.txt`. Development dependencies are not installed automatically, since production environments do not require them. When you run `bench init` or `bench setup requirements`, Jingrow installs only the runtime dependencies listed in `requirements.txt`. Development dependencies are not installed automatically, since production environments do not require them.
To set up a development or test environment, install the python dependencies using bench. This [internally calls pip](http://git.jingrow.com/jingrow/bench/blob/4fdaaf6a21b7245e039fd8c3d9509b0de1f44b2e/bench/utils/bench.py#L97) to install the dependencies from the dev-requirements file: To set up a development or test environment, install the python dependencies using bench. This [internally calls pip](http://git.jingrow.com/jingrow/bench/blob/4fdaaf6a21b7245e039fd8c3d9509b0de1f44b2e/bench/utils/bench.py#L97) to install the dependencies from the dev-requirements file:
@ -441,4 +441,4 @@ Tips
Conclusion Conclusion
---------- ----------
If you made till here, well done and be proud of yourself. Now, its time to build awesome things. Good Luck with your journey on Frappe Cloud. If you made till here, well done and be proud of yourself. Now, its time to build awesome things. Good Luck with your journey on Jingrow Cloud.

View File

@ -68,7 +68,7 @@ Local machines have following names/ips by default
|Type |Name |Public IP |Private IP | |Type |Name |Public IP |Private IP |
|-------------------|-----------|-----------|-----------| |-------------------|-----------|-----------|-----------|
|Proxy Server |n1.fc.dev |10.0.1.101 |10.1.1.101 | |Proxy Server |n1.fc.dev |10.0.1.101 |10.1.1.101 |
|Frappe Server |f1.fc.dev |10.0.2.101 |10.1.2.101 | |Jingrow Server |f1.fc.dev |10.0.2.101 |10.1.2.101 |
|Database Server |m1.fc.dev |10.0.3.101 |10.1.3.101 | |Database Server |m1.fc.dev |10.0.3.101 |10.1.3.101 |
|Database Server |m2.fc.dev |10.0.3.102 |10.1.3.102 | |Database Server |m2.fc.dev |10.0.3.102 |10.1.3.102 |

View File

@ -234,7 +234,7 @@ to check out [this vim plugin](http://git.jingrow.com/ankush/jingrow_test.vim/)
[this vscode plugin](https://marketplace.visualstudio.com/items?itemName=AnkushMenat.jingrow-test-runner) [this vscode plugin](https://marketplace.visualstudio.com/items?itemName=AnkushMenat.jingrow-test-runner)
> Note: jingrow_test plugin doesn't populate vim's quickfix list yet. Though > Note: jingrow_test plugin doesn't populate vim's quickfix list yet. Though
> Frappe's test runner output isn't very pyunit errorformat friendly, you can > Jingrow's test runner output isn't very pyunit errorformat friendly, you can
> still make it work with a [custom errorformat](http://git.jingrow.com/balamurali27/dotfiles/blob/85dc18a/.config/nvim/after/plugin/jingrow.vim#LL10C1-L10C128) and some hacks to [set makeprg](http://git.jingrow.com/balamurali27/dotfiles/blob/0bcd6270770d0b67b63fc0ea308e6834fefda5a6/.config/nvim/init.vim#L150C7-L163) > still make it work with a [custom errorformat](http://git.jingrow.com/balamurali27/dotfiles/blob/85dc18a/.config/nvim/after/plugin/jingrow.vim#LL10C1-L10C128) and some hacks to [set makeprg](http://git.jingrow.com/balamurali27/dotfiles/blob/0bcd6270770d0b67b63fc0ea308e6834fefda5a6/.config/nvim/init.vim#L150C7-L163)
# References # References

View File

@ -15,7 +15,7 @@ CLI_USER_AGENT = (
class CloudSession(Session): class CloudSession(Session):
"""Custom requests.Session with Frappe sid cookie""" """Custom requests.Session with Jingrow sid cookie"""
def __init__(self, session_id: str): def __init__(self, session_id: str):
super().__init__() super().__init__()

View File

@ -56,7 +56,7 @@ def create_bench_group(
ctx: typer.Context, ctx: typer.Context,
name: Annotated[str, typer.Argument(help="Bench group name")], name: Annotated[str, typer.Argument(help="Bench group name")],
version: Annotated[ version: Annotated[
str, typer.Option("--version", help="Frappe Framework Version (e.g. Version 15)") str, typer.Option("--version", help="Jingrow Framework Version (e.g. Version 15)")
] = "", ] = "",
server: Annotated[str, typer.Option("--server", help="Server name")] = "", server: Annotated[str, typer.Option("--server", help="Server name")] = "",
cluster: Annotated[str, typer.Option("--cluster", help="Cluster (e.g. Mumbai)")] = "", cluster: Annotated[str, typer.Option("--cluster", help="Cluster (e.g. Mumbai)")] = "",

View File

@ -5,7 +5,7 @@ readme = "README.md"
license = "AGPL-3.0-only" license = "AGPL-3.0-only"
requires-python = ">=3.10" requires-python = ">=3.10"
authors = [ authors = [
{ name = "Frappe Technologies Pvt Ltd", email = "developers@framework.jingrow.com" }, { name = "Jingrow Technologies Pvt Ltd", email = "developers@framework.jingrow.com" },
] ]
classifiers = [ classifiers = [
"Development Status :: 5 - Production/Stable", "Development Status :: 5 - Production/Stable",

View File

@ -69,15 +69,15 @@ func main() {
logError("Please try again or contact support if the issue persists.") logError("Please try again or contact support if the issue persists.")
waitForUser() waitForUser()
} else { } else {
fmt.Println("\n\nThank you for using Frappe Cloud Restore CLI!") fmt.Println("\n\nThank you for using Jingrow Cloud Restore CLI!")
fmt.Println("Exiting in 5 seconds...") fmt.Println("Exiting in 5 seconds...")
time.Sleep(5 * time.Second) time.Sleep(5 * time.Second)
} }
}() }()
session := GetSession() session := GetSession()
loginRequired := true loginRequired := true
fmt.Println("Welcome to Frappe Cloud Restore CLI") fmt.Println("Welcome to Jingrow Cloud Restore CLI")
fmt.Println("This CLI will help you restore your site on Frappe Cloud") fmt.Println("This CLI will help you restore your site on Jingrow Cloud")
fmt.Print("\n\n") fmt.Print("\n\n")
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
@ -103,7 +103,7 @@ func main() {
// Prompt user to log in // Prompt user to log in
if loginRequired { if loginRequired {
email, err := tui.AskInput("Enter your email address to login to Frappe Cloud", "") email, err := tui.AskInput("Enter your email address to login to Jingrow Cloud", "")
if err != nil { if err != nil {
logError("Error asking for email: %s", err.Error()) logError("Error asking for email: %s", err.Error())
waitForUser() waitForUser()
@ -442,7 +442,7 @@ func main() {
spinner.Done() spinner.Done()
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
fmt.Println("Site restoration triggered successfully!") fmt.Println("Site restoration triggered successfully!")
fmt.Println("You can check the status of the restoration in your Frappe Cloud dashboard.") fmt.Println("You can check the status of the restoration in your Jingrow Cloud dashboard.")
fmt.Printf("%s/dashboard/sites/%s/insights/jobs\n", session.Server, selectedSite) fmt.Printf("%s/dashboard/sites/%s/insights/jobs\n", session.Server, selectedSite)
if isDatabaseGettingRestored { if isDatabaseGettingRestored {
fmt.Println() fmt.Println()

View File

@ -6,7 +6,7 @@ readme = "README.md"
requires-python = ">=3.7" requires-python = ">=3.7"
license = { text = "MIT" } license = { text = "MIT" }
authors = [ authors = [
{ name = "Frappe Cloud", email = "cloud@framework.jingrow.com" } { name = "Jingrow Cloud", email = "cloud@framework.jingrow.com" }
] ]
dependencies = [ dependencies = [
"duckdb==1.2.2" "duckdb==1.2.2"

View File

@ -280,7 +280,7 @@ def send_login_link(email):
print() print()
jingrow.sendmail( jingrow.sendmail(
subject="Login to Frappe Cloud", subject="Login to Jingrow Cloud",
recipients=email, recipients=email,
template="one_time_login_link", template="one_time_login_link",
args={"link": link, "minutes": minutes}, args={"link": link, "minutes": minutes},
@ -951,7 +951,7 @@ def get_jingrow_io_auth_url() -> str | None:
try: try:
provider = jingrow.get_last_pg( provider = jingrow.get_last_pg(
"Social Login Key", filters={"enable_social_login": 1, "provider_name": "Frappe"} "Social Login Key", filters={"enable_social_login": 1, "provider_name": "Jingrow"}
) )
except DoesNotExistError: except DoesNotExistError:
return None return None
@ -1268,7 +1268,7 @@ def get_2fa_qr_code_url():
).insert() ).insert()
return pyotp.totp.TOTP(user_totp_secret).provisioning_uri( return pyotp.totp.TOTP(user_totp_secret).provisioning_uri(
name=jingrow.session.user, issuer_name="Frappe Cloud" name=jingrow.session.user, issuer_name="Jingrow Cloud"
) )

View File

@ -1,4 +1,4 @@
# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and Contributors # Copyright (c) 2021, Jingrow Technologies Pvt. Ltd. and Contributors
# For license information, please see license.txt # For license information, please see license.txt
from __future__ import annotations from __future__ import annotations

View File

@ -214,7 +214,7 @@ def get_default_apps():
def get_app_versions_list(only_jingrow=False): def get_app_versions_list(only_jingrow=False):
AppSource = jingrow.qb.DocType("App Source") AppSource = jingrow.qb.DocType("App Source")
FrappeVersion = jingrow.qb.DocType("Frappe Version") FrappeVersion = jingrow.qb.DocType("Jingrow Version")
AppSourceVersion = jingrow.qb.DocType("App Source Version") AppSourceVersion = jingrow.qb.DocType("App Source Version")
rows = ( rows = (
jingrow.qb.from_(AppSourceVersion) jingrow.qb.from_(AppSourceVersion)

View File

@ -1,4 +1,4 @@
# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors # Copyright (c) 2020, Jingrow Technologies Pvt. Ltd. and Contributors
# For license information, please see license.txt # For license information, please see license.txt
from __future__ import annotations from __future__ import annotations
@ -706,8 +706,8 @@ def create_razorpay_order(amount, transaction_type, pg_name=None) -> dict | None
"amount": int(amount * 100), "amount": int(amount * 100),
"currency": team.currency, "currency": team.currency,
"notes": { "notes": {
"Description": "Order for Frappe Cloud Prepaid Credits", "Description": "Order for Jingrow Cloud Prepaid Credits",
"Team (Frappe Cloud ID)": team.name, "Team (Jingrow Cloud ID)": team.name,
"gst": gst_amount, "gst": gst_amount,
"Type": payment_record_type, "Type": payment_record_type,
}, },
@ -884,7 +884,7 @@ def generate_stk_push(**kwargs):
callback_url=callback_url, callback_url=callback_url,
reference_code=mpesa_setup.till_number, reference_code=mpesa_setup.till_number,
phone_number=mobile_number, phone_number=mobile_number,
description="Frappe Cloud Payment", description="Jingrow Cloud Payment",
) )
return response # noqa: RET504 return response # noqa: RET504

View File

@ -1,4 +1,4 @@
# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and Contributors # Copyright (c) 2021, Jingrow Technologies Pvt. Ltd. and Contributors
# For license information, please see license.txt # For license information, please see license.txt
import jingrow import jingrow

View File

@ -1,4 +1,4 @@
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and Contributors # Copyright (c) 2023, Jingrow Technologies Pvt. Ltd. and Contributors
# MIT License. See license.txt # MIT License. See license.txt
from __future__ import annotations from __future__ import annotations
@ -72,7 +72,7 @@ ALLOWED_DOCTYPES = [
"Product Trial", "Product Trial",
"Press Notification", "Press Notification",
"User SSH Key", "User SSH Key",
"Frappe Version", "Jingrow Version",
"Dashboard Banner", "Dashboard Banner",
"App Release Approval Request", "App Release Approval Request",
"Press Webhook", "Press Webhook",

View File

@ -137,7 +137,7 @@ def send_verification_code(domain: str, route: str = ""):
team_name = site_info.get("team") team_name = site_info.get("team")
team_info = jingrow.get_value("Team", team_name, ["name", "enabled", "user", "enforce_2fa"], as_dict=True) team_info = jingrow.get_value("Team", team_name, ["name", "enabled", "user", "enforce_2fa"], as_dict=True)
if not team_info or not team_info.get("enabled"): if not team_info or not team_info.get("enabled"):
jingrow.throw("Your Frappe Cloud team is disabled currently.") jingrow.throw("Your Jingrow Cloud team is disabled currently.")
check_if_user_can_login(team_info, site_info) check_if_user_can_login(team_info, site_info)
@ -232,19 +232,19 @@ def check_if_user_can_login(team_info, site_info):
# restrict to SaaS Site # restrict to SaaS Site
if not (site_info.get("standby_for") or site_info.get("standby_for_product")): if not (site_info.get("standby_for") or site_info.get("standby_for_product")):
jingrow.throw("Only SaaS sites are allowed to login to Frappe Cloud via current method.") jingrow.throw("Only SaaS sites are allowed to login to Jingrow Cloud via current method.")
def send_email_with_verification_code(email, otp): def send_email_with_verification_code(email, otp):
if jingrow.conf.developer_mode: if jingrow.conf.developer_mode:
print("\nVerification Code for login to Frappe Cloud:") print("\nVerification Code for login to Jingrow Cloud:")
print(f"\nOTP for {email}:") print(f"\nOTP for {email}:")
print(otp) print(otp)
print() print()
else: else:
jingrow.sendmail( jingrow.sendmail(
recipients=email, recipients=email,
subject="Verification Code for Frappe Cloud Login", subject="Verification Code for Jingrow Cloud Login",
template="verification_code_for_login", template="verification_code_for_login",
args={ args={
"full_name": jingrow.get_value("User", email, "full_name"), "full_name": jingrow.get_value("User", email, "full_name"),

View File

@ -222,7 +222,7 @@ def app(owner, repository, branch, installation=None):
if not any(x in tree for x in py_setup_files): if not any(x in tree for x in py_setup_files):
setup_filenames = jingrow.bold(" or ".join(py_setup_files)) setup_filenames = jingrow.bold(" or ".join(py_setup_files))
reason = f"Files {setup_filenames} do not exist in app directory." reason = f"Files {setup_filenames} do not exist in app directory."
jingrow.throw(f"Not a valid Frappe App! {reason}") jingrow.throw(f"Not a valid Jingrow App! {reason}")
app_name, title = _get_app_name_and_title_from_hooks( app_name, title = _get_app_name_and_title_from_hooks(
owner, owner,
@ -306,7 +306,7 @@ def _get_app_name_and_title_from_hooks(
) )
break break
jingrow.throw(f"Not a valid Frappe App! {reason_for_invalidation}") jingrow.throw(f"Not a valid Jingrow App! {reason_for_invalidation}")
return None return None

View File

@ -1,4 +1,4 @@
# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and Contributors # Copyright (c) 2023, Jingrow Technologies Pvt. Ltd. and Contributors
# MIT License. See license.txt # MIT License. See license.txt
from __future__ import annotations from __future__ import annotations
@ -125,7 +125,7 @@ def callback(code=None, state=None): # noqa: C901
def invalid_login(): def invalid_login():
jingrow.local.response["http_status_code"] = 401 jingrow.local.response["http_status_code"] = 401
return "Invalid state parameter. The session timed out. Please try again or contact Frappe Cloud support at https://jcloud.jingrow.com/support" return "Invalid state parameter. The session timed out. Please try again or contact Jingrow Cloud support at https://jcloud.jingrow.com/support"
def google_oauth_flow(): def google_oauth_flow():

View File

@ -75,7 +75,7 @@ def get_install_app_options(marketplace_app: str) -> dict:
clusters = private_groups = [] clusters = private_groups = []
latest_stable_version = jingrow.get_all( latest_stable_version = jingrow.get_all(
"Frappe Version", "max(name) as latest_version", pluck="latest_version" "Jingrow Version", "max(name) as latest_version", pluck="latest_version"
)[0] )[0]
latest_public_group = jingrow.db.get_value( latest_public_group = jingrow.db.get_value(
"Release Group", "Release Group",
@ -327,7 +327,7 @@ def create_site_for_app(
"""Create a site for a marketplace app""" """Create a site for a marketplace app"""
latest_stable_version = jingrow.db.get_value( latest_stable_version = jingrow.db.get_value(
"Frappe Version", {"status": "Stable"}, "name", order_by="number desc" "Jingrow Version", {"status": "Stable"}, "name", order_by="number desc"
) )
if site_should_be_created_on_public_bench(apps): if site_should_be_created_on_public_bench(apps):
@ -429,8 +429,8 @@ def become_publisher():
@jingrow.whitelist() @jingrow.whitelist()
def jingrow_versions(): def jingrow_versions():
"""Return a list of Frappe Version names""" """Return a list of Jingrow Version names"""
return jingrow.get_all("Frappe Version", pluck="name", order_by="name desc") return jingrow.get_all("Jingrow Version", pluck="name", order_by="name desc")
@jingrow.whitelist() @jingrow.whitelist()
@ -704,7 +704,7 @@ def options_for_marketplace_app() -> dict[str, dict]: # noqa: C901
filtered_apps = [] filtered_apps = []
for version in versions: for version in versions:
# Remove Frappe Framework # Remove Jingrow Framework
version["apps"] = [app for app in version["apps"] if app["name"] != "jingrow"] version["apps"] = [app for app in version["apps"] if app["name"] != "jingrow"]
for app in version["apps"]: for app in version["apps"]:
@ -1277,7 +1277,7 @@ def change_branch(name, source, version, to_branch):
@protected("Marketplace App") @protected("Marketplace App")
@jingrow.whitelist() @jingrow.whitelist()
def options_for_version(name): def options_for_version(name):
jingrow_version = jingrow.get_all("Frappe Version", {"public": True}, pluck="name") jingrow_version = jingrow.get_all("Jingrow Version", {"public": True}, pluck="name")
added_versions = jingrow.get_all("Marketplace App Version", {"parent": name}, pluck="version") added_versions = jingrow.get_all("Marketplace App Version", {"parent": name}, pluck="version")
app = jingrow.db.get_value("Marketplace App", name, "app") app = jingrow.db.get_value("Marketplace App", name, "app")
source = jingrow.get_value("App Source", {"app": app, "team": get_current_team()}) source = jingrow.get_value("App Source", {"app": app, "team": get_current_team()})

View File

@ -61,7 +61,7 @@ def callback(code=None, state=None):
pass pass
else: else:
jingrow.local.response["http_status_code"] = 401 jingrow.local.response["http_status_code"] = 401
return "Invalid state parameter. The session timed out. Please try again or contact Frappe Cloud support at https://jcloud.jingrow.com/support" return "Invalid state parameter. The session timed out. Please try again or contact Jingrow Cloud support at https://jcloud.jingrow.com/support"
try: try:
flow = google_oauth_flow() flow = google_oauth_flow()

View File

@ -635,7 +635,7 @@ def get_available_versions(for_bench: str | None = None):
} }
versions = jingrow.db.get_all( versions = jingrow.db.get_all(
"Frappe Version", "Jingrow Version",
["name", "default", "status", "number"], ["name", "default", "status", "number"],
filters, filters,
order_by="number desc", order_by="number desc",
@ -739,7 +739,7 @@ def get_new_site_options(group: str | None = None):
versions_filters.update({"status": ("!=", "End of Life")}) versions_filters.update({"status": ("!=", "End of Life")})
versions = jingrow.get_all( versions = jingrow.get_all(
"Frappe Version", "Jingrow Version",
["name", "number", "default", "status"], ["name", "number", "default", "status"],
filters=versions_filters, filters=versions_filters,
order_by="`default` desc, number desc", order_by="`default` desc, number desc",
@ -1158,7 +1158,7 @@ def get(name):
"team": site.team, "team": site.team,
"group_public": rg_info.public, "group_public": rg_info.public,
"latest_jingrow_version": jingrow.db.get_value( "latest_jingrow_version": jingrow.db.get_value(
"Frappe Version", {"status": "Stable", "public": True}, order_by="name desc" "Jingrow Version", {"status": "Stable", "public": True}, order_by="name desc"
), ),
"jingrow_version": jingrow_version, "jingrow_version": jingrow_version,
"server": site.server, "server": site.server,
@ -1578,7 +1578,7 @@ def validate_restoration_space_requirements(
if server.public: if server.public:
""" """
If it's a public server, Frappe Cloud will auto extend the disk space If it's a public server, Jingrow Cloud will auto extend the disk space
to accommodate the restoration. to accommodate the restoration.
""" """
allowed_to_upload = True allowed_to_upload = True
@ -2116,9 +2116,9 @@ def change_region(name, cluster, scheduled_datetime=None, skip_failing_patches=F
) )
def get_private_groups_for_upgrade(name, version, release_groups=None): def get_private_groups_for_upgrade(name, version, release_groups=None):
team = get_current_team() team = get_current_team()
version_number = jingrow.db.get_value("Frappe Version", version, "number") version_number = jingrow.db.get_value("Jingrow Version", version, "number")
next_version = jingrow.db.get_value( next_version = jingrow.db.get_value(
"Frappe Version", "Jingrow Version",
{ {
"number": version_number + 1, "number": version_number + 1,
"status": ("in", ("Stable", "End of Life")), "status": ("in", ("Stable", "End of Life")),

View File

@ -1,4 +1,4 @@
# Copyright (c) 2019, Frappe and Contributors # Copyright (c) 2019, Jingrow and Contributors
# See license.txt # See license.txt

View File

@ -1,4 +1,4 @@
# Copyright (c) 2019, Frappe and Contributors # Copyright (c) 2019, Jingrow and Contributors
# See license.txt # See license.txt
from __future__ import annotations from __future__ import annotations

View File

@ -1,4 +1,4 @@
# Copyright (c) 2019, Frappe and Contributors # Copyright (c) 2019, Jingrow and Contributors
# See license.txt # See license.txt
import datetime import datetime
@ -357,7 +357,7 @@ class TestAPISite(FrappeTestCase):
"team": site.team, "team": site.team,
"jingrow_version": group.version, "jingrow_version": group.version,
"latest_jingrow_version": jingrow.db.get_value( "latest_jingrow_version": jingrow.db.get_value(
"Frappe Version", {"status": "Stable"}, order_by="name desc" "Jingrow Version", {"status": "Stable"}, order_by="name desc"
), ),
"group_public": group.public, "group_public": group.public,
"server": site.server, "server": site.server,
@ -372,7 +372,7 @@ class TestAPISite(FrappeTestCase):
"created_on": site.creation, "created_on": site.creation,
"last_deployed": None, "last_deployed": None,
"owner": { "owner": {
"first_name": "Frappe", "first_name": "Jingrow",
"last_name": None, "last_name": None,
"user_image": None, "user_image": None,
}, },

View File

@ -1,4 +1,4 @@
# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and Contributors # Copyright (c) 2021, Jingrow Technologies Pvt. Ltd. and Contributors
# For license information, please see license.txt # For license information, please see license.txt
import os import os
@ -281,7 +281,7 @@ def setup_teams():
request = jingrow.get_all( request = jingrow.get_all(
"Account Request", ["*"], {"email": "cloud@erpnext.com"}, limit=1 "Account Request", ["*"], {"email": "cloud@erpnext.com"}, limit=1
)[0] )[0]
cloud = Team.create_new(request, "Frappe", "Cloud", "FrappeCloud@1", "India", False) cloud = Team.create_new(request, "Jingrow", "Cloud", "FrappeCloud@1", "India", False)
signup("aditya@erpnext.com") signup("aditya@erpnext.com")
request = jingrow.get_all( request = jingrow.get_all(
@ -320,7 +320,7 @@ def setup_plans():
def setup_apps(): def setup_apps():
app = jingrow.get_pg( app = jingrow.get_pg(
{"doctype": "App", "name": "jingrow", "title": "Frappe Framework", "jingrow": True} {"doctype": "App", "name": "jingrow", "title": "Jingrow Framework", "jingrow": True}
).insert() ).insert()
source = jingrow.get_pg( source = jingrow.get_pg(
{ {
@ -336,7 +336,7 @@ def setup_apps():
jingrow.get_pg( jingrow.get_pg(
{ {
"doctype": "Release Group", "doctype": "Release Group",
"title": "Frappe", "title": "Jingrow",
"version": "Nightly", "version": "Nightly",
"team": "Administrator", "team": "Administrator",
"apps": [{"app": app.name, "source": source.name}], "apps": [{"app": app.name, "source": source.name}],

View File

@ -9,7 +9,7 @@ def get_data():
"module_name": "Press", "module_name": "Press",
"category": "Modules", "category": "Modules",
"color": "grey", "color": "grey",
"description": "Managed Frappe Hosting", "description": "Managed Jingrow Hosting",
"icon": "octicon octicon-rocket", "icon": "octicon octicon-rocket",
"type": "module", "type": "module",
"label": _("Press"), "label": _("Press"),

View File

@ -228,7 +228,7 @@ RUN `#stage-bench-env`
ENV {{v.key}} {{ v.value }} ENV {{v.key}} {{ v.value }}
{% endfor %} {% endfor %}
# Install Frappe app # Install Jingrow app
RUN --mount=type=cache,sharing=locked,target=/home/jingrow/.cache,uid=1000,gid=1000 --mount=type=bind,source=apps/jingrow,target=/home/jingrow/context/apps/jingrow bench init --python /usr/bin/python${PYTHON_VERSION} --no-backups --jingrow-path file:///home/jingrow/context/apps/jingrow jingrow-bench `#stage-apps-jingrow` RUN --mount=type=cache,sharing=locked,target=/home/jingrow/.cache,uid=1000,gid=1000 --mount=type=bind,source=apps/jingrow,target=/home/jingrow/context/apps/jingrow bench init --python /usr/bin/python${PYTHON_VERSION} --no-backups --jingrow-path file:///home/jingrow/context/apps/jingrow jingrow-bench `#stage-apps-jingrow`
WORKDIR /home/jingrow/jingrow-bench WORKDIR /home/jingrow/jingrow-bench

View File

@ -151,7 +151,7 @@ RUN git config --global advice.detachedHead false
ENV PYTHONUNBUFFERED 1 ENV PYTHONUNBUFFERED 1
# Install Frappe app # Install Jingrow app
RUN echo '["build"]' > .bench.cmd RUN echo '["build"]' > .bench.cmd
RUN --mount=type=cache,target=/home/jingrow/.cache,uid=1000,gid=1000 --mount=type=bind,source=apps/jingrow,target=/home/jingrow/context/apps/jingrow bench get-app /home/jingrow/context/apps/jingrow `#stage-apps-jingrow` RUN --mount=type=cache,target=/home/jingrow/.cache,uid=1000,gid=1000 --mount=type=bind,source=apps/jingrow,target=/home/jingrow/context/apps/jingrow bench get-app /home/jingrow/context/apps/jingrow `#stage-apps-jingrow`
RUN rm .bench.cmd RUN rm .bench.cmd

View File

@ -96,19 +96,19 @@ volumes:
driver_opts: driver_opts:
type: none type: none
o: bind o: bind
device: /home/aditya/Frappe/benches/press/apps/press/mason/run/nginx device: /home/aditya/Jingrow/benches/press/apps/press/mason/run/nginx
logs: logs:
driver_opts: driver_opts:
type: none type: none
o: bind o: bind
device: /home/aditya/Frappe/benches/press/apps/press/mason/run/logs device: /home/aditya/Jingrow/benches/press/apps/press/mason/run/logs
sites: sites:
driver_opts: driver_opts:
type: none type: none
o: bind o: bind
device: /home/aditya/Frappe/benches/press/apps/press/mason/run/sites device: /home/aditya/Jingrow/benches/press/apps/press/mason/run/sites
assets: assets:
driver_opts: driver_opts:
type: none type: none
o: bind o: bind
device: /home/aditya/Frappe/benches/press/apps/press/mason/run/assets device: /home/aditya/Jingrow/benches/press/apps/press/mason/run/assets

View File

@ -66,7 +66,7 @@ server {
location / { location / {
# To add basic authentication to v2 use auth_basic setting. # To add basic authentication to v2 use auth_basic setting.
auth_basic "Registry realm"; auth_basic "Registry realm";
auth_basic_user_file /home/aditya/Frappe/benches/press/registry/registry.htpasswd; auth_basic_user_file /home/aditya/Jingrow/benches/press/registry/registry.htpasswd;
proxy_set_header Host $http_host; # required for docker client's sake proxy_set_header Host $http_host; # required for docker client's sake
proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP

View File

@ -1,4 +1,4 @@
# Copyright (c) 2021, Frappe and Contributors # Copyright (c) 2021, Jingrow and Contributors
# See license.txt # See license.txt
# import jingrow # import jingrow

View File

@ -6,47 +6,47 @@
"dependency": "NVM_VERSION", "dependency": "NVM_VERSION",
"parent": "Version 12", "parent": "Version 12",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "0.36.0" "version": "0.36.0"
}, },
{ {
"dependency": "NODE_VERSION", "dependency": "NODE_VERSION",
"parent": "Version 12", "parent": "Version 12",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "12.19.0" "version": "12.19.0"
}, },
{ {
"dependency": "PYTHON_VERSION", "dependency": "PYTHON_VERSION",
"parent": "Version 12", "parent": "Version 12",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "3.7" "version": "3.7"
}, },
{ {
"dependency": "WKHTMLTOPDF_VERSION", "dependency": "WKHTMLTOPDF_VERSION",
"parent": "Version 12", "parent": "Version 12",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "0.12.5" "version": "0.12.5"
}, },
{ {
"dependency": "BENCH_VERSION", "dependency": "BENCH_VERSION",
"parent": "Version 12", "parent": "Version 12",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "5.15.2" "version": "5.15.2"
}, },
{ {
"dependency": "PIP_VERSION", "dependency": "PIP_VERSION",
"parent": "Version 12", "parent": "Version 12",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "25.3" "version": "25.3"
} }
], ],
"docstatus": 0, "docstatus": 0,
"doctype": "Frappe Version", "doctype": "Jingrow Version",
"modified": "2024-06-27 14:45:44.660933", "modified": "2024-06-27 14:45:44.660933",
"name": "Version 12", "name": "Version 12",
"number": 12, "number": 12,
@ -60,47 +60,47 @@
"dependency": "NVM_VERSION", "dependency": "NVM_VERSION",
"parent": "Version 13", "parent": "Version 13",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "0.36.0" "version": "0.36.0"
}, },
{ {
"dependency": "NODE_VERSION", "dependency": "NODE_VERSION",
"parent": "Version 13", "parent": "Version 13",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "14.19.0" "version": "14.19.0"
}, },
{ {
"dependency": "PYTHON_VERSION", "dependency": "PYTHON_VERSION",
"parent": "Version 13", "parent": "Version 13",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "3.8" "version": "3.8"
}, },
{ {
"dependency": "WKHTMLTOPDF_VERSION", "dependency": "WKHTMLTOPDF_VERSION",
"parent": "Version 13", "parent": "Version 13",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "0.12.5" "version": "0.12.5"
}, },
{ {
"dependency": "BENCH_VERSION", "dependency": "BENCH_VERSION",
"parent": "Version 13", "parent": "Version 13",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "5.23.0" "version": "5.23.0"
}, },
{ {
"dependency": "PIP_VERSION", "dependency": "PIP_VERSION",
"parent": "Version 13", "parent": "Version 13",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "25.3" "version": "25.3"
} }
], ],
"docstatus": 0, "docstatus": 0,
"doctype": "Frappe Version", "doctype": "Jingrow Version",
"modified": "2025-05-23 11:09:57.983138", "modified": "2025-05-23 11:09:57.983138",
"name": "Version 13", "name": "Version 13",
"number": 13, "number": 13,
@ -114,47 +114,47 @@
"dependency": "NVM_VERSION", "dependency": "NVM_VERSION",
"parent": "Nightly", "parent": "Nightly",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "0.36.0" "version": "0.36.0"
}, },
{ {
"dependency": "NODE_VERSION", "dependency": "NODE_VERSION",
"parent": "Nightly", "parent": "Nightly",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "24.12.0" "version": "24.12.0"
}, },
{ {
"dependency": "PYTHON_VERSION", "dependency": "PYTHON_VERSION",
"parent": "Nightly", "parent": "Nightly",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "3.14" "version": "3.14"
}, },
{ {
"dependency": "WKHTMLTOPDF_VERSION", "dependency": "WKHTMLTOPDF_VERSION",
"parent": "Nightly", "parent": "Nightly",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "0.12.5" "version": "0.12.5"
}, },
{ {
"dependency": "BENCH_VERSION", "dependency": "BENCH_VERSION",
"parent": "Nightly", "parent": "Nightly",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "5.27.0" "version": "5.27.0"
}, },
{ {
"dependency": "PIP_VERSION", "dependency": "PIP_VERSION",
"parent": "Nightly", "parent": "Nightly",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "25.3" "version": "25.3"
} }
], ],
"docstatus": 0, "docstatus": 0,
"doctype": "Frappe Version", "doctype": "Jingrow Version",
"modified": "2025-05-23 11:09:57.983138", "modified": "2025-05-23 11:09:57.983138",
"name": "Nightly", "name": "Nightly",
"number": 15, "number": 15,
@ -168,47 +168,47 @@
"dependency": "NVM_VERSION", "dependency": "NVM_VERSION",
"parent": "Version 14", "parent": "Version 14",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "0.36.0" "version": "0.36.0"
}, },
{ {
"dependency": "NODE_VERSION", "dependency": "NODE_VERSION",
"parent": "Version 14", "parent": "Version 14",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "14.19.0" "version": "14.19.0"
}, },
{ {
"dependency": "PYTHON_VERSION", "dependency": "PYTHON_VERSION",
"parent": "Version 14", "parent": "Version 14",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "3.10" "version": "3.10"
}, },
{ {
"dependency": "WKHTMLTOPDF_VERSION", "dependency": "WKHTMLTOPDF_VERSION",
"parent": "Version 14", "parent": "Version 14",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "0.12.5" "version": "0.12.5"
}, },
{ {
"dependency": "BENCH_VERSION", "dependency": "BENCH_VERSION",
"parent": "Version 14", "parent": "Version 14",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "5.27.0" "version": "5.27.0"
}, },
{ {
"dependency": "PIP_VERSION", "dependency": "PIP_VERSION",
"parent": "Version 14", "parent": "Version 14",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "25.3" "version": "25.3"
} }
], ],
"docstatus": 0, "docstatus": 0,
"doctype": "Frappe Version", "doctype": "Jingrow Version",
"modified": "2025-05-23 11:09:57.983138", "modified": "2025-05-23 11:09:57.983138",
"name": "Version 14", "name": "Version 14",
"number": 14, "number": 14,
@ -222,47 +222,47 @@
"dependency": "NVM_VERSION", "dependency": "NVM_VERSION",
"parent": "Version 15", "parent": "Version 15",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "0.36.0" "version": "0.36.0"
}, },
{ {
"dependency": "NODE_VERSION", "dependency": "NODE_VERSION",
"parent": "Version 15", "parent": "Version 15",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "18.16.0" "version": "18.16.0"
}, },
{ {
"dependency": "PYTHON_VERSION", "dependency": "PYTHON_VERSION",
"parent": "Version 15", "parent": "Version 15",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "3.11" "version": "3.11"
}, },
{ {
"dependency": "WKHTMLTOPDF_VERSION", "dependency": "WKHTMLTOPDF_VERSION",
"parent": "Version 15", "parent": "Version 15",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "0.12.5" "version": "0.12.5"
}, },
{ {
"dependency": "BENCH_VERSION", "dependency": "BENCH_VERSION",
"parent": "Version 15", "parent": "Version 15",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "5.27.0" "version": "5.27.0"
}, },
{ {
"dependency": "PIP_VERSION", "dependency": "PIP_VERSION",
"parent": "Version 15", "parent": "Version 15",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "25.3" "version": "25.3"
} }
], ],
"docstatus": 0, "docstatus": 0,
"doctype": "Frappe Version", "doctype": "Jingrow Version",
"modified": "2025-05-23 11:09:57.983138", "modified": "2025-05-23 11:09:57.983138",
"name": "Version 15", "name": "Version 15",
"number": 15, "number": 15,
@ -276,47 +276,47 @@
"dependency": "NVM_VERSION", "dependency": "NVM_VERSION",
"parent": "Version 16 Beta", "parent": "Version 16 Beta",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "0.36.0" "version": "0.36.0"
}, },
{ {
"dependency": "NODE_VERSION", "dependency": "NODE_VERSION",
"parent": "Version 16 Beta", "parent": "Version 16 Beta",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "24.12.0" "version": "24.12.0"
}, },
{ {
"dependency": "PYTHON_VERSION", "dependency": "PYTHON_VERSION",
"parent": "Version 16 Beta", "parent": "Version 16 Beta",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "3.14" "version": "3.14"
}, },
{ {
"dependency": "WKHTMLTOPDF_VERSION", "dependency": "WKHTMLTOPDF_VERSION",
"parent": "Version 16 Beta", "parent": "Version 16 Beta",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "0.12.5" "version": "0.12.5"
}, },
{ {
"dependency": "BENCH_VERSION", "dependency": "BENCH_VERSION",
"parent": "Version 16 Beta", "parent": "Version 16 Beta",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "5.26.0" "version": "5.26.0"
}, },
{ {
"dependency": "PIP_VERSION", "dependency": "PIP_VERSION",
"parent": "Version 16 Beta", "parent": "Version 16 Beta",
"parentfield": "dependencies", "parentfield": "dependencies",
"parenttype": "Frappe Version", "parenttype": "Jingrow Version",
"version": "25.3" "version": "25.3"
} }
], ],
"docstatus": 0, "docstatus": 0,
"doctype": "Frappe Version", "doctype": "Jingrow Version",
"modified": "2025-05-23 11:09:57.983138", "modified": "2025-05-23 11:09:57.983138",
"name": "Version 16 Beta", "name": "Version 16 Beta",
"number": 16, "number": 16,

View File

@ -9,12 +9,12 @@
"docstatus": 0, "docstatus": 0,
"doctype": "Print Format", "doctype": "Print Format",
"font": "Default", "font": "Default",
"format_data": "[{\"fieldname\": \"print_heading_template\", \"fieldtype\": \"Custom HTML\", \"options\": \"{% set months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] %}\\n\\n<div style=\\\"margin-bottom: 30px; margin-top: 12px; font-size: 16px;\\\">\\n Invoice for {{ months[pg.month - 1] }} {{ pg.year}} billing period\\n</div>\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"_custom_html\", \"print_hide\": 0, \"label\": \"Custom HTML\", \"fieldtype\": \"HTML\", \"options\": \"<div>\\n <label>From</label>\\n <div>\\n Frappe Technologies Pvt. Ltd.<br>\\n D/324, Neelkanth Business Park,<br>\\n Vidyavihar (W), Mumbai 4000 86, India.\\n </div>\\n</div>\\n\\n<div style=\\\"margin-top: 15px;\\\">\\n <label>Bill To</label>\\n <div>\\n {% set address = jingrow.db.get_value('Team', pg.team, 'billing_address') %}\\n {{ jingrow.get_pg('Address', address).get_display() if address else '' }}\\n </div>\\n</div>\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"_custom_html\", \"print_hide\": 0, \"label\": \"Custom HTML\", \"fieldtype\": \"HTML\", \"options\": \"{% set details = {\\n 'Invoice': pg.name,\\n 'Payment due on': jingrow.utils.global_date_format(pg.due_date)\\n} %}\\n{% for d in details %}\\n<div class=\\\"row\\\">\\n <div class=\\\"col-xs-6\\\">\\n <label>{{ d }}</label>\\n </div>\\n <div class=\\\"col-xs-6 text-right\\\">\\n {{ details[d] }}\\n </div>\\n</div>\\n{% endfor %}\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"_custom_html\", \"print_hide\": 0, \"label\": \"Custom HTML\", \"fieldtype\": \"HTML\", \"options\": \"<h2 style=\\\"margin: 30px 0;\\\">\\n Total due {{ pg.get_formatted('amount_due') }} on {{\\n jingrow.utils.global_date_format(pg.due_date) }}\\n</h2>\\n\\n<h4>Usage Charges</h4>\\n\\n<table class=\\\"table\\\" style=\\\"width: 100%; margin-top: 0;\\\">\\n <thead>\\n <tr>\\n <th>Site</th>\\n <th>Plan</th>\\n <th class=\\\"text-right\\\">Days</th>\\n <th class=\\\"text-right\\\">Amount</th>\\n </tr>\\n </thead>\\n <tbody>\\n {% for row in pg.site_usage %} {% set lineitem = pg.items[loop.index - 1]\\n %}\\n <tr>\\n <td>{{ row.site }}</td>\\n <td>{{ jingrow.db.get_value('Plan', row.plan, 'plan_title') }}</td>\\n <td class=\\\"text-right\\\">{{ jingrow.utils.cint(row.days_active) }}</td>\\n <td class=\\\"text-right\\\">{{ lineitem.get_formatted('amount') }}</td>\\n </tr>\\n {% endfor %}\\n </tbody>\\n <tr>\\n <td colspan=\\\"4\\\"></td>\\n </tr>\\n <tr>\\n <td colspan=\\\"3\\\" class=\\\"text-right\\\" style=\\\"font-weight: bold;\\\">\\n Total\\n </td>\\n <td class=\\\"text-right\\\">{{ pg.get_formatted('total') }}</td>\\n </tr>\\n {% if pg.amount_due > 0 %}\\n <tr>\\n <td colspan=\\\"3\\\" class=\\\"text-right\\\" style=\\\"font-weight: bold;\\\">\\n Applied Credit Balance\\n </td>\\n <td class=\\\"text-right\\\">{{ pg.get_formatted('starting_balance') }}</td>\\n </tr>\\n <tr>\\n <td colspan=\\\"3\\\" class=\\\"text-right\\\" style=\\\"font-weight: bold;\\\">\\n Amount Due\\n </td>\\n <td class=\\\"text-right\\\">{{ pg.get_formatted('amount_due') }}</td>\\n </tr>\\n {% endif %}\\n</table>\\n\"}, {\"fieldtype\": \"Section Break\", \"label\": \"Stripe Billing\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"_custom_html\", \"print_hide\": 0, \"label\": \"Custom HTML\", \"fieldtype\": \"HTML\", \"options\": \"<div style=\\\"margin-top: 50px;\\\">\\n If you have added a card on file, then it will automatically be charged.<br> If not, pay using the following link: {{ pg.stripe_invoice_url }}\\n</div>\"}]", "format_data": "[{\"fieldname\": \"print_heading_template\", \"fieldtype\": \"Custom HTML\", \"options\": \"{% set months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] %}\\n\\n<div style=\\\"margin-bottom: 30px; margin-top: 12px; font-size: 16px;\\\">\\n Invoice for {{ months[pg.month - 1] }} {{ pg.year}} billing period\\n</div>\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"_custom_html\", \"print_hide\": 0, \"label\": \"Custom HTML\", \"fieldtype\": \"HTML\", \"options\": \"<div>\\n <label>From</label>\\n <div>\\n Jingrow Technologies Pvt. Ltd.<br>\\n D/324, Neelkanth Business Park,<br>\\n Vidyavihar (W), Mumbai 4000 86, India.\\n </div>\\n</div>\\n\\n<div style=\\\"margin-top: 15px;\\\">\\n <label>Bill To</label>\\n <div>\\n {% set address = jingrow.db.get_value('Team', pg.team, 'billing_address') %}\\n {{ jingrow.get_pg('Address', address).get_display() if address else '' }}\\n </div>\\n</div>\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"_custom_html\", \"print_hide\": 0, \"label\": \"Custom HTML\", \"fieldtype\": \"HTML\", \"options\": \"{% set details = {\\n 'Invoice': pg.name,\\n 'Payment due on': jingrow.utils.global_date_format(pg.due_date)\\n} %}\\n{% for d in details %}\\n<div class=\\\"row\\\">\\n <div class=\\\"col-xs-6\\\">\\n <label>{{ d }}</label>\\n </div>\\n <div class=\\\"col-xs-6 text-right\\\">\\n {{ details[d] }}\\n </div>\\n</div>\\n{% endfor %}\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"_custom_html\", \"print_hide\": 0, \"label\": \"Custom HTML\", \"fieldtype\": \"HTML\", \"options\": \"<h2 style=\\\"margin: 30px 0;\\\">\\n Total due {{ pg.get_formatted('amount_due') }} on {{\\n jingrow.utils.global_date_format(pg.due_date) }}\\n</h2>\\n\\n<h4>Usage Charges</h4>\\n\\n<table class=\\\"table\\\" style=\\\"width: 100%; margin-top: 0;\\\">\\n <thead>\\n <tr>\\n <th>Site</th>\\n <th>Plan</th>\\n <th class=\\\"text-right\\\">Days</th>\\n <th class=\\\"text-right\\\">Amount</th>\\n </tr>\\n </thead>\\n <tbody>\\n {% for row in pg.site_usage %} {% set lineitem = pg.items[loop.index - 1]\\n %}\\n <tr>\\n <td>{{ row.site }}</td>\\n <td>{{ jingrow.db.get_value('Plan', row.plan, 'plan_title') }}</td>\\n <td class=\\\"text-right\\\">{{ jingrow.utils.cint(row.days_active) }}</td>\\n <td class=\\\"text-right\\\">{{ lineitem.get_formatted('amount') }}</td>\\n </tr>\\n {% endfor %}\\n </tbody>\\n <tr>\\n <td colspan=\\\"4\\\"></td>\\n </tr>\\n <tr>\\n <td colspan=\\\"3\\\" class=\\\"text-right\\\" style=\\\"font-weight: bold;\\\">\\n Total\\n </td>\\n <td class=\\\"text-right\\\">{{ pg.get_formatted('total') }}</td>\\n </tr>\\n {% if pg.amount_due > 0 %}\\n <tr>\\n <td colspan=\\\"3\\\" class=\\\"text-right\\\" style=\\\"font-weight: bold;\\\">\\n Applied Credit Balance\\n </td>\\n <td class=\\\"text-right\\\">{{ pg.get_formatted('starting_balance') }}</td>\\n </tr>\\n <tr>\\n <td colspan=\\\"3\\\" class=\\\"text-right\\\" style=\\\"font-weight: bold;\\\">\\n Amount Due\\n </td>\\n <td class=\\\"text-right\\\">{{ pg.get_formatted('amount_due') }}</td>\\n </tr>\\n {% endif %}\\n</table>\\n\"}, {\"fieldtype\": \"Section Break\", \"label\": \"Stripe Billing\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"_custom_html\", \"print_hide\": 0, \"label\": \"Custom HTML\", \"fieldtype\": \"HTML\", \"options\": \"<div style=\\\"margin-top: 50px;\\\">\\n If you have added a card on file, then it will automatically be charged.<br> If not, pay using the following link: {{ pg.stripe_invoice_url }}\\n</div>\"}]",
"html": null, "html": null,
"line_breaks": 0, "line_breaks": 0,
"modified": "2020-07-23 12:04:26.876744", "modified": "2020-07-23 12:04:26.876744",
"module": "Press", "module": "Press",
"name": "Frappe Brand 2020", "name": "Jingrow Brand 2020",
"parent": null, "parent": null,
"parentfield": null, "parentfield": null,
"parenttype": null, "parenttype": null,

View File

@ -4,8 +4,8 @@ from . import __version__ as app_version
app_name = "press" app_name = "press"
app_title = "Press" app_title = "Press"
app_publisher = "Frappe" app_publisher = "Jingrow"
app_description = "Managed Frappe Hosting" app_description = "Managed Jingrow Hosting"
app_icon = "octicon octicon-rocket" app_icon = "octicon octicon-rocket"
app_color = "grey" app_color = "grey"
app_email = "aditya@framework.jingrow.com" app_email = "aditya@framework.jingrow.com"
@ -385,7 +385,7 @@ deploy_hours = [1, 2, 3, 4, 5, 21, 22, 23] # Purposefully avoiding 0
fixtures = [ fixtures = [
"Agent Job Type", "Agent Job Type",
"Press Job Type", "Press Job Type",
"Frappe Version", "Jingrow Version",
"MariaDB Variable", "MariaDB Variable",
"Cloud Region", "Cloud Region",
{"dt": "Role", "filters": [["role_name", "like", "Press%"]]}, {"dt": "Role", "filters": [["role_name", "like", "Press%"]]},
@ -408,7 +408,7 @@ override_whitelisted_methods = {"upload_file": "press.overrides.upload_file"}
# #
# each overriding function accepts a `data` argument; # each overriding function accepts a `data` argument;
# generated from the base implementation of the doctype dashboard, # generated from the base implementation of the doctype dashboard,
# along with any modifications made in other Frappe apps # along with any modifications made in other Jingrow apps
# override_doctype_dashboards = { # override_doctype_dashboards = {
# "Task": "press.task.get_dashboard_data" # "Task": "press.task.get_dashboard_data"
# } # }

View File

@ -1,4 +1,4 @@
# Copyright (c) 2025, Frappe and Contributors # Copyright (c) 2025, Jingrow and Contributors
# See license.txt # See license.txt

View File

@ -1,4 +1,4 @@
# Copyright (c) 2025, Frappe and Contributors # Copyright (c) 2025, Jingrow and Contributors
# See license.txt # See license.txt
import typing import typing
from unittest.mock import MagicMock, Mock, patch from unittest.mock import MagicMock, Mock, patch

View File

@ -1,4 +1,4 @@
# Copyright (c) 2025, Frappe and Contributors # Copyright (c) 2025, Jingrow and Contributors
# See license.txt # See license.txt
# import jingrow # import jingrow

View File

@ -1,4 +1,4 @@
# Copyright (c) 2025, Frappe and Contributors # Copyright (c) 2025, Jingrow and Contributors
# See license.txt # See license.txt
# import jingrow # import jingrow

View File

@ -1,4 +1,4 @@
# Copyright (c) 2024, Frappe and Contributors # Copyright (c) 2024, Jingrow and Contributors
# See license.txt # See license.txt
# import jingrow # import jingrow

View File

@ -1,4 +1,4 @@
# Copyright (c) 2024, Frappe and Contributors # Copyright (c) 2024, Jingrow and Contributors
# See license.txt # See license.txt
# import jingrow # import jingrow

View File

@ -14,7 +14,7 @@
"fieldtype": "Link", "fieldtype": "Link",
"in_list_view": 1, "in_list_view": 1,
"label": "Version", "label": "Version",
"options": "Frappe Version", "options": "Jingrow Version",
"reqd": 1 "reqd": 1
} }
], ],

View File

@ -1,4 +1,4 @@
# Copyright (c) 2024, Frappe Technologies Pvt. Ltd. and Contributors # Copyright (c) 2024, Jingrow Technologies Pvt. Ltd. and Contributors
# For license information, please see license.txt # For license information, please see license.txt
import jingrow import jingrow

View File

@ -1,4 +1,4 @@
# Copyright (c) 2022, Frappe and Contributors # Copyright (c) 2022, Jingrow and Contributors
# See license.txt # See license.txt
# import jingrow # import jingrow

View File

@ -1,4 +1,4 @@
# Copyright (c) 2022, Frappe and Contributors # Copyright (c) 2022, Jingrow and Contributors
# See license.txt # See license.txt
# import jingrow # import jingrow

View File

@ -1,4 +1,4 @@
# Copyright (c) 2025, Frappe and Contributors # Copyright (c) 2025, Jingrow and Contributors
# See license.txt # See license.txt
# import jingrow # import jingrow

View File

@ -1,4 +1,4 @@
# Copyright (c) 2023, Frappe and Contributors # Copyright (c) 2023, Jingrow and Contributors
# See license.txt # See license.txt
# import jingrow # import jingrow

View File

@ -1,4 +1,4 @@
# Copyright (c) 2021, Frappe and Contributors # Copyright (c) 2021, Jingrow and Contributors
# See license.txt # See license.txt
import jingrow import jingrow

View File

@ -1,4 +1,4 @@
# Copyright (c) 2021, Frappe and Contributors # Copyright (c) 2021, Jingrow and Contributors
# See license.txt # See license.txt
import jingrow import jingrow
from jingrow.tests.utils import FrappeTestCase from jingrow.tests.utils import FrappeTestCase

View File

@ -1,4 +1,4 @@
# Copyright (c) 2022, Frappe and Contributors # Copyright (c) 2022, Jingrow and Contributors
# See license.txt # See license.txt
# import jingrow # import jingrow

View File

@ -66,11 +66,11 @@
"label": "Payouts" "label": "Payouts"
}, },
{ {
"default": "Frappe Cloud Credits", "default": "Jingrow Cloud Credits",
"fieldname": "preferred_payout_method", "fieldname": "preferred_payout_method",
"fieldtype": "Select", "fieldtype": "Select",
"label": "Preferred Payout Method", "label": "Preferred Payout Method",
"options": "Frappe Cloud Credits\nBank Transfer\nPayPal" "options": "Jingrow Cloud Credits\nBank Transfer\nPayPal"
}, },
{ {
"depends_on": "eval:pg.preferred_payout_method==\"PayPal\"", "depends_on": "eval:pg.preferred_payout_method==\"PayPal\"",
@ -80,7 +80,7 @@
"mandatory_depends_on": "eval:pg.preferred_payout_method==\"PayPal\"" "mandatory_depends_on": "eval:pg.preferred_payout_method==\"PayPal\""
}, },
{ {
"depends_on": "eval:pg.preferred_payout_method!=\"Frappe Cloud Credits\"", "depends_on": "eval:pg.preferred_payout_method!=\"Jingrow Cloud Credits\"",
"fieldname": "gstin", "fieldname": "gstin",
"fieldtype": "Data", "fieldtype": "Data",
"label": "GSTIN (If Applicable)" "label": "GSTIN (If Applicable)"

Some files were not shown because too many files have changed in this diff Show More