diff --git a/CDC_Backend/APIs/adminViews.py b/CDC_Backend/APIs/adminViews.py index cb28744..88261d1 100644 --- a/CDC_Backend/APIs/adminViews.py +++ b/CDC_Backend/APIs/adminViews.py @@ -109,12 +109,12 @@ def updateDeadline(request, id, email, user_type): def updateOfferAccepted(request, id, email, user_type): try: data = request.data - print(data) opening = get_object_or_404(Placement, pk=data[OPENING_ID]) - opening.offer_accepted = True if data[OFFER_ACCEPTED] == True else False - print(opening.offer_accepted) - opening.changed_by = get_object_or_404(User, id=id) - opening.save() + if not opening.offer_accepted: + opening.offer_accepted = True + opening.changed_by = get_object_or_404(User, id=id) + opening.save() + send_opening_notifications(opening.id) return Response({'action': "Update Offer Accepted", 'message': "Offer Accepted Updated"}, status=status.HTTP_200_OK) except Http404: @@ -173,6 +173,7 @@ def deleteAdditionalInfo(request, id, email, user_type): 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]) @@ -200,7 +201,6 @@ def addAdditionalInfo(request, id, email, user_type): status=status.HTTP_400_BAD_REQUEST) - @api_view(['GET']) @isAuthorized([ADMIN]) @precheck([OPENING_ID]) @@ -229,7 +229,7 @@ def submitApplication(request, id, email, user_type): data = request.data 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) + student_user = get_object_or_404(User, id=student.id) if data[APPLICATION_ID] == "": application = PlacementApplication() application.id = generateRandomString() @@ -349,7 +349,6 @@ def generateCSV(request, id, email, user_type): status=status.HTTP_200_OK) except: logger.warning("Create csv: " + str(sys.exc_info())) - print(sys.exc_info()) return Response({'action': "Create csv", 'message': "Something Went Wrong"}, status=status.HTTP_400_BAD_REQUEST) @@ -380,7 +379,6 @@ def addPPO(request, id, email, user_type): status=status.HTTP_200_OK) except: logger.warning("Add PPO: " + str(sys.exc_info())) - print(sys.exc_info()) return Response({'action': "Add PPO", 'message': "Something Went Wrong"}, status=status.HTTP_400_BAD_REQUEST) diff --git a/CDC_Backend/APIs/companyViews.py b/CDC_Backend/APIs/companyViews.py index 2593513..2b27a9b 100644 --- a/CDC_Backend/APIs/companyViews.py +++ b/CDC_Backend/APIs/companyViews.py @@ -276,11 +276,9 @@ def verifyEmail(request): data = { "designation": opening.designation, "opening_type": PLACEMENT, - "opening_link": PLACEMENT_OPENING_URL.format(id=opening.id), # Some Changes here too "company_name": opening.company_name, } - 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), data, COMPANY_OPENING_SUBMITTED_TEMPLATE, attachment_jnf_respone) return Response({'action': "Verify Email", 'message': "Email Verified Successfully"}, diff --git a/CDC_Backend/APIs/constants.py b/CDC_Backend/APIs/constants.py index 359d283..aeb26b1 100644 --- a/CDC_Backend/APIs/constants.py +++ b/CDC_Backend/APIs/constants.py @@ -39,7 +39,7 @@ TOTAL_BATCHES = 4 # Total No of Batches CLIENT_ID = "956830229554-290mirc16pdhd5j7ph7v7ukibo4t1qcp.apps.googleusercontent.com" # Google Login Client ID # To be Configured Properly -PLACEMENT_OPENING_URL = "https://www.googleapis.com/auth/adwords/{id}" # On frontend, this is the URL to be opened +PLACEMENT_OPENING_URL = "http://localhost:3000/student/dashboard/placements/{id}" # On frontend, this is the URL to be opened LINK_TO_STORAGE_COMPANY_ATTACHMENT = "http://localhost/storage/Company_Attachments/" LINK_TO_STORAGE_RESUME = "http://localhost/storage/Resumes/" LINK_TO_APPLICATIONS_CSV = "http://localhost/storage/Application_CSV/" @@ -134,13 +134,14 @@ EXCLUDE_IN_PDF = ['id', 'is_company_details_pdf', 'offer_accepted', 'is_descript 'email_verified', 'created_at'] SPECIAL_FORMAT_IN_PDF = ['website', 'company_details_pdf_names', 'description_pdf_names', 'compensation_details_pdf_names', - 'selection_procedure_pdf_names'] + 'selection_procedure_details_pdf_names'] COMPANY_OPENING_SUBMITTED_TEMPLATE_SUBJECT = "Notification Submitted - {id} - Career Development Cell, IIT Dharwad" -STUDENT_APPLICATION_STATUS_TEMPLATE_SUBJECT = 'Application Status : {company_name} - {id}' +STUDENT_APPLICATION_STATUS_TEMPLATE_SUBJECT = 'Application Status - {company_name} - {id}' STUDENT_APPLICATION_SUBMITTED_TEMPLATE_SUBJECT = 'CDC - Application Submitted - {company_name}' STUDENT_APPLICATION_UPDATED_TEMPLATE_SUBJECT = 'CDC - Application Updated - {company_name}' COMPANY_EMAIl_VERIFICATION_TEMPLATE_SUBJECT = 'Email Verification - Career Development Cell, IIT Dharwad' +NOTIFY_STUDENTS_OPENING_TEMPLATE_SUBJECT = 'Placement Opportunity at {company_name}' STUDENT_APPLICATION_SUBMITTED_TEMPLATE = 'student_application_submitted.html' COMPANY_OPENING_SUBMITTED_TEMPLATE = 'company_opening_submitted.html' @@ -149,6 +150,7 @@ STUDENT_APPLICATION_STATUS_NOT_SELECTED_TEMPLATE = 'student_application_status_n STUDENT_APPLICATION_UPDATED_TEMPLATE = 'student_application_updated.html' COMPANY_EMAIL_VERIFICATION_TEMPLATE = 'company_email_verification.html' COMPANY_JNF_RESPONSE_TEMPLATE = 'company_jnf_response.html' +NOTIFY_STUDENTS_OPENING_TEMPLATE = 'notify_students_new_opening.html' APPLICATION_CSV_COL_NAMES = ['Applied At', 'Roll No.', 'Name', 'Email', 'Phone Number', 'Branch', 'Batch', 'CPI', 'Resume', 'Selected', ] diff --git a/CDC_Backend/APIs/studentViews.py b/CDC_Backend/APIs/studentViews.py index 27c7c28..ccb25bf 100644 --- a/CDC_Backend/APIs/studentViews.py +++ b/CDC_Backend/APIs/studentViews.py @@ -71,7 +71,10 @@ def getDashboard(request, id, email, user_type): allowed_branch__contains=[studentDetails.branch], deadline_datetime__gte=datetime.datetime.now(), offer_accepted=True, email_verified=True).order_by('deadline_datetime') - placementsdata = PlacementSerializerForStudent(placements, many=True).data + filtered_placements = placement_eligibility_filters(studentDetails, placements) + + placementsdata = PlacementSerializerForStudent(filtered_placements, many=True).data + placementApplications = PlacementApplication.objects.filter(student_id=id) placementApplications = PlacementApplicationSerializer(placementApplications, many=True).data return Response( @@ -83,7 +86,6 @@ def getDashboard(request, id, email, user_type): status=status.HTTP_404_NOT_FOUND) except: logger.warning("Get Dashboard -Student: " + str(sys.exc_info())) - print(sys.exc_info()) return Response({'action': "Get Dashboard - Student", 'message': "Something Went Wrong"}, status=status.HTTP_400_BAD_REQUEST) @@ -193,8 +195,6 @@ def submitApplication(request, id, email, user_type): status=status.HTTP_404_NOT_FOUND) except: logger.warning("Submit Application: " + str(sys.exc_info())) - print(traceback.format_exc()) - print(sys.exc_info()) return Response({'action': "Submit Application", 'message': "Something Went Wrong"}, status=status.HTTP_400_BAD_REQUEST) diff --git a/CDC_Backend/APIs/utils.py b/CDC_Backend/APIs/utils.py index 83c2a93..7fcf318 100644 --- a/CDC_Backend/APIs/utils.py +++ b/CDC_Backend/APIs/utils.py @@ -27,7 +27,7 @@ from rest_framework import status from rest_framework.response import Response from .constants import * -from .models import User, PrePlacementOffer, PlacementApplication, Placement +from .models import User, PrePlacementOffer, PlacementApplication, Placement, Student logger = logging.getLogger('db') @@ -77,7 +77,6 @@ def isAuthorized(allowed_users=None): token_id = headers['HTTP_AUTHORIZATION'][7:] idinfo = id_token.verify_oauth2_token(token_id, requests.Request(), CLIENT_ID) email = idinfo[EMAIL] - print(email) user = get_object_or_404(User, email=email) if user: user.last_login_time = timezone.now() @@ -138,7 +137,7 @@ def saveFile(file, location): return file_name -@background_task.background(schedule=5) +@background_task.background(schedule=2) def sendEmail(email_to, subject, data, template, attachment_jnf_response=None): try: if not isinstance(data, dict): @@ -160,7 +159,6 @@ def sendEmail(email_to, subject, data, template, attachment_jnf_response=None): return True except: logger.error("Send Email: " + str(sys.exc_info())) - print(str(sys.exc_info()[1])) return False @@ -169,20 +167,16 @@ def PlacementApplicationConditions(student, placement): selected_companies = PlacementApplication.objects.filter(student=student, selected=True) selected_companies_PSU = [i for i in selected_companies if i.placement.tier == 'psu'] PPO = PrePlacementOffer.objects.filter(student=student, accepted=True) - # find lenght of PPO - print(PPO) - print(len(PPO), "ere") + # find length of PPO if len(selected_companies) + len(PPO) >= MAX_OFFERS_PER_STUDENT: raise PermissionError("Max Applications Reached for the Season") if len(selected_companies_PSU) > 0: raise PermissionError('Selected for PSU Can\'t apply anymore') - if placement.tier == 'psu': return True, "Conditions Satisfied" for i in selected_companies: - print(int(i.placement.tier) < int(placement.tier), int(i.placement.tier), int(placement.tier)) if int(i.placement.tier) < int(placement.tier): return False, "Can't apply for this tier" @@ -191,9 +185,6 @@ def PlacementApplicationConditions(student, placement): except PermissionError as e: return False, e except: - print(sys.exc_info()) - print(traceback.format_exc()) - logger.warning("Utils - PlacementApplicationConditions: " + str(sys.exc_info())) return False, "_" @@ -231,7 +222,6 @@ def getTier(compensation_gross, is_psu=False): logger.warning("Utils - getTier: " + str(sys.exc_info())) return False, e except: - print(sys.exc_info()) logger.warning("Utils - getTier: " + str(sys.exc_info())) return False, "_" @@ -248,29 +238,21 @@ def generateOneTimeVerificationLink(email, opening_id, opening_type): link = LINK_TO_EMAIl_VERIFICATION_API.format(token=token) return True, link except: - print(sys.exc_info()) logger.warning("Utils - generateOneTimeVerificationLink: " + str(sys.exc_info())) return False, "_" def verify_recaptcha(request): try: - print(settings.RECAPTCHA_SECRET_KEY) data = { 'secret': settings.RECAPTCHA_SECRET_KEY, 'response': request } - print(data) r = rq.post('https://www.google.com/recaptcha/api/siteverify', data=data) result = r.json() - # logger.info("Recaptcha Response: " + str(result)+"request: "+str(data)) - - print(result, "Result") return result['success'] except: # get exception line number - print(sys.exc_info()) - print(traceback.format_exc()) logger.warning("Utils - verify_recaptcha: " + str(sys.exc_info())) return False, "_" @@ -287,7 +269,7 @@ def opening_description_table_html(opening): if key == 'website': details[key] = {"details": details[key], "type": ["link"]} else: - details[key] = {"details": details[key]["details"], "type": ["list", "link"], + details[key] = {"details": [item[16:] for item in details[key]["details"]], "type": ["list", "link"], "link": PDF_FILES_SERVING_ENDPOINT + opening.id + "/"} new_key = key.replace('_', ' ') if new_key.endswith(' names'): @@ -295,9 +277,52 @@ def opening_description_table_html(opening): 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) + + +def placement_eligibility_filters(student, placements): + try: + filtered_placements = [] + for placement in placements.iterator(): + + if PlacementApplicationConditions(student, placement)[0]: + filtered_placements.append(placement) + + return filtered_placements + except: + logger.warning("Utils - placement_eligibility_filters: " + str(sys.exc_info())) + return placements + + +@background_task.background(schedule=2) +def send_opening_notifications(placement_id): + try: + placement = get_object_or_404(Placement, id=placement_id) + students = Student.objects.all() + for student in students.iterator(): + if PlacementApplicationConditions(student, placement)[0]: + try: + student_user = get_object_or_404(User, id=student.id) + subject = NOTIFY_STUDENTS_OPENING_TEMPLATE_SUBJECT.format(company_name=placement.company_name) + data = { + "company_name": placement.company_name, + "opening_type": 'Placement', + "designation": placement.designation, + "deadline": placement.deadline_datetime.strftime("%Y-%m-%d %H:%M:%S"), + "link": PLACEMENT_OPENING_URL.format(id=placement.id) + } + sendEmail(student_user.email, subject, data, NOTIFY_STUDENTS_OPENING_TEMPLATE) + except Http404: + logger.warning('Utils - send_opening_notifications: user not found : ' + student.id) + except Exception as e: + logger.warning('Utils - send_opening_notifications: For Loop' + str(e)) + + + except: + logger.warning('Utils - send_opening_notifications: ' + str(sys.exc_info())) + return False + diff --git a/CDC_Backend/templates/company_opening_submitted.html b/CDC_Backend/templates/company_opening_submitted.html index aab48dc..c19374a 100644 --- a/CDC_Backend/templates/company_opening_submitted.html +++ b/CDC_Backend/templates/company_opening_submitted.html @@ -65,8 +65,7 @@

We have received your {{ opening_type }} notification for a {{ designation }} offer at - {{ company_name }}. Click here to view your - notification. + {{ company_name }}.

We will keep you informed with the updates. If you have any queries, please diff --git a/CDC_Backend/templates/notify_students_new_opening.html b/CDC_Backend/templates/notify_students_new_opening.html index 9193f0d..2b5e98b 100644 --- a/CDC_Backend/templates/notify_students_new_opening.html +++ b/CDC_Backend/templates/notify_students_new_opening.html @@ -50,12 +50,12 @@

CDC is excited to announce that {{ company_name }} is interested in recruiting {{ designation }} from IIT Dharwad. - More details can be found in the CDC-webportal. + More details can be found in the CDC Web Portal.

Interested students can apply before {{ deadline }} in the CDC-webportal. + href="{{ link }}">CDC-Web Portal.

diff --git a/dev.env b/dev.env index fff40b9..8752c76 100644 --- a/dev.env +++ b/dev.env @@ -1,7 +1,7 @@ HOSTING_URL=http://localhost:8000/ DEBUG=True EMAIL=saisurya3127@gmail.com -EMAIL_PASSWORD=lvryxwieedpervtv +EMAIL_PASSWORD=deirkdgolaopottv SECRET_KEY=%2e!&f6(ib^690y48z=)&w6fczhwukzzp@3y*^*7u+7%4s-mie EMAIL_VERIFICATION_SECRET_KEY=b'<\xa3\xaf&(*|\x0e\xbces\x07P\xf7\xd6\xa9sf\x19$\x96\xb7\x90\x8b\x88\x84\x0e\x191\xde,M\x90\x17(\xf7\nG\x13"\x8d$\x9f&\xb0\xcd\xa4\xaf\xa9\x1b\x15\x02B\x8a\xaf\xff\x0c\x1e\xd5\xb3\x06\xb8\xa6\x9bQ\xa0TR\xe8\x98\x9ae\xe0n}\xcc/[\xdaFz\x18\xfeX\xaf\xbd\xd0\x88\xeal\xe3\xd2\xe3\xb8\x8c\x199{\xf3<\xb0\xc5\xd0\xe7*Rv\xda\xbb \x1d\x85~\xff%>\x1e\xb8\xa7\xbf\xbc\xb2\x06\x86X\xc3\x9f\x13<\x9fd\xea\xb5"\\5&\x01\xa4\x7f=\xa0\x1b\x8bO\x01h\xe8\xfd\x1f\xfe\xba\xbeg\\\xc2\xcb\xc3\xd1~\xff\xd5/9d\xa8\xa7x{\x16\xdb\\\xbb\x08\rI\xcd\x9e7\x8c~\x0f\x1d\x81rXZD\xf0\xf7\x87K\x8f\xfb,\xf4\xf0\xa5\x9e\xde^\xca\xae\x80|9b\x9b\xaaE"\xba\xfb\xdf\x80\xb1\x99\x83e[\xf8\xce&Rq\x99\xdb}\xeeO\xd5\x18\x8d\x0bv\xe7\xab\xf9\xb9{\xb5u\xce\xcf\x90\xa6HE\xc5\x92p\x00\x158\xdf\x1d' DB_NAME=cdc