예제 #1
0
    def _download_file(self, local_filename):
        headers = {'User-Agent': 'DEQAR File Downloader'}
        r = requests.get(self.url,
                         headers=headers,
                         stream=True,
                         allow_redirects=True)
        if r.status_code == requests.codes.ok:
            rf = ReportFile.objects.get(pk=self.report_file_id)
            file_path = os.path.join(settings.MEDIA_ROOT, self.agency_acronym,
                                     local_filename)
            os.makedirs(os.path.dirname(file_path), exist_ok=True)
            with open(file_path, 'wb') as f:
                for chunk in r.iter_content(chunk_size=1024):
                    if chunk:
                        f.write(chunk)

            self.saved_file_path = file_path

            if rf.file_display_name == "":
                rf.file_display_name = local_filename

            rf.file.name = os.path.join(self.agency_acronym, local_filename)
            rf.save()

            flagger = ReportFlagger(rf.report)
            flagger.check_and_set_flags()
예제 #2
0
    def post(self, request):
        # Save the highest institution id
        try:
            max_inst = Institution.objects.latest('id').id
        except ObjectDoesNotExist:
            max_inst = 0

        submitted_reports = []
        accepted_reports = []
        response_contains_valid = False

        csv_object = io.StringIO(request.data, newline=None)
        csv_handler = CSVHandler(csvfile=csv_object)
        csv_handler.handle()

        # Tracking
        client_ip, is_routable = get_client_ip(request)
        tracker = SubmissionTracker(original_data=request.data,
                                    origin='csv',
                                    user_profile=request.user.deqarprofile,
                                    ip_address=client_ip)
        tracker.log_package()

        if csv_handler.error:
            pass

        for data in csv_handler.submission_data:
            serializer = SubmissionPackageSerializer(
                data=data, context={'request': request})
            if serializer.is_valid():
                populator = Populator(data=serializer.validated_data,
                                      user=request.user)
                populator.populate()
                flagger = ReportFlagger(report=populator.report)
                flagger.check_and_set_flags()
                tracker.log_report(populator, flagger)
                submitted_reports.append(
                    self.make_success_response(populator, flagger))
                accepted_reports.append(
                    self.make_success_response(populator, flagger))
                response_contains_valid = True
            else:
                report_id = data.get('report_id', None)
                submitted_reports.append(
                    self.make_error_response(serializer,
                                             original_data={},
                                             report_id=report_id))

        if response_contains_valid:
            send_submission_email.delay(
                response=accepted_reports,
                institution_id_max=max_inst,
                total_submission=len(submitted_reports),
                agency_email=request.user.email)
        return Response(submitted_reports, status=status.HTTP_200_OK)
예제 #3
0
 def perform_create(self, serializer):
     report = serializer.save(created_by=self.request.user)
     report.name = report.agency_esg_activity.activity + ' (by ' + report.agency.acronym_primary + ')'
     report.save()
     flagger = ReportFlagger(report=report)
     flagger.check_and_set_flags()
     client_ip, is_routable = get_client_ip(self.request)
     tracker = SubmissionTracker(
         original_data=self.request.data,
         origin='form',
         user_profile=self.request.user.deqarprofile,
         ip_address=client_ip)
     tracker.log_package()
예제 #4
0
    def perform_update(self, serializer):
        report = serializer.save()
        flagger = ReportFlagger(report=report)
        flagger.check_and_set_flags()

        submit_comment = self.request.data.get('submit_comment', None)
        if submit_comment:
            ReportUpdateLog.objects.create(report=report,
                                           note=submit_comment,
                                           updated_by=self.request.user)
        else:
            ReportUpdateLog.objects.create(report=report,
                                           note='Report updated',
                                           updated_by=self.request.user)
예제 #5
0
 def delete(self, request, *args, **kwargs):
     report = Report.objects.get(id=kwargs.get('pk'))
     flag = Flag.objects.get(flag='high level')
     report_flag, created = ReportFlag.objects.get_or_create(
         report=report,
         flag=flag,
         flag_message='Deletion was requested.',
     )
     if created or report_flag.active is False:
         ReportUpdateLog.objects.create(report=report,
                                        note='Deletion flag was assigned.',
                                        updated_by=request.user)
         report_flag.active = True
         report_flag.removed_by_eqar = False
         report_flag.save()
     report_flagger = ReportFlagger(report=report)
     report_flagger.set_flag()
     index_delete_report.delay(report.id)
     return Response(data={'OK'}, status=200)
예제 #6
0
    def put(self, request, filename, pk, format=None):
        file_obj = request.data['file']
        filename = "%s_%s" % ((datetime.datetime.now().strftime("%Y%m%d_%H%M")), filename)
        try:
            report_file = ReportFile.objects.get(pk=pk)
            agency_acronym = report_file.report.agency.acronym_primary
            file_path = os.path.join(settings.MEDIA_ROOT, agency_acronym, filename)
            os.makedirs(os.path.dirname(file_path), exist_ok=True)
            with open(file_path, 'wb') as f:
                for chunk in file_obj.chunks():
                    f.write(chunk)

            report_file.file.name = os.path.join(agency_acronym, filename)
            report_file.save()

            # Recheck flags
            flagger = ReportFlagger(report=report_file.report)
            flagger.check_and_set_flags()

            return Response(status=204)
        except ObjectDoesNotExist:
            return Response(status=404)
예제 #7
0
 def test_check_programme_qf_ehea_level(self):
     report = Report.objects.get(pk=1)
     flagger = ReportFlagger(report=report)
     flagger.check_programme_qf_ehea_level()
     flagger.set_flag()
     self.assertEqual(report.flag.flag, 'none', report.flag.flag)
     prg = flagger.report.programme_set.first()
     prg.qf_ehea_level = QFEHEALevel.objects.get(pk=4)
     prg.save()
     flagger.check_programme_qf_ehea_level()
     report_flags = ReportFlag.objects.filter(report=report)
     self.assertEqual(report_flags.first().flag.flag, 'high level',
                      report_flags.first().flag.flag)
     msg = "QF-EHEA Level [third cycle] for programme [Verwaltung (B.A.)] " \
           "should be in the institutions QF-EHEA level list."
     self.assertEqual(report_flags.first().flag_message, msg,
                      report_flags.first().flag_message)
예제 #8
0
 def test_check_ehea_is_member(self):
     report = Report.objects.get(pk=1)
     flagger = ReportFlagger(report=Report.objects.get(pk=1))
     inst = flagger.report.institutions.first()
     inst.set_primary_name()
     inst.save()
     ic = inst.institutioncountry_set.first()
     ic.country.ehea_is_member = True
     ic.country.save()
     inst.institutionqfehealevel_set.all().delete()
     flagger.check_ehea_is_member()
     flagger.set_flag()
     report_flags = ReportFlag.objects.filter(report=report)
     self.assertEqual(report_flags.first().flag.flag, 'low level',
                      report_flags.first().flag.flag)
     msg = "A record was created/identified for an institution " \
           "(University of applied sciences for Public Administration Rhineland-Palatinate) in an " \
           "EHEA member country (Germany) without including QF-EHEA levels."
     self.assertEqual(report_flags.first().flag_message, msg,
                      report_flags.first().flag_message)
예제 #9
0
 def test_check_countries(self):
     report = Report.objects.get(pk=1)
     flagger = ReportFlagger(report=Report.objects.get(pk=1))
     inst = flagger.report.institutions.create(
         website_link="https://www.kcl.ac.uk/")
     inst.institutioncountry_set.create(country=Country.objects.get(
         iso_3166_alpha2='GB'))
     programme = flagger.report.programme_set.create(
         name_primary="Programme", )
     programme.countries.add(Country.objects.get(iso_3166_alpha2='BG'))
     flagger.check_countries()
     flagger.set_flag()
     self.assertEqual(flagger.report.agency.agencyfocuscountry_set.count(),
                      15)
     self.assertEqual(flagger.report.flag.flag, 'high level')
     report_flags = ReportFlag.objects.filter(report=report)
     self.assertEqual(report_flags.count(), 5, report_flags.count())
     msg = "Institution country [United Kingdom] was not on a list as an Agency Focus country for [ACQUIN]."
     self.assertEqual(report_flags.first().flag_message, msg,
                      report_flags.first().flag_message)
예제 #10
0
    def post(self, request):
        # Save the highest institution id
        try:
            max_inst = Institution.objects.latest('id').id
        except ObjectDoesNotExist:
            max_inst = 0

        # Tracking
        http_origin = request.META.get('HTTP_ORIGIN', None)
        if http_origin:
            if 'deqar.eu' in http_origin:
                origin = 'form'
            else:
                origin = 'api'
        else:
            origin = 'api'

        client_ip, is_routable = get_client_ip(request)
        tracker = SubmissionTracker(original_data=request.data,
                                    origin=origin,
                                    user_profile=request.user.deqarprofile,
                                    ip_address=client_ip)
        tracker.log_package()

        # Check if request is a list:
        if isinstance(request.data, list):
            submitted_reports = []
            accepted_reports = []
            response_contains_success = False
            response_contains_error = False

            for data in request.data:
                serializer = SubmissionPackageSerializer(
                    data=data, context={'request': request})
                if serializer.is_valid():
                    populator = Populator(data=serializer.validated_data,
                                          user=request.user)
                    populator.populate()
                    flagger = ReportFlagger(report=populator.report)
                    flagger.check_and_set_flags()
                    tracker.log_report(populator, flagger)
                    submitted_reports.append(
                        self.make_success_response(populator, flagger))
                    accepted_reports.append(
                        self.make_success_response(populator, flagger))
                    response_contains_success = True
                else:
                    submitted_reports.append(
                        self.make_error_response(serializer, data))
                    response_contains_error = True

            if response_contains_success:
                send_submission_email.delay(
                    response=accepted_reports,
                    institution_id_max=max_inst,
                    total_submission=len(submitted_reports),
                    agency_email=request.user.email)

            if response_contains_error:
                return Response(submitted_reports,
                                status=status.HTTP_400_BAD_REQUEST)
            else:
                return Response(submitted_reports, status=status.HTTP_200_OK)

        # If request is not a list
        else:
            serializer = SubmissionPackageSerializer(
                data=request.data, context={'request': request})
            if serializer.is_valid():
                populator = Populator(data=serializer.validated_data,
                                      user=request.user)
                populator.populate()
                flagger = ReportFlagger(report=populator.report)
                flagger.check_and_set_flags()
                tracker.log_report(populator, flagger)
                send_submission_email.delay(
                    response=[self.make_success_response(populator, flagger)],
                    institution_id_max=max_inst,
                    total_submission=1,
                    agency_email=request.user.email)
                return Response(self.make_success_response(populator, flagger),
                                status=status.HTTP_200_OK)
            else:
                return Response(self.make_error_response(
                    serializer, request.data),
                                status=status.HTTP_400_BAD_REQUEST)
예제 #11
0
파일: tasks.py 프로젝트: EQAR/eqar_backend
def recheck_flag(report):
    report_flagger = ReportFlagger(report=report)
    report_flagger.check_and_set_flags()
예제 #12
0
 def test_check_report_file(self):
     flagger = ReportFlagger(report=Report.objects.get(pk=1))
     flagger.report.reportfile_set.create(file_display_name="Test File")
     flagger.check_report_file()
     flagger.set_flag()
     self.assertEqual(flagger.report.flag.flag, 'low level')
예제 #13
0
 def test_init(self):
     flagger = ReportFlagger(report=Report.objects.get(pk=1))
     self.assertEqual(flagger.report.agency.acronym_primary, "ACQUIN")