def test_get_open_review(self): user1 = self.users[0] user2 = self.users[2] elaboration = self.elaborations[0] self.create_review_without_submission_date(elaboration=elaboration, reviewer=user1) # there should be an open review for user1 review = Review.get_open_review(self.challenge, user1) assert review assert review.reviewer == user1 assert review.elaboration == elaboration # there should be no open review for user1 since the review is already submitted review.submission_time = datetime.now() review.save() review = Review.get_open_review(self.challenge, user1) assert not review # there should be no open review for user2 review = Review.get_open_review(self.challenge, user2) assert not review # user1 and user2 both have separate open reviews self.create_review_without_submission_date(elaboration=elaboration, reviewer=user1) self.create_review_without_submission_date(elaboration=elaboration, reviewer=user2) review1 = Review.get_open_review(self.challenge, user1) review2 = Review.get_open_review(self.challenge, user2) assert review1 assert review2 assert review1.id != review2.id assert review1.reviewer == user1 assert review2.reviewer == user2 assert review1.elaboration == elaboration and review2.elaboration == elaboration
def create_context_review(request): data = {} if "id" in request.GET: user = RequestContext(request)["user"] challenge = Challenge.objects.get(pk=request.GET.get("id")) if not challenge.is_enabled_for_user(user): raise Http404 if challenge.has_enough_user_reviews(user): raise Http404 if not challenge.submitted_by_user(user): raise Http404 review = Review.get_open_review(challenge, user) if not review: # number of hours needed to pass until elaboration is applicable as candidate offset = randint(ReviewConfig.get_candidate_offset_min(), ReviewConfig.get_candidate_offset_max()) review_candidate = Elaboration.get_review_candidate(challenge, user, offset) if review_candidate: review = Review(elaboration=review_candidate, reviewer=user) review.save() else: return data data["review"] = review data["stack_id"] = challenge.get_stack().id review_questions = ReviewQuestion.objects.filter(challenge=challenge).order_by("order") data["questions"] = review_questions return data
def review_answer(request, course_short_title): user = RequestContext(request)["user"] if request.POST: data = request.body.decode(encoding="UTF-8") data = json.loads(data) review_id = data["review_id"] answers = data["answers"] try: review = Review.objects.get(pk=review_id) challenge = review.elaboration.challenge if not challenge.is_enabled_for_user(user): raise Http404 if not review == Review.get_open_review(challenge, user): raise Http404 except: raise Http404 review.appraisal = data["appraisal"] for answer in answers: question_id = answer["question_id"] text = answer["answer"] review_question = ReviewQuestion.objects.get(pk=question_id) ReviewAnswer(review=review, review_question=review_question, text=text).save() # send notifications review.submission_time = datetime.now() review.save() try: if review.appraisal == review.NOTHING: Notification.bad_review(review) else: Notification.enough_peer_reviews(review) except: print("Could not send Notification") return HttpResponse()
def create_context_review(request): data = {} if 'id' in request.GET: user = request.user challenge = Challenge.objects.get(pk=request.GET.get('id')) if not challenge.is_enabled_for_user(user): raise Http404 if challenge.has_enough_user_reviews(user): raise Http404 if not challenge.submitted_by_user(user): raise Http404 review = Review.get_open_review(challenge, user) if not review: review_candidate = Elaboration.get_review_candidate(challenge, user) if review_candidate: review = Review(elaboration=review_candidate['candidate'], reviewer=user, chosen_by=review_candidate['chosen_by']) review.save() else: return data data['review'] = review data['stack_id'] = challenge.get_stack().id review_questions = ReviewQuestion.objects.filter(challenge=challenge).order_by("order") author_questions = [question for question in review_questions if question.visible_to_author == True] staff_questions = [question for question in review_questions if question.visible_to_author == False] data['questions'] = review_questions data['author_questions'] = author_questions data['staff_questions'] = staff_questions extra_review_question_present = len(review.elaboration.extra_review_question) > 0 data['extra_review_question_present'] = extra_review_question_present return data
def create_context_extra_review(request): data = {} if 'id' in request.GET: user = RequestContext(request)['user'] challenge = Challenge.objects.get(pk=request.GET.get('id')) elaboration = Elaboration.objects.get( pk=request.GET.get('elaboration_id')) if not challenge.is_enabled_for_user(user): raise Http404 if not challenge.submitted_by_user(user): raise Http404 review = Review.get_open_review(challenge, user) if not review: review = Review(elaboration=elaboration, reviewer=user, chosen_by='extra_review') review.save() data['review'] = review data['stack_id'] = challenge.get_stack().id review_questions = ReviewQuestion.objects.filter( challenge=challenge).order_by("order") data['questions'] = review_questions return data
def create_context_review(request): data = {} if 'id' in request.GET: user = RequestContext(request)['user'] challenge = Challenge.objects.get(pk=request.GET.get('id')) if not challenge.is_enabled_for_user(user): raise Http404 if challenge.has_enough_user_reviews(user): raise Http404 if not challenge.submitted_by_user(user): raise Http404 review = Review.get_open_review(challenge, user) if not review: # number of hours needed to pass until elaboration is applicable as candidate offset = randint(ReviewConfig.get_candidate_offset_min(), ReviewConfig.get_candidate_offset_max()) review_candidate = Elaboration.get_review_candidate( challenge, user, offset) if review_candidate: review = Review(elaboration=review_candidate, reviewer=user) review.save() else: return data data['review'] = review data['stack_id'] = challenge.get_stack().id review_questions = ReviewQuestion.objects.filter( challenge=challenge).order_by("order") data['questions'] = review_questions return data
def review_answer(request, course_short_title): user = request.user if request.POST: data = request.body.decode(encoding='UTF-8') data = json.loads(data) review_id = data['review_id'] answers = data['answers'] try: review = Review.objects.get(pk=review_id) challenge = review.elaboration.challenge if not challenge.is_enabled_for_user(user): raise Http404 if not review == Review.get_open_review(challenge, user): raise Http404 except: raise Http404 review.appraisal = data['appraisal'] for answer in answers: question_id = answer['question_id'] text = answer['answer'] review_question = ReviewQuestion.objects.get(pk=question_id) # check if this answer has already been posted # submit button could have been pressed twice # there is no other way to check for this, because the parent # review object gets created when creating the review view # so we can't check it here because it would already exist. # get_or_create() would work here, but notifications would be sent in both cases if ReviewAnswer.objects.filter(review=review, review_question=review_question).exists(): # log this incident so we can trace it down to the client. Is it IE? logger.error("We prevented a review to be submitted twice. Report this with client details.") logger.error("review_id=%i, user_id=%i, question_id=%i, review_question_id=%i" % review.id, user.id, question_id, review_question.id) raise Http404 ReviewAnswer(review=review, review_question=review_question, text=text).save() # send notifications review.submission_time = datetime.now() if 'extra_review_question_answer' in data: review.extra_review_question_answer = data['extra_review_question_answer'] review.save() try: if review.appraisal == review.NOTHING: Notification.bad_review(review) else: Notification.enough_peer_reviews(review) except: print('Could not send Notification') return HttpResponse()
def review_answer(request, course_short_title): user = request.user if request.POST: data = request.body.decode(encoding='UTF-8') data = json.loads(data) review_id = data['review_id'] answers = data['answers'] try: review = Review.objects.get(pk=review_id) challenge = review.elaboration.challenge if not challenge.is_enabled_for_user(user): raise Http404 if not review == Review.get_open_review(challenge, user): raise Http404 except: raise Http404 review.appraisal = data['appraisal'] for answer in answers: question_id = answer['question_id'] text = answer['answer'] review_question = ReviewQuestion.objects.get(pk=question_id) # check if this answer has already been posted # submit button could have been pressed twice # there is no other way to check for this, because the parent # review object gets created when creating the review view # so we can't check it here because it would already exist. # get_or_create() would work here, but notifications would be sent in both cases if ReviewAnswer.objects.filter(review=review, review_question=review_question).exists(): # log this incident so we can trace it down to the client. Is it IE? logger.error("We prevented a review to be submitted twice. Report this with client details.") logger.error("review_id=%i, user_id=%i, question_id=%i, review_question_id=%i" % review.id, user.id, question_id, review_question.id) raise Http404 ReviewAnswer(review=review, review_question=review_question, text=text).save() # send notifications review.submission_time = datetime.now() review.save() try: if review.appraisal == review.NOTHING: Notification.bad_review(review) else: Notification.enough_peer_reviews(review) except: print('Could not send Notification') return HttpResponse()
def create_context_review(request): data = {} if 'id' in request.GET: user = request.user challenge = Challenge.objects.get(pk=request.GET.get('id')) if not challenge.is_enabled_for_user(user): raise Http404 if challenge.has_enough_user_reviews(user): raise Http404 if not challenge.submitted_by_user(user): raise Http404 review = Review.get_open_review(challenge, user) if not review: review_candidate = Elaboration.get_review_candidate( challenge, user) if review_candidate: review = Review(elaboration=review_candidate['candidate'], reviewer=user, chosen_by=review_candidate['chosen_by']) review.save() else: return data data['review'] = review data['stack_id'] = challenge.get_stack().id review_questions = ReviewQuestion.objects.filter( challenge=challenge).order_by("order") author_questions = [ question for question in review_questions if question.visible_to_author == True ] staff_questions = [ question for question in review_questions if question.visible_to_author == False ] data['questions'] = review_questions data['author_questions'] = author_questions data['staff_questions'] = staff_questions extra_review_question_present = len( review.elaboration.extra_review_question) > 0 data['extra_review_question_present'] = extra_review_question_present return data
def create_context_extra_review(request): data = {} if 'id' in request.GET: user = RequestContext(request)['user'] challenge = Challenge.objects.get(pk=request.GET.get('id')) elaboration = Elaboration.objects.get(pk=request.GET.get('elaboration_id')) if not challenge.is_enabled_for_user(user): raise Http404 if not challenge.submitted_by_user(user): raise Http404 review = Review.get_open_review(challenge, user) if not review: review = Review(elaboration=elaboration, reviewer=user, chosen_by='extra_review') review.save() data['review'] = review data['stack_id'] = challenge.get_stack().id review_questions = ReviewQuestion.objects.filter(challenge=challenge).order_by("order") data['questions'] = review_questions return data
def review_answer(request, course_short_title): user = RequestContext(request)['user'] if request.POST: data = request.body.decode(encoding='UTF-8') data = json.loads(data) review_id = data['review_id'] answers = data['answers'] try: review = Review.objects.get(pk=review_id) challenge = review.elaboration.challenge if not challenge.is_enabled_for_user(user): raise Http404 if not review == Review.get_open_review(challenge, user): raise Http404 except: raise Http404 review.appraisal = data['appraisal'] for answer in answers: question_id = answer['question_id'] text = answer['answer'] review_question = ReviewQuestion.objects.get(pk=question_id) ReviewAnswer(review=review, review_question=review_question, text=text).save() # send notifications review.submission_time = datetime.now() review.save() try: if review.appraisal == review.NOTHING: Notification.bad_review(review) else: Notification.enough_peer_reviews(review) except: print('Could not send Notification') return HttpResponse()
def create_context_review(request): data = {} if 'id' in request.GET: user = request.user challenge = Challenge.objects.get(pk=request.GET.get('id')) if not challenge.is_enabled_for_user(user): raise Http404 if challenge.has_enough_user_reviews(user): raise Http404 if not challenge.submitted_by_user(user): raise Http404 review = Review.get_open_review(challenge, user) if not review: review_candidate = Elaboration.get_review_candidate(challenge, user) if review_candidate: review = Review(elaboration=review_candidate['candidate'], reviewer=user, chosen_by=review_candidate['chosen_by']) review.save() else: return data data['review'] = review data['stack_id'] = challenge.get_stack().id review_questions = ReviewQuestion.objects.filter(challenge=challenge).order_by("order") data['questions'] = review_questions return data