2020from typing import Optional , Any
2121from datetime import datetime
2222
23- from ._base_client import EventChildAPIBase , optional_datetime_from_json
23+ from ._base_client import EventChildAPIBase , optional_datetime_from_json , datetime_to_json
2424
2525class Activity (EventChildAPIBase ):
2626 """
@@ -55,6 +55,11 @@ def _populate_json(self) -> None:
5555 if self ._json_content ['view' ] != 'extended' :
5656 raise ValueError ('expected the extended view of the ticket' )
5757
58+ def _update (self , payload : dict [str , Any ]) -> None :
59+ self ._patch_reponse (value = {'activity' : payload })
60+ for key , value in payload .items ():
61+ self ._json_content [key ] = value
62+
5863 @property
5964 def name (self ) -> str :
6065 """
@@ -77,10 +82,61 @@ def start_at(self) -> Optional[datetime]:
7782 json_value = self ._json_content ['start_at' ]
7883 return optional_datetime_from_json (json_value = json_value )
7984
85+ @start_at .setter
86+ def start_at (self , value : Optional [datetime ]) -> None :
87+ payload : dict [str , Any ]
88+ if value is None :
89+ if self .end_at is not None :
90+ raise RuntimeError ('The activity is not allowed end time without a start, '
91+ 'set the end_at to None first' )
92+ payload = {'date' : None ,
93+ 'start_time' : None }
94+ self ._patch_reponse (value = {'activity' : payload })
95+ self ._json_content ['start_at' ] = None
96+ else :
97+ if self .end_at is not None and self .end_at .date () != value .date ():
98+ raise ValueError ('The start_at and end_at must share a common date, '
99+ 'you may need to set the end date to None to mke this change' )
100+ if self .end_at is not None and value >= self .end_at :
101+ raise ValueError (f'new start_at ({ value } ) is after the end_at ({ self .end_at } )' )
102+ # the start_at can not be changed directly, instead it is necessary to modify the
103+ # date and time
104+ payload = {'date' : value .strftime ("%Y-%m-%d" ),
105+ 'start_time' : value .strftime ("%H:%M" )}
106+ self ._patch_reponse (value = {'activity' : payload })
107+ value_str = datetime_to_json (value )
108+ self ._json_content ['start_at' ] = value_str
109+
80110 @property
81111 def end_at (self ) -> Optional [datetime ]:
82112 """
83113 End date and time for the activity
84114 """
115+ # There is an anomaly that the end_at reports a value if the `end_time` is none but the
116+ # date is set to sometime
117+ if self ._json_content ['end_time' ] is None :
118+ return None
85119 json_value = self ._json_content ['end_at' ]
86120 return optional_datetime_from_json (json_value = json_value )
121+
122+ @end_at .setter
123+ def end_at (self , value : Optional [datetime ]) -> None :
124+ payload : dict [str , Any ]
125+ if value is None :
126+ payload = {'end_time' : None }
127+ self ._patch_reponse (value = {'activity' : payload })
128+ self ._json_content ['end_at' ] = None
129+ else :
130+ if self .start_at is None :
131+ raise ValueError ('An activity needs to have a start time to allow an end time'
132+ ' to be sent, please configure the start_at first' )
133+ if self .start_at .date () != value .date ():
134+ raise ValueError ('The start_at and end_at must share a common date' )
135+ if value <= self .start_at :
136+ raise ValueError (f'new end_at ({ value } ) is before the start_at ({ self .start_at } )' )
137+ # the start_at can not be changed directly, instead it is necessary to modify the
138+ # date and time
139+ payload = {'end_time' : value .strftime ("%H:%M" )}
140+ self ._patch_reponse (value = {'activity' : payload })
141+ value_str = datetime_to_json (value )
142+ self ._json_content ['end_at' ] = value_str
0 commit comments