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 get_plan(self, days): """ Получить плановое значние расхода на месяц и среднесуточное. Плановые значения указываются 1-го числа каждого месяца. """ if self.date.day != 1: first_day = get_month_day(self.date, 1) consumption = None try: # расход топлива в первый день consumption = FuelConsumption.objects.get( date=first_day, fuel_info__id=self.fuel_info.id) except FuelConsumption.DoesNotExist: #consumption = FuelConsumption(creator = self.editor, # date = first_day, # boiler = self.boiler, # fuel_info = self.fuel_info) #consumption.save(force_insert = True, save_revision=True) pass except FuelConsumption.MultipleObjectsReturned: #traceback.print_exc(file=sys.stdout) items = FuelConsumption.objects.filter( date=first_day, fuel_info__id=self.fuel_info.id) is_first = True for item in items: if is_first == True: consumption = item is_first = False else: item.delete() if consumption == None: return (0.0, 0.0, 0.0) month = consumption.plan_month avg = 0.0 if days > 0: avg = round(month / float(days), 3) plan_eqv = consumption.plan_eqv #actual_eqv = consumption return (month, avg, plan_eqv) return (0.0, 0.0, 0.0)
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_month_plan(self): """ Получить плановое значние расхода на месяц и среднесуточное """ if self.date.day != 1: first_day = get_month_day(self.date, 1) environment = None try: # расход воды в первый день environment = Environment.objects.get(date=first_day, boiler__id = self.boiler.id) except Environment.DoesNotExist: traceback.print_exc(file=sys.stdout) #environment = Environment(creator = self.editor, # date = first_day, # boiler = self.boiler) #environment.save(force_insert = True, save_revision=True) except Environment.MultipleObjectsReturned: traceback.print_exc(file=sys.stdout) is_first = True items = Environment.objects.filter(date = first_day, boiler__id = self.boiler.id) for item in items: if is_first==True: environment = item is_first=False else: item.delete() if environment == None: return 0.0 month = environment.outdoor_temp_plan return month return 0.0
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)
def save(self, save_revision=False, *args, **kwargs): if self.fuel_info == None: raise FuelRemains.DoesNotExist("Информация о топливе не указана.") first_day = get_month_day(self.date, 1) range = get_range(self.date) if self.date.day == 1: pass else: try: obj = FuelRemains.objects.get(date=first_day, fuel_info__id=self.fuel_info.id) self.first_day_month = obj.first_day_month except FuelRemains.DoesNotExist: #traceback.print_exc(file=sys.stdout) #obj = FuelRemains() #obj.date = first_day #obj.fuel_info = self.fuel_info #obj.boiler = self.boiler #obj.creator = self.editor #obj.save(save_revision=True, force_insert=True) #self.first_day_month = obj.first_day_month pass except FuelRemains.MultipleObjectsReturned: #traceback.print_exc(file=sys.stdout) items = FuelRemains.objects.filter( date=first_day, fuel_info__id=self.fuel_info.id) is_first = True for item in items: if is_first == True: self.first_day_month = item.first_day_month is_first = False else: item.delete() fc = FuelConsumption.objects.filter( date__range=range, fuel_info__id=self.fuel_info.id).aggregate( actual=Sum('actual_day')) if fc['actual'] == None: fc['actual'] = 0.0 fi = FuelIncome.objects.filter( date__range=range, fuel_info__id=self.fuel_info.id).aggregate(income=Sum('today'), pickup=Sum('pickup')) if fi['income'] == None: fi['income'] = 0.0 if fi['pickup'] == None: fi['pickup'] = 0.0 self.tonnes = round( self.calc_remain_tonnes(self.first_day_month, fi['income'], fc['actual'], fi['pickup']), 3) self.days = 0 #if save_revision == True: # with reversion.create_revision(): # super(FuelRemains, self).save( *args, **kwargs) #else: super(FuelRemains, self).save(*args, **kwargs)