+ def available_answers(self, expert, marked=False):
+ if marked:
+ return self.answer_set.filter(mark__expert=expert).order_by('id').distinct('id')
+ answers = self.answer_set.exclude(mark__expert=expert)
+ assigned_to_expert = self.answer_set.filter(experts=expert).exists()
+ is_supervisor = expert in self.supervisors.all()
+ is_arbiter = expert in self.arbiters.all()
+ if assigned_to_expert:
+ expert_answers = answers.filter(experts=expert)
+ if expert_answers or not is_arbiter:
+ answers = expert_answers
+ answers = answers.extra(where=[
+ "field_values::text ~ ': *\"[^\"]+\"' "
+ "OR EXISTS (SELECT id FROM stage2_attachment WHERE answer_id = stage2_answer.id) "
+ "OR EXISTS (SELECT id FROM stage2_fieldoption WHERE answer_id = stage2_answer.id)"])
+ if not is_supervisor:
+ answers = answers.exclude(complete=True)
+ if not is_supervisor or not self.is_active():
+ answers = answers.filter(participant__complete_set=True)
+ if is_arbiter:
+ answers = answers.filter(need_arbiter=True)
+ return answers
+
+ def field_counts(self, answers):
+ for field_desc in self.field_descriptions:
+ field_name, params = field_desc
+ if params['type'] == 'options':
+ field_count = FieldOption.objects.filter(
+ answer__in=list(answers), set__name=params['option_set']).count()
+ else: # text, link
+ field_count = sum(1 for answer in answers if answer.field_values.get(field_name))
+ yield field_name, field_count
+
+ def expert_counts(self):
+ for expert in self.experts.all():
+ assigned_count = self.answer_set.filter(experts=expert).count()
+ marked_count = self.available_answers(expert, marked=True).count()
+ if assigned_count != 0 or marked_count != 0:
+ yield expert, marked_count, assigned_count
+
+ def complete_answers(self):
+ return self.answer_set.filter(complete=True)
+
+ def needing_arbiter(self):
+ return self.answer_set.filter(need_arbiter=True)