Exemplo n.º 1
0
 def _load_desktop_from_apps(cls):
     """
     Загрузка элементов Раб.Стола, декларированных в приложениях проекта
     :raise: ImportError
     """
     cls._lock.acquire()
     try:
         if not cls._success:
             cls._cache = {}
             # Из инитов всех приложения
             # пытаемся выполнить register_desktop_menu
             for app_name in settings.INSTALLED_APPS:
                 try:
                     module = import_module('.app_meta', app_name)
                 except ImportError, err:
                     if err.args[0].find('No module named') == -1 or (
                             err.args[0].find('app_meta') == -1):
                         logger.exception(
                             u'При сборке интерфейса не удалось '
                             u'подключить %s', app_name
                         )
                         raise
                     continue
                 proc = getattr(module, 'register_desktop_menu', None)
                 if callable(proc):
                     proc()
         cls._success = True
Exemplo n.º 2
0
    def register_point_external(self, extension_point):
        '''
        Метод регистрации точки расширения, который должен использоваться
        извне.

        Данный метод отличается от register_point тем, что при его
        использовании выставляются внутренние локи, что потенциально
        может привести к падению производительности системы.

        Поэтому, если не лень, используйте не декоратор @extension_point,
        а пишите определение точки расширения в app_meta. Да прибудет с вами
        сила, чтоле.
        '''
        if not self._validate_extension_point(extension_point):
            return

        self._write_lock.acquire()
        try:
            self.register_point(extension_point)
        except:
            logger.exception(
                u'Не удалось зарегистрировать точку расширения \'%s\'' %
                extension_point.name)
        finally:
            self._write_lock.release()
Exemplo n.º 3
0
    def register_point_external(self, extension_point):
        '''
        Метод регистрации точки расширения, который должен использоваться
        извне.

        Данный метод отличается от register_point тем, что при его
        использовании выставляются внутренние локи, что потенциально
        может привести к падению производительности системы.

        Поэтому, если не лень, используйте не декоратор @extension_point,
        а пишите определение точки расширения в app_meta. Да прибудет с вами
        сила, чтоле.
        '''
        if not self._validate_extension_point(extension_point):
            return

        self._write_lock.acquire()
        try:
            self.register_point(extension_point)
        except:
            logger.exception(u'Не удалось зарегистрировать точку расширения \'%s\'' % extension_point.name)
        finally:
            self._write_lock.release()
Exemplo n.º 4
0
    def build(self, request, rules):
        u'''
        Выполняет заполнение собственных атрибутов
        согласно переданному запросу, исходя из списка правил

        :param request:запрос, на основе которого производится
            заполнение контекста
        :type reques: django.http.Request

        :param rules: правила извлечения контекста из запроса
        :type rules: список m3_core.actions.context.ActionContextDeclaration
        '''

        params = {}
        if rules:
            for rule in rules:
                # [тип параметра; признак того, что параметр включен в context]
                params[rule.name] = [rule.type, False]

        key = value = ptype = None
        try:
            # переносим параметры в контекст из запроса
            for key in request.REQUEST:
                value = request.REQUEST[key]
                # Пустые параметры не конвертируем,
                # т.к. они могут вызвать ошибку
                if not value:
                    continue

                if key in params:
                    ptype = params[key][0]
                    value = self.convert_value(value, ptype)
                    # Флаг того, что параметр успешно расшифрован
                    # и добавлен в контекст
                    params[key][1] = True
                setattr(self, key, value)
        except IOError as err:
            # В некоторых браузерах (предполагается что в ie)
            # происходит следующие:
            # request.REQUEST читается и в какой-то момент связь прекращается
            # из-за того, что браузер разрывает соединение,
            # в следствии этого происходит ошибка
            # IOError: request data read error
            logger.warning(str(err))
        except ValueError as err:
            # если ошибка преобразования,
            # то пусть проставится значение по-умолчанию
            logger.exception(u'Ошибка при преобразовании значения '
                             u'из запроса %s="%s" к типу "%s"' %
                             (key, value, ptype))

        # переносим обязательные параметры, которые не встретились в запросе
        for rule in rules if rules else []:
            if rule.required and rule.default is not _none and (
                    not params[rule.name][1]):
                # если параметр не передан в запросе, но
                # он является обязательным и задано значение по умолчанию,
                # то помещаем этот параметр в контекст
                setattr(self, rule.name, rule.default)
        # проверяем наличие обязательных параметров
        self.check_required(rules)
Exemplo n.º 5
0
        def save_image(obj, name, field):
            """
            Работа с изображением или файлом
            :param field: поле
            :type field: потомок m3_ext.ui.fields.complex.BaseExtField
            :param obj: объект
            :param name: имя поля
            :type name: str
            """
            if hasattr(obj, name):
                l_field = getattr(obj, name)
                if (
                    l_field and
                    os.path.exists(l_field.path) and
                    (
                        os.path.basename(l_field.file.name)
                    ).lower() != (field.value).lower()
                ):
                    # Сначало нужно удалить thumbnail картинки
                    if isinstance(field, fields.ExtImageUploadField) and (
                            field.thumbnail):
                        current_dir = os.path.dirname(l_field.path)
                        basename = os.path.basename(l_field.path)

                        thumb_prefix = (
                            fields.ExtImageUploadField.MIDDLE_THUMBNAIL_PREFIX,
                            fields.ExtImageUploadField.MIN_THUMBNAIL_PREFIX,
                            fields.ExtImageUploadField.MAX_THUMBNAIL_PREFIX
                        )

                        for prefix in thumb_prefix:
                            thumb = os.path.join(
                                current_dir, prefix + basename)

                            if os.path.exists(thumb):
                                os.remove(thumb)

                    # Файл изменился, удаляем старый
                    l_field.delete(save=False)

                if field.memory_file:
                    cont_file = ContentFile(field.memory_file.read())
                    name_file = field.memory_file.name

                    l_field = getattr(obj, name)
                    l_field.save(name_file, cont_file, save=False)

                    if isinstance(field, fields.ExtImageUploadField):
                        try:
                            img = Image.open(l_field.path)
                        except IOError:
                            # Кроме логирования ничего не нужно
                            logger.exception()
                            return

                        width, height = img.size
                        max_width, max_height = field.image_max_size

                        # Обрезаем изображение, если нужно
                        if width > max_width or height > max_height:

                            # curr_width, curr_height = get_img_size(
                            #     field.image_max_size, img.size)
                            # new_img = img.resize(
                            #     (curr_width, curr_height), Image.ANTIALIAS)
                            img.save(l_field.path)

                        if isinstance(field, fields.ExtImageUploadField) and (
                                field.thumbnail and field.memory_file):
                            current_dir = os.path.dirname(l_field.path)

                            # А так же нужно сохранять thumbnail картинки
                            # Состовляем лист thumbnail_size'ов
                            thumbnails = [(
                                field.min_thumbnail_size,
                                fields.ExtImageUploadField.MIN_THUMBNAIL_PREFIX
                            )]

                            if field.middle_thumbnail_size:
                                thumbnails.append((
                                    field.middle_thumbnail_size,
                                    fields.ExtImageUploadField.MIDDLE_THUMBNAIL_PREFIX
                                ))

                            if field.max_thumbnail_size:
                                thumbnails.append((
                                    field.max_thumbnail_size,
                                    fields.ExtImageUploadField.MAX_THUMBNAIL_PREFIX
                                ))

                            for thumb in thumbnails:
                                # Генерируем thumbnails
                                # thumb_zise = get_img_size(size, img.size)
                                # new_img = img.resize(
                                #     thumb_zise, Image.ANTIALIAS)

                                base_name = os.path.basename(l_field.path)
                                tmb_path = os.path.join(
                                    current_dir, thumb[1] + base_name)
                                img.save(tmb_path)
Exemplo n.º 6
0
    def build(self, request, rules):
        u'''
        Выполняет заполнение собственных атрибутов
        согласно переданному запросу, исходя из списка правил

        :param request:запрос, на основе которого производится
            заполнение контекста
        :type reques: django.http.Request

        :param rules: правила извлечения контекста из запроса
        :type rules: список m3_core.actions.context.ActionContextDeclaration
        '''

        params = {}
        if rules:
            for rule in rules:
                # [тип параметра; признак того, что параметр включен в context]
                params[rule.name] = [rule.type, False]

        key = value = ptype = None
        try:
            # переносим параметры в контекст из запроса
            for key in request.REQUEST:
                value = request.REQUEST[key]
                # Пустые параметры не конвертируем,
                # т.к. они могут вызвать ошибку
                if not value:
                    continue

                if key in params:
                    ptype = params[key][0]
                    value = self.convert_value(value, ptype)
                    # Флаг того, что параметр успешно расшифрован
                    # и добавлен в контекст
                    params[key][1] = True
                setattr(self, key, value)
        except IOError as err:
            # В некоторых браузерах (предполагается что в ie)
            # происходит следующие:
            # request.REQUEST читается и в какой-то момент связь прекращается
            # из-за того, что браузер разрывает соединение,
            # в следствии этого происходит ошибка
            # IOError: request data read error
            logger.warning(str(err))
        except ValueError as err:
            # если ошибка преобразования,
            # то пусть проставится значение по-умолчанию
            logger.exception(
                u'Ошибка при преобразовании значения '
                u'из запроса %s="%s" к типу "%s"'
                % (key, value, ptype)
            )

        # переносим обязательные параметры, которые не встретились в запросе
        for rule in rules if rules else []:
            if rule.required and rule.default is not _none and (
                    not params[rule.name][1]):
                # если параметр не передан в запросе, но
                # он является обязательным и задано значение по умолчанию,
                # то помещаем этот параметр в контекст
                setattr(self, rule.name, rule.default)
        # проверяем наличие обязательных параметров
        self.check_required(rules)
Exemplo n.º 7
0
        def save_image(obj, name, field):
            """
            Работа с изображением или файлом
            :param field: поле
            :type field: потомок m3_ext.ui.fields.complex.BaseExtField
            :param obj: объект
            :param name: имя поля
            :type name: str
            """
            if hasattr(obj, name):
                l_field = getattr(obj, name)
                if (l_field and os.path.exists(l_field.path)
                        and (os.path.basename(l_field.file.name)).lower() !=
                    (field.value).lower()):
                    # Сначало нужно удалить thumbnail картинки
                    if isinstance(
                            field,
                            fields.ExtImageUploadField) and (field.thumbnail):
                        current_dir = os.path.dirname(l_field.path)
                        basename = os.path.basename(l_field.path)

                        thumb_prefix = (
                            fields.ExtImageUploadField.MIDDLE_THUMBNAIL_PREFIX,
                            fields.ExtImageUploadField.MIN_THUMBNAIL_PREFIX,
                            fields.ExtImageUploadField.MAX_THUMBNAIL_PREFIX)

                        for prefix in thumb_prefix:
                            thumb = os.path.join(current_dir,
                                                 prefix + basename)

                            if os.path.exists(thumb):
                                os.remove(thumb)

                    # Файл изменился, удаляем старый
                    l_field.delete(save=False)

                if field.memory_file:
                    cont_file = ContentFile(field.memory_file.read())
                    name_file = field.memory_file.name

                    l_field = getattr(obj, name)
                    l_field.save(name_file, cont_file, save=False)

                    if isinstance(field, fields.ExtImageUploadField):
                        try:
                            img = Image.open(l_field.path)
                        except IOError:
                            # Кроме логирования ничего не нужно
                            logger.exception()
                            return

                        width, height = img.size
                        max_width, max_height = field.image_max_size

                        # Обрезаем изображение, если нужно
                        if width > max_width or height > max_height:

                            # curr_width, curr_height = get_img_size(
                            #     field.image_max_size, img.size)
                            # new_img = img.resize(
                            #     (curr_width, curr_height), Image.ANTIALIAS)
                            img.save(l_field.path)

                        if isinstance(field, fields.ExtImageUploadField) and (
                                field.thumbnail and field.memory_file):
                            current_dir = os.path.dirname(l_field.path)

                            # А так же нужно сохранять thumbnail картинки
                            # Состовляем лист thumbnail_size'ов
                            thumbnails = [
                                (field.min_thumbnail_size, fields.
                                 ExtImageUploadField.MIN_THUMBNAIL_PREFIX)
                            ]

                            if field.middle_thumbnail_size:
                                thumbnails.append((field.middle_thumbnail_size,
                                                   fields.ExtImageUploadField.
                                                   MIDDLE_THUMBNAIL_PREFIX))

                            if field.max_thumbnail_size:
                                thumbnails.append(
                                    (field.max_thumbnail_size, fields.
                                     ExtImageUploadField.MAX_THUMBNAIL_PREFIX))

                            for thumb in thumbnails:
                                # Генерируем thumbnails
                                # thumb_zise = get_img_size(size, img.size)
                                # new_img = img.resize(
                                #     thumb_zise, Image.ANTIALIAS)

                                base_name = os.path.basename(l_field.path)
                                tmb_path = os.path.join(
                                    current_dir, thumb[1] + base_name)
                                img.save(tmb_path)