def create(request, target_id): if request.method != 'POST': raise Exception("Please use post for this url.") # Build the alert target_info = __get_target_info(request) target = target_info['target'] account = target_info['account'] params = request.POST #pdb.set_trace() # Redirect before saving if any rule violated error_message = None # first convert integers to display values d_f1 = {v:k for k, v in Alert.FIELD_OPTIONS_1.items()} d_f2 = {v:k for k, v in Alert.FIELD_OPTIONS_2.items()} d_u1 = {v:k for k, v in Alert.UTILITY_TYPE_OPTIONS_1.items()} d_u2 = {v:k for k, v in Alert.UTILITY_TYPE_OPTIONS_2.items()} f1 = d_f1[int(params['field_1'])] f2 = d_f2[int(params['field_2'])] u1 = d_u1[int(params['utility_type_1'])] u2 = d_u2[int(params['utility_type_2'])] # (1) field_1 and field_2 must match - both must have Cost, Consumption, or PD if ( ('Cost' in f1 and 'Cost' not in f2) or ('Cost' in f2 and 'Cost' not in f1) or ('Consumption' in f1 and 'Consumption' not in f2) or ('Consumption' in f2 and 'Consumption' not in f1) or ('Peak Demand' in f1 and 'Peak Demand' not in f2) or ('Peak Demand' in f2 and 'Peak Demand' not in f1) ): error_message = 'Comparison fields must match with respect to Cost, Consumption, and Peak Demand.' # (2) domestic water must be both utils if it's one util, unless Cost is in both fields elif ( (u1 == 'domestic water' or u2 == 'domestic water') and not( u1 == u2 or ('Cost' in f1 and 'Cost' in f2) ) ): error_message = 'If one utility type is domestic water, either both types must be domestic water or both fields must be Cost fields.' if error_message is not None: messages.error(request, error_message) if target_info['type'] == 'accounts': return HttpResponseRedirect('/%s/alerts/new/' % account.id) else: return HttpResponseRedirect('/%s/%s/%s/alerts/new/' % (account.id, target_info['type'], target.id)) # if no rule violated, proceed with saving alert = Alert( user_profile_id = request.user.user_profile.id, field_1 = params['field_1'], field_2 = params['field_2'], utility_type_1 = params['utility_type_1'], utility_type_2 = params['utility_type_2'], comparator = params['comparator'], percent = (float(params['percent']) / 100.0), notify_by = params['notify_by'], notify_frequency = params['notify_frequency'], ) if target_info['type'] == 'accounts': alert.account = target if target_info['type'] == 'buildings': alert.building = target if target_info['type'] == 'spaces': alert.space = target if target_info['type'] == 'meters': alert.meter = target # Save alert.save() # Add a success message messages.success(request, 'Alert has been created.') # Redirect to the alerts index page account = target_info['account'] if target_info['type'] == 'accounts': return HttpResponseRedirect('/%s/alerts/' % target.id) else: return HttpResponseRedirect('/%s/%s/%s/alerts/' % (account.id, target_info['type'], target.id))