Example #1
0
    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)
Example #2
0
    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)
Example #3
0
    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)
Example #4
0
    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)
Example #5
0
    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)
Example #6
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)
Example #7
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)
Example #8
0
    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)
Example #9
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'Значение сохранено.'}
Example #10
0
    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)