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
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()
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()
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)
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)
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)
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)