def clean(self): cleaned_data = super(RunForm, self).clean() # if {'date_month', 'date_day', 'date_year'} <= set(cleaned_data.keys()): if (('date_month' in cleaned_data) and ('date_day' in cleaned_data) and ('date_year' in cleaned_data)): month = cleaned_data['date_month'] day = cleaned_data['date_day'] year = cleaned_data['date_year'] try: cleaned_data['date'] = datetime.date(year, month, day) except: self._errors['date'] = self.error_class(["Invalid date: %s/%s/%s" % (month,day,year)]) # if {'duration_hours', 'duration_minutes', 'duration_seconds'} <= set(cleaned_data.keys()): if (('duration_hours' in cleaned_data) and ('duration_minutes' in cleaned_data) and ('duration_seconds' in cleaned_data)): if cleaned_data['duration_hours']: hours = cleaned_data['duration_hours'] else: hours = 0 if cleaned_data['duration_minutes']: minutes = cleaned_data['duration_minutes'] else: minutes = 0 if cleaned_data['duration_seconds']: seconds = cleaned_data['duration_seconds'] else: seconds = 0 try: duration = hms_to_time(hours, minutes, seconds) except: self._errors['duration'] = self.error_class(["Invalid duration: %s:%s:%s" % (hours,minutes,seconds)]) if duration > datetime.time(0,0,0,0): cleaned_data['duration'] = duration else: self._errors['duration'] = self.error_class(["Run must have non-zero duration."]) return cleaned_data
def obj_to_run(obj): _date = u'date' _duration = u'duration' _average_heart_rate = u'average_heart_rate' _calories = u'calories' _distance = u'distance' run = Run() # try to parse date field run.date = datetime.datetime.strptime(obj[_date], "%Y-%m-%d").date() # try to parse the duration and distance fields run.duration = hms_to_time(0,0,int(obj[_duration])) run.distance = float(obj[_distance]) / 1609.344 # try to parse the HR and calories fields, which may be null if obj[_average_heart_rate]: run.average_heart_rate = int(obj[_average_heart_rate]) if obj[_calories]: run.calories = int(obj[_calories]) return run
def run_add(request, username): if not is_authorized(request, username): return redirect_to_login(request) user = request.user if incomplete_profile(user): messages.info(request, 'You must complete your profile before adding a run.') return HttpResponseRedirect(reverse('run.views.userprofile_update', args=[user.username])) if request.method == 'POST': form = RunForm(request.POST) if form.is_valid(): run = form.instance # run.date = form.cleaned_data['date'] # run.duration = form.cleaned_data['duration'] run.set_calories() run.set_zone() form.save() invalidate_cache(user, form.cleaned_data['date']) shoe = form.cleaned_data['shoe'] if shoe: shoe.miles += Decimal(form.cleaned_data['distance']) shoe.save() profile = user.get_profile() profile.last_shoe = shoe profile.save() log.info('Added run for %s: %s', user, form.instance) messages.success(request, "Added a %s-mile run on %s." % (run.distance, datetime.datetime.strftime(run.date, "%m/%d/%Y"))) pace = hms_to_time(0,0,run.duration_in_seconds() / run.distance) fast_mile = hms_to_time(0,5,0) if pace < fast_mile: messages.warning(request, "Wow, a %s mile! Are you sure you didn't cheat?" % pace) return HttpResponseRedirect(reverse('run.views.userprofile', args=[user.username])) else: p = user.get_profile() today = datetime.datetime.today() initial={'user' : request.user.id, 'date_month' : today.month, 'date_day' : today.day, 'date_year' : today.year, 'shoe' : p.last_shoe, 'date' : today.strftime("%m/%d/%Y"), 'duration' : datetime.time(0,0,0,0).strftime("%H:%M:%S") } form = RunForm(initial=initial) s = Shoe.objects.filter(user=user,active=True) form.fields['shoe'].queryset = s return render_to_response('run/run_edit.html', {'form' : form}, context_instance=RequestContext(request))