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 %}
+
+
+
+
+
+
+ {% include "statistics_app/paginator.html" %}
+
+
+
+
+
+
+
+
+
+
+
+ Sr No. |
+ Coordinator Name |
+ Institute Name |
+ Instructor Name |
+ Workshop Name |
+ Workshop Date |
+
+
+ {% csrf_token %}
+ {% for workshop in objects %}
+
+
+ {{ 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}} |
+
+
+ {% endfor %}
+
+ {% include "statistics_app/paginator.html" %}
+
+
+
-
-
-
-
-
-
-
-
-
- {% if messages %}
-
- {% for message in messages %}
-
-
- {{ message }}
-
-
- {% endfor %}
-
- {% endif %}
-
-
-
-
-
-
- Coordinator Name |
- Institute Name |
- Instructor Name |
- Workshop Name |
- Workshop Date |
- Initiated By |
-
-
- {% csrf_token %}
- {% for workshop in workshop_list %}
- {% if workshop.proposed_workshop_date %}
-
-
- {{ 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 |
-
-
- {% else %}
-
-
- {{ 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 |
-
-
- {% endif %}
- {% endfor %}
-
-
-
-
-
-
-
-
-
{% 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