U
    ؎j*
                    @   s0  U d dl mZ d dlmZ d dlmZmZmZmZ d dl	m
Z
 d dlmZ d dlmZmZmZmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZ d dlmZ d d	lZd d	lZd d	l Z d d
l!m"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, d dl)m-Z- d dl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZkmlZlmmZmmnZnmoZompZpmqZqmrZrmsZsmtZtmuZumvZvmwZwmxZxmyZymzZzm{Z{m|Z|m}Z}m~Z~mZ d dlmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d dl m Z mZ d dlmZ d d	lZd dlmZ d d	lZd dlmZ d dlmZ d d	l$Z$d dlmZ d dl)mZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lZd dlmZ d d	lZd d lmZmZmZ d d!lmZ d d"lmZ d d#lmZmZmZ d d$lmZ d dlmZ d dlmZ d d	lZd d%lmZ d d	lZd d	lZd d	lZd d	lZd dlmZ d dlmZ d d&lmZ d d'l	mZ d d(lmZ d d)lmZ d d*l	m
Z
mZ d d+lmZ d d,lmZ d d-lmZ d d.lmZ d d/lmZ e Zd0Zz6ejejed1ZejseeZeeá W n6 ek
r  Z zed2eeƃ  W 5 d	Z[X Y nX eed3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Zeed=d>d? Zeed=eed=d@dA Zeed=dBdC Zeed=dDdE Zeed=dFdG Zeed=dHdI Zeed=dJdK Zeed=dLdM Zeed=dNdO Zeed=dPdQ Zeed=dRdS Zeed=dTdU Zeed=dVdW Zeed=dXdY Zeed=dZd[ Zeed=d\d] Zeed=d^d_ Zeed=d`da Zeed=dbdc Zeed=ddde Zeed=dfdg Zeed=dhdi Zeed=djdk Zeed=dldm Zeed=dndo Zeed=dpdq Zeed=drds Zeed=dtdu Zeed=dvdw Zeed=dxdy Zeed=dzd{ Zeed=d|d} Zeed=d~d Zeed=dd Zdd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Z eed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Z	eed=dd Z
eed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=ddÄ Zeed=ddń Zeed=ddǄ Zeed=ddɄ Zeed=dd˄ Zeed=dd̈́ Zeed=ddτ Zeed=ddф Zeed=ddӄ Zeed=ddՄ Zeed=ddׄ Zeed=ddل Zeed=ddۄ Zdd݄ Zeed=dd߄ Zeed=dd Zeed=dd Z d fddZ!eed=dd Z"eed=dd Z#eed=dd Z$eed=dd Z%eed=dd Z&eed=dd Z'eed=dd Z(eed=dd Z)dd Z*dd Z+e,dej-Z.d d	lZd d	l/Z/eȐ0dddddd ddddddddd	d
Z1eȐ0dddddddddddddddd
Z2eeȐdddZ3eeȐdddZ4eeȐdd d!Z5eȐd"d#d$Z6d	d%feeȐd&d'd(Z7d	d%feeeȐd)d*d+Z8d dlmZ d d&lmZ d d.lmZ d d,l9m:Z: eed=d-d. Z;eed=d/d0 Z<d d	lZd d	lZd d	l Z d d	l/Z/d d,lmZ d dlmZ d dl'm(Z( d d1l=m>Z> d dl	m
Z
 d dlmZ d d2l?m@Z@ d3d4d5d6d7d8d9d:d;d<d=d>d?d@ZAdAdB ZBdCdD ZCdEdF ZDeeȐdGdHdIZEe,dJZFeeȐdGdKdLZGeeȐdGdMdNZHeeȐddOdPZIeeȐdGdQdRZJeeȐdGdSdTZKeȐdUdVdWZLeȐdUdXdYZMeeȐdZd[d\ZNeeȐdZd]d^ZOeȐdUd_d`ZPdadb ZQeeeȐdcdddeZReeȐdfdgdhZSeȐeTddidjZUeȐeTdkdldmZVeeeȐdndodpZWeeȐdqdrdsZXeed=dtdu ZYeed=dvdw ZZdxdy Z[eed=dzd{ Z\eed=d|d} Z]eed=d~d Z^eed=dd Z_eed=dd Z`eed=dd Zaeed=dd Zbeed=dd Zceed=dd Zdeed=dd Zeeed=dd Zfeed=dd Zgeed=dd Zheed=dd Zieed=dd Zjeed=dd Zkeed=dd Zleed=dd Zmeed=dd Zneed=dd Zoeed=dd Zpeed=dd Zqeed=dd Zreed=dd Zseed=dd Zteed=dd Zueed=dd Zveed=dd Zweed=dd Zxeed=dd Zyeed=dd Zzeed=dd Z{eed=dd Z|eed=dd Z}eed=dd Z~eed=dd Zeed=ddÄ Zeed=dĐdń Zeed=dƐdǄ Zeed=dȐdɄ Zeed=dʐd˄ Zeed=d̐d̈́ Zeed=dΐdτ Zeed=dАdф Zeed=dҐdӄ Zeed=dԐdՄ Zeed=d֐dׄ Zeed=dؐdل Zeed=dڐdۄ Zeed=dܐd݄ Zeed=dސd߄ Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=dd Zeed=d d Zudd Zeed=dd Zeed=dd Zeed=dd Zeed=dd	 Zeed=d
d Zeed=dd Zeed=dd Zeed=dd Zd dlmZmZmZ eed=dd Zeed=dd Zeed=dd Zeed=dd Zdd Zeed=dd Zdd  Zd!d" Zeed=d#d$ Zeed=d%d& Zeed=d'd( Zeed=d)d* Zeed=d+d, Zeed=d-d. Zd/d0 Zeed=d1d2 Zd3d4 Zeed=d5d, Zeed=d6d7 Zeed=d8d9 Zeed=d:d; Zd<d= Zeed=d>d? Zeed=d@dA Zeed=dBdC Zeed=dDdE Zeed=dFdG Zeed=dHdI Zeed=dJdK Zeed=dLdM Zeed=dNdO Zeed=dPdQ Zeed=dRdS Zeed=dTdU Zeed=dVdW Zeed=dXdY ZːdZd[ Z̐d\d] Zeed=d^d_ Zeed=d`da Zϐdbdc ZАddde Zѐdfdg Zeed=dhdi Zeed=djdi ZӐdkdl Zeed=dmdn Zeed=dodp Zeed=dqdr Zeed=dsdt Zeed=dudv Zeed=dwdx Zeed=dydz Zeed=d{d| Zeed=d}d~ Zeed=dd Zސdd Zd d	lZdd Zdd Zdd Zd d	lZd dlmZ dhZdd Zdd Zdd Zdd Zdd Zdd Zedd Zdd ZdZdd Zd	d fddZd	d fddZdfddZeȐeTdddZeȐdddZeȐeeȐdddZedddddddedddddddgZedddddddedddddddgZedddi dedÐdĐdŐdƐdidedȐdɐdʐdƐdidgZd̐d̈́ Zeedΐdτ ZeedАdф ZeedҐdӄ Zd fddZ!eed=dd Z"eed=d֐dׄ Z dؐZeedِdڄ Zd dl mZm Z mZmZ d dܐlmZ d dlmZmZmZmZm	Z	 d dl	m
Z
 d dlmZ d dlmZ d d	lZd d	l
Z
dZdZdZdZdZi Zeeef ed< i Zeee	e f ed< i Zeeef ed< eeeef dddZeeedddZeee eTdddZeeee dddZeeeee e	e dddZeee e	e dddZeee eTdddZeee eTdddZeedddZedUdd Zee edddZee edddZ ee edddZ!eeȐee edd	d
Z"eeeȐee edddZ#eeeeee edddZ$eeeee eTdddZ%eee eTdddZ&eeeef dddZ'eee edddZ(eee dddZ)eee eTdddZ*eeeee eTd d!d"Z+ee ee dd#d$Z,e	e dUd%d&Z-d'ed' d(d)d*Z.ee e	e dd+d,Z/ee eed'  dd-d.Z0d'ee eTd/d0d1Z1eeeeeef  d2d3d4Z2eeeef  dUd5d6Z3ee eeeee eTd7d8d9Z4eeeeee eTd:d;d<Z5e	e dUd=d>Z6eȐeeeTd?d@dAZ7ee eeeTdBdCdDZ8eeee eTdEdFdGZ9eedHdIdJZ:eee eTddKdLZ;eeee eTdMdNdOZ<ee ee ddPdQZ=dRdS Z>d	dTfdUdVZ?dWdX Z@eeeeeee eTdYdZd[ZAeeee eTd\d]d^ZBeeTd_d`daZCeee dbdcddZDeee eTddedfZEeee eTddgdhZFee ee ddidjZGd	feeeee dkdldmZHeee eTddndoZIeeȐdpdqdrZJeeeeȐee edsdtduZKeeeee edvdwdxZLeeeee eddydzZMeee eTdd{d|ZNee ee dd}d~ZOeeee edddZPeeee eTdddZQeeee eTdddZRdd ZSdd ZTedd ZUdd ZVdd ZWdd ZXdd ZYeed=dd ZZeed=dd Z[eed=dd Z\eed=dd Z]dd Z^dd Z_dd Z`dd Zadd Zbeed=dd Zcddedd edddddedd edddddedd edddddedd edddgZdddedd edddddeddedd dddedd edddddeddedd dgZeeeTdddZfedddZgeedddZheeeȐdÜdĐdńZieeȐdƜdǐdȄZjeed=edɐdʄ Zkdːd̄ Zld dlmZ d d$lmZ d dlmZmZ ejmdΐdτ ZndАdф Zoeed=dҐdӄ Zpeed=dԐdՄ Zqeed=d֐dׄ Zreed=dؐdل Zseed=dڐdۄ Ztdܐd݄ Zudސd߄ Zvdd Zwdd Zxd dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dl mZ d dlmZ d dlmZ d dlmZ d d
l!m"Z" ddddddddgZyddddgZzddgZ{d	fddZ|dd Z}d dlmZ d dlmZ d dlmZ d dlmZ dd Z~dd Zdd Zd	fddZdd  Zdd Zdd Zd	fddZdd Zd d	lmZmZ d dl	m
Z
 d dlmZ d d
lmZ d d$lmZ dd Zedgdd Zedgdd Zedgdd Zdd Zedgdd Zeed=dd Zdd Zeed=dd Zd	S (      date)	Paginator)get_object_or_404redirectrenderHttpResponse)JsonResponse)logout)FWindowAvgSumQ)r   Maxr   CaseWhenValueIntegerFieldExpressionWrapperfieldsDateTimeFieldDurationFieldrelativedeltaN)timezone)slugify)ContentFile)Cast)messages)Coalesce)QCourse_Academic	ResourcesCoupon_coursesSection_Test_ResultStudent_AnswersTest_ResultStudy_material_batchesCategory_SubjectsCourse_BatchesCourse_ExamsStudy_MaterialsLecture_attendanceContactUsEnquiriesCoupons	EnquiriesLead_sourseLead_statusLecture_TopicsLecture_batchesLogin_historyMockTestSectionNotifications_batchesOrdersOrderCoursesTestimonialsNotificationsLeadsLead_CommentsLead_FollowupMock_Test_SeriesBannersCourseExamCategoryMediaModuleSectionsSub_SectionsQuestion_BankTopics	Mock_TestFacultyBatch_ManagementStudentsBlogsBlog_categoryOptionExam_MasterExam_SubjectsLive_LectureStudent_ResultVocab_QuestionsFoundation_Videos_NewAdd_On_Courses_Course_Idsmock_sections
mock_examsFoundation_Video_CategoriesExamSyllabusCounselingAttendanceCounselingGroupCounselingGroupStudentsCounselingScheduleZoomKeysAppNotificationsAppNotifications_batchesResourcesRcNotificationRunLogStudentActivityBatchTopicTimingMonthlyLectureCountBatchTimeSlotFacultyDetailsFacultyTimeSlotDaily_speedMath_ScoreDaily_Vocab_ScoreCourseDiscountUserRoleFeatureRolePermissionUserProfileAcademicYearExamAcademicFacultyLeaves)authenticatelogin)login_required)AuthenticationForm)UserRegisterForm)r   )datetime	timedelta)	b64encode)defaultdict)Document)Prefetch)Count)Concat)r   )BytesIO)Image)credentials	messaging
exceptions)shared_task)convert)OuterRefSubqueryExists)transaction)Optional)Inches)r   )require_GET)csrf_exempt)r	   HttpResponseForbidden)require_POST)settings)get_admin_landing_url)WD_ALIGN_PARAGRAPH)get_user_model/admin/loginzfirebase-credentials.jsonzError initializing Firebase: c                 C   s|  t t  }|tdd }|tdd }| jd}t  }tjj|	 |
 |
 dddd }g }d	 }}g }	|d
dD ]}
tjj|
j d }ttjj|ddjddd }|
j d}d}d	 }}|D ]}z4|rtjtj||d|d}t| |d7 }W q tjk
rf } z(|d7 }td|dd  d|  W 5 d}~X Y qX q||7 }||7 }q|tddd }|tddd }| jd}t  }tjj|	 |	 |
 |
 dddd }g }g }	|d
dD ]}
tjj|
j d }ttjj|ddjddd }|
j d}d }|D ]}z4|rtjtj||d|d}t| |d7 }W nJ tjk
r } z(|d7 }td|dd  d|  W 5 d}~X Y nX qN||7 }||7 }||
j|
j|
j|
j t!|||t!|	d! qt"d|# |r*dn|# |# d"|rDdn|# |# d"|	 ||t!|||$ ||d#d$S )%zd
    Public endpoint for cron. No auth/token.
    Sends a push 10 minutes before lecture start.
       minutes   
lecture_id)lacture_datestart_time__gtestart_time__lt
start_timeN   r   facultybatchesZ	batch__inF)Zstudent__indevice_token__isnulldevice_tokenTflatz> lecture begins in 10 mins, start your cameras and be on time.u   Don’t miss ittitlebodynotificationtokenu   🔥 FCM Error for token 
   z...:    7   )hoursr         )lacture_date__gtelacture_date__lter   r   z+ lecture in 24 hours, brush up your basics.z)Be prepared and revise your key concepts.)r   r   r   r   tokenssentfailedZinvalid_pruned)startend)r   r   )oknowwindowZwindow2r   r   r   count	processedqstotals)%r   	localtimer   rx   GETgetrP   objectsfilterr   timeorder_byselect_relatedprefetch_relatedrJ   r   alldistinctlistr4   values_listr   r   MessageNotificationsendfb_exceptionsFirebaseErrorprintappendidr   r   lenr	   	isoformatr   )requestr   Zwindow_start_currentZwindow_end_currentr   Zqs1r   
total_sentZtotal_failedZinvalid_tokenslecstudentsr   r   r   r   r   tmsgewindow_start
window_endr    r   //var/www/html/crackeverytest/admin_app/views.pycron_notify_lecturesX   s      
0
	  
2

r   c                 C   s   | j d}| jdkr| jd}| jd}| jd}t| ||d}|d k	rvt| | t|}|rnt|S tdS t	| dd|d	S nt	| dd
|d	S d S )NnextPOSTusernamepasswordr   r   /No admin module has been assigned to this user.
login.htmlInvalid credentials.)errorr    )
r   r   methodr   rr   rs   r   r   r   r   )r   r   r   r   userlanding_urlr   r   r   admin_login   s    

r   c                 C   s~   | j dkrp| jd}| jd}t| ||d}|d k	r^t| | t|}|rVt|S tdS t| dddiS n
t| dS d S )	Nr   r   r   r   r   r   r   r   )	r   r   r   rr   rs   r   r   r   r   )r   r   r   r   r   r   r   r   login_process   s    

r   c                 C   s
   t | dS )Nzregistration.htmlr   r   r   r   r   registration  s    r   c                 C   s   t |  tdS )Nr   )r
   r   r   r   r   r   admin_logout  s    r   )	login_urlc           	      C   s   t  }tjjdd }tjjdd }tjjdd }tj }tjj	t
ddd }tjj|d	 }tjj|d
d}t| d|||||||dS )NFZorder_courses__isnullTr   statusorder_price)totalr   )r   )follwup_datestudentzdashboard.html)paid_studentsunpaid_students	new_leadstotal_courses
total_saletodays_lecturetodays_followup)r   todayrJ   r   r   r   r;   r@   r7   	aggregater   rP   valuesr=   r   r   )	r   r  r   r   r   r  r  r  r  r   r   r   	dashboard2  s    
r  c                 C   s  t j }tjjddd}| jdd }| jdd }| jdd }| jdd }t	j d}|r|j|d	}|r|j|d}|r|j|d
}|r|j|d}t	j
 }t	jjdd
 }	t	jjdd
 }
| j }|dd  |rd|  nd}| j }|dd  | }|dd  | }d|d< | }d|d< t|d}| jd}||}t| d|||||||||||	|
| | | dS )NActiver   -idnamer   r   	from_dateto_date)Zexam_category_name__icontainscreated_at__date__gteZcreated_at__date__lteInactivepage&r   zexam-category.html)all_categoriesall_batchesr   r  r  r   r  r  section_listtotal_countactive_countinactive_countZall_tab_urlZactive_tab_urlZinactive_tab_url)rC   r   r   rI   r   r   r   r   striprA   r   copypop	urlencoder   get_pager   )r   r  r  r  r   r  r  r  r  r  r  query_paramsr   base_paramsZall_tab_paramsZactive_tab_paramsZinactive_tab_params	paginatorpage_numberpage_objr   r   r   exam_categoryB  sb     





r$  c                 C   s(  t t|d}tjj|ddddd}i }|D ]}|j}|j}|j	}|j
 }	||krni |j|jd||< ||| d krg |j|jd	|| d |< || d | d
 |t|	d q2| D ]L\}}
tdd |
d  D |
d< |
d  D ]\}}t|d
 |d< qqt| d||dS )Nr   r$  sectionsub_sectiontopicdependent_topics)subsectionss_strongs_weakr+  )topics	ss_strongss_weakr.  )r)  r*  c                 s   s   | ]}t |d  V  qdS )r.  N)r   ).0subsection_datar   r   r   	<genexpr>  s    z'exam_category_detail.<locals>.<genexpr>Zrowspanzexam-category-details.html)r$  sections_data)r   rA   rX   r   r   r   r   r'  r(  r)  r*  r   r,  r-  r/  r0  r   r   itemssumr  r   r   )r   r   r$  Zsyllabusr4  entryr'  
subsectionr)  r*  section_datar2  r   r   r   exam_category_detail  sL      



r:  c              
   C   sT  | j dkrF| jd}| jd}z|dkrjtjj|d}|rX|  tdddW S td	d
dW S n|dkrtjj|d}|r|  tdddW S td	ddW S nT|dkrtjj|d}|r|  tdddW S td	ddW S ntd	ddW S W n@ tk
rD } z td	dt	| d W Y S d }~X Y nX td	ddS )Nr   r   typer'  
section_idsuccesszSection deleted successfully.r   r   r   zSection not foundr8  sub_section_idz Subsection deleted successfully.zSubsection not foundr)  topic_idTopic deleted successfully.zTopic not foundzInvalid item typezError: Invalid request method)
r   r   r   rX   r   r   deleter	   	Exceptionstr)r   Zitem_id	item_typer'  r8  r)  r   r   r   r   delete_examitem  s4    .rJ  c              
   C   s  | j dkr| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}| jd
}	| jd}
|dkrtdddS |	dkrtdddS |
dkrtdddS |dkrtdddS |dk rtdddS |dkrtdddS |dkr$tdddS | jdrr|jdkrTtdd|j|jdS tjj	||	|
|||||d}ntjj	||	|
|||||d}|j
}tt|D ]}t||| d}|  qtdddS ntdddS d S )Nr   exam_category_namebatch_idr=  r   imagesection_wise_timersection_switching
calculatormarks_per_questionnegative_marks_per_questionr   r    Please enter exam category name.r?  Please enter marks per question(Please enter negative marks per questionz Please select section wise timerzPlease select section switchingz Please Select calculator allowedPlease select image.   4Please select image size less than or equal to 1 MB.r   r   dataZbyter)rK  rQ  rR  rN  rO  rP  r   rL  category_idr=  r>  !Exam category saved successfully.Something went wrong.)r   r   r   getlistFILESr	   sizerA   r   creater   ranger   r(   save)r   rK  rL  sectionsr   rM  rN  rO  rP  rQ  rR  categoryr\  isubjectr   r   r   add_exam_category  sr    


ri  c                 C   s  | j dkr| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}| jd
}	| jd}
| jd}|dkrtdddS |
dkrtdddS | jdrd|jdkrtdd|j|jdS t||||	|||||
|d
}|jdddd	d
ddddg	d |r<t	j
j|d  |j}|D ]}t	||d}|  qFntt||||	||||
|d	}|rt	j
j|d  |j}|D ]}t	||d}|  q|jddd	d
ddddgd tdddS ntdddS d S )Nr   r   r  rL  r=  rN  rO  rP  rQ  rR  r   rM  r   r   rS  r?  Please select status.rW  rX  rY  )
r   rK  rQ  rR  rN  rO  rP  rM  r   rL  rK  update_fieldsr\  r[  )	r   rK  rQ  rR  rN  rO  rP  r   rL  r>  r]  r^  )r   r   r   r_  r`  r	   ra  rA   rd  r(   r   r   rF  r   )r   r   rK  rL  re  rN  rO  rP  rQ  rR  r   rM  rf  r\  r=  rh  r   r   r   edit_exam_category[  s    
rn  c                 C   s&   | j d}t|  tdddS )Nr   r>  z#Exam category deleted successfully.r?  )r   r   rA   soft_deleter	   r   r   r   r   r   delete_exam_category  s    rq  c                 C   sF  | j d}| j d}| j d}| j d}| j d}| j d}d}tj d}|rx|j|d	}|d
 | }|r|j|d}|d | }|r|j|d}|d | }|r|j|d}|d | }|r|j|d}|d | }|r|j|d}|d | }t|d}	| j d}
|	|
}t| d|||
||||||d	S )Nfaculty_namefaculty_emailfaculty_contactr   r  r  r   r
  )Zfaculty_name__icontainsz&faculty_name=Zemail__icontainsz&faculty_email=)Zcontact__icontainsz&faculty_contact=r   &status=created_at__gte&from_date=created_at__lte	&to_date=r   r  zfaculty_module.html)	all_facultiesr   r  rr  r   rs  rt  r  r  )	r   r   rH   r   r   r   r   r  r   )r   rr  rs  rt  r   r  r  r   r}  r!  r"  r#  r   r   r   faculty_module  sL    


      r~  c           
   
   C   sJ  | j dkr8| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}|d
krtdddS |d
krtdddS |d
krtdddS |d
krtdddS |d
krtdddS |d
krtdddS |d
krtdddS t||||||||d}	|	  tdddS ntdddS d S )Nr   rr  emailr   contact
experiencedate_of_birthlecture_per_weekr   r   r   Please enter faculty name.r?  Please enter faculty email.Please enter password.Please enter contact number.Please enter experience.Please enter date_of_birth.rj  )rr  r  r   r  r  r  r  r   r>  zFaculty added successfully.r^  r   r   r   r	   rH   rd  )
r   rr  r  r   r  r  r  r  r   r   r   r   r   add_faculty  sH    
r  c                 C   sn  | j dkr\| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}| jd
}	|dkrtdddS |dkrtdddS |dkrtdddS |dkrtdddS |dkrtdddS |dk rtdddS |	dkrtdddS t||||||||	|d	}
|
jddddddd
dgd tdddS ntdddS d S )Nr   r   r  r  r  r   r  r  dobr   r   r   r  r?  r  r  r  r  r  rj  )	r   rr  r  r   r  r  r  r   r  rr  r  rk  r>  zFaculty updated successfully.r^  r  )r   r   rr  r  r  r   r  r  r  r   r   r   r   r   edit_faculty  sL    

r  c                 C   s&   | j d}t|  tdddS )Nr   r>  zfaculty deleted successfully.r?  )r   r   rH   ro  r	   rp  r   r   r   delete_faculty_by_IdJ  s    r  c           
   
   C   s   | j d}| j d}| j d}| j d}d}tj d}|r`|j|d}|d | }|r||j|d	}|d
 | }|r|j|d}|d | }|r|j|d}|d | }t|d}| j d}||}	t| d|	|||||dS )Nr  r   r  r  r   r
  )Zsection_name__icontains&name=r   rv  rw  ry  rz  r|  r   r  zsection.html)all_sectionr  r   r  r  r  )	r   r   rC   r   r   r   r   r  r   )
r   r  r   r  r  r   r  r!  r"  r#  r   r   r   r'  S  s,    

r'  c                 C   s   | j dkr| jd}| jd}| jd}|dkrDtdddS |dkrZtdd	dS |dkrptdd
dS t|||d}|  tdddS ntdddS d S )Nr   section_namer   display_orderr   r   Please enter section name.r?  Please enter display order.rj  )r  r  r   r>  zSection created successfully.r^  r   r   r   r	   rC   rd  )r   r  r   r  r'  r   r   r   add_sectionu  s$    
r  c                 C   s   | j dkr| jd}| jd}| jd}| jd}|dkrPtddd	S |dkrftdd
d	S |dkr|tddd	S t||||d}|jdddgd tddd	S ntddd	S d S )Nr   r   r  r   r  r   r   r  r?  zPlease enter Display order.rj  )r   r  r  r   r  rk  r>  zSection updated successfully.r^  r  )r   r   r  r   r  r'  r   r   r   edit_section  s(    
r  c                 C   s&   | j d}t|  tdddS Nr   r>  zsection deleted successfully.r?  )r   r   rC   ro  r	   rp  r   r   r   delete_section_by_Id  s    r  c                 C   s  | j dd }| j dd }| j dd }| j dd }| j dd }tj }tj }tj dd}|r|j	|d	}|r|j	|d
}|r|j	|d}|r|j	|d}|r|j	|d}tj
 }	tjj	dd
 }
tjj	dd
 }| j  }|dd  |r&d|  nd}| j  }|dd  | }|dd  | }d|d< | }d|d< t|d}| j d}||}t| d|||||||||||	|
|| | | dS )N
batch_namer   course_namer   r	  r  r  r
  )Zbatch_name__icontains)Zcouse_name__icontainsr   r  r  r  r  r  r   zbatch-management.html)exam_categoriesr  r   all_coursesr  r  r   r  r  r  r  r  r  Zall_pill_urlZactive_pill_urlZinactive_pill_url)r   r   r  r@   r   r   rA   rI   r   r   r   r  r  r  r   r  r   )r   r  r  r   r  r  r  r  r  r  r  r  r  r   r   Zall_pill_paramsZactive_pill_paramsZinactive_pill_paramsr!  r"  r#  r   r   r   batch_managements  sj    






r  c           
      C   s   | j dkr| jd}| jd}| jd}| jd}| jd}| jd}| jd}|sptd	d
dS |std	ddS t||||||d}|  |rtjj|d}	|j	
|	 tdddS td	ddS )Nr   r  
start_dateend_dater  exam_category_idr   merged_batchesr   Please enter batch name.r?  rj  )r  r  r   r  r  r  id__inr>  zCreated batch successfully.r^  )r   r   r   r_  r	   rI   rd  r   r   r  set)
r   r  r  r  r  r  r   merged_batch_idsbatchr  r   r   r   	add_batch  s4    
r  c              
   C   s  | j dkr| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}|d
krtdddS |d
krtdddS t|||||||d}	|	jddddddgd |rtjj|d}
|	j	
|
 z|r tt|d nd }|rtt|d nd }tjj|	dd}|D ]J}|j}|r:|jsVq:|rh|j|k sz|r:|j|kr:|  q:W n2 tk
r } ztd|  W 5 d }~X Y nX tdddS ntdddS d S )Nr   r   r  r  r  r  r  r   r  r   r   r  r?  rj  )r   r  r  r   r  r  r  r  rk  r  %Y-%m-%d)r   lectureu#   ⚠️ Error cleaning up lectures: r>  zBatch updated successfully.r^  )r   r   r   r_  r	   rI   rd  r   r   r  r  rw   strptimerH  r   r3   r   r  r   rF  rG  r   )r   r   r  r  r  r  r  r   r  r  r  Zstart_date_objZend_date_objZinvalid_linkslinkr  r   r   r   r   
edit_batch-  sP    
$ r  c                 C   s&   | j d}t|  tdddS r  )r   r   rI   ro  r	   rp  r   r   r   delete_batch_by_Ido  s    r  c                 C   s*   | j d}tjj|d}t| dd|iS )Nr'  r<  zselect_sub_section.htmlr(  )r   r   rD   r   r   r   )r   r=  r(  r   r   r   section_selctx  s    r  c                 C   s*   | j d}tjj|d}t| dd|iS )Nr(  r@  zselect_topic.htmlr)  r   r   rF   r   r   r   )r   rA  r)  r   r   r   subsection_select~  s    r  c                 C   s&  t j }| jd}| jd}| jd}| jd}| jd}d}tj d}|rv|j|d}|d	 | }|r|j|d
}|d | }|r|j|d}|d | }|r|j|d}|d | }|r|j|d}|d | }t|d}	| jd}
|		|
}t
| d||||
|||||d	S )Nr  r=  r   r  r  r   r
  )Zsub_section_name__icontainsr  r<  	&section=r   rv  rw  ry  rz  r|  r   r  zsub-section.html)	Sub_Sections_listr   r  r  r  r'  r   r  r  )rC   r   r   r   r   rD   r   r   r   r  r   )r   r  r  r'  r   r  r  r   r  r!  r"  r#  r   r   r   r(    s6    


r(  c                 C   s   | j dkr| jd}| jd}| jd}| jd}|dkrPtddd	S |dkrftdd
d	S |dkr|tddd	S t||||d}|  tddd	S ntddd	S d S )Nr   r=  sub_section_namer  r   r   r   Please enter sub section name.r?  r  rj  )r=  r  r  r   r>  zSub Section saved successfully.r^  )r   r   r   r	   rD   rd  )r   r  r  r  r   r'  r   r   r   add_sub_section  s(    
r  c                 C   s*  | j dkr| jd}| jd}| jd}| jd}| jd}|dkr^tdd	d
S |dkrttddd
S |dkrtddd
S |dkrtddd
S t|||||d}|jddddgd tjj|dj	|d t
jj|dj	|d tjj|dj	|d tddd
S ntddd
S d S )Nr   r   r=  r  r  r   r   r   zid is empty please pass the id r?  r  r  rj  )r   r  r=  r  r   rk  r@  r<  r>  zSub-section saved successfully.r^  )r   r   r   r	   rD   rd  rF   r   r   updaterE   rX   )r   r   r'  r  r  r   r(  r   r   r   edit_sub_section  s6    	r  c                 C   s&   | j d}t|  tdddS r  )r   r   rD   ro  r	   rp  r   r   r   delete_sub_section_by_Id  s    r  c                 C   s^  t j }tj }| jd}| jd}| jd}| jd}| jd}| jd}d}	tj d}
|r|
j|d	}
|	d
 | }	|r|
j|d}
|	d | }	|r|
j|d}
|	d | }	|r|
j|d}
|	d | }	|r|
j|d}
|	d | }	|r|
j|d}
|	d | }	t	|
d}| jd}|
|}t| d||	|||||||||dS )Nr  r=  rA  r   r  r  r   r
  )Ztopic_name__icontainsr  r<  &section_id=r@  &sub_section_id=r   rv  rw  ry  rz  r|  r   r  zTopic-list.html)
Topic_listr   r  r  r  r  r'  r(  r   r  r  )rC   r   r   rD   r   r   rF   r   r   r   r  r   )r   r  r  r  r'  r(  r   r  r  r   r  r!  r"  r#  r   r   r   
topic_list  s@    



r  c                 C   s   | j dkr| jd}| jd}| jd}| jd}| jd}|dkr\tdd	d
S |dkrrtddd
S |dkrtddd
S |dkrtddd
S |dkrtddd
S t|||||d}|  tddd
S ntddd
S d S )Nr   r'  r(  
topic_namer  r   r   r   zPlease select section.r?  zPlease select sub section.Please enter topic name.r  rj  )r=  rA  r  r  r   r>  zTopic saved successfully.r^  )r   r   r   r	   rF   rd  )r   r'  r(  r  r  r   r   r   r   	add_topic  s4    
	r  c                 C   s   | j dkr| jd}| jd}| jd}| jd}| jd}| jd}|dkrhtd	d
dS |dkr~td	ddS t||||||d}|jddddddgd tjj|dj	||d t
jj|dj	||d tdddS ntd	ddS d S )Nr   rC  r  r  tnamed_orderedit_statusr   r   r  r?  rj  )r   r=  rA  r  r  r   r=  rA  r  r  r   rk  rB  )r=  rA  r>  zTopic Updated successfully.r^  )r   r   r   r	   rF   rd  rE   r   r   r  rX   )r   r   r'  r(  r  r  r   r)  r   r   r   
edit_topicD  s0    

r  c                 C   s&   | j d}t|  tdddS )Nr   r>  rD  r?  )r   r   rF   ro  r	   rp  r   r   r   delete_topich  s    r  c                 C   s   t jjdd}tj }tj }tj }t jd}tjd}tjd}| j	
d}| j	
d}	| j	
d}
| j	
d	}| j	
d
}| j	
d}d}tjd d}|r|j|d}|d | }|r|j|d}|d | }|r|j|d}|d | }|	r&|j|	d}|d |	 }|
rD|j|
d}|d |
 }|r|dkrb|j|d}n$|dkrz|j|d}n|j|d}|d | }t  }|j|ddd}|j|d d!d}t|d"}| j	
d#}||}tj }t| d$||||||||||||||	|
||d%S )&Nr	  r   r  	topics_idrr  r   r  r  r'  r  r   r   r   r
  title__icontainsz&title=r<  r  )
faculty_idz	&faculty=)r   ry  )r   r|  open_for_all)lecture_typer  )Zlecture_batches__batches_id&batch=r   r   )lacture_date__lt-lacture_dater   r  zlive_lecture.html)upcoming_lecturesold_lecturesr   
batch_listtopics_listfaculty_listr   r  r)  r   r  r'  r   r  r  r  	zoom_keys)rI   r   r   rF   r   rH   rC   r   r2   r   r   rP   r   r   r   r   r   r   r  r]   r   )r   r  r  r  r  r  r)  r   r   r  r  r'  r   all_lecturesr  r  r  Zpaginator_oldZpage_number_oldZpage_obj_oldr  r   r   r   live_Lecturess  s~    







              r  c           !      C   s:  | j dkr(| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}| jd
}	| jd}
| jd}| jd}|dkrtdddS |dkrtdddS |dkrtdddS |dk rtdddS |dkrtdddS |dkr&tdddS |	dkr>tdddS |
dkrVtdddS t|	 d|
 d}| }t	d}|
t|	 d|
 d}|
t|	 d| d}||kr|tdd7 }tdt||  d }|d}d}d}g }|}|rtjj|d  }t|j|j|j}d!}t| jd"d}d#| d$d%}|d&||dd'd(d)d*d+}tjd,| d-||d.}|jd/krtd| dS | }|d0 }|d1d}|d2 }tjj|||||t||||||	|
|d3}|j}|D ]}t ||d4} | !  qtd5d6dS ntdd7dS d S )8Nr   urlr   r  r  r'  r)  r   
lacture_idr   r   end_timezoom_key_idr   r   Please enter the title .r?  zPlease  enter the url zPlease select lecture type Please select batch.Please select subject.Please select faculty.Please select lecture datePlease select start time %Y-%m-%d %H:%MAsia/Kolkatar   days<   %Y-%m-%dT%H:%M:%Sr%  medurationBearer application/jsonAuthorizationContent-Type   123456TFZjoin_before_hostZwaiting_roomr)  r;  r   r  r   r   r   https://api.zoom.us/v2/users/	/meetingsheadersjson   r   r   join_url)r   r  r  
meeting_idr   meeting_datar  r=  rC  r  r   r   r  r   
batches_idr>  z&live lecture info  saved successfully.r^  )"r   r   r   r_  r	   rw   r  r   pytzr   localizerx   maxinttotal_secondsstrftimer]   r   r   firstget_zoom_access_token
account_id	client_idclient_secretrequestspoststatus_coder  rP   rb  dumpsr   r3   rd  )!r   r  r   r  r   r'  r)  r   r  r   r   r  r  dtstart_time_isotzstart_dt_localend_dt_localr  start_time_iso_localr  r   meetingzoomkeyaccess_tokenzoom_user_idr  payloadreslivelecturer   rL  lecturebatchr   r   r   addLiveLecture  s    









r  c           %      C   s  | j dkr| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}| jd}	| jd
}
| jd}| jd}| jd}|dkrtdddS |dkrtdddS |dkrtdddS |dkrtdddS |dkrtdddS |
dkr2tdddS |dkrJtdddS tt tt ddd}|| jd}|| jd}t|
 d| d}|	 }t
d}|t|
 d| d}|t|
 d| d}||kr|tdd7 }tdt||  d  }|d!}tjj|d"}|j}d#}|}|j}g }|r8tjj|d" }t|j|j|j}d$| d%d&}|d'||dd(d)d*d+d,}tjd-| ||d.} | jd/krztd0d1dW S  t k
r   td0d1d Y S X tjd-| |d2}!|!jd3krtd0d1dS |!! }t!"|}|d4 }t|||||||||
||d5}"|"j#ddd6d7d
ddd8d9d:g
d; |rt$jj|d<%  t&jj|d<%  |D ]}#t$||#d=}$|$#  qtd0d>dS ntdd?dS d S )@Nr   r   r  r   r  r  r'  r)  r   r   r   r  r  r   r   r  r?  zPlease enter lecture type r  r  r  r  r  )r   returnc                 S   s"   | dkrdS |   } tdd| S )z
                If time string is 'HH:MM:SS' with seconds == '00', return 'HH:MM'.
                Leaves other inputs unchanged. Trims surrounding whitespace.
                Nz^([01]?\d|2[0-3]):([0-5]\d):00$z\1:\2)r  resubr   r   r   r   trim_trailing_zero_seconds  s    z3editLiveLecture.<locals>.trim_trailing_zero_secondsr  r  r  r   r  r  r  r%  r  r  r  r  r  r  TFr  r   https://api.zoom.us/v2/meetings/r  )      r>  zFailed to update past lecture.r  r$  r  )r   r   r  r  r  r=  rC  r  r   r   r  r=  r  rC  r  r  rk  r   r  z%Lecture Details Updated successfully.r^  )'r   r   r   r_  r	   r   rH  rw   r  r   r  r   r   rx   r  r  r  r  rP   r   r  r  r]   r   r  r  r  r  r	  r
  patchr  rG  r  r  rd  r3   rF  r2   )%r   r   r  r   r  r   r'  r)  r   Zlacture_urlr   r   r  r  r!  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  Zupdate_payload
update_resZ
detail_resr  rL  r  r   r   r   editLiveLectureW  s    








 	r)  c                 C   s   | j d}tjj|d}|j}|s>t|  tdddS tjj|j	d
 }t|j|j|j}d| dd}tjd	| |d
}t|  tdddS )Nr   r%  r>  zlecture deleted successfully.r?  r  r  r  r"  r%  )r   r   rP   r   r  ro  r	   r]   r   r  r  r  r  r  r	  r
  rF  )r   r   r  r  r  r  r  r(  r   r   r   deleteLiveLecturebyId  s"    r*  c                 C   s   | j dkr| jd}| jd}| jdd}|sBtdddS |sTtdd	dS d
d }||d}z.tjj|d}||_||_|j	ddgd W n$ tj
k
r   tddd Y S X tdddS tdddS d S )Nr   r   video_descriptionzvideo-lectureFr   zPlease enter video description.r?  z"Please select video file to uploadc                 S   sL   t j| jd }| dt jd d  dt 	d | }|| _| S Nr   _   %Y%m%d%H%M%S
ospathsplitextr  uuiduuid4hexr   r   r  fileprefixextZunique_namer   r   r   get_unique_filenameC  s    0z3uploadVideobyLectureId.<locals>.get_unique_filenamevideor%  videosrk  zLecture not found.r>  zVideo uploaded successfully.r^  )r   r   r   r`  r	   rP   r   r+  r=  rd  DoesNotExist)r   r   r+  r=  r;  r  r   r   r   uploadVideobyLectureId1  s&    

r?  c                 C   s   | j dkr| jd}| jd}|r*|s:tddiddS zpdd	 }||d
}tjj|d}|j}|s||_|j	d
gd tddiW S tjj
|dj|d tddiW S  tjk
r   tddidd Y S X tddiddS )Nr   quidr<  r   zMissing data  r   c                 S   sL   t j| jd }| dt jd d  dt 	d | }|| _| S r,  r0  r7  r   r   r   r;  d  s    0z?upload_question_explaination_video.<locals>.get_unique_filenameexplanation_videor%  rk  r>  T)tagrB  zQuestion not found  Invalid request)r   r   r   r`  r	   rE   r   rC  rB  rd  r   r  r>  )r   r@  r<  r;  questionZ	tag_valuer   r   r   "upload_question_explaination_videoZ  s&    

rH  c                 C   s*   | j d}tjj|d}t| dd|iS )Nr'  r<  zselect_section_topic.htmlr.  r  )r   r=  r.  r   r   r   Select_section_topic  s    rI  c                 C   s2  t j }tj }| jd}| jd}| jd}| jd}| jd}d}tj d}	|r|	j|d}	|d	 | }|r|	j|d
}	|d | }|r|	j|d}	|d | }|r|	j|d}	|d | }|r|	j|d}	|d | }t	|	d}
| jd}|

|}t| d||||||||||d
S )Nr  r\  r   r  r  r   r
  )Zexam_name__icontainsr  r  z
&category=r   rv  rw  ry  rz  r|  r   r  zexam-master.html)
	all_examsr   r  r  r  r  rf  r   r  r  )rC   r   r   rA   r   r   rN   r   r   r   r  r   )r   r  r  r  rf  r   r  r  r   rK  r!  r"  r#  r   r   r   
examMaster  s8    



rL  c           	   	   C   sN  | j dkr<| jd}| jd}| jd}| jd}| jd}| jdd}| jd	d}|d
krztdddS |d
krtdddS |d
krtdddS |d
krtdddS |dkrtdddS |dk rtdddS |d
krtdddS |dkrR|dkrR|jdkr8tdd|j|jdS tjj||||||d}n|dkr|dkr|jdkrtdd|j|jdS tjj||||||d}n|dkr|dkr|jdkrtdd|j|jdS |jdkrtdd|j|jdS tjj|||||||d}ntjj|||||d}tdddS ntdddS d S )Nr   r\  	exam_namerQ  rR  r   rM  Fbannerr   r   Please enter exam name.r?  zPlease select categoryrT  rU  rV  Please select banner.rj  rW  rX  rY  )r  rM  rM  rQ  rR  r   ;Please select banner image size less than or equal to 1 MB.)r  rM  rN  rQ  rR  r   )r  rM  rN  rM  rQ  rR  r   )r  rM  rQ  rR  r   r>  Exam saved successfully.r^  )	r   r   r   r`  r	   ra  rN   r   rb  )	r   r\  rM  rQ  rR  r   rM  rN  rf  r   r   r   addExam  s    


rS  c           
   
   C   s  | j dkr| jd}| jd}| jd}| jd}| jd}| jd}| jdd	}| jd
d	}|dkrtdddS |dkrtdddS |dkrtdddS |dkrtdddS |dkrtdddS |dk rtdddS |dkrtdddS |d	krt|d	krt|jdkrDtdd|j|jdS t|||||||d}	|	jdddddgd n|d	kr|d	kr|jdkrtdd|j|jdS t|||||||d}	|	jdd
dddgd n|d	krb|d	krb|jdkrtdd|j|jdS |jdkr0tdd|j|jdS t||||||||d}	|	jdd
ddddgd n(t||||||d}	|	jddddgd tdddS tdd dS d S )!Nr   r   r\  rM  rQ  rR  r   rM  FrN  r   r   rO  r?  Please select exam categoryrT  rU  rV  rP  rj  rW  rX  rY  )r   r  rM  rM  rQ  rR  r   rk  rQ  )r   r  rM  rN  rQ  rR  r   )r   r  rM  rM  rN  rQ  rR  r   )r   r  rM  rQ  rR  r   r>  rR  r^  )r   r   r   r`  r	   ra  rN   rd  )
r   r   r\  rM  rQ  rR  r   rM  rN  examr   r   r   editExam  s    




rV  c                 C   s&   | j d}t|  tdddS )Nr   r>  zExam deleted successfully.r?  )r   r   rN   ro  r	   rp  r   r   r   deleteExamByIdf  s    rW  c                 C   sD   | j d}| j d}|D ]}t||d}|  qtdddS )Nr=  r   )exam_idr=  r>  zsubject added successfully.r?  )r   r_  r   rO   rd  r	   )r   r=  r   r'  rh  r   r   r   
AddSubjectm  s    
rY  c           
      C   s   | j d}| j d}| j d}| j d}d}tj d}|r`|j|d}|d | }|r||j|d	}|d
 | }|r|j|d}|d | }|r|j|d}|d | }t|d}| j d}||}	t| d|	||||||dS )N
blog_titler   r  r  r   r
  )Zcategory_name__icontainsz&category_name=r   rv  rw  ry  rz  r|  r   r  zblog_category.html)blog_category_listr   r  category_namer   r  r  )	r   r   rL   r   r   r   r   r  r   )
r   r\  r   r  r  r   blog_categoryr!  r"  r#  r   r   r   r]    s,    

r]  c                 C   s:  | j dkr(| jd}| jd}| jd}| jd}| jdd}| jd}|d	krltd
ddS |dkrtd
ddS |d	krtd
ddS |d	krtd
ddS |d	krtd
ddS |d	krtd
ddS |jdk rtd
d|j|jdS t||||||d}|  tdddS ntd
ddS d S )Nr   Blog_category_name
meta_titlemeta_discriptionslugrM  Fr   r   r    Please enter blog category name.r?  Please select blog image.Please enter meta title.Please enter meta discription.Please enter slug.rj  rW  rX  rY  )r\  r_  r`  ra  blog_category_imager   r>  z$Blog Category created  successfully.r^  r   r   r   r`  r	   ra  rL   rd  )r   r^  r_  r`  ra  
blog_imager   blogr   r   r   add_blog_category  s@    
rk  c           	   	   C   s  | j dkr~| jd}| jd}| jd}| jd}| jd}| jd}| jd}|d	krvtd
ddS |d	krtd
ddS |d	krtd
ddS |d	krtd
ddS |d	krtd
ddS |d	krtd
ddS | jdrD|jdkrtd
d|j|jdS t|||||||d}|jddddddgd n*t||||||d}|jdddddgd tdddS ntd
ddS d S )Nr   r   Zblog_category_namer_  r`  ra  ri  r   r   r   rb  r?  zPlease enter Meta title.zPlease enter meta description.rf  rV  rj  rW  rX  rY  )r   r\  r_  r`  ra  rg  r   r\  rg  rk  )r   r\  r_  r`  ra  r   r>  z#Blog category updated successfully.r^  rh  )	r   r   r^  r_  r`  ra  ri  r   r  r   r   r   edit_blog_category  sX    	rl  c                 C   s&   | j d}t|  tdddS )Nr   r>  z#Blog Category deleted successfully.r?  )r   r   rL   ro  r	   rp  r   r   r   delete_blog_category
	  s    rm  c                 C   s   t j }| jd}| jd}| jd}| jd}d}tj d}|rj|j|d}|d | }|r|j|d	}|d
 | }|r|j|d}|d | }|r|j|d}|d | }t|d}| jd}	|	|	}
t
| d|
|||	||||dS )NrZ  blog_statusr  r  r   r
  )Zblog_title__icontainsz&blog_title=)rn  z&blog_status=rw  ry  rz  r|  r   r  zblogs_list.html)	all_blogsr   r]  r  rZ  rn  r  r  )rL   r   r   r   r   rK   r   r   r   r  r   )r   r]  rZ  rn  r  r  r   ro  r!  r"  r#  r   r   r   
blogs_list	  s.    


rp  c           
   
   C   sl  | j dkrZ| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}|d
krtdddS |d
krtdddS |d
krtdddS |d
krtdddS |d
krtdddS |d
krtdddS |d
krtdddS |jdkr*tdd|j|jdS t||||||||d}	|	  tdddS ntdddS d S )Nr   r]  rZ  blog_discriptionr_  r`  ra  ri  r   r   r   Please Select blog category.r?  Please enter blog title.rd  re  rf  rc  rj  rW  rX  rY  )r\  rZ  rq  r_  r`  ra  ri  rn  r>  Blog post successfully.r^  )r   r   r   r`  r	   ra  rK   rd  )
r   r]  rZ  rq  r_  r`  ra  ri  r   rj  r   r   r   	add_blogs7	  sL    
ru  c                 C   s  | j dkr| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}| jd
}	|dkrtdddS |dkrtdddS |dkrtdddS |dkrtdddS |dkrtdddS |dk rtdddS |	dkrtdddS t|||||||||	d	}
d	| jkr||jdkr^tdd|j|jdS |
jddddddd	dgd n|
jdddddddgd tdddS ntdddS d S )Nr   blog_idr]  rZ  rq  r_  r`  ra  ri  r   r   r   rr  r?  rs  rd  re  rf  rc  rj  )	r   r\  rZ  rq  r_  r`  ra  ri  rn  rW  rX  rY  r\  rn  rk  r>  Blog post updated successfully.r^  )r   r   r   r`  r	   rK   ra  rd  )r   rv  r]  rZ  rq  r_  r`  ra  ri  r   r  r   r   r   
edit_blogsl	  sT    

rx  c                 C   s.   | j d}t| t|  tdddS Nr   r>  zBlog post deleted successfully.r?  )r   r   r   rK   ro  r	   rp  r   r   r   delete_blog	  s    rz  c                 C   sF   t j }tj }t|d}| jd}||}t| d||dS )Nr   r  zbanner.html)
all_bannerr  )	rC   r   r   r?   r   r   r   r  r   )r   r  r{  r!  r"  r#  r   r   r   banners	  s    



r|  c                 C   s   | j dkr| jd}| jd}| jd}| jd}|dkrZtdd|jdd	S |dkrptdd
dS |dkrtdddS |dkrtdddS |jdkrtdd|j|jdS t||||d}|  tdd|jd	S tdddS d S )Nr   rM  positionr   redirect_urlr   r   rP  )r   r   rZ  zPlease select banner positionr?  Please enter Redirect url.rj  rW  <Please select banner banner size less than or equal to 1 MB.rY  )banner_imager}  r~  r   r>  zBanner saved successfully.r^  )r   r`  r   r   r	   ra  r?   rd  )r   r  r}  r   r~  rN  r   r   r   
add_banner	  s0    

r  c                 C   s8  | j dkr&| jd}| jd}| jd}| jd}| jd}|dkr^tdd	d
S |dkrttddd
S |dkrtddd
S |dkrtddd
S | jdr|jdkrtdd|j|jdS t|||||d}|jddddgd nt||||d}|jdddgd tddd
S ntddd
S d S )Nr   r   rM  r}  r   r~  r   r   rP  r?  zPlease select banner position.r  rj  rW  r  rY  )r   r  r}  r~  r   r  rk  )r   r}  r~  r   r>  zbanner saved successfully.r^  )r   r   r   r`  r	   ra  r?   rd  )r   r   r  r}  r   r~  rN  r   r   r   edit_banner	  sD    

	r  c                 C   s&   | j d}t|  tdddS )Nr   r>  zbanner deleted successfully.r?  )r   r   r?   ro  r	   rp  r   r   r   delete_banner
  s    r  c           
      C   s  t jjdd}| jd}| jd}| jd}d}tj d}|r|dkrl|j|d	}|d
 | }n:|dkr|j|d	}|d
 | }n|j|d}|d
 | }|r|j|d}|d | }|r|j|d}|d | }t|d}| jd}||}	t	| d|	||||||dS )Nr	  r   r  r  r  r   r
  r  notification_typer  r  )Z!notifications_batches__batches_idrw  ry  rz  r|  r   r  znotification.html)all_notificationr   r  r  r  r  r  )
rI   r   r   r   r   r:   r   r   r  r   )
r   r  r  r  r  r   r  r!  r"  r#  r   r   r   r   
  s2    

r   c                 C   s   | j dkr| jd}| jd}| jd}| jd}|dkrPtddd	S |dkrftdd
d	S t|||d}|  |j}|D ]}t||d}|  qtddd	S ntddd	S d S )Nr   messager  r  r~  r   r   Please enter Message.r?  Please enter redirect url.r  r  r~  Notification_idr  r>  z"Notifcation  created successfully.r^  )	r   r   r   r_  r	   r:   rd  r   r6   )r   r  r   r  r~  r   rL  r  r   r   r   add_notificationA
  s0    

r  c           	      C   s   | j dkr| jd}| jd}| jd}| jd}| jd}|dkr\tdd	d
S |dkrrtddd
S t||||d}|jdddgd tjj	|d
  |D ]}t||d}|  qtddd
S ntddd
S d S )Nr   r   r  r  r  r~  r   r   r  r?  r  )r   r  r  r~  rk  )r  r  r>  z"Notifcation  updated successfully.r^  )r   r   r   r_  r	   r:   rd  r6   r   r   ro  )	r   r   r  r   r  r~  r   rL  r  r   r   r   edit_notificationi
  s4    

r  c                 C   sB   | j dkr0| jd}t|  tdddS tdddS d S )Nr   r   r>  z"Notification deleted successfully.r?  r   r^  )r   r   r   r:   ro  r	   rp  r   r   r   delete_notification
  s
    
r  c                 C   s  | j d}| j d}| j d}| j d}| j d}d}tj d}|rl|j|d}|d	 | }|r|j|d
}|d | }|r|j|d}|d | }|r|j|d}|d | }|r|j|d}|d | }t|d}| j d}	||	}
t| d|
|||||	||dS )Nr  courser   r  r  r   r
  Zname__icontainsr  r  &course=r   rv  rw  ry  rz  r|  r   r  ztestimonial.html)all_testimonialr   r  r  r   r  r  r  )	r   r   r9   r   r   r   r   r  r   )r   r  r  r   r  r  r   r  r!  r"  r#  r   r   r   testimonial
  s4    

r  c                 C   s  | j dkr| jd}| jd}| jd}| jd}| jd}|dkr^tdd	d
S |dkrttddd
S |dkrtddd
S |dkrtddd
S | jdr|jdkrtdd|j|jdS tjj|||||d}ntjj||||d}tddd
S ntddd
S d S )Nr   r  r  rM  reviewr   r   r   Please enter name.r?  Please enter course name.Please enter review.Please select statusrW  rX  rY  )r  r  rM  r  r   )r  r  r  r   r>  z!testimonial created successfully.r^  )	r   r   r   r`  r	   ra  r9   r   rb  )r   r  r  rM  r  r   r  r   r   r   add_testimonial
  s@    
	r  c                 C   sd  | j dkrR| jd}| jd}| jd}| jd}| jd}| jd}|dkrjtd	d
dS |dkrtd	ddS |dkrtd	ddS |dkrtd	ddS |dkrtd	ddS | jdr|jdkrtd	d|j|jdS t||||||d}|jdddddgd n&t|||||d}|jddddgd tdddS ntd	ddS d S )Nr   r   r  r  rM  r  r   r   r   r  r?  r  rV  r  r  rW  rX  rY  )r   r  r  rM  r  r   rk  )r   r  r  r  r   r>  zTestimonial saved successfully.r^  )r   r   r   r`  r	   ra  r9   rd  )r   r   r  r  rM  r  r   r  r   r   r   edit_testimonial
  sN    

	r  c                 C   sB   | j dkr0| jd}t|  tdddS tdddS d S )Nr   r   r>  z!Testimonial deleted successfully.r?  r   r^  )r   r   r   r9   ro  r	   rp  r   r   r   delete_testimonial'  s
    
r  c                 C   sb  d}| j dkrJd| jkrJtjj| jd| jd| jddd d}nf| j dkrd	| jkr| jd	}| jd
}|r|dkrtjj|dj|dd d| d|	  d}| j
d}| j
d}| j
d}| j
d}| j
d}| j
d}tjjdd d}	tjjddd}
tjjddddd d!}d}|rj|j|d}|d"| 7 }|r|jtd#td$d%d&j|d'}|d(| 7 }|r|j|d)}|d*| 7 }|r|j|d+}|d,| 7 }|r6z:ttt| tj}|j|d-}|d.| 7 }W n tk
r4   Y nX |rz:ttt| tj}|j|d/}|d0| 7 }W n tk
r   Y nX t|d1}| j
d2}||}|D ]}t|d3  }d4d5 |D }t!t"|}|rd#d6d5 |D nd7|_$d8d5 |D }t!t"|}|r2d#d9d5 |D nd7|_%qt&| d:||
||||||||||	d;S )<Nr   r   
student_id	course_idrL  r   )r  r  rL  lecturesBatch assigned successfully.Zupdate_order_idorder_action)refundedcanceledr%  r   )r  is_orderzOrder z marked as .order_idr  numberr  r  F)Zordercourses__isnullr  r	  r   r  r  r   Zordercourses_set__courseZordercourses_set__batchr
  
&order_id=student__first_namer  student__last_namefullnamefullname__icontainsr  Zstudent__mobile__icontains&number=)Zordercourses__course_id&course_id=rw  ry  rz  r|  r   r  ordercourses_setc                 S   s   g | ]}|j r|j jqS r   )r  r  r1  ocr   r   r   
<listcomp>  s      zSeles.<locals>.<listcomp>c                 S   s   g | ]}d | dqS z$<span class="badge bg-primary me-1">z</span>r   r1  cr   r   r   r    s     zN/Ac                 S   s   g | ]}|j r|j jqS r   )r  r  r  r   r   r   r    s      c                 S   s   g | ]}d | dqS r  r   r1  br   r   r   r    s     z
sales.html)r   r  r   r  r  r  	all_salesr  r  r  r  r  )'r   r   r8   r   rb  r   r7   r   r  r   r   r@   r   r   rI   r   r   annotater~   r   
make_awarerw   combinefromisoformatr   r   minrG  r  r   r  getattrr   sortedr  joinZcourses_strZbatches_strr   )r   r   r  actionr  r  r  r  r  r  r  r  Z	filter_qsZstart_dtend_dtr!  r"  r#  orderZoc_listcourse_namesZunique_coursesbatch_namesZunique_batchesr   r   r   Seles4  s    


 	

r  c                 C   st  | j d}| j d}| j d}| j d}| j d}| j d}d}tj }tjjdd	d
dd}	|r|	j|d}	|d | }|r|	j	t
dtdddj|d}	|d | }|r|	j|d}	|d | }|r|	j|d}	|d | }|r|	j|d}	|d | }|r2|	j|d}	|d | }t|	d}
| j d}|
|}t| d||||||||||d 
S )!Nr  r  r  r  r  r  r   r   r  r   r  r
  r%  r  Zstudent_id__first_namer  Zstudent_id__last_namer  r  r  )Zstudent_id__mobiler  r  r  rw  ry  rz  r|  r   r  zfailed_orders.html)
r  r  r   r  r  r  r  r  r  r  )r   r   r@   r   r   r7   r   r   r   r  r~   r   r   r  r   )r   r  r  r  r  r  r  r   r  r  r!  r"  r#  r   r   r   failed_orders  s>    
 

r  c                 C   sx  | j dkrf| jd}| jd}| jd}tjj|d}tjj|d jd}t|d j	}d}d}d}	d}
d}d}d}d}d}d|krd}
d	|krd}d
|krd}d|krd}d|krd}d|krd}d|krd}d|krd}	t
jj|d jd}tjj|dj||dd |D ]@}tjj|d j|d j|j|d j	|
|||||	|||d qtdddS tdddS d S )Nr   r   payment_methodr  r%  r   	area_testr   sectional_testmini_mock_testfull_mock_testadvance_mock_testpyq_mock_testr  booksr  )r  payment_statusr  )r  r  rL  access
area_mockssectional_mocks
mini_mocks
full_mocksr  r  advance_mocks	pyq_mocksr  r>  zStatus changed successfully.r?  r   r^  )r   r   r   r7   r   r   r@   r  evalr  r)   r  r8   rb  r  rL  r	   )r   r   r  r  r  r  r  r  recorded_lecturer  r  r  r  r  r  r  r   cbatchr   r   r   Change_Status  sp    
r  c                 C   s@   t jddj|d}|}tjj|j|jd}t| d||dS )Nr  r   r%  )r  r  zsales-details.html)r  ocourse)	r7   r   r   r   r8   r   r  r   r   )r   r   r  r  r  r   r   r   seles_Details  s    r  c              
   C   sB   t jj| jd| jd| jddddddd tddd	S )
Nr  r  rL  r   r   )r  r  rL  r  r  r  r  r  r>  r  r?  )r8   r   rb  r   r   r	   rp  r   r   r   assign_batch(  s    



r  c                 C   s&  | j d}| j d}| j d}| j d}| j d}tj }d}tj d}|rv|j|d}|d	 | }|r|j|d
}|d | }|r|j|d}|d | }|r|j|d}|d | }|r|j|d}|d | }t|d}	| j d}
|		|
}t
| d||
|||||||d	S )Nr  r  r   r  r  r   r
  r  r  r  r  r   rv  rw  ry  rz  r|  r   r  zresult.html)	
all_resultr  r   r  r  r   r  r  r  )r   r   r@   r   r   rQ   r   r   r   r  r   )r   r  r  r   r  r  r  r   r  r!  r"  r#  r   r   r   Results<  s6    


r  c                 C   s   | j dkr| jd}| jd}| jd}| jd}|dkrPtddd	S |dkrftdd
d	S |dkr|tddd	S |dkrtddd	S |jdkrtdd|j|jdS t||||d}|  tddd	S ntddd	S d S )Nr   r  r  rM  r   r   r   r  r?  r  rV  r  rW  rX  rY  )r  r  rM  r   r>  zResult Added successfully.r^  r   r   r   r`  r	   ra  rQ   rd  )r   r  r  rM  r   resultr   r   r   
add_result_  s0    

r  c                 C   s8  | j dkr&| jd}| jd}| jd}| jd}| jd}|dkr^tdd	d
S |dkrttddd
S |dkrtddd
S |dkrtddd
S | jdr|jdkrtdd|j|jdS t|||||d}|jddddgd n"t||||d}|jdddgd tddd
S ntddd
S d S )Nr   r   r  r  rM  r   r   r   r  r?  r  rV  r  rW  rX  rY  )r   r  r  rM  r   rk  )r   r  r  r   r>  zResult saved successfully.r^  r  )r   r   r  r  rM  r   r  r   r   r   edit_result  sD    

r  c                 C   sB   | j dkr0| jd}t|  tdddS tdddS d S )Nr   r   r>  zResult deleted successfully.r?  r   r^  )r   r   r   rQ   ro  r	   rp  r   r   r   delete_result  s
    
r  c                 C   s:  | j d}| j d}| j d}| j d}| j d}| j d}d}tj }tjd d	}	|r|	j|d
}	|d | }|r|	j|d}	|d | }|r|	j|d}	|d | }|r|	j|d}	|d | }|r|	j|d}	|d | }t	|	d}
| j d}|

|}t| d||||||||||d
S )Ncoder  r   valid_tor  r  r   coursesr
  )r  z&code=r   rv  )Zvalidto__ltez
&valid_to=rw  ry  rz  r|  r   r  zcoupons.html)

all_couponr   r  r  r  r  r  r   r  r  )r   r   r@   r   r   r.   r   r   r   r   r  r   )r   r  r  r   r  r  r  r   r  r  r!  r"  r#  r   r   r   coupon_code  s8    


r  c              
   C   sF  | j dkr4| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}| jd
}	|dkrtdddS |dkrtdddS |dkrtdddS |dkrtdddS |dkrtdddS tjj||||||	||d}
|
j}|D ]}t	jj||d qtdddS ntdddS d S )Nr   r  emailsr  discount_typeminimum_amountdiscountvalidtor   usage_limitr   r   Please enter coupon code.r?  Please enter minimum amountPlease select discount type$Please select validity date and timerj  )r  r  r  r  r  r  r  r   	coupon_idr  r>  zCoupon added successfully.r^  )
r   r   r   r_  r	   r.   r   rb  r   r#   )r   r  r  r  r  r  discount_amountr  r   r  coupenZ	coupen_idr  r   r   r   add_coupons  sL    
	r  c                 C   s  | j dkr| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}| jd
}	| jd}
|dkrtdddS |dkrtdddS |dkrtdddS |dkrtdddS |dkrtdddS |	dkr
tdddS |
dkr"tdddS t||||||||	|
d	}|jddddd	d
ddgd tjj	|d
  |D ]}tjj||d qntdddS ntdddS d S )Nr   r   r  r  r  r  r  r  r  r  r   r   r   r  r?  zPlease select courser  r  zPlease enter discount amountr  rj  )	r   r  r  r  r  r  r  r  r   rk  )r  r  r>  zCoupon updated successfully.r^  )r   r   r   r_  r	   r.   rd  r#   r   r   rF  rb  )r   r   r  r  r  r  r  r  r  r  r   r   r  r   r   r   edit_coupon,  sZ    


r  c                 C   s&   | j d}t|  tdddS )Nr   r>  zcoupon deleted successfully.r?  )r   r   r.   ro  r	   rp  r   r   r   delete_couponl  s    r  c                 C   s  | j d}| j d}| j d}| j d}| j d}d}tj d}|rl|j|d}|d	 | }|r|j|d
}|d | }|r|j|d}|d | }|r|j|d}|d | }|r|j|d}|d | }t|d}| j d}	||	}
t| d|
|	||||||dS )Nr  r  r  r  r  r   r
  r  r  r  &email=mobile	&contact=rw  ry  rz  r|  r   r  zcourse-enquiries.html)	enquiriesr  r   r  r  r  r  r  )	r   r   r/   r   r   r   r   r  r   r   r  r  r  r  r  r   r	  r!  r"  r#  r   r   r   Course_enquiriesu  s4    

r  c                 C   s&   | j d}t|  tdddS Nr   r>  zEnquiry deleted successfully.r?  )r   r   r/   ro  r	   rp  r   r   r   delete_course_enquiries  s    r  c                 C   s.  | j d}| j d}| j d}| j d}| j d}d}tj d}|r|jtdtd	d
dj|d}|d | }|r|j|d}|d | }|r|j|d}|d | }|r|j|d}|d | }|r|j|d}|d | }t	|d}| j d}	|
|	}
t| d|
||	|||||dS )Nr  r  r  r  r  r   r
  
first_namer  	last_namer  r  r  r  r  )r  r  rw  ry  rz  r|  r   r  zcontact-us-enquiries.html)r	  r   r  r  r  r  r  r  )r   r   r-   r   r   r   r  r~   r   r   r  r   r
  r   r   r   Contact_us_enquiries  s4     

r  c                 C   s&   | j d}t|  tdddS r  )r   r   r-   ro  r	   rp  r   r   r   delete_Contact_us_enquiries  s    r  c                 C   s>   t jj|d}t|d}| jd}||}t| dd|iS )N)rL  r   r  zbatch-student-list.htmlstudent_list)r8   r   r   r   r   r   r  r   )r   r   r  r!  r"  r#  r   r   r   Batch_Students_list  s
    

r  c                 C   s^   z@t | tr<|  dr&t| W S dd | dD W S g W S  tk
rX   g  Y S X d S )N[c                 S   s   g | ]}|  r|  qS r   r  r1  xr   r   r   r    s      z%safe_parse_access.<locals>.<listcomp>,)
isinstancerH  r  
startswithastliteral_evalsplitrG  )
access_strr   r   r   safe_parse_access  s    
r  c                    s  | j dd }| j dd}| j dd}| j dd}tjj|ddd}tjj|d	}|r|t	|d
t	|dB t	|dB t	|dB t	|dB }|r|j|d}|r|j|d}|r|j|d}|D ]n}t
|j}	ddd |	D |_tjj|jdjddd }
ttjj|
djddd}|r<|ng |_qdddddd d!d"d#g	}|jrnt|jng   fd$d%|D }t|d&}| j d'}||}t| d(|||||||d)S )*Nsearchr   access_filter	date_fromdate_tor  r   r
  r%  Zstudent__first_name__icontainsZstudent__last_name__icontainsZstudent__email__icontainsr  )Z#student__whatsapp_number__icontains)Zaccess__icontainsrw  rz  , c                 s   s&   | ]}|  r|d d V  qdS )r-  r  N)r  replacer   r1  rg  r   r   r   r3    s      z'Course_Students_list.<locals>.<genexpr>r   r  Tr   r  r  r  r  r  r  r  r  r  r  basic_advance_mock_testc                    s0   g | ](}| krd nd| dd |dqS )r   r   r-  r  )valuelabelkey)r(  r   )r1  featureZ
access_rawr   r   r    s
   z(Course_Students_list.<locals>.<listcomp>r   r  zcourse-students.html)r  r  r   r!  r"  r#  course_access)r   r   r  r8   r   r   r   r   r@   r   r  r  r  Zdisplay_accessr   r   r   r   r  r  r  r   r  r   )r   r   r   r!  r"  r#  r  r  r   Z
raw_access
course_idsr  Zstatic_featuresr1  r!  r"  r#  r   r0  r   Course_Students_list  sv    	




r3  c              
   C   s  zt | jdd}t | jdd}| jd}d|}ddddd	d
dddd	}|D ]j}tjj|d }|r\||_	t
| D ]}t||d q|D ]}	||	}|rt||d q|  q\tddiW S  tk
r }
 ztdt|
ddd W Y S d }
~
X Y nX d S )Nstudent_ids[]access_listr  r  r  r  r  r  r  r  r  basic_advance_mocks)	r  r  r  r  r  r  r  r  r+  r%  r   r   r   r>  r   r   r    r   )r  loadsr   r   r  r8   r   r   r  r  r  r  setattrrd  r	   rG  rH  )r   r4  r6  r  r  Zaccess_field_mapr  Zorder_course
field_name
access_keyr   r   r   r   update_student_access+  sH    



r>  c              	   C   s   | j d}| j d}d}tj d}|rH|j|d}|d | }|rd|j|d}|d | }t|d	}| j d
}||}t| d|||||dS )Nr  r  r   r
  rw  ry  rz  r|  r   r  zreports.html)r  r  r   r  r  )	r   r   r7   r   r   r   r   r  r   )r   r  r  r   r  r!  r"  r#  r   r   r   reportb  s    

r?  c              	   C   s,   z
t | W S  ttfk
r&   | Y S X d S Nr  	TypeError
ValueErrorvaldefaultr   r   r   to_intv  s    
rG  c                 C   s  t j }tj }tj }tj }dddddddd}t| jd	d
}t| jdd
}t| jdd
}t| jdd
}	t| jdd
}
| jdd}t	j }|r|dkr|j
|d}|r|dkr|j
|d}|r|dkr|j
|d}|	r|	dkr|j
|	d}|
r.|
dkr.|j
|
d}|dkrD|d}n*|dkrZ|d}n|dkrn|d}t|d}| jd}||}d| d | d!| d"|	 d#|
 d$| }td%|jjd% }t| d&t|jjd'd(d)|||||||||||	|
||d*S +Nz	Area MockzSectional MockzWeekly Mockz	Mini Mockz	Full MockzAdvance MockzPYQ Mock)r   r        r   r.  	   r=  r   rA  rC  mocktest_idmocktype_idsort_byr   0r<  r@  rB  test_id)Ztest__mock_typeZquestion_titlerG  Zmock_test_descz	-test__idZmock_test_ascZtest__idr   r  r  r  
&topic_id=z&mocktest_id=z&mocktype_id=z	&sort_by=r   zall-questions-bank-list1.htmlr   Tr   )r  numbersmock_test_listQuestion_listr  r  Topics_listr   rC  r=  rA  rL  rM  rN  
mock_typesrC   r   r   rD   rF   rG   rG  r   r   rE   r   r   r   r  rc  r!  r   r   r   object_listr   r   r  r  rV  rT  rW  r=  rA  rC  rL  rM  rN  rU  r!  r"  r#  r   rS  r   r   r   all_question_bank_list}  sz    










&	r[  c                 C   s  | j d}tj }tj }tj }| j d}d}d}d}d}ttjj	|d
dd}	dd t|	d	d
D }
tjj	|d
dd}| j dr| j ddkrt| j d}|j	| j dd}| j dr| j ddkrt| j d}|j	| j dd}| j drT| j ddkrTt| j d}|j	| j dd}| j dr| j ddkrt| j d}|j	|d}|jddd}tjj	|d}t|d}| j d}||}tjj	|d}|jD ]"}|
|j|_d|j|_qd}| }|r0ddlm} d||}dt|p<d d t|pNd d t|p`d d t|prd d  t|pd }td	| d	 }t| d!t|||||||||||||||d"S )#NrQ  r   r   rP  r=  r   c                 S   s   i | ]\}}|j |qS r   r%  )r1  r  rG  r   r   r   
<dictcomp>  s    z%all_question_bank.<locals>.<dictcomp>r   r   rO  r<  rA  r@  rC  rB  r   Noner  Tr   r%  r   r  z{0}.mp4)mock_video_folderz
media/{0}/z	&test_id=r  r  rR  &search=zall-questions-bank-list.html)r  rS  	mock_testrU  r  r  rV  rQ  r   rC  r=  rA  r   testvideo_folder)r   r   rC   r   r   rD   rF   r   rE   r   r   	enumerater  r   rG   r   r  rY  r   Zvideo_question_numberformatZvideo_filenamer  Z admin_app.question_video_servicer`  rH  rc  r   r   )r   rQ  r  r  rV  r=  rA  rC  r   Zall_mock_questionsZquestion_number_by_idrU  question_idsrb  r!  r"  r#  rc  rG  rd  Zmock_test_objectr`  r   rS  r   r   r   all_question_bank  s    



 


rh  c                 C   sv   | j d}| j d}| j d}tjj||d }| rNtdddS tjj|dj|d	 td
ddS d S )NrQ  r  question_id)rQ  r  FzSame order already exits.r?  r%  r_  Tz%Questions order updated successfully.)	r   r   rE   r   r   r   r   r	   r  )r   rQ  r  ri  rU  r   r   r   update_question_order"  s    rj  c                 C   s   | j d}tj }tj }tj }tj }t|d}| j d}t	jj|d}|
|}	t|j}
t| d|
|||	|||dS )NrQ  d   r  r%  zadd-mock-questions.html)qidsrc  rQ  rU  r  r  rV  )r   r   rC   r   r   rD   rF   rE   r   rG   r  r  r:  rg  r   )r   rQ  r  r  rV  rU  r!  r"  rc  r#  rl  r   r   r   add_mock_questions/  s    





rm  c                 C   s   | j d}| jd}tj}| jdr>|j| jdd}| jdr^|j| jdd}| jdr~|j| jdd}t|d	}| jd
}||}t| d|t	
|dS )NrQ  rl  r'  r<  r(  r@  r)  rB  rk  r  zfilter-questions.html)rU  rl  )r   r   r   rE   r   r   r   r  r   r  r:  )r   rQ  rl  rU  r!  r"  r#  r   r   r   filter_questions>  s    

rn  c                 C   s<   | j d}| j d}tjj|dj|d tdddS )NrQ  rl  r%  )rg  r>  z*Questions added successfully successfully.r?  )r   r   rG   r   r   r  r	   )r   r   rl  r   r   r   save_mock_questionsP  s    ro  c                 C   s@   | j d}tj }tj }tj }t| d||||dS )NrQ  zadd-question.html)r  r  rV  rQ  )r   r   rC   r   r   rD   rF   r   )r   rQ  r  r  rV  r   r   r   add_questionY  s
    


rp  c                 C   s  | j dkr| jd r| jd}| jd}| jd }tjj|d}t|}|j	}g }g }g }	d}
d}|d j
r|d j
}
|d jr|d j}|jdd	d
D ]}|d }|d }|d }|d }|d }|d }|d }|d }|d }|d }|d }|d }|d }|d }|
}
|}d}t| |||||g}|dkr||krRd}||kr`d}||krnd}||kr|d}||krd}|rt||||||t|||
|||||d}|| qtj| ttjjdd |D d jd!d	d"}td#|d$S t| d%S )&Nr   	excelFilerQ  r  r%  r   r   r  Tmin_rowvalues_onlyrI  rJ  r         r.  rK  r            r	  mcq12345r=  rA  rC  question_typerG  	paragraphoptionsdifficulty_levelmarksnegative_marksexplanationcorrect_answerr   rQ  c                 S   s   g | ]
}|j qS r   )
created_at)r1  rG  r   r   r   r    s     zupload_data.<locals>.<listcomp>)created_at__inr   r   zData uploaded successfully.)r  r'  zupload.html)r   r`  r   r   rA   r   r   openpyxlload_workbookactiverQ  rR  	iter_rowsr   rE   r  r  r   bulk_creater   r   r	   r   )r   rQ  r  
excel_filerf  wbsheetquestions_dataoptions_datar  r  r  rowr=  subsection_idrC  r  rG  r  option_1option_2option_3option_4option_5r  answer_explainationr  r   option_dataquestion_objrg  r   r   r   upload_dataa  s    











          Nr  c                 C   s  d}ddd}| j D ]}|j}|jr0d| d}|jrBd| d}|jrTd	| d
}|jjrhd| d}|jjr|d| d}|jjrd| d}||7 }|j	
d|}|D ]Z}|d|d  }|sq|jj|}|sq|j}	t|	d}
d|
 d}||7 }qq|S )zoExtract formatted text with bold, italic, underline, strike-through, superscript, subscript, and inline images.r   z5http://schemas.openxmlformats.org/drawingml/2006/mainzChttp://schemas.openxmlformats.org/officeDocument/2006/relationships)arz<b>z</b>z<i>z</i>z<u>z</u>z<s>z</s>z<sup>z</sup>z<sub>z</sub>	.//a:blipz	{%s}embedr  utf-8 <img src="data:image/png;base64,z" alt="Image"/>)runstextbolditalic	underlinefontstrikesuperscript	subscript_elementfindallr   partrelated_partsblobbase64ry   decode)r  Zformatted_text
namespacesrunr  Zblipsblipimage_id
image_partimage_bytesbase64_imageZimg_tagr   r   r   extract_formatted_text  s@    
r  c                 C   s   t d}t |d| S )z%Remove HTML tags from the given text.z<.*?>r   )r  compiler  )r  cleanr   r   r   strip_html_tags+  s    
r  z<img[^>]+src="([^"]+)"[^>]*>u   ⁰   ¹   ²   ³u   ⁴u   ⁵u   ⁶u   ⁷u   ⁸u   ⁹u   ⁺u   ⁻u   ⁼u   ⁽u   ⁾)rO  r{  r|  r}  r~  r  6789+-=()u   ₀u   ₁u   ₂u   ₃u   ₄u   ₅u   ₆u   ₇u   ₈u   ₉u   ₊u   ₋u   ₌u   ₍u   ₎)r  r  c                 C   s
   |  tS r@  )	translate_SUPERSCRIPT_MAPr  r   r   r   _to_superscript[  s    r  c                 C   s
   |  tS r@  )r  _SUBSCRIPT_MAPr  r   r   r   _to_subscript`  s    r  )	html_textr  c                    s  | sdS dd dd  t dfdd| } t d	 fd
d| } t jdd| t jd} t jdd| t jd} t jdd| t jd} t dd| } t| } dddddddddddddd}| D ]\}}| ||} q| dd} | d d!} t d"d#| } |  S )$z
    Remove HTML tags, decode HTML entities, keep line breaks,
    and convert <sup>/<sub> + common math entities to a readable math format.
    r   c                 S   s   |  d}t|}t|S Nr   )grouphtmlunescaper  matchinnerr   r   r   sup_replo  s    

zstrip_tags.<locals>.sup_replc                 S   s   |  d}t|}t|S r  )r  r  r  r  r  r   r   r   sub_replt  s    

zstrip_tags.<locals>.sub_replz#(?is)<\s*sup[^>]*>(.*?)</\s*sup\s*>c                    s    | S r@  r   m)r  r   r   <lambda>|      zstrip_tags.<locals>.<lambda>z#(?is)<\s*sub[^>]*>(.*?)</\s*sub\s*>c                    s    | S r@  r   r  )r  r   r   r    r  z<\s*br\s*/?>
flagsz</\s*(p|div)\s*>z<\s*(p|div)[^>]*>z<[^<]+?>   √   ×   ÷   −/   ≤   ≥   ≠   ±   ∑   ∏   ∫   ∞z&radic;z&times;z&divide;z&minus;z&frasl;z&le;z&ge;z&ne;z&plusmn;z&sum;z&prod;z&int;z&infin;z&nbsp;r  z\n{3,}

)r  r  Ir  r  r5  r(  r  )r  Z
extra_mathkvr   )r  r  r   
strip_tagsd  sN    


r  )r  c           	   	   c   s   | sdS t | }t|D ]\}}|d dkrFt|}|rd|fV  q| }|drz$|ddd }dt|fV  W q tk
r   Y qX q|d	s|d
rz,ddl	}|j
|dd}|jrd|jfV  W q tk
r   Y qX qqdS )z
    Yields ('text', '...') and ('img', bytes) chunks in document order from a small subset of HTML
    (we only care about <img> and text). Text is plain; images are raw bytes.
    Nr  r   r  z
data:imagezbase64,r   imgzhttp://zhttps://rv  )timeout)
IMG_TAG_REr  re  r  r  r  r  	b64decoderG  r
  r   r   content)	r  partsidxchunkr  srcb64r
  r  r   r   r   iter_text_and_images  s0    

r  g      @)r  r9  c           
   	   C   s   d}t |D ]\}}|dkrJ|r:|r:| | d| }n
| |}d}q|dkr|  }zN| j  |  |  }|j t|}|  }| }	|	j|t|d W q t	k
r   Y qX qdS )z
    Appends the HTML (text + <img>) to a table cell, preserving order.
    If prefix (like 'Directions:' or 'Q-') is present, it is prepended once.
    Images are inserted with given width (inches).
    Tr  r  Fr  widthN)
r  add_paragraphZ_tcZget_or_add_tcPrZadd_runr  r   add_picturer   rG  )
cellr  r9  picture_width_in
first_textkindr  parastreamr  r   r   r   add_html_block_to_cell  s(    

r  )docr  r9  c              	   C   s   d}t |D ]z\}}|dkrJ|r:|r:| | d|  n
| | d}q|dkrzt|}| j|t|d W q tk
r   Y qX qdS )zF
    Same as above but appends at document (not in a table cell).
    Tr  r  Fr  r  N)r  r  r   r  r   rG  )r  r  r9  r  r  r	  r  r  r   r   r   add_html_block_to_doc  s    
r  )	WD_ORIENTc              	   C   s  | j d}tjj|ddddddd}t }|jd	 }t	j
|_|j|j }}||_||_td
|_td
|_td|_td|_|jd| ddd}tj|_|jddd}d|_d|_|jd	 j}	d|	d	 _d|	d _d|	d _d|	d _d|	d _d|	d _tdtdtd td td td g}
t|
D ]$\}}|j| jD ]}||_qLq8d!d"d#d$d%g}t|dd&D ]\}}|  j}t!||d	 _|d }d'|_d}d}|j"r|r|#d' t$||j"d(d) d*}|j%r|r|#d' t$||j%d+d) d*}zt&'|j(pd,}W n t)k
r8   g }Y nX t|d d D ]@\}}|sl|rh|#d' d*}t$||||  dd) d*}qJ|j*r|r|#d' d!d"d#d$d%d-t+|j*d'}|r|#d.|  d*}|j,r|r|#d' t$||j,d/d) d*}t-t-|dd d0d'p d'|d _t-t-|dd d1d'p@d'|d _t-t-|dd d2d'p`d'|d _|j.prd'|d _qxt/ }|0| |1d	 t2|3 d3d4}d5| d6|d7< |S )8NrQ  r	  rQ  r   r'  r(  r)  r=  r   r   g      ?ffffff?zQuestions Export (Test ID: r  r   )levelru  )rowscolsz
Table GridFzS.Noz1Content (Directions, Q-, A)-E), Answer, Solution)Topicr  SectionrI  zSub-SectionrJ  z#Difficulty (e.g., Easy/Medium/Hard)r   g333333?g      @gffffff?ABCDEr]  r   Directions:)r9  TQ-r5  r   r  rI  rJ  r   Answer: 	Solution:r  r  r  Gapplication/vnd.openxmlformats-officedocument.wordprocessingml.documentcontent_typez%attachment; filename="questions_test_z.docx"Content-Disposition)4r   r   rE   r   r   r   r   r{   re  r  Z	LANDSCAPEorientationZ
page_widthZpage_heightr   Zleft_marginright_marginZ
top_marginZbottom_marginZadd_headingr   ZCENTER	alignment	add_tablestyleZautofitr  cellsr  re  columnsr  Zadd_rowrH  r  r  r  rG  r  r:  r  rG  r  r  r  r  r  r   rd  seekr   getvalue)r   rQ  r   r  r'  Z	old_widthZ
old_heightr   tablehdrZ
col_widthscol_idxr  r  labelsr  qr  r  Zhas_any_contentZoptions_startedoptsrg  optletterZbiorespr   r   r   download_questions_word  s        










	






   

r7  c              
   C   s  | j d}tjj|dd}t }|D ]V}|jrPt|j}|jd| dd t|j	}|jd| dd t
|j}dd	d
ddg}t|D ]N\}	}
|	t|k r||	 ntd|	  d}t|
}|j| d| dd q|jdkr<z*t|j}dddddd}||d}W n ttfk
r4   d}Y nX |}n|j}|d|  |jrtt|j}|d|  |d q&t }|| |d t| dd}d| d|d < |S )!NrQ  r	  r  zDirections- zList Bullet)r)  zQ- A)B)C)D)E)A   r  r  zList Bullet 2rz  r  r  r  r  r  r  r   r  z
Solution: r   r!  r"  z$attachment; filename=questions_test_z.docxr$  )r   r   rE   r   r   r{   r  r  r  rG  r  r:  r  re  r   chrr  r  r  rC  rB  r  r   rd  r,  r   r-  )r   rQ  	questionsr  r2  r  question_textr  Zoption_labelsr  optionr-  Zoption_textZcorrect_ans_intZ
answer_mapZanswer_letterZanswer_displayZexplanation_textbufferresponser   r   r   odownload_questions_word  sL    


&




rD  )default_storage)etreer  r  r  r  r  r  r  r  r  r  r  r  r  r  c                 C   s   t | jS r@  )rF  QName	localnameelr   r   r   _ln  s    rK  c                 C   s   | d k	rt | S g S r@  )r   rI  r   r   r   	_children  s    rL  c                 C   s&   t | D ]}t||kr|  S qd S r@  )rL  rK  )rJ  r  r  r   r   r   _find_child  s    
rM  )sr  c                 C   s4   | sdS t | } t D ]\}}| ||} q| S Nr   )r  r  
EXTRA_MATHr5  r(  )rN  r  r  r   r   r   normalize_entities  s    
rQ  z[A-Za-z].*\s+.*[A-Za-z]c                 C   sd   | sdS t | } t| } | dd} | dddd} | dd	d
d} | dddd} | S )zt
    Escapes text that will live in math mode (not inside \text{...}).
    Keep operators and backslashes safe.
    r   \\\{\{}\}%\%#\#r  \&$\$rQ  normalize_sqrt_unicode_to_latexr(  rN  r   r   r   latex_escape_math  s    rb  c                 C   sh   | sdS t | } | dd} | dddd} | dd	d
d} | dddd} | dd} | S )zn
    Escapes text that will live inside \text{...}.
    In textmode we should escape underscores etc too.
    r   rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r  r\  r]  r^  r-  z\_)rQ  r(  ra  r   r   r   latex_escape_textmode  s    rc  c                 C   s2   | pd}|  }t|r*dt| d S t|S )zQ
    If the OMML text looks like real sentence-ish text, wrap as \text{...}.
    r   z\text{rV  )r  LATEX_TEXT_WRAP_REr   rc  rb  )r  r   Z
t_strippedr   r   r   omml_text_to_latex0  s
    
re  c                 C   s   | sdS t dd| S )u,   
    √2 -> \sqrt{2}, √x -> \sqrt{x}
    r   u   √\s*([0-9A-Za-z]+)z
\\sqrt{\1}r  r  ra  r   r   r   r`  =  s    r`  c                 C   s<   | sdS t | } t| } | dd} | dddd} | S )Nr   rR  rS  rX  rY  rZ  r[  r_  ra  r   r   r   latex_escape_textE  s    rg  )r  c                 C   s  | d krdS t | }|dkr4ddd t| D S |dkrTddd t| D S |dkrjt| jpfdS |dkrtt| d	}tt| d
}|r|rd| d | d S |p|S |dkrtt| d}tt| d}|r|r|d | d S |p|S |dkrBtt| d}tt| d}|r8|r8|d | d S |p@|S |dkrtt| d}tt| d}tt| d}|}|r|d| d 7 }|r|d| d 7 }|S |dkrtt| d}tt| d}	|rd| d |	 d S d|	 d S |dkr$tt| d}
|
r d|
 d S dS |dkrt| d}|d k	rLt|d nd }|d k	rbt|nd!}d!d"d#d$}|||}tt| d}tt| d}tt| d}|}|r|d| d 7 }|r|d| d 7 }|r|d%| 7 }|S dd&d t| D S )'Nr   )	oMathParaoMathr   numdensupr  degc                 s   s   | ]}t |V  qd S r@  omml_to_latexr  r   r   r   r3  V  s     z omml_to_latex.<locals>.<genexpr>r  c                 s   s   | ]}t |V  qd S r@  rn  r  r   r   r   r3  Z  s     r   frj  rk  z\frac{z}{rV  ZsSupr   rl  ^{ZsSubr  _{ZsSubSupradrm  z\sqrt[z]{z\sqrt{dz\left(z\right)ZnarynaryPrr>  z\sumz\prodz\int)r  r  r  r  c                 s   s   | ]}t |V  qd S r@  rn  r  r   r   r   r3    s     )rK  r  rL  re  r  ro  rM  r   )rJ  r  rj  rk  baserl  r  outrm  r   r  ru  Zchr_elopZop_mapr   r   r   r   ro  N  s    






ro  c                 C   s   t ddt|  S )zW
    Return LaTeX WITHOUT wrapper.
    We'll wrap inline as \( ... \) for Flutter.
    z\s+r  )r  r  ro  r  )Z	math_elemr   r   r   extract_math_from_omml  s    ry  )eqr  c                 C   s   | sdS d|  dS )Nr   z<latex-inline>z</latex-inline>r   rz  r   r   r   latex_inline  s    r|  c                 C   s   | sdS d|  dS )Nr   z<latex-block>z</latex-block>r   r{  r   r   r   latex_display  s    r}  c                 C   s:   |  d}|sdS |d dp,|d d}|p4d S )Nz.//*[local-name()="vertAlign"]r   r   zA{http://schemas.openxmlformats.org/wordprocessingml/2006/main}valrE  )xpathr   lower)run_elemvarE  r   r   r   get_run_vert_align  s
    
r  c                 C   s   g }|  dD ]4}|d}|r*|| |d}|r|| q|  dD ]}|d}|rN|| qNg }|D ]}||krt|| qt|S )Nz.//*[local-name()="blip"]J{http://schemas.openxmlformats.org/officeDocument/2006/relationships}embedzI{http://schemas.openxmlformats.org/officeDocument/2006/relationships}linkz.//*[local-name()="imagedata"]zG{http://schemas.openxmlformats.org/officeDocument/2006/relationships}id)r~  r   r   )r  Zrel_idsr  ridZrid_linkZ	imagedatarw  r  r   r   r   get_image_rel_ids_from_run  s"    



r  )documentrel_idr  c           	      C   s   z| j }||jkrW dS |j| }|j}tt|dd}d|krR|dd  nd}|dkrbd}dt j	 d| }t
|t|}t
|W S  tk
r   Y dS X d S )	Nr   partnamez	image.pngr  png)r  ZjpgjpeggifZwebpZbmpZtifZtiffzquestion_word/)r  r  r  rH  r  r  r  r4  r5  r6  rE  rd  r   r  rG  )	r  r  r  r  r  r  r:  filenameZ
saved_pathr   r   r   upload_docx_image_to_spaces  s    

r  )r  r  c                 C   s  | j }g }d}g }|D ]&}t|j}|dkrt|}|d}	ddd |	D }
|
dd}
t|
}
t	|
}
g }t
|D ]$}t||}|r|d	| d
 q|
 rd}|dkr|d|
  d  n*|dkr|d|
  d  n
||
 |r>d}|| q|dkrt|}|r|| |t| q|s`|r`ddd |D S d| }|rd| dS dS )NFr  z.//*[local-name()="t"]r   c                 s   s   | ]}|j pd V  qdS )r   Nr  r1  r   r   r   r   r3  	  s     z)extract_paragraph_html.<locals>.<genexpr>    r  z
<img src="z(" style="max-width:100%;height:auto;" />Tr  rq  rV  r  rr  )ri  rh  c                 S   s   g | ]}d t | dqS )<p></p>)r}  )r1  rz  r   r   r   r  ,  s     z*extract_paragraph_html.<locals>.<listcomp>r  r  )_prF  rG  rH  r  r~  r  r(  rQ  r`  r  r  r   r  extendry  r|  )r  r  pr  Zhas_text_or_imgZeqschildrC  vertZtextsZrun_textZimgsr  Zimg_urlrz  liner   r   r   extract_paragraph_html  sJ    





r  c                 C   s   t td| pd S )Nz^\s*[A-E]\)r   )boolr  r  r  r  r   r   r   is_option_start4  s    r  )raw_textr  c                 C   s<   | pd  }|dp:|dp:|dp:|dp:t|S )Nr   r  r  Answer:r   )r  r  r  )r  r   r   r   r   is_structural_break7  s    
r  )
html_blockr-  r  c                 C   s(   | sdS t jdt | dd| ddS )Nr   z^<p>\s*z\s*r  r   r   )r  r  escape)r  r-  r   r   r   strip_label_from_first_pD  s    r  )r  r  c                 C   s   | sdS t jdd| ddS )Nr   z^<p>\s*[A-E]\)\s*r  r   r  rf  )r  r   r   r   strip_option_label_from_first_pJ  s    r  c           (      C   s$  | j dkrtdddS d| jkr0tdddS | jd }| jd}| jd}t|}d	}d
}|r|dkrtjj|d	 }|r|j
p|}|jp|}g }g }	g }
g }|jD ]}d	}t|jD ]\}}|d
krqt|jdk rtdd|d	  dd    S |jd jpddd }|jd jp6ddd }|jd jpTddd }|jd jprddd }tjj|d	 }|stdd| d| d|||d    S |j}|j}|j}|	| |
| || |jd	 j}ddg d
d||||dd
}d
}|t|k r"|| }|jp<d }|drt||}t|d}|d  |7  < |d	 }|t|k r|| jpd }|d rq|d  t|| |7  < |d	7 }qz|}q|d r|t||}t|d }|d!  |7  < |d	 }|t|k rt|| jp.d }t|st|d"rNqt|d!  t|| |7  < |d	7 }q|}qt|rt||}t|}|} |d	 }|t|k r|| jpd }t|rt|s|d#rq| t|| |7 } |d	7 }q|d$ |  |}q|d%r~|d%dd	 }!|!rR|!d d	   nd}!d	ddddd&|!d
|d'< |d	7 }q|d(rt||}t|d(}|d)  |7  < |d	 }|t|k r|| jpd }|d rq|d)  t|| |7  < |d	7 }q|}q|d	7 }q|d! rL|d$ r:dnd*|d+< || |d	7 }qqi }"d	}#g }$|D ]}%|%d}&|&|"kr|#|"|&< |#d	7 }#d,| d-|"|&  }'|$t!|%d. |%d/ |%d0 |%d+ |%d! |&t"#|%d$ |%d1 |||%d) |%d' d2||'d3 qht!j$|$ td4d5|	|
|t|d6S )7Nr   FInvalid request method.r>  r  rq  z&File not found in request (excelFile).rQ  r  r   r   r^  r%  ru  zRow z has insufficient columns.r  r   r  r  rI  rJ  r   r  zQuestion No. z) z topic does not exists.r>  r  r'  r(  r)  rz  
r  r@  r  r  r  r=  rA  rC  r  r  r  r  r  r@  )r  r   r  )r  r   r  r  r  r  )r  r  r  r  r  r  r   r  onelinerr  zT-r  r=  rA  rC  r  r	  )r=  rA  rC  r  rG  r  r  r  r  r  r  r  r   rQ  rC  Tz Questions uploaded successfully.)r>  r  
topic_datar9  sub_section_datainserted)%r   r	   r`  r   r   r{   rA   r   r   r  rQ  rR  tablesre  r  r   r*  r  r(  r  rF   r   rA  r=  r   
paragraphsr  r  r  r  r  r  upperrE   r  r  r  )(r   uploaded_filerQ  r  r  r  r  rf  r  r  r9  r  r.  Zq_noZ	row_indexr  r)  r'  r(  r  r.  rC  rA  r=  r  current_questionrg  r  rawblockjZnxt_rawZoption_htmlZansZparagraph_mapZ	q_counterr   r2  r  rC  r   r   r   upload_question_wordR  sL   




"















r  c           '      C   s  | j dkr| jd r| jd }| jd}| jd}t|}d}d}|dkrtjj|d}|d jrt|d j}|d j	r|d j	}g }g }	g }
g }g }g }g }d	d	g d	d	d	d	d	d	d
	}g }|j
D ]V}d}|jD ]D}|jd jdd}|jd jdd}|jd jdd}|jd jdd}tjj|djddd}tjj|djddd}tjj|djddd}|stdd| d| d|||d    S |stdd| d| d|||d    S |stdd| d| d|||d    S || || || |jd j}d	d	g d	d	||||dd
}|D ]j}|
|j |j}|jd r|jd  |d!< |||d d  D ]}|jd"r qn|jd#r|jd#r|jdd$  }|d!  d%t| d& 7  < n|d!  d%|j  d& 7  < |jD ]h} | jjd'| jjj d(D ]J}!|!d)}"|jj!|" }#|#j"}$t#$|$%d*}%|d!  d+|% d,7  < q@q&qqL|jd"rd%|jd"  d& |d-< |||d d  D ]}|jd.r qn|jd#r>|jd#r>|jdd$  }|d-  d%t| d& 7  < n|d-  d%|j  d& 7  < |jD ]h} | jjd'| jjj d(D ]J}!|!d)}"|jj!|" }#|#j"}$t#$|$%d*}%|d-  d+|% d,7  < q|qbqؐqL|jd.r|jd/ d#rF|jd/ d#rF|jd/ dd$ }|d0 d%t| d&  n|d0 |jd/  |jD ]l} | jjd'| jjj d(D ]N}!|!d)}"|jj!|" }#|#j"}$t#$|$%d*}%|d0 d1  d+|% d,7  < qqfqL|jd2r|jd2 d3krd|d4< n~|jd2 d5kr&d|d4< n^|jd2 d6krFd|d4< n>|jd2 d7krfd|d4< n|jd2 d8krd|d4< qL|jd9rL|jd9 |d:< |||d d  D ]}|jd"r qL|jd#r$|jd#r$|jdd$  }|d:  d%t| d& 7  < n|d:  d%|j  d& 7  < |jD ]h} | jjd'| jjj d(D ]J}!|!d)}"|jj!|" }#|#j"}$t#$|$%d*}%|d:  d+|% d,7  < qbqHqqL|d- r|d0 j&rd|d;< nd<|d;< |	|'  n"tdd=t(| d> d?    S |d }qq|	D ]l}t)|d@ |dA |dB |d; |d- |d! t*+|d0 |dC |||d: |d4 dD|dE}&||& |d q$t)j,| tddF|||dGS d S )HNr   rq  rQ  r  r   r   r^  r%  r   )	r  r@  r  r  r  r=  rA  rC  r  r  r  r  rJ  rI  r   r  r   Tr   )r  )r  FzTopic 'z' not found in question no. z#. Please check spelling or spacing.r  zSub-section 'z	Section 'rz  r  r  r  r  z$$r  r  r  )r  r  r  r  z"/>r@  )r8  r9  r:  r;  r<  zABCDE)r  r  r  r  r  r  r  r  r  r   r  r  r  z!Something wrong with question no.r  r  r=  rA  rC  r  r	  r  z0Questions uploaded and data stored successfully.)r>  r  r  r9  r  )-r   r`  r   r   WordDocumentrA   r   r   rQ  rR  r  r  r*  r  r(  rF   r   rD   rC   r	   r   r  r  lstripr  indexendswithr   r  r  r  r  nsmapr  r  r  ry   r  r   r  rH  rE   r  r  r  )'r   r  rQ  r  r  r  r  rf  Z	equationsr  Zparagraph_datar9  r  r  r?  r  Zmathml_equationsr.  rg  r  r)  r(  r'  r  rC  rA  r=  r  r  r  Znext_paragraphlatex_equationr  drawingr  r  r  r  r  r   r   r   oupload_question_word.  sf   




	





(

(0

(





(

"         
r  c              
   C   sJ   zt | }|W S  tk
rD } ztd|  W Y d S d }~X Y nX d S )Nz"Error converting LaTeX to MathML: )r   rG  r   )r  Zmathmlr   r   r   r   convert_to_mathml*  s    r  c              	   C   sP   t j }tj }tj }tjj|d}t|j	}t
| d|||||dS )Nr%  zedit-question.html)rU  r  r  rV  r  )rC   r   r   rD   rF   rE   r   r  r:  r  r   )r   r   r  r  rV  rU  r  r   r   r   editquestion2  s    


r  c                 C   s
   t | dS )Nzcreate-course.htmlr   r   r   r   r   create_course<  s    r  c                 C   s|  | j d}| j d}tj }tj }tj }tj }| j d}| j d}| j d}	| j d}
| j d}| j d}| j d	}| j d
}| j d}tjj	|d}d}|r|j	|d}|d| 7 }|r|j	|d}|d| 7 }|	r|j	|	d}|d|	 7 }|
r:|j	|
d}|d|
 7 }|rZ|j	|d}|d| 7 }|rz|j	|d}|d| 7 }|r|j	|d}|d| 7 }|r|j	|d}|d| 7 }|r|j	|d}|d| 7 }|d kr|
d!}t|d"}| j d#}||}|jD ]<}tjj	|jd$ |_tjj	|jd%d&jdd' |_qt| d(||||||||||||||d)S )*N	series_idr;  r  section1sub1cat1
mock_levelis_accessiblerN  rO  rP  	mock_typer   )Zmock_title__icontainsr  r'  z
&section1=)r(  z&sub1=)Zmock_exams__exam_category_idz&cat1=)r  z&mock_level=)r  z&is_accessible=)rN  z&section_wise_timer=)rO  z&section_switching=)rP  z&calculator=)r{  r|  r  r  r=  r   r  rP  F)rQ  Zexplanation_video__isnullrD  zmock-test.html)rT  r  r  r  r  r  rV  r  r  r  rN  rO  rP  r   )r   r   rC   r   r   rD   rF   rA   rG   r   r   r   r  rY  rE   r   r   Zvideo_question_countexcludeZuploaded_video_countr   )r   r  r  r  r  rV  r  r  r  r  r  r  r  rN  rO  rP  rb  Zfilter_stringr!  r"  r#  mockr   r   r   rT  B  s    








rT  c                    s  t  }tjjddg|ddddd }|D ]p}|j}tjj|dd	d
dd d }t	|j
ddd}tjj|dd	d
  }tjj|dd	ddjtdtdddtdtdddtdtdt|dddtdt|dddtdt|ddtdt|ddd}g }	|j }
|
D ]T t fdd|D d }|r&|d }|d }|d  pfd}|d! }|d" }|d# }|d$ pd}|dkr|| d% nd}|dkr|| d% nd}|dkr|| d% nd}|dkr|| d% nd}|dkr|| nd}|dkr|| nd}| _| _| _| _| _| _| _| _| _| _| _ | _!| _"|	#  q&t$j%|	ddd d!d&d#d$d'd(d)d*d+d,g q4t&d-d.iS )/Nr   r.  mock_type__intest_date__ltequestion_bank_setr
     r  r   r   mock_test_idnot_accessibleis_end-marksr   r  Tr   Zquestion__test_idresult__not_accessibleresult__is_endri  r   Fanswer_id__isnullr   is_right
time_takenstudent_id__inr  r  r  r  total_attemptedcorrect_attemptstotal_time_takentoppers_attemptedtoppers_correcttotal_topperstoppers_time_taken_totalc                 3   s    | ]}|d   j kr|V  qdS ri  Nr%  r1  statrG  r   r   r3    s      z)update_mock_statisctic.<locals>.<genexpr>r  r  r  r  r  r  r  rk  toppers_correct_attemptsoverall_attempt_percentageoverall_accuracy_percentagetoppers_attempt_percentagetoppers_accuracy_percentagetoppers_time_taken_avgoverall_time_taken_avgr   r>  'r   r  rG   r   r   r   r   r   r&   r   r   r   r   r%   r  r  r}   r   r   r  r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r   rE   bulk_updater	   r   r  mocksr  rX  Ztop_20_studentsZtop_20_students_idsZtotal_students_countZstudent_statsZupdated_questionsr?  Zquestion_statsr  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r   update_mock_statisctic  s    (


r  c                    s  t  }tjjdg|ddd}|D ]p}|j}tjj|ddddd d	 }t	|j
d
dd}tjj|ddd  }tjj|ddddjtdtdddtdtdddtdtdt|dddtdt|dddtdt|ddtdt|ddd}g }	|j }
|
D ]T t fdd|D d }|r|d }|d }|d p\d}|d }|d }|d  }|d! pd}|dkr|| d" nd}|dkr|| d" nd}|dkr|| d" nd}|dkr|| d" nd}|dkr|| nd}|dkr|| nd}| _| _| _| _| _| _| _| _| _| _| _ | _!| _"|	#  qt$j%|	ddddd#d d!d$d%d&d'd(d)g q*t&d*d+iS ),Nr   r  r  r
  r   r   r  r  r   r  Tr   r  ri  r   Fr  r  r  r  r  r  r  r  c                 3   s    | ]}|d   j kr|V  qdS r  r%  r  r  r   r   r3  &  s      z0calculate_fullmock_statisctic.<locals>.<genexpr>r  r  r  r  r  r  r  rk  r  r  r  r  r  r  r  r   r>  r  r  r   r  r   calculate_fullmock_statisctic  s    


r  c                    s  t  }tjjdg|ddd}|D ]p}|j}tjj|ddddd d	 }t	|j
d
dd}tjj|ddd  }tjj|ddddjtdtdddtdtdddtdtdt|dddtdt|dddtdt|ddtdt|ddd}g }	|j }
|
D ]T t fdd|D d }|r|d }|d }|d p\d}|d }|d }|d  }|d! pd}|dkr|| d" nd}|dkr|| d" nd}|dkr|| d" nd}|dkr|| d" nd}|dkr|| nd}|dkr|| nd}| _| _| _| _| _| _| _| _| _| _| _ | _!| _"|	#  qt$j%|	ddddd#d d!d$d%d&d'd(d)g q*t&d*d+iS ),Nr.  r  r  r
  r   r   r  r  r   r  Tr   r  ri  r   Fr  r  r  r  r  r  r  r  c                 3   s    | ]}|d   j kr|V  qdS r  r%  r  r  r   r   r3    s      z3calculate_advancemock_statisctic.<locals>.<genexpr>r  r  r  r  r  r  r  rk  r  r  r  r  r  r  r  r   r>  r  r  r   r  r    calculate_advancemock_statisctic^  s    


r  c              
   C   sX   t j }tj }tj }tj }tj }| jd}t	| d||||||dS )Nr;  zmock-test-list-add.html)r  r  r  rV  all_examr  )
rC   r   r   rD   rF   rA   rN   r   r   r   )r   r  r  rV  r  r  r  r   r   r   add_mock_test  s    




r  c                 C   s*   | j d}tjj|d}t| dd|iS )Nr   )mock_title__startswithzsearch_mock.htmlrT  )r   r   rG   r   r   r   )r   r   rT  r   r   r   search_mock  s    r  c                 C   s  | j dkr| jd}| jd}t| | jd}| jd}| jd}| jd}| jd}| jd	}| jd
}	| jd}
| jd}| jd}| jd}| jd}| jddk}| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd}|dkrPtdddS |dkrhtdddS |dkrtdd dS |dkrtdd!dS |dkrtdd"dS |dkrtdd#dS |dkrtdd$dS |dkrtdd%dS |dkr6tjj||||||	t	
g |
||||||||d&}n|d'krtjj||||	t	
g |
|||||||||d(}|j}|D ]}tjj||d) qzn|d*ks|d+krtjj||||	t	
g |
|||||d,}|j}td-| |D ]}tjj||d) qn6tjj||||	t	
g |
||||||||||||d.}||_|jdgd/ |j}|D ]}tjj||d) qRtt|D ]6}|| dkrd0||< tjj||| || d1 qvtd2d3dS ntdd4dS d S )5Nr   
mock_titler  rN  rO  r=  rA  rC  r  exam_master_idr  total_questionstotal_marksmock_durationr  send_promotional_messager{  	test_date	test_timer  r   rP  r  exam_category_idssection_ids[]section_durations[]r   r   zPlease enter Mock Title.r?  zPlease enter mock type.Please enter total questions.Please enter total marks.Please enter mock duration.Please enter accessible number.Please enter negative marks.rj  )r  r  r=  rA  rC  r  rg  r  r  r  r  r   r  r  r  rP  r|  )r  r  r=  r  rg  r  r  r  r  r   r  r	  r  r  rP  r  r  r  r  )r  r  r=  r  rg  r  r  r  r   r  r  ztopic mock_id )r  r  examcategory_idr  rg  r  r  r  r  r   r  r	  r  r  rN  rO  r  rP  rk  r   r  r=  r  r>  zMock Test saved successfully.r^  )r   r   r   r   r_  r	   rG   r   rb  r  r  r   rV   r  rd  rc  r   rU   )r   r  r  rN  rO  r=  rA  rC  r  r  r  r  r  r  r  r  r  r	  r  r   rP  r  r
  section_idssection_durationsr  mock_idr\  r   rg  r   r   r   add_mocktest  s    








"




r  c                 C   s  | j d}| jdkr| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}| jd
}	| jd}
| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd}g }|rL|| |r\|| |rl|| |r||| |r|| |dkrtdddS |dkrtdddS |dkr|dkr|dkr|dkr|dkr|dkrtdd dS |}|rp|d!kr|}tjj	|d"j
d#||||||||||d$|	|
t||d%d&}td'd(||||d)S |d!kr~|}tjjd#||||||||||||d$|	|
t||d*}td'd+|||d,d-S ntdd.dS d S )/NrQ  r   r=  ri  rA  r)  r  r  time_to_speedmarknegative_markrG  rC  correctr  editor2question_filepquestion_id
pparagraphr  r  r  r  r  r  r   r   Please enter Section name.r?  Please enter question.rz  Please enter atleast 2 options.r  r%  r   r	  r   )parent_question_idr=  rA  rC  r  rC  r  r  rG  r  r  r   r  r  r  r  	is_editedr>  #Question data updated successfully.r   r   ri  r  rQ  ri  )r$  r=  rA  rC  rQ  rC  r  r  r  r  rG  r  r  r   r  r  r  r  !Question data added successfully.rb  r   r   ri  r  rQ  r;  r^  r   r   r   r   r`  r   r	   rE   r   r   r  r  r  rb  )r   rQ  r=  ri  rA  r)  r  r  r  r  r  rG  rC  r  r  r  r  r  r   r  r  r  r  r  r  r  	correct_ar'  r   r   r   add_question_store  s    







2

]r,  c                 C   s  | j d}| jdkr| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}| jd
}	| jd}
| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd}g }|r@|| |rP|| |r`|| |rp|| |r|| |dkrtdddS |dkrtdddS |dkr|dkr|dkr|dkr|dkr|dkrtdddS |}|rb|d kr|}tjj	|d!j
d"|||||||||d#|	|
t||d$d%}td&d'||||d(S |d krp|}tjjd"|||||||||||d#|	|
t||d)}td&d*|||d+d,S ntdd-dS d S ).NrQ  r   r=  ri  rA  r)  r  r  r  r  r  rG  r  r  r  r  r  r   r  r  r  r  r  r  r   r   r!  r?  r"  rz  r#  r  r%  r   r	  r   )r$  r=  rA  rC  r  r  r  rG  r  r  r   r  r  r  r  r%  r>  r&  r'  )r$  r=  rA  rC  rQ  r  r  r  r  rG  r  r  r   r  r  r  r  r(  rb  r)  r^  r*  )r   rQ  r=  ri  rA  r)  r  r  r  r  r  rG  r  r  r  r  r  r   r  r  r  r  r  r  r  r+  r'  r   r   r   oadd_question_storew  s    







2

]r-  c                 C   s   | j dkr| jd}t| t|}|d }t| t }| D ]B}t }|D ]}t|j |	t
|j qT|	| td  S ntdddS d S )Nr   r  Sheet1z<h2> form submitted.</h2>r   r^  r?  )r   r`  r   r   r  r  r   r  r,  r   rH  r   r	   )r   r  r  	worksheet
excel_datar  row_datar  r   r   r   upload_excel9  s    



*r2  c                 C   s   t j }tj }tj }tj }tj }| jd}t	t
|d}tjj|d}	tjj|d}
t|
jddd}t| d||	|
|||||||d
S )	Nr;  r%  )rb  r  Tr   zedit_mock.html)
r  rU   rV   r  r  r  rV  r  r  selected_exam_ids)rC   r   r   rD   rF   rA   rN   r   r   r   rG   rU   r   rV   r   r   r   )r   r  r  r  rV  r  r  r  r  Zmock_sectionZ	mock_examr3  r   r   r   edit_mock_test  s    




r4  c                 C   s  | j dkr| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}| jd
}	| jd}
| jd}| jd}| jd}| jd}| jd}| jddk}| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd}|dkrTtdddS |
dkrltdd dS |dkrtdd!dS |dkrtdd"dS |dkrtdd#dS |dkrtdd$dS |dkrtdd%dS |dkrtdd&dS |dkrtdd'dS t||||||	||
|d(|||||||||||d)}|j}tjj	|d*
  |D ]}tjj||d+ qb|d,ks|d-kr|jddddddddddd	d
gd. n|d/ks|d0ks|d1ks|d2ks|d3krdtjj	|d*
  tt|D ].}tjj||| || r(|| nd4d5 q|jddddddddddddd	ddddgd. n(|jdddddddddddd6dd	gd. td7d8dS ntdd9dS d S ):Nr   r  r  r  r  rN  rO  r=  rA  rC  r  r  r  r  pass_perr  r  r{  r  r	  r  r   r  r
  r  rP  r  r   r   r!  r?  r  zPlease Select Exam Category.r  r  zPlease enter pass Percentage.r  r  rj  ZEasy)r   r  r  r=  rA  rC  r  r  r  r  r  r  r  r	  r  r   r  rN  rO  rP  r  r  r  r  r  rk  r}  r~  r  r  r  r   r  r  r>  zMock Test Updated successfully.r^  )r   r   r   r_  r	   rG   r  rV   r   r   rF  rb  rd  rU   rc  r   )r   r   r  r  r  rN  rO  r=  rA  rC  r  r  r  r  r5  r  r  r  r	  r  r   r  r
  r  rP  r  r  r\  rg  r   r   r   	edit_mock  s    









&2
0(r7  c                 C   s   | j dkr| jd r| jd }t|}|j}g }|jdddD ]j}|d }|d }|d }|d }	|d	 }
|d
 }|d }|d }d}t||||	|||
|d}|| q@tj	| t
dddS )Nr   rq  r  Trr  r   r   rI  rJ  r   ru  rv  ZNew)r  r  r  r  sourceremarkaddressr   r>  zLeads uploaded successfully.r?  )r   r`  r  r  r  r  r;   r   r   r  r	   )r   r  r  r  Z
leads_datar  r  r  r  r  location	lead_typer8  r9  r   lead_objr   r   r   upload_lead_excel
  s6    

r>  c                 C   s&   | j d}t|  tdddS )Nr   r>  zMock Test deleted successfully.r?  )r   r   rG   ro  r	   rp  r   r   r   delete_mock-  s    r?  c                 C   s  d}| j dkr<tjj| jd| jddddddd d}tjjd	d
}tjjdd	d}| j
d}| j
d}| j
d}| j
d}| j
d}| j
d}	d}
|r|jtdtdddj|d}|
d| 7 }
|r|j|d}|
d| 7 }
|r|j|d
}|
d| 7 }
|r<|j|dd}|
d| 7 }
|r\|j|d}|
d| 7 }
|	r||j|	d }|
d!|	 7 }
| j
d"d#krt }|j}d$|_d%d&d'd(d)d*d+d,d-d.g
}|| t|dd/D ]\}}t|jj|dd0jd1d2d3}tjj|d4jd5d2d3 }ttjj|d6jd7d2d3}|||j d|j |j|j|j|j|j|rhd8 |nd9|rzd8 |nd9t!|j"g
 q|d D ]}tj#j$d2d:|_%qt&d;d<}d=|d>< |'| |S t(|d?}| j
d@}|)|}| j
dAd}i }i }|D ]|}t|jj|dd0jd1d2d3}|r4|ng |_*tjj|d4jd5d2d3 }ttjj|d6jd7d2d3}|r||ng |_+qt,| dB||||
|||||||	||dCS )DNr   r   r  rL  r   r   )r  rL  r  r  r  r  r  r  r	  r   )is_leadr
  r  r  r   r  r  r  r  r  r  r  r  r  Zmobile__icontainsr  rv  )Zordercourses__batch_idordercourses__lecturesr  rw  ry  rz  r|  ZexportexcelrJ   zSR NoNamezName on AadharEmailZMobilezWhatsapp NumberzAadhar NumberZBatchesZCoursesz
Added Dater]  )Zordercourses__studentrB  r  Tr   r*  r  r  r  r'  r  )r  zAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetr"  z"attachment; filename=students.xlsxr$  r   r  r   zstudent_module.html)r   r  r  r   r   r  r  r   r  r  r  student_batchesstudent_courses)-r   r8   r   rb  r   r   rI   r   rJ   r   r   r  r~   r   r  Workbookr  r   r   re  r   r  r   r   r@   r  r  aadhar_namer  r  whatsapp_numberaadhar_numberr  rH  r  stylesFontr  r   rd  r   r  r   r  r   )r   r   r  r  r  r  r   r  r  r  r   r  wsr  r  r   r  r2  r  r  rC  r!  r"  r#  r   rF  rG  r   r   r   Students_list5  s
   


	
  
 



rO  c                    s  zt jj d}W n& t jk
r8   t| dddi Y S X tjj ddddd	d
}t	jjddd}|j
}tjj|tdddd d }tjj|ddddjtt|t ddd}dddddddg}|jr|jrt|j|j}	ng }	tjj||	ddjtdd}
i |
D ] }|d p2dt|d < q"fd d!|	D } fd"d!|D }| jd#kr| j D ]R\}}|d$r~t|d$d%}| rt|nd}tjj ||d|id& q~t!| j"S t| d||||||	||d'S )(Nr%  zbatch-students.htmlr   Batch not foundr   rL  r  r   r  r  r  r	  r   r  r)  r  r)  no_of_lecturesr&  r'  r(  output_fieldr   )rS  MondayTuesday	WednesdayThursdayFridaySaturdaySunday)r  Z	month__inmonthc                    s&   g | ]}t | t |d dqS )r   )r]  r   )rH  r   )r1  r  )monthly_capsr   r   r    s     z"batch_students.<locals>.<listcomp>c                    s    g | ]}|t jj| d fqS ))dayr  )re   r   r   r1  r_  r%  r   r   r     s     r   Z	lectures_r   )r  rC  defaults)r  r$  exam_syllabusr  time_slots_listbatch_monthsZmonthly_rowsr  )#rI   r   r   r>  r   r8   r   r   r   r@   r$  rc   r   r  rX   r  r    r   r   r  r  get_month_rangerd   r   rH  r   r   r5  r  r  r(  isdigitupdate_or_creater   r2  )r   r   r  r  r  r$  Zlecture_subqueryrb  all_daysrd  Zcaps_qsr  r  rc  rC  r  rS  r   )r   r^  r   batch_students  s          

ri  c                 C   s   | j d}| j d}| j dd }|r2|sFtddg ddd	S tjj|d
jddd}tjj||ddjddd}tjj|ddj	|d
dd}|r|t|dt|dB t|dB t|dB }dd |D }td|dS )Nr  rL  r2  r   r   zCourse and batch are required.)r   r   r   rA  r   r  r  Tr   r   )r  rL  r  r   )r  r@  r  r  r  Zfirst_name__icontainsZlast_name__icontainsru  rA  c                 S   sB   g | ]:}|j |jpd  d|jp d   |jp0d |jp8d dqS )r   r  )r   r  r  r  )r   r  r  r  r  r  )r1  r   r   r   r   r  B  s   z1get_course_students_for_batch.<locals>.<listcomp>r>  )r   r   )r   r   r  r	   r8   r   r   r   rJ   r  r   r   )r   r  rL  r   Zenrolled_student_idsZassigned_student_idsr   rZ  r   r   r   get_course_students_for_batch  s`       
rl  c              	   C   s  | j dkrtdddddS tt|d}| jd}tt| j	d	}|s`tdd
dddS |svtdddddS t
jj|d }|stdddddS ttjj||djddd}tdd |D rtdddddS dd |D }||kr
tdddddS d}t  |D ]}	tjj|	||d }
|
rj|
jdkrd|
_|
jddgd |d7 }qtjj|	|ddd  }
|
r||
_d|
_|
jd!ddgd ntjj|	||dd" |d7 }qW 5 Q R X td#| d$|d%S )&Nr   r   r  r?    r   r%  r  r4  zPlease select a course.rA  z#Please select at least one student.zSelected course was not found.rE  )r  r  r  Tr   c                 s   s   | ]}t |  V  qd S r@  )rH  rf  r1  r  r   r   r   r3  k  s     z-bulk_assign_batch_students.<locals>.<genexpr>zInvalid student selection.c                 S   s   h | ]}t |qS r   )r  rn  r   r   r   	<setcomp>n  s     z-bulk_assign_batch_students.<locals>.<setcomp>z>One or more selected students are not enrolled in this course.r   )r  r  r  r   r  
updated_atrk  )r  r  Zbatch__isnullr
  r  )r  r  r  r  r>  z/ student(s) assigned to the batch for lectures.)r   r   assigned_count)r   r	   r   rI   r   r   r   dictfromkeysr_  r@   r   r   r  r  r8   r   anyr   atomicr  rd  r   r  rb  )r   r   r  r  r4  r  Zenrolled_idsZrequested_idsrq  r  Z
assignmentr   r   r   bulk_assign_batch_studentsO  s    
 


rv  c                 C   s   | j dkr| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}| jd
}	| jd}
|dkrtdddS t|||||||||	|
d
}|jddddddd	d
dg	d tdddS ntdddS d S )Nr   r  fnamelnamer  r  r:  citystatepincoderJ  r   r   zPlease enter First name.r?  )
r   r  r  r  r  r:  ry  rz  r{  rJ  r  r  r  rk  r>  Student Updated successfully.r^  )r   r   r   r	   rJ   rd  )r   r   r  r  r  r  r:  ry  rz  r{  rJ  r  r   r   r   edit_student  s8    
r}  c                 C   s&   | j d}t|  tdddS )Nr   r>  zStudent deleted successfully.r?  )r   r   rJ   ro  r	   rp  r   r   r   delete_student  s    r~  c                 C   s&   | j d}t|  tdddS )Nr   r>  zLead deleted successfully.r?  )r   r   r;   ro  r	   rp  r   r   r   delete_lead  s    r  c                 C   sf   | j d}tjj|d}| j d}|jdkr6d}nd}t|||d}|jddgd td	d
dS )Nr  r%  r9  r	  r  )r   r9  r   r   rk  r>  r|  r?  )r   r   rJ   r   r   rd  r	   )r   r   r  r9  r   r   r   r   r   block_student  s    
r  c                 C   sD   | j d}| j d}| j d}tjjd|d}t| dd|iS )Nr   datesr   )r@  Zsource__startswithzsearch_student.htmlr  )r   r   rJ   r   r   r   )r   r   r  r8  r  r   r   r   search_student  s
    	r  c                 C   s   t jj|d}t| dd|iS )Nr%  student_profile.htmlr  )rJ   r   r   r   )r   r   r  r   r   r   Student_Profile  s    r  c                 C   s  t j }tj }| jd}| jd}| jd}| jd}| jd}| jd}| jd}	d}
tj d	}|r|j|d
}|
d | }
|r|j	t
dtdddj|d}|
d | }
|r|j|d}|
d | }
|r|j|d}|
d | }
|	r |j|	d}|
d |	 }
|r>|j|d}|
d | }
|r\|j|d}|
d | }
t|d}| jd}||}t| d|||
||	|||||||dS ) Nr<  r  r  r  r  r8  r   r   r
  )r<  z&lead_type=r  r  r  r  r  r  r  r  )	source_idz&source=)	status_idrv  rw  ry  rz  r|  r   r  zlead_management.html)r  r  r   r8  r   r  r  r<  
all_source
all_statusr  r  )r0   r   r   r1   r   r   r;   r   r   r  r~   r   r   r  r   )r   r  r  r<  r  r  r  r  r8  r   r   r  r!  r"  r#  r   r   r   Lead_Management  sH    

 

r  c                 C   s   t jdjddjdd}| jdr<|j| jdd}t|d}| jd	}||}d
}| jdrx| jd}t	| d||dS )Nr
  Tr   r   )Zorder_courses__is_orderr   r  2   r  r   zapp-leads.html)r  r   )
rJ   r   r   r   r  r   r   r   r  r   )r   r  r!  r"  r#  r   r   r   r   	app_leads1  s    

r  c                 C   s   t jjtd}t| dd|iS )Nr%  zlead_view.htmlr  )r;   r   r   r   r   )r   r  r   r   r   	Lead_View@  s    r  c              	   C   sj   t  }tjj|d}tjj|d}tjj||d}tjj||d}tjj|d}t| d|||||dS )Nr%  r  )r  Zfollwup_date__lt)r  follwup_date__gtezlead-student-profile.html)r  all_taskall_commentdue_taskupcoming_task)	r   r  r;   r   r   r=   r   r<   r   )r   r   r  r  r  r  r  r  r   r   r   Lead_Student_ProfileE  s    r  c                 C   s&   t j }tj }t| d||dS )Nzadd-lead.html)r  r  )r0   r   r   r1   r   )r   r  r  r   r   r   addLeadP  s    

r  c                 C   sr  | j dkr`| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}| jd
}	|dkrtdddS |dkrtdddS |dkrtdddS |dkrtdddS |dkrtdddS |dk rtdddS |dkrtdddS |	dkr.tdddS t|||||||	||d	}
|
  tdddS ntdddS d S )Nr   r  r  r  r  r<  r8  r   r;  r9  r   r   Please enter first name.r?  Please enter last name.Please enter email address.Please enter mobile number.Please enter location.Please select source.rj  Please enter remark.)	r  r  r  r  r<  r  r9  r:  r  r>  zLead Created successfully.r^  r   r   r   r	   r;   rd  )r   r  r  r  r  r<  r8  r   r:  r9  followupr   r   r   saveLeadV  sP    


r  c                 C   sn  | j dkr\| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}| jd
}	|dkrtdddS |dkrtdddS |dkrtdddS |dkrtdddS |dkrtdddS |dk rtdddS |dkrtdddS t||||||||	|d	}
|
jdddddddd	gd tdddS ntdddS d S )Nr   r  rw  rx  r  r  r:  r8  r9  r   r   r   r  r?  r  r  r  r  r  r  )	r   r  r  r  r  r:  r9  r  r  r  r  r  r  r  rk  r>  zLead Updated successfully.r^  r  )r   r   r  r  r  r  r:  r8  r9  r   r  r   r   r   	edit_lead  sL    

r  c                 C   s   | j dkr| jd}| jd}| jd}| jd}| jd}|dkr\tdd	d
S |dkrrtddd
S |dkrtddd
S t|||||d}|  tddd
S ntddd
S d S )Nr   r   
task_titler   r   is_completedr   r   zPlease enter task title.r?  zPlease select date.zPlease select time.)r  r  r   follwup_timer  r>  z"follow up task saved successfully.r^  )r   r   r   r	   r=   rd  )r   r  r  r   r   r  r  r   r   r   addFollowUp  s,    
	r  c                 C   s,   t  }tjj|dd}t| dd|iS )N)r  r   zlead-followup.htmlall_followup)r   r  r=   r   r   r   r   )r   r  r  r   r   r   Lead_followup  s    r  c                 C   sn   | j dkr\| jd}| jd}|dkr8tdddS t||d}|  td	d
dS ntdddS d S )Nr   r   r  r   r   zPlease enter message.r?  )r  r  r>  zcomment saved successfully.r^  )r   r   r   r	   r<   rd  )r   r  r  commentr   r   r   addComments  s    
r  c                 C   sV   t jd}tjd}tjjddd}tjjddd}t| d||||dS )	Nr$  exam_masterr	  r   r
  r  zcourse-list.html)active_coursesinactive_coursesr  rK  )rA   r   r   rN   r@   r   r   r   )r   r  rK  r  r  r   r   r   r    s      r  c           1      C   s,  t j }tj }tj }tjjdd}tj }| jdkr| j	
d}| j	d}| j	
d}| j	
d}	| j
d}
| j
d	}| j	d
}| j	d}| j	d}| j	
d}| j	
d}| j	
d}| j	
d}| j	d}| j	
d}| j	
d}| j	
d}| j	
d}| j	
d}| j	
d}| j	
d}| j	
d}| j	
d}| j	
d}| j	
d}| j	
d}| j	
d} | j	
d}!| j	d }"| j	d!}#| j	d"}$| j	d#}%| j	d$}&| j	
d%d&}'|'d'krd(nd)}(|d*krtd+d,d-S |	d*krtd+d.d-S |d*kr6td+d/d-S |d*krNtd+d0d-S |d*krftd+d1d-S |d*kr~td+d2d-S |d*krtd+d3d-S |d*krtd+d4d-S |d*krtd+d0d-S |d*krtd+d5d-S |d*krtd+d6d-S |d*krtd+d7d-S |d*kr&td+d8d-S |d*kr>td+d9d-S |d*krVtd+d:d-S |d*krntd+d;d-S |!d*krtd+d<d-S |
}
|}|d*kr|
d*krtd+d=d-S |d*krtd+d>d-S |
rtj|
jd? })t d@|) }*|*|
_|r,tj|jd? })t d@dA |) }*|*|_tjj||	||
|||||||||||||||| |||(|!dB}+|+j},|D ]}-tjj|,|-dC qr|D ]}.tjj|,|.dD q|D ]}/tjj|,|/dE qtt|"D ]2}0tjj|,|"|0 |$|0 |%|0 |#|0 |&|0 dF qtdGdHd-S tt|dI}+||+_|	|+_||+_ ||+_!||+_"||+_#||+_$||+_%||+_&||+_'||+_(||+_)||+_*||+_+||+_,||+_-||+_.| |+_/||+_0|!|+_1||+_2|(|+_3|
rtj|
jd? })t d@|) }*|*|
_|
|+_4|rtj|jd? })t d@dA |) }*|*|_||+_5|+6  tjj|dJ7  tjj|dJ7  tjj|dJ7  tjj|dK7  |D ]}-tjj||-dC qd|D ]}.tjjdL||.dM q|D ]}/tjj||/dE qtt|"D ]2}0tjj||"|0 |$|0 |%|0 |#|0 |&|0 dF qtdGdN|dOS n t8| dP||dQdQ||d+dR|dS	S d S )TNr	  r   r   r  rL  r  Zeditor3rM  d_imageacademic_id	exam_typer  r  r_  meta_descriptionra  r  r  editor1
area_pricesectional_priceminimock_pricefullmock_pricelectures_pricewp_link
full_pricediscount_pricer  c_pricecourse_typer   zcourse_id[]price[]zcourse_name[]zcourse_info[]zdiscount_price[]is_verifiedfalsetrueTFr   r   zPlease enter course namer?  zPlease Enter SubtitlerT  zPlease enter course descriptionzPlease enter course meta titlez$Please enter course meta descriptionzPlease enter course slugzPlease enter course durationzPlease enter area pricezPlease enter sectional pricezPlease enter minimock pricezPlease enter full mock pricezPlease enter lecture pricezPlease enter full pricezPlease enter counseling pricerj  zPlease select thumbnail imagez!Please select course detail imager   r/  _detail)r  subtitlefeaturesrM  course_imager  r_  r  ra  r  r  descriptionr  r  r  r  r  r  r  r  r  r  r  r   )r  rL  )r  rX  )r  academic_year_id)add_on_course_idr  r  course_infopricer  r>  zCourse created successfully.pkr  r  r   )
is_deletedr  rX  zCourse updated successfully.)r   r   exam_type_idcourse_form.htmlz
Add Courser^  )	r   all_academics
form_titlesubmit_buttonr  rK  r   r   r  )9rA   r   r   rN   ro   rI   r   r@   r   r   r   r_  r`  r	   r1  r2  r3  r  rw   r   r  rb  r   r)   r*   r!   rc  r   rT   r   r  r  r  r  r  r  r_  r  ra  r  r  r  r  r  r  r  r  r  r  r   r  r  rM  r  rd  rF  r   )1r   r  rK  r  r   r  r  rL  r  r  rM  r  r  r  Zexam_mastersr  r_  r  ra  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r2  pricesZcourse_name1r  Zdiscount_pricesZis_verified_strr  r:  new_namer  Zcourseidr  rU  Zacademicrg  r   r   r   course_create	  s   



























	



	r  c                 C   s   t t|d}tjj|d}tjj|d}tjj|d}tjj|d}tj }|j	}t
| tj }	tj }
tjjdd}tj }t| d|||dd|||	|
||||d	S )
Nr  r  r  r	  r   r  zEdit CoursezSave Course)r  r  r   r  r  r  	c_batchesr  rK  c_examsr1  addonsc_academics)r   r@   r)   r   r   r*   r!   rT   r   r  r   rA   rN   rI   ro   r   )r   r  r  r  r  r  r  r  r1  r  rK  r   r  r   r   r   course_edit  s    



r  c                 C   s*   | j d}tjj|d}t| dd|iS )Nr  rJ  zselect_exam_master.htmlr  )r   r   rN   r   r   r   )r   r  r  r   r   r   select_exam_category  s    r  c                 C   s&   | j d}t|  tdddS )Nr  r>  zCourse deleted successfully.r?  )r   r   r@   ro  r	   rp  r   r   r   delete_course"  s    r  c                 C   s<   | j d}| j d}tjj|dj|d tdddS )Nr  r   r%  r   r>  z#Course status updated successfully.r?  )r   r   r@   r   r   r  r	   r   r   r   r   r   r   change_course_status*  s    r  c                 C   s<   | j d}| j d}tjj|dj|d tdddS )NrL  r   r%  r   r>  z"Batch status updated successfully.r?  )r   r   rI   r   r   r  r	   r  r   r   r   change_batch_status1  s    r  c                 C   s<   | j d}| j d}tjj|dj|d tdddS )Nr\  r   r%  r   r>  z%Category status updated successfully.r?  )r   r   rA   r   r   r  r	   r  r   r   r   change_category_status8  s    r  c                 C   s:   t j }t|d}| jd}||}t| dd|iS )Nr   r  z
media.html	all_media)rB   r   r   r   r   r   r  r   )r   r  r!  r"  r#  r   r   r   mediaD  s
    


r  c                 C   sr   | j dkr`| jd}t| |dkr4tdddS |D ]}t|d}|  q8tdd	dS ntdd
dS d S )Nr   rM  r   r   Please select imagesr?  )rM  r>  Images Uploaded successfully.r^  )r   r`  r_  r   r	   rB   rd  )r   rM  media_imager  r   r   r   addMediaN  s    

r  c                 C   st   | j dkrb| jd}| jd}|dkr8tdddS t||d}|jdgd	 td
ddS ntdddS d S )Nr   r   rM  r   r   r  r?  )r   rM  rk  r>  r  r^  )r   r   r   r`  r	   rB   rd  )r   r   rM  r  r   r   r   	editMediab  s    
r  c                 C   s&   | j d}t|  tdddS )Nr   r>  zMedia deleted successfully.r?  )r   r   rB   ro  r	   rp  r   r   r   deleteMediabyIdx  s    r  c           
   
   C   sv   d}|dkrd}t j }tj }tj }tjj|d}t|d}| j	d}|
|}	t| d|	|||||dS )	NzArea Mock Testr  zSectional Mock Test)series_typer   r  zmock-test-series.html)	all_mocksr   r  r  r  rK  )rC   r   r   rA   rN   r>   r   r   r   r   r  r   )
r   r  r   r  r  rK  r  r!  r"  r#  r   r   r   MockTestSeries  s    




r  c              	   C   s  | j dkr | jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}|d
krtdddS |d
krtdddS |d
krtdddS t|||||||d}	|	  |	j}
|D ]}t|
|d}|  qtdddS ntdddS d S )Nr   r   r'  r  r  r  total_testsrelease_dater   r   r   Please enter coupen code.r?  r  rj  )r   r  r  r  r  r  r   r  sections_idr>  -Area Mock Test series Created   successfully.r^  )	r   r   r   r_  r	   r>   rd  r   r5   )r   r   re  r  r  r  r  r  r   r  r  r'  r   r   r   addTestSeries  sD    

r  c              
   C   s  | j dkrx| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}| jd
}	|dkrtdddS |dkrtdddS |	dkrtdddS | jd rt||||||||	d}
|
jddddddd	d
gd n2t||||||||	d}
|
jdddddd	d
gd |
j}t	j
j|d  |D ]}t	||d}|  qLtdddS ntdddS d S )Nr   r   r   r'  r  r  r  r  r  r   r   r   r  r?  r  rj  rM  )r   r   r  r  r  r  r  r   r  r  rk  )seriesr  r>  r  r^  )r   r   r   r_  r	   r`  r>   rd  r   r5   r   r   ro  )r   r   r   re  r  r  r  r  r  r   r  r  r'  r   r   r   editTestSeries  sb    r  c                 C   sB   | j dkr0| jd}t|  tdddS tdddS d S )Nr   r   r>  z&Mock Test Series deleted successfully.r?  r   r^  )r   r   r   r>   ro  r	   rp  r   r   r   deleteMockTestSeries  s
    
r  c           
      C   s   | j d}| j d}| j d}| j d}d}tj d}|r`|j|d}|d | }|r||j|d	}|d
 | }|r|j|d}|d | }|r|j|d}|d | }t|d}| j d}||}	t| d|	|dS )Nr  r  status_namebg_colorr   r
  rw  ry  rz  r|  )Zstatus_name__startswithz&status_name=)Zbg_color__startswithz
&bg_color=r   r  zlead-status.html)r   r   )	r   r   r1   r   r   r   r   r  r   )
r   r  r  r  r  r   r   r!  r"  r#  r   r   r   lead_status!  s,    

r  c                 C   s   | j dkrr| jd}| jd}|dkr8tdddS |dkrNtdddS t||d	}|  td
ddS ntdddS d S )Nr   r  r  r   r   rr  r?  rs  )r  r  r>  rt  r^  r   r   r   r	   r1   rd  )r   r  r  r  r   r   r   add_lead_statusA  s    
r  c                 C   s   | j dkr| jd}| jd}| jd}|dkrDtdddS |dkrZtdd	dS t|||d
}|jddgd tdddS ntdddS d S )Nr   r   r  r  r   r   rr  r?  rs  )r   r  r  rk  r>  rw  r^  r  )r   r   r  r  r  r   r   r   edit_lead_status\  s     
r  c                 C   s.   | j d}t| t|  tdddS ry  )r   r   r   r1   ro  r	   rp  r   r   r   delete_lead_statusy  s    r  c           	      C   s   | j d}| j d}| j d}d}tj d}|rT|j|d}|d | }|rp|j|d}|d	 | }|r|j|d
}|d | }t|d}| j d}||}t| d||dS )Nr  r  source_namer   r
  rw  ry  rz  r|  )Zsource_name__startswithra  r   r  zlead-source.html)r8  r   )	r   r   r0   r   r   r   r   r  r   )	r   r  r  r   r   r8  r!  r"  r#  r   r   r   lead_source  s$    

r  c                 C   s`   | j dkrN| jd}|dkr,tdddS t|d}|  tdd	dS ntdd
dS d S )Nr   r  r   r   rr  r?  )r  r>  rt  r^  r   r   r   r	   r0   rd  )r   r  r  r   r   r   add_lead_source  s    
r  c                 C   st   | j dkrb| jd}| jd}|dkr8tdddS t||d}|jdgd	 td
ddS ntdddS d S )Nr   r   r  r   r   rr  r?  )r   r  rk  r>  rw  r^  r  )r   r   r  r  r   r   r   edit_lead_source  s    
r  c                 C   s.   | j d}t| t|  tdddS ry  )r   r   r   r0   ro  r	   rp  r   r   r   delete_lead_source  s    r  c                 C   s:   t j }t|d}| jd}||}t| dd|iS )Nr   r  zvocab-questions.htmlall_vocab_questions)rR   r   r   r   r   r   r  r   )r   r   r!  r"  r#  r   r   r   vocabulary_questions  s
    


r  c                 C   s   | j dkrn| jd}| jd}|dkr8tdddS |dkrNtdddS tjj||d	}td
ddS ntdddS d S )Nr   wordmeaningr   r   zPlease enter word.r?  zPlease enter meaning.r  r  r>  zvocab created successfully.r^  )r   r   r   r	   rR   r   rb  )r   r  r  vocabr   r   r   add_vocab_question  s    
	r  c                 C   s   | j dkr| jd}| jd}| jd}|dkrDtdddS |dkrZtdd	dS t|||d
}|jddgd tdddS ntdddS d S )Nr   r   r  r  r   r   zPlease Enter Word.r?  zPlease enter Meaning .)r   r  r  rk  r>  zvocab updated successfully.r^  )r   r   r   r	   rR   rd  )r   r   r  r  r  r   r   r   edit_vocab_question  s     
r  c                 C   s&   | j d}t|  tdddS )Nr   r>  zvocab deleted successfully.r?  )r   r   rR   ro  r	   rp  r   r   r   delete_vocab_question   s    r  c           	      C   s   | j dkr| jd r| jd }t|}|j}t| g }|jdddD ]*}|d }|d }t||d}|| qHtj	
| td	d
dS )Nr   rq  r  Trr  r   r   r  r>  zvocab uploaded successfully.r?  )r   r`  r  r  r  r   r  rR   r   r   r  r	   )	r   r  r  r  Z
vocab_datar  r  r  r=  r   r   r   upload_vocab_excel    s     

r	  c                 C   s@   t jd }t|d}| jd}||}t| dd|iS )Nr
  r   r  zdevice-login-history.htmllogin_history)	r4   r   r   r   r   r   r   r  r   )r   r
  r!  r"  r#  r   r   r   Device_login_history<   s
    

r  c                 C   sx   | j dkrf| jd}| jd}|dkr8tdddS t||dd	}|jdd
gd tdddS ntdddS d S )Nr   r   
is_lecturer   r   z&Please Enter select lecture authority.r?  r   )r   r  is_adminr  rk  r>  z!Lecture device info successfully.r^  )r   r   r   r	   r4   rd  )r   r   r  r  r   r   r   edit_login_is_lectureD   s    
r  c           3      C   st  t jj|d}tjj|ddd}tjjdd}tjj|djdd	d}|j	d
dd}|j	d
dd}t
jj|dj	ddd }tjj|dd}tjj||dd}	i }
|	D ]}|j|
kr||
|j< qg }|D ]~}|
|j}|r|jrdnd}|||rdnd|r"|jr"|jnd |r8|jr8|jnd |rN|jrN|jnd d qtjj|dd}| jd}| jd}i }|r||d< |r||d< tj }i }tjj|dddjtdtdddjf |ddd ddd!jtd"td#td$ td#td$td%td&td'td(td)d*	jttd+t td%td'd,  t!" d-d.d+t!" d/ttd+td0td1 d2 d.d+t!" d/ttd+td1td" d2 d.d+t!" d/d3d4}g }|D ]T}t#tjj|d dd5j	d%dd|d% }t$t%|d+ d6|d7< t%|d |d8< qtjj|dd6djtdtdddjf |ddd ddd!jtd"td#td$ td#td$td%td&td'td(td)d*	jttd+t td%td'd,  t!" d-d.d+t!" d/ttd+td0td1 d2 d.d+t!" d/ttd+td1td" d2 d.d+t!" d/d3d4}g }|D ]R}t#tjj|d d9j	d%dd|d% }t$t%|d+ d6|d7< t%|d |d8< q>tjj|dd:djtdtdddjf |ddd ddd!jtd"td#td$ td#td$td%td&td'td(td)d*	jttd+t td%td'd,  t!" d-d.d+t!" d/ttd+td0td1 d2 d.d+t!" d/ttd+td1td" d2 d.d+t!" d/d3d4}g }|D ]T}t#tjj|d dd5j	d%dd|d% }t$t%|d+ d6|d7< t%|d |d8< qtjj|dd;djtdtdddjf |ddd ddd!jtd"td#td$ td#td$td%td&td'td(td)d*	jttd+t td%td'd,  t!" d-d.d+t!" d/ttd+td0td1 d2 d.d+t!" d/ttd+td1td" d2 d.d+t!" d/d3d4}g }|D ]T}t#tjj|d dd5j	d%dd|d% }t$t%|d+ d6|d7< t%|d |d8< qtjj|dd<djtdtdddjf |ddd ddd!jtd"td#td$ td#td$td%td&td'td(td)d*	jttd+t td%td'd,  t!" d-d.d+t!" d/ttd+td0td1 d2 d.d+t!" d/ttd+td1td" d2 d.d+t!" d/d3d4}g }|D ]T}t#tjj|d dd5j	d%dd|d% }t$t%|d+ d6|d7< t%|d |d8< qtjj|dd=djtdtdddjf |ddd ddd!jtd"td#td$ td#td$td%td&td'td(td)d*	jttd+t td%td'd,  t!" d-d.d+t!" d/ttd+td0td1 d2 d.d+t!" d/ttd+td1td" d2 d.d+t!" d/d3d4}g }|D ]T}t#tjj|d dd5j	d%dd|d% }t$t%|d+ d6|d7< t%|d |d8< 	qt&jj|d'd>d4}t(|j	d?dd}d@dA t)jj|dD }t*dBdC }|D ]} | j+, }!dD}"dD}#|| j-dD}$| j.dEk
rt/jj| j0d1 }%|%r|%j2}"n| j.dFkrjt3jj| j0d1 }&tjj| j4| j0dGd41 }'|'r|&rJ|&j5}"|'j6 dHt7|'dIdD 8dH}#nv| j.dJkrdK}"t9jj| j4dLdM1 }(|(rt:|(j;}#n:| j.dNkrdO}"t<jj| j4dLdM1 })|)rt:|)j;}#|"r|#r|" dP|# dQ}*n"|"r| =  dR|" }*n| = }*| j+>dS}+|* dT|+ },| j4j? d| j4j@ ||! dU< | j4jA||! dV< | j4jB||! dW< |$r||! dX C|$ ||! dY |,| j+dZ 
qg }-|D D ]\\}.}/tE|/dY d[dC d\}0|-|/dU |/dV |/dW |.d]F|/dX d^Fd_d` |0D da qtG|-db}1| jdc}2|1H|2}tI| dd||||||t%|t%|t%|t%||||||deS )fNr%  r   )r  r  r
  r	  r   r  T)batch_id__isnullrL  r   )batches_id__inr   r  r  )r  lecture_id__inFPresentAbsent)r  r   	join_time
leave_timer  r  r  rx  r{  )r  r  mock_test__mock_typer  r  r  r  mock_test__idmock_test__mock_titler  r  total_questionright_answeredwrong_answeredr  
percentager  	time_leftmock_test__mock_duration	r  	attemptedrightwrongr  r  r  r  r  r   r  rT  attempted__gtthenrF  rU  r!  r   rk  marks_per_minuteright_accuracyavg_attempt-created_atr  r  r  
percentilerankr6  rJ  r   r.  rK  r   rX  c                 S   s   i | ]}|j |jqS r   r   rK  r1  r   r   r   r   r\  !  s    z#Student_Profile.<locals>.<dictcomp>c                   S   s   dddt  g dS Nr   )r  r  r  rU  activity_logsr  r   r   r   r   r  !  s    z!Student_Profile.<locals>.<lambda>r   notes	downloads	area_mocksectional_mock	mini_mock	full_mockadvance_mockpyq_mockbasic_concept_testadvance_concept_testr   r  r  r  daily_speedMathDaily Speed Mathr*  -datedaily_vocabDaily Vocabulary (r  : %I:%M %p   
🕒 r  r  r  rU  r2  r  r   c                 S   s   | d S Nr   r   r  r   r   r   r  ,"  r  r.  r'  r  c                 S   s   g | ]}|d  qS r  r   r1  lr   r   r   r  4"  s     z#Student_Profile.<locals>.<listcomp>r  r  r  r   rU  activityr   r  r  )r  r  r  lecture_wise_attendanceall_batch_listloginsarea_wise_statssection_wise_statsmini_wise_statsfull_wise_statsr  r  student_activitiesadvance_stats	pyq_stats)JrJ   r   r   r7   r   r   rI   r8   r  r   r3   r   rP   r,   r   r   r  r   r  r  r4   r   rC   r   r&   r  r~   r   r  r   r   r   r   r   
FloatFieldcalculate_percentileroundr   rb   r   r  rA   rz   r  r   rX  activity_typer"   resource_idr  r   rG   r   r  r  r  r  rh   rH  scoreri   get_activity_type_displayr  r  r  r  r  addr5  r  r  r   r  r   )3r   r   r  r  rS  r  Zstudent_batch_idslecture_idsr  attendance_recordsattendance_map
attendancerR  r  
is_presentrT  r  r  filter_conditionre  rV  rU  rank_percentilerU  rW  rX  rZ  r[  rY  exam_idsexam_mapgroupedactr.  resource_namera  rM  r  r  r  smr  activity_texttime_strformatted_blockr  r   rZ  logsr!  r"  r   r   r   r  ^   s    



       
$(       
$(       
$(       
$(       
$(       
$(

 



,   c              
   C   s@  | j d}tjj|ddjtddd }tjj|ddjtddd	 }|d
kr`|| d nd
}tjj|ddjtddd }tdd }tdd }tdd }tjj|dd	ddj
tdtdtttdddd
t dtttd
ddd
t dtdd}tjj|dd	ddj
tdtdtttdddd
t dtttd
ddd
t dtddj
tdd}	tjj|dd	dd j
tdtdtttdddd
t dtttd
ddd
t dtddj
tdd}tj }
i }tjj|dd	d!d"j
td#tdtdtd$tdtd%td&d'j
ttd
ttdtd&d(  t d)d d*d
t dttd
td+td d d*d
t dttd
tdtd# d d*d
t dd,}|D ]F}ttjj|d! dd-jdd.d/|d }|d
 |d0< |d |d1< qt|t|
	 |d2}t| d3|S )4Nr   r   )r  r  r   r  r  r  total_correctrw  r   rk  r  student_scorery  c                   S   s   t tS r@  rz   r  r   r   r   r   r  P"  r  z"student_analysis.<locals>.<lambda>c                   S   s   t tS r@  rz  r   r   r   r   r  Q"  r  c                   S   s   t tS r@  rz  r   r   r   r   r  R"  r  question__section_idquestion__section__section_nameri  r   r  r%  r&  r  r   r!  r"  r  question__sub_section_id'question__sub_section__sub_section_namer  question__marks)toppers_marksquestion__topic_idquestion__topic__topic_namer  r  r  r  r  r  )r  r   r!  r"  r  r  r  r  rT  r#  r!  r'  )r  r  Tr   r-  r.  )exam_wise_statsre  r  zoverall-analysis.html)r   r   r&   r   r   r  r   rz   r%   r  r  r}   r   r   r   r   rC   r   r   r   r   r\  r]  r   r   r   )r   r  r  rw  overall_accuracyry  section_statisticssubsection_statisticstopic_statisticssub_section_statisticsre  rV  r  rU  rj  contextr   r   r   student_analysisH"  s        
  
    
  
    
  
  
  
$

r  c                 C   s2   | j d}tjj|djddd tdddS )	Nr   r%  r   r   rQ  r>  zBatch removed successfully.r?  )r   r   r8   r   r   r  r	   rp  r   r   r   remove_batch"  s    r  c                 C   sz   | j dkrh| jd}| jd}| jd}|dkrDtdddS tjj|||d	d
}tdddS ntdddS d S )Nr   r  rL  r  r   r   r  r?  r   )r  rL  r  r  r>  zbatch assigned successfully.r^  )r   r   r   r	   r8   r   rb  )r   r  r  r  r  r   r   r   r  "  s    
c              	   C   s$  t jj|d}tjj|djddd }tjj|djddd }tjj|d	d	d
}t
jj||d	d}i }|D ]}|j|krz|||j< qzg }	|D ]t}
||
j}|r|jrdnd}|	|
|rdnd|r|jr|jnd |r|jr|jnd |r|jr|jnd d qt| d||	dS )Nr%  r&  r  Tr   )batch_id__inr  r  r  r  )r   r  r
  Fr  r  )r   r   r  r  r  zlecture-details.html)r  lecture_attendance_list)rP   r   r   r3   r   r   r   r8   rJ   r   r,   r  r   r  r   r  r  r   )r   r   r  	batch_idsr4  r   re  rf  rg  r  r   rh  r   r   r   Lecture_Details"  sX     
 
 


r  c                 C   sP   t jd }tjjdd}t|d}| jd}|	|}t
| d||dS )Nr
  r	  r   r   r  z
study.html)all_study_materialsrS  )r+   r   r   r   rI   r   r   r   r   r  r   )r   r  rS  r!  r"  r#  r   r   r   StudyMaterial/#  s    

r  c           
      C   s   | j dkr| jd}| jd}|s4tdddS d}|D ]r}|j}tj|jd }t	
 dd	|  | }||_tjj||d
}|D ]}	tjj|j|	d q|d7 }q<tdddS tdddS )Nr   	materialsr  r   zPlease select Materials.r?  r   r/  r-  )r  r  study_idrL  r>  z&Study Materials uploaded successfully.r^  )r   r`  r_  r   r	   r  r1  r2  r3  rw   r   r  r+   r   rb  r'   r   )
r   Zstudy_materialsr  counterZstudy_materialoriginal_namer:  new_filenameZstudymaterialrL  r   r   r   AddStudyMaterial8#  s.    

r  c           
      C   s   | j dkr| jd}| jd}| jd}tt|d}|r|d }|j}tj	
|jd }t d| }||_||_||_|jd	dgd
 n|jg d
 tjj|d  |D ]}	tjj||	d qtdddS tdddS )Nr   r   r  r  r  r   r   r/  r  rk  )r  r  r>  z#Study Material updated successfullyr?  r   zSomething went wrong)r   r   r   r`  r_  r   r+   r  r1  r2  r3  rw   r   r  r  rd  r'   r   r   rF  rb  r	   )
r   r  Zuploaded_filesr  Z	study_objr8  r  r:  new_file_namer  r   r   r   EditStudyMaterialg#  s(    
r  c                 C   s&   | j d}t|  tdddS Nr   r>  zdeleted successfully.r?  )r   r   r+   ro  r	   rp  r   r   r   deleteMaterials#  s    r  c                 C   s&   | j d}t|  tdddS r  )r   r   rE   ro  r	   rp  r   r   r   deleteQuestion#  s    r  )r   	EmptyPagePageNotAnIntegerc                 C   s&  | j d}| j d}| j d}| j d}| j d}| j dd}| j dd	}i }|rh||d
< |rt||d< |r||d< tj }	tjj|ddjtdt	dddjf |
ddddddjtdtdtd tdtdtdtdtdtdtdd	jttdttdtdd   t d!d"dt d#ttdtd$td% d& d"dt d#ttdtd%td d& d"dt d#d'd(}
g }|
D ]R}ttjj|d d)jdd*d+|d }tt|d d,|d-< t|d |d.< q|d-krt|
d/d0 d1}
nV|d2kr0t|
d3d0 d*d4}
n8|d5krNt|
d6d0 d*d4}
n|d.krht|
d7d0 d1}
t|
|}z||}W n@ tk
r   |d}Y n" tk
r   ||j}Y nX tjj|d8}d9t|t|	
 |||||t|t|
 |j|j|td|jd d:}t| d;|S )<NrQ  rN  r   r  r  r  r   per_pager   r  rx  r{  r,  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  rT  r#  r&  r!  r   rk  r'  r+  r6  Tr   r  r-  r.  c                 S   s   | d S Nr-  r   rL  r   r   r   r  #  r  z"mock_test_result.<locals>.<lambda>rM  z-percentilec                 S   s   | d S r  r   rL  r   r   r   r  #  r  r.  reversez-rankc                 S   s   | d S r  r   rL  r   r   r   r  #  r  c                 S   s   | d S r  r   rL  r   r   r   r  #  r  r%  Success)r   r  re  rQ  rN  r   r  r  rj  rc  Zcurrent_pageZtotal_pagesr  
page_rangezmock-test-result.html) r   r   rC   r   r   r&   r   r  r~   r   r  r   r   r   r   r   r\  r   r]  r   r^  r   r  r   r  r  r  	num_pagesrG   r  rc  r   )r   rQ  rN  r   r  r  r  r  ri  re  r  rj  rU  r!  Zpaginated_statsrc  r  r   r   r   mock_test_result#  s    
     ,0






r  c                 C   s  | j d}| j d}| j d}| j d}tjjdd }i }|dkr`d|d< d	|d
< nD|dkrrd|d< n2|dkrd|d< d|d
< n|dkrd|d< d	|d
< |rtjjf |||d|ddddddddddddddddd d!}n@tjjf ||d"|ddddddddddddddddd d!}g }|rXt	t
jj|||d# }t|}tjj||d$}	tjj|d%}
d&t	| t	||t	|	 |||t	|
 d'	}t| d(|S ))Nr  rX  r=  r;  r   )Z	id__exact
bookmarkedr   Tr  r  r  	incorrectr   FZ	notviewed)r  r  r{  question__idr|  r  r  question__questionquestion__paragraphquestion__explanationr  question__negative_marksquestion__correct_answerquestion__optionsquestion__difficulty_level	answer_idr   Zquestion__question_typer  r  r  )r  r  r=  )r  r  r%  r  )	r   re  question_answerssection_resultr  r=  rQ  r  r   zview-solution.html)r   r   rC   r   r  r   r%   r   r  r   r$   r  r&   rJ   r   )r   r  rX  r=  ftypere  ri  r  r  r  r   r  r   r   r   view_mock_solution$  s    


                                     


r  c                 C   s  | j d}| j d}tjj|d}tjj|dddjtddd	 }tjj|dddjtd
dd }|dkr~|| d nd}tjj|dddjtddd }tj	 }i }	tjj||ddd
ddjtdtdtd
td td
tdtdtdtdtdtdd
jttdttdtdd  t dddt dttdtd td td!  d d"dt dttdtdtd d d"dt dd#}
tjj||ddd$
d%jtd&tdt tttddd'dt dtttdd(dd)dt dtdd*}g }|
D ]L}ttjj|d dd+jdd,d-|d }t|d d.|d/< |d |d0< qt|
t|
 ||t|t|
 d1}t| d2|S )3Nr  rX  r%  r   r   )r  r  r  r   ru  r  r  rv  rw  rk  r  rx  ry  )r  r  r  r  r  r  r  r  r  r  r  r  r  )
attempted_atr  r   r!  r"  r  r  r  r  r  r  rT  time_taken__gtr%  r&  r!  r"  r#  r'  )r  r  r  r  r  ri  r}  Fr  r  r%  r~  r,  Tr   r  r-  r.  )r  re  r  rQ  difficulty_wise_statisticsr   zmock-exam-analysis.html)r   r   rJ   r   r   r&   r  r   rC   r   r  r  r   r   r   r   r   r\  r%   r}   r   r   r]  r   r^  r   r   )r   r  rQ  r   r  rw  r  ry  re  rV  r  r  rj  rU  r  r   r   r   mock_analysisH$  s    """
    
"(   

  	

r  c              
   C   s   | j d}| j d}| j d}| jd}i }d|d< d|d< |rP||d	< |r\||d
< tjjf |dd|dddjtdtdt	t
dttdtdd  t dddt dtdtdd}t||||d}t| d|S )Nr  r=  rX  filter_typer   r  r   r  r  r{  F)r  r  r  r  r  r  r  r  rT  r  r&  question__sub_section__strongquestion__sub_section__weak)r  r  r(  r  r  )r  r  r=  rX  zmock-abc-analysis.html)r   r   r   r%   r   r   r  r  r   r   r   r   r   r   r\  r   r   )r   r  r=  rX  r  ri  r  r  r   r   r   abc_analysis$  sV       
8r  c                    sj   t | d d d }d}d}t|dkr^| d }t fdd|D }|t|d  d }||g}|S )Nr  rk  r   c                    s   g | ]}| k r|qS r   r   )r1  ra  target_scorer   r   r  %  s      z(calculate_percentile.<locals>.<listcomp>)r  r   r  )scoresr  sorted_scoresr-  r.  r  rj  r   r  r   r]  %  s    r]  c                 C   sn  | j d}| j d}| j d}| j d}| j d}i }d|d< d|d	< |r\||d
< |rh||d< |rt||d< |r||d< tjj|||dddd
djtdtdtdtd tdtdtdtdtddjtt	dtdtdd  ddt
 dtt	dtdtd d ddt
 dtt	dtdtd d ddt
 dd}|D ]R}ttjj|d
 |d dd jdd!d"|d }	t|	d d#|d$< |	d |d%< q^tjj|||ddd&d'd(jtd'd)jtdttt	ddd*dt dttt	dd+dd,dt dtdtdtt	dtdtdd  ddt
 dtt	dtdtd d ddt
 dtt	dtdtd d ddt
 dd-}
tjjf d|i|d.jtd/tdt ttt	ddd*dt dttt	dd+dd,dt dtdd0}tjj|||ddd&d'd(jtd'd)}d1t|
|||t|t||t|d2	}t| d3|S )4Nr  r=  rA  rX  rC  r   r  r   r  r  r{  r  r  )r  r=  r  r  r  r  r  r  r  r  r  r  )r=  r  r   r!  r"  r  r  r  r  r  r&  r!  r   rk  r#  r  r'  )r  r=  r  Tr   r  r-  r.  )r  r{  r  r  r  question__sub_section__idr  )r  r}  Fr  )r   r!  r"  r  r  r(  r)  r*  r  ri  r~  r  )	r   r  r=  rX  r  section_statsr  ri  r9  z admin/exam_section_analysis.html)r   r   r$   r   r   r  r  r   r   r   r   r\  r]  r   r^  r%   r}   r   r   r   r   r   )r   r  r=  rA  rX  rC  ri  r  rU  rj  r  r  r9  r  r   r   r   exam_section_analysis%  s6         "     
P


         r  c           
      C   s  | j d}| j d}| j d}| j d}| j d}| j d}i }d|d< d	|d
< |rh||d< |rt||d< |r||d< |r||d< |dkrtjjf d|i|ddjtdtdtt	t
dddd	t dtt	t
d	ddd	t dtdtdt	t
d	tdtdd  dd	t dt	t
d	tdtd d dd	t dt	t
d	tdtd d dd	t dd	}ntjjf d|i|ddjtdtdtt	t
dddd	t dtt	t
d	ddd	t dtdtddjt	t
d	tdtdd  dd	t dt	t
d	tdtd d dd	t dt	t
d	tdtd d dd	t dd }d!t||||d"}	t| d#|	S )$Nr  r=  rA  rX  rC  r  r   r  r   r  r  r{  r  r  r  question__topic__idr  r   r}  r&  r  r  r  r  r!  rk  r#  r  )	r  r   r!  r"  r  r  r(  r)  r*  r  )r  r   r!  r"  r  r  r'  r>  )r   r  r  r=  rX  z#dashboard/exam_filter_analysis.html)r   r   r%   r   r   r  r  r}   r   r   r   r   r   r   r\  r   r   )
r   r  r=  rA  rX  rC  r  ri  r  r  r   r   r   exam_filter_analysis%  s    

 
  
  &
 
  
  P	r  c                 C   sd   | j d}| j d}tjj||d  tjj||d  tjj||d  ddi}t|S )Nr  rX  r  r   r>  )	r   r   r%   r   r   rF  r$   r&   r	   )r   r  rX  r  r   r   r   reset_student_exam^&  s     r  c           	      C   s   | j dd}| j d}| j d}tj }|r@|j|d}|rP|j|d}|r`|j|d}|d}t|d	}| j d
}||}||||d}t	| d|S )Nr  r   r  r  r  rw  rz  r
  r   r  all_resourcesr  r  r  zresources.html)
r   r   r"   r   r   r   r   r   r  r   	r   r  r  r  r  r!  r"  r#  r  r   r   r   	resourcesk&  s(    



r  c                 C   s   | j dkr| jdd }| jd}|s:tdddS |sLtdddS tj|j	d	 }t
 d
| }||_	tjj||d tdddS tdddS )Nr   r  r   resourcer   Please enter a titler?  zPlease select a resourcer   r/  )r   r  r>  zResource uploaded successfully.r^  )r   r   r   r  r`  r	   r1  r2  r3  r  rw   r   r  r"   r   rb  )r   r   r  r:  r  r   r   r   addResources&  s     
r  c                 C   s   | j dkr| jdd }| jd}| jd}|sFtdddS tt|d	}||_|rt	j
|jd
 }t d| }||_||_|r|jddgd n|jdgd tdddS tdddS )Nr   r  r   r   r  r   Please enter a Titler?  r  r   r/  r   r  rk  r>  zResource updated successfully.r^  )r   r   r   r  r`  r	   r   r"   r   r1  r2  r3  r  rw   r   r  r  rd  )r   r   Zres_idZresource_fileZresource_objr:  r  r   r   r   editResources&  s$    
r  c                 C   s&   | j d}t|  tdddS r  )r   r   r"   ro  r	   rp  r   r   r   deleteResources&  s    r  c                 C   s<   | j d}tjj|d }tj }t| d|||dS )NrC  rB  zfoundation_videos_list.html)r=  r.  rC  )r   r   FoundationVideosr   r   r   rF   r   )r   rC  r=  r.  r   r   r   foundation_videos_list&  s    
r  c                 C   s^   |}t jj|d}tj }i }|D ]"}tjj|jjd}|||jj< q$t| d||||dS )Nrm  r<  zadd-exam-syllabus.html)r  sub_section_dictr.  r   )	r(   r   r   rF   r   rD   r'  r   r   )r   r   r  r.  r  r'  sub_sectionsr   r   r   rb  #'  s    
rb  c                 C   s0   t jj|ddd}t|j tt|ddS )Nr<  r   r  Fsafe)rD   r   r   r  r   r  r	   r   )r   r=  r  r   r   r   get_sub_sections:'  s    
r  c                 C   s(   t jj|d}dd |D }t|ddS )Nr@  c                 S   s   g | ]}|j |jd qS r   r  r  r1  r)  r   r   r   r  H'  s     zget_topics.<locals>.<listcomp>Fr  )rF   r   r   r	   )r   rA  r.  r  r   r   r   
get_topicsD'  s    r  c              
   C   s&  | j dkrtdddddS | jdp2| jd}| jd	d
}zt|}W n$ tjk
rt   tddd Y S X |stdddS zd}d}|D ]}|d}|d}|dg pg }	|dg pg }
|r|r|	sqtjj|d}t	jj|d}t
jj|
d}|	D ]t}t| }tjj||||d }|rP|jj|  |d7 }n.tjj||||d}|
rv|jj|  |d7 }qqtdd| d| dW S  tjk
r   tddd Y S  t	jk
r   tddd Y S  tk
r  } ztdt|d W Y S d }~X Y nX d S )Nr   r   rE  r?  rm  r   r  zexam-category-idZsyllabus_payloadr5  zInvalid syllabus payload JSONzNo syllabus mappings providedr   r=  rA  	topic_idsZdependent_topic_idsr%  r  )r  r'  r(  rC  r   r>  zSaved. New topics: z, Updated dependencies: zInvalid section id in payloadz!Invalid sub-section id in payload)r   r	   r   r   r  r:  JSONDecodeErrorrC   r   rD   rF   r   rH  r  rX   r  r*  rc  rb  r>  rG  )r   r  Zpayload_strr  created_countupdated_countr  r=  rA  r  Zdependency_idsr'  r(  Zdep_qsrC  objr   r   r   r   add_exam_syllabusL'  sj    





r  c                 C   s  | j d}| j d}| j d}| j d}| j d}| j d}| j d}d}tj }	tj }
tj }tj }tj 	d	}|r|j
|d
}|d| 7 }|r|j
|d}|d| 7 }|r|j
|d}|d| 7 }|r|j
|d}|d| 7 }|r |j
|d}|d| 7 }|r>|j
|d}|d| 7 }|r\|j
|d}|d| 7 }t|d}| j d}||}t| d|||||||	|
|||||||||dS )Nvideo_titler\  r=  rA  rC  r  r  r   r
  )Zvideo_title__icontainsz&video_title=)Z(foundation_video_categories__category_idz&category_id=r<  r  r@  r  rB  rR  rw  ry  rz  r|  r   r  zfoundation_videos.html)all_foundation_videosr  r   r  r  r  
categoriesre  r  r.  r\  r=  r  rA  rC  r  r  )r   r   rA   r   r   rC   rD   rF   rS   r   r   r   r  r   )r   r  r\  r=  rA  rC  r  r  filter_paramsr  re  r  r.  r  r!  r"  r#  r   r   r   r  '  sv    





c                 C   s   | j dkr| jd}| jd}| jd}| jd}| jd}| jd}|r|r|rd}tjj||||||d	}|j}	|D ]}
t	jj|	|
d
 qt
ddiddS t
dddddS t
ddiddS )Nr   r   category_id[]r=  rA  r)  r<  r   )rC  r  r=  rA  
video_filevideo_durationfoundation_video_idr\  r   r>  r$  r   r   zAll fields are requiredr   errorsrA  invalid_methodrm  )r   r   r   r_  r`  rS   r   rb  r   rW   r	   )r   r   category_idsr=  rA  rC  r<  r  foundation_videor  cat_idr   r   r   add_foundation_video9(  s4    
	r  c                 C   s.  | j dkr| jd}| jd}| jd}| jd}| jd}| jd}| jd}tt|d	}|r||_||_||_	||_
d
}	|}
tjj|
d  |D ]}tjj|
|d q|r||_|	|_|jddddddgd n|jddddgd tddiddS tdddddS tddiddS )Nr   r   r   r  r=  rA  r)  r<  r%  r   )r  r  r  r  r  rC  rk  r   r>  r$  r   r   z"Title and description are requiredr  rA  r  rm  )r   r   r   r_  r`  r   rS   r  r=  rA  rC  rW   r   r   rF  rb  r  r  rd  r	   )r   video_idr   r  r=  rA  rC  r  r<  r  r  r  r   r   r   edit_foundation_videog(  s<    r  c                 C   sJ   | j dkr:| jd}tt|d}|  tddiddS tddid	dS )
Nr   r   r%  r   r>  r$  r   r  rm  )r   r   r   r   rS   ro  r	   )r   r  r<  r   r   r   delete_foundation_video(  s    
r  c                 C   s   | j d}td| |rtjj|ddjtddjt	|d}dd |D }t
jj|d	}d
dd |D }t|ddS td
ddS )Nzcategories[]zmutiple exm categories :- )Zcategory__inr'  rf  )Zcategory_countc                 S   s   g | ]}|d  qS r  r   r1  itemr   r   r   r  (  s     z"category_selct.<locals>.<listcomp>r  r   c                 S   s"   g | ]}d |j  d|j dqS )z<option value="z">z	</option>)r   r  )r1  r'  r   r   r   r  (  s     Fr  )r   r_  r   r(   r   r   r  r  r}   r   rC   r  r	   )r   r  re  r  r4  Zsection_optionsr   r   r   category_selct(  s    
r  c           	   
   C   s   | j d}| j d}| j d}d}tj d}|rT|j|d}|d| 7 }|rp|j|d}|d	| 7 }|r|j|d
}|d| 7 }t|d}| j d}||}t	| d||||||dS )N	tag_titler  r  r   r
  )Ztag_title__icontainsz&tag_title=rw  ry  rz  r|  r   r  zquestion_tag_list.html)all_question_tagsr  r   r  r  r  )
r   r   Questions_Tagsr   r   r   r   r   r  r   )	r   r  r  r  r  r   r!  r"  r#  r   r   r   question_tag_list(  s4    

r  c                 C   sR   | j dkrB| jd}| jd}tjj||d}tddiddS tdd	id
dS )Nr   r   r<  )r  r  r   r>  r$  r   r  rm  )r   r   r   r`  r  r   rb  r	   )r   r  r<  q_tagr   r   r   add_question_tag(  s    
r  c                 C   s   | j dkr| jd}ztjj|d}W n& tjk
rN   tddidd Y S X | jd}| jd	}|rr||_|r|||_	|j
d
dgd tddiddS tddiddS )Nr   r   r%  r   	not_foundrE  r   r   r<  r  r  rk  r>  r$  r  rm  )r   r   r   r  r   r>  r	   r`  r  r  rd  )r   tag_idr  r  r<  r   r   r   edit_question_tag(  s    
r  c                 C   sv   | j dkrf| jd}z(tjj|d}|  tddiddW S  tjk
rd   tddid	d Y S X tdd
iddS Nr   r   r%  r   r>  r$  r   r  rE  r  rm  )r   r   r   r  r   ro  r	   r>  )r   r  r  r   r   r   delete_question_tag)  s    
r	  c           	      C   s   | j d}| j d}| j d}d}tj d}|rT|j|d}|d| 7 }|rp|j|d}|d	| 7 }|r|j|d
}|d| 7 }t|d}| j d}||}t	| d||dS )Nr  r  r  r   r
  r  r  rw  ry  rz  r|  r   r  zadd-on-course.html)course_listr  )
r   r   Add_On_Coursesr   r   r   r   r   r  r   )	r   r  r  r  r  r
  r!  r"  r#  r   r   r   add_on_course_list.)  s,    

r  c           	      C   s   t j }| jdkr| jd}| jd}| jd}| jd}| jd}tjj|||d}t	t
|D ]}tjj||| || d qnt| d	 td
S t| dd|iS )Nr   r  r2  r  r   r  )r  r  r   )add_on_courser  r  z#Add-On Course created successfully.r  zcreate-add-on-course.htmlr  )r@   r   r   r   r   r   r_  r  rb  rc  r   rT   r   r>  r   r   )	r   r  r  r2  r  r   r  r  rg  r   r   r   create_add_on_courseR)  s*    

r  c                 C   sv   | j dkrf| jd}z(tjj|d}|  tddiddW S  tjk
rd   tddid	d Y S X tdd
iddS r  )r   r   r   r  r   ro  r	   r>  )r   r  r   r   r   r   delete_add_on_coursew)  s    
r  c                 C   s`   | j d}tjj|d }tjj|djddd }tjj|d}t| t	| dd|iS )	Nz	exam_id[])Zcategory_id__inr=  Tr   r  zsection_for_timer.htmlre  )
r   r_  r(   r   r   r   r   rC   r   r   )r   rX  re  r  r   r   r   section_selct1)  s     
r  c                 C   sB   t j d}t|d}| jd}||}t| d||dS )Nr
  r   r  zzoomkeys.html)all_zoomkeysr  )	r]   r   r   r   r   r   r   r  r   )r   r  r!  r"  r#  r   r   r   zoomkeys)  s
    

r  c                 C   s   | j dkr| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}| jd
}	| jd}
z0tjj|||||||||	|
d
}tdddW S  tk
r } ztdt|d W Y S d }~X Y nX tdddS )Nr   meet_idr  	nick_namer  r	  sdk_key
sdk_secretapp_sdk_keyapp_sdk_secretr   )
r  r  r  r  r	  r  r  r  r  r   r>  zZoom Key Added Successfullyr?  r   Invalid Request Method)	r   r   r   r]   r   rb  r	   rG  rH  )r   r  r  r  r  r	  r  r  r  r  r   r  r   r   r   r   add_zoomkey)  s8    
(r  c              
   C   s`  | j dkrR| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}| jd
}	| jd}
| jd}zbtjj|d}||_||_||_||_||_	||_
||_|	|_|
|_||_|  tdddW S  tjk
r   tddd Y S  tk
rP } ztdt|d W Y S d }~X Y nX tdddS )Nr   r   r  r  r  r  r	  r  r  r  r  r   r%  r>  zZoomKey Updated Successfullyr?  r   zZoomKey not foundr  )r   r   r   r]   r   r  r  r  r  r	  r  r  r  r  r   rd  r	   r>  rG  rH  )r   
zoomkey_idr  r  r  r  r	  r  r  r  r  r   r  r   r   r   r   edit_zoomkey)  s>    (r  c                 C   sV   t j d}tj }t| t|d}| jd}|	|}t
| d|||dS )Nr
  r   r  zcounseling-group.html)
all_groupsr  exams)rZ   r   r   r   rA   r   r   r   r   r  r   )r   r  r  r!  r"  r#  r   r   r   counseling_groups)  s    


r  c           	   	   C   s   | j dkr| jd}| jd}| jd}| jd}| jd}| jd}| jd}|rv|rv|rv|rv|rv|std	d
dS z6tjj|d}tjj|||||||d tddiW S  tjk
r   td	dd Y S X td	ddS )Nr   r   	min_marks	max_marksattempted_mocksmock_deadlinerU  r   r   z Please fill all required fields.r?  r%  )r   r   r!  r"  rU  r#  r   r>  zInvalid Exam selected.zInvalid Request)	r   r   r   r	   rA   r   rZ   rb  r>  )	r   r   r   r!  r"  r#  rX  r   rU  r   r   r   add_counseling_group)  s2    
	r$  c              
   C   s(  | j dkr| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}zPtjj|d
}	||	_||	_||	_||	_||	_	||	_
||	_|	  tdddW S  tjk
r   tddd Y S  tk
r }
 ztdt|
d W Y S d }
~
X Y nX tdddS )Nr   r   r   r   r!  r"  r#  rU  r   r%  r>  z%Counseling Group Updated Successfullyr?  r   zCounseling Group not foundr  )r   r   r   rZ   r   r   r   r!  r"  r#  rX  r   rd  r	   r>  rG  rH  )r   group_idr   r   r!  r"  r#  rX  r   r  r   r   r   r   edit_counseling_group*  s2    (r&  c                 C   s2  t jjdd}| jd}| jd}| jd}d}tj d}tj }t	j }|r|dkr|j|d	}|d
 | }n:|dkr|j|d	}|d
 | }n|j|d}|d
 | }|r|j|d}|d | }|r|j|d}|d | }t
|d}	| jd}
|	|
}t| d|||
||||||d	S )Nr	  r   r  r  r  r   r
  r  r  r  r  )Z$appnotifications_batches__batches_idrw  ry  rz  r|  r   r  zapp-notification.html)	r  r   r  r  r  r  r  r  r  )rI   r   r   r   r   r^   r   rA   r   r@   r   r  r   )r   r  r  r  r  r   r  r  r  r!  r"  r#  r   r   r   app_notification<*  s6    



r'  c                 C   s  | j dkr| jd}| jd}| jd}| jd}| jd}| jd}| jd}|srtd	d
dS tjj|||d}|D ]}	tjj||	d q|D ]}
tjj||
d q|D ]}tjj||d qdd |D }dd |D }dd |D }t	j
 }|r|j|d}|r<|ttjj|tdd}|r`|ttjj|tdd}| }|jttjjtdddddd d djddd jdd!}ttd |}|rvd"}d"}g }|D ]}z.tjtj||d#|d$}t|}|d7 }W nN tjjk
rR } z*td%| d&|  | | |d7 }W 5 d }~X Y nX qtd'd(| d)| ||d*S td	d+dS td	d,dS )-Nr   r   r  r  r  r  r  r~  r   r  r?  r  )r   r  )r   exams_id)r   
courses_idc                 S   s$   g | ]}t |  rt|qS r   rH  r  rf  r  r  r   r   r   r  *  s      z(add_app_notification.<locals>.<listcomp>c                 S   s$   g | ]}t |  rt|qS r   r*  r0  r   r   r   r  *  s      c                 S   s$   g | ]}t |  rt|qS r   r*  r  r   r   r   r  *  s      )batch__id__inr  )course_id__inr  )course__exams__id__inr  Fr   r   r
  r   r   latest_tokenr0  Tr   Zlatest_token__isnullr   r   r   zFailed to send to rG  r>  zSent to z users. Failed: )r   r   failed_tokensr   zNo valid tokens foundr^  )!r   r   r   r_  r	   r^   r   rb  r_   rJ   r   r   r   r8   r   r   r  r   r4   r   r  r   r  r   r   r   r   r   firebase_adminr   r   r   r   )r   r   r  r   r  r  r  r~  r   rL  rX  r  r  rk  r2  r   r   Zstudents_with_tokensr   r>  failurer2  r   Zmessage_objrC  r   r   r   r   add_app_notification`*  s    
		 	

r5  c                 C   sn   | j dkr`| jd}z$tt|d}|  tdddW S  tjk
r^   tddd Y S X tdd	dS )
Nr   r   r%  r>  z&Counseling Group deleted successfully.r?  r   zCounseling Group not found.r  )r   r   r   r   rZ   ro  r	   r>  )r   r%  r  r   r   r   delete_counseling_group_by_id*  s    
r6  c              
   C   s   t t|d}tj }tj }tj }tjj|d}g }g }|D ]X}	|	j	}
t
jj|
d }|
j|
jd |
j |	j||	jd}|r|| qD|| qDt| d||||||dS )Nr%  )counseling_group_idr*  r  )r   r  r  paidr  zcounseling-group-details.html)counseling_detailr  r  all_studentsr   r   )r   rZ   rA   r   r   r@   rJ   r[   r   r   r8   existsr   r  r  r  r  r   r   )r   r   r9  r  r  r:  counseling_students_listr   r   r7  r   Zis_paidZstudent_infor   r   r   counseling_groups_detail*  s6    


r=  c                 C   s   ddg}t j }|D ]}tjj|| j|ddddd| j }| rt	dd	 |D }|
 }|dkrt|| nd}| jdk	r| jdk	r| j|  kr| jkrn qtjj| | j||d
did qdS )z
    Process students for a single counseling group:
    - Calculate recent test results.
    - Check if within min/max marks.
    - Add students to the group if criteria match.
    rv  r.  r   r   )r   Zmock_test__examcategorymock_test__mock_type__inr  r  r+  Nc                 S   s   g | ]
}|j qS r   )r  )r1  r  r   r   r   r  6+  s     z,process_counseling_group.<locals>.<listcomp>r  F)counseling_grouprU  r   r  ra  )rJ   r   r   r&   r   rU  r   r"  r;  r6  r   r   r!  r[   get_or_create)r?  Zvalid_mock_typesr   r   Zrecent_resultsr  r   Z	avg_marksr   r   r   process_counseling_group+  sF    
 
rA  c                 C   s*   t j }|D ]}t| qtdddS )Nr>  z"All groups processed successfully.r?  )rZ   r   r   rA  r	   )r   groupsr  r   r   r   counseling_group_studentsG+  s    

rC  c              
   C   s  | j dkr z| jd}| jd}| jd}| jd}|rF|sVtdddW S tjj|d	}|rvtjj|d	nd }|rtjj|d	nd }|D ]"}t	jj
|||d
|d}	|	  qtddiW S  tk
 r }
 ztdt|
d W Y S d }
~
X Y nX tdddS )Nr   r7  r  rU  r   r   zMissing required fields.r?  r%  T)r?  r  rU  r  r  r   r>  rE  )r   r   r   r_  r	   rZ   r   r@   rA   r[   rb  rd  rG  rH  )r   r%  r  rX  r4  r?  r  rU  r  group_detailr   r   r   r   add_counseling_studentsO+  s0    
(rE  c                 C   st   | j dkrf| jd}t| z"tjj|d  tdddW S  tjk
rd   tddd Y S X tdd	dS )
Nr   r   r  r>  zStudent removed successfully.r?  r   zRecord not found.zInvalid request.)	r   r   r   r   r[   r   rF  r	   r>  rp  r   r   r   delete_counseling_student_by_idp+  s    
rF  c                 C   s   | j dkr| jd}| jd}zDtt||d}|j| |  |j sX|	  t
dddW S  tjk
r   t
dd	d Y S X t
dd
dS )Nr   r   r7  )r7  Zstudent__idr>  z3Student removed from counseling group successfully.r?  r   z2Student detail not found in this counseling group.r  )r   r   r   r   r[   r   removerd  r;  ro  r	   r>  )r   r  r7  rD  r   r   r   rF  }+  s"    

c                 C   sT   d|  }t | d|   }dd| i}tj||d}|  | d S )NzFhttps://zoom.us/oauth/token?grant_type=account_credentials&account_id=:r  zBasic r%  r  )ry   encoder  r
  r  raise_for_statusr  )r  r  r	  r  auth_headerr  rC  r   r   r   r  +  s    
 r  c                 C   sZ   t j d}tj }tj }t|d}| jd}|	|}t
| d||||dS )Nr
  r   r  zcounseling-schedule.html)all_schedulesr!  r  r  )r\   r   r   r   rZ   r]   r   r   r   r  r   )r   rL  r  r  r!  r"  r   r   r   counseling_schedule_list+  s    



rM  c              
   C   s  | j dkrzH| jd}| jd}| jd}| jd}| jd}| jdd}t| jd	d
}t| d| d}| }	tjj	|d
 }
t|
j|
j|
j}d}d| dd}|d|	|dddddd}tjd| d||d}|jdkrtd| dW S | }tjj|||d |d d!||t||d" tdd#iW S  tk
r } ztdt|d$ W Y S d }~X Y nX tdd%d$S )&Nr   r?  r   zoom_keycounseling_datecounseling_timer)  zCounseling Sessionr  r  r  r  r%  r  r  r  r  r  r  r  TFr  r  r  r  r  r  r   )r   
zoom_errorr   r   r   )r7  r  r  r   rO  rP  r  r   r>  r?  rE  )r   r   r   r  rw   r  r   r]   r   r   r  r  r  r  r	  r
  r  r  r	   r  r\   rb  r  rG  rH  )r   r7  r   r  rO  rP  r)  r  r  r  r  r  r  r  r  r  r  r   r   r   r   add_counseling_schedule+  sb    


(rR  c              
   C   s  | j dkr| jd}zBtjj|d}|j}| jdd}| jd}| jd}| jd}t| jd	d
}t| d| d	 }	t
jj|d }
t|
j|
j|
j}d| dd}||	|d|jdddd}tjd| ||d}|jdkrtdd| dW S |j|_||_|j|_||_||_| jd|j|_|  tddiW S  tjk
r   tddd Y S  tk
r } ztdt|d W Y S d }~X Y nX tdddS ) Nr   r   r%  r)  zUpdated Counseling SessionrO  rP  rN  r  r  r  r  r  r  r  r  TFr  )r)  r   r  r   r   r   r"  r  r#  r   z Failed to update meeting on Zoomr   r   zoom_responser   r>  zSchedule not found.r?  rE  )r   r   r   r\   r   r  r  rw   r  r   r]   r   r  r  r  r  r	  r   r
  r'  r  r	   r  r  rO  rP  r   rd  r>  rG  rH  )r   schedule_idscheduler  r)  r   r   r  r  r   r  r  r  r  rT  r   r   r   r   edit_counseling_schedule+  sZ    (rW  c           	   
   C   s(  | j dkr| jd}ztt|d}|jrzrtjjt	d
 }t|j|j|j}dd| i}d|j }tj||d}|jdkrtd	d
| dW W S W n< tk
r } ztd	d| d W Y W S d }~X Y nX |  tdddW S  tjk
r   td	dd Y S X td	ddS )Nr   r   r%  r  r  r"  r%  )r#  rE  r   z"Failed to delete meeting from ZoomrS  zZoom deletion failed: r?  r>  z)Counseling Schedule deleted successfully.zCounseling Schedule not found.r  )r   r   r   r   r\   r  r]   r   r   r  r  r  r  r  r	  r
  rF  r  r	   r  rG  ro  r>  )	r   rU  rV  r  r  r  Zzoom_urlZzoom_resrQ  r   r   r    delete_counseling_schedule_by_id1,  s4     
,rX  c                 C   sP   t t|d}tjj|d }t|d}| jd}|	|}t
| d||dS )Nr%  )counseling_schedule_idr   r  z counseling-schedule-details.html)r9  counseling_students)r   r\   rY   r   r   r   r   r   r   r  r   )r   r   r9  r<  r!  r"  rZ  r   r   r   counseling_schedule_detailY,  s    

r[  c                 C   sd   | j dkr`| jd}z$tt|d}|  tdddW S  tjk
r^   tddd Y S X d S )	Nr   r   r%  r>  zZoomKey deleted successfully.r?  r   zZoomKey not found.)r   r   r   r   r]   ro  r	   r>  )r   r  r  r   r   r   delete_zoomkey_by_Idf,  s    
r\  c           	      C   s   | j dd}| j d}| j d}tj }|r@|j|d}|rP|j|d}|r`|j|d}|d}t|d	}| j d
}||}||||d}t	| d|S )Nr  r   r  r  r  )Zrelease_date__gte)Zrelease_date__lter
  r   r  r  zresources-rc.html)
r   r   r`   r   r   r   r   r   r  r   r  r   r   r   resourcesRcq,  s(    



r]  c                 C   s   | j dkr|| jd}| jd}| jd}|dkrDtdddS |dkrZtdd	dS tjj|||d
 tdddS ntdddS d S )Nr   r  r  r  r   r   r  r?  zPlease select resource)r   r  r  r>   Resources uploaded successfully.r^  )r   r   r   r`  r	   r`   r   rb  )r   r   r  r  r   r   r   addResourcesRc,  s    
r_  c                 C   s   | j dkr| jd}| jd}| jd}| jd}|dkrPtddd	S |dkrftdd
d	S t||||d}|jdddgd tddd	S ntddd	S d S )Nr   r  r   r  r  r   r   r  r?  zPlease select Resource)r   r   r  r  r   r  rk  r>  r^  r^  )r   r   r   r`  r	   r`   rd  )r   r   r   r  r  r   r   r   editResourcesRc,  s$    
r`  c                 C   s&   | j d}t|  tdddS r  )r   r   r`   ro  r	   rp  r   r   r   deleteResourcesRc,  s    ra  c                 C   sF   d|  d}dd| i}t j||d}| S td|  d S d S )	Nr"  z/recordingsr  r  r%  r$  Zrecording_fileszError fetching recording:)r
  r   r  r  r   )r  r  r  r  rC  rZ  r   r   r   get_zoom_recording,  s        rb  c                 C   s:   ddd| dddddd	d
ddd|g}t j|t jt jd d S )Nz/usr/bin/ffmpegz-yz-iz-vcodecZlibx264z-crfZ28z-presetfastz-acodecZaacz-b:aZ128k)stdoutstderr)
subprocessr  DEVNULL)Z
input_pathZoutput_pathcommandr   r   r   compress_video,  s"          ri  c                 C   sV   | j dkrtdddddS ddlm} | \}}t|r<d	nd
|rFdnd|dddS )Nr   r   Only GET request allowedr?  rm  r   r   )queue_zoom_recording_jobqueuedZalready_runningz7Zoom recording processing was queued in the background.z3A Zoom recording processing job is already running.)r   r   job   )r   r	   admin_app.zoom_recording_jobsrk  )r   rk  rm  createdr   r   r   uploadZoomRecording,  s$    


rq  c                 C   sX   | j dkrtdddddS ddlm} ||}|d krJtdd	dd
dS td|dS )Nr   r   rj  r?  rm  r   r   )read_zoom_recording_jobzZoom recording job not found.rE  r>  )r   rm  )r   r	   ro  rr  )r   Zjob_idrr  rm  r   r   r   zoomRecordingJobStatus-  s    
rs  )parse_datetimezcrack every testc                 C   s<   | sdS t dt| } |  } tdd| } d|  S )z
    Normalize names for case-insensitive matching.

    Examples:
        Ruman Shaikh   -> ruman shaikh
        RUMAN SHAIKH   -> ruman shaikh
        Ruman-Shaikh   -> ruman shaikh
    r   NFKCz[^a-z0-9\s]r  )unicodedata	normalizerH  casefoldr  r  r  r  r  r   r   r   
clean_name-  s    	ry  c                  C   sV   t jjddjdd} g }| D ]2}t|j}|s2qt| }||||d q|S )zK
    Build the student-name index once before processing all lectures.
    T)Zaadhar_name__isnullr   rI  )r   rI  r   )rJ   r   r  ry  rI  r  r  r   )r   student_indexr   rI  r   r   r   r   build_student_index5-  s"    

r|  c                 C   s@   i }| D ]}|d }|||j < qt|dkr<tt| S dS )zP
    Return a student only when the matches resolve to exactly one student.
    r   r   N)r  r   r   iterr  )Zindex_itemsZunique_studentsr  r   r   r   r   get_unique_studentR-  s    r~  c           	         s  t | sdS  }t|fdd|D }t|}|dk	rF|S fdd|D }t|}|dk	rl|S fdd|D }t|}|dk	r|S t|dkr|d fdd|D }t|}|dk	r|S t|d	kr|d  |d
  fdd|D }t|}|dk	r|S dS )a  
    Match a Zoom participant name against Students.aadhar_name.

    Priority:
    1. Exact full name
    2. All Zoom tokens exist in Aadhaar name
    3. All Aadhaar tokens exist in Zoom name
    4. Unique single-token name
    5. First + last token match
    Nc                    s   g | ]} |d  kr|qS rz  r   r  )zoom_name_cleanr   r   r  v-  s   z%find_student_fast.<locals>.<listcomp>c                    s   g | ]}  |d  r|qS r   issubsetr  zoom_tokensr   r   r  -  s   c                    s   g | ]}|d    r|qS r  r  r  r  r   r   r  -  s   r   r   c                    s   g | ]} |d  kr|qS r  r   r  )r   r   r   r  -  s   r  r  c                    s(   g | ] } |d  kr|d  kr|qS r  r   r  )first_token
last_tokenr   r   r  -  s   )ry  r  r  r~  r   )		zoom_namer{  Zzoom_tokens_listZexact_matchesr   Zsubset_matchesZreverse_subset_matchesZsingle_name_matchesZfirst_last_matchesr   )r  r  r   r  r  r   find_student_fastb-  sR    
	



r  c           
   
   C   s   d|  d}dd| i}g }d}ddi}|r6||d< zt j|||d	d
}W n@ t jk
r } z td|  d|  W Y qW 5 d }~X Y nX |jdkrt| |j|jd q| }	||	dg  |	dd}|s"qq"|S )Nz%https://api.zoom.us/v2/past_meetings/z/participantsr  r  r   	page_size,  next_page_tokenr  )r  paramsr  z-Zoom participants request failed for meeting rG  r$  )r  Zzoom_status_coderT  participants)r
  r   RequestExceptionr   r  r  r  r  )
r  r  r  r  r  r  r  rC  excrZ  r   r   r   get_zoom_participants-  sT    
  


r  c                 C   s>   | sdS t | }|dkrdS t|r4t|tj}t|S )zN
    Parse Zoom's UTC datetime and convert it to Django's local timezone.
    N)rt  r   is_naiver  utcr   )r,  Zparsed_valuer   r   r   parse_zoom_datetime.  s    
r  c           !      C   s  | j dkrtdddddS t }|tdd }tjj||d	d
jddjdd	d
d}t }d}d}d}d}g }	g }
g }g }g }|D ]t}|j}zt|j|j|j}W nF tk
r } z(||j|jdt|d W Y qW 5 d }~X Y nX |s||j|jddd qt|j|}|D ]}t|dp>d }t|dpVd }|s||
|jddd q(t|}|tkr|
|j|dd q(|d}|d}zt|dpd}W n ttfk
r   d}Y nX ||jt|dd |||||d t||}|d kr8|	| q(t |}t |}||j||j!|j"d zRt#jj$|||||t|d d!d"\}}|d7 }|r|d7 }n|d7 }|d7 }W nJ tk
r } z*||j|j|j!|j"|d#t|d$ W 5 d }~X Y nX q(qt%t&'|	}|sd%nd&} t| |( t)|||||t)||d d' t)|
|
d d' t)||d d' t)||d d' t)||d(S ))Nr   r   zOnly GET allowedr?  rm  r   r   r  F)r   r   Zzoom_key__isnullT)Zmeeting_id__isnullr   )r  rN  r   r   r  )r   r  stager   zEmpty Zoom access tokenr  
user_emailzEmpty Zoom name)r   r  reasonzIgnored host/system accountr  r  r  r   )r   Zlecture_namer  
zoom_emailjoin_time_rawleave_time_rawZduration_raw)r   r  r  rI  )seconds)r  r  r  r  )r  r   ra  Zsave_attendance)r   r  r  rI  r  r  r   r>  Zpartial_successr   )r   r  Zstudent_index_countZsaved_recordsZcreated_recordsZupdated_recordsZexisting_recordsZunmatched_countZunmatched_samplesZignored_countZignored_samplesZerror_countr  Zmatched_countZmatched_samplesZparticipants_countr  )*r   r	   r   r  rx   rP   r   r   r  r   r   r|  rN  r  r  r  r	  rG  r   r   r  rH  r  r   r  ry  IGNORED_ZOOM_NAMESr  rB  rC  r  r  r  r  rI  r,   rg  r   rr  rs  r   r   )!r   r  r  r  r{  Ztotal_savedZtotal_createdZtotal_updatedZtotal_existing	unmatchedignoredr  Zparticipants_debugZmatched_debugr  rN  r  r  r  Zparticipantr  r  Zcleaned_zoom_namer  r  duration_secondsr   r  r  rg  rp  Zunique_unmatchedZresponse_statusr   r   r   record_zoom_attendance.  s`   
	








 




r  c                 C   s2  | j dkr$t }t }|tdd }tjjddd}|D ]}|j}t	|j
|j|j}t|j|}tdd|t| |d	  S |D ]x}	|	d
dkr|	d }
|
sq|
 d| }t|}|jdkr|j}t j d}t||d}||_|jdgd qqBtdd|t| dS tdddS )Nr   rI  r  i  r%  r   r>  z+Zoom recordings saved for today's lectures.)r   r   	yesterdaytodays_lecture_listZ
recordingsZfile_extensionZMP4Zdownload_urlz?access_token=r$  z.mp4r  r=  rk  )r   r   r  r  r   zOnly GET request is allowed.r?  )r   r   r  rx   rP   r   r   r   rN  r  r  r  r	  rb  r  r	   r   r  r   r
  r  r  r4  r5  r6  r   r=  rd  )r   r  r  Zthree_days_agor  r  rN  r  Zrecordings_responserecZfile_urlfull_urlrC  Z	file_datar  file_contentr   r   r   ouploadZoomRecording.  sF       

r  r9  c                 C   sF   | j ttjjtddddddd djd	d
dj	d
dS )z7Attach latest non-null device_token per student (fast).r  Fr.  r
  r   Nr   r/  r0  Tr   r1  )
r  r   r4   r   r   r   r   r  r   r  )Z
student_qsr   r   r   annotate_latest_tokens//  s(      r  c                 C   s   dd |pi   D }d }}g }| D ]}z4|r\tjtj||d||d}	t|	 |d7 }W n4 tk
r }
 z|| |d7 }W 5 d}
~
X Y nX |r&t|d  q&|||d	S )
u   
    Sends one FCM message per token (sequential).
    - tokens: iterable of strings
    - sleep_ms: optional pause between sends to avoid throttling (e.g., 5–20ms)
    Returns: (success_count, failure_count, failed_tokens:list)
    c                 S   s   i | ]\}}|t |qS r   rH  r1  r  r  r   r   r   r\  C/  s      z"send_multicast.<locals>.<dictcomp>r   r   )r   r   rZ  r   N     @@r>  r4  r2  )	r5  r   r   r   r   rG  r   r   sleep)r   r   r   rZ  sleep_msr>  r4  r2  r   r   r   r   r   r   send_multicast</  s&    

r  c                 C   s   | sddg dS dd |pi   D }d }}g }tdt| tD ]}	| |	|	t  }
tjtj||d||
d}t|}||j7 }||j	7 }t
|
|jD ]\}}|js|| q|rBt|d  qB|||dS )z
    Efficient FCM send using MulticastMessage (<=500 tokens per request).
    Returns dict with counts + failed tokens list.
    r   r  c                 S   s   i | ]\}}t |t |qS r   r  r  r   r   r   r\  b/  s      z#osend_multicast.<locals>.<dictcomp>r   )r   rZ  r   r  )r5  rc  r   	FCM_CHUNKr   ZMulticastMessager   r  Zsuccess_countZfailure_countzip	responsesr>  r   r   r  )r   r   r   rZ  r  Zpayload_datar>  r4  r2  rg  r  r   r6  r   r  r   r   r   osend_multicastZ/  s*    


r  r  c                 C   s*   t t  jdd}ttjjt| |dS )zWSubquery: student has at least one paid OrderCourses row after May of the current year.r   r   )r  r  )r   r  yearr   r8   r   r   r   )Zstudent_aliasZ	may_startr   r   r   	is_paid_q}/  s    r  )r.  r  c                 C   s   t jj| d S NrM  )ra   r   r   r;  rM  r   r   r   already_sent/  s    r  rM  c                 C   s   t jj| d d S r  )ra   r   r@  rM  r   r   r   	mark_sent/  s    r  )r  ctxr  c                 C   s.   G dd dt }| |f dd | D S )zq
    Safe format: leaves unknown placeholders as-is.
    Example: "Starts at {time}" with ctx={'time':'7pm'}
    c                   @   s   e Zd Zdd ZdS )zrender_text.<locals>._Dc                 S   s   d| d S )NrT  rV  r   )selfr  r   r   r   __missing__/  s    z#render_text.<locals>._D.__missing__N)__name__
__module____qualname__r  r   r   r   r   _D/  s   r  c                 S   s"   i | ]\}}||d krdn|qS rO  r   r  r   r   r   r\  /  s      zrender_text.<locals>.<dictcomp>)rr  
format_mapr5  )r  r  r  r   r   r   render_text/  s    r  Zlecture_tminus10zExpert sessionu?   Expert session on {topic} starts in 10 minutes! Don’t miss itr  zapp://lectures/upcoming)r;  deeplink)r.  r   r   rZ  Zlecture_reminderZReminderu1   Lecture begins in 10 mins: {topic} — be on timeZmock_releasezNew mockz+New mock released: {mock_name}. Try it now!r  zapp://mocks/{mock_id}Z
mock_nudgeZ	ChallengeuK   Challenge yourself: Beat yesterday’s score in today’s test: {mock_name}Z
mot_targetTargetz"Stop scrolling, you need to study!Z	mot_checkZCheckz Finished your daily targets yet?r  zapp://targetsZ	mot_vocabZVocabz,Strengthen your vocabulary with a 5-min quizzapp://tests/vocabc                 C   s
   t | S r@  )randomchoice)seqr   r   r   pick/  s    r  c              	      s  t  }|tdd }|tdd }| jd}|rDtjj|d}n tjj| |	 |	 dd}g }|D ]}d|j
 d	}t|rqltjj|j d
 }	tt|	}
t|ddt|ddr|jdndt|ddr|jdndddd |j D |j
d td }t|d  }t|d  } fdd|d  D }t|
|||}t| ||j
|d |d d qltd|d S )!z
    Hit every 1 or 5 minutes.
    - If ?lecture_id=123 present, sends for that lecture only (debug).
    - Otherwise finds lectures starting in [now+10min, now+11min).
    De-dup key: lecture:<id>:tminus10
    r   r   rw  r   r  F)r   r   r   	is_cancelzlecture:z	:tminus10r   r   zyour sessionr   Nr  r   r   %H:%Mr  c                 s   s   | ]}|j V  qd S r@  r  r  r   r   r   r3  /  s     z(ocron_notify_lectures.<locals>.<genexpr>)r)  r   r   r  r   r   r   c                    s   i | ]\}}|t | qS r   r  r  r  r   r   r\  /  s      z)ocron_notify_lectures.<locals>.<dictcomp>rZ  r>  r4  )r   r   r   T)r   r   )r   r   rx   r   r   rP   r   r   r   r   r   r  rJ   r   r   r   r   r  r  r   r  r   r  LECTURE_TEMPLATESr  r5  r  r  r   r	   )r   r   r   r   r   r  r   r   r.  r   r   tplr   r   rZ  statsr   r  r   ocron_notify_lectures/  sB    	

r  c                    s  | j d}| j d}|r.tjj|dd}nl|rxztj|d }W n t	k
rd   t
d Y S X tjjd|d}n"t tdd	 }tjjd|d}g }|D ]}d
|j d}t|rq|j|jd tjt }tt|}	td }
t|
d  }t|
d  } fdd|
d  D }t|	|||}tjttjjtdd}tt|}|ddi}tdrt|	n||||}t| ||j||d qtd|dS )a9  
    Send pushes for newly released/featured mocks.
    Use one of:
      - ?mock_id=123            (send for that mock only)
      - ?released_since=YYYY-MM-DD (send for all mocks released since this date)
    De-dup key: mock:<id>:release
    Segments: paid & unpaid (optional tweak deeplinks per segment).
    r  released_sincer	  )r  r   r  zBad released_since)r   r  r   r  zmock:z:release)Z	mock_namer  r   r   r   c                    s   i | ]\}}|t | qS r   r  r  r  r   r   r\  +0  s      z$cron_mock_events.<locals>.<dictcomp>rZ  r  r  ZutmZupsellF)r  r8  ZunpaidT)r   r  )r   r   rG   r   r   r   rw   r  r   rC  HttpResponseBadRequest	localdaterx   r   r  r  rJ   r  r   r  MOCK_TEMPLATESr  r5  r  r  r   r8   r   r  r   r	   )r   r  r  r  sinceresultsr  r.  r   Zpaid_tokensr  r   r   rZ  Z
stats_paidr   Zunpaid_tokensZdata_unpaidZstats_unpaidr   r  r   cron_mock_events 0  sH    
r  c                 C   s:  t  }d| d}t|s\d}d}ddi}tjt }tt|}t	|||| t
| d| d}t|sd}d}ddi}tjttjjtd	d
}tt|}t	|||| t
| d| dt  jd}	t|	s.tt}
|
d }|
d }|
di }tttj }t	|||| t
|	 tddiS )z
    Daily long nudge for paid + unpaid, plus one short random nudge per hour.
    De-dup keys:
      motivation:<YYYY-MM-DD>:paid
      motivation:<YYYY-MM-DD>:unpaid
      motivation_short:<YYYY-MM-DD>:<HH>
    zmotivation:z:paidz
Keep goingzL90 days from now, you'll thank yourself for studying today. Get started now!r  zapp://mocksz:unpaidzapp://coursesr  r  zmotivation_short:rH  Z02dr   r   rZ  r   T)r   r  r  rJ   r   r   r  r   r  r  r  r  r   r8   r   r   hourr  MOTIVATION_COMMONr   r   r	   )r   r  Zk_paidr   r   rZ  r   r   Zk_unpaidZhour_keyr  r   r   r   cron_motivationA0  s:    

r  c              	   C   s,   z
t | W S  ttfk
r&   | Y S X d S r@  rA  rD  r   r   r   rG  p0  s    
c                 C   s  t j }tj }tj }tj }dddddddd}t| jd	d
}t| jdd
}t| jdd
}t| jdd
}	t| jdd
}
| jdd}t	j }|r|dkr|j
|d}|r|dkr|j
|d}|r|dkr|j
|d}|	r|	dkr|j
|	d}|
r.|
dkr.|j
|
d}|dkrD|d}n*|dkrZ|d}n|dkrn|d}t|d}| jd}||}d| d | d!| d"|	 d#|
 d$| }td%|jjd% }t| d&t|jjd'd(d)|||||||||||	|
||d*S rH  rX  rZ  r   r   r   r[  w0  sz    










&	c                 C   sF   | j d}|s tddiddS tjj|ddd}tt|d	d
S )NrM  r   zMissing mocktype_idrA  r   r  r   r  Fr  )r   r   r	   rG   r   r   r  r   )r   rM  
mock_testsr   r   r   get_mocktests_by_type0  s
    r  zEhttps://api.msg91.com/api/v5/whatsapp/whatsapp-outbound-message/bulk/c              
   C   s$  z4| j r(| j dr(t| jd}n
| j }W n& tk
rZ   t	ddddd Y S X |
dpn|
d	}t|trd
d |dD }|rt|tst	dddddS |
dd}|
dd}|
d}|
d}i }|dk	rdt|d|d< |rddt|d|d< ttddddd||ddttd d!||d"gd#d$d%}dttd&d'd(}	ztjt|	|d)d*}
W nB tjk
r } z t	dd+| dd,d W Y S d}~X Y nX z|
 }W n  tk
r   d-|
ji}Y nX d.|
j  kod/k n  }t	||
j|d0|rd.nddS )1a  
    POST (JSON or form-encoded):
    {
      "numbers": ["9198XXXXXXXX","9170XXXXXXXX"],  # or "9198...,9170..."
      "template_name": "otp",                      # default "otp"
      "language_code": "en",                       # default "en"
      "body_1": "value1",                          # maps to {{1}} in template
      "button_url": "https://example.com/path"     # optional; fills button_1 url
    }
    r  r  FzInvalid JSON payload)r>  r   rA  r   rS  toc                 S   s   g | ]}|  r|  qS r   r  )r1  nr   r   r   r  0  s      z*send_whatsapp_template.<locals>.<listcomp>r  z4Provide 'numbers' as list or comma-separated string.template_nameotplanguage_codeenbody_1
button_urlNr  )r;  r,  r  )subtyper;  r,  button_1MSG91_INTEGRATED_NUMBER917977041874templatewhatsappdeterministic)r  policyMSG91_NAMESPACE$1fa9599b_fd7a_46b6_91e9_e91419535c4f)r  
components)r  language	namespaceto_and_components)messaging_productr;  r  )integrated_numberr#  r  MSG91_AUTHKEY475291AMVy0hIO6901fca1P1)r  authkeyr   )r  r  r  zNetwork error: i  r  r$  r  )r>  r  rC  )r#  r  r  r:  r   r  r   rr  rG  r	   r   r  rH  r  r   r  r   r
  r  	MSG91_URLr  rC  r  r  )r   rZ  rS  r  r  r  r  r  r  r  r6  r   Z	resp_jsonr   r   r   r   send_whatsapp_template0  sf    





.r  )r   rw   r   rx   )
monthrange)DictTupleListr   Setr   )r   r.  r  r  r  _fac_week_limit_cache_ALLOWED_TOPIC_IDS_CACHE_batch_week_limit_cache)rt  r  c                 C   s(   | t |  d }|t dd }||fS )Nr  ru  )rx   weekday)rt  r   r   r   r   r   week_boundsU1  s    r  )d1d2r  c                 C   s8   t | \}}t |\}}|| jd }td|d d S )Nr   ru  rv  )r  r  r  )r  r  s1r-  e2r  r   r   r   weeks_between[1  s    r  )current_datepreviewr  c           	   	   C   s   t jj| d|dd }|r&|jnd}d}t|D ]Z}| j|dg krNq6zt	
|d d }W n tk
r~   Y q6Y nX ||k r6|} qq6|r|r||kr|}|r|| j}|dkrd	S dS )
z
    Simple spacing rule: for this batch, do NOT schedule lectures
    on two consecutive calendar days.

    If the last lecture (DB or preview) for this batch was yesterday,
    skip scheduling on current_date.
    F)r   r  r  r  Nr  r   r  r   T)rP   r   r   r   r  r   reversedr   r   rw   r  r   rG  r  )	r  r  r  Zdb_lastZlast_lec_dateZ	prev_lastr   rt  Zdays_gapr   r   r   should_skip_for_gapb1  s4    	

r
  )
week_startweek_endr  c                 C   sL   g }|}||krH| d}tjj| |d r8|| |tdd7 }q|S )zN
    Return all dates in this week where the batch has at least one slot.
    %Ar  r_  r   r  )r  re   r   r   r;  r   rx   )r  r  r  r  rt  day_namer   r   r   !get_batch_available_dates_in_week1  s    

r  )rL  r  r  r  r  c           	   	   C   s   t  }tjj| d||gdjddd }|D ]}|| q.|D ]l}| |dg krXqBzt	|dd
 }W n tk
r   Y qBY nX ||  kr|krBn qB|| qB|S )	zO
    Return dates in this week where batch already has DB/preview lecture.
    Fbatches__idr  lacture_date__ranger   Tr   r  r   r  )r  rP   r   r   r   r   rc  r   rw   r  r   rG  )	rL  r  r  r  r  Zdb_datesrt  r   lec_dater   r   r   get_batch_lecture_dates_in_week1  s*     

r  c                 C   s   t |\}}t| j}t| ||}|s,t S t|dkr@t|S tt|tdtd|}t||krnt|S g }d}	|	t|k rt||k r|||	  |	d7 }	qvt||k r|D ]&}
|
|kr||
 t||kr qqt|S )u  
    Plan lecture dates for the week.

    Rule:
    - Do not generate lectures back-to-back if enough dates are available.
    - Prefer spreading lectures across 4–5 days.
    - Allow 1 lecture per day.
    - Allow 2 lectures per day only when required by weekly limit.
    rI  rJ  r   r   r  )	r  get_batch_week_limitr   r  r  r   r  r  r   )r  r  r  r  r  weekly_limitavailable_datesZpreferred_daysplannedr  rt  r   r   r   planned_weekly_lecture_dates1  s,    


r  c                    s   t \}}|d|dt j}t |}tjj d||gd 	 }t
 fdd|D }|| }	||	 }
fdd|D }|
t|kS )zM
    Allow second lecture only if needed to reach weekly lecture target.
    r  Fr   r  r  c                 3   sD   | ]<} j |d g kr|dd  kr4krn qdV  qdS r  r   r   r   Nr   r   r1  r   r  week_end_strweek_start_strr   r   r3  2  s     z;legacy_should_allow_second_lecture_today.<locals>.<genexpr>c                    s   g | ]}| kr|qS r   r   r1  rt  )r  r   r   r  2  s   z<legacy_should_allow_second_lecture_today.<locals>.<listcomp>)r  r  r  r   r  rP   r   r   r   r   r6  r   )r  r  r  r  r  r  planned_datesZdb_week_countZpreview_week_countZtotal_week_countremaining_week_lecturesZremaining_planned_datesr   )r  r  r   r!  r   (legacy_should_allow_second_lecture_today1  s&    



r%  c                 C   s@   t |\}}t| ||}||kr$dS t| ||}||kr<dS dS )z
    Skip dates that are not part of the planned weekly distribution.

    Allows second lecture on the same planned date.
    Does not affect weeks where batch has limited available days.
    TF)r  r  r  )r  r  r  r  r  r  r#  r   r   r   !should_skip_for_week_distribution2  s    r&  )r  r  c                 C   sj   | t krt |  S ztjddj| dj}W n tjk
rF   d }Y nX t|trZ|dkr^t	}|t | < |S )Nr   r  r%  r   )
r  rH   r   onlyr   r  r>  r  r  DEFAULT_FACULTY_WEEK_LIMIT)r  limr   r   r   get_faculty_week_limit.2  s    
r*  c                 C   sV   t jj|djddd}tjj| djddd}t|t|}t jj|dd S )	NrB  r   Tr   )r  r   F)r  r  )rP   r   r   r   r3   r  intersectionr   )r  r)  Zlec_idsZ	b_lec_idsZ	valid_idsr   r   r   count_db_lectures_for;2  s    r,  )r  r  c                    s   t  fdd|D S )Nc                 3   s:   | ]2} j |d  krj |d|dhkrdV  qdS )r  rC  extra_topic_idr   Nr  r  rR  r   r   r3  C2  s   z$count_preview_for.<locals>.<genexpr>)r6  )r  r)  r  r   rR  r   count_preview_forB2  s    r.  c                 C   sF   t jj| |d }|r|jnd}t| |t| || }td|| S )NrR  r   )rc   r   r   r  rS  r,  r.  r  )r  r)  r  ttZneeddoner   r   r   remaining_forJ2  s    r1  c                 C   sF   d}t | }|sdS tjj| |ddD ]}|t| |j|7 }q*|S )Nr   r  Ztopic_id__inr)  )allowed_topic_ids_for_batchrc   r   r   r   r1  r)  )r  r  r   allowed_idsr/  r   r   r   total_remaining_for_batchQ2  s    r5  )rL  day_strr  r  c                    s6   t jj dd }t fdd|D }|| S )NFr  r   r  c                 3   s*   | ]"}|d  kr |d krdV  qdS )r   r  r   Nr   r  rL  r6  r   r   r3  g2  s       z(batch_lectures_on_day.<locals>.<genexpr>)rP   r   r   r   r6  )rL  r6  r  db_cntprev_cntr   r8  r   batch_lectures_on_daya2  s    
r;  )r  rL  r6  r  r  c                    s>   t jj dd  }t fdd|D }|| S )NF)r  r  r   r  c                 3   s>   | ]6}| d kr | dg kr| dkrdV  qdS )r  r  r   r   Nr   r  rL  r6  r  r   r   r3  s2  s
   z*faculty_lectures_on_day.<locals>.<genexpr>)rP   r   r   r   r   r6  )r  rL  r6  r  r9  r:  r   r=  r   faculty_lectures_on_dayk2  s    r>  )r  rL  r  r  r  r  c                    sX   t jj d||gd  }|d|dt fdd|D }|| S )NF)r  r  r  r  r  c                 3   sP   | ]H}| d kr | dg kr| dd  kr@krn qdV  qdS )r  r  r   r   r   Nr<  r  rL  r  ZwendZwstartr   r   r3  2  s     z+faculty_lectures_in_week.<locals>.<genexpr>)rP   r   r   r   r   r  r6  )r  rL  r  r  r  r9  r:  r   r?  r   faculty_lectures_in_week|2  s    

r@  )r  rL  r_  r  r  c                 C   s.   t | }t|\}}t| ||||d}||k S )zW
    Ensure faculty has not exceeded weekly lecture limit for this specific batch.
    r  rL  r  r  r  )r*  r  r@  )r  rL  r_  r  limitr  r  r   r   r   r   faculty_week_quota_ok2  s    rC  )r_  r  r  c           
         s   |j }|dtjj |d }|s,dS t|jp6d}|dkrFdS |jdd}|jt	|j
|j d d}tjj d||gd  }t fd	d
|D }	||	 |k S )Nz%Y-%mr  r]  Tr   Fr   r_  r  c                 3   s<   | ]4} j |d g kr|dddd krdV  qdS )r  r   r   Nrv  r   r  r  r  Z	month_keyr   r   r3  2  s   z)monthly_batch_quota_ok.<locals>.<genexpr>)r]  r  rd   r   r   r  r  rS  r(  r  r  rP   r   r   r6  )
r  r_  r  month_numberr  monthly_limitr  lastr9  r:  r   rF  r   monthly_batch_quota_ok2  s,    

rJ  c                 C   s.   | j dd}| j t| j| jd d}||fS )Nr   rE  )r(  r  r  r]  )rt  r  rI  r   r   r   month_bounds2  s    rK  c                    s`   t |\}}tjj d||gd  }|d|dt fdd|D }|| S )NFr  r  c                 3   sD   | ]<} j |d g kr|dd  kr4krn qdV  qdS r  r  r  r  r6  Z	first_strr   r   r3  2  s     z:count_batch_lectures_in_month_till_date.<locals>.<genexpr>)rK  rP   r   r   r   r   r  r6  )r  r_  r  r  r-  r9  r:  r   rL  r   'count_batch_lectures_in_month_till_date2  s    

rM  )r_  r  c                 C   s<   t jj| |jd }|sd S t|jp(d}|dkr8dS |S )NrD  r   )rd   r   r   r]  r  r  rS  )r  r_  r  rH  r   r   r   get_monthly_batch_limit2  s    
rN  c                    s   t |  }|dkrdS |dkr"dS t \}}g }|}||krrtjj| |dd rb|| |tdd7 }q6|szdS t	 fd	d
|D }t
|t }	|t }
||
 |	 d |	 }td|}t|  |}||k S )z
    Keep the monthly target spread over dates on which the batch can
    actually attend. Calendar days without a batch slot must not suppress
    lecture generation.
    NTr   Fr  r  r   r  c                 3   s   | ]}| krd V  qdS r   Nr   r"  rE  r   r   r3  3  s      z*monthly_distribution_ok.<locals>.<genexpr>)rN  rK  re   r   r   r  r;  r   rx   r6  r   MAX_LECTURES_PER_DAY_PER_BATCHr  rM  )r  r_  r  rH  r  rI  r  cursorZelapsed_available_datesZtotal_capacityZelapsed_capacityexpected_allowed_till_todaycurrent_count_till_todayr   rE  r   monthly_distribution_ok2  s>    



rT  )the_datestart_tend_tr  r  c                 C   sv   t jj| ||dd rdS | d}|d}|d}|D ]2}|d|krRq>|d |k r>|d |kr> dS q>dS )	z
    Return True if *any* lecture (DB or preview) overlaps [start_t, end_t) on the_date.
    No exceptions; blocks all batches, merged or not.
    F)r   r   end_time__gtr  Tr  r  r   r   r  )rP   r   r   r;  r  r   )rU  rV  rW  r  r6  win_swin_er   r   r   r   global_time_block_all%3  s     



r[  c                 C   s   t jj| |ddjdddd }|r0|jS g }|D ]J}| j|dg krPq8|j|d|d	hkrlq8|d
sxq8|	| q8|r|j
dd d |d d
S dS )a  
    If this topic has already started for this batch,
    return the faculty who started/taught it first.

    Priority:
    1. Existing saved DB lectures
    2. Preview lectures generated in current run

    Once found, same topic should continue with same faculty only.
    F)r   r)  r  T)Zfaculty_id__isnullr   r   r  rC  r-  r  c                 S   s   |  dd|  ddfS )Nr   r   r   r<  rL  r   r   r   r  p3  s    

z.get_topic_started_faculty_id.<locals>.<lambda>rM  r   N)rP   r   r   r  r   r  r  r   r   r   sort)r  r)  r  
db_lectureZmatching_previewr   r   r   r   get_topic_started_faculty_id@3  s>     
r^  c                 C   s   | j tkrt| j  S tjj| jd}t| ddr>|j| jd}t| ddrX|j| jd}t	|j
ddd	}t	tjj| d
j
ddd	}||@ }|t| j < |S )aT  
    Return only topics linked to syllabus for this batch.

    Rules:
    - Topic must exist in ExamSyllabus for batch.exam_category.
    - If batch has section_id, syllabus must match that section.
    - If batch has sub_section_id, syllabus must match that subsection.
    - Topic must also exist in BatchTopicTiming for this batch.
    r&  r=  Nr<  rA  r@  rC  Tr   )r  )r   r  rX   r   r   r$  r  r=  rA  r  r   rc   )r  Zsyllabus_qsZsyllabus_topic_idsZbatch_topic_idsallowedr   r   r   r3  {3  s*    

 
r3  rF   )r)  r  c                 C   s   t | }ttjj| |djddd}tjj| j|d}t| ddrR|j| j	d}t| d	drl|j| j
d
}t }|dD ]}||jjddd q|||@ |@ }ttjj|dS )z
    Return dependency topics only if they are:
    - linked in ExamSyllabus
    - planned in BatchTopicTiming
    - allowed for this batch
    r2  rC  Tr   )r$  r)  r=  Nr<  rA  r@  r   r  )r3  r  rc   r   r   r   rX   r$  r  r=  rA  r'  r  r*  r   rF   )r  r)  r4  Zplanned_idsr   
parent_idsesr   r   r   parents_in_plan3  s2     rb  c                 C   sf   t | }|st S tjj| |djddd}t }tjj|dD ] }t| ||dkr@||j	 q@|S )z
    Return only topics that are:
    - allowed by syllabus
    - added in BatchTopicTiming
    - still pending based on DB + preview count
    r2  rC  Tr   r  r   )
r3  r  rc   r   r   r   rF   r1  rc  r   )r  r  r4  r  pending_idsr)  r   r   r   pending_topic_ids_for_batch3  s     rd  c                    s<  t | |}|sg S tjj|d}dd |D  dd |D dd |D }|D ]D}t| |D ]4}|j krlq\|j  d7  < ||j |j q\qNg fdd|D  }}|r| fd	d|D  g }	|D ]8}
||
 D ]*}|  d8  < | d
kr|	| qq|	}q fdd D }|r8|| |S )zt
    Build dependency layers only for pending topics.

    Completed topics will not enter the generation loop.
    r  c                 S   s   i | ]}|j |qS r   r%  r  r   r   r   r\  3  s      z+build_dependency_layers.<locals>.<dictcomp>c                 S   s   i | ]}|j d qS r   r%  r  r   r   r   r\  3  s      c                 S   s   i | ]}|j g qS r   r%  r  r   r   r   r\  3  s      r   c                    s    g | ]} |j  d kr|j qS re  r%  r  )indegr   r   r   4  s      z+build_dependency_layers.<locals>.<listcomp>c                    s   g | ]} | qS r   r   r)  id_mapr   r   r  4  s     r   c                    s    g | ]\}}|d kr | qS re  r   )r1  rg  rt  rg  r   r   r  4  s      )rd  rF   r   r   rb  r   r   r5  )r  r  rc  r  childrenr   r  layerZfrontierZnext_frontierur  	remainingr   )rh  rf  r   build_dependency_layers3  s6    


rm  )r)  r  r  c                 C   sl   t | |D ]\}tjj| |d }|r4t|jp0dnd}|dkrBq
t| |t| || }||k r
 dS q
dS )z
    STRICT: A topic becomes eligible ONLY after *all* its dependency topics
    are fully completed for this batch.

    'Fully completed' = DB lectures + preview lectures >= required no_of_lectures.
    rR  r   FT)	rb  rc   r   r   r  r  rS  r,  r.  )r  r)  r  r  r/  reqr0  r   r   r   parents_completed_for_topic4  s    ro  )
slot_startslot_endr  c                 C   sl   g }t t | }t t |}ttd}ttd}|| |krh|| ||  f ||7 }q8|S Nr   )	rw   r  r   r  rx   OVERLAP_STEP_MINUTESONE_LECTURE_MINUTESr   r   )rp  rq  windowsr  r  stepZdurr   r   r   build_windows.4  s    


rw  c                 C   s   t t |j}t t |j}t t | j}t t | j}t||}t||}|| tt	dk rrg S t
| | S rr  )rw   r  r   r  r   r  r  r  rx   rt  rw  r   )Z
batch_slotZfac_slotfsfebsberN  r   r   r   r   overlap_windows:4  s    

r|  )r  day_daterV  rW  r  r  c                 C   s|   t jj| |||dd rdS |D ]T}t| t|d @ r"|d |dkr"|d |dk r"|d	 |dkr" dS q"dS )
NF)batches__id__inr   r   rX  r  Tr  r   r  r   r  r  )rP   r   r   r;  r  r  )r  r}  rV  rW  r  r   r   r   r   any_batch_time_conflictF4  s    
$r  )r  rU  rV  rW  r  r  c                 C   sv   t jj| |||dd rdS |D ]N}|d| kr"|d |dkr"|d |dk r"|d	 |dkr" dS q"dS )
NF)r  r   r   rX  r  Tr  r   r  r   r  r  )rP   r   r   r;  r   r  )r  rU  rV  rW  r  r   r   r   r   faculty_has_conflictZ4  s    
 $r  c                 C   s$   t | drt| jjdddS t S )Nr  r   Tr   )hasattrr  r  r   )
main_batchr   r   r   allowed_merge_batch_idsm4  s    
r  )r  rY  rZ  r  c                 C   s4   t jj| |dD ]}|j|kr|j|kr dS qdS )Nr  TF)re   r   r   r   r  )r  r  rY  rZ  rz  r   r   r   batch_slot_covers_windows4  s    r  )rV  r  r  r  c                    s  t || dkrdS t|| s$dS t}|s4dS tjj||gd||dddd 	dd}|D ]d  j
}|d	}|d
}	 j j }
}t fdd| D }|rqjt||
|sqjtjg||
|| rqjt|| sqjt|| sqjt|| sqjtj|	| }|tkr"qj|dkr<t|| s<qjt jjddd}t jjddd}|  j|j|j|jt|jdd j t!t j"ddjg| j#g| |	||
d|dddd  dS dS )a  
    Try to attach main_batch to an existing DB lecture for this topic
    for any mergeable batch, on ANY date between from_date and end_date
    (not just the current loop date).

    If found and all constraints pass, append a schedule row for that lecture date.
    r   F)r  r  rC  r~  r   r   r.  r   r   r  r  c                 3   s0   | ](}| d  jko&j| dg kV  qdS )r   r  N)r   r   r1  r  r   r  r   r   r3  4  s   z:find_and_merge_into_existing_db_lecture.<locals>.<genexpr>r   r   Tr   r  r  r   rr  r  z(Merged into existing DB lecture (future)merged_existingr   rC  r  r=  r  r  rr  r  r  r   r_  r   r  note
status_tag)$r1  ro  r  rP   r   r   r   r   r   r   r   r  r   r  rt  r  r  r   rJ  batch_week_quota_okweekly_distribution_okr;  rP  !should_allow_second_lecture_todayr   r   r   r   r  r=  r  r'  r  rH  r   r  )rV  r  r)  r  r  mergeable_idsZexisting_qsr  r  r6  rY  rZ  Zalready_mergedtoday_countZother_batch_idsZother_batch_namesr   r  r   'find_and_merge_into_existing_db_lecturez4  s     
 





r  )r  r  rV  r  c              	   C   s  t | }|sdS |D ]}|d|jkr,qzt|d d }W n tk
r\   Y qY nX ||k s||krpqt|d |@ sq|d}z,t|d d	 }	t|d	 d	 }
W n tk
r   Y qY nX t
| ||	|
sqt| jg||	|
|rqt| ||sqt| ||sq|d}t| j||}|tkr<q|d
krVt| ||sVq| j|d krv|d | j | j|d kr|d | j |j|d< t|jdd|d< |dpd}|r| d| j d|d< nd| j d|d< |ddkr
d|d<  dS dS )z
    For dependent topics:
    If any *mergeable* batch already has this topic scheduled in the preview
    between from_date and end_date, add main_batch to that lecture instead
    of creating a new lecture.
    FrC  r   r  r  r  r   r  r  r   r  r=  r  r   r  z + merged future (r  zMerged future (r  )r  
merged_newmerged_futureT)r  r   r   rw   r  r   rG  r  r  r   r  r  rJ  r  r;  rP  r  r   r  r=  r  r'  )r  r)  r  r  rV  r  r   r  r  rY  rZ  r6  r  Zold_noter   r   r   &merge_batch_into_future_topic_lectures4  sl    



    


r  )rL  r  c                 C   sn   d}| t krt |  S ztjddj| dj}W n tjk
rJ   d }Y nX t|tr^|dkrb|}|t | < |S )Nru  r   r  r%  r   )	r  rI   r   r'  r   r  r>  r  r  )rL  ZDEFAULT_BATCH_WEEK_LIMITr)  r   r   r   r  <5  s    
r  c                    sZ   t  j}t|\tjj dgd }t fdd|D }|| }||k S )NFr  c                 3   sH   | ]@} j |d  krd|d   kr8dkrn qdV  qdS )r  r  r   r   N)r   r  r  r  r  r  r   r   r3  X5  s     z&batch_week_quota_ok.<locals>.<genexpr>)r  r   r  rP   r   r   r   r6  )r  r_  r  rB  r9  r:  r   r   r  r   r  N5  s    

r  )r  rU  rV  r  c                 C   s   |j t| krdS t| ||dkr&dS t| ||s6dS t| ||sFdS t| ||sVdS |d}t| j ||tkrvdS t	j
j| |d sdS dS )NFr   r  r  T)r   r3  r1  ro  rJ  r  r  r;  rP  re   r   r   r;  )r  r)  r  rU  rV  r6  r   r   r   batch_can_attend_topic_on_dayb5  s     
r  c                 C   s2   t |D ]$}| j|dg kr|d  S qd S )Nr  rC  r	  r   r   r  r  r   r   r   r   last_topic_for_batchx5  s    r  c                 C   s   t jj| ||d S )N)r  Zfrom_date__lteZto_date__gte)rq   r   r   r;  )r  Zlecture_dater   r   r   faculty_on_leave~5  s
    r  Fc                 C   s   |r
|j ndt|dd|r |j ndt|dd|r:|dnd|d}| D ]h}|d|d k}|d|d k}	|d	|d	 k}
|rH|	rH|
rH|s dS |d
|d
 krH dS qH| | dS )z
    Store topic skip / not-generated reason without changing scheduling logic.
    Prevents duplicate repeated messages for same topic + reason + date.
    Nr  r   r  r  rC  r  rL  r  r   r  rC  rL  r  r   )r   r  r  r   r   )not_generated_topicsr)  r  r  date_objrepeat_by_dater  existingZ
same_topicZ
same_batchZsame_reasonr   r   r   add_not_generated_reason5  s"    

	r  c                    s@   dd|j |j|d|d t fdd| D s<|   dS )zCRecord a date-level skip in the same visible report as topic skips.NzAll topics (date skipped)r  r  c                 3   sR   | ]J}| d dkoH| d d koH| d d koH| d d kV  qdS )rC  NrL  r   r  r<  r  r  r   r   r3  5  s   z*add_skipped_date_reason.<locals>.<genexpr>)r   r  r  rt  r   )r  r  r  r  r   r  r   add_skipped_date_reason5  s    r  )rL  rC  r}  rV  rW  r  r  c              	   C   s  g }z8t jj| ||dd }|D ]}||j|jf q"W n tk
rP   Y nX zPtjj|dj	ddd}	t jj|	| |dd }|D ]}||j|jf qW n tk
r   Y nX |
d}
|D ]}|d	|
krq| |d
g krq||d|dhkrqz:t|d d }t|d d }|||f W q tk
r\   Y qY qX q|sjdS |D ]$\}}||ks||krn dS qndS )a  
    Prevent same topic for same batch on same date in separated time slots.

    Allowed:
    - Same topic back-to-back continuation
      Example: 07:00-08:00 and 08:00-09:00

    Not allowed:
    - Same topic morning and evening
      Example: 07:00-08:00 and 21:00-22:00
    F)r  Z
topics__idr   r  )r  r   Tr   )r  r  r   r  r  r   r  rC  r-  r   r  r  )rP   r   r   r   r   r   r  rG  r2   r   r  r   rw   r  r   )rL  rC  r}  rV  rW  r  Zexisting_slotsdb_lecturesr   rd  r6  Z
prev_startZprev_endZexisting_startZexisting_endr   r   r   "same_topic_non_continuous_conflict5  sh    
 


r  )rL  r}  r  r  c                    s@   | dtjj |dd }|r(dS t fdd|D S )Nr  Fr7  Tc                 3   s,   | ]$}| d ko" | dg kV  qdS )r   r  Nr<  r  r8  r   r   r3  6  s   z,batch_has_lecture_on_date.<locals>.<genexpr>)r  rP   r   r   r;  rt  )rL  r}  r  	db_existsr   r8  r   batch_has_lecture_on_date6  s    

r  )r}  r  c                 C   s   | d}tjj| |d S )Nr  r  )r  re   r   r   r;  )r  r}  r  r   r   r   batch_has_slot_on_date6  s
    
r  )r  r  c                 C   s@   |t dd }tdD ]$}t| |r,|  S |t dd8 }qdS )z=Return the previous configured timetable date for this batch.r   r     N)rx   rc  r  )r  r  rQ  r-  r   r   r   previous_batch_timetable_date#6  s    
r  c                 C   s&   t | |}|dkrdS t| j|| S )a   
    A distribution/spacing rule must not skip the current timetable date when
    the immediately previous timetable date was also left without a lecture.

    Hard batch/faculty quotas, leave, dependency and conflict checks are still
    enforced by the normal scheduling pipeline.
    NF)r  r  r   )r  r  r  previous_dater   r   r   &must_schedule_to_avoid_two_missed_days16  s    
r  c                 C   s   t dkst dkrdS t|\}}t| j}|t  d t  }g }|}||krnt| |r^|| |tdd7 }qB|d d }	t||	k rdS |tdd }
t| j|
|rdS dS )a>  
    Skip consecutive lecture days only when the batch has enough available days
    in the week to maintain a 1-day gap.

    Example:
    Weekly limit = 6, max/day = 2
    Required lecture days = 3

    If available days are 6 or 7, schedule alternate days.
    If available days are only 3, do not enforce gap.
    Nr   Fr   r  r  T)	rP  r  r  r   r  r   rx   r   r  )r  r  r  r  r  r  Zrequired_daysr  rt  Zmin_days_needed_for_gapr  r   r   r   should_skip_for_smart_gapD6  s$    


r  c                 C   s2   t |D ]$}| j|dg kr|d  S qd S )Nr  r  r  r  r   r   r   last_faculty_for_batchr6  s    r  )r  r6  r  r  c                 C   s   t jj| |jddd}dddd| jf}|D ]}	|	j}
t|
j|rFq.tjj|
|dj	t
tdtddd	t d
ddd}| sq.t|
j|j||}t|\}}t|
j|j|||d}|r|
j|krdnd}| j}||||| jf}||k r.|}q.|S )a  
    Lower score = better candidate.

    Preference:
    1. Faculty priority slot (priority 1 first)
    2. Faculty with fewer lectures today for this batch
    3. Different faculty than last scheduled lecture
    4. Faculty with fewer lectures this week
    r	  topic_expertiseselected_examsZfaculty__statusr   i ʚ;r   r_  r   ?B priorityr%  r  r&  priority_orderr  r   rA  r   )rf   r   r   r  r   r   r   r  rg   r  r   r   r   r   r   r;  r>  r  r@  r  r  )r)  r  r  r6  r  r  last_faculty_idfac_detailsZ
best_scorefdfacfslotsr  r  r  Z
week_countZsame_as_lastZmin_priorityra  r   r   r   min_faculty_priority_for_topicy6  sh    

r  c                    s   t  j}|dkrdS t|\}}d}|| jd }t|| | }td|}tjj d||gd	 
 }	|d|dt fdd|D }
|	|
 }||k S )	z_
    Spread weekly lectures across the week.
    Prevent finishing weekly quota too early.
    r   Frv  r   r  r  c                 3   sD   | ]<} j |d g kr|dd  kr4krn qdV  qdS r  r  r  r  r6  r!  r   r   r3  6  s     z)weekly_distribution_ok.<locals>.<genexpr>)r  r   r  r  r  r  rP   r   r   r   r   r  r6  )r  r_  r  r  r  r  Ztotal_week_daysZelapsed_daysrR  r9  r:  rS  r   r  r   r  6  s(    



r  )rV  r  c                 C   s(   | t ddk rdS | t ddkr$dS dS )z7
    Categorize slot as morning / evening / other.
    rx  r   morning   eveningother)r   )rV  r   r   r   	slot_part6  s
    r  )rL  r  r  r  r  r  c              	   C   s   d}t jj| d||gd }|D ]}t|j|kr"|d7 }q"|d}|d}	d}
|D ]|}| |dg krpqZ||dd  kr|	ksqZ qZzt	|d	 d

 }W n tk
r   Y qZY nX t||krZ|
d7 }
qZ||
 S )zi
    Count how many lectures this batch has in morning/evening in a week.
    Includes DB + preview.
    r   Fr  r   r  r  r   r   r   r  )rP   r   r   r   r  r   r  r   rw   r  r   rG  )rL  r  r  r  r  Zdb_countr  r   r!  r   Zpreview_countrV  r   r   r   batch_slot_part_count_in_week6  s0    





r  )rL  r}  rV  r  r  c           	      C   s\   t |\}}t| ||d|}t| ||d|}t|}|dkrD|| S |dkrX|| d S dS )z
    Lower score is better.

    Goal:
    - Avoid always selecting morning.
    - Prefer evening if morning count is already higher.
    r  r  r   r   )r  r  r  )	rL  r}  rV  r  r  r  Zmorning_countZevening_countZcurrent_partr   r   r   slot_distribution_score'7  s*    r  c                 C   s   i }t jj| d||gd }|D ]$}|jd}||dd ||< q"|d}|d}	|D ]N}| |dg krvq`|dd}
||
  kr|	kr`n q`||
dd ||
< q`td	d
 | D S )zK
    Count how many days in this week already have 2 or more lectures.
    Fr  r  r   r   r  r   r   c                 s   s   | ]}|d krdV  qdS )r  r   Nr   )r1  cntr   r   r   r3  u7  s      z4batch_double_lecture_days_in_week.<locals>.<genexpr>)	rP   r   r   r   r   r  r   r6  r  )rL  r  r  r  Z
day_countsr  r   rt  r!  r   r  r   r   r   !batch_double_lecture_days_in_weekS7  s$    



r  c                    s   t |\}}t j}|d|dtjj d||gd  }|t	 fdd|D 7 }|| }|dkrzdS t
 j|||}|dkrdS g }	|}
|
|krtjj |
dd	 r|	|
 |
tdd
7 }
q|t|	kS )z
    Allow 2 lectures in a day only occasionally.

    Rule:
    - Max one double-lecture day per week.
    - If weekly target cannot be achieved with remaining days, allow second lecture.
    r  Fr  c                 3   sD   | ]<} j |d g kr|dd  kr4krn qdV  qdS r  r  r  r  r   r   r3  7  s     z4should_allow_second_lecture_today.<locals>.<genexpr>r   r   r  r  r  )r  r  r   r  rP   r   r   r   r   r6  r  re   r;  r   rx   r   )r  r  r  r  r  r  Zcurrent_week_countr$  Zdouble_daysZremaining_datesrt  r   r  r   r  w7  s<    	




r  c              	   C   s:  d}z,t jj| |dddd }|r.|j}W n tk
rD   Y nX zVtjj|djddd	}t jj|| dd
dd }|r|dks|j|kr|j}W n tk
r   Y nX |D ]~}| j	|
dg krq|j	|
d|
dhkrqzt|d d }W n tk
r   Y qY nX |dks0||kr|}q|S )z
    Get latest lecture date for this batch + topic from DB and preview.
    Used to maintain gap between multiple lectures of same topic.
    NF)r   r.  r  r  z-start_time)r.  r   Tr   )r  r   r  r  rC  r-  r   r  )rP   r   r   r   r  r   rG  r2   r   r   r   rw   r  r   )r  r)  r  	last_dater]  rd  r   r  r   r   r   %get_last_topic_lecture_date_for_batch7  sd     
  

r  )r  r  r  r  c           	      C   s   d}|}||kr| d}tjj| |d s>|tdd7 }qt| ||sZ|tdd7 }qt| ||sv|tdd7 }qt| j	| d|}t
dt| }||7 }|tdd7 }q|S )z
    Estimate how many lectures can still be scheduled for this batch
    from from_date to end_date based on batch slots, weekly quota, monthly quota,
    and max lectures per day.
    r   r  r  r   r  r  )r  re   r   r   r;  rx   rJ  r  r;  r   r  rP  )	r  r  r  r  capacityrt  r  Zcurrent_day_countZallowed_todayr   r   r   %batch_available_lecture_capacity_left7  s2    
r  )r  r  r  r  c           	      C   sj   t | ||}|sdS || j}|dkr*dS |dkr6dS |dkrft| |}t| |||}||krbdS dS dS )z
    Maintain 1-2 day gap between multiple lectures of same topic.

    Preferred:
    - At least 1 day gap after previous lecture.
    - Better if 2 days gap.

    But if remaining syllabus capacity is tight, allow earlier scheduling.
    Tr   r  r   F)r  r  r5  r  )	r  r)  r  r  r  r  Zgap_daysZtotal_remainingZcapacity_leftr   r   r   same_topic_gap_ok8  s(    

r  )r  r  r  r  c                    sP   t jj d||gd }|r"dS |d|dt fdd|D S )NFr  Tr  c                 3   s@   | ]8} j |d g ko6|dd  ko2kn  V  qdS )r  r   r   Nr  r  r  Zcurrent_str	start_strr   r   r3  Z8  s   z9batch_has_any_lecture_in_preview_or_db.<locals>.<genexpr>)rP   r   r   r;  r  rt  )r  r  r  r  r  r   r  r   &batch_has_any_lecture_in_preview_or_dbM8  s    


r  c           3         s  t   t  t  | jddk}g }g }z"tjjdd}| jd}| jd}| j	d}|s| jdr| jdg}d	d
 |D }|r|r|st
| d|g tjg td|dd
 |D dW S t|d }t|d }	ttjj|ddd}
|
stdddW S g |
D 
]ԉz@tdd }t|drdt| jddjjd}ng }W n tk
r   g }Y nX t}|stddd  W S | z@tdd }t|drt| jddjjd}ng }W n tk
r   g }Y nX t}|s*t|d dd  q$ |	kr$tdkrHq$ d d|r|d  dj d dt j d t!j 
 t" st# rt$| d! |r|d  d"  t%d#d$7  q*t&| }t' sNt# r$t$| d% |r<|d  d&  t%d#d$7  q*t( }t) }|r|s|st# rt$| d' |r|d  d(  t%d#d$7  q*|r|r|r|s|d  d) tt*jjd*d+}|s>|r,|d  d,j d- d.  t%d#d$7  q*t+}|st$| d/ |rt|d  d0  t%d#d$7  q*t,}g }t- }|d k	r0|D ]}|D ]z}t.|dkr|r|d  d1 qt/|}d2d3 |D }||krt0|r|| |1|j qq|D ]}|D ]}|j|krPq<t.|dkr~|r<|d  d4 q<t0|st||d5 d6d7 q<|| |1|j q<q4|st$| d8 |r|d9  t%d#d$7  q*t2t3| fd:d;d<}|D ]}t4|}t5| |	d=}|rn|r$|d  d>|j6 d? q$t7| |	r|r|d  d>|j6 d@  qt8jj|j9ddA:dB}|; st||dC  |r$|dC q$t<|}|rpt=jj|d> }t?| rpt||dDt|dE| dF  |r$|d  d>|j6 dGt|dE| dH q$d6} g }!|D ],}"|"j@}#t?|#j rt||dI|#jA dJ  |r||d  d>|j6 dK|#jA dL q|tBjj|#dMjCtDtEdtFdNdOdPtG dQdRdSd+}$|$D ]}%|D ]t}&tH|&|%}'|'D ]\\}(})tId k	rdt!jtIkrd q"tJjg |(|)rt||dT|(dU dV|)dU d.  q6tK|#j |(|)rt||dI|#jA dW|(dU dV|)dU d.  q6tLd k		r6tM|#jjtLk	r6t||dI|#jA dX dYd7 q6tN|#jj 	slt||dI|#jA dZ dYd7 q6tOj|j |(|)	rt||d[|(dU dV|)dU d\ dYd7 q6tP| |		st||d] dYd7 q6g}*|D ]r}+tQ|+| 
s	qtJ|+jg |(|)
r	qtO|+j|j |(|)
r:	qtP|+| |	
sP	q|*|+ 	q|!||#|*|(|)t|%dPdN
p|dNtRj |(d^ q6q"qq| 
qq||!rt3|!d_d; d<}!|!d },|,dB }#|,d` }*|,d+ }(|,da })d |j|j6|jSt|jTdbdc|#jt|#jAddd
 |*D ded
 |*D |(dU|)dUt4|*d#krRdfndgt4|*d#krfdhndidj dY} |r|d  d>|j6 dk|(dU dV|)dU dldmd
 |*D  
 | s$t4||kr$t||dn dYd7 q$ t%d#d$7  q*q$jUdod; d< t
| d|||dpd
 |D tjtd|r<|ng |tj|tddq	W S  tk
r }- zFtVW|-jX}.|.dr \}/}0}1}2tds|- dt|/ du|0 dvidwd W Y S d }-~-X Y nX d S )xNdebug)r{  r  yesr	  r   r  r  r  rL  c                 S   s    g | ]}t | rt|qS r   )rH  rf  r  )r1  bidr   r   r   r  u8  s      z%generate_lectures.<locals>.<listcomp>zpreview-lecture.html)rF  c                 S   s   g | ]}t |qS r   r  r  r   r   r   r  }8  s     )r   rV  schedule_json
debug_logsselected_batch_idsr  )r  r   r   emptyz!No active selected batches found.r8  r  r   r%  zNo allowed topics.z0No allowed syllabus topics found for this batch.r   r  r  z] Checking z | Day=z | WeekLimit=z | TodayCount=z&Monthly lecture quota is already full.z0] Skipped because monthly lecture quota is full.r   r  z%Weekly lecture quota is already full.z/] Skipped because weekly lecture quota is full.zSSkipped to keep lectures distributed across the batch's available dates this month.zC] Skipped because monthly distribution limit reached for this date.zX] Monthly distribution spacing bypassed to avoid two consecutive missed timetable dates.r  r   z] No batch slot found for z on r  z\No pending eligible topic was available; topics may be completed or blocked by dependencies.z] No layers.z] remaining for condition.c                 S   s   h | ]
}|j qS r   r%  )r1  r  r   r   r   ro  R9  s     z$generate_lectures.<locals>.<setcomp>z(] remaining for condition inside layers.z&Dependency topic is not completed yet.F)r  zJNo pending topic was eligible because its dependencies were not completed.z
No topics.c              	      s   t |  dS )N)r)  r  r  r6  r  r  r  )r  r   currentr  r6  r  r  rV  r   r   r  9  s   z#generate_lectures.<locals>.<lambda>rM  )r  r)  r  r  rV  z] z1: merged into future lecture instead of new slot.z": merged into existing DB lecture.r  r   z:No active faculty mapped for this topic and exam category.zTopic already started with rr  z, but that faculty is on leave.z+: skipped because it is already started by z and that faculty is on leave.zFaculty z is on leave.z
: skipped z, faculty on leave.r  r  r  r  r&  r  r  zBatch has time conflict at r  r  z has time conflict at z daily lecture limit reached.Tz weekly lecture limit reached.zWSame topic already scheduled on this date in a non-continuous time slot. Proposed slot z	 skipped.z3Same topic lecture skipped to maintain 1-2 day gap.)r)  r   matched_batchesr   r  faculty_priority
slot_scorec                 S   s   | d | d | d  dfS )Nr  r  r   r  r  rL  r   r   r   r  ~:  s    r  r  r  r   c                 S   s   g | ]
}|j qS r   r%  r  r   r   r   r  :  s     c                 S   s   g | ]
}|j qS r   r  r  r   r   r   r  :  s     ZMergedzSingle Batch (new)r  newr  z: scheduled z for batches c                 S   s   g | ]
}|j qS r   r  r  r   r   r   r  :  s     z.No valid faculty/batch slot combination found.c              	   S   s2   |  dd|  ddddd |  dg D fS )Nr   r   r   r  c                 s   s   | ]}t |V  qd S r@  r  r  r   r   r   r3  :  s     z6generate_lectures.<locals>.<lambda>.<locals>.<genexpr>r  )r   r  )r  r   r   r   r  :  s    

c                 S   s   g | ]}t |qS r   r  r  r   r   r   r  :  s     )	r   r  r  r  rV  r  r  r  Znot_generated_topics_jsonr  r   z (File: z, Line: r  r9  )Yr  clearr  r  r   r   rI   r   r   r_  r   r  r  rH  rw   r  r   r   r   r	   r  r  r   r  r   rG  r3  r  r5  r  r   r  r  r;  rJ  r  r  rx   r  r  rT  r  re   rm  r  r  r1  rb  ro  rc  r  r  r   r  r  r  rf   r  r   r;  r^  rH   r  r  r   rr  rg   r  r   r   r   r   r|  rP  r  r   MAX_LECTURES_PER_DAY_PER_FACULTYr>  rC  r  r  r  r  r=  r'  r\  	traceback
extract_tb__traceback__)3r   r  r  r  r   Zstart_date_strZend_date_strr  r  r  selected_batchesZ_mb_relr  r4  Zhas_started_in_selected_rangeZdistribution_allows_dateZforce_after_missed_dateZbatch_slotslayersZlast_tid
candidatesZadded_topic_idslvlr   parentsr`  r)  Ztopic_reason_count_beforer  r  Zstarted_faculty_idZstarted_facultyZtopic_scheduledvalid_optionsr  r  r  ZfslotZbslotru  rY  rZ  r  mbselectedr   tbr  linenofuncr  r   r  r   generate_lecturesb8  s   


 




2



 












 





$
&
	8


r  c                 C   s"   t jj| |dd  }|d S )z
    Get next lecture number for this topic across selected batch/batches.

    Example:
    If Averages already has 2 lectures for this batch,
    next title should be Averages 3.
    F)r~  rC  r  r   )rP   r   r   r   r   )r  rC  Zexisting_countr   r   r   get_next_topic_lecture_number:  s    	r  c           	      C   sx  | j dkrtddiddS t| jdd}|D ]6}d }|d}|rxztjj|d	}W n tjk
rv   d }Y nX |d kr|d
g }|d}|d}t	||}tjj
|d  d| |d |d |d |d |dd|dd}|drtjj|j|d d d|kr<|d r<tjj|j|d d |d
 D ]$}|j| tjj|j|d qDq2tddiS )Nr   r   rF  rA  r   r  r5  r   r%  r  rC  r  r  r  r   r   r  r=  r  )r   r  r   r   r  r=  r  rC  )r   r  r-  r  r  zLectures saved successfully!)r   r	   r  r:  r   r   rP   r   r>  r  rb  r2   r@  r   r   rc  r3   )	r   rZ  r  r  r   r  rC  Zlecture_numberr  r   r   r   save_previewed_lectures:  sV    






r  c              
   C   s   | j dkrzt| j}|d}|d}|dg }|sNtddiddW S tt|d	}|D ] }tj	j
|||d
 |d d q^tddiddW S  tk
r } ztdt|idd W Y S d }~X Y nX tddiddS )Nr   rL  r_  
time_slotsr   Day is missing from the requestrA  r   r%  r   r  )r  r_  r   r  r  Time slots added successfully!r$  rE  rm  )r   r  r:  r   r   r	   r   rI   re   r   rb  rG  rH  )r   rZ  rL  r_  r  r  slotr   r   r   r   add_batch_time_slot;  s(    


*r  c              
   C   s   | j dkrz<t| j}|d}tt|d}|  tddiddW S  t	k
r } ztdt
|id	d W Y S d }~X Y nX tdd
iddS Nr   slot_idr%  r  zTime slot deleted successfully!r$  r   r   rA  rE  rm  )r   r  r:  r   r   r   re   rF  r	   rG  rH  r   rZ  r  r  r   r   r   r   delete_batch_slot7;  s    

*r  c                 C   sP   g }t | j| jd}t |j|jd}||krL|j}|| |tdd7 }q$|S )z;Return list of month numbers between two dates (inclusive).r   months)r   r  r]  r   r   r  r  r  r  r   Z	month_numr   r   r   re  G;  s    
re  c           	   	      s,  | j dkrztjj|d}W n& tjk
rD   tddidd Y S X ddlm dd	lm	   fd
d}||j
|j}| j D ]\}}|dr|dd}zt|}W n tk
r   Y qY nX ||krqzt|}W n tk
r   d}Y nX tjj||d|id qtddiS tddiddS )Nr   r%  r   rP  rE  r   r   r   r   c                    sP   g } | j | jd} |j |jd}||krL|j}|| |dd7 }q$|S )Nr   r  )r  r]  r   r  r   r   r   r   re  _;  s    
z.save_monthly_lectures.<locals>.get_month_rangeZmonthly_lectures_r   rS  )r  r]  ra  r  zSaved successfully!rF  rA  )r   rI   r   r   r>  r	   dateutil.relativedeltar   rw   r   r  r  r   r5  r  r(  r  rC  rd   rg  )	r   rL  r  re  rd  r.  r,  r]  rS  r   r  r   save_monthly_lecturesT;  sJ    


 r  c                    s   t t|d tjj d}i }|D ]B}|jr"|jr"|jj}|jj}||krZ|| 	| q"|g||< q"ddddddd	g} fd
d|D }t
jj dd}	tj }
tj }tjj ddddd}t| d |
||||	|dS )Nr%  r   rV  rW  rX  rY  rZ  r[  r\  c                    s(   g | ] }|t jj |d ddfqS )r  r  r   )rg   r   r   r   r`  r  r   r   r  ;  s   z#faculty_details.<locals>.<listcomp>z
-from_dater  r  Z"selected_exams__exam_category_nameZtopic_expertise__topic_namezfaculty-details.html)r   r  r.  rc  exam_topic_mapfaculty_leavesfaculty_details)r   rH   rf   r   r   r  r  rK  r  r   rq   r   rA   r   rF   r   r   )r   r   Zfaculty_detail_entriesr  r7  rM  r  rh  rc  r 	  r  r.  r	  r   r  r   r	  ;  sH    


r	  c                 C   s   t t|d}| jdkr| jd}| jd}|r6|sPt| d td|jdS ||krrt| d td|jdS t	j
j|||d t| d	 td|jdS )
Nr%  r   r  r  #From date and To date are required.r	  )From date cannot be greater than To date.)r   r  r  z!Faculty leave added successfully.)r   rH   r   r   r   r   r   r   r   rq   r   rb  r>  )r   r  r   r  r  r   r   r   add_faculty_leave;  s"    
r	  c                 C   s   t t|d}|j}| jdkr| jd}| jd}|r<|sVt| d td|j	dS ||krxt| d td|j	dS ||_
||_|  t| d td|j	dS )	Nr%  r   r  r  r	  r	  r	  z#Faculty leave updated successfully.)r   rq   r   r   r   r   r   r   r   r   r  r  rd  r>  )r   leave_idleaver   r  r  r   r   r   edit_faculty_leave;  s     
r	  c                 C   s4   t t|d}|jj}|  t| d td|dS )Nr%  z#Faculty leave deleted successfully.r	  )r   rq   r   r   rF  r   r>  r   )r   r	  r	  r  r   r   r   delete_faculty_leave<  s
    r	  c              
   C   sl  zt | j}|d}|dp$g }|dp2g }|sLtdddddW S |sdtdd	dddW S |s|tdd
dddW S tjj|d}d}|D ]0}|D ]&}tjj|||d\}	}
|
r|d7 }qqtd| ddW S  tj	k
r   tddddd Y S  t j
k
r*   tddddd Y S  tk
rf } ztdt|ddd W Y S d }~X Y nX d S )Nr  r  selected_topicsr   zFaculty ID is missingr8  rA  r   zPlease select at least one examz Please select at least one topicr%  r   r   selected_exams_idtopic_expertise_idr   r>  z. topic expertise record(s) added successfully.zFaculty not foundrE  zInvalid JSON datar9  )r  r:  r   r   r	   rH   r   rf   r@  r>  r  rG  rH  )r   rZ  r  r  r		  r   r  rX  rC  r-  rp  r   r   r   r   add_faculty_details<  s~    



r	  c              
   C   s  zt | j}|d}|d}|r*|s>tdddddW S tjj|d}tjj|j||d	j	|d
 }|rtdd
dddW S ||_||_|jddgd tdddW S  tjk
r   tddddd Y S  tk
r } ztdt|ddd W Y S d }~X Y nX d S )NrX  rC  r   zExam and topic are requiredr8  rA  r   r%  r
	  z,This exam and topic expertise already existsr  r  rk  r>  z$Topic expertise updated successfully Topic expertise record not foundrE  r9  )r  r:  r   r   r	   rf   r   r   r   r  r;  r	  r	  rd  r>  rG  rH  )r   	detail_idrZ  rX  rC  faculty_detailZduplicate_existsr   r   r   r   edit_faculty_detailsm<  sh    



r	  c              
   C   s   z&t jj|d}|  tdddW S  t jk
rN   tddddd Y S  tk
r } ztdt|dd	d W Y S d }~X Y nX d S )
Nr%  r>  z$Topic expertise deleted successfullyr8  r   r	  rE  r   r9  )rf   r   r   rF  r	   r>  rG  rH  )r   r	  r	  r   r   r   r   delete_faculty_details<  s,    
r	  c              
   C   s   | j dkrzt| j}|d}|d}|dg }|sNtddiddW S tt|d	}|D ] }tj	j
|||d
 |d d q^tddiddW S  tk
r } ztdt|idd W Y S d }~X Y nX tddiddS )Nr   r  r_  r  r   r  rA  r   r%  r   r  )r   r_  r   r  r  r  r$  rE  rm  )r   r  r:  r   r   r	   r   rH   rg   r   rb  rG  rH  )r   rZ  r  r_  r  r   r  r   r   r   r   add_time_slot<  s(    


*r	  c              
   C   s   | j dkrz<t| j}|d}tt|d}|  tddiddW S  t	k
r } ztdt
|id	d W Y S d }~X Y nX tdd
iddS r  )r   r  r:  r   r   r   rg   rF  r	   rG  rH  r  r   r   r   delete_slot<  s    

*r	  c                 C   s   | j dkr| jd}|s*tdg iddS tjjtjj|djddd	d
	 }|	 }|
 r~dd |D }td|iddS tdg iddS tddiddS )Nr   z
exam_ids[]r.  r$  r   )Zexam_category_id__inrC  Tr   r  c                 S   s   g | ]}|j |jd qS r  r  r  r   r   r   r  =  s   zexam_topics.<locals>.<listcomp>r   rF  rA  )r   r   r_  r	   rF   r   r   rX   r   r   r;  )r   rk  main_topicsZ
all_topicsr  r   r   r   exam_topics<  s$    
 
r	  r   zSlot 1rv  )r  r-  r   r   zSlot 2rK  r   rI  zSlot 3   r   rJ  zSlot 4      rw  ry  c                 C   s   |   dkS )Nr   )r   rt  r   r   r   
is_weekend(=  s    r	  r	  c                 C   s   t | rtS tS r@  )r	  WEEKEND_SLOTSWEEKDAY_SLOTSr	  r   r   r   get_slots_for_date,=  s    r	  )r  lec_start_timec                 C   sB   t | }|D ]0}|d |  kr,|d k rn q|d   S qd S )Nr   r   r  )r	  )r  r	  slotsrN  r   r   r   find_slot_for_lecture0=  s
     r!	  )rN  r   r  c                 C   s   |  d d| d S )NrH  z - r  )rN  r   r   r   r   fmt_time_range8=  s    r"	  )r  r  c                 C   sH   | sdS |   }d|krdS d|ks,d|kr0dS d|ks@d|krDd	S d
S )zb
    Basic mapping to resemble your sheet colors.
    Change these as per your section names.
    zbg-graycatz	bg-orangeenglishZverbalzbg-pinkZlrZdizbg-greenzbg-blue)r  )r  r  r   r   r   color_for_section<=  s    r%	  c              
   C   s  | j d}| j d}| j d}|rN|rNt|d }t|d }nRt }t| j d|j}t| j d|j	}t||d}t||t
||d }||k r|| }}tjj||fdd	d
dddd}	|r|	j|d }	i }
|}||kr(g g g g d|
| < |tdd7 }q|	D ]F}|j}| }t||j}|sVq,t|jddpxt|jddpxd}t|jddpt|jddpd}|p|jr|jdkr|jnd}t|j }d}d}|rt|d jdd}ddd |D }g }|r| | | | |r2| | d|}|
| |  |j!||j"d|j#"d|t$|d q,g }|}||kr| }| t%|d r|"d!n|||"d"t&||
| d# |tdd7 }q~|||d$d% t'D d&d% t(D |d'}t)| d(|S ))z
    Renders HTML timetable view like spreadsheet.

    Query:
      /timetable?year=2026&month=5&batch_id=123
      OR
      /timetable?start=2026-05-01&end=2026-05-31&batch_id=123
    r   r   rL  r  r  r]  r   )r  r   r'  r)  r   r   r   )r  )r   r  rI  rJ  r  r  r   r   r  NullZLecturer   rK  r'  c                 s   s$   | ]}|j r|j d kr|j V  qdS )r&	  Nr  r  r   r   r   r3  =  s    
z*lectures_timetable_html.<locals>.<genexpr>z | rH  )r   displayr   r   r'  Zcolor_classr  z%d/%m/%Yr  )
date_labelZdate_isor  r	  r 	  c                 S   s.   g | ]&}|d  |d t |d |d dqS r  r-  r   r   )r  r-  r   r"	  r1  rN  r   r   r   r  =  s   z+lectures_timetable_html.<locals>.<listcomp>c                 S   s.   g | ]&}|d  |d t |d |d dqS r)	  r*	  r+	  r   r   r   r  =  s   )	start_dayend_dayrL  Zweekday_slotsZweekend_slotsr  zlecture-timetable.html)*r   r   rw   r  r   r   r  r  r  r]  r  rP   r   r   r   r   r   r   r   rx   r   r!	  r   r  r'  r)  r   r   r   r   r$  r  r   r   r  r  r%	  r  r	  r	  r	  r   )r   r  Zend_strrL  r,	  r-	  r  r  r]  r   Ztimetable_mapcurr   rt  r.  Zslot_nor  r  r   r   rM  r  r  r'	  r  r  r   r   r   lectures_timetable_htmlM=  s    
   

$$$








r/	  c                 C   s  t jjdddd}|D ]p}|j}|j}|j}|j}tjj|d }|rt	|j
d t	| }tjj||dddd }	tjj||dd	jddd
 }
tjj||dd }tjj||ddd }tjj||dd }tjj||ddddjdd }tjj||djtddd }t jj||dj||||	||d|||
d
 tjj||dddjtttddddt dtdtdtdttttddtdd@ tdd@ tdd dt dtttttddtdd! @ tdd@ tdd tdt dt d"tttttddtdd! @ tdd#@ tdd tdt dt d"tttttddtdd! @ tdd#@ tdd tdt dt d"tdd$	}|D ]}tjj|||d |d%}| r0tjj|||d |d%j|d |d& |d |d' |d( |d) |d* |d |d+ d,	 nTt||||d |d d|d& |d |d' |d( |d) |d* |d |d+ d-}|  qqtdd.d/dd0S )1Nr   r   )r  r  r  r%  r  Tr   )r  	result_idr  r  answer_id__exact)r  r0	  r  )r  r1	  )r  r0	  r  )r  r0	  r   r  )r  r0	  r  F)r  r0	  r  r   r  )r1	  )r  r0	  r  )TOTALr2	  )r  r   )
r  r  r  r  r   not_attemptedr  r  r  answer_bookmarkedr{  r|  )r   r%  r&  r  ri  r   r  )r  )r%  )r  rT  r  )	r3	  r  r  r   mark_reviewr4	  r!  r"  r  )r  r  r=  r0	  r  r3	  r!  r"  r5	  r4	  )	r  r  r   r3	  r  r  r  r  r4	  )r  r  r0	  r=  r  r  r  r   r3	  r  r  r  r  r4	  zTest end successfully.r  r  )r&   r   r   r  r  r   r  rG   r  r  r  r%   r   r  r  r   r  r  r  r   r   r   r}   r   r   r   r   r\  r$   rd  r	   )r   r  r  rQ  r  r0	  r  rc  r  r  r4	  r  answeredr3	  r  r  r  r'  sresultr   r   r   student_endTest=  s    
 "   (*
*
*
3
r8	  )r   r   c                  C   s@  t j jdd} |  s(tdddS d}tdd }td	d }| D ]}|jpVd
 }t	|j
pfd}t	|jptd}tj dj|jdddd}|D ]T}	t|	jpd}
t	|	j
pd}|	jpd
 }||krdnd}|r|n| }||
kr||krq|| }|rdnd|
rdnd }|s*dnd|
s6dnd }||	_||	_
|	jddgd |d7 }|	j}|	jj}|| d  |7  < || d  |7  < || d  |7  < |||	jf}|| d  |7  < || d  |7  < || d  |7  < qd|_|jdgd qH| D ]H\}}tjj|djtd|d  td|d  td|d  d q| D ]\\}}}}tjj||dd }|sqdtjj||||jdjtd|d  td|d  td|d  d}|dkrdtjj |j||||d |d |d dddddddd qdtd| ! |t"|t"|dS )Nr   )r%  FzNo edited questions found)r>  r  r   c                   S   s   ddddS Ng        r   )r  r!  r"  r   r   r   r   r   r  _>  r  z<regrade_correct_answer_delta_answered_only.<locals>.<lambda>c                   S   s   ddddS r9	  r   r   r   r   r   r  `>  r  r   rG  )ri  r  r  r  r  r  rk  r!  r"  r%  r%  r  r  )r  r  r  )r   r  r  )r0	  r  r=  r  )r  r  r0	  r=  r  r  r  r   r3	  r  r  r4	  r  r  T)r>  edited_questionsZupdated_answersZaffected_resultsZaffected_sections)#rE   r   select_for_updater   r;  r	   rz   r  r  floatr  r  r%   r   r   r  r  r  rd  r0	  rG  r=  r  r%  r5  r&   r  r   r'  r  r$   r  rb  r   r   )r:	  Ztotal_updated_answersZtotal_result_deltaZtotal_section_deltaZqbr  Z	pos_marksZ	neg_marksanswerssaZold_is_rightZ	old_marksr  Znew_is_rightZ	new_marksZd_marksZd_rightZd_wrongr  sidr.  r0	  rt  r=  r  trupdatedr   r   r   *regrade_correct_answer_delta_answered_onlyO>  s    




	 

rB	  c                 C   s
   t  }|S r@  )rB	  )r   infor   r   r   regrade_edited_questions>  s    rD	  c                 C   s   | j dkr| jd}| jd}| jd}| jd}t| jd}tt|d}|dkrf||_n|d	krv||_n|d
kr||_||_	||_
|  t| jddS )Nr   r  id_typerI  	id_number	is_verifyr%  ZaadharZvoterdlHTTP_REFERERr  )r   r   r   r  r   rJ   rK  voter_number	dl_numberrI  r  rd  r   META)r   r  rE	  rI  rF	  rG	  r   r   r   r   verify_student>  s"    
rM	  c                 C   s`   t jd d}t|d}| jd}||}t	jj
dddd}t| d	||d
dS )Nr$  r
  r   r  r	  r   r  rK  zcourse_discount.html))selfprepz	Self Prep)	classroomZ	Classroom)all_discountr  Zcourse_types)rj   r   r   r   r   r   r   r   r  rA   r   r   )r   	discountsr!  r  rP	  r  r   r   r   course_discount>  s    

rR	  c              
   C   sl  | j dkrtdddS z| jd}| jdp6d  }| jd}| jd	}| jd
}| jd}|stdddW S |dkrtdddW S t|||D ]t\}}}	|r|r|	sqt|}t|}t	|	}	||krtdd| d| dd  W S t
jj|||||	|d qtdddW S  tk
rf }
 ztdt|
d W Y S d }
~
X Y nX d S )Nr   r   rF  r?  r$  r  r   zmin_score[]zmax_score[]z
discount[]r   Exam category requiredrN	  rO	  Valid course type requiredz,Min score cannot be greater than max score (r  r  )r  r  	min_score	max_scorediscount_percentager   r>  z All discounts added successfully)r   r	   r   r   r  r  r_  r  r  r<	  rj   r   rb  rG  rH  )r   r  r  Z
min_scoresZ
max_scoresrQ	  r   Zmin_sZmax_sdiscr   r   r   r   add_course_discount?  sF    

	rZ	  c           
   
   C   s  | j dkrtdddS z>tt| jdd}| jd}| jdpJd	  }t| jd
}t| jd}t	| jd}| jd}||krtdddW S |stdddW S |dkrtdddW S tj
j||dj|jdt|dt|d@  }|rtdddW S ||_||_||_||_||_||_|  tdddW S  tk
r }	 ztdt|	d W Y S d }	~	X Y nX d S )Nr   r   rF  r?  r   r%  r$  r  r   rV	  rW	  r  r   z%Min score must be less than Max scorerS	  rT	  rU	  )r  course_type__iexact)min_score__lte)max_score__gtez+Score range overlaps with existing discountr>  zUpdated successfully)r   r	   r   rj   r   r   r  r  r  r<	  r   r   r  r   r   r;  r  r  rV	  rW	  rX	  r   rd  rG  rH  )
r   r  r  r  rV	  rW	  r  r   r;  r   r   r   r   edit_course_discountP?  sR    

r^	  c              
   C   s   | j dkrtdddS z,tt| jdd}|  tdddW S  tk
r| } ztdt|d W Y S d }~X Y nX d S )	Nr   r   rF  r?  r   r%  r>  zDeleted successfully)	r   r	   r   rj   r   r   rF  rG  rH  )r   r  r   r   r   r   delete_course_discount?  s    
r_	  c                 C   sf  | j d}| j d}| j d}| j d}| j d}| j d}tjjddjd	d
gdddd}|r|j|d}|r|j|d}|r|j|d}|r|j|d}|r|j|d}|r|t|dt|dB t|dB t|dB }t	jt
d|dj|d d}t|d}	| j d}
|	|
}tj }tj }|||| d}t| d|S )Nr$  r  sales_executiver  r  r   r   r  r  r  order_action__inr   course__examscourse__exams__idZ
course__id)Zstudent__sales_executive_idr  r  r$  r%  r&  r  order_courses)queryset)Zorder_courses__inr   r   r  )r   r  r  r   zsales_reports.html)r   r   r7   r   r   r  r   r   r   rJ   r|   r   r   r   r  rA   r   r@   r   )r   r  r  sales_executive_idr  r  r   valid_ordersZstudents_listr!  r"  r   r  r  r  r   r   r   sales_reports?  s     		





rk	  c                 C   s  | j d}| j d}| j d}| j d}| j d}| j d}tjjddjd	d
gddd}|r~|j|d}|r|j|d}|r|j|d}|r|j|d}| }t	j
 }|r|j|d}|r|t|dt|dB t|dB t|dB }|s|s|s|r2|j|jdddd}|td|dd}|jt|jtdddd }tj
 }	|r|	j|d! }	t|d"}
| j d#}|
|}|tj
 |	d$}t| d%|S )&Nr$  r  r`	  r  r  r   r   r  r  r  ra	  rc	  rd	  rf	  r  r  )ri	  rj  rk  ru  rA  r  Tr   r  rg	  Zfiltered_orders)rh	  to_attrr   r  )Zis_convertedr
  	exams__idr   r  )r   r  r  zlead_conversion_report.html)r   r   r7   r   r   r  r   r   r   rJ   r   r   r   r|   r  r   r   r   r@   r   r  rA   r   )r   r  r  ri	  r  r  r   rj	  r   r  r!  r"  Zstudents_pager  r   r   r   lead_conversion_report?  s    

	


ro	  c                 C   s6   | j d}tjj|ddd }tt|ddS )NrX  rm	  r   r  Fr  )	r   r   r@   r   r   r  r   r	   r   )r   rX  r  r   r   r   get_courses_by_exam7@  s     rp	  c              	   C   s  t jjtdd}t jjtddd}tjjtdd}|d}tjjt|t|t|t	|
dd d t	|
dd d d	jd
dtd
dtddB }| jd}|r|jd|d}| jd}|r|t|dt|dB t|dB t|dB }| jd}|r"|j|d}| jd}	| jd}
|	rn|
rnt|	d}	t|
d}
|j|	|
gd}| d}t|d}| jd}||}ttj}|D ]}||jd|_q|tj tj tjd}t| d |S )!Nr  r*  rN	  )r   course__course_typer+  r  r   r_  )	has_orderhas_selfprephas_activityZlatest_activity_datelatest_activity_typeT)rt	  )rs	  F)rr	  r$  )Z!ordercourses__course__course_typeZordercourses__course__exams__idr   rj  rk  ru  rA  )Zstudentactivity__activity_typer  r  r  )Z!latest_activity_date__date__rangez-latest_activity_dater   r  r  )r   r  r  Zactivity_typeszpotential_sales_report.html)r8   r   r   r   rb   r   rJ   r  r   r   r  r   r   r   rw   r  r   r   r  rr  ACTIVITY_TYPESru	  Zlatest_activity_labelrA   r   r@   r   )r   Zorder_subqueryZselfprep_subqueryZactivity_subqueryZlatest_activityr   r$  r   r_  r  r  r!  r"  Zactivity_type_dictr   r  r   r   r   potential_sales_report?@  s    



 
rw	  )rx   r8  r9  r:  r;  r<  r=  r>  r?  r<  Zlecture_videoZrecorded_videoZconcept_videor5  r6  c                 C   s   d}| j tkr|d7 }n&| j tkr,|d7 }n| j tkr>|d7 }|rz,|\}}|rlt|t|d krl|d7 }W n tk
r   Y nX t| dd}|rt|d }||d 7 }|S )z
    Score rules:
    +10 = mock test attempted
    +8  = video watched
    +5  = good assessment score
    +5  = free resource downloaded
    +1  = per 10 minutes spent
    r   r   r.  r   r  time_spent_secondsr  )r_  MOCK_TEST_TYPESVIDEO_TYPESDOWNLOAD_TYPESr<	  rG  r  r  )rn  score_valuepointsobtained_marksr  rx	  Zminutes_spentr   r   r   calculate_activity_score@  s&    





r	  c           +      C   s  | j d}| j d}| j d}| j d}| j d}tjjdd}tjjdd	jd
dd}tjj|d	d
d}|r|t|dt|dB t|dB t|dB }|r|j|d}|r|j|d}|r|j|d}|r|j|d}t|jddjddd}	dd tjj|	dD }
t|jd
dd}i }tjj|d
d
d}|D ]}|j|krP|j||j< qPtdd }t }|D ]}|jj|j f}d}d}d }|
|jd}|jdkrtjj|jd  }|r|j}n,|jtkrtjj|jd  }tjj|j|jd!
d }|r|r:|j}t|d"d }t|d#d }|d k	rz|rz| d$| }||f}n|d k	rt |}n|jd%krd&}t!jj|jd'
d( }|rt |j"}nL|jd)krd*}t#jj|jd'
d( }|rt |j"}n|jt$krd+}|s q|r>|r>| d,| d-}n"|rX|%  d.| }n|% }|j&d/}t'||d0} | d1kr| d2| d3|  }!n0| d1k r| d2| d4|  }!n| d2| d5}!|jj|| d
< |jj( d6|jj) * || d7< |jj+|| d8< |jj,|| d9< |r2|| d -| || d: .|!|jd; || d<  | 7  < t|jd=d }"|"r|| d> s|"|t/d?d@ kr|| d<  dA7  < d|| d>< ||jj}#|#r|| dB s|#|t/dCd@ kr|| d<  dA8  < d|| dB< qg }$|0 D ]h\\}%}&}'t1|'d: dDd dE}(|$.|%|'d7 |'d8 |'d9 |&dF2|'d dG2dHdI |(D |'d< dJ qt1|$dKd ddL}$t3|$dM})| j dN}*|)4|*}$t5| dO|$|||||dPS )QNr   r_  r  r  rU  r	  r   r   r  r  Tr   r  r+  r$  r%  r  r&  r_  r  r  )rX  )Zexam_id__isnullrX  c                 S   s   i | ]}|j |jqS r   r/  r0  r   r   r   r\  A  s    z0not_enrolled_students_report.<locals>.<dictcomp>r  c                
   S   s   d dddt  g dddd	S )Nr   r   F)	r  r  r  r  rU  r2  score_pointsnew_lead_score_addedinactive_score_addedr3  r   r   r   r   r  /A  s    z.not_enrolled_students_report.<locals>.<lambda>r   r4  r%  r@  r  r  r  rA  rB  r*  rC  rD  rE  zVideo WatchedrF  r  rG  rH  )r|	  r   rI  z	
Score: +z
Score: z	
Score: 0r  r  r  r  r2  rJ  r	  r  r	  r   r  r   r	  r  c                 S   s   | d S rK  r   rL  r   r   r   r  A  r  rM  r'  r  c                 S   s   g | ]}|d  qS r  r   rN  r   r   r   r  A  s     z0not_enrolled_students_report.<locals>.<listcomp>)r  r  r  r  r   rU  rQ  r	  c                 S   s   | d S )Nr	  r   rL  r   r   r   r  A  r  r  r  r  zadmin/not_enrolled_report.html)r  r   r_  r  r  r  )6r   r   rA   r   r   r7   r   rb   r  r   r   r   r  r  r  rz   r   r   r   r   r   rX  r_  r"   r`  r  r   ry	  rG   r&   r  r  rH  rh   ra  ri   rz	  rb  r  r	  r  r  r  r  r  rc  r   rx   r5  r  r  r   r  r   )+r   r   r_  r  r  rU  r  enrolled_students
activitiesrk  rl  r4  Zlast_activity_mapZlast_activitiesrQ  rm  r   rn  r.  ro  ra  Zscore_value_for_pointsrM  r  r  r  r~	  r  rp  r  rq  rr  Zactivity_pointsrs  Zstudent_created_atZlast_activity_dater  r  r   rZ  rt  r!  r  r   r   r   not_enrolled_students_report@  sT      






"

r	  c                 C   s  | j d}| j d}| j d}| j d}tjjddjddd	}tjj|d
dd}|r|t	|dt	|dB t	|dB }|r|j|d}|r|j|d}|r|j|d}t
|jddd	}dd tjj|dD }tdd }	|D ]}
|
jj|
j f}d}d}||
jd}|
jdkrPtjj|
jd }|rB|j}n|
jdkrtjj|
jd }|r||j}tjj|
j|
jdd }|rBt|dr|j d|j }n
t|j}nv|
jdkrd }tjj|
jd!d" }|rBt|j}n:|
jd#krBd$}t jj|
jd!d" }|rBt|j}|sJq|rh|rh| d%| d&}n"|r|
!  d'| }n|
! }|
j"d(}| d)| }|
jj# d*|
jj$ |	| d+< |
jj%|	| d,< |
jj&|	| d-< |r|	| d. '| |	| d/ (||
jd0 qg }|	) D ]`\\}}}t*|d/ d1d d2}|(|d+ |d, |d- |d3+|d. d4+d5d6 |D d7 q"t,|d8}| j d9}|-|}t.| d:|||||d;S )<Nr   r_  r  r  r   r  r  Tr   r  r+  r$  r%  r  r	  r  r  rX  c                 S   s   i | ]}|j |jqS r   r/  r0  r   r   r   r\  B  s    z,enrolled_students_report.<locals>.<dictcomp>r  c                   S   s   dddt  g dS r1  r3  r   r   r   r   r  B  s    z*enrolled_students_report.<locals>.<lambda>r   r4  r%  r7  r@  r  r  rA  rB  r*  rC  rD  rE  rF  r  rG  rH  rI  r  r  r  r  rU  r2  rJ  c                 S   s   | d S rK  r   rL  r   r   r   r  yB  r  rM  r'  r  c                 S   s   g | ]}|d  qS r  r   rN  r   r   r   r  B  s     z,enrolled_students_report.<locals>.<listcomp>rP  r  r  zadmin/enrolled_report.htmlr  r   r_  r  r  )/r   r   r7   r   r   r   rb   r   r   r   r  rA   rz   r   r   r  r   rX  r_  r"   r`  r  r   rG   r  r&   r  r  r  rH  rh   ra  ri   rb  r  r  r  r  r  rc  r   r5  r  r  r   r  r   )r   r   r_  r  r  r	  r	  rk  rl  rm  rn  r.  ro  ra  rM  r  r  r  rp  r  rq  rr  rs  r  r  r   rZ  rt  r!  r  r   r   r   enrolled_students_reportA  s     


	

r	  c                 C   s  | j d}| j d}| j d}| j d}tjjdddjdd	d
}tjj|ddd}|r|t	|dt	|dB t	|dB }|r|j|d}|r|j|d}|r|j|d}t
|jdd	d
}dd tjj|dD }tdd }	|D ]}
|
jj|
j f}d}d}||
jd}|
jdkrRtjj|
jd }|r8|j}n|
jdkrtjj|
jd }|r~|j}tjj|
j|
jdd }|r8|j dt|dd d}nv|
jd krd!}tjj|
jd"d# }|r8t|j}n:|
jd$kr8d%}t jj|
jd"d# }|r8t|j}|rV|rV| d&| d'}n"|rp|
!  d(| }n|
! }|
j"d)}|
jj# d*|
jj$ |	| d+< |
jj%|	| d,< |
jj&|	| d-< |r|	| d. '| |	| d/ (| d0| |
jd1 qg }|	) D ]`\\}}}t*|d/ d2d d3}|(|d+ |d, |d- |d4+|d. d5+d6d7 |D d8 qt,|d9}| j d:}|-|}t.| d;|||||d<S )=Nr   r_  r  r  r   rN	  )r  rq	  r  Tr   r  r+  r$  r%  r  r	  r  r  rX  c                 S   s   i | ]}|j |jqS r   r/  r0  r   r   r   r\  B  s    z,selfprep_students_report.<locals>.<dictcomp>r  c                   S   s   dddt  g dS r1  r3  r   r   r   r   r  B  s    z*selfprep_students_report.<locals>.<lambda>r   r4  r%  r7  r@  r  r  rA  rB  r*  rC  rD  rE  rF  r  rG  rH  r  r  r  r  rU  r2  rI  rJ  c                 S   s   | d S rK  r   rL  r   r   r   r  C  r  rM  r'  r  c                 S   s   g | ]}|d  qS r  r   rN  r   r   r   r  C  s     z,selfprep_students_report.<locals>.<listcomp>rP  r  r  zadmin/selfprep_report.htmlr	  )/r   r   r7   r   r   r   rb   r   r   r   r  rA   rz   r   r   r  r   rX  r_  r"   r`  r  r   rG   r  r&   r  r  r  rh   rH  ra  ri   rb  r  r  r  r  r  rc  r   r5  r  r  r   r  r   )r   r   r_  r  r  r	  r	  rk  rl  rm  rn  r.  ro  ra  rM  r  r  r  rp  r  rq  rr  r  r  r   rZ  rt  r!  r  r   r   r   selfprep_students_reportB  s     
 

	

r	  c                 C   sD   t j d}t|d}| jd}||}d|i}t| d|S )Nr
  r   r  roleszadmin/user-roles.html)	rk   r   r   r   r   r   r   r  r   )r   Z
roles_listr!  r"  r	  r  r   r   r   user_role_management#C  s    

 r	  c           	      C   s6  t j }d }g }|r2tjj|d}tjj|d}| jdkr| jd}| jd}|r||_	||_
|  tjj|d  ntjj||d}|D ]~}tjj||| jd|j rdnd	| jd
|j rdnd	| jd|j rdnd	| jd|j rdnd	d qtdS |||d}t| d|S )Nr%  )roler   	role_namer   )r	  r   Zview_TFZadd_Zedit_Zdelete_)r	  r/  can_viewcan_addcan_edit
can_deleter	  )r  r	  permissionszadd-user-role.html)rl   r   r   rk   r   rm   r   r   r   r	  r   rd  rF  rb  r   r   r   )	r   r   r  r	  r	  r	  r   r/  r  r   r   r   add_user_role3C  sB    
	r	  c                 C   s`   | j dkr\| jd}| jd}| jd}tjj|d}||_||_|  tddiS d S )Nr   r   r	  r   r%  r>  )	r   r   r   rk   r   r	  r   rd  r	   )r   r   r	  r   r	  r   r   r   edit_user_roledC  s    
r	  c                 C   s8   | j dkr4| jd}tjj|d  tddiS d S Nr   r   r%  r   r>  )r   r   r   rk   r   r   rF  r	   rp  r   r   r   delete_user_rolevC  s    
r	  c                 C   sJ   t jd d}t|d}| jd}||}d|i}t	| d|S )Nuserprofiler
  r   r  userszadmin/user-profile-list.html)
Userr   r   r   r   r   r   r   r  r   )r   Z	user_listr!  r"  r	  r  r   r   r   user_profile_listC  s    

 r	  c                 C   s@  t jjdd}d }d }|r8tt|d}tjj|d }| jdkr(| j	d}| j	d}| j	d}| j	d	}| j	d
}	| j	d}
| j	d}| j	d}|r||_
||_||_||_|r|| |  ntjj|||||d}tjj|d\}}|	|_|
|_||_||_|  tdS |||d}t| d|S )Nr	  r   r%  )r   r   r  r  r  r   r  r  r	  r   )r   r  r   r  r  r	  )r	  user_objprofilezadmin/add-user.html)rk   r   r   r   r	  rn   r  r   r   r   r  r  r  r   set_passwordrd  create_userr@  contact_numberr  role_idr   r   r   )r   r   r	  r   r	  r  r  r  r   r  r  r	  r   rp  r  r   r   r   add_userC  sT    

r	  c                 C   s8   | j dkr4| jd}tjj|d  tddiS d S r	  )r   r   r   r	  r   r   rF  r	   )r   user_idr   r   r   delete_userC  s    
 r	  )r   r   )require_http_methodsc           	      C   s   t j d}| jd}| jd}|r8|j|d}|rH|j|d}| jdd}t|d}||}d	}|r|d
| 7 }|r|d| 7 }||pd	|pd	||d}t	| d|S )Nr+  r  r   r  r   r  r   r   r   r  rv  )	all_yearsr  r   r   r  zadmin/academic_year_master.html)
ro   r   r   r   r   r   r   r   r  r   )	r   yearsr  r   r  r!  r	  Zfilter_queryr  r   r   r   academic_year_masterC  s,    

r	  r   c              
   C   s   z| j dpd }| j dp$d }|s>tdddW S tjj|d r`tdd	dW S |dkr~tjjdd
jdd
 tjj	||d tdddW S  t
k
r } ztdt|d W Y S d }~X Y nX d S )Nr  r   r   r	  r   Academic year name is required.r?  r  Academic year already exists.r   r  )r  r   r>  z!Academic year added successfully.)r   r   r  r	   ro   r   r   r;  r  rb  rG  rH  )r   r  r   r   r   r   r   add_academic_yearC  s8    


r	  c              
   C   s0  z| j d}| j dpd }| j dp0d }|sJtdddW S |s^tdd	dW S tt|d
}tjj|d
j|d	 rtdddW S t
 @ |dkrtjj|d
jddjdd ||_||_|  W 5 Q R X tdddW S  tk
r* } ztdt|d W Y S d }~X Y nX d S )Nr   r  r   r   r	  r   Academic year id is required.r?  r	  r%  r  r	  r   r  r>  z#Academic year updated successfully.)r   r   r  r	   r   ro   r   r  r   r;  r   ru  r  r  r   rd  rG  rH  )r   year_idr  r   r  r   r   r   r   edit_academic_yearD  sF    




r	  c              
   C   s   zD| j d}|s"tdddW S tt|d}|  tdddW S  tk
r| } ztdt|d W Y S d }~X Y nX d S )Nr   r   r	  r?  r%  r>  z#Academic year deleted successfully.)r   r   r	   r   ro   rF  rG  rH  )r   r	  r  r   r   r   r   delete_academic_yearND  s$    

r	  c           
      C   s   t jjddd}tjjddd}tj }g }|D ]^}|g d}|D ]@}|j||d }|d ||r|j	r|j	
dnd	d
 qL|| q:||d}	t| d|	S )NFr  rK  r  )r  r  academic_yearr$  r  r  r   )rU  expiry)rZ  r  zadmin/exam_validities.html)rA   r   r   r   ro   rp   r   r  r   expiry_dater  r   )
r   r  r	  ZmappingsrZ  r  r  rU  r  r  r   r   r   exam_validitiesgD  s,    


r	  c           
   
   C   s   zt jjdd}tjjdd}|D ]d}|D ]Z}d|j d|j }| j|}tjj||d\}}|rv||_	|
  q*d |_	|
  q*q"tdddW S  tk
r }	 ztd	t|	d W Y S d }	~	X Y nX d S )
NFr	  Zexpiry_r-  r	  r>  z%Exam validities updated successfully.r?  r   )ro   r   r   rA   r   r   r   rp   r@  r	  rd  r	   rG  rH  )
r   r	  r  r  rU  r<  r	  r  rp  r   r   r   r   save_exam_validitiesD  s2    


r	  c              	   C   sN  | j dkrtd|S | j dkr4tdddddS tt|d	}ttjj	|d

dd}|sptdddddS dd }i }tt}g }t|ddD ]t\}}	||	j}
|	j|
r|
n
d|	jf}|||}||  d7  < d|j|	j|}|	j|kr||	_||	 q|r tj|dg tddt|t|tdd | D dS )z
    Auto-tag questions that share a paragraph inside the same mock and section.

    The tag uses the first question number in the group, for example:
    M-42-S-3-Q-26. Questions 26-30 with the same paragraph receive that tag.
    r   z /admin/question_bank?test_id={0}r   r   z.Only POST requests can generate question tags.r?  rm  r   r%  rP  r=  r   z This mock test has no questions.rA  c                 S   s   t | pd } | r |  dkr$dS tjd| tjd}tjdd| tjd} tjdd| tjd} tdd| } t| } t	
d	|  } d|  } tj| |d
dddS )Nr   )nullnonez <img[^>]+src=["\']([^"\']+)["\']r  z<(?:br|hr)\s*/?>r  z"</(?:p|div|li|tr|td|th|h[1-6])\s*>z<[^>]+>ru  )r  imagesTF)	sort_keysensure_ascii)rH  r  r  r  r  
IGNORECASEr  r  r  rv  rw  rx  r  r  r  r  )r,  Zimage_sourcesr   r   r   normalize_paragraphD  s&    
z6update_question_tags_view.<locals>.normalize_paragraphr   r]  zquestion-{0}zM-{0}-S-{1}-Q-{2}rC  r>  z%Question tags generated successfully.c                 s   s   | ]}|d krd V  qdS rO  r   )r1  r   r   r   r   r3   E  s     z,update_question_tags_view.<locals>.<genexpr>)r   r   r  r  Zshared_paragraph_groups)r   r   rf  r	   r   rG   r   rE   r   r   r   rz   r  re  r  r=  r   
setdefaultrC  r   r  r   r6  r  )r   rQ  rb  r?  r	  Zfirst_question_by_groupZgroup_countsZupdated_objectsZquestion_numberrG  
normalizedZ	group_keyZfirst_question_numberZnew_tagr   r   r   update_question_tags_viewD  sj    


 
r	  c                 C   sZ   t | jdd}|D ]2}|d}|dp2d}tjj|dj|d qtdd	d
S )N
prioritiesr5  r   r  r   r%  )r  TzPriority updated successfullyr8  )	r  r:  r   r   rg   r   r   r  r	   )r   r	  r  r  r  r   r   r   update_slot_priorityE  s    
r	  c                 C   s   | j dkr| jd}t| jd}t| jd}|D ]6}tjj|d |dj|dpbd |dpnd d	 q>|D ]6}tjj|d |d
j|dpd |dpd d qzt	ddiS t	ddiS )Nr   r\  re  r+  r   )r=  r  strongweak)r,  r-  )rA  r  )r/  r0  r   r   r   )
r   r   r   r  r:  rX   r   r   r  r	   )r   r\  re  r+  r  r   r   r   update_strength_bulkE  s8    

  r	  (  rw   r   django.core.paginatorr   django.shortcutsr   r   r   r   django.httpr	   django.contrib.authr
   django.db.modelsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r  r1  r4  django.utilsr   r  r  django.utils.textr   django.core.files.baser   django.db.models.functionsr   django.contribr   r    Zlearn.modelsr!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   django.contrib.auth.decoratorsrt   django.contrib.auth.formsru   Zlearn.formsrv   rx   r  ry   r
  collectionsrz   r  Zdocxr{   r|   r}   r~   r  ior   PILr   r3  r   r   r   r   Zceleryr   Zlatex2mathml.converterr   r   r   r   	django.dbr   r  typingr   r  Zdocx.sharedr   Zdjango.views.decorators.httpr   django.views.decorators.csrfr   r   r   django.confr   admin_app.middlewarer   Zdocx.enum.textr   r   r	  ZADMIN_LOGIN_URLr2  r  dirname__file__ZFIREBASE_KEY_PATHZ_appsCertificateZcredZinitialize_apprG  r   r   rH  r   r   r   r   r   r  r$  r:  rJ  ri  rn  rq  r~  r  r  r  r'  r  r  r  r  r  r  r  r  r  r(  r  r  r  r  r  r  r  r  r  r)  r*  r?  rH  rI  rL  rS  rV  rW  rY  r]  rk  rl  rm  rp  ru  rx  rz  r|  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r3  r>  r?  rG  r[  rh  rj  rm  rn  ro  rp  r  r  r  r  r  r  r  	maketransr  r  r  r  r  r  r  r  Zdocx.enum.sectionr  r7  rD  django.core.files.storagerE  lxmlrF  rP  rK  rL  rM  rQ  rd  rb  rc  re  r`  rg  ro  ry  r|  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rT  r  r  r  r  r  r  r,  r-  r2  r4  r7  r>  r?  rO  ri  rl  rv  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r]  r  r  r  r  r  r  r  r  rb  r  r  r  r  r  r  r  r  r  r  r	  r  r  r  r  r  r  r  r  r$  r&  r'  r5  r6  r=  rA  rC  rE  rF  r  rM  rR  rW  rX  r[  r\  r]  r_  r`  ra  rb  rf  ri  rq  rs  rv  django.utils.dateparsert  r  ry  r|  r~  r  r  r  r  r  r  r  r  r  r  r  r  rr  r  r  r  r  r  r  r  r  r  r  r  r   calendarr  r  r  r  r  r  r(  rP  r  rt  rs  r  r  __annotations__r  r  r  r  r
  r  r  r  r%  r&  r*  r,  r.  r1  r5  r;  r>  r@  rC  rJ  rK  rM  rN  rT  r[  r^  r3  rb  rd  rm  ro  rw  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  re  r  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r!	  r"	  r%	  r/	  r8	  ru  rB	  rD	  rM	  rR	  rZ	  r^	  r_	  rk	  ro	  rp	  rw	  ry	  rz	  r{	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r   r   r   r   <module>   s   4 M
$ 	
H
5
,
O
V

)
1
2

!




J
%
A



!
 
'

&
&
#


G
 
 5
$
(&


!
U
b


!
-
8
	
"
4
8


#3$'$ 16~#F	"%3&;? 	
Q6^E 
3
M& !" =
	[

9 \ |	a\\] ` F BEu" K0Q')
31 	 {	6J	   l 4.)t3mN 3 !"
G
q{-0&#$#+
!$w#")!A?'
 c< _8#
  7?-]V. & "$) .(5$&$"""(
,.,$$"$$2
 &;("'(.3&2*60"
o
V$&&4R(	
$.&(N$&
/
-
$$7$D&,
2&    o9N4TC(((((((( { 	B4MTY0 ~ ! 1<	 %.#"W