create_proposal.py

entry point
68 steps HTTP Client cli: __main__ guard

This script automates the creation of business proposals using PandaDoc. It gathers necessary client and project details, validates them, and then generates a new proposal document.

Flow

Click any step to see details

graph TB
    n_create_proposal_19{"try/except block"}:::decision
    n_create_proposal_28[["Transform: int()"]]:::transform
    n_create_proposal_19 --> n_create_proposal_28
  subgraph n_create_proposal___post_init__["__post_init__()"]
    n_create_proposal_43{"if not self.client_email or '@' not in self.client_email"}:::decision
    n_create_proposal_45{"if not self.project_title"}:::decision
    n_create_proposal_43 --> n_create_proposal_45
  end
  n_create_proposal_validate_input_compact[["validate_input() — 12 steps (6 Transform, 5 API, 1 Decision)"]]:::compact
  subgraph n_create_proposal_wait_for_document_ready["wait_for_document_ready()"]
    n_create_proposal_128{"while time.time() - start_time #lt; max_wait"}:::decision
    n_create_proposal_129{"try/except block"}:::decision
    n_create_proposal_130["API: requests.get()"]:::api
    n_create_proposal_133(["Output: logger.debug()"]):::output
    n_create_proposal_135{"if status == 'document.uploaded'"}:::decision
    n_create_proposal_137{"if status in ['document.error', 'document.deleted']"}:::decision
    n_create_proposal_142(["Output: logger.warning()"]):::output
    n_create_proposal_128 --> n_create_proposal_129
    n_create_proposal_129 --> n_create_proposal_130
    n_create_proposal_130 --> n_create_proposal_133
    n_create_proposal_133 --> n_create_proposal_135
    n_create_proposal_135 --> n_create_proposal_137
    n_create_proposal_137 --> n_create_proposal_142
  end
  n_create_proposal_create_document_compact[["create_document() — 13 steps (6 Decision, 5 Output, 1 API, 1 Transform)"]]:::compact
  n_create_proposal_main_compact[["main() — 32 steps (14 Transform, 11 Output, 5 Decision, 2 File I/O)"]]:::compact
  click n_create_proposal_19 call showStepDetail("create_proposal.py", 19)
  click n_create_proposal_28 call showStepDetail("create_proposal.py", 28)
  click n_create_proposal_43 call showStepDetail("create_proposal.py", 43)
  click n_create_proposal_45 call showStepDetail("create_proposal.py", 45)
  click n_create_proposal_128 call showStepDetail("create_proposal.py", 128)
  click n_create_proposal_129 call showStepDetail("create_proposal.py", 129)
  click n_create_proposal_130 call showStepDetail("create_proposal.py", 130)
  click n_create_proposal_133 call showStepDetail("create_proposal.py", 133)
  click n_create_proposal_135 call showStepDetail("create_proposal.py", 135)
  click n_create_proposal_137 call showStepDetail("create_proposal.py", 137)
  click n_create_proposal_142 call showStepDetail("create_proposal.py", 142)
classDef api fill:#dbeafe,stroke:#2563eb,color:#1e3a5f
classDef fileio fill:#dcfce7,stroke:#16a34a,color:#14532d
classDef dbop fill:#f3e8ff,stroke:#9333ea,color:#3b0764
classDef decision fill:#ffedd5,stroke:#ea580c,color:#7c2d12
classDef output fill:#f3f4f6,stroke:#6b7280,color:#1f2937
classDef transform fill:#ccfbf1,stroke:#0d9488,color:#134e4a
classDef entry fill:#dcfce7,stroke:#16a34a,stroke-width:3px,color:#14532d
classDef compact fill:#f0f4ff,stroke:#6366f1,color:#312e81,stroke-width:2px
                    
API Call File I/O Database Decision Output Transform

All Steps

Step Detail

Select a step from the diagram or list to see its details.

Services

  • HTTP Client (requests)

Secrets

  • DEBUG
  • PANDADOC_API_KEY
  • PANDADOC_RECIPIENT_ROLE
  • PANDADOC_TEMPLATE_UUID
  • PANDADOC_TIMEOUT

Imports

External

  • dataclasses
  • dotenv
  • json
  • logging
  • os
  • re
  • requests
  • sys
  • time
  • typing