diff --git a/.DS_Store b/.DS_Store index b4c80e4..a7251e0 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.gitignore b/.gitignore index 40fddbd..2208f8f 100644 --- a/.gitignore +++ b/.gitignore @@ -143,4 +143,5 @@ dmypy.json dev.env #vscode settings -.vscode/ \ No newline at end of file +.vscode/ +.DS_Store \ No newline at end of file diff --git a/CDC_Backend/.DS_Store b/CDC_Backend/.DS_Store index 7f94099..bf7019b 100644 Binary files a/CDC_Backend/.DS_Store and b/CDC_Backend/.DS_Store differ diff --git a/CDC_Backend/APIs/companyViews.py b/CDC_Backend/APIs/companyViews.py index 6774a13..c7636b7 100644 --- a/CDC_Backend/APIs/companyViews.py +++ b/CDC_Backend/APIs/companyViews.py @@ -84,11 +84,9 @@ def addPlacement(request): # Add a contact person details in the opening opening.contact_person_name = data[CONTACT_PERSON_NAME] # Check if Phone number is Integer - if data[PHONE_NUMBER].isdigit(): - opening.phone_number = int(data[PHONE_NUMBER]) - else: - raise ValueError('Phone number should be integer') - + + opening.phone_number = data[PHONE_NUMBER] + opening.email = data[EMAIL] # Add a company location in the opening diff --git a/CDC_Backend/APIs/constants.py b/CDC_Backend/APIs/constants.py index ed2bfaf..8086e90 100644 --- a/CDC_Backend/APIs/constants.py +++ b/CDC_Backend/APIs/constants.py @@ -10,6 +10,7 @@ BRANCH_CHOICES = [ ['EP', 'EP'], ['CIVIL', 'CIVIL'], ['CHEMICAL', 'CHEMICAL'], + ['MNC','MNC'] ] ELIGIBLE_CHOICES = [ ["Btech", "Btech"], @@ -41,6 +42,7 @@ BATCHES = [ #change it accordingly "2020", ] BATCH_CHOICES = [ + ["2023","2023"], ["2022", "2022"], ["2021", "2021"], ["2020", "2020"], @@ -65,7 +67,8 @@ TIERS = [ ['7', 'Tier 7'], ['8', 'Open Tier'], ] - +bTech = 'Btech' +# not being used anywhere DEGREE_CHOICES = [ ['bTech', 'B.Tech'], ['ms/phd', 'MS/ PhD'], @@ -83,7 +86,10 @@ CDC_REPS_EMAILS = [ "satyapriya.gupta@iitdh.ac.in", "dhriti.ghosh@iitdh.ac.in", "suvamay.jana@iitdh.ac.in", - "ramesh.nayaka@iitdh.ac.in" + "ramesh.nayaka@iitdh.ac.in", + "210010003@iitdh.ac.in", + "210010046@iitdh.ac.in", + "210030035@iitdh.ac.in", ] CDC_REPS_EMAILS_FOR_ISSUE=[ #add reps emails "cdc.support@iitdh.ac.in", diff --git a/CDC_Backend/APIs/models.py b/CDC_Backend/APIs/models.py index 427b25b..59397ca 100644 --- a/CDC_Backend/APIs/models.py +++ b/CDC_Backend/APIs/models.py @@ -32,9 +32,9 @@ class Student(models.Model): default=list, blank=True) cpi = models.DecimalField(decimal_places=2, max_digits=4) can_apply = models.BooleanField(default=True, verbose_name='Registered') - can_apply_internship = models.BooleanField(default=True, verbose_name='Internship Registered') #added for internship + can_apply_internship = models.BooleanField(default=True, verbose_name='Internship Registered') changed_by = models.ForeignKey(User, blank=True, on_delete=models.RESTRICT, default=None, null=True) - degree = models.CharField(choices=DEGREE_CHOICES, blank=False, max_length=10, default=DEGREE_CHOICES[0][0]) + degree = models.CharField(choices=ELIGIBLE_CHOICES, blank=False, max_length=10, default=ELIGIBLE_CHOICES[0][0]) # should be ELIGIBLE_CHOICES isPwd = models.BooleanField(default=False, verbose_name='Person with Disability') isBacklog = models.BooleanField(default=False, verbose_name='Has Backlog') history = HistoricalRecords(user_model=User) @@ -92,7 +92,7 @@ class Placement(models.Model): default=list, blank=True) is_company_details_pdf = models.BooleanField(blank=False, default=False) contact_person_name = models.CharField(blank=False, max_length=JNF_TEXT_MAX_CHARACTER_COUNT) - phone_number = models.PositiveBigIntegerField(blank=False) + phone_number = models.CharField(max_length=15, blank=False) email = models.CharField(blank=False, max_length=JNF_SMALLTEXT_MAX_CHARACTER_COUNT, default="") city = models.CharField(blank=False, max_length=JNF_SMALLTEXT_MAX_CHARACTER_COUNT, default="") state = models.CharField(blank=False, max_length=JNF_SMALLTEXT_MAX_CHARACTER_COUNT, default="") @@ -383,7 +383,7 @@ class Internship(models.Model): is_selection_procedure_details_pdf = models.BooleanField(blank=False, default=False) #contact details of company person contact_person_name = models.CharField(blank=False, max_length=JNF_TEXT_MAX_CHARACTER_COUNT) - phone_number = models.PositiveBigIntegerField(blank=False) + phone_number = models.CharField(max_length=15, blank=False) email = models.EmailField(blank=False) # contact_person_designation = models.CharField(blank=False, max_length=JNF_SMALLTEXT_MAX_CHARACTER_COUNT, default="") # telephone_number = models.PositiveBigIntegerField(blank=True, default=None, null=True) diff --git a/CDC_Backend/APIs/studentViews.py b/CDC_Backend/APIs/studentViews.py index a324afc..e833af2 100644 --- a/CDC_Backend/APIs/studentViews.py +++ b/CDC_Backend/APIs/studentViews.py @@ -1,4 +1,6 @@ +from datetime import datetime as dt from rest_framework.decorators import api_view +from django.db.models import Q from .serializers import * from .utils import * @@ -48,7 +50,6 @@ def refresh(request): @isAuthorized(allowed_users=[STUDENT]) def studentProfile(request, id, email, user_type): try: - #print(id) studentDetails = get_object_or_404(Student, id=id) data = StudentSerializer(studentDetails).data @@ -101,10 +102,18 @@ def getDashboard(request, id, email, user_type): try: studentDetails = get_object_or_404(Student, id=id) - placements = Placement.objects.filter(allowed_batch__contains=[studentDetails.batch], - allowed_branch__contains=[studentDetails.branch], - deadline_datetime__gte=datetime.datetime.now(), - offer_accepted=True, email_verified=True).order_by('deadline_datetime') + filters = Q( + allowed_branch__contains=[studentDetails.branch], + eligiblestudents__contains=[studentDetails.degree], + deadline_datetime__gte=dt.now(), + offer_accepted=True, + email_verified=True + ) + + if studentDetails.degree == 'Btech': + filters &= Q(allowed_batch__contains=[studentDetails.batch]) + + placements = Placement.objects.filter(filters).order_by('deadline_datetime') filtered_placements = placement_eligibility_filters(studentDetails, placements) placementsdata = PlacementSerializerForStudent(filtered_placements, many=True).data diff --git a/CDC_Backend/APIs/utils.py b/CDC_Backend/APIs/utils.py index 9187682..9224e2c 100644 --- a/CDC_Backend/APIs/utils.py +++ b/CDC_Backend/APIs/utils.py @@ -238,31 +238,38 @@ def PlacementApplicationConditions(student, placement): PPO_PSU = [i for i in PPO if i.tier == 'psu'] # find length of PPO if len(selected_companies) + len(PPO) >= MAX_OFFERS_PER_STUDENT: - raise PermissionError("Max Applications Reached for the Season") + raise PermissionError("Max Applications Reached for the Season1") if len(selected_companies_PSU) > 0: - raise PermissionError('Selected for PSU Can\'t apply anymore') + raise PermissionError('Selected for PSU Can\'t apply anymore2') if len(PPO_PSU) > 0: - raise PermissionError('Selected for PSU Can\'t apply anymore') + raise PermissionError('Selected for PSU Can\'t apply anymore3') if placement.tier == 'psu': return True, "Conditions Satisfied" for i in selected_companies: - 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" + if 1.5 * i.placement.compensation_CTC > placement.compensation_CTC: + return False, "Can't apply for this Placement, 1.5 times CTC condition not satisfied" for i in PPO: - 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: - raise PermissionError("Can't apply for this placement") + if 1.5 * i.compensation > placement.compensation_CTC: + return False, "Can't apply for this Placement, 1.5 times CTC condition not satisfied" + if student.degree not in placement.eligiblestudents: + raise PermissionError("Can't apply for this placement4") + if student.degree == bTech and student.batch not in placement.allowed_batch: + raise PermissionError("Can't apply for this placement5") + if student.branch not in placement.allowed_branch: + raise PermissionError("Can't apply for this placement6") + if student.can_apply == False: + raise PermissionError("Can't apply for this placement7") + if student.isBacklog == True and placement.backlog_eligible == False: + raise PermissionError("Can't apply for this placement8") + if student.isPwd == True and placement.pwd_eligible == False: + raise PermissionError("Can't apply for this placement9") + if placement.cpi_eligible > student.cpi: + raise PermissionError("Can't apply for this placement10") return True, "Conditions Satisfied" @@ -275,9 +282,23 @@ def PlacementApplicationConditions(student, placement): def InternshipApplicationConditions(student, internship): try: selected_companies = InternshipApplication.objects.filter(student=student, selected=True) - if len(selected_companies)>=1: - # print("selected companies > 1") + if len(selected_companies) >= 1: return False, "You have already secured a Internship" + if student.degree not in internship.eligiblestudents: + raise PermissionError("Can't apply for this Internship") + if student.branch not in internship.allowed_branch: + raise PermissionError("Can't apply for this Internship") + if student.degree == 'bTech' and student.batch not in internship.allowed_batch: + raise PermissionError("Can't apply for this Internship") + if student.can_apply_internship == False: + raise PermissionError("Can't apply for this Internship") + if student.isBacklog == True and internship.backlog_eligible == False: + raise PermissionError("Can't apply for this Internship") + if student.isPwd == True and internship.pwd_eligible == False: + raise PermissionError("Can't apply for this Internship") + if internship.cpi_eligible > student.cpi: + raise PermissionError("Can't apply for this Internship") + return True, "Conditions Satisfied" except PermissionError as e: @@ -410,6 +431,8 @@ def placement_eligibility_filters(student, placements): except: logger.warning("Utils - placement_eligibility_filters: " + str(sys.exc_info())) return placements + + def internship_eligibility_filters(student, internships): try: filtered_internships = [] @@ -461,42 +484,48 @@ 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,send_all=False): + +def get_eligible_emails(opening_id, opening_type='PLACEMENT', send_all=False): try: - # print(opening_id, opening_type) - if opening_type == PLACEMENT: + if opening_type == 'PLACEMENT': opening = get_object_or_404(Placement, id=opening_id) else: opening = get_object_or_404(Internship, id=opening_id) - emails=[] + + emails = [] students = Student.objects.all() + for student in students.iterator(): - if student.branch in opening.allowed_branch: - if student.degree == 'bTech' or opening.rs_eligible is True: - if (isinstance(opening,Placement) and PlacementApplicationConditions(student, opening)[0]) or ( - isinstance(opening,Internship) and InternshipApplicationConditions(student, opening)[0]): - try: + if student.branch in opening.allowed_branch and student.degree in opening.eligiblestudents: + if student.degree == 'Btech' and student.batch in opening.allowed_batch: + if (isinstance(opening, Placement) and PlacementApplicationConditions(student, opening)[0]) or ( + isinstance(opening, Internship) and InternshipApplicationConditions(student, opening)[0]): + if (opening_type == 'PLACEMENT' and student.can_apply) or ( + opening_type == 'INTERNSHIP' and student.can_apply_internship): student_user = get_object_or_404(User, id=student.id) - #if send_all True send all students eligible for the opening + + # 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: + + # check if the student applied + if opening_type == 'PLACEMENT': if PlacementApplication.objects.filter(student=student, placement=opening).exists(): continue else: if InternshipApplication.objects.filter(student=student, internship=opening).exists(): continue + emails.append(student_user.email) - except Exception as e: - logger.warning('Utils - send_opening_notifications: For Loop' + str(e)) - return False, [] + return True, emails - except: - logger.warning('Utils - send_opening_notifications: ' + str(sys.exc_info())) + + except Exception as e: + logger.warning('Utils - send_opening_notifications: ' + str(e)) return False, [] + def exception_email(opening): opening = opening.dict() data = { diff --git a/CDC_Backend/CDC_Backend/settings.py b/CDC_Backend/CDC_Backend/settings.py index 174d9c7..ddddada 100644 --- a/CDC_Backend/CDC_Backend/settings.py +++ b/CDC_Backend/CDC_Backend/settings.py @@ -30,7 +30,7 @@ DEBUG = os.environ.get('DEBUG') == "True" ALLOWED_HOSTS = ['cdc.iitdh.ac.in', 'localhost'] -ADMINS = [ ('Karthik Mv', '200010030@iitdh.ac.in')] +ADMINS = [ ('Jaya Surya', '210020040@iitdh.ac.in')] # Application definition INSTALLED_APPS = [