11from collections import defaultdict
22from collections .abc import Mapping , Sequence
33
4+ from attrs import frozen
5+
46from cbv import models
57from cbv .importer .dataclasses import Klass , KlassAttribute , Method , Module
68from cbv .importer .importers import CodeImporter
@@ -81,12 +83,28 @@ def _wipe_clashing_data(self, *, project_version: str) -> None:
8183 ).delete ()
8284
8385
86+ @frozen
87+ class Attribute :
88+ klass_pk : int
89+ line_number : int
90+ name : str
91+ value : str
92+
93+ def to_model (self ) -> models .KlassAttribute :
94+ return models .KlassAttribute (
95+ klass_id = self .klass_pk ,
96+ line_number = self .line_number ,
97+ name = self .name ,
98+ value = self .value ,
99+ )
100+
101+
84102def create_attributes (
85103 attributes : Mapping [tuple [str , str ], Sequence [tuple [str , int ]]],
86104 klass_lookup : Mapping [str , models .Klass ],
87105) -> None :
88106 # Go over each name/value pair to create KlassAttributes
89- attribute_models = []
107+ collected_attributes = set ()
90108 for (name , value ), klasses in attributes .items ():
91109 # Find all the descendants of each Klass.
92110 descendants = set ()
@@ -106,13 +124,19 @@ def create_attributes(
106124 # Now we can create the KlassAttributes
107125 for klass_path , line in remaining_klasses :
108126 klass = klass_lookup [klass_path ]
109- attribute_models .append (
110- models .KlassAttribute (
111- klass = klass , line_number = line , name = name , value = value
127+
128+ collected_attributes .add (
129+ Attribute (
130+ klass_pk = klass .pk ,
131+ line_number = line ,
132+ name = name ,
133+ value = value ,
112134 )
113135 )
114136
115- models .KlassAttribute .objects .bulk_create (attribute_models )
137+ models .KlassAttribute .objects .bulk_create (
138+ [attribute .to_model () for attribute in collected_attributes ]
139+ )
116140
117141
118142def create_inheritance (
0 commit comments