|
1 | | -from fastapi import APIRouter, Depends, Request, Query |
| 1 | +import logging |
| 2 | +import os |
| 3 | +from datetime import datetime, timedelta, timezone |
| 4 | +from typing import Any |
| 5 | +from urllib.parse import parse_qs, urlparse |
| 6 | + |
2 | 7 | import httpx |
3 | | -from fastapi.responses import Response, RedirectResponse |
| 8 | +from arq.connections import ArqRedis |
| 9 | +from fastapi import APIRouter, Depends, Query, Request |
| 10 | +from fastapi.responses import RedirectResponse, Response |
| 11 | +from redis.asyncio import Redis |
4 | 12 | from sqlalchemy import select, update |
5 | 13 | from sqlalchemy.ext.asyncio import AsyncSession |
6 | 14 | from sqlalchemy.orm import selectinload |
7 | | -from datetime import datetime, timedelta, timezone |
8 | | -from redis.asyncio import Redis |
9 | | -from arq.connections import ArqRedis |
10 | | -from urllib.parse import urlparse, parse_qs |
11 | | -import logging |
12 | | -import os |
13 | | -from typing import Any |
14 | 15 |
|
| 16 | +from config import Settings, get_settings |
| 17 | +from db import get_db |
15 | 18 | from dependencies import ( |
| 19 | + RedirectResponseX, |
| 20 | + TemplateResponse, |
| 21 | + flash, |
| 22 | + get_access, |
16 | 23 | get_current_user, |
17 | | - get_project_by_name, |
18 | 24 | get_deployment_by_id, |
19 | | - get_team_by_slug, |
| 25 | + get_github_installation_service, |
20 | 26 | get_github_service, |
21 | | - get_redis_client, |
22 | 27 | get_job_queue, |
23 | | - flash, |
24 | | - get_translation as _, |
25 | | - TemplateResponse, |
26 | | - RedirectResponseX, |
| 28 | + get_project_by_name, |
| 29 | + get_redis_client, |
27 | 30 | get_role, |
28 | | - get_access, |
29 | | - get_github_installation_service, |
| 31 | + get_team_by_slug, |
30 | 32 | ) |
31 | | -from models import ( |
32 | | - Project, |
33 | | - Deployment, |
34 | | - Domain, |
35 | | - User, |
36 | | - Team, |
37 | | - TeamMember, |
38 | | - utc_now, |
| 33 | +from dependencies import ( |
| 34 | + get_translation as _, |
39 | 35 | ) |
40 | 36 | from forms.project import ( |
41 | 37 | NewProjectForm, |
42 | | - ProjectDeployForm, |
43 | | - ProjectDeleteForm, |
44 | | - ProjectGeneralForm, |
45 | | - ProjectEnvVarsForm, |
46 | | - ProjectEnvironmentForm, |
47 | | - ProjectDeleteEnvironmentForm, |
48 | 38 | ProjectBuildAndProjectDeployForm, |
49 | 39 | ProjectCancelDeploymentForm, |
50 | | - ProjectRollbackDeploymentForm, |
| 40 | + ProjectDeleteEnvironmentForm, |
| 41 | + ProjectDeleteForm, |
| 42 | + ProjectDeployForm, |
51 | 43 | ProjectDomainForm, |
| 44 | + ProjectEnvironmentForm, |
| 45 | + ProjectEnvVarsForm, |
| 46 | + ProjectGeneralForm, |
52 | 47 | ProjectRemoveDomainForm, |
53 | | - ProjectVerifyDomainForm, |
54 | 48 | ProjectResourcesForm, |
| 49 | + ProjectRollbackDeploymentForm, |
| 50 | + ProjectVerifyDomainForm, |
| 51 | +) |
| 52 | +from models import ( |
| 53 | + Deployment, |
| 54 | + Domain, |
| 55 | + Project, |
| 56 | + Team, |
| 57 | + TeamMember, |
| 58 | + User, |
| 59 | + utc_now, |
55 | 60 | ) |
56 | | -from config import get_settings, Settings |
57 | | -from db import get_db |
58 | | -from services.github import GitHubService |
59 | | -from services.github_installation import GitHubInstallationService |
60 | 61 | from services.deployment import DeploymentService |
61 | 62 | from services.domain import DomainService |
62 | | -from utils.project import get_latest_projects, get_latest_deployments |
63 | | -from utils.team import get_latest_teams |
64 | | -from utils.pagination import paginate |
65 | | -from utils.environment import group_branches_by_environment, get_environment_for_branch |
| 63 | +from services.github import GitHubService |
| 64 | +from services.github_installation import GitHubInstallationService |
| 65 | +from services.project_detection import detect_project_settings |
66 | 66 | from utils.color import COLORS |
| 67 | +from utils.environment import get_environment_for_branch, group_branches_by_environment |
| 68 | +from utils.pagination import paginate |
| 69 | +from utils.project import get_latest_deployments, get_latest_projects |
| 70 | +from utils.team import get_latest_teams |
67 | 71 | from utils.user import get_user_github_token |
68 | 72 |
|
69 | 73 | logger = logging.getLogger(__name__) |
@@ -126,6 +130,28 @@ async def new_project_details( |
126 | 130 | form.name.data = repo_name |
127 | 131 | form.production_branch.data = repo_default_branch |
128 | 132 |
|
| 133 | + try: |
| 134 | + github_oauth_token = await get_user_github_token(db, current_user) |
| 135 | + if github_oauth_token: |
| 136 | + detected = await detect_project_settings( |
| 137 | + github_service, |
| 138 | + github_oauth_token, |
| 139 | + int(repo_id), |
| 140 | + repo_default_branch, |
| 141 | + ) |
| 142 | + if detected.preset: |
| 143 | + form.preset.data = detected.preset |
| 144 | + if detected.image: |
| 145 | + form.image.data = detected.image |
| 146 | + if detected.build_command: |
| 147 | + form.build_command.data = detected.build_command |
| 148 | + if detected.start_command: |
| 149 | + form.start_command.data = detected.start_command |
| 150 | + if detected.pre_deploy_command: |
| 151 | + form.pre_deploy_command.data = detected.pre_deploy_command |
| 152 | + except Exception: |
| 153 | + logger.warning("Failed to detect project settings", exc_info=True) |
| 154 | + |
129 | 155 | if request.method == "POST" and await form.validate_on_submit(): |
130 | 156 | try: |
131 | 157 | github_oauth_token = await get_user_github_token(db, current_user) |
|
0 commit comments