예제 #1
0
    def get_context_data(self, **kwargs):
        context = super(TaskScoresView, self).get_context_data(**kwargs)

        monitoring = self.task.organization.monitoring
        self.queryform = ParametersQueryForm(self.request.GET)

        # These fields should be annotated on paramter for strict pedantic tests.
        _param_extra = {'select': {'comment_url': 0, 'score_pk': 0, 'score_table': 0, 'score_openness': 0, 'score_openness_delta': 0}}

        # Relevant parameters
        relevant_parameters = Parameter.objects.filter(monitoring=monitoring)\
                                               .exclude(exclude=self.task.organization)\
                                               .defer('grounds', 'rating_procedure', 'notes')\
                                               .extra(**_param_extra)
        scores_rel = Score.objects.filter(task=self.task)\
                                  .exclude(parameter__exclude=self.task.organization)\
                                  .defer('links', 'recommendations', 'created', 'last_modified', 'editor')
        relevant_parameters_exist = relevant_parameters.exists()

        # Apply user provided filters to relevant parameters
        if self.queryform.is_valid():
            relevant_parameters = self.queryform.apply(relevant_parameters)

        # Set scores to relevant parameters list
        self._set_parameters_scores(relevant_parameters, scores_rel)
        self._set_last_comment_url(relevant_parameters, scores_rel)

        if self.request.user.is_expert:
            # Non relevant parameters
            nonrelevant_parameters = Parameter.objects.filter(monitoring=monitoring, exclude=self.task.organization)\
                                                      .defer('grounds', 'rating_procedure', 'notes')\
                                                      .extra(**_param_extra)
            scores_nonrel = Score.objects.filter(task=self.task, parameter__exclude=self.task.organization)\
                                         .defer('links', 'recommendations', 'created', 'last_modified', 'editor')
            nonrelevant_parameters_exist = nonrelevant_parameters.exists()

            # Apply user provided filters to non relevant parameters
            if self.queryform.is_valid():
                nonrelevant_parameters = self.queryform.apply(nonrelevant_parameters)

            # Set scores to non relevant parameters list
            self._set_parameters_scores(nonrelevant_parameters, scores_nonrel)

            context.update({
                'nonrelevant_parameters': nonrelevant_parameters,
                'nonrelevant_parameters_exist': nonrelevant_parameters_exist,
            })

        # Get questionnaire form
        questionnaire_form = None
        questions = QQuestion.objects.filter(questionnaire__monitoring=monitoring).order_by("pk")
        if questions:
            existing_answers = QAnswer.objects.filter(task=self.task).order_by("pk")
            initial_data = {"q_%s" % a.question.pk: a.answer(True) for a in existing_answers}
            questionnaire_form = QuestionnaireDynForm(questions=questions, initial=initial_data)

        context.update({
            'relevant_parameters': relevant_parameters,
            'relevant_parameters_exist': relevant_parameters_exist,
            'mon': monitoring,
            'task': self.task,
            'questionnaire_form': questionnaire_form,
            'invcodeform': SettingsInvCodeForm(),
            'orgs_count': Organization.objects.filter(monitoring=monitoring).count(),
            'openness': self.task.openness,
            'delta': self.task.openness - self.task.openness_initial if self.task.openness is not None else None,
            'columns_form': task_scores_columns_form(self.request),
            'is_representative': self.request.user.represents(self.task.organization),
        })

        return context
예제 #2
0
파일: views.py 프로젝트: btbroot/exmo2010
    def get_context_data(self, **kwargs):
        context = super(TaskScoresView, self).get_context_data(**kwargs)

        monitoring = self.task.organization.monitoring
        self.queryform = ParametersQueryForm(self.request.GET)

        # These fields should be annotated on paramter for strict pedantic tests.
        _param_extra = {
            'select': {
                'comment_url': 0,
                'score_pk': 0,
                'score_table': 0,
                'score_openness': 0,
                'score_openness_delta': 0
            }
        }

        # Relevant parameters
        relevant_parameters = Parameter.objects.filter(monitoring=monitoring)\
                                               .exclude(exclude=self.task.organization)\
                                               .defer('grounds', 'rating_procedure', 'notes')\
                                               .extra(**_param_extra)
        scores_rel = Score.objects.filter(task=self.task)\
                                  .exclude(parameter__exclude=self.task.organization)\
                                  .defer('links', 'recommendations', 'created', 'last_modified', 'editor')
        relevant_parameters_exist = relevant_parameters.exists()

        # Apply user provided filters to relevant parameters
        if self.queryform.is_valid():
            relevant_parameters = self.queryform.apply(relevant_parameters)

        # Set scores to relevant parameters list
        self._set_parameters_scores(relevant_parameters, scores_rel)
        self._set_last_comment_url(relevant_parameters, scores_rel)

        if self.request.user.is_expert:
            # Non relevant parameters
            nonrelevant_parameters = Parameter.objects.filter(monitoring=monitoring, exclude=self.task.organization)\
                                                      .defer('grounds', 'rating_procedure', 'notes')\
                                                      .extra(**_param_extra)
            scores_nonrel = Score.objects.filter(task=self.task, parameter__exclude=self.task.organization)\
                                         .defer('links', 'recommendations', 'created', 'last_modified', 'editor')
            nonrelevant_parameters_exist = nonrelevant_parameters.exists()

            # Apply user provided filters to non relevant parameters
            if self.queryform.is_valid():
                nonrelevant_parameters = self.queryform.apply(
                    nonrelevant_parameters)

            # Set scores to non relevant parameters list
            self._set_parameters_scores(nonrelevant_parameters, scores_nonrel)

            context.update({
                'nonrelevant_parameters':
                nonrelevant_parameters,
                'nonrelevant_parameters_exist':
                nonrelevant_parameters_exist,
            })

        # Get questionnaire form
        questionnaire_form = None
        questions = QQuestion.objects.filter(
            questionnaire__monitoring=monitoring).order_by("pk")
        if questions:
            existing_answers = QAnswer.objects.filter(
                task=self.task).order_by("pk")
            initial_data = {
                "q_%s" % a.question.pk: a.answer(True)
                for a in existing_answers
            }
            questionnaire_form = QuestionnaireDynForm(questions=questions,
                                                      initial=initial_data)

        context.update({
            'relevant_parameters':
            relevant_parameters,
            'relevant_parameters_exist':
            relevant_parameters_exist,
            'mon':
            monitoring,
            'task':
            self.task,
            'questionnaire_form':
            questionnaire_form,
            'invcodeform':
            SettingsInvCodeForm(),
            'orgs_count':
            Organization.objects.filter(monitoring=monitoring).count(),
            'openness':
            self.task.openness,
            'delta':
            self.task.openness - self.task.openness_initial
            if self.task.openness is not None else None,
            'columns_form':
            task_scores_columns_form(self.request),
            'is_representative':
            self.request.user.represents(self.task.organization),
        })

        return context
예제 #3
0
class TaskScoresView(TaskScoresMixin, DetailView):
    template_name = "scores/task_scores.html"

    def post(self, request, *args, **kwargs):
        scores_table_columns_form = task_scores_columns_form(request)
        if scores_table_columns_form.post_ok(request):
            return HttpResponseRedirect(request.path)
        else:
            return HttpResponseBadRequest()

    def get_context_data(self, **kwargs):
        context = super(TaskScoresView, self).get_context_data(**kwargs)

        monitoring = self.task.organization.monitoring
        self.queryform = ParametersQueryForm(self.request.GET)

        # These fields should be annotated on paramter for strict pedantic tests.
        _param_extra = {'select': {'comment_url': 0, 'score_pk': 0, 'score_table': 0, 'score_openness': 0, 'score_openness_delta': 0}}

        # Relevant parameters
        relevant_parameters = Parameter.objects.filter(monitoring=monitoring)\
                                               .exclude(exclude=self.task.organization)\
                                               .defer('grounds', 'rating_procedure', 'notes')\
                                               .extra(**_param_extra)
        scores_rel = Score.objects.filter(task=self.task)\
                                  .exclude(parameter__exclude=self.task.organization)\
                                  .defer('links', 'recommendations', 'created', 'last_modified', 'editor')
        relevant_parameters_exist = relevant_parameters.exists()

        # Apply user provided filters to relevant parameters
        if self.queryform.is_valid():
            relevant_parameters = self.queryform.apply(relevant_parameters)

        # Set scores to relevant parameters list
        self._set_parameters_scores(relevant_parameters, scores_rel)
        self._set_last_comment_url(relevant_parameters, scores_rel)

        if self.request.user.is_expert:
            # Non relevant parameters
            nonrelevant_parameters = Parameter.objects.filter(monitoring=monitoring, exclude=self.task.organization)\
                                                      .defer('grounds', 'rating_procedure', 'notes')\
                                                      .extra(**_param_extra)
            scores_nonrel = Score.objects.filter(task=self.task, parameter__exclude=self.task.organization)\
                                         .defer('links', 'recommendations', 'created', 'last_modified', 'editor')
            nonrelevant_parameters_exist = nonrelevant_parameters.exists()

            # Apply user provided filters to non relevant parameters
            if self.queryform.is_valid():
                nonrelevant_parameters = self.queryform.apply(nonrelevant_parameters)

            # Set scores to non relevant parameters list
            self._set_parameters_scores(nonrelevant_parameters, scores_nonrel)

            context.update({
                'nonrelevant_parameters': nonrelevant_parameters,
                'nonrelevant_parameters_exist': nonrelevant_parameters_exist,
            })

        # Get questionnaire form
        questionnaire_form = None
        questions = QQuestion.objects.filter(questionnaire__monitoring=monitoring).order_by("pk")
        if questions:
            existing_answers = QAnswer.objects.filter(task=self.task).order_by("pk")
            initial_data = {"q_%s" % a.question.pk: a.answer(True) for a in existing_answers}
            questionnaire_form = QuestionnaireDynForm(questions=questions, initial=initial_data)

        context.update({
            'relevant_parameters': relevant_parameters,
            'relevant_parameters_exist': relevant_parameters_exist,
            'mon': monitoring,
            'task': self.task,
            'questionnaire_form': questionnaire_form,
            'invcodeform': SettingsInvCodeForm(),
            'orgs_count': Organization.objects.filter(monitoring=monitoring).count(),
            'openness': self.task.openness,
            'delta': self.task.openness - self.task.openness_initial if self.task.openness is not None else None,
            'columns_form': task_scores_columns_form(self.request),
            'is_representative': self.request.user.represents(self.task.organization),
        })

        return context

    @staticmethod
    def _set_parameters_scores(parameters, scores):
        score_fin_dict = {s.parameter.pk: s for s in scores if s.revision == Score.FINAL}
        score_int_dict = {s.parameter.pk: s for s in scores if s.revision == Score.INTERIM}

        for param in parameters:
            score_fin = score_fin_dict.get(param.pk, None)
            if score_fin:
                param.score_pk = score_fin.pk
                param.score_accomplished = score_fin.accomplished
                score_int = score_int_dict.get(param.pk, None)
                param.score_openness = score_fin.openness
                param.score_openness_delta = score_fin.openness - score_int.openness if score_int else 0

                criteria = ['found'] + filter(param.__getattribute__, Parameter.OPTIONAL_CRITERIA)

                score_table = []
                for criterion in ['found'] + Parameter.OPTIONAL_CRITERIA:
                    if criterion in criteria:
                        score_table.append({
                            'score_final': getattr(score_fin, criterion),
                            'score_interim': getattr(score_int, criterion) if score_int else '',
                            'max_score': getattr(score_fin, criterion) == score_fin._meta.get_field(criterion).choices[-1][-1]
                        })
                    else:
                        score_table.append({})

                param.score_table = score_table

    def _set_last_comment_url(self, parameters, scores):
        if self.request.user.executes(self.task) or self.request.user.is_expertA:
            scores_with_opened_comments = CommentExmo.objects.filter(
                object_pk__in=scores.values_list('pk', flat=True),
                content_type__model=ContentType.objects.get_for_model(Score),
                status=CommentExmo.OPEN,
                user__groups__name=UserProfile.organization_group,
            ).values_list('object_pk', flat=True)

            if scores_with_opened_comments:
                scores_with_opened_comments = [int(s) for s in set(scores_with_opened_comments)]
                for param in parameters:
                    if not getattr(param, 'score_pk', None):
                        continue

                    if param.score_pk in scores_with_opened_comments:
                        param.comment_url = reverse('exmo2010:score', args=[param.score_pk]) + "#last_comment"
예제 #4
0
파일: views.py 프로젝트: btbroot/exmo2010
class TaskScoresView(TaskScoresMixin, DetailView):
    template_name = "scores/task_scores.html"

    def post(self, request, *args, **kwargs):
        scores_table_columns_form = task_scores_columns_form(request)
        if scores_table_columns_form.post_ok(request):
            return HttpResponseRedirect(request.path)
        else:
            return HttpResponseBadRequest()

    def get_context_data(self, **kwargs):
        context = super(TaskScoresView, self).get_context_data(**kwargs)

        monitoring = self.task.organization.monitoring
        self.queryform = ParametersQueryForm(self.request.GET)

        # These fields should be annotated on paramter for strict pedantic tests.
        _param_extra = {
            'select': {
                'comment_url': 0,
                'score_pk': 0,
                'score_table': 0,
                'score_openness': 0,
                'score_openness_delta': 0
            }
        }

        # Relevant parameters
        relevant_parameters = Parameter.objects.filter(monitoring=monitoring)\
                                               .exclude(exclude=self.task.organization)\
                                               .defer('grounds', 'rating_procedure', 'notes')\
                                               .extra(**_param_extra)
        scores_rel = Score.objects.filter(task=self.task)\
                                  .exclude(parameter__exclude=self.task.organization)\
                                  .defer('links', 'recommendations', 'created', 'last_modified', 'editor')
        relevant_parameters_exist = relevant_parameters.exists()

        # Apply user provided filters to relevant parameters
        if self.queryform.is_valid():
            relevant_parameters = self.queryform.apply(relevant_parameters)

        # Set scores to relevant parameters list
        self._set_parameters_scores(relevant_parameters, scores_rel)
        self._set_last_comment_url(relevant_parameters, scores_rel)

        if self.request.user.is_expert:
            # Non relevant parameters
            nonrelevant_parameters = Parameter.objects.filter(monitoring=monitoring, exclude=self.task.organization)\
                                                      .defer('grounds', 'rating_procedure', 'notes')\
                                                      .extra(**_param_extra)
            scores_nonrel = Score.objects.filter(task=self.task, parameter__exclude=self.task.organization)\
                                         .defer('links', 'recommendations', 'created', 'last_modified', 'editor')
            nonrelevant_parameters_exist = nonrelevant_parameters.exists()

            # Apply user provided filters to non relevant parameters
            if self.queryform.is_valid():
                nonrelevant_parameters = self.queryform.apply(
                    nonrelevant_parameters)

            # Set scores to non relevant parameters list
            self._set_parameters_scores(nonrelevant_parameters, scores_nonrel)

            context.update({
                'nonrelevant_parameters':
                nonrelevant_parameters,
                'nonrelevant_parameters_exist':
                nonrelevant_parameters_exist,
            })

        # Get questionnaire form
        questionnaire_form = None
        questions = QQuestion.objects.filter(
            questionnaire__monitoring=monitoring).order_by("pk")
        if questions:
            existing_answers = QAnswer.objects.filter(
                task=self.task).order_by("pk")
            initial_data = {
                "q_%s" % a.question.pk: a.answer(True)
                for a in existing_answers
            }
            questionnaire_form = QuestionnaireDynForm(questions=questions,
                                                      initial=initial_data)

        context.update({
            'relevant_parameters':
            relevant_parameters,
            'relevant_parameters_exist':
            relevant_parameters_exist,
            'mon':
            monitoring,
            'task':
            self.task,
            'questionnaire_form':
            questionnaire_form,
            'invcodeform':
            SettingsInvCodeForm(),
            'orgs_count':
            Organization.objects.filter(monitoring=monitoring).count(),
            'openness':
            self.task.openness,
            'delta':
            self.task.openness - self.task.openness_initial
            if self.task.openness is not None else None,
            'columns_form':
            task_scores_columns_form(self.request),
            'is_representative':
            self.request.user.represents(self.task.organization),
        })

        return context

    @staticmethod
    def _set_parameters_scores(parameters, scores):
        score_fin_dict = {
            s.parameter.pk: s
            for s in scores if s.revision == Score.FINAL
        }
        score_int_dict = {
            s.parameter.pk: s
            for s in scores if s.revision == Score.INTERIM
        }

        for param in parameters:
            score_fin = score_fin_dict.get(param.pk, None)
            if score_fin:
                param.score_pk = score_fin.pk
                param.score_accomplished = score_fin.accomplished
                score_int = score_int_dict.get(param.pk, None)
                param.score_openness = score_fin.openness
                param.score_openness_delta = score_fin.openness - score_int.openness if score_int else 0

                criteria = ['found'] + filter(param.__getattribute__,
                                              Parameter.OPTIONAL_CRITERIA)

                score_table = []
                for criterion in ['found'] + Parameter.OPTIONAL_CRITERIA:
                    if criterion in criteria:
                        score_table.append({
                            'score_final':
                            getattr(score_fin, criterion),
                            'score_interim':
                            getattr(score_int, criterion) if score_int else '',
                            'max_score':
                            getattr(score_fin,
                                    criterion) == score_fin._meta.get_field(
                                        criterion).choices[-1][-1]
                        })
                    else:
                        score_table.append({})

                param.score_table = score_table

    def _set_last_comment_url(self, parameters, scores):
        if self.request.user.executes(
                self.task) or self.request.user.is_expertA:
            scores_with_opened_comments = CommentExmo.objects.filter(
                object_pk__in=scores.values_list('pk', flat=True),
                content_type__model=ContentType.objects.get_for_model(Score),
                status=CommentExmo.OPEN,
                user__groups__name=UserProfile.organization_group,
            ).values_list('object_pk', flat=True)

            if scores_with_opened_comments:
                scores_with_opened_comments = [
                    int(s) for s in set(scores_with_opened_comments)
                ]
                for param in parameters:
                    if not getattr(param, 'score_pk', None):
                        continue

                    if param.score_pk in scores_with_opened_comments:
                        param.comment_url = reverse('exmo2010:score',
                                                    args=[param.score_pk
                                                          ]) + "#last_comment"