Beispiel #1
0
    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
Beispiel #2
0
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
Beispiel #3
0
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))