Пример #1
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