Ejemplo n.º 1
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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
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)
Ejemplo n.º 4
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
Ejemplo n.º 5
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'Значение сохранено.'}
Ejemplo n.º 6
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)
Ejemplo n.º 7
0
    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)