Coverage for heritrace / utils / primary_source_utils.py: 100%

28 statements  

« prev     ^ index     » next       coverage.py v7.13.4, created at 2026-03-21 12:56 +0000

1# SPDX-FileCopyrightText: 2025 Arcangelo Massari <arcangelo.massari@unibo.it> 

2# 

3# SPDX-License-Identifier: ISC 

4 

5from flask import current_app 

6import validators 

7 

8USER_DEFAULT_SOURCE_KEY = "user:{user_id}:default_primary_source" 

9 

10def get_user_default_primary_source(user_id): 

11 """ 

12 Get the user's default primary source from Redis 

13  

14 Args: 

15 user_id: The user's ID (e.g. ORCID) 

16  

17 Returns: 

18 The user's default primary source or None if not set or error 

19 """ 

20 user_default_source = None 

21 if user_id: 

22 key = USER_DEFAULT_SOURCE_KEY.format(user_id=user_id) 

23 try: 

24 user_default_source = current_app.redis_client.get(key) 

25 if user_default_source and isinstance(user_default_source, bytes): 

26 user_default_source = user_default_source.decode('utf-8') 

27 except Exception as e: 

28 current_app.logger.error(f"Failed to get user default primary source from Redis: {e}") 

29 user_default_source = None # Ensure it's None on error 

30 

31 return user_default_source 

32 

33def get_default_primary_source(user_id): 

34 """ 

35 Get the default primary source to use, falling back to app config if user has none 

36  

37 Args: 

38 user_id: The user's ID (e.g. ORCID) 

39  

40 Returns: 

41 The primary source to use (user's default or app default) 

42 """ 

43 user_default = get_user_default_primary_source(user_id) 

44 return user_default or current_app.config["PRIMARY_SOURCE"] 

45 

46def save_user_default_primary_source(user_id, primary_source): 

47 """ 

48 Save the user's default primary source to Redis 

49  

50 Args: 

51 user_id: The user's ID (e.g. ORCID) 

52 primary_source: The URL to save as default primary source 

53  

54 Returns: 

55 True if saved successfully, False otherwise 

56 """ 

57 if not user_id or not primary_source or not validators.url(primary_source): 

58 return False 

59 

60 key = USER_DEFAULT_SOURCE_KEY.format(user_id=user_id) 

61 try: 

62 current_app.redis_client.set(key, primary_source) 

63 return True 

64 except Exception as e: 

65 current_app.logger.error(f"Failed to save user default primary source to Redis: {e}") 

66 return False