diff --git a/employer_recommendation_system/emp/migrations/0058_studentgrade.py b/employer_recommendation_system/emp/migrations/0058_studentgrade.py new file mode 100644 index 00000000..d32960a2 --- /dev/null +++ b/employer_recommendation_system/emp/migrations/0058_studentgrade.py @@ -0,0 +1,27 @@ +# Generated by Django 3.2 on 2022-06-13 12:01 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('emp', '0057_student_profile_update_date'), + ] + + operations = [ + migrations.CreateModel( + name='StudentGrade', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('grade', models.DecimalField(decimal_places=5, default=0.0, max_digits=10)), + ('date_created', models.DateField(auto_now_add=True, null=True)), + ('date_updated', models.DateTimeField(auto_now=True)), + ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='emp.student')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/employer_recommendation_system/emp/models.py b/employer_recommendation_system/emp/models.py index 1e5c075c..d485d51b 100644 --- a/employer_recommendation_system/emp/models.py +++ b/employer_recommendation_system/emp/models.py @@ -207,6 +207,14 @@ def get_absolute_url(self): url = str(self.id)+'/'+'profile' return reverse('student_profile',kwargs={'pk':self.id}) + +class StudentGrade(models.Model): + student=models.ForeignKey(Student,on_delete=models.CASCADE) + user=models.OneToOneField(User,on_delete=models.CASCADE) + grade=models.DecimalField(max_digits = 10, decimal_places = 5, default=0.00) + date_created = models.DateField(auto_now_add=True, null=True,blank=True) + date_updated = models.DateTimeField(auto_now=True) + class Company(models.Model): name = models.CharField(max_length=200) emp_name = models.CharField(max_length=200,verbose_name="Company HR Representative Name") #Name of the company representative diff --git a/employer_recommendation_system/emp/templates/emp/base.html b/employer_recommendation_system/emp/templates/emp/base.html index 6fb9efb7..2a901dbd 100644 --- a/employer_recommendation_system/emp/templates/emp/base.html +++ b/employer_recommendation_system/emp/templates/emp/base.html @@ -197,15 +197,21 @@ View Jobs + + - - diff --git a/employer_recommendation_system/emp/templates/emp/upload_users_csv.html b/employer_recommendation_system/emp/templates/emp/upload_users_csv.html new file mode 100644 index 00000000..babaf42d --- /dev/null +++ b/employer_recommendation_system/emp/templates/emp/upload_users_csv.html @@ -0,0 +1,33 @@ +{% extends 'emp/base.html' %} + +{% load crispy_forms_tags %} + +{% block content-header %}Upload User CSV{% endblock %} + +{% block content %} +{% for message in messages %} +
+ {{ message|safe }} +
+{% endfor %} +{% include "emp/page_header.html" with title="Upload User CSV" icon="" %} + + + + +
+{% csrf_token %} +
+ +
+ +
+
+
+
+ +
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/employer_recommendation_system/emp/urls.py b/employer_recommendation_system/emp/urls.py index 4f883f15..f05cdb11 100644 --- a/employer_recommendation_system/emp/urls.py +++ b/employer_recommendation_system/emp/urls.py @@ -1,6 +1,7 @@ from django.urls import path from .views import * from . import views +# app_name = 'emp' urlpatterns = [ path('',views.index,name='index'), @@ -27,6 +28,8 @@ path('my_jobs/', views.student_jobs, name='student_jobs'), path('job//', JobDetailView.as_view(), name='job-detail'), path('job_listings/', JobListingView.as_view(), name='job-listing'), + + path('upload_users_csv/', views.upload_users_csv, name='upload_users_csv'), path('api/jobs//',views.jobs,name='jobs'), ################### jobshortlist path('job_application_status/', JobAppStatusListView.as_view(), name='job-app-status'), diff --git a/employer_recommendation_system/emp/views.py b/employer_recommendation_system/emp/views.py index 54313286..f8e8d7d5 100644 --- a/employer_recommendation_system/emp/views.py +++ b/employer_recommendation_system/emp/views.py @@ -1,5 +1,7 @@ from django.shortcuts import render,redirect -from django.contrib.auth import logout +from django.contrib.auth import authenticate,login,logout +from django.contrib.auth.models import Group,User + from events.models import * from .models import * @@ -48,8 +50,102 @@ from .utility import * from .helper import * from collections import defaultdict +import logging + + +import random, os + +# STATUS = {'ACTIVE' :1,'INACTIVE' :0} + +APPLIED = 0 # student has applied but not yet shortlisted by HR Manager +APPLIED_SHORTLISTED = 1 # student has applied & shortlisted by HR Manager + +RATING = { + 'ONLY_VISIBLE_TO_ADMIN_HR':0, + 'DISPLAY_ON_HOMEPAGE':1, + 'VISIBLE_TO_ALL_USERS':2 +} + +JOB_RATING=[(RATING['VISIBLE_TO_ALL_USERS'],'Visible to all users'),(RATING['ONLY_VISIBLE_TO_ADMIN_HR'],'Only visible to Admin/HR'),(RATING['DISPLAY_ON_HOMEPAGE'],'Display on homepage')] +JOB_STATUS=[(1,'Active'),(0,'Inactive')] +COMPANY_RATING = [(RATING['VISIBLE_TO_ALL_USERS'],'Visible to all users'),(RATING['ONLY_VISIBLE_TO_ADMIN_HR'],'Only visible to Admin/HR'),(RATING['DISPLAY_ON_HOMEPAGE'],'Display on homepage')] + +CURRENT_EDUCATION = 1 +PAST_EDUCATION = 2 +JOB_APP_STATUS = {'RECEIVED_APP':0,'FIRST_SHORTLIST':1,'REJECTED':2} +DEFAULT_JOB_TYPE=1 +SECOND_SHORTLIST_EMAIL = 2 +MANDATORY_FOSS = 1 +OPTIONAL_FOSS = 2 + + +# test functions to limit access to pages start +def is_student(user): + b = settings.ROLES['STUDENT'][1] in [x.name for x in user.groups.all()] + return settings.ROLES['STUDENT'][1] in [x.name for x in user.groups.all()] + +def is_manager(user): + b = settings.ROLES['MANAGER'][1] in [x.name for x in user.groups.all()] + return settings.ROLES['MANAGER'][1] in [x.name for x in user.groups.all()] + +def check_student(view_func): + @wraps(view_func) + def inner(request,pk, *args, **kwargs): + if request.user.student.id!=int(pk): + raise PermissionDenied() + return view_func(request,pk, *args, **kwargs) + return inner + +def is_spoken_user(email): + try: + return User.objects.using('spk').get(email__iexact=email) + except: + return None + +def is_spoken_student(userid): + try: + return SpokenStudent.objects.using('spk').get(user_id=userid) + except: + return None + + + +def check_student_job(view_func): + @wraps(view_func) + def inner(request,pk,job, *args, **kwargs): + student = request.user.student + job_obj = Job.objects.get(id=job) + jobs = get_recommended_jobs(student) + if student.id!=int(pk) or not job_obj in jobs: + raise PermissionDenied() + return view_func(request,pk,job, *args, **kwargs) + return inner + +def check_user(view_func): + @wraps(view_func) + def inner(request,pk, *args, **kwargs): + if request.user.id!=int(pk): + raise PermissionDenied() + return view_func(request,pk, *args, **kwargs) + return inner +# test functions to limit access to pages ends +def access_profile(view_func): + @wraps(view_func) + def inner(request,id,job, *args, **kwargs): + if is_manager(request.user): + return view_func(request,id,job, *args, **kwargs) + if is_student(request.user): + rec_jobs = get_recommended_jobs(request.user.student) + try: + job_obj = Job.objects.get(id=job) + if job_obj in rec_jobs and request.user.student.spk_usr_id==int(id): + return view_func(request,id,job, *args, **kwargs) + except: + raise PermissionDenied() + raise PermissionDenied() + return inner + -import os @check_user def document_view(request,pk): try: @@ -1434,6 +1530,119 @@ def notify_student(request): return response return HttpResponse("Success!") +def get_create_user(row): + msg = "" + fields = row.split(",") + try: + email = fields[2].strip() + jrs_user = User.objects.get(email=email) + msg ="{email} : User already present in JRS".format(email=email) + + try: + jrs_student = Student.objects.get(user=jrs_user) + except: + jrs_student = Student(user=jrs_user, gender=fields[3]) + jrs_student.save() + + + #save to student_grade table + try: + student_grade = StudentGrade(user=jrs_user, student=jrs_student, grade=fields[4]) + student_grade.save() + except: + msg +="{email} : User entry already added in grade table".format(email=email) + + return jrs_user, msg + + except User.DoesNotExist: + #user not in JRS + sp_user = is_spoken_user(email)#check user in spoken + + + if sp_user: + spuserid = sp_user.id + #create user in JRS + user = User(username=email, email=email, first_name=fields[0], last_name=fields[1]) + #assign groups + stg = Group.objects.get(name='ST_USER') + fsg = Group.objects.get(name='FS_STUDENT') + user.save() + + sp_student = is_spoken_student(spuserid)#check user in spoken student role + print(sp_student,"###################") + + if sp_student: + #id student in spoken assign student role in JRS + st_stud = Group.objects.get(name='STUDENT') + st_stud.user_set.add(user) + + stg.user_set.add(user) + fsg.user_set.add(user) + + + msg = "{email} : User present in spoken records.Assigned Spoken and Fossee Student role ".format(email=email) + + + + #send_registration_confirmation_mail + else: + print("Not a spoken user entry") + spuserid = None + #create Jrs user without spoken userid + user = User(username=email, email=email, first_name=fields[0], last_name=fields[1]) + user.set_password(fields[0]+'@ST123') + user.save() + + fsg = Group.objects.get(name='FS_STUDENT') + fsg.user_set.add(user) + msg = "{email} : User not present in spoken records.Assigned Fossee Student role ".format(email=email) + #send_registration_confirmation_mail + + #create student entry + student = Student(user=user, gender=fields[3], spk_usr_id=spuserid) + student.save() + + #save to student_grade table + student_grade = StudentGrade(user=user, student=student, grade=fields[4]) + student_grade.save() + + return user, msg + +@user_passes_test(is_manager) +def upload_users_csv(request): + data = {} + student_count = 0 + if request.method == 'GET': + return render(request, 'emp/upload_users_csv.html', data) + # if not GET, then proceed with processing + try: + csv_file = request.FILES["csv_file"] + if not csv_file.name.endswith('.csv'): + messages.error(request,'File is not CSV type') + return HttpResponseRedirect(reverse("upload_users_csv")) + + file_data = csv_file.read().decode("utf-8") + + lines = file_data.split("\n") + + #loop over the lines and save them in db. If error shows up , store as string and then display + for row in lines: + if not row: + break + print("1 print", row) + user, msg = get_create_user(row) + print(msg) + + student_count = student_count+1 + messages.warning(request, msg) + + except Exception as e: + logging.getLogger("error_logger").error("Unable to upload file. "+repr(e)) + messages.error(request,"Unable to upload CVS file. "+repr(e)) + + return HttpResponseRedirect(reverse("upload_users_csv")) + + def jobs(request, req_user): context={} try: @@ -1473,4 +1682,5 @@ def get_foss(value): foss = [FossCategory.objects.get(id=x).foss for x in foss_ids] if foss: return foss - return [] \ No newline at end of file + return [] + diff --git a/employer_recommendation_system/events/migrations/0011_auto_20220613_1201.py b/employer_recommendation_system/events/migrations/0011_auto_20220613_1201.py new file mode 100644 index 00000000..0b611284 --- /dev/null +++ b/employer_recommendation_system/events/migrations/0011_auto_20220613_1201.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2 on 2022-06-13 12:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('events', '0010_auto_20220513_1800'), + ] + + operations = [ + migrations.AlterField( + model_name='event', + name='end_date', + field=models.DateField(), + ), + migrations.AlterField( + model_name='event', + name='start_date', + field=models.DateField(), + ), + ]