From 7a7d6605e06a56e351ec48430681749e0bb5cd03 Mon Sep 17 00:00:00 2001 From: Hugo Smett Date: Fri, 23 Oct 2020 12:55:08 +0200 Subject: [PATCH 1/5] Remove mediagenerator app --- mediagenerator/LICENSE | 27 -- mediagenerator/TEMPORARY_HACK | 8 - mediagenerator/__init__.py | 0 mediagenerator/api.py | 53 ---- mediagenerator/base.py | 40 --- mediagenerator/filters/__init__.py | 0 mediagenerator/filters/clever.py | 23 -- mediagenerator/filters/closure.py | 32 --- mediagenerator/filters/concat.py | 41 --- mediagenerator/filters/cssurl.py | 103 -------- mediagenerator/filters/i18n.py | 78 ------ mediagenerator/filters/less.py | 197 -------------- mediagenerator/filters/media_url.py | 50 ---- mediagenerator/filters/template.py | 19 -- mediagenerator/filters/yuicompressor.py | 27 -- mediagenerator/generators/__init__.py | 0 mediagenerator/generators/bundles/__init__.py | 1 - mediagenerator/generators/bundles/base.py | 240 ------------------ mediagenerator/generators/bundles/bundles.py | 84 ------ mediagenerator/generators/bundles/settings.py | 21 -- mediagenerator/generators/bundles/utils.py | 87 ------- mediagenerator/generators/copyfiles.py | 47 ---- mediagenerator/generators/manifest.py | 56 ---- mediagenerator/management/__init__.py | 0 .../management/commands/__init__.py | 0 .../management/commands/generatemedia.py | 12 - mediagenerator/settings.py | 42 --- .../mediagenerator/manifest/base.manifest | 25 -- mediagenerator/templatetags/__init__.py | 0 mediagenerator/templatetags/media.py | 50 ---- mediagenerator/utils.py | 178 ------------- 31 files changed, 1541 deletions(-) delete mode 100644 mediagenerator/LICENSE delete mode 100644 mediagenerator/TEMPORARY_HACK delete mode 100644 mediagenerator/__init__.py delete mode 100644 mediagenerator/api.py delete mode 100644 mediagenerator/base.py delete mode 100644 mediagenerator/filters/__init__.py delete mode 100644 mediagenerator/filters/clever.py delete mode 100644 mediagenerator/filters/closure.py delete mode 100644 mediagenerator/filters/concat.py delete mode 100644 mediagenerator/filters/cssurl.py delete mode 100644 mediagenerator/filters/i18n.py delete mode 100644 mediagenerator/filters/less.py delete mode 100644 mediagenerator/filters/media_url.py delete mode 100644 mediagenerator/filters/template.py delete mode 100644 mediagenerator/filters/yuicompressor.py delete mode 100644 mediagenerator/generators/__init__.py delete mode 100644 mediagenerator/generators/bundles/__init__.py delete mode 100644 mediagenerator/generators/bundles/base.py delete mode 100644 mediagenerator/generators/bundles/bundles.py delete mode 100644 mediagenerator/generators/bundles/settings.py delete mode 100644 mediagenerator/generators/bundles/utils.py delete mode 100644 mediagenerator/generators/copyfiles.py delete mode 100644 mediagenerator/generators/manifest.py delete mode 100644 mediagenerator/management/__init__.py delete mode 100644 mediagenerator/management/commands/__init__.py delete mode 100644 mediagenerator/management/commands/generatemedia.py delete mode 100644 mediagenerator/settings.py delete mode 100644 mediagenerator/templates/mediagenerator/manifest/base.manifest delete mode 100644 mediagenerator/templatetags/__init__.py delete mode 100644 mediagenerator/templatetags/media.py delete mode 100644 mediagenerator/utils.py diff --git a/mediagenerator/LICENSE b/mediagenerator/LICENSE deleted file mode 100644 index 07bab4d123..0000000000 --- a/mediagenerator/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) Waldemar Kornewald, Thomas Wanschik, and all contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of All Buttons Pressed nor - the names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/mediagenerator/TEMPORARY_HACK b/mediagenerator/TEMPORARY_HACK deleted file mode 100644 index d7f597f8a3..0000000000 --- a/mediagenerator/TEMPORARY_HACK +++ /dev/null @@ -1,8 +0,0 @@ -These is a copy of the original django-mediagenerator package, which does support Django 1.9+ ; -indeed it does not support Django 1.8 (so in Creme we added some hacks in Creme 1.7 & previous versions). - -Many features which are probably used by no user of Creme have been removed, in order to get less code to support. - -A new asset manager will be used/created in some future version of Creme. For the time being, in order to save -development time (& add more important features -- like the use of a recent Django version), this way allows us -to keep the same API as in Creme1.7. diff --git a/mediagenerator/__init__.py b/mediagenerator/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/mediagenerator/api.py b/mediagenerator/api.py deleted file mode 100644 index bed8b24257..0000000000 --- a/mediagenerator/api.py +++ /dev/null @@ -1,53 +0,0 @@ -from collections import defaultdict, OrderedDict -import logging -import os -import shutil - -from django.utils.http import urlquote - -from . import utils # settings -from .settings import GENERATED_MEDIA_DIR, GENERATED_MEDIA_NAMES_FILE, MEDIA_GENERATORS -from .utils import load_backend - -# HACK: by Hybird (we should pass it as argument -- & modify all the API) -global_errors = defaultdict(OrderedDict) -# logger = logging.getLogger(__name__) -logger = logging.getLogger('mediagenerator') - - -def generate_media(): - if os.path.exists(GENERATED_MEDIA_DIR): - shutil.rmtree(GENERATED_MEDIA_DIR) - - utils.NAMES = {} - - for backend_name in MEDIA_GENERATORS: - backend = load_backend(backend_name)() - - for key, url, content in backend.get_output(): - version = backend.generate_version(key, url, content) - if version: - base, ext = os.path.splitext(url) - url = f'{base}-{version}{ext}' - - path = os.path.join(GENERATED_MEDIA_DIR, url) - - parent = os.path.dirname(path) - if not os.path.exists(parent): - os.makedirs(parent) - - if isinstance(content, str): - content = content.encode('utf8') - - with open(path, 'wb') as fp: - fp.write(content) - - utils.NAMES[key] = urlquote(url) - - # Generate a module with media file name mappings - with open(GENERATED_MEDIA_NAMES_FILE, 'w') as fp: - fp.write('NAMES = %r' % utils.NAMES) - - for category, errors in global_errors.items(): - for error in errors.values(): - logger.warning('%s - %s', category, error) diff --git a/mediagenerator/base.py b/mediagenerator/base.py deleted file mode 100644 index 1d58b6a472..0000000000 --- a/mediagenerator/base.py +++ /dev/null @@ -1,40 +0,0 @@ -from hashlib import sha1 - -from django.utils.encoding import smart_bytes - - -class Generator: - def generate_version(self, key, url, content): - return sha1(smart_bytes(content)).hexdigest() - - def get_output(self): - """ - Generates content for production mode. - - Yields tuples of the form: - key, url, content - - Here, key must be the same as for get_dev_output_names(). - """ - for key, url, hash in self.get_dev_output_names(): - yield key, url, self.get_dev_output(url)[0] - - def get_dev_output(self, name): - """ - Generates content for dev mode. - - Yields tuples of the form: - content, mimetype - """ - raise NotImplementedError() - - def get_dev_output_names(self): - """ - Generates file names for dev mode. - - Yields tuples of the form: - key, url, version_hash - - Here, key must be the same as for get_output_names(). - """ - raise NotImplementedError() diff --git a/mediagenerator/filters/__init__.py b/mediagenerator/filters/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/mediagenerator/filters/clever.py b/mediagenerator/filters/clever.py deleted file mode 100644 index 6e0da18034..0000000000 --- a/mediagenerator/filters/clever.py +++ /dev/null @@ -1,23 +0,0 @@ -from mediagenerator.generators.bundles.base import Filter - -from clevercss import convert - - -class CleverCSS(Filter): - def __init__(self, **kwargs): - super().__init__(**kwargs) - assert self.filetype == 'css', ( - f'CleverCSS only supports compilation to css. ' - f'The parent filter expects "{self.filetype}".') - self.input_filetype = 'clevercss' - - def should_use_default_filter(self, ext): - return False if ext == 'ccss' else super().should_use_default_filter(ext) - - def get_output(self, variation): - for input in self.get_input(variation): - yield convert(input) - - def get_dev_output(self, name, variation): - content = super().get_dev_output(name, variation) - return convert(content) diff --git a/mediagenerator/filters/closure.py b/mediagenerator/filters/closure.py deleted file mode 100644 index dd39d314a5..0000000000 --- a/mediagenerator/filters/closure.py +++ /dev/null @@ -1,32 +0,0 @@ -from django.conf import settings -from mediagenerator.generators.bundles.base import SubProcessFilter - -COMPILATION_LEVEL = getattr(settings, 'CLOSURE_COMPILATION_LEVEL', - 'SIMPLE_OPTIMIZATIONS') - -class Closure(SubProcessFilter): - def __init__(self, **kwargs): - self.config(kwargs, compilation_level=COMPILATION_LEVEL) - super().__init__(**kwargs) - assert self.filetype == 'js', ( - f'Closure only supports compilation to js. ' - f'The parent filter expects "{self.filetype}".') - - def get_output(self, variation): - # We import this here, so App Engine Helper users don't get import - # errors. - compressor = settings.CLOSURE_COMPILER_PATH - - for input in self.get_input(variation): - try: - yield self.run_process([ - 'java', '-jar', compressor, '--charset', 'utf-8', '--compilation_level', self.compilation_level, - ], input=input) - except Exception as e: - raise ValueError( - "Failed to execute Java VM or Closure. " - "Please make sure that you have installed Java " - "and that it's in your PATH and that you've configured " - "CLOSURE_COMPILER_PATH in your settings correctly.\n" - "Error was: {}".format(e) - ) diff --git a/mediagenerator/filters/concat.py b/mediagenerator/filters/concat.py deleted file mode 100644 index 14d9e8d5a5..0000000000 --- a/mediagenerator/filters/concat.py +++ /dev/null @@ -1,41 +0,0 @@ -from hashlib import sha1 - -from django.utils.encoding import smart_str - -from mediagenerator.generators.bundles.base import Filter - - -class Concat(Filter): - """ - Simply concatenates multiple files into a single file. - - This is also the default root filter. - """ - def __init__(self, **kwargs): - self.config(kwargs, concat_dev_output=False, dev_output_name='concat') - super().__init__(**kwargs) - - def get_output(self, variation): - yield '\n\n'.join(input for input in self.get_input(variation)) - - def get_dev_output(self, name, variation): - if not self.concat_dev_output: - return super().get_dev_output(name, variation) - - assert self.dev_output_name == name - - names = super().get_dev_output_names(variation) - - return '\n\n'.join(super().get_dev_output(name[0], variation) - for name in names) - - def get_dev_output_names(self, variation): - if not self.concat_dev_output: - for data in super().get_dev_output_names(variation): - yield data - - return - - content = self.get_dev_output(self.dev_output_name, variation) - - yield self.dev_output_name, sha1(smart_str(content)).hexdigest() diff --git a/mediagenerator/filters/cssurl.py b/mediagenerator/filters/cssurl.py deleted file mode 100644 index 887fb5ea99..0000000000 --- a/mediagenerator/filters/cssurl.py +++ /dev/null @@ -1,103 +0,0 @@ -from base64 import b64encode -from mimetypes import guess_type -import os -import posixpath -import re - -from django.conf import settings - -from mediagenerator.generators.bundles.base import Filter, FileFilter -from mediagenerator.utils import media_url, prepare_patterns, find_file -from ..api import global_errors - -url_re = re.compile(r'url\s*\(["\']?([\w\.][^:]*?)["\']?\)', re.UNICODE) - -# Whether to rewrite CSS URLs, at all -REWRITE_CSS_URLS = getattr(settings, 'REWRITE_CSS_URLS', True) -# Whether to rewrite CSS URLs relative to the respective source file -# or whether to use "absolute" URL rewriting (i.e., relative URLs are -# considered absolute with regards to STATICFILES_URL) -REWRITE_CSS_URLS_RELATIVE_TO_SOURCE = getattr(settings, - 'REWRITE_CSS_URLS_RELATIVE_TO_SOURCE', True) - -GENERATE_DATA_URIS = getattr(settings, 'GENERATE_DATA_URIS', False) -MAX_DATA_URI_FILE_SIZE = getattr(settings, 'MAX_DATA_URI_FILE_SIZE', 12 * 1024) -IGNORE_PATTERN = prepare_patterns(getattr(settings, - 'IGNORE_DATA_URI_PATTERNS', (r'.*\.htc',)), 'IGNORE_DATA_URI_PATTERNS') - - -class URLRewriter: - def __init__(self, base_path='./'): - self.base_path = base_path or './' - - def rewrite_urls(self, content): - return url_re.sub(self.fixurls, content) if REWRITE_CSS_URLS else content - - def fixurls(self, match): - url = original_url = match.group(1) - - hashid = '' - if '#' in url: - url, hashid = url.split('#', 1) - hashid = '#' + hashid - - url_query = None - if '?' in url: - url, url_query = url.split('?', 1) - - if ':' not in url and not url.startswith('/'): - rebased_url = posixpath.join(self.base_path, url) - rebased_url = posixpath.normpath(rebased_url) - try: - if GENERATE_DATA_URIS: - path = find_file(rebased_url) - if os.path.getsize(path) <= MAX_DATA_URI_FILE_SIZE and \ - not IGNORE_PATTERN.match(rebased_url): - data = b64encode(open(path, 'rb').read()) - mime = guess_type(path)[0] or 'application/octet-stream' - return f'url(data:{mime};base64,{data})' - - url = media_url(rebased_url) - except KeyError: - global_errors['filters.cssurl'][original_url] = 'URL not found: ' + original_url - else: - global_errors['filters.cssurl'].pop(original_url, None) - - if url_query is None: - url_query = '' - elif '?' in url: - url_query = '&' + url_query - else: - url_query = '?' + url_query - - return f'url({url}{url_query}{hashid})' - - -class CSSURL(Filter): - """Rewrites URLs relative to media folder ("absolute" rewriting).""" - def __init__(self, **kwargs): - super().__init__(**kwargs) - - assert self.filetype == 'css', ( - f'CSSURL only supports CSS output. ' - f'The parent filter expects "{self.filetype}".') - - def get_output(self, variation): - rewriter = URLRewriter() - for input in self.get_input(variation): - yield rewriter.rewrite_urls(input) - - def get_dev_output(self, name, variation): - content = super().get_dev_output(name, variation) - - return URLRewriter().rewrite_urls(content) - - -class CSSURLFileFilter(FileFilter): - """Rewrites URLs relative to input file's location.""" - def get_dev_output(self, name, variation): - content = super().get_dev_output(name, variation) - if not REWRITE_CSS_URLS_RELATIVE_TO_SOURCE: - return content - - return URLRewriter(posixpath.dirname(name)).rewrite_urls(content) diff --git a/mediagenerator/filters/i18n.py b/mediagenerator/filters/i18n.py deleted file mode 100644 index 740fd7661f..0000000000 --- a/mediagenerator/filters/i18n.py +++ /dev/null @@ -1,78 +0,0 @@ -from hashlib import sha1 - -from django.apps import apps -from django.conf import settings -from django.http import HttpRequest -from django.utils.encoding import smart_str -from django.utils import translation -from django.views.i18n import JavaScriptCatalog # javascript_catalog - -from mediagenerator.generators.bundles.base import Filter - -if settings.USE_I18N: - LANGUAGES = [code for code, _ in settings.LANGUAGES] -else: - LANGUAGES = (settings.LANGUAGE_CODE,) - - -class I18N(Filter): - takes_input = False - - def __init__(self, **kwargs): - super().__init__(**kwargs) - assert self.filetype == 'js', ( - f'I18N only supports compilation to js. ' - f'The parent filter expects "{self.filetype}".') - - def get_variations(self): - return {'language': LANGUAGES} - - def get_output(self, variation): - language = variation['language'] - yield self._generate(language) - - def get_dev_output(self, name, variation): - language = variation['language'] - assert language == name - - return self._generate(language) - - def get_dev_output_names(self, variation): - language = variation['language'] - content = self._generate(language) - hash = sha1(smart_str(content)).hexdigest() - yield language, hash - - def _generate(self, language): - language_bidi = language.split('-')[0] in settings.LANGUAGES_BIDI - - # Hybird FIX - Django1.10 version - # request = HttpRequest() - # request.GET['language'] = language - - # Add some JavaScript data - content = f'var LANGUAGE_CODE = "{language}";\n' - content += 'var LANGUAGE_BIDI = ' + \ - (language_bidi and 'true' or 'false') + ';\n' - - # content += javascript_catalog(request, - # packages=settings.INSTALLED_APPS).content - - # Hybird FIX - Django1.8 version - # content += javascript_catalog( - # request, - # packages=[app_config.name for app_config in apps.app_configs.values()], - # ).content - # Hybird FIX - Django1.10 version - translation.activate(language) - # content += JavaScriptCatalog(packages=[app_config.name for app_config in apps.app_configs.values()]) \ - # .get(HttpRequest()).content - content += JavaScriptCatalog(packages=[app_config.name for app_config in apps.app_configs.values()]) \ - .get(HttpRequest()).content.decode() - - # The hgettext() function just calls gettext() internally, but it won't get indexed by makemessages. - content += '\nwindow.hgettext = function(text) { return gettext(text); };\n' - # Add a similar hngettext() function - content += 'window.hngettext = function(singular, plural, count) { return ngettext(singular, plural, count); };\n' - - return content diff --git a/mediagenerator/filters/less.py b/mediagenerator/filters/less.py deleted file mode 100644 index c996322a82..0000000000 --- a/mediagenerator/filters/less.py +++ /dev/null @@ -1,197 +0,0 @@ -from hashlib import sha1 -import os -import posixpath -import sys -import re -from subprocess import Popen, PIPE - -from django.utils.encoding import smart_str -from django.conf import settings - -from mediagenerator.generators.bundles.base import Filter -from mediagenerator.utils import find_file, read_text_file, get_media_dirs - -_RE_FLAGS = re.MULTILINE | re.UNICODE -multi_line_comment_re = re.compile(r'/\*.*?\*/', _RE_FLAGS | re.DOTALL) -one_line_comment_re = re.compile(r'//.*', _RE_FLAGS) -import_re = re.compile(r'''@import\s* # import keyword - ["'] # opening quote - (.+?) # the module name - ["'] # closing quote - \s*; # statement terminator - ''', - _RE_FLAGS | re.VERBOSE) - -if not hasattr(os.path, 'relpath'): - # backport os.path.relpath from Python 2.6 - # Copyright (c) 2001-2010 Python Software Foundation; All Rights Reserved - - # Return the longest prefix of all list elements. - def commonprefix(m): - "Given a list of pathnames, returns the longest common leading component" - if not m: return '' - s1 = min(m) - s2 = max(m) - for i, c in enumerate(s1): - if c != s2[i]: - return s1[:i] - return s1 - - def relpath(path, start=os.path.curdir): - """Return a relative version of a path""" - - if not path: - raise ValueError("no path specified") - - start_list = [x for x in os.path.abspath(start).split(os.path.sep) if x] - path_list = [x for x in os.path.abspath(path).split(os.path.sep) if x] - - # Work out how much of the filepath is shared by start and path. - i = len(commonprefix([start_list, path_list])) - - rel_list = [os.path.pardir] * (len(start_list)-i) + path_list[i:] - if not rel_list: - return os.path.curdir - return os.path.join(*rel_list) - - os.path.relpath = relpath - - -class Less(Filter): - takes_input = False - - def __init__(self, **kwargs): - self.config(kwargs, path=(), main_module=None) - if isinstance(self.path, str): - self.path = (self.path,) - - # we need to be able to mutate self.path - self.path = [*self.path] - - super().__init__(**kwargs) - - assert self.filetype == 'css', ( - f'Less only supports compilation to CSS. ' - f'The parent filter expects "{self.filetype}".') - assert self.main_module, 'You must provide a main module' - - # lessc can't cope with nonexistent directories, so filter them - media_dirs = [directory for directory in get_media_dirs() - if os.path.exists(directory)] - self.path += tuple(media_dirs) - - self._compiled = None - self._compiled_hash = None - self._dependencies = {} - - @classmethod - def from_default(cls, name): - return {'main_module': name} - - def get_output(self, variation): - self._regenerate(debug=False) - yield self._compiled - - def get_dev_output(self, name, variation): - assert name == self.main_module + '.css' - self._regenerate(debug=True) - return self._compiled - - def get_dev_output_names(self, variation): - self._regenerate(debug=True) - yield self.main_module + '.css', self._compiled_hash - - def _regenerate(self, debug=False): - if self._dependencies: - for name, mtime in self._dependencies.items(): - path = self._find_file(name) - if not path or os.path.getmtime(path) != mtime: - # Just recompile everything - self._dependencies = {} - break - else: - # No changes - return - - modules = [self.main_module] - # get all the transitive dependencies of this module - while True: - if not modules: - break - - module_name = modules.pop() - path = self._find_file(module_name) - assert path, f'Could not find the Less module {module_name}' - mtime = os.path.getmtime(path) - self._dependencies[module_name] = mtime - - source = read_text_file(path) - dependencies = self._get_dependencies(source) - - for name in dependencies: - # Try relative import, first - transformed = posixpath.join(posixpath.dirname(module_name), name) - path = self._find_file(transformed) - if path: - name = transformed - else: - path = self._find_file(name) - - assert path, f'The Less module {module_name} could not find the dependency {name}' - - if name not in self._dependencies: - modules.append(name) - - main_module_path = self._find_file(self.main_module) - self._compiled = self._compile(main_module_path, debug=debug) - self._compiled_hash = sha1(smart_str(self._compiled)).hexdigest() - - def _compile(self, path, debug=False): - try: - relative_paths = [self._get_relative_path(directory) - for directory in self.path] - - shell = sys.platform == 'win32' - - cmd = Popen(['lessc', - '--include-path={}'.format(':'.join(relative_paths)), - path], - stdin=PIPE, stdout=PIPE, stderr=PIPE, - shell=shell, universal_newlines=True, - cwd=settings.PROJECT_ROOT) - output, error = cmd.communicate() - - # some lessc errors output to stdout, so we put both in the assertion message - assert cmd.wait() == 0, f'Less command returned bad result:\n{error}\n{output}' - return output.decode('utf-8') - except Exception as e: - raise ValueError( - "Failed to run Less compiler for this " - "file. Please confirm that the \"lessc\" application is " - "on your path and that you can run it from your own command " - "line.\n" - "Error was: {}".format(e) - ) - - def _get_dependencies(self, source): - clean_source = multi_line_comment_re.sub('\n', source) - clean_source = one_line_comment_re.sub('', clean_source) - - return [name for name in import_re.findall(clean_source) - if not name.endswith('.css')] - - def _find_file(self, name): - if not name.endswith('.less'): - name = name + '.less' - - return find_file(name, media_dirs=self.path) - - def _get_relative_path(self, abs_path): - """Given an absolute path, return a path relative to the - project root. - - >>> self._get_relative_path('/home/bob/bobs_project/subdir/foo') - 'subdir/foo' - - """ - return os.path.relpath(abs_path, settings.PROJECT_ROOT) diff --git a/mediagenerator/filters/media_url.py b/mediagenerator/filters/media_url.py deleted file mode 100644 index c4539de3a8..0000000000 --- a/mediagenerator/filters/media_url.py +++ /dev/null @@ -1,50 +0,0 @@ -from hashlib import sha1 -from json import dumps - -from django.utils.encoding import smart_str - -from mediagenerator.generators.bundles.base import Filter -from mediagenerator.utils import get_media_url_mapping - -_CODE = """ -_$MEDIA_URLS = %s; - -media_urls = function(key) { - var urls = _$MEDIA_URLS[key]; - if (!urls) - throw 'Could not resolve media url ' + key; - return urls; -}; - -media_url = function(key) { - var urls = media_urls(key); - if (urls.length == 1) - return urls[0]; - throw 'media_url() only works with keys that point to a single entry (e.g. an image), but not bundles. Use media_urls() instead.'; -}; -""".lstrip() - - -class MediaURL(Filter): - takes_input = False - - def __init__(self, **kwargs): - super().__init__(**kwargs) - assert self.filetype == 'js', ( - f'MediaURL only supports JS output. ' - f'The parent filter expects "{self.filetype}".') - - def get_output(self, variation): - yield self._compile() - - def get_dev_output(self, name, variation): - assert name == '.media_url.js' - return self._compile() - - def get_dev_output_names(self, variation): - content = self._compile() - hash = sha1(smart_str(content)).hexdigest() - yield '.media_url.js', hash - - def _compile(self): - return _CODE % dumps(get_media_url_mapping()) diff --git a/mediagenerator/filters/template.py b/mediagenerator/filters/template.py deleted file mode 100644 index 481e0cb264..0000000000 --- a/mediagenerator/filters/template.py +++ /dev/null @@ -1,19 +0,0 @@ -from django.template import Context, Template as DjangoTemplate - -from mediagenerator.generators.bundles.base import Filter - - -class Template(Filter): - def get_output(self, variation): - for input in self.get_input(variation): - yield self._template(input) - - def get_dev_output(self, name, variation): - content = super().get_dev_output(name, variation) - return self._template(content) - - def _template(self, content): - context = Context({}) - context.autoescape = self.filetype == 'html' - - return DjangoTemplate(content).render(context) diff --git a/mediagenerator/filters/yuicompressor.py b/mediagenerator/filters/yuicompressor.py deleted file mode 100644 index 1de8bd2800..0000000000 --- a/mediagenerator/filters/yuicompressor.py +++ /dev/null @@ -1,27 +0,0 @@ -from django.conf import settings - -from mediagenerator.generators.bundles.base import SubProcessFilter - - -class YUICompressor(SubProcessFilter): - def __init__(self, **kwargs): - super().__init__(**kwargs) - assert self.filetype in {'css', 'js'}, ( - f'YUICompressor only supports compilation to css and js. ' - f'The parent filter expects "{self.filetype}".') - - def get_output(self, variation): - for input in self.get_input(variation): - try: - compressor = settings.YUICOMPRESSOR_PATH - yield self.run_process([ - 'java', '-jar', compressor, '--charset', 'utf-8', '--type', self.filetype - ], input=input) - except Exception as e: - raise ValueError( - "Failed to execute Java VM or yuicompressor. " - "Please make sure that you have installed Java " - "and that it's in your PATH and that you've configured " - "YUICOMPRESSOR_PATH in your settings correctly.\n" - "Error was: {}".format(e) - ) diff --git a/mediagenerator/generators/__init__.py b/mediagenerator/generators/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/mediagenerator/generators/bundles/__init__.py b/mediagenerator/generators/bundles/__init__.py deleted file mode 100644 index df4bb7f489..0000000000 --- a/mediagenerator/generators/bundles/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .bundles import Bundles diff --git a/mediagenerator/generators/bundles/base.py b/mediagenerator/generators/bundles/base.py deleted file mode 100644 index a5922e9bce..0000000000 --- a/mediagenerator/generators/bundles/base.py +++ /dev/null @@ -1,240 +0,0 @@ -from hashlib import sha1 - -import os -# import sys - -from django.utils.encoding import smart_str - -from mediagenerator.utils import load_backend, find_file, read_text_file - -from .settings import DEFAULT_MEDIA_FILTERS - - -class Filter: - takes_input = True - - def __init__(self, **kwargs): - self.file_filter = FileFilter - self.config(kwargs, filetype=None, filter=None, - bundle=None, _from_default=None) - - # We assume that if this is e.g. a 'js' backend then all input must - # also be 'js'. Subclasses must override this if they expect a special - # input file type. Also, subclasses have to check if their file type - # is supported. - self.input_filetype = self.filetype - - if self.takes_input: - self.config(kwargs, input=()) - if not isinstance(self.input, (tuple, list)): - self.input = (self.input,) - self._input_filters = None - assert not kwargs, 'Unknown parameters: {}'.format(', '.join(kwargs.keys())) - - @classmethod - def from_default(cls, name): - return {'input': name} - - def should_use_default_filter(self, ext): - return ext != self._from_default - - def get_variations(self): - """ - Returns all possible variations that get generated by this filter. - - The result must be a dict whose values are tuples. - """ - return {} - - def get_output(self, variation): - """ - Yields content for each output item for the given variation. - """ - raise NotImplementedError() - - def get_dev_output(self, name, variation): - """ - Returns content for the given file name and variation in development mode. - """ - index, child = name.split('/', 1) - index = int(index) - filter = self.get_input_filters()[index] - return filter.get_dev_output(child, variation) - - def get_dev_output_names(self, variation): - """ - Yields file names for the given variation in development mode. - """ - # By default we simply return our input filters' file names - for index, filter in enumerate(self.get_input_filters()): - for name, hash in filter.get_dev_output_names(variation): - yield f'{index}/{name}', hash - - def get_input(self, variation): - """Yields contents for each input item.""" - for filter in self.get_input_filters(): - for input in filter.get_output(variation): - yield input - - def get_input_filters(self): - """Returns a Filter instance for each input item.""" - if not self.takes_input: - raise ValueError("The {} media filter doesn't take any input".format( - self.__class__.__name__, - )) - - if self._input_filters is not None: - return self._input_filters - - self._input_filters = [] - - for input in self.input: - if isinstance(input, dict): - filter = self.get_filter(input) - else: - filter = self.get_item(input) - - self._input_filters.append(filter) - - return self._input_filters - - def get_filter(self, config): - backend_class = load_backend(config.get('filter')) - return backend_class(filetype=self.input_filetype, bundle=self.bundle, - **config) - - def get_item(self, name): - ext = os.path.splitext(name)[1].lstrip('.') - if ext in DEFAULT_MEDIA_FILTERS and self.should_use_default_filter(ext): - backend_class = load_backend(DEFAULT_MEDIA_FILTERS[ext]) - else: - backend_class = self.file_filter - - config = backend_class.from_default(name) - config.setdefault( - 'filter', - f'{backend_class.__module__}.{backend_class.__name__}', - ) - config.setdefault('filetype', self.input_filetype) - config['bundle'] = self.bundle - # This is added to make really sure we don't instantiate the same - # filter in an endless loop. Normally, the child class should - # take care of this in should_use_default_filter(). - config.setdefault('_from_default', ext) - - return backend_class(**config) - - def _get_variations_with_input(self): - """Utility function to get variations including input variations""" - variations = self.get_variations() - if not self.takes_input: - return variations - - for filter in self.get_input_filters(): - subvariations = filter._get_variations_with_input() - for k, v in subvariations.items(): - if k in variations and v != variations[k]: - raise ValueError( - 'Conflicting variations for "{}": {!r} != {!r}'.format( - k, v, variations[k], - )) - variations.update(subvariations) - return variations - - def config(self, init, **defaults): - for key in defaults: - setattr(self, key, init.pop(key, defaults[key])) - - -class FileFilter(Filter): - """A filter that just returns the given file.""" - takes_input = False - - def __init__(self, **kwargs): - self.config(kwargs, name=None) - self.mtime = self.hash = None - super().__init__(**kwargs) - - @classmethod - def from_default(cls, name): - return {'name': name} - - def get_output(self, variation): - yield self.get_dev_output(self.name, variation) - - def get_dev_output(self, name, variation): - assert name == self.name, ( - f'''File name "{name}" doesn't match the one in GENERATE_MEDIA ("{self.name}")''' - ) - return read_text_file(self._get_path()) - - def get_dev_output_names(self, variation): - path = self._get_path() - mtime = os.path.getmtime(path) - if mtime != self.mtime: - output = self.get_dev_output(self.name, variation) - hash = sha1(smart_str(output)).hexdigest() - else: - hash = self.hash - yield self.name, hash - - def _get_path(self): - path = find_file(self.name) - assert path, f"""File name "{self.name}" doesn't exist.""" - return path - - -class RawFileFilter(FileFilter): - takes_input = False - - def __init__(self, **kwargs): - self.config(kwargs, path=None) - super().__init__(**kwargs) - - def get_dev_output(self, name, variation): - assert name == self.name, ( - f'''File name "{name}" doesn't match the one in GENERATE_MEDIA ("{self.name}")''') - return read_text_file(self.path) - - def get_dev_output_names(self, variation): - mtime = os.path.getmtime(self.path) - if mtime != self.mtime: - output = self.get_dev_output(self.name, variation) - hash = sha1(smart_str(output)).hexdigest() - else: - hash = self.hash - - yield self.name, hash - - -class SubProcessFilter(Filter): - def run_process(self, command, input=None): - # We import this here, so App Engine Helper users don't get import errors. - from subprocess import Popen, PIPE - - # universal_newlines enables text mode for stdin. That cause an issue - # in windows which use cp1252 as default for western europe. - # - # The "encoding" argument in python 3.6 fix it by forcing the - # right encoding to io.TextIOWrapper (see Popen code). - # - # # In python 3.5 removing universal_newlines and encode input as utf-8 - # # bytes fix the problem in a different way. - # if sys.version_info < (3, 6): - # cmd = Popen(command, - # stdin=PIPE, stdout=PIPE, stderr=PIPE) - # output, error = cmd.communicate(input.encode('utf-8')) - # else: - # cmd = Popen(command, - # stdin=PIPE, stdout=PIPE, stderr=PIPE, encoding='utf-8', - # universal_newlines=True) - # output, error = cmd.communicate(input) - cmd = Popen(command, - stdin=PIPE, stdout=PIPE, stderr=PIPE, encoding='utf-8', - universal_newlines=True, - ) - output, error = cmd.communicate(input) - - assert cmd.wait() == 0, f'Command returned bad result:\n{error}' - - return output diff --git a/mediagenerator/generators/bundles/bundles.py b/mediagenerator/generators/bundles/bundles.py deleted file mode 100644 index feec203f2d..0000000000 --- a/mediagenerator/generators/bundles/bundles.py +++ /dev/null @@ -1,84 +0,0 @@ -from itertools import product -from mimetypes import guess_type -import os - -from .settings import MEDIA_BUNDLES -from .utils import _load_root_filter, _get_key - -from mediagenerator.base import Generator - - -class Bundles(Generator): - def get_output(self): - for items in MEDIA_BUNDLES: - bundle = items[0] - backend = _load_root_filter(bundle) - variations = backend._get_variations_with_input() - if not variations: - name, content = self.generate_file(backend, bundle, {}) - yield _get_key(bundle), name, content - else: - # Generate media files for all variation combinations - combinations = product(*(variations[key] - for key in sorted(variations.keys()))) - for combination in combinations: - variation_map = [*zip(sorted(variations.keys()), combination)] - variation = dict(variation_map) - name, content = self.generate_file(backend, bundle, - variation, combination) - - key = _get_key(bundle, variation_map) - - yield key, name, content - - def get_dev_output(self, name): - bundle_combination, path = name.split('|', 1) - parts = bundle_combination.split('--') - bundle = parts[0] - combination = parts[1:] - root = _load_root_filter(bundle) - variations = root._get_variations_with_input() - variation = dict(zip(sorted(variations.keys()), combination)) - content = root.get_dev_output(path, variation) - mimetype = guess_type(bundle)[0] - - return content, mimetype - - def get_dev_output_names(self): - for items in MEDIA_BUNDLES: - bundle = items[0] - backend = _load_root_filter(bundle) - variations = backend._get_variations_with_input() - if not variations: - for name, hash in backend.get_dev_output_names({}): - url = f'{bundle}|{name}' - yield _get_key(bundle), url, hash - else: - # Generate media files for all variation combinations - combinations = product(*(variations[key] - for key in sorted(variations.keys()))) - for combination in combinations: - variation_map = zip(sorted(variations.keys()), combination) - variation = dict(variation_map) - for name, hash in backend.get_dev_output_names(variation): - url = '{}--{}|{}'.format(bundle, '--'.join(combination), name) - yield _get_key(bundle, variation_map), url, hash - - def generate_file(self, backend, bundle, variation, combination=()): - print(f'Generating {bundle} with variation {variation !r}') - - output = [*backend.get_output(variation)] - if len(output) == 0: - output = ('',) - assert len(output) == 1, \ - f'Media bundle "{bundle}" would result in multiple output files' - content = output[0] - - combination = '--'.join(combination) - if combination: - combination = '--' + combination - - base, ext = os.path.splitext(bundle) - filename = base + combination + ext - - return filename, content diff --git a/mediagenerator/generators/bundles/settings.py b/mediagenerator/generators/bundles/settings.py deleted file mode 100644 index 62391acf41..0000000000 --- a/mediagenerator/generators/bundles/settings.py +++ /dev/null @@ -1,21 +0,0 @@ -from django.conf import settings - -DEFAULT_MEDIA_FILTERS = getattr(settings, 'DEFAULT_MEDIA_FILTERS', { - 'ccss': 'mediagenerator.filters.clever.CleverCSS', - 'css': 'mediagenerator.filters.cssurl.CSSURLFileFilter', - 'html': 'mediagenerator.filters.template.Template', - 'less': 'mediagenerator.filters.less.Less', -}) - -ROOT_MEDIA_FILTERS = getattr(settings, 'ROOT_MEDIA_FILTERS', {}) - -# These are applied in addition to ROOT_MEDIA_FILTERS. -# The separation is done because we don't want users to -# always specify the default filters when they merely want -# to configure YUICompressor or Closure. -BASE_ROOT_MEDIA_FILTERS = getattr(settings, 'BASE_ROOT_MEDIA_FILTERS', { - '*': 'mediagenerator.filters.concat.Concat', - 'css': 'mediagenerator.filters.cssurl.CSSURL', -}) - -MEDIA_BUNDLES = getattr(settings, 'MEDIA_BUNDLES', ()) diff --git a/mediagenerator/generators/bundles/utils.py b/mediagenerator/generators/bundles/utils.py deleted file mode 100644 index 1424ae12dc..0000000000 --- a/mediagenerator/generators/bundles/utils.py +++ /dev/null @@ -1,87 +0,0 @@ -import os - -from .settings import ROOT_MEDIA_FILTERS, MEDIA_BUNDLES, BASE_ROOT_MEDIA_FILTERS - -from mediagenerator.utils import load_backend, media_urls - -_cache = {} - - -def _load_root_filter(bundle): - if bundle not in _cache: - _cache[bundle] = _load_root_filter_uncached(bundle) - - return _cache[bundle] - - -def _get_root_filters_list(filetype): - root_filters = () - filetypes = (filetype, '*') - - for filters_spec in (BASE_ROOT_MEDIA_FILTERS, ROOT_MEDIA_FILTERS): - for filetype in filetypes: - filters = filters_spec.get(filetype, ()) - - if not isinstance(filters, (tuple, list)): - filters = (filters, ) - - root_filters += tuple(filters) - - return root_filters - - -def _load_root_filter_uncached(bundle): - for items in MEDIA_BUNDLES: - if items[0] == bundle: - input = items[1:] - break - else: - raise ValueError(f'Could not find media bundle "{bundle}"') - - filetype = os.path.splitext(bundle)[-1].lstrip('.') - root_filters = _get_root_filters_list(filetype) - backend_class = load_backend(root_filters[-1]) - - for filter in reversed(root_filters[:-1]): - input = [{'filter': filter, 'input': input}] - - return backend_class(filter=root_filters[-1], - filetype=filetype, - bundle=bundle, - input=input, - ) - - -def _get_key(bundle, variation_map=None): - if variation_map: - bundle += '?' + '&'.join('='.join(item) for item in variation_map) - - return bundle - - -def _render_include_media(bundle, variation): - variation = variation.copy() - filetype = os.path.splitext(bundle)[-1].lstrip('.') - - # The "media" variation is special and defines CSS media types - media_types = None - if filetype == 'css': - media_types = variation.pop('media', None) - - variation_map = tuple((key, variation[key]) for key in sorted(variation.keys())) - - urls = media_urls(_get_key(bundle, variation_map)) - ctxt = {} - - if filetype == 'css': - if media_types: - tag = '' - ctxt['media'] = media_types - else: - tag = '' - elif filetype == 'js': - tag = '' - else: - raise ValueError("""Don't know how to include file type "{}".""".format(filetype)) - - return '\n'.join(tag.format(url=url, **ctxt) for url in urls) diff --git a/mediagenerator/generators/copyfiles.py b/mediagenerator/generators/copyfiles.py deleted file mode 100644 index 20534bb38d..0000000000 --- a/mediagenerator/generators/copyfiles.py +++ /dev/null @@ -1,47 +0,0 @@ -from hashlib import sha1 -from mimetypes import guess_type -import os - -from django.conf import settings - -from mediagenerator.base import Generator -from mediagenerator.utils import get_media_dirs, find_file, prepare_patterns - -COPY_MEDIA_FILETYPES = getattr(settings, 'COPY_MEDIA_FILETYPES', { - 'gif', 'jpg', 'jpeg', 'png', 'svg', 'svgz', 'ico', 'swf', - 'ttf', 'otf', 'eot', 'woff', -}) -IGNORE_PATTERN = prepare_patterns(getattr(settings, 'IGNORE_MEDIA_COPY_PATTERNS', ()), - 'IGNORE_MEDIA_COPY_PATTERNS') - - -class CopyFiles(Generator): - def get_dev_output(self, name): - path = find_file(name) - - with open(path, 'rb') as fp: - content = fp.read() - - mimetype = guess_type(path)[0] - - return content, mimetype - - def get_dev_output_names(self): - media_files = {} - for root in get_media_dirs(): - self.collect_copyable_files(media_files, root) - - for name, source in media_files.items(): - with open(source, 'rb') as fp: - hash = sha1(fp.read()).hexdigest() - - yield name, name, hash - - def collect_copyable_files(self, media_files, root): - for root_path, dirs, files in os.walk(root, followlinks=True): - for file in files: - ext = os.path.splitext(file)[1].lstrip('.') - path = os.path.join(root_path, file) - media_path = path[len(root) + 1:].replace(os.sep, '/') - if ext in COPY_MEDIA_FILETYPES and not IGNORE_PATTERN.match(media_path): - media_files[media_path] = path diff --git a/mediagenerator/generators/manifest.py b/mediagenerator/generators/manifest.py deleted file mode 100644 index dda18dde61..0000000000 --- a/mediagenerator/generators/manifest.py +++ /dev/null @@ -1,56 +0,0 @@ -from django.conf import settings -from django.template.loader import render_to_string - -from mediagenerator.base import Generator -from mediagenerator.utils import get_media_mapping, prepare_patterns - -OFFLINE_MANIFEST = getattr(settings, 'OFFLINE_MANIFEST', {}) -if isinstance(OFFLINE_MANIFEST, str): - OFFLINE_MANIFEST = {OFFLINE_MANIFEST: '.*'} - - -def get_tuple(data, name, default=()): - result = data.get(name, default) - - return (result,) if isinstance(result, str) else result - - -class Manifest(Generator): - def generate_version(self, key, url, content): - return None - - def get_dev_output(self, name): - config = OFFLINE_MANIFEST[name] - if isinstance(config, (tuple, list)): - config = {'cache': config} - elif isinstance(config, str): - config = {'cache': (config,)} - - cache_pattern = prepare_patterns(get_tuple(config, 'cache', '.*'), - f'OFFLINE_MANIFEST[{name}]', - ) - exclude = prepare_patterns(get_tuple(config, 'exclude'), - f"OFFLINE_MANIFEST[{name}]['exclude']", - ) - cache = set() - for item in get_media_mapping().keys(): - if cache_pattern.match(item) and not exclude.match(item): - cache.add(item) - cache -= set(OFFLINE_MANIFEST.keys()) - - network = get_tuple(config, 'network', ('*',)) - fallback = get_tuple(config, 'fallback') - - template = get_tuple(config, 'template') + ( - 'mediagenerator/manifest/' + name, - 'mediagenerator/manifest/base.manifest' - ) - - content = render_to_string(template, { - 'cache': cache, 'network': network, 'fallback': fallback, - }) - return content, 'text/cache-manifest' - - def get_dev_output_names(self): - for name in OFFLINE_MANIFEST: - yield name, name, None diff --git a/mediagenerator/management/__init__.py b/mediagenerator/management/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/mediagenerator/management/commands/__init__.py b/mediagenerator/management/commands/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/mediagenerator/management/commands/generatemedia.py b/mediagenerator/management/commands/generatemedia.py deleted file mode 100644 index bfd5b1dd4c..0000000000 --- a/mediagenerator/management/commands/generatemedia.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.core.management.base import BaseCommand - -from ...api import generate_media - - -class Command(BaseCommand): - help = 'Combines and compresses your media files and saves them in _generated_media.' - leave_locale_alone = True - requires_system_checks = False - - def handle(self, **options): - generate_media() diff --git a/mediagenerator/settings.py b/mediagenerator/settings.py deleted file mode 100644 index 7701a0e918..0000000000 --- a/mediagenerator/settings.py +++ /dev/null @@ -1,42 +0,0 @@ -from os import path as os_path -import sys - -from django.conf import settings -from django.utils.encoding import force_text - -__main__ = sys.modules.get('__main__') - -_map_file_path = '_generated_media_names.py' -_media_dir = '_generated_media' -# __main__ is not guaranteed to have the __file__ attribute -if hasattr(__main__, '__file__'): - _root = os_path.dirname(__main__.__file__) - _map_file_path = os_path.join(_root, _map_file_path) - _media_dir = os_path.join(_root, _media_dir) - -GENERATED_MEDIA_DIR = os_path.abspath(getattr(settings, 'GENERATED_MEDIA_DIR', _media_dir)) -GENERATED_MEDIA_NAMES_MODULE = getattr(settings, 'GENERATED_MEDIA_NAMES_MODULE', - '_generated_media_names' - ) -GENERATED_MEDIA_NAMES_FILE = os_path.abspath( - getattr(settings, 'GENERATED_MEDIA_NAMES_FILE', _map_file_path) -) - -PRODUCTION_MEDIA_URL = getattr(settings, 'PRODUCTION_MEDIA_URL', - getattr(settings, 'STATIC_URL', settings.MEDIA_URL) - ) - -MEDIA_GENERATORS = getattr(settings, 'MEDIA_GENERATORS', ( - 'mediagenerator.generators.copyfiles.CopyFiles', - 'mediagenerator.generators.bundles.Bundles', - 'mediagenerator.generators.manifest.Manifest', -)) - -GLOBAL_MEDIA_DIRS = [ - os_path.normcase(os_path.normpath(force_text(path))) - for path in getattr(settings, 'GLOBAL_MEDIA_DIRS', - getattr(settings, 'STATICFILES_DIRS', ()) - ) -] - -IGNORE_APP_MEDIA_DIRS = getattr(settings, 'IGNORE_APP_MEDIA_DIRS', ('django.contrib.admin',)) diff --git a/mediagenerator/templates/mediagenerator/manifest/base.manifest b/mediagenerator/templates/mediagenerator/manifest/base.manifest deleted file mode 100644 index 0e6f578ffd..0000000000 --- a/mediagenerator/templates/mediagenerator/manifest/base.manifest +++ /dev/null @@ -1,25 +0,0 @@ -CACHE MANIFEST -{% load media %} - -CACHE: -{% block cache %} -{% for name in cache %} -{% for url in name|media_urls %} -{{ url }} -{% endfor %} -{% endfor %} -{% endblock cache %} - -NETWORK: -{% block network %} -{% for url in network %} -{{ url }} -{% endfor %} -{% endblock %} - -FALLBACK: -{% block fallback %} -{% for source, target in fallback.items %} -{{ source }} {{ target }} -{% endfor %} -{% endblock %} diff --git a/mediagenerator/templatetags/__init__.py b/mediagenerator/templatetags/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/mediagenerator/templatetags/media.py b/mediagenerator/templatetags/media.py deleted file mode 100644 index 8681e09775..0000000000 --- a/mediagenerator/templatetags/media.py +++ /dev/null @@ -1,50 +0,0 @@ -from django import template - -from mediagenerator.generators.bundles.utils import _render_include_media -from mediagenerator import utils - -register = template.Library() - - -class MediaNode(template.Node): - def __init__(self, bundle, variation): - self.bundle = bundle - self.variation = variation - - def render(self, context): - bundle = template.Variable(self.bundle).resolve(context) - variation = {} - for key, value in self.variation.items(): - variation[key] = template.Variable(value).resolve(context) - - return _render_include_media(bundle, variation) - - -@register.tag -def include_media(parser, token): - try: - contents = token.split_contents() - bundle = contents[1] - variation_spec = contents[2:] - variation = {} - for item in variation_spec: - key, value = item.split('=') - variation[key] = value - except (ValueError, AssertionError, IndexError): - raise template.TemplateSyntaxError( - '%r could not parse the arguments: the first argument must be the ' - 'the name of a bundle in the MEDIA_BUNDLES setting, and the ' - 'following arguments specify the media variation (if you have ' - 'any) and must be of the form key="value"' % contents[0]) - - return MediaNode(bundle, variation) - - -@register.simple_tag -def media_url(url): - return utils.media_url(url) - - -@register.filter -def media_urls(url): - return utils.media_urls(url) diff --git a/mediagenerator/utils.py b/mediagenerator/utils.py deleted file mode 100644 index 1f18a1d4b8..0000000000 --- a/mediagenerator/utils.py +++ /dev/null @@ -1,178 +0,0 @@ -# -*- coding: utf-8 -*- - -from os import path as os_path -from importlib import import_module -import re - -from django.apps import apps -from django.conf import settings -from django.core.exceptions import ImproperlyConfigured -from django.utils.http import urlquote - -from .settings import ( - GLOBAL_MEDIA_DIRS, PRODUCTION_MEDIA_URL, - IGNORE_APP_MEDIA_DIRS, MEDIA_GENERATORS, - GENERATED_MEDIA_NAMES_MODULE, -) - -try: - NAMES = import_module(GENERATED_MEDIA_NAMES_MODULE).NAMES -except (ImportError, AttributeError): - NAMES = None - -_backends_cache: dict = {} -_media_dirs_cache: list = [] - -_generators_cache: list = [] -_generated_names: dict = {} -_backend_mapping: dict = {} - - -def _load_generators(): - if not _generators_cache: - for name in MEDIA_GENERATORS: - backend = load_backend(name)() - _generators_cache.append(backend) - - return _generators_cache - - -def _refresh_dev_names(): - _generated_names.clear() - _backend_mapping.clear() - - for backend in _load_generators(): - for key, url, hash in backend.get_dev_output_names(): - versioned_url = urlquote(url) - - if hash: - versioned_url += '?version=' + hash - - _generated_names.setdefault(key, []) - _generated_names[key].append(versioned_url) - _backend_mapping[url] = backend - - -class _MatchNothing: - def match(self, content): - return False - - -def prepare_patterns(patterns, setting_name): - """Helper function for patter-matching settings.""" - if isinstance(patterns, str): - patterns = (patterns,) - - if not patterns: - return _MatchNothing() - - # First validate each pattern individually - for pattern in patterns: - try: - re.compile(pattern, re.U) - except re.error: - raise ValueError(f'Pattern "{pattern}" cannot be compiled in {setting_name}') - - # Now return a combined pattern - return re.compile('^(' + ')$|^('.join(patterns) + ')$', re.U) - - -def get_production_mapping(): - if NAMES is None: - raise ImportError( - f'Could not import {GENERATED_MEDIA_NAMES_MODULE}. ' - f'This file is needed for production mode. ' - f'Please run manage.py generatemedia to create it.' - ) - - return NAMES - - -def get_media_mapping(): - return get_production_mapping() # TODO: inline ? - - -def get_media_url_mapping(): - base_url = PRODUCTION_MEDIA_URL - mapping = {} - - for key, value in get_media_mapping().items(): - if isinstance(value, str): - value = (value,) - mapping[key] = [base_url + url for url in value] - - return mapping - - -def media_urls(key, refresh=False): - return [PRODUCTION_MEDIA_URL + get_production_mapping()[key]] - - -def media_url(key, refresh=False): - urls = media_urls(key, refresh=refresh) - if len(urls) == 1: - return urls[0] - - raise ValueError( - 'media_url() only works with URLs that contain exactly ' - 'one file. Use media_urls() (or {% include_media %} in templates) instead.' - ) - - -def get_media_dirs(): - if not _media_dirs_cache: - if not apps.ready: - apps.populate(settings.INSTALLED_APPS) - - media_dirs = GLOBAL_MEDIA_DIRS[:] - for app in apps.get_app_configs(): - if app.name in IGNORE_APP_MEDIA_DIRS: - continue - - media_dirs.append(os_path.join(app.path, u'static')) - media_dirs.append(os_path.join(app.path, u'media')) - - _media_dirs_cache.extend(media_dirs) - - return _media_dirs_cache - - -def find_file(name, media_dirs=None): - if media_dirs is None: - media_dirs = get_media_dirs() - - for root in media_dirs: - path = os_path.normpath(os_path.join(root, name)) - if os_path.isfile(path): - return path - - -# TODO: remove & use "with" directly ? -def read_text_file(path): - with open(path, 'r', encoding='utf-8') as fp: - return fp.read() - - -def load_backend(backend): - if backend not in _backends_cache: - _backends_cache[backend] = _load_backend(backend) - - return _backends_cache[backend] - - -def _load_backend(path): - module_name, attr_name = path.rsplit('.', 1) - - try: - mod = import_module(module_name) - except (ImportError, ValueError) as e: - raise ImproperlyConfigured( - f'Error importing backend module {module_name}: "{e}"' - ) - - try: - return getattr(mod, attr_name) - except AttributeError: - raise ImproperlyConfigured( - f'Module "{module_name}" does not define a "{attr_name}" backend' - ) From 184112f5fd45c45785b466deadde6257a7e941a2 Mon Sep 17 00:00:00 2001 From: Hugo Smett Date: Fri, 23 Oct 2020 12:56:22 +0200 Subject: [PATCH 2/5] Remove MediaGeneratorConfig --- creme/creme_core/apps.py | 52 ---------------------------------------- creme/settings.py | 1 - 2 files changed, 53 deletions(-) diff --git a/creme/creme_core/apps.py b/creme/creme_core/apps.py index 9723876428..bd3d15b584 100644 --- a/creme/creme_core/apps.py +++ b/creme/creme_core/apps.py @@ -88,58 +88,6 @@ def __get_extending_app_configs(self): AppConfig.get_extending_app_configs = __get_extending_app_configs -# Hooking of AppConfig [end] ------------ - -# TODO: remove when MediaGenerator is not used -class MediaGeneratorConfig(AppConfig): - name = 'mediagenerator' - verbose_name = 'Media generator' # _('Media generator') - - def ready(self): - self._build_MEDIA_BUNDLES() - # self._fix_i18n_filter() - - def _build_MEDIA_BUNDLES(self): - is_installed = apps.is_installed - - MEDIA_BUNDLES = [ - settings.CREME_I18N_JS, - [*settings.CREME_LIB_JS, - *(js for app, js in settings.CREME_OPTLIB_JS if is_installed(app)), - ], - [*settings.CREME_CORE_JS, - *(js for app, js in settings.CREME_OPT_JS if is_installed(app)), - ], - ] - - if settings.FORCE_JS_TESTVIEW: - MEDIA_BUNDLES.append(settings.TEST_CREME_LIB_JS) - MEDIA_BUNDLES.append( - [*settings.TEST_CREME_CORE_JS, - *(js for app, js in settings.TEST_CREME_OPT_JS if is_installed(app)), - ] - ) - - MEDIA_BUNDLES += settings.CREME_OPT_MEDIA_BUNDLES - - CREME_CSS = [ - *settings.CREME_CORE_CSS, - *(css for app, css in settings.CREME_OPT_CSS if is_installed(app)), - ] - MEDIA_BUNDLES.extend( - [ - theme_dir + CREME_CSS[0], - *( - css_file if isinstance(css_file, dict) else f'{theme_dir}/{css_file}' - for css_file in CREME_CSS[1:] - ), - ] for theme_dir, theme_vb_name in settings.THEMES - ) - - settings.CREME_CSS = CREME_CSS # For compatibility (should not be useful) - settings.MEDIA_BUNDLES = MEDIA_BUNDLES - - class ContentTypesConfig(VanillaContentTypesConfig): def ready(self): super().ready() diff --git a/creme/settings.py b/creme/settings.py index 37619639dc..1a596794ff 100644 --- a/creme/settings.py +++ b/creme/settings.py @@ -282,7 +282,6 @@ # EXTERNAL APPS 'formtools', - 'creme.creme_core.apps.MediaGeneratorConfig', # It manages js/css/images ] INSTALLED_CREME_APPS = [ From 9ec3f7385f80250fe4db7ef704649cbef489cd00 Mon Sep 17 00:00:00 2001 From: Hugo Smett Date: Fri, 23 Oct 2020 12:56:50 +0200 Subject: [PATCH 3/5] Setup django-pipeline --- creme/settings.py | 1 + setup.cfg | 1 + 2 files changed, 2 insertions(+) diff --git a/creme/settings.py b/creme/settings.py index 1a596794ff..60a64757d5 100644 --- a/creme/settings.py +++ b/creme/settings.py @@ -282,6 +282,7 @@ # EXTERNAL APPS 'formtools', + 'pipeline' ] INSTALLED_CREME_APPS = [ diff --git a/setup.cfg b/setup.cfg index 783943ada5..2bfdbc7316 100644 --- a/setup.cfg +++ b/setup.cfg @@ -32,6 +32,7 @@ include_package_data = True packages = find: install_requires = django ~=2.2.16 + django-pipeline ~=2.0.5 redis ~=3.4.1 Pillow ~=7.2.0 python-dateutil ~=2.8.1 From 2620f154d6749c7724711358c73039a973d19810 Mon Sep 17 00:00:00 2001 From: Hugo Smett Date: Fri, 23 Oct 2020 15:21:06 +0200 Subject: [PATCH 4/5] Move tiny_mce to static files --- creme/{media => static}/tiny_mce/jquery.tinymce.js | 0 creme/{media => static}/tiny_mce/langs/en.js | 0 creme/{media => static}/tiny_mce/langs/fr.js | 0 creme/{media => static}/tiny_mce/license.txt | 0 .../tiny_mce/plugins/advhr/css/advhr.css | 0 .../tiny_mce/plugins/advhr/editor_plugin.js | 0 .../tiny_mce/plugins/advhr/editor_plugin_src.js | 0 .../tiny_mce/plugins/advhr/js/rule.js | 0 .../tiny_mce/plugins/advhr/langs/en_dlg.js | 0 .../tiny_mce/plugins/advhr/langs/fr_dlg.js | 0 .../tiny_mce/plugins/advhr/rule.htm | 0 .../tiny_mce/plugins/advimage/css/advimage.css | 0 .../tiny_mce/plugins/advimage/editor_plugin.js | 0 .../tiny_mce/plugins/advimage/editor_plugin_src.js | 0 .../tiny_mce/plugins/advimage/image.htm | 0 .../tiny_mce/plugins/advimage/img/sample.gif | Bin .../tiny_mce/plugins/advimage/js/image.js | 0 .../tiny_mce/plugins/advimage/langs/en_dlg.js | 0 .../tiny_mce/plugins/advimage/langs/fr_dlg.js | 0 .../tiny_mce/plugins/advlink/css/advlink.css | 0 .../tiny_mce/plugins/advlink/editor_plugin.js | 0 .../tiny_mce/plugins/advlink/editor_plugin_src.js | 0 .../tiny_mce/plugins/advlink/js/advlink.js | 0 .../tiny_mce/plugins/advlink/langs/en_dlg.js | 0 .../tiny_mce/plugins/advlink/langs/fr_dlg.js | 0 .../tiny_mce/plugins/advlink/link.htm | 0 .../tiny_mce/plugins/advlist/editor_plugin.js | 0 .../tiny_mce/plugins/advlist/editor_plugin_src.js | 0 .../tiny_mce/plugins/autoresize/editor_plugin.js | 0 .../plugins/autoresize/editor_plugin_src.js | 0 .../tiny_mce/plugins/autosave/editor_plugin.js | 0 .../tiny_mce/plugins/autosave/editor_plugin_src.js | 0 .../tiny_mce/plugins/autosave/langs/en.js | 0 .../tiny_mce/plugins/bbcode/editor_plugin.js | 0 .../tiny_mce/plugins/bbcode/editor_plugin_src.js | 0 .../tiny_mce/plugins/contextmenu/editor_plugin.js | 0 .../plugins/contextmenu/editor_plugin_src.js | 0 .../plugins/directionality/editor_plugin.js | 0 .../plugins/directionality/editor_plugin_src.js | 0 .../tiny_mce/plugins/emotions/editor_plugin.js | 0 .../tiny_mce/plugins/emotions/editor_plugin_src.js | 0 .../tiny_mce/plugins/emotions/emotions.htm | 0 .../tiny_mce/plugins/emotions/img/smiley-cool.gif | Bin .../tiny_mce/plugins/emotions/img/smiley-cry.gif | Bin .../plugins/emotions/img/smiley-embarassed.gif | Bin .../plugins/emotions/img/smiley-foot-in-mouth.gif | Bin .../tiny_mce/plugins/emotions/img/smiley-frown.gif | Bin .../plugins/emotions/img/smiley-innocent.gif | Bin .../tiny_mce/plugins/emotions/img/smiley-kiss.gif | Bin .../plugins/emotions/img/smiley-laughing.gif | Bin .../plugins/emotions/img/smiley-money-mouth.gif | Bin .../tiny_mce/plugins/emotions/img/smiley-sealed.gif | Bin .../tiny_mce/plugins/emotions/img/smiley-smile.gif | Bin .../plugins/emotions/img/smiley-surprised.gif | Bin .../plugins/emotions/img/smiley-tongue-out.gif | Bin .../plugins/emotions/img/smiley-undecided.gif | Bin .../tiny_mce/plugins/emotions/img/smiley-wink.gif | Bin .../tiny_mce/plugins/emotions/img/smiley-yell.gif | Bin .../tiny_mce/plugins/emotions/js/emotions.js | 0 .../tiny_mce/plugins/emotions/langs/en_dlg.js | 0 .../tiny_mce/plugins/emotions/langs/fr_dlg.js | 0 .../tiny_mce/plugins/example/dialog.htm | 0 .../tiny_mce/plugins/example/editor_plugin.js | 0 .../tiny_mce/plugins/example/editor_plugin_src.js | 0 .../tiny_mce/plugins/example/img/example.gif | Bin .../tiny_mce/plugins/example/js/dialog.js | 0 .../tiny_mce/plugins/example/langs/en.js | 0 .../tiny_mce/plugins/example/langs/en_dlg.js | 0 .../tiny_mce/plugins/fullpage/css/fullpage.css | 0 .../tiny_mce/plugins/fullpage/editor_plugin.js | 0 .../tiny_mce/plugins/fullpage/editor_plugin_src.js | 0 .../tiny_mce/plugins/fullpage/fullpage.htm | 0 .../tiny_mce/plugins/fullpage/js/fullpage.js | 0 .../tiny_mce/plugins/fullpage/langs/en_dlg.js | 0 .../tiny_mce/plugins/fullpage/langs/fr_dlg.js | 0 .../tiny_mce/plugins/fullscreen/editor_plugin.js | 0 .../plugins/fullscreen/editor_plugin_src.js | 0 .../tiny_mce/plugins/fullscreen/fullscreen.htm | 0 .../tiny_mce/plugins/iespell/editor_plugin.js | 0 .../tiny_mce/plugins/iespell/editor_plugin_src.js | 0 .../tiny_mce/plugins/inlinepopups/editor_plugin.js | 0 .../plugins/inlinepopups/editor_plugin_src.js | 0 .../inlinepopups/skins/clearlooks2/img/alert.gif | Bin .../inlinepopups/skins/clearlooks2/img/button.gif | Bin .../inlinepopups/skins/clearlooks2/img/buttons.gif | Bin .../inlinepopups/skins/clearlooks2/img/confirm.gif | Bin .../inlinepopups/skins/clearlooks2/img/corners.gif | Bin .../skins/clearlooks2/img/horizontal.gif | Bin .../inlinepopups/skins/clearlooks2/img/vertical.gif | Bin .../inlinepopups/skins/clearlooks2/window.css | 0 .../tiny_mce/plugins/inlinepopups/template.htm | 0 .../plugins/insertdatetime/editor_plugin.js | 0 .../plugins/insertdatetime/editor_plugin_src.js | 0 .../tiny_mce/plugins/layer/editor_plugin.js | 0 .../tiny_mce/plugins/layer/editor_plugin_src.js | 0 .../tiny_mce/plugins/legacyoutput/editor_plugin.js | 0 .../plugins/legacyoutput/editor_plugin_src.js | 0 .../tiny_mce/plugins/media/css/media.css | 0 .../tiny_mce/plugins/media/editor_plugin.js | 0 .../tiny_mce/plugins/media/editor_plugin_src.js | 0 .../tiny_mce/plugins/media/js/embed.js | 0 .../tiny_mce/plugins/media/js/media.js | 0 .../tiny_mce/plugins/media/langs/en_dlg.js | 0 .../tiny_mce/plugins/media/langs/fr_dlg.js | 0 .../tiny_mce/plugins/media/media.htm | 0 .../tiny_mce/plugins/media/moxieplayer.swf | Bin .../tiny_mce/plugins/nonbreaking/editor_plugin.js | 0 .../plugins/nonbreaking/editor_plugin_src.js | 0 .../tiny_mce/plugins/noneditable/editor_plugin.js | 0 .../plugins/noneditable/editor_plugin_src.js | 0 .../tiny_mce/plugins/pagebreak/editor_plugin.js | 0 .../tiny_mce/plugins/pagebreak/editor_plugin_src.js | 0 .../tiny_mce/plugins/paste/editor_plugin.js | 0 .../tiny_mce/plugins/paste/editor_plugin_src.js | 0 .../tiny_mce/plugins/paste/js/pastetext.js | 0 .../tiny_mce/plugins/paste/js/pasteword.js | 0 .../tiny_mce/plugins/paste/langs/en_dlg.js | 0 .../tiny_mce/plugins/paste/langs/fr_dlg.js | 0 .../tiny_mce/plugins/paste/pastetext.htm | 0 .../tiny_mce/plugins/paste/pasteword.htm | 0 .../tiny_mce/plugins/preview/editor_plugin.js | 0 .../tiny_mce/plugins/preview/editor_plugin_src.js | 0 .../tiny_mce/plugins/preview/example.html | 0 .../tiny_mce/plugins/preview/jscripts/embed.js | 0 .../tiny_mce/plugins/preview/preview.html | 0 .../tiny_mce/plugins/print/editor_plugin.js | 0 .../tiny_mce/plugins/print/editor_plugin_src.js | 0 .../tiny_mce/plugins/save/editor_plugin.js | 0 .../tiny_mce/plugins/save/editor_plugin_src.js | 0 .../plugins/searchreplace/css/searchreplace.css | 0 .../tiny_mce/plugins/searchreplace/editor_plugin.js | 0 .../plugins/searchreplace/editor_plugin_src.js | 0 .../plugins/searchreplace/js/searchreplace.js | 0 .../tiny_mce/plugins/searchreplace/langs/en_dlg.js | 0 .../tiny_mce/plugins/searchreplace/langs/fr_dlg.js | 0 .../plugins/searchreplace/searchreplace.htm | 0 .../tiny_mce/plugins/spellchecker/css/content.css | 0 .../tiny_mce/plugins/spellchecker/editor_plugin.js | 0 .../plugins/spellchecker/editor_plugin_src.js | 0 .../tiny_mce/plugins/spellchecker/img/wline.gif | Bin .../tiny_mce/plugins/style/css/props.css | 0 .../tiny_mce/plugins/style/editor_plugin.js | 0 .../tiny_mce/plugins/style/editor_plugin_src.js | 0 .../tiny_mce/plugins/style/js/props.js | 0 .../tiny_mce/plugins/style/langs/en_dlg.js | 0 .../tiny_mce/plugins/style/langs/fr_dlg.js | 0 .../tiny_mce/plugins/style/props.htm | 0 .../tiny_mce/plugins/tabfocus/editor_plugin.js | 0 .../tiny_mce/plugins/tabfocus/editor_plugin_src.js | 0 .../tiny_mce/plugins/table/cell.htm | 0 .../tiny_mce/plugins/table/css/cell.css | 0 .../tiny_mce/plugins/table/css/row.css | 0 .../tiny_mce/plugins/table/css/table.css | 0 .../tiny_mce/plugins/table/editor_plugin.js | 0 .../tiny_mce/plugins/table/editor_plugin_src.js | 0 .../tiny_mce/plugins/table/js/cell.js | 0 .../tiny_mce/plugins/table/js/merge_cells.js | 0 .../tiny_mce/plugins/table/js/row.js | 0 .../tiny_mce/plugins/table/js/table.js | 0 .../tiny_mce/plugins/table/langs/en_dlg.js | 0 .../tiny_mce/plugins/table/langs/fr_dlg.js | 0 .../tiny_mce/plugins/table/merge_cells.htm | 0 .../tiny_mce/plugins/table/row.htm | 0 .../tiny_mce/plugins/table/table.htm | 0 .../tiny_mce/plugins/template/blank.htm | 0 .../tiny_mce/plugins/template/css/template.css | 0 .../tiny_mce/plugins/template/editor_plugin.js | 0 .../tiny_mce/plugins/template/editor_plugin_src.js | 0 .../tiny_mce/plugins/template/js/template.js | 0 .../tiny_mce/plugins/template/langs/en_dlg.js | 0 .../tiny_mce/plugins/template/langs/fr_dlg.js | 0 .../tiny_mce/plugins/template/template.htm | 0 .../tiny_mce/plugins/visualchars/editor_plugin.js | 0 .../plugins/visualchars/editor_plugin_src.js | 0 .../tiny_mce/plugins/wordcount/editor_plugin.js | 0 .../tiny_mce/plugins/wordcount/editor_plugin_src.js | 0 .../tiny_mce/plugins/xhtmlxtras/abbr.htm | 0 .../tiny_mce/plugins/xhtmlxtras/acronym.htm | 0 .../tiny_mce/plugins/xhtmlxtras/attributes.htm | 0 .../tiny_mce/plugins/xhtmlxtras/cite.htm | 0 .../tiny_mce/plugins/xhtmlxtras/css/attributes.css | 0 .../tiny_mce/plugins/xhtmlxtras/css/popup.css | 0 .../tiny_mce/plugins/xhtmlxtras/del.htm | 0 .../tiny_mce/plugins/xhtmlxtras/editor_plugin.js | 0 .../plugins/xhtmlxtras/editor_plugin_src.js | 0 .../tiny_mce/plugins/xhtmlxtras/ins.htm | 0 .../tiny_mce/plugins/xhtmlxtras/js/abbr.js | 0 .../tiny_mce/plugins/xhtmlxtras/js/acronym.js | 0 .../tiny_mce/plugins/xhtmlxtras/js/attributes.js | 0 .../tiny_mce/plugins/xhtmlxtras/js/cite.js | 0 .../tiny_mce/plugins/xhtmlxtras/js/del.js | 0 .../plugins/xhtmlxtras/js/element_common.js | 0 .../tiny_mce/plugins/xhtmlxtras/js/ins.js | 0 .../tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js | 0 .../tiny_mce/plugins/xhtmlxtras/langs/fr_dlg.js | 0 .../tiny_mce/themes/advanced/about.htm | 0 .../tiny_mce/themes/advanced/anchor.htm | 0 .../tiny_mce/themes/advanced/charmap.htm | 0 .../tiny_mce/themes/advanced/color_picker.htm | 0 .../tiny_mce/themes/advanced/editor_template.js | 0 .../tiny_mce/themes/advanced/editor_template_src.js | 0 .../tiny_mce/themes/advanced/image.htm | 0 .../tiny_mce/themes/advanced/img/colorpicker.jpg | Bin .../tiny_mce/themes/advanced/img/flash.gif | Bin .../tiny_mce/themes/advanced/img/icons.gif | Bin .../tiny_mce/themes/advanced/img/iframe.gif | Bin .../tiny_mce/themes/advanced/img/pagebreak.gif | Bin .../tiny_mce/themes/advanced/img/quicktime.gif | Bin .../tiny_mce/themes/advanced/img/realmedia.gif | Bin .../tiny_mce/themes/advanced/img/shockwave.gif | Bin .../tiny_mce/themes/advanced/img/trans.gif | Bin .../tiny_mce/themes/advanced/img/video.gif | Bin .../tiny_mce/themes/advanced/img/windowsmedia.gif | Bin .../tiny_mce/themes/advanced/js/about.js | 0 .../tiny_mce/themes/advanced/js/anchor.js | 0 .../tiny_mce/themes/advanced/js/charmap.js | 0 .../tiny_mce/themes/advanced/js/color_picker.js | 0 .../tiny_mce/themes/advanced/js/image.js | 0 .../tiny_mce/themes/advanced/js/link.js | 0 .../tiny_mce/themes/advanced/js/source_editor.js | 0 .../tiny_mce/themes/advanced/langs/en.js | 0 .../tiny_mce/themes/advanced/langs/en_dlg.js | 0 .../tiny_mce/themes/advanced/langs/fr.js | 0 .../tiny_mce/themes/advanced/langs/fr_dlg.js | 0 .../tiny_mce/themes/advanced/link.htm | 0 .../tiny_mce/themes/advanced/shortcuts.htm | 0 .../themes/advanced/skins/default/content.css | 0 .../themes/advanced/skins/default/dialog.css | 0 .../themes/advanced/skins/default/img/buttons.png | Bin .../themes/advanced/skins/default/img/items.gif | Bin .../advanced/skins/default/img/menu_arrow.gif | Bin .../advanced/skins/default/img/menu_check.gif | Bin .../themes/advanced/skins/default/img/progress.gif | Bin .../themes/advanced/skins/default/img/tabs.gif | Bin .../tiny_mce/themes/advanced/skins/default/ui.css | 0 .../themes/advanced/skins/highcontrast/content.css | 0 .../themes/advanced/skins/highcontrast/dialog.css | 0 .../themes/advanced/skins/highcontrast/ui.css | 0 .../tiny_mce/themes/advanced/skins/o2k7/content.css | 0 .../tiny_mce/themes/advanced/skins/o2k7/dialog.css | 0 .../themes/advanced/skins/o2k7/img/button_bg.png | Bin .../advanced/skins/o2k7/img/button_bg_black.png | Bin .../advanced/skins/o2k7/img/button_bg_silver.png | Bin .../tiny_mce/themes/advanced/skins/o2k7/ui.css | 0 .../themes/advanced/skins/o2k7/ui_black.css | 0 .../themes/advanced/skins/o2k7/ui_silver.css | 0 .../tiny_mce/themes/advanced/source_editor.htm | 0 .../tiny_mce/themes/simple/editor_template.js | 0 .../tiny_mce/themes/simple/editor_template_src.js | 0 .../tiny_mce/themes/simple/img/icons.gif | Bin .../tiny_mce/themes/simple/langs/en.js | 0 .../tiny_mce/themes/simple/langs/fr.js | 0 .../themes/simple/skins/default/content.css | 0 .../tiny_mce/themes/simple/skins/default/ui.css | 0 .../tiny_mce/themes/simple/skins/o2k7/content.css | 0 .../themes/simple/skins/o2k7/img/button_bg.png | Bin .../tiny_mce/themes/simple/skins/o2k7/ui.css | 0 creme/{media => static}/tiny_mce/tiny_mce.js | 0 creme/{media => static}/tiny_mce/tiny_mce_popup.js | 0 creme/{media => static}/tiny_mce/tiny_mce_src.js | 0 .../tiny_mce/utils/editable_selects.js | 0 .../{media => static}/tiny_mce/utils/form_utils.js | 0 creme/{media => static}/tiny_mce/utils/mctabs.js | 0 creme/{media => static}/tiny_mce/utils/validate.js | 0 264 files changed, 0 insertions(+), 0 deletions(-) rename creme/{media => static}/tiny_mce/jquery.tinymce.js (100%) rename creme/{media => static}/tiny_mce/langs/en.js (100%) rename creme/{media => static}/tiny_mce/langs/fr.js (100%) rename creme/{media => static}/tiny_mce/license.txt (100%) rename creme/{media => static}/tiny_mce/plugins/advhr/css/advhr.css (100%) rename creme/{media => static}/tiny_mce/plugins/advhr/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/advhr/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/advhr/js/rule.js (100%) rename creme/{media => static}/tiny_mce/plugins/advhr/langs/en_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/advhr/langs/fr_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/advhr/rule.htm (100%) rename creme/{media => static}/tiny_mce/plugins/advimage/css/advimage.css (100%) rename creme/{media => static}/tiny_mce/plugins/advimage/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/advimage/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/advimage/image.htm (100%) rename creme/{media => static}/tiny_mce/plugins/advimage/img/sample.gif (100%) rename creme/{media => static}/tiny_mce/plugins/advimage/js/image.js (100%) rename creme/{media => static}/tiny_mce/plugins/advimage/langs/en_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/advimage/langs/fr_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/advlink/css/advlink.css (100%) rename creme/{media => static}/tiny_mce/plugins/advlink/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/advlink/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/advlink/js/advlink.js (100%) rename creme/{media => static}/tiny_mce/plugins/advlink/langs/en_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/advlink/langs/fr_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/advlink/link.htm (100%) rename creme/{media => static}/tiny_mce/plugins/advlist/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/advlist/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/autoresize/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/autoresize/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/autosave/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/autosave/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/autosave/langs/en.js (100%) rename creme/{media => static}/tiny_mce/plugins/bbcode/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/bbcode/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/contextmenu/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/contextmenu/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/directionality/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/directionality/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/emotions.htm (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/img/smiley-cool.gif (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/img/smiley-cry.gif (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/img/smiley-embarassed.gif (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/img/smiley-frown.gif (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/img/smiley-innocent.gif (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/img/smiley-kiss.gif (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/img/smiley-laughing.gif (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/img/smiley-sealed.gif (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/img/smiley-smile.gif (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/img/smiley-surprised.gif (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/img/smiley-undecided.gif (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/img/smiley-wink.gif (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/img/smiley-yell.gif (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/js/emotions.js (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/langs/en_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/emotions/langs/fr_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/example/dialog.htm (100%) rename creme/{media => static}/tiny_mce/plugins/example/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/example/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/example/img/example.gif (100%) rename creme/{media => static}/tiny_mce/plugins/example/js/dialog.js (100%) rename creme/{media => static}/tiny_mce/plugins/example/langs/en.js (100%) rename creme/{media => static}/tiny_mce/plugins/example/langs/en_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/fullpage/css/fullpage.css (100%) rename creme/{media => static}/tiny_mce/plugins/fullpage/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/fullpage/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/fullpage/fullpage.htm (100%) rename creme/{media => static}/tiny_mce/plugins/fullpage/js/fullpage.js (100%) rename creme/{media => static}/tiny_mce/plugins/fullpage/langs/en_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/fullpage/langs/fr_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/fullscreen/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/fullscreen/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/fullscreen/fullscreen.htm (100%) rename creme/{media => static}/tiny_mce/plugins/iespell/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/iespell/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/inlinepopups/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/inlinepopups/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif (100%) rename creme/{media => static}/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif (100%) rename creme/{media => static}/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif (100%) rename creme/{media => static}/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif (100%) rename creme/{media => static}/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif (100%) rename creme/{media => static}/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif (100%) rename creme/{media => static}/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif (100%) rename creme/{media => static}/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css (100%) rename creme/{media => static}/tiny_mce/plugins/inlinepopups/template.htm (100%) rename creme/{media => static}/tiny_mce/plugins/insertdatetime/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/insertdatetime/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/layer/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/layer/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/legacyoutput/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/legacyoutput/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/media/css/media.css (100%) rename creme/{media => static}/tiny_mce/plugins/media/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/media/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/media/js/embed.js (100%) rename creme/{media => static}/tiny_mce/plugins/media/js/media.js (100%) rename creme/{media => static}/tiny_mce/plugins/media/langs/en_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/media/langs/fr_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/media/media.htm (100%) rename creme/{media => static}/tiny_mce/plugins/media/moxieplayer.swf (100%) rename creme/{media => static}/tiny_mce/plugins/nonbreaking/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/nonbreaking/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/noneditable/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/noneditable/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/pagebreak/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/pagebreak/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/paste/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/paste/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/paste/js/pastetext.js (100%) rename creme/{media => static}/tiny_mce/plugins/paste/js/pasteword.js (100%) rename creme/{media => static}/tiny_mce/plugins/paste/langs/en_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/paste/langs/fr_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/paste/pastetext.htm (100%) rename creme/{media => static}/tiny_mce/plugins/paste/pasteword.htm (100%) rename creme/{media => static}/tiny_mce/plugins/preview/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/preview/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/preview/example.html (100%) rename creme/{media => static}/tiny_mce/plugins/preview/jscripts/embed.js (100%) rename creme/{media => static}/tiny_mce/plugins/preview/preview.html (100%) rename creme/{media => static}/tiny_mce/plugins/print/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/print/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/save/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/save/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/searchreplace/css/searchreplace.css (100%) rename creme/{media => static}/tiny_mce/plugins/searchreplace/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/searchreplace/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/searchreplace/js/searchreplace.js (100%) rename creme/{media => static}/tiny_mce/plugins/searchreplace/langs/en_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/searchreplace/langs/fr_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/searchreplace/searchreplace.htm (100%) rename creme/{media => static}/tiny_mce/plugins/spellchecker/css/content.css (100%) rename creme/{media => static}/tiny_mce/plugins/spellchecker/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/spellchecker/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/spellchecker/img/wline.gif (100%) rename creme/{media => static}/tiny_mce/plugins/style/css/props.css (100%) rename creme/{media => static}/tiny_mce/plugins/style/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/style/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/style/js/props.js (100%) rename creme/{media => static}/tiny_mce/plugins/style/langs/en_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/style/langs/fr_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/style/props.htm (100%) rename creme/{media => static}/tiny_mce/plugins/tabfocus/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/tabfocus/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/table/cell.htm (100%) rename creme/{media => static}/tiny_mce/plugins/table/css/cell.css (100%) rename creme/{media => static}/tiny_mce/plugins/table/css/row.css (100%) rename creme/{media => static}/tiny_mce/plugins/table/css/table.css (100%) rename creme/{media => static}/tiny_mce/plugins/table/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/table/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/table/js/cell.js (100%) rename creme/{media => static}/tiny_mce/plugins/table/js/merge_cells.js (100%) rename creme/{media => static}/tiny_mce/plugins/table/js/row.js (100%) rename creme/{media => static}/tiny_mce/plugins/table/js/table.js (100%) rename creme/{media => static}/tiny_mce/plugins/table/langs/en_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/table/langs/fr_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/table/merge_cells.htm (100%) rename creme/{media => static}/tiny_mce/plugins/table/row.htm (100%) rename creme/{media => static}/tiny_mce/plugins/table/table.htm (100%) rename creme/{media => static}/tiny_mce/plugins/template/blank.htm (100%) rename creme/{media => static}/tiny_mce/plugins/template/css/template.css (100%) rename creme/{media => static}/tiny_mce/plugins/template/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/template/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/template/js/template.js (100%) rename creme/{media => static}/tiny_mce/plugins/template/langs/en_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/template/langs/fr_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/template/template.htm (100%) rename creme/{media => static}/tiny_mce/plugins/visualchars/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/visualchars/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/wordcount/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/wordcount/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/xhtmlxtras/abbr.htm (100%) rename creme/{media => static}/tiny_mce/plugins/xhtmlxtras/acronym.htm (100%) rename creme/{media => static}/tiny_mce/plugins/xhtmlxtras/attributes.htm (100%) rename creme/{media => static}/tiny_mce/plugins/xhtmlxtras/cite.htm (100%) rename creme/{media => static}/tiny_mce/plugins/xhtmlxtras/css/attributes.css (100%) rename creme/{media => static}/tiny_mce/plugins/xhtmlxtras/css/popup.css (100%) rename creme/{media => static}/tiny_mce/plugins/xhtmlxtras/del.htm (100%) rename creme/{media => static}/tiny_mce/plugins/xhtmlxtras/editor_plugin.js (100%) rename creme/{media => static}/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js (100%) rename creme/{media => static}/tiny_mce/plugins/xhtmlxtras/ins.htm (100%) rename creme/{media => static}/tiny_mce/plugins/xhtmlxtras/js/abbr.js (100%) rename creme/{media => static}/tiny_mce/plugins/xhtmlxtras/js/acronym.js (100%) rename creme/{media => static}/tiny_mce/plugins/xhtmlxtras/js/attributes.js (100%) rename creme/{media => static}/tiny_mce/plugins/xhtmlxtras/js/cite.js (100%) rename creme/{media => static}/tiny_mce/plugins/xhtmlxtras/js/del.js (100%) rename creme/{media => static}/tiny_mce/plugins/xhtmlxtras/js/element_common.js (100%) rename creme/{media => static}/tiny_mce/plugins/xhtmlxtras/js/ins.js (100%) rename creme/{media => static}/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js (100%) rename creme/{media => static}/tiny_mce/plugins/xhtmlxtras/langs/fr_dlg.js (100%) rename creme/{media => static}/tiny_mce/themes/advanced/about.htm (100%) rename creme/{media => static}/tiny_mce/themes/advanced/anchor.htm (100%) rename creme/{media => static}/tiny_mce/themes/advanced/charmap.htm (100%) rename creme/{media => static}/tiny_mce/themes/advanced/color_picker.htm (100%) rename creme/{media => static}/tiny_mce/themes/advanced/editor_template.js (100%) rename creme/{media => static}/tiny_mce/themes/advanced/editor_template_src.js (100%) rename creme/{media => static}/tiny_mce/themes/advanced/image.htm (100%) rename creme/{media => static}/tiny_mce/themes/advanced/img/colorpicker.jpg (100%) rename creme/{media => static}/tiny_mce/themes/advanced/img/flash.gif (100%) rename creme/{media => static}/tiny_mce/themes/advanced/img/icons.gif (100%) rename creme/{media => static}/tiny_mce/themes/advanced/img/iframe.gif (100%) rename creme/{media => static}/tiny_mce/themes/advanced/img/pagebreak.gif (100%) rename creme/{media => static}/tiny_mce/themes/advanced/img/quicktime.gif (100%) rename creme/{media => static}/tiny_mce/themes/advanced/img/realmedia.gif (100%) rename creme/{media => static}/tiny_mce/themes/advanced/img/shockwave.gif (100%) rename creme/{media => static}/tiny_mce/themes/advanced/img/trans.gif (100%) rename creme/{media => static}/tiny_mce/themes/advanced/img/video.gif (100%) rename creme/{media => static}/tiny_mce/themes/advanced/img/windowsmedia.gif (100%) rename creme/{media => static}/tiny_mce/themes/advanced/js/about.js (100%) rename creme/{media => static}/tiny_mce/themes/advanced/js/anchor.js (100%) rename creme/{media => static}/tiny_mce/themes/advanced/js/charmap.js (100%) rename creme/{media => static}/tiny_mce/themes/advanced/js/color_picker.js (100%) rename creme/{media => static}/tiny_mce/themes/advanced/js/image.js (100%) rename creme/{media => static}/tiny_mce/themes/advanced/js/link.js (100%) rename creme/{media => static}/tiny_mce/themes/advanced/js/source_editor.js (100%) rename creme/{media => static}/tiny_mce/themes/advanced/langs/en.js (100%) rename creme/{media => static}/tiny_mce/themes/advanced/langs/en_dlg.js (100%) rename creme/{media => static}/tiny_mce/themes/advanced/langs/fr.js (100%) rename creme/{media => static}/tiny_mce/themes/advanced/langs/fr_dlg.js (100%) rename creme/{media => static}/tiny_mce/themes/advanced/link.htm (100%) rename creme/{media => static}/tiny_mce/themes/advanced/shortcuts.htm (100%) rename creme/{media => static}/tiny_mce/themes/advanced/skins/default/content.css (100%) rename creme/{media => static}/tiny_mce/themes/advanced/skins/default/dialog.css (100%) rename creme/{media => static}/tiny_mce/themes/advanced/skins/default/img/buttons.png (100%) rename creme/{media => static}/tiny_mce/themes/advanced/skins/default/img/items.gif (100%) rename creme/{media => static}/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif (100%) rename creme/{media => static}/tiny_mce/themes/advanced/skins/default/img/menu_check.gif (100%) rename creme/{media => static}/tiny_mce/themes/advanced/skins/default/img/progress.gif (100%) rename creme/{media => static}/tiny_mce/themes/advanced/skins/default/img/tabs.gif (100%) rename creme/{media => static}/tiny_mce/themes/advanced/skins/default/ui.css (100%) rename creme/{media => static}/tiny_mce/themes/advanced/skins/highcontrast/content.css (100%) rename creme/{media => static}/tiny_mce/themes/advanced/skins/highcontrast/dialog.css (100%) rename creme/{media => static}/tiny_mce/themes/advanced/skins/highcontrast/ui.css (100%) rename creme/{media => static}/tiny_mce/themes/advanced/skins/o2k7/content.css (100%) rename creme/{media => static}/tiny_mce/themes/advanced/skins/o2k7/dialog.css (100%) rename creme/{media => static}/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png (100%) rename creme/{media => static}/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png (100%) rename creme/{media => static}/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png (100%) rename creme/{media => static}/tiny_mce/themes/advanced/skins/o2k7/ui.css (100%) rename creme/{media => static}/tiny_mce/themes/advanced/skins/o2k7/ui_black.css (100%) rename creme/{media => static}/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css (100%) rename creme/{media => static}/tiny_mce/themes/advanced/source_editor.htm (100%) rename creme/{media => static}/tiny_mce/themes/simple/editor_template.js (100%) rename creme/{media => static}/tiny_mce/themes/simple/editor_template_src.js (100%) rename creme/{media => static}/tiny_mce/themes/simple/img/icons.gif (100%) rename creme/{media => static}/tiny_mce/themes/simple/langs/en.js (100%) rename creme/{media => static}/tiny_mce/themes/simple/langs/fr.js (100%) rename creme/{media => static}/tiny_mce/themes/simple/skins/default/content.css (100%) rename creme/{media => static}/tiny_mce/themes/simple/skins/default/ui.css (100%) rename creme/{media => static}/tiny_mce/themes/simple/skins/o2k7/content.css (100%) rename creme/{media => static}/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png (100%) rename creme/{media => static}/tiny_mce/themes/simple/skins/o2k7/ui.css (100%) rename creme/{media => static}/tiny_mce/tiny_mce.js (100%) rename creme/{media => static}/tiny_mce/tiny_mce_popup.js (100%) rename creme/{media => static}/tiny_mce/tiny_mce_src.js (100%) rename creme/{media => static}/tiny_mce/utils/editable_selects.js (100%) rename creme/{media => static}/tiny_mce/utils/form_utils.js (100%) rename creme/{media => static}/tiny_mce/utils/mctabs.js (100%) rename creme/{media => static}/tiny_mce/utils/validate.js (100%) diff --git a/creme/media/tiny_mce/jquery.tinymce.js b/creme/static/tiny_mce/jquery.tinymce.js similarity index 100% rename from creme/media/tiny_mce/jquery.tinymce.js rename to creme/static/tiny_mce/jquery.tinymce.js diff --git a/creme/media/tiny_mce/langs/en.js b/creme/static/tiny_mce/langs/en.js similarity index 100% rename from creme/media/tiny_mce/langs/en.js rename to creme/static/tiny_mce/langs/en.js diff --git a/creme/media/tiny_mce/langs/fr.js b/creme/static/tiny_mce/langs/fr.js similarity index 100% rename from creme/media/tiny_mce/langs/fr.js rename to creme/static/tiny_mce/langs/fr.js diff --git a/creme/media/tiny_mce/license.txt b/creme/static/tiny_mce/license.txt similarity index 100% rename from creme/media/tiny_mce/license.txt rename to creme/static/tiny_mce/license.txt diff --git a/creme/media/tiny_mce/plugins/advhr/css/advhr.css b/creme/static/tiny_mce/plugins/advhr/css/advhr.css similarity index 100% rename from creme/media/tiny_mce/plugins/advhr/css/advhr.css rename to creme/static/tiny_mce/plugins/advhr/css/advhr.css diff --git a/creme/media/tiny_mce/plugins/advhr/editor_plugin.js b/creme/static/tiny_mce/plugins/advhr/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/advhr/editor_plugin.js rename to creme/static/tiny_mce/plugins/advhr/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/advhr/editor_plugin_src.js b/creme/static/tiny_mce/plugins/advhr/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/advhr/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/advhr/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/advhr/js/rule.js b/creme/static/tiny_mce/plugins/advhr/js/rule.js similarity index 100% rename from creme/media/tiny_mce/plugins/advhr/js/rule.js rename to creme/static/tiny_mce/plugins/advhr/js/rule.js diff --git a/creme/media/tiny_mce/plugins/advhr/langs/en_dlg.js b/creme/static/tiny_mce/plugins/advhr/langs/en_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/advhr/langs/en_dlg.js rename to creme/static/tiny_mce/plugins/advhr/langs/en_dlg.js diff --git a/creme/media/tiny_mce/plugins/advhr/langs/fr_dlg.js b/creme/static/tiny_mce/plugins/advhr/langs/fr_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/advhr/langs/fr_dlg.js rename to creme/static/tiny_mce/plugins/advhr/langs/fr_dlg.js diff --git a/creme/media/tiny_mce/plugins/advhr/rule.htm b/creme/static/tiny_mce/plugins/advhr/rule.htm similarity index 100% rename from creme/media/tiny_mce/plugins/advhr/rule.htm rename to creme/static/tiny_mce/plugins/advhr/rule.htm diff --git a/creme/media/tiny_mce/plugins/advimage/css/advimage.css b/creme/static/tiny_mce/plugins/advimage/css/advimage.css similarity index 100% rename from creme/media/tiny_mce/plugins/advimage/css/advimage.css rename to creme/static/tiny_mce/plugins/advimage/css/advimage.css diff --git a/creme/media/tiny_mce/plugins/advimage/editor_plugin.js b/creme/static/tiny_mce/plugins/advimage/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/advimage/editor_plugin.js rename to creme/static/tiny_mce/plugins/advimage/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/advimage/editor_plugin_src.js b/creme/static/tiny_mce/plugins/advimage/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/advimage/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/advimage/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/advimage/image.htm b/creme/static/tiny_mce/plugins/advimage/image.htm similarity index 100% rename from creme/media/tiny_mce/plugins/advimage/image.htm rename to creme/static/tiny_mce/plugins/advimage/image.htm diff --git a/creme/media/tiny_mce/plugins/advimage/img/sample.gif b/creme/static/tiny_mce/plugins/advimage/img/sample.gif similarity index 100% rename from creme/media/tiny_mce/plugins/advimage/img/sample.gif rename to creme/static/tiny_mce/plugins/advimage/img/sample.gif diff --git a/creme/media/tiny_mce/plugins/advimage/js/image.js b/creme/static/tiny_mce/plugins/advimage/js/image.js similarity index 100% rename from creme/media/tiny_mce/plugins/advimage/js/image.js rename to creme/static/tiny_mce/plugins/advimage/js/image.js diff --git a/creme/media/tiny_mce/plugins/advimage/langs/en_dlg.js b/creme/static/tiny_mce/plugins/advimage/langs/en_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/advimage/langs/en_dlg.js rename to creme/static/tiny_mce/plugins/advimage/langs/en_dlg.js diff --git a/creme/media/tiny_mce/plugins/advimage/langs/fr_dlg.js b/creme/static/tiny_mce/plugins/advimage/langs/fr_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/advimage/langs/fr_dlg.js rename to creme/static/tiny_mce/plugins/advimage/langs/fr_dlg.js diff --git a/creme/media/tiny_mce/plugins/advlink/css/advlink.css b/creme/static/tiny_mce/plugins/advlink/css/advlink.css similarity index 100% rename from creme/media/tiny_mce/plugins/advlink/css/advlink.css rename to creme/static/tiny_mce/plugins/advlink/css/advlink.css diff --git a/creme/media/tiny_mce/plugins/advlink/editor_plugin.js b/creme/static/tiny_mce/plugins/advlink/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/advlink/editor_plugin.js rename to creme/static/tiny_mce/plugins/advlink/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/advlink/editor_plugin_src.js b/creme/static/tiny_mce/plugins/advlink/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/advlink/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/advlink/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/advlink/js/advlink.js b/creme/static/tiny_mce/plugins/advlink/js/advlink.js similarity index 100% rename from creme/media/tiny_mce/plugins/advlink/js/advlink.js rename to creme/static/tiny_mce/plugins/advlink/js/advlink.js diff --git a/creme/media/tiny_mce/plugins/advlink/langs/en_dlg.js b/creme/static/tiny_mce/plugins/advlink/langs/en_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/advlink/langs/en_dlg.js rename to creme/static/tiny_mce/plugins/advlink/langs/en_dlg.js diff --git a/creme/media/tiny_mce/plugins/advlink/langs/fr_dlg.js b/creme/static/tiny_mce/plugins/advlink/langs/fr_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/advlink/langs/fr_dlg.js rename to creme/static/tiny_mce/plugins/advlink/langs/fr_dlg.js diff --git a/creme/media/tiny_mce/plugins/advlink/link.htm b/creme/static/tiny_mce/plugins/advlink/link.htm similarity index 100% rename from creme/media/tiny_mce/plugins/advlink/link.htm rename to creme/static/tiny_mce/plugins/advlink/link.htm diff --git a/creme/media/tiny_mce/plugins/advlist/editor_plugin.js b/creme/static/tiny_mce/plugins/advlist/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/advlist/editor_plugin.js rename to creme/static/tiny_mce/plugins/advlist/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/advlist/editor_plugin_src.js b/creme/static/tiny_mce/plugins/advlist/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/advlist/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/advlist/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/autoresize/editor_plugin.js b/creme/static/tiny_mce/plugins/autoresize/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/autoresize/editor_plugin.js rename to creme/static/tiny_mce/plugins/autoresize/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/autoresize/editor_plugin_src.js b/creme/static/tiny_mce/plugins/autoresize/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/autoresize/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/autoresize/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/autosave/editor_plugin.js b/creme/static/tiny_mce/plugins/autosave/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/autosave/editor_plugin.js rename to creme/static/tiny_mce/plugins/autosave/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/autosave/editor_plugin_src.js b/creme/static/tiny_mce/plugins/autosave/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/autosave/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/autosave/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/autosave/langs/en.js b/creme/static/tiny_mce/plugins/autosave/langs/en.js similarity index 100% rename from creme/media/tiny_mce/plugins/autosave/langs/en.js rename to creme/static/tiny_mce/plugins/autosave/langs/en.js diff --git a/creme/media/tiny_mce/plugins/bbcode/editor_plugin.js b/creme/static/tiny_mce/plugins/bbcode/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/bbcode/editor_plugin.js rename to creme/static/tiny_mce/plugins/bbcode/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/bbcode/editor_plugin_src.js b/creme/static/tiny_mce/plugins/bbcode/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/bbcode/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/bbcode/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/contextmenu/editor_plugin.js b/creme/static/tiny_mce/plugins/contextmenu/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/contextmenu/editor_plugin.js rename to creme/static/tiny_mce/plugins/contextmenu/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/contextmenu/editor_plugin_src.js b/creme/static/tiny_mce/plugins/contextmenu/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/contextmenu/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/contextmenu/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/directionality/editor_plugin.js b/creme/static/tiny_mce/plugins/directionality/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/directionality/editor_plugin.js rename to creme/static/tiny_mce/plugins/directionality/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/directionality/editor_plugin_src.js b/creme/static/tiny_mce/plugins/directionality/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/directionality/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/directionality/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/emotions/editor_plugin.js b/creme/static/tiny_mce/plugins/emotions/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/editor_plugin.js rename to creme/static/tiny_mce/plugins/emotions/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/emotions/editor_plugin_src.js b/creme/static/tiny_mce/plugins/emotions/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/emotions/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/emotions/emotions.htm b/creme/static/tiny_mce/plugins/emotions/emotions.htm similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/emotions.htm rename to creme/static/tiny_mce/plugins/emotions/emotions.htm diff --git a/creme/media/tiny_mce/plugins/emotions/img/smiley-cool.gif b/creme/static/tiny_mce/plugins/emotions/img/smiley-cool.gif similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/img/smiley-cool.gif rename to creme/static/tiny_mce/plugins/emotions/img/smiley-cool.gif diff --git a/creme/media/tiny_mce/plugins/emotions/img/smiley-cry.gif b/creme/static/tiny_mce/plugins/emotions/img/smiley-cry.gif similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/img/smiley-cry.gif rename to creme/static/tiny_mce/plugins/emotions/img/smiley-cry.gif diff --git a/creme/media/tiny_mce/plugins/emotions/img/smiley-embarassed.gif b/creme/static/tiny_mce/plugins/emotions/img/smiley-embarassed.gif similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/img/smiley-embarassed.gif rename to creme/static/tiny_mce/plugins/emotions/img/smiley-embarassed.gif diff --git a/creme/media/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif b/creme/static/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif rename to creme/static/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif diff --git a/creme/media/tiny_mce/plugins/emotions/img/smiley-frown.gif b/creme/static/tiny_mce/plugins/emotions/img/smiley-frown.gif similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/img/smiley-frown.gif rename to creme/static/tiny_mce/plugins/emotions/img/smiley-frown.gif diff --git a/creme/media/tiny_mce/plugins/emotions/img/smiley-innocent.gif b/creme/static/tiny_mce/plugins/emotions/img/smiley-innocent.gif similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/img/smiley-innocent.gif rename to creme/static/tiny_mce/plugins/emotions/img/smiley-innocent.gif diff --git a/creme/media/tiny_mce/plugins/emotions/img/smiley-kiss.gif b/creme/static/tiny_mce/plugins/emotions/img/smiley-kiss.gif similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/img/smiley-kiss.gif rename to creme/static/tiny_mce/plugins/emotions/img/smiley-kiss.gif diff --git a/creme/media/tiny_mce/plugins/emotions/img/smiley-laughing.gif b/creme/static/tiny_mce/plugins/emotions/img/smiley-laughing.gif similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/img/smiley-laughing.gif rename to creme/static/tiny_mce/plugins/emotions/img/smiley-laughing.gif diff --git a/creme/media/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif b/creme/static/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif rename to creme/static/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif diff --git a/creme/media/tiny_mce/plugins/emotions/img/smiley-sealed.gif b/creme/static/tiny_mce/plugins/emotions/img/smiley-sealed.gif similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/img/smiley-sealed.gif rename to creme/static/tiny_mce/plugins/emotions/img/smiley-sealed.gif diff --git a/creme/media/tiny_mce/plugins/emotions/img/smiley-smile.gif b/creme/static/tiny_mce/plugins/emotions/img/smiley-smile.gif similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/img/smiley-smile.gif rename to creme/static/tiny_mce/plugins/emotions/img/smiley-smile.gif diff --git a/creme/media/tiny_mce/plugins/emotions/img/smiley-surprised.gif b/creme/static/tiny_mce/plugins/emotions/img/smiley-surprised.gif similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/img/smiley-surprised.gif rename to creme/static/tiny_mce/plugins/emotions/img/smiley-surprised.gif diff --git a/creme/media/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif b/creme/static/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif rename to creme/static/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif diff --git a/creme/media/tiny_mce/plugins/emotions/img/smiley-undecided.gif b/creme/static/tiny_mce/plugins/emotions/img/smiley-undecided.gif similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/img/smiley-undecided.gif rename to creme/static/tiny_mce/plugins/emotions/img/smiley-undecided.gif diff --git a/creme/media/tiny_mce/plugins/emotions/img/smiley-wink.gif b/creme/static/tiny_mce/plugins/emotions/img/smiley-wink.gif similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/img/smiley-wink.gif rename to creme/static/tiny_mce/plugins/emotions/img/smiley-wink.gif diff --git a/creme/media/tiny_mce/plugins/emotions/img/smiley-yell.gif b/creme/static/tiny_mce/plugins/emotions/img/smiley-yell.gif similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/img/smiley-yell.gif rename to creme/static/tiny_mce/plugins/emotions/img/smiley-yell.gif diff --git a/creme/media/tiny_mce/plugins/emotions/js/emotions.js b/creme/static/tiny_mce/plugins/emotions/js/emotions.js similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/js/emotions.js rename to creme/static/tiny_mce/plugins/emotions/js/emotions.js diff --git a/creme/media/tiny_mce/plugins/emotions/langs/en_dlg.js b/creme/static/tiny_mce/plugins/emotions/langs/en_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/langs/en_dlg.js rename to creme/static/tiny_mce/plugins/emotions/langs/en_dlg.js diff --git a/creme/media/tiny_mce/plugins/emotions/langs/fr_dlg.js b/creme/static/tiny_mce/plugins/emotions/langs/fr_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/emotions/langs/fr_dlg.js rename to creme/static/tiny_mce/plugins/emotions/langs/fr_dlg.js diff --git a/creme/media/tiny_mce/plugins/example/dialog.htm b/creme/static/tiny_mce/plugins/example/dialog.htm similarity index 100% rename from creme/media/tiny_mce/plugins/example/dialog.htm rename to creme/static/tiny_mce/plugins/example/dialog.htm diff --git a/creme/media/tiny_mce/plugins/example/editor_plugin.js b/creme/static/tiny_mce/plugins/example/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/example/editor_plugin.js rename to creme/static/tiny_mce/plugins/example/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/example/editor_plugin_src.js b/creme/static/tiny_mce/plugins/example/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/example/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/example/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/example/img/example.gif b/creme/static/tiny_mce/plugins/example/img/example.gif similarity index 100% rename from creme/media/tiny_mce/plugins/example/img/example.gif rename to creme/static/tiny_mce/plugins/example/img/example.gif diff --git a/creme/media/tiny_mce/plugins/example/js/dialog.js b/creme/static/tiny_mce/plugins/example/js/dialog.js similarity index 100% rename from creme/media/tiny_mce/plugins/example/js/dialog.js rename to creme/static/tiny_mce/plugins/example/js/dialog.js diff --git a/creme/media/tiny_mce/plugins/example/langs/en.js b/creme/static/tiny_mce/plugins/example/langs/en.js similarity index 100% rename from creme/media/tiny_mce/plugins/example/langs/en.js rename to creme/static/tiny_mce/plugins/example/langs/en.js diff --git a/creme/media/tiny_mce/plugins/example/langs/en_dlg.js b/creme/static/tiny_mce/plugins/example/langs/en_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/example/langs/en_dlg.js rename to creme/static/tiny_mce/plugins/example/langs/en_dlg.js diff --git a/creme/media/tiny_mce/plugins/fullpage/css/fullpage.css b/creme/static/tiny_mce/plugins/fullpage/css/fullpage.css similarity index 100% rename from creme/media/tiny_mce/plugins/fullpage/css/fullpage.css rename to creme/static/tiny_mce/plugins/fullpage/css/fullpage.css diff --git a/creme/media/tiny_mce/plugins/fullpage/editor_plugin.js b/creme/static/tiny_mce/plugins/fullpage/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/fullpage/editor_plugin.js rename to creme/static/tiny_mce/plugins/fullpage/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/fullpage/editor_plugin_src.js b/creme/static/tiny_mce/plugins/fullpage/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/fullpage/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/fullpage/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/fullpage/fullpage.htm b/creme/static/tiny_mce/plugins/fullpage/fullpage.htm similarity index 100% rename from creme/media/tiny_mce/plugins/fullpage/fullpage.htm rename to creme/static/tiny_mce/plugins/fullpage/fullpage.htm diff --git a/creme/media/tiny_mce/plugins/fullpage/js/fullpage.js b/creme/static/tiny_mce/plugins/fullpage/js/fullpage.js similarity index 100% rename from creme/media/tiny_mce/plugins/fullpage/js/fullpage.js rename to creme/static/tiny_mce/plugins/fullpage/js/fullpage.js diff --git a/creme/media/tiny_mce/plugins/fullpage/langs/en_dlg.js b/creme/static/tiny_mce/plugins/fullpage/langs/en_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/fullpage/langs/en_dlg.js rename to creme/static/tiny_mce/plugins/fullpage/langs/en_dlg.js diff --git a/creme/media/tiny_mce/plugins/fullpage/langs/fr_dlg.js b/creme/static/tiny_mce/plugins/fullpage/langs/fr_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/fullpage/langs/fr_dlg.js rename to creme/static/tiny_mce/plugins/fullpage/langs/fr_dlg.js diff --git a/creme/media/tiny_mce/plugins/fullscreen/editor_plugin.js b/creme/static/tiny_mce/plugins/fullscreen/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/fullscreen/editor_plugin.js rename to creme/static/tiny_mce/plugins/fullscreen/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/fullscreen/editor_plugin_src.js b/creme/static/tiny_mce/plugins/fullscreen/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/fullscreen/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/fullscreen/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/fullscreen/fullscreen.htm b/creme/static/tiny_mce/plugins/fullscreen/fullscreen.htm similarity index 100% rename from creme/media/tiny_mce/plugins/fullscreen/fullscreen.htm rename to creme/static/tiny_mce/plugins/fullscreen/fullscreen.htm diff --git a/creme/media/tiny_mce/plugins/iespell/editor_plugin.js b/creme/static/tiny_mce/plugins/iespell/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/iespell/editor_plugin.js rename to creme/static/tiny_mce/plugins/iespell/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/iespell/editor_plugin_src.js b/creme/static/tiny_mce/plugins/iespell/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/iespell/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/iespell/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/inlinepopups/editor_plugin.js b/creme/static/tiny_mce/plugins/inlinepopups/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/inlinepopups/editor_plugin.js rename to creme/static/tiny_mce/plugins/inlinepopups/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/inlinepopups/editor_plugin_src.js b/creme/static/tiny_mce/plugins/inlinepopups/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/inlinepopups/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/inlinepopups/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif b/creme/static/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif similarity index 100% rename from creme/media/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif rename to creme/static/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif diff --git a/creme/media/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif b/creme/static/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif similarity index 100% rename from creme/media/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif rename to creme/static/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif diff --git a/creme/media/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif b/creme/static/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif similarity index 100% rename from creme/media/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif rename to creme/static/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif diff --git a/creme/media/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif b/creme/static/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif similarity index 100% rename from creme/media/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif rename to creme/static/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif diff --git a/creme/media/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif b/creme/static/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif similarity index 100% rename from creme/media/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif rename to creme/static/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif diff --git a/creme/media/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif b/creme/static/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif similarity index 100% rename from creme/media/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif rename to creme/static/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif diff --git a/creme/media/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif b/creme/static/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif similarity index 100% rename from creme/media/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif rename to creme/static/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif diff --git a/creme/media/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css b/creme/static/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css similarity index 100% rename from creme/media/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css rename to creme/static/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css diff --git a/creme/media/tiny_mce/plugins/inlinepopups/template.htm b/creme/static/tiny_mce/plugins/inlinepopups/template.htm similarity index 100% rename from creme/media/tiny_mce/plugins/inlinepopups/template.htm rename to creme/static/tiny_mce/plugins/inlinepopups/template.htm diff --git a/creme/media/tiny_mce/plugins/insertdatetime/editor_plugin.js b/creme/static/tiny_mce/plugins/insertdatetime/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/insertdatetime/editor_plugin.js rename to creme/static/tiny_mce/plugins/insertdatetime/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/insertdatetime/editor_plugin_src.js b/creme/static/tiny_mce/plugins/insertdatetime/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/insertdatetime/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/insertdatetime/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/layer/editor_plugin.js b/creme/static/tiny_mce/plugins/layer/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/layer/editor_plugin.js rename to creme/static/tiny_mce/plugins/layer/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/layer/editor_plugin_src.js b/creme/static/tiny_mce/plugins/layer/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/layer/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/layer/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/legacyoutput/editor_plugin.js b/creme/static/tiny_mce/plugins/legacyoutput/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/legacyoutput/editor_plugin.js rename to creme/static/tiny_mce/plugins/legacyoutput/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/legacyoutput/editor_plugin_src.js b/creme/static/tiny_mce/plugins/legacyoutput/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/legacyoutput/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/legacyoutput/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/media/css/media.css b/creme/static/tiny_mce/plugins/media/css/media.css similarity index 100% rename from creme/media/tiny_mce/plugins/media/css/media.css rename to creme/static/tiny_mce/plugins/media/css/media.css diff --git a/creme/media/tiny_mce/plugins/media/editor_plugin.js b/creme/static/tiny_mce/plugins/media/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/media/editor_plugin.js rename to creme/static/tiny_mce/plugins/media/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/media/editor_plugin_src.js b/creme/static/tiny_mce/plugins/media/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/media/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/media/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/media/js/embed.js b/creme/static/tiny_mce/plugins/media/js/embed.js similarity index 100% rename from creme/media/tiny_mce/plugins/media/js/embed.js rename to creme/static/tiny_mce/plugins/media/js/embed.js diff --git a/creme/media/tiny_mce/plugins/media/js/media.js b/creme/static/tiny_mce/plugins/media/js/media.js similarity index 100% rename from creme/media/tiny_mce/plugins/media/js/media.js rename to creme/static/tiny_mce/plugins/media/js/media.js diff --git a/creme/media/tiny_mce/plugins/media/langs/en_dlg.js b/creme/static/tiny_mce/plugins/media/langs/en_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/media/langs/en_dlg.js rename to creme/static/tiny_mce/plugins/media/langs/en_dlg.js diff --git a/creme/media/tiny_mce/plugins/media/langs/fr_dlg.js b/creme/static/tiny_mce/plugins/media/langs/fr_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/media/langs/fr_dlg.js rename to creme/static/tiny_mce/plugins/media/langs/fr_dlg.js diff --git a/creme/media/tiny_mce/plugins/media/media.htm b/creme/static/tiny_mce/plugins/media/media.htm similarity index 100% rename from creme/media/tiny_mce/plugins/media/media.htm rename to creme/static/tiny_mce/plugins/media/media.htm diff --git a/creme/media/tiny_mce/plugins/media/moxieplayer.swf b/creme/static/tiny_mce/plugins/media/moxieplayer.swf similarity index 100% rename from creme/media/tiny_mce/plugins/media/moxieplayer.swf rename to creme/static/tiny_mce/plugins/media/moxieplayer.swf diff --git a/creme/media/tiny_mce/plugins/nonbreaking/editor_plugin.js b/creme/static/tiny_mce/plugins/nonbreaking/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/nonbreaking/editor_plugin.js rename to creme/static/tiny_mce/plugins/nonbreaking/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/nonbreaking/editor_plugin_src.js b/creme/static/tiny_mce/plugins/nonbreaking/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/nonbreaking/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/nonbreaking/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/noneditable/editor_plugin.js b/creme/static/tiny_mce/plugins/noneditable/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/noneditable/editor_plugin.js rename to creme/static/tiny_mce/plugins/noneditable/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/noneditable/editor_plugin_src.js b/creme/static/tiny_mce/plugins/noneditable/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/noneditable/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/noneditable/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/pagebreak/editor_plugin.js b/creme/static/tiny_mce/plugins/pagebreak/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/pagebreak/editor_plugin.js rename to creme/static/tiny_mce/plugins/pagebreak/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/pagebreak/editor_plugin_src.js b/creme/static/tiny_mce/plugins/pagebreak/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/pagebreak/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/pagebreak/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/paste/editor_plugin.js b/creme/static/tiny_mce/plugins/paste/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/paste/editor_plugin.js rename to creme/static/tiny_mce/plugins/paste/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/paste/editor_plugin_src.js b/creme/static/tiny_mce/plugins/paste/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/paste/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/paste/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/paste/js/pastetext.js b/creme/static/tiny_mce/plugins/paste/js/pastetext.js similarity index 100% rename from creme/media/tiny_mce/plugins/paste/js/pastetext.js rename to creme/static/tiny_mce/plugins/paste/js/pastetext.js diff --git a/creme/media/tiny_mce/plugins/paste/js/pasteword.js b/creme/static/tiny_mce/plugins/paste/js/pasteword.js similarity index 100% rename from creme/media/tiny_mce/plugins/paste/js/pasteword.js rename to creme/static/tiny_mce/plugins/paste/js/pasteword.js diff --git a/creme/media/tiny_mce/plugins/paste/langs/en_dlg.js b/creme/static/tiny_mce/plugins/paste/langs/en_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/paste/langs/en_dlg.js rename to creme/static/tiny_mce/plugins/paste/langs/en_dlg.js diff --git a/creme/media/tiny_mce/plugins/paste/langs/fr_dlg.js b/creme/static/tiny_mce/plugins/paste/langs/fr_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/paste/langs/fr_dlg.js rename to creme/static/tiny_mce/plugins/paste/langs/fr_dlg.js diff --git a/creme/media/tiny_mce/plugins/paste/pastetext.htm b/creme/static/tiny_mce/plugins/paste/pastetext.htm similarity index 100% rename from creme/media/tiny_mce/plugins/paste/pastetext.htm rename to creme/static/tiny_mce/plugins/paste/pastetext.htm diff --git a/creme/media/tiny_mce/plugins/paste/pasteword.htm b/creme/static/tiny_mce/plugins/paste/pasteword.htm similarity index 100% rename from creme/media/tiny_mce/plugins/paste/pasteword.htm rename to creme/static/tiny_mce/plugins/paste/pasteword.htm diff --git a/creme/media/tiny_mce/plugins/preview/editor_plugin.js b/creme/static/tiny_mce/plugins/preview/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/preview/editor_plugin.js rename to creme/static/tiny_mce/plugins/preview/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/preview/editor_plugin_src.js b/creme/static/tiny_mce/plugins/preview/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/preview/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/preview/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/preview/example.html b/creme/static/tiny_mce/plugins/preview/example.html similarity index 100% rename from creme/media/tiny_mce/plugins/preview/example.html rename to creme/static/tiny_mce/plugins/preview/example.html diff --git a/creme/media/tiny_mce/plugins/preview/jscripts/embed.js b/creme/static/tiny_mce/plugins/preview/jscripts/embed.js similarity index 100% rename from creme/media/tiny_mce/plugins/preview/jscripts/embed.js rename to creme/static/tiny_mce/plugins/preview/jscripts/embed.js diff --git a/creme/media/tiny_mce/plugins/preview/preview.html b/creme/static/tiny_mce/plugins/preview/preview.html similarity index 100% rename from creme/media/tiny_mce/plugins/preview/preview.html rename to creme/static/tiny_mce/plugins/preview/preview.html diff --git a/creme/media/tiny_mce/plugins/print/editor_plugin.js b/creme/static/tiny_mce/plugins/print/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/print/editor_plugin.js rename to creme/static/tiny_mce/plugins/print/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/print/editor_plugin_src.js b/creme/static/tiny_mce/plugins/print/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/print/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/print/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/save/editor_plugin.js b/creme/static/tiny_mce/plugins/save/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/save/editor_plugin.js rename to creme/static/tiny_mce/plugins/save/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/save/editor_plugin_src.js b/creme/static/tiny_mce/plugins/save/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/save/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/save/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/searchreplace/css/searchreplace.css b/creme/static/tiny_mce/plugins/searchreplace/css/searchreplace.css similarity index 100% rename from creme/media/tiny_mce/plugins/searchreplace/css/searchreplace.css rename to creme/static/tiny_mce/plugins/searchreplace/css/searchreplace.css diff --git a/creme/media/tiny_mce/plugins/searchreplace/editor_plugin.js b/creme/static/tiny_mce/plugins/searchreplace/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/searchreplace/editor_plugin.js rename to creme/static/tiny_mce/plugins/searchreplace/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/searchreplace/editor_plugin_src.js b/creme/static/tiny_mce/plugins/searchreplace/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/searchreplace/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/searchreplace/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/searchreplace/js/searchreplace.js b/creme/static/tiny_mce/plugins/searchreplace/js/searchreplace.js similarity index 100% rename from creme/media/tiny_mce/plugins/searchreplace/js/searchreplace.js rename to creme/static/tiny_mce/plugins/searchreplace/js/searchreplace.js diff --git a/creme/media/tiny_mce/plugins/searchreplace/langs/en_dlg.js b/creme/static/tiny_mce/plugins/searchreplace/langs/en_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/searchreplace/langs/en_dlg.js rename to creme/static/tiny_mce/plugins/searchreplace/langs/en_dlg.js diff --git a/creme/media/tiny_mce/plugins/searchreplace/langs/fr_dlg.js b/creme/static/tiny_mce/plugins/searchreplace/langs/fr_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/searchreplace/langs/fr_dlg.js rename to creme/static/tiny_mce/plugins/searchreplace/langs/fr_dlg.js diff --git a/creme/media/tiny_mce/plugins/searchreplace/searchreplace.htm b/creme/static/tiny_mce/plugins/searchreplace/searchreplace.htm similarity index 100% rename from creme/media/tiny_mce/plugins/searchreplace/searchreplace.htm rename to creme/static/tiny_mce/plugins/searchreplace/searchreplace.htm diff --git a/creme/media/tiny_mce/plugins/spellchecker/css/content.css b/creme/static/tiny_mce/plugins/spellchecker/css/content.css similarity index 100% rename from creme/media/tiny_mce/plugins/spellchecker/css/content.css rename to creme/static/tiny_mce/plugins/spellchecker/css/content.css diff --git a/creme/media/tiny_mce/plugins/spellchecker/editor_plugin.js b/creme/static/tiny_mce/plugins/spellchecker/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/spellchecker/editor_plugin.js rename to creme/static/tiny_mce/plugins/spellchecker/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/spellchecker/editor_plugin_src.js b/creme/static/tiny_mce/plugins/spellchecker/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/spellchecker/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/spellchecker/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/spellchecker/img/wline.gif b/creme/static/tiny_mce/plugins/spellchecker/img/wline.gif similarity index 100% rename from creme/media/tiny_mce/plugins/spellchecker/img/wline.gif rename to creme/static/tiny_mce/plugins/spellchecker/img/wline.gif diff --git a/creme/media/tiny_mce/plugins/style/css/props.css b/creme/static/tiny_mce/plugins/style/css/props.css similarity index 100% rename from creme/media/tiny_mce/plugins/style/css/props.css rename to creme/static/tiny_mce/plugins/style/css/props.css diff --git a/creme/media/tiny_mce/plugins/style/editor_plugin.js b/creme/static/tiny_mce/plugins/style/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/style/editor_plugin.js rename to creme/static/tiny_mce/plugins/style/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/style/editor_plugin_src.js b/creme/static/tiny_mce/plugins/style/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/style/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/style/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/style/js/props.js b/creme/static/tiny_mce/plugins/style/js/props.js similarity index 100% rename from creme/media/tiny_mce/plugins/style/js/props.js rename to creme/static/tiny_mce/plugins/style/js/props.js diff --git a/creme/media/tiny_mce/plugins/style/langs/en_dlg.js b/creme/static/tiny_mce/plugins/style/langs/en_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/style/langs/en_dlg.js rename to creme/static/tiny_mce/plugins/style/langs/en_dlg.js diff --git a/creme/media/tiny_mce/plugins/style/langs/fr_dlg.js b/creme/static/tiny_mce/plugins/style/langs/fr_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/style/langs/fr_dlg.js rename to creme/static/tiny_mce/plugins/style/langs/fr_dlg.js diff --git a/creme/media/tiny_mce/plugins/style/props.htm b/creme/static/tiny_mce/plugins/style/props.htm similarity index 100% rename from creme/media/tiny_mce/plugins/style/props.htm rename to creme/static/tiny_mce/plugins/style/props.htm diff --git a/creme/media/tiny_mce/plugins/tabfocus/editor_plugin.js b/creme/static/tiny_mce/plugins/tabfocus/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/tabfocus/editor_plugin.js rename to creme/static/tiny_mce/plugins/tabfocus/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/tabfocus/editor_plugin_src.js b/creme/static/tiny_mce/plugins/tabfocus/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/tabfocus/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/tabfocus/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/table/cell.htm b/creme/static/tiny_mce/plugins/table/cell.htm similarity index 100% rename from creme/media/tiny_mce/plugins/table/cell.htm rename to creme/static/tiny_mce/plugins/table/cell.htm diff --git a/creme/media/tiny_mce/plugins/table/css/cell.css b/creme/static/tiny_mce/plugins/table/css/cell.css similarity index 100% rename from creme/media/tiny_mce/plugins/table/css/cell.css rename to creme/static/tiny_mce/plugins/table/css/cell.css diff --git a/creme/media/tiny_mce/plugins/table/css/row.css b/creme/static/tiny_mce/plugins/table/css/row.css similarity index 100% rename from creme/media/tiny_mce/plugins/table/css/row.css rename to creme/static/tiny_mce/plugins/table/css/row.css diff --git a/creme/media/tiny_mce/plugins/table/css/table.css b/creme/static/tiny_mce/plugins/table/css/table.css similarity index 100% rename from creme/media/tiny_mce/plugins/table/css/table.css rename to creme/static/tiny_mce/plugins/table/css/table.css diff --git a/creme/media/tiny_mce/plugins/table/editor_plugin.js b/creme/static/tiny_mce/plugins/table/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/table/editor_plugin.js rename to creme/static/tiny_mce/plugins/table/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/table/editor_plugin_src.js b/creme/static/tiny_mce/plugins/table/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/table/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/table/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/table/js/cell.js b/creme/static/tiny_mce/plugins/table/js/cell.js similarity index 100% rename from creme/media/tiny_mce/plugins/table/js/cell.js rename to creme/static/tiny_mce/plugins/table/js/cell.js diff --git a/creme/media/tiny_mce/plugins/table/js/merge_cells.js b/creme/static/tiny_mce/plugins/table/js/merge_cells.js similarity index 100% rename from creme/media/tiny_mce/plugins/table/js/merge_cells.js rename to creme/static/tiny_mce/plugins/table/js/merge_cells.js diff --git a/creme/media/tiny_mce/plugins/table/js/row.js b/creme/static/tiny_mce/plugins/table/js/row.js similarity index 100% rename from creme/media/tiny_mce/plugins/table/js/row.js rename to creme/static/tiny_mce/plugins/table/js/row.js diff --git a/creme/media/tiny_mce/plugins/table/js/table.js b/creme/static/tiny_mce/plugins/table/js/table.js similarity index 100% rename from creme/media/tiny_mce/plugins/table/js/table.js rename to creme/static/tiny_mce/plugins/table/js/table.js diff --git a/creme/media/tiny_mce/plugins/table/langs/en_dlg.js b/creme/static/tiny_mce/plugins/table/langs/en_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/table/langs/en_dlg.js rename to creme/static/tiny_mce/plugins/table/langs/en_dlg.js diff --git a/creme/media/tiny_mce/plugins/table/langs/fr_dlg.js b/creme/static/tiny_mce/plugins/table/langs/fr_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/table/langs/fr_dlg.js rename to creme/static/tiny_mce/plugins/table/langs/fr_dlg.js diff --git a/creme/media/tiny_mce/plugins/table/merge_cells.htm b/creme/static/tiny_mce/plugins/table/merge_cells.htm similarity index 100% rename from creme/media/tiny_mce/plugins/table/merge_cells.htm rename to creme/static/tiny_mce/plugins/table/merge_cells.htm diff --git a/creme/media/tiny_mce/plugins/table/row.htm b/creme/static/tiny_mce/plugins/table/row.htm similarity index 100% rename from creme/media/tiny_mce/plugins/table/row.htm rename to creme/static/tiny_mce/plugins/table/row.htm diff --git a/creme/media/tiny_mce/plugins/table/table.htm b/creme/static/tiny_mce/plugins/table/table.htm similarity index 100% rename from creme/media/tiny_mce/plugins/table/table.htm rename to creme/static/tiny_mce/plugins/table/table.htm diff --git a/creme/media/tiny_mce/plugins/template/blank.htm b/creme/static/tiny_mce/plugins/template/blank.htm similarity index 100% rename from creme/media/tiny_mce/plugins/template/blank.htm rename to creme/static/tiny_mce/plugins/template/blank.htm diff --git a/creme/media/tiny_mce/plugins/template/css/template.css b/creme/static/tiny_mce/plugins/template/css/template.css similarity index 100% rename from creme/media/tiny_mce/plugins/template/css/template.css rename to creme/static/tiny_mce/plugins/template/css/template.css diff --git a/creme/media/tiny_mce/plugins/template/editor_plugin.js b/creme/static/tiny_mce/plugins/template/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/template/editor_plugin.js rename to creme/static/tiny_mce/plugins/template/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/template/editor_plugin_src.js b/creme/static/tiny_mce/plugins/template/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/template/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/template/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/template/js/template.js b/creme/static/tiny_mce/plugins/template/js/template.js similarity index 100% rename from creme/media/tiny_mce/plugins/template/js/template.js rename to creme/static/tiny_mce/plugins/template/js/template.js diff --git a/creme/media/tiny_mce/plugins/template/langs/en_dlg.js b/creme/static/tiny_mce/plugins/template/langs/en_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/template/langs/en_dlg.js rename to creme/static/tiny_mce/plugins/template/langs/en_dlg.js diff --git a/creme/media/tiny_mce/plugins/template/langs/fr_dlg.js b/creme/static/tiny_mce/plugins/template/langs/fr_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/template/langs/fr_dlg.js rename to creme/static/tiny_mce/plugins/template/langs/fr_dlg.js diff --git a/creme/media/tiny_mce/plugins/template/template.htm b/creme/static/tiny_mce/plugins/template/template.htm similarity index 100% rename from creme/media/tiny_mce/plugins/template/template.htm rename to creme/static/tiny_mce/plugins/template/template.htm diff --git a/creme/media/tiny_mce/plugins/visualchars/editor_plugin.js b/creme/static/tiny_mce/plugins/visualchars/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/visualchars/editor_plugin.js rename to creme/static/tiny_mce/plugins/visualchars/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/visualchars/editor_plugin_src.js b/creme/static/tiny_mce/plugins/visualchars/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/visualchars/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/visualchars/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/wordcount/editor_plugin.js b/creme/static/tiny_mce/plugins/wordcount/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/wordcount/editor_plugin.js rename to creme/static/tiny_mce/plugins/wordcount/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/wordcount/editor_plugin_src.js b/creme/static/tiny_mce/plugins/wordcount/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/wordcount/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/wordcount/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/xhtmlxtras/abbr.htm b/creme/static/tiny_mce/plugins/xhtmlxtras/abbr.htm similarity index 100% rename from creme/media/tiny_mce/plugins/xhtmlxtras/abbr.htm rename to creme/static/tiny_mce/plugins/xhtmlxtras/abbr.htm diff --git a/creme/media/tiny_mce/plugins/xhtmlxtras/acronym.htm b/creme/static/tiny_mce/plugins/xhtmlxtras/acronym.htm similarity index 100% rename from creme/media/tiny_mce/plugins/xhtmlxtras/acronym.htm rename to creme/static/tiny_mce/plugins/xhtmlxtras/acronym.htm diff --git a/creme/media/tiny_mce/plugins/xhtmlxtras/attributes.htm b/creme/static/tiny_mce/plugins/xhtmlxtras/attributes.htm similarity index 100% rename from creme/media/tiny_mce/plugins/xhtmlxtras/attributes.htm rename to creme/static/tiny_mce/plugins/xhtmlxtras/attributes.htm diff --git a/creme/media/tiny_mce/plugins/xhtmlxtras/cite.htm b/creme/static/tiny_mce/plugins/xhtmlxtras/cite.htm similarity index 100% rename from creme/media/tiny_mce/plugins/xhtmlxtras/cite.htm rename to creme/static/tiny_mce/plugins/xhtmlxtras/cite.htm diff --git a/creme/media/tiny_mce/plugins/xhtmlxtras/css/attributes.css b/creme/static/tiny_mce/plugins/xhtmlxtras/css/attributes.css similarity index 100% rename from creme/media/tiny_mce/plugins/xhtmlxtras/css/attributes.css rename to creme/static/tiny_mce/plugins/xhtmlxtras/css/attributes.css diff --git a/creme/media/tiny_mce/plugins/xhtmlxtras/css/popup.css b/creme/static/tiny_mce/plugins/xhtmlxtras/css/popup.css similarity index 100% rename from creme/media/tiny_mce/plugins/xhtmlxtras/css/popup.css rename to creme/static/tiny_mce/plugins/xhtmlxtras/css/popup.css diff --git a/creme/media/tiny_mce/plugins/xhtmlxtras/del.htm b/creme/static/tiny_mce/plugins/xhtmlxtras/del.htm similarity index 100% rename from creme/media/tiny_mce/plugins/xhtmlxtras/del.htm rename to creme/static/tiny_mce/plugins/xhtmlxtras/del.htm diff --git a/creme/media/tiny_mce/plugins/xhtmlxtras/editor_plugin.js b/creme/static/tiny_mce/plugins/xhtmlxtras/editor_plugin.js similarity index 100% rename from creme/media/tiny_mce/plugins/xhtmlxtras/editor_plugin.js rename to creme/static/tiny_mce/plugins/xhtmlxtras/editor_plugin.js diff --git a/creme/media/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js b/creme/static/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js similarity index 100% rename from creme/media/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js rename to creme/static/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js diff --git a/creme/media/tiny_mce/plugins/xhtmlxtras/ins.htm b/creme/static/tiny_mce/plugins/xhtmlxtras/ins.htm similarity index 100% rename from creme/media/tiny_mce/plugins/xhtmlxtras/ins.htm rename to creme/static/tiny_mce/plugins/xhtmlxtras/ins.htm diff --git a/creme/media/tiny_mce/plugins/xhtmlxtras/js/abbr.js b/creme/static/tiny_mce/plugins/xhtmlxtras/js/abbr.js similarity index 100% rename from creme/media/tiny_mce/plugins/xhtmlxtras/js/abbr.js rename to creme/static/tiny_mce/plugins/xhtmlxtras/js/abbr.js diff --git a/creme/media/tiny_mce/plugins/xhtmlxtras/js/acronym.js b/creme/static/tiny_mce/plugins/xhtmlxtras/js/acronym.js similarity index 100% rename from creme/media/tiny_mce/plugins/xhtmlxtras/js/acronym.js rename to creme/static/tiny_mce/plugins/xhtmlxtras/js/acronym.js diff --git a/creme/media/tiny_mce/plugins/xhtmlxtras/js/attributes.js b/creme/static/tiny_mce/plugins/xhtmlxtras/js/attributes.js similarity index 100% rename from creme/media/tiny_mce/plugins/xhtmlxtras/js/attributes.js rename to creme/static/tiny_mce/plugins/xhtmlxtras/js/attributes.js diff --git a/creme/media/tiny_mce/plugins/xhtmlxtras/js/cite.js b/creme/static/tiny_mce/plugins/xhtmlxtras/js/cite.js similarity index 100% rename from creme/media/tiny_mce/plugins/xhtmlxtras/js/cite.js rename to creme/static/tiny_mce/plugins/xhtmlxtras/js/cite.js diff --git a/creme/media/tiny_mce/plugins/xhtmlxtras/js/del.js b/creme/static/tiny_mce/plugins/xhtmlxtras/js/del.js similarity index 100% rename from creme/media/tiny_mce/plugins/xhtmlxtras/js/del.js rename to creme/static/tiny_mce/plugins/xhtmlxtras/js/del.js diff --git a/creme/media/tiny_mce/plugins/xhtmlxtras/js/element_common.js b/creme/static/tiny_mce/plugins/xhtmlxtras/js/element_common.js similarity index 100% rename from creme/media/tiny_mce/plugins/xhtmlxtras/js/element_common.js rename to creme/static/tiny_mce/plugins/xhtmlxtras/js/element_common.js diff --git a/creme/media/tiny_mce/plugins/xhtmlxtras/js/ins.js b/creme/static/tiny_mce/plugins/xhtmlxtras/js/ins.js similarity index 100% rename from creme/media/tiny_mce/plugins/xhtmlxtras/js/ins.js rename to creme/static/tiny_mce/plugins/xhtmlxtras/js/ins.js diff --git a/creme/media/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js b/creme/static/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js rename to creme/static/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js diff --git a/creme/media/tiny_mce/plugins/xhtmlxtras/langs/fr_dlg.js b/creme/static/tiny_mce/plugins/xhtmlxtras/langs/fr_dlg.js similarity index 100% rename from creme/media/tiny_mce/plugins/xhtmlxtras/langs/fr_dlg.js rename to creme/static/tiny_mce/plugins/xhtmlxtras/langs/fr_dlg.js diff --git a/creme/media/tiny_mce/themes/advanced/about.htm b/creme/static/tiny_mce/themes/advanced/about.htm similarity index 100% rename from creme/media/tiny_mce/themes/advanced/about.htm rename to creme/static/tiny_mce/themes/advanced/about.htm diff --git a/creme/media/tiny_mce/themes/advanced/anchor.htm b/creme/static/tiny_mce/themes/advanced/anchor.htm similarity index 100% rename from creme/media/tiny_mce/themes/advanced/anchor.htm rename to creme/static/tiny_mce/themes/advanced/anchor.htm diff --git a/creme/media/tiny_mce/themes/advanced/charmap.htm b/creme/static/tiny_mce/themes/advanced/charmap.htm similarity index 100% rename from creme/media/tiny_mce/themes/advanced/charmap.htm rename to creme/static/tiny_mce/themes/advanced/charmap.htm diff --git a/creme/media/tiny_mce/themes/advanced/color_picker.htm b/creme/static/tiny_mce/themes/advanced/color_picker.htm similarity index 100% rename from creme/media/tiny_mce/themes/advanced/color_picker.htm rename to creme/static/tiny_mce/themes/advanced/color_picker.htm diff --git a/creme/media/tiny_mce/themes/advanced/editor_template.js b/creme/static/tiny_mce/themes/advanced/editor_template.js similarity index 100% rename from creme/media/tiny_mce/themes/advanced/editor_template.js rename to creme/static/tiny_mce/themes/advanced/editor_template.js diff --git a/creme/media/tiny_mce/themes/advanced/editor_template_src.js b/creme/static/tiny_mce/themes/advanced/editor_template_src.js similarity index 100% rename from creme/media/tiny_mce/themes/advanced/editor_template_src.js rename to creme/static/tiny_mce/themes/advanced/editor_template_src.js diff --git a/creme/media/tiny_mce/themes/advanced/image.htm b/creme/static/tiny_mce/themes/advanced/image.htm similarity index 100% rename from creme/media/tiny_mce/themes/advanced/image.htm rename to creme/static/tiny_mce/themes/advanced/image.htm diff --git a/creme/media/tiny_mce/themes/advanced/img/colorpicker.jpg b/creme/static/tiny_mce/themes/advanced/img/colorpicker.jpg similarity index 100% rename from creme/media/tiny_mce/themes/advanced/img/colorpicker.jpg rename to creme/static/tiny_mce/themes/advanced/img/colorpicker.jpg diff --git a/creme/media/tiny_mce/themes/advanced/img/flash.gif b/creme/static/tiny_mce/themes/advanced/img/flash.gif similarity index 100% rename from creme/media/tiny_mce/themes/advanced/img/flash.gif rename to creme/static/tiny_mce/themes/advanced/img/flash.gif diff --git a/creme/media/tiny_mce/themes/advanced/img/icons.gif b/creme/static/tiny_mce/themes/advanced/img/icons.gif similarity index 100% rename from creme/media/tiny_mce/themes/advanced/img/icons.gif rename to creme/static/tiny_mce/themes/advanced/img/icons.gif diff --git a/creme/media/tiny_mce/themes/advanced/img/iframe.gif b/creme/static/tiny_mce/themes/advanced/img/iframe.gif similarity index 100% rename from creme/media/tiny_mce/themes/advanced/img/iframe.gif rename to creme/static/tiny_mce/themes/advanced/img/iframe.gif diff --git a/creme/media/tiny_mce/themes/advanced/img/pagebreak.gif b/creme/static/tiny_mce/themes/advanced/img/pagebreak.gif similarity index 100% rename from creme/media/tiny_mce/themes/advanced/img/pagebreak.gif rename to creme/static/tiny_mce/themes/advanced/img/pagebreak.gif diff --git a/creme/media/tiny_mce/themes/advanced/img/quicktime.gif b/creme/static/tiny_mce/themes/advanced/img/quicktime.gif similarity index 100% rename from creme/media/tiny_mce/themes/advanced/img/quicktime.gif rename to creme/static/tiny_mce/themes/advanced/img/quicktime.gif diff --git a/creme/media/tiny_mce/themes/advanced/img/realmedia.gif b/creme/static/tiny_mce/themes/advanced/img/realmedia.gif similarity index 100% rename from creme/media/tiny_mce/themes/advanced/img/realmedia.gif rename to creme/static/tiny_mce/themes/advanced/img/realmedia.gif diff --git a/creme/media/tiny_mce/themes/advanced/img/shockwave.gif b/creme/static/tiny_mce/themes/advanced/img/shockwave.gif similarity index 100% rename from creme/media/tiny_mce/themes/advanced/img/shockwave.gif rename to creme/static/tiny_mce/themes/advanced/img/shockwave.gif diff --git a/creme/media/tiny_mce/themes/advanced/img/trans.gif b/creme/static/tiny_mce/themes/advanced/img/trans.gif similarity index 100% rename from creme/media/tiny_mce/themes/advanced/img/trans.gif rename to creme/static/tiny_mce/themes/advanced/img/trans.gif diff --git a/creme/media/tiny_mce/themes/advanced/img/video.gif b/creme/static/tiny_mce/themes/advanced/img/video.gif similarity index 100% rename from creme/media/tiny_mce/themes/advanced/img/video.gif rename to creme/static/tiny_mce/themes/advanced/img/video.gif diff --git a/creme/media/tiny_mce/themes/advanced/img/windowsmedia.gif b/creme/static/tiny_mce/themes/advanced/img/windowsmedia.gif similarity index 100% rename from creme/media/tiny_mce/themes/advanced/img/windowsmedia.gif rename to creme/static/tiny_mce/themes/advanced/img/windowsmedia.gif diff --git a/creme/media/tiny_mce/themes/advanced/js/about.js b/creme/static/tiny_mce/themes/advanced/js/about.js similarity index 100% rename from creme/media/tiny_mce/themes/advanced/js/about.js rename to creme/static/tiny_mce/themes/advanced/js/about.js diff --git a/creme/media/tiny_mce/themes/advanced/js/anchor.js b/creme/static/tiny_mce/themes/advanced/js/anchor.js similarity index 100% rename from creme/media/tiny_mce/themes/advanced/js/anchor.js rename to creme/static/tiny_mce/themes/advanced/js/anchor.js diff --git a/creme/media/tiny_mce/themes/advanced/js/charmap.js b/creme/static/tiny_mce/themes/advanced/js/charmap.js similarity index 100% rename from creme/media/tiny_mce/themes/advanced/js/charmap.js rename to creme/static/tiny_mce/themes/advanced/js/charmap.js diff --git a/creme/media/tiny_mce/themes/advanced/js/color_picker.js b/creme/static/tiny_mce/themes/advanced/js/color_picker.js similarity index 100% rename from creme/media/tiny_mce/themes/advanced/js/color_picker.js rename to creme/static/tiny_mce/themes/advanced/js/color_picker.js diff --git a/creme/media/tiny_mce/themes/advanced/js/image.js b/creme/static/tiny_mce/themes/advanced/js/image.js similarity index 100% rename from creme/media/tiny_mce/themes/advanced/js/image.js rename to creme/static/tiny_mce/themes/advanced/js/image.js diff --git a/creme/media/tiny_mce/themes/advanced/js/link.js b/creme/static/tiny_mce/themes/advanced/js/link.js similarity index 100% rename from creme/media/tiny_mce/themes/advanced/js/link.js rename to creme/static/tiny_mce/themes/advanced/js/link.js diff --git a/creme/media/tiny_mce/themes/advanced/js/source_editor.js b/creme/static/tiny_mce/themes/advanced/js/source_editor.js similarity index 100% rename from creme/media/tiny_mce/themes/advanced/js/source_editor.js rename to creme/static/tiny_mce/themes/advanced/js/source_editor.js diff --git a/creme/media/tiny_mce/themes/advanced/langs/en.js b/creme/static/tiny_mce/themes/advanced/langs/en.js similarity index 100% rename from creme/media/tiny_mce/themes/advanced/langs/en.js rename to creme/static/tiny_mce/themes/advanced/langs/en.js diff --git a/creme/media/tiny_mce/themes/advanced/langs/en_dlg.js b/creme/static/tiny_mce/themes/advanced/langs/en_dlg.js similarity index 100% rename from creme/media/tiny_mce/themes/advanced/langs/en_dlg.js rename to creme/static/tiny_mce/themes/advanced/langs/en_dlg.js diff --git a/creme/media/tiny_mce/themes/advanced/langs/fr.js b/creme/static/tiny_mce/themes/advanced/langs/fr.js similarity index 100% rename from creme/media/tiny_mce/themes/advanced/langs/fr.js rename to creme/static/tiny_mce/themes/advanced/langs/fr.js diff --git a/creme/media/tiny_mce/themes/advanced/langs/fr_dlg.js b/creme/static/tiny_mce/themes/advanced/langs/fr_dlg.js similarity index 100% rename from creme/media/tiny_mce/themes/advanced/langs/fr_dlg.js rename to creme/static/tiny_mce/themes/advanced/langs/fr_dlg.js diff --git a/creme/media/tiny_mce/themes/advanced/link.htm b/creme/static/tiny_mce/themes/advanced/link.htm similarity index 100% rename from creme/media/tiny_mce/themes/advanced/link.htm rename to creme/static/tiny_mce/themes/advanced/link.htm diff --git a/creme/media/tiny_mce/themes/advanced/shortcuts.htm b/creme/static/tiny_mce/themes/advanced/shortcuts.htm similarity index 100% rename from creme/media/tiny_mce/themes/advanced/shortcuts.htm rename to creme/static/tiny_mce/themes/advanced/shortcuts.htm diff --git a/creme/media/tiny_mce/themes/advanced/skins/default/content.css b/creme/static/tiny_mce/themes/advanced/skins/default/content.css similarity index 100% rename from creme/media/tiny_mce/themes/advanced/skins/default/content.css rename to creme/static/tiny_mce/themes/advanced/skins/default/content.css diff --git a/creme/media/tiny_mce/themes/advanced/skins/default/dialog.css b/creme/static/tiny_mce/themes/advanced/skins/default/dialog.css similarity index 100% rename from creme/media/tiny_mce/themes/advanced/skins/default/dialog.css rename to creme/static/tiny_mce/themes/advanced/skins/default/dialog.css diff --git a/creme/media/tiny_mce/themes/advanced/skins/default/img/buttons.png b/creme/static/tiny_mce/themes/advanced/skins/default/img/buttons.png similarity index 100% rename from creme/media/tiny_mce/themes/advanced/skins/default/img/buttons.png rename to creme/static/tiny_mce/themes/advanced/skins/default/img/buttons.png diff --git a/creme/media/tiny_mce/themes/advanced/skins/default/img/items.gif b/creme/static/tiny_mce/themes/advanced/skins/default/img/items.gif similarity index 100% rename from creme/media/tiny_mce/themes/advanced/skins/default/img/items.gif rename to creme/static/tiny_mce/themes/advanced/skins/default/img/items.gif diff --git a/creme/media/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif b/creme/static/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif similarity index 100% rename from creme/media/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif rename to creme/static/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif diff --git a/creme/media/tiny_mce/themes/advanced/skins/default/img/menu_check.gif b/creme/static/tiny_mce/themes/advanced/skins/default/img/menu_check.gif similarity index 100% rename from creme/media/tiny_mce/themes/advanced/skins/default/img/menu_check.gif rename to creme/static/tiny_mce/themes/advanced/skins/default/img/menu_check.gif diff --git a/creme/media/tiny_mce/themes/advanced/skins/default/img/progress.gif b/creme/static/tiny_mce/themes/advanced/skins/default/img/progress.gif similarity index 100% rename from creme/media/tiny_mce/themes/advanced/skins/default/img/progress.gif rename to creme/static/tiny_mce/themes/advanced/skins/default/img/progress.gif diff --git a/creme/media/tiny_mce/themes/advanced/skins/default/img/tabs.gif b/creme/static/tiny_mce/themes/advanced/skins/default/img/tabs.gif similarity index 100% rename from creme/media/tiny_mce/themes/advanced/skins/default/img/tabs.gif rename to creme/static/tiny_mce/themes/advanced/skins/default/img/tabs.gif diff --git a/creme/media/tiny_mce/themes/advanced/skins/default/ui.css b/creme/static/tiny_mce/themes/advanced/skins/default/ui.css similarity index 100% rename from creme/media/tiny_mce/themes/advanced/skins/default/ui.css rename to creme/static/tiny_mce/themes/advanced/skins/default/ui.css diff --git a/creme/media/tiny_mce/themes/advanced/skins/highcontrast/content.css b/creme/static/tiny_mce/themes/advanced/skins/highcontrast/content.css similarity index 100% rename from creme/media/tiny_mce/themes/advanced/skins/highcontrast/content.css rename to creme/static/tiny_mce/themes/advanced/skins/highcontrast/content.css diff --git a/creme/media/tiny_mce/themes/advanced/skins/highcontrast/dialog.css b/creme/static/tiny_mce/themes/advanced/skins/highcontrast/dialog.css similarity index 100% rename from creme/media/tiny_mce/themes/advanced/skins/highcontrast/dialog.css rename to creme/static/tiny_mce/themes/advanced/skins/highcontrast/dialog.css diff --git a/creme/media/tiny_mce/themes/advanced/skins/highcontrast/ui.css b/creme/static/tiny_mce/themes/advanced/skins/highcontrast/ui.css similarity index 100% rename from creme/media/tiny_mce/themes/advanced/skins/highcontrast/ui.css rename to creme/static/tiny_mce/themes/advanced/skins/highcontrast/ui.css diff --git a/creme/media/tiny_mce/themes/advanced/skins/o2k7/content.css b/creme/static/tiny_mce/themes/advanced/skins/o2k7/content.css similarity index 100% rename from creme/media/tiny_mce/themes/advanced/skins/o2k7/content.css rename to creme/static/tiny_mce/themes/advanced/skins/o2k7/content.css diff --git a/creme/media/tiny_mce/themes/advanced/skins/o2k7/dialog.css b/creme/static/tiny_mce/themes/advanced/skins/o2k7/dialog.css similarity index 100% rename from creme/media/tiny_mce/themes/advanced/skins/o2k7/dialog.css rename to creme/static/tiny_mce/themes/advanced/skins/o2k7/dialog.css diff --git a/creme/media/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png b/creme/static/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png similarity index 100% rename from creme/media/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png rename to creme/static/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png diff --git a/creme/media/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png b/creme/static/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png similarity index 100% rename from creme/media/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png rename to creme/static/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png diff --git a/creme/media/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png b/creme/static/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png similarity index 100% rename from creme/media/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png rename to creme/static/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png diff --git a/creme/media/tiny_mce/themes/advanced/skins/o2k7/ui.css b/creme/static/tiny_mce/themes/advanced/skins/o2k7/ui.css similarity index 100% rename from creme/media/tiny_mce/themes/advanced/skins/o2k7/ui.css rename to creme/static/tiny_mce/themes/advanced/skins/o2k7/ui.css diff --git a/creme/media/tiny_mce/themes/advanced/skins/o2k7/ui_black.css b/creme/static/tiny_mce/themes/advanced/skins/o2k7/ui_black.css similarity index 100% rename from creme/media/tiny_mce/themes/advanced/skins/o2k7/ui_black.css rename to creme/static/tiny_mce/themes/advanced/skins/o2k7/ui_black.css diff --git a/creme/media/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css b/creme/static/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css similarity index 100% rename from creme/media/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css rename to creme/static/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css diff --git a/creme/media/tiny_mce/themes/advanced/source_editor.htm b/creme/static/tiny_mce/themes/advanced/source_editor.htm similarity index 100% rename from creme/media/tiny_mce/themes/advanced/source_editor.htm rename to creme/static/tiny_mce/themes/advanced/source_editor.htm diff --git a/creme/media/tiny_mce/themes/simple/editor_template.js b/creme/static/tiny_mce/themes/simple/editor_template.js similarity index 100% rename from creme/media/tiny_mce/themes/simple/editor_template.js rename to creme/static/tiny_mce/themes/simple/editor_template.js diff --git a/creme/media/tiny_mce/themes/simple/editor_template_src.js b/creme/static/tiny_mce/themes/simple/editor_template_src.js similarity index 100% rename from creme/media/tiny_mce/themes/simple/editor_template_src.js rename to creme/static/tiny_mce/themes/simple/editor_template_src.js diff --git a/creme/media/tiny_mce/themes/simple/img/icons.gif b/creme/static/tiny_mce/themes/simple/img/icons.gif similarity index 100% rename from creme/media/tiny_mce/themes/simple/img/icons.gif rename to creme/static/tiny_mce/themes/simple/img/icons.gif diff --git a/creme/media/tiny_mce/themes/simple/langs/en.js b/creme/static/tiny_mce/themes/simple/langs/en.js similarity index 100% rename from creme/media/tiny_mce/themes/simple/langs/en.js rename to creme/static/tiny_mce/themes/simple/langs/en.js diff --git a/creme/media/tiny_mce/themes/simple/langs/fr.js b/creme/static/tiny_mce/themes/simple/langs/fr.js similarity index 100% rename from creme/media/tiny_mce/themes/simple/langs/fr.js rename to creme/static/tiny_mce/themes/simple/langs/fr.js diff --git a/creme/media/tiny_mce/themes/simple/skins/default/content.css b/creme/static/tiny_mce/themes/simple/skins/default/content.css similarity index 100% rename from creme/media/tiny_mce/themes/simple/skins/default/content.css rename to creme/static/tiny_mce/themes/simple/skins/default/content.css diff --git a/creme/media/tiny_mce/themes/simple/skins/default/ui.css b/creme/static/tiny_mce/themes/simple/skins/default/ui.css similarity index 100% rename from creme/media/tiny_mce/themes/simple/skins/default/ui.css rename to creme/static/tiny_mce/themes/simple/skins/default/ui.css diff --git a/creme/media/tiny_mce/themes/simple/skins/o2k7/content.css b/creme/static/tiny_mce/themes/simple/skins/o2k7/content.css similarity index 100% rename from creme/media/tiny_mce/themes/simple/skins/o2k7/content.css rename to creme/static/tiny_mce/themes/simple/skins/o2k7/content.css diff --git a/creme/media/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png b/creme/static/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png similarity index 100% rename from creme/media/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png rename to creme/static/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png diff --git a/creme/media/tiny_mce/themes/simple/skins/o2k7/ui.css b/creme/static/tiny_mce/themes/simple/skins/o2k7/ui.css similarity index 100% rename from creme/media/tiny_mce/themes/simple/skins/o2k7/ui.css rename to creme/static/tiny_mce/themes/simple/skins/o2k7/ui.css diff --git a/creme/media/tiny_mce/tiny_mce.js b/creme/static/tiny_mce/tiny_mce.js similarity index 100% rename from creme/media/tiny_mce/tiny_mce.js rename to creme/static/tiny_mce/tiny_mce.js diff --git a/creme/media/tiny_mce/tiny_mce_popup.js b/creme/static/tiny_mce/tiny_mce_popup.js similarity index 100% rename from creme/media/tiny_mce/tiny_mce_popup.js rename to creme/static/tiny_mce/tiny_mce_popup.js diff --git a/creme/media/tiny_mce/tiny_mce_src.js b/creme/static/tiny_mce/tiny_mce_src.js similarity index 100% rename from creme/media/tiny_mce/tiny_mce_src.js rename to creme/static/tiny_mce/tiny_mce_src.js diff --git a/creme/media/tiny_mce/utils/editable_selects.js b/creme/static/tiny_mce/utils/editable_selects.js similarity index 100% rename from creme/media/tiny_mce/utils/editable_selects.js rename to creme/static/tiny_mce/utils/editable_selects.js diff --git a/creme/media/tiny_mce/utils/form_utils.js b/creme/static/tiny_mce/utils/form_utils.js similarity index 100% rename from creme/media/tiny_mce/utils/form_utils.js rename to creme/static/tiny_mce/utils/form_utils.js diff --git a/creme/media/tiny_mce/utils/mctabs.js b/creme/static/tiny_mce/utils/mctabs.js similarity index 100% rename from creme/media/tiny_mce/utils/mctabs.js rename to creme/static/tiny_mce/utils/mctabs.js diff --git a/creme/media/tiny_mce/utils/validate.js b/creme/static/tiny_mce/utils/validate.js similarity index 100% rename from creme/media/tiny_mce/utils/validate.js rename to creme/static/tiny_mce/utils/validate.js From 8e04cfadfa0ce1245ab13c0e273e735c2e626186 Mon Sep 17 00:00:00 2001 From: Hugo Smett Date: Sat, 24 Oct 2020 13:51:18 +0200 Subject: [PATCH 5/5] django-pipeline POC --- .circleci/config.yml | 4 - .gitignore | 2 +- Makefile | 18 +- README | 1 - .../templates/billing/bricks/exporters.html | 6 +- .../forms/widgets/exporter-option.html | 6 +- creme/creme_core/forms/widgets.py | 4 +- .../commands/i18n_javascript_catalog.py | 77 ++ .../chantilly/creme_core/css/creme-ui.css | 24 +- .../static/chantilly/creme_core/css/creme.css | 10 +- .../chantilly/creme_core/css/popover.css | 2 +- .../creme_core/static/creme_core/js/media.js | 2 +- .../icecream/creme_core/css/creme-ui.css | 28 +- .../static/icecream/creme_core/css/creme.css | 28 +- .../icecream/creme_core/css/popover.css | 2 +- .../creme_core/templates/creme_core/base.html | 15 +- .../templates/creme_core/frags/js_header.html | 4 - .../creme_core/header/menu-base.html | 7 +- .../creme_core/templatetags/bricks/title.html | 3 +- .../templates/creme_core/test_js.html | 12 +- .../templates/creme_core/tests/test.html | 1 - .../creme_core/tests/test_actions.html | 1 - .../creme_core/tests/test_blocklist.html | 1 - .../tests/test_checklistselect.html | 1 - .../creme_core/tests/test_chosen.html | 1 - .../creme_core/tests/test_combobox.html | 1 - .../creme_core/tests/test_entityselector.html | 2 +- .../creme_core/tests/test_filterselector.html | 1 - .../creme_core/tests/test_frame.html | 5 +- .../creme_core/tests/test_jqplot.html | 1 - .../creme_core/tests/test_layout.html | 1 - .../creme_core/tests/test_model.html | 1 - .../creme_core/tests/test_plotselector.html | 1 - .../tests/test_polymorphicselector.html | 1 - .../creme_core/tests/test_popover.html | 1 - .../creme_core/tests/test_toggle.html | 1 - .../templates/creme_core/tests/testbase.html | 13 +- .../templatetags/creme_core_tags.py | 25 - creme/creme_core/tests/views/test_main.py | 23 +- creme/creme_core/utils/media.py | 9 +- creme/creme_core/utils/test.py | 1 + creme/creme_core/views/testjs.py | 5 +- creme/mobile/templates/mobile/css/base.css | 16 +- creme/mobile/templates/mobile/index.html | 2 +- creme/settings.py | 800 +++++++++--------- creme/static/en.js | 147 ++++ creme/static/fr.js | 320 +++++++ .../tiny_mce/plugins/fullpage/images/add.gif | 0 .../plugins/fullpage/images/move_down.gif | 0 .../plugins/fullpage/images/move_up.gif | 0 .../plugins/fullpage/images/remove.gif | 0 .../closure/closure-compiler-v20200112.jar | Bin .../static/utils/yui/yuicompressor-2.4.2.jar | Bin creme/templates/400.html | 4 +- creme/templates/403.html | 4 +- creme/templates/404.html | 4 +- creme/templates/409.html | 4 +- creme/templates/500.html | 4 +- creme/templates/about/base.html | 26 +- creme/templates/authent/base.html | 26 +- creme/templates/error-base.html | 24 +- creme/templates/footer/base.html | 2 +- creme/urls.py | 18 - 63 files changed, 1107 insertions(+), 646 deletions(-) create mode 100644 creme/creme_core/management/commands/i18n_javascript_catalog.py delete mode 100644 creme/creme_core/templates/creme_core/frags/js_header.html create mode 100644 creme/static/en.js create mode 100644 creme/static/fr.js create mode 100644 creme/static/tiny_mce/plugins/fullpage/images/add.gif create mode 100644 creme/static/tiny_mce/plugins/fullpage/images/move_down.gif create mode 100644 creme/static/tiny_mce/plugins/fullpage/images/move_up.gif create mode 100644 creme/static/tiny_mce/plugins/fullpage/images/remove.gif mode change 100644 => 100755 creme/static/utils/closure/closure-compiler-v20200112.jar mode change 100644 => 100755 creme/static/utils/yui/yuicompressor-2.4.2.jar diff --git a/.circleci/config.yml b/.circleci/config.yml index 8b42d6340c..b350302553 100755 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -114,7 +114,6 @@ jobs: - run: cp ~/project/.circleci/mysql_settings.py creme/local_settings.py - run: python creme/manage.py migrate - run: python creme/manage.py creme_populate - - run: python creme/manage.py generatemedia - run: COVERAGE_PROCESS_START=setup.cfg coverage run --source creme/ creme/manage.py test --noinput --parallel=6 - run: coverage combine - run: coverage html @@ -146,7 +145,6 @@ jobs: - run: cp ~/project/.circleci/pgsql_settings.py creme/local_settings.py - run: python creme/manage.py migrate - run: python creme/manage.py creme_populate - - run: python creme/manage.py generatemedia - run: COVERAGE_PROCESS_START=setup.cfg coverage run --source creme/ creme/manage.py test --noinput --parallel=8 - run: coverage combine - run: coverage html @@ -169,7 +167,6 @@ jobs: - run: cp ~/project/.circleci/sqlite3_settings.py creme/local_settings.py - run: python creme/manage.py migrate - run: python creme/manage.py creme_populate - - run: python creme/manage.py generatemedia - run: COVERAGE_PROCESS_START=setup.cfg coverage run --source creme/ creme/manage.py test --noinput --parallel=8 - run: coverage combine - run: coverage html @@ -197,7 +194,6 @@ jobs: - install-creme-system-packages - install-py-dev-env - run: cp ~/project/.circleci/circleci_settings.py creme/project_settings.py - - run: python creme/manage.py generatemedia - install-node-env - run: name: Run javascript tests diff --git a/.gitignore b/.gitignore index b7dbdbbd56..e15f36d0c0 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,7 @@ django.wsgi creme/media/upload/*/* creme/media/static/* -_generated_media_names.py +creme/collected_statics/* *.sqlite *.db diff --git a/Makefile b/Makefile index c90c8a5456..2d874ed231 100644 --- a/Makefile +++ b/Makefile @@ -30,18 +30,11 @@ update-requirements: pip install --upgrade -e .[dev] -## Upgrade the Python requirements, run the migrations, the creme_populate and generatemedia commands +## Upgrade the Python requirements, run the migrations and the creme_populate command .PHONY: update update: update-requirements python creme/manage.py migrate python creme/manage.py creme_populate - python creme/manage.py generatemedia - - -## Generate the media files -.PHONY: media -media: - python creme/manage.py generatemedia ## Run the Django test suite @@ -74,11 +67,11 @@ karma-clean: ## Run the Javascript test suite .PHONY: karma -karma: media karma-clean +karma: karma-clean node_modules/.bin/karma start .karma.conf.js --browsers=FirefoxHeadless --targets=$(filter-out $@,$(MAKECMDGOALS)) @echo "file://$(shell pwd)/artifacts/karma_coverage/html/index.html" -karma-browsers: media karma-clean +karma-browsers: karma-clean CHROME_BIN=/usr/bin/google-chrome \ node_modules/.bin/karma start .karma.conf.js \ --browsers=FirefoxHeadless,ChromiumHeadless,ChromeHeadless \ @@ -87,7 +80,7 @@ karma-browsers: media karma-clean @echo "file://$(shell pwd)/artifacts/karma_coverage/html/index.html" -## Run the Javascript test suite in CI (generatemedia is supposed to be already done) +## Run the Javascript test suite in CI .PHONY: karma-ci karma-ci: node_modules/.bin/karma start .circleci/.karma.conf.js --targets=$(filter-out $@,$(MAKECMDGOALS)) @@ -95,7 +88,7 @@ karma-ci: ## Run the application .PHONY: serve -serve: media +serve: python creme/manage.py runserver @@ -251,6 +244,7 @@ gettext-collect: .PHONY: gettext-compile gettext-compile: django-admin.py compilemessages -l ${CREME_LANGUAGE} + python creme/manage.py i18n_javascript_catalog ## Print this message diff --git a/README b/README index 2f9627f73e..118dfe7e6e 100644 --- a/README +++ b/README @@ -139,7 +139,6 @@ For an upgrade from Creme 1.8 : Filling the DB tables: Run the following commands in the root directory: >> python creme/manage.py migrate - >> python creme/manage.py generatemedia >> python creme/manage.py creme_populate If you are upgrading from Creme 2.0, clean all existing sessions, for example like this: diff --git a/creme/billing/templates/billing/bricks/exporters.html b/creme/billing/templates/billing/bricks/exporters.html index 9603d0f5d4..77b2362f80 100644 --- a/creme/billing/templates/billing/bricks/exporters.html +++ b/creme/billing/templates/billing/bricks/exporters.html @@ -1,5 +1,5 @@ {% extends 'creme_core/bricks/base/table.html' %} -{% load i18n media creme_bricks %} +{% load i18n static creme_bricks %} {% block brick_extra_class %}{{block.super}} billing-exporters-brick{% endblock %} @@ -27,8 +27,8 @@ {{exporter.verbose_name}}
{% for img_src in exporter.screenshots %} - - + + {% endfor %}
diff --git a/creme/billing/templates/billing/forms/widgets/exporter-option.html b/creme/billing/templates/billing/forms/widgets/exporter-option.html index 1e1848c974..d411f902e4 100644 --- a/creme/billing/templates/billing/forms/widgets/exporter-option.html +++ b/creme/billing/templates/billing/forms/widgets/exporter-option.html @@ -1,12 +1,12 @@ -{% load media %} +{% load static %} {% if widget.wrap_label %}{% endif %} {% include 'django/forms/widgets/input.html' %} {% if widget.wrap_label %}
{% for img_src in widget.value.images %} - - + + {% endfor %}
diff --git a/creme/creme_core/forms/widgets.py b/creme/creme_core/forms/widgets.py index 2855f9a2e3..26775e2fd3 100644 --- a/creme/creme_core/forms/widgets.py +++ b/creme/creme_core/forms/widgets.py @@ -29,6 +29,7 @@ from django.contrib.contenttypes.models import ContentType from django.db.models.query_utils import Q from django.forms import widgets +from django.templatetags.static import static from django.urls import reverse from django.utils.translation import gettext as _ from django.utils.translation import gettext_lazy, pgettext, pgettext_lazy @@ -968,8 +969,7 @@ def get_context(self, name, value, attrs): final_attrs['plugin'] = 'tinymce' final_attrs['plugin_options'] = json_dump({ 'mode': 'textareas', - # 'script_url': f'{settings.MEDIA_URL}tiny_mce/tiny_mce.js', - 'script_url': '/tiny_mce/tiny_mce.js', # See root urls.py + 'script_url': static('/tiny_mce/tiny_mce.js'), 'convert_urls': False, 'theme': 'advanced', 'height': 300, diff --git a/creme/creme_core/management/commands/i18n_javascript_catalog.py b/creme/creme_core/management/commands/i18n_javascript_catalog.py new file mode 100644 index 0000000000..1c38c90fed --- /dev/null +++ b/creme/creme_core/management/commands/i18n_javascript_catalog.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- + +################################################################################ +# +# Copyright (c) 2018-2020 Hybird +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +################################################################################ + +import os + +from django.apps import apps +from django.conf import settings +from django.core.management.base import BaseCommand, no_translations +from django.http import HttpRequest +from django.utils import translation +from django.views.i18n import JavaScriptCatalog + + +class Command(BaseCommand): + help = 'Build a static javascript translation catalog' + + def handle_language(self, language_code): + with translation.override(language=language_code): + self.stdout.write(f"Building javascript catalog for language {language_code}...") + + language_bidi = language_code.split('-')[0] in settings.LANGUAGES_BIDI + + # Hybird FIX - Django1.10 version + # request = HttpRequest() + # request.GET['language'] = language + + # Add a header and some JavaScript data + content = ( + "// This file was auto-generated by the creme_core " + "i18n_javascript_catalog django command.\n\n" + f"var LANGUAGE_CODE = \"{language_code}\";\n" + f"var LANGUAGE_BIDI = {'true' if language_bidi else 'false'};\n" + ) + + packages = [app_config.name for app_config in apps.app_configs.values()] + catalog_view = JavaScriptCatalog(packages=packages) + content += catalog_view.get(HttpRequest()).content.decode() + + # The hgettext() function just calls gettext() internally, + # but it won't get indexed by makemessages. + content += '\nwindow.hgettext = function(text) { return gettext(text); };\n' + # Add a similar hngettext() function + content += ( + 'window.hngettext = function(singular, plural, count) { ' + 'return ngettext(singular, plural, count); ' + '};\n') + + catalog_filepath = os.path.join(settings.STATIC_CORE_ROOT, f"{language_code}.js") + with open(catalog_filepath, "w") as fd: + fd.write(content) + + @no_translations + def handle(self, **kwargs): + for language_code, language_name in settings.LANGUAGES: + self.handle_language(language_code) diff --git a/creme/creme_core/static/chantilly/creme_core/css/creme-ui.css b/creme/creme_core/static/chantilly/creme_core/css/creme-ui.css index 1d22fbaa31..d89150b5e2 100644 --- a/creme/creme_core/static/chantilly/creme_core/css/creme-ui.css +++ b/creme/creme_core/static/chantilly/creme_core/css/creme-ui.css @@ -49,7 +49,7 @@ ul.ui-layout.vbox li { position:relative; display:block; } /*----------------------------------*/ .ui-creme-selectorlist > div.add { background-repeat: no-repeat; - background-image: url("chantilly/images/add_16.png"); + background-image: url("../../images/add_16.png"); padding-left: 20px; min-height: 16px; margin: 4px 0px 4px 0px; @@ -76,7 +76,7 @@ ul.ui-layout.vbox li { position:relative; display:block; } } .ui-creme-selectorlist button[type="button"].ui-creme-actionbutton { - background-image: url("chantilly/images/add_16.png"); + background-image: url("../../images/add_16.png"); padding-left: 20px; } @@ -174,7 +174,7 @@ ul.ui-layout.vbox li { position:relative; display:block; } vertical-align: middle; } -.ui-creme-overlay.overlay-active[status="wait"] { background-image: url("chantilly/images/wait.gif"); } +.ui-creme-overlay.overlay-active[status="wait"] { background-image: url("../../images/wait.gif"); } /*----------------------------------*/ .ui-dialog-scrollbackground { @@ -187,14 +187,14 @@ ul.ui-layout.vbox li { position:relative; display:block; } /*----------------------------------*/ .ui-creme-jqueryplot[widget="ui-creme-jqueryplot"] { - background-image: url("chantilly/images/image_64.png"); + background-image: url("../../images/image_64.png"); background-repeat: no-repeat; background-position: 50% 50%; background-color: white; } .ui-creme-jqueryplot.widget-active[widget="ui-creme-jqueryplot"][status="wait"] { - background-image: url("chantilly/images/wait.gif"); + background-image: url("../../images/wait.gif"); } .ui-creme-jqueryplot.widget-active[widget="ui-creme-jqueryplot"][status="valid"] { @@ -247,7 +247,7 @@ ul.ui-layout.vbox li { position:relative; display:block; } } .ui-creme-jqueryplot .jqplot-target .jqplot-actions button[name="capture"] { - background-image: url("chantilly/images/image_22.png"); + background-image: url("../../images/image_22.png"); } /*----------------------------------*/ @@ -294,22 +294,22 @@ button[type="button"].ui-creme-actionbutton[disabled]:hover { } button[type="button"].ui-creme-actionbutton[name=create] { - background-image: url("chantilly/images/add_16.png"); + background-image: url("../../images/add_16.png"); padding-left: 20px; } button[type="button"].ui-creme-actionbutton[name=delete] { - background-image: url("chantilly/images/delete_16.png"); + background-image: url("../../images/delete_16.png"); padding-left: 20px; } button[type="button"].ui-creme-actionbutton[name=reset] { - background-image: url("chantilly/images/delete_16.png"); + background-image: url("../../images/delete_16.png"); padding-left: 20px; } ul.ui-creme-actionbuttonlist li button[type="button"].ui-creme-actionbutton[name=edit] { - background-image: url("chantilly/images/edit_16.png"); + background-image: url("../../images/edit_16.png"); padding-left: 20px; } @@ -332,13 +332,13 @@ span.ui-creme-datepicker-trigger { } .toggle-icon { - background-image: url("chantilly/images/expanded.gif"); + background-image: url("../../images/expanded.gif"); background-repeat: no-repeat; background-position: center; } .toggle-icon.toggle-collapsed, .toggle-collapsed .toggle-icon { - background-image: url("chantilly/images/expandme.gif"); + background-image: url("../../images/expandme.gif"); background-repeat: no-repeat; background-position: center; } diff --git a/creme/creme_core/static/chantilly/creme_core/css/creme.css b/creme/creme_core/static/chantilly/creme_core/css/creme.css index 2ba228acbd..facc04e2b7 100644 --- a/creme/creme_core/static/chantilly/creme_core/css/creme.css +++ b/creme/creme_core/static/chantilly/creme_core/css/creme.css @@ -197,7 +197,7 @@ td p { } .wait { - list-style-image : url(chantilly/images/wait.gif); + list-style-image : url("../../images/wait.gif"); } .main-content { @@ -241,7 +241,7 @@ td p { } .errorlist li { - list-style-image: url(chantilly/images/cancel_16.png); + list-style-image: url("../../images/cancel_16.png"); padding-top: 3px; } @@ -268,7 +268,7 @@ td p { } .successlist li { - list-style-image: url(chantilly/images/ok_16.png); + list-style-image: url("../../images/ok_16.png"); padding-top: 3px; } @@ -283,7 +283,7 @@ td p { } .infolist li { - list-style-image: url(chantilly/images/info_16.png); + list-style-image: url("../../images/info_16.png"); padding-top: 3px; } @@ -469,7 +469,7 @@ a[data-action] details { font-weight: 600; background-color: hsl(197, 24%, 27%); - background-image: url(common/images/creme-pattern.png); + background-image: url("../../../common/images/creme-pattern.png"); background-position: left -30px; } diff --git a/creme/creme_core/static/chantilly/creme_core/css/popover.css b/creme/creme_core/static/chantilly/creme_core/css/popover.css index 0bf515d2de..300634d586 100644 --- a/creme/creme_core/static/chantilly/creme_core/css/popover.css +++ b/creme/creme_core/static/chantilly/creme_core/css/popover.css @@ -235,7 +235,7 @@ .popover.popover-picture .picture-wait { width: 50px; height: 50px; - background-image: url("icecream/images/wait.gif"); + background-image: url("../../images/wait.gif"); background-repeat: no-repeat; background-position: 50% 50%; } diff --git a/creme/creme_core/static/creme_core/js/media.js b/creme/creme_core/static/creme_core/js/media.js index e83a94bcf9..5b8473c6cf 100644 --- a/creme/creme_core/static/creme_core/js/media.js +++ b/creme/creme_core/static/creme_core/js/media.js @@ -1,5 +1,5 @@ /* globals media_url */ /* eslint no-unused-vars: "off" */ function creme_media_url(url) { - return media_url((window.THEME_NAME || '') + "/" + url); + return window.STATIC_URL + (window.THEME_NAME || '') + "/" + url; }; diff --git a/creme/creme_core/static/icecream/creme_core/css/creme-ui.css b/creme/creme_core/static/icecream/creme_core/css/creme-ui.css index 2f611f22a8..b5b65eca54 100644 --- a/creme/creme_core/static/icecream/creme_core/css/creme-ui.css +++ b/creme/creme_core/static/icecream/creme_core/css/creme-ui.css @@ -123,7 +123,7 @@ ul.ui-layout.vbox li { /*----------------------------------*/ .ui-creme-selectorlist > div.add { background-repeat: no-repeat; - background-image: url("icecream/images/add_16.png"); + background-image: url("../../images/add_16.png"); padding-left: 20px; min-height: 16px; margin: 4px 0px 4px 0px; @@ -152,7 +152,7 @@ ul.ui-layout.vbox li { } .ui-creme-selectorlist button[type="button"].ui-creme-actionbutton { - background-image: url("icecream/images/add_16.png"); + background-image: url("../../images/add_16.png"); padding-left: 20px; } @@ -280,7 +280,7 @@ ul.ui-layout.vbox li { margin-left: 5px; } -.ui-creme-overlay.overlay-active[status="wait"] { background-image: url("icecream/images/wait.gif"); } +.ui-creme-overlay.overlay-active[status="wait"] { background-image: url("../../images/wait.gif"); } /*----------------------------------*/ .ui-dialog-scrollbackground { @@ -293,14 +293,14 @@ ul.ui-layout.vbox li { /*----------------------------------*/ .ui-creme-jqueryplot[widget="ui-creme-jqueryplot"] { - background-image: url("icecream/images/image_64.png"); /* TODO: image_48 ?? (+ delete image_64.png) */ + background-image: url("../../images/image_64.png"); /* TODO: image_48 ?? (+ delete image_64.png) */ background-repeat: no-repeat; background-position: 50% 50%; background-color: white; } .ui-creme-jqueryplot.widget-active[widget="ui-creme-jqueryplot"][status="wait"] { - background-image: url("icecream/images/wait.gif"); + background-image: url("../../images/wait.gif"); } .ui-creme-jqueryplot.widget-active[widget="ui-creme-jqueryplot"][status="valid"] { @@ -356,7 +356,7 @@ ul.ui-layout.vbox li { } .ui-creme-jqueryplot .jqplot-target .jqplot-actions button[name="capture"] { - background-image: url("icecream/images/image_22.png"); + background-image: url("../../images/image_22.png"); } /*----------------------------------*/ @@ -396,22 +396,22 @@ button[type="button"].ui-creme-actionbutton[disabled]:hover { } ul.ui-creme-actionbuttonlist li button[type="button"].ui-creme-actionbutton[name=create] { - background-image: url("icecream/images/add_16.png"); + background-image: url("../../images/add_16.png"); padding-left: 20px; } ul.ui-creme-actionbuttonlist li button[type="button"].ui-creme-actionbutton[name=delete] { - background-image: url("icecream/images/delete_16.png"); + background-image: url("../../images/delete_16.png"); padding-left: 20px; } ul.ui-creme-actionbuttonlist li button[type="button"].ui-creme-actionbutton[name=reset] { - background-image: url("icecream/images/delete_16.png"); + background-image: url("../../images/delete_16.png"); padding-left: 20px; } ul.ui-creme-actionbuttonlist li button[type="button"].ui-creme-actionbutton[name=edit] { - background-image: url("icecream/images/edit_16.png"); + background-image: url("../../images/edit_16.png"); padding-left: 20px; } @@ -434,14 +434,14 @@ span.ui-creme-datepicker-trigger { } .toggle-icon { - background-image: url("icecream/images/expanded.gif"); + background-image: url("../../images/expanded.gif"); background-repeat: no-repeat; background-position: center; } .toggle-icon.toggle-collapsed, .toggle-collapsed .toggle-icon { - background-image: url("icecream/images/expandme.gif"); + background-image: url("../../images/expandme.gif"); background-repeat: no-repeat; background-position: center; } @@ -872,7 +872,7 @@ span.ui-creme-datepicker-trigger { display: block; text-decoration: none; border: 0; - background-image: url("icecream/images/pin.png"); + background-image: url("../../images/pin.png"); background-size: contain; } @@ -887,7 +887,7 @@ span.ui-creme-datepicker-trigger { margin-left: 5px; text-decoration: none; border: 0; - background-image: url("icecream/images/unpin.png"); + background-image: url("../../images/unpin.png"); background-size: contain; } diff --git a/creme/creme_core/static/icecream/creme_core/css/creme.css b/creme/creme_core/static/icecream/creme_core/css/creme.css index 4b8ca3a614..952e57f051 100644 --- a/creme/creme_core/static/icecream/creme_core/css/creme.css +++ b/creme/creme_core/static/icecream/creme_core/css/creme.css @@ -4,27 +4,27 @@ font-family: 'Open Sans'; font-style: normal; font-weight: 400; - src: url('common/fonts/OpenSans-Regular-400.eot'); /* IE9 Compat Modes */ - src: url('common/fonts/OpenSans-Regular-400.woff') format('woff'), /* Modern Browsers */ - url('common/fonts/OpenSans-Regular.ttf') format('truetype'); /* Safari, Android, iOS */ + src: url('../../../common/fonts/OpenSans-Regular-400.eot'); /* IE9 Compat Modes */ + src: url('../../../common/fonts/OpenSans-Regular-400.woff') format('woff'), /* Modern Browsers */ + url('../../../common/fonts/OpenSans-Regular.ttf') format('truetype'); /* Safari, Android, iOS */ } @font-face { font-family: 'Open Sans'; font-style: normal; font-weight: 600; - src: url('common/fonts/OpenSans-Semibold-600.eot'); /* IE9 Compat Modes */ - src: url('common/fonts/OpenSans-Semibold-600.woff') format('woff'), /* Modern Browsers */ - url('common/fonts/OpenSans-Semibold.ttf') format('truetype'); /* Safari, Android, iOS */ + src: url('../../../common/fonts/OpenSans-Semibold-600.eot'); /* IE9 Compat Modes */ + src: url('../../../common/fonts/OpenSans-Semibold-600.woff') format('woff'), /* Modern Browsers */ + url('../../../common/fonts/OpenSans-Semibold.ttf') format('truetype'); /* Safari, Android, iOS */ } @font-face { font-family: 'Open Sans'; font-style: normal; font-weight: 700; - src: url('common/fonts/OpenSans-Bold-700.eot'); /* IE9 Compat Modes */ - src: url('common/fonts/OpenSans-Bold-700.woff') format('woff'), /* Modern Browsers */ - url('common/fonts/OpenSans-Bold.ttf') format('truetype'); /* Safari, Android, iOS */ + src: url('../../../common/fonts/OpenSans-Bold-700.eot'); /* IE9 Compat Modes */ + src: url('../../../common/fonts/OpenSans-Bold-700.woff') format('woff'), /* Modern Browsers */ + url('../../../common/fonts/OpenSans-Bold.ttf') format('truetype'); /* Safari, Android, iOS */ } html, body { @@ -294,7 +294,7 @@ button { } .wait { - list-style-image : url(icecream/images/wait.gif); + list-style-image : url(../../images/wait.gif); } /* .main_content { */ @@ -327,7 +327,7 @@ button { } .errorlist li { - list-style-image: url(icecream/images/cancel_16.png); + list-style-image: url("../../images/cancel_16.png"); padding-top: 3px; } @@ -354,7 +354,7 @@ button { } .successlist li { - list-style-image: url(icecream/images/ok_16.png); + list-style-image: url("../../images/ok_16.png"); padding-top: 3px; } @@ -369,7 +369,7 @@ button { } .infolist li { - list-style-image: url(icecream/images/info_16.png); + list-style-image: url("../../images/info_16.png"); padding-top: 3px; } @@ -520,7 +520,7 @@ a[data-action] details { font-weight: 600; background-color: #333; - background-image: url(common/images/creme-pattern.png); + background-image: url("../../../common/images/creme-pattern.png"); background-position: left -30px; } diff --git a/creme/creme_core/static/icecream/creme_core/css/popover.css b/creme/creme_core/static/icecream/creme_core/css/popover.css index b68406be7f..a643e52671 100644 --- a/creme/creme_core/static/icecream/creme_core/css/popover.css +++ b/creme/creme_core/static/icecream/creme_core/css/popover.css @@ -235,7 +235,7 @@ .popover.popover-picture .picture-wait { width: 50px; height: 50px; - background-image: url("icecream/images/wait.gif"); + background-image: url("../../images/wait.gif"); background-repeat: no-repeat; background-position: 50% 50%; } diff --git a/creme/creme_core/templates/creme_core/base.html b/creme/creme_core/templates/creme_core/base.html index 3027d27253..b41971d1d9 100644 --- a/creme/creme_core/templates/creme_core/base.html +++ b/creme/creme_core/templates/creme_core/base.html @@ -1,4 +1,4 @@ -{% load media creme_core_tags %} +{% load static pipeline creme_core_tags %} @@ -7,10 +7,17 @@ {% block page_title %}{% endblock %}Creme CRM - {% include_creme_media 'main.css' %} - {% include 'creme_core/frags/js_header.html' %} - + {% with main_bundle="main."|add:THEME_NAME %} + {% stylesheet main_bundle %} + {% endwith %} + {% with i18nlib="i18n."|add:LANGUAGE_CODE %} + {% javascript i18nlib %} + {% endwith %} + {% javascript "libs" %} + {% javascript "main" %} + {% block extrahead %}{% endblock %} {% block home_icon %} -{% comment %} One way to customize the icon without having an icon per theme: (need to load 'media') - {% trans 'Home' %} +{% comment %} One way to customize the icon without having an icon per theme: + {% trans 'Home' %} {% endcomment %} {% widget_icon name='creme' size='header-menu-home' label=_('Home') class='header-menu-home-icon' %} {% endblock %} @@ -19,7 +19,8 @@