Skip to content

Commit

Permalink
Email and Interest Views tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Kevin Pannell committed Jul 10, 2020
1 parent 22b3863 commit 91ed342
Show file tree
Hide file tree
Showing 4 changed files with 161 additions and 53 deletions.
7 changes: 3 additions & 4 deletions teamwork/apps/courses/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -399,11 +399,10 @@ def clean(self):

return data

"""
Form used to simulate sending an email
"""
class EmailRosterForm(forms.Form):
"""
Form used to simulate sending an email
"""
def __init__(self, *args, **kwargs):
super(EmailRosterForm, self).__init__(*args, **kwargs)

Expand Down
106 changes: 105 additions & 1 deletion teamwork/apps/courses/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from django.contrib.auth.models import User
from django.urls import reverse
from teamwork.apps.courses.models import Course, Enrollment, Assignment, CourseUpdate
from teamwork.apps.projects.models import Project
from teamwork.apps.projects.models import Project, Interest
from teamwork.apps.profiles.models import Alert

from teamwork.apps.courses.views.CourseView import get_available_projects
Expand Down Expand Up @@ -558,6 +558,110 @@ def test_remove_claim(self):
self.assertEqual(len(self.professor.profile.claimed_projects.all()), 0)
self.assertEqual(response.status_code, 302)

class EmailCourseViewTests(TestCase):
""" Tests Email Course View """
def setUp(self):
""" Set Up Function """
self.client = Client()

# create prof
self.professor = create_user("prof", "prof@testing.com", "password")

# create course
self.course = create_course("test course", "abcd", self.professor)

# Authenticate Professor
self.client.login(username='prof', password='password')

def tearDown(self):
""" Tear Down Function """
del self.client
del self.course
del self.professor

def test_email_course_get(self):
""" Tests GET to email_roster """
response = self.client.get(reverse('email_roster', kwargs={'slug': self.course.slug}))
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, 'courses/email_roster.html')

def test_email_course_post(self):
""" Tests POST to email_roster """
data = {'subject': 'Test Email Subject', 'content': 'Email From test_email_course_post'}
response = self.client.post(reverse('email_roster', kwargs={'slug': self.course.slug}), data)
self.assertEqual(response.status_code, 302)

def test_email_csv_get(self):
""" Tests GET to email_csv """
response = self.client.get(reverse('email_csv', kwargs={'slug': self.course.slug}))
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, 'courses/email_roster_with_csv.html')

def test_email_csv_post(self):
""" Tests POST to email_csv """
self.client.session['recipients'] = ['test1@grepthink.com', 'test2@grepthink.com']
data = {'subject':'Email CSV Roster Test', 'content':'Content of Email CSV Roster test. test_email_csv_post'}
response = self.client.post(reverse('email_csv', kwargs={'slug': self.course.slug}), data)
self.assertEqual(response.status_code, 302)

class InterestViewTests(TestCase):
""" Interest View Tests """
def setUp(self):
""" Set Up Function """
self.client = Client()

# create users
self.professor = create_user("prof", "prof@testing.com", "password")
self.professor.profile.isProf = True
self.user = create_user("user", "user@testing.com", "password")

# create course
self.course = create_course("test course", "abcd", self.professor)

# enroll professor in course
create_course_enrollment(self.professor, self.course, "professor")
create_course_enrollment(self.user, self.course, "student")

# create projects
self.project1 = Project.objects.create(title='project one', creator=self.professor)
self.course.projects.add(self.project1)
self.project2 = Project.objects.create(title='project two', creator=self.professor)
self.course.projects.add(self.project2)
self.project3 = Project.objects.create(title='project three', creator=self.professor)
self.course.projects.add(self.project3)

# Authenticate Professor
self.client.login(username='user', password='password')

def tearDown(self):
""" Tear Down Function """
del self.client
del self.course
del self.professor

def test_show_interest_get(self):
""" Tests GET to show_interest """
response = self.client.get(reverse('show_interest', kwargs={'slug': self.course.slug}))
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, 'courses/show_interest.html')

def test_show_interest_post(self):
""" Tests POST to show_interest """
data = {
'projects': str(self.project1.pk),
'projects2': str(self.project2.pk),
'projects3': str(self.project3.pk),
'p1r':'project 1 reason',
'p2r':'project 2 reason',
'p3r':'project 3 reason'
}
response = self.client.post(reverse('show_interest', kwargs={'slug': self.course.slug}), data)
self.assertEqual(response.status_code, 302)

# assert that projects have interests added to them
interests = Interest.objects.filter(user=self.user)
self.assertEqual(len(interests), 3)

# Helper Functions
def create_user(username, email, password):
"""
Expand Down
41 changes: 23 additions & 18 deletions teamwork/apps/courses/views/EmailCourseView.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
""" Email Course Views """
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.http import (HttpResponse, HttpResponseBadRequest,
Expand All @@ -11,35 +12,38 @@

@login_required
def email_roster(request, slug):
"""
Email a Course's Roster View
Args:
slug: (str) Course slug
"""
cur_course = get_object_or_404(Course, slug=slug)
page_name = "Email Roster"
page_description = "Emailing members of Course: %s"%(cur_course.name)
title = "Email Student Roster"

staff = cur_course.get_staff()
staff_ids=[o.id for o in staff]
staff_ids = [o.id for o in staff]
students_in_course = list(cur_course.students.exclude(id__in=staff_ids))

count = len(students_in_course) or 0
addcode = cur_course.addCode

form = EmailRosterForm()
if request.method == 'POST':
# send the current user.id to filter out
form = EmailRosterForm(request.POST, request.FILES)
#if form is accepted
# if form is accepted
if form.is_valid():
#the courseID will be gotten from the form
# the courseID will be gotten from the form
data = form.cleaned_data
subject = data.get('subject')
content = data.get('content')

response = send_email(students_in_course, request.user.email, subject, content)

if isinstance(response, HttpResponse):
messages.add_message(request, messages.INFO, response.content)

return redirect('view_one_course', slug)
return redirect('view_one_course', slug)

return render(request, 'courses/email_roster.html', {
'slug':slug, 'form':form, 'count':count, 'students':students_in_course,
Expand All @@ -50,18 +54,22 @@ def email_roster(request, slug):

@login_required
def email_csv(request, slug):
"""
Email a roster imported from a CSV file
Args:
slug: (str) Course Slug
"""
cur_course = get_object_or_404(Course, slug=slug)
page_name = "Invite Students"
page_description = "Invite Students via CSV Upload"
title = "Invite Students"

addcode = cur_course.addCode
recipients = []

if 'recipients' in request.session:
recipients = request.session['recipients']

print("in email_csv: ",recipients, "request.method:", request.method)

form = EmailRosterForm()
if request.method == 'POST':
form = EmailRosterForm(request.POST)
Expand All @@ -71,16 +79,13 @@ def email_csv(request, slug):
subject = data.get('subject')
content = data.get('content')

print("recipients in email_csv",recipients)
send_email(recipients, request.user.email, subject, content)
messages.add_message(request, messages.SUCCESS, "Email Sent!")

return redirect('view_one_course', slug)

else:
print("Form not valid!")

return render(request, 'courses/email_roster_with_csv.html', { 'count':len(recipients),
'slug':slug, 'form':form, 'addcode':addcode, 'students':recipients,
'page_name':page_name, 'page_description':page_description,'title':title
})
return render(request, 'courses/email_roster_with_csv.html',
{'count':len(recipients), 'slug':slug, 'form':form, 'addcode':addcode,
'students':recipients, 'page_name':page_name,
'page_description':page_description, 'title':title
})
60 changes: 30 additions & 30 deletions teamwork/apps/courses/views/InterestView.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@

""" Interest Views """
import xlwt
from django.contrib import messages
from django.contrib.auth.decorators import login_required
Expand All @@ -11,116 +11,116 @@
from teamwork.apps.profiles.models import Profile
from teamwork.apps.projects.models import Interest, Project


@login_required
def show_interest(request, slug):
"""public method that takes in a slug and generates a form for the user to show interest in all
projects in a given course."""
"""
Public method that takes in a slug and generates a form for the user to show interest in all
projects in a given course.
"""
profile = Profile.objects.prefetch_related('user__enrollment').filter(user=request.user).first()

# current course
cur_course = get_object_or_404(Course.objects.prefetch_related('projects', 'creator'), slug=slug)

# projects in current course
projects = cur_course.projects.all().extra(\
select={'lower_title':'lower(title)'}).order_by('lower_title')

# enrollment objects containing current user
user_courses = profile.user.enrollment.all()

user = request.user

page_name = "Show Interest"
page_description = "Show Interest in Projects for %s"%(cur_course.name)
title = "Show Interest"

#if user is professor
# if user is professor
if profile.isProf:
#redirect them with a message
messages.info(request,'Professor cannot show interest')
messages.info(request, 'Professor cannot show interest')
return HttpResponseRedirect('/course')

#if not enough projects
# if not enough projects
if not projects.count():
#redirect them with a message
messages.info(request,'No projects to show interest in!')
messages.info(request, 'No projects to show interest in!')
return HttpResponseRedirect('/course')

# if course has disabled setting interest
if cur_course.limit_interest:
#redirect them with a message
messages.info(request,'Can no longer show interest!')
messages.info(request, 'Can no longer show interest!')
return HttpResponseRedirect('/course')

# if current course not in users enrolled courses
if not cur_course in user_courses and cur_course.creator != profile.user:
messages.info(request,'You are not enrolled in this course')
messages.info(request, 'You are not enrolled in this course')
return HttpResponseRedirect('/course')


# TODO: SHOULD ALSO HAVE CHECK TO SEE IF USER ALREADY HAS SHOWN INTEREST

if request.method == 'POST':
form = ShowInterestForm(request.user.id, request.POST, slug = slug)
form = ShowInterestForm(request.user.id, request.POST, slug=slug)
if form.is_valid():
data=form.cleaned_data
data = form.cleaned_data
#Gets first choice, creates interest object for it

# Clear all interest objects where user is current user and for this course, avoid duplicates
for project in cur_course.projects.all():
user_interests = Interest.objects.filter(project_interest=project, user=request.user)
if user_interests is not None: user_interests.delete()
if user_interests is not None:
user_interests.delete()

# all_interests = Interest.objects.filter(project_interest=projects)
# interests = all_interests.filter(user=user)
# interests = Interest.objects.filter(project_interest=projects, user=user)
# if interests is not None: interests.delete()

projectCount = len(projects)
project_count = len(projects)

if projectCount >= 1:
if project_count >= 1:
choice_1 = data.get('projects')
r1 = data.get('p1r')
choice_1.interest.add(Interest.objects.create(user=user, interest=5, interest_reason=r1))
choice_1.save()

#Gets second choice, creates interest object for it
if projectCount >= 2:
if project_count >= 2:
choice_2 = data.get('projects2')
r2 = data.get('p2r')
choice_2.interest.add(Interest.objects.create(user=user, interest=4, interest_reason=r2))
choice_2.save()

#Gets third choice, creates interest object for it
if projectCount >= 3:
if project_count >= 3:
choice_3 = data.get('projects3')
r3 = data.get('p3r')
choice_3.interest.add(Interest.objects.create(user=user, interest=3, interest_reason=r3))
choice_3.save()

#Gets fourth choice, creates interest object for it
if projectCount >= 4:
if project_count >= 4:
choice_4 = data.get('projects4')
r4 = data.get('p4r')
choice_4.interest.add(Interest.objects.create(user=user, interest=2, interest_reason=r4))
choice_4.save()

#Gets fifth choice, creates interest object for it
if projectCount >= 5:
if project_count >= 5:
choice_5 = data.get('projects5')
r5 = data.get('p5r')
choice_5.interest.add(Interest.objects.create(user=user, interest=1, interest_reason=r5))
choice_5.save()

messages.success(request, "You have succesfully submitted your interest")


return redirect(view_one_course, slug)

print(form.errors)
else:
form = ShowInterestForm(request.user.id, slug = slug)
form = ShowInterestForm(request.user.id, slug=slug)

return render(
request, 'courses/show_interest.html',
{'form': form,'cur_course': cur_course, 'page_name' : page_name, 'page_description': page_description, 'title': title}
)
return render(request, 'courses/show_interest.html',
{'form': form, 'cur_course': cur_course, 'page_name' : page_name,
'page_description': page_description, 'title': title
})

@login_required
def export_interest(request, slug):
Expand Down

0 comments on commit 91ed342

Please sign in to comment.