def issue_exam_ticket(request): now_datetime = get_now_or_fake_time(request) if request.method == "POST": form = IssueTicketForm(now_datetime, request.POST) if form.is_valid(): exam = form.cleaned_data["exam"] try: participation = Participation.objects.get( course=exam.course, user=form.cleaned_data["user"], status=participation_status.active, ) except ObjectDoesNotExist: messages.add_message(request, messages.ERROR, _("User is not enrolled in course.")) participation = None if participation is not None: if form.cleaned_data["revoke_prior"]: ExamTicket.objects.filter( exam=exam, participation=participation, state__in=( exam_ticket_states.valid, exam_ticket_states.used, ) ).update(state=exam_ticket_states.revoked) ticket = ExamTicket() ticket.exam = exam ticket.participation = participation ticket.creator = request.user ticket.state = exam_ticket_states.valid ticket.code = gen_ticket_code() ticket.valid_start_time = form.cleaned_data["valid_start_time"] ticket.valid_end_time = form.cleaned_data["valid_end_time"] ticket.restrict_to_facility = \ form.cleaned_data["restrict_to_facility"] ticket.save() messages.add_message(request, messages.SUCCESS, _( "Ticket issued for <b>%(participation)s</b>. " "The ticket code is <b>%(ticket_code)s</b>." ) % {"participation": participation, "ticket_code": ticket.code}) form = IssueTicketForm(now_datetime, initial_exam=exam) else: form = IssueTicketForm(now_datetime) return render(request, "generic-form.html", { "form_description": _("Issue Exam Ticket"), "form": form, })
def issue_exam_ticket(request): now_datetime = get_now_or_fake_time(request) if request.method == "POST": form = IssueTicketForm(now_datetime, request.POST) if form.is_valid(): exam = form.cleaned_data["exam"] try: participation = Participation.objects.get( course=exam.course, user=form.cleaned_data["user"], status=participation_status.active, ) except ObjectDoesNotExist: messages.add_message(request, messages.ERROR, _("User is not enrolled in course.")) participation = None if participation is not None: if form.cleaned_data["revoke_prior"]: ExamTicket.objects.filter( exam=exam, participation=participation, state__in=( exam_ticket_states.valid, exam_ticket_states.used, ) ).update(state=exam_ticket_states.revoked) ticket = ExamTicket() ticket.exam = exam ticket.participation = participation ticket.creator = request.user ticket.state = exam_ticket_states.valid ticket.code = gen_ticket_code() ticket.save() messages.add_message(request, messages.SUCCESS, _( "Ticket issued for <b>%(participation)s</b>. " "The ticket code is <b>%(ticket_code)s</b>." ) % {"participation": participation, "ticket_code": ticket.code}) form = IssueTicketForm(now_datetime, initial_exam=exam) else: form = IssueTicketForm(now_datetime) return render(request, "generic-form.html", { "form_description": _("Issue Exam Ticket"), "form": form, })
def batch_issue_exam_tickets(pctx): if pctx.role not in [ participation_role.instructor, ]: raise PermissionDenied( _("must be instructor or TA to batch-issue tickets")) form_text = "" request = pctx.request if request.method == "POST": form = BatchIssueTicketsForm(pctx.course, request.user.editor_mode, request.POST) if form.is_valid(): exam = form.cleaned_data["exam"] from jinja2 import TemplateSyntaxError from course.content import markup_to_html try: with transaction.atomic(): if form.cleaned_data["revoke_prior"]: ExamTicket.objects.filter( exam=exam, state__in=( exam_ticket_states.valid, exam_ticket_states.used, ) ).update(state=exam_ticket_states.revoked) tickets = [] for participation in ( Participation.objects.filter( course=pctx.course, status=participation_status.active) .order_by("user__last_name") ): ticket = ExamTicket() ticket.exam = exam ticket.participation = participation ticket.creator = request.user ticket.state = exam_ticket_states.valid ticket.code = gen_ticket_code() ticket.save() tickets.append(ticket) checkin_uri = pctx.request.build_absolute_uri( reverse("relate-check_in_for_exam")) form_text = markup_to_html( pctx.course, pctx.repo, pctx.course_commit_sha, form.cleaned_data["format"], jinja_env={ "tickets": tickets, "checkin_uri": checkin_uri, }) except TemplateSyntaxError as e: messages.add_message(request, messages.ERROR, string_concat( _("Template rendering failed"), ": line %(lineno)d: %(err_str)s") % { "lineno": e.lineno, "err_str": e.message.decode("utf-8")}) except Exception as e: messages.add_message(request, messages.ERROR, string_concat( _("Template rendering failed"), ": %(err_type)s: %(err_str)s") % {"err_type": type(e).__name__, "err_str": str(e)}) else: messages.add_message(request, messages.SUCCESS, _("%d tickets issued.") % len(tickets)) else: form = BatchIssueTicketsForm(pctx.course, request.user.editor_mode) return render_course_page(pctx, "course/batch-exam-tickets-form.html", { "form": form, "form_text": form_text, "form_description": ugettext("Batch-Issue Exam Tickets") })
def batch_issue_exam_tickets(pctx): if not pctx.has_permission(pperm.batch_issue_exam_ticket): raise PermissionDenied(_("may not batch-issue tickets")) form_text = "" request = pctx.request if request.method == "POST": form = BatchIssueTicketsForm(pctx.course, request.user.editor_mode, request.POST) if form.is_valid(): exam = form.cleaned_data["exam"] from jinja2 import TemplateSyntaxError from course.content import markup_to_html try: with transaction.atomic(): if form.cleaned_data["revoke_prior"]: ExamTicket.objects.filter( exam=exam, state__in=( exam_ticket_states.valid, exam_ticket_states.used, )).update(state=exam_ticket_states.revoked) tickets = [] for participation in (Participation.objects.filter( course=pctx.course, status=participation_status.active).order_by( "user__last_name")): ticket = ExamTicket() ticket.exam = exam ticket.participation = participation ticket.creator = request.user ticket.state = exam_ticket_states.valid ticket.code = gen_ticket_code() ticket.valid_start_time = \ form.cleaned_data["valid_start_time"] ticket.valid_end_time = form.cleaned_data[ "valid_end_time"] ticket.restrict_to_facility = \ form.cleaned_data["restrict_to_facility"] ticket.save() tickets.append(ticket) checkin_uri = pctx.request.build_absolute_uri( reverse("relate-check_in_for_exam")) form_text = markup_to_html(pctx.course, pctx.repo, pctx.course_commit_sha, form.cleaned_data["format"], jinja_env={ "tickets": tickets, "checkin_uri": checkin_uri, }) except TemplateSyntaxError as e: messages.add_message( request, messages.ERROR, string_concat(_("Template rendering failed"), ": line %(lineno)d: %(err_str)s") % { "lineno": e.lineno, "err_str": e.message.decode("utf-8") }) except Exception as e: messages.add_message( request, messages.ERROR, string_concat(_("Template rendering failed"), ": %(err_type)s: %(err_str)s") % { "err_type": type(e).__name__, "err_str": str(e) }) else: messages.add_message(request, messages.SUCCESS, _("%d tickets issued.") % len(tickets)) else: form = BatchIssueTicketsForm(pctx.course, request.user.editor_mode) return render_course_page( pctx, "course/batch-exam-tickets-form.html", { "form": form, "form_text": form_text, "form_description": gettext("Batch-Issue Exam Tickets") })