
    Rh<1                        d dl Z d dlmZmZmZmZmZ d dlZd dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d dl m!Z! d dl"Z"d dl#Z#d dl$Z$d dl%Z%d dl&m'Z' d dl(m)Z) d dl*m+Z+ d dl,m-Z-  e j\                  d      Z/dZ0 ed      Z1e1je                  edgddgdg       e1jg                  de!jh                         eejj                        fde6de6defd       Z7e1jq                  de!jh                         edd d!"       ed       ed       ed       ed       ed       ed       ed       ed       eejj                        f
de6de6d#e6d$e6d%e6d&e6d'e6d(e6d)ee6   defd*       Z9e1jg                  d+      de6fd,       Z:e1jg                  d-      de6fd.       Z;e1jg                  d/e!jh                         eejj                        fde6defd0       Z<e1jg                  d1e!jh                         eejj                        fd2e6defd3       Z=e1j}                  d4e!jh                         eejj                        fd2e6defd5       Z?e1jg                  d6e!jh                         eejj                        fd2e6d7e@defd8       ZAe1j                  e      d9ed:efd;       ZCe1j                  e      d:efd<       ZDy)=    N)DependsFastAPIFormRequestHTTPException)datetime)	BaseModel)Optional)load_dotenv)r   status)jsonable_encoder)RequestValidationError)JSONResponseFileResponse)CORSMiddleware)Session)Courses)StormRunner)process_article_celery)AsyncResultAPP_URLz0^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$z(Sandstorm: AI Assisted Content Generator)title*T)allow_originsallow_credentialsallow_methodsallow_headersz/generate-article)response_modeltopicemaildbc                   K   t        j                  d       dt        j                          }|st	        j
                  d      S t        j                  t        |      s,t        t        j                  t        j                  dd      S | st	        j
                  d      S t        |       dkD  rt	        j
                  d	      S t        |       d
k  rt	        j
                  d      S | j                         st	        j
                  d      S t        j                  | |      }t!        d|j"                          t$         d|  }t'        || |j"                  |d|t)        j*                         t)        j*                               } |j,                  |        |j.                           |j0                  |       d|  d}d| d| d}t	        j2                  |||       d{    t4        j6                  j9                  |      j;                         }	t=        |	      }
t        t        j>                  t        j>                  d|
d      S 7 iw)N
    Generate a STORM article and return it as a downloadable IMSCC file.
    COURSE_PREFIX-Email is requiredEmail: Invalid value.r   messagestatus_codecontentTopic is requiredd   4Topic is too long. Maximum length is 100 characters.   3Topic is too short. Minimum length is 5 characters.$Topic contains non-ASCII characters.	Task ID: /download-imscc?topic=
Processing)	course_idr   task_idr    r   course_imscc_url
created_at
updated_atYour topic  is ready to downloadcDear User,<br/><p>Please find the below link to download imscc file.</p><p>Download Link: <a href='' target='_blank'>4</a></p><p></p><br/>Warm Regards,<br/>Answerous TeamNData retrieved successfullyr   r)   data) osgetenvuuiduuid4helpererrorResponserematchEMAIL_REGEXr   r   HTTP_400_BAD_REQUESTlenisasciir   delayprintidr   r   r   utcnowaddcommitrefresh
send_emailschemasCoursesResponsefrom_ormdictr   HTTP_200_OK)r   r    r!   r6   taskdownload_link
new_coursesubjectmail_contentcourse_dataencoded_datas               /var/www/html/sandstorm/storm.pygeneraterd   %   sD    
 IIo./q?I##
 	
 88K'33 552
 	
 ##
 	
 5zC##B
 	
 5zA~##A
 	
 ==?##2
 	
 "''y9D	IdggY
 i5eW=MGG!,!*!*	
J BFF:BIIKBJJzE7"78Gx  zG  yH  HZ  [h  Zi  i]  ^L


E',
777))22:>CCEK#K0L&&((4 
  8s   G$I&I'A*Iz/create-a-course.r0   r.   )
min_length
max_lengthskill_developmenteducation_degreeallocated_timelanguagemode_of_deliverytoneweblinksc
                   K   t        j                  d       dt        j                          }
|st	        j
                  d      S t        j                  t        |      s,t        t        j                  t        j                  dd      S | st	        j
                  d      S t        |       dkD  rt	        j
                  d	      S t        |       d
k  rt	        j
                  d      S | j                         st	        j
                  d      S t        j                  | |
      }t!        d|j"                          t$         d|  }t'        |
| |j"                  ||||||||rt)        j*                  |      ndd|t-        j.                         t-        j.                               } |	j0                  |        |	j2                           |	j4                  |       d|  d}d| d| d}t6        j8                  j;                  |      j=                         }t?        |      }t        t        j@                  t        j@                  d|d      S w)r#   r$   r%   r&   r'   r(   r*   r-   r.   r/   r0   r1   r2   r3   r4   Nr5   )r6   r   r7   r    rg   rh   ri   rj   rk   rl   rm   r   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   )!rC   rD   rE   rF   rG   rH   rI   rJ   rK   r   r   rL   rM   rN   r   rO   rP   rQ   r   r   jsonloadsr   rR   rS   rT   rU   rW   rX   rY   rZ   r   r[   )r   r    rg   rh   ri   rj   rk   rl   rm   r!   r6   r\   r]   r^   r_   r`   ra   rb   s                     rc   createCourserq   p   sK      IIo./q?I##
 	
 88K'33 552
 	
 ##
 	
 5zC##B
 	
 5zA~##A
 	
 ==?##2
 	
 "''y9D	IdggY
 i5eW=MGG 1/+//7tzz(+T!,!*!*
J" BFF:BIIKBJJzE7"78Gx  zG  yH  HZ  [h  Zi  i]  ^L ))22:>CCEK#K0L&&((4 
 s   IIz/download-imsccc                 r    t        |       }|j                         }|j                   d}t        |d|      S )r#   z.imscczapplication/zip)
media_typefilename)r   generate_imsccarticle_titler   )r   runner
imscc_pathrt   s       rc   download_imsccry      sG    
 F&&(J&&'v.H $     z/generate-quizc                    | sddiS t        |       dkD  rddiS t        |       dk  rddiS | j                         sddiS g }	 t        |       }|j                         }|sdd	iS | |d
S # t        $ r}dt        |      icY d}~S d}~ww xY w)z?
    Generate quiz questions based on the article content.
    errorr-   r.   r/   r0   r1   r2   Nz+No questions generated for the given topic.)r   	questions)rM   rN   r   generate_questions_from_article	Exceptionstr)r   r}   rw   es       rc   generate_quizr      s    
 ,--
5zCOPP
5zA~NOO==??@@I!U#::<	 FGG 33  !Q  !s   A( (	B1B=BBz/course-listc                 x    |j                   t              j                  t        j                  | k(        j	                         }|st        dg       S |D cg c]!  }t        j                  j                  |      # }}t        |      }t        t        j                  t        j                  d|d      S c c}w )z!
    Get list of all courses
    zNo courses foundr@   rA   r*   )queryr   filterr    allsuccessResponserW   rX   rY   r   r   r   r[   )r    r!   coursescoursera   rb   s         rc   get_course_listr      s    
 bhhw&&w}}'=>BBDG
 	
 KRR7**33F;RKR#K0L&&((4 
  Ss   &B7z/course/{course_id}r6   c                     |j                   t              j                  t        j                  | k(        j	                         }|st        dg       S t        |j                        }|j                         }|st        d|        S i t        t        j                  j                  |      j                               d|i}t        t         j"                  t         j"                  d|d      S )z)
    Get course details by course_id
    Course not foundz%Article content not found for course course_contentr@   rA   r*   )r   r   r   r6   firstr   r   r   get_article_contentrH   r   rW   rX   rY   rZ   r   r   r[   )r6   r!   r   rw   article_contentresponse_datas         rc   
get_courser     s    
 RXXg%%g&7&79&DEKKMF
 	

 &F002O3I;?
 	

722;;FCHHJ
K/M
 &&((4!
 rz   z/course/delete/{course_id}c                     |j                   t              j                  t        j                  | k(        j	                         }|st        d      S  |j                  |        |j                          t        t        j                  t        j                  dt        j                  j                  |      j                         d      S )z$
    Delete course by course_id
    r   zCourse deleted successfullyrA   r*   )r   r   r   r6   r   rH   deleterT   r   r   r[   rW   rX   rY   rZ   )r6   r!   r   s      rc   delete_courser   0  s    
 RXXg%%g&7&79&DEKKMF
 	
 BIIfBIIK&&((4++44V<AAC
 rz   z$/course/{course_id}/citation/{index}indexc                 t    |j                   t              j                  t        j                  | k(        j	                         }|st        d      S t        |j                        }|j                         }t        j                  ||      }t        t        j                  t        j                  d|d      S )z*
    Get course citation by course_id
    r   r@   rA   r*   )r   r   r   r6   r   rH   r   r   get_url_to_inforG   $construct_citation_dict_from_articler   r   r[   )r6   r   r!   r   rw   r   citation_dicts          rc   get_course_citationr   D  s    
 RXXg%%g&7&79&DEKKMF
 	
 &F,,.O??QVWM &&((4!
 rz   requestexcc                    K   |j                         D cg c]'  }dj                  d |d   D              |d   |d   d) }}t        dd|d   d	   |d   d
   d      S c c}w w)N.c              3   2   K   | ]  }t        |        y w)N)r   ).0locs     rc   	<genexpr>z6custom_validation_exception_handler.<locals>.<genexpr>b  s     ?3c#h?s   r   msgtype)fieldr)   r   i  r   r)   r   )r   r)   r   r*   )errorsjoinr   )r   r   r|   r   s       rc   #custom_validation_exception_handlerr   ^  s      ZZ\ 	 XX?%,??U|&M	
F  ay+AYw'
 s   A%,A $A%c                    K   |j                   dk(  r|j                  dk(  rt        dddd      S t        |j                   |j                   |j                  d      S w)Ni  zNot authenticatedi  zMissing API Tokenr(   r*   )r+   detailr   )r   r   s     rc   custom_http_exception_handlerr   r  s]     
##**0C"C"/BC
 	
 OO??szzB s   AA)ErC   fastapir   r   r   r   r   rI   r   pydanticr	   typingr
   dotenvr   r   fastapi.encodersr   fastapi.exceptionsr   fastapi.responsesr   r   fastapi.middleware.corsr   sqlalchemy.ormr   db_config.databasedatabaser!   db_config.modelsr   db_config.schemasrW   ro   zipfilerE   markdowndependencies.helperrG   dependencies.StormRunnerr   celery_workerr   celery.resultr   rD   r   rK   appadd_middlewaregetrX   get_dbr   rd   postrq   ry   r   r   r   r   r   intr   exception_handlerr   r    rz   rc   <module>r      s   	 A A 	     ) - 5 8 2 "  $ #     $ 0 0 %
"))I
A>?   %%%   	W-D-DE9@9K H# Hc Hw H FHT 
W-D-DEcaC8c!#Y IcI IS	"4j"))$ZZZ Z 	Z
 Z Z Z Z smZ 	Z FZx 	#   	4 4 46 (?(?@.5bii.@ 3 G  A. 	w/F/FG-4RYY-? # 7  H< (9P9PQ07		0B S g  R& 	/@W@WXBI"))BT 3 s   Y2 -.w E[  /& }%	m 	 &	rz   