goal_data_controller.py (10958B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\careergoals\client\goal_data_controller.py 2 import logging 3 import uuid 4 from carbon.common.script.sys.serviceConst import ROLE_QA 5 from careergoals.client import signal, errors 6 from careergoals.client.const import RewardLabel 7 from careergoals.client.goal import Goal 8 from careergoals.client.goal_data_grouping import create_career_path_goal_groups, OverallGoalGroup 9 from careergoals.client.goal_definition import GoalDefinition 10 import characterdata.careerpathconst as cpConst 11 from careergoals.client.messenger.request_messenger import PublicCareerGoalRequestMessenger 12 logger = logging.getLogger(__name__) 13 14 class GoalDataController(object): 15 16 def __init__(self): 17 self._public_gateway = sm.GetService('publicGatewaySvc') 18 self._request_messenger = PublicCareerGoalRequestMessenger(self._public_gateway) 19 self._goal_definitions_per_career = None 20 self._overall_goal_definitions = None 21 self._goals = None 22 self._local_claimed_rewards = {} 23 self._local_completed_goals = [] 24 25 def are_goals_loaded(self): 26 return self._are_definitions_loaded() and self._are_states_loaded() 27 28 def prime_definitions_and_states(self): 29 self._load_states() 30 31 def claim_reward(self, goal_id, reward_label): 32 if not self._public_gateway.is_available(): 33 return 34 success = self._request_messenger.claim_reward_request(goal_id, reward_label) 35 self.mark_local_reward_label_claimed(goal_id, reward_label, success) 36 37 def _load_definitions(self): 38 if not self._are_definitions_loaded(): 39 goal_definitions = self._request_messenger.get_goals_definition_request() 40 self._goal_definitions_per_career = create_career_path_goal_groups() 41 self._overall_goal_definitions = OverallGoalGroup() 42 for goal_definition in goal_definitions: 43 if goal_definition.career == cpConst.career_path_none: 44 self._overall_goal_definitions.add_goal_definition(goal_definition) 45 elif goal_definition.group_id: 46 self._goal_definitions_per_career[goal_definition.career].add_goal_definition(goal_definition) 47 else: 48 self._goal_definitions_per_career[goal_definition.career].career_path_goal_definition = goal_definition 49 50 for each in self._goal_definitions_per_career.itervalues(): 51 each.sort_goal_definitions() 52 53 signal.on_definitions_loaded() 54 55 def _are_definitions_loaded(self): 56 return self._goal_definitions_per_career is not None and self._overall_goal_definitions is not None 57 58 def _get_goal_definition(self, goal_id, career_id = None, group_id = None): 59 self._load_definitions() 60 if career_id is None: 61 goal_definition = self._overall_goal_definitions.get_goal_definition(goal_id) 62 if goal_definition is not None: 63 return goal_definition 64 for _, goals_per_career in self._goal_definitions_per_career.iteritems(): 65 found_goal_definition = goals_per_career.get_goal_definition(goal_id) 66 if found_goal_definition is not None: 67 return found_goal_definition 68 69 else: 70 if group_id is None: 71 career_path_goal_definition = self._goal_definitions_per_career[career_id].career_path_goal_definition 72 if career_path_goal_definition.goal_id == goal_id: 73 return career_path_goal_definition 74 return self._goal_definitions_per_career[career_id].get_goal_definition(goal_id, group_id) 75 76 def _load_states(self): 77 self._load_definitions() 78 if self._goals is None: 79 self._goals = {} 80 goal_progress_states = self._request_messenger.get_goals_and_rewards_progress_request() 81 for goal_progress in goal_progress_states: 82 goal_id = goal_progress.goal_id 83 goal_definition = self._get_goal_definition(goal_id, None, None) 84 if not goal_definition: 85 raise errors.CareerGoalDefinitionNotFound 86 claimed_states = {x:y for x, y in goal_progress.claimed_states.iteritems() if x in goal_definition.reward_labels} 87 self._goals[goal_id] = Goal(goal_definition, goal_progress.progress, goal_progress.completed, claimed_states) 88 89 signal.on_states_loaded() 90 91 def _are_states_loaded(self): 92 return self._goals is not None 93 94 def get_all_goals(self): 95 self._load_states() 96 return self._goals 97 98 def get_goal(self, goal_id): 99 self._load_states() 100 return self._goals.get(goal_id, None) 101 102 def get_career_path_total_progress(self, career_path_id): 103 self._load_states() 104 all_career_goal_definitions = self._goal_definitions_per_career[career_path_id].get_all_career_goal_definitions() 105 total_progress = 0 106 for goal_definition in all_career_goal_definitions: 107 goal = self.get_goal(goal_definition.goal_id) 108 if goal: 109 total_progress += goal_definition.progress 110 111 return total_progress 112 113 def get_career_path_goal(self, career_path_id): 114 self._load_states() 115 return self._goals.get(self._goal_definitions_per_career[career_path_id].career_path_goal_definition.goal_id, None) 116 117 def get_overall_goals(self): 118 self._load_states() 119 return [ self._goals.get(x.goal_id, None) for x in self._overall_goal_definitions.goal_definitions ] 120 121 def get_goals_in_group(self, career_path_id, group_id): 122 self._load_states() 123 if career_path_id in self._goal_definitions_per_career: 124 return [ self._goals.get(x.goal_id, None) for x in self._goal_definitions_per_career[career_path_id].get_goal_definitions_in_group(group_id) ] 125 else: 126 return [] 127 128 def is_career_path_goal(self, goal_id, career_path_id): 129 self._load_definitions() 130 if career_path_id is None: 131 return any([ x == goal_id for x in [ y.career_path_goal_definition.goal_id for y in self._goal_definitions_per_career.values() ] ]) 132 elif career_path_id not in self._goal_definitions_per_career: 133 return False 134 else: 135 return goal_id == self._goal_definitions_per_career[career_path_id].career_path_goal_definition.goal_id 136 137 def is_overall_goal(self, goal_id): 138 self._load_definitions() 139 return any([ x.goal_id == goal_id for x in self._overall_goal_definitions.goal_definitions ]) 140 141 def get_overall_progress(self): 142 self._load_states() 143 if len(self.get_overall_goals()) > 0: 144 return self.get_overall_goals()[-1].progress 145 return 0 146 147 def get_max_overall_target(self): 148 self._load_definitions() 149 return self._overall_goal_definitions.get_max_target() 150 151 def are_all_overall_goals_completed(self): 152 self._load_states() 153 return all([ g.is_completed() for g in self.get_overall_goals() ]) 154 155 def is_activity_completed(self, career_path_id, group_id): 156 self._load_states() 157 goals = self.get_goals_in_group(career_path_id, group_id) 158 return all([ g.is_completed() for g in goals ]) 159 160 def get_goals_with_claimable_rewards(self): 161 self._load_states() 162 return [ g for g in self.get_all_goals().itervalues() if g.has_unclaimed_rewards() ] 163 164 def get_claimable_rewards_count(self): 165 self._load_states() 166 claimable_rewards_count = 0 167 for goal in self.get_goals_with_claimable_rewards(): 168 claimable_rewards_count += len(goal.get_unclaimed_reward_labels()) 169 170 return claimable_rewards_count 171 172 def get_local_claimed_rewards(self): 173 return self._local_claimed_rewards 174 175 def update_local_goal_progress(self, goal_id, progress): 176 self._load_states() 177 goal = self.get_goal(goal_id) 178 if goal: 179 goal.update_local_progress(progress) 180 signal.on_goal_progress_changed(goal_id, progress) 181 182 def mark_local_goal_completed(self, goal_id): 183 self._load_states() 184 goal = self.get_goal(goal_id) 185 if goal: 186 goal.mark_local_completed() 187 self._local_completed_goals.append(goal_id) 188 signal.on_goal_progress_changed(goal_id, goal.definition.target_value) 189 signal.on_goal_completed(goal_id) 190 191 def mark_local_reward_label_claimed(self, goal_id, reward_label, success): 192 self._load_states() 193 if not success: 194 signal.on_reward_claimed_failed(goal_id, reward_label) 195 else: 196 if goal_id not in self._local_claimed_rewards: 197 self._local_claimed_rewards[goal_id] = [] 198 self._local_claimed_rewards[goal_id].append(reward_label) 199 goal = self.get_goal(goal_id) 200 if goal: 201 goal.mark_local_reward_label_claimed(reward_label) 202 signal.on_reward_claimed(goal_id, reward_label) 203 204 def get_local_completed_goals_per_career(self): 205 self._load_states() 206 result = {} 207 for goal_id in self._local_completed_goals: 208 goal = self.get_goal(goal_id) 209 if goal.definition.career not in result: 210 result[goal.definition.career] = [] 211 result[goal.definition.career].append(goal) 212 213 return result 214 215 def get_local_completed_career_points(self): 216 self._load_states() 217 result = 0 218 for goal_id in self._local_completed_goals: 219 goal = self.get_goal(goal_id) 220 if goal: 221 result += goal.definition.career_points 222 223 return result 224 225 def clear_state_cache(self): 226 logger.info('CAREER GOALS - clearing state cache') 227 self._goals = None 228 229 def clear_definitions_cache(self): 230 logger.info('CAREER GOALS - clearing definitions cache') 231 self._goal_definitions_per_career = None 232 self._overall_goal_definitions = None 233 self.clear_state_cache() 234 self.clear_local_cache() 235 236 def clear_local_cache(self): 237 logger.info('CAREER GOALS - clearing local cache') 238 self._local_claimed_rewards = {} 239 self._local_completed_goals = [] 240 self.clear_local_completed_goals() 241 242 def clear_local_completed_goals(self): 243 logger.info('CAREER GOALS - clearing local completed goals') 244 self._local_completed_goals = [] 245 246 def admin_complete_goal(self, goal_id): 247 if not session.role & ROLE_QA: 248 return 249 goal = self._goals.get(goal_id, None) 250 if goal and not goal.is_completed(): 251 self._request_messenger.admin_complete_goal_request(goal_id) 252 253 def admin_progress_goal(self, goal_id, progress): 254 if not session.role & ROLE_QA: 255 return 256 self._request_messenger.admin_progress_goal_request(goal_id, progress)