def render_faults(self, visit, index, unit_report_data): """Рассчитывает большие промежутки в сообщениях, ДУТ, завязанный на моточасы""" # первая геозона до включения массы if index == 0 and len(visit.odometers) < 3: return 'OK' faults = [] # если топливо не меняется в течение геозоны, но при этом есть минимум 1км пробега: fuel_start, fuel_end = getattr(visit, 'start_fuel_level'), getattr( visit, 'end_fuel_level') odometer_start = getattr(visit, 'start_odometer') odometer_end = getattr(visit, 'end_odometer') if fuel_start is not None and fuel_end is not None and fuel_end - fuel_start == .0: if odometer_start is not None and odometer_end is not None \ and odometer_end - odometer_start > 1: faults.append([visit.dt_from, visit.dt_to, 'ДУТ']) prev_odometer = None for odometer in visit.odometers: if prev_odometer: if (odometer.dt - prev_odometer.dt ).total_seconds() > self.module_fault_timeout: # если период неисправности продолжается, то есть текущий диапазон тоже # большой, как и предыдущий, тогда склеиваем 2 возможные неисправности if faults and faults[-1][1] == prev_odometer.dt: faults[-1][1] = odometer.dt else: faults.append( [prev_odometer.dt, odometer.dt, 'бортовой блок']) prev_odometer = odometer for fault in faults: fault.append( format_timedelta((fault[1] - fault[0]).total_seconds())) fault[0] = date_format( utc_to_local_time(fault[0], self.user.timezone), 'H:i') fault[1] = date_format( utc_to_local_time(fault[1], self.user.timezone), 'H:i') if faults: return '\n'.join([ '%s - %s (%s), %s' % (x[0], x[1], x[3], x[2]) for x in faults ]) return 'OK'
def write_xls_data(self, worksheet, context): worksheet = super(VchmTaxiingView, self).write_xls_data(worksheet, context) self.styles.update({ 'border_bold_left_style': xlwt.easyxf( 'font: bold 1, height 200;' 'borders: bottom thin, left thin, right thin, top thin;' 'align: wrap on, vert centre, horiz left'), 'border_bold_right_style': xlwt.easyxf( 'font: bold 1, height 200;' 'borders: bottom thin, left thin, right thin, top thin;' 'align: wrap on, vert centre, horiz right') }) worksheet.col(0).width = 3600 worksheet.col(1).width = 5500 worksheet.col(2).width = 5500 worksheet.col(3).width = 5500 worksheet.col(4).width = 3000 worksheet.col(5).width = 3000 worksheet.col(6).width = 3150 worksheet.col(7).width = 3150 worksheet.col(8).width = 3200 worksheet.col(9).width = 3200 worksheet.col(10).width = 3800 worksheet.col(11).width = 3300 worksheet.col(12).width = 4500 worksheet.col(13).width = 3300 worksheet.col(14).width = 3300 worksheet.col(15).width = 3300 worksheet.col(16).width = 3300 worksheet.col(17).width = 3300 worksheet.col(18).width = 3300 worksheet.col(19).width = 7000 # header x = 0 if context.get('heading_data'): for key, value in context['heading_data'].items(): x += 1 worksheet.write(x, 0, key + ' ', style=self.styles['right_center_style']) worksheet.write_merge(x, x, 1, self.xls_heading_merge - 1, value, style=self.styles['left_center_style']) x += 1 worksheet.write_merge(x, x, 0, self.xls_heading_merge, '') headings = ('Гос № ТС', 'ФИО водителя', 'Наименование маршрута', 'Наименование\nгеозоны', 'Время\nвхода в\nгеозону', 'Время\nвыхода из\nгеозоны', 'Время\nнахождения\nв геозоне,\nчч:мм', 'Время\nв движении\nв рамках\nгеозоны,\nчч:мм', 'Время\nпростоя\nв рамках\nгеозоны,\nчч:мм', 'Время\nпростоя\nна холостом\nходу, чч:мм', 'Время\nпростоя\nс выключенным\nдвигателем,\nчч:мм', 'Время\nпростоя\nво время\nработы КМУ,\nчч:мм', 'Количество\nпростоев с\nдлительностью\n> 3 минут', 'Пробег\nв рамках\nгеозоны,\nкм', 'Расход\nтоплива\nв рамках\nгеозоны,\nл', 'Заправка\nв рамках\nгеозоны,\nл', 'Слив в\nрамках\nгеозоны,\nл', 'Перепробег\nпо маршрутам,\nкм', 'Перепростой\nпо маршрутам,\nч', 'Исправность оборудования') x += 1 for y, heading in enumerate(headings): worksheet.write(x, y, heading, style=self.styles['border_center_style']) worksheet.row(x).height = 1200 stats = context.get('stats') if stats: x += 1 worksheet.write_merge(x, x, 0, 3, 'ИТОГО за смену', style=self.styles['border_bold_left_style']) worksheet.write(x, 4, date_format( utc_to_local_time(stats['dt_from_min'], self.user.timezone), 'H:i'), style=self.styles['border_bold_left_style']) worksheet.write(x, 5, date_format( utc_to_local_time(stats['dt_to_max'], self.user.timezone), 'H:i'), style=self.styles['border_bold_left_style']) worksheet.write(x, 6, format_timedelta(stats['total_time']), style=self.styles['border_bold_left_style']) worksheet.write(x, 7, format_timedelta(stats['moving_time']), style=self.styles['border_bold_left_style']) worksheet.write(x, 8, format_timedelta(stats['parking_time']), style=self.styles['border_bold_left_style']) worksheet.write(x, 9, format_timedelta(stats['idle_time']), style=self.styles['border_bold_left_style']) worksheet.write(x, 10, format_timedelta(stats['idle_off_time']), style=self.styles['border_bold_left_style']) worksheet.write(x, 11, format_timedelta(stats['angle_sensor_time']), style=self.styles['border_bold_left_style']) worksheet.write(x, 12, stats['over_3min_parkings_count'], style=self.styles['border_bold_right_style']) worksheet.write(x, 13, floatcomma(stats['odometer'], -2), style=self.styles['border_bold_right_style']) worksheet.write(x, 14, floatcomma(stats['fuel_level_delta'], -2), style=self.styles['border_bold_right_style']) worksheet.write(x, 15, floatcomma(stats['refills_delta'], -2), style=self.styles['border_bold_right_style']) worksheet.write(x, 16, floatcomma(stats['discharge_delta'], -2), style=self.styles['border_bold_right_style']) worksheet.write(x, 17, floatcomma(stats['overstatement_mileage'], -2), style=self.styles['border_bold_right_style']) worksheet.write(x, 18, format_timedelta(stats['overstatement_time']), style=self.styles['border_bold_left_style']) worksheet.write(x, 19, '', style=self.styles['border_left_style']) worksheet.row(x).height = 360 for row in context['report_data']: x += 1 worksheet.write(x, 0, row['car_number'], style=self.styles['border_left_style']) worksheet.write(x, 1, row['driver_fio'], style=self.styles['border_left_style']) worksheet.write(x, 2, row['route_name'], style=self.styles['border_left_style']) worksheet.write(x, 3, row['point_name'], style=self.styles['border_left_style']) worksheet.write(x, 4, date_format( utc_to_local_time(row['dt_from'], self.user.timezone), 'H:i'), style=self.styles['border_left_style']) worksheet.write(x, 5, date_format( utc_to_local_time(row['dt_to'], self.user.timezone), 'H:i'), style=self.styles['border_left_style']) worksheet.write(x, 6, format_timedelta(row['total_time']), style=self.styles['border_left_style']) worksheet.write(x, 7, format_timedelta(row['moving_time']), style=self.styles['border_left_style']) worksheet.write(x, 8, format_timedelta(row['parking_time']), style=self.styles['border_left_style']) worksheet.write(x, 9, format_timedelta(row['idle_time']), style=self.styles['border_left_style']) worksheet.write(x, 10, format_timedelta(row['idle_off_time']), style=self.styles['border_left_style']) worksheet.write(x, 11, format_timedelta(row['angle_sensor_time']), style=self.styles['border_left_style']) worksheet.write(x, 12, row['over_3min_parkings_count'], style=self.styles['border_right_style']) worksheet.write(x, 13, floatcomma(row['odometer'], -2), style=self.styles['border_right_style']) worksheet.write(x, 14, floatcomma(row['fuel_level_delta'], -2), style=self.styles['border_right_style']) worksheet.write(x, 15, floatcomma(row['refills_delta'], -2), style=self.styles['border_right_style']) worksheet.write(x, 16, floatcomma(row['discharge_delta'], -2), style=self.styles['border_right_style']) worksheet.write(x, 17, floatcomma(row['overstatement_mileage'], -2), style=self.styles['border_right_style']) worksheet.write(x, 18, format_timedelta(row['overstatement_time']), style=self.styles['border_left_style']) worksheet.write(x, 19, row['faults'], style=self.styles['border_left_style']) worksheet.row(x).height = 720 return worksheet
def write_xls_data(self, worksheet, context): worksheet = super(FaultsView, self).write_xls_data(worksheet, context) worksheet.set_portrait(False) worksheet.set_print_scaling(80) for col in range(4): worksheet.col(col).width = 6000 worksheet.col(1).width = 10000 worksheet.col(2).width = 4800 worksheet.col(4).width = 4200 worksheet.col(5).width = 10000 # header worksheet.write_merge( 1, 1, 0, 3, 'На дату: %s' % date_format(context['cleaned_data']['dt'], 'd.m.Y'), ) worksheet.write_merge(2, 2, 0, 1, 'ФИО ответственного за устранение неполадок:', style=self.styles['left_center_style']) worksheet.write_merge(2, 2, 2, 5, '', style=self.styles['bottom_border_style']) worksheet.write_merge( 3, 3, 0, 5, 'Всего оборудованных транспортных объектов ССМТ: %s' % context['stats']['total'], style=self.styles['right_center_style']) worksheet.write_merge( 4, 4, 0, 5, 'Из них*: исправных %s\nВозможно неисправных %s' % ( context['stats']['total'] - context['stats']['broken'], context['stats']['broken'], ), style=self.styles['right_center_style']) # head worksheet.write_merge(5, 6, 0, 0, ' Гос№ ТС', style=self.styles['border_center_style']) worksheet.write_merge(5, 5, 1, 2, ' Последняя полученная информация', style=self.styles['border_center_style']) worksheet.write_merge(5, 6, 3, 3, ' ФИО водителя', style=self.styles['border_center_style']) worksheet.write_merge(5, 6, 4, 4, ' Суммарное\nнеисправное\nрабочее время, ч', style=self.styles['border_center_style']) worksheet.write_merge( 5, 6, 5, 5, ' Наименование возможно\nнеисправного оборудования (ДУТ, ...)', style=self.styles['border_center_style']) worksheet.write(6, 1, ' Место/геозона', style=self.styles['border_center_style']) worksheet.write(6, 2, ' Время', style=self.styles['border_center_style']) for i in range(6): worksheet.write(7, i, str(i + 1), style=self.styles['border_center_style']) for i in range(1, 8): worksheet.row(i).height = REPORT_ROW_HEIGHT worksheet.row(5).height = REPORT_ROW_HEIGHT + 100 worksheet.row(6).height = REPORT_ROW_HEIGHT + 100 worksheet.row(4).height = REPORT_ROW_HEIGHT * 2 # body i = 8 for row in context['report_data']: worksheet.write(i, 0, row['unit_name'], style=self.styles['border_left_style']) worksheet.write(i, 1, row['place'], style=self.styles['border_left_style']) worksheet.write(i, 2, date_format(row['dt'], 'Y-m-d H:i:s'), style=self.styles['border_left_style']) worksheet.write(i, 3, row['driver_name'], style=self.styles['border_left_style']) worksheet.write(i, 4, row['sum_broken_work_time'], style=self.styles['border_right_style']) worksheet.write(i, 5, row['fault'], style=self.styles['border_left_style']) worksheet.row(i).height = 780 worksheet.row(i).height_mismatch = True i += 1 worksheet.write_merge(i, i, 0, 5, ''' *Состояния: - исправное - передача данных с датчиков и блока (трекера) осуществляется без затруднений; - неисправное - отсутствует передача данных с блока (трекера) или датчиков (веса, ДУТ, ...) в течение смены. ''', style=self.styles['left_center_style']) worksheet.row(i).height = 520 * 3 return worksheet
def get_context_data(self, **kwargs): sess_id = self.request.session.get('sid') if not sess_id: raise ReportException(WIALON_NOT_LOGINED) try: units_list = get_units(sess_id, extra_fields=True) except WialonException as e: raise ReportException(str(e)) self.default_unit = units_list[0]['id'] kwargs = super(VchmTaxiingView, self).get_context_data(**kwargs) form = kwargs['form'] kwargs['units'] = units_list if not self.request.POST: return kwargs if form.is_valid(): report_data = [] stats = { 'dt_from_min': None, 'dt_to_max': None, 'total_time': .0, 'moving_time': .0, 'parking_time': .0, 'idle_time': .0, 'idle_off_time': .0, 'angle_sensor_time': .0, 'over_3min_parkings_count': 0, 'odometer': .0, 'fuel_level_delta': .0, 'refills_delta': .0, 'discharge_delta': .0, 'overstatement_mileage': .0, 'overstatement_time': .0 } kwargs.update(report_data=report_data, stats=stats) self.user = User.objects.filter(is_active=True) \ .filter(wialon_username=self.request.session.get('user')).first() if not self.user: raise ReportException(WIALON_USER_NOT_FOUND) local_dt_from = datetime.datetime.combine(form.cleaned_data['dt'], datetime.time(0, 0, 0)) local_dt_to = datetime.datetime.combine(form.cleaned_data['dt'], datetime.time(23, 59, 59)) unit_id = form.cleaned_data.get('unit') self.units_dict = OrderedDict([(x['name'], x) for x in units_list if x['id'] == unit_id]) unit = list(self.units_dict.values())[0] routes = { x['id']: x for x in get_routes(sess_id, with_points=True) } standard_job_templates = StandardJobTemplate.objects \ .filter(wialon_id__in=[str(x) for x in routes.keys()]) \ .prefetch_related( Prefetch( 'points', StandardPoint.objects.filter( Q(total_time_standard__isnull=False) | Q(parking_time_standard__isnull=False) ), 'points_cache' ) ) standards = { int(x.wialon_id): { 'space_overstatements_standard': x.space_overstatements_standard if x.space_overstatements_standard is not None else None, 'points': { p.title: { 'total_time_standard': p.total_time_standard if p.total_time_standard is not None else None, 'parking_time_standard': p.parking_time_standard if p.parking_time_standard is not None else None } for p in x.points_cache } } for x in standard_job_templates if x.space_overstatements_standard is not None or x.points_cache } service = MovingService(self.user, local_dt_from, local_dt_to, sess_id, object_id=unit_id, units_dict=self.units_dict, last_visit_allowance=60 * 10, devide_last_parking_by_motohours=True) service.exec_report() service.analyze() ura_user = self.user.ura_user if self.user.ura_user_id else self.user jobs = Job.objects.filter( user=ura_user, date_begin__gte=local_to_utc_time(local_dt_from, ura_user.timezone), date_end__lte=local_to_utc_time(local_dt_to, ura_user.timezone)) jobs_cache = {int(j.unit_id): j for j in jobs} normal_ratio = 1 + (form.cleaned_data.get( 'overstatement_param', DEFAULT_OVERSTATEMENT_NORMAL_PERCENTAGE) / 100.0) unit_report_data = service.report_data.get(unit['name']) if not unit_report_data: return kwargs kwargs.update(heading_data=OrderedDict(( ('Марка, модель', self.get_car_model(unit['name'])), ('Гос.номер', self.get_car_number(unit['name'])), ('VIN', self.get_car_vin(unit['name'])), ('Тип ТС', self.get_car_type(unit['name'])), ('Дата', date_format(form.cleaned_data['dt'], 'd.m.Y'))))) job = jobs_cache.get(unit['id']) standard = None if job: standard = standards.get(int(job.route_id)) for i, visit in enumerate(unit_report_data.geozones.target): try: next_visit = unit_report_data.geozones.target[i + 1] except IndexError: next_visit = None point_standard = None if standard: point_standard = standard.get('points', {}).get( visit.geozone_full, {}) if not point_standard: point_standard = standard.get('points', {}).get( visit.geozone, {}) total_standart = parking_standard = None if point_standard: total_standart = point_standard['total_time_standard'] * 60 parking_standard = point_standard[ 'parking_time_standard'] * 60 total_delta = (visit.dt_to - visit.dt_from).total_seconds() moving_delta = getattr(visit, 'trips_delta', .0) # переделал пока под расчет разницы между периодом нахождения и временем в # движении, так как в расчет стоянок иногда не принимаются концевые участки # длиной несколько минут # parking_delta = getattr(visit, 'parkings_delta', .0) parking_delta = max(.0, total_delta - moving_delta) motohours_delta = getattr(visit, 'motohours_delta', .0) idle_delta = getattr(visit, 'idle_delta', .0) off_delta = max(.0, total_delta - motohours_delta) angle_sensor_delta = getattr(visit, 'angle_sensor_delta', .0) refillings_volume = getattr(visit, 'refillings_volume', .0) discharges_volume = getattr(visit, 'discharges_volume', .0) overstatement_time = .0 if total_standart is not None \ and total_delta / total_standart > normal_ratio: overstatement_time += total_delta - total_standart elif parking_standard is not None \ and parking_delta / parking_standard > normal_ratio: overstatement_time += parking_delta - parking_standard point_name = self.get_point_name(visit.geozone) if not point_name: # если первая строка, и зона неизвестна, то это зона, где машина # находилась до включения блока (допущение, предложенное заказчиком) if i == 0 and next_visit: point_name = self.get_point_name(next_visit.geozone) else: point_name = 'Неизвестная' over_3min_parkings_count = 0 if point_name == 'Неизвестная': over_3min_parkings_count = len([ True for x in getattr(visit, 'parkings', []) if (x.dt_to - x.dt_from).total_seconds() > 3 * 60 ]) report_row = { 'car_number': self.get_car_number(unit['name']), 'driver_fio': job.driver_fio if job and job.driver_fio else 'Неизвестный', 'route_name': job.route_title if job and job.route_title else 'Неизвестный маршрут', 'point_name': point_name, 'dt_from': visit.dt_from, 'dt_to': visit.dt_to, 'total_time': total_delta, 'moving_time': moving_delta, 'parking_time': parking_delta, 'idle_time': idle_delta, 'idle_off_time': off_delta, 'angle_sensor_time': angle_sensor_delta, 'over_3min_parkings_count': over_3min_parkings_count, 'odometer': self.get_odometer(unit, visit), 'fuel_level_delta': self.get_fuel_delta(unit, visit), 'refills_delta': refillings_volume, 'discharge_delta': discharges_volume, 'overstatement_mileage': .0, 'overstatement_time': overstatement_time, 'faults': self.render_faults(visit, i, unit_report_data) } report_data.append(report_row) if stats['dt_from_min'] is None: stats['dt_from_min'] = visit.dt_from else: stats['dt_from_min'] = min(stats['dt_from_min'], visit.dt_from) if stats['dt_to_max'] is None: stats['dt_to_max'] = visit.dt_to else: stats['dt_to_max'] = max(stats['dt_to_max'], visit.dt_to) stats['total_time'] += total_delta stats['moving_time'] += moving_delta stats['parking_time'] += parking_delta stats['idle_time'] += idle_delta stats['idle_off_time'] += off_delta stats['angle_sensor_time'] += angle_sensor_delta stats['over_3min_parkings_count'] += over_3min_parkings_count stats['odometer'] += self.get_odometer(unit, visit) stats['fuel_level_delta'] += self.get_fuel_delta(unit, visit) stats['refills_delta'] += refillings_volume stats['discharge_delta'] += discharges_volume stats['overstatement_mileage'] += .0 stats['overstatement_time'] += overstatement_time return kwargs
def write_xls_data(self, worksheet, context): worksheet = super(VchmIdleTimesView, self).write_xls_data(worksheet, context) worksheet.col(0).width = 5500 worksheet.col(1).width = 3000 worksheet.col(2).width = 5000 worksheet.col(3).width = 5000 worksheet.col(4).width = 6000 worksheet.col(5).width = 7000 worksheet.col(6).width = 3150 worksheet.col(7).width = 3150 worksheet.col(8).width = 3700 worksheet.col(9).width = 3700 worksheet.col(10).width = 3300 worksheet.col(11).width = 7000 worksheet.col(12).width = 3600 headings = ( 'Водитель', 'Гос №', 'VIN', 'Тип ТС', 'Название маршрута', 'Название геозоны', 'Время\nнахождения,\nчч:мм', 'Время\nостановки,\nчч:мм', 'Время\nс выключенным\nдвигателем, чч:мм', 'Время на\nхолостом ходу\n(без работы), чч:мм', 'Время работы\nГПМ,\nчч:мм', 'Место остановки\n(адрес или км трассы)', 'Время простоя\nсверх норматива*,\nчч:мм' ) # header worksheet.write_merge( 1, 1, 0, self.xls_heading_merge, 'За период: %s - %s' % ( date_format(context['cleaned_data']['dt_from'], 'd.m.Y'), date_format(context['cleaned_data']['dt_to'], 'd.m.Y') ) ) x = 2 for y, heading in enumerate(headings): worksheet.write( x, y, heading, style=self.styles['border_center_style'] ) worksheet.row(x).height = 900 for row in context['report_data']: x += 1 worksheet.write( x, 0, row['driver_fio'], style=self.styles['border_left_style'] ) worksheet.write( x, 1, row['car_number'], style=self.styles['border_left_style'] ) worksheet.write( x, 2, row['car_vin'], style=self.styles['border_left_style'] ) worksheet.write( x, 3, row['car_type'], style=self.styles['border_left_style'] ) worksheet.write( x, 4, row['route_name'], style=self.styles['border_left_style'] ) worksheet.write( x, 5, row['point_name'], style=self.styles['border_left_style'] ) worksheet.write( x, 6, format_timedelta(row['total_time']), style=self.styles['border_right_style'] ) worksheet.write( x, 7, format_timedelta(row['parking_time']), style=self.styles['border_right_style'] ) worksheet.write( x, 8, format_timedelta(row['off_motor_time']), style=self.styles['border_right_style'] ) worksheet.write( x, 9, format_timedelta(row['idle_time']), style=self.styles['border_right_style'] ) worksheet.write( x, 10, format_timedelta(row['gpm_time']), style=self.styles['border_right_style'] ) worksheet.write( x, 11, self.render_parking(row['parkings']), style=self.styles['border_left_style'] ) worksheet.write( x, 12, format_timedelta(row['overstatement']), style=self.styles['border_right_style'] ) worksheet.row(x).height = 720 x += 1 worksheet.write_merge( x, x, 0, self.xls_heading_merge, '*В случае превышения фактического простоя над нормативным более чем на %s%%' % context['cleaned_data'].get( 'overstatement_param', DEFAULT_OVERSTATEMENT_NORMAL_PERCENTAGE ), style=self.styles['left_center_style'] ) worksheet.row(x).height = 520 return worksheet
def write_xls_data(self, worksheet, context): worksheet = super(DischargeView, self).write_xls_data(worksheet, context) worksheet.set_portrait(False) worksheet.col(0).width = 5000 worksheet.col(1).width = 8000 worksheet.col(2).width = 4000 worksheet.col(3).width = 4500 worksheet.col(4).width = 5000 worksheet.col(5).width = 3000 worksheet.col(6).width = 4000 worksheet.col(7).width = 5500 worksheet.col(8).width = 4000 worksheet.col(9).width = 4000 worksheet.col(10).width = 6000 worksheet.col(11).width = 9000 worksheet.col(12).width = 2200 worksheet.col(13).width = 3000 worksheet.col(14).width = 4000 worksheet.col(15).width = 4000 worksheet.col(16).width = 2700 worksheet.col(17).width = 3200 # header worksheet.write_merge( 1, 1, 0, 17, 'За период: %s - %s' % (date_format(context['cleaned_data']['dt_from'], 'd.m.Y H:i'), date_format(context['cleaned_data']['dt_to'], 'd.m.Y H:i'))) worksheet.write_merge( 2, 2, 0, 17, 'Итого перерасход, л: %s' % floatformat( context.get('stats', {}).get('overspanding_total', 0) or 0, -2), style=self.styles['left_center_style']) worksheet.write_merge( 3, 3, 0, 17, 'Итого слив, л: %s' % floatformat( context.get('stats', {}).get('discharge_total', 0) or 0, -2), style=self.styles['left_center_style']) worksheet.write_merge( 4, 4, 0, 17, 'Зафиксировано случаев слива: %s' % context.get('stats', {}).get('overspanding_count', 0) or 0, style=self.styles['left_center_style']) worksheet.write_merge(5, 5, 0, 17, 'Список случаев перерасхода топлива на дату:', style=self.styles['right_center_style']) # head worksheet.write_merge(6, 7, 0, 0, ' Время', style=self.styles['border_center_style']) worksheet.write_merge(6, 7, 1, 1, ' Наименование', style=self.styles['border_center_style']) worksheet.write_merge(6, 7, 2, 2, ' Гос.номер ТС', style=self.styles['border_center_style']) worksheet.write_merge(6, 7, 3, 3, ' Тип ТС', style=self.styles['border_center_style']) worksheet.write_merge( 6, 7, 4, 4, ' Плановый график\nработы водителя\n(время с - время по)', style=self.styles['border_center_style']) worksheet.write_merge(6, 6, 5, 9, ' Фактическая наработка за запрашиваемый период', style=self.styles['border_center_style']) worksheet.write(7, 5, ' Пробег, км', style=self.styles['border_center_style']) worksheet.write(7, 6, ' Время работы\nна ХХ***,\nчч:мм:сс', style=self.styles['border_center_style']) worksheet.write(7, 7, ' Время работы\nдоп.оборудования****,\nчч:мм:сс', style=self.styles['border_center_style']) worksheet.write(7, 8, ' Время\nв движении,\nчч:мм:сс', style=self.styles['border_center_style']) worksheet.write(7, 9, ' Время работы\nдвигателя,\nчч:мм:сс', style=self.styles['border_center_style']) worksheet.write_merge(6, 7, 10, 10, ' ФИО водителя', style=self.styles['border_center_style']) worksheet.write_merge(6, 6, 11, 12, ' Событие слив', style=self.styles['border_center_style']) worksheet.write(7, 11, ' Место/\nгеозона', style=self.styles['border_center_style']) worksheet.write(7, 12, ' Объем', style=self.styles['border_center_style']) worksheet.write_merge( 6, 6, 13, 16, ' Израсходовано топлива за запрашиваемый период, л', style=self.styles['border_center_style']) worksheet.write(7, 13, ' По норме\nот пробега**', style=self.styles['border_center_style']) worksheet.write(7, 14, ' По норме\nот времени\nработы на ХХ***', style=self.styles['border_center_style']) worksheet.write(7, 15, ' По норме\nот работы доп.\nоборудования****', style=self.styles['border_center_style']) worksheet.write(7, 16, ' По факту\nс ДУТ', style=self.styles['border_center_style']) worksheet.write_merge(6, 7, 17, 17, ' Перерасход,\nл*', style=self.styles['border_center_style']) for i in range(18): worksheet.write(8, i, str(i + 1), style=self.styles['border_center_style']) for i in range(1, 9): worksheet.row(i).height = REPORT_ROW_HEIGHT worksheet.row(i).level = 1 worksheet.row(7).height = 800 # body i = 8 for row in context['report_data'].values(): for period in row['periods']: i += 1 worksheet.row(i).level = 1 worksheet.write(i, 0, '%s - %s' % (date(period['dt_from'], 'Y-m-d H:i:s'), date(period['dt_to'], 'Y-m-d H:i:s')), style=self.styles['border_left_style']) worksheet.write(i, 1, row['unit_name'], style=self.styles['border_left_style']) worksheet.write(i, 2, row['unit_number'], style=self.styles['border_left_style']) worksheet.write(i, 3, row['vehicle_type'], style=self.styles['border_left_style']) job_period = '' if period.get('job'): job_period = '%s - %s' % (date( period['dt_from'], 'Y-m-d H:i:s'), date(period['dt_to'], 'Y-m-d H:i:s')) worksheet.write(i, 4, job_period, style=self.styles['border_left_style']) worksheet.write(i, 5, floatformat(period['mileage'], 2) or '', style=self.styles['border_right_style']) worksheet.write( i, 6, render_timedelta(period['idle_hours'], '0:00:00') if period['idle_hours'] else '', style=self.styles['border_left_style']) worksheet.write( i, 7, render_timedelta(period['extra_device_hours'], '0:00:00') if period['extra_device_hours'] else '', style=self.styles['border_left_style']) worksheet.write( i, 8, render_timedelta(period['move_hours'], '0:00:00') if period['move_hours'] else '', style=self.styles['border_left_style']) worksheet.write( i, 9, render_timedelta(period['moto_hours'], '0:00:00') if period['moto_hours'] else '', style=self.styles['border_left_style']) worksheet.write( i, 10, period['job'].driver_fio if period.get('job') else '', style=self.styles['border_left_style']) worksheet.write(i, 11, period['discharge']['place'], style=self.styles['border_left_style']) worksheet.write(i, 12, floatformat(period['discharge']['volume'], 2) or '', style=self.styles['border_right_style']) worksheet.write(i, 13, floatformat(period['fact_mileage'], 2) or '', style=self.styles['border_right_style']) worksheet.write(i, 14, floatformat(period['fact_motohours'], 2) or '', style=self.styles['border_right_style']) worksheet.write(i, 15, floatformat(period['fact_extra_device'], 2) or '', style=self.styles['border_right_style']) worksheet.write(i, 16, floatformat(period['fact_dut'], 2) or '', style=self.styles['border_right_style']) worksheet.write(i, 17, floatformat(period['overspanding'], 2) or '', style=self.styles['border_right_style']) worksheet.row(i).height = 520 for detail in period['details']: i += 1 worksheet.row(i).level = 2 worksheet.write(i, 0, date(detail['dt'], 'Y-m-d H:i:s') or '', style=self.styles['border_left_style']) worksheet.write(i, 1, row['unit_name'], style=self.styles['border_left_style']) worksheet.write(i, 2, row['unit_number'], style=self.styles['border_left_style']) worksheet.write(i, 3, row['vehicle_type'], style=self.styles['border_left_style']) job_period = '' if period.get('job'): job_period = '%s - %s' % ( date(period['dt_from'], 'Y-m-d H:i:s'), date(period['dt_to'], 'Y-m-d H:i:s')) worksheet.write(i, 4, job_period, style=self.styles['border_left_style']) worksheet.write(i, 5, floatformat(period['mileage'], 2) or '', style=self.styles['border_right_style']) worksheet.write( i, 6, render_timedelta(period['idle_hours'], '0:00:00') if period['idle_hours'] else '', style=self.styles['border_left_style']) worksheet.write( i, 7, render_timedelta(period['extra_device_hours'], '0:00:00') if period['extra_device_hours'] else '', style=self.styles['border_left_style']) worksheet.write( i, 8, render_timedelta(period['move_hours'], '0:00:00') if period['move_hours'] else '', style=self.styles['border_left_style']) worksheet.write( i, 9, render_timedelta(period['moto_hours'], '0:00:00') if period['moto_hours'] else '', style=self.styles['border_left_style']) worksheet.write( i, 10, period['job'].driver_fio if period.get('job') else '', style=self.styles['border_left_style']) worksheet.write(i, 11, detail['place'] or '', style=self.styles['border_left_style']) worksheet.write(i, 12, floatformat(detail['volume'], 2) or '', style=self.styles['border_right_style']) worksheet.write(i, 13, '', style=self.styles['border_right_style']) worksheet.write(i, 14, '', style=self.styles['border_right_style']) worksheet.write(i, 15, '', style=self.styles['border_right_style']) worksheet.write(i, 16, '', style=self.styles['border_right_style']) worksheet.write(i, 17, '', style=self.styles['border_right_style']) worksheet.row(i).height = 520 worksheet.write_merge( i + 1, i + 1, 0, 17, '''* В случае превышения фактического расхода топлива на нормативы более чем на %s%% ** исходя из нормативов л/100км, с добавочным коэффициентом на работу оборудования *** исходя из нормативов л/час при заведенном двигателе на холостых оборотах, с добавочным коэффициентом на работу оборудования ''' % context['cleaned_data'].get('overspanding_percentage', DEFAULT_OVERSPANDING_NORMAL_PERCENTAGE), style=self.styles['left_center_style']) worksheet.row(i + 1).height = 520 * 4 return worksheet
def write_xls_data(self, worksheet, context): worksheet = super(VchmDrivingStyleView, self).write_xls_data(worksheet, context) self.styles = { 'heading_style': xlwt.easyxf('font: bold 1, height 340'), 'bottom_border_style': xlwt.easyxf('borders: bottom thin'), 'left_center_style': xlwt.easyxf('align: vert centre, horiz left'), 'right_center_style': xlwt.easyxf('align: wrap on, vert centre, horiz right'), 'border_left_style': xlwt.easyxf( 'borders: bottom thin, left thin, right thin, top thin;' 'align: wrap on, vert centre, horiz left' ), 'border_left_style_bold': xlwt.easyxf( 'borders: bottom thin, left thin, right thin, top thin;' 'align: wrap on, vert centre, horiz left; font: bold 1, height 200' ), 'border_center_style': xlwt.easyxf( 'borders: bottom thin, left thin, right thin, top thin;' 'align: wrap on, vert centre, horiz centre' ), 'border_right_style': xlwt.easyxf( 'borders: bottom thin, left thin, right thin, top thin;' 'align: wrap on, vert centre, horiz right' ), 'border_right_style_bold': xlwt.easyxf( 'borders: bottom thin, left thin, right thin, top thin;' 'align: wrap on, vert centre, horiz right; font: bold 1, height 200' ), 'border_right_0_style': xlwt.easyxf( 'borders: bottom thin, left thin, right thin, top thin;' 'align: vert centre, horiz right' ), 'border_right_25_style': xlwt.easyxf( 'borders: bottom thin, left thin, right thin, top thin;' 'align: vert centre, horiz right' ), 'border_right_50_style': xlwt.easyxf( 'borders: bottom thin, left thin, right thin, top thin;' 'align: vert centre, horiz right' ), 'border_right_75_style': xlwt.easyxf( 'borders: bottom thin, left thin, right thin, top thin;' 'align: vert centre, horiz right' ), 'border_right_0_style_bold': xlwt.easyxf( 'borders: bottom thin, left thin, right thin, top thin;' 'align: vert centre, horiz right; font: bold 1, height 200' ), 'border_right_25_style_bold': xlwt.easyxf( 'borders: bottom thin, left thin, right thin, top thin;' 'align: vert centre, horiz right; font: bold 1, height 200' ), 'border_right_50_style_bold': xlwt.easyxf( 'borders: bottom thin, left thin, right thin, top thin;' 'align: vert centre, horiz right; font: bold 1, height 200' ), 'border_right_75_style_bold': xlwt.easyxf( 'borders: bottom thin, left thin, right thin, top thin;' 'align: vert centre, horiz right; font: bold 1, height 200' ) } pattern = xlwt.Pattern() pattern.pattern = xlwt.Pattern.SOLID_PATTERN pattern.pattern_fore_colour = xlwt.Style.colour_map['light_green'] self.styles['border_right_0_style'].pattern = pattern self.styles['border_right_0_style_bold'].pattern = pattern pattern = xlwt.Pattern() pattern.pattern = xlwt.Pattern.SOLID_PATTERN pattern.pattern_fore_colour = xlwt.Style.colour_map['red'] self.styles['border_right_25_style'].pattern = pattern self.styles['border_right_25_style_bold'].pattern = pattern pattern = xlwt.Pattern() pattern.pattern = xlwt.Pattern.SOLID_PATTERN pattern.pattern_fore_colour = xlwt.Style.colour_map['gold'] self.styles['border_right_50_style'].pattern = pattern self.styles['border_right_50_style_bold'].pattern = pattern pattern = xlwt.Pattern() pattern.pattern = xlwt.Pattern.SOLID_PATTERN pattern.pattern_fore_colour = xlwt.Style.colour_map['light_yellow'] self.styles['border_right_75_style'].pattern = pattern self.styles['border_right_75_style_bold'].pattern = pattern worksheet.set_portrait(False) widths = [ 5500, 2900, 2130, 4700, 4700, 4700, 4700, 4700, 4700, 2400, 2400, 2500, 2300, 2450, 2300, 3000, 2750, 2750, 2330, 3000, 3000 ] if self.is_total: widths.insert(0, 5500) for y, width in enumerate(widths): worksheet.col(y).width = width headings = [ 'Водитель', 'Гос №', 'Пробег,\nкм', 'Превышение\nдопустимой\nскорости', 'Превышение\nкритической\nскорости', 'Движение\nбез ремня\nбезопасности', 'Движение\nбез фар', 'Движение\nс поднятой КМУ\n(кузовом)', 'Резкие\nтормож.,\nшт. на\n100 км', 'Резкие\nускор-я,\nшт. на\n100 км', 'Резкие\nповороты,\nшт. на\n100 км', 'Собл.\nскор.\nреж.', 'Ремень\nбезопас.', 'Фары', 'Торможения', 'Ускорения', 'Повороты', 'КМУ\n*(кузов)', 'Взвеш.\nоценка\nкачества\nвождения', 'Оценка\nкритических\nпараметров' ] if self.is_total: headings.insert(0, 'Компания') # header worksheet.write_merge( 1, 1, 0, 17 if self.is_total else 16, 'За период: %s - %s' % ( date_format(context['cleaned_data']['dt_from'], 'd.m.Y'), date_format(context['cleaned_data']['dt_to'], 'd.m.Y') ) ) x = 2 for y, heading in enumerate(headings): worksheet.write(x, y, heading, style=self.styles['border_center_style']) worksheet.row(2).height = 900 def write_row(x, group, row, total=False): y = 0 boldness = '_bold' if total else '' if self.is_total: worksheet.write( x, y, group['company_name'], style=self.styles['border_left_style' + boldness] ) y += 1 worksheet.write( x, y, group['driver_fio'], style=self.styles['border_left_style' + boldness] ) y += 1 worksheet.write( x, y, row['unit_number'], style=self.styles['border_left_style' + boldness] ) y += 1 worksheet.write( x, y, row['total_mileage'], style=self.styles['border_right_style' + boldness] ) y += 1 worksheet.write( x, y, self.render_measure(row, 'avg_overspeed'), style=self.styles['border_left_style' + boldness] ) y += 1 worksheet.write( x, y, self.render_measure(row, 'critical_overspeed'), style=self.styles['border_left_style' + boldness] ) y += 1 worksheet.write( x, y, self.render_measure(row, 'belt'), style=self.styles['border_left_style' + boldness] ) y += 1 worksheet.write( x, y, self.render_measure(row, 'lights'), style=self.styles['border_left_style' + boldness] ) y += 1 worksheet.write( x, y, self.render_measure(row, 'jib'), style=self.styles['border_left_style' + boldness] ) y += 1 worksheet.write( x, y, floatcomma(row['per_100km_count']['brakings']['count'], -2), style=self.styles['border_right_style' + boldness] ) y += 1 worksheet.write( x, y, floatcomma(row['per_100km_count']['accelerations']['count'], -2), style=self.styles['border_right_style' + boldness] ) y += 1 worksheet.write( x, y, floatcomma(row['per_100km_count']['turns']['count'], -2), style=self.styles['border_right_style' + boldness] ) y += 1 worksheet.write( x, y, self.render_rating(row['rating']['overspeed']), style=self.render_background(row['rating']['overspeed'], total=total) ) y += 1 worksheet.write( x, y, self.render_rating(row['rating']['belt']), style=self.render_background(row['rating']['belt'], total=total) ) y += 1 worksheet.write( x, y, self.render_rating(row['rating']['lights']), style=self.render_background(row['rating']['lights'], total=total) ) y += 1 worksheet.write( x, y, self.render_rating(row['rating']['brakings']), style=self.render_background(row['rating']['brakings'], total=total) ) y += 1 worksheet.write( x, y, self.render_rating(row['rating']['accelerations']), style=self.render_background(row['rating']['accelerations'], total=total) ) y += 1 worksheet.write( x, y, self.render_rating(row['rating']['turns']), style=self.render_background(row['rating']['turns'], total=total) ) y += 1 worksheet.write( x, y, self.render_rating(row['rating']['jib']), style=self.render_background(row['rating']['jib'], total=total) ) y += 1 worksheet.write( x, y, self.render_rating(row['rating_total']['avg']), style=self.render_background(row['rating_total']['avg'], total=total) ) y += 1 worksheet.write( x, y, self.render_rating(row['rating_total']['critical_avg']), style=self.render_background(row['rating_total']['critical_avg'], total=total) ) y += 1 for group in context['report_data']: if len(group['rows']) > 1 \ and ( not group['driver_fio'] or group['driver_fio'].strip().lower() != 'неизвестный' ): x += 1 write_row(x, group, group['stats'], total=True) worksheet.row(x).level = 1 # worksheet.row(x).collapse = 1 for row in group['rows']: x += 1 write_row(x, group, row) worksheet.row(x).level = 2 if len(group['rows']) > 1 else 1 worksheet.row(x).collapse = 1 if len(group['rows']) > 1 else 0 return worksheet
def write_xls_data(self, worksheet, context): worksheet = super(FinishedJobsView, self).write_xls_data(worksheet, context) for col in range(5): worksheet.col(col).width = 5000 worksheet.col(1).width = 12000 # header worksheet.write_merge( 1, 1, 0, 4, 'За период: %s - %s' % (date_format(context['cleaned_data']['dt_from'], 'd.m.Y H:i'), date_format(context['cleaned_data']['dt_to'], 'd.m.Y H:i'))) worksheet.write_merge(2, 2, 0, 1, 'ФИО ответственного за корректировку:', style=self.styles['left_center_style']) worksheet.write_merge(2, 2, 2, 4, '', style=self.styles['bottom_border_style']) worksheet.write_merge(3, 3, 0, 4, 'Всего шаблонов заданий в базе ССМТ: %s' % context['stats']['total'], style=self.styles['right_center_style']) worksheet.write_merge(4, 4, 0, 4, 'Из них неактуальных заданий: %s' % context['stats']['non_actual'], style=self.styles['right_center_style']) # head worksheet.write_merge(5, 6, 0, 0, ' № шаблона задания\nиз ССМТ', style=self.styles['border_center_style']) worksheet.write_merge(5, 6, 1, 1, ' Наименование шаблона задания', style=self.styles['border_center_style']) worksheet.write_merge(5, 5, 2, 3, ' Кол-во путевых листов', style=self.styles['border_center_style']) worksheet.write(6, 2, ' Заявлено', style=self.styles['border_center_style']) worksheet.write(6, 3, ' Исполнялось*', style=self.styles['border_center_style']) worksheet.write_merge(5, 6, 4, 4, ' Актуальность, %', style=self.styles['border_center_style']) for i in range(5): worksheet.write(7, i, str(i + 1), style=self.styles['border_center_style']) for i in range(1, 8): worksheet.row(i).height = REPORT_ROW_HEIGHT # body i = 8 for row in context['report_data'].values(): worksheet.write(i, 0, row['key'], style=self.styles['border_left_style']) worksheet.write(i, 1, row['name'], style=self.styles['border_left_style']) worksheet.write(i, 2, row['plan'], style=self.styles['border_right_style']) worksheet.write(i, 3, row['finished'], style=self.styles['border_right_style']) worksheet.write(i, 4, row['ratio'], style=self.styles['border_right_style']) worksheet.row(i).height = REPORT_ROW_HEIGHT i += 1 worksheet.write_merge(i + 1, i + 1, 0, 4, ''' * Исполненое задание - по факту работы транспорта в рамках одного путевого листа было зафиксировано посещение заданных заданием геозон, хотя бы однократно. Условие неактуальности шаблона задания: более %s%% неисполненных заданий ''' % context['cleaned_data'].get('non_actual_param', 20), style=self.styles['left_center_style']) worksheet.row(i + 1).height = 520 * 2 return worksheet
def write_xls_data(self, worksheet, context): worksheet = super(DrivingStyleView, self).write_xls_data(worksheet, context) cleaned_data = context['cleaned_data'] self.styles.update({ 'border_right_green_style': xlwt.easyxf( 'borders: bottom thin, left thin, right thin, top thin;' 'align: vert centre, horiz right'), 'border_right_yellow_style': xlwt.easyxf( 'borders: bottom thin, left thin, right thin, top thin;' 'align: vert centre, horiz right'), 'border_right_red_style': xlwt.easyxf( 'borders: bottom thin, left thin, right thin, top thin;' 'align: vert centre, horiz right') }) pattern = xlwt.Pattern() pattern.pattern = xlwt.Pattern.SOLID_PATTERN pattern.pattern_fore_colour = xlwt.Style.colour_map['light_green'] self.styles['border_right_green_style'].pattern = pattern pattern = xlwt.Pattern() pattern.pattern = xlwt.Pattern.SOLID_PATTERN pattern.pattern_fore_colour = xlwt.Style.colour_map['light_yellow'] self.styles['border_right_yellow_style'].pattern = pattern pattern = xlwt.Pattern() pattern.pattern = xlwt.Pattern.SOLID_PATTERN pattern.pattern_fore_colour = xlwt.Style.colour_map['coral'] self.styles['border_right_red_style'].pattern = pattern worksheet.set_portrait(False) worksheet.col(0).width = 5000 worksheet.col(1).width = 6000 worksheet.col(2).width = 8000 worksheet.col(3).width = 4000 worksheet.col(4).width = 4000 worksheet.col(5).width = 3000 worksheet.col(6).width = 3000 worksheet.col(7).width = 3000 worksheet.col(8).width = 3000 worksheet.col(9).width = 3000 worksheet.col(10).width = 3000 worksheet.col(11).width = 3000 worksheet.col(12).width = 3000 worksheet.col(13).width = 3000 worksheet.col(14).width = 3000 worksheet.col(15).width = 3000 worksheet.col(16).width = 3300 worksheet.col(17).width = 3000 # header worksheet.write_merge( 1, 1, 0, 16, 'За период: %s - %s' % (date_format(context['cleaned_data']['dt_from'], 'd.m.Y H:i'), date_format(context['cleaned_data']['dt_to'], 'd.m.Y H:i'))) worksheet.write_merge(2, 2, 0, 2, 'ФИО ответственного за разбор событий:', style=self.styles['left_center_style']) worksheet.write_merge(2, 2, 3, 9, '', style=self.styles['bottom_border_style']) worksheet.write_merge( 3, 3, 0, 17, 'Детализация нарушений ПДД и инструкции по эксплуатации техники:', style=self.styles['right_center_style']) # head worksheet.write_merge(4, 6, 0, 0, ' Время', style=self.styles['border_center_style']) worksheet.write_merge(4, 6, 1, 1, ' ФИО', style=self.styles['border_center_style']) worksheet.write_merge(4, 6, 2, 2, ' Наименование ТС', style=self.styles['border_center_style']) worksheet.write_merge(4, 6, 3, 3, ' Гос.номер ТС', style=self.styles['border_center_style']) worksheet.write_merge( 4, 6, 4, 4, ' Суммарное время\nв движении\nза период, чч:мм:сс', style=self.styles['border_center_style']) worksheet.write_merge(4, 4, 5, 12, ' Нарушения', style=self.styles['border_center_style']) worksheet.write_merge(5, 5, 5, 6, ' Превышение скоростного\nрежима', style=self.styles['border_center_style']) worksheet.write_merge(5, 5, 7, 8, ' Выключенный свет фар\nпри движении', style=self.styles['border_center_style']) worksheet.write_merge( 5, 5, 9, 10, ' Непристегнутый ремень\nбезопасности при движении', style=self.styles['border_center_style']) worksheet.write_merge( 5, 5, 11, 12, ' Не транспортное\nположение оборудования\nпри движении', style=self.styles['border_center_style']) worksheet.write(6, 5, ' Кол-во\nслучаев', style=self.styles['border_center_style']) worksheet.write(6, 6, ' Часов\nнарушения,\nчч:мм:сс', style=self.styles['border_center_style']) worksheet.write(6, 7, ' Кол-во\nслучаев', style=self.styles['border_center_style']) worksheet.write(6, 8, ' Часов\nнарушения,\nчч:мм:сс', style=self.styles['border_center_style']) worksheet.write(6, 9, ' Кол-во\nслучаев', style=self.styles['border_center_style']) worksheet.write(6, 10, ' Часов\nнарушения,\nчч:мм:сс', style=self.styles['border_center_style']) worksheet.write(6, 11, ' Кол-во\nслучаев', style=self.styles['border_center_style']) worksheet.write(6, 12, ' Часов\nнарушения,\nчч:мм:сс', style=self.styles['border_center_style']) worksheet.write_merge(4, 4, 13, 16, ' % нарушений', style=self.styles['border_center_style']) worksheet.write_merge(5, 6, 13, 13, ' Скоростной\nрежим', style=self.styles['border_center_style']) worksheet.write_merge(5, 6, 14, 14, ' Свет', style=self.styles['border_center_style']) worksheet.write_merge(5, 6, 15, 15, ' Ремень', style=self.styles['border_center_style']) worksheet.write_merge(5, 6, 16, 16, ' Доп.\nоборудование', style=self.styles['border_center_style']) worksheet.write_merge(4, 6, 17, 17, ' Оценка\nвождения, %', style=self.styles['border_center_style']) for i in range(18): worksheet.write(7, i, str(i + 1), style=self.styles['border_center_style']) for i in range(1, 8): worksheet.row(i).height = REPORT_ROW_HEIGHT worksheet.row(5).height = 680 worksheet.row(6).height = 680 # body i = 7 for row in context['report_data'].values(): for period in row['periods']: i += 1 worksheet.row(i).level = 1 # worksheet.row(i).collapse = 2 worksheet.write(i, 0, '%s -\n%s' % (date(period['dt_from'], 'Y-m-d H:i:s'), date(period['dt_to'], 'Y-m-d H:i:s')), style=self.styles['border_left_style']) worksheet.write( i, 1, period['job'].driver_fio if period.get('job') else '', style=self.styles['border_left_style']) worksheet.write(i, 2, row['unit_name'], style=self.styles['border_left_style']) worksheet.write(i, 3, row['unit_number'], style=self.styles['border_left_style']) worksheet.write(i, 4, render_timedelta(period['total_time']), style=self.styles['border_left_style']) worksheet.write(i, 5, period['facts']['speed']['count'] if period['facts']['speed']['count'] else '0', style=self.styles['border_right_style']) worksheet.write(i, 6, render_timedelta( period['facts']['speed']['seconds'], '0:00:00'), style=self.styles['border_left_style']) worksheet.write(i, 7, period['facts']['lights']['count'] if period['facts']['lights']['count'] else '0', style=self.styles['border_right_style']) worksheet.write(i, 8, render_timedelta( period['facts']['lights']['seconds'], '0:00:00'), style=self.styles['border_left_style']) worksheet.write(i, 9, period['facts']['belt']['count'] if period['facts']['belt']['count'] else '0', style=self.styles['border_right_style']) worksheet.write(i, 10, render_timedelta( period['facts']['belt']['seconds'], '0:00:00'), style=self.styles['border_left_style']) worksheet.write(i, 11, period['facts']['devices']['count'] if period['facts']['devices']['count'] else '0', style=self.styles['border_right_style']) worksheet.write(i, 12, render_timedelta( period['facts']['devices']['seconds'], '0:00:00'), style=self.styles['border_left_style']) worksheet.write(i, 13, floatcomma(period['percentage']['speed'], -2) if period['percentage']['speed'] else '0', style=self.render_background( period['percentage']['speed'], style=True, cleaned_data=cleaned_data)) worksheet.write(i, 14, floatcomma(period['percentage']['lights'], -2) if period['percentage']['lights'] else '0', style=self.render_background( period['percentage']['lights'], style=True, cleaned_data=cleaned_data)) worksheet.write(i, 15, floatcomma(period['percentage']['belt'], -2) if period['percentage']['belt'] else '0', style=self.render_background( period['percentage']['belt'], style=True, cleaned_data=cleaned_data)) worksheet.write(i, 16, floatcomma(period['percentage']['devices'], -2) if period['percentage']['devices'] else '0', style=self.render_background( period['percentage']['devices'], style=True, cleaned_data=cleaned_data)) worksheet.write(i, 17, floatcomma(period['rating'], -2), style=self.styles['border_right_style']) worksheet.row(i).height = 520 for detail in period['details']: i += 1 worksheet.row(i).level = 2 # worksheet.row(i).collapse = 2 worksheet.write(i, 0, '%s -\n%s' % (date(detail['dt_from'], 'Y-m-d H:i:s'), date(detail['dt_to'], 'Y-m-d H:i:s')), style=self.styles['border_left_style']) worksheet.write( i, 1, period['job'].driver_fio if period.get('job') else '', style=self.styles['border_left_style']) worksheet.write(i, 2, row['unit_name'], style=self.styles['border_left_style']) worksheet.write(i, 3, row['unit_number'], style=self.styles['border_left_style']) worksheet.write(i, 4, '', style=self.styles['border_left_style']) worksheet.write(i, 5, detail['speed']['count'] if detail['speed']['count'] else '0', style=self.styles['border_right_style']) worksheet.write(i, 6, render_timedelta( detail['speed']['seconds'], '0:00:00'), style=self.styles['border_left_style']) worksheet.write(i, 7, detail['lights']['count'] if detail['lights']['count'] else '0', style=self.styles['border_right_style']) worksheet.write(i, 8, render_timedelta( detail['lights']['seconds'], '0:00:00'), style=self.styles['border_left_style']) worksheet.write(i, 9, detail['belt']['count'] if detail['belt']['count'] else '0', style=self.styles['border_right_style']) worksheet.write(i, 10, render_timedelta(detail['belt']['seconds'], '0:00:00'), style=self.styles['border_left_style']) worksheet.write(i, 11, detail['devices']['count'] if detail['devices']['count'] else '0', style=self.styles['border_right_style']) worksheet.write(i, 12, render_timedelta( detail['devices']['seconds'], '0:00:00'), style=self.styles['border_left_style']) worksheet.write(i, 13, '', style=self.styles['border_left_style']) worksheet.write(i, 14, '', style=self.styles['border_left_style']) worksheet.write(i, 15, '', style=self.styles['border_left_style']) worksheet.write(i, 16, '', style=self.styles['border_left_style']) worksheet.write(i, 17, '', style=self.styles['border_left_style']) worksheet.row(i).height = 520 worksheet.write_merge( i + 1, i + 1, 0, 17, '''Условия форматирования ячеек: до %s%% нарушений - норма от %s%% до %s%% нарушений - требуется профилактическая беседа от %s%% до 100%% нарушений - требуется профилактическая беседа с возможным лишением части премии ''' % ( context['cleaned_data'].get('normal_rating', 10), context['cleaned_data'].get('normal_rating', 10), context['cleaned_data'].get('bad_rating', 30), context['cleaned_data'].get('bad_rating', 30), ), style=self.styles['left_center_style']) worksheet.row(i + 1).height = 520 * 4 return worksheet