@@ -160,8 +160,9 @@ def store_text_reply(self, text: str, post_id: str, user_post_id: str, role: str
160160 payload = db_payload .PostPayload (text = text ),
161161 depth = depth ,
162162 )
163- wp .done = True
164- self .db .add (wp )
163+ if not wp .collective :
164+ wp .done = True
165+ self .db .add (wp )
165166 self .db .commit ()
166167 self .journal .log_text_reply (work_package = wp , post_id = new_post_id , role = role , length = len (text ))
167168 return user_post
@@ -186,15 +187,20 @@ def store_rating(self, rating: protocol_schema.PostRating) -> PostReaction:
186187 # store reaction to post
187188 reaction_payload = db_payload .RatingReactionPayload (rating = rating .rating )
188189 reaction = self .insert_reaction (post .id , reaction_payload )
190+ if not work_package .collective :
191+ work_package .done = True
192+ self .db .add (work_package )
193+
189194 self .journal .log_rating (work_package , post_id = post .id , rating = rating .rating )
190195 logger .info (f"Ranking { rating .rating } stored for work_package { work_package .id } ." )
191196 return reaction
192197
193198 def store_ranking (self , ranking : protocol_schema .PostRanking ) -> PostReaction :
194199 # fetch work_package
195200 work_package = self .fetch_workpackage_by_postid (ranking .post_id )
196- work_package .done = True
197- self .db .add (work_package )
201+ if not work_package .collective :
202+ work_package .done = True
203+ self .db .add (work_package )
198204
199205 work_payload : db_payload .RankConversationRepliesPayload | db_payload .RankInitialPromptsPayload = (
200206 work_package .payload .payload
@@ -250,6 +256,7 @@ def store_task(
250256 task : protocol_schema .Task ,
251257 thread_id : UUID = None ,
252258 parent_post_id : UUID = None ,
259+ collective : bool = False ,
253260 ) -> WorkPackage :
254261 payload : db_payload .TaskPayload
255262 match type (task ):
@@ -287,10 +294,7 @@ def store_task(
287294 raise OasstError (f"Invalid task type: { type (task )= } " , OasstErrorCode .INVALID_TASK_TYPE )
288295
289296 wp = self .insert_work_package (
290- payload = payload ,
291- id = task .id ,
292- thread_id = thread_id ,
293- parent_post_id = parent_post_id ,
297+ payload = payload , id = task .id , thread_id = thread_id , parent_post_id = parent_post_id , collective = collective
294298 )
295299 assert wp .id == task .id
296300 return wp
@@ -301,6 +305,7 @@ def insert_work_package(
301305 id : UUID = None ,
302306 thread_id : UUID = None ,
303307 parent_post_id : UUID = None ,
308+ collective : bool = False ,
304309 ) -> WorkPackage :
305310 c = PayloadContainer (payload = payload )
306311 wp = WorkPackage (
@@ -311,6 +316,7 @@ def insert_work_package(
311316 api_client_id = self .api_client .id ,
312317 thread_id = thread_id ,
313318 parent_post_id = parent_post_id ,
319+ collective = collective ,
314320 )
315321 self .db .add (wp )
316322 self .db .commit ()
@@ -397,7 +403,7 @@ def fetch_random_thread(self, require_role: str = None) -> list[Post]:
397403 distinct_threads = distinct_threads .filter (Post .role == require_role )
398404 distinct_threads = distinct_threads .subquery ()
399405
400- random_thread = self .db .query (distinct_threads ).order_by (func .random ()).limit (1 ). subquery ()
406+ random_thread = self .db .query (distinct_threads ).order_by (func .random ()).limit (1 )
401407 thread_posts = self .db .query (Post ).filter (Post .thread_id .in_ (random_thread )).all ()
402408 return thread_posts
403409
@@ -443,7 +449,7 @@ def fetch_multiple_random_replies(self, max_size: int = 5, post_role: str = None
443449 if post_role :
444450 parent = parent .filter (Post .role == post_role )
445451
446- parent = parent .order_by (func .random ()).limit (1 ). subquery ()
452+ parent = parent .order_by (func .random ()).limit (1 )
447453 replies = self .db .query (Post ).filter (Post .parent_id .in_ (parent )).order_by (func .random ()).limit (max_size ).all ()
448454 if not replies :
449455 raise OasstError ("No replies found" , OasstErrorCode .NO_REPLIES_FOUND )
@@ -465,3 +471,20 @@ def fetch_multiple_random_replies(self, max_size: int = 5, post_role: str = None
465471
466472 def fetch_post (self , post_id : UUID ) -> Optional [Post ]:
467473 return self .db .query (Post ).filter (Post .id == post_id ).one ()
474+
475+ def close_task (self , post_id : str , allow_personal_tasks : bool = False ):
476+ self .validate_post_id (post_id )
477+ wp = self .fetch_workpackage_by_postid (post_id )
478+
479+ if not wp :
480+ raise OasstError ("Work package not found" , OasstErrorCode .WORK_PACKAGE_NOT_FOUND )
481+ if wp .expired :
482+ raise OasstError ("Work package expired" , OasstErrorCode .WORK_PACKAGE_EXPIRED )
483+ if not allow_personal_tasks and not wp .collective :
484+ raise OasstError ("This is not a collective task" , OasstErrorCode .WORK_PACKAGE_NOT_COLLECTIVE )
485+ if wp .done :
486+ raise OasstError ("Allready closed" , OasstErrorCode .WORK_PACKAGE_ALREADY_DONE )
487+
488+ wp .done = True
489+ self .db .add (wp )
490+ self .db .commit ()
0 commit comments