diff --git a/AlumniConnect/decorators.py b/AlumniConnect/decorators.py index b5b7269a..15f2e8af 100644 --- a/AlumniConnect/decorators.py +++ b/AlumniConnect/decorators.py @@ -12,7 +12,7 @@ def wrapper(request,*args, **kwargs): user = request.user if not (user.is_authenticated): return HttpResponseRedirect('/') # case when user is not logged in - elif (not user.profile.verify) and ( user.is_authenticated == True): + elif (not user.profile.verify) and ( user.is_authenticated == True) and (request.path != '/complete_profile/'): return HttpResponseRedirect('/complete_profile/') # case when user is logged in but haven't completed profile as after completing profile only user will be able to login else: return function(request,*args,**kwargs) diff --git a/AlumniConnect/urls.py b/AlumniConnect/urls.py index 3e56ff44..cf9b93d8 100644 --- a/AlumniConnect/urls.py +++ b/AlumniConnect/urls.py @@ -41,6 +41,7 @@ path('register/', views.register, name='register'), path('newregister/', views.new_register, name='new_register'), re_path(r'^activate/(?P[0-9A-Za-z_\-]+)/(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', views.activate, name='activate'), + path('activate/resend', views.resend_activation, name='resendactivate'), path('confirm/', TemplateView.as_view(template_name='AlumniConnect/confirm_email.html'), name = 'confirm'), path('success/', TemplateView.as_view(template_name='AlumniConnect/account_success.html'), name = 'success'), re_path('^', include('django.contrib.auth.urls')), @@ -60,7 +61,8 @@ path('chapter/', include('applications.chapter.urls')), path('adminportal/', include('applications.adminportal.urls')), path('jobs/', include('applications.job_posting.urls')), - re_path(r'favicon.ico', favicon_view) + re_path(r'favicon.ico', favicon_view), + path('constitution/', views.constitution, name='constitution'), #path('', views.index, name='home'), ] diff --git a/AlumniConnect/views.py b/AlumniConnect/views.py index 736de983..13d8511a 100644 --- a/AlumniConnect/views.py +++ b/AlumniConnect/views.py @@ -162,7 +162,7 @@ def signup(request): form = SignupForm() return render(request, "AlumniConnect/signup.html", {'form': form}) - +@custom_login_required def complete_profile(request): user = request.user @@ -173,7 +173,14 @@ def complete_profile(request): # admin does not have any profile return redirect('home') - + try: + # if profile is already completed then redirect to home + if profile.verify or profile.reg_no: + return redirect('home') + except: + pass + + #creating context for form batches = list(Batch.objects.all().order_by('batch')) context = {'edit': False, 'programmes': Constants.PROG_CHOICES,'branches': Constants.BRANCH, 'batches': batches, 'admission_years': Constants.YEAR_OF_ADDMISSION,'user_roll_no':user.username,'user_email':user.email} @@ -252,7 +259,9 @@ def reg_no_gen(degree_, spec_, year): def convert_int(number, decimals): return str(number).zfill(decimals) - +""" + This function needs to be depricated in new signup workflow. +""" def new_register(request): if request.method == 'POST': form = NewRegister(request.POST, request.FILES) @@ -316,9 +325,17 @@ def activate(request, uidb64, token): print(uid) u = User.objects.get(pk=uid) print(u) + profile = Profile.objects.get(user=u) except(TypeError, ValueError, OverflowError): u = None - if u is not None and account_activation_token.check_token(u, token): + profile = None + + # do not log in users with complete profiles + if profile and (profile.verify or profile.reg_no): + messages.warning(request, 'Please log in through password.') + return redirect('/') + + if u and account_activation_token.check_token(u, token): u.is_active = True u.save() login(request, u) @@ -329,6 +346,67 @@ def activate(request, uidb64, token): return HttpResponse('Activation link is invalid!') return redirect('/') +''' + Incase the user does not complete their profile while the link + is active they can generate a new link by providing the old link. +''' +def resend_activation(request): + # checking if user is already logged in + if request.user and request.user.is_authenticated: + return redirect('home') + + if request.method == 'POST': + form = AuthenticationForm(request,data = request.POST) + if form.is_valid(): + username = form.cleaned_data.get('username') + user = User.objects.get(username = username) + profile = Profile.objects.get(user = user) + + # if user is admin no need to check other thing + if user.is_staff: + messages.success(request, "Invalid user, admin can login directly") + return redirect('/login') + + # if user already verified, login the user + if profile.verify: + login(request,user) + messages.success(request, "Your account is already verified!") + return redirect('home') + + # make new activation link + if user and profile: + # re-sending mail for activation + current_site = get_current_site(request) + from_email = settings.DEFAULT_FROM_EMAIL + to = [user.email] + subject = "[noreply] SAC Account Activation" + html_message = render_to_string('AlumniConnect/account_activation_email.html', { + 'user':user, + 'domain':current_site, + 'uid':urlsafe_base64_encode(force_bytes(user.pk)), + 'token':account_activation_token.make_token(user) + }) + plain_message = strip_tags(html_message) + send_mail( + subject = subject, + message = plain_message, + from_email = from_email, + recipient_list=to, + html_message = html_message, + fail_silently=False, + ) + messages.success(request, "Mail sent successfully.") + return render(request,"AlumniConnect/confirm_email.html") + + else: + messages.error(request, 'Something went wrong.') + return redirect('/') + + else: + return render(request,'AlumniConnect/resend_activation_link.html',{'form':form}) + + form = AuthenticationForm() + return render(request,'AlumniConnect/resend_activation_link.html',{'form':form}) @custom_login_required def change_password(request): @@ -344,3 +422,6 @@ def change_password(request): else: form = PasswordChangeForm(request.user) return render(request, 'AlumniConnect/change_password.html', {'form': form}) + +def constitution(request): + return render(request, 'AlumniConnect/constitution.html') \ No newline at end of file diff --git a/applications/members/urls.py b/applications/members/urls.py index 9b483c1a..72b95434 100644 --- a/applications/members/urls.py +++ b/applications/members/urls.py @@ -12,7 +12,7 @@ urlpatterns = [ re_path(r'^(?P[0-9]{4})/', include(extrapatterns)), # old link - path('sacbody/', views.sacbody, name="sacbody"), + # path('sacbody/', views.sacbody, name="sacbody"), # new link path('alumnibody/', views.alumnibody, name="alumnibody"), path('search/', views.search, name='search'), diff --git a/applications/members/views.py b/applications/members/views.py index fb0c948d..efc0bad5 100644 --- a/applications/members/views.py +++ b/applications/members/views.py @@ -1,26 +1,37 @@ -import json +from importlib.metadata import requires +import json from django.shortcuts import render, redirect -from django.db.models import Count, Q +from django.db.models import Count from django.http import JsonResponse from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required from applications.alumniprofile.models import Profile from AlumniConnect.decorators import custom_login_required +from django.contrib import messages # Create your views here. def index(request): counts = Profile.objects.filter(verify=True).values('batch').order_by('-batch').annotate(count=Count('batch')) - # print(len(counts)) total = 0 + for batch, count in counts.values_list('batch', 'count'): total += count - return render(request, "members/index.html", {'data': counts.values_list('batch', 'count'), 'total': total}) + + data = counts.values_list('batch', 'count') + + context = { + 'data': data, + 'total': total, + } + + return render(request, "members/index.html",context) def batch(request, year): + programmes = Profile.objects.values_list('programme', flat=True).distinct() data = {} for row in programmes: @@ -30,18 +41,16 @@ def batch(request, year): for item in result: data[row][item['branch']] = item['count'] - # print(data) #prints {'B.Des': {'CSE': 1}, 'B.Tech': {'CSE': 1, 'ME': 1}} return render(request, "members/year.html", {'data': data, 'year': year}) def branch(request, programme, year, branch): # todo: change mail_sent to verify alumni = Profile.objects.filter(programme=programme, batch=year, branch=branch, verify=True) - # print(alumni) return render(request, "members/branch.html", {'data': alumni, 'batch': year, 'branch': branch}) -def sacbody(request): - return redirect('members:alumnibody') +# def sacbody(request): +# return redirect('members:alumnibody') def alumnibody(request): return render(request, "members/alumnibody.html") @@ -49,46 +58,60 @@ def alumnibody(request): @custom_login_required def search(request): - key = request.GET['search'] - profiles = Profile.objects.filter(name__icontains=key) | Profile.objects.filter( - roll_no__icontains=key) | Profile.objects.filter(reg_no__icontains=key) - if len(request.GET) > 1: - if request.GET['batch'] != '': - batch = request.GET['batch'] - print(batch) + profiles = Profile.objects.all() + if len(request.POST) > 1: + if request.POST['search'] != '': + key = request.POST['search'] + profiles = profiles.filter(name__icontains=key) | Profile.objects.filter( + roll_no__icontains=key) | Profile.objects.filter(reg_no__icontains=key) + + if request.POST['batch'] != '': + batch = request.POST['batch'] profiles = profiles.filter(batch=batch) - print(profiles) - if request.GET['city'] != '': - city = request.GET['city'] + + if request.POST['city'] != '': + city = request.POST['city'] profiles = profiles.filter(city__icontains=city) - if request.GET['programme'] != 'Programme': - programme = request.GET['programme'] + + if request.POST['programme'] != '': + programme = request.POST['programme'] profiles = profiles.filter(programme__icontains=programme) - if request.GET['branch'] != '': - branch = request.GET['branch'] + + if request.POST['branch'] != '': + branch = request.POST['branch'] profiles = profiles.filter(branch__icontains=branch) - if request.GET['org'] != '': - org = request.GET['org'] + + if request.POST['org'] != '': + org = request.POST['org'] profiles1 = profiles.filter(current_organisation__icontains=org) profiles2 = profiles.filter(current_university__icontains=org) profiles = profiles1 | profiles2 + profiles = profiles.order_by('name') + context = {'profiles': profiles, - 'keyy': key, + 'keyy': 1, 'zero': len(profiles), - 'request': request.GET + 'request': request.POST } - return render(request, "members/index.html", context) + + if len(profiles): + messages.success(request,"Total "+str(len(profiles))+" Alumni Found") + else: + messages.error(request, "No Result Found ") + + + return render(request, "members/index.html", context) def autoSearch(request): if request.is_ajax(): + # print(request.POST['term'], request.GET['te']) key = request.GET['term'] search_qs = Profile.objects.filter(name__icontains=key) | Profile.objects.filter( roll_no__icontains=key) | Profile.objects.filter(reg_no__icontains=key) data = [] for r in search_qs: - print(r.name) data.append(r.name) else: data = 'fail' @@ -105,5 +128,5 @@ def mapSearch(request): 'keyy': key, 'zero': len(profiles), 'map': True - } + } return render(request, "members/index.html", context) diff --git a/static/AlumniConnect/assets/alumni_constitution.pdf b/static/AlumniConnect/assets/alumni_constitution.pdf new file mode 100644 index 00000000..fb8c8aaf Binary files /dev/null and b/static/AlumniConnect/assets/alumni_constitution.pdf differ diff --git a/static/AlumniConnect/assets/minutes_of_meeting_2022.pdf b/static/AlumniConnect/assets/minutes_of_meeting_2022.pdf new file mode 100644 index 00000000..a12ec9ab Binary files /dev/null and b/static/AlumniConnect/assets/minutes_of_meeting_2022.pdf differ diff --git a/static/AlumniConnect/img/people/Chirag.jpeg b/static/AlumniConnect/img/people/Chirag.jpeg new file mode 100644 index 00000000..8f239c60 Binary files /dev/null and b/static/AlumniConnect/img/people/Chirag.jpeg differ diff --git a/static/AlumniConnect/img/people/Mihir.jpeg b/static/AlumniConnect/img/people/Mihir.jpeg new file mode 100644 index 00000000..ada23016 Binary files /dev/null and b/static/AlumniConnect/img/people/Mihir.jpeg differ diff --git a/static/AlumniConnect/img/people/srijan.jpg b/static/AlumniConnect/img/people/srijan.jpg new file mode 100644 index 00000000..32302bc7 Binary files /dev/null and b/static/AlumniConnect/img/people/srijan.jpg differ diff --git a/templates/AlumniConnect/constitution.html b/templates/AlumniConnect/constitution.html new file mode 100644 index 00000000..d2f9ad75 --- /dev/null +++ b/templates/AlumniConnect/constitution.html @@ -0,0 +1,49 @@ +{% extends 'globals/base.html' %} +{% load static %} + +{% block title %} +Alumni Constitution +{% endblock %} + +{% block css %} + +{% endblock %} + +{% block body %} + +{% include 'globals/navbar.html' %} + +
+ +
+
+
+
+

+ ALUMNI CONSTITUTION +

+
+
+
+
+
+ +
+{% endblock %} + +{% include 'globals/footer.html' %} \ No newline at end of file diff --git a/templates/AlumniConnect/login.html b/templates/AlumniConnect/login.html index c55e74d5..40d9b47a 100644 --- a/templates/AlumniConnect/login.html +++ b/templates/AlumniConnect/login.html @@ -34,7 +34,7 @@

-

Forgot Password?

+ diff --git a/templates/AlumniConnect/resend_activation_link.html b/templates/AlumniConnect/resend_activation_link.html new file mode 100644 index 00000000..28d414b7 --- /dev/null +++ b/templates/AlumniConnect/resend_activation_link.html @@ -0,0 +1,76 @@ +{% extends 'globals/base.html' %} +{% load static %} + +{% block title %} +Alumni Connect - Login +{% endblock %} + +{% block body %} +{% include 'globals/navbar.html' %} +
+ +
+
+
+
+

+ +

+
+
+

+ ALUMNI CONNECT +

+
+
+
+
+ +
+
+ +
+ +
+{% include 'globals/footer.html' %} +{% endblock %} \ No newline at end of file diff --git a/templates/AlumniConnect/signup.html b/templates/AlumniConnect/signup.html index fcf97cb9..ecd3759c 100644 --- a/templates/AlumniConnect/signup.html +++ b/templates/AlumniConnect/signup.html @@ -114,4 +114,4 @@

SIGN UP

{% include 'globals/footer.html' %} -{% endblock body %} \ No newline at end of file +{% endblock body %} diff --git a/templates/events_news/index.html b/templates/events_news/index.html index 45b761e0..e4ed9b7c 100644 --- a/templates/events_news/index.html +++ b/templates/events_news/index.html @@ -1,6 +1,22 @@ {% extends 'globals/base.html' %} {% load static %} - +{% block css%} + +{%endblock%} {% block title %} Events {% endblock %} @@ -24,7 +40,10 @@

- +
+

Minutes of Meeting - Alumni Meet 2022

+ +
{% for item in events %}
diff --git a/templates/globals/navbar.html b/templates/globals/navbar.html index 5affdb6c..25493536 100644 --- a/templates/globals/navbar.html +++ b/templates/globals/navbar.html @@ -49,37 +49,17 @@
  • Publications
  • IIIT Jabalpur
  • Alumni Body
  • +
  • Alumni Constitution
  • - - {% if not user.is_authenticated %} {% else %}