class CourseEmailForm(forms.Form, BootstrapMixin): sendToDueParticipants = forms.BooleanField(label=_("Send to participants who didn't vote yet"), required=False, initial=True) sendToAllParticipants = forms.BooleanField(label=_("Send to all participants"), required=False) sendToEditors = forms.BooleanField(label=_("Send to editors"), required=False) sendToContributors = forms.BooleanField(label=_("Send to all contributors (includes editors)"), required=False) subject = forms.CharField(label=_("Subject")) body = forms.CharField(widget=forms.Textarea(), label=_("Body")) def __init__(self, *args, **kwargs): self.instance = kwargs.pop('instance') self.template = EmailTemplate() super(CourseEmailForm, self).__init__(*args, **kwargs) def clean(self): cleaned_data = self.cleaned_data if not (cleaned_data.get('sendToDueParticipants') or cleaned_data.get('sendToAllParticipants') or cleaned_data.get('sendToEditors') or cleaned_data.get('sendToContributors')): raise forms.ValidationError(_(u"No recipient selected. Choose at least one group of recipients.")) return cleaned_data # returns whether all recepients have an email address def all_recepients_reachable(self): return self.missing_email_addresses() == 0 # returns the number of recepients without an email address def missing_email_addresses(self): return len([user for user in self.template.recipient_list_for_course(self.instance, self.cleaned_data.get('sendToEditors'), self.cleaned_data.get('sendToContributors'), self.cleaned_data.get('sendToDueParticipants'), self.cleaned_data.get('sendToAllParticipants')) if not user.email]) def send(self): self.template.subject = self.cleaned_data.get('subject') self.template.body = self.cleaned_data.get('body') self.template.send_courses([self.instance], send_to_editors=self.cleaned_data.get('sendToEditors'), send_to_contributors=self.cleaned_data.get('sendToContributors'), send_to_due_participants=self.cleaned_data.get('sendToDueParticipants'), send_to_all_participants=self.cleaned_data.get('sendToAllParticipants'))
def semester_contributor_ready(request, semester_id): semester = get_object_or_404(Semester, id=semester_id) courses = semester.course_set.filter( state__in=['new', 'lecturerApproved']).all() forms = helper_create_grouped_course_selection_forms( courses, lambda course: not course.warnings(), request) valid = helper_are_course_selection_forms_valid(forms) if valid: selected_courses = [] for form in forms: for course in form.selected_courses: course.ready_for_contributors(False) course.save() selected_courses.append(course) EmailTemplate.get_review_template().send_courses(selected_courses, send_to_editors=True) messages.add_message( request, messages.INFO, _("Successfully marked %d courses as ready for lecturer review.") % (len(selected_courses))) return redirect('evap.fsr.views.semester_view', semester_id) else: return render_to_response("fsr_semester_contributor_ready.html", dict(semester=semester, forms=forms), context_instance=RequestContext(request))
def index(request): new_key_form = NewKeyForm(request.POST or None) if request.method == 'POST': if new_key_form.is_valid(): # user wants a new login key try: user = User.objects.get(email__iexact=new_key_form.cleaned_data['email']) profile = user.get_profile() profile.generate_logon_key() profile.save() EmailTemplate.get_logon_key_template().send_user(user) except User.DoesNotExist: messages.warning(request, _(u"No user with this e-mail address was found.")) if not request.user.is_active: return render_to_response( "index.html", dict( new_key_form=new_key_form ), context_instance=RequestContext(request)) else: # redirect user to appropriate start page if request.user.is_staff: return redirect('evap.fsr.views.index') elif request.user.get_profile().is_lecturer: return redirect('evap.lecturer.views.index') else: return redirect('evap.student.views.index')
def semester_publish(request, semester_id): semester = get_object_or_404(Semester, id=semester_id) courses = semester.course_set.filter(state="reviewed").all() forms = helper_create_grouped_course_selection_forms( courses, None, request) valid = helper_are_course_selection_forms_valid(forms) if valid: selected_courses = [] for form in forms: for course in form.selected_courses: course.publish() course.save() selected_courses.append(course) try: EmailTemplate.get_publish_template().send_courses( selected_courses, send_to_contributors=True, send_to_all_participants=True) except: messages.add_message( request, messages.WARNING, _("Could not send emails to participants and contributors")) messages.add_message( request, messages.INFO, _("Successfully published %d courses.") % (len(selected_courses))) return redirect('evap.fsr.views.semester_view', semester_id) else: return render_to_response("fsr_semester_publish.html", dict(semester=semester, forms=forms), context_instance=RequestContext(request))
def check_reminders(self): check_date = datetime.date.today() + datetime.timedelta( days=settings.REMIND_X_DAYS_AHEAD_OF_END_DATE) found_courses = [ course for course in Course.objects.all() if course.state == "inEvaluation" and course.vote_end_date == check_date ] EmailTemplate.get_reminder_template().send_courses( found_courses, send_to_due_participants=True)
def semester_lecturer_ready(request, semester_id): semester = get_object_or_404(Semester, id=semester_id) form = SelectCourseForm(semester.course_set.filter(state__in=['new', 'lecturerApproved']).all(), lambda course: not course.warnings(), request.POST or None) if form.is_valid(): for course in form.selected_courses: course.ready_for_lecturer(False) course.save() print form.selected_courses EmailTemplate.get_review_template().send_courses(form.selected_courses, True, False) return redirect('evap.fsr.views.semester_view', semester.id) else: return render_to_response("fsr_semester_lecturer_ready.html", dict(semester=semester, form=form), context_instance=RequestContext(request))
def semester_publish(request, semester_id): semester = get_object_or_404(Semester, id=semester_id) form = SelectCourseForm(semester.course_set.filter(state="reviewed").all(), None, request.POST or None) if form.is_valid(): for course in form.selected_courses: course.publish() course.save() try: EmailTemplate.get_publish_template().send_courses(form.selected_courses, True, True) except: messages.add_message(request, messages.WARNING, _("Could not send emails to participants and lecturers")) messages.add_message(request, messages.INFO, _("Successfully published %d courses.") % (len(form.selected_courses))) return redirect('evap.fsr.views.semester_view', semester.id) else: return render_to_response("fsr_semester_publish.html", dict(semester=semester, form=form), context_instance=RequestContext(request))
def semester_contributor_ready(request, semester_id): semester = get_object_or_404(Semester, id=semester_id) courses = semester.course_set.filter(state__in=['new', 'lecturerApproved']).all() forms = helper_create_grouped_course_selection_forms(courses, lambda course: not course.warnings(), request) valid = helper_are_course_selection_forms_valid(forms) if valid: selected_courses = [] for form in forms: for course in form.selected_courses: course.ready_for_contributors(False) course.save() selected_courses.append(course) EmailTemplate.get_review_template().send_courses(selected_courses, True, False, False) messages.add_message(request, messages.INFO, _("Successfully marked %d courses as ready for lecturer review.") % (len(selected_courses))) return redirect('evap.fsr.views.semester_view', semester_id) else: return render_to_response("fsr_semester_contributor_ready.html", dict(semester=semester, forms=forms), context_instance=RequestContext(request))
def update_courses(self): """ Updates courses state, when evaluation time begins/ends.""" today = datetime.date.today() courses_where_evaluation_begins = [] for course in Course.objects.all(): try: if course.state == "approved" and course.vote_start_date <= today: course.evaluation_begin() course.save() courses_where_evaluation_begins.append(course) elif course.state == "inEvaluation" and course.vote_end_date < today: course.evaluation_end() if course.is_fully_checked(): course.review_finished() course.save() except: pass # if the evaluation period of some courses started today we nnotify all students that they are now able to vote if (len(courses_where_evaluation_begins) > 0): EmailTemplate.get_evaluation_started_template().send_courses(courses_where_evaluation_begins, send_to_due_participants=True)
def semester_publish(request, semester_id): semester = get_object_or_404(Semester, id=semester_id) courses = semester.course_set.filter(state="reviewed").all() forms = helper_create_grouped_course_selection_forms(courses, None, request) valid = helper_are_course_selection_forms_valid(forms) if valid: selected_courses = [] for form in forms: for course in form.selected_courses: course.publish() course.save() selected_courses.append(course) try: EmailTemplate.get_publish_template().send_courses(selected_courses, True, True, True) except: messages.add_message(request, messages.WARNING, _("Could not send emails to participants and contributors")) messages.add_message(request, messages.INFO, _("Successfully published %d courses.") % (len(selected_courses))) return redirect('evap.fsr.views.semester_view', semester_id) else: return render_to_response("fsr_semester_publish.html", dict(semester=semester, forms=forms), context_instance=RequestContext(request))
def __init__(self, *args, **kwargs): self.instance = kwargs.pop('instance') self.template = EmailTemplate() super(CourseEmailForm, self).__init__(*args, **kwargs)
def ready_for_contributors(self, send_mail=True): if send_mail: EmailTemplate.get_review_template().send_courses([self], send_to_editors=True)
def index(request): """Main entry page into EvaP providing all the login options available. THe username/password login is thought to be used for internal users, e.g. by connecting to a LDAP directory. The login key mechanism is meant to be used to include external participants, e.g. visiting students or visiting contributors. """ # parse the form data into the respective form submit_type = request.POST.get("submit_type", "no_submit") new_key_form = NewKeyForm(request.POST if submit_type == "new_key" else None) login_key_form = LoginKeyForm(request.POST if submit_type == "login_key" else None) login_username_form = LoginUsernameForm(request, request.POST if submit_type == "login_username" else None) # process form data if request.method == 'POST': if new_key_form.is_valid(): # user wants a new login key profile = new_key_form.get_profile() profile.generate_login_key() profile.save() EmailTemplate.get_login_key_template().send_user(new_key_form.get_user()) messages.success(request, _(u"Successfully sent email with new login key.")) elif login_key_form.is_valid(): # user would like to login with a login key and passed key test auth_login(request, login_key_form.get_user()) elif login_username_form.is_valid(): # user would like to login with username and password and passed password test auth_login(request, login_username_form.get_user()) # clean up our test cookie if request.session.test_cookie_worked(): request.session.delete_test_cookie() # if not logged in by now, render form if not request.user.is_active: # set test cookie to verify whether they work in the next step request.session.set_test_cookie() return render_to_response("index.html", dict(new_key_form=new_key_form, login_key_form=login_key_form, login_username_form=login_username_form), context_instance=RequestContext(request)) else: # check for redirect variable next = request.GET.get("next", None) if not next is None: if next.startswith("/fsr/"): if request.user.is_staff: return redirect(next) elif next.startswith("/contributor/"): if UserProfile.get_for_user(request.user).is_contributor: return redirect(next) else: return redirect(next) # redirect user to appropriate start page if request.user.is_staff: return redirect('evap.fsr.views.index') elif UserProfile.get_for_user(request.user).is_editor_or_delegate: return redirect('evap.contributor.views.index') else: return redirect('evap.student.views.index')
def ready_for_lecturer(self, send_mail=True): if send_mail: EmailTemplate.get_review_template().send_courses([self], True, False)
def index(request): """Main entry page into EvaP providing all the login options available. THe username/password login is thought to be used for internal users, e.g. by connecting to a LDAP directory. The login key mechanism is meant to be used to include external participants, e.g. visiting students or visiting contributors. """ # parse the form data into the respective form submit_type = request.POST.get("submit_type", "no_submit") new_key_form = NewKeyForm(request.POST if submit_type == "new_key" else None) login_key_form = LoginKeyForm(request.POST if submit_type == "login_key" else None) login_username_form = LoginUsernameForm( request, request.POST if submit_type == "login_username" else None) # process form data if request.method == 'POST': if new_key_form.is_valid(): # user wants a new login key profile = new_key_form.get_profile() profile.generate_login_key() profile.save() EmailTemplate.get_login_key_template().send_user( new_key_form.get_user()) messages.success(request, _(u"Successfully sent email with new login key.")) elif login_key_form.is_valid(): # user would like to login with a login key and passed key test auth_login(request, login_key_form.get_user()) elif login_username_form.is_valid(): # user would like to login with username and password and passed password test auth_login(request, login_username_form.get_user()) # clean up our test cookie if request.session.test_cookie_worked(): request.session.delete_test_cookie() # if not logged in by now, render form if not request.user.is_active: # set test cookie to verify whether they work in the next step request.session.set_test_cookie() return render_to_response("index.html", dict( new_key_form=new_key_form, login_key_form=login_key_form, login_username_form=login_username_form), context_instance=RequestContext(request)) else: # check for redirect variable next = request.GET.get("next", None) if not next is None: if next.startswith("/fsr/"): if request.user.is_staff: return redirect(next) elif next.startswith("/contributor/"): if UserProfile.get_for_user(request.user).is_contributor: return redirect(next) else: return redirect(next) # redirect user to appropriate start page if request.user.is_staff: return redirect('evap.fsr.views.index') elif UserProfile.get_for_user(request.user).is_editor_or_delegate: return redirect('evap.contributor.views.index') else: return redirect('evap.student.views.index')
def check_reminders(self): check_date = datetime.date.today() + datetime.timedelta(days=settings.REMIND_X_DAYS_AHEAD_OF_END_DATE) found_courses = [course for course in Course.objects.all() if course.state == "inEvaluation" and course.vote_end_date == check_date] EmailTemplate.get_reminder_template().send_courses(found_courses, send_to_due_participants=True)
def ready_for_contributors(self, send_mail=True): if send_mail: EmailTemplate.get_review_template().send_courses( [self], send_to_editors=True)