Coverage for pybeepop/beepop/mitetreatments.py: 71%

42 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-19 20:58 +0000

1"""BeePop+ Mite Treatment Management Module. 

2 

3This module contains classes for managing Varroa mite treatment schedules and 

4efficacy parameters. Mite treatments are critical interventions that reduce 

5mite populations to prevent colony collapse from mite-induced mortality. 

6 

7Classes: 

8 MiteTreatmentItem: Individual treatment schedule with efficacy parameters 

9 MiteTreatments: Collection manager for treatment schedules and active treatment lookup 

10""" 

11 

12from dataclasses import dataclass 

13from datetime import datetime 

14from datetime import timedelta 

15from typing import List, Optional 

16 

17 

18@dataclass 

19class MiteTreatmentItem: 

20 """Individual mite treatment schedule with timing and efficacy. 

21 

22 Represents a single miticide application with specified timing, duration, and 

23 efficacy. The treatment kills susceptible (non-resistant) mites at pct_mortality; 

24 resistant mites survive it. What share of the population is resistant is a property 

25 of the mite population, set by InitMitePctResistant and PctImmMitesResistant, not of 

26 the treatment. 

27 

28 Attributes: 

29 start_time (datetime): Treatment application start date 

30 duration (int): Treatment duration in weeks 

31 pct_mortality (float): Mortality rate for susceptible mites (0-100%) 

32 """ 

33 

34 start_time: datetime 

35 duration: int # in weeks 

36 pct_mortality: float # percent mortality (0-100) 

37 # TODO: Need to change logic in rest of program to treat pct_mortality like a float (percentage) 

38 

39 def is_valid(self) -> bool: 

40 return isinstance(self.start_time, datetime) 

41 

42 

43class MiteTreatments: 

44 """Collection manager for mite treatment schedules and active treatment lookup. 

45 

46 Manages multiple mite treatment schedules and provides functionality to 

47 determine active treatments for any given date. 

48 

49 Attributes: 

50 items (List[MiteTreatmentItem]): Collection of scheduled mite treatments 

51 """ 

52 

53 def __init__(self): 

54 self.items: List[MiteTreatmentItem] = [] 

55 

56 def add_item(self, item: MiteTreatmentItem): 

57 self.items.append(item) 

58 

59 def add_item_by_values( 

60 self, 

61 start_time: datetime, 

62 duration: int, 

63 pct_mortality: float, 

64 ): 

65 item = MiteTreatmentItem(start_time, duration, pct_mortality) 

66 self.add_item(item) 

67 

68 def get_item(self, index: int) -> Optional[MiteTreatmentItem]: 

69 if 0 <= index < len(self.items): 

70 return self.items[index] 

71 return None 

72 

73 def get_item_by_date(self, date: datetime) -> Optional[MiteTreatmentItem]: 

74 for item in self.items: 

75 if item.start_time.date() == date.date(): 

76 return item 

77 return None 

78 

79 def get_active_item(self, date: datetime) -> Optional[MiteTreatmentItem]: 

80 for item in self.items: 

81 if ( 

82 item.start_time 

83 <= date 

84 < item.start_time + timedelta(days=item.duration * 7) 

85 ): 

86 return item 

87 return None 

88 

89 def is_new_treatment_starting(self, date: datetime) -> bool: 

90 return any(item.start_time.date() == date.date() for item in self.items) 

91 

92 def delete_item(self, index: int): 

93 if 0 <= index < len(self.items): 

94 del self.items[index] 

95 

96 def get_count(self) -> int: 

97 return len(self.items) 

98 

99 def clear_all(self): 

100 self.items.clear()