Пример #1
0
def timetrack(request, group_slug=None, template_name="djime/timetrack.html", bridge=None):
    if request.method == 'GET':
        form = TimeSliceBaseForm(request.user)
    elif request.method == 'POST':
        post = request.POST
        form = TimeSliceBaseForm(request.user, request.POST)
        if form.is_valid():
            active_slices = TimeSlice.objects.filter(user=request.user,
                                                                duration=None)
            # there should only be at most one active timeslice at any
            # time but incase some error has occured, we want to stop
            # all active timeslices whenever a new one is started.
            for timeslice in active_slices:
                timeslice.calculate_duration()
                timeslice.save()
            cd = form.cleaned_data
            new_slice = TimeSlice(
                task=cd['task'],
                user=request.user,
                note=cd['note'],
            )
            new_slice.save()
            if request.POST.has_key('destination'):
                project = Project.objects.get(pk=cd['project'])
                return HttpResponseRedirect(reverse(request.POST['destination'], kwargs={'group_slug': project.slug }))

    return render_to_response(template_name, {
        'timestrack_timeslice_form': form
    }, context_instance=RequestContext(request))
Пример #2
0
def timesheet_date(request, end_date, start_date, group_slug=None, template_name="djime/timesheet.html", bridge=None):
    if request.method == 'GET':
        form = TimeSliceSheetForm(request.user)
    elif request.method == 'POST':
        form = TimeSliceSheetForm(request.user, request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            timeslice = TimeSlice(
                task=cd['task'],
                user=request.user,
                duration=cd['duration'],
                note=cd['note'],
            )
            timeslice.save()

    headline = '%s to %s' % (start_date, end_date)
    s_date = datetime.strptime(start_date, '%Y-%m-%d').date()
    e_date = datetime.strptime(end_date, '%Y-%m-%d').date() + \
                                                    timedelta(days=1)
    timeslices = TimeSlice.objects.select_related().filter(
                                user=request.user,
                                begin__range=(s_date, e_date))

    return render_to_response(template_name, {
        'slice_list': timesheet_timeslice_handler(timeslices),
        'timesheet_timeslice_form': form,
        'headline': headline
    }, context_instance=RequestContext(request))
Пример #3
0
def handle_uploaded_file(file, user_id):
    user_object = User.objects.get(pk=user_id)
    csv_reader = csv.DictReader(file, fieldnames=['date','start','end','duration','project','slip'])
    line_data = []
    for line in csv_reader:
        line_data.append(line)

    total_time = 0
    val = {}
    pickles = {'projects': [], 'slips': [], 'slices': []}
    for line in line_data[1:]:
        begin = datetime.strptime('T'.join((line['date'], line['start'])), '%Y-%m-%dT%H:%M')
        end = datetime.strptime('T'.join((line['date'], line['end'])), '%Y-%m-%dT%H:%M')
        total_time += int(line['duration'])
        if not val.has_key(line['project']):
            project_set = Project.objects.filter(name=line['project'], members = user_id)
            if  project_set:
                if len(project_set) >1:
                    project = Project()
                    project.name = line['project']
                    project_created_msg = _('Found more than one project, you are on, with same name. New project will be created.')
                    project_created_bool = True
                else:
                    project = project_set[0]
                    project_created_msg = _('Found project, and will add slips and timeslices to the existing project.')
                    project_created_bool = False
            else:
                project_set = Project.objects.filter(name=line['project'])
                if project_set:
                    if len(project_set) >1:
                        project = Project()
                        project.name = line['project']
                        project_created_msg = _('Found more than one project, with same name. New project will be created.')
                        project_created_bool = True
                    else:
                        project = project_set[0]
                        project_created_msg = _('Found project, and will add user profile, slips and timeslices to the existing project.')
                        project_created_bool = False
                else:
                    project = Project()
                    project.name = line['project']
                    project_created_msg = _('No project of that name. New project will be created')
                    project_created_bool = True
            val[line['project']] = {'created': project_created_bool, 'message': project_created_msg, 'project_object': project, 'slips': {}}
            pickles['projects'].append(project)

        if not val[line['project']]['slips'].has_key(line['slip']):
            if val[line['project']]['created']:
                slip = Slip()
                slip.name = line['slip']
                slip.user = user_object
                slip.project = val[line['project']]['project_object']
                slip.created = line['date']
                slip_created_bool = True

            else:
                slip_set = Slip.objects.filter(name = line['slip'], user = user_object , project = project)
                if not slip_set or len(slip_set) > 1:
                    slip = Slip()
                    slip.name = line['slip']
                    slip.user = user_object
                    slip.project = val[line['project']]['project_object']
                    slip.created = line['date']
                    slip_created_bool = True
                else:
                    slip = slip_set[0]
                    slip_created_bool = False
            val[line['project']]['slips'][line['slip']]={'created': slip_created_bool, 'slip_object': slip, 'slices': []}
            pickles['slips'].append(slip)

        if val[line['project']]['slips'][line['slip']]['created']:
            slice = TimeSlice()
            slice.begin = begin
            slice.end = end
            slice.duration = int(line['duration'])
            slice.slip = val[line['project']]['slips'][line['slip']]['slip_object']
            slice.user = user_object
            slice_created_bool = True
        else:
            slice_set = TimeSlice.objects.filter(begin = begin, end = end, duration = int(line['duration']), slip = slip, user = user_object)
            if slice_set:
                if len(slice_set) > 1:
                    pass
                slice = slice_set[0]
                slice_created_bool = False
            else:
                slice = TimeSlice()
                slice.begin = begin
                slice.end = end
                slice.duration = int(line['duration'])
                slice.slip = val[line['project']]['slips'][line['slip']]['slip_object']
                slice.user = user_object
                slice_created_bool = True
        val[line['project']]['slips'][line['slip']]['slices'].append(slice)
        pickles['slices'].append(slice)

    total_time = str(int(total_time/3600.0))+'h'

    # Okay, now we have processed the data, lets write it to a couple of files.
    import_data = DataImport.objects.create(user=user_object)
    file_name = hashlib.sha1(user_object.username + str(time.time())).hexdigest()
    import_data.complete_data.save(file_name, ContentFile(pickle.dumps(pickles)))
    import_data.partial_data.save(file_name, ContentFile(pickle.dumps(line_data[1:11])))
    import_data.save()

    return import_data.id
Пример #4
0
def pinax_handle_uploaded_file(file, user_id):
    user_object = User.objects.get(pk=user_id)
    csv_reader = csv.DictReader(file, fieldnames=['date','start','end','duration','project','task'])
    line_data = []
    for line in csv_reader:
        line_data.append(line)

    total_time = 0
    val = {}
    pickles = {'projects': [], 'tasks': [], 'slices': []}
    for line in line_data[1:]:
        begin = datetime.strptime('T'.join((line['date'], line['start'])), '%Y-%m-%dT%H:%M')
        end = datetime.strptime('T'.join((line['date'], line['end'])), '%Y-%m-%dT%H:%M')
        total_time += int(line['duration'])
        if not val.has_key(line['project']):
            project_set = Project.objects.filter(name=line['project'], member_users=user_id)
            if  project_set:
                if len(project_set) > 1:
                    project, project_created_msg, project_created_bool = create_pinax_project(user_object, line)
                else:
                    project = project_set[0]
                    project_created_msg = _('Found project, and will add tasks and timeslices to the existing project.')
                    project_created_bool = False
            else:
                project_set = Project.objects.filter(name=line['project'])
                if project_set:
                    if len(project_set) >1:
                        project, project_created_msg, project_created_bool = create_pinax_project(user_object, line)
                    else:
                        project = project_set[0]
                        project_created_msg = _('Found project will add tasks and timeslices to the existing project.')
                        project_created_bool = False
                else:
                    project, project_created_msg, project_created_bool = create_pinax_project(user_object, line)
            val[line['project']] = {'created': project_created_bool, 'message': project_created_msg, 'project_object': project, 'tasks': {}}
            pickles['projects'].append(project)

        if not val[line['project']]['tasks'].has_key(line['task']):
            if val[line['project']]['created']:
                task = Task()
                task.summary = line['task']
                task.creator = user_object
                task.group = val[line['project']]['project_object']
                task.created = line['date']
                task_created_bool = True
            else:
                task_set = Task.objects.filter(summary=line['task'], creator=user_object, object_id=project.id)
                if not task_set or len(task_set) > 1:
                    task = Task()
                    task.summary = line['task']
                    task.creator = user_object
                    task.group = val[line['project']]['project_object']
                    task.created = line['date']
                    task_created_bool = True
                else:
                    task = task_set[0]
                    task_created_bool = False
            val[line['project']]['tasks'][line['task']]={'created': task_created_bool, 'task_object': task, 'slices': []}
            pickles['tasks'].append(task)

        if val[line['project']]['tasks'][line['task']]['created']:
            tslice = TimeSlice()
            tslice.begin = begin
            tslice.duration = int(line['duration'])
            tslice.task = val[line['project']]['tasks'][line['task']]['task_object']
            tslice.user = user_object
            slice_created_bool = True
        else:
            slice_set = TimeSlice.objects.filter(begin=begin, duration=int(line['duration']), task=task, user=user_object)
            if slice_set:
                tslice = slice_set[0]
                slice_created_bool = False
            else:
                tslice = TimeSlice()
                tslice.begin = begin
                tslice.duration = int(line['duration'])
                tslice.task = val[line['project']]['tasks'][line['task']]['task_object']
                tslice.user = user_object
                slice_created_bool = True
        val[line['project']]['tasks'][line['task']]['slices'].append(tslice)
        pickles['slices'].append(tslice)

    total_time = str(int(total_time/3600.0))+'h'

    # Okay, now we have processed the data, lets write it to a couple of files.
    import_data = DataImport.objects.create(user=user_object)
    file_name = hashlib.sha1(user_object.username + str(time.time())).hexdigest()
    import_data.complete_data.save(file_name, ContentFile(pickle.dumps(pickles)))
    import_data.partial_data.save(file_name, ContentFile(pickle.dumps(line_data[1:11])))
    import_data.save()

    return import_data.id
Пример #5
0
def timesheet(request, method=None, year=None, method_value=0, group_slug=None, template_name="djime/timesheet.html", bridge=None):
    if request.method == 'GET':
        form = TimeSliceSheetForm(request.user)
    elif request.method == 'POST':
        form = TimeSliceSheetForm(request.user, request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            timeslice = TimeSlice(
                task=cd['task'],
                user=request.user,
                duration=cd['duration'],
                note=cd['note'],
            )
            timeslice.save()

    today = date.today()
    if not method:
        headline = 'today'
        timeslices = TimeSlice.objects.select_related().filter(
                            user=request.user, begin__day=today.day,
                            begin__month=today.month, begin__year=today.year)
    elif method == 'week':
        week = int(method_value)
        if year:
            year = int(year)
            headline = 'week %s - %s' % (week, year)
        elif week:
            year = today.year
            headline = 'week %s - %s' % (week, year)
        else:
            headline = 'this week'
            week = today.isocalendar()[1]
            year = today.year

        start_date = date(year, 1, 1) + timedelta(days=(week-2)*7)
        while start_date.isocalendar()[1] != week:
            start_date += timedelta(days=1)
        end_date = start_date + timedelta(days=7)

        timeslices = TimeSlice.objects.select_related().filter(
                                    user=request.user,
                                    begin__range=(start_date, end_date))
    elif method == 'month':
        month = int(method_value)
        if year:
            headline = '%s - %s' % (datetime(2000, month, 1).strftime('%B'), year)
        elif month:
            year = today.year
            headline = '%s - %s' % (datetime(2000, month, 1).strftime('%B'), year)
        else:
            headline = 'this month'
            month = today.month
            year = today.year
        timeslices = TimeSlice.objects.select_related().filter(
                            user=request.user, begin__month=month,
                                                    begin__year=year)
    elif method == 'quarter':
        quarter = int(method_value)
        quarter_suffix = ['1st', '2nd', '3rd', '4th']
        quarter_end = [31, 30, 30, 31]
        if year:
            year = int(year)
            headline = '%s quarter - %s' % (quarter_suffix[quarter-1], year)
        elif quarter:
            year = today.year
            headline = '%s quarter - %s' % (quarter_suffix[quarter-1], year)
        else:
            headline = 'this quarter'
            quarter = (today.month - 1) / 3 + 1
            year = today.year
        start_date = date(year, quarter * 3 - 2, 1)
        end_date = date(year, quarter * 3, quarter_end[quarter-1]) + \
                                                    timedelta(days=1)
        timeslices = TimeSlice.objects.select_related().filter(
                                    user=request.user,
                                    begin__range=(start_date, end_date))
    elif method == 'year':
        year = int(method_value)
        if not year:
            year = today.year
        if year == today.year:
            headline = 'this year'
        else:
            headline = year
        timeslices = TimeSlice.objects.select_related().filter(
                                user=request.user, begin__year=year)


    return render_to_response(template_name, {
        'slice_list': timesheet_timeslice_handler(timeslices),
        'timesheet_timeslice_form': form,
        'headline': headline
    }, context_instance=RequestContext(request))