Send jnf response as pdf attachment (#107)
* Attach jnf response pdf after verifying email. * add pdfkit to requirments.txt
This commit is contained in:
parent
40e2075617
commit
f38f013cee
|
@ -260,36 +260,21 @@ def verifyEmail(request):
|
||||||
|
|
||||||
if send_email_to_company:
|
if send_email_to_company:
|
||||||
# Email sending part.
|
# Email sending part.
|
||||||
details = model_to_dict(opening, fields=[field.name for field in Placement._meta.fields],
|
pdfhtml = opening_description_table_html(opening)
|
||||||
exclude=['id', 'is_company_details_pdf', 'offer_accepted', 'is_description_pdf',
|
name = opening.company_name + '_jnf_response.pdf'
|
||||||
'is_compensation_details_pdf', 'is_selection_procedure_details_pdf',
|
attachment_jnf_respone = {
|
||||||
'email_verified'])
|
"name": name,
|
||||||
keys = list(details.keys())
|
"html": pdfhtml,
|
||||||
newdetails = {}
|
}
|
||||||
for key in keys:
|
|
||||||
if isinstance(details[key], list):
|
|
||||||
details[key] = {"details": details[key], "type": ["list"]}
|
|
||||||
if key in ['website', 'company_details_pdf_names', 'description_pdf_names',
|
|
||||||
'compensation_details_pdf_names', 'selection_procedure_pdf_names']:
|
|
||||||
if key == 'website':
|
|
||||||
details[key] = {"details": details[key], "type": ["link"]}
|
|
||||||
else:
|
|
||||||
details[key] = {"details": details[key]["details"], "type": ["list", "link"],
|
|
||||||
"link": LINK_TO_STORAGE_COMPANY_ATTACHMENT + opening.id + "/"}
|
|
||||||
new_key = key.replace('_', ' ')
|
|
||||||
if key == 'company_details_pdf_names':
|
|
||||||
new_key = 'company details pdf'
|
|
||||||
newdetails[new_key] = details[key]
|
|
||||||
data = {
|
data = {
|
||||||
"designation": opening.designation,
|
"designation": opening.designation,
|
||||||
"opening_type": PLACEMENT,
|
"opening_type": PLACEMENT,
|
||||||
"opening_link": PLACEMENT_OPENING_URL.format(id=opening.id), # Some Changes here too
|
"opening_link": PLACEMENT_OPENING_URL.format(id=opening.id), # Some Changes here too
|
||||||
"company_name": opening.company_name,
|
"company_name": opening.company_name,
|
||||||
"data": newdetails
|
|
||||||
}
|
}
|
||||||
json_data = json.dumps(data, default=str)
|
json_data = json.dumps(data, default=str)
|
||||||
sendEmail(opening.email, COMPANY_OPENING_SUBMITTED_TEMPLATE_SUBJECT.format(id=opening.id), json_data,
|
sendEmail(opening.email, COMPANY_OPENING_SUBMITTED_TEMPLATE_SUBJECT.format(id=opening.id), json_data,
|
||||||
COMPANY_OPENING_SUBMITTED_TEMPLATE)
|
COMPANY_OPENING_SUBMITTED_TEMPLATE, attachment_jnf_respone)
|
||||||
|
|
||||||
return Response({'action': "Verify Email", 'message': "Email Verified Successfully"},
|
return Response({'action': "Verify Email", 'message': "Email Verified Successfully"},
|
||||||
status=status.HTTP_200_OK)
|
status=status.HTTP_200_OK)
|
||||||
|
|
|
@ -134,6 +134,9 @@ COMPANY_OPENING_SUBMITTED_TEMPLATE = 'company_opening_submitted.html'
|
||||||
STUDENT_APPLICATION_STATUS_SELECTED_TEMPLATE = 'student_application_status_selected.html'
|
STUDENT_APPLICATION_STATUS_SELECTED_TEMPLATE = 'student_application_status_selected.html'
|
||||||
STUDENT_APPLICATION_STATUS_NOT_SELECTED_TEMPLATE = 'student_application_status_not_selected.html'
|
STUDENT_APPLICATION_STATUS_NOT_SELECTED_TEMPLATE = 'student_application_status_not_selected.html'
|
||||||
COMPANY_EMAIL_VERIFICATION_TEMPLATE = 'company_email_verification.html'
|
COMPANY_EMAIL_VERIFICATION_TEMPLATE = 'company_email_verification.html'
|
||||||
|
COMPANY_JNF_RESPONSE_TEMPLATE = 'company_jnf_response.html'
|
||||||
|
|
||||||
APPLICATION_CSV_COL_NAMES = ['Applied At', 'Roll No.', 'Name', 'Email', 'Phone Number', 'Branch', 'Batch', 'CPI',
|
APPLICATION_CSV_COL_NAMES = ['Applied At', 'Roll No.', 'Name', 'Email', 'Phone Number', 'Branch', 'Batch', 'CPI',
|
||||||
'Resume', 'Selected', ]
|
'Resume', 'Selected', ]
|
||||||
|
|
||||||
|
PDF_FILES_SERVING_ENDPOINT = 'http://localhost:5500/CDC_Backend/Storage/Company_Attachments/' # TODO: Change this to actual URL
|
||||||
|
|
|
@ -12,6 +12,7 @@ import background_task
|
||||||
import jwt
|
import jwt
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.mail import EmailMultiAlternatives
|
from django.core.mail import EmailMultiAlternatives
|
||||||
|
from django.forms.models import model_to_dict
|
||||||
from django.http import Http404
|
from django.http import Http404
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
from django.template.loader import render_to_string
|
from django.template.loader import render_to_string
|
||||||
|
@ -21,9 +22,10 @@ from google.oauth2 import id_token
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
import requests as rq
|
import requests as rq
|
||||||
|
import pdfkit
|
||||||
|
|
||||||
from .constants import *
|
from .constants import *
|
||||||
from .models import User, PrePlacementOffer, PlacementApplication
|
from .models import User, PrePlacementOffer, PlacementApplication, Placement
|
||||||
|
|
||||||
logger = logging.getLogger('db')
|
logger = logging.getLogger('db')
|
||||||
|
|
||||||
|
@ -134,7 +136,7 @@ def saveFile(file, location):
|
||||||
|
|
||||||
|
|
||||||
@background_task.background(schedule=10)
|
@background_task.background(schedule=10)
|
||||||
def sendEmail(email_to, subject, data, template):
|
def sendEmail(email_to, subject, data, template, attachment_jnf_respone=None):
|
||||||
try:
|
try:
|
||||||
if not isinstance(data, dict):
|
if not isinstance(data, dict):
|
||||||
data = json.loads(data)
|
data = json.loads(data)
|
||||||
|
@ -146,6 +148,10 @@ def sendEmail(email_to, subject, data, template):
|
||||||
|
|
||||||
msg = EmailMultiAlternatives(subject, text_content, email_from, recipient_list)
|
msg = EmailMultiAlternatives(subject, text_content, email_from, recipient_list)
|
||||||
msg.attach_alternative(html_content, "text/html")
|
msg.attach_alternative(html_content, "text/html")
|
||||||
|
if attachment_jnf_respone:
|
||||||
|
logger.info(attachment_jnf_respone)
|
||||||
|
pdf = pdfkit.from_string(attachment_jnf_respone['html'], False,options={"--enable-local-file-access": "",'--dpi':'96'})
|
||||||
|
msg.attach(attachment_jnf_respone['name'], pdf, 'application/pdf')
|
||||||
msg.send()
|
msg.send()
|
||||||
return True
|
return True
|
||||||
except:
|
except:
|
||||||
|
@ -261,4 +267,29 @@ def verify_recaptcha(request):
|
||||||
print(sys.exc_info())
|
print(sys.exc_info())
|
||||||
print(traceback.format_exc())
|
print(traceback.format_exc())
|
||||||
logger.warning("Utils - verify_recaptcha: " + str(sys.exc_info()))
|
logger.warning("Utils - verify_recaptcha: " + str(sys.exc_info()))
|
||||||
return False, "_"
|
return False, "_"
|
||||||
|
|
||||||
|
def opening_description_table_html(opening):
|
||||||
|
details = model_to_dict(opening, fields = [field.name for field in Placement._meta.fields], exclude = ['id','is_company_details_pdf','offer_accepted','is_description_pdf','is_compensation_details_pdf','is_selection_procedure_details_pdf','email_verified'])
|
||||||
|
keys = list(details.keys())
|
||||||
|
newdetails = {}
|
||||||
|
for key in keys:
|
||||||
|
if isinstance(details[key], list):
|
||||||
|
details[key] = {"details": details[key], "type": ["list"]}
|
||||||
|
if key in ['website','company_details_pdf_names','description_pdf_names','compensation_details_pdf_names','selection_procedure_pdf_names']:
|
||||||
|
if key == 'website':
|
||||||
|
details[key] = {"details": details[key], "type": ["link"]}
|
||||||
|
else:
|
||||||
|
details[key] = {"details": details[key]["details"], "type": ["list","link"], "link": PDF_FILES_SERVING_ENDPOINT+opening.id+"/"}
|
||||||
|
new_key = key.replace('_',' ')
|
||||||
|
if key.endswith(' names'):
|
||||||
|
new_key = key[:-6]
|
||||||
|
new_key = new_key.capitalize()
|
||||||
|
newdetails[new_key] = details[key]
|
||||||
|
imagepath = os.path.abspath('./templates/image.png')
|
||||||
|
print(imagepath)
|
||||||
|
data = {
|
||||||
|
"data": newdetails,
|
||||||
|
"imgpath": imagepath
|
||||||
|
}
|
||||||
|
return render_to_string(COMPANY_JNF_RESPONSE_TEMPLATE, data)
|
|
@ -0,0 +1,61 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<style>
|
||||||
|
#details_table tr:nth-child(even) {background: #FFF}
|
||||||
|
#details_table tr:nth-child(odd) {background: #bfe3f3}
|
||||||
|
#details_table td {padding: 10px; width: 50%;}
|
||||||
|
#details_table{
|
||||||
|
border: #334878 1px solid;
|
||||||
|
border-collapse: collapse;
|
||||||
|
width: 80%;
|
||||||
|
margin:auto;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<title>Document</title>
|
||||||
|
</head>
|
||||||
|
<body style="margin: 0;">
|
||||||
|
|
||||||
|
<header style="background-color: #334878;"><img style="height: 3cm; margin: auto; display: block; padding: 0.5cm;" src='{{imgpath}}' alt="cdc logo"></header>
|
||||||
|
<h1 style="text-align: center;"> Job Notification Form Response</h1>
|
||||||
|
<table id="details_table">
|
||||||
|
{% for key, value in data.items %}
|
||||||
|
<tr>
|
||||||
|
<td >
|
||||||
|
{{ key }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{% if 'list' in value.type %}
|
||||||
|
|
||||||
|
{% for item in value.details %}
|
||||||
|
<li>
|
||||||
|
{% if 'link' in value.type and value.link %}
|
||||||
|
<a href="{{value.link|add:item}}">{{ item }}</a>
|
||||||
|
{% elif 'link' in value.type %}
|
||||||
|
<a href="{{item}}">{{ item }}</a>
|
||||||
|
{% else %}
|
||||||
|
{{ item }}
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
{% if 'link' in value.type %}
|
||||||
|
<a href="{{ value.details }}">{{ value.details }}</a>
|
||||||
|
{% else %}
|
||||||
|
{{ value }}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
<p style="margin-left: 10%;">In case of any descripency regarding above details, please contact <a href="mailto:cdc@iitdh.ac.in">cdc@iitdh.ac.in</a>
|
||||||
|
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -21,6 +21,7 @@ jsonfield==3.1.0
|
||||||
lazy-object-proxy==1.6.0
|
lazy-object-proxy==1.6.0
|
||||||
Markdown==3.3.6
|
Markdown==3.3.6
|
||||||
mccabe==0.7.0
|
mccabe==0.7.0
|
||||||
|
pdfkit==1.0.0
|
||||||
platformdirs==2.5.1
|
platformdirs==2.5.1
|
||||||
psycopg2-binary==2.9.3
|
psycopg2-binary==2.9.3
|
||||||
pyasn1==0.4.8
|
pyasn1==0.4.8
|
||||||
|
|
Loading…
Reference in New Issue