o
    ph                     @   sV  d dl mZmZmZ d dlmZmZ d dlmZ d dl	m
Z
 d dlmZmZ d dlmZ d dlmZ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 d dlmZ d dl 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+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6 dd Z7dd Z8edd Z9eedd dd Z:eedd dd Z;eedd d d! Z<eed"d d#d$ Z=eed%d d&d' Z>eed(d d)d* Z?edEd+d,Z@d-d. ZAd/d0 ZBd1d2 ZCd3d4 ZDd5d6 ZEd7d8 ZFed9d: ZGd;d< ZHd=d> ZIed?d@ ZJedAdB ZKdCdD ZLdS )F    )renderget_object_or_404redirect)login_requireduser_passes_test)User)messages)loginviews)timezone)CaseWhenValueBooleanField)	timedelta)JsonResponseHttpResponse)reverse)Q)modelsN   )EventSpeakerAgendaCallForProposalGalleryRegistrationUserProfileRoleProposalPublicationSessionTypePublicationTypeCarouselImageSponsorSectionImage)UserRegistrationFormUserProfileFormProposalFormSpeakerForm)CustomPasswordResetFormc                    s   t  }tjjddd}z
tjjddd}W n tjy$   d}Y nw t	t
jjddd  fddtd	t d
D }tjjd|dddd }tjjd|dd }||||||d}t| d|S )zHome page view.T	is_activeorderjoin_community)sectionr,   Nc                       g | ]
} ||d   qS     .0isponsorsr3   //var/www/html/bloggers_ems/events/main_views.py
<listcomp>8       zindex.<locals>.<listcomp>r   r2   upcoming)statusdate_time__gte	date_time   )latest_eventslatest_announcementcarousel_imagessponsor_groupsjoin_community_imagenowzevents/index.html)r   rF   r#   objectsfilterorder_byr%   getDoesNotExistlistr$   rangelenr   firstr   )requestrF   rC   rE   rD   rA   rB   contextr3   r7   r9   index)   s:   
	rR   c              
   C   s   | j dkr\t| j}| r[| }tjjddd }tjj|d|id t	| | zddl
m} |||  W n tyP } ztd|  W Y d	}~nd	}~ww t| d
 tdS nt }t| dd|iS )zHandle user registrationPOSTattendee)namer   role)userdefaults)send_welcome_emailzError sending welcome email: NzsRegistration successful! Welcome to Bloggers Event Management System. Please check your email for more information.events:my_profilezregistration/register.htmlform)methodr&   rS   is_validsaver   rG   get_or_creater   r	   events.utils.email_utilsrY   	Exceptionprintr   successr   r   )rP   r[   rW   rV   rY   er3   r3   r9   registerT   s,   


re   c           	      C   s   | j js| j jst| d tdS tj 	d}t
 }|tdd }|D ]G}tjj|dd}| |_|	d }|rk|j}|j|krPd	|_d
|_n|j|kra|j|krad|_d|_nd|_d|_||_q'd|_q'd|i}t| d|S )z+Display list of users with role management.z-You do not have permission to view this page.zevents:index-date_joined   hoursrW   event-event__date_timeUpcominginfoOngoingrc   Archived	secondaryNuserszevents/user_list.html)rW   is_staffis_superuserr   errorr   r   rG   allrI   r   rF   r   r   rH   select_relatedcountregistration_countrO   rk   r?   latest_event_statuslatest_event_colorlatest_eventr   )	rP   rr   rF   two_hours_agorW   registrations
latest_regrk   rQ   r3   r3   r9   	user_listp   s2   

r   c                 C      | j S Nrt   ur3   r3   r9   <lambda>       r   c                 C   sd   t t|d}d|_d|_|  | jddkr$tdd|j ddS t	
| |j d td	S )
zMake a user a superuser/admin.usernameTX-Requested-WithXMLHttpRequestrc   	Superuserz is now a superuserr=   rV   messageevents:user_list)r   r   rt   rs   r^   headersrJ   r   r   r   rc   r   rP   r   rW   r3   r3   r9   
make_admin   s   
r   c                 C   r   r   r   r   r3   r3   r9   r      r   c                 C   s   t t|d}|| jkr$| jddkrtdddS t| d tdS d|_	|
  | jddkrDtd	|jr:d
ndd|j dS t| d|j  tdS )z*Remove superuser/admin status from a user.r   r   r   ru   z+You cannot remove your own admin privilegesr=   r   r   Frc   StaffAttendeezAdmin privileges removed from r   )r   r   rW   r   rJ   r   r   ru   r   rt   r^   rs   r   rc   r   r3   r3   r9   remove_admin   s&   

r   c                 C      | j p| jS r   rs   rt   r   r3   r3   r9   r          c                 C   s^   t t|d}d|_|  | jddkr!tdd|j ddS t	| |j d t
d	S )
zMake a user a staff member.r   Tr   r   rc   r   z is now a staff memberr   r   )r   r   rs   r^   r   rJ   r   r   r   rc   r   r   r3   r3   r9   
make_staff   s   
r   c                 C   r   r   r   r   r3   r3   r9   r      r   c                 C   s   t t|d}|jr"| jddkrtdddS t| d tdS || j	kr@| jddkr6tdddS t| d tdS d	|_
|  | jddkr[td
dd|j dS t| d|j  tdS )z Remove staff status from a user.r   r   r   ru   z*Cannot remove staff status from superusersr   r   z+You cannot remove your own staff privilegesFrc   r   zStaff privileges removed from r   )r   r   rt   r   rJ   r   r   ru   r   rW   rs   r^   r   rc   r   r3   r3   r9   remove_staff   s6   

r   c                 C   r   r   r   r   r3   r3   r9   r      r   c                 C   s   t dd}d|d< t|}|g d tj d}|D ]1}|jr&dn|j	r+dnd	}||j
|j|j|j||jr=d
nd|jd|jrL|jdndg q|S )zExport user list to CSV.text/csvcontent_typez attachment; filename="users.csv"Content-Disposition)UsernameEmailz
First Namez	Last Namer   StatuszDate Joinedz
Last Loginrf   r   r   r   ActiveInactive%Y-%m-%d %H:%M:%SNever)r   csvwriterwriterowr   rG   rv   rI   rt   rs   r   email
first_name	last_namer,   date_joinedstrftime
last_login)rP   responser   rr   rW   rV   r3   r3   r9   export_users_csv   s$   


r   c                 C   r   r   r   r   r3   r3   r9   r     r   c                 C   s   t t|d}tdd}d|j d|d< t|}|g d tjj	|d
d	d
}|D ]%}||jj|jj|j p?|jj|jjj|jjj|jd| g q-|S )z"Export event registrations to CSV.idr   r   zattachment; filename="z_registrations.csv"r   )r   r   z	Full NameOrganizationPhonezRegistration Dater   rk   rW   user__userprofiler   )r   r   r   titler   r   r   r   rG   rH   rw   rW   r   r   get_full_nameuserprofileorganizationphone_numberregistration_dater   get_status_display)rP   event_idrk   r   r   r~   registrationr3   r3   r9   export_event_registrations_csv  s"   



r   c           	      C   s   |r!| j js| j js| j j|krt| d tdS tt|d}n| j }t	
 }|tdd }tjj|dd}|D ](}|j}|j|krLd|_d	|_q;|j|kr]|j|kr]d
|_d|_q;d|_d|_q;||d}t| d|S )z<Display user profile. Admins can view other users' profiles.z0You do not have permission to view this profile.rZ   r   rg   rh   rj   rk   rm   rn   ro   rc   rp   rq   )profile_userr~   zevents/user_profile.html)rW   rs   rt   r   r   ru   r   r   r   r   rF   r   r   rG   rH   rw   rk   r?   r=   status_colorr   )	rP   r   r   rF   r}   r~   r   rk   rQ   r3   r3   r9   user_profile1  s.   
r   c                 C   s   t jjdddjddddd}g }|D ]$}|d	|j |j|j	|j
|j|jj|jj|jj|jjd
gd q|jdd dd tj d}t| d||dS )z*Display all public documents and materialsTF)	is_publicfile__isnull fileauthorpublication_typez-published_atpublication_)urltypeicon)r   r   abstractr   dater   filesc                 S   s   | d S )Nr   r3   xr3   r3   r9   r   s  s    z#publications_view.<locals>.<lambda>keyr   rU   zevents/publications.html)publicationspublication_types)r    rG   rH   excluderw   rI   appendr   r   r   r   published_atr   rU   r   r   r   sortr"   rv   r   )rP   r   all_publicationspublicationr   r3   r3   r9   publications_viewU  s:   

r   c                 C   s   | j dd}t }|dkr'tjjddd}|tj tj |d}nc|dkrCtjjddd}tj |tj |d}nG|dkr_tjjddd	}tj tj ||d}n+tjjddd}tjjddd}tjjddd	d
d }|||d||d}t	| d|S )z-Display list of events with filtering optionsr=   rv   r<   r=   r?   )upcoming_eventsongoing_eventsarchived_eventscurrent_statusongoingarchived
-date_timeN   T)r   r   r   show_all_archivedr   rF   zevents/event_list.html)
GETrJ   r   rF   r   rG   rH   rI   noner   )rP   r=   rF   eventsrQ   r<   r   r   r3   r3   r9   
event_list~  sD   	r   c                    s   t t|d}t }|j }t|jjdd	d  fddt
dt dD }|j }|jd	|d
}d}| jjrGtjj|| jd }|j 	dd}	|j }
||jr]dn|jrbdnd|||||	||
|d
}t| d|S )zEvent detail view.)pkTr+   r-   c                    r0   r1   r3   r4   r7   r3   r9   r:     r;   z event_detail.<locals>.<listcomp>r   r2   open)r=   submission_deadline__gtNrk   rW   session_timespeakersliverecorded	scheduled)
rk   stream_statusr   rD   cfpsactive_cfpsagenda_itemsuser_registrationgallery_itemsrF   zevents/event_detail.html)r   r   r   rF   r   rv   rL   r8   rH   rI   rM   rN   r   rW   is_authenticatedr   rG   rO   agendasprefetch_relatedgallery
is_ongoingis_archivedr   )rP   r   rk   rF   r   rD   r   r   r   r   r   rQ   r3   r7   r9   event_detail  s:   


r  c           	      C   s   t t|d}t }|j }dd |D }dd |D }dd |D }t|| dd d}|jd	d d
d t| d||||dS )zFDisplay detailed information about a specific speaker and their eventsr   c                 S      g | ]}|j r|qS r3   )is_upcomingr5   rk   r3   r3   r9   r:         z"speaker_detail.<locals>.<listcomp>c                 S   r  r3   )r  r  r3   r3   r9   r:     r  c                 S   r  r3   )r  r  r3   r3   r9   r:     r  c                 S   r   r   r?   r   r3   r3   r9   r     r   z speaker_detail.<locals>.<lambda>)r   c                 S   r   r   r  r   r3   r3   r9   r     r   Tr   zevents/speaker_detail.html)speakerr   past_eventsrF   )	r   r   r   rF   r   rv   sortedr   r   )	rP   
speaker_idr	  rF   r   r   r   r
  active_eventsr3   r3   r9   speaker_detail  s   
r  c                 C   s   t  }tjjd||ddd}g }| jjr=t	jj| jdddd}|D ]}|j
j}|j|_|j|_|j|_q*t| d	|||d
S )zGDisplay list of open call for proposals and user's existing submissionsr   )r=   submission_deadline__gteevent__date_time__gtrk   submission_deadline)	submittercfp
cfp__eventz-submitted_atzevents/cfp_list.html)r   user_proposalsrF   )r   rF   r   rG   rH   rw   rI   rW   r   r   r  rk   r  r  r  r   )rP   rF   	open_cfpsr  proposalrk   r3   r3   r9   cfp_list  s:   
r  c                 C   s   t t|d}t }|j}|j}|j}|j}|jdko!|j	|ko!|}g }	| j
jr@| j
jr7tjj|dd}	n	tjj|| j
d}	||	|||||d}
t| d|
S )z?Display detailed information about a specific Call for Proposalr   r   )r  r  r  r  )r  	proposals
can_submitrF   r  r  r  zevents/cfp_detail.html)r   r   r   rF   rk   r  r  r  r=   r  rW   r   rs   r   rG   rH   rw   r   )rP   cfp_idr  rF   rk   r  r  r  r  r  rQ   r3   r3   r9   
cfp_detail  s2   
	r  c           !   
      s~  t tjd|d d| jd}d}|r;ztjddj|| j d}W n tjy:   t	
| d td	 Y S w t } j}|r|j| jkred
}| jddkr[td|dS t	
| | td	S |jrd}| jddkrytd|dS t	
| | td	S |jrd}| jddkrtd|dS t	
| | td	S nH|jsd|jrdnd}| jddkrtd|dS t	
| | td	S  jdkrd}| jddkrtd|dddS t	
| | td	S | jdkr| jdd }|sXtjj | j|d}| r-d| d}| jddkr#td|dddS t	
| | td	S  jjsXd jjr;dnd}| jddkrNtd|dS t	
| | td	S |r]|ndt| j| jd}	|	 r| jdd }
| jd d }| jd!d }| jd"d }| jd#d }| jd$d }| jd%d }zt| jd&d'}t jj|d}W n0 t!t jfy   d(}| jddkrtd|ddd Y S t	
| | td) j"d* Y S w |r|nt | jd+|_#|
_$|_%|_&|_'|_(|_)|_*|_+t _,|s"d,_ fd-d.}g }g }| jd/}|rY||d0d1d2}|rV|d3rO|-|d4  n|-|d4  |_.|rd5}| jddkrptd|||d6S |D ]	}t	
| | qrt/| d7|	 ||||d8S |D ]	}t	0| | q1  |szd'd9l2m3} | W n t4y } zt5d:|  W Y d}~nd}~ww |rd;nd,}d<| d=}|s|d>7 }|r|d?d@6dAdB |D  7 }dC|t7d	dD}|r||dE< | jddkrt|S t	8| | |D ]	}t	0| | qtd	S nt|d}	|	 ||dut dF}t j9 :dG} t/| d7 || |dHS )Iz<Handle submission and editing of proposals with file uploadsrk   r   Neditr  r  )r   r  r  zInvalid proposal edit request.zevents:cfp_listz%You can only edit your own proposals.r   r   ru   r   z*Cannot edit proposals for archived events.z)Cannot edit proposals for ongoing events.z&Cannot submit proposals for {} events.r   r   r   z;This Call for Proposals is no longer accepting submissions.i  r   rS   r   r   )r  r  title__iexactzA proposal with the title "z" already exists.)instanceorganisationcontact_numberr   	sub_themelearning_objectivessponsorshipadditional_notessession_typer   z#Please select a valid session type.zevents:submit_proposal)r  r  	submittedc           
         s    sd S t  fdd|D sd| dd| ddS  j|kr/d| d	|d
  ddS dd l}| }  D ]}|| q;| } d ddl	m
} |jj jjdjrajnd d }	|	rudd|  dddS d S )Nc                 3   s     | ]} j  |V  qd S r   )rU   lowerendswith)r5   extr   r3   r9   	<genexpr>  s    z9submit_proposal.<locals>.validate_file.<locals>.<genexpr>formatz must be in z or z format.)r   r   sizez file size must be under i   zMB.r   )r   )supporting_document__containsr  r   	duplicatezThis z? appears to be already used in another proposal for this event.T)r   r   warning)anyjoinr.  hashlibmd5chunksupdate	hexdigestseekevents.modelsr   rG   rH   rU   rk   r   r   rO   r)  )
r   allowed_extensionsmax_size	file_typer4  	file_hashchunkcontent_hashr   existingr  r   r  r   r9   validate_file  s>   

z&submit_proposal.<locals>.validate_filesupporting_document)z.pdfi  P zSupporting documentr1  r   z Please fix the following errors:)r=   r   errorswarningszevents/submit_proposal.html)r[   r  r  rE  rF  rF   ) send_proposal_confirmation_emailz+Error sending proposal confirmation email: updatedzYour proposal has been z successfully!z: A confirmation email has been sent to your email address.z

Note:

c                 s   s    | ]}d | V  qdS )z- Nr3   )r5   wr3   r3   r9   r,  U  s    z"submit_proposal.<locals>.<genexpr>rc   )r=   r   redirect_urlrF  )r[   r  r  is_editrF   rU   )r  r  session_typesrF   );r   r   rG   rw   r   rJ   r   rW   rK   r   ru   r   r   rF   rk   r  r   r   r  r  r  r-  r=   r\   rS   striprH   existsr(   FILESr]   intr!   
ValueErrorr   r   r!  r"  r   r#  r'  r$  r%  r&  submitted_atr   rD  r   r1  r^   r`   rG  ra   rb   r3  r   rc   rv   rI   )!rP   r  edit_idexisting_proposalrF   rk   	error_msgr   existing_proposalsr[   r!  r"  r   r#  r$  r%  r&  session_type_idr'  rC  rE  rF  docresultru   r1  rG  rd   actionsuccess_msgresponse_datarQ   rM  r3   rB  r9   submit_proposalD  s  






.
  
,r^  c                 C   s:   t jjdd }tjd d}t| d||dS )z/Display all gallery photos with event filteringF)gallery__isnullrk   rl   zevents/gallery.html)r   r   )	r   rG   rH   distinctr   rw   rv   rI   r   )rP   r   r   r3   r3   r9   gallery_view{  s   ra  c                 C   s2   t t|d}tjj|dd}t| d||dS )z+Display gallery photos for a specific eventr   r   z-idzevents/event_gallery.html)rk   r   )r   r   r   rG   rH   rI   r   )rP   r   rk   r   r3   r3   r9   event_gallery_view  s   rb  c                 C   s  t t|d}t }|tjdd }|js+|jrt| d nt| d t	d|dS |j
s:t| d t	d|dS tjj|| jd	 }|rp|jd
krdd|_t |_|  t| d|j d nt| d t	d|dS tjj|| jdd t| d|j d t	d|dS )zHandle event registrationr   rg   rh   z=This event is currently ongoing and cannot be registered for.zThis event has already ended.events:event_detailr   z,Registration for this event is not open yet.r   	cancelled
registeredzSuccessfully re-registered for !z*You are already registered for this event.)rk   rW   r=   zSuccessfully registered for )r   r   r   rF   r   r  r  r   ru   r   registration_openr   rG   rH   rW   rO   r=   r   r^   rc   r   r1  create)rP   r   rk   rF   r}   r   r3   r3   r9   register_for_event  s6   

rj  c                 C   s   t t|d}t t|| jd}|js'|jrt| d nt| d td|dS |j	dkr3t| d nd	|_	|
  t| d
|j d td|dS )z&Handle event registration cancellationr   r   z0Cannot cancel registration for an ongoing event.z,Cannot cancel registration for a past event.rc  rd  attendedzBCannot cancel registration for an event you have already attended.re  zRegistration cancelled for .)r   r   r   rW   r  r  r   ru   r   r=   r^   rc   r   )rP   r   rk   r   r3   r3   r9   cancel_registration  s   
rm  c                 C   s0   t  }tjjddd}d|i}t| d|S )z?Display archived events (events that are more than 2 hours old)r   r   r   r   zevents/archive.html)r   rF   r   rG   rH   rI   r   )rP   rF   r   rQ   r3   r3   r9   archive_view  s
   rn  r   )Mdjango.shortcutsr   r   r   django.contrib.auth.decoratorsr   r   django.contrib.auth.modelsr   django.contribr   django.contrib.authr	   r
   
auth_viewsdjango.utilsr   django.db.modelsr   r   r   r   datetimer   django.httpr   r   django.urlsr   r   	django.dbr   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   formsr&   r'   r(   r)   forms.password_resetr*   rR   re   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r^  ra  rb  rj  rm  rn  r3   r3   r3   r9   <module>   st    D+
&



"

#)4/"'
  8

*
