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

EQAR / eqar_backend / e01b66e3-7b01-4ac2-bdbe-46705f1eec5e

30 Mar 2025 08:23PM UTC coverage: 87.665% (+11.4%) from 76.228%
e01b66e3-7b01-4ac2-bdbe-46705f1eec5e

push

circleci

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

fix institution index signal for Meilisearch

8 of 9 new or added lines in 1 file covered. (88.89%)

288 existing lines in 28 files now uncovered.

10255 of 11698 relevant lines covered (87.66%)

0.88 hits per line

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

60.8
/adminapi/serializers/report_serializers.py
1
from django.conf import settings
1✔
2
from drf_writable_nested import WritableNestedModelSerializer
1✔
3
from rest_framework import serializers
1✔
4

5
from adminapi.fields import PDFBase64File
1✔
6
from adminapi.serializers.programme_serializers import ProgrammeWriteSerializer, ProgrammeReadSerializer
1✔
7
from adminapi.serializers.select_serializers import ReportStatusSerializer, ReportDecisionSerializer, \
1✔
8
    AgencySelectSerializer, AgencyESGActivitySerializer, LanguageSelectSerializer
9
from agencies.models import AgencyESGActivity
1✔
10
from eqar_backend.serializer_fields.date_blank_serializer_field import DateBlankSerializer
1✔
11
from lists.models import Language
1✔
12
from reports.models import Report, ReportFile, ReportFlag, ReportUpdateLog, ReportLink
1✔
13
from adminapi.serializers.institution_serializers import InstitutionReadSerializer
1✔
14

15

16
class ReportLinkSerializer(serializers.ModelSerializer):
1✔
17
    class Meta:
1✔
18
        model = ReportLink
1✔
19
        fields = ['link_display_name', 'link']
1✔
20

21

22
class ReportReadFileSerializer(WritableNestedModelSerializer):
1✔
23
    display_name = serializers.CharField(source='file_display_name')
1✔
24
    original_location = serializers.CharField(source='file_original_location')
1✔
25
    report_language = LanguageSelectSerializer(many=True, source='languages')
1✔
26
    filename = serializers.SerializerMethodField(source='file')
1✔
27
    filesize = serializers.SerializerMethodField(source='file')
1✔
28

29
    def get_filename(self, obj):
1✔
30
        if len(obj.file_original_location) == 0:
×
31
            return obj.file.name
×
32
        else:
33
            return ''
×
34

35
    def get_filesize(self, obj):
1✔
36
        try:
×
37
            return obj.file.size
×
38
        except Exception:
×
39
            return 0
×
40

41
    class Meta:
1✔
42
        model = ReportFile
1✔
43
        fields = ('id', 'display_name', 'original_location', 'file', 'filename', 'filesize', 'report_language')
1✔
44

45

46
class ReportWriteFileSerializer(WritableNestedModelSerializer):
1✔
47
    display_name = serializers.CharField(source='file_display_name', max_length=255, required=False, allow_blank=True)
1✔
48
    original_location = serializers.CharField(source='file_original_location', max_length=500, required=False, allow_blank=True)
1✔
49
    report_language = serializers.PrimaryKeyRelatedField(many=True, queryset=Language.objects.all(), source='languages')
1✔
50
    filename = serializers.CharField(required=False, max_length=255, allow_blank=True)
1✔
51
    fileupload = PDFBase64File(required=False, source='file')
1✔
52

53
    def create(self, validated_data):
1✔
54
        report_file = ReportFile.objects.create(
×
55
            report=validated_data.get('report', ''),
56
            file_display_name=validated_data.get('file_display_name', ''),
57
            file_original_location=validated_data.get('file_original_location', ''),
58
        )
59
        report_file.languages.set(validated_data.get('languages', ''))
×
60

61
        filename = validated_data.get('filename', '')
×
62
        fileupload = validated_data.get('file', '')
×
63
        if fileupload:
×
64
            fileupload.name = filename
×
65
            report_file.file = fileupload
×
66

67
        report_file.save()
×
68
        return report_file
×
69

70
    def update(self, instance, validated_data):
1✔
71
        instance.file_display_name = validated_data.get('file_display_name', '')
×
72
        instance.file_original_location = validated_data.get('file_original_location', '')
×
73
        instance.languages.set(validated_data.get('languages'))
×
74

75
        filename = validated_data.get('filename', '')
×
76
        fileupload = validated_data.get('file', '')
×
77
        if fileupload:
×
78
            fileupload.name = filename
×
79
            instance.file = fileupload
×
80

81
        instance.save()
×
82
        return instance
×
83

84
    class Meta:
1✔
85
        model = ReportFile
1✔
86
        fields = ('id', 'display_name', 'original_location', 'report_language', 'filename', 'fileupload')
1✔
87

88

89
class ReportFlagSerializer(serializers.ModelSerializer):
1✔
90
    flag = serializers.StringRelatedField()
1✔
91

92
    class Meta:
1✔
93
        model = ReportFlag
1✔
94
        ref_name = 'ReportFlagSerializer'
1✔
95
        fields = ('id', 'flag', 'flag_message', 'active', 'removed_by_eqar')
1✔
96

97

98
class ReportUpdateLogSerializer(serializers.ModelSerializer):
1✔
99
    updated_by = serializers.SlugRelatedField(slug_field='username', read_only=True)
1✔
100

101
    class Meta:
1✔
102
        model = ReportUpdateLog
1✔
103
        fields = ('id', 'note', 'updated_by', 'updated_at')
1✔
104

105

106
class ReportReadSerializer(serializers.ModelSerializer):
1✔
107
    agency = AgencySelectSerializer()
1✔
108
    contributing_agencies = AgencySelectSerializer(many=True)
1✔
109
    activities = AgencyESGActivitySerializer(many=True, source='agency_esg_activities', read_only=True)
1✔
110
    status = ReportStatusSerializer()
1✔
111
    decision = ReportDecisionSerializer()
1✔
112
    report_links = ReportLinkSerializer(many=True, source='reportlink_set', read_only=True)
1✔
113
    report_files = ReportReadFileSerializer(many=True, source='reportfile_set', read_only=True)
1✔
114
    institutions = InstitutionReadSerializer(many=True)
1✔
115
    platforms = InstitutionReadSerializer(many=True)
1✔
116
    programmes = ProgrammeReadSerializer(many=True, source='programme_set')
1✔
117
    flags = ReportFlagSerializer(many=True, source='reportflag_set')
1✔
118
    update_log = serializers.SerializerMethodField()
1✔
119
    created_by = serializers.SlugRelatedField(
1✔
120
        slug_field='username',
121
        read_only=True
122
    )
123

124
    def get_update_log(self, obj):
1✔
125
        queryset = obj.reportupdatelog_set.order_by('updated_at')
×
126
        return ReportUpdateLogSerializer(queryset, many=True, context=self.context).data
×
127

128
    class Meta:
1✔
129
        model = Report
1✔
130
        fields = ['id', 'agency', 'contributing_agencies', 'activities',
1✔
131
                  'local_identifier',
132
                  'status', 'decision', 'summary',
133
                  'institutions', 'platforms', 'programmes', 'report_links', 'report_files',
134
                  'valid_from', 'valid_to', 'flags',
135
                  'created_at', 'updated_at', 'created_by', 'update_log',
136
                  'other_comment', 'internal_note']
137

138

139
class ReportWriteSerializer(WritableNestedModelSerializer):
1✔
140
    activities = serializers.PrimaryKeyRelatedField(many=True, queryset=AgencyESGActivity.objects.all(), source='agency_esg_activities')
1✔
141
    report_links = ReportLinkSerializer(many=True, source='reportlink_set', required=False)
1✔
142
    report_files = ReportWriteFileSerializer(many=True, source='reportfile_set')
1✔
143
    programmes = ProgrammeWriteSerializer(many=True, source='programme_set', required=False)
1✔
144
    valid_to = DateBlankSerializer(allow_null=True, required=False)
1✔
145

146
    def validate(self, data):
1✔
147
        errors = []
×
UNCOV
148
        data = super(ReportWriteSerializer, self).validate(data)
×
149

150
        institutions = data.get('institutions', [])
×
151
        programmes = data.get('programmes', [])
×
UNCOV
152
        status = data.get('status', None)
×
153

154
        #
155
        # Validations for OTHER PROVIDERS
156
        #
157
        # Check if all institutions are AP
158
        all_ap = True
×
159
        all_hei = True
×
160
        for i in institutions:
×
161
            if not i.is_other_provider:
×
UNCOV
162
                all_ap = False
×
163
            else:
UNCOV
164
                all_hei = False
×
165

166
        # Status must be 'voluntary' if all institutions are AP
167
        if all_ap:
×
168
            if not status or status.id != 2:
×
UNCOV
169
                errors.append("Status should be 'voluntary' if all organisations are other providers.")
×
170

171
        # Programme degree outcome must be "no full degree" for AP:
172
        if all_ap and len(programmes) > 0:
×
173
            for programme in programmes:
×
174
                if programme['degree_outcome'].id != 2:
×
UNCOV
175
                    errors.append("Degree outcome should be '2 / no full degree' if all the "
×
176
                                  "organisations are other providers")
177

178
        if len(errors) > 0:
×
UNCOV
179
            raise serializers.ValidationError({settings.NON_FIELD_ERRORS_KEY: errors})
×
180

UNCOV
181
        return data
×
182

183
    class Meta:
1✔
184
        model = Report
1✔
185
        fields = ['id', 'agency', 'contributing_agencies', 'activities', 'local_identifier',
1✔
186
                  'status', 'decision', 'summary',
187
                  'institutions', 'platforms', 'programmes', 'report_links', 'report_files',
188
                  'valid_from', 'valid_to', 'other_comment', 'internal_note']
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