Skip to content

Commit a0e2618

Browse files
resolve conflicts and merge master into 44654
2 parents 5fc0212 + cf0f55a commit a0e2618

899 files changed

Lines changed: 80956 additions & 21568 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,17 @@ nginx/keys
88
nginx/config/nginx.conf
99
firebase-push.json
1010

11-
# Agent & IDE tools
12-
.agents
13-
.antigravity
14-
1511
# Playwright / E2E
1612
frontend/e2e
1713
frontend/playwright-report
1814
frontend/test-results
15+
16+
.vscode/
17+
.cursor/
18+
.cursorrules/
19+
.agents/
20+
.agent/
21+
.agents/
22+
.antigravity/
23+
24+

.python-version

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3.7.5

README.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,15 @@ But you can almost immediately check that your backend is up by going to `http:/
123123

124124
Once the containers are up and running go to http://your-server-address (http://localhost if you're connecting from the same machine) in your browser, register a free account and you're good to go.
125125

126-
For more information about how to deploy Pneumatic in production see [Configuration](https://github.com/pneumaticapp/pneumaticworkflow/wiki/Configuration)
126+
127+
### Deploying to Production
128+
129+
Deploying an instance of Pneumatic in production involves such steps as:
130+
131+
- setting up SSL
132+
- setting up SSO
133+
134+
These steps are described in detail in [this wiki article](https://github.com/pneumaticapp/pneumaticworkflow/wiki/Configuration)
127135

128136
## License
129137

backend/.gitignore

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ coverage.xml
7171

7272
# Translations
7373
*.mo
74-
*.pot
7574

7675
# Sphinx documentation
7776
docs/_build/
@@ -82,7 +81,6 @@ target/
8281

8382
### Django ###
8483
*.log
85-
*.pot
8684
*.pyc
8785
__pycache__/
8886
local_settings.py
@@ -94,7 +92,7 @@ database/backups
9492
database/data
9593
database/postgres_data
9694
staticfiles/
97-
95+
.cursor/
9896
# pyenv
9997
.python-version
10098

backend/README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,12 @@ Open a terminal in the "backend" directory and run the following commands:
4545
1. Place the database dump file named ``dump.sql`` in the ``pneumaticworkflow/postgres/backups`` directory.
4646
2. Recreate the pneumatic database with the command: ``docker exec -it pneumatic-postgres sh -c "dropdb -U postgres_user postgres_db && createdb -U postgres_user --owner postgres_user postgres_db"``.
4747
3. Load the dump file into the database with the command: ``docker exec -it pneumatic-postgres sh -c "psql -U postgres_user -h localhost postgres_db < /backups/dump.sql"``. This process will take several minutes.
48-
4. (Optional). Connect to the database and verify the schema. Command: ``docker exec -it pneumatic-postgres sh -c "psql -U postgres_user postgres_db"``
48+
49+
#### Create a backup copy of the database
50+
Command: ``docker exec -it pneumatic-postgres sh -c "pg_dump -U postgres_user postgres_db > /backups/pneumatic-backup-$(date +%Y-%m-%d[%Hh:%Mm]%ZTZ).sql"``
51+
52+
#### Connect to the database
53+
Command: ``docker exec -it pneumatic-postgres sh -c "psql -U postgres_user postgres_db"``
4954

5055
### Windows
5156
Open PowerShell in the backend directory and run the following commands:

backend/docker-compose.yml

Lines changed: 78 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ services:
7272
FRONTEND_URL: ${FRONTEND_URL:-http://localhost}
7373
FORMS_URL: ${FORMS_URL:-http://form.localhost}
7474
ENVIRONMENT: ${ENVIRONMENT:-Production}
75+
RELEASE: ${RELEASE:-1.0.0}
7576
LANGUAGE_CODE: ${LANGUAGE_CODE:-en} # Allowed values: en, fr, de, es, ru
7677
CAPTCHA: ${CAPTCHA:-no}
7778
ANALYTICS: ${ANALYTICS:-no}
@@ -80,35 +81,49 @@ services:
8081
MS_AUTH: ${MS_AUTH:-no}
8182
GOOGLE_AUTH: ${GOOGLE_AUTH:-no}
8283
SSO_AUTH: ${SSO_AUTH:-no}
83-
SSO_PROVIDER: ${SSO_PROVIDER} # Allowed values: okta, auth0
84-
OKTA_DOMAIN: ${OKTA_DOMAIN}
85-
OKTA_CLIENT_ID: ${OKTA_CLIENT_ID}
86-
OKTA_CLIENT_SECRET: ${OKTA_CLIENT_SECRET}
87-
OKTA_REDIRECT_URI: ${OKTA_REDIRECT_URI}
88-
AUTH0_CLIENT_ID: ${AUTH0_CLIENT_ID}
89-
AUTH0_CLIENT_SECRET: ${AUTH0_CLIENT_SECRET}
90-
AUTH0_DOMAIN: ${AUTH0_DOMAIN}
91-
AUTH0_REDIRECT_URI: ${AUTH0_REDIRECT_URI}
84+
SSO_PROVIDER: ${SSO_PROVIDER:-} # Allowed values: okta, auth0
85+
OKTA_DOMAIN: ${OKTA_DOMAIN:-}
86+
OKTA_CLIENT_ID: ${OKTA_CLIENT_ID:-}
87+
OKTA_CLIENT_SECRET: ${OKTA_CLIENT_SECRET:-}
88+
OKTA_REDIRECT_URI: ${OKTA_REDIRECT_URI:-}
89+
AUTH0_CLIENT_ID: ${AUTH0_CLIENT_ID:-}
90+
AUTH0_CLIENT_SECRET: ${AUTH0_CLIENT_SECRET:-}
91+
AUTH0_DOMAIN: ${AUTH0_DOMAIN:-}
92+
AUTH0_REDIRECT_URI: ${AUTH0_REDIRECT_URI:-}
9293
EMAIL: ${EMAIL:-no} # Disable send emails
93-
EMAIL_PROVIDER: ${EMAIL_PROVIDER}
94-
CIO_WEBHOOK_API_VERSION: ${CIO_WEBHOOK_API_VERSION}
95-
CIO_WEBHOOK_API_KEY: ${CIO_WEBHOOK_API_KEY}
96-
CIO_TRANSACTIONAL_API_KEY: ${CIO_TRANSACTIONAL_API_KEY}
97-
EMAIL_HOST: ${EMAIL_HOST}
98-
EMAIL_PORT: ${EMAIL_PORT}
99-
EMAIL_HOST_USER: ${EMAIL_HOST_USER}
100-
EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD}
101-
EMAIL_USE_TLS: ${EMAIL_USE_TLS}
102-
EMAIL_USE_SSL: ${EMAIL_USE_SSL}
103-
EMAIL_TIMEOUT: ${EMAIL_TIMEOUT}
94+
EMAIL_PROVIDER: ${EMAIL_PROVIDER:-}
95+
CIO_WEBHOOK_API_VERSION: ${CIO_WEBHOOK_API_VERSION:-}
96+
CIO_WEBHOOK_API_KEY: ${CIO_WEBHOOK_API_KEY:-}
97+
CIO_TRANSACTIONAL_API_KEY: ${CIO_TRANSACTIONAL_API_KEY:-}
98+
CIO_TEMPLATE__RESET_PASSWORD: ${CIO_TEMPLATE__RESET_PASSWORD:-}
99+
CIO_TEMPLATE__USER_DEACTIVATED: ${CIO_TEMPLATE__USER_DEACTIVATED:-}
100+
CIO_TEMPLATE__NEW_TASK: ${CIO_TEMPLATE__NEW_TASK:-}
101+
CIO_TEMPLATE__TASK_RETURNED: ${CIO_TEMPLATE__TASK_RETURNED:-}
102+
CIO_TEMPLATE__ACCOUNT_VERIFICATION: ${CIO_TEMPLATE__ACCOUNT_VERIFICATION:-}
103+
CIO_TEMPLATE__WORKFLOWS_DIGEST: ${CIO_TEMPLATE__WORKFLOWS_DIGEST:-}
104+
CIO_TEMPLATE__TASKS_DIGEST: ${CIO_TEMPLATE__TASKS_DIGEST:-}
105+
CIO_TEMPLATE__USER_TRANSFER: ${CIO_TEMPLATE__USER_TRANSFER:-}
106+
CIO_TEMPLATE__UNREAD_NOTIFICATIONS: ${CIO_TEMPLATE__UNREAD_NOTIFICATIONS:-}
107+
CIO_TEMPLATE__GUEST_NEW_TASK: ${CIO_TEMPLATE__GUEST_NEW_TASK:-}
108+
CIO_TEMPLATE__OVERDUE_TASK: ${CIO_TEMPLATE__OVERDUE_TASK:-}
109+
CIO_TEMPLATE__MENTION: ${CIO_TEMPLATE__MENTION:-}
110+
CIO_TEMPLATE__TASK_REMINDER: ${CIO_TEMPLATE__TASK_REMINDER:-}
111+
CIO_TEMPLATE__COMPLETE_WORKFLOW: ${CIO_TEMPLATE__COMPLETE_WORKFLOW:-}
112+
EMAIL_HOST: ${EMAIL_HOST:-}
113+
EMAIL_PORT: ${EMAIL_PORT:-}
114+
EMAIL_HOST_USER: ${EMAIL_HOST_USER:-}
115+
EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD:-}
116+
EMAIL_USE_TLS: ${EMAIL_USE_TLS:-}
117+
EMAIL_USE_SSL: ${EMAIL_USE_SSL:-}
118+
EMAIL_TIMEOUT: ${EMAIL_TIMEOUT:-}
104119
AI: ${AI:-no}
105-
AI_PROVIDER: ${AI_PROVIDER}
120+
AI_PROVIDER: ${AI_PROVIDER:-}
106121
PUSH: ${PUSH:-no}
107-
PUSH_PROVIDER: ${PUSH_PROVIDER}
122+
PUSH_PROVIDER: ${PUSH_PROVIDER:-}
108123
STORAGE: ${STORAGE:-no}
109-
STORAGE_PROVIDER: ${STORAGE_PROVIDER}
124+
STORAGE_PROVIDER: ${STORAGE_PROVIDER:-}
110125
GOOGLE_APPLICATION_CREDENTIALS: /pneumatic_backend/google_api_credentials.json
111-
SENTRY_DSN: ${SENTRY_DSN}
126+
SENTRY_DSN: ${SENTRY_DSN:-}
112127
POSTGRES_HOST: ${POSTGRES_HOST:-postgres}
113128
POSTGRES_USER: ${POSTGRES_USER:-postgres_user}
114129
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres_password}
@@ -153,6 +168,7 @@ services:
153168
FRONTEND_URL: ${FRONTEND_URL:-http://localhost}
154169
FORMS_URL: ${FORMS_URL:-http://form.localhost}
155170
ENVIRONMENT: ${ENVIRONMENT:-Production}
171+
RELEASE: ${RELEASE:-1.0.0}
156172
LANGUAGE_CODE: ${LANGUAGE_CODE:-en} # Allowed values: en, fr, de, es, ru
157173
CAPTCHA: ${CAPTCHA:-no}
158174
ANALYTICS: ${ANALYTICS:-no}
@@ -161,35 +177,49 @@ services:
161177
MS_AUTH: ${MS_AUTH:-no}
162178
GOOGLE_AUTH: ${GOOGLE_AUTH:-no}
163179
SSO_AUTH: ${SSO_AUTH:-no}
164-
SSO_PROVIDER: ${SSO_PROVIDER} # Allowed values: okta, auth0
165-
OKTA_DOMAIN: ${OKTA_DOMAIN}
166-
OKTA_CLIENT_ID: ${OKTA_CLIENT_ID}
167-
OKTA_CLIENT_SECRET: ${OKTA_CLIENT_SECRET}
168-
OKTA_REDIRECT_URI: ${OKTA_REDIRECT_URI}
169-
AUTH0_CLIENT_ID: ${AUTH0_CLIENT_ID}
170-
AUTH0_CLIENT_SECRET: ${AUTH0_CLIENT_SECRET}
171-
AUTH0_DOMAIN: ${AUTH0_DOMAIN}
172-
AUTH0_REDIRECT_URI: ${AUTH0_REDIRECT_URI}
180+
SSO_PROVIDER: ${SSO_PROVIDER:-} # Allowed values: okta, auth0
181+
OKTA_DOMAIN: ${OKTA_DOMAIN:-}
182+
OKTA_CLIENT_ID: ${OKTA_CLIENT_ID:-}
183+
OKTA_CLIENT_SECRET: ${OKTA_CLIENT_SECRET:-}
184+
OKTA_REDIRECT_URI: ${OKTA_REDIRECT_URI:-}
185+
AUTH0_CLIENT_ID: ${AUTH0_CLIENT_ID:-}
186+
AUTH0_CLIENT_SECRET: ${AUTH0_CLIENT_SECRET:-}
187+
AUTH0_DOMAIN: ${AUTH0_DOMAIN:-}
188+
AUTH0_REDIRECT_URI: ${AUTH0_REDIRECT_URI:-}
173189
EMAIL: ${EMAIL:-no} # Disable send emails
174-
EMAIL_PROVIDER: ${EMAIL_PROVIDER}
175-
CIO_WEBHOOK_API_VERSION: ${CIO_WEBHOOK_API_VERSION}
176-
CIO_WEBHOOK_API_KEY: ${CIO_WEBHOOK_API_KEY}
177-
CIO_TRANSACTIONAL_API_KEY: ${CIO_TRANSACTIONAL_API_KEY}
178-
EMAIL_HOST: ${EMAIL_HOST}
179-
EMAIL_PORT: ${EMAIL_PORT}
180-
EMAIL_HOST_USER: ${EMAIL_HOST_USER}
181-
EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD}
182-
EMAIL_USE_TLS: ${EMAIL_USE_TLS}
183-
EMAIL_USE_SSL: ${EMAIL_USE_SSL}
184-
EMAIL_TIMEOUT: ${EMAIL_TIMEOUT}
190+
EMAIL_PROVIDER: ${EMAIL_PROVIDER:-}
191+
CIO_WEBHOOK_API_VERSION: ${CIO_WEBHOOK_API_VERSION:-}
192+
CIO_WEBHOOK_API_KEY: ${CIO_WEBHOOK_API_KEY:-}
193+
CIO_TRANSACTIONAL_API_KEY: ${CIO_TRANSACTIONAL_API_KEY:-}
194+
CIO_TEMPLATE__RESET_PASSWORD: ${CIO_TEMPLATE__RESET_PASSWORD:-}
195+
CIO_TEMPLATE__USER_DEACTIVATED: ${CIO_TEMPLATE__USER_DEACTIVATED:-}
196+
CIO_TEMPLATE__NEW_TASK: ${CIO_TEMPLATE__NEW_TASK:-}
197+
CIO_TEMPLATE__TASK_RETURNED: ${CIO_TEMPLATE__TASK_RETURNED:-}
198+
CIO_TEMPLATE__ACCOUNT_VERIFICATION: ${CIO_TEMPLATE__ACCOUNT_VERIFICATION:-}
199+
CIO_TEMPLATE__WORKFLOWS_DIGEST: ${CIO_TEMPLATE__WORKFLOWS_DIGEST:-}
200+
CIO_TEMPLATE__TASKS_DIGEST: ${CIO_TEMPLATE__TASKS_DIGEST:-}
201+
CIO_TEMPLATE__USER_TRANSFER: ${CIO_TEMPLATE__USER_TRANSFER:-}
202+
CIO_TEMPLATE__UNREAD_NOTIFICATIONS: ${CIO_TEMPLATE__UNREAD_NOTIFICATIONS:-}
203+
CIO_TEMPLATE__GUEST_NEW_TASK: ${CIO_TEMPLATE__GUEST_NEW_TASK:-}
204+
CIO_TEMPLATE__OVERDUE_TASK: ${CIO_TEMPLATE__OVERDUE_TASK:-}
205+
CIO_TEMPLATE__MENTION: ${CIO_TEMPLATE__MENTION:-}
206+
CIO_TEMPLATE__TASK_REMINDER: ${CIO_TEMPLATE__TASK_REMINDER:-}
207+
CIO_TEMPLATE__COMPLETE_WORKFLOW: ${CIO_TEMPLATE__COMPLETE_WORKFLOW:-}
208+
EMAIL_HOST: ${EMAIL_HOST:-}
209+
EMAIL_PORT: ${EMAIL_PORT:-}
210+
EMAIL_HOST_USER: ${EMAIL_HOST_USER:-}
211+
EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD:-}
212+
EMAIL_USE_TLS: ${EMAIL_USE_TLS:-}
213+
EMAIL_USE_SSL: ${EMAIL_USE_SSL:-}
214+
EMAIL_TIMEOUT: ${EMAIL_TIMEOUT:-}
185215
AI: ${AI:-no}
186-
AI_PROVIDER: ${AI_PROVIDER}
216+
AI_PROVIDER: ${AI_PROVIDER:-}
187217
PUSH: ${PUSH:-no}
188-
PUSH_PROVIDER: ${PUSH_PROVIDER}
218+
PUSH_PROVIDER: ${PUSH_PROVIDER:-}
189219
STORAGE: ${STORAGE:-no}
190-
STORAGE_PROVIDER: ${STORAGE_PROVIDER}
220+
STORAGE_PROVIDER: ${STORAGE_PROVIDER:-}
191221
GOOGLE_APPLICATION_CREDENTIALS: /pneumatic_backend/google_api_credentials.json
192-
SENTRY_DSN: ${SENTRY_DSN}
222+
SENTRY_DSN: ${SENTRY_DSN:-}
193223
POSTGRES_HOST: ${POSTGRES_HOST:-postgres}
194224
POSTGRES_USER: ${POSTGRES_USER:-postgres_user}
195225
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres_password}

backend/src/accounts/enums.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,21 @@
33

44
class NotificationType:
55

6+
# TODO Union with the NotificationMethod
7+
68
SYSTEM = 'system'
79
COMMENT = 'comment'
810
MENTION = 'mention'
911
URGENT = 'urgent'
1012
NOT_URGENT = 'not_urgent'
1113
OVERDUE_TASK = 'overdue_task'
14+
REMINDER_TASK = 'reminder_task'
1215
DELAY_WORKFLOW = 'snooze_workflow'
1316
RESUME_WORKFLOW = 'resume_workflow'
1417
DUE_DATE_CHANGED = 'due_date_changed'
1518
REACTION = 'reaction'
1619
COMPLETE_TASK = 'complete_task'
20+
COMPLETE_WORKFLOW = 'complete_workflow'
1721

1822
URGENT_TYPES = (
1923
URGENT,
@@ -27,11 +31,13 @@ class NotificationType:
2731
(URGENT, 'urgent'),
2832
(NOT_URGENT, 'not urgent'),
2933
(OVERDUE_TASK, 'overdue task'),
34+
(REMINDER_TASK, 'reminder task'),
3035
(DELAY_WORKFLOW, 'snooze workflow'),
3136
(RESUME_WORKFLOW, 'resume workflow'),
3237
(DUE_DATE_CHANGED, 'due date changed'),
3338
(REACTION, 'reaction'),
3439
(COMPLETE_TASK, 'complete task'),
40+
(COMPLETE_WORKFLOW, 'complete workflow'),
3541
)
3642

3743

@@ -92,6 +98,16 @@ class UserFirstDayWeek:
9298
(SATURDAY, 'Saturday'),
9399
)
94100

101+
LITERALS = Literal[
102+
SUNDAY,
103+
MONDAY,
104+
TUESDAY,
105+
WEDNESDAY,
106+
THURSDAY,
107+
FRIDAY,
108+
SATURDAY,
109+
]
110+
95111

96112
class UserDateFormat:
97113

@@ -137,6 +153,7 @@ class UserDateFormat:
137153
PY_USA_24: API_USA_24,
138154
PY_EUROPE_24: API_EUROPE_24,
139155
}
156+
LITERALS = Literal[PY_USA_12, PY_EUROPE_12, PY_USA_24, PY_EUROPE_24]
140157

141158

142159
class LeaseLevel:

backend/src/accounts/filters.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,24 @@ class Meta:
4141
)
4242

4343

44+
class PublicUsersListFilterSet(FilterSet):
45+
46+
class Meta:
47+
model = User
48+
fields = (
49+
'ordering',
50+
)
51+
52+
ordering = DefaultOrderingFilter(
53+
fields=(
54+
('first_name', 'first_name'),
55+
('last_name', 'last_name'),
56+
('status', 'status'),
57+
),
58+
default=('last_name',),
59+
)
60+
61+
4462
class UsersListFilterSet(FilterSet):
4563

4664
class Meta:

0 commit comments

Comments
 (0)