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
+
+
+
+ Upload User CSV
+
+
-
+
Add Event
-
+
View Events
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="" %}
+
+
+
+
+
+
+{% 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(),
+ ),
+ ]