Beispiel #1
0
    def test_round_time(self):
        actual = datetime(day=10, month=2, year=2019, hour=10, minute=21)
        self.assertEqual(
            datetime(day=10, month=2, year=2019, hour=10, minute=30),
            TimeRecord.round_time(actual, timedelta(minutes=30)))
        self.assertEqual(
            datetime(day=10, month=2, year=2019, hour=10, minute=15),
            TimeRecord.round_time(actual, timedelta(minutes=15)))
        self.assertEqual(
            datetime(day=10, month=2, year=2019, hour=10, minute=20),
            TimeRecord.round_time(actual, timedelta(minutes=10)))
        self.assertEqual(
            datetime(day=10, month=2, year=2019, hour=10, minute=20),
            TimeRecord.round_time(actual, timedelta(minutes=5)))

        actual = datetime(day=10, month=2, year=2019, hour=10, minute=53)
        self.assertEqual(
            datetime(day=10, month=2, year=2019, hour=11, minute=00),
            TimeRecord.round_time(actual, timedelta(minutes=30)))
        self.assertEqual(
            datetime(day=10, month=2, year=2019, hour=11, minute=00),
            TimeRecord.round_time(actual, timedelta(minutes=15)))
        self.assertEqual(
            datetime(day=10, month=2, year=2019, hour=10, minute=50),
            TimeRecord.round_time(actual, timedelta(minutes=10)))
        self.assertEqual(
            datetime(day=10, month=2, year=2019, hour=10, minute=55),
            TimeRecord.round_time(actual, timedelta(minutes=5)))
Beispiel #2
0
def timetable(request, organization, project_id):
    organization = get_object_or_404(Organization, name=organization)
    project = get_object_or_404(Project, id=project_id)

    setting, _ = Setting.objects.get_or_create(user=request.user)
    timezone = pytz.timezone(str(setting.timezone))

    if not project.is_member(request.user):
        return HttpResponseForbidden()

    tl_activate(setting.locale)
    tz_activate(timezone)

    time_records = TimeRecordTable(project.timerecord_set.all(),
                                   request=request)
    request.session['timetable.sort'] = request.GET.get(
        'sort') or request.session.get('timetable.sort')
    time_records.order_by = request.session.get(
        'timetable.sort') or '-end_time'
    RequestConfig(request, paginate={'per_page': 15}).configure(time_records)

    current_time = TimeRecord.round_time(
        datetime.now(timezone), timedelta(minutes=setting.timestamp_rounding))
    form_add_record = TimeRecordForm(
        initial={"start_time": current_time.strftime('%Y-%m-%dT%H:%M')})
    form_edit_record = TimeRecordForm(
        initial={"end_time": current_time.strftime('%Y-%m-%dT%H:%M')})

    step_in_seconds = setting.timestamp_rounding * 60
    form_add_record.fields['start_time'].widget.attrs.update(
        step=step_in_seconds)
    form_add_record.fields['end_time'].widget.attrs.update(
        step=step_in_seconds)
    form_edit_record.fields['start_time'].widget.attrs.update(
        step=step_in_seconds)
    form_edit_record.fields['end_time'].widget.attrs.update(
        step=step_in_seconds)

    context = dict(organization=organization,
                   project=project,
                   time_records=time_records,
                   form_add_record=form_add_record,
                   form_edit_record=form_edit_record)
    return render(request, 'tracker/timetable.html', context)
Beispiel #3
0
def stop(request, organization, project_id):
    project = get_object_or_404(Project, id=project_id)

    if not project.is_member(request.user):
        return HttpResponseForbidden()

    setting, _ = Setting.objects.get_or_create(user=request.user)

    current_time = TimeRecord.round_time(
        datetime.now().replace(second=0, microsecond=0),
        timedelta(minutes=setting.timestamp_rounding))

    entry = get_object_or_404(TimeRecord,
                              user=request.user,
                              project_id=project_id,
                              end_time=None)
    entry.end_time = current_time
    entry.save()

    target = request.GET.get('from', 'tracker:project/timetable')
    return redirect(target, organization, project_id)
Beispiel #4
0
def start(request, organization, project_id):
    project = get_object_or_404(Project, id=project_id)

    if not project.is_member(request.user):
        return HttpResponseForbidden()

    setting, _ = Setting.objects.get_or_create(user=request.user)

    current_time = TimeRecord.round_time(
        datetime.now().replace(second=0, microsecond=0),
        timedelta(minutes=setting.timestamp_rounding))

    if request.user.is_tracking() and not setting.allow_parallel_tracking:
        for entry in request.user.get_tracking_records():
            entry.end_time = current_time
            entry.save()

    entry = TimeRecord(project_id=project_id, user=request.user)
    entry.start_time = current_time
    entry.save()

    target = request.GET.get('from', 'tracker:project/timetable')
    return redirect(target, organization, project_id)