|
8 | 8 | import numpy as np |
9 | 9 | import pandas as pd |
10 | 10 | from pandas.testing import assert_index_equal |
11 | | -from sqlalchemy import Integer, cast, func, or_, select |
| 11 | +from sqlalchemy import and_, Integer, cast, func, or_, select |
12 | 12 | from sqlalchemy.orm import Session, aliased, contains_eager, joinedload, selectinload |
13 | 13 |
|
14 | 14 | from mavedb.lib.exceptions import ValidationError |
@@ -74,13 +74,21 @@ def search_score_sets(db: Session, owner_or_contributor: Optional["UserData"], s |
74 | 74 | query = db.query(ScoreSet) # \ |
75 | 75 | # .filter(ScoreSet.private.is_(False)) |
76 | 76 |
|
77 | | - if owner_or_contributor is not None: |
78 | | - query = query.filter( |
79 | | - or_( |
80 | | - ScoreSet.created_by_id == owner_or_contributor.user.id, |
81 | | - ScoreSet.contributors.any(Contributor.orcid_id == owner_or_contributor.user.username), |
| 77 | + if owner_or_contributor is not None and search.me is not None: |
| 78 | + if search.me: |
| 79 | + query = query.filter( |
| 80 | + or_( |
| 81 | + ScoreSet.created_by_id == owner_or_contributor.user.id, |
| 82 | + ScoreSet.contributors.any(Contributor.orcid_id == owner_or_contributor.user.username), |
| 83 | + ) |
| 84 | + ) |
| 85 | + else: |
| 86 | + query = query.filter( |
| 87 | + and_( |
| 88 | + ScoreSet.created_by_id != owner_or_contributor.user.id, |
| 89 | + ~ScoreSet.contributors.any(Contributor.orcid_id == owner_or_contributor.user.username), |
| 90 | + ) |
82 | 91 | ) |
83 | | - ) |
84 | 92 |
|
85 | 93 | if search.published is not None: |
86 | 94 | if search.published: |
@@ -256,27 +264,36 @@ def search_score_sets(db: Session, owner_or_contributor: Optional["UserData"], s |
256 | 264 | .order_by(Experiment.title) |
257 | 265 | .all() |
258 | 266 | ) |
| 267 | + print(score_sets) |
259 | 268 | # Remove superseded score set |
260 | 269 | if not score_sets: |
| 270 | + print("if no score set") |
261 | 271 | final_score_sets: list[ScoreSet] = [] |
262 | 272 | else: |
263 | | - published_filter = search.published if search.published is not None else None |
264 | | - print(len(score_sets)) |
265 | | - filtered_score_sets = [ |
266 | | - find_superseded_score_set_tail( |
267 | | - score_set, |
268 | | - Action.READ, |
269 | | - owner_or_contributor, |
270 | | - published_filter |
271 | | - ) for score_set in score_sets |
272 | | - ] |
273 | | - print(len(filtered_score_sets)) |
| 273 | + if search.published: |
| 274 | + filtered_score_sets_tail = [ |
| 275 | + find_publish_or_private_superseded_score_set_tail( |
| 276 | + score_set, |
| 277 | + Action.READ, |
| 278 | + owner_or_contributor, |
| 279 | + search.published |
| 280 | + ) for score_set in score_sets |
| 281 | + ] |
| 282 | + else: |
| 283 | + print("filtered_tail") |
| 284 | + filtered_score_sets_tail = [ |
| 285 | + find_superseded_score_set_tail( |
| 286 | + score_set, |
| 287 | + Action.READ, |
| 288 | + owner_or_contributor |
| 289 | + ) for score_set in score_sets |
| 290 | + ] |
| 291 | + print(len(filtered_score_sets_tail)) |
274 | 292 | # Remove None item. |
275 | | - filtered_score_sets = [score_set for score_set in filtered_score_sets if score_set is not None] |
| 293 | + filtered_score_sets = [score_set for score_set in filtered_score_sets_tail if score_set is not None] |
276 | 294 | print(len(filtered_score_sets)) |
277 | 295 | if filtered_score_sets: |
278 | | - # final_score_sets = sorted(set(filtered_score_sets), key=attrgetter("urn")) |
279 | | - final_score_sets = filtered_score_sets.sort(key=attrgetter("urn")) |
| 296 | + final_score_sets = sorted(set(filtered_score_sets), key=attrgetter("urn")) |
280 | 297 | for f in filtered_score_sets: |
281 | 298 | print(f.urn) |
282 | 299 | else: |
@@ -335,48 +352,54 @@ def find_meta_analyses_for_experiment_sets(db: Session, urns: list[str]) -> list |
335 | 352 | def find_superseded_score_set_tail( |
336 | 353 | score_set: ScoreSet, |
337 | 354 | action: Optional["Action"] = None, |
338 | | - user_data: Optional["UserData"] = None, |
339 | | - publish: Optional[bool] = None) -> Optional[ScoreSet]: |
| 355 | + user_data: Optional["UserData"] = None) -> Optional[ScoreSet]: |
340 | 356 | from mavedb.lib.permissions import has_permission |
341 | | - if publish is not None: |
342 | | - if publish is True: |
343 | | - while score_set.superseding_score_set is not None: |
344 | | - next_score_set_in_chain = score_set.superseding_score_set |
345 | | - # Find the final published one. |
346 | | - if action is not None and has_permission(user_data, score_set, action).permitted \ |
347 | | - and next_score_set_in_chain.published_date is None: |
348 | | - return score_set |
349 | | - score_set = next_score_set_in_chain |
350 | | - else: |
351 | | - # Unpublished score set should not be superseded. |
352 | | - # It should not have superseding score set, but possible have superseded score set. |
353 | | - if action is not None and score_set.published_date is None \ |
354 | | - and has_permission(user_data, score_set, action).permitted: |
355 | | - return score_set |
| 357 | + while score_set.superseding_score_set is not None: |
| 358 | + next_score_set_in_chain = score_set.superseding_score_set |
| 359 | + |
| 360 | + # If we were given a permission to check and the next score set in the chain does not have that permission, |
| 361 | + # pretend like we have reached the end of the chain. Otherwise, continue to the next score set. |
| 362 | + if action is not None and not has_permission(user_data, next_score_set_in_chain, action).permitted: |
| 363 | + return score_set |
| 364 | + |
| 365 | + score_set = next_score_set_in_chain |
| 366 | + |
| 367 | + # Handle unpublished superseding score set case. |
| 368 | + # The score set has a published superseded score set but has not superseding score set. |
| 369 | + if action is not None and not has_permission(user_data, score_set, action).permitted: |
| 370 | + while score_set.superseded_score_set is not None: |
| 371 | + next_score_set_in_chain = score_set.superseded_score_set |
| 372 | + if has_permission(user_data, next_score_set_in_chain, action).permitted: |
| 373 | + return next_score_set_in_chain |
356 | 374 | else: |
357 | | - return None |
358 | | - else: |
| 375 | + score_set = next_score_set_in_chain |
| 376 | + return None |
| 377 | + |
| 378 | + return score_set |
| 379 | + |
| 380 | + |
| 381 | +def find_publish_or_private_superseded_score_set_tail( |
| 382 | + score_set: ScoreSet, |
| 383 | + action: Optional["Action"] = None, |
| 384 | + user_data: Optional["UserData"] = None, |
| 385 | + publish: bool = True) -> Optional[ScoreSet]: |
| 386 | + from mavedb.lib.permissions import has_permission |
| 387 | + if publish: |
359 | 388 | while score_set.superseding_score_set is not None: |
360 | 389 | next_score_set_in_chain = score_set.superseding_score_set |
361 | | - |
362 | | - # If we were given a permission to check and the next score set in the chain does not have that permission, |
363 | | - # pretend like we have reached the end of the chain. Otherwise, continue to the next score set. |
364 | | - if action is not None and not has_permission(user_data, next_score_set_in_chain, action).permitted: |
| 390 | + # Find the final published one. |
| 391 | + if action is not None and has_permission(user_data, score_set, action).permitted \ |
| 392 | + and next_score_set_in_chain.published_date is None: |
365 | 393 | return score_set |
366 | | - |
367 | 394 | score_set = next_score_set_in_chain |
368 | | - |
369 | | - # Handle unpublished superseding score set case. |
370 | | - # The score set has superseded score set but has not superseding score set. |
371 | | - if action is not None and not has_permission(user_data, score_set, action).permitted: |
372 | | - while score_set.superseded_score_set is not None: |
373 | | - next_score_set_in_chain = score_set.superseded_score_set |
374 | | - if has_permission(user_data, next_score_set_in_chain, action).permitted: |
375 | | - return next_score_set_in_chain |
376 | | - else: |
377 | | - score_set = next_score_set_in_chain |
| 395 | + else: |
| 396 | + # Unpublished score set should not be superseded. |
| 397 | + # It should not have superseding score set, but possible have superseded score set. |
| 398 | + if action is not None and score_set.published_date is None \ |
| 399 | + and has_permission(user_data, score_set, action).permitted: |
| 400 | + return score_set |
| 401 | + else: |
378 | 402 | return None |
379 | | - |
380 | 403 | return score_set |
381 | 404 |
|
382 | 405 |
|
|
0 commit comments