• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

EQAR / eqar_backend / 5b970840-f92d-4ae6-9c8d-5838e1ba4171

29 Jul 2025 09:08PM UTC coverage: 86.434% (-0.8%) from 87.262%
5b970840-f92d-4ae6-9c8d-5838e1ba4171

push

circleci

web-flow
Merge pull request #551 from EQAR/development

Development

231 of 341 new or added lines in 24 files covered. (67.74%)

56 existing lines in 3 files now uncovered.

10385 of 12015 relevant lines covered (86.43%)

0.86 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

50.0
/adminapi/views/report_views.py
1
from drf_rw_serializers import generics
1✔
2
from drf_yasg.utils import swagger_auto_schema
1✔
3
from rest_framework.permissions import IsAdminUser
1✔
4
from rest_framework.response import Response
1✔
5
from rest_framework.views import APIView
1✔
6
from ipware import get_client_ip
1✔
7
from submissionapi.tasks import recheck_flag, download_file
1✔
8
from reports.tasks import index_delete_report
1✔
9

10
from adminapi.permissions import CanEditReport
1✔
11
from adminapi.serializers.report_serializers import ReportReadSerializer, ReportWriteSerializer
1✔
12
from lists.models import Flag
1✔
13
from reports.models import Report, ReportUpdateLog, ReportFlag
1✔
14
from submissionapi.flaggers.report_flagger import ReportFlagger
1✔
15
from submissionapi.trackers.submission_tracker import SubmissionTracker
1✔
16

17

18
class ReportFlagCheck(generics.CreateAPIView):
1✔
19
    queryset = Report.objects.all()
1✔
20
    write_serializer_class = ReportWriteSerializer
1✔
21

22
    def create(self, request, *args, **kwargs):
1✔
23
        pass
×
24

25

26
class ReportCreate(generics.CreateAPIView):
1✔
27
    queryset = Report.objects.all()
1✔
28
    read_serializer_class = ReportReadSerializer
1✔
29
    write_serializer_class = ReportWriteSerializer
1✔
30

31
    def perform_create(self, serializer):
1✔
32
        report = serializer.save(created_by=self.request.user)
×
33

34
        # Harvest files
35
        for rf in report.reportfile_set.iterator():
×
36
            if rf.file_original_location:
×
37
                download_file.delay(
×
38
                    rf.file_original_location,
39
                    rf.id,
40
                    report.agency.acronym_primary
41
                )
42

43
        flagger = ReportFlagger(report=report)
×
44
        flagger.check_and_set_flags()
×
45
        client_ip, is_routable = get_client_ip(self.request)
×
46
        tracker = SubmissionTracker(original_data=self.request.data,
×
47
                                    origin='form',
48
                                    user_profile=self.request.user.deqarprofile,
49
                                    ip_address=client_ip)
50
        tracker.log_package()
×
NEW
51
        tracker.log_report(report, flagger)
×
52

53

54
class ReportDetail(generics.RetrieveUpdateDestroyAPIView):
1✔
55
    queryset = Report.objects.all()
1✔
56
    read_serializer_class = ReportReadSerializer
1✔
57
    write_serializer_class = ReportWriteSerializer
1✔
58
    permission_classes = (CanEditReport|IsAdminUser,)
1✔
59

60
    @swagger_auto_schema(responses={'200': ReportReadSerializer})
1✔
61
    def get(self, request, *args, **kwargs):
1✔
62
        return super(ReportDetail, self).get(request, *args, **kwargs)
×
63

64
    @swagger_auto_schema(request_body=ReportWriteSerializer, responses={'200': ReportReadSerializer})
1✔
65
    def put(self, request, *args, **kwargs):
1✔
66
        return super(ReportDetail, self).put(request, *args, **kwargs)
×
67

68
    def perform_update(self, serializer):
1✔
69
        report = serializer.save()
×
70
        flagger = ReportFlagger(report=report)
×
71
        flagger.check_and_set_flags()
×
72

73
        submit_comment = self.request.data.get('submit_comment', None)
×
74
        if submit_comment:
×
75
            ReportUpdateLog.objects.create(
×
76
                report=report,
77
                note=submit_comment,
78
                updated_by=self.request.user
79
            )
80
        else:
81
            ReportUpdateLog.objects.create(
×
82
                report=report,
83
                note='Report updated',
84
                updated_by=self.request.user
85
            )
86

87
    @swagger_auto_schema(responses={'200': 'OK'})
1✔
88
    def delete(self, request, *args, **kwargs):
1✔
89
        report = Report.objects.get(id=kwargs.get('pk'))
×
90
        flag = Flag.objects.get(flag='high level')
×
91
        report_flag, created = ReportFlag.objects.get_or_create(
×
92
            report=report,
93
            flag=flag,
94
            flag_message='Deletion was requested.',
95
        )
96
        if created or report_flag.active is False:
×
97
            ReportUpdateLog.objects.create(
×
98
                report=report,
99
                note='Deletion flag was assigned.',
100
                updated_by=request.user
101
            )
102
            report_flag.active = True
×
103
            report_flag.removed_by_eqar = False
×
104
            report_flag.save()
×
105
        report_flagger = ReportFlagger(report=report)
×
106
        report_flagger.set_flag()
×
107
        index_delete_report.delay(report.id)
×
108
        return Response(data={'OK'}, status=200)
×
109

110

111
class ReportFlagRemove(APIView):
1✔
112
    permission_classes = (IsAdminUser,)
1✔
113

114
    @swagger_auto_schema(responses={'200': 'OK'})
1✔
115
    def delete(self, request, *args, **kwargs):
1✔
116
        report_flag = ReportFlag.objects.get(id=kwargs.get('pk'))
×
117
        report_flag.active = False
×
118
        report_flag.removed_by_eqar = True
×
119
        report_flag.save()
×
120
        ReportUpdateLog.objects.get_or_create(
×
121
            report=report_flag.report,
122
            note='%s flag was removed' % report_flag.flag.flag.title(),
123
            updated_by=request.user
124
        )
125

126
        # Reindex and recheck flag
127
        recheck_flag(report=report_flag.report)
×
128

129
        return Response(data={'OK'}, status=200)
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc