
    h-l                         S r SSKJrJrJrJrJrJrJr  SSK	J
r
  SSKJr  SSKJrJrJr  SSKJrJr  SSKrSSKrSSKrSSKrSSKJrJrJr  SSKrSS	KJr  \" 5         \" \5      r\R@                  " S
S5      \RB                  S
'   \R@                  " SS5      \RB                  S'   S\RB                  S'   \
" \5      r"\" \\"5      r#\RH                  " \RJ                  S9  \RL                  " \5      r'SSK(J)r)J*r*J+r+J,r,J-r-  SSK.J/r/  \/" \5        SSK0J1r1  \Re                  \1SS9   " S S5      r3 " S S5      r4\4" 5       r5\Rm                  S5      S 5       r7\Rm                  S5      \S 5       5       r8\Rm                  SS S!/S"9\S# 5       5       r9\Rm                  S$5      \S% 5       5       r:\Rm                  S&5      \S' 5       5       r;\Rm                  S(5      \S) 5       5       r<\Rm                  S*5      \S+ 5       5       r=\R}                  S,5      S- 5       r?\R}                  S.5      S/ 5       r@\S0:X  a;  \R                  5          \"R                  5         SSS5        \R                  S1S2S3S49  gg! , (       d  f       N!= f)5z
DevSecOps Pipeline Security Maturity Assessor
Main Flask application for assessing CI/CD pipeline security maturity.

Author: Mitchele Jebet
License: MIT
    )Flaskrequestjsonifyrender_templateflashredirecturl_for)
SQLAlchemy)Migrate)LoginManagerlogin_requiredcurrent_user)datetimetimezoneN)DictListAny)load_dotenv
SECRET_KEYzdev-key-change-in-productionDATABASE_URLzsqlite:///devsecops_assessor.dbSQLALCHEMY_DATABASE_URIFSQLALCHEMY_TRACK_MODIFICATIONS)level)UserOrganization
AssessmentSubscriptionInvoice)	init_auth)
billing_bpz/billing)
url_prefixc            	           \ rS rSrSrSS/ SQS.SS/ S	QS.S
S/ SQS.SS/ SQS.SS/ SQS.SS/ SQS.S.rSSS.SSS.SSS.SSS.SSS.S.r\S \S!\	4S" j5       r
S#rg$)%SecurityMaturityFramework4   z/Core framework for assessing DevSecOps maturityzSource Code Securityg?)dependency_scanningsecret_detection
sast_toolscode_quality_gates)nameweightcheckszBuild Securityg333333?)secure_build_environmentartifact_signingbuild_reproducibilitysupply_chain_securityzDeployment Security)infrastructure_as_codecontainer_scanningdeployment_approval_gatesenvironment_isolationzRuntime Security)monitoring_loggingincident_responsevulnerability_managementsecurity_testingzCompliance & Governance)policy_as_codeaudit_trailscompliance_reportingaccess_controlszCulture & Trainingg?)security_championstraining_programssecurity_reviewsknowledge_sharing)source_code_securitybuild_securitydeployment_securityruntime_securitycompliance_governanceculture_trainingInitialz,Ad-hoc security practices, reactive approach)r)   description
Developingz Basic security tools implementedDefinedz+Documented security processes and standardsManagedz$Metrics-driven security improvements	Optimizedz/Continuous security optimization and innovation)r               scorereturnc                 n    US:  a  SnOUS:  a  SnOUS:  a  SnOUS:  a  SnOS	nX R                   U   4$ )
z'Calculate maturity level based on scoreZ   rO   K   rN   <   rM   (   rL   r   )MATURITY_LEVELS)clsrP   r   s      $/home/kali/devsecops-assessor/app.pycalculate_maturity_level2SecurityMaturityFramework.calculate_maturity_level~   sM     B;Eb[Eb[Eb[EE))%000     N)__name__
__module____qualname____firstlineno____doc__
CATEGORIESrW   classmethodfloattuplerZ   __static_attributes__r]   r\   rY   r#   r#   4   s    9 +	!
 %	
 *	 
 '	
 .	"
 )	
g=J@ .\] 1ST.[\.TU0abO 1U 1u 1 1r\   r#   c            	          \ rS rSrSrS rSS\S\S\\\4   4S jjr	SS\S\S\\\4   4S	 jjr
S
\\\4   S\\\4   4S jrS
\\\4   S\\\4   4S jrS
\\\4   S\\\4   4S jrS
\\\4   S\\\4   4S jrS
\\\4   S\\\4   4S jrS
\\\4   S\\\4   4S jrS
\\\4   S\\\4   4S jrS\\\4   S\\\4   4S jrSrg)PipelineAnalyzer   z.Analyzes CI/CD pipelines for security maturityc                 "    [        5       U l        g N)r#   	framework)selfs    rY   __init__PipelineAnalyzer.__init__   s    24r\   Nrepo_urltokenrQ   c                     UR                  SS5      R                  S5      nUS   US   pT0 nU(       a  SU 3US'   SU SU S	3n[        R                  " XvS
9nUR                  S:w  a  SSUR                   30$ UR                  5       n	0 n
U	 H  nUS   R                  S5      (       d  M  [        R                  " US   5      nUR                  S:X  d  MI  [        R                  " UR                  5      nU R                  U5      XS   '   M     U R                  U
5      $ ! [         a8  n[        R                  S[        U5       35        S[        U5      0s SnA$ SnAff = f)zAnalyze GitHub Actions pipelinezhttps://github.com/ /r   rL   ztoken Authorizationzhttps://api.github.com/repos/z/contents/.github/workflowsheaders   errorzFailed to access repository: r)   )z.ymlz.yamldownload_urlz!Error analyzing GitHub pipeline: N)replacesplitrequestsgetstatus_codejsonendswithyaml	safe_loadtext_analyze_workflow_content_calculate_overall_scores	Exceptionloggerrz   str)rn   rq   rr   partsownerreporx   workflows_urlresponse	workflowsanalysis_resultsworkflow_filecontent_responseworkflow_contentes                  rY   analyze_github_pipeline(PipelineAnalyzer.analyze_github_pipeline   sk   !	%$$%:B?EEcJE(E!H4 G-3E7+;( <E7!D6IdeM||MCH##s*#@AUAU@V!WXX I!!* (112CDD'/||M.4Q'R$'33s:+/>>:J:O:O+P(BFB`B`aqBr(v)>? "+ 112BCC 	%LL<SVHEFSV$$	%s1   A8D# ;.D# -'D# A
D# #
E%--E E% E%c                 >    UR                  SS5      R                  SS5      n0 nU(       a  X$S'   SU S3n[        R                  " XTS9nUR                  S	:w  a  SU S
3n[        R                  " XTS9nUR                  S	:w  a  SSUR                   30$ [        R
                  " UR                  5      nSU R                  U5      0nU R                  U5      $ ! [         a8  n	[        R                  S[        U	5       35        S[        U	5      0s Sn	A	$ Sn	A	ff = f)zAnalyze GitLab CI pipelinezhttps://gitlab.com/rt   ru   z%2FzPRIVATE-TOKENz#https://gitlab.com/api/v4/projects/z-/repository/files/.gitlab-ci.yml/raw?ref=mainrw   ry   z//repository/files/.gitlab-ci.yml/raw?ref=masterrz   z!Failed to access .gitlab-ci.yml: zgitlab-ci.ymlz!Error analyzing GitLab pipeline: N)r|   r~   r   r   r   r   r   r   r   r   r   rz   r   )
rn   rq   rr   project_pathrx   file_urlr   pipeline_contentr   r   s
             rY   analyze_gitlab_pipeline(PipelineAnalyzer.analyze_gitlab_pipeline   s   	%#++,A2FNNsTYZLG+0( =\NJwxH||H>H##s*@N}~#<<B##s*#DXEYEYDZ![\\#~~hmm< /1O1OP`1ab112BCC 	%LL<SVHEFSV$$	%s%   BC AC 
D$-DDDcontentc                 F   0 nU R                   R                   H  nSS/ / S.X#'   M     U R                  U5      US'   U R                  U5      US'   U R	                  U5      US'   U R                  U5      US'   U R                  U5      US'   U R                  U5      US	'   U$ )
z,Analyze individual workflow/pipeline contentr   d   rP   	max_scorefindingsrecommendationsr@   rA   rB   rC   rD   rE   )rm   rc   _check_source_code_security_check_build_security_check_deployment_security_check_runtime_security_check_compliance_governance_check_culture_training)rn   r   resultscategorys       rY   r   *PipelineAnalyzer._analyze_workflow_content   s     11H #%	!G 2 +/*J*J7*S&' %)$>$>w$G ! *.)H)H)Q%& '+&B&B7&K"# ,0+L+LW+U'( '+&B&B7&K"#r\   c                 |  ^	 SnSn/ n/ n[        U5      R                  5       m	/ SQn[        U	4S jU 5       5      (       a  US-  nUR                  S5        OUR                  S5        / SQn[        U	4S	 jU 5       5      (       a  US-  nUR                  S
5        OUR                  S5        / SQn[        U	4S jU 5       5      (       a  US-  nUR                  S5        OUR                  S5        [        U	4S jS 5       5      (       a  US-  nUR                  S5        OUR                  S5        UUUUS.$ )z$Check source code security practicesr   r   )z	npm auditz
yarn auditz	pip-auditsafetysnyk
dependabotc              3   ,   >#    U  H	  oT;   v   M     g 7frl   r]   .0toolcontent_strs     rY   	<genexpr>?PipelineAnalyzer._check_source_code_security.<locals>.<genexpr>  s     @/?t{"/?      u    ✅ Dependency scanning detectedu4   🔧 Add dependency scanning (npm audit, Snyk, etc.))
trufflesecgitleakszdetect-secretszgit-secretsc              3   ,   >#    U  H	  oT;   v   M     g 7frl   r]   r   s     rY   r   r     s     <|t{"|r   u   ✅ Secret detection configuredu   🔧 Add secret detection tools)	sonarqubecodeqlsemgrepbanditeslintc              3   ,   >#    U  H	  oT;   v   M     g 7frl   r]   r   s     rY   r   r     s     :zt{"zr      u4   ✅ Static Analysis Security Testing (SAST) detectedu   🔧 Implement SAST toolsc              3   ,   >#    U  H	  oT;   v   M     g 7frl   r]   )r   gater   s     rY   r   r     s     i/ht{"/hr   )zquality gatezsecurity gatezfail on	threshold   u   ✅ Quality gates configuredu   🔧 Add security quality gatesr   r   loweranyappend)
rn   r   rP   r   r   r   dependency_toolssecret_toolsr'   r   s
            @rY   r   ,PipelineAnalyzer._check_source_code_security   s6   	'l((* d@/?@@@RKEOO>?""#YZ S<|<<<RKEOO=>""#DE L
:z:::RKEOORS""#>? i/hiiiRKEOO:;""#DE " .	
 	
r\   c                 d  ^ SnSn/ n/ n[        U5      R                  5       m[        U4S jS 5       5      (       a  US-  nUR                  S5        OUR                  S5        [        U4S jS	 5       5      (       a  US
-  nUR                  S5        OUR                  S5        [        U4S jS 5       5      (       a  US-  nUR                  S5        OUR                  S5        [        U4S jS 5       5      (       a  US-  nUR                  S5        OUR                  S5        UUUUS.$ )zCheck build security practicesr   r   c              3   ,   >#    U  H	  oT;   v   M     g 7frl   r]   r   keywordr   s     rY   r   9PipelineAnalyzer._check_build_security.<locals>.<genexpr>2  s     g5f'+%5fr   )zruns-on: ubuntu-latestzimage:	containerr   u+   ✅ Containerized/managed build environmentu#   🔧 Use managed build environmentsc              3   ,   >#    U  H	  oT;   v   M     g 7frl   r]   r   s     rY   r   r   9  s     U/Tt{"/Tr   )cosignsigstoregpgsignr   u   ✅ Artifact signing detectedu   🔧 Implement artifact signingc              3   ,   >#    U  H	  oT;   v   M     g 7frl   r]   r   s     rY   r   r   @  s     K/Jt{"/Jr   )sbomsyftcycloneu0   ✅ Software Bill of Materials (SBOM) generationu(   🔧 Generate Software Bill of Materialsc              3   ,   >#    U  H	  oT;   v   M     g 7frl   r]   r   s     rY   r   r   G  s     Q5P'+%5Pr   )cachelockpinnedr   u+   ✅ Build reproducibility measures detectedu3   🔧 Implement build caching and dependency pinningr   r   rn   r   rP   r   r   r   r   s         @rY   r   &PipelineAnalyzer._check_build_security(  s%   	'l((* g5fgggRKEOOIJ""#HI U/TUUURKEOO;<""#DE K/JKKKRKEOONO""#MN Q5PQQQRKEOOIJ""#XY " .	
 	
r\   c                 d  ^ SnSn/ n/ n[        U5      R                  5       m[        U4S jS 5       5      (       a  US-  nUR                  S5        OUR                  S5        [        U4S jS	 5       5      (       a  US
-  nUR                  S5        OUR                  S5        [        U4S jS 5       5      (       a  US
-  nUR                  S5        OUR                  S5        [        U4S jS 5       5      (       a  US-  nUR                  S5        OUR                  S5        UUUUS.$ )z#Check deployment security practicesr   r   c              3   ,   >#    U  H	  oT;   v   M     g 7frl   r]   r   s     rY   r   >PipelineAnalyzer._check_deployment_security.<locals>.<genexpr>^  s     d/ct{"/cr   )	terraformcloudformationpulumiansibler   u#   ✅ Infrastructure as Code detectedu%   🔧 Implement Infrastructure as Codec              3   ,   >#    U  H	  oT;   v   M     g 7frl   r]   r   s     rY   r   r   e  s     Z/Yt{"/Yr   )trivyclairanchore	twistlockr   u   ✅ Container security scanningu$   🔧 Add container security scanningc              3   ,   >#    U  H	  oT;   v   M     g 7frl   r]   r   s     rY   r   r   l  s     e5d'+%5dr   )environmentapprovalmanualreviewu   ✅ Deployment approval processu#   🔧 Implement deployment approvalsc              3   ,   >#    U  H	  oT;   v   M     g 7frl   r]   r   s     rY   r   r   s       ^5]'+%5]r   )staging
productiondevtestr   u#   ✅ Environment separation detectedu+   🔧 Implement proper environment isolationr   r   r   s         @rY   r   +PipelineAnalyzer._check_deployment_securityT  s%   	'l((* d/cdddRKEOOAB""#JK Z/YZZZRKEOO=>""#IJ e5deeeRKEOO=>""#HI ^5]^^^RKEOOAB""#PQ " .	
 	
r\   c                   ^ SnSn/ n/ n[        U5      R                  5       m[        U4S jS 5       5      (       a  US-  nUR                  S5        OUR                  S5        [        U4S jS	 5       5      (       a  US
-  nUR                  S5        OUR                  S5        [        U4S jS 5       5      (       a  US
-  nUR                  S5        OUR                  S5        UUUUS.$ )z Check runtime security practicesr   r   c              3   ,   >#    U  H	  oT;   v   M     g 7frl   r]   r   s     rY   r   ;PipelineAnalyzer._check_runtime_security.<locals>.<genexpr>  s     j/it{"/ir   )datadognewrelicelasticsplunk
prometheusr   u%   ✅ Monitoring and logging configuredu'   🔧 Implement comprehensive monitoringc              3   ,   >#    U  H	  oT;   v   M     g 7frl   r]   r   s     rY   r   r     s     g/ft{"/fr   )zapburpdastpenetrationzsecurity test#   u   ✅ Dynamic security testingu(   🔧 Add dynamic security testing (DAST)c              3   ,   >#    U  H	  oT;   v   M     g 7frl   r]   r   s     rY   r   r     s     a5`'+%5`r   )vulnerabilitycvepatchupdateu$   ✅ Vulnerability management processu'   🔧 Implement vulnerability managementr   r   r   s         @rY   r   (PipelineAnalyzer._check_runtime_security  s    	'l((* j/ijjjRKEOOCD""#LM g/fgggRKEOO:;""#MN a5`aaaRKEOOBC""#LM " .	
 	
r\   c                 d  ^ SnSn/ n/ n[        U5      R                  5       m[        U4S jS 5       5      (       a  US-  nUR                  S5        OUR                  S5        [        U4S jS	 5       5      (       a  US
-  nUR                  S5        OUR                  S5        [        U4S jS 5       5      (       a  US-  nUR                  S5        OUR                  S5        [        U4S jS 5       5      (       a  US-  nUR                  S5        OUR                  S5        UUUUS.$ )z)Check compliance and governance practicesr   r   c              3   ,   >#    U  H	  oT;   v   M     g 7frl   r]   r   s     rY   r   @PipelineAnalyzer._check_compliance_governance.<locals>.<genexpr>  s     [/Zt{"/Zr   )opa
gatekeeperpolicyconftestr
  u!   ✅ Policy as Code implementationu   🔧 Implement Policy as Codec              3   ,   >#    U  H	  oT;   v   M     g 7frl   r]   r   s     rY   r   r    s     Y5X'+%5Xr   )auditlogtracerecordr   u   ✅ Audit trail capabilitiesu&   🔧 Enable comprehensive audit trailsc              3   ,   >#    U  H	  oT;   v   M     g 7frl   r]   r   s     rY   r   r    s     f5e'+%5er   )report
compliancesocgdprhipaar   u!   ✅ Compliance reporting detectedu   🔧 Add compliance reportingc              3   ,   >#    U  H	  oT;   v   M     g 7frl   r]   r   s     rY   r   r    r   r   )rbac
permissionroleaccessu   ✅ Access control measuresu%   🔧 Implement proper access controlsr   r   r   s         @rY   r   -PipelineAnalyzer._check_compliance_governance  s%   	'l((* [/Z[[[RKEOO?@""#BC Y5XYYYRKEOO:;""#KL f5efffRKEOO?@""#BC ^5]^^^RKEOO9:""#JK " .	
 	
r\   c                 &    SnSnS/n/ SQnUUUUS.$ )z%Check culture and training indicators2   r   u0   ℹ️ Culture assessment requires manual review)u)   🔧 Establish security champions programu)   🔧 Implement security training programsu$   🔧 Regular security design reviewsr   r]   )rn   r   rP   r   r   r   s         rY   r   (PipelineAnalyzer._check_culture_training  s3    	FG
 " .	
 	
r\   r   c                    SU;   a  U$ 0 nSnU R                   R                  R                  5        HR  u  pESnSnUR                  5        H  u  pXI;   d  M  XiU   S   -  nUS-  nM     US:  d  M@  Xg-  n
XU'   X:US   -  -  nMT     U R                   R                  U5      u  p[	        US5      UUUU[
        R                  " [        R                  5      R                  5       S.$ )z!Calculate weighted overall scoresrz   r   rP   rL   r*   rM   )overall_scorematurity_levelmaturity_infocategory_scoresdetailed_resultsanalysis_timestamp)
rm   rc   itemsrZ   roundr   nowr   utc	isoformat)rn   r   r0  overall_weighted_scorer   configcategory_totalcategory_countworkflow_nameworkflow_resultscategory_avgr.  r/  s                rY   r   *PipelineAnalyzer._calculate_overall_scores  s   &&##!" !% 9 9 ? ? AHNN3C3I3I3K//"x&@&IIN"a'N 4L
 !->,8)&9I*II& !B )-(O(OPf(g% ##91=,*. 0"*,,x||"<"F"F"H
 	
r\   )rm   rl   )r^   r_   r`   ra   rb   ro   r   r   r   r   r   r   r   r   r   r   r   r   r   rg   r]   r\   rY   ri   ri      sx   85#% #%C #%4PSUXPX> #%J% %C %4PSUXPX> %>c3h DcN B-
4S> -
d3PS8n -
^*
T#s(^ *
S#X *
X*
$sCx. *
T#s(^ *
X#
tCH~ #
$sCx. #
J*
DcN *
tCQTH~ *
X
tCH~ 
$sCx. 
$!
$sCx. !
TRUWZRZ^ !
r\   ri   ru   c                  j    [         R                  (       a  [        [        S5      5      $ [	        S5      $ )z	Home page	dashboardzlanding.html)r   is_authenticatedr   r	   r   r]   r\   rY   indexrC  
  s(     $$,-->**r\   z
/dashboardc                  @   [         R                  n [        R                  R	                  U R
                  S9R                  5       n[        R                  R                  [        R                  R                  [        R                  5      5      R	                  U R
                  S9R                  5       nU(       a  [        US5      OSn/ n[        R                  R	                  U R
                  S9R                  [        R                  R!                  5       5      R#                  5       nU(       aT  UR$                  (       aC   [&        R(                  " UR$                  5      nSU;   a  [+        US   R-                  5       5      nUUUS.n[        R                  R	                  U R
                  S9R                  [        R                  R!                  5       5      R1                  S5      R3                  5       n[5        SXxS9$ ! [&        R.                   a     Nf = f)	zDashboard pageorganization_idrM   r   r0  )total_assessmentsaverage_scorer0     zdashboard.html)statsrecent_assessments)r   organizationr   query	filter_byidcountdbsessionfuncavgr-  scalarr4  order_by
created_atdescfirstassessment_datar   loadslistvaluesJSONDecodeErrorlimitallr   )	orgrG  avg_score_query	avg_scorer0  recent_assessmentrZ  rJ  rK  s	            rY   rA  rA    s   
 
#
#C #((223662JPPRjj&&rww{{:3K3K'LMWWhkhnhnWovvxO-<oq)!I O"((223662JSST^TiTiTnTnTpqwwy.>>	"jj):)J)JKO O3"&7H'I'P'P'R"S
 /"*E $))33CFF3KTTU_UjUjUoUoUqrxxyz{  B+5`` ## 		s   AH HHz/assessment/newGETPOST)methodsc                  `   [         R                  S:X  Ga[   [         R                  (       a  [         R                  " 5       O[         R                  n [
        R                  nU R                  SS5      R                  5       nU R                  SS5      R                  5       nU R                  SS5      R                  5       nU R                  SS5      R                  5       n[        X#U/5      (       d  [        SS05      S	4$ UR                  5       (       d  [        SS
05      S4$ US:X  a  [        R                  X55      nO+US:X  a  [        R                  X55      nO[        SS05      S	4$ SU;   a  [        SUS   05      S	4$ [        UR                   UUUUS   US   S   R#                  5       [$        R&                  " U5      S9n[(        R*                  R-                  U5        U=R.                  S-  sl        [(        R*                  R1                  5         [         R                  (       a  [        UR                   US.5      $ [3        SS5        [5        [7        SUR                   S95      $ [C        S5      $ ! [8         a  n[:        R=                  S[?        U5       35        [(        R*                  RA                  5         [         R                  (       a  [        S[?        U5      05      S4s SnA$ [3        S[?        U5       3S5        [5        [7        S5      5      s SnA$ SnAff = f)zCreate new assessmentrf  project_namert   repository_urlplatformrr   rz   zAll fields are requiredi  z Monthly assessment limit reached  githubgitlabzUnsupported platformr-  r/  r)   )rF  r)   rj  rk  r-  r.  rZ  rL   )assessment_idr   z"Assessment completed successfully!successview_assessment)ro  zError creating assessment:   NzError: new_assessmentznew_assessment.html)"r   methodis_jsonget_jsonformr   rL  r   stripr`  r   can_create_assessmentanalyzerr   r   r   rO  r   r   dumpsrQ  rR  addmonthly_assessments_usedcommitr   r   r	   r   r   rz   r   rollbackr   )	datarL  ri  rq   rk  rr   r   
assessmentr   s	            rY   rs  rs  2  s    ~~@	;)07##%gllD (44L  88NB7==?Lxx 0"5;;=Hxx
B/557HHHWb)//1E9::)BCDcII  5577)KLMsRR 8#"::8KX%"::8K)?@A3FF'!)9:;S@@ $ ,!'!%o6&7?EEG $

7 3J JJNN:& 11Q61JJ%/]]&   
 :IF(9 WXX 011  	;LL6s1vh?@JJ!Q01366Ax('2(8 9::	;sK   C*I< #I< &AI< -I< CI< (I< <
L-A+L(1L-7+L("L-(L-z/assessment/<int:assessment_id>c                 $   [         R                  R                  U 5      nUR                  [        R                  :w  a   [        SS5        [        [        S5      5      $ [        R                  " UR                  5      n[        SUU[        5       S9$ )zView assessment resultszAccess denied.rz   rA  zassessment_results.html)r  r   rm   )r   rM  
get_or_404rF  r   r   r   r	   r   r[  rZ  r   r#   ro  r  r   s      rY   rq  rq  {  s}     !!,,];J !!\%A%AA(,--jj334G4$.!(#<#>@ @r\   z/assessment/listc                      [         R                  R                  [        R                  S9R                  [         R                  R                  5       5      R                  5       n [        SU S9$ )z)List all assessments for the organizationrE  zassessment_list.htmlassessments)
r   rM  rN  r   rF  rV  rW  rX  r`  r   r  s    rY   list_assessmentsr    sU     "",,\=Y=Y,Z"*(:+@+@+E+E+G"H  1{KKr\   z#/api/assessment/<int:assessment_id>c                    [         R                  R                  U 5      nUR                  [        R                  :w  a  [        SS05      S4$ [        R                  " UR                  5      n[        UR                  UR                  UR                  R                  UR                  UR                  UR                  UR                  UR                   R#                  5       US.	5      $ )z API endpoint for assessment datarz   zAccess deniedrl  )	rO  ri  rL  rj  rk  r-  r.  rW  r   )r   rM  r  rF  r   r   r   r[  rZ  rO  r)   rL  rj  rk  r-  r.  rW  r7  r  s      rY   api_assessmentr    s     !!,,];J !!\%A%AA12C77jj334Gmm""//44$33''#11$33 ++557
 
 
r\   z/api/organizations/assessmentsc                     [         R                  n [        R                  R	                  U R
                  S9R                  [        R                  R                  5       5      R                  5       n[        U R                  U Vs/ s HK  nUR
                  UR                  UR                  UR                  UR                  R                  5       S.PMM     snS.5      $ s  snf )z)API endpoint for organization assessmentsrE  )rO  ri  r-  r.  rW  )rL  r  )r   rL  r   rM  rN  rO  rV  rW  rX  r`  r   r)   r-  r.  r7  )rL  r  as      rY   api_org_assessmentsr    s      ,,L"",,\__,M"*(:+@+@+E+E+G"H  $)) !	
 ! dd !!""#"2"2ll446 !	
  	
s   AC 
  c                     [        SSSS9S4$ )N
error.htmlr  zPage not found
error_codeerror_message)r   rz   s    rY   	not_foundr    s    <$''79:=> >r\   rr  c                 X    [         R                  R                  5         [        SSSS9S4$ )Nr  rr  zInternal server errorr  )rQ  rR  r  r   r  s    rY   internal_errorr    s2    JJ<$''>@ADE Er\   __main__Tz0.0.0.0i  )debughostport)Drb   flaskr   r   r   r   r   r   r	   flask_sqlalchemyr
   flask_migrater   flask_loginr   r   r   r   r   osr   r   r~   typingr   r   r   loggingdotenvr   r^   appgetenvr9  rQ  migratebasicConfigINFO	getLoggerr   modelsr   r   r   r   r   authr   billingr    register_blueprintr#   ri   rz  routerC  rA  rs  rq  r  r  r  errorhandlerr  r  app_context
create_allrunr]   r\   rY   <module>r     s   U T T ' ! B B ' 	    " "    Ho99\3QR

< (*		.Bc(d

$ %/4

+ , _
#r
   ',, '			8	$ I H  	#    zj  9X1 X1tv
 v
r  3+ + <a  a> ufo6E2  7E2N ,-@  .@  L  L 01  2, +,  -* #> >
 #E E z		
 
 GG$YTG2 		s   I//
I=