o
    #.h                     @   sN  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- ddl.m/Z/m0Z0m1Z1m2Z2 ddl3m4Z4 dd Z5dd Z6edd Z7eedd dd Z8eedd 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dEd+d,Z>d-d. Z?d/d0 Z@d1d2 ZAd3d4 ZBd5d6 ZCd7d8 ZDed9d: ZEd;d< ZFd=d> ZGed?d@ ZHedAdB ZIdCdD ZJd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PublicationTypeCarouselImageSponsor)UserRegistrationFormUserProfileFormProposalFormSpeakerForm)CustomPasswordResetFormc                    s   t  }tjjddd}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orderc                       g | ]
} ||d   qS     .0isponsorsr/   */var/www/html/bloggers_ems/events/views.py
<listcomp>0       zindex.<locals>.<listcomp>r   r.   upcoming)statusdate_time__gte	date_timeN   )latest_eventslatest_announcementcarousel_imagessponsor_groupsnowzevents/index.html)r   rA   r"   objectsfilterorder_bylistr#   rangelenr   firstr   )requestrA   r?   r@   r=   r>   contextr/   r3   r5   index'   s.   
rK   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$   rL   is_validsaver   rB   get_or_creater   r	   events.utils.email_utilsrR   	Exceptionprintr   successr   r   )rI   rT   rP   rO   rR   er/   r/   r5   registerK   s,   


r^   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rP   event-event__date_timeUpcominginfoOngoingr\   Archived	secondaryNuserszevents/user_list.html)rP   is_staffis_superuserr   errorr   r   rB   allrD   r   rA   r   r   rC   select_relatedcountregistration_countrH   rd   r;   latest_event_statuslatest_event_colorlatest_eventr   )	rI   rk   rA   two_hours_agorP   registrations
latest_regrd   rJ   r/   r/   r5   	user_listg   s2   

ry   c                 C      | j S Nrm   ur/   r/   r5   <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XMLHttpRequestr\   	Superuserz is now a superuserr9   rO   messageevents:user_list)r   r   rm   rl   rW   headersgetr   r   r   r\   r   rI   r   rP   r/   r/   r5   
make_admin   s   
r   c                 C   rz   r{   r|   r}   r/   r/   r5   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   rn   z+You cannot remove your own admin privilegesr9   r   r   Fr\   StaffAttendeezAdmin privileges removed from r   )r   r   rP   r   r   r   r   rn   r   rm   rW   rl   r   r\   r   r/   r/   r5   remove_admin   s&   

r   c                 C      | j p| jS r{   rl   rm   r}   r/   r/   r5   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   r\   r   z is now a staff memberr   r   )r   r   rl   rW   r   r   r   r   r   r\   r   r   r/   r/   r5   
make_staff   s   
r   c                 C   r   r{   r   r}   r/   r/   r5   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   rn   z*Cannot remove staff status from superusersr   r   z+You cannot remove your own staff privilegesFr\   r   zStaff privileges removed from r   )r   r   rm   r   r   r   r   rn   r   rP   rl   rW   r   r\   r   r/   r/   r5   remove_staff   s6   

r   c                 C   r   r{   r   r}   r/   r/   r5   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 Loginr_   r   r   r   ActiveInactive%Y-%m-%d %H:%M:%SNever)r   csvwriterwriterowr   rB   ro   rD   rm   rl   r   email
first_name	last_namer*   date_joinedstrftime
last_login)rI   responser   rk   rP   rO   r/   r/   r5   export_users_csv   s$   


r   c                 C   r   r{   r   r}   r/   r/   r5   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   rd   rP   user__userprofiler   )r   r   r   titler   r   r   r   rB   rC   rp   rP   r   r   get_full_nameuserprofileorganizationphone_numberregistration_dater   get_status_display)rI   event_idrd   r   r   rw   registrationr/   r/   r5   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.rS   r   r`   ra   rc   rd   rf   rg   rh   r\   ri   rj   )profile_userrw   zevents/user_profile.html)rP   rl   rm   r   r   rn   r   r   r   r   rA   r   r   rB   rC   rp   rd   r;   r9   status_colorr   )	rI   r   r   rA   rv   rw   r   rd   rJ   r/   r/   r5   user_profile(  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   r/   xr/   r/   r5   r   j  s    z#publications_view.<locals>.<lambda>keyr   rN   zevents/publications.html)publicationspublication_types)r    rB   rC   excluderp   rD   appendr   r   r   r   published_atr   rN   r   r   r   sortr!   ro   r   )rI   r   all_publicationspublicationr   r/   r/   r5   publications_viewL  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 optionsr9   ro   r8   r9   r;   )upcoming_eventsongoing_eventsarchived_eventscurrent_statusongoingarchived
-date_timeN   T)r   r   r   show_all_archivedr   rA   zevents/event_list.html)
GETr   r   rA   r   rB   rC   rD   noner   )rI   r9   rA   eventsrJ   r8   r   r   r/   r/   r5   
event_listu  sD   	r   c              
      s   t t|d}t }|j }t|jjdd	d  fddt
dt dD }|j }d	}| jjr@tjj|| jd
 }|j 	dd}|j }	||jrVdn|jr[dnd||||||	|d	}
t| d|
S )zEvent detail view.)pkTr)   r+   c                    r,   r-   r/   r0   r3   r/   r5   r6     r7   z event_detail.<locals>.<listcomp>r   r.   Nrd   rP   session_timespeakersliverecorded	scheduled)	rd   stream_statusr   r@   cfpsagenda_itemsuser_registrationgallery_itemsrA   zevents/event_detail.html)r   r   r   rA   r   ro   rE   r4   rC   rD   rF   rG   r   rP   is_authenticatedr   rB   rH   agendasprefetch_relatedgallery
is_ongoingis_archivedr   )rI   r   rd   rA   r   r@   r   r   r   r   rJ   r/   r3   r5   event_detail  s6   


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 r/   )is_upcomingr1   rd   r/   r/   r5   r6         z"speaker_detail.<locals>.<listcomp>c                 S   r   r/   )r   r   r/   r/   r5   r6     r   c                 S   r   r/   )r   r   r/   r/   r5   r6     r   c                 S   rz   r{   r;   r   r/   r/   r5   r     r   z speaker_detail.<locals>.<lambda>)r   c                 S   rz   r{   r   r   r/   r/   r5   r     r   Tr   zevents/speaker_detail.html)speakerr   past_eventsrA   )	r   r   r   rA   r   ro   sortedr   r   )	rI   
speaker_idr   rA   r   r   r   r  active_eventsr/   r/   r5   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 submissionsopen)r9   submission_deadline__gteevent__date_time__gtrd   submission_deadline)	submittercfp
cfp__eventz-submitted_atzevents/cfp_list.html)r   user_proposalsrA   )r   rA   r   rB   rC   rp   rD   rP   r   r   r  rd   r   r   r   r   )rI   rA   	open_cfpsr  proposalrd   r/   r/   r5   cfp_list  s:   
r  c                 C   sr   t t|d}t }tjj|d}|j}|j}|j	}|j
}|jdko(|j|ko(|}	|||	||||d}
t| d|
S )z?Display detailed information about a specific Call for Proposalr   )r  r  )r  	proposals
can_submitrA   r   r   r   zevents/cfp_detail.html)r   r   r   rA   r   rB   rC   rd   r   r   r   r9   r	  r   )rI   cfp_idr  rA   r  rd   r   r   r   r  rJ   r/   r/   r5   
cfp_detail  s*   
	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_t _!|sd!_ fd"d#}
g }g }| jd$}|r|
|d%d&d'}|r|d(r|"|d)  n|"|d)  | jd*}|r|
|d+d,d-}|r|d(r|"|d)  n|"|d)  |rd.}| jddkrtd|||d/S |D ]	}t	
| | qt#| d0|	 ||||d1S |D ]	}t	$| | q  |sKzd2d3l%m&} | W n t'yJ } zt(d4|  W Y d}~nd}~ww |rPd5nd!}d6| d7}|s_|d87 }|rp|d9d:)d;d< |D  7 }d=|t*d	d>}|r||d?< | jddkrt|S t	+| | |D ]	}t	$| | qtd	S nt|d}	|	 ||dut d@}t#| d0 |tj,|dAS )Bz<Handle submission and editing of proposals with file uploadsrd   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   rn   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   rL   r   r   )r  r
  title__iexactzA proposal with the title "z" already exists.)instanceF)commit	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
} |dkrl|jj jjdjrejnd d }	n|jj jjdjr{jnd d }	|	rdd|  dddS d S )Nc                 3   s     | ]} j  |V  qd S r{   )rN   lowerendswith)r1   extr   r/   r5   	<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   Presentation slides)presentation_slides__containsr  r   )supporting_document__containsr  	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   rB   rC   rN   rd   r   r   rH   r  )
r   allowed_extensionsmax_size	file_typer'  	file_hashchunkcontent_hashr   existingr  r  r  r   r5   validate_file  sP   

z&submit_proposal.<locals>.validate_filepresentation_slides).pdfz.pptz.pptxi   r   r$  r   supporting_document)r8  i  P zSupporting documentz Please fix the following errors:)r9   r   errorswarningszevents/submit_proposal.html)rT   r  r  r:  r;  rA   r   ) 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- Nr/   )r1   wr/   r/   r5   r  +  s    z"submit_proposal.<locals>.<genexpr>r\   )r9   r   redirect_urlr;  )rT   r  r  is_editrA   )r  r  proposal_typesrA   )-r   r   rB   rp   r   r   r   rP   DoesNotExistr   rn   r   r   rA   rd   r
  r   r   r   r   r   r  r9   rU   rL   striprC   existsr&   FILESrV   rW   r  submitted_atr   r   r$  rY   r<  rZ   r[   r&  r   r\   PRESENTATION_TYPES)rI   r  edit_idexisting_proposalrA   rd   	error_msgr   existing_proposalsrT   r6  r:  r;  slidesresultdocrn   r$  r<  r]   actionsuccess_msgresponse_datarJ   r/   r5  r5   submit_proposal0  sx  





4
  
rS  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__isnullrd   re   zevents/gallery.html)r   r   )	r   rB   rC   distinctr   rp   ro   rD   r   )rI   r   r   r/   r/   r5   gallery_viewN  s   rV  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)rd   r   )r   r   r   rB   rC   rD   r   )rI   r   rd   r   r/   r/   r5   event_gallery_viewX  s   rW  c                 C   s   t t|d}t }|tjdd }|js+|jrt| d nt| d t	d|dS t
jj|| jd }|ra|jd	krUd
|_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   r`   ra   z=This event is currently ongoing and cannot be registered for.zThis event has already ended.events:event_detailr   r   	cancelled
registeredzSuccessfully re-registered for !z*You are already registered for this event.)rd   rP   r9   zSuccessfully registered for )r   r   r   rA   r   r   r   r   rn   r   r   rB   rC   rP   rH   r9   r   rW   r\   r   r$  create)rI   r   rd   rA   rv   r   r/   r/   r5   register_for_eventc  s0   

r^  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.rX  rY  attendedzBCannot cancel registration for an event you have already attended.rZ  zRegistration cancelled for .)r   r   r   rP   r   r   r   rn   r   r9   rW   r\   r   )rI   r   rd   r   r/   r/   r5   cancel_registration  s   
ra  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   rA   r   rB   rC   rD   r   )rI   rA   r   rJ   r/   r/   r5   archive_view  s
   rb  r{   )K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#   formsr$   r%   r&   r'   forms.password_resetr(   rK   r^   ry   r   r   r   r   r   r   r   r   r   r   r  r  r  rS  rV  rW  r^  ra  rb  r/   r/   r/   r5   <module>   st    <$
&



"

#)4+" 
  

%
