835 lines
37 KiB
Python
835 lines
37 KiB
Python
import csv
|
|
import zipfile
|
|
|
|
from rest_framework.decorators import api_view
|
|
|
|
from .serializers import *
|
|
from .utils import *
|
|
|
|
|
|
@api_view(['POST'])
|
|
@isAuthorized([ADMIN])
|
|
@precheck([OPENING_ID, STUDENT_LIST])
|
|
def markStatus(request, id, email, user_type):
|
|
try:
|
|
data = request.data
|
|
if OPENING_TYPE in data:
|
|
opening_type= data[OPENING_TYPE] #not to break the code
|
|
else:
|
|
opening_type= "Placement"
|
|
if opening_type == "Internship":
|
|
applications = InternshipApplication.objects.filter(internship_id=data[OPENING_ID])
|
|
else:
|
|
applications = PlacementApplication.objects.filter(placement_id=data[OPENING_ID])
|
|
for i in data[STUDENT_LIST]:
|
|
application = applications.filter(student__roll_no=i[STUDENT_ID]) # Filtering student's application
|
|
if len(application) > 0:
|
|
application = application[0]
|
|
if not application.selected:
|
|
if i[STUDENT_SELECTED] == True:
|
|
application.selected = True
|
|
else:
|
|
application.selected = False
|
|
else:
|
|
raise ValueError("Student already selected")
|
|
|
|
email = str(application.student.roll_no) + "@iitdh.ac.in" # Only allowing for IITDh emails
|
|
if opening_type == "Internship":
|
|
subject = STUDENT_APPLICATION_STATUS_TEMPLATE_SUBJECT.format(
|
|
company_name=application.internship.company_name,id=application.id)
|
|
data = {
|
|
"company_name": application.internship.company_name,
|
|
"designation": application.internship.designation,
|
|
"student_name": application.student.name
|
|
}
|
|
else:
|
|
subject = STUDENT_APPLICATION_STATUS_TEMPLATE_SUBJECT.format(
|
|
company_name=application.placement.company_name,
|
|
id=application.id)
|
|
data = {
|
|
"company_name": application.placement.company_name,
|
|
"designation": application.placement.designation,
|
|
"student_name": application.student.name
|
|
}
|
|
if application.selected: # Sending corresponding email to students
|
|
sendEmail(email, subject, data, STUDENT_APPLICATION_STATUS_SELECTED_TEMPLATE)
|
|
else:
|
|
sendEmail(email, subject, data, STUDENT_APPLICATION_STATUS_NOT_SELECTED_TEMPLATE)
|
|
application.chaged_by = get_object_or_404(User, id=id)
|
|
application.save()
|
|
else:
|
|
raise ValueError("Student - " + str(i[STUDENT_ID]) + " didn't apply for this opening")
|
|
return Response({'action': "Mark Status", 'message': "Marked Status"},
|
|
status=status.HTTP_200_OK)
|
|
|
|
except ValueError as e:
|
|
return Response({'action': "Mark Status", 'message': str(e)},
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
except:
|
|
logger.warning("Mark Status: " + str(sys.exc_info()))
|
|
return Response({'action': "Mark Status", 'message': "Something went wrong"},
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
@api_view(['GET'])
|
|
@isAuthorized([ADMIN])
|
|
def getDashboard(request, id, email, user_type):
|
|
try:
|
|
placements = Placement.objects.all().order_by('-created_at')
|
|
ongoing = placements.filter(deadline_datetime__gt=timezone.now(), offer_accepted=True, email_verified=True)
|
|
previous = placements.exclude(deadline_datetime__gt=timezone.now()).filter(
|
|
offer_accepted=True, email_verified=True)
|
|
new = placements.filter(offer_accepted__isnull=True, email_verified=True)
|
|
internships=Internship.objects.all().order_by('-created_at')
|
|
ongoing_internships = internships.filter(deadline_datetime__gt=timezone.now(), offer_accepted=True, email_verified=True)
|
|
previous_internships = internships.exclude(deadline_datetime__gt=timezone.now()).filter(
|
|
offer_accepted=True, email_verified=True)
|
|
new_internships = internships.filter(offer_accepted__isnull=True, email_verified=True)
|
|
ongoing = PlacementSerializerForAdmin(ongoing, many=True).data
|
|
previous = PlacementSerializerForAdmin(previous, many=True).data
|
|
new = PlacementSerializerForAdmin(new, many=True).data
|
|
ongoing_internships = InternshipSerializerForAdmin(ongoing_internships, many=True).data
|
|
previous_internships = InternshipSerializerForAdmin(previous_internships, many=True).data
|
|
new_internships = InternshipSerializerForAdmin(new_internships, many=True).data
|
|
|
|
return Response(
|
|
{'action': "Get Dashboard - Admin", 'message': "Data Found", "ongoing": ongoing, "previous": previous,
|
|
"new": new, "ongoing_internships": ongoing_internships, "previous_internships": previous_internships,
|
|
"new_internships": new_internships},
|
|
status=status.HTTP_200_OK)
|
|
except Http404:
|
|
return Response({'action': "Get Dashboard - Admin", 'message': 'Student Not Found'},
|
|
status=status.HTTP_404_NOT_FOUND)
|
|
except:
|
|
logger.warning("Get Dashboard - Admin: " + str(sys.exc_info()))
|
|
return Response({'action': "Get Dashboard - Admin", 'message': "Something went wrong"},
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
@api_view(['POST'])
|
|
@isAuthorized([ADMIN])
|
|
@precheck([OPENING_ID, DEADLINE_DATETIME])
|
|
def updateDeadline(request, id, email, user_type):
|
|
try:
|
|
data = request.data
|
|
if OPENING_TYPE in data:
|
|
opening_type= data[OPENING_TYPE]
|
|
else:
|
|
opening_type= "Placement"
|
|
if opening_type == "Internship":
|
|
opening = get_object_or_404(Internship, pk=data[OPENING_ID])
|
|
else:
|
|
opening = get_object_or_404(Placement, pk=data[OPENING_ID])
|
|
|
|
# Updating deadline date with correct format in datetime field
|
|
opening.deadline_datetime = datetime.datetime.strptime(data[DEADLINE_DATETIME], '%Y-%m-%d %H:%M:%S %z')
|
|
opening.changed_by = get_object_or_404(User, id=id)
|
|
opening.save()
|
|
if opening.offer_accepted:
|
|
send_opening_to_notifications_service(id=opening.id,name=opening.company_name,deadline=data[DEADLINE_DATETIME],role=opening.designation,opening_type=opening_type)
|
|
return Response({'action': "Update Deadline", 'message': "Deadline Updated"},
|
|
status=status.HTTP_200_OK)
|
|
except Http404:
|
|
return Response({'action': "Update Deadline", 'message': 'Opening Not Found'},
|
|
status=status.HTTP_404_NOT_FOUND)
|
|
except:
|
|
logger.warning("Update Deadline: " + str(sys.exc_info()))
|
|
return Response({'action': "Update Deadline", 'message': "Something went wrong"},
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
@api_view(['POST'])
|
|
@isAuthorized([SUPER_ADMIN])
|
|
@precheck([OPENING_ID, OFFER_ACCEPTED])
|
|
def updateOfferAccepted(request, id, email, user_type):
|
|
try:
|
|
data = request.data
|
|
offer_accepted = data[OFFER_ACCEPTED]
|
|
if OPENING_TYPE in data:
|
|
opening_type= data[OPENING_TYPE]
|
|
else:
|
|
opening_type= "Placement"
|
|
if opening_type == "Internship":
|
|
opening = get_object_or_404(Internship, pk=data[OPENING_ID])
|
|
else:
|
|
opening = get_object_or_404(Placement, pk=data[OPENING_ID])
|
|
if opening.offer_accepted is None:
|
|
opening.offer_accepted = offer_accepted == "true"
|
|
opening.changed_by = get_object_or_404(User, id=id)
|
|
opening.save()
|
|
if opening.offer_accepted:
|
|
deadline_datetime = datetime.datetime.strftime(opening.deadline_datetime, '%Y-%m-%d %H:%M:%S %z')
|
|
send_opening_to_notifications_service(id=opening.id,name=opening.company_name,deadline=deadline_datetime,role=opening.designation,opening_type=opening_type)
|
|
send_opening_notifications(opening.id,opening_type)
|
|
else:
|
|
raise ValueError("Offer Status already updated")
|
|
|
|
return Response({'action': "Update Offer Accepted", 'message': "Offer Accepted Updated"},
|
|
status=status.HTTP_200_OK)
|
|
except Http404:
|
|
return Response({'action': "Update Offer Accepted", 'message': 'Opening Not Found'},
|
|
status=status.HTTP_404_NOT_FOUND)
|
|
except ValueError as e:
|
|
return Response({'action': "Update Offer Accepted", 'message': str(e)},
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
except:
|
|
logger.warning("Update Offer Accepted: " + str(sys.exc_info()))
|
|
return Response({'action': "Update Offer Accepted", 'message': "Something went wrong"},
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
@api_view(['POST'])
|
|
@isAuthorized([ADMIN])
|
|
@precheck([OPENING_ID, EMAIL_VERIFIED])
|
|
def updateEmailVerified(request, id, email, user_type):
|
|
try:
|
|
data = request.data
|
|
if OPENING_TYPE in data:
|
|
opening_type= data[OPENING_TYPE]
|
|
else:
|
|
opening_type= "Placement"
|
|
if opening_type == "Internship":
|
|
opening = get_object_or_404(Internship, pk=data[OPENING_ID])
|
|
else:
|
|
opening = get_object_or_404(Placement, pk=data[OPENING_ID])
|
|
opening.email_verified = True if data[EMAIL_VERIFIED] == "true" else False
|
|
opening.changed_by = get_object_or_404(User, id=id)
|
|
opening.save()
|
|
return Response({'action': "Update Email Verified", 'message': "Email Verified Updated"},
|
|
status=status.HTTP_200_OK)
|
|
except Http404:
|
|
return Response({'action': "Update Email Verified", 'message': 'Opening Not Found'},
|
|
status=status.HTTP_404_NOT_FOUND)
|
|
except:
|
|
logger.warning("Update Email Verified: " + str(sys.exc_info()))
|
|
return Response({'action': "Update Email Verified", 'message': "Something went wrong"},
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
@api_view(['POST'])
|
|
@isAuthorized([ADMIN])
|
|
@precheck([OPENING_ID, FIELD])
|
|
def deleteAdditionalInfo(request, id, email, user_type):
|
|
try:
|
|
data = request.data
|
|
if OPENING_TYPE in data:
|
|
opening_type= data[OPENING_TYPE]
|
|
else:
|
|
opening_type= "Placement"
|
|
if opening_type == "Internship":
|
|
opening = get_object_or_404(Internship, pk=data[OPENING_ID])
|
|
else:
|
|
opening = get_object_or_404(Placement, pk=data[OPENING_ID])
|
|
if data[FIELD] in opening.additional_info:
|
|
opening.additional_info.remove(data[FIELD])
|
|
opening.changed_by = get_object_or_404(User, id=id)
|
|
opening.save()
|
|
return Response({'action': "Delete Additional Info", 'message': "Additional Info Deleted"},
|
|
status=status.HTTP_200_OK)
|
|
else:
|
|
raise ValueError("Additional Info Not Found")
|
|
except Http404:
|
|
return Response({'action': "Delete Additional Info", 'message': 'Opening Not Found'},
|
|
status=status.HTTP_404_NOT_FOUND)
|
|
except ValueError:
|
|
return Response({'action': "Delete Additional Info", 'message': "Additional Info not found"},
|
|
status=status.HTTP_404_NOT_FOUND)
|
|
except Exception as e:
|
|
logger.warning("Delete Additional Info: " + str(e))
|
|
return Response({'action': "Delete Additional Info", 'message': "Something went wrong"},
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
@api_view(['POST'])
|
|
@isAuthorized([ADMIN])
|
|
@precheck([OPENING_ID, FIELD])
|
|
def addAdditionalInfo(request, id, email, user_type):
|
|
try:
|
|
data = request.data
|
|
if OPENING_TYPE in data:
|
|
opening_type= data[OPENING_TYPE]
|
|
else:
|
|
opening_type= "Placement"
|
|
if opening_type == "Internship":
|
|
opening = get_object_or_404(Internship, pk=data[OPENING_ID])
|
|
else:
|
|
opening = get_object_or_404(Placement, pk=data[OPENING_ID])
|
|
if data[FIELD] not in opening.additional_info:
|
|
opening.additional_info.append(data[FIELD])
|
|
opening.save()
|
|
return Response({'action': "Add Additional Info", 'message': "Additional Info Added"},
|
|
status=status.HTTP_200_OK)
|
|
else:
|
|
raise ValueError("Additional Info Found")
|
|
|
|
except Http404:
|
|
return Response({'action': "Add Additional Info", 'message': 'Opening Not Found'},
|
|
status=status.HTTP_404_NOT_FOUND)
|
|
except ValueError:
|
|
return Response({'action': "Add Additional Info", 'message': "Additional Info already found"},
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
except Exception as e:
|
|
logger.warning("Add Additional Info: " + str(e))
|
|
return Response({'action': "Add Additional Info", 'message': "Something went wrong"},
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
@api_view(['GET'])
|
|
@isAuthorized([ADMIN])
|
|
@precheck([OPENING_ID])
|
|
def getApplications(request, id, email, user_type):
|
|
try:
|
|
data = request.GET
|
|
if OPENING_TYPE in data:
|
|
opening_type= data[OPENING_TYPE]
|
|
else:
|
|
opening_type= "Placement"
|
|
if opening_type == "Internship":
|
|
opening = get_object_or_404(Internship, pk=data[OPENING_ID])
|
|
applications = InternshipApplication.objects.filter(internship=opening)
|
|
serializer = InternshipApplicationSerializerForAdmin(applications, many=True)
|
|
else:
|
|
opening = get_object_or_404(Placement, pk=data[OPENING_ID])
|
|
applications = PlacementApplication.objects.filter(placement=opening)
|
|
serializer = PlacementApplicationSerializerForAdmin(applications, many=True)
|
|
return Response({'action': "Get Applications", 'message': 'Data Found', 'applications': serializer.data},
|
|
status=status.HTTP_200_OK)
|
|
except Http404:
|
|
return Response({'action': "Get Applications", 'message': 'Opening Not Found'},
|
|
status=status.HTTP_404_NOT_FOUND)
|
|
except:
|
|
logger.warning("Get Applications: " + str(sys.exc_info()))
|
|
return Response({'action': "Get Applications", 'message': "Something went wrong"},
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
@api_view(['POST'])
|
|
@isAuthorized(allowed_users=[ADMIN])
|
|
@precheck(required_data=[APPLICATION_ID, STUDENT_ID, OPENING_ID, ADDITIONAL_INFO, RESUME_FILE_NAME])
|
|
def submitApplication(request, id, email, user_type):
|
|
try:
|
|
data = request.data
|
|
if OPENING_TYPE in data:
|
|
if data[OPENING_TYPE] == "Internship":
|
|
opening_type= "Internship"
|
|
elif data[OPENING_TYPE] == "placements":
|
|
opening_type= "Placement"
|
|
else:
|
|
opening_type= "Placement"
|
|
if opening_type == "Internship":
|
|
opening = get_object_or_404(Internship, pk=data[OPENING_ID])
|
|
else:
|
|
opening = get_object_or_404(Placement, pk=data[OPENING_ID])
|
|
# print(opening);
|
|
student = get_object_or_404(Student, pk=data[STUDENT_ID])
|
|
# opening = get_object_or_404(Placement, pk=data[OPENING_ID])
|
|
student_user = get_object_or_404(User, id=student.id)
|
|
if data[APPLICATION_ID] == "":
|
|
application = PlacementApplication() if opening_type == "Placement" else InternshipApplication()
|
|
application.id = generateRandomString()
|
|
if(opening_type == "Placement"):
|
|
application.placement = opening
|
|
else:
|
|
application.internship = opening
|
|
application.student = student
|
|
if data[RESUME_FILE_NAME] in student.resumes:
|
|
application.resume = data[RESUME_FILE_NAME]
|
|
else:
|
|
raise FileNotFoundError(RESUME_FILE_NAME + " Not Found")
|
|
additional_info = {}
|
|
for i in opening.additional_info:
|
|
if i not in data[ADDITIONAL_INFO]:
|
|
raise AttributeError(i + " not found in Additional Info")
|
|
else:
|
|
additional_info[i] = data[ADDITIONAL_INFO][i]
|
|
application.additional_info = json.dumps(additional_info)
|
|
data = {
|
|
"name": student.name,
|
|
"company_name": opening.company_name,
|
|
"application_type": "Placement" if opening_type == "Placement" else "Internship",
|
|
"additional_info": dict(json.loads(application.additional_info)),
|
|
}
|
|
subject = STUDENT_APPLICATION_SUBMITTED_TEMPLATE_SUBJECT.format(company_name=opening.company_name)
|
|
application.changed_by = get_object_or_404(User, id=id)
|
|
application.save()
|
|
sendEmail(student_user.email, subject, data, STUDENT_APPLICATION_SUBMITTED_TEMPLATE)
|
|
return Response({'action': "Add Student Application", 'message': "Application added"},
|
|
status=status.HTTP_200_OK)
|
|
else:
|
|
if opening_type == "Internship":
|
|
application = get_object_or_404(InternshipApplication, id=data[APPLICATION_ID])
|
|
else:
|
|
application = get_object_or_404(PlacementApplication, id=data[APPLICATION_ID])
|
|
if application:
|
|
if data[RESUME_FILE_NAME] in student.resumes:
|
|
application.resume = data[RESUME_FILE_NAME]
|
|
else:
|
|
raise FileNotFoundError(RESUME_FILE_NAME + " Not Found")
|
|
application.resume = data[RESUME_FILE_NAME]
|
|
additional_info = {}
|
|
for i in opening.additional_info:
|
|
if i not in data[ADDITIONAL_INFO]:
|
|
raise AttributeError(i + " not found in Additional Info")
|
|
else:
|
|
additional_info[i] = data[ADDITIONAL_INFO][i]
|
|
|
|
application.additional_info = json.dumps(additional_info)
|
|
data = {
|
|
"name": student.name,
|
|
"company_name": opening.company_name,
|
|
"application_type": "Placement" if opening_type == "Placement" else "Internship",
|
|
"resume": application.resume[16:],
|
|
"additional_info_items": dict(json.loads(application.additional_info)),
|
|
}
|
|
subject = STUDENT_APPLICATION_UPDATED_TEMPLATE_SUBJECT.format(company_name=opening.company_name)
|
|
application.changed_by = get_object_or_404(User, id=id)
|
|
application.save()
|
|
sendEmail(student_user.email, subject, data, STUDENT_APPLICATION_UPDATED_TEMPLATE)
|
|
return Response({'action': "Add Student Application", 'message': "Application updated"},
|
|
status=status.HTTP_200_OK)
|
|
else:
|
|
return Response({'action': "Edit Student Application", 'message': "No Application Found"},
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
except Http404 as e:
|
|
return Response({'action': "Submit Application", 'message': str(e)},
|
|
status=status.HTTP_404_NOT_FOUND)
|
|
except PermissionError as e:
|
|
return Response({'action': "Submit Application", 'message': str(e)},
|
|
status=status.HTTP_403_FORBIDDEN)
|
|
except FileNotFoundError as e:
|
|
return Response({'action': "Submit Application", 'message': str(e)},
|
|
status=status.HTTP_404_NOT_FOUND)
|
|
except AttributeError as e:
|
|
return Response({'action': "Submit Application", 'message': str(e)},
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
except:
|
|
logger.warning("Submit Application: " + str(sys.exc_info()))
|
|
return Response({'action': "Submit Application", 'message': "Something Went Wrong"},
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
@api_view(['POST'])
|
|
@isAuthorized(allowed_users=[ADMIN])
|
|
@precheck(required_data=[OPENING_ID])
|
|
def generateCSV(request, id, email, user_type):
|
|
try:
|
|
data = request.data
|
|
if OPENING_TYPE in data:
|
|
opening_type= data[OPENING_TYPE]
|
|
else:
|
|
opening_type= "Placement"
|
|
if opening_type == "Internship":
|
|
opening = get_object_or_404(Internship, id=data[OPENING_ID])
|
|
applications = InternshipApplication.objects.filter(internship=opening)
|
|
else:
|
|
opening = get_object_or_404(Placement, id=data[OPENING_ID])
|
|
applications = PlacementApplication.objects.filter(placement=opening)
|
|
filename = generateRandomString()
|
|
if not os.path.isdir(STORAGE_DESTINATION_APPLICATION_CSV):
|
|
os.makedirs(STORAGE_DESTINATION_APPLICATION_CSV, exist_ok=True)
|
|
destination_path = STORAGE_DESTINATION_APPLICATION_CSV + filename + ".csv"
|
|
f = open(destination_path, 'w')
|
|
writer = csv.writer(f)
|
|
header_row = APPLICATION_CSV_COL_NAMES.copy()
|
|
|
|
header_row.extend(opening.additional_info)
|
|
writer.writerow(header_row)
|
|
for apl in applications:
|
|
row_details = []
|
|
|
|
row_details.append(apl.applied_at)
|
|
row_details.append(apl.student.roll_no)
|
|
row_details.append(apl.student.name)
|
|
row_details.append(str(apl.student.roll_no) + "@iitdh.ac.in")
|
|
row_details.append(apl.student.phone_number)
|
|
row_details.append(apl.student.branch)
|
|
row_details.append(apl.student.batch)
|
|
row_details.append(apl.student.cpi)
|
|
link = LINK_TO_STORAGE_RESUME + urllib.parse.quote(str(apl.student.id)) + "/" + urllib.parse.quote(str(apl.resume))
|
|
row_details.append(link)
|
|
row_details.append(apl.selected)
|
|
|
|
for i in opening.additional_info:
|
|
row_details.append(json.loads(apl.additional_info).get(i, ''))
|
|
writer.writerow(row_details)
|
|
f.close()
|
|
file_path = LINK_TO_APPLICATIONS_CSV + urllib.parse.quote_plus(filename + ".csv")
|
|
return Response({'action': "Create csv", 'message': "CSV created", 'file': file_path},
|
|
status=status.HTTP_200_OK)
|
|
except:
|
|
logger.warning("Create csv: " + str(sys.exc_info()))
|
|
return Response({'action': "Create csv", 'message': "Something Went Wrong"},
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
@api_view(['POST'])
|
|
@isAuthorized(allowed_users=[ADMIN])
|
|
@precheck(required_data=[OPENING_ID])
|
|
def downloadResume(request, id, email, user_type):
|
|
try:
|
|
data = request.data
|
|
if OPENING_TYPE in data:
|
|
opening_type= data[OPENING_TYPE]
|
|
|
|
if opening_type == "Internship":
|
|
opening = get_object_or_404(Internship, id=data[OPENING_ID])
|
|
applications = InternshipApplication.objects.filter(internship=opening)
|
|
else:
|
|
opening = get_object_or_404(Placement, id=data[OPENING_ID])
|
|
applications = PlacementApplication.objects.filter(placement=opening)
|
|
zip_filename = generateRandomString() + ".zip"
|
|
if not os.path.isdir(STORAGE_DESTINATION_RESUME_ZIP):
|
|
os.makedirs(STORAGE_DESTINATION_RESUME_ZIP, exist_ok=True)
|
|
resumes = {}
|
|
for apl in applications:
|
|
|
|
resumes[apl.student.roll_no] = STORAGE_DESTINATION_RESUMES + apl.student.id + '/' + apl.resume # Check if the folder name is student id or user id
|
|
|
|
with zipfile.ZipFile(STORAGE_DESTINATION_RESUME_ZIP + zip_filename, 'w', zipfile.ZIP_DEFLATED) as zip_file:
|
|
for student_roll_no, resume_path in resumes.items():
|
|
zip_file.write(resume_path, os.path.basename(str(student_roll_no) + ".pdf"))
|
|
|
|
file_path = LINK_TO_RESUMES_ZIP + urllib.parse.quote_plus(zip_filename)
|
|
return Response({'action': "Download resumes", 'message': "Resumes zip created", 'file': file_path},
|
|
status=status.HTTP_200_OK)
|
|
except:
|
|
logger.warning("Create csv: " + str(sys.exc_info()))
|
|
return Response({'action': "Create csv", 'message': "Something Went Wrong"},
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
@api_view(['POST'])
|
|
@isAuthorized(allowed_users=[ADMIN])
|
|
@precheck(required_data=[COMPANY_NAME, COMPENSATION_GROSS, OFFER_ACCEPTED, STUDENT_ID, DESIGNATION, TIER])
|
|
def addPPO(request, id, email, user_type):
|
|
try:
|
|
data = request.data
|
|
PPO = PrePlacementOffer()
|
|
PPO.company = data[COMPANY_NAME]
|
|
PPO.compensation = int(data[COMPENSATION_GROSS])
|
|
if data[OFFER_ACCEPTED] == "true":
|
|
PPO.accepted = True
|
|
elif data[OFFER_ACCEPTED] == "false":
|
|
PPO.accepted = False
|
|
else:
|
|
PPO.accepted = None
|
|
PPO.student = get_object_or_404(Student, id=data[STUDENT_ID])
|
|
PPO.designation = data[DESIGNATION]
|
|
PPO.tier = int(data[TIER])
|
|
if COMPENSATION_DETAILS in data:
|
|
PPO.compensation_details = data[COMPENSATION_DETAILS]
|
|
PPO.changed_by = get_object_or_404(User, id=id)
|
|
PPO.save()
|
|
return Response({'action': "Add PPO", 'message': "PPO added"},
|
|
status=status.HTTP_200_OK)
|
|
except:
|
|
logger.warning("Add PPO: " + str(sys.exc_info()))
|
|
return Response({'action': "Add PPO", 'message': "Something Went Wrong"},
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
@api_view(['POST'])
|
|
@isAuthorized(allowed_users=[ADMIN])
|
|
@precheck(required_data=[STUDENT_ID, OPENING_ID])
|
|
def getStudentApplication(request, id, email, user_type):
|
|
try:
|
|
data = request.data
|
|
if OPENING_TYPE in data:
|
|
opening_type= data[OPENING_TYPE]
|
|
else:
|
|
opening_type= "Placement"
|
|
student = get_object_or_404(Student, id=data[STUDENT_ID])
|
|
student_serializer = StudentSerializer(student)
|
|
student_details = {
|
|
"name": student_serializer.data['name'],
|
|
"batch": student.batch,
|
|
"branch": student.branch,
|
|
"resume_list": student_serializer.data['resume_list'],
|
|
}
|
|
# search for the application if there or not
|
|
if opening_type == "Internship":
|
|
application = InternshipApplication.objects.filter(student=student,
|
|
internship=get_object_or_404(Internship,
|
|
id=data[OPENING_ID]))
|
|
else:
|
|
application = PlacementApplication.objects.filter(student=student,
|
|
placement=get_object_or_404(Placement, id=data[OPENING_ID]))
|
|
|
|
if application:
|
|
if opening_type == "Internship":
|
|
serializer = InternshipApplicationSerializer(application[0])
|
|
application_info = {
|
|
"id": serializer.data['id'],
|
|
"additional_info": serializer.data['additional_info'],
|
|
"resume": serializer.data['resume_link'],
|
|
}
|
|
else:
|
|
serializer = PlacementApplicationSerializer(application[0])
|
|
application_info = {
|
|
"id": serializer.data['id'],
|
|
"additional_info": serializer.data['additional_info'],
|
|
"resume": serializer.data['resume_link'],
|
|
}
|
|
return Response(
|
|
{'action': "Get Student Application", 'application_found': "true", "application_info": application_info,
|
|
"student_details": student_details}, status=status.HTTP_200_OK)
|
|
else:
|
|
return Response(
|
|
{'action': "Get Student Application", 'application_found': "false", "student_details": student_details},
|
|
status=status.HTTP_404_NOT_FOUND)
|
|
except Http404:
|
|
return Response({'action': "Get Student Application", 'message': "Student not found."},
|
|
status.HTTP_404_NOT_FOUND)
|
|
except:
|
|
logger.warning("Get Student Application: " + str(sys.exc_info()))
|
|
return Response({'action': "Get Student Application", 'message': "Something Went Wrong"},
|
|
status.HTTP_400_BAD_REQUEST)
|
|
|
|
@api_view(['GET'])
|
|
@isAuthorized(allowed_users=[ADMIN])
|
|
def getStats(request, id, email, user_type):
|
|
try:
|
|
stats = []
|
|
placement_ids = {}
|
|
|
|
tier_count = {
|
|
"CSE": {
|
|
"1":0,
|
|
"2":0,
|
|
"3":0,
|
|
"4":0,
|
|
"5":0,
|
|
"6":0,
|
|
"7":0,
|
|
"8":0,
|
|
"psu":0,
|
|
},
|
|
"EE": {
|
|
"1":0,
|
|
"2":0,
|
|
"3":0,
|
|
"4":0,
|
|
"5":0,
|
|
"6":0,
|
|
"7":0,
|
|
"psu":0,
|
|
},
|
|
"MMAE": {
|
|
"1":0,
|
|
"2":0,
|
|
"3":0,
|
|
"4":0,
|
|
"5":0,
|
|
"6":0,
|
|
"7":0,
|
|
"8":0,
|
|
"psu":0,
|
|
|
|
},
|
|
"EP":{
|
|
"1":0,
|
|
"2":0,
|
|
"3":0,
|
|
"4":0,
|
|
"5":0,
|
|
"6":0,
|
|
"7":0,
|
|
"8":0,
|
|
"psu":0,
|
|
},
|
|
"Total": {
|
|
"1":0,
|
|
"2":0,
|
|
"3":0,
|
|
"4":0,
|
|
"5":0,
|
|
"6":0,
|
|
"7":0,
|
|
"8":0,
|
|
"psu":0,
|
|
},
|
|
}
|
|
number_of_students_placed = {
|
|
"CSE": 0,
|
|
"EE": 0,
|
|
"MMAE": 0,
|
|
"EP": 0,
|
|
"Total": 0,
|
|
}
|
|
number_of_students_with_multiple_offers = 0
|
|
number_of_students_with_no_offers = {
|
|
"CSE": 0,
|
|
"EE": 0,
|
|
"MMAE": 0,
|
|
"EP": 0,
|
|
"Total": 0,
|
|
}
|
|
max_CTC = {
|
|
"CSE": 0,
|
|
"EE": 0,
|
|
"MMAE": 0,
|
|
"EP": 0,
|
|
}
|
|
average_CTC = {
|
|
"CSE": 0,
|
|
"EE": 0,
|
|
"MMAE": 0,
|
|
"EP": 0,
|
|
}
|
|
count = {
|
|
"CSE": 0,
|
|
"EE": 0,
|
|
"MMAE": 0,
|
|
"EP": 0,
|
|
}
|
|
|
|
|
|
|
|
students = Student.objects.all().order_by("roll_no")
|
|
for student in students.iterator():
|
|
|
|
applications = PlacementApplication.objects.filter(student=student, selected=True)
|
|
ppos = PrePlacementOffer.objects.filter(student=student, accepted=True)
|
|
|
|
first_offer_data = None
|
|
|
|
second_offer_data = None
|
|
|
|
# get the first and second offer
|
|
offers = []
|
|
offers.extend(applications)
|
|
offers.extend(ppos)
|
|
|
|
if len(offers) == 0:
|
|
number_of_students_with_no_offers[student.branch] += 1
|
|
number_of_students_with_no_offers["Total"] += 1
|
|
else:
|
|
number_of_students_placed[student.branch] += 1
|
|
number_of_students_placed["Total"] += 1
|
|
if len(offers) > 1:
|
|
number_of_students_with_multiple_offers += 1
|
|
|
|
|
|
|
|
for offer in offers:
|
|
if type(offer) == PrePlacementOffer:
|
|
if first_offer_data is None:
|
|
first_offer_data = {
|
|
"id": offer.id,
|
|
"company": offer.company,
|
|
"compensation": offer.compensation,
|
|
"tier": offer.tier,
|
|
"type": "PPO",
|
|
}
|
|
elif second_offer_data is None:
|
|
second_offer_data = {
|
|
"id": offer.id,
|
|
"company": offer.company,
|
|
"compensation": offer.compensation,
|
|
"tier": offer.tier,
|
|
"type": "PPO",
|
|
}
|
|
elif type(offer) == PlacementApplication:
|
|
if first_offer_data is None:
|
|
first_offer_data = {
|
|
"id": offer.placement.id,
|
|
"company": offer.placement.company_name,
|
|
"compensation": offer.placement.compensation_CTC,
|
|
"tier": offer.placement.tier,
|
|
"type": "Placement",
|
|
}
|
|
elif second_offer_data is None:
|
|
second_offer_data = {
|
|
"id": offer.placement.id,
|
|
"company": offer.placement.company_name,
|
|
"compensation": offer.placement.compensation_CTC,
|
|
"tier": offer.placement.tier,
|
|
"type": "Placement",
|
|
}
|
|
|
|
data = {
|
|
"id": student.id,
|
|
"name": student.name,
|
|
"roll_no": student.roll_no,
|
|
"batch": student.batch,
|
|
"branch": student.branch,
|
|
"cpi": student.cpi,
|
|
"first_offer": first_offer_data['company'] if first_offer_data is not None else None,
|
|
"first_offer_tier": first_offer_data['tier'] if first_offer_data is not None else None,
|
|
"first_offer_compensation": first_offer_data['compensation'] if first_offer_data is not None else None,
|
|
|
|
"second_offer": second_offer_data['company'] if second_offer_data is not None else None,
|
|
"second_offer_tier": second_offer_data['tier'] if second_offer_data is not None else None,
|
|
"second_offer_compensation": second_offer_data['compensation'] if second_offer_data is not None else None,
|
|
}
|
|
if first_offer_data is not None:
|
|
tier_count[student.branch][first_offer_data['tier']] += 1
|
|
tier_count['Total'][first_offer_data['tier']] += 1
|
|
max_CTC[student.branch] = max(max_CTC[student.branch], first_offer_data['compensation'])
|
|
average_CTC[student.branch] += first_offer_data['compensation']
|
|
count[student.branch] += 1
|
|
|
|
if first_offer_data['type'] == "Placement":
|
|
placement_ids[first_offer_data['company']] = first_offer_data['id']
|
|
|
|
if second_offer_data is not None:
|
|
tier_count[student.branch][second_offer_data['tier']] += 1
|
|
tier_count['Total'][second_offer_data['tier']] += 1
|
|
max_CTC[student.branch] = max(max_CTC[student.branch], second_offer_data['compensation'])
|
|
average_CTC[student.branch] += second_offer_data['compensation']
|
|
count[student.branch] += 1
|
|
|
|
if second_offer_data['type'] == "Placement":
|
|
placement_ids[second_offer_data['company']] = second_offer_data['id']
|
|
|
|
stats.append(data)
|
|
|
|
for branch in average_CTC:
|
|
if count[branch] > 0:
|
|
average_CTC[branch] /= count[branch]
|
|
# round off to 2 decimal places
|
|
average_CTC[branch] = round(average_CTC[branch], 2)
|
|
else:
|
|
average_CTC[branch] = 0
|
|
return Response({'action': "Get Stats", 'message': "Stats fetched", 'stats': stats, 'placement_ids': placement_ids,
|
|
"tier_count": {br: tier_count[br].values() for br in tier_count},
|
|
"number_of_students_placed": number_of_students_placed,
|
|
"number_of_students_with_multiple_offers": number_of_students_with_multiple_offers,
|
|
"number_of_students_with_no_offers": number_of_students_with_no_offers,
|
|
"max_CTC": max_CTC,
|
|
"average_CTC": average_CTC,
|
|
},
|
|
status=status.HTTP_200_OK)
|
|
except:
|
|
logger.warning("Get Stats: " + str(sys.exc_info()))
|
|
return Response({'action': "Get Stats", 'message': "Something Went Wrong"},
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
@api_view(['GET'])
|
|
@isAuthorizedService()
|
|
@precheck(required_data=[OPENING_ID])
|
|
def get_eligible_students(request):
|
|
try:
|
|
data = request.GET
|
|
opening_id = data[OPENING_ID]
|
|
if OPENING_TYPE in data:
|
|
opening_type= data[OPENING_TYPE]
|
|
else:
|
|
opening_type= "Placement"
|
|
if "send_all" in data:
|
|
send_all = "True"==data["send_all"]
|
|
else:
|
|
send_all = False
|
|
eligible_students=get_eligible_emails(opening_id=opening_id, opening_type=opening_type, send_all=send_all)
|
|
return Response({'action': "Get Eligible Students", 'message': "Eligible Students Fetched",
|
|
'eligible_students': eligible_students},
|
|
status=status.HTTP_200_OK)
|
|
except Http404:
|
|
return Response({'action': "Get Eligible Students", 'message': "Opening Not Found"},
|
|
status=status.HTTP_404_NOT_FOUND)
|
|
except:
|
|
logger.warning("Get Eligible Students: " + str(sys.exc_info()))
|
|
return Response({'action': "Get Eligible Students", 'message': "Something Went Wrong"},
|
|
status=status.HTTP_400_BAD_REQUEST)
|
|
|