o
    &hq                    @   s,  d dl Z d dlZd dlZd dlmZmZ d dlmZ d dlZd dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZmZmZmZ d dlmZmZm	Z	mZmZmZ d dlmZ d d	lmZmZ d d
lmZ d dlmZ d dlm Z m!Z! d dl"m#Z#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. d dl/m0Z0m1Z1 d dl2m3Z3m4Z4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z= d dl>m?Z@ d dlAmBZBmCZC d dlDmEZEmFZFmGZG d dlHmIZImJZJmKZK ddlLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^ ddl_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZkmlZlmmZmmnZnmoZompZpmqZq ddlrmsZsmtZtmuZu dd lvmwZw ewd!d"Zxdd#lymzZzm{Z{ dd$l|m}Z}m~Z~ dd%lrmZ dd&lmZmZmZ ee{d'd(d) Zee{d*d+d, Zee{d-d.d/ Zee{d0d1d2 Zee{d3dd4d5Zee{d6d7d8 Zee{d9d:d; Zee{d<d=d> Zee{d?d@dA Zee{dBdCdD Zee{dEdFdG Zee{dHdIdJ Zee{dKdLdM Zee{dNdOdP Zee{dQdRdS Zee{dTdUdV Zee{dWe{dXddYdZZee{d[d\d] Zee{d^d_d` Zee{daddbdcZee{dddedf Zd dgl2m3Z3 d dhlmZm{Z{ d dilm*Z* d dl Z d djlmZ ddklLmRZR ee{dldmdn Zd dl2m3Z3m4Z4m5Z5 d dlmZ d d	lmZmZ d dol"m#Z# d dplmZ ddqlLmYZY ddrl_mqZq d dl2m3Z3m4Z4m5Z5 d dslmZ d dol"m#Z# d dtl/m0Z0 d dulmZ d dl8m9Z9 ddqlLmYZY ddrl_mqZq edvdw Zee{dxddydzZd dl8m9Z9 d dtl/m0Z0 d dslmZ ddqlLmYZY d dl8m9Z9 d dtl/m0Z0 d dslmZ ddqlLmYZY ee{dxd{d| Zee{d}d~d Zee{d3dd Zee{ddd ZeBdd ZeBdd ZeEddgdd Zedd ZeeFdd Zedd Zee{ddd Zd dhlmZm{Z{ d dlDmEZE d dlm Z  d dl6m7Z7 d dl:m;Z; d dlmZ d dlZee{deEddgdd ZdddZee{ddd Zee{ddd Zee{ddd Zee{ddd Zee{ddd Zee{ddd ZeeFe{ddd ZeeFe{ddd ZeeFe{ddd ZeFeBe{ddd Zd dlmZ d dslmZ d dlmZmZ d dl2m3Z3m4Z4 d dtl/m0Z0 d dlAmBZB ddlymzZz d dl Z e Zeezdd Zeezdd ZeBeezdd Zeezdd ZeBeezddĄ ZeBeezddƄ ZeezddȄ Zd dgl2m3Z3 d dlmZm*Z*mZ d dl8m9Z9 d dlmZmZ d dol"m#Z# ddlLmZmMZM d dslmZ eezdd̄ Zdd΄ ZddЄ Zdd҄ ZddԄ Zddք Zd dlmZmZmZm,Z,mZ ddل Zd dlmZmZ d dlmZ d dl<m=Z= dd܄ Zddބ Zdd Zdd Zd dlm Z  d dl6m7Z7 d dlmZ ddlLmZZZ dd Zd dl2m3Z3m4Z4 d dlmZ d dlmZ dd Zdd Zdd ZeEdgeCdd Zdd ZeeGdd ZeeGdd Zd dl2m5Z5m3Z3 d dlmZmZmZ d dlZddlLmMZM dd Zdd ZdS )    N)datetime	timedelta)defaultdict)FFunc)settings)messages)authenticateloginlogoutupdate_session_auth_hash)CountQr   r   ExpressionWrapperIntegerField)login_requireduser_passes_test)PasswordChangeForm)ValidationError)EmailMultiAlternatives	send_mail)	Paginator	EmptyPagePageNotAnInteger)validate_email)transaction)r   r   SumPrefetchValue)Coalesce)JsonResponseHttp404)renderredirectget_object_or_404)render_to_string)timezone)
strip_tags)slugify)gettext)csrf_exemptcsrf_protect)require_http_methodsrequire_POSTrequire_GET)SearchVectorSearchQuery
SearchRank   )BlogBlogCategoryAuthorTopicsContactPollOptionVote
SubscriberSiteAnalyticsAuthorAnalyticsBlogAnalyticsTask
TeamMemberNewsletterTaskBlogViewIssue	IssueItem)BlogCategoryFormBlogForm
AuthorForm
TopicsFormContactFormSubscriberFormTeamMemberFormPollFormOptionFormSetAuthorLookupFormAuthorSubmitFormBlogSubmitForm	IssueFormIssueItemFormIssueItemUpdateFormAddBlogsToIssueFormIssueStatusUpdateFormTaskForm)extract_superscriptshtml_to_plain_textprocess_footnotes)StanzaSEOMetadataExtractorT)	use_cache)superuser_requiredpermission_required)GENERAL_META_KEYWORDSGENERAL_META_DESCRIPTION)get_meta_contents)track_blog_viewtrack_page_viewupdate_analyticszmimansha_main.view_blogcategoryc                 C   s   dt j i}t| d|S )Ncontentsz3mimansha_main/blog_category/blog_category_list.html)r4   objectsallr"   )requestcontext ri   ;/var/www/html/mimamsha/mimansha/apps/mimansha_main/views.pyblog_category_listL   s   rk   zmimansha_main.add_blogcategoryc                 C   sH   | j dkrt| j| j}| r|  tdS nt }t| dd|iS )NPOST mimansha_main:blog_category_list5mimansha_main/blog_category/blog_category_create.htmlform)methodrE   rl   FILESis_validsaver#   r"   rg   ro   ri   ri   rj   blog_category_createS   s   
ru   z!mimansha_main.change_blogcategoryc                 C   \   t t|d}| jdkr!t| j| j|d}| r |  tdS nt|d}t	| dd|iS )Npkrl   instancerm   rn   ro   )
r$   r4   rp   rE   rl   rq   rr   rs   r#   r"   rg   rx   rh   ro   ri   ri   rj   blog_category_update_      

r|   z!mimansha_main.delete_blogcategoryc                 C   *   t t|d}| jdkr|  tdS d S )Nrw   rl   rm   )r$   r4   rp   deleter#   rg   rx   rh   ri   ri   rj   blog_category_deletem   
   
r   zmimansha_main.view_blogc                 C   s   t jjt jjt jjt jjd}ddddd}||t jj}| jdd}t jj	|dj
td	d
dd}|rL|	t|dt|dB t|dB  }t|d}| jd}||}	|	||dt jj	t jjd t jd  |d}
t| d|
S )N)	publisheddraftszuser-submittedarchivedzPublished BlogszDraft BlogszUser Submitted BlogszArchived Blogssearch statusviewstotal_views-total_views-published_timetitle__icontains)content__icontains)authors__name__icontains   pagezBlog Managementauthors)rd   
page_titlepublished_countauthor_countsearch_query!mimansha_main/blog/blog_list.html)r3   Status	PUBLISHEDDRAFTUSER_SUBMITTEDARCHIVEDgetGETre   filterannotater   order_byr   distinctr   get_pagecountvaluesr"   )rg   r   status_mappingpage_titlesstatus_valuer   blogs	paginatorpage_numberpage_objrh   ri   ri   rj   	blog_listx   sJ   	


r   zmimansha_main.add_blogc                 C   s   | j dkrCt| j| j}| rBt|jd }|jdd}|jd |_t	
|d |_|ddd	dd d
 |_|  tdS nt }t| dd|iS )Nrl   contentFcommittitlemeta_keywords
 i&  mimansha_main:blog_list#mimansha_main/blog/blog_create.htmlro   )rp   rF   rl   rq   rr   rX   cleaned_datars   
meta_title	extractorget_metadatar   replacemeta_descriptionr#   r"   )rg   ro   safe_contentblogri   ri   rj   blog_create   s   
r   zmimansha_main.change_blogc                 C   s   t t|d}| jdkrQt| j| j|d}| rPt|jd }|j	dd}|jd |_
|js6t|d |_|jsH|d	d
dd
d d |_|	  tdS nt|d}t| dd|iS )Nrw   rl   ry   r   Fr   r   r   r   r   r   i  r   r   ro   )r$   r3   rp   rF   rl   rq   rr   rX   r   rs   r   r   r   r   r   r   r#   r"   )rg   rx   r   ro   r   ri   ri   rj   blog_update   s    

r   zmimansha_main.delete_blogc                 C   r~   )Nrw   rl   zmimansha_main:blog_published)r$   r3   rp   r   r#   r   ri   ri   rj   blog_delete   r   r   zmimansha_main.view_authorc                 C   s   | j dd}|rtjj|dd}ntj d}| j dd}t|d}z||}W n t	y=   |d}Y n t
yK   ||j}Y nw ||d}t| d	|S )
Nr   r   name__icontainsnamer   r2   
   )rd   r   z%mimansha_main/author/author_list.html)r   r   r5   re   r   r   rf   r   r   r   r   	num_pagesr"   )rg   r   r   r   r   rd   rh   ri   ri   rj   author_list   s"   
r   zmimansha_main.add_authorc                 C   sx   | j dkr1t| j| j}| r0|  | jddkr&t| d t	dS t| d t	dS nt }t
| dd	|iS )
Nrl   submitsave_and_addz5Author successfully created. You can now add another.mimansha_main:author_createzAuthor successfully created!mimansha_main:author_list'mimansha_main/author/author_create.htmlro   )rp   rG   rl   rq   rr   rs   r   r   successr#   r"   rt   ri   ri   rj   author_create  s   
r   zmimansha_main.change_authorc                 C   s   t t|d}| jdkrCt| j| j|d}| rB|  | jddkr3t	
| d|j d tdS t	
| d|j d	 td
S nt|d}t| d||dS )Nrw   rl   ry   r   r   zAuthor "z0" successfully updated. You can now add another.r   z" successfully updated!r   r   )ro   author)r$   r5   rp   rG   rl   rq   rr   rs   r   r   r   r   r#   r"   )rg   rx   r   ro   ri   ri   rj   author_update  s    

r   zmimansha_main.delete_authorc                 C   r~   )Nrw   rl   r   )r$   r5   rp   r   r#   r   ri   ri   rj   author_delete1  r   r   zmimansha_main.view_topicsc           
      C   s   | j dd}tjj|dd}t|d}| j d}||}dd |D }d	d
lm	} | }|jj|d
 }	t| d|||	dS )Nr   r   r   r      r   c                 S   s   g | ]
}|j d kr|j qS )r   )user.0topicri   ri   rj   
<listcomp>K  s    ztopics_list.<locals>.<listcomp>r   get_user_model)id__inz%mimansha_main/topics/topics_list.html)topicsr   
users_dict)r   r   r6   re   r   r   r   r   django.contrib.authr   in_bulkr"   )
rg   r   r   r   r   topics_pageuser_idsr   Userusersri   ri   rj   topics_list=  s   

r   zmimansha_main.add_topicsc                 C   sj   | j dkr*t| j| j}| r)|  d| jv r%t }t| d|ddS tdS nt }t| dd|iS )Nrl   r   'mimansha_main/topics/topics_create.htmlz2Topic saved successfully. You can add another one.)ro   success_messagemimansha_main:topics_listro   )rp   rH   rl   rq   rr   rs   r"   r#   rt   ri   ri   rj   topics_createX  s   

r   zmimansha_main.change_topicsc                 C   rv   )Nrw   rl   ry   r   r   ro   )
r$   r6   rp   rH   rl   rq   rr   rs   r#   r"   r{   ri   ri   rj   topics_updatep  r}   r   zmimansha_main.delete_topicsc                 C   r~   )Nrw   rl   r   )r$   r6   rp   r   r#   r   ri   ri   rj   topics_delete}  r   r   zmimansha_main.add_teammemberzmimansha_main.change_teammemberc                 C   s   |rt t|dnd }| jdkr9t| j| j|d}| r*|  t	| d t
dS t| d t| d||dS t|d}t| d||dS )	Nidrl   ry   z@Team member saved successfully. Redirecting to team list page...mimansha_main:team_listz=There were errors in the form. Please fix them and try again.z)mimansha_main/teammember/team_create.html)ro   team_member_id)r$   r@   rp   rK   rl   rq   rr   rs   r   r   r#   errorr"   )rg   r   team_memberro   ri   ri   rj   create_update_team_member  s"   

r   zmimansha_main.view_teammemberc                 C   s\   | j dd}|rtjj|dntj }t|d}| j d}||}t| d||dS )Nr   r   r      r   z'mimansha_main/teammember/team_list.html)team_membersr   )	r   r   r@   re   r   rf   r   r   r"   )rg   r   r   r   r   r   ri   ri   rj   	team_list  s   

r   zmimansha_main.delete_teammemberc                 C   sd   t t|d}| jdkr(|  | jddkrtdddS t| d t	dS t
| d	 t	dS )
Nrw   rl   x-requested-withXMLHttpRequestTz Team member deleted successfullyr   messager   Invalid request method)r$   r@   rp   r   headersr   r    r   r   r#   r   )rg   rx   r   ri   ri   rj   team_delete  s   
r   zmimansha_main.add_pollc                    s   |rt t|dnd }|rtjj|dng } jdkr`t j|d}| rY|	 }|r4tjj|d
   fddtt jd D }|D ]}|rRtjj||d qFtd	d
iS tdddS t|d}dd |D }t d|||dS )Nr   pollrl   ry   c                    s   g | ]} j d | qS )option_text_)rl   r   )r   irg   ri   rj   r         zcreate_poll.<locals>.<listcomp>   )r   option_textr   TFzInvalid form datar   r   c                 S   s   g | ]}d |j iqS r  r  r   optionri   ri   rj   r     s    z$mimansha_main/polls/create_poll.html)	poll_forminitial_optionspoll_id)r$   r8   r9   re   r   rp   rL   rl   rr   rs   r   rangelencreater    r"   )rg   r  r   optionsr  options_datar  r  ri   r  rj   create_poll  s,   
 
r  zmimansha_main.delete_pollc                 C   r~   )Nrw   rl   zmimansha_main:all_polls)r$   r8   rp   r   r#   r   ri   ri   rj   poll_delete  r   r  )r"   )r   r]   )r   )	mark_safe)r8   zmimansha_main.view_pollc              
   C   sL  | j dd }tj }|r|j|d}t| 	d}g }d}|D ]`}t|j
 }tdd |D }||7 }g }	|D ]}
|dkrL|
j| d nd}|	|
j|
j|
jt|d	d
 q?g }|D ]}
|t|
jt|
jd qct|}||||	t|d q%t|}|}|dkr|| }nd}||||||d}t| d|S )Nr   r   )question__icontainsr  r   c                 s       | ]}|j V  qd S Nvotesr	  ri   ri   rj   	<genexpr>      zall_polls.<locals>.<genexpr>d   r2   )r   r  r  
percentage)textr  )r   total_votesr  options_json)	poll_datar   total_polls_countgrand_total_votesactive_polls_countaverage_votes_per_pollz%mimansha_main/polls/poll_results.html)r   r   stripr8   re   rf   r   listselect_relatedprefetch_relatedr  sumr  appendr   r  roundstrintjsondumpsr  r  r"   )rg   r   polls_queryset
polls_listpoll_data_for_templategrand_total_votes_accumulatorpoll_instanceoptions_for_this_pollcurrent_poll_total_votesoptions_with_percentager
  r  options_for_js_chart_dataoptions_json_stringr#  r%  r&  rh   ri   ri   rj   	all_polls  s\   

	



	r<  )r   )now)r?   )rV   )r   )r    )r   c           
      C   s  | j dd}| j dd}| jjrtj }ntjj| jd}|r(|j|d}|r0|j|d}|d}t	|d}| j d	}|
|}i }| jjr~tjdjtdd
}tdd |D dtdd |D dtdd |D dtdd |D dd}|tjtj|||d}	t| d|	S )Nr   r   priority)assigned_tor   )r>  z	-due_dater   r   r   c                 s   $    | ]}|d  dkr|d V  qdS )r   not_startedr   Nri   r   itemri   ri   rj   r  p     " ztask_list.<locals>.<genexpr>r   c                 s   rA  )r   in_progressr   Nri   rC  ri   ri   rj   r  q  rE  c                 s   rA  )r   	completedr   Nri   rC  ri   ri   rj   r  r  rE  c                 s   rA  )r   	cancelledr   Nri   rC  ri   ri   rj   r  s  rE  )rB  rF  rG  rH  )r   status_choicespriority_choicesstatus_filterpriority_filterstatus_countsz"mimansha_main/tasks/task_list.html)r   r   r   is_superuserr?   re   rf   r   r   r   r   r   r   r   nextSTATUS_CHOICESPRIORITY_CHOICESr"   )
rg   rK  rL  tasksr   r   r   rM  status_counts_datarh   ri   ri   rj   	task_listP  s:   


	rT  zmimansha_main.change_taskc                 C   s   | j jstdS d }|rtt|d}| jdkr5t| j|d}| r4|j	dd}| j |_
|	  tdS nt|d}||r?dndd	}t| d
|S )Nzmimansha_main:task_listrw   rl   ry   Fr   zUpdate TaskzCreate Task)ro   r   z"mimansha_main/tasks/task_form.html)r   rN  r#   r$   r?   rp   rV   rl   rr   rs   
updated_byr"   )rg   rx   taskro   rh   ri   ri   rj   create_update_task  s$   


rW  c              
   C   s`  | j dkr| jjs| jd}| jd}| jdd }|r"|s)tdddS zQtjj|d	}|j	d
v r>tdddW S t
 d}d| d| }|jrZ|j d| |_n||_|rg||j	krg||_	|  td|j	t|jddW S  tjy   tddd Y S  ty } ztddt| dW  Y d }~S d }~ww tdddS )Nrl   task_idstatus_updateresponse_textr   Fz&Task ID and response text are requiredr  r   )rG  rH  z*Cannot update completed or cancelled tasksz%Y-%m-%d %H:%M[z] z|||T)r   
new_statusresponse_countTask not foundzServer error: z%Invalid request method or permissions)rp   r   rN  rl   r   r'  r    r?   re   r   r&   r=  strftimeresponse_from_teamrs   r  splitDoesNotExist	Exceptionr.  )rg   rX  rY  rZ  rV  	timestamp	new_entryeri   ri   rj   update_task_status  sZ   


rg  zmimansha_main.delete_taskc                 C   sB   t t|d}| jdkr|  t| d tdS t| dd|iS )z$
    Delete a task (admin only)
    rw   rl   zTask successfully deleted!rT  ztasks/task_confirm_delete.htmlrV  )r$   r?   rp   r   r   r   r#   r"   )rg   rx   rV  ri   ri   rj   delete_task  s   
rh  c                 C   s    t jjddd}t| dd|iS )NTr2   feature_thisr   r   rd   )r3   re   r   r"   )rg   rd   ri   ri   rj   featured_page  s   rk  zusers.can_view_admin_dashboardc           )   
   C   s`  t |  t  }|tdd }|tdd }tj }tjjtj	j
d }tjjtj	jd }tjjdd }tjdjtddd	}tjd
d d }	tjjtddd pad}
tjj|djtddd prd}tjj|djtddd pd}tjj|djtddd pd}tjjtddd pd}tjj|djtddd pd}tjj|djtddd pd}tjj|djtddd pd}tjjtdddd d }tjjttdt|dddddd d }tj }tjjtjjd }tjjtddjdd }g }tjdd d }|D ],}|dd |jtj	j
kr:d!nd" d#|j d$|jtj	j
krLd!nd" |jd% q*tjd
d d }|D ]}|d&d'|j d(|jd% qc|d)d*d+t d% tjj|d,d-gd. }|dkr|d/d0d1| d2t d% |j d3d4 dd5 tjjtddd6d d }t!jjtddd6}zt"jj|d# }W n t"j$y   d }Y nw t"jj|dd7} t"jj|dd7}!tjjd,dd8d d }"tjj|d,d-gd.d8d d }#tjd
d d }$tj }%t%jd
d d }&t&jjtd9td:d;d
d d }'i d<|d=|d>|d?|d@|dA|	dB|
dC|dD|dE|dF|dG|dH|dI|dJ|dK|dL|i dM|dN|dO|dP|dQ|dR| dS|!dT|"dU|#dV|$dW|%dX|&dY|'dZ|d[|d\|d]|}(t'| d^|(S )_N   daysr   r   Trj  r   r@  z-count-created_at   r   totalrs  r   )date)	date__gteunique_visitorsr   r   analytics__views)analytics__date__gter   )recent_viewsz-recent_viewsr   )
blog_count)blog_count__gtz-ldm   r   zBlog r   updatedzBlog 'z' was )typer   descriptionrd  
subscriberzNew subscriberz subscribed to newslettersystemzSystem updatez&Database backup completed successfullypendingrF  )due_date__lt
status__inalertzOverdue tasksz	You have z overdue tasksc                 S      | d S )Nrd  ri   xri   ri   rj   <lambda>c      z!admin_dashboard.<locals>.<lambda>keyreversez-blog_countrt  due_dater  options__votes)option_countr   total_blogspublished_blogsdraft_blogsfeatured_blogsblog_status_countsrecent_blogsr   today_viewsweekly_viewsmonthly_viewstotal_unique_visitorstoday_unique_visitorsweekly_unique_visitorsmonthly_unique_visitorspopular_blogstrending_blogstotal_authorsverified_authorsactive_authorstop_authorscategories_with_countssite_analyticssite_analytics_weeklysite_analytics_monthlypending_tasksoverdue_tasksrecent_subscriberstotal_subscribersrecent_contactsactive_pollsrecent_activitiestoday	last_week
last_monthzpages/admin_dashboard.html)(rc   r&   r=  rt  r   r3   re   r   r   r   r   r   r   r   r   r   r>   	aggregater   r   r   r5   AuthorStatusVERIFIEDr,  r   r   ldmr;   email
created_atr?   sortr4   r<   firstrb  r7   r8   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  recent_blog_activitiesr   new_subscriberssuboverdue_tasks_countr  r  r  r  r  r  r  r  r  r  r  rh   ri   ri   rj   admin_dashboard  sl  
""""""
$




 !$%()*-03458r  c                 C   s   | j dkr=zt| j}W n tjy   tddidd Y S w t|}| r4|  tddiddS td|j	iddS tdd	id
dS )Nrl   r   zInvalid JSON  r   r   zThank you for subscribing!   Invalid request method.i  )
rp   r0  loadsbodyJSONDecodeErrorr    rJ   rr   rs   errors)rg   dataro   ri   ri   rj   subscribe_ajax  s   
r  c                    s   | j dkrq| jd}| jd}zNtjj|d}tjj||d r+t	dddW S | j
d	7  _
|  tjj||d tjj|d
}tdd |D   fdd|D }t	d |dW S  tjyp   t	ddd Y S w t	dddS )Nrl   	option_idREMOTE_ADDRr   )r  
ip_addressr   z$You have already voted on this poll.r   r   r2   )r  c                 s   r  r  r  r	  ri   ri   rj   r    r  zvote.<locals>.<genexpr>c                    s2   g | ]}|j |j d kr|j  d nd dqS )r   r  )r   r  r  )r   r  r  r	  r   ri   rj   r     s    
zvote.<locals>.<listcomp>r   )r   r   r"  zInvalid option selected.r  )rp   rl   r   METAr9   re   r:   r   existsr    r  rs   r  r+  rb  )rg   r  r  r  r
  r  r"  ri   r  rj   vote  sB   



r  r   rl   c                 C   sB  | j ddkr0| jdkr0| jdd}zt| tddiW S  ty/   tdd	d
 Y S w | jdkr| jd}| jd}| jddk}t| ||d}|d urxt| | |rb| j	
d n| j	
d | jd}|rtt|S tdS t| d d| jddddid}t| d|S d| jddd}t| d|S )NzX-Requested-Withr   rl   r  r   validTFz"Please enter a valid email address)r  r   usernamepasswordremember_meon)r  r  i u r   rO  zmimansha_main:admin_dashboardz,Invalid email or password. Please try again.zLogin | MIMANSHAr  )r   rO  ro   zaccount/login.html)r   rO  )r   r   rp   rl   r   r    r   r	   r
   session
set_expiryr#   r   r   r"   r   )rg   r  r  r  r  r   next_urlrh   ri   ri   rj   
login_view  s@   

r  c                 C   s   t |  t| d tdS )Nz&You have been successfully logged out.zmimansha_main:login)r   r   r   r#   r  ri   ri   rj   logout_view4  s   r  c                 C   s   t | j| jd}| r| }t| | tdddS g }|j D ]\}}|D ]}|	| d|  q)q#dd
| }td|d	S )
ze
    Handle password change via AJAX request.
    Returns JSON response for frontend processing.
    )r   r  Tz'Your password was successfully updated!r   : z!Please fix the following errors: , Fr  )r   r   rl   rr   rs   r   r    r  itemsr,  join)rg   ro   r   r  field
error_listr   error_messageri   ri   rj   change_password_ajax<  s$   
r  c                 C   s   | j dd}|rtjt|dt|dB d}ntj d}t|d}| j d}z|	|}W n t
yC   |	d}Y n tyQ   |	|j}Y nw ||d	}t| d
|S )zR
    View for displaying subscribers with pagination and search functionality
    r   r   r   )email__icontainsr      r   r2   )subscribersr   zpages/subscribers.html)r   r   r;   re   r   r   r   rf   r   r   r   r   r   r"   )rg   r   subscribers_listr   r   r  rh   ri   ri   rj   subscriber_list]  s.   
r  zmimansha_main.view_contactc                 C   s   t j d}| jdd}|r(|t|dt|dB t|dB t|dB }t|d}| jd	}|	|}||d
}t
| d|S )zp
    View for listing and searching contact submissions.
    Includes pagination with 10 contacts per page.
    rp  r   r   r   )mail__icontains)phone__icontains)message__icontainsr   r   )contactssearch_termzpages/contact_messages.html)r7   re   rf   r   r   r   r   r   r   r   r"   )rg   r  r  r   r   r   rh   ri   ri   rj   contact_message  s&   

r  )r,   )r   z mimansha_main.add_newslettertaskc           	      C   s  | j dkr| jdd }| jdd }|r|s5| jddkr+tddid	d
S t| d tdS t	j
jdd}| }|dkr^| jddkrTtddid	d
S t| d tdS tj
j|||| jd}tjt|j| jjfd}|  | jddkrtd|j|dS t| d| d tdS tj
jddd }d }|r|j|j|j| d d d}t| dt	j
jdd |dS )Nrl   subjectr   r   r   r   r   z&Both subject and message are required!r  r   zmimansha_main:send_newsletterT	is_activer   z!No active subscribers to send to!)r  r   r  
created_by)targetargsstarted)r   rX  rs  zNewsletter is being sent to z subscribers in the background!)is_completedz-completed_atr  )
successfulfailedrs  r  zpages/send_newsletter.html)subscriber_countprevious_result)rp   rl   r   r'  r   r    r   r   r#   r;   re   r   r   warningrA   r  r   	threadingThreadsend_emails_taskr   startr   r   r  successful_sendsfailed_sendsr  get_errors_listr"   )	rg   r  r   r  r  rV  email_threadlatest_taskr  ri   ri   rj   send_newsletter  s\   
	r  c                 C   s  t jj| d}tjjdd}d}d}g }tjjddddd }|D ]}zatd	|j|j	||t
j d
|j dd}	d|j d|jrG|jnd dt|j	 d}
|
dt j dt
j d
|j d7 }
td|j d|
t
j|jgt
jgd}||	d |  |d7 }W n* ty } z|j dt| }|| |d7 }|| W Y d}~nd}~ww || d dkr||| q$||| |  dS )ze
    Background task function - sends both HTML (with featured articles) and plain text versions
    r   Tr  r   ro  r   Nr  znewsletter/email_template.htmlz/unsubscribe//)r  r   r  featured_articlesunsubscribe_urlr   z 

Hi therez,

z

u   💬 FOLLOW US:
Facebook: https://www.facebook.com/profile.php?id=61575508733332
Instagram: https://instagram.com/mimamsha_2025
LinkedIn: https://linkedin.com/company/mimamsha

© u    Your Brand. All rights reserved.

📩 Submit: https://mimamsha.com/submit
📞 Contact Us: https://mimamsha.com/contact-us

Kathmandu, Nepal

Unsubscribe: )r  r  
from_emailtoreply_to	text/htmlr2   r  r   )rA   re   r   r;   r   r3   r   r%   r  r   r   SITE_URLr   r   r'   r&   r=  yearr   DEFAULT_FROM_EMAILr  attach_alternativesendrc  r.  r,  	add_errorupdate_progressmark_completed)rX  user_idrV  r  r  r   r  r  r  html_messageplain_text_messager  rf  	error_msgri   ri   rj   r    sh   

	
r  z!mimansha_main.view_newslettertaskc              
   C   sl   z#t jj|d}t|j|j|j|j|j|	 d d |j
| dW S  t jy5   tddidd Y S w )Nr   r  )rG  sentrs  r  r  r  r   progressr   r^    r   )rA   re   r   r    r  sent_subscribersr  r  r   r  r   get_progress_percentagerb  )rg   rX  rV  ri   ri   rj   newsletter_progressC  s   
r  zmimansha_main.view_issuec                 C   s   t j }| jd}|r| r|jt|d}|dd}t	|d}| jd}z|
|}W n ty?   |
d}Y n tyM   |
|j}Y nw d|i}t| d	|S )
Nr   r   -publication_daterp  r  r   r2   issueszissues/issue_list.html)rC   re   rf   r   r   isdigitr   r/  r   r   r   r   r   r   r"   )rg   querysetr   r   r   r   rh   ri   ri   rj   
issue_listY  s"   

r#  zmimansha_main.add_issuec                 C   sX   | j dkr!t| j| j}| r | }t| td t	dS nt }t
| dd|iS )Nrl   zIssue created successfully!mimansha_main:issue_listissues/issue_form.htmlro   )rp   rQ   rl   rq   rr   rs   r   r   _r#   r"   )rg   ro   issueri   ri   rj   issue_createt  s   
r(  zmimansha_main.change_issuec                 C   st   t t|d}| jdkr,t| j| j|d}| r+|  t	| t
d td|jdS nt|d}t| d||dS )Nslugrl   ry   zIssue updated successfully!mimansha_main:issue_detailr%  )ro   r'  )r$   rC   rp   rQ   rl   rq   rr   rs   r   r   r&  r#   r*  r"   )rg   r*  r'  ro   ri   ri   rj   issue_update  s   

r,  c                 C   s8   t t|d}t|d}t|d}|||d}t| d|S )Nr)  ry   r'  )r'  status_formadd_blogs_formzissues/issue_detail.html)r$   rC   rU   rT   r"   )rg   r*  r'  r.  r/  rh   ri   ri   rj   issue_detail  s   

r0  zmimansha_main.delete_issuec                 C   s:   t t|d}| jdkr|  t| td tdS d S )Nr)  rl   zIssue deleted successfully!r$  )r$   rC   rp   r   r   r   r&  r#   )rg   r*  r'  ri   ri   rj   issue_delete  s   
r1  c                 C   sf   t t|d}t| j|d}| r|  t| td n|j	
 D ]}t| | q#td|jdS )Nr)  ry   z"Issue status updated successfully!r+  )r$   rC   rU   rl   rr   rs   r   r   r&  r  r   r   r#   r*  )rg   r*  r'  ro   r   ri   ri   rj   update_issue_status  s   r2  c           	      C   s   t t|d}t| j|d}| rm|jd }|rdtjj|d	d
 }|r+|jd nd}t  t|D ]\}}tjj|||| d q6W d    n1 sPw   Y  t| tddt|i  nt| td	 nt| td
 td|jdS )Nr)  r-  r   z-orderr2   )r'  r   orderz0Successfully added %(count)d blogs to the issue.r   zNo blogs selected to add.z-There was an error adding blogs to the issue.r+  )r$   rC   rT   rl   rr   r   rD   re   r   r   r  r3  r   atomic	enumerater  r   r   r&  r  infor   r#   r*  )	rg   r*  r'  ro   r   
last_order
next_orderidxr   ri   ri   rj   add_blogs_to_issue  s,   


r:  c                 C   sx   t t|d}t t|d}ztjj||d}|  t| t	d W n tj
y4   t| t	d Y nw td|jdS )Nr)  r   )r'  r   z%Blog removed from issue successfully.z Blog was not part of this issue.r+  )r$   rC   r3   rD   re   r   r   r   r   r&  rb  r   r#   r*  )rg   
issue_slugblog_idr'  r   
issue_itemri   ri   rj   remove_blog_from_issue  s   r>  c              
   C   s   zHt | j}|dg }td| |stdddW S t|ddD ]\}}ztjj||d}||_	|
  W q" tjyA   Y q"w td	d
iW S  tye } ztdt|dddW  Y d }~S d }~ww )Nr3  zi reached hereFzNo order providedr  r2   )r  )r   issue__slugr   Tr  r   )r0  r  r  r   printr    r5  rD   re   r3  rs   rb  rc  r.  )rg   r*  r  r3  indexitem_idrD  rf  ri   ri   rj   update_issue_item_order  s&   
"rC  r   )
PermissionGroup)r"   r#   )r*   )r\   c                 C   s   t jjddd}tj d}i }tj dD ]}|jj	}||vr*g ||< || 
|j|j|jd qt| d|||dS )	NF)rN  
first_namer   content_type)r   codenamer   zpermissions.html)r   groupspermissions)r   re   r   r   rE  rf   rD  r)  rG  	app_labelr,  r   rH  r   r"   )rg   r   rI  rJ  permrK  ri   ri   rj   permission_manager  s"   
rM  c           	      C   s   zGt jj|d}t|jjddd}t }|j D ]}|j	jddd}|
| qtt|t| }t|jjddd}t|||ddW S  t jyZ   tdd	d
dd Y S w )Nr   rH  Tflatr   r   )rJ  direct_permissionsrI  r   r   User not foundr  r  r   )r   re   r   r(  user_permissionsvalues_listsetrI  rf   rJ  updater    rb  )	rg   r  r   rJ  group_permissionsgroupgroup_permsall_permissionsuser_groupsri   ri   rj   get_user_permissions,  s$   
r[  c              
   C   sR  | j dkrzkt| j}|d}|dg }|dg }tjj|d}|j  |D ]}zt	jj|d}|j
| W q+ t	jyF   Y q+w |j  |D ]}ztjj|d}	|j
|	 W qN tjyi   Y qNw tddiW S  tjy   td	d
ddd Y S  ty }
 ztd	t|
dddW  Y d }
~
S d }
~
ww td	ddddS )Nrl   r  rJ  rI  r   rH  r   r   r   rQ  r  r  r     r   r  )rp   r0  r  r  r   r   re   rR  clearrD  addrb  rI  rE  r    rc  r.  )rg   r  r  rJ  	group_idsr   rH  rL  group_idrW  rf  ri   ri   rj   update_user_permissionsD  s>   



"rb  c                 C   sZ   zt jj|d}t|jjddd}t|ddW S  t jy,   tddd	d
d Y S w )Nr   rH  TrN  r   )rJ  r   r   Group not foundr  r  r   )rE  re   r   r(  rJ  rS  r    rb  )rg   ra  rW  rJ  ri   ri   rj   get_group_permissionsl  s   rd  c           
   
   C   s  | j dkrzt| j}|d}|dg }|sH|dd }|s-tdddd	d
W S tjj	|d
 r@tdddd	d
W S tjj|d}n3tjj|d}|d}|r{| |jkr{tjj	| d
 rrtdddd	d
W S | |_|  |j  |D ]}ztjj|d}|j| W q tjy   Y qw td|j|jdW S  tjy   tddddd
 Y S  ty }	 ztdt|	ddd
W  Y d }	~	S d }	~	ww tdddd	d
S )Nrl   ra  rJ  
group_namer   r   zGroup name is requiredr  r  r   )r   zGroup already existsr   zGroup name already existsr\  r   )r   ra  re  rc  r  r]  r   )rp   r0  r  r  r   r'  r    rE  re   r   r  r  r   rs   rJ  r^  rD  r_  rb  r   rc  r.  )
rg   r  ra  rJ  re  rW  new_namerH  rL  rf  ri   ri   rj   update_group_permissionsv  sF   




"rg  c              
   C   s   | j dkrGztjj|d}|  tddiW S  tjy*   tddddd	 Y S  tyF } ztdt|dd
d	W  Y d }~S d }~ww tddddd	S )Nrl   r   r   r   r   rc  r  r  r   r]  r   r  )	rp   rE  re   r   r   r    rb  rc  r.  )rg   ra  rW  rf  ri   ri   rj   delete_group  s   
"rh  c                 C   s    t tjdd}t|ddS )Nr   r   r   )rI  r   )r(  rE  re   r   r    )rg   rI  ri   ri   rj   get_all_groups  s   ri  )r   r   r   )PageViewr3   c              
   C   s  t   }|tdd }|j}|j}|j}|j}tjjt	ddd p%d}tj
djt	dtdd	d
t	dt||ddt	dt||ddd}|D ]+}	|	ddpTd}
|	ddp\d}|
dkrl||
 |
 d |	d< qK|dkrrdnd|	d< qKdd |D }dd |D }tjjtddddd d }|jdd d	d |jdd d	d t|d}t|d}| jd}||}||}|d}|d}||||||d}t| d |S )!Nr   rm  r   rr  rs  r   	page_namer  T)r   )date__month
date__yearry  )r   unique_viewsthis_month_viewslast_month_viewsrp  ro  r  growthc                 S   s   g | ]}|d   ds|qS rk  blog_
startswithr   pri   ri   rj   r     r  z'analytics_dashboard.<locals>.<listcomp>c                 S   s   g | ]}|d   dr|qS rr  rt  rv  ri   ri   rj   r     r  r   r   r   r   c                 S   r  Nr   ri   r  ri   ri   rj   r    r  z%analytics_dashboard.<locals>.<lambda>r  c                 S   r  rx  ri   r  ri   ri   rj   r    r  r   z%B %Y)r   general_pages
blog_pages	top_blogscurrent_monthr  zpages/analytics.html)r&   r=  rt  r   monthr  rj  re   r  r   r   r   r   r   r   r3   r   r  r   r   r   r_  r"   )rg   r  last_month_dater|  current_yearr  last_month_yearr   	all_pagesr   rp  ro  ry  rz  r{  general_paginatorblog_paginatorr   general_page_objblog_page_objcurrent_month_displaylast_month_displayrh   ri   ri   rj   analytics_dashboard  sV   






r  c              	   C   s   t | d tjjdtjjd}tjjtjjddd d }tjd }|r0t	jj|dng }t
d	ttd
}t| d|||||dS )NHomepageTri  r   r      rp  r   MIMAMSHA)r   r   r   zpages/home.html)r  latest_blogsr   r  meta_contents)rb   r3   re   r   r   r   r   r8   r  r9   r`   r_   r^   r"   )rg   r  r  r   r  r  ri   ri   rj   	home_page  s"   
 r  c                 C   s(   t | d tdddd}t| dd|iS )NzAbout MIMAMSHAzAbout - MIMAMSHAz/static/images/mimamsha.png)r   og_imagetwitter_imagezpages/about.htmlr  )rb   r`   r"   )rg   r  ri   ri   rj   about_mimamsha&  s   
r  c           	      C   s   t t|d}tjj|tjjdd}|D ]}t|j	|_
qt|d}| jdd}||}td| d}t| d|  t| d	||||d
S )Nr)  )categoryr   rp  r   r   r2   MIMAMSHA - r   zpages/categorical_blogs.html)r  r   r   r  )r$   r4   r3   re   r   r   r   r   r(   r   generated_slugr   r   r   r   r`   rb   r"   )	rg   category_slugr  r   r   r   r   r   r  ri   ri   rj   category_blogs6  s"   

r  c           
   	   C   s   t | d | jdd}tjjtjjdd}|}|r1|t	|dt	|dB t	|dB d}t
|d	}| jd
d}||}dd |D }t|}tdd}	t| d|||j ||	dS )NzMIMAMSHA - Authorsr   r   r   r   r   )affilation__icontains)description__icontainsr   r   r2   c                 S   s(   g | ]}|j |j|j|j|jjd qS ))r   r   r  
affilationimage)r   r   r  r  r  url)r   
author_objri   ri   rj   r   j  s    zauthor.<locals>.<listcomp>r  zpages/authors.html)r   r   authors_jsonall_authors_jsonr  )rb   r   r   r5   re   r   r  r  r   r   r   r   r0  r1  r`   r"   object_listr  )
rg   r   all_authors_qsfiltered_authorsr   r   r   all_authorsr  r  ri   ri   rj   r   R  s>   



r   c                 C   s   t t|d}|jjtjjd d}t	|d}| j
d}z||}W n ty4   |d}Y n tyB   ||j}Y nw td|j |j|jd|j d	d
}t| d|j  t| d||||dS )Nr   r   r   r  r   r2   r  z(https://www.mimamsha.com/authors/author-z/blogs/)r   r  r  canonical_urlzAuthor Blogs - zpages/author_blogs.html)r   r  r   r  )r$   r5   r   r   r3   r   r   r   r   r   r   r   r   r   r   r   r`   r   r  r   rb   r"   )rg   	author_idr  
blogs_listr   r   r   r  ri   ri   rj   author_blogs  s0   

r  )r   CaseWhenr   r   c           	         s   t j }t fdd|D d }|stdtjjt|dt|dB tjj	dj
tt|tddtd	t d
ddd }t|d}| jdd}||}td|j d}t| d|j  t| d||j||dS )Nc                 3   s"    | ]}t |j kr|V  qd S r  )r(   r   )r   tr)  ri   rj   r    s     ztopic_detail.<locals>.<genexpr>zTopic does not existr   )related_topicsr   r2   r   thenr   )defaultoutput_field)is_exact_matchz-is_exact_matchr   	   r   r  r  z	Topics - zpages/topics_detail.html)r   r   r   r  )r6   re   rf   rO  r!   r3   r   r   r   r   r   r  r  r   r   r   r   r   r   r   r   r`   r   rb   r"   r  )	rg   r*  r   r   r   r   r   r   r  ri   r)  rj   topic_detail  s<   
	


r  )r   r   c                 C   sZ  t jjt jjddjtdd }dd |D }t jjt jjddd	jtdd }d
d |D }t	j
 d}tt}|D ]9}||jd||jd }|jr_|jd  nd}	|	 sgd}	||	 |jt|dru|jnt|j|d qEd}
|
D ]
}||vrg ||< qtt| }t| d tdd}||
d|d}t| d|S )Nr   r   r   r@  c                 S      i | ]	}|d  |d qS )r   r   ri   rC  ri   ri   rj   
<dictcomp>      z%explore_by_topics.<locals>.<dictcomp>F)r   related_topics__isnullr  c                 S   r  )r  r   ri   rC  ri   ri   rj   r    r  r   r   #r*  )r   r*  r{  zABCDEFGHIJKLMNOPQRSTUVWXYZ#r6   zMIMAMSHA - Topicsr  T)topics_with_lettersalphabet
has_topicsr  zpages/topics.html)r3   re   r   r   r   r   r   r   r   r6   rf   r   r(  r   r   r   upperisalphar,  hasattrr*  r(   dictsortedr  rb   r`   r"   )rg   main_countsmain_counts_dictrelated_countsrelated_counts_dictr   r  r   rs  
first_charr  letterr  rh   ri   ri   rj   explore_by_topics  sZ   	

r  c                 C   s   t jjt jjdd}| jdd}t|d}z|	|}W n t
y-   |	d}Y n ty;   |	|j}Y nw tdd}t| d ||d	}t| d
|S )Nr   r  r   r2   r   zMIMAMSHA - Issuesr  Issues)r   r  zpages/explore_by_issue.html)rC   re   r   r   r   r   r   r   r   r   r   r   r   r`   rb   r"   )rg   issues_listr   r   r   r  rh   ri   ri   rj   explore_by_issue  s$   

r  c           
   	   C   s   t t||d}tjj|ddd}dd |D }dd |D }tjjtjjdj	|j
d	d
dd }td|j d}t| d|j  |||||j|j|jrX|jjnd|d}	t| d|	S )a  
    View function to display issue details and associated blogs
    
    Args:
        request: HTTP request object
        issue_id: ID of the Issue to display
        slug: URL slug of the Issue
        
    Returns:
        Rendered issue detail page with context
    )r   r*  r-  r   r3  c                 S   s   g | ]}|j r|jqS ri   featuredr   rC  ri   ri   rj   r   =      z(explore_issue_detail.<locals>.<listcomp>c                 S   s   g | ]}|j s|jqS ri   r  rC  ri   ri   rj   r   >  r  r   r   r  N   r  r  zIssue - )r'  r  regular_blogsrelated_issuesr   page_description
page_imager  zpages/explore_issue_detail.html)r$   rC   rD   re   r   r)  r   r   r   excluder   r`   r   rb   r  cover_imager  r"   )
rg   issue_idr*  r'  issue_itemsr  r  r  r  rh   ri   ri   rj   explore_issue_detail*  s4   
r  c                 C   sD   t j d}dd |D }tdd}t| d t| d||dS )	Nr   c              
   S   s.   g | ]}|j |j|j|j|j|j|jd qS )r   roler  facebook_linktwitter_link
insta_linkr  r  )r   memberri   ri   rj   r   b  s    
zteam.<locals>.<listcomp>zMIMAMSHA -Teamr  Teamzpages/team.html)r  r   )r@   re   rf   r   r`   rb   r"   )rg   team_members_objectsr   r  ri   ri   rj   team_  s   

r  )r@   c                 C   s   d| j  }d| j  d| j d| j d| j d| j d}tdd	| i}ttjj	d
dd}|s6t
d dS z"t||tj|d}||d |jdd t
dt| d W dS  tyl } zt
d|   d}~ww )zX
    Sends HTML email notification to ALL team members about a new contact enquiry.
    zNew Contact Enquiry: z=
    You have received a new contact enquiry:
    
    Name: z
    Email: z
    Phone: z
    Message: z
    
    Received at: z
    z$newsletter/contact_notification.htmlcontactr  TrN  z&No team members found in the database.N)r  r  r	  r
  r  F)fail_silentlyzEmail sent successfully to z recipientszFailed to send email: )r   mailphoner   r  r%   r(  r@   re   rS  r@  r   r   r  r  r  r  rc  )contact_instancer  text_contenthtml_contentrecipient_listr  rf  ri   ri   rj   send_contact_notification  sD   r  )r  c              
   C   sD   zt |  W dS  ty! } ztd|  W Y d}~dS d}~ww )z+Helper function to send email in backgroundzEmail sending error: N)r  rc  r@  )r  rf  ri   ri   rj   send_email_async  s   r  c                 C   s~   | j dkr2t| j}| r&| }tt|fdd  t	| d t
dS t| d|tddd	S t| dt tddd	S )
Nrl   T)r  r  daemonz(Your message has been sent successfully!zmimansha_main:contact_uszpages/contact.htmlzMIMAMSHA - Contactr  )ro   r  )rp   rI   rl   rr   rs   r  r  r  r   r   r#   r"   r`   )rg   ro   r  ri   ri   rj   r    s(   

r  c              
   C   s  t | }d|_tdd}t t t d d|d}| jdkrd| jv rot| j}|	 ri|j
d }ztjj|d	}|j| jd
< t j| d|j ddd tdW S  tjyh   t j| ddd ||d< Y n'w ||d< n d| jv rP| jd
}t| j}||d< zt  |rtjj|d}|	 r|jdd}	tjj|	_|	  |	j| | jd
= t j| ddd tdW  d    W S d|d< ||d< nQt| j| j}
|
|d< |
	 r|	 r|
jdd}tjj|_|  |jdd}	tjj|	_|	  |	j| t j| ddd tdW  d    W S d|d< W d    n	1 s)w   Y  W n_ t yO } zt j!| dt"| dd W Y d }~nDd }~ww d| jv rt| j| j}
|
|d< |
	 r|
jdd}tjj|_|  |j| jd
< d|d< ||d< t j| ddd tdS | jd
}|rztjj|d|d< d|d< W n tjy   | jd
= Y nw t#| d t$| d|S ) NTzMIMAMSHA - Submitr  F)lookup_formauthor_form	blog_formexisting_authorshow_blog_formr  rl   lookup_authorr  )r  existing_author_idzWelcome back, !submit_articles)
extra_tagszmimansha_main:submit_articlesz!No author found. Please register.r  submit_articler  r   r   zArticle submitted successfully!r  r  r  z2Article and author details submitted successfully!zSubmission error: submit_new_authorz.Author details saved. Now submit your article.zSubmit Articleszpages/submit_articles.html)%r   get_messagesusedr`   rN   rO   rP   rp   rl   rr   r   r5   re   r   r   r  r   r   r#   rb  r6  r   r4  rs   r3   r   r   r   r   r_  rq   r  rc  r   r.  rb   r"   )rg   storager  rh   r  r  r   r  r  r   r  rf  r  ri   ri   rj   r    s   
	









 &


r  c                 C   s   d| j v r	| j d= tddiS )Nr  r   r   )r  r    r  ri   ri   rj   clear_author_sessionB	  s   
r  c                 C   s(  | j dd}| j dd}d}|st| d|g g g ddS t|}td	d
dtddd }td	d
d}tjjt||dj	dtj
jdd}|D ]}t|j|_qJtjjt||dj	dddd}	tjjt||dj	dddd}
g }|D ]}|d||jd q{|	D ]}|d||jd q|
D ]}|d||jd q|jdd dd t||}z||}W n ty   |d}Y n ty   ||j}Y nw tt}|D ]}||d  |d  qt|}tdd}t| d t| d||dg |dg |dg |||d S )!aJ  
    Advanced search view using PostgreSQL full-text search capabilities
    for more effective searching including ranking and relevance.
    
    Search results are grouped by content type for better organization.
    
    This view requires PostgreSQL as database backend and
    django.contrib.postgres in INSTALLED_APPS.
    qr   r   r2   r   zpages/search_results.htmlr   )queryr   blog_categoriesr   total_resultsr   A)weightr   B)rankg?)rank__gtr   z-rank)r  rskeyr   )r  objectr  blog_categoryr   c                 S   r  )Nr  ri   r  ri   ri   rj   r  	  r  zsearch_view.<locals>.<lambda>Tr  r  r  zMIMAMSHA - Search Resultsr  zSearch Results)r  r   r  r   paginated_resultsr  r  )r   r   r"   r0   r/   r3   re   r   r1   r   r   r   r   r(   r   r  r4   r6   r,  r  r  r   r   r   r   r   r   r(  r  r`   rb   )rg   r  r   results_per_pager   blog_vectorcategory_vectorr   r   r  r   all_resultsr  r   r   r  grouped_resultsresultr  r  ri   ri   rj   search_viewJ	  s   






r  c                 C   >   | j dd}tjj|ddd }dd |D }td|iS )	z(Return authors matching the search querytermr   r   Nr   c                 S      g | ]	}|j |jd qS )r   r  )r   r   )r   r   ri   ri   rj   r   	  r  z"search_authors.<locals>.<listcomp>results)r   r   r5   re   r   r    )rg   r  r   r  ri   ri   rj   search_authors	     r  c                 C   r  )	z'Return topics matching the search queryr  r   r   Nr   c                 S   r  r  )r   r   r   ri   ri   rj   r   	  r  z!search_topics.<locals>.<listcomp>r  )r   r   r6   re   r   r    )rg   r  r   r  ri   ri   rj   search_topics	  r  r  )r$   r"   )r   r  r  )r3   c                 C   s  t tjdddd||tjjd}t||  zp|j}|j	
 }|j}tjjtjjdj|d}|t|dt|d	B t|d
B  tt|ddtt|ddtt|dddd d }t|dk rdt| }	|jdd |D ddd |	 }
t|t|
 }W n& ty } ztjjtjjdj|ddd d }W Y d }~nd }~ww d}|jrz$t|jtrt|j}ddd |D }nddd |jD }W n tttfy   Y nw t|j ||j!|j"|j"d|j# d|j$ t%|dr|j&' nd t%|dr|j(' nd t%|dr|j)* nd t%|dr&|jj+nd |d }zt,|j-}W n tyK } z|j-dd!}W Y d }~nd }~ww z	t.| |j+  W n
 ty_   Y nw t/| d"||||d# |d$ d%S )&Nr   r  r   r  )rx   r*  r   r   rw   r  )	topic__in)r  r   r  r2   )r  r  r  )r  r  r   r  c                 S   s   g | ]}|j qS ri   rw   )r   bri   ri   rj   r   	  s    zblog_detail.<locals>.<listcomp>)pk__inr   r  c                 s       | ]}t |V  qd S r  r.  rC  ri   ri   rj   r  
      zblog_detail.<locals>.<genexpr>c                 s   r  r  r  rC  ri   ri   rj   r  	
  r  zhttps://www.mimamsha.com/blogs/r  published_timer  r   )r   r   r   r  r  r  article_published_timearticle_modified_timearticle_authorarticle_sectionarticle_tag)processed_contentfootnotes_templatezpages/blog_detail.htmlr$  r%  )r   related_blogsr  r$  r%  )0r$   r3   re   r)  r*  r   r   ra   r   r  rf   r  r   r  r   r   r   r  r  r  r(  rc  r   
isinstancer.  astliteral_evalr  
ValueErrorSyntaxError	TypeErrorr`   r   r   
meta_imager   r*  r  r  	isoformatr  r   get_full_namer   rY   r   rb   r"   )rg   r<  r*  blog_details
main_topicr  r  
base_queryr&  	remainingadditional_blogsrf  r   meta_keywords_listr  processed_blogri   ri   rj   blog_detail	  s   

	r7  c                 C   sl   t jjtddddd d }t|d}| jd}||}t	dd	}||d
}t
| d t| d|S )Nr   r   r   r   r   r  r   zMIMAMSHA - Popular Blogsr  )r   r  zPopular Blogszpages/popular_blogs.html)r3   re   r   r   r   r   r   r   r   r`   rb   r"   )rg   r   r   r   r   r  rh   ri   ri   rj   r  2
  s    


r  r  )r0  r  calendarr   r   collectionsr   r(  django.db.modelsr   r   django.confr   django.contribr   r   r	   r
   r   r   r   r   r   r   django.contrib.auth.decoratorsr   r   django.contrib.auth.formsr   django.core.exceptionsr   django.core.mailr   r   django.core.paginatorr   r   r   django.core.validatorsr   	django.dbr   r   r   r   django.db.models.functionsr   django.httpr    r!   django.shortcutsr"   r#   r$   django.template.loaderr%   django.utilsr&   django.utils.htmlr'   django.utils.textr(   django.utils.translationr)   r&  django.views.decorators.csrfr*   r+   django.views.decorators.httpr,   r-   r.   django.contrib.postgres.searchr/   r0   r1   modelsr3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   formsrE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   utilsrW   rX   rY   seoutilsrZ   r   rJ  r\   r]   	stopwordsr^   r_   r`   	analyticsra   rb   rc   rk   ru   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  django.utils.safestringr  r<  django.utils.timezoner=  rT  rW  rg  rh  rk  r  r  r  r  r  r  r  r  r  r  r  r#  r(  r,  r0  r1  r2  r:  r>  rC  r   django.contrib.auth.modelsrD  rE  r   rM  r[  rb  rd  rg  rh  ri  rj  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r7  r  ri   ri   ri   rj   <module>   sX   PP

	+
 
	S
0> I


+
1

&$

CI	%0A2%A5,#iif