From 194ee67048b80655f3da6be1f5018fdc278ffc58 Mon Sep 17 00:00:00 2001 From: ankitjavalkar Date: Wed, 25 Sep 2019 15:46:43 +0530 Subject: Multiple Changes: - Add teams - Fix bug that causes todays booked workshops to disappear from queue - Add a graph to display viz for accepted workshops in a team - Remove unnecessary loops --- .../templates/statistics_app/team_stats.html | 124 +++++++++++++++++++++ statistics_app/urls.py | 5 +- statistics_app/views.py | 26 +++++ teams/__init__.py | 0 teams/admin.py | 5 + teams/apps.py | 5 + teams/models.py | 9 ++ teams/tests.py | 3 + teams/views.py | 3 + .../templates/workshop_app/my_workshops.html | 32 ++++++ workshop_app/views.py | 33 ++++-- workshop_portal/settings.py | 1 + 12 files changed, 232 insertions(+), 14 deletions(-) create mode 100644 statistics_app/templates/statistics_app/team_stats.html create mode 100644 teams/__init__.py create mode 100644 teams/admin.py create mode 100644 teams/apps.py create mode 100644 teams/models.py create mode 100644 teams/tests.py create mode 100644 teams/views.py diff --git a/statistics_app/templates/statistics_app/team_stats.html b/statistics_app/templates/statistics_app/team_stats.html new file mode 100644 index 0000000..4e3e870 --- /dev/null +++ b/statistics_app/templates/statistics_app/team_stats.html @@ -0,0 +1,124 @@ +{% extends 'workshop_app/base.html' %} + +{% block title %} + Workshop Statistics +{% endblock %} + + +{% block extra %} + + + + + + + + + + + + + + + + + + +{% endblock %} + +{% block content %} + +
+
+
+
+
+ + + +
+ +
+
+
+
+{% endblock %} diff --git a/statistics_app/urls.py b/statistics_app/urls.py index 94b358e..9e0dbbf 100644 --- a/statistics_app/urls.py +++ b/statistics_app/urls.py @@ -2,12 +2,13 @@ from django.conf.urls import url from django.contrib import admin from statistics_app import views -import django - 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), + # url(r'^statistics/v1/filter/$', views.team_stats), + url(r'^statistics/v1/all/$', views.all_stats), ] diff --git a/statistics_app/views.py b/statistics_app/views.py index 1507196..8c3a6f0 100644 --- a/statistics_app/views.py +++ b/statistics_app/views.py @@ -10,6 +10,8 @@ from workshop_app.models import ( BookedWorkshop, ProposeWorkshopDate, Testimonial ) +from teams.models import Team + from django.template.loader import get_template from django.template import RequestContext from datetime import datetime, date @@ -582,3 +584,27 @@ def profile_stats(request): 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/') + + 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}) + + diff --git a/teams/__init__.py b/teams/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/teams/admin.py b/teams/admin.py new file mode 100644 index 0000000..1653090 --- /dev/null +++ b/teams/admin.py @@ -0,0 +1,5 @@ +from django.contrib import admin + +from teams.models import Team + +admin.site.register(Team) diff --git a/teams/apps.py b/teams/apps.py new file mode 100644 index 0000000..17954d6 --- /dev/null +++ b/teams/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class TeamsConfig(AppConfig): + name = 'teams' diff --git a/teams/models.py b/teams/models.py new file mode 100644 index 0000000..c82a92c --- /dev/null +++ b/teams/models.py @@ -0,0 +1,9 @@ +from django.db import models +from django.contrib.auth.models import User + +from workshop_app.models import Profile + +class Team(models.Model): + members = models.ManyToManyField(Profile) + creator = models.OneToOneField(User) + created_date = models.DateTimeField(auto_now=True) \ No newline at end of file diff --git a/teams/tests.py b/teams/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/teams/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/teams/views.py b/teams/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/teams/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/workshop_app/templates/workshop_app/my_workshops.html b/workshop_app/templates/workshop_app/my_workshops.html index b4e0985..ba35757 100644 --- a/workshop_app/templates/workshop_app/my_workshops.html +++ b/workshop_app/templates/workshop_app/my_workshops.html @@ -125,6 +125,38 @@
+ {% if request.user.profile.position == 'instructor'%} +

Team Member Requests

+ + + + + + + + + + + + {% for workshop in team_workshops %} + + + + + + + {% endfor %} + +
Coordinator NameTeam MemberWorkshop NameWorkshop Day
+ {{ workshop.proposed_workshop_coordinator.get_full_name }} + + {{ workshop.proposed_workshop_instructor.get_full_name }} + + {{ workshop.proposed_workshop_title }} + + {{ workshop.proposed_workshop_date | date }} +
+ {% endif %} {% if request.user.profile.position == 'instructor' %}

Requests for Me

{% else %} diff --git a/workshop_app/views.py b/workshop_app/views.py index bdb5580..772615b 100644 --- a/workshop_app/views.py +++ b/workshop_app/views.py @@ -10,6 +10,7 @@ from .models import ( BookedWorkshop, ProposeWorkshopDate, Testimonial, ProfileComments ) +from teams.models import Team from datetime import datetime, date from django.contrib.auth import login, logout, authenticate from django.contrib.auth.decorators import login_required @@ -658,26 +659,36 @@ def my_workshops(request): today = datetime.today().date() workshop_occurence_list = RequestedWorkshop.objects.filter( requested_workshop_instructor=user.id, - requested_workshop_date__gt=today, + requested_workshop_date__gte=today, ).order_by('-requested_workshop_date') - for w in workshop_occurence_list: - workshops.append(w) proposed_workshop = ProposeWorkshopDate.objects.filter( proposed_workshop_instructor=user.id, - proposed_workshop_date__gt=today, + proposed_workshop_date__gte=today, ).order_by('-proposed_workshop_date') - for p in proposed_workshop: - workshops.append(p) proposed_workshop_pending = ProposeWorkshopDate.objects.filter( status='Pending' ).order_by('-proposed_workshop_date') - for p in proposed_workshop_pending: - workshops.append(p) + + workshops = list(workshop_occurence_list) + list(proposed_workshop) + list(proposed_workshop_pending) + + # team_members = list(set(user.profile.team_set.all().values_list('members', flat=True))) + teams = Team.objects.filter(members=user.profile) + team_workshops = [] + + if teams: + team_members = Profile.objects.filter(team__in=teams).exclude(id=user.profile.id).distinct() + team_member_ids = team_members.values_list('user__id') + team_workshops = ProposeWorkshopDate.objects.filter( + proposed_workshop_date__gte=today, + proposed_workshop_instructor_id__in=team_member_ids, + ) + print(team_workshops) return render(request, 'workshop_app/my_workshops.html', { "workshops" :workshops, + "team_workshops": team_workshops, "today": today}) else: @@ -685,14 +696,12 @@ def my_workshops(request): workshop_occurence_list = RequestedWorkshop.objects.filter( requested_workshop_coordinator=user.id ).order_by('-requested_workshop_date') - for w in workshop_occurence_list: - workshops.append(w) proposed_workshop = ProposeWorkshopDate.objects.filter( proposed_workshop_coordinator=user.id ).order_by('-proposed_workshop_date') - for p in proposed_workshop: - workshops.append(p) + + workshops = list(workshop_occurence_list) + list(proposed_workshop) + list(proposed_workshop_pending) return render(request, 'workshop_app/my_workshops.html', {"workshops": workshops}) diff --git a/workshop_portal/settings.py b/workshop_portal/settings.py index e7f9adb..46dc9b7 100644 --- a/workshop_portal/settings.py +++ b/workshop_portal/settings.py @@ -48,6 +48,7 @@ INSTALLED_APPS = [ 'workshop_app', 'recurrence', 'statistics_app', + 'teams', ] MIDDLEWARE_CLASSES = [ -- cgit