o
    è°Öhž=  ã                   @   s  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mZmZmZmZ d dlmZmZ 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 Z d dl!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,m-Z- G dd„ deƒZ.G dd„ deƒZ/G dd„ deƒZ0G dd„ deeƒZ1G dd„ deeƒZ2G dd„ deƒZ3G dd„ deeeƒZ4G dd „ d eeeƒZ5G d!d"„ d"eeeƒZ6G d#d$„ d$eeeƒZ7G d%d&„ d&eeeƒZ8G d'd(„ d(eeeƒZ9G d)d*„ d*eeeƒZ:G d+d,„ d,eeeƒZ;G d-d.„ d.eeeƒZ<dS )/é    )ÚrenderÚget_object_or_404Úredirect)ÚLoginRequiredMixinÚUserPassesTestMixin)Úlogin_required)Úmessages)ÚListViewÚ
DetailViewÚ
CreateViewÚ
UpdateViewÚ
DeleteViewÚView)Úreverse_lazyÚreverse)ÚHttpResponseÚHttp404ÚFileResponse)ÚQÚCount)Útimezone)Ú	PaginatorN)Úcanvas)Úletteré   )Ú
JobPostingÚApplication)ÚJobPostingFormÚApplicationFormÚApplicationNotesFormÚJobSearchFormc                   @   s   e Zd ZdZdd„ ZdS )ÚHomeViewz2Home view that redirects users based on their rolec                 C   s0   |j jr|j js|j jrtdƒS tdƒS tdƒS )Nújobs:dashboardzjobs:job_list)ÚuserÚis_authenticatedÚis_adminÚis_stakeholderr   )ÚselfÚrequest© r)   ú&/var/www/html/ictaz-jobs/jobs/views.pyÚget   s
   zHomeView.getN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r+   r)   r)   r)   r*   r!      s    r!   c                       s8   e Zd ZdZeZdZdZdZdd„ Z	‡ fdd„Z
‡  ZS )	ÚJobListViewzPublic job listings viewzjobs/job_list.htmlÚjobsé   c                 C   sÄ   t jjdt ¡  ¡ d d¡}t| jj	ƒ}| 
¡ r]|j d¡}|j d¡}|j d¡}|j d¡}|rE| t|dt|d	B t|d
B ¡}|rM|j|d}|rU|j|d}|r]|j|d
}| d¡S )NÚ	published©ÚstatusÚapplication_deadline__gteÚ	posted_byÚsearchÚemployment_typeÚexperience_levelÚlocation)Útitle__icontains)Údescription__icontains)Úlocation__icontains)r9   )r:   ú-created_at)r   ÚobjectsÚfilterr   ÚnowÚdateÚselect_relatedr    r(   ÚGETÚis_validÚcleaned_datar+   r   Úorder_by)r'   ÚquerysetÚformr8   r9   r:   r;   r)   r)   r*   Úget_queryset'   s6   
þýÿþÿ
zJobListView.get_querysetc                    s6   t ƒ jdi |¤Ž}t| jjƒ|d< |  ¡  ¡ |d< |S )NÚsearch_formÚ
total_jobsr)   )ÚsuperÚget_context_datar    r(   rE   rK   Úcount©r'   ÚkwargsÚcontext©Ú	__class__r)   r*   rO   G   s   zJobListView.get_context_data)r,   r-   r.   r/   r   ÚmodelÚtemplate_nameÚcontext_object_nameÚpaginate_byrK   rO   Ú__classcell__r)   r)   rT   r*   r0       s     r0   c                       ó,   e Zd ZdZeZdZdZ‡ fdd„Z‡  Z	S )ÚJobDetailViewz%Job detail view with application formzjobs/job_detail.htmlÚjobc                    s`   t ƒ jdi |¤Ž}| jjo| jjj|d< | jjjr*tjj	| j| jjd 
¡ |d< |S d|d< |S )NÚ	can_apply©r]   r#   Úalready_appliedFr)   )rN   rO   ÚobjectÚ	is_activer(   r#   r$   r   r@   rA   ÚexistsrQ   rT   r)   r*   rO   T   s   
þýÿzJobDetailView.get_context_data)
r,   r-   r.   r/   r   rV   rW   rX   rO   rZ   r)   r)   rT   r*   r\   N   ó    r\   c                       s`   e Zd ZdZeZeZdZ‡ fdd„Z	‡ fdd„Z
‡ fdd„Zd	d
„ Zdd„ Z‡ fdd„Z‡  ZS )ÚApplicationCreateViewz5Create job application view - requires authenticationzjobs/apply.htmlc                    s„   t t|d d| _| jjst |d¡ td| jjdS tj	j
| j|jd ¡ r5t |d¡ td| jjdS tƒ j|g|¢R i |¤ŽS )NÚpk©rf   z5This job posting is no longer accepting applications.újobs:job_detailr_   z+You have already applied for this position.)r   r   r]   rb   r   Úerrorr   rf   r   r@   rA   r#   rc   ÚwarningrN   Údispatch©r'   r(   ÚargsrR   rT   r)   r*   rk   h   s   zApplicationCreateView.dispatchc                    s$   t ƒ  ¡ }| j|d< | jj|d< |S )Nr]   r#   )rN   Úget_form_kwargsr]   r(   r#   )r'   rR   rT   r)   r*   rn   u   s   

z%ApplicationCreateView.get_form_kwargsc                    s@   | j |j_ | jj|j_tƒ  |¡}|  |j¡ t | jd¡ |S )Nz`Your application has been submitted successfully! You will receive a confirmation email shortly.)	r]   Úinstancer(   r#   rN   Ú
form_validÚsend_acknowledgment_emailr   Úsuccess)r'   rJ   ÚresponserT   r)   r*   rp   {   s   
z ApplicationCreateView.form_validc                 C   s¤   ddl m} ddlm} d|jj› }d|j› d|jj› d|jj› d|jjjp(d	› d
|jj	› d|j
 d¡› d}z||||j|jgdd W dS  tyQ   Y dS w )z&Send acknowledgment email to applicantr   )Ú	send_mail)ÚsettingszApplication Received - z
Dear z6,

Thank you for your application for the position of zê.

We have successfully received your application and it is now being reviewed by our team. 

If you are shortlisted, you will be contacted by either ICTAZ or the respective stakeholder organization.

Application Details:
- Position: z
- Company: zICTAZ Partnerz
- Location: z
- Submitted: z%B %d, %Y at %I:%M %pz/

Best regards,
ICTAZ Jobs Portal Team
        T)Úfail_silentlyN)Údjango.core.mailrt   Údjango.confru   r]   ÚtitleÚapplicant_namer7   Úorganizationr;   Úsubmitted_atÚstrftimeÚDEFAULT_FROM_EMAILÚapplicant_emailÚ	Exception)r'   Úapplicationrt   ru   ÚsubjectÚmessager)   r)   r*   rq   †   s6   ÿý
öõô
óûþz/ApplicationCreateView.send_acknowledgment_emailc                 C   s   t dd| jjidS )Nrh   rf   )rR   )r   r]   rf   ©r'   r)   r)   r*   Úget_success_url«   s   z%ApplicationCreateView.get_success_urlc                    ó    t ƒ jdi |¤Ž}| j|d< |S ©Nr]   r)   ©rN   rO   r]   rQ   rT   r)   r*   rO   ®   ó   
z&ApplicationCreateView.get_context_data)r,   r-   r.   r/   r   rV   r   Ú
form_classrW   rk   rn   rp   rq   r…   rO   rZ   r)   r)   rT   r*   re   b   s    %re   c                   @   s(   e Zd ZdZeZdZdZdZdd„ Z	dS )ÚMyApplicationsViewzUser's applications viewzjobs/my_applications.htmlÚapplicationsé
   c                 C   s   t jj| jjd d¡ d¡S )N)r#   r]   ú-submitted_at)r   r@   rA   r(   r#   rD   rH   r„   r)   r)   r*   rK   »   s
   ÿþzMyApplicationsView.get_querysetN)
r,   r-   r.   r/   r   rV   rW   rX   rY   rK   r)   r)   r)   r*   r‹   ´   s    r‹   c                       r[   )ÚApplicationDetailViewzApplication detail viewzjobs/application_detail.htmlr   c                    sF   t ƒ  ¡ }| jj}|jst‚|j|ks|js|jr!|jj	|kr!|S t‚©N)
rN   Ú
get_objectr(   r#   r$   r   r%   r&   r]   r7   )r'   Úobjr#   rT   r)   r*   r‘   Ç   s   

ÿþz ApplicationDetailView.get_object)
r,   r-   r.   r/   r   rV   rW   rX   r‘   rZ   r)   r)   rT   r*   r   Á   rd   r   c                       s<   e Zd ZdZdZdZdZdd„ Zdd„ Z‡ fd	d
„Z	‡  Z
S )ÚDashboardViewz%Dashboard for admins and stakeholderszjobs/dashboard.htmlr1   r   c                 C   s   | j jjp| j jjp| j jjS r   )r(   r#   r%   r&   Úis_superuserr„   r)   r)   r*   Ú	test_funcß   s   zDashboardView.test_funcc                 C   sP   | j j}|js
|jrtj ¡  d¡ d¡ 	d¡S tjj
|d d¡ d¡ 	d¡S )Nr7   rŒ   r?   )r7   )r(   r#   r%   r”   r   r@   ÚallrD   Úprefetch_relatedrH   rA   ©r'   r#   r)   r)   r*   rK   â   s    zDashboardView.get_querysetc                    s²   t ƒ jdi |¤Ž}| jj}|js|jr3tj ¡ |d< t	j ¡ |d< tjj
dt ¡  ¡ d ¡ |d< |S |  ¡  ¡ |d< t	jj
|d ¡ |d< |  ¡ j
dt ¡  ¡ d ¡ |d< |S )NrM   Útotal_applicationsr3   r4   Úactive_jobs)Újob__posted_byr)   )rN   rO   r(   r#   r%   r”   r   r@   rP   r   rA   r   rB   rC   rK   )r'   rR   rS   r#   rT   r)   r*   rO   é   s2   
þý÷ÿþ
þýzDashboardView.get_context_data)r,   r-   r.   r/   rW   rX   rY   r•   rK   rO   rZ   r)   r)   rT   r*   r“   Ù   s    r“   c                       ó<   e Zd ZdZeZeZdZe	dƒZ
dd„ Z‡ fdd„Z‡  ZS )ÚJobCreateViewzCreate job posting viewújobs/job_form.htmlr"   c                 C   s
   | j jjS r   )r(   r#   r%   r„   r)   r)   r*   r•     s   
zJobCreateView.test_funcc                    s&   | j j|j_t | j d¡ tƒ  |¡S )Nz!Job posting created successfully!)r(   r#   ro   r7   r   rr   rN   rp   ©r'   rJ   rT   r)   r*   rp     s   zJobCreateView.form_valid©r,   r-   r.   r/   r   rV   r   rŠ   rW   r   Úsuccess_urlr•   rp   rZ   r)   r)   rT   r*   r     s    r   c                       rœ   )ÚJobUpdateViewzUpdate job posting viewrž   r"   c                 C   ó   |   ¡ }| jj}|jS r   ©r‘   r(   r#   r%   ©r'   r]   r#   r)   r)   r*   r•     ó   zJobUpdateView.test_funcc                    s   t  | jd¡ tƒ  |¡S )Nz!Job posting updated successfully!)r   rr   r(   rN   rp   rŸ   rT   r)   r*   rp     s   zJobUpdateView.form_validr    r)   r)   rT   r*   r¢     s    r¢   c                       s8   e Zd ZdZeZdZedƒZdd„ Z	‡ fdd„Z
‡  ZS )ÚJobDeleteViewzDelete job posting viewzjobs/job_confirm_delete.htmlr"   c                 C   r£   r   r¤   r¥   r)   r)   r*   r•   (  r¦   zJobDeleteView.test_funcc                    s&   t  |d¡ tƒ j|g|¢R i |¤ŽS )Nz!Job posting deleted successfully!)r   rr   rN   Údeleterl   rT   r)   r*   r¨   -  s   zJobDeleteView.delete)r,   r-   r.   r/   r   rV   rW   r   r¡   r•   r¨   rZ   r)   r)   rT   r*   r§   "  s    r§   c                       sL   e Zd ZdZeZdZdZdZ‡ fdd„Z	dd„ Z
d	d
„ Z‡ fdd„Z‡  ZS )ÚJobApplicationsViewz$View applications for a specific jobzjobs/job_applications.htmlrŒ   é   c                    s,   t t|d d| _tƒ j|g|¢R i |¤ŽS )Nrf   rg   )r   r   r]   rN   rk   rl   rT   r)   r*   rk   9  s   zJobApplicationsView.dispatchc                 C   s    | j j}|jp|jo| jj|kS r   )r(   r#   r%   r&   r]   r7   r˜   r)   r)   r*   r•   =  s   zJobApplicationsView.test_funcc                 C   s   t jj| jd d¡S )N©r]   rŽ   )r   r@   rA   r]   rH   r„   r)   r)   r*   rK   A  s   z JobApplicationsView.get_querysetc                    r†   r‡   rˆ   rQ   rT   r)   r*   rO   D  r‰   z$JobApplicationsView.get_context_data)r,   r-   r.   r/   r   rV   rW   rX   rY   rk   r•   rK   rO   rZ   r)   r)   rT   r*   r©   2  s    r©   c                   @   ó$   e Zd ZdZeZdd„ Zdd„ ZdS )ÚDownloadResumeViewzSecure resume download viewc                 C   ó2   |   ¡ }| jj}|jp|jo|jj|kp|j|kS r   ©r‘   r(   r#   r%   r&   r]   r7   ©r'   r   r#   r)   r)   r*   r•   N  ó   ÿþzDownloadResumeView.test_funcc                 O   ó2   |   ¡ }|jrt|j ¡ d|j› dd}|S t‚)NTz_resume.pdf©Úas_attachmentÚfilename)r‘   Úresumer   Úopenrz   r   ©r'   r(   rm   rR   r   rs   r)   r)   r*   r+   U  ó   
ýzDownloadResumeView.getN©r,   r-   r.   r/   r   rV   r•   r+   r)   r)   r)   r*   r­   J  ó
    r­   c                   @   r¬   )ÚDownloadDocumentsViewz)Secure additional documents download viewc                 C   r®   r   r¯   r°   r)   r)   r*   r•   e  r±   zDownloadDocumentsView.test_funcc                 O   r²   )NTz_documents.pdfr³   )r‘   Úadditional_documentsr   r·   rz   r   r¸   r)   r)   r*   r+   l  r¹   zDownloadDocumentsView.getNrº   r)   r)   r)   r*   r¼   a  r»   r¼   c                   @   r¬   )ÚExportApplicationsViewzExport applications to CSVc                 C   s&   |   ¡ }| jj}|jp|jo|j|kS r   )r‘   r(   r#   r%   r&   r7   r¥   r)   r)   r*   r•   |  s   z ExportApplicationsView.test_funcc           	   
   O   s’   |   ¡ }tjj|d d¡}tdd}d|j› d|d< t |¡}| 	g d¢¡ |D ]}| 	|j
|j|j|jp8d	|j d
¡|jrBdndg¡ q*|S )Nr«   rŽ   ztext/csv)Úcontent_typezattachment; filename="z_applications.csv"zContent-Disposition)zApplicant NameÚEmailÚPhonezMembership NumberzSubmitted Atz	Is MemberzN/Az%Y-%m-%d %H:%MÚYesÚNo)r‘   r   r@   rA   rH   r   ry   ÚcsvÚwriterÚwriterowrz   r   Úapplicant_phoneÚmembership_numberr|   r}   Ú	is_member)	r'   r(   rm   rR   r]   rŒ   rs   rÅ   Úappr)   r)   r*   r+     s    


ú	zExportApplicationsView.getN)r,   r-   r.   r/   r   rV   r•   r+   r)   r)   r)   r*   r¾   x  s
    r¾   c                       s@   e Zd ZdZeZdZg d¢Zdd„ Zdd„ Z	‡ fdd	„Z
‡  ZS )
ÚApplicationUpdateViewz)Update application view for regular userszjobs/application_update.html)Úcover_letterr¶   Úictaz_certificater½   c                 C   s   |   ¡ }| jj|jkS r   )r‘   r(   r#   )r'   r   r)   r)   r*   r•   ¡  s   zApplicationUpdateView.test_funcc                 C   s   t dƒS )Nzjobs:my_applications)r   r„   r)   r)   r*   r…   ¥  s   z%ApplicationUpdateView.get_success_urlc                    sV   |j dd}|  ¡ }|j|_|j|_|j|_|j|_|  ¡  t | jd¡ t	ƒ  
|¡S )NF)Úcommitz!Application updated successfully!)Úsaver‘   rz   r   rÇ   rÈ   r   rr   r(   rN   rp   )r'   rJ   r   ÚoriginalrT   r)   r*   rp   ¨  s   z ApplicationUpdateView.form_valid)r,   r-   r.   r/   r   rV   rW   Úfieldsr•   r…   rp   rZ   r)   r)   rT   r*   rË   ›  s    rË   )=Údjango.shortcutsr   r   r   Údjango.contrib.auth.mixinsr   r   Údjango.contrib.auth.decoratorsr   Údjango.contribr   Údjango.views.genericr	   r
   r   r   r   r   Údjango.urlsr   r   Údjango.httpr   r   r   Údjango.db.modelsr   r   Údjango.utilsr   Údjango.core.paginatorr   rÄ   ÚosÚreportlab.pdfgenr   Úreportlab.lib.pagesizesr   Úmodelsr   r   Úformsr   r   r   r    r!   r0   r\   re   r‹   r   r“   r   r¢   r§   r©   r­   r¼   r¾   rË   r)   r)   r)   r*   Ú<module>   s>     .R(#