Exemplo n.º 1
0
def import_timetable(request, school):
    '''
        Представление для импорта расписания. Не тестировалась.
    '''
    import csv
    render = {}
    if request.user.type == 'EduAdmin':
        if request.user.school.id != int(school):
            raise Http404
    render['school'] = school = get_object_or_404(School, id = school)

    if request.method == 'GET':
        render['form'] = form = ImportForm()
    else:
        render['form'] = form = ImportForm(request.POST, request.FILES)
        if form.is_valid():
            workday = 0
            last_grade = None
            render['errors'] = errors = []
            objects = []
            rows = csv.reader(form.cleaned_data['file'], delimiter = ';')
            i = 0
            for row in rows:
                i += 1
                if len(row) < 4:
                    errors.append({'line': i, 'column': 0, 'error': u'неверное количество столбцов'})
                    continue
                try:
                    row = ";".join(row)
                    row = row.decode('cp1251')
                except UnicodeError:
                    errors.append({'line': i, 'column': 0,
                                   'error': u'некорректное значение (невозможно определить кодировку)'})
                    continue
                row = row.split(';')
                if last_grade != row[0]:
                    workday = 0
                if int(row[1]) == 1:
                    workday += 1

                number = int(row[1])

                last_grade = grade = row[0]
                try:
                    grade = Grade.objects.get(school = school, **get_grade(grade))
                except Grade.DoesNotExist:
                    errors.append({'line': i, 'column': 0, 'error': u'неизвестный класс %s' % grade})
                    continue

                row[2] = row[2].strip()
                _subjects = row[2].split(',')
                subjects = []
                for sbj in _subjects:
                    try:
                        subjects.append(Subject.objects.get(school = school, name = sbj.strip()))
                    except Subject.DoesNotExist:
                        errors.append({'line': i, 'column': 2, 'error': u'неизвестный предмет %s' % sbj})

                rooms = row[3].split(',')

                ut_kwargs = {'school': school, 'grade': grade, 'workday': workday, 'number': number}
                if len(subjects) == 1 and len(rooms)==1:
                    for j in xrange(1, 3):
                        objects.append(UsalTimetable(subject = subjects[0], room = rooms[0], group = j, **ut_kwargs))

                elif len(subjects) == 1 and len(rooms)==2:
                    for j in xrange(1, 3):
                        objects.append(UsalTimetable(subject = subjects[0], room = rooms[j-1], group = j, **ut_kwargs))

                elif (len(subjects) == 2 and len(rooms)==2) or (len(subjects) == 2 and len(rooms)==3):
                    for j in xrange(1, 3):
                        objects.append(UsalTimetable(subject = subjects[j-1], room = rooms[j-1],
                                                     group = j, **ut_kwargs))

                elif len(subjects) == 1 and len(rooms)==3:
                    for j in xrange(1, 4):
                        objects.append(UsalTimetable(subject = subjects[0], room = rooms[j-1], group = j, **ut_kwargs))

                else:
                    errors.append({'line': i, 'column': 0, 'error': u'неверный формат строки'})

            if len(errors) == 0:
                for obj in objects:
                    obj.save()
                messages.success(request, u'Расписание импортировано')
                return HttpResponseRedirect('..')
    return render_to_response('~attendance/timetableImport.html', render, context_instance = RequestContext(request))
Exemplo n.º 2
0
def import_timetable(request, school):
    '''
        Представление для импорта расписания. Не тестировалась.
    '''
    import csv
    render = {}
    if request.user.type == 'EduAdmin':
        if request.user.school.id != int(school):
            raise Http404
    render['school'] = school = get_object_or_404(School, id=school)

    if request.method == 'GET':
        render['form'] = form = ImportForm()
    else:
        render['form'] = form = ImportForm(request.POST, request.FILES)
        if form.is_valid():
            workday = 0
            last_grade = None
            last_number = None
            render['errors'] = errors = []
            objects = []
            rows = csv.reader(form.cleaned_data['file'], delimiter=';')
            i = 0
            for row in rows:
                i += 1
                if len(row) < 5:
                    errors.append({
                        'line': i,
                        'column': 0,
                        'error': u'неверное количество столбцов'
                    })
                    continue
                try:
                    row = ";".join(row)
                    row = row.decode('cp1251')
                except UnicodeError:
                    errors.append({
                        'line':
                        i,
                        'column':
                        0,
                        'error':
                        u'некорректное значение (невозможно определить кодировку)'
                    })
                    continue
                row = row.split(';')

                if last_grade != row[0]:
                    workday = 0
                try:
                    if int(row[2]) == 1 and last_number != 1:
                        workday += 1
                except ValueError:
                    pass

                number = int(row[2])
                last_number = number

                last_grade = grade = row[0]
                try:
                    grade = Grade.objects.get(school=school,
                                              **get_grade(grade))
                except Grade.DoesNotExist:
                    errors.append({
                        'line': i,
                        'column': 0,
                        'error': u'неизвестный класс %s' % grade
                    })
                    continue

                try:
                    subject = Subject.objects.get(school=school,
                                                  name=row[3].strip())
                except Subject.DoesNotExist:
                    errors.append({
                        'line': i,
                        'column': 4,
                        'error': u'неизвестный предмет %s' % row[3]
                    })
                    continue

                try:
                    int(row[1])
                except ValueError:
                    errors.append({
                        'line':
                        i,
                        'column':
                        2,
                        'error':
                        u'неправильный формат номера группы %s' % row[1]
                    })
                    continue

                objects.append(
                    UsalTimetable(school=school,
                                  grade=grade,
                                  number=number,
                                  subject=subject,
                                  room=row[4],
                                  group=row[1],
                                  workday=workday))


#                _subjects = row[2].split(',')
#                subjects = []
#                for sbj in _subjects:
#                    try:
#                        subjects.append(Subject.objects.get(school = school, name = sbj.strip()))
#                    except Subject.DoesNotExist:
#                        errors.append({'line': i, 'column': 2, 'error': u'неизвестный предмет %s' % sbj})
#
#                rooms = row[3].split(',')
#
#                ut_kwargs = {'school': school, 'grade': grade, 'workday': workday, 'number': number}
#                if len(subjects) == 1 and len(rooms)==1:
#                    for j in xrange(1, 3):
#                        objects.append(UsalTimetable(subject = subjects[0], room = rooms[0], group = j, **ut_kwargs))
#
#                elif len(subjects) == 1 and len(rooms)==2:
#                    for j in xrange(1, 3):
#                        objects.append(UsalTimetable(subject = subjects[0], room = rooms[j-1], group = j, **ut_kwargs))
#
#                elif (len(subjects) == 2 and len(rooms)==2) or (len(subjects) == 2 and len(rooms)==3):
#                    for j in xrange(1, 3):
#                        objects.append(UsalTimetable(subject = subjects[j-1], room = rooms[j-1],
#                                                     group = j, **ut_kwargs))
#
#                elif len(subjects) == 1 and len(rooms)==3:
#                    for j in xrange(1, 4):
#                        objects.append(UsalTimetable(subject = subjects[0], room = rooms[j-1], group = j, **ut_kwargs))
#
#                else:
#                    errors.append({'line': i, 'column': 0, 'error': u'неверный формат строки'})

            if len(errors) == 0:
                for obj in objects:
                    obj.save()
                messages.success(request, u'Расписание импортировано')
                return HttpResponseRedirect('..')
    return render_to_response('~attendance/timetableImport.html',
                              render,
                              context_instance=RequestContext(request))