From 4fb30bc7dc02a4ca17aec13ca83d2d23fe9ae632 Mon Sep 17 00:00:00 2001 From: adityacp Date: Thu, 13 Aug 2020 16:51:11 +0530 Subject: Fix and refactor statistics app --- statistics_app/forms.py | 48 ++ .../templates/statistics_app/paginator.html | 34 ++ .../templates/statistics_app/team_stats.html | 152 ++--- .../statistics_app/workshop_public_stats.html | 459 ++++----------- statistics_app/urls.py | 12 +- statistics_app/views.py | 613 +++------------------ 6 files changed, 320 insertions(+), 998 deletions(-) create mode 100644 statistics_app/forms.py create mode 100644 statistics_app/templates/statistics_app/paginator.html diff --git a/statistics_app/forms.py b/statistics_app/forms.py new file mode 100644 index 0000000..cd04cd3 --- /dev/null +++ b/statistics_app/forms.py @@ -0,0 +1,48 @@ +from django import forms +from django.utils import timezone + +from workshop_app.models import states, WorkshopType + + +class FilterForm(forms.Form): + from_date = forms.DateField( + widget=forms.DateInput( + attrs={'type': 'date', 'class': 'form-control'} + ) + ) + to_date = forms.DateField( + widget=forms.DateInput( + attrs={'type': 'date', 'class': 'form-control'} + ) + ) + workshop_type = forms.ModelChoiceField( + queryset=WorkshopType.objects.all(), required=False, + widget=forms.Select(attrs={'class': 'form-control'}) + ) + state = forms.ChoiceField( + choices=states, required=False, + widget=forms.Select(attrs={'class': 'form-control'}) + ) + show_workshops = forms.BooleanField( + help_text="Show my workshops only", required=False, + ) + sort = forms.ChoiceField( + choices=(("date", "Oldest"), ("-date", "Latest")), + help_text="Sort by", + widget=forms.Select(attrs={'class': 'form-control'}) + ) + def __init__(self, *args, **kwargs): + start = kwargs.pop("start") if "start" in kwargs else None + end = kwargs.pop("end") if "end" in kwargs else None + selected_state = kwargs.pop("state") if "state" in kwargs else None + selected_type = kwargs.pop("type") if "type" in kwargs else None + show_workshops = (kwargs.pop("show_workshops") + if "show_workshops" in kwargs else None) + sort = kwargs.pop("sort") if "sort" in kwargs else None + super(FilterForm, self).__init__(*args, **kwargs) + self.fields["from_date"].initial = start + self.fields["to_date"].initial = end + self.fields["state"].initial = selected_state + self.fields["workshop_type"].initial = selected_type + self.fields["show_workshops"].initial = show_workshops + self.fields["sort"].initial = sort diff --git a/statistics_app/templates/statistics_app/paginator.html b/statistics_app/templates/statistics_app/paginator.html new file mode 100644 index 0000000..9f0840a --- /dev/null +++ b/statistics_app/templates/statistics_app/paginator.html @@ -0,0 +1,34 @@ + \ No newline at end of file diff --git a/statistics_app/templates/statistics_app/team_stats.html b/statistics_app/templates/statistics_app/team_stats.html index 4e3e870..0342f61 100644 --- a/statistics_app/templates/statistics_app/team_stats.html +++ b/statistics_app/templates/statistics_app/team_stats.html @@ -4,121 +4,45 @@ Workshop Statistics {% endblock %} - -{% block extra %} - - - - - - - - - - - - - - - - - - -{% endblock %} - {% block content %} -
-
-
-
-
- - - -
- -
-
+
+
+
+ +
+
+
+ +
+
-
+ {% endblock %} diff --git a/statistics_app/templates/statistics_app/workshop_public_stats.html b/statistics_app/templates/statistics_app/workshop_public_stats.html index a42f818..c6753f8 100644 --- a/statistics_app/templates/statistics_app/workshop_public_stats.html +++ b/statistics_app/templates/statistics_app/workshop_public_stats.html @@ -1,346 +1,129 @@ {% extends 'workshop_app/base.html' %} -{% block title %} - Open Statistics -{% endblock %} - -{% block extra %} - - - - - - - - - - - - - - - - - -{% endblock %} +{% block title %} Statistics {% endblock %} {% block content %} +
+
+
+
+
+

Filters

+
+
From date: {{form.from_date}}
+
To date: {{form.to_date}}
+
Workshop: {{form.workshop_type}}
+
State: {{form.state}}
+
{{form.sort.help_text}}: {{form.sort}}
+ {% if request.user.is_authenticated %} +
{{form.show_workshops.help_text}}: {{form.show_workshops}}
+ {% endif %} +
+
+
+ +
+ +
+
+
+
+
+
+
+
+ {% include "statistics_app/paginator.html" %} +
+
+ +
+
+ +
+
+ + + + + + + + + + + + {% csrf_token %} + {% for workshop in objects %} + + + + + + + + + + + {% endfor %} +
Sr No.Coordinator NameInstitute NameInstructor NameWorkshop NameWorkshop Date
{{ forloop.counter0|add:objects.start_index}}{{ workshop.coordinator.get_full_name | capfirst }}{{ workshop.coordinator.profile.institute | capfirst }}{{ workshop.instructor.get_full_name }}{{ workshop.workshop_type.name }}{{ workshop.date | date}}
+ {% include "statistics_app/paginator.html" %} +
+
+
-
-
-
-
- - - - -
-
- -
-
- {% csrf_token %} -
- - - - -   -
- - - - - -
-
- - {% if messages %} -
    - {% for message in messages %} -
    -
  • {{ message }} -
  • -
    - {% endfor %} -
- {% endif %} - -
-
- - - - - - - - - - - - {% csrf_token %} - {% for workshop in workshop_list %} - {% if workshop.proposed_workshop_date %} - - - - - - - - - - - {% else %} - - - - - - - - - - - {% endif %} - {% endfor %} -
Coordinator NameInstitute NameInstructor NameWorkshop NameWorkshop DateInitiated By
{{ workshop.proposed_workshop_coordinator.get_full_name | capfirst }}{{ workshop.proposed_workshop_coordinator.profile.institute | capfirst }}{{ workshop.proposed_workshop_instructor.get_full_name }}{{ workshop.proposed_workshop_title.workshoptype_name }}{{ workshop.proposed_workshop_date | date}}Coordinator
{{ workshop.requested_workshop_coordinator.get_full_name | capfirst }}{{ workshop.requested_workshop_coordinator.profile.institute | capfirst }}{{ workshop.requested_workshop_instructor.get_full_name }}{{ workshop.requested_workshop_title.workshoptype_name }}{{ workshop.requested_workshop_date | date}}Instructor
- - -
- -
-
- -
-
-
-
- - - -
+ -
-
-
-
{% endblock %} diff --git a/statistics_app/urls.py b/statistics_app/urls.py index 8950e37..05d7ac9 100644 --- a/statistics_app/urls.py +++ b/statistics_app/urls.py @@ -1,12 +1,10 @@ - -from django.conf.urls import url -from django.contrib import admin +from django.urls import path from statistics_app import views +app_name = "statistics_app" urlpatterns = [ - url(r'^statistics/$', views.workshop_stats), - url(r'^statistics/public_stats/$', views.workshop_public_stats), - url(r'^statistics/profile_stats/$', views.profile_stats), - url(r'^statistics/v1/team_stats/$', views.team_stats), + path('public', views.workshop_public_stats, name="public"), + path('team', views.team_stats, name="team"), + path('team/', views.team_stats, name="team"), ] diff --git a/statistics_app/views.py b/statistics_app/views.py index 784f30d..65b4744 100644 --- a/statistics_app/views.py +++ b/statistics_app/views.py @@ -1,569 +1,104 @@ -from workshop_app.forms import ( - UserRegistrationForm, UserLoginForm, - ProfileForm, CreateWorkshop, - ProposeWorkshopDateForm -) -from workshop_app.models import ( - Profile, User, - has_profile, Workshop, - WorkshopType, RequestedWorkshop, - BookedWorkshop, ProposeWorkshopDate, - Testimonial -) -from teams.models import Team +# Python Imports +import datetime as dt +# Django Imports from django.template.loader import get_template from django.template import RequestContext -from datetime import datetime, date -from django.contrib.auth import login, logout, authenticate +from django.contrib import messages from django.contrib.auth.decorators import login_required -from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger +from django.core.paginator import Paginator from django.shortcuts import render, redirect -from django.db import IntegrityError +from django.urls import reverse from django.utils import timezone -from django.http import HttpResponse, HttpResponseRedirect -from django.conf import settings -from os import listdir, path, sep -from zipfile import ZipFile -from django.contrib import messages -from operator import itemgetter -import datetime as dt -import csv -try: - from StringIO import StringIO as string_io -except ImportError: - from io import BytesIO as string_io - -# Create your views here. -def check_workshop_type(x): - try: - y = datetime.strftime(x.proposed_workshop_date, '%d-%m-%Y') - except BaseException: - y = datetime.strftime(x.requested_workshop_date, '%d-%m-%Y') - return y +# Local Imports +from workshop_app.models import ( + Profile, User, has_profile, Workshop, WorkshopType, Testimonial +) +from teams.models import Team +from .forms import FilterForm def is_instructor(user): '''Check if the user is having instructor rights''' - return True if user.groups.filter(name='instructor').count() > 0 else False + return user.groups.filter(name='instructor').exists() def is_email_checked(user): if hasattr(user, 'profile'): - return True if user.profile.is_email_verified else False + return user.profile.is_email_verified else: return False -def pie_chart(): - '''This function gives Data for drawring Pie Chart''' - - # Count Total Number of workshops for each type - workshop_titles = WorkshopType.objects.all() - workshoptype_dict = {} - for title in workshop_titles: - workshoptype_dict[title] = 0 - - for title in workshoptype_dict.keys(): - workshoptype_dict[title] += RequestedWorkshop.objects.filter( - requested_workshop_title=title, - status='ACCEPTED').count() - workshoptype_dict[title] += ProposeWorkshopDate.objects.filter( - proposed_workshop_title=title, - status='ACCEPTED').count() - - # For Pie Chart - workshoptype_num = [count for count in workshoptype_dict.values()] - workshoptype_title = [str(title) for title in workshoptype_dict.keys()] - - workshoptype_count = [workshoptype_title, workshoptype_num] - del workshoptype_title, workshoptype_num - - return workshoptype_count - - -def india_map(): - '''This function returns count of workshops based on states in India.''' - - states = [ - ['Code', 'State', 'Number'], - ["IN-AP", "Andhra Pradesh", 0], - ["IN-AR", "Arunachal Pradesh", 0], - ["IN-AS", "Assam", 0], - ["IN-BR", "Bihar", 0], - ["IN-CT", "Chhattisgarh", 0], - ["IN-GA", "Goa", 0], - ["IN-GJ", "Gujarat", 0], - ["IN-HR", "Haryana", 0], - ["IN-HP", "Himachal Pradesh", 0], - ["IN-JK", "Jammu and Kashmir", 0], - ["IN-JH", "Jharkhand", 0], - ["IN-KA", "Karnataka", 0], - ["IN-KL", "Kerala", 0], - ["IN-MP", "Madhya Pradesh", 0], - ["IN-MH", "Maharashtra", 0], - ["IN-MN", "Manipur", 0], - ["IN-ML", "Meghalaya", 0], - ["IN-MZ", "Mizoram", 0], - ["IN-NL", "Nagaland", 0], - ["IN-OR", "Odisha", 0], - ["IN-PB", "Punjab", 0], - ["IN-RJ", "Rajasthan", 0], - ["IN-SK", "Sikkim", 0], - ["IN-TN", "Tamil Nadu", 0], - ["IN-TG", "Telangana", 0], - ["IN-TR", "Tripura", 0], - ["IN-UT", "Uttarakhand", 0], - ["IN-UP", "Uttar Pradesh", 0], - ["IN-WB", "West Bengal", 0], - ["IN-AN", "Andaman and Nicobar Islands", 0], - ["IN-CH", "Chandigarh", 0], - ["IN-DN", "Dadra and Nagar Haveli", 0], - ["IN-DD", "Daman and Diu", 0], - ["IN-DL", "Delhi", 0], - ["IN-LD", "Lakshadweep", 0], - ["IN-PY", "Puducherry", 0] - ] - workshop_state = [] - requestedWorkshops = RequestedWorkshop.objects.filter(status='ACCEPTED') - proposedWorkshops = ProposeWorkshopDate.objects.filter(status='ACCEPTED') - for workshop in requestedWorkshops: - for s in states: - if s[0] == workshop.requested_workshop_coordinator.profile.state: - s[2] += 1 - - for workshop in proposedWorkshops: - for s in states: - if s[0] == workshop.proposed_workshop_coordinator.profile.state: - s[2] += 1 - - return states - - - -def monthly_accepted_chart(): - '''This function returns workshops accepted for each month - in the current year''' - today = datetime.now() - upto = today + dt.timedelta(days=15) - - workshop_count = [0] * 12 - for x in range(12): - workshop_count[x] += RequestedWorkshop.objects.filter( - requested_workshop_date__year=str(today.year), - requested_workshop_date__month=str(x + 1), - status='ACCEPTED').count() - workshop_count[x] += ProposeWorkshopDate.objects.filter( - proposed_workshop_date__year=str(today.year), - proposed_workshop_date__month=str(x + 1), - status='ACCEPTED').count() - - return workshop_count - - -@login_required -def workshop_stats(request): - user = request.user - today = datetime.now() - upto = today + dt.timedelta(days=15) - - #For Monthly Chart - workshop_count = monthly_accepted_chart() - - # For Pie Chart - workshoptype_count = pie_chart() - - # For India Map - states = india_map() - # For Data Downloading and Viewing - if request.method == 'POST': - try: - from_dates = request.POST.get('from') - to_dates = request.POST.get('to') - - # Fetches Accepted workshops which were proposed by Coordinators - proposed_workshops = ProposeWorkshopDate.objects.filter( - proposed_workshop_date__range=(from_dates, to_dates), - status='ACCEPTED' - ) - - # Fetches Accepted workshops which were Accepted by - # Instructors based on their Availability - requested_workshops = RequestedWorkshop.objects.filter( - requested_workshop_date__range=(from_dates, to_dates), - status='ACCEPTED' - ) - - upcoming_workshops = [] - - for workshop in proposed_workshops: - upcoming_workshops.append(workshop) - - for workshop in requested_workshops: - upcoming_workshops.append(workshop) - - upcoming_workshops = sorted(upcoming_workshops, - key=lambda x: check_workshop_type(x)) - - download = request.POST.get('Download') - if download: - response = HttpResponse(content_type='text/csv') - - response['Content-Disposition'] = 'attachment;\ - filename="records_from_{0}_to_{1}.csv"'.format( - from_dates, to_dates - ) - - writer = csv.writer(response) - header = [ - 'coordinator name', - 'instructor name', - 'workshop', - 'date', - 'status', - 'institute name', - 'state' - ] - - writer.writerow(header) - - for workshop in upcoming_workshops: - try: - row = [ - workshop.proposed_workshop_coordinator, - workshop.proposed_workshop_instructor, - workshop.proposed_workshop_title, - workshop.proposed_workshop_date, - workshop.status, - workshop.proposed_workshop_coordinator.profile.institute, - str(workshop.proposed_workshop_coordinator.profile.state) - ] - - except BaseException: - row = [ - workshop.requested_workshop_coordinator, - workshop.requested_workshop_instructor, - workshop.requested_workshop_title, - workshop.requested_workshop_date, - workshop.status, - workshop.requested_workshop_coordinator.profile.institute, - str(workshop.requested_workshop_coordinator.profile.state) - ] - - writer.writerow(row) - return response - else: - return render(request, - 'statistics_app/workshop_stats.html', - {"upcoming_workshops": upcoming_workshops, - "show_workshop_stats": settings.SHOW_WORKSHOP_STATS, - "workshop_count": workshop_count, - "workshoptype_count": workshoptype_count, - "india_map": states}) - except BaseException: - messages.info(request, 'Please enter Valid Dates') - - if is_instructor(user) and is_email_checked(user): - try: - # Fetches Accepted workshops which were proposed by Coordinators - proposed_workshops = ProposeWorkshopDate.objects.filter( - proposed_workshop_date__range=(today, upto), - status='ACCEPTED' - ) - - # Fetches Accepted workshops which were Accepted by - # Instructors based on their Availability - requested_workshops = RequestedWorkshop.objects.filter( - requested_workshop_date__range=(today, upto), - status='ACCEPTED' - ) - - upcoming_workshops = [] - for workshop in proposed_workshops: - upcoming_workshops.append(workshop) - - for workshop in requested_workshops: - upcoming_workshops.append(workshop) - - upcoming_workshops = sorted(upcoming_workshops, - key=lambda x: check_workshop_type(x)) - - except BaseException: - upcoming_workshops = [] - - paginator = Paginator(upcoming_workshops, 12) - - page = request.GET.get('page') - try: - upcoming_workshops = paginator.page(page) - except PageNotAnInteger: - # If page is not an integer, deliver first page. - upcoming_workshops = paginator.page(1) - except EmptyPage: - # If page is out of range(e.g 999999), deliver last page. - upcoming_workshops = paginator.page(paginator.num_pages) - - return render(request, 'statistics_app/workshop_stats.html', - { - "upcoming_workshops": upcoming_workshops, - "show_workshop_stats": settings.SHOW_WORKSHOP_STATS, - "workshop_count": workshop_count, - "workshoptype_count": workshoptype_count, - "india_map": states - }) - else: - return redirect('/statistics/public_stats/') - - def workshop_public_stats(request): user = request.user - today = datetime.now() - upto = today + dt.timedelta(days=15) - - #For Pie Chart - workshoptype_count = pie_chart() - - # For India Map - states = india_map() - - # Select By WorkshopType - workshoptype_list = list(WorkshopType.objects.all()) - workshoptype_list.append('all') - - # For Data Viewing - if request.method == 'POST': - workshop_list = [] - - try: - from_dates = request.POST.get('from') - to_dates = request.POST.get('to') - selected_state = request.POST.get('states') - selected_workshoptype = request.POST.get('workshoptype_name') - if selected_state == 'all': - # If dates not passed - if len(from_dates) == 0 and len(to_dates) == 0: - from_dates = '2017-01-01' - to_dates = upto - # If SelectedWorkshopType is 'All' - if len(selected_workshoptype) == 0: - # Fetches Accepted workshops which were proposed by - # Coordinators - proposed_workshops = ProposeWorkshopDate.objects.filter( - proposed_workshop_date__range=(from_dates, to_dates), - status='ACCEPTED' - ) - - # Fetches Accepted workshops which were Accepted by - # Instructors based on their Availability - requested_workshops = RequestedWorkshop.objects.filter( - requested_workshop_date__range=(from_dates, to_dates), - status='ACCEPTED' - ) - - else: - # Fetches Accepted workshops which were proposed by - # Coordinators - proposed_workshops = ProposeWorkshopDate.objects.filter( - proposed_workshop_date__range=(from_dates, to_dates), - status='ACCEPTED', proposed_workshop_title_id=int(selected_workshoptype) - ) - - # Fetches Accepted workshops which were Accepted by - # Instructors based on their Availability - requested_workshops = RequestedWorkshop.objects.filter( - requested_workshop_date__range=(from_dates, to_dates), - status='ACCEPTED', requested_workshop_title_id=int(selected_workshoptype) - ) - - for workshop in proposed_workshops: - workshop_list.append(workshop) - - for workshop in requested_workshops: - workshop_list.append(workshop) - - else: - # If dates not passed - if len(from_dates) == 0 and len(to_dates) == 0: - from_dates = '2017-01-01' - to_dates = upto - - # Get list of coordinators - coordinators_state_wise = Profile.objects.filter( - state=selected_state) - - if len(selected_workshoptype) == 0: - # Traverse through list of coordinators and append - # workshop_list - for coordinator in coordinators_state_wise: - # Fetches Accepted workshops which were proposed by - # Coordinators - proposed_workshops = ProposeWorkshopDate.objects.filter( - proposed_workshop_date__range=( - from_dates, - to_dates), - status='ACCEPTED', - proposed_workshop_coordinator=coordinator.user_id) - - # Fetches Accepted workshops which were Accepted by - # Instructors based on their Availability - requested_workshops = RequestedWorkshop.objects.filter( - requested_workshop_date__range=( - from_dates, - to_dates), - status='ACCEPTED', - requested_workshop_coordinator=coordinator.user_id) - - for workshop in proposed_workshops: - workshop_list.append(workshop) - - for workshop in requested_workshops: - workshop_list.append(workshop) - - else: - # Traverse through list of coordinators and append - # workshop_list - for coordinator in coordinators_state_wise: - # Fetches Accepted workshops which were proposed by - # Coordinators - proposed_workshops = ProposeWorkshopDate.objects.filter( - proposed_workshop_date__range=( - from_dates, - to_dates), - status='ACCEPTED', proposed_workshop_title_id=int(selected_workshoptype), - proposed_workshop_coordinator=coordinator.user_id) - - # Fetches Accepted workshops which were Accepted by - # Instructors based on their Availability - requested_workshops = RequestedWorkshop.objects.filter( - requested_workshop_date__range=( - from_dates, - to_dates), - status='ACCEPTED', requested_workshop_title_id=int(selected_workshoptype), - requested_workshop_coordinator=coordinator.user_id) - - for workshop in proposed_workshops: - workshop_list.append(workshop) - - for workshop in requested_workshops: - workshop_list.append(workshop) - - return render(request, - 'statistics_app/workshop_public_stats.html', - { - "workshoptype_list": workshoptype_list[::-1], - "workshop_list": workshop_list, - "workshoptype_count": workshoptype_count, - "india_map": states}) - - except BaseException: - messages.info(request, 'Please enter Valid Dates') - + form = FilterForm() + from_date = request.GET.get('from_date') + to_date = request.GET.get('to_date') + state = request.GET.get('state') + workshoptype = request.GET.get('workshop_type') + show_workshops = request.GET.get('show_workshops') + sort = request.GET.get('sort') + if from_date is not None or to_date is not None: + form = FilterForm( + start=from_date, end=to_date, state=state, type=workshoptype, + show_workshops=show_workshops, sort=sort + ) + workshops = Workshop.objects.filter( + date__range=(from_date, to_date), status=1 + ).order_by(sort) + if state: + workshops = workshops.filter(coordinator__profile__state=state) + if workshoptype: + workshops = workshops.filter(workshop_type_id=workshoptype) else: - '''Default Data''' - workshop_list = [] - - proposed_workshops = ProposeWorkshopDate.objects.filter( - status='ACCEPTED') - - # Fetches Accepted workshops which were Accepted by - # Instructors based on their Availability - requested_workshops = RequestedWorkshop.objects.filter( - status='ACCEPTED') - - for workshop in proposed_workshops: - workshop_list.append(workshop) - - for workshop in requested_workshops: - workshop_list.append(workshop) - - - return render(request, - 'statistics_app/workshop_public_stats.html', - { - "workshoptype_list": workshoptype_list[::-1], - "workshoptype_count": workshoptype_count, - "workshop_list": workshop_list, - "india_map": states}) + today = timezone.now() + upto = today + dt.timedelta(days=15) + workshops = Workshop.objects.filter( + date__range=(today, upto), status=1 + ).order_by("date") + if show_workshops: + if is_instructor(user): + workshops = workshops.filter(instructor_id=user.id) + else: + workshops = workshops.filter(coordinator_id=user.id) + ws_states, ws_count = Workshop.objects.get_workshops_by_state(workshops) + ws_type, ws_type_count = Workshop.objects.get_workshops_by_type(workshops) + paginator = Paginator(workshops, 30) + page = request.GET.get('page') + workshops = paginator.get_page(page) + context = {"form": form, "objects": workshops, "ws_states": ws_states, + "ws_count": ws_count, "ws_type": ws_type, + "ws_type_count": ws_type_count} + return render( + request, 'statistics_app/workshop_public_stats.html', context + ) @login_required -def profile_stats(request): +def team_stats(request, team_id=None): user = request.user - if is_instructor(user) and is_email_checked(user): - profiles = Profile.objects.all() - - rworkshops = RequestedWorkshop.objects.filter(status='ACCEPTED') - pworkshops = ProposeWorkshopDate.objects.filter(status='ACCEPTED') - - iprofile = Profile.objects.filter(position='instructor') - cprofile = Profile.objects.filter(position='coordinator') - - instructor_profile = [] - coordinator_profile = [] - - for p in iprofile: - instructor_profile.append({"profile": p, - "count": 0 - }) - - - for p in cprofile: - coordinator_profile.append({"profile": p, - "count": 0 - }) - - for p in instructor_profile: - p['count'] += RequestedWorkshop.objects.filter( - requested_workshop_instructor_id=p['profile'].user.id, - status='ACCEPTED').count() - - p['count'] += ProposeWorkshopDate.objects.filter( - proposed_workshop_instructor_id=p['profile'].user.id, - status='ACCEPTED').count() - - for p in coordinator_profile: - p['count'] += RequestedWorkshop.objects.filter( - requested_workshop_coordinator_id=p['profile'].user.id, - status='ACCEPTED').count() - - p['count'] += ProposeWorkshopDate.objects.filter( - proposed_workshop_coordinator_id=p['profile'].user.id, - status='ACCEPTED').count() - - #Sorting - coordinator_profile = sorted(coordinator_profile, - key=lambda k:k['count'], reverse=True) - instructor_profile = sorted(instructor_profile, - key=lambda k:k['count'], reverse=True) - - return render(request, "statistics_app/profile_stats.html", - { - "instructor_data": instructor_profile, - "coordinator_data": coordinator_profile, - }) + teams = Team.objects.all() + if team_id: + team = teams.get(id=team_id) else: - logout(request) - return render(request, "workshop_app/logout.html") - -@login_required -def team_stats(request, team_id): - user = request.user - team = Team.objects.get(team_id) - if user not in team.members.all(): - if user.groups.filter(name='instructor').count() > 0: - return redirect('/manage/') - return redirect('/book/') + team = teams.first() + if not team.members.filter(user_id=user.id).exists(): + messages.add_message( + request, messages.INFO, "You are not added to the team" + ) + return redirect(reverse("workshop_app:index")) member_workshop_data = {} for member in team.members.all(): - workshop_count = ProposeWorkshopDate.objects.filter(proposed_workshop_instructor=member.id).count() - if member_workshop_data.get('data'): - member_workshop_data['data'].append(workshop_count) - else: - member_workshop_data['data'] = [workshop_count] - if member_workshop_data.get('labels'): - member_workshop_data['labels'].append(member.user.username) - else: - member_workshop_data['labels'] = [member.user.username] - return render(request, 'statistics_app/team_stats.html', {'workshop_data': member_workshop_data}) + workshop_count = Workshop.objects.filter( + instructor_id=member.user.id).count() + member_workshop_data[member.user.get_full_name()] = workshop_count + team_labels = list(member_workshop_data.keys()) + ws_count = list(member_workshop_data.values()) + return render( + request, 'statistics_app/team_stats.html', + {'team_labels': team_labels, "ws_count": ws_count, 'all_teams': teams, + 'team_id': team.id} + ) -- cgit