Fakultas Ilmu Komputer UI

serializers.py 3.74 KB
Newer Older
1
2
from rest_framework import serializers

3
4
5
from mainan.serializers import MainanSerializer
from mainan.models import Mainan
from .models import Toko, Pengadaan, MainanPengadaan
6
7
8

class TokoSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.email')
9
    foto_profil_toko = serializers.ImageField(read_only=True)
10
    nomor_toko = serializers.IntegerField(read_only=True)
11
    identifier_toko = serializers.SerializerMethodField('get_identifier')
12
13
14
15
16
17
18
    class Meta:
        model = Toko
        fields = [
            'pk',
            'owner',
            'nama_toko',
            'nama_cabang',
19
            'nomor_toko',
20
            'identifier_toko',
21
            'status',
22
23
24
25
26
27
            'tipe_usaha',
            'nomor_telepon',
            'deskripsi_toko',
            'lokasi_toko',
            'longitude',
            'latitude',
28
29
30
31
            'daerah',
            'foto_profil_toko'
        ]

32
33
34
35
    @staticmethod
    def get_identifier(obj):
        return "{}_{:0>3}".format(obj.nama_toko, obj.nomor_toko)

36
37
38
39
40
41
42
43
44
45
46
class PengadaanReadSerializer(serializers.ModelSerializer):
    toko = TokoSerializer(read_only=True)

    class Meta:
        model = Pengadaan
        fields = [
            'pk',
            'toko',
        ]


47
48
class MainanPengadaanSerializer(serializers.ModelSerializer):
    mainan = MainanSerializer()
49
    string_mainan = serializers.SerializerMethodField('mainan_identifier')
50
    pengadaan = PengadaanReadSerializer(read_only=True)
51
52
53

    class Meta:
        model = MainanPengadaan
54
55
56
57
58
        fields = [
            'id',
            'mainan',
            'string_mainan',
            'status',
59
            'pengadaan'
60
61
62
63
64
65
66
67
            ]

    @staticmethod
    def mainan_identifier(obj):
        nama_mainan = obj.mainan.nama_mainan
        id_mainan_pengadaan = str(obj.id)
        return nama_mainan + '_' + id_mainan_pengadaan

68

69
70
71
72
73
74
75
76
77
78
class PengadaanSerializer(serializers.ModelSerializer):
    files = serializers.ListField(
        child=serializers.FileField(use_url=True),
        source='get_all_files',
        read_only=True
    )
    dana_terkumpul = serializers.FloatField(
        source='get_accumulated_dana',
        read_only=True
    )
79
80
    daftar_mainan = MainanPengadaanSerializer(many=True, read_only=True)

81
82
    toko = TokoSerializer(read_only=True)

83
84
85
    class Meta:
        model = Pengadaan
        fields = [
86
            'pk',
87
88
            'status',
            'status_proyek',
89
90
91
92
            'total_biaya',
            'periode_pengadaan_mulai',
            'periode_pengadaan_akhir',
            'estimasi_keuangan',
93
94
            'files',
            'toko',
95
96
            'dana_terkumpul',
            'daftar_mainan'
97
        ]
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116

    def create(self, validated_data):
        daftar_mainan_data = validated_data.pop('daftar_mainan')
        pengadaan = Pengadaan.objects.create(**validated_data)
        self.create_mainan_pengadaan(pengadaan, daftar_mainan_data)
        return pengadaan

    def update(self, instance, validated_data):
        try:
            daftar_mainan_data = validated_data.pop('daftar_mainan')
            self.update_mainan_pengadaan(instance, daftar_mainan_data)
        except KeyError:
            pass

        return super().update(instance, validated_data)

    @classmethod
    def create_mainan_pengadaan(cls, pengadaan, daftar_mainan_data):
        for mainan_data in daftar_mainan_data:
117
            kuantitas = mainan_data['kuantitas']
118
            mainan = Mainan.objects.get(pk=mainan_data['mainan'])
119
120
            for _ in range(kuantitas):
                MainanPengadaan.objects.create(pengadaan=pengadaan, mainan=mainan)
121
122
123
124

    def update_mainan_pengadaan(self, pengadaan, daftar_mainan_data):
        MainanPengadaan.objects.filter(pengadaan=pengadaan).delete()
        self.create_mainan_pengadaan(pengadaan, daftar_mainan_data)