update Press - Jcloude

This commit is contained in:
jingrow 2025-12-23 21:23:54 +08:00
parent 2496739e9e
commit ac64eb0275
548 changed files with 1279 additions and 1279 deletions

View File

@ -1,4 +1,4 @@
name: Press Tests name: Jcloude Tests
on: on:
push: push:

View File

@ -1,7 +1,7 @@
<div align="center" markdown="1"> <div align="center" markdown="1">
<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="Jcloude logo" width="80"/>
<h1>Press</h1> <h1>Jcloude</h1>
**Full Service Cloud Hosting For The Jingrow Stack - Powers Jingrow Cloud** **Full Service Cloud Hosting For The Jingrow Stack - Powers Jingrow Cloud**
@ -20,9 +20,9 @@
<a href="https://docs.framework.jingrow.com/cloud/">Documentation</a> <a href="https://docs.framework.jingrow.com/cloud/">Documentation</a>
</div> </div>
## Press ## Jcloude
Press is a 100% open-source cloud hosting for the Jingrow stack. Jcloude is a 100% open-source cloud hosting for the Jingrow stack.
### Motivation ### Motivation
@ -32,12 +32,12 @@ Additionally, customers lacked full control over their servers—no SSH access,
### Key Features ### Key Features
- **Multitenancy Made Easy**: Press simplifies multi-tenancy by enabling multiple sites on a single platform, each with its app version, allowing independent updates and minimal downtime, even for large sites. - **Multitenancy Made Easy**: Jcloude simplifies multi-tenancy by enabling multiple sites on a single platform, each with its app version, allowing independent updates and minimal downtime, even for large sites.
- **Dashboard**: The dashboard provides a centralized interface to manage apps, servers, sites, billing, backups, and updates, offering real-time insights and streamlined control of complex operations. - **Dashboard**: The dashboard provides a centralized interface to manage apps, servers, sites, billing, backups, and updates, offering real-time insights and streamlined control of complex operations.
- **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 Jingrow environments. - **Simplified Management**: Jcloude 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.
@ -59,7 +59,7 @@ Additionally, customers lacked full control over their servers—no SSH access,
- [**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. - [**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 Jcloude. It provides a CLI interface for Jcloude to communicate with the sites and benches.
- [**Docker**](https://www.docker.com): An open-source platform that enables developers to build, package, and deploy applications in lightweight, portable containers. - [**Docker**](https://www.docker.com): An open-source platform that enables developers to build, package, and deploy applications in lightweight, portable containers.
@ -67,7 +67,7 @@ Additionally, customers lacked full control over their servers—no SSH access,
## Setup ## Setup
To self host or to setup Press locally follow the steps in the [Local Development Environment Setup Guide](https://docs.framework.jingrow.com/cloud/local-fc-setup) or [this YouTube video](https://www.learn.jingrow.com/watch?v=Xb9QHnUrIEk) To self host or to setup Jcloude locally follow the steps in the [Local Development Environment Setup Guide](https://docs.framework.jingrow.com/cloud/local-fc-setup) or [this YouTube video](https://www.learn.jingrow.com/watch?v=Xb9QHnUrIEk)
### Pre-commit ### Pre-commit

View File

@ -4,4 +4,4 @@
## Installation ## Installation
Automatically installed with Press Automatically installed with Jcloude

View File

@ -57,7 +57,7 @@ export default {
existingTags() { existingTags() {
return { return {
type: 'list', type: 'list',
doctype: 'Press Tag', doctype: 'Jcloude Tag',
filters: { doctype_name: this.doctype }, filters: { doctype_name: this.doctype },
fields: ['tag'], fields: ['tag'],
pageLength: 1000, pageLength: 1000,

View File

@ -77,7 +77,7 @@ export default {
notification() { notification() {
return { return {
type: 'document', type: 'document',
doctype: 'Press Notification', doctype: 'Jcloude Notification',
name: this.name, name: this.name,
whitelistedMethods: { whitelistedMethods: {
markAsAddressed: 'mark_as_addressed', markAsAddressed: 'mark_as_addressed',

View File

@ -53,7 +53,7 @@ export default {
name: 'Notifications', name: 'Notifications',
icon: () => h(Notification), icon: () => h(Notification),
route: '/notifications', route: '/notifications',
isActive: routeName === 'Press Notification List', isActive: routeName === 'Jcloude Notification List',
condition: onboardingComplete && !isSaasUser, condition: onboardingComplete && !isSaasUser,
badge: () => { badge: () => {
if (unreadNotificationsCount.data > 0) { if (unreadNotificationsCount.data > 0) {
@ -229,7 +229,7 @@ export default {
}, },
}, },
mounted() { mounted() {
this.$socket.emit('doctype_subscribe', 'Press Notification'); this.$socket.emit('doctype_subscribe', 'Jcloude Notification');
this.$socket.on('jcloude_notification', (data) => { this.$socket.on('jcloude_notification', (data) => {
if (data.team === this.$team.pg.name) { if (data.team === this.$team.pg.name) {
unreadNotificationsCount.setData((data) => data + 1); unreadNotificationsCount.setData((data) => data + 1);

View File

@ -94,8 +94,8 @@ const emit = defineEmits(['success']);
const team = inject('team'); const team = inject('team');
const pressSettings = createDocumentResource({ const pressSettings = createDocumentResource({
doctype: 'Press Settings', doctype: 'Jcloude Settings',
name: 'Press Settings', name: 'Jcloude Settings',
auto: true, auto: true,
initialData: {}, initialData: {},
}); });

View File

@ -84,7 +84,7 @@ export default {
url: 'jcloude.api.client.run_pg_method', url: 'jcloude.api.client.run_pg_method',
makeParams() { makeParams() {
return { return {
dt: 'Press Webhook', dt: 'Jcloude Webhook',
dn: this.webhook.name, dn: this.webhook.name,
method: 'validate_endpoint', method: 'validate_endpoint',
}; };
@ -115,7 +115,7 @@ export default {
url: 'jcloude.api.client.run_pg_method', url: 'jcloude.api.client.run_pg_method',
makeParams() { makeParams() {
return { return {
dt: 'Press Webhook', dt: 'Jcloude Webhook',
dn: this.webhook.name, dn: this.webhook.name,
method: 'activate', method: 'activate',
}; };

View File

@ -294,7 +294,7 @@ function renderAddNewKeyDialog(listResource) {
const webhookListResource = createResource({ const webhookListResource = createResource({
url: 'jcloude.api.client.get_list', url: 'jcloude.api.client.get_list',
params: { params: {
doctype: 'Press Webhook', doctype: 'Jcloude Webhook',
fields: ['name', 'enabled', 'endpoint'], fields: ['name', 'enabled', 'endpoint'],
}, },
initialData: [], initialData: [],
@ -368,7 +368,7 @@ const webhookListOptions = computed(() => ({
onClick({ hide }) { onClick({ hide }) {
disableWebhook disableWebhook
.submit({ .submit({
dt: 'Press Webhook', dt: 'Jcloude Webhook',
dn: row.name, dn: row.name,
method: 'disable', method: 'disable',
}) })
@ -406,7 +406,7 @@ const webhookListOptions = computed(() => ({
onClick({ hide }) { onClick({ hide }) {
deleteWebhook deleteWebhook
.submit({ .submit({
doctype: 'Press Webhook', doctype: 'Jcloude Webhook',
name: row.name, name: row.name,
}) })
.then(hide); .then(hide);

View File

@ -111,7 +111,7 @@ export default {
return { return {
url: 'jcloude.api.client.get', url: 'jcloude.api.client.get',
params: { params: {
doctype: 'Press Webhook', doctype: 'Jcloude Webhook',
name: this.webhook.name, name: this.webhook.name,
}, },
auto: true, auto: true,

View File

@ -76,7 +76,7 @@ export default {
roles() { roles() {
return { return {
type: 'list', type: 'list',
doctype: 'Press Role', doctype: 'Jcloude Role',
fields: ['name', 'title'], fields: ['name', 'title'],
initialData: [], initialData: [],
auto: true, auto: true,

View File

@ -137,7 +137,7 @@ const user = getSessionUser();
const tab = ref<'members' | 'resources' | 'permissions'>('members'); const tab = ref<'members' | 'resources' | 'permissions'>('members');
const role = createDocumentResource({ const role = createDocumentResource({
doctype: 'Press Role', doctype: 'Jcloude Role',
name: props.id, name: props.id,
auto: true, auto: true,
whitelistedMethods: { whitelistedMethods: {

View File

@ -181,7 +181,7 @@ export default {
role() { role() {
return { return {
type: 'document', type: 'document',
doctype: 'Press Role', doctype: 'Jcloude Role',
name: this.roleId, name: this.roleId,
whitelistedMethods: { whitelistedMethods: {
addUser: 'add_user', addUser: 'add_user',

View File

@ -79,7 +79,7 @@
(title, users, resources) => { (title, users, resources) => {
insert.submit({ insert.submit({
pg: { pg: {
doctype: 'Press Role', doctype: 'Jcloude Role',
title, title,
users: users.map((u) => ({ users: users.map((u) => ({
user: u, user: u,
@ -104,7 +104,7 @@ import RoleCreateDialog from './RoleCreateDialog.vue';
const showCreateDialog = ref(false); const showCreateDialog = ref(false);
const roles = createListResource({ const roles = createListResource({
doctype: 'Press Role', doctype: 'Jcloude Role',
fields: [ fields: [
'name', 'name',
'title', 'title',

View File

@ -13,7 +13,7 @@ export default async function call(method, args) {
let team = localStorage.getItem('current_team') || null; let team = localStorage.getItem('current_team') || null;
if (team) { if (team) {
headers['X-Press-Team'] = team; headers['X-Jcloude-Team'] = team;
} }
if (window.csrf_token && window.csrf_token !== '{{ csrf_token }}') { if (window.csrf_token && window.csrf_token !== '{{ csrf_token }}') {

View File

@ -43,7 +43,7 @@ export default {
availableTags() { availableTags() {
return { return {
type: 'list', type: 'list',
doctype: 'Press Tag', doctype: 'Jcloude Tag',
filters: { doctype_name: this.doctype }, filters: { doctype_name: this.doctype },
fields: ['tag'], fields: ['tag'],
pageLength: 1000, pageLength: 1000,

View File

@ -22,7 +22,7 @@ const request = (options) => {
const currentTeam = const currentTeam =
localStorage.getItem('current_team') || window.default_team; localStorage.getItem('current_team') || window.default_team;
if (currentTeam) { if (currentTeam) {
_options.headers['X-Press-Team'] = currentTeam; _options.headers['X-Jcloude-Team'] = currentTeam;
} }
return frappeRequest(_options); return frappeRequest(_options);
}; };

View File

@ -60,7 +60,7 @@ export default {
label: 'Tag', label: 'Tag',
fieldname: 'tags.tag', fieldname: 'tags.tag',
options: { options: {
doctype: 'Press Tag', doctype: 'Jcloude Tag',
filters: { filters: {
doctype_name: 'Release Group', doctype_name: 'Release Group',
}, },

View File

@ -9,7 +9,7 @@ import { toast } from 'vue-sonner';
const getNotification = (name) => { const getNotification = (name) => {
return getDocResource({ return getDocResource({
doctype: 'Press Notification', doctype: 'Jcloude Notification',
name: name, name: name,
whitelistedMethods: { whitelistedMethods: {
markNotificationAsRead: 'mark_as_read', markNotificationAsRead: 'mark_as_read',
@ -18,14 +18,14 @@ const getNotification = (name) => {
}; };
export default { export default {
doctype: 'Press Notification', doctype: 'Jcloude Notification',
whitelistedMethods: {}, whitelistedMethods: {},
list: { list: {
resource() { resource() {
let $team = getTeam(); let $team = getTeam();
return { return {
type: 'list', type: 'list',
doctype: 'Press Notification', doctype: 'Jcloude Notification',
url: 'jcloude.api.notifications.get_notifications', url: 'jcloude.api.notifications.get_notifications',
auto: true, auto: true,
filters: { filters: {

View File

@ -348,7 +348,7 @@ export default {
label: 'Tag', label: 'Tag',
fieldname: 'tags.tag', fieldname: 'tags.tag',
options: { options: {
doctype: 'Press Tag', doctype: 'Jcloude Tag',
filters: { filters: {
doctype_name: 'Site', doctype_name: 'Site',
}, },
@ -460,7 +460,7 @@ export default {
label: 'Tag', label: 'Tag',
fieldname: 'tags.tag', fieldname: 'tags.tag',
options: { options: {
doctype: 'Press Tag', doctype: 'Jcloude Tag',
filters: { filters: {
doctype_name: 'Release Group', doctype_name: 'Release Group',
}, },

View File

@ -127,7 +127,7 @@ export default {
label: 'Tag', label: 'Tag',
fieldname: 'tags.tag', fieldname: 'tags.tag',
options: { options: {
doctype: 'Press Tag', doctype: 'Jcloude Tag',
filters: { filters: {
doctype_name: 'Site', doctype_name: 'Site',
}, },

View File

@ -146,12 +146,12 @@ export default {
return { return {
type: 'list', type: 'list',
cache: [ cache: [
'Press Notification', 'Jcloude Notification',
'Warning', 'Warning',
'Deploy Candidate Build', 'Deploy Candidate Build',
this.id, this.id,
], ],
doctype: 'Press Notification', doctype: 'Jcloude Notification',
auto: true, auto: true,
fields: ['title', 'name'], fields: ['title', 'name'],
filters: { filters: {
@ -166,12 +166,12 @@ export default {
return { return {
type: 'list', type: 'list',
cache: [ cache: [
'Press Notification', 'Jcloude Notification',
'Error', 'Error',
'Deploy Candidate Build', 'Deploy Candidate Build',
this.id, this.id,
], ],
doctype: 'Press Notification', doctype: 'Jcloude Notification',
auto: true, auto: true,
fields: ['title', 'name'], fields: ['title', 'name'],
filters: { filters: {

View File

@ -132,8 +132,8 @@ export default {
errors() { errors() {
return { return {
type: 'list', type: 'list',
cache: ['Press Notification', 'Error', 'Agent Job', this.id], cache: ['Jcloude Notification', 'Error', 'Agent Job', this.id],
doctype: 'Press Notification', doctype: 'Jcloude Notification',
auto: true, auto: true,
fields: ['title', 'name'], fields: ['title', 'name'],
filters: { filters: {

View File

@ -9,7 +9,7 @@ General introduction to jcloude webhook can be found in [the public documentatio
Add New Webhook Event Add New Webhook Event
--------------------- ---------------------
1. Go to `Press Webhook Event` doctype in desk. 1. Go to `Jcloude Webhook Event` doctype in desk.
2. Create a new record and fill up the title and description of event. This title and description will be shown to users to select. 2. Create a new record and fill up the title and description of event. This title and description will be shown to users to select.
3. If you are on local development setup, you can export fixtures. 3. If you are on local development setup, you can export fixtures.
4. Update the documentation of `Webhook Events` as well > <https://jcloud.jingrow.com/docs/webhook-events> 4. Update the documentation of `Webhook Events` as well > <https://jcloud.jingrow.com/docs/webhook-events>
@ -47,8 +47,8 @@ It may not work because in agent job update process functions and other places,
Related Doctypes Related Doctypes
---------------- ----------------
1. **Press Webhook Event** - Type of webhook events (e.g. *Site Status Update*). 1. **Jcloude Webhook Event** - Type of webhook events (e.g. *Site Status Update*).
2. **Press Webhook** - Holds the configured webhook of teams. 2. **Jcloude Webhook** - Holds the configured webhook of teams.
3. **Press Webhook Selected Event** - Child table to hold selected events for `Press Webhook` doctype. 3. **Jcloude Webhook Selected Event** - Child table to hold selected events for `Jcloude Webhook` doctype.
4. **Press Webhook Log** - This doctype record gets created, when we try to dispatch a webhook event to a team. It has a child table `Press Webhook Attempts` which hold request/response of webhook calls. Also manage status, retry information as well. 4. **Jcloude Webhook Log** - This doctype record gets created, when we try to dispatch a webhook event to a team. It has a child table `Jcloude Webhook Attempts` which hold request/response of webhook calls. Also manage status, retry information as well.
5. **Press Webhook Attempt** - Child table which hold request, response, status code, overall status, timestamp of a webhook request. 5. **Jcloude Webhook Attempt** - Child table which hold request, response, status code, overall status, timestamp of a webhook request.

View File

@ -27,7 +27,7 @@ Top section contains overall status, start and end time.
You need to provide the info of git repo and branch info here. You need to provide the info of git repo and branch info here.
You can ignore all of these fields, the repo and branch will be fetched from `Press Settings` in case you don't provide any choice. You can ignore all of these fields, the repo and branch will be fetched from `Jcloude Settings` in case you don't provide any choice.
If you want to update to a specific commit hash only, you can provide that info, else it will auto populate the info after save. If you want to update to a specific commit hash only, you can provide that info, else it will auto populate the info after save.

View File

@ -94,7 +94,7 @@ Now, create a new site and install `jcloude` on this site.
Open the site and login as Administrator. Open the site and login as Administrator.
Press Settings Jcloude Settings
-------------- --------------
### Create a `Root Domain` ### Create a `Root Domain`
@ -114,9 +114,9 @@ Save it.
> You can get your Access Keys by going to AWS Console > IAM > User > John Doe (create one if required) > Security credentials > Access Keys > You can get your Access Keys by going to AWS Console > IAM > User > John Doe (create one if required) > Security credentials > Access Keys
Open `Press Settings` now. Now, set the `Domain` to the root domain you created in the previous step and cluster to `Default`. Open `Jcloude Settings` now. Now, set the `Domain` to the root domain you created in the previous step and cluster to `Default`.
Now, there is going to be a lot of back and forth between your terminal and `Press Settings`, so sit tight. Now, there is going to be a lot of back and forth between your terminal and `Jcloude Settings`, so sit tight.
### Let's Encrypt ### Let's Encrypt
@ -158,7 +158,7 @@ Go to your terminal and `cd` into your `bench` directory. Create two directories
2. `.docker-builds` 2. `.docker-builds`
Go back to the `Press Settings`and paste the absolute paths of the above two directories to the `Clone Directory` and `Build Directory` respectively. Leave the other field empty and save the settings. Go back to the `Jcloude Settings`and paste the absolute paths of the above two directories to the `Clone Directory` and `Build Directory` respectively. Leave the other field empty and save the settings.
Sometimes, there is an issue while uploading a docker image in the background and you have to manually `push` it to registry. For that case, you have to login to digital ocean registry through docker before pushing. You can do this by running this command: Sometimes, there is an issue while uploading a docker image in the background and you have to manually `push` it to registry. For that case, you have to login to digital ocean registry through docker before pushing. You can do this by running this command:
@ -171,7 +171,7 @@ This step is optional and is required only if you are planning to work on billin
You can signup for a new Stripe account from [https://dashboard.stripe.com/](https://dashboard.stripe.com). By default, Stripe gives you a test account which is enough for our development purposes. You can signup for a new Stripe account from [https://dashboard.stripe.com/](https://dashboard.stripe.com). By default, Stripe gives you a test account which is enough for our development purposes.
Get the Publishable Key and Secret Key from Stripe dashboard and create your Stripe Account and set it in Press Settings. Set values for Credits on Signup fields. For e.g., INR 1800 and USD 25. Get the Publishable Key and Secret Key from Stripe dashboard and create your Stripe Account and set it in Jcloude Settings. Set values for Credits on Signup fields. For e.g., INR 1800 and USD 25.
Now click on Create Stripe Webhook. It should create webhook endpoints on Stripe and set the field Stripe Webhook Endpoint ID. Now click on Create Stripe Webhook. It should create webhook endpoints on Stripe and set the field Stripe Webhook Endpoint ID.
@ -275,7 +275,7 @@ That's it for the `f` server.
Setting up Builds Setting up Builds
----------------- -----------------
Under **Press Settings** > **Docker** > **Docker Build** set **Build Server** to the app server you have created in the previous set. Under **Jcloude Settings** > **Docker** > **Docker Build** set **Build Server** to the app server you have created in the previous set.
Now, when you run a _Build and Deploy_, the image that is created for the deployment will be built on the Build Server. Now, when you run a _Build and Deploy_, the image that is created for the deployment will be built on the Build Server.
@ -299,7 +299,7 @@ You should create at least one site plan for the tenants to be able to start usi
![](../files/site-plan-16c3ee4.png) ![](../files/site-plan-16c3ee4.png)
Now under Roles, add `Press Admin` and `Press Member`. Now under Roles, add `Jcloude Admin` and `Jcloude Member`.
![](../files/site-plan-2.png) ![](../files/site-plan-2.png)

View File

@ -9,7 +9,7 @@ Database Server runs MariaDB server listening on a private IP address.
> Note: See [Server Setup](/internal/servers/server-setup) for detailed explanation. > Note: See [Server Setup](/internal/servers/server-setup) for detailed explanation.
#### Requires #### Requires
- Press host must have root SSH access to the target machine. - Jcloude host must have root SSH access to the target machine.
#### Steps #### Steps

View File

@ -9,7 +9,7 @@ Proxy Server runs NGINX as a reverse proxy.
> Note: See [Server Setup](/internal/servers/server-setup) for detailed explanation. > Note: See [Server Setup](/internal/servers/server-setup) for detailed explanation.
#### Requires #### Requires
Press host must have root SSH access to the target machine. Jcloude host must have root SSH access to the target machine.
#### Steps #### Steps

View File

@ -9,7 +9,7 @@ Server runs benches as well as its own MariaDB database.
> Note: [Proxy Server Setup](/internal/servers/proxy-server-setup) must be completed before Server setup. > Note: [Proxy Server Setup](/internal/servers/proxy-server-setup) must be completed before Server setup.
#### Requires #### Requires
- Press host must have root SSH access to the target machine. - Jcloude host must have root SSH access to the target machine.
#### Steps #### Steps

View File

@ -10,7 +10,7 @@
- Debugging Issues - Debugging Issues
- Marketplace Review Process - Marketplace Review Process
- How to ?: - How to ?:
- Add New Press Webhook - Add New Jcloude Webhook
- Build a Bench - Build a Bench
- Update Agents on Prod - Update Agents on Prod
- Setup Database Replica - Setup Database Replica

View File

@ -5,7 +5,7 @@ styling tools setup so CI won't fail from these
Instructions [here](http://git.jingrow.com/jingrow/jcloude/issues/424#issuecomment-1193375098) Instructions [here](http://git.jingrow.com/jingrow/jcloude/issues/424#issuecomment-1193375098)
# Writing Tests for Press # Writing Tests for Jcloude
Writing tests involve running tests locally (duh). So let's get that setup. (You'll only have to do this once) Writing tests involve running tests locally (duh). So let's get that setup. (You'll only have to do this once)
@ -38,13 +38,13 @@ bench --site test_site reinstall --yes
## Writing tests ## Writing tests
This is the hard part. Because of Press's dependency with outside world, it's This is the hard part. Because of Jcloude's dependency with outside world, it's
hard to isolate unit tests to this project. Regardless it's still possible with hard to isolate unit tests to this project. Regardless it's still possible with
plain old python's built in libraries. plain old python's built in libraries.
Majority of this is done with the help of python's `unittest.mock` library. We Majority of this is done with the help of python's `unittest.mock` library. We
use this library to mock parts of code when referencing things that are out of use this library to mock parts of code when referencing things that are out of
Press's control. Jcloude's control.
Eg: We can mock all Agent Job creation calls by decorating the TestCase class like so Eg: We can mock all Agent Job creation calls by decorating the TestCase class like so
@ -177,7 +177,7 @@ http://git.jingrow.com/jingrow/jcloude/blob/23711e2799f2d24dfd7bbe2b6cd148f54f4b
Here, we check what args was Ansible constructor was called with. Here, we check what args was Ansible constructor was called with.
That's pretty much all you need to write safe, rerunnable tests for Press. You That's pretty much all you need to write safe, rerunnable tests for Jcloude. You
can checkout https://docs.python.org/3/library/unittest.mock.html for more can checkout https://docs.python.org/3/library/unittest.mock.html for more
things you can do with the standard python libraries. If your editor and things you can do with the standard python libraries. If your editor and
plugins are setup configured nicely, you can even do TDD with ease. plugins are setup configured nicely, you can even do TDD with ease.

View File

@ -1,4 +1,4 @@
This folder holds the library / tools written for Press or agent. This folder holds the library / tools written for Jcloude or agent.
Please check the `README.md` of the library / tool for more details. Please check the `README.md` of the library / tool for more details.

View File

@ -1,5 +1,5 @@
[project] [project]
name = "Press-CLI" name = "Jcloude-CLI"
description = "CLI to manage jingrow cloud" description = "CLI to manage jingrow cloud"
readme = "README.md" readme = "README.md"
license = "AGPL-3.0-only" license = "AGPL-3.0-only"

View File

@ -143,7 +143,7 @@ func (s *Session) SendRequestWithContext(ctx context.Context, method string, pay
} }
req.Header = http.Header{ req.Header = http.Header{
"Content-Type": {"application/json"}, "Content-Type": {"application/json"},
"X-Press-Team": {s.CurrentTeam}, "X-Jcloude-Team": {s.CurrentTeam},
"Cookie": {fmt.Sprintf("sid=%s", s.SessionID)}, "Cookie": {fmt.Sprintf("sid=%s", s.SessionID)},
} }

View File

@ -39,7 +39,7 @@ def has_support_access(doctype: str, docname: str, action: str | None = None) ->
if jingrow.local.system_user(): if jingrow.local.system_user():
return True return True
if not jcloude_utils.has_role("Press Support Agent"): if not jcloude_utils.has_role("Jcloude Support Agent"):
return False return False
if access_utils.is_public_resource(doctype, docname): if access_utils.is_public_resource(doctype, docname):

View File

@ -55,7 +55,7 @@ class Agent:
def new_bench(self, bench: "Bench"): def new_bench(self, bench: "Bench"):
settings = jingrow.db.get_value( settings = jingrow.db.get_value(
"Press Settings", "Jcloude Settings",
None, None,
["docker_registry_url", "docker_registry_username", "docker_registry_password"], ["docker_registry_url", "docker_registry_username", "docker_registry_password"],
as_dict=True, as_dict=True,
@ -536,7 +536,7 @@ class Agent:
data = {"with_files": site_backup.with_files} data = {"with_files": site_backup.with_files}
if site_backup.offsite: if site_backup.offsite:
settings = jingrow.get_single("Press Settings") settings = jingrow.get_single("Jcloude Settings")
backups_path = os.path.join(site.name, str(date.today())) backups_path = os.path.join(site.name, str(date.today()))
backup_bucket = get_backup_bucket(site.cluster, region=True) backup_bucket = get_backup_bucket(site.cluster, region=True)
bucket_name = backup_bucket.get("name") if isinstance(backup_bucket, dict) else backup_bucket bucket_name = backup_bucket.get("name") if isinstance(backup_bucket, dict) else backup_bucket
@ -906,7 +906,7 @@ class Agent:
password = get_decrypted_password(self.server_type, self.server, "agent_password") password = get_decrypted_password(self.server_type, self.server, "agent_password")
headers = {"Authorization": f"bearer {password}", "X-Agent-Job-Id": agent_job_id} headers = {"Authorization": f"bearer {password}", "X-Agent-Job-Id": agent_job_id}
url = f"https://{self.server}:{self.port}/agent/{path}" url = f"https://{self.server}:{self.port}/agent/{path}"
intermediate_ca = jingrow.db.get_value("Press Settings", "Press Settings", "backbone_intermediate_ca") intermediate_ca = jingrow.db.get_value("Jcloude Settings", "Jcloude Settings", "backbone_intermediate_ca")
if jingrow.conf.developer_mode and intermediate_ca: if jingrow.conf.developer_mode and intermediate_ca:
root_ca = jingrow.db.get_value("Certificate Authority", intermediate_ca, "parent_authority") root_ca = jingrow.db.get_value("Certificate Authority", intermediate_ca, "parent_authority")
verify = jingrow.get_pg("Certificate Authority", root_ca).certificate_file verify = jingrow.get_pg("Certificate Authority", root_ca).certificate_file
@ -1058,7 +1058,7 @@ Response: {reason or getattr(result, "text", "Unknown")}
""" """
disable_agent_job_deduplication = jingrow.db.get_single_value( disable_agent_job_deduplication = jingrow.db.get_single_value(
"Press Settings", "disable_agent_job_deduplication", cache=True "Jcloude Settings", "disable_agent_job_deduplication", cache=True
) )
if not disable_agent_job_deduplication: if not disable_agent_job_deduplication:
@ -1434,7 +1434,7 @@ Response: {reason or getattr(result, "text", "Unknown")}
def pull_docker_images(self, image_tags: list[str], reference_doctype=None, reference_name=None): def pull_docker_images(self, image_tags: list[str], reference_doctype=None, reference_name=None):
settings = jingrow.db.get_value( settings = jingrow.db.get_value(
"Press Settings", "Jcloude Settings",
None, None,
["docker_registry_url", "docker_registry_username", "docker_registry_password"], ["docker_registry_url", "docker_registry_username", "docker_registry_password"],
as_dict=True, as_dict=True,
@ -1458,7 +1458,7 @@ Response: {reason or getattr(result, "text", "Unknown")}
self, images: list[str], reference_doctype: str | None = None, reference_name: str | None = None self, images: list[str], reference_doctype: str | None = None, reference_name: str | None = None
) -> AgentJob: ) -> AgentJob:
settings = jingrow.db.get_value( settings = jingrow.db.get_value(
"Press Settings", "Jcloude Settings",
None, None,
["docker_registry_url", "docker_registry_username", "docker_registry_password"], ["docker_registry_url", "docker_registry_username", "docker_registry_password"],
as_dict=True, as_dict=True,
@ -1484,7 +1484,7 @@ Response: {reason or getattr(result, "text", "Unknown")}
if self.server_type != "Database Server": if self.server_type != "Database Server":
return NotImplementedError("Only Database Server supports this method") return NotImplementedError("Only Database Server supports this method")
settings = jingrow.get_single("Press Settings") settings = jingrow.get_single("Jcloude Settings")
backup_bucket = get_backup_bucket( backup_bucket = get_backup_bucket(
jingrow.get_value("Database Server", self.server, "cluster"), region=True jingrow.get_value("Database Server", self.server, "cluster"), region=True
) )
@ -1688,7 +1688,7 @@ Response: {reason or getattr(result, "text", "Unknown")}
} }
# offsite config # offsite config
settings = jingrow.get_single("Press Settings") settings = jingrow.get_single("Jcloude Settings")
backups_path = os.path.join(site, str(date.today())) backups_path = os.path.join(site, str(date.today()))
backup_bucket = get_backup_bucket(cluster, region=True) backup_bucket = get_backup_bucket(cluster, region=True)
bucket_name = backup_bucket.get("name") if isinstance(backup_bucket, dict) else backup_bucket bucket_name = backup_bucket.get("name") if isinstance(backup_bucket, dict) else backup_bucket
@ -1726,7 +1726,7 @@ Response: {reason or getattr(result, "text", "Unknown")}
} }
# offsite config # offsite config
settings = jingrow.get_single("Press Settings") settings = jingrow.get_single("Jcloude Settings")
backups_path = os.path.join(site, str(date.today())) backups_path = os.path.join(site, str(date.today()))
backup_bucket = get_backup_bucket(cluster, region=True) backup_bucket = get_backup_bucket(cluster, region=True)
bucket_name = backup_bucket.get("name") if isinstance(backup_bucket, dict) else backup_bucket bucket_name = backup_bucket.get("name") if isinstance(backup_bucket, dict) else backup_bucket

View File

@ -61,7 +61,7 @@ def signup(email: str, product: str | None = None, referrer: str | None = None)
{ {
"doctype": "Account Request", "doctype": "Account Request",
"email": email, "email": email,
"role": "Press Admin", "role": "Jcloude Admin",
"referrer_id": referrer, "referrer_id": referrer,
"send_email": True, "send_email": True,
"product_trial": product, "product_trial": product,
@ -512,7 +512,7 @@ def _get():
"saas_site_request": team_pg.get_pending_saas_site_request(), "saas_site_request": team_pg.get_pending_saas_site_request(),
"feature_flags": { "feature_flags": {
"verify_cards_with_micro_charge": jingrow.db.get_single_value( "verify_cards_with_micro_charge": jingrow.db.get_single_value(
"Press Settings", "verify_cards_with_micro_charge" "Jcloude Settings", "verify_cards_with_micro_charge"
) )
}, },
"partner_email": team_pg.partner_email or "", "partner_email": team_pg.partner_email or "",
@ -537,7 +537,7 @@ def current_team():
def get_permissions(): def get_permissions():
user = jingrow.session.user user = jingrow.session.user
groups = tuple( groups = tuple(
[*jingrow.get_all("Press Permission Group User", {"user": user}, pluck="parent"), "1", "2"] [*jingrow.get_all("Jcloude Permission Group User", {"user": user}, pluck="parent"), "1", "2"]
) # [1, 2] is for avoiding singleton tuples ) # [1, 2] is for avoiding singleton tuples
docperms = jingrow.db.sql( docperms = jingrow.db.sql(
f""" f"""
@ -564,7 +564,7 @@ def has_method_permission(doctype, docname, method) -> bool:
def signup_settings(product=None, fetch_countries=False, timezone=None): def signup_settings(product=None, fetch_countries=False, timezone=None):
from jcloude.utils.country_timezone import get_country_from_timezone from jcloude.utils.country_timezone import get_country_from_timezone
settings = jingrow.get_single("Press Settings") settings = jingrow.get_single("Jcloude Settings")
product = jingrow.utils.cstr(product) product = jingrow.utils.cstr(product)
product_trial = None product_trial = None
@ -594,7 +594,7 @@ def signup_settings(product=None, fetch_countries=False, timezone=None):
@jingrow.whitelist(allow_guest=True) @jingrow.whitelist(allow_guest=True)
def guest_feature_flags(): def guest_feature_flags():
return { return {
"enable_google_oauth": jingrow.db.get_single_value("Press Settings", "enable_google_oauth"), "enable_google_oauth": jingrow.db.get_single_value("Jcloude Settings", "enable_google_oauth"),
} }
@ -636,7 +636,7 @@ def new_team(email, current_team):
{ {
"doctype": "Account Request", "doctype": "Account Request",
"email": email, "email": email,
"role": "Press Member", "role": "Jcloude Member",
"send_email": True, "send_email": True,
"team": email, "team": email,
"invited_by": current_team, "invited_by": current_team,
@ -694,7 +694,7 @@ def update_profile_picture():
@jingrow.whitelist() @jingrow.whitelist()
def update_feature_flags(values=None): def update_feature_flags(values=None):
jingrow.only_for("Press Admin") jingrow.only_for("Jcloude Admin")
team = get_current_team(get_pg=True) team = get_current_team(get_pg=True)
values = jingrow.parse_json(values) values = jingrow.parse_json(values)
fields = [ fields = [
@ -885,7 +885,7 @@ def validate_pincode(billing_details):
@jingrow.whitelist(allow_guest=True) @jingrow.whitelist(allow_guest=True)
def feedback(team, message, note, rating, route=None): def feedback(team, message, note, rating, route=None):
feedback = jingrow.new_pg("Press Feedback") feedback = jingrow.new_pg("Jcloude Feedback")
team_pg = jingrow.get_pg("Team", team) team_pg = jingrow.get_pg("Team", team)
feedback.team = team feedback.team = team
feedback.message = message feedback.message = message
@ -1064,12 +1064,12 @@ def get_permission_options(name, ptype):
available_actions, available_actions,
) )
doctypes = jingrow.get_all("Press Method Permission", pluck="document_type", distinct=True) doctypes = jingrow.get_all("Jcloude Method Permission", pluck="document_type", distinct=True)
options = [] options = []
for doctype in doctypes: for doctype in doctypes:
pg = jingrow.qb.DocType(doctype) pg = jingrow.qb.DocType(doctype)
perm_pg = jingrow.qb.DocType("Press User Permission") perm_pg = jingrow.qb.DocType("Jcloude User Permission")
subtable = ( subtable = (
jingrow.qb.from_(perm_pg) jingrow.qb.from_(perm_pg)
.select("*") .select("*")
@ -1106,7 +1106,7 @@ def update_permissions(user, ptype, updated):
for pg, updated_perms in docs.items(): for pg, updated_perms in docs.items():
ptype_cap = ptype.capitalize() ptype_cap = ptype.capitalize()
old_perms = jingrow.get_all( old_perms = jingrow.get_all(
"Press User Permission", "Jcloude User Permission",
filters={ filters={
"type": ptype_cap, "type": ptype_cap,
ptype: user, ptype: user,
@ -1122,7 +1122,7 @@ def update_permissions(user, ptype, updated):
# perms to remove # perms to remove
remove = set(old_perms).difference(set(updated_perms)) remove = set(old_perms).difference(set(updated_perms))
drop += jingrow.get_all( drop += jingrow.get_all(
"Press User Permission", "Jcloude User Permission",
filters={ filters={
"type": ptype_cap, "type": ptype_cap,
ptype: user, ptype: user,
@ -1135,56 +1135,56 @@ def update_permissions(user, ptype, updated):
if values: if values:
jingrow.db.bulk_insert( jingrow.db.bulk_insert(
"Press User Permission", "Jcloude User Permission",
fields=["name", "type", "document_type", "document_name", ptype, "action"], fields=["name", "type", "document_type", "document_name", ptype, "action"],
values=set(values), values=set(values),
ignore_duplicates=True, ignore_duplicates=True,
) )
if drop: if drop:
jingrow.db.delete("Press User Permission", {"name": ("in", drop)}) jingrow.db.delete("Jcloude User Permission", {"name": ("in", drop)})
jingrow.db.commit() jingrow.db.commit()
@jingrow.whitelist() @jingrow.whitelist()
def groups(): def groups():
return jingrow.get_all("Press Permission Group", {"team": get_current_team()}, ["name", "title"]) return jingrow.get_all("Jcloude Permission Group", {"team": get_current_team()}, ["name", "title"])
@jingrow.whitelist() @jingrow.whitelist()
def permission_group_users(name): def permission_group_users(name):
if get_current_team() != jingrow.db.get_value("Press Permission Group", name, "team"): if get_current_team() != jingrow.db.get_value("Jcloude Permission Group", name, "team"):
jingrow.throw("You are not allowed to view this group") jingrow.throw("You are not allowed to view this group")
return jingrow.get_all("Press Permission Group User", {"parent": name}, pluck="user") return jingrow.get_all("Jcloude Permission Group User", {"parent": name}, pluck="user")
@jingrow.whitelist() @jingrow.whitelist()
def add_permission_group(title): def add_permission_group(title):
pg = jingrow.get_pg( pg = jingrow.get_pg(
{"doctype": "Press Permission Group", "team": get_current_team(), "title": title} {"doctype": "Jcloude Permission Group", "team": get_current_team(), "title": title}
).insert(ignore_permissions=True) ).insert(ignore_permissions=True)
return {"name": pg.name, "title": pg.title} return {"name": pg.name, "title": pg.title}
@jingrow.whitelist() @jingrow.whitelist()
@protected("Press Permission Group") @protected("Jcloude Permission Group")
def remove_permission_group(name): def remove_permission_group(name):
jingrow.db.delete("Press User Permission", {"group": name}) jingrow.db.delete("Jcloude User Permission", {"group": name})
jingrow.delete_pg("Press Permission Group", name) jingrow.delete_pg("Jcloude Permission Group", name)
@jingrow.whitelist() @jingrow.whitelist()
@protected("Press Permission Group") @protected("Jcloude Permission Group")
def add_permission_group_user(name, user): def add_permission_group_user(name, user):
pg = jingrow.get_pg("Press Permission Group", name) pg = jingrow.get_pg("Jcloude Permission Group", name)
pg.append("users", {"user": user}) pg.append("users", {"user": user})
pg.save(ignore_permissions=True) pg.save(ignore_permissions=True)
@jingrow.whitelist() @jingrow.whitelist()
@protected("Press Permission Group") @protected("Jcloude Permission Group")
def remove_permission_group_user(name, user): def remove_permission_group_user(name, user):
pg = jingrow.get_pg("Press Permission Group", name) pg = jingrow.get_pg("Jcloude Permission Group", name)
for group_user in pg.users: for group_user in pg.users:
if group_user.user == user: if group_user.user == user:
pg.remove(group_user) pg.remove(group_user)
@ -1194,8 +1194,8 @@ def remove_permission_group_user(name, user):
@jingrow.whitelist() @jingrow.whitelist()
def get_permission_roles(): def get_permission_roles():
PressRole = jingrow.qb.DocType("Press Role") PressRole = jingrow.qb.DocType("Jcloude Role")
PressRoleUser = jingrow.qb.DocType("Press Role User") PressRoleUser = jingrow.qb.DocType("Jcloude Role User")
return ( return (
jingrow.qb.from_(PressRole) jingrow.qb.from_(PressRole)

View File

@ -107,7 +107,7 @@ class StackedGroupByChart:
resource_type: ResourceType, resource_type: ResourceType,
max_no_of_paths: int = MAX_NO_OF_PATHS, max_no_of_paths: int = MAX_NO_OF_PATHS,
): ):
self.log_server = jingrow.db.get_single_value("Press Settings", "log_server") self.log_server = jingrow.db.get_single_value("Jcloude Settings", "log_server")
if not self.log_server: if not self.log_server:
return return
@ -280,7 +280,7 @@ class StackedGroupByChart:
return True return True
def run(self): def run(self):
log_server = jingrow.db.get_single_value("Press Settings", "log_server") log_server = jingrow.db.get_single_value("Jcloude Settings", "log_server")
if not log_server: if not log_server:
return {"datasets": [], "labels": []} return {"datasets": [], "labels": []}
return self.get_stacked_histogram_chart() return self.get_stacked_histogram_chart()
@ -366,7 +366,7 @@ class NginxRequestGroupByChart(StackedGroupByChart):
def setup_search_filters(self): def setup_search_filters(self):
super().setup_search_filters() super().setup_search_filters()
jcloude_settings: PressSettings = jingrow.get_cached_pg("Press Settings") jcloude_settings: PressSettings = jingrow.get_cached_pg("Jcloude Settings")
if not ( if not (
jcloude_settings.monitor_server jcloude_settings.monitor_server
and ( and (
@ -375,7 +375,7 @@ class NginxRequestGroupByChart(StackedGroupByChart):
) )
) )
): ):
jingrow.throw("Monitor server not set in Press Settings") jingrow.throw("Monitor server not set in Jcloude Settings")
self.search = self.search.exclude("match_phrase", source__ip=monitor_ip) self.search = self.search.exclude("match_phrase", source__ip=monitor_ip)
if ResourceType(self.resource_type) is ResourceType.SITE: if ResourceType(self.resource_type) is ResourceType.SITE:
server = jingrow.db.get_value("Site", self.name, "server") server = jingrow.db.get_value("Site", self.name, "server")
@ -457,7 +457,7 @@ class SlowLogGroupByChart(StackedGroupByChart):
def _query_prometheus(query: dict[str, str]) -> dict[str, float | str]: def _query_prometheus(query: dict[str, str]) -> dict[str, float | str]:
monitor_server = jingrow.db.get_single_value("Press Settings", "monitor_server") monitor_server = jingrow.db.get_single_value("Jcloude Settings", "monitor_server")
url = f"https://{monitor_server}/prometheus/api/v1/query_range" url = f"https://{monitor_server}/prometheus/api/v1/query_range"
password = get_decrypted_password("Monitor Server", monitor_server, "grafana_password") password = get_decrypted_password("Monitor Server", monitor_server, "grafana_password")
return requests.get(url, params=query, auth=("jingrow", password)).json() return requests.get(url, params=query, auth=("jingrow", password)).json()
@ -755,7 +755,7 @@ def get_rounded_boundaries(timespan: int, timegrain: int, timezone: str = "UTC")
def get_uptime(site, timezone, timespan, timegrain): def get_uptime(site, timezone, timespan, timegrain):
monitor_server = jingrow.db.get_single_value("Press Settings", "monitor_server") monitor_server = jingrow.db.get_single_value("Jcloude Settings", "monitor_server")
if not monitor_server: if not monitor_server:
return [] return []
@ -990,7 +990,7 @@ class GenerateReportReports(BackgroundJobGroupByChart):
def get_usage(site, type, timezone, timespan, timegrain): def get_usage(site, type, timezone, timespan, timegrain):
log_server = jingrow.db.get_single_value("Press Settings", "log_server") log_server = jingrow.db.get_single_value("Jcloude Settings", "log_server")
if not log_server: if not log_server:
return {"datasets": [], "labels": []} return {"datasets": [], "labels": []}
@ -1049,7 +1049,7 @@ def get_usage(site, type, timezone, timespan, timegrain):
def get_current_cpu_usage(site): def get_current_cpu_usage(site):
try: try:
log_server = jingrow.db.get_single_value("Press Settings", "log_server") log_server = jingrow.db.get_single_value("Jcloude Settings", "log_server")
if not log_server: if not log_server:
return 0 return 0
@ -1081,7 +1081,7 @@ def get_current_cpu_usage(site):
def get_current_cpu_usage_for_sites_on_server(server): def get_current_cpu_usage_for_sites_on_server(server):
result = {} result = {}
with suppress(Exception): with suppress(Exception):
log_server = jingrow.db.get_single_value("Press Settings", "log_server") log_server = jingrow.db.get_single_value("Jcloude Settings", "log_server")
if not log_server: if not log_server:
return result return result
@ -1152,7 +1152,7 @@ def get_current_cpu_usage_for_sites_on_server(server):
@site.feature("monitor_access") @site.feature("monitor_access")
def request_logs(site, timezone, date, sort=None, start=0): def request_logs(site, timezone, date, sort=None, start=0):
result = [] result = []
log_server = jingrow.db.get_single_value("Press Settings", "log_server") log_server = jingrow.db.get_single_value("Jcloude Settings", "log_server")
if not log_server: if not log_server:
jingrow.log_error("Log server not configured") jingrow.log_error("Log server not configured")
return result return result
@ -1293,7 +1293,7 @@ def deadlock_report(site, start_datetime, stop_datetime, max_log_size=500):
@protected("Marketplace App") @protected("Marketplace App")
def plausible_analytics(name): def plausible_analytics(name):
response = {} response = {}
settings = jingrow.get_single("Press Settings") settings = jingrow.get_single("Jcloude Settings")
api_endpoints = { api_endpoints = {
"aggregate": "/api/v1/stats/aggregate", "aggregate": "/api/v1/stats/aggregate",
"timeseries": "/api/v1/stats/timeseries", "timeseries": "/api/v1/stats/timeseries",

View File

@ -89,7 +89,7 @@ def get(name):
"no_sites": jingrow.db.count("Site", {"group": group.name, "status": "Active"}), "no_sites": jingrow.db.count("Site", {"group": group.name, "status": "Active"}),
"bench_tags": [{"name": x.tag, "tag": x.tag_name} for x in group.tags], "bench_tags": [{"name": x.tag, "tag": x.tag_name} for x in group.tags],
"tags": jingrow.get_all( "tags": jingrow.get_all(
"Press Tag", {"team": group.team, "doctype_name": "Release Group"}, ["name", "tag"] "Jcloude Tag", {"team": group.team, "doctype_name": "Release Group"}, ["name", "tag"]
), ),
} }
@ -166,7 +166,7 @@ def all(server=None, bench_filter=None):
@jingrow.whitelist() @jingrow.whitelist()
def bench_tags(): def bench_tags():
team = get_current_team() team = get_current_team()
return jingrow.get_all("Press Tag", {"team": team, "doctype_name": "Release Group"}, pluck="tag") return jingrow.get_all("Jcloude Tag", {"team": team, "doctype_name": "Release Group"}, pluck="tag")
def get_app_counts_for_groups(rg_names): def get_app_counts_for_groups(rg_names):
@ -198,7 +198,7 @@ def exists(title):
@jingrow.whitelist() @jingrow.whitelist()
def get_default_apps(): def get_default_apps():
jcloude_settings = jingrow.get_single("Press Settings") jcloude_settings = jingrow.get_single("Jcloude Settings")
default_apps = jcloude_settings.get_default_apps() default_apps = jcloude_settings.get_default_apps()
versions, rows = get_app_versions_list() versions, rows = get_app_versions_list()

View File

@ -270,7 +270,7 @@ def create_payment_intent_for_micro_debit():
micro_debit_charge_field = ( micro_debit_charge_field = (
"micro_debit_charge_usd" if team.currency == "USD" else "micro_debit_charge_inr" "micro_debit_charge_usd" if team.currency == "USD" else "micro_debit_charge_inr"
) )
amount = jingrow.db.get_single_value("Press Settings", micro_debit_charge_field) amount = jingrow.db.get_single_value("Jcloude Settings", micro_debit_charge_field)
intent = stripe.PaymentIntent.create( intent = stripe.PaymentIntent.create(
amount=int(amount * 100), amount=int(amount * 100),
@ -288,7 +288,7 @@ def create_payment_intent_for_micro_debit():
@role_guard.api("billing") @role_guard.api("billing")
def create_payment_intent_for_partnership_fees(): def create_payment_intent_for_partnership_fees():
team = get_current_team(True) team = get_current_team(True)
jcloude_settings = jingrow.get_cached_pg("Press Settings") jcloude_settings = jingrow.get_cached_pg("Jcloude Settings")
metadata = {"payment_for": "partnership_fee"} metadata = {"payment_for": "partnership_fee"}
fee_amount = jcloude_settings.partnership_fee_usd fee_amount = jcloude_settings.partnership_fee_usd
@ -323,7 +323,7 @@ def create_payment_intent_for_buying_credits(amount):
jingrow.throw(f"Amount {amount} is less than the total unpaid amount {total_unpaid}.") jingrow.throw(f"Amount {amount} is less than the total unpaid amount {total_unpaid}.")
if team.currency == "INR": if team.currency == "INR":
gst_amount = amount * jingrow.db.get_single_value("Press Settings", "gst_percentage") gst_amount = amount * jingrow.db.get_single_value("Jcloude Settings", "gst_percentage")
amount += gst_amount amount += gst_amount
metadata.update({"gst": round(gst_amount, 2)}) metadata.update({"gst": round(gst_amount, 2)})
@ -674,7 +674,7 @@ def team_has_balance_for_invoice(prepaid_mode_invoice):
@jingrow.whitelist() @jingrow.whitelist()
@role_guard.api("billing") @role_guard.api("billing")
def is_paypal_enabled() -> bool: def is_paypal_enabled() -> bool:
return jingrow.db.get_single_value("Press Settings", "paypal_enabled") return jingrow.db.get_single_value("Jcloude Settings", "paypal_enabled")
@jingrow.whitelist() @jingrow.whitelist()
@ -693,7 +693,7 @@ def create_razorpay_order(amount, transaction_type, pg_name=None) -> dict | None
# GST for INR transactions # GST for INR transactions
gst_amount = 0 gst_amount = 0
if team.currency == "INR": if team.currency == "INR":
gst_amount = amount * jingrow.db.get_single_value("Press Settings", "gst_percentage") gst_amount = amount * jingrow.db.get_single_value("Jcloude Settings", "gst_percentage")
amount += gst_amount amount += gst_amount
# normalize type for payment record # normalize type for payment record

View File

@ -57,7 +57,7 @@ def handle_job_updates(server: str, job_identifier: str):
job_id = job_identifier job_id = job_identifier
agent = Agent(server, "Server") agent = Agent(server, "Server")
jcloude_settings_use_callbacks = jingrow.get_value( jcloude_settings_use_callbacks = jingrow.get_value(
"Press Settings", fieldname=["use_agent_job_callbacks"] "Jcloude Settings", fieldname=["use_agent_job_callbacks"]
) )
if not jcloude_settings_use_callbacks or not server_info.use_agent_job_callbacks: if not jcloude_settings_use_callbacks or not server_info.use_agent_job_callbacks:

View File

@ -36,7 +36,7 @@ def account_request(
"erpnext": True, "erpnext": True,
"subdomain": subdomain, "subdomain": subdomain,
"email": email, "email": email,
"role": "Press Admin", "role": "Jcloude Admin",
"first_name": first_name, "first_name": first_name,
"last_name": last_name, "last_name": last_name,
"phone_number": phone_number, "phone_number": phone_number,

View File

@ -44,8 +44,8 @@ ALLOWED_DOCTYPES = [
"Release Group App", "Release Group App",
"Release Group Dependency", "Release Group Dependency",
"Cluster", "Cluster",
"Press Permission Group", "Jcloude Permission Group",
"Press Role", "Jcloude Role",
"Team", "Team",
"Product Trial Request", "Product Trial Request",
"Deploy Candidate", "Deploy Candidate",
@ -60,7 +60,7 @@ ALLOWED_DOCTYPES = [
"Server Plan", "Server Plan",
"Release Group Variable", "Release Group Variable",
"Resource Tag", "Resource Tag",
"Press Tag", "Jcloude Tag",
"Partner Approval Request", "Partner Approval Request",
"Marketplace App", "Marketplace App",
"Subscription", "Subscription",
@ -70,15 +70,15 @@ ALLOWED_DOCTYPES = [
"Payout Order", "Payout Order",
"App Patch", "App Patch",
"Product Trial", "Product Trial",
"Press Notification", "Jcloude Notification",
"User SSH Key", "User SSH Key",
"Jingrow Version", "Jingrow Version",
"Dashboard Banner", "Dashboard Banner",
"App Release Approval Request", "App Release Approval Request",
"Press Webhook", "Jcloude Webhook",
"SQL Playground Log", "SQL Playground Log",
"Site Database User", "Site Database User",
"Press Settings", "Jcloude Settings",
"Mpesa Payment Record", "Mpesa Payment Record",
"Partner Certificate", "Partner Certificate",
"Partner Payment Payout", "Partner Payment Payout",
@ -126,7 +126,7 @@ def get_list(
apply_team_filter = not ( apply_team_filter = not (
filters.get("skip_team_filter_for_system_user_and_support_agent") filters.get("skip_team_filter_for_system_user_and_support_agent")
and (jingrow.local.system_user() or has_role("Press Support Agent")) and (jingrow.local.system_user() or has_role("Jcloude Support Agent"))
) )
if apply_team_filter and meta.has_field("team"): if apply_team_filter and meta.has_field("team"):
valid_filters.team = jingrow.local.team().name valid_filters.team = jingrow.local.team().name

View File

@ -24,11 +24,11 @@ def all():
@protected(["Site", "Release Group", "Server", "Database Server"]) @protected(["Site", "Release Group", "Server", "Database Server"])
def create_new_tag(name, doctype, tag): def create_new_tag(name, doctype, tag):
team = get_current_team() team = get_current_team()
if jingrow.db.exists("Press Tag", {"tag": tag, "doctype_name": doctype, "team": team}): if jingrow.db.exists("Jcloude Tag", {"tag": tag, "doctype_name": doctype, "team": team}):
jingrow.throw(f"Tag '{tag}' already exists") jingrow.throw(f"Tag '{tag}' already exists")
tag = jingrow.get_pg( tag = jingrow.get_pg(
{ {
"doctype": "Press Tag", "doctype": "Jcloude Tag",
"doctype_name": doctype, "doctype_name": doctype,
"team": team, "team": team,
"tag": tag, "tag": tag,

View File

@ -159,7 +159,7 @@ def validate_plan(secret_key):
def make_spamd_request(jcloude_settings: PressSettings, message: bytes): def make_spamd_request(jcloude_settings: PressSettings, message: bytes):
headers = {} headers = {}
if jcloude_settings.spamd_api_key: if jcloude_settings.spamd_api_key:
spamd_api_secret = get_decrypted_password("Press Settings", "Press Settings", "spamd_api_secret") spamd_api_secret = get_decrypted_password("Jcloude Settings", "Jcloude Settings", "spamd_api_secret")
headers["Authorization"] = f"token {jcloude_settings.spamd_api_key}:{spamd_api_secret}" headers["Authorization"] = f"token {jcloude_settings.spamd_api_key}:{spamd_api_secret}"
r = requests.post( r = requests.post(
jcloude_settings.spamd_endpoint, jcloude_settings.spamd_endpoint,
@ -172,7 +172,7 @@ def make_spamd_request(jcloude_settings: PressSettings, message: bytes):
def check_spam(message: bytes): def check_spam(message: bytes):
jcloude_settings = jingrow.get_cached_value( jcloude_settings = jingrow.get_cached_value(
"Press Settings", "Jcloude Settings",
None, None,
["enable_spam_check", "spamd_endpoint", "spamd_api_key"], ["enable_spam_check", "spamd_endpoint", "spamd_api_key"],
as_dict=True, as_dict=True,
@ -216,7 +216,7 @@ def send_mime_mail(**data):
validate_plan(data["sk_mail"]) validate_plan(data["sk_mail"])
api_key, domain = jingrow.db.get_value("Press Settings", None, ["mailgun_api_key", "root_domain"]) api_key, domain = jingrow.db.get_value("Jcloude Settings", None, ["mailgun_api_key", "root_domain"])
message: bytes = files["mime"].read() message: bytes = files["mime"].read()
check_spam(message) check_spam(message)

View File

@ -53,8 +53,8 @@ def hook(*args, **kwargs):
def get_jwt_token(): def get_jwt_token():
key = jingrow.db.get_single_value("Press Settings", "github_app_private_key") key = jingrow.db.get_single_value("Jcloude Settings", "github_app_private_key")
app_id = jingrow.db.get_single_value("Press Settings", "github_app_id") app_id = jingrow.db.get_single_value("Jcloude Settings", "github_app_id")
now = datetime.now() now = datetime.now()
expiry = now + timedelta(minutes=9) expiry = now + timedelta(minutes=9)
payload = {"iat": int(now.timestamp()), "exp": int(expiry.timestamp()), "iss": app_id} payload = {"iat": int(now.timestamp()), "exp": int(expiry.timestamp()), "iss": app_id}
@ -64,7 +64,7 @@ def get_jwt_token():
def get_access_token(installation_id: str | None = None): def get_access_token(installation_id: str | None = None):
if not installation_id: if not installation_id:
return jingrow.db.get_value( return jingrow.db.get_value(
"Press Settings", "Jcloude Settings",
None, None,
"github_access_token", "github_access_token",
) )
@ -84,7 +84,7 @@ def get_access_token(installation_id: str | None = None):
@jingrow.whitelist() @jingrow.whitelist()
def clear_token_and_get_installation_url(): def clear_token_and_get_installation_url():
clear_current_team_access_token() clear_current_team_access_token()
public_link = jingrow.db.get_single_value("Press Settings", "github_app_public_link") public_link = jingrow.db.get_single_value("Jcloude Settings", "github_app_public_link")
return f"{public_link}/installations/new" return f"{public_link}/installations/new"
@ -97,7 +97,7 @@ def clear_current_team_access_token():
def options(): def options():
team = get_current_team() team = get_current_team()
token = jingrow.db.get_value("Team", team, "github_access_token") token = jingrow.db.get_value("Team", team, "github_access_token")
public_link = jingrow.db.get_single_value("Press Settings", "github_app_public_link") public_link = jingrow.db.get_single_value("Jcloude Settings", "github_app_public_link")
return { return {
"authorized": bool(token), "authorized": bool(token),
@ -166,7 +166,7 @@ def repositories(installation, token):
def repository(owner, name, installation=None): def repository(owner, name, installation=None):
token = "" token = ""
if not installation: if not installation:
token = jingrow.db.get_value("Press Settings", "github_access_token") token = jingrow.db.get_value("Jcloude Settings", "github_access_token")
else: else:
token = get_access_token(installation) token = get_access_token(installation)
headers = { headers = {
@ -240,7 +240,7 @@ def branches(owner, name, installation=None):
if installation: if installation:
token = get_access_token(installation) token = get_access_token(installation)
else: else:
token = jingrow.get_value("Press Settings", None, "github_access_token") token = jingrow.get_value("Jcloude Settings", None, "github_access_token")
if token: if token:
headers = { headers = {

View File

@ -101,7 +101,7 @@ def callback(code=None, state=None): # noqa: C901
email=email, email=email,
first_name=id_info.get("given_name"), first_name=id_info.get("given_name"),
last_name=id_info.get("family_name"), last_name=id_info.get("family_name"),
role="Press Admin", role="Jcloude Admin",
oauth_signup=True, oauth_signup=True,
product_trial=product_trial.name if product_trial else None, product_trial=product_trial.name if product_trial else None,
) )

View File

@ -158,7 +158,7 @@ def get_install_app_options(marketplace_app: str) -> dict:
"private_groups": private_groups, "private_groups": private_groups,
"clusters": clusters, "clusters": clusters,
"closest_cluster": get_nearest_cluster(), "closest_cluster": get_nearest_cluster(),
"domain": jingrow.db.get_single_value("Press Settings", "domain"), "domain": jingrow.db.get_single_value("Jcloude Settings", "domain"),
} }
@ -218,7 +218,7 @@ def create_site_on_public_bench(
"apps": [{"app": app["app"]} for app in apps], "apps": [{"app": app["app"]} for app in apps],
"cluster": cluster, "cluster": cluster,
"group": group, "group": group,
"domain": jingrow.db.get_single_value("Press Settings", "domain"), "domain": jingrow.db.get_single_value("Jcloude Settings", "domain"),
"team": get_current_team(), "team": get_current_team(),
"app_plans": app_plans, "app_plans": app_plans,
} }

View File

@ -129,7 +129,7 @@ MONITORING_ENDPOINT_RATE_LIMIT_WINDOW_SECONDS = 60
def targets(token=None): def targets(token=None):
if not token: if not token:
jingrow.throw_permission_error() jingrow.throw_permission_error()
monitor_token = jingrow.db.get_single_value("Press Settings", "monitor_token", cache=True) monitor_token = jingrow.db.get_single_value("Jcloude Settings", "monitor_token", cache=True)
if token != monitor_token: if token != monitor_token:
return None return None
@ -142,7 +142,7 @@ def alert(*args, **kwargs):
try: try:
webhook_token = jingrow.db.get_value( webhook_token = jingrow.db.get_value(
"Monitor Server", "Monitor Server",
jingrow.db.get_single_value("Press Settings", "monitor_server", cache=True), jingrow.db.get_single_value("Jcloude Settings", "monitor_server", cache=True),
"webhook_token", "webhook_token",
cache=True, cache=True,
) )

View File

@ -26,7 +26,7 @@ def get_notifications(
if not filters: if not filters:
filters = {} filters = {}
PressNotification = jingrow.qb.DocType("Press Notification") PressNotification = jingrow.qb.DocType("Jcloude Notification")
query = ( query = (
jingrow.qb.from_(PressNotification) jingrow.qb.from_(PressNotification)
.select( .select(
@ -80,9 +80,9 @@ def get_notifications(
@jingrow.whitelist() @jingrow.whitelist()
def mark_all_notifications_as_read(): def mark_all_notifications_as_read():
jingrow.db.set_value("Press Notification", {"team": get_current_team()}, "read", 1, update_modified=False) jingrow.db.set_value("Jcloude Notification", {"team": get_current_team()}, "read", 1, update_modified=False)
@jingrow.whitelist() @jingrow.whitelist()
def get_unread_count(): def get_unread_count():
return jingrow.db.count("Press Notification", {"read": False, "team": get_current_team()}) return jingrow.db.count("Jcloude Notification", {"read": False, "team": get_current_team()})

View File

@ -140,7 +140,7 @@ def create_account_request(email, first_name, last_name, phone_number=""):
"last_name": last_name, "last_name": last_name,
"phone_number": phone_number, "phone_number": phone_number,
"send_email": False, "send_email": False,
"role": "Press Admin", "role": "Jcloude Admin",
"oauth_signup": True, "oauth_signup": True,
} }
).insert(ignore_permissions=True) ).insert(ignore_permissions=True)
@ -182,7 +182,7 @@ def saas_setup(key, app, country, subdomain):
"saas": True, "saas": True,
"erpnext": False, "erpnext": False,
"saas_app": app, "saas_app": app,
"role": "Press Admin", "role": "Jcloude Admin",
"country": country, "country": country,
"subdomain": subdomain, "subdomain": subdomain,
} }

View File

@ -141,7 +141,7 @@ def approve_certificate_link_request(key):
@jingrow.whitelist() @jingrow.whitelist()
@role_guard.api("partner") @role_guard.api("partner")
def get_resource_url(): def get_resource_url():
return jingrow.db.get_value("Press Settings", "Press Settings", "drive_resource_link") return jingrow.db.get_value("Jcloude Settings", "Jcloude Settings", "drive_resource_link")
@jingrow.whitelist() @jingrow.whitelist()
@ -817,7 +817,7 @@ def get_fc_plans():
site_plans = jingrow.get_all( site_plans = jingrow.get_all(
"Site Plan", {"enabled": 1, "document_type": "Site", "price_inr": (">", 0)}, pluck="name" "Site Plan", {"enabled": 1, "document_type": "Site", "price_inr": (">", 0)}, pluck="name"
) )
return [*site_plans, "Dedicated Server", "Managed Press"] return [*site_plans, "Dedicated Server", "Managed Jcloude"]
@jingrow.whitelist() @jingrow.whitelist()

View File

@ -65,7 +65,7 @@ def account_request(
"erpnext": False, "erpnext": False,
"subdomain": subdomain, "subdomain": subdomain,
"email": email, "email": email,
"role": "Press Admin", "role": "Jcloude Admin",
"first_name": clean_html(first_name), "first_name": clean_html(first_name),
"last_name": clean_html(last_name), "last_name": clean_html(last_name),
"country": country, "country": country,

View File

@ -128,7 +128,7 @@ def all(server_filter=None): # noqa: C901
@jingrow.whitelist() @jingrow.whitelist()
def server_tags(): def server_tags():
team = get_current_team() team = get_current_team()
return jingrow.get_all("Press Tag", {"team": team, "doctype_name": "Server"}, pluck="tag") return jingrow.get_all("Jcloude Tag", {"team": team, "doctype_name": "Server"}, pluck="tag")
@jingrow.whitelist() @jingrow.whitelist()
@ -147,7 +147,7 @@ def get(name):
"Cluster", server.cluster, ["name", "title", "image"], as_dict=True "Cluster", server.cluster, ["name", "title", "image"], as_dict=True
), ),
"server_tags": [{"name": x.tag, "tag": x.tag_name} for x in server.tags], "server_tags": [{"name": x.tag, "tag": x.tag_name} for x in server.tags],
"tags": jingrow.get_all("Press Tag", {"team": server.team, "doctype_name": "Server"}, ["name", "tag"]), "tags": jingrow.get_all("Jcloude Tag", {"team": server.team, "doctype_name": "Server"}, ["name", "tag"]),
"type": "database-server" if server.meta.name == "Database Server" else "server", "type": "database-server" if server.meta.name == "Database Server" else "server",
} }
@ -244,7 +244,7 @@ def new(server):
def get_cpu_and_memory_usage(name: str, time_range: str = "4m") -> dict[str, float]: def get_cpu_and_memory_usage(name: str, time_range: str = "4m") -> dict[str, float]:
"""Returns simplified CPU and memory usage [0..1] for autoscale triggers""" """Returns simplified CPU and memory usage [0..1] for autoscale triggers"""
monitor_server = jingrow.db.get_single_value("Press Settings", "monitor_server") monitor_server = jingrow.db.get_single_value("Jcloude Settings", "monitor_server")
if not monitor_server: if not monitor_server:
return {"vcpu": 0.0, "memory": 0.0} return {"vcpu": 0.0, "memory": 0.0}
@ -492,7 +492,7 @@ def get_slow_logs_by_site(name, query, timezone, duration, normalize=False):
def prometheus_query(query, function, timezone, timespan, timegrain): def prometheus_query(query, function, timezone, timespan, timegrain):
monitor_server = jingrow.db.get_single_value("Press Settings", "monitor_server") monitor_server = jingrow.db.get_single_value("Jcloude Settings", "monitor_server")
if not monitor_server: if not monitor_server:
return {"datasets": [], "labels": []} return {"datasets": [], "labels": []}
@ -574,7 +574,7 @@ def options():
@jingrow.whitelist() @jingrow.whitelist()
def get_autoscale_discount(): def get_autoscale_discount():
return jingrow.db.get_single_value("Press Settings", "autoscale_discount", cache=True) return jingrow.db.get_single_value("Jcloude Settings", "autoscale_discount", cache=True)
@jingrow.whitelist() @jingrow.whitelist()
@ -587,7 +587,7 @@ def secondary_server_plans(
current_price = jingrow.db.get_value("Server Plan", current_plan, "price_inr") current_price = jingrow.db.get_value("Server Plan", current_plan, "price_inr")
ServerPlan = jingrow.qb.DocType("Server Plan") ServerPlan = jingrow.qb.DocType("Server Plan")
HasRole = jingrow.qb.DocType("Has Role") HasRole = jingrow.qb.DocType("Has Role")
autoscale_discount = jingrow.db.get_single_value("Press Settings", "autoscale_discount") autoscale_discount = jingrow.db.get_single_value("Jcloude Settings", "autoscale_discount")
query = ( query = (
jingrow.qb.from_(ServerPlan) jingrow.qb.from_(ServerPlan)
@ -688,8 +688,8 @@ def change_plan(name, plan):
@protected(["Server", "Database Server"]) @protected(["Server", "Database Server"])
def jcloude_jobs(name): def jcloude_jobs(name):
jobs = [] jobs = []
for job in jingrow.get_all("Press Job", {"server": name}, pluck="name"): for job in jingrow.get_all("Jcloude Job", {"server": name}, pluck="name"):
jobs.append(jingrow.get_pg("Press Job", job).detail()) jobs.append(jingrow.get_pg("Jcloude Job", job).detail())
return jobs return jobs
@ -792,7 +792,7 @@ def benches_are_idle(server: str, access_token: str) -> None:
scaled_up_at = jingrow.db.get_value( scaled_up_at = jingrow.db.get_value(
"Auto Scale Record", {"secondary_server": server, "scale_up": True}, "modified" "Auto Scale Record", {"secondary_server": server, "scale_up": True}, "modified"
) )
cool_off_period = jingrow.db.get_single_value("Press Settings", "cool_off_period") cool_off_period = jingrow.db.get_single_value("Jcloude Settings", "cool_off_period")
should_scale_down = ( should_scale_down = (
not running_scale_down not running_scale_down

View File

@ -141,7 +141,7 @@ def _new(site, server: str | None = None, ignore_plan_validation: bool = False):
if not (domain and jingrow.db.exists("Root Domain", {"name": domain})): if not (domain and jingrow.db.exists("Root Domain", {"name": domain})):
jingrow.throw("No root domain for site") jingrow.throw("No root domain for site")
cluster = site.get("cluster") or jingrow.db.get_single_value("Press Settings", "cluster") cluster = site.get("cluster") or jingrow.db.get_single_value("Jcloude Settings", "cluster")
Bench = jingrow.qb.DocType("Bench") Bench = jingrow.qb.DocType("Bench")
Server = jingrow.qb.DocType("Server") Server = jingrow.qb.DocType("Server")
@ -287,7 +287,7 @@ def validate_plan(server: str, plan: str) -> None:
@jingrow.whitelist() @jingrow.whitelist()
def new(site): def new(site):
if not hasattr(site, "domain") and not site.get("domain"): if not hasattr(site, "domain") and not site.get("domain"):
site["domain"] = jingrow.db.get_single_value("Press Settings", "domain") site["domain"] = jingrow.db.get_single_value("Jcloude Settings", "domain")
return _new(site) return _new(site)
@ -380,7 +380,7 @@ def running_jobs(name):
@jingrow.whitelist() @jingrow.whitelist()
@protected("Site") @protected("Site")
def backups(name): def backups(name):
available_offsite_backups = jingrow.db.get_single_value("Press Settings", "offsite_backups_count") or 30 available_offsite_backups = jingrow.db.get_single_value("Jcloude Settings", "offsite_backups_count") or 30
fields = [ fields = [
"name", "name",
"with_files", "with_files",
@ -585,7 +585,7 @@ def options_for_new(for_bench: str | None = None): # noqa: C901
# app source details are all fetched from marketplace apps for public sites # app source details are all fetched from marketplace apps for public sites
marketplace_details = None marketplace_details = None
default_domain = jingrow.db.get_single_value("Press Settings", "domain") default_domain = jingrow.db.get_single_value("Jcloude Settings", "domain")
cluster_specific_root_domains = jingrow.db.get_all( cluster_specific_root_domains = jingrow.db.get_all(
"Root Domain", "Root Domain",
{"name": ("like", f"%.{default_domain}")}, {"name": ("like", f"%.{default_domain}")},
@ -603,7 +603,7 @@ def options_for_new(for_bench: str | None = None): # noqa: C901
def set_default_apps(app_source_details_grouped): def set_default_apps(app_source_details_grouped):
jcloude_settings = jingrow.get_single("Press Settings") jcloude_settings = jingrow.get_single("Jcloude Settings")
default_apps = jcloude_settings.get_default_apps() default_apps = jcloude_settings.get_default_apps()
for app_source in app_source_details_grouped.values(): for app_source in app_source_details_grouped.values():
@ -722,7 +722,7 @@ def set_bench_and_clusters(version, for_bench):
@jingrow.whitelist() @jingrow.whitelist()
def get_domain(): def get_domain():
return jingrow.db.get_value("Press Settings", "Press Settings", ["domain"]) return jingrow.db.get_value("Jcloude Settings", "Jcloude Settings", ["domain"])
@jingrow.whitelist() @jingrow.whitelist()
@ -1081,7 +1081,7 @@ def get_sites_query(site_filter, benches_with_updates):
@jingrow.whitelist() @jingrow.whitelist()
def site_tags(): def site_tags():
team = get_current_team() team = get_current_team()
return jingrow.get_all("Press Tag", {"team": team, "doctype_name": "Site"}, pluck="tag") return jingrow.get_all("Jcloude Tag", {"team": team, "doctype_name": "Site"}, pluck="tag")
@jingrow.whitelist() @jingrow.whitelist()
@ -1170,7 +1170,7 @@ def get(name):
], ],
"ip": ip, "ip": ip,
"site_tags": [{"name": x.tag, "tag": x.tag_name} for x in site.tags], "site_tags": [{"name": x.tag, "tag": x.tag_name} for x in site.tags],
"tags": jingrow.get_all("Press Tag", {"team": team, "doctype_name": "Site"}, ["name", "tag"]), "tags": jingrow.get_all("Jcloude Tag", {"team": team, "doctype_name": "Site"}, ["name", "tag"]),
"info": { "info": {
"owner": jingrow.db.get_value( "owner": jingrow.db.get_value(
"User", "User",
@ -1731,21 +1731,21 @@ def update_config(name, config):
@jingrow.whitelist() @jingrow.whitelist()
def get_trial_plan(): def get_trial_plan():
return jingrow.db.get_value("Press Settings", None, "jcloude_trial_plan") return jingrow.db.get_value("Jcloude Settings", None, "jcloude_trial_plan")
@jingrow.whitelist() @jingrow.whitelist()
def get_upload_link(file, parts=1): def get_upload_link(file, parts=1):
bucket_name = jingrow.db.get_single_value("Press Settings", "remote_uploads_bucket") bucket_name = jingrow.db.get_single_value("Jcloude Settings", "remote_uploads_bucket")
expiration = jingrow.db.get_single_value("Press Settings", "remote_link_expiry") or 3600 expiration = jingrow.db.get_single_value("Jcloude Settings", "remote_link_expiry") or 3600
object_name = get_remote_key(file) object_name = get_remote_key(file)
parts = int(parts) parts = int(parts)
s3_client = client( s3_client = client(
"s3", "s3",
aws_access_key_id=jingrow.db.get_single_value("Press Settings", "remote_access_key_id"), aws_access_key_id=jingrow.db.get_single_value("Jcloude Settings", "remote_access_key_id"),
aws_secret_access_key=get_decrypted_password( aws_secret_access_key=get_decrypted_password(
"Press Settings", "Press Settings", "remote_secret_access_key" "Jcloude Settings", "Jcloude Settings", "remote_secret_access_key"
), ),
region_name="ap-south-1", region_name="ap-south-1",
) )
@ -1779,13 +1779,13 @@ def get_upload_link(file, parts=1):
@jingrow.whitelist() @jingrow.whitelist()
def multipart_exit(file, id, action, parts=None): def multipart_exit(file, id, action, parts=None):
bucket_name = jingrow.db.get_single_value("Press Settings", "remote_uploads_bucket") bucket_name = jingrow.db.get_single_value("Jcloude Settings", "remote_uploads_bucket")
s3_client = client( s3_client = client(
"s3", "s3",
aws_access_key_id=jingrow.db.get_single_value("Press Settings", "remote_access_key_id"), aws_access_key_id=jingrow.db.get_single_value("Jcloude Settings", "remote_access_key_id"),
aws_secret_access_key=get_decrypted_password( aws_secret_access_key=get_decrypted_password(
"Press Settings", "Jcloude Settings",
"Press Settings", "Jcloude Settings",
"remote_secret_access_key", "remote_secret_access_key",
raise_exception=False, raise_exception=False,
), ),
@ -1815,7 +1815,7 @@ def uploaded_backup_info(file=None, path=None, type=None, size=None, url=None):
"file_size": size, "file_size": size,
"file_path": path, "file_path": path,
"url": url, "url": url,
"bucket": jingrow.db.get_single_value("Press Settings", "remote_uploads_bucket"), "bucket": jingrow.db.get_single_value("Jcloude Settings", "remote_uploads_bucket"),
} }
).insert() ).insert()
add_tag("Site Upload", pg.doctype, pg.name) add_tag("Site Upload", pg.doctype, pg.name)

View File

@ -50,7 +50,7 @@ def code_server_domain():
""" """
Returns the domain for code servers Returns the domain for code servers
""" """
return jingrow.db.get_single_value("Press Settings", "spaces_domain") return jingrow.db.get_single_value("Jcloude Settings", "spaces_domain")
@jingrow.whitelist() @jingrow.whitelist()

View File

@ -256,7 +256,7 @@ class TestAPIServer(FrappeTestCase):
server = jingrow.get_last_pg("Server") server = jingrow.get_last_pg("Server")
db_server = jingrow.get_last_pg("Database Server") db_server = jingrow.get_last_pg("Database Server")
jingrow.db.set_value( jingrow.db.set_value(
"Press Job", {"status": "Running"}, "status", "Success" "Jcloude Job", {"status": "Running"}, "status", "Success"
) # Mark running jobs as success as extra steps we don't check ) # Mark running jobs as success as extra steps we don't check
change_plan( change_plan(
@ -273,7 +273,7 @@ class TestAPIServer(FrappeTestCase):
self.assertEqual(server.plan, app_plan_2.name) self.assertEqual(server.plan, app_plan_2.name)
self.assertEqual(server.ram, app_plan_2.memory) self.assertEqual(server.ram, app_plan_2.memory)
jingrow.db.set_value( jingrow.db.set_value(
"Press Job", {"status": "Running"}, "status", "Success" "Jcloude Job", {"status": "Running"}, "status", "Success"
) # Mark running jobs as success as extra steps we don't check ) # Mark running jobs as success as extra steps we don't check
change_plan( change_plan(

View File

@ -46,7 +46,7 @@ class TestAPISite(FrappeTestCase):
self.team.payment_mode = "Prepaid Credits" self.team.payment_mode = "Prepaid Credits"
self.team.save() self.team.save()
self.domain = jingrow.db.get_single_value("Press Settings", "domain") self.domain = jingrow.db.get_single_value("Jcloude Settings", "domain")
def tearDown(self): def tearDown(self):
jingrow.db.rollback() jingrow.db.rollback()
@ -123,7 +123,7 @@ class TestAPISite(FrappeTestCase):
cluster = create_test_cluster("Default", public=True) cluster = create_test_cluster("Default", public=True)
root_domain = create_test_root_domain("local.fc.jingrow.dev") root_domain = create_test_root_domain("local.fc.jingrow.dev")
jingrow.db.set_single_value("Press Settings", "domain", root_domain.name) jingrow.db.set_single_value("Jcloude Settings", "domain", root_domain.name)
n1_server = create_test_proxy_server(cluster=cluster.name, domain=root_domain.name) n1_server = create_test_proxy_server(cluster=cluster.name, domain=root_domain.name)
f1_server = create_test_server(cluster=cluster.name, proxy_server=n1_server.name) f1_server = create_test_server(cluster=cluster.name, proxy_server=n1_server.name)
@ -167,7 +167,7 @@ class TestAPISite(FrappeTestCase):
cluster = create_test_cluster("Default", public=True) cluster = create_test_cluster("Default", public=True)
root_domain = create_test_root_domain("local.fc.jingrow.dev") root_domain = create_test_root_domain("local.fc.jingrow.dev")
jingrow.db.set_single_value("Press Settings", "domain", root_domain.name) jingrow.db.set_single_value("Jcloude Settings", "domain", root_domain.name)
n1_server = create_test_proxy_server(cluster=cluster.name, domain=root_domain.name) n1_server = create_test_proxy_server(cluster=cluster.name, domain=root_domain.name)
f1_server = create_test_server(cluster=cluster.name, proxy_server=n1_server.name) f1_server = create_test_server(cluster=cluster.name, proxy_server=n1_server.name)
@ -204,7 +204,7 @@ class TestAPISite(FrappeTestCase):
cluster = create_test_cluster("Default", public=True) cluster = create_test_cluster("Default", public=True)
root_domain = create_test_root_domain("local.fc.jingrow.dev") root_domain = create_test_root_domain("local.fc.jingrow.dev")
jingrow.db.set_single_value("Press Settings", "domain", root_domain.name) jingrow.db.set_single_value("Jcloude Settings", "domain", root_domain.name)
jingrow_app = create_test_app(name="jingrow") jingrow_app = create_test_app(name="jingrow")
@ -264,7 +264,7 @@ class TestAPISite(FrappeTestCase):
cluster = create_test_cluster("Default", public=True) cluster = create_test_cluster("Default", public=True)
root_domain = create_test_root_domain("local.fc.jingrow.dev") root_domain = create_test_root_domain("local.fc.jingrow.dev")
jingrow.db.set_single_value("Press Settings", "domain", root_domain.name) jingrow.db.set_single_value("Jcloude Settings", "domain", root_domain.name)
jingrow_app = create_test_app(name="jingrow") jingrow_app = create_test_app(name="jingrow")
@ -380,7 +380,7 @@ class TestAPISite(FrappeTestCase):
"ip": jingrow.get_last_pg("Proxy Server").ip, "ip": jingrow.get_last_pg("Proxy Server").ip,
"site_tags": [{"name": x.tag, "tag": x.tag_name} for x in site.tags], "site_tags": [{"name": x.tag, "tag": x.tag_name} for x in site.tags],
"tags": jingrow.get_all( "tags": jingrow.get_all(
"Press Tag", "Jcloude Tag",
{"team": self.team.name, "doctype_name": "Site"}, {"team": self.team.name, "doctype_name": "Site"},
["name", "tag"], ["name", "tag"],
), ),

View File

@ -14,7 +14,7 @@ from jcloude.guards import role_guard
@jingrow.whitelist(allow_guest=True) @jingrow.whitelist(allow_guest=True)
def available_events(): def available_events():
return jingrow.get_all( return jingrow.get_all(
"Press Webhook Event", "Jcloude Webhook Event",
fields=["name", "description"], fields=["name", "description"],
filters={"enabled": 1}, filters={"enabled": 1},
order_by="creation desc", order_by="creation desc",
@ -22,9 +22,9 @@ def available_events():
@jingrow.whitelist() @jingrow.whitelist()
@role_guard.document(document_type=lambda _: "Press Webhook") @role_guard.document(document_type=lambda _: "Jcloude Webhook")
def add(endpoint: str, secret: str, events: list[str]): def add(endpoint: str, secret: str, events: list[str]):
pg = jingrow.new_pg("Press Webhook") pg = jingrow.new_pg("Jcloude Webhook")
pg.endpoint = endpoint pg.endpoint = endpoint
pg.secret = secret pg.secret = secret
pg.team = jingrow.local.team().name pg.team = jingrow.local.team().name
@ -34,10 +34,10 @@ def add(endpoint: str, secret: str, events: list[str]):
@jingrow.whitelist() @jingrow.whitelist()
@protected("Press Webhook") @protected("Jcloude Webhook")
@role_guard.document(document_type=lambda _: "Press Webhook") @role_guard.document(document_type=lambda _: "Jcloude Webhook")
def update(name: str, endpoint: str, secret: str, events: list[str]): def update(name: str, endpoint: str, secret: str, events: list[str]):
pg = jingrow.get_pg("Press Webhook", name) pg = jingrow.get_pg("Jcloude Webhook", name)
pg.endpoint = endpoint pg.endpoint = endpoint
pg.secret = secret or pg.secret pg.secret = secret or pg.secret
pg.events = [] pg.events = []
@ -47,14 +47,14 @@ def update(name: str, endpoint: str, secret: str, events: list[str]):
@jingrow.whitelist() @jingrow.whitelist()
@protected("Press Webhook") @protected("Jcloude Webhook")
@role_guard.document(document_type=lambda _: "Press Webhook Log") @role_guard.document(document_type=lambda _: "Jcloude Webhook Log")
def attempts(webhook: str): def attempts(webhook: str):
pg = jingrow.get_pg("Press Webhook", webhook) pg = jingrow.get_pg("Jcloude Webhook", webhook)
pg.has_permission("read") pg.has_permission("read")
PressWebhookAttempt = jingrow.qb.DocType("Press Webhook Attempt") PressWebhookAttempt = jingrow.qb.DocType("Jcloude Webhook Attempt")
PressWebhookLog = jingrow.qb.DocType("Press Webhook Log") PressWebhookLog = jingrow.qb.DocType("Jcloude Webhook Log")
query = ( query = (
jingrow.qb.from_(PressWebhookAttempt) jingrow.qb.from_(PressWebhookAttempt)
.select( .select(
@ -74,10 +74,10 @@ def attempts(webhook: str):
@jingrow.whitelist() @jingrow.whitelist()
@role_guard.document(document_type=lambda _: "Press Webhook Attempt") @role_guard.document(document_type=lambda _: "Jcloude Webhook Attempt")
def attempt(name: str): def attempt(name: str):
pg = jingrow.get_pg("Press Webhook Attempt", name) pg = jingrow.get_pg("Jcloude Webhook Attempt", name)
pg.has_permission("read") pg.has_permission("read")
data = pg.as_dict() data = pg.as_dict()
data.request_payload = json.loads(jingrow.get_value("Press Webhook Log", pg.parent, "request_payload")) data.request_payload = json.loads(jingrow.get_value("Jcloude Webhook Log", pg.parent, "request_payload"))
return data return data

View File

@ -40,7 +40,7 @@ MAIL_PASSWORD = ""
def prepare(): def prepare():
complete_setup_wizard() complete_setup_wizard()
settings = jingrow.get_single("Press Settings") settings = jingrow.get_single("Jcloude Settings")
setup_certbot(settings) setup_certbot(settings)
setup_root_domain(settings) setup_root_domain(settings)
setup_stripe(settings) setup_stripe(settings)
@ -311,8 +311,8 @@ def setup_plans():
"max_storage_usage": 10240 * index, "max_storage_usage": 10240 * index,
"roles": [ "roles": [
{"role": "System Manager"}, {"role": "System Manager"},
{"role": "Press Admin"}, {"role": "Jcloude Admin"},
{"role": "Press Member"}, {"role": "Jcloude Member"},
], ],
} }
).insert() ).insert()

View File

@ -17,7 +17,7 @@ def start_ngrok_and_set_webhook(context):
jingrow.connect() jingrow.connect()
# Set ngrok auth token # Set ngrok auth token
auth_token = jingrow.db.get_single_value("Press Settings", "ngrok_auth_token") auth_token = jingrow.db.get_single_value("Jcloude Settings", "ngrok_auth_token")
if auth_token: if auth_token:
ngrok.set_auth_token(auth_token) ngrok.set_auth_token(auth_token)
@ -32,7 +32,7 @@ def start_ngrok_and_set_webhook(context):
stripe = get_stripe() stripe = get_stripe()
url = f"{public_url}/api/method/jcloude.jcloude.doctype.stripe_webhook_log.stripe_webhook_log.stripe_webhook_handler" url = f"{public_url}/api/method/jcloude.jcloude.doctype.stripe_webhook_log.stripe_webhook_log.stripe_webhook_handler"
stripe.WebhookEndpoint.modify( stripe.WebhookEndpoint.modify(
jingrow.db.get_single_value("Press Settings", "stripe_webhook_endpoint_id"), url=url jingrow.db.get_single_value("Jcloude Settings", "stripe_webhook_endpoint_id"), url=url
) )
print("Updated Stripe Webhook Endpoint") print("Updated Stripe Webhook Endpoint")

View File

@ -6,13 +6,13 @@ from jingrow import _
def get_data(): def get_data():
return [ return [
{ {
"module_name": "Press", "module_name": "Jcloude",
"category": "Modules", "category": "Modules",
"color": "grey", "color": "grey",
"description": "Managed Jingrow Hosting", "description": "Managed Jingrow Hosting",
"icon": "octicon octicon-rocket", "icon": "octicon octicon-rocket",
"type": "module", "type": "module",
"label": _("Press"), "label": _("Jcloude"),
"reverse": 1, "reverse": 1,
} }
] ]

View File

@ -9,4 +9,4 @@ Configuration for docs
def get_context(context): def get_context(context):
context.brand_html = "Press" context.brand_html = "Jcloude"

View File

@ -21,7 +21,7 @@ class ReferralBonus(Document):
team = jingrow.get_pg("Team", self.referred_by) team = jingrow.get_pg("Team", self.referred_by)
credits_field = "free_credits_inr" if team.currency == "INR" else "free_credits_usd" credits_field = "free_credits_inr" if team.currency == "INR" else "free_credits_usd"
credit_amount = jingrow.db.get_single_value("Press Settings", credits_field) credit_amount = jingrow.db.get_single_value("Jcloude Settings", credits_field)
if not credit_amount: if not credit_amount:
return return
@ -32,7 +32,7 @@ class ReferralBonus(Document):
self.reload() self.reload()
# TODO: Remove hardcoded values and add fields in Press Settings # TODO: Remove hardcoded values and add fields in Jcloude Settings
def team_has_spent(team, usd_amount=25.0, inr_amount=1800.0): def team_has_spent(team, usd_amount=25.0, inr_amount=1800.0):
"""Has the team spent atleast the given amount yet (on stripe)""" """Has the team spent atleast the given amount yet (on stripe)"""
team_currency = jingrow.db.get_value("Team", team, "currency") team_currency = jingrow.db.get_value("Team", team, "currency")

View File

@ -3,7 +3,7 @@
"callback_max_retry": 5, "callback_max_retry": 5,
"callback_script": "snapshot = jingrow.get_pg(\"Server Snapshot\", arguments.get(\"server_snapshot\"))\nif pg.server_type == \"Server\":\n\tsnapshot.resume_app_server_services()\nelif pg.server_type == \"Database Server\":\n\tsnapshot.resume_database_server_services()\n\nif pg.status == \"Failure\":\n jingrow.db.set_value(\"Server Snapshot\", snapshot.name, \"status\", \"Failure\", update_modified=False)\n for s in snapshot.snapshots:\n try:\n jingrow.get_pg(\"Virtual Disk Snapshot\", s).delete_snapshot()\n except:\n pass\n \nelse:\n snapshot.sync(now=False)", "callback_script": "snapshot = jingrow.get_pg(\"Server Snapshot\", arguments.get(\"server_snapshot\"))\nif pg.server_type == \"Server\":\n\tsnapshot.resume_app_server_services()\nelif pg.server_type == \"Database Server\":\n\tsnapshot.resume_database_server_services()\n\nif pg.status == \"Failure\":\n jingrow.db.set_value(\"Server Snapshot\", snapshot.name, \"status\", \"Failure\", update_modified=False)\n for s in snapshot.snapshots:\n try:\n jingrow.get_pg(\"Virtual Disk Snapshot\", s).delete_snapshot()\n except:\n pass\n \nelse:\n snapshot.sync(now=False)",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Job Type", "doctype": "Jcloude Job Type",
"modified": "2025-09-24 16:33:10.530624", "modified": "2025-09-24 16:33:10.530624",
"name": "Snapshot Disk", "name": "Snapshot Disk",
"steps": [ "steps": [
@ -38,7 +38,7 @@
"callback_max_retry": 0, "callback_max_retry": 0,
"callback_script": null, "callback_script": null,
"docstatus": 0, "docstatus": 0,
"doctype": "Press Job Type", "doctype": "Jcloude Job Type",
"modified": "2025-08-12 16:24:10.555919", "modified": "2025-08-12 16:24:10.555919",
"name": "Attach Volume", "name": "Attach Volume",
"steps": [ "steps": [
@ -53,7 +53,7 @@
"callback_max_retry": 0, "callback_max_retry": 0,
"callback_script": null, "callback_script": null,
"docstatus": 0, "docstatus": 0,
"doctype": "Press Job Type", "doctype": "Jcloude Job Type",
"modified": "2025-01-02 15:33:27.252601", "modified": "2025-01-02 15:33:27.252601",
"name": "Resize Server", "name": "Resize Server",
"steps": [ "steps": [
@ -103,7 +103,7 @@
"callback_max_retry": 0, "callback_max_retry": 0,
"callback_script": null, "callback_script": null,
"docstatus": 0, "docstatus": 0,
"doctype": "Press Job Type", "doctype": "Jcloude Job Type",
"modified": "2024-02-05 17:08:00.514456", "modified": "2024-02-05 17:08:00.514456",
"name": "Create Server Snapshot", "name": "Create Server Snapshot",
"steps": [ "steps": [
@ -143,7 +143,7 @@
"callback_max_retry": 0, "callback_max_retry": 0,
"callback_script": "server = jingrow.get_pg(pg.server_type, pg.server)\n\nif pg.server_type in [\"Server\", \"Database Server\"] and server.is_for_recovery:\n filter_field = \"app_server\" if pg.server_type == \"Server\" else \"database_server\"\n recovery_record_name = jingrow.db.get_value(\"Server Snapshot Recovery\", {filter_field: pg.server}, \"name\")\n if recovery_record_name:\n recovery_record = jingrow.get_pg(\"Server Snapshot Recovery\", recovery_record_name, for_update=True)\n \n if pg.status == \"Success\":\n if pg.server_type == \"Server\":\n recovery_record.app_server_archived = True\n else:\n recovery_record.database_server_archived = True\n recovery_record.save()", "callback_script": "server = jingrow.get_pg(pg.server_type, pg.server)\n\nif pg.server_type in [\"Server\", \"Database Server\"] and server.is_for_recovery:\n filter_field = \"app_server\" if pg.server_type == \"Server\" else \"database_server\"\n recovery_record_name = jingrow.db.get_value(\"Server Snapshot Recovery\", {filter_field: pg.server}, \"name\")\n if recovery_record_name:\n recovery_record = jingrow.get_pg(\"Server Snapshot Recovery\", recovery_record_name, for_update=True)\n \n if pg.status == \"Success\":\n if pg.server_type == \"Server\":\n recovery_record.app_server_archived = True\n else:\n recovery_record.database_server_archived = True\n recovery_record.save()",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Job Type", "doctype": "Jcloude Job Type",
"modified": "2025-09-08 11:42:40.490054", "modified": "2025-09-08 11:42:40.490054",
"name": "Archive Server", "name": "Archive Server",
"steps": [ "steps": [
@ -168,7 +168,7 @@
"callback_max_retry": 0, "callback_max_retry": 0,
"callback_script": null, "callback_script": null,
"docstatus": 0, "docstatus": 0,
"doctype": "Press Job Type", "doctype": "Jcloude Job Type",
"modified": "2024-01-05 13:40:21.038901", "modified": "2024-01-05 13:40:21.038901",
"name": "Upgrade MariaDB", "name": "Upgrade MariaDB",
"steps": [ "steps": [
@ -203,7 +203,7 @@
"callback_max_retry": 0, "callback_max_retry": 0,
"callback_script": null, "callback_script": null,
"docstatus": 0, "docstatus": 0,
"doctype": "Press Job Type", "doctype": "Jcloude Job Type",
"modified": "2025-02-14 14:30:00.676187", "modified": "2025-02-14 14:30:00.676187",
"name": "Increase Disk Size", "name": "Increase Disk Size",
"steps": [ "steps": [
@ -243,12 +243,12 @@
"callback_max_retry": 0, "callback_max_retry": 0,
"callback_script": null, "callback_script": null,
"docstatus": 0, "docstatus": 0,
"doctype": "Press Job Type", "doctype": "Jcloude Job Type",
"modified": "2025-11-12 09:35:41.121169", "modified": "2025-11-12 09:35:41.121169",
"name": "Prune Docker system", "name": "Prune Docker system",
"steps": [ "steps": [
{ {
"script": "server = jingrow.get_pg(pg.server_type, pg.server)\ntelegram_message = jingrow.get_pg(\"Press Settings\").telegram_message\ntelegram_message.enqueue(f\"Pruning docker cache on [{server.name}]({jingrow.utils.get_url_to_form(server.doctype, server.name)})\", \"Information\")\nserver.prune_docker_system()", "script": "server = jingrow.get_pg(pg.server_type, pg.server)\ntelegram_message = jingrow.get_pg(\"Jcloude Settings\").telegram_message\ntelegram_message.enqueue(f\"Pruning docker cache on [{server.name}]({jingrow.utils.get_url_to_form(server.doctype, server.name)})\", \"Information\")\nserver.prune_docker_system()",
"step_name": "Prune Docker system", "step_name": "Prune Docker system",
"wait_until_true": 0 "wait_until_true": 0
}, },
@ -263,12 +263,12 @@
"callback_max_retry": 0, "callback_max_retry": 0,
"callback_script": null, "callback_script": null,
"docstatus": 0, "docstatus": 0,
"doctype": "Press Job Type", "doctype": "Jcloude Job Type",
"modified": "2025-11-12 09:35:21.819679", "modified": "2025-11-12 09:35:21.819679",
"name": "Increase Swap", "name": "Increase Swap",
"steps": [ "steps": [
{ {
"script": "server = jingrow.get_pg(pg.server_type, pg.server)\ntelegram_message = jingrow.get_pg(\"Press Settings\").telegram_message\ntelegram_message.enqueue(f\"Increasing swap on [{server.name}]({jingrow.utils.get_url_to_form(server.doctype, server.name)})\", \"Information\")\nserver.increase_swap(4)", "script": "server = jingrow.get_pg(pg.server_type, pg.server)\ntelegram_message = jingrow.get_pg(\"Jcloude Settings\").telegram_message\ntelegram_message.enqueue(f\"Increasing swap on [{server.name}]({jingrow.utils.get_url_to_form(server.doctype, server.name)})\", \"Information\")\nserver.increase_swap(4)",
"step_name": "Add swap on server", "step_name": "Add swap on server",
"wait_until_true": 0 "wait_until_true": 0
}, },
@ -283,7 +283,7 @@
"callback_max_retry": 0, "callback_max_retry": 0,
"callback_script": null, "callback_script": null,
"docstatus": 0, "docstatus": 0,
"doctype": "Press Job Type", "doctype": "Jcloude Job Type",
"modified": "2024-12-06 10:59:08.032149", "modified": "2024-12-06 10:59:08.032149",
"name": "Stop and Start Server", "name": "Stop and Start Server",
"steps": [ "steps": [
@ -318,12 +318,12 @@
"callback_max_retry": 0, "callback_max_retry": 0,
"callback_script": null, "callback_script": null,
"docstatus": 0, "docstatus": 0,
"doctype": "Press Job Type", "doctype": "Jcloude Job Type",
"modified": "2025-11-12 09:34:59.467479", "modified": "2025-11-12 09:34:59.467479",
"name": "Reset Swap", "name": "Reset Swap",
"steps": [ "steps": [
{ {
"script": "server = jingrow.get_pg(pg.server_type, pg.server)\ntelegram_message = jingrow.get_pg(\"Press Settings\").telegram_message\ntelegram_message.enqueue(f\"Resetting swap on [{server.name}]({jingrow.utils.get_url_to_form(server.doctype, server.name)})\", \"Information\")\nserver.reset_swap()", "script": "server = jingrow.get_pg(pg.server_type, pg.server)\ntelegram_message = jingrow.get_pg(\"Jcloude Settings\").telegram_message\ntelegram_message.enqueue(f\"Resetting swap on [{server.name}]({jingrow.utils.get_url_to_form(server.doctype, server.name)})\", \"Information\")\nserver.reset_swap()",
"step_name": "Reset swap on server", "step_name": "Reset swap on server",
"wait_until_true": 0 "wait_until_true": 0
}, },
@ -338,7 +338,7 @@
"callback_max_retry": 0, "callback_max_retry": 0,
"callback_script": null, "callback_script": null,
"docstatus": 0, "docstatus": 0,
"doctype": "Press Job Type", "doctype": "Jcloude Job Type",
"modified": "2025-07-11 15:20:56.780290", "modified": "2025-07-11 15:20:56.780290",
"name": "Warn disk at 80%", "name": "Warn disk at 80%",
"steps": [ "steps": [
@ -353,7 +353,7 @@
"callback_max_retry": 0, "callback_max_retry": 0,
"callback_script": null, "callback_script": null,
"docstatus": 0, "docstatus": 0,
"doctype": "Press Job Type", "doctype": "Jcloude Job Type",
"modified": "2025-07-25 21:43:11.895128", "modified": "2025-07-25 21:43:11.895128",
"name": "Trigger Build Server Cleanup", "name": "Trigger Build Server Cleanup",
"steps": [ "steps": [
@ -368,7 +368,7 @@
"callback_max_retry": 0, "callback_max_retry": 0,
"callback_script": null, "callback_script": null,
"docstatus": 0, "docstatus": 0,
"doctype": "Press Job Type", "doctype": "Jcloude Job Type",
"modified": "2025-08-31 20:54:46.857348", "modified": "2025-08-31 20:54:46.857348",
"name": "Create Server (old)", "name": "Create Server (old)",
"steps": [ "steps": [
@ -453,7 +453,7 @@
"callback_max_retry": 0, "callback_max_retry": 0,
"callback_script": "", "callback_script": "",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Job Type", "doctype": "Jcloude Job Type",
"modified": "2025-09-08 11:36:55.450275", "modified": "2025-09-08 11:36:55.450275",
"name": "Resume Services After Snapshot", "name": "Resume Services After Snapshot",
"steps": [ "steps": [
@ -473,7 +473,7 @@
"callback_max_retry": 1, "callback_max_retry": 1,
"callback_script": "server = jingrow.get_pg(pg.server_type, pg.server)\n\nif pg.server_type in [\"Server\", \"Database Server\"] and server.is_for_recovery:\n filter_field = \"app_server\" if pg.server_type == \"Server\" else \"database_server\"\n recovery_record_name = jingrow.db.get_value(\"Server Snapshot Recovery\", {filter_field: pg.server}, \"name\")\n if recovery_record_name:\n recovery_record = jingrow.get_pg(\"Server Snapshot Recovery\", recovery_record_name, for_update=True)\n \n if pg.status == \"Success\":\n if pg.server_type == \"Server\":\n recovery_record.is_app_server_ready = True\n else:\n recovery_record.is_database_server_ready = True\n recovery_record.save()\n else:\n recovery_record.mark_server_provisioning_as_failed()\n \nif pg.server_type in [\"Server\", \"Database Server\"] and \"logical_replication_backup\" in arguments:\n if pg.status == \"Success\":\n jingrow.get_pg(\"Logical Replication Backup\", arguments.get(\"logical_replication_backup\")).next()\n if pg.status == \"Failure\":\n jingrow.get_pg(\"Logical Replication Backup\", arguments.get(\"logical_replication_backup\")).fail()", "callback_script": "server = jingrow.get_pg(pg.server_type, pg.server)\n\nif pg.server_type in [\"Server\", \"Database Server\"] and server.is_for_recovery:\n filter_field = \"app_server\" if pg.server_type == \"Server\" else \"database_server\"\n recovery_record_name = jingrow.db.get_value(\"Server Snapshot Recovery\", {filter_field: pg.server}, \"name\")\n if recovery_record_name:\n recovery_record = jingrow.get_pg(\"Server Snapshot Recovery\", recovery_record_name, for_update=True)\n \n if pg.status == \"Success\":\n if pg.server_type == \"Server\":\n recovery_record.is_app_server_ready = True\n else:\n recovery_record.is_database_server_ready = True\n recovery_record.save()\n else:\n recovery_record.mark_server_provisioning_as_failed()\n \nif pg.server_type in [\"Server\", \"Database Server\"] and \"logical_replication_backup\" in arguments:\n if pg.status == \"Success\":\n jingrow.get_pg(\"Logical Replication Backup\", arguments.get(\"logical_replication_backup\")).next()\n if pg.status == \"Failure\":\n jingrow.get_pg(\"Logical Replication Backup\", arguments.get(\"logical_replication_backup\")).fail()",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Job Type", "doctype": "Jcloude Job Type",
"modified": "2025-10-18 20:59:59.413236", "modified": "2025-10-18 20:59:59.413236",
"name": "Create Server", "name": "Create Server",
"steps": [ "steps": [
@ -623,7 +623,7 @@
"callback_max_retry": 1, "callback_max_retry": 1,
"callback_script": null, "callback_script": null,
"docstatus": 0, "docstatus": 0,
"doctype": "Press Job Type", "doctype": "Jcloude Job Type",
"modified": "2025-11-12 11:06:08.243873", "modified": "2025-11-12 11:06:08.243873",
"name": "Prune Mirror Registry", "name": "Prune Mirror Registry",
"steps": [ "steps": [
@ -638,7 +638,7 @@
"callback_max_retry": 1, "callback_max_retry": 1,
"callback_script": null, "callback_script": null,
"docstatus": 0, "docstatus": 0,
"doctype": "Press Job Type", "doctype": "Jcloude Job Type",
"modified": "2025-12-18 15:28:08.243873", "modified": "2025-12-18 15:28:08.243873",
"name": "Auto Scale Up Application Server", "name": "Auto Scale Up Application Server",
"steps": [ "steps": [
@ -653,7 +653,7 @@
"callback_max_retry": 1, "callback_max_retry": 1,
"callback_script": null, "callback_script": null,
"docstatus": 0, "docstatus": 0,
"doctype": "Press Job Type", "doctype": "Jcloude Job Type",
"modified": "2025-12-18 15:28:08.243873", "modified": "2025-12-18 15:28:08.243873",
"name": "Auto Scale Down Application Server", "name": "Auto Scale Down Application Server",
"steps": [ "steps": [

View File

@ -2,7 +2,7 @@
{ {
"checkbox_label": "View", "checkbox_label": "View",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Server", "document_type": "Server",
"method": "jcloude.api.server.overview", "method": "jcloude.api.server.overview",
"modified": "2023-10-30 00:06:29.049045", "modified": "2023-10-30 00:06:29.049045",
@ -11,7 +11,7 @@
{ {
"checkbox_label": "Reboot", "checkbox_label": "Reboot",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Server", "document_type": "Server",
"method": "jcloude.api.server.reboot", "method": "jcloude.api.server.reboot",
"modified": "2023-10-28 20:24:00.088011", "modified": "2023-10-28 20:24:00.088011",
@ -20,7 +20,7 @@
{ {
"checkbox_label": "Login as Admin", "checkbox_label": "Login as Admin",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Site", "document_type": "Site",
"method": "jcloude.api.site.login", "method": "jcloude.api.site.login",
"modified": "2023-09-04 21:22:19.952471", "modified": "2023-09-04 21:22:19.952471",
@ -29,7 +29,7 @@
{ {
"checkbox_label": "Database Access", "checkbox_label": "Database Access",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Site", "document_type": "Site",
"method": "jcloude.api.site.enable_database_access", "method": "jcloude.api.site.enable_database_access",
"modified": "2023-09-04 22:20:23.131654", "modified": "2023-09-04 22:20:23.131654",
@ -38,7 +38,7 @@
{ {
"checkbox_label": "Update", "checkbox_label": "Update",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Release Group", "document_type": "Release Group",
"method": "jcloude.api.bench.update", "method": "jcloude.api.bench.update",
"modified": "2023-08-09 23:22:21.493409", "modified": "2023-08-09 23:22:21.493409",
@ -47,7 +47,7 @@
{ {
"checkbox_label": "Update", "checkbox_label": "Update",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Site", "document_type": "Site",
"method": "jcloude.api.site.update", "method": "jcloude.api.site.update",
"modified": "2023-08-09 23:22:16.445271", "modified": "2023-08-09 23:22:16.445271",
@ -56,7 +56,7 @@
{ {
"checkbox_label": "View", "checkbox_label": "View",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Site", "document_type": "Site",
"method": "jcloude.api.site.overview", "method": "jcloude.api.site.overview",
"modified": "2023-10-30 00:28:47.065270", "modified": "2023-10-30 00:28:47.065270",
@ -65,7 +65,7 @@
{ {
"checkbox_label": "Restore", "checkbox_label": "Restore",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Site", "document_type": "Site",
"method": "jcloude.api.site.restore", "method": "jcloude.api.site.restore",
"modified": "2023-08-10 23:21:37.969947", "modified": "2023-08-10 23:21:37.969947",
@ -74,7 +74,7 @@
{ {
"checkbox_label": "Migrate", "checkbox_label": "Migrate",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Site", "document_type": "Site",
"method": "jcloude.api.site.migrate", "method": "jcloude.api.site.migrate",
"modified": "2023-09-25 11:41:46.915505", "modified": "2023-09-25 11:41:46.915505",
@ -83,7 +83,7 @@
{ {
"checkbox_label": "View", "checkbox_label": "View",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Release Group", "document_type": "Release Group",
"method": "jcloude.api.bench.get", "method": "jcloude.api.bench.get",
"modified": "2023-08-11 11:08:02.298748", "modified": "2023-08-11 11:08:02.298748",
@ -92,7 +92,7 @@
{ {
"checkbox_label": "Update", "checkbox_label": "Update",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Site", "document_type": "Site",
"method": "jcloude.api.site.update", "method": "jcloude.api.site.update",
"modified": "2023-08-11 11:14:41.597516", "modified": "2023-08-11 11:14:41.597516",
@ -101,7 +101,7 @@
{ {
"checkbox_label": "Deploy", "checkbox_label": "Deploy",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Release Group", "document_type": "Release Group",
"method": "jcloude.api.bench.deploy_and_update", "method": "jcloude.api.bench.deploy_and_update",
"modified": "2023-08-16 00:02:26.396406", "modified": "2023-08-16 00:02:26.396406",
@ -110,7 +110,7 @@
{ {
"checkbox_label": "Archive", "checkbox_label": "Archive",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Site", "document_type": "Site",
"method": "jcloude.api.site.archive", "method": "jcloude.api.site.archive",
"modified": "2023-09-25 21:34:34.964150", "modified": "2023-09-25 21:34:34.964150",
@ -119,7 +119,7 @@
{ {
"checkbox_label": "Reset", "checkbox_label": "Reset",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Site", "document_type": "Site",
"method": "jcloude.api.site.reset", "method": "jcloude.api.site.reset",
"modified": "2023-09-25 21:36:30.485983", "modified": "2023-09-25 21:36:30.485983",
@ -128,7 +128,7 @@
{ {
"checkbox_label": "Deactivate", "checkbox_label": "Deactivate",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Site", "document_type": "Site",
"method": "jcloude.api.site.deactivate", "method": "jcloude.api.site.deactivate",
"modified": "2023-09-25 21:36:56.303022", "modified": "2023-09-25 21:36:56.303022",
@ -137,7 +137,7 @@
{ {
"checkbox_label": "SSH Access", "checkbox_label": "SSH Access",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Release Group", "document_type": "Release Group",
"method": "jcloude.api.bench.generate_certificate", "method": "jcloude.api.bench.generate_certificate",
"modified": "2023-09-25 21:40:01.706266", "modified": "2023-09-25 21:40:01.706266",
@ -146,7 +146,7 @@
{ {
"checkbox_label": "Restart", "checkbox_label": "Restart",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Release Group", "document_type": "Release Group",
"method": "jcloude.api.bench.restart", "method": "jcloude.api.bench.restart",
"modified": "2023-09-25 21:40:40.280318", "modified": "2023-09-25 21:40:40.280318",
@ -155,7 +155,7 @@
{ {
"checkbox_label": "Change Plan", "checkbox_label": "Change Plan",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Site", "document_type": "Site",
"method": "jcloude.api.site.change_plan", "method": "jcloude.api.site.change_plan",
"modified": "2023-09-25 21:42:47.001379", "modified": "2023-09-25 21:42:47.001379",
@ -164,7 +164,7 @@
{ {
"checkbox_label": "Download Backups", "checkbox_label": "Download Backups",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Site", "document_type": "Site",
"method": "jcloude.api.site.get_backup_link", "method": "jcloude.api.site.get_backup_link",
"modified": "2023-09-25 21:46:24.621413", "modified": "2023-09-25 21:46:24.621413",
@ -173,7 +173,7 @@
{ {
"checkbox_label": "View", "checkbox_label": "View",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Database Server", "document_type": "Database Server",
"method": "jcloude.api.server.overview", "method": "jcloude.api.server.overview",
"modified": "2023-10-30 00:06:13.793641", "modified": "2023-10-30 00:06:13.793641",
@ -182,7 +182,7 @@
{ {
"checkbox_label": "Drop", "checkbox_label": "Drop",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Server", "document_type": "Server",
"method": "jcloude.api.server.archive", "method": "jcloude.api.server.archive",
"modified": "2023-10-30 00:04:57.685127", "modified": "2023-10-30 00:04:57.685127",
@ -191,7 +191,7 @@
{ {
"checkbox_label": "Drop", "checkbox_label": "Drop",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Database Server", "document_type": "Database Server",
"method": "jcloude.api.server.archive", "method": "jcloude.api.server.archive",
"modified": "2023-10-30 00:05:06.341786", "modified": "2023-10-30 00:05:06.341786",
@ -200,7 +200,7 @@
{ {
"checkbox_label": "Reboot", "checkbox_label": "Reboot",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Database Server", "document_type": "Database Server",
"method": "jcloude.api.server.reboot", "method": "jcloude.api.server.reboot",
"modified": "2023-10-30 00:05:29.046083", "modified": "2023-10-30 00:05:29.046083",
@ -209,7 +209,7 @@
{ {
"checkbox_label": "View", "checkbox_label": "View",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Method Permission", "doctype": "Jcloude Method Permission",
"document_type": "Marketplace App", "document_type": "Marketplace App",
"method": "jcloude.api.marketplace.get_app", "method": "jcloude.api.marketplace.get_app",
"modified": "2023-10-30 00:15:04.814190", "modified": "2023-10-30 00:15:04.814190",

View File

@ -2,7 +2,7 @@
{ {
"description": "Get notified for changes in the site's subscription plan", "description": "Get notified for changes in the site's subscription plan",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Webhook Event", "doctype": "Jcloude Webhook Event",
"enabled": 1, "enabled": 1,
"modified": "2024-09-23 12:06:21.293809", "modified": "2024-09-23 12:06:21.293809",
"name": "Site Plan Change", "name": "Site Plan Change",
@ -11,7 +11,7 @@
{ {
"description": "Pending, Installing, Updating, Active, Inactive, Broken, Archived, Suspended", "description": "Pending, Installing, Updating, Active, Inactive, Broken, Archived, Suspended",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Webhook Event", "doctype": "Jcloude Webhook Event",
"enabled": 1, "enabled": 1,
"modified": "2024-09-23 11:47:30.206054", "modified": "2024-09-23 11:47:30.206054",
"name": "Site Status Update", "name": "Site Status Update",
@ -20,7 +20,7 @@
{ {
"description": "Draft, Scheduled, Pending, Preparing, Running, Success, Failure", "description": "Draft, Scheduled, Pending, Preparing, Running, Success, Failure",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Webhook Event", "doctype": "Jcloude Webhook Event",
"enabled": 1, "enabled": 1,
"modified": "2025-04-09 12:16:17.266946", "modified": "2025-04-09 12:16:17.266946",
"name": "Bench Deploy Status Update", "name": "Bench Deploy Status Update",
@ -29,7 +29,7 @@
{ {
"description": "Pending, Installing, Updating, Active, Broken, Archived", "description": "Pending, Installing, Updating, Active, Broken, Archived",
"docstatus": 0, "docstatus": 0,
"doctype": "Press Webhook Event", "doctype": "Jcloude Webhook Event",
"enabled": 1, "enabled": 1,
"modified": "2024-09-23 12:16:32.881258", "modified": "2024-09-23 12:16:32.881258",
"name": "Bench Status Update", "name": "Bench Status Update",

View File

@ -13,7 +13,7 @@
"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": "Jcloude",
"name": "Jingrow Brand 2020", "name": "Jingrow Brand 2020",
"parent": null, "parent": null,
"parentfield": null, "parentfield": null,

View File

@ -11,10 +11,10 @@
"is_custom": 0, "is_custom": 0,
"list_sidebar": 0, "list_sidebar": 0,
"modified": "2024-05-27 11:14:43.545958", "modified": "2024-05-27 11:14:43.545958",
"name": "Press Support Agent", "name": "Jcloude Support Agent",
"notifications": 0, "notifications": 0,
"restrict_to_domain": null, "restrict_to_domain": null,
"role_name": "Press Support Agent", "role_name": "Jcloude Support Agent",
"search_bar": 0, "search_bar": 0,
"timeline": 0, "timeline": 0,
"two_factor_auth": 0, "two_factor_auth": 0,
@ -32,10 +32,10 @@
"is_custom": 0, "is_custom": 0,
"list_sidebar": 0, "list_sidebar": 0,
"modified": "2020-04-06 22:48:03.538506", "modified": "2020-04-06 22:48:03.538506",
"name": "Press Admin", "name": "Jcloude Admin",
"notifications": 0, "notifications": 0,
"restrict_to_domain": null, "restrict_to_domain": null,
"role_name": "Press Admin", "role_name": "Jcloude Admin",
"search_bar": 0, "search_bar": 0,
"timeline": 0, "timeline": 0,
"two_factor_auth": 0, "two_factor_auth": 0,
@ -53,10 +53,10 @@
"is_custom": 0, "is_custom": 0,
"list_sidebar": 0, "list_sidebar": 0,
"modified": "2020-04-06 22:48:33.006868", "modified": "2020-04-06 22:48:33.006868",
"name": "Press Member", "name": "Jcloude Member",
"notifications": 0, "notifications": 0,
"restrict_to_domain": null, "restrict_to_domain": null,
"role_name": "Press Member", "role_name": "Jcloude Member",
"search_bar": 0, "search_bar": 0,
"timeline": 0, "timeline": 0,
"two_factor_auth": 0, "two_factor_auth": 0,
@ -70,9 +70,9 @@
"home_page": null, "home_page": null,
"is_custom": 0, "is_custom": 0,
"modified": "2025-08-20 19:55:50.325493", "modified": "2025-08-20 19:55:50.325493",
"name": "Press Marketplace Manager", "name": "Jcloude Marketplace Manager",
"restrict_to_domain": null, "restrict_to_domain": null,
"role_name": "Press Marketplace Manager", "role_name": "Jcloude Marketplace Manager",
"two_factor_auth": 0 "two_factor_auth": 0
} }
] ]

View File

@ -37,8 +37,8 @@ def api(scope: Literal["billing", "partner"]):
team: Team = get_current_team(get_pg=True) team: Team = get_current_team(get_pg=True)
if team.is_team_owner() or team.is_admin_user(): if team.is_team_owner() or team.is_admin_user():
return fn(*args, **kwargs) return fn(*args, **kwargs)
PressRole = jingrow.qb.DocType("Press Role") PressRole = jingrow.qb.DocType("Jcloude Role")
PressRoleUser = jingrow.qb.DocType("Press Role User") PressRoleUser = jingrow.qb.DocType("Jcloude Role User")
has_permission = ( has_permission = (
jingrow.qb.from_(PressRole) jingrow.qb.from_(PressRole)
.inner_join(PressRoleUser) .inner_join(PressRoleUser)
@ -74,8 +74,8 @@ def action():
team: Team = get_current_team(get_pg=True) team: Team = get_current_team(get_pg=True)
if team.is_team_owner() or team.is_admin_user(): if team.is_team_owner() or team.is_admin_user():
return fn(self, *args, **kwargs) return fn(self, *args, **kwargs)
PressRole = jingrow.qb.DocType("Press Role") PressRole = jingrow.qb.DocType("Jcloude Role")
PressRoleUser = jingrow.qb.DocType("Press Role User") PressRoleUser = jingrow.qb.DocType("Jcloude Role User")
has_permission = ( has_permission = (
jingrow.qb.from_(PressRole) jingrow.qb.from_(PressRole)
.inner_join(PressRoleUser) .inner_join(PressRoleUser)
@ -157,10 +157,10 @@ def document(
def base_query() -> QueryBuilder: def base_query() -> QueryBuilder:
""" """
Get a base query for Press Role documents based on the current team context. Get a base query for Jcloude Role documents based on the current team context.
""" """
PressRole = jingrow.qb.DocType("Press Role") PressRole = jingrow.qb.DocType("Jcloude Role")
PressRoleUser = jingrow.qb.DocType("Press Role User") PressRoleUser = jingrow.qb.DocType("Jcloude Role User")
return ( return (
jingrow.qb.from_(PressRole) jingrow.qb.from_(PressRole)
.select(PressRole.name) .select(PressRole.name)
@ -182,11 +182,11 @@ def check(document_type: str, document_name: str) -> bool | list[str]:
match document_type: match document_type:
case "Marketplace App": case "Marketplace App":
return marketplace_check(query) return marketplace_check(query)
case "Press Webhook": case "Jcloude Webhook":
return webhook_check(query) return webhook_check(query)
case "Press Webhook Attempt": case "Jcloude Webhook Attempt":
return webhook_check(query) return webhook_check(query)
case "Press Webhook Log": case "Jcloude Webhook Log":
return webhook_check(query) return webhook_check(query)
case "Release Group": case "Release Group":
return document_check(query, document_type, document_name) return document_check(query, document_type, document_name)
@ -210,7 +210,7 @@ def roles_enabled() -> bool:
return bool( return bool(
jingrow.db.exists( jingrow.db.exists(
{ {
"doctype": "Press Role", "doctype": "Jcloude Role",
"team": get_current_team(), "team": get_current_team(),
} }
) )

View File

@ -8,6 +8,6 @@ def action_key(document: Document) -> str:
return "allow_server_creation" return "allow_server_creation"
if document.doctype == "Release Group" and document.is_new(): if document.doctype == "Release Group" and document.is_new():
return "allow_bench_creation" return "allow_bench_creation"
if document.doctype == "Press Webhook": if document.doctype == "Jcloude Webhook":
return "allow_webhook_configuration" return "allow_webhook_configuration"
return "" return ""

View File

@ -11,8 +11,8 @@ def check(base_query: QueryBuilder, document_type: str, document_name: str) -> b
def documents(base_query: QueryBuilder, document_type: str) -> list[str]: def documents(base_query: QueryBuilder, document_type: str) -> list[str]:
PressRole = jingrow.qb.DocType("Press Role") PressRole = jingrow.qb.DocType("Jcloude Role")
PressRoleResource = jingrow.qb.DocType("Press Role Resource") PressRoleResource = jingrow.qb.DocType("Jcloude Role Resource")
return [ return [
pg.document_name pg.document_name
for pg in base_query.inner_join(PressRoleResource) for pg in base_query.inner_join(PressRoleResource)
@ -28,8 +28,8 @@ def documents(base_query: QueryBuilder, document_type: str) -> list[str]:
def document(base_query: QueryBuilder, document_type: str, document_name: str) -> bool: def document(base_query: QueryBuilder, document_type: str, document_name: str) -> bool:
PressRole = jingrow.qb.DocType("Press Role") PressRole = jingrow.qb.DocType("Jcloude Role")
PressRoleResource = jingrow.qb.DocType("Press Role Resource") PressRoleResource = jingrow.qb.DocType("Jcloude Role Resource")
return ( return (
base_query.inner_join(PressRoleResource) base_query.inner_join(PressRoleResource)
.on( .on(

View File

@ -4,7 +4,7 @@ from jingrow.query_builder.terms import QueryBuilder
def check(base_query: QueryBuilder) -> bool: def check(base_query: QueryBuilder) -> bool:
PressRole = jingrow.qb.DocType("Press Role") PressRole = jingrow.qb.DocType("Jcloude Role")
return ( return (
base_query.where(PressRole.allow_apps == 1) base_query.where(PressRole.allow_apps == 1)
.select(Count(PressRole.name).as_("count")) .select(Count(PressRole.name).as_("count"))

View File

@ -4,8 +4,8 @@ from jingrow.query_builder.terms import QueryBuilder
def check(base_query: QueryBuilder, document_name: str) -> bool: def check(base_query: QueryBuilder, document_name: str) -> bool:
PressRole = jingrow.qb.DocType("Press Role") PressRole = jingrow.qb.DocType("Jcloude Role")
PressRoleResource = jingrow.qb.DocType("Press Role Resource") PressRoleResource = jingrow.qb.DocType("Jcloude Role Resource")
ServerSnapshot = jingrow.qb.DocType("Server Snapshot") ServerSnapshot = jingrow.qb.DocType("Server Snapshot")
return ( return (
base_query.left_join(PressRoleResource) base_query.left_join(PressRoleResource)

View File

@ -4,8 +4,8 @@ from jingrow.query_builder.terms import QueryBuilder
def check(base_query: QueryBuilder, document_name: str) -> bool: def check(base_query: QueryBuilder, document_name: str) -> bool:
PressRole = jingrow.qb.DocType("Press Role") PressRole = jingrow.qb.DocType("Jcloude Role")
PressRoleResource = jingrow.qb.DocType("Press Role Resource") PressRoleResource = jingrow.qb.DocType("Jcloude Role Resource")
SiteBackup = jingrow.qb.DocType("Site Backup") SiteBackup = jingrow.qb.DocType("Site Backup")
return ( return (
base_query.left_join(PressRoleResource) base_query.left_join(PressRoleResource)

View File

@ -4,7 +4,7 @@ from jingrow.query_builder.terms import QueryBuilder
def check(base_query: QueryBuilder) -> bool: def check(base_query: QueryBuilder) -> bool:
PressRole = jingrow.qb.DocType("Press Role") PressRole = jingrow.qb.DocType("Jcloude Role")
return ( return (
base_query.where(PressRole.allow_webhook_configuration == 1) base_query.where(PressRole.allow_webhook_configuration == 1)
.select(Count(PressRole.name).as_("document_count")) .select(Count(PressRole.name).as_("document_count"))

View File

@ -2,12 +2,12 @@ import functools
import jingrow import jingrow
SETTINGS_DOCTYPE = "Press Settings" SETTINGS_DOCTYPE = "Jcloude Settings"
def enabled(key: str, default_value=None, raise_error: bool = False): def enabled(key: str, default_value=None, raise_error: bool = False):
""" """
Decorator to check if a feature is enabled in Press Settings. Decorator to check if a feature is enabled in Jcloude Settings.
Example: Example:
```python ```python

View File

@ -3,7 +3,7 @@ from jcloude.api.account import get_jingrow_io_auth_url
from . import __version__ as app_version from . import __version__ as app_version
app_name = "jcloude" app_name = "jcloude"
app_title = "Press" app_title = "Jcloude"
app_publisher = "Jingrow" app_publisher = "Jingrow"
app_description = "Managed Jingrow Hosting" app_description = "Managed Jingrow Hosting"
app_icon = "octicon octicon-rocket" app_icon = "octicon octicon-rocket"
@ -122,8 +122,8 @@ permission_query_conditions = {
"Server": "jcloude.jcloude.doctype.server.server.get_permission_query_conditions", "Server": "jcloude.jcloude.doctype.server.server.get_permission_query_conditions",
"Database Server": "jcloude.jcloude.doctype.database_server.database_server.get_permission_query_conditions", "Database Server": "jcloude.jcloude.doctype.database_server.database_server.get_permission_query_conditions",
"Virtual Machine": "jcloude.jcloude.doctype.virtual_machine.virtual_machine.get_permission_query_conditions", "Virtual Machine": "jcloude.jcloude.doctype.virtual_machine.virtual_machine.get_permission_query_conditions",
"Press Webhook": "jcloude.jcloude.doctype.jcloude_webhook.jcloude_webhook.get_permission_query_conditions", "Jcloude Webhook": "jcloude.jcloude.doctype.jcloude_webhook.jcloude_webhook.get_permission_query_conditions",
"Press Webhook Log": "jcloude.jcloude.doctype.jcloude_webhook_log.jcloude_webhook_log.get_permission_query_conditions", "Jcloude Webhook Log": "jcloude.jcloude.doctype.jcloude_webhook_log.jcloude_webhook_log.get_permission_query_conditions",
"SQL Playground Log": "jcloude.jcloude.doctype.sql_playground_log.sql_playground_log.get_permission_query_conditions", "SQL Playground Log": "jcloude.jcloude.doctype.sql_playground_log.sql_playground_log.get_permission_query_conditions",
"Site Database User": "jcloude.jcloude.doctype.site_database_user.site_database_user.get_permission_query_conditions", "Site Database User": "jcloude.jcloude.doctype.site_database_user.site_database_user.get_permission_query_conditions",
"Server Snapshot": "jcloude.jcloude.doctype.server_snapshot.server_snapshot.get_permission_query_conditions", "Server Snapshot": "jcloude.jcloude.doctype.server_snapshot.server_snapshot.get_permission_query_conditions",
@ -148,9 +148,9 @@ has_permission = {
"Bench": "jcloude.overrides.has_permission", "Bench": "jcloude.overrides.has_permission",
"Server": "jcloude.overrides.has_permission", "Server": "jcloude.overrides.has_permission",
"Database Server": "jcloude.overrides.has_permission", "Database Server": "jcloude.overrides.has_permission",
"Press Webhook": "jcloude.overrides.has_permission", "Jcloude Webhook": "jcloude.overrides.has_permission",
"Press Webhook Log": "jcloude.overrides.has_permission", "Jcloude Webhook Log": "jcloude.overrides.has_permission",
"Press Webhook Attempt": "jcloude.jcloude.doctype.jcloude_webhook_attempt.jcloude_webhook_attempt.has_permission", "Jcloude Webhook Attempt": "jcloude.jcloude.doctype.jcloude_webhook_attempt.jcloude_webhook_attempt.has_permission",
"SQL Playground Log": "jcloude.overrides.has_permission", "SQL Playground Log": "jcloude.overrides.has_permission",
"Site Database User": "jcloude.overrides.has_permission", "Site Database User": "jcloude.overrides.has_permission",
"Server Snapshot": "jcloude.overrides.has_permission", "Server Snapshot": "jcloude.overrides.has_permission",
@ -384,17 +384,17 @@ deploy_hours = [1, 2, 3, 4, 5, 21, 22, 23] # Purposefully avoiding 0
fixtures = [ fixtures = [
"Agent Job Type", "Agent Job Type",
"Press Job Type", "Jcloude Job Type",
"Jingrow Version", "Jingrow Version",
"MariaDB Variable", "MariaDB Variable",
"Cloud Region", "Cloud Region",
{"dt": "Role", "filters": [["role_name", "like", "Press%"]]}, {"dt": "Role", "filters": [["role_name", "like", "Jcloude%"]]},
"Site Config Key Blacklist", "Site Config Key Blacklist",
"Press Method Permission", "Jcloude Method Permission",
"Bench Dependency", "Bench Dependency",
"Server Storage Plan", "Server Storage Plan",
"Server Snapshot Plan", "Server Snapshot Plan",
"Press Webhook Event", "Jcloude Webhook Event",
] ]
# Testing # Testing
# ------- # -------

View File

@ -38,7 +38,7 @@ class Status(Enum):
def get_prometheus_client() -> PrometheusConnect: def get_prometheus_client() -> PrometheusConnect:
"""Get prometheus client""" """Get prometheus client"""
monitor_server = jingrow.db.get_single_value("Press Settings", "monitor_server") monitor_server = jingrow.db.get_single_value("Jcloude Settings", "monitor_server")
password = get_decrypted_password("Monitor Server", monitor_server, "grafana_password") password = get_decrypted_password("Monitor Server", monitor_server, "grafana_password")
return PrometheusConnect(f"https://{monitor_server}/prometheus", auth=("jingrow", password)) return PrometheusConnect(f"https://{monitor_server}/prometheus", auth=("jingrow", password))
@ -471,7 +471,7 @@ class IncidentInvestigator(Document):
self.stop_calls_on_high_disk_usage() self.stop_calls_on_high_disk_usage()
self.add_investigation_actions() self.add_investigation_actions()
execute_action_steps = jingrow.db.get_single_value( execute_action_steps = jingrow.db.get_single_value(
"Press Settings", "execute_incident_action", cache=True "Jcloude Settings", "execute_incident_action", cache=True
) )
if self.action_steps and execute_action_steps: if self.action_steps and execute_action_steps:
jingrow.enqueue_pg(self.doctype, self.name, "execute_action_steps", queue="long") jingrow.enqueue_pg(self.doctype, self.name, "execute_action_steps", queue="long")

View File

@ -95,7 +95,7 @@ class SSHAccessAudit(Document):
def set_inventory(self): def set_inventory(self):
all_servers = [] all_servers = []
domain = jingrow.db.get_value("Press Settings", None, "domain") domain = jingrow.db.get_value("Jcloude Settings", None, "domain")
for server_type in SERVER_TYPES: for server_type in SERVER_TYPES:
# Skip self-hosted servers # Skip self-hosted servers
filters = {"status": "Active", "domain": domain} filters = {"status": "Active", "domain": domain}
@ -113,7 +113,7 @@ class SSHAccessAudit(Document):
self.inventory = ",".join(all_servers) self.inventory = ",".join(all_servers)
def get_self_inventory(self): def get_self_inventory(self):
# Press should audit itself # Jcloude should audit itself
servers = [jingrow.local.site, f"db.{jingrow.local.site}"] servers = [jingrow.local.site, f"db.{jingrow.local.site}"]
if jingrow.conf.replica_host: if jingrow.conf.replica_host:
servers.append(f"db2.{jingrow.local.site}") servers.append(f"db2.{jingrow.local.site}")
@ -138,7 +138,7 @@ class SSHAccessAudit(Document):
@cached_property @cached_property
def acceptable_keys(self): def acceptable_keys(self):
keys = {} keys = {}
domain = jingrow.db.get_value("Press Settings", None, "domain") domain = jingrow.db.get_value("Jcloude Settings", None, "domain")
fields = self.get_acceptable_key_fields() fields = self.get_acceptable_key_fields()
for doctype, field in fields: for doctype, field in fields:
filters = {} filters = {}

View File

@ -84,7 +84,7 @@
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Press Marketplace Manager", "role": "Jcloude Marketplace Manager",
"share": 1, "share": 1,
"write": 1 "write": 1
} }

View File

@ -60,7 +60,7 @@
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Press Marketplace Manager", "role": "Jcloude Marketplace Manager",
"share": 1, "share": 1,
"write": 1 "write": 1
} }

View File

@ -104,7 +104,7 @@
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Press Marketplace Manager", "role": "Jcloude Marketplace Manager",
"select": 1, "select": 1,
"share": 1, "share": 1,
"write": 1 "write": 1

View File

@ -69,7 +69,7 @@
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Press Marketplace Manager", "role": "Jcloude Marketplace Manager",
"share": 1, "share": 1,
"write": 1 "write": 1
} }

View File

@ -7,16 +7,16 @@ from jingrow.model.document import Document
class MarketplaceAppPayment(Document): class MarketplaceAppPayment(Document):
def has_threshold_passed(self): def has_threshold_passed(self):
exchange_rate = jingrow.db.get_single_value("Press Settings", "usd_rate") exchange_rate = jingrow.db.get_single_value("Jcloude Settings", "usd_rate")
total = self.total_usd + (self.total_inr / exchange_rate) if exchange_rate > 0 else 80 total = self.total_usd + (self.total_inr / exchange_rate) if exchange_rate > 0 else 80
return total >= jingrow.db.get_single_value("Press Settings", "threshold") return total >= jingrow.db.get_single_value("Jcloude Settings", "threshold")
def get_commission(self, total): def get_commission(self, total):
# TODO: Handle partial commission # TODO: Handle partial commission
# if first month collection: $20, second month: $1000 and $500 - cap/threshold # if first month collection: $20, second month: $1000 and $500 - cap/threshold
# then commission should be calculated for $520 from second month collection onwards # then commission should be calculated for $520 from second month collection onwards
return ( return (
total * jingrow.db.get_single_value("Press Settings", "commission") total * jingrow.db.get_single_value("Jcloude Settings", "commission")
if self.has_threshold_passed() if self.has_threshold_passed()
else total else total
) )

View File

@ -130,7 +130,7 @@
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Press Marketplace Manager", "role": "Jcloude Marketplace Manager",
"share": 1, "share": 1,
"write": 1 "write": 1
} }

View File

@ -133,7 +133,7 @@
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Press Marketplace Manager", "role": "Jcloude Marketplace Manager",
"share": 1, "share": 1,
"write": 1 "write": 1
} }

View File

@ -115,7 +115,7 @@ class MarketplaceAppSubscription(Document):
config.append( config.append(
{ {
"key": "app_include_js", "key": "app_include_js",
"value": [jingrow.db.get_single_value("Press Settings", "app_include_script")], "value": [jingrow.db.get_single_value("Jcloude Settings", "app_include_script")],
"type": "JSON", "type": "JSON",
} }
) )

View File

@ -75,7 +75,7 @@
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Press Marketplace Manager", "role": "Jcloude Marketplace Manager",
"share": 1, "share": 1,
"write": 1 "write": 1
} }

View File

@ -140,7 +140,7 @@
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Press Marketplace Manager", "role": "Jcloude Marketplace Manager",
"share": 1, "share": 1,
"write": 1 "write": 1
} }

View File

@ -67,7 +67,7 @@
"email": 1, "email": 1,
"print": 1, "print": 1,
"read": 1, "read": 1,
"role": "Press Marketplace Manager", "role": "Jcloude Marketplace Manager",
"share": 1, "share": 1,
"write": 1 "write": 1
} }

View File

@ -36,7 +36,7 @@ class MetricsRenderer:
"jcloude_builds_suspended", "Are docker builds suspended", registry=self.registry "jcloude_builds_suspended", "Are docker builds suspended", registry=self.registry
) )
suspended_builds.set( suspended_builds.set(
cint(jingrow.db.get_value("Press Settings", None, "suspend_builds")) cint(jingrow.db.get_value("Jcloude Settings", None, "suspend_builds"))
) )
self.get_status( self.get_status(
"jcloude_deploy_candidate_total", "jcloude_deploy_candidate_total",
@ -60,7 +60,7 @@ class MetricsRenderer:
self.get_status("jcloude_site_migration_total", "Site Migration") self.get_status("jcloude_site_migration_total", "Site Migration")
self.get_status("jcloude_site_upgrade_total", "Version Upgrade") self.get_status("jcloude_site_upgrade_total", "Version Upgrade")
self.get_status("jcloude_jcloude_job_total", "Press Job") self.get_status("jcloude_jcloude_job_total", "Jcloude Job")
self.get_status( self.get_status(
"jcloude_ansible_play_total", "Ansible Play", filters={"status": ("!=", "Success")} "jcloude_ansible_play_total", "Ansible Play", filters={"status": ("!=", "Success")}
) )

View File

@ -1,4 +1,4 @@
Press Jcloude
Experimental Experimental
Marketplace Marketplace
SaaS SaaS

View File

@ -130,7 +130,7 @@ def cleanup_ansible_tmp_files():
def update_website_context(context): def update_website_context(context):
if (jingrow.request and jingrow.request.path.startswith("/docs")) and not jingrow.db.get_single_value( if (jingrow.request and jingrow.request.path.startswith("/docs")) and not jingrow.db.get_single_value(
"Press Settings", "publish_docs" "Jcloude Settings", "publish_docs"
): ):
raise jingrow.DoesNotExistError raise jingrow.DoesNotExistError

View File

@ -84,7 +84,7 @@
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Press Admin", "role": "Jcloude Admin",
"share": 1, "share": 1,
"write": 1 "write": 1
}, },
@ -95,7 +95,7 @@
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Press Member", "role": "Jcloude Member",
"share": 1, "share": 1,
"write": 1 "write": 1
}, },

View File

@ -92,7 +92,7 @@
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Press Admin", "role": "Jcloude Admin",
"share": 1, "share": 1,
"write": 1 "write": 1
} }

View File

@ -62,14 +62,14 @@
{ {
"create": 1, "create": 1,
"read": 1, "read": 1,
"role": "Press Admin", "role": "Jcloude Admin",
"write": 1 "write": 1
}, },
{ {
"create": 1, "create": 1,
"export": 1, "export": 1,
"read": 1, "read": 1,
"role": "Press Member", "role": "Jcloude Member",
"write": 1 "write": 1
} }
], ],

View File

@ -64,7 +64,7 @@
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Press Admin", "role": "Jcloude Admin",
"share": 1, "share": 1,
"write": 1 "write": 1
}, },
@ -75,7 +75,7 @@
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Press Member", "role": "Jcloude Member",
"share": 1 "share": 1
} }
], ],

View File

@ -458,7 +458,7 @@
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Press Admin", "role": "Jcloude Admin",
"share": 1, "share": 1,
"write": 1 "write": 1
}, },
@ -469,7 +469,7 @@
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Press Member", "role": "Jcloude Member",
"share": 1, "share": 1,
"write": 1 "write": 1
} }

View File

@ -45,7 +45,7 @@ def execute():
def get_free_credits_left(team): def get_free_credits_left(team):
invoices = jingrow.db.get_all("Invoice", {"team": team.name, "status": ("!=", "Draft")}) invoices = jingrow.db.get_all("Invoice", {"team": team.name, "status": ("!=", "Draft")})
settings = jingrow.get_pg("Press Settings") settings = jingrow.get_pg("Jcloude Settings")
total_free_credits = ( total_free_credits = (
settings.free_credits_inr if team.currency == "INR" else settings.free_credits_usd settings.free_credits_inr if team.currency == "INR" else settings.free_credits_usd
) )

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