Example #1
0
    def render(self, request: HttpRequest, path: str) -> HttpResponse:
        if not self.result.config.get('complete'):
            # result still pending in Celery: no other data to find yet
            context = {
                'complete': False,
                'offering': self.offering,
                'activity': self.activity,
                'result': self.result,
            }
            resp = render(request,
                          'submission/similarity-moss-result.html',
                          context=context)
            return resp

        base_match = match_base_re.match(path)
        top_match = match_top_re.match(path)
        file_match = match_file_re.match(path)

        if base_match:  # reconstruct matchX.html
            match = base_match.group(2)

            match0 = get_object_or_404(
                SimilarityData.objects.select_related('submission'),
                result=self.result,
                label='match{}-0.html'.format(match))
            match1 = get_object_or_404(
                SimilarityData.objects.select_related('submission'),
                result=self.result,
                label='match{}-1.html'.format(match))

            sub0, _ = SubmissionInfo._get_submission(match0.submission_id)
            sub1, _ = SubmissionInfo._get_submission(match1.submission_id)

            context = {
                'complete': True,
                'offering': self.offering,
                'activity': self.activity,
                'result': self.result,
                'match_n': match,
                'fn_top': 'match{}-top.html'.format(match),
                'fn_left': 'match{}-0.html'.format(match),
                'fn_right': 'match{}-1.html'.format(match),
                'match0': match0,
                'match1': match1,
                'sub0': sub0,
                'sub1': sub1,
            }
            resp = render(request,
                          'submission/similarity-moss-result.html',
                          context=context)
            #resp.allow_frames_csp = True
            #resp['X-Frame-Options'] = 'SAMEORIGIN'
            return resp

        elif top_match:  # reconstruct matchX-top.html
            match = top_match.group(1)
            data = get_object_or_404(SimilarityData,
                                     result=self.result,
                                     label='match{}-top.html'.format(match))

        elif file_match:  # reconstruct matchX-[01].html
            match = file_match.group(1)
            side = file_match.group(2)
            data = get_object_or_404(SimilarityData,
                                     result=self.result,
                                     label='match{}-{}.html'.format(
                                         match, side))

        else:  # index page
            data = SimilarityData.objects.get(result=self.result,
                                              label='index.html')
            context = {
                'offering': self.offering,
                'activity': self.activity,
                'result': self.result,
                'data': data,
            }
            resp = render(request,
                          'submission/similarity-moss.html',
                          context=context)
            return resp

        content = data.file.read().decode('utf8')
        resp = HttpResponse(content)
        resp.allow_frames_csp = True
        resp['X-Frame-Options'] = 'SAMEORIGIN'
        return resp