update Press - Jcloude
This commit is contained in:
parent
2496739e9e
commit
ac64eb0275
2
.github/workflows/main.yaml
vendored
2
.github/workflows/main.yaml
vendored
@ -1,4 +1,4 @@
|
|||||||
name: Press Tests
|
name: Jcloude Tests
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
|
|||||||
16
README.md
16
README.md
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -4,4 +4,4 @@
|
|||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
Automatically installed with Press
|
Automatically installed with Jcloude
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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',
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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: {},
|
||||||
});
|
});
|
||||||
|
|||||||
@ -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',
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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: {
|
||||||
|
|||||||
@ -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',
|
||||||
|
|||||||
@ -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',
|
||||||
|
|||||||
@ -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 }}') {
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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',
|
||||||
},
|
},
|
||||||
|
|||||||
@ -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: {
|
||||||
|
|||||||
@ -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',
|
||||||
},
|
},
|
||||||
|
|||||||
@ -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',
|
||||||
},
|
},
|
||||||
|
|||||||
@ -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: {
|
||||||
|
|||||||
@ -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: {
|
||||||
|
|||||||
@ -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.
|
||||||
|
|||||||
@ -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.
|
||||||
|
|
||||||
|
|||||||
@ -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
|
|||||||

|

|
||||||
|
|
||||||
|
|
||||||
Now under Roles, add `Press Admin` and `Press Member`.
|
Now under Roles, add `Jcloude Admin` and `Jcloude Member`.
|
||||||
|
|
||||||
|
|
||||||

|

|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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.
|
||||||
|
|||||||
@ -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.
|
||||||
|
|
||||||
|
|||||||
@ -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"
|
||||||
|
|||||||
@ -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)},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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 = {
|
||||||
|
|||||||
@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
@ -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,
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
@ -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()})
|
||||||
|
|||||||
@ -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,
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
@ -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"],
|
||||||
),
|
),
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
@ -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")
|
||||||
|
|
||||||
|
|||||||
@ -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,
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@ -9,4 +9,4 @@ Configuration for docs
|
|||||||
|
|
||||||
|
|
||||||
def get_context(context):
|
def get_context(context):
|
||||||
context.brand_html = "Press"
|
context.brand_html = "Jcloude"
|
||||||
|
|||||||
@ -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")
|
||||||
|
|||||||
@ -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": [
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@ -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(),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@ -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 ""
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
@ -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"))
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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"))
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
# -------
|
# -------
|
||||||
|
|||||||
@ -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")
|
||||||
|
|||||||
@ -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 = {}
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
)
|
)
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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")}
|
||||||
)
|
)
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
Press
|
Jcloude
|
||||||
Experimental
|
Experimental
|
||||||
Marketplace
|
Marketplace
|
||||||
SaaS
|
SaaS
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
},
|
},
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
Loading…
x
Reference in New Issue
Block a user