diff --git a/CDC_Backend/APIs/adminViews.py b/CDC_Backend/APIs/adminViews.py index c7a9b7f..6f02f5c 100644 --- a/CDC_Backend/APIs/adminViews.py +++ b/CDC_Backend/APIs/adminViews.py @@ -124,7 +124,7 @@ def updateDeadline(request, id, email, user_type): 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() - send_opening_to_notifications_service(id=opening.id,name=opening.company_name,deadline=data[DEADLINE_DATETIME],role=opening.designation) + 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: @@ -162,7 +162,7 @@ def updateOfferAccepted(request, id, email, user_type): opening.save() if opening.offer_accepted: deadline=deadline_datetime.strftime('%Y-%m-%d %H:%M:%S %z') - send_opening_to_notifications_service(id=opening.id,name=opening.company_name,deadline=deadline,role=opening.designation) + send_opening_to_notifications_service(id=opening.id,name=opening.company_name,deadline=deadline,role=opening.designation,opening_type=opening_type) send_opening_notifications(opening.id,opening_type) else: raise ValueError("Offer Status already updated") @@ -767,7 +767,11 @@ def get_eligible_students(request): opening_type= data[OPENING_TYPE] else: opening_type= "Placement" - eligible_students=get_eligible_emails(opening_id=opening_id, opening_type=opening_type) + 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) diff --git a/CDC_Backend/APIs/companyViews.py b/CDC_Backend/APIs/companyViews.py index cd73ce6..c8e769d 100644 --- a/CDC_Backend/APIs/companyViews.py +++ b/CDC_Backend/APIs/companyViews.py @@ -17,6 +17,8 @@ logger = logging.getLogger('db') RECAPTCHA_VALUE, JOB_LOCATION ]) def addPlacement(request): + logger.info("JNF filled by " + str(request.data['email'])) + logger.info(request.data) try: data = request.data files = request.FILES @@ -233,14 +235,14 @@ def addPlacement(request): except ValueError as e: store_all_files(request) - exception_email(data) + #exception_email(data) logger.warning("ValueError in addPlacement: " + str(e)) logger.warning(traceback.format_exc()) return Response({'action': "Add Placement", 'message': str(e)}, status=status.HTTP_400_BAD_REQUEST) except: store_all_files(request) - exception_email(data) + #exception_email(data) logger.warning("Add New Placement: " + str(sys.exc_info())) logger.warning(traceback.format_exc()) return Response({'action': "Add Placement", 'message': "Something went wrong"}, @@ -353,6 +355,7 @@ def autoFillInf(request): CONTACT_PERSON_NAME, PHONE_NUMBER, EMAIL, RECAPTCHA_VALUE]) def addInternship(request): logger.info("INF filled by " + str(request.data['email'])) + logger.info(request.data) try: data = request.data files = request.FILES @@ -415,13 +418,14 @@ def addInternship(request): internship.is_work_from_home = True else: internship.is_work_from_home = False - - if data[ALLOWED_BATCH] is None or json.loads(data[ALLOWED_BATCH]) == "": - raise ValueError('Allowed Branch cannot be empty') - elif set(json.loads(data[ALLOWED_BATCH])).issubset(BATCHES): + + if ALLOWED_BATCH in data and (data[ALLOWED_BATCH] is None or json.loads(data[ALLOWED_BATCH]) == ""): + raise ValueError('Allowed Batches cannot be empty') + elif ALLOWED_BATCH in data and set(json.loads(data[ALLOWED_BATCH])).issubset(BATCHES): internship.allowed_batch = json.loads(data[ALLOWED_BATCH]) else: - raise ValueError('Allowed Batch must be a subset of ' + str(BATCHES)) + internship.allowed_batch = ['2021'] + if data[ALLOWED_BRANCH] is None or json.loads(data[ALLOWED_BRANCH]) == "": raise ValueError('Allowed Branch cannot be empty') diff --git a/CDC_Backend/APIs/cron.py b/CDC_Backend/APIs/cron.py new file mode 100644 index 0000000..be45f12 --- /dev/null +++ b/CDC_Backend/APIs/cron.py @@ -0,0 +1,63 @@ +from .models import * +from .utils import * +import shutil +import logging +import traceback + +logger=logging.getLogger('db') +def clean_up_tests(): + # Delete all the test internships and placements created + try: + internships= Internship.objects.filter(company_name="test company",email="notifications@cdc-iitdh.tech") + hits_internship=len(internships) + for internship in internships: + #count number of file + files = os.listdir(STORAGE_DESTINATION_COMPANY_ATTACHMENTS+internship.id) + if len(files) == 4: + print("working fine") + else: + print("not working fine") + logger.error("files submitted in inf are not getting stored for test case"+internship.description) + + #remove folder from the server + print("removing folder ",STORAGE_DESTINATION_COMPANY_ATTACHMENTS+internship.id) + shutil.rmtree(STORAGE_DESTINATION_COMPANY_ATTACHMENTS+internship.id) + + + internship.delete() + + placements= Placement.objects.filter(company_name="test company",email="notifications@cdc-iitdh.tech") + hits_placement=len(placements) + for placement in placements: + #count number of file + files = os.listdir(STORAGE_DESTINATION_COMPANY_ATTACHMENTS+placement.id) + if len(files) == 4: + print("working fine") + else: + print("not working fine") + logger.error("files submitted in inf are not getting stored for test case"+placement.description) + + #remove folder from the server + print("removing folder ",STORAGE_DESTINATION_COMPANY_ATTACHMENTS+internship.id) + shutil.rmtree(STORAGE_DESTINATION_COMPANY_ATTACHMENTS+placement.id) + + + placement.delete() + + if hits_internship >= 6: + print("all hits are working fine") + else: + print("some hits are not working fine") + logger.error("some test hits are not working fine for internship") + + if hits_placement >= 6: + print("all hits are working fine") + else: + print("some hits are not working fine") + logger.error("some test hits are not working fine for placement") + + except : + logger.error("error in clean up function") + logger.error(traceback.format_exc()) + + \ No newline at end of file diff --git a/CDC_Backend/APIs/utils.py b/CDC_Backend/APIs/utils.py index ff54a8a..3d87410 100644 --- a/CDC_Backend/APIs/utils.py +++ b/CDC_Backend/APIs/utils.py @@ -214,14 +214,16 @@ def sendEmail(email_to, subject, data, template, attachment_jnf_response=None): else: recipient_list = [str(email_to), ] - msg = EmailMultiAlternatives(subject, text_content, email_from,None,bcc=recipient_list) - msg.attach_alternative(html_content, "text/html") - if attachment_jnf_response: - # logger.info(attachment_jnf_response) - pdf = pdfkit.from_string(attachment_jnf_response['html'], False, - options={"--enable-local-file-access": "", '--dpi': '96'}) - msg.attach(attachment_jnf_response['name'], pdf, 'application/pdf') - msg.send() + #batch 100 ppl to send as bcc + for i in range(0,len(recipient_list),100): + msg = EmailMultiAlternatives(subject, text_content, email_from,None,bcc=recipient_list[i:i+100]) + msg.attach_alternative(html_content, "text/html") + if attachment_jnf_response: + # logger.info(attachment_jnf_response) + pdf = pdfkit.from_string(attachment_jnf_response['html'], False, + options={"--enable-local-file-access": "", '--dpi': '96'}) + msg.attach(attachment_jnf_response['name'], pdf, 'application/pdf') + msg.send() return True except: logger.error("Send Email: " + str(sys.exc_info())) @@ -248,11 +250,15 @@ def PlacementApplicationConditions(student, placement): return True, "Conditions Satisfied" for i in selected_companies: - if int(i.placement.tier) < int(placement.tier): + if int(i.placement.tier) != 1 and int(i.placement.tier) <= int(placement.tier): + return False, "Can't apply for this tier" + elif int(i.placement.tier) == 1 and int(placement.tier) != 1: return False, "Can't apply for this tier" for i in PPO: - if int(i.tier) < int(placement.tier): + if int(i.tier) != 1 and int(i.tier) <= int(placement.tier): + return False, "Can't apply for this tier" + elif int(i.tier) == 1 and int(placement.tier) != 1: return False, "Can't apply for this tier" if student.degree != 'bTech' and not placement.rs_eligible: @@ -455,7 +461,7 @@ def send_opening_notifications(opening_id, opening_type=PLACEMENT): logger.warning('Utils - send_opening_notifications: ' + str(sys.exc_info())) return False -def get_eligible_emails(opening_id, opening_type=PLACEMENT): +def get_eligible_emails(opening_id, opening_type=PLACEMENT,send_all=False): try: # print(opening_id, opening_type) if opening_type == PLACEMENT: @@ -471,6 +477,10 @@ def get_eligible_emails(opening_id, opening_type=PLACEMENT): isinstance(opening,Internship) and InternshipApplicationConditions(student, opening)[0]): try: student_user = get_object_or_404(User, id=student.id) + #if send_all True send all students eligible for the opening + if send_all: + emails.append(student_user.email) + continue # check if he applied if opening_type == PLACEMENT: if PlacementApplication.objects.filter(student=student, placement=opening).exists(): @@ -563,12 +573,13 @@ def send_email_for_opening(opening): @background_task.background(schedule=2) -def send_opening_to_notifications_service(id,name,deadline,role): +def send_opening_to_notifications_service(id,name,deadline,role,opening_type=PLACEMENT): data={ "id":id, "company":name, "deadline":deadline, - "role":role + "role":role, + "opening_type":opening_type } encoded=jwt.encode(data,os.environ.get("JWT_SECRET_KEY"),algorithm="HS256") data_={ diff --git a/CDC_Backend/CDC_Backend/settings.py b/CDC_Backend/CDC_Backend/settings.py index 355ba6d..174d9c7 100644 --- a/CDC_Backend/CDC_Backend/settings.py +++ b/CDC_Backend/CDC_Backend/settings.py @@ -47,7 +47,8 @@ INSTALLED_APPS = [ 'background_task', 'simple_history', 'import_export', - 'django_extensions' + 'django_extensions', + 'django_crontab', ] MIDDLEWARE = [ @@ -203,3 +204,7 @@ LOGGING = { } # django_heroku.settings(locals()) + +CRONJOBS = [ + ('0 8,20 * * *', 'APIs.cron.clean_up_tests') +] \ No newline at end of file diff --git a/CDC_Backend/run_prod.sh b/CDC_Backend/run_prod.sh index 6476aab..044b5e2 100644 --- a/CDC_Backend/run_prod.sh +++ b/CDC_Backend/run_prod.sh @@ -1 +1 @@ -gunicorn --certfile=/home/cdc/Desktop/1f9476e3959ebe60.crt --keyfile=/home/cdc/Desktop/star_iitdh_key.key --bind localhost:8000 CDC_Backend.wsgi --access-logfile access.log --error-logfile error.log --forwarded-allow-ips="cdc.iitdh.ac.in" & +gunicorn --certfile=/home/cdc/Desktop/1f9476e3959ebe60.crt --keyfile=/home/cdc/Desktop/star_iitdh_key.key --bind localhost:8000 CDC_Backend.wsgi --access-logfile access.log --error-logfile error.log --forwarded-allow-ips="cdc.iitdh.ac.in" diff --git a/requirements.txt b/requirements.txt index efc1a43..cf6cf51 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,6 +13,7 @@ Django==3.2.13 django-background-tasks==1.2.5 django-compat==1.0.15 django-cors-headers==3.11.0 +django-crontab==0.7.1 django-db-logger==0.1.12 django-extensions==3.2.1 django-import-export==2.8.0 diff --git a/setup.sh b/setup.sh index 1ba33a4..1bc917c 100755 --- a/setup.sh +++ b/setup.sh @@ -8,7 +8,7 @@ python3 manage.py migrate echo "Migrations complete" python3 manage.py collectstatic --noinput - +python3 manage.py crontab add DIR="./Storage" if [ -d "$DIR" ]; then ### Take action if $DIR exists ###