@@ -82,43 +82,9 @@ def handle(self, *args, **options):
82
82
def _process_awards_data (self , awards_data : list [dict ], * , dry_run : bool = False ):
83
83
"""Process the awards data from YAML."""
84
84
for item in awards_data :
85
- if item .get ("type" ) == "category" :
86
- self ._process_category (item , dry_run = dry_run )
87
- elif item .get ("type" ) == "award" :
85
+ if item .get ("type" ) == "award" :
88
86
self ._process_award (item , dry_run = dry_run )
89
87
90
- def _process_category (self , category_data : dict , * , dry_run : bool = False ):
91
- """Process a category definition."""
92
- category_name = category_data .get ("title" , "" )
93
- description = category_data .get ("description" , "" )
94
-
95
- if not category_name :
96
- logger .warning ("Skipping category with no title" )
97
- return
98
-
99
- # Create or update category record
100
- if not dry_run :
101
- award , created = Award .objects .get_or_create (
102
- name = category_name ,
103
- award_type = "category" ,
104
- defaults = {
105
- "category" : category_name ,
106
- "description" : description ,
107
- },
108
- )
109
-
110
- if created :
111
- self .awards_created += 1
112
- logger .debug ("Created category: %s" , category_name )
113
- else :
114
- # Update existing category
115
- award .description = description
116
- award .save (update_fields = ["description" , "nest_updated_at" ])
117
- self .awards_updated += 1
118
- logger .debug ("Updated category: %s" , category_name )
119
- else :
120
- logger .debug ("[DRY RUN] Would process category: %s" , category_name )
121
-
122
88
def _process_award (self , award_data : dict , * , dry_run : bool = False ):
123
89
"""Process an individual award."""
124
90
award_name = award_data .get ("title" , "" )
@@ -130,30 +96,31 @@ def _process_award(self, award_data: dict, *, dry_run: bool = False):
130
96
logger .warning ("Skipping incomplete award: %s" , award_data )
131
97
return
132
98
133
- # Process each winner
99
+ # Process each winner using the model's update_data method
134
100
for winner_data in winners :
135
- self ._process_winner (award_name , category , year , winner_data , dry_run = dry_run )
136
-
137
- def _process_winner (
138
- self ,
139
- award_name : str ,
140
- category : str ,
141
- year : int ,
142
- winner_data : dict ,
143
- * ,
144
- dry_run : bool = False ,
145
- ):
101
+ # Prepare winner data with award context
102
+ winner_with_context = {
103
+ "title" : award_name ,
104
+ "category" : category ,
105
+ "year" : year ,
106
+ "name" : winner_data .get ("name" , "" ),
107
+ "info" : winner_data .get ("info" , "" ),
108
+ "image" : winner_data .get ("image" , "" ),
109
+ }
110
+
111
+ self ._process_winner (winner_with_context , dry_run = dry_run )
112
+
113
+ def _process_winner (self , winner_data : dict , * , dry_run : bool = False ):
146
114
"""Process an individual award winner."""
147
115
winner_name = winner_data .get ("name" , "" ).strip ()
148
- winner_info = winner_data .get ("info" , "" )
149
- winner_image = winner_data .get ("image" , "" )
116
+ award_name = winner_data .get ("title" , "" )
150
117
151
118
if not winner_name :
152
119
logger .warning ("Skipping winner with no name for award: %s" , award_name )
153
120
return
154
121
155
122
# Try to match winner with existing user
156
- matched_user = self ._match_user (winner_name , winner_info )
123
+ matched_user = self ._match_user (winner_name , winner_data . get ( "info" , "" ) )
157
124
158
125
if matched_user :
159
126
self .users_matched += 1
@@ -164,42 +131,33 @@ def _process_winner(
164
131
logger .warning ("Could not match user: %s" , winner_name )
165
132
166
133
if not dry_run :
167
- # Create or update award record
168
- award , created = Award .objects .get_or_create (
169
- name = award_name ,
170
- category = category ,
171
- year = year ,
172
- winner_name = winner_name ,
173
- defaults = {
174
- "award_type" : "award" ,
175
- "description" : "" ,
176
- "winner_info" : winner_info ,
177
- "winner_image" : winner_image ,
178
- "user" : matched_user ,
179
- },
180
- )
181
-
182
- if created :
134
+ # Check if award exists before update
135
+ try :
136
+ Award .objects .get (
137
+ name = award_name ,
138
+ category = winner_data .get ("category" , "" ),
139
+ year = winner_data .get ("year" ),
140
+ winner_name = winner_name ,
141
+ )
142
+ is_new = False
143
+ except Award .DoesNotExist :
144
+ is_new = True
145
+
146
+ # Use the model's update_data method
147
+ award = Award .update_data (winner_data , save = True )
148
+
149
+ # Update user association if matched
150
+ if matched_user and award .user != matched_user :
151
+ award .user = matched_user
152
+ award .save (update_fields = ["user" , "nest_updated_at" ])
153
+
154
+ # Track creation/update stats
155
+ if is_new :
183
156
self .awards_created += 1
184
157
logger .debug ("Created award: %s for %s" , award_name , winner_name )
185
158
else :
186
- # Update existing award
187
- updated_fields = []
188
- if award .winner_info != winner_info :
189
- award .winner_info = winner_info
190
- updated_fields .append ("winner_info" )
191
- if award .winner_image != winner_image :
192
- award .winner_image = winner_image
193
- updated_fields .append ("winner_image" )
194
- if award .user != matched_user :
195
- award .user = matched_user
196
- updated_fields .append ("user" )
197
-
198
- if updated_fields :
199
- updated_fields .append ("nest_updated_at" )
200
- award .save (update_fields = updated_fields )
201
- self .awards_updated += 1
202
- logger .debug ("Updated award: %s for %s" , award_name , winner_name )
159
+ self .awards_updated += 1
160
+ logger .debug ("Updated award: %s for %s" , award_name , winner_name )
203
161
else :
204
162
logger .debug ("[DRY RUN] Would process winner: %s for %s" , winner_name , award_name )
205
163
0 commit comments