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))
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))
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
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
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))