def save(self, save_revision=False, *args, **kwargs): # Если первый день месяца, тогда: # - сумма потребления фактическая и плановая за период # равна текущим значениям # # Количество дней в месяце days_number = get_month_last_day(self.date) if self.date.day == 1: self.energy_value_month = self.energy_value else: # пара значений даты начала и пердыдущего дня месяца actual_month_range = get_range(self.date, -1) # Сумма потребления с начала месяца до вчерашнего дня energy_sum = PowerPerformance.objects.filter(date__range=actual_month_range, boiler__id=self.boiler.id).aggregate(consumption_sum=Sum('energy_value')) if energy_sum['consumption_sum'] == None: energy_sum['consumption_sum']=0 self.energy_value_month = energy_sum['consumption_sum'] + self.energy_value #if save_revision == True: # with reversion.create_revision(): # super(PowerPerformance, self).save( *args, **kwargs) #else: super(PowerPerformance, self).save( *args, **kwargs)
def update_period(self): """ Обновить все записи периода. """ days = get_month_last_day(self.date) records = WaterConsumption.objects.exclude(date=self.date).filter( category__id=self.category.id) for record in records: print record.date #record.editor = self.editor record.save(force_update=True)
def update_period(self): """ Обновить все записи периода. """ days = get_month_last_day(self.date) month_range = [ get_month_day(self.date, 2), get_month_day(self.date, days) ] records = FuelRemains.objects.filter(date__range=month_range, fuel_info__id=self.fuel_info.id) for record in records: #record.editor = self.editor record.save(force_update=True)
def save(self, save_revision=False, *args, **kwargs): # Если первый день месяца, тогда: # - сумма потребления фактическая и плановая за период # равна текущим значениям # # Количество дней в месяце days_number = get_month_last_day(self.date) if self.date.day == 1: self.plan_day = round(self.plan_month / days_number, 3) self.plan_sum_period = self.plan_day self.actual_sum_period = self.actual_day else: # пара значений даты начала и пердыдущего дня месяца actual_month_range = get_range(self.date, -1) # Сумма потребления с начала месяца до вчерашнего дня actual_sum = ElectricityConsumption.objects.filter( date__range=actual_month_range, boiler__id=self.boiler.id).aggregate( consumption_sum=Sum('actual_day')) if actual_sum['consumption_sum'] == None: actual_sum['consumption_sum'] = 0 # среднесуточные значения и плановые месячные month, avg = self.get_month_plan() self.plan_day = avg self.plan_month = month # сумма равна сумме сегоднешнего значения и суммы всех значений с первого дня месяца # по вчерашнее число self.plan_sum_period = round( (self.plan_month / days_number) * self.date.day, 3) self.actual_sum_period = actual_sum[ 'consumption_sum'] + self.actual_day # Вычислить отклонение в процентах планового и фактического значений за период if self.plan_sum_period > 0: delta = ((self.actual_sum_period * 100.0) / self.plan_sum_period) - 100.0 self.diff_period_percent = round(delta, 3) #if save_revision == True: # with reversion.create_revision(): # super(ElectricityConsumption,self).save( *args, **kwargs) #else: super(ElectricityConsumption, self).save(*args, **kwargs)
def save(self, save_revision=False, *args, **kwargs): # количество дней в месяце days = get_month_last_day(self.date) if self.category == None: raise WaterConsumption.DoesNotExist( "Категория расхода воды не указана.") if self.date.day == 1: self.actual_month = self.actual_day self.plan_day = round(self.plan_month / float(days), 3) else: # диапазон дат с начала месяца по текущий день date_range = get_range(self.date, -1) # фактический расход за период total_actual = WaterConsumption.objects.filter( date__range=date_range, boiler__id=self.boiler.id, category__id=self.category.id).aggregate( actual_month=Sum('actual_day')) if total_actual['actual_month'] == None: total_actual['actual_month'] = 0 self.actual_month = total_actual['actual_month'] + self.actual_day # Плановые дневные и месячные значения month_plan, day_plan = self.get_month_plan() self.plan_month = month_plan self.plan_day = day_plan # вычисляем разницы self.diff_day = round(self.actual_day - self.plan_day, 3) self.diff_month = round( self.actual_month - (self.plan_day * self.date.day), 3) self.farward_temperature_diff = self.farward_temperature_actual - self.farward_temperature_estimated self.backward_temperature_diff = self.backward_temperature_actual - self.backward_temperature_estimated #if save_revision == True: # with reversion.create_revision(): # super(WaterConsumption,self).save( *args, **kwargs) #else: super(WaterConsumption, self).save(*args, **kwargs)
def get_month_plan(self): """ Получить плановое значние расхода на месяц и среднесуточное """ if self.date.day != 1: first_day = get_month_day(self.date, 1) consumption = None try: # расход воды в первый день consumption = WaterConsumption.objects.get( date=first_day, category__id=self.category.id) except WaterConsumption.DoesNotExist: _logger.info("The month plan doesn't exist on " + unicode(self.date)) #traceback.print_exc(file=sys.stdout) #consumption = WaterConsumption(creator = self.editor, # date = first_day, # boiler = self.boiler, # category = self.category) #consumption.save(force_insert = True, save_revision=True) pass except WaterConsumption.MultipleObjectsReturned: traceback.print_exc(file=sys.stdout) is_first = True items = WaterConsumption.objects.filter( date=self.date, category__id=self.category.id) for item in items: if is_first == True: consumption = item is_first = False else: item.delete() if consumption == None: return (0.0, 0.0) month = consumption.plan_month avg = round(month / float(get_month_last_day(self.date)), 3) return (month, avg) return (0.0, 0.0)
def get_boiler_data(self, boiler_id, date): """ Получить данные для сводного отчета по котельной """ queries_path = os.path.join(os.path.dirname(__file__), 'queries') queries_path = os.path.join(queries_path, 'composite', 'boiler.sql') query_file = open(queries_path, 'r') day_coef = float(date.day) / float(get_month_last_day(date)) cursor = connection.cursor() cursor.execute(query_file.read(), { 'my_date': date, 'my_boiler': boiler_id, 'day_coef': day_coef }) query_file.close() return dictfetchall(cursor)
def get_branch_totals(self, boilers, date, branch_name): """ """ queries_path = os.path.join(os.path.dirname(__file__), 'queries') queries_path = os.path.join(queries_path, 'composite', 'branch.sql') query_file = open(queries_path, 'r') day_coef = float(date.day) / float(get_month_last_day(date)) cursor = connection.cursor() query = query_file.read() cursor.execute( query, { u'my_date': date, u'my_boiler': tuple(boilers), 'branch': branch_name, 'day_coef': day_coef }) query_file.close() return dictfetchall(cursor)
def set_dataset_data(request, field_id, on_date, company_object_id, water_category_id, fuel_info_id, value): """ Установить новое значениче для указанной колонки. @param on_date: Дата @param field_id: идентификатор колонки @param company_object_id: Идентификатор объекта @param water_category_id: Идентификатор категории расхода воды @param fuel_info_id: Идентификатор информации о топливе @param value: новое значение @return: Возвращает объект """ try: field = DatasetField.objects.get(id=field_id) # Дата на которую нужно заполнить значение my_date = datetime.strptime(on_date, settings.DATE_FORMAT).date() today = get_today() # Проверка разрешения установления значения if not has_permission(field, request.user, settings.PERMISSION_EDIT_NAME): return { 'success': False, 'message': u"У вас недостаточно прав для редактирования." } set_value = False user_roles = get_roles(request.user) admin = Role.objects.get(name=settings.ROLE_ADMIN_NAME) manager = Role.objects.get(name=settings.ROLE_MANAGER_NAME) developer = Role.objects.get(name=settings.ROLE_DEVELOPER_NAME) editor = Role.objects.get(name=settings.ROLE_EDITOR_NAME) # Если пользователь выполняет одну из ролей он может выполнять # редактирование в любое время if admin in user_roles or manager in user_roles or developer in user_roles: set_value = True # Если пользователь редактор - может в трехдневный срок редактировать данные elif editor in user_roles and (today - my_date).days < 4 and ( today - my_date).days >= 0: set_value = True if set_value: # Дополнительная проверка разрешения выполнять корректировку. if field.model_field_name == 'correct': # Даты в которые поле доступно для редактирования editable_on_date = (get_month_day(today, 10), get_month_day(today, 20), get_month_day(today, get_month_last_day(today))) if my_date not in editable_on_date: return { 'success': False, 'message': u"Корректировку можно делать только 10-го, 20-го и в последний день месяца" } # Информация о топливе fuel_info_obj = None if fuel_info_id > 0: fuel_info_obj = FuelInfo.objects.get(id=fuel_info_id) # Информация о воде water_category_obj = None if water_category_id > 0: water_category_obj = WaterConsumptionCategory.objects.get( id=water_category_id) # Котельная boiler = BoilerHouse.objects.get(id=company_object_id) # Установить значение field.set_value(request.user, my_date, value, boiler, water_category_obj, fuel_info_obj) else: return { 'success': False, 'message': u"Редактирование доступно только в трехдневный срок." } except Exception as ex: traceback.print_exc(file=sys.stdout) _logger.error(u"[dataset.setData] - Не удалось сохранить значение: " + unicode(ex)) return { 'success': False, 'message': u"Не удалось сохранить значение " + unicode(ex) } return {'success': True, 'message': u'Значение сохранено.'}
def get_plan_period(self): """ Получить плановый период для текущей даты и количество дней в периоде. - Если ни один период не начинается в текущем месяце, тогда начало периода совпадает с началом месца - Если ни один период не заканчивается в текущем месяце, тогда окончание периода совпадает с окончанием месяца - Если существует несколько периодов, которые пересекаются на текущую дату, первый из них будет удален """ period = None days = 0 start_date = end_date = None try: # Найти период, который включает текущую дату period = self.boiler.periods.get(start__lte=self.date, end__gte=self.date) #print periods.query except Period.DoesNotExist: # Если период не найден, нужно убедиться есть ли период заканчивающийся в этом месяце # или период начинающийся в этом месяце days = get_month_last_day(self.date) # Все периоды, которые начинаются в месяце соответствующем дате s = self.boiler.periods.filter(start__month=self.date.month, start__year=self.date.year) # Все периоды, которые заканчиваются в месяце соответствующем дате e = self.boiler.periods.filter(end__month=self.date.month, end__year=self.date.year) start_date, end_date = get_month_range(self.date.year, self.date.month) # Если есть периоды, которые начинаются в текущем месяце, # тогда дата окончания периода равна 'дата начала' - 1 if len(s) > 0: end_date = get_month_day(self.date, s[0].start.day - 1) days = 0 #end_date.day if len(e) > 0: start_date = e[0].end days = 0 #end_date.day - start_date.day + 1 except Period.MultipleObjectsReturned: items = self.boiler.periods.filter(start__lte=self.date, end__gte=self.date) is_first = True # Удаляем пересекающиеся периоды, кроме первого for item in items: if is_first == True: period = item is_first = False else: item.delete() if period != None: # период первого месяца с даты начала периода, до последнего дня месяца start_period = get_range_revers(period.start) #print start_period # период последнего месяца с даты начала, до даты окончания периода end_period = get_range(period.end) #print end_period # Если дата расхода содержится в первом месячном периоде if contains(start_period, self.date): start_date = start_period[0] end_date = start_period[1] days = start_period[1].day - start_period[0].day + 1 # Если дата расхода содержится в последнем месячном периоде elif contains(end_period, self.date): start_date = end_period[0] end_date = end_period[1] days = end_date.day else: days = get_month_last_day(self.date) start_date, end_date = get_month_range(self.date.year, self.date.month) return (start_date, end_date, days)