def testEditor(self): """ Check that the theme editor backend functionality is working. """ """ TODO: - Check that theme specific properties show up on the form - Check load, save, delete modes as well as test """ # Log in as administrator and load the theme editor self.client.login(username=self.admin.username, password='******') response = self.client.get('/themes/customize/') self.assertEqual(response.status_code, 200) # Check that the "advanced" properties for all themes show up in the form # (using ThemeController directly for theme switching, since testSelector() # covers the Web interface) tc = ThemeController() theme_names = tc.get_theme_names() for theme_name in theme_names: variables_filename = os.path.join(settings.MEDIA_ROOT, 'esp', 'themes', 'theme_data', theme_name, 'variables.less') if os.path.exists(variables_filename): tc.clear_theme() tc.load_theme(theme_name) response = self.client.get('/themes/customize/') self.assertEqual(response.status_code, 200) variables = re.findall(r'@(\S+):\s+?(\S+);', open(variables_filename).read()) for (varname, value) in variables: self.assertTrue(len(re.findall(r'<input.*?name="%s".*?value="%s".*?>', response.content, flags=re.I)) > 0) # Test that we can change a parameter and the right value appears in the stylesheet def verify_linkcolor(color_str): css_filename = os.path.join(settings.MEDIA_ROOT, 'styles', themes_settings.COMPILED_CSS_FILE) regexp = r'\n\s*?a\s*?{.*?color:\s*?%s;.*?}' % color_str self.assertTrue(len(re.findall(regexp, open(css_filename).read(), flags=(re.DOTALL | re.I))) == 1) color_str1 = '#%06X' % random.randint(0, 1 << 24) config_dict = {'apply': True, 'linkColor': color_str1} response = self.client.post('/themes/customize/', config_dict) self.assertEqual(response.status_code, 200) verify_linkcolor(color_str1) # Test that we can save this setting, change it and re-load config_dict = {'save': True, 'linkColor': color_str1, 'saveThemeName': 'save_test'} response = self.client.post('/themes/customize/', config_dict) self.assertEqual(response.status_code, 200) color_str2 = '#%06X' % random.randint(0, 1 << 24) config_dict = {'apply': True, 'linkColor': color_str2} response = self.client.post('/themes/customize/', config_dict) self.assertEqual(response.status_code, 200) verify_linkcolor(color_str2) config_dict = {'load': True, 'loadThemeName': 'save_test'} response = self.client.post('/themes/customize/', config_dict) self.assertEqual(response.status_code, 200) verify_linkcolor(color_str1) # We're done. Log out. self.client.logout()
def selector(request, keep_files=None): if settings.LOCAL_THEME: raise ESPError(THEME_ERROR_STRING, log=False) context = {} tc = ThemeController() if request.method == 'POST' and 'action' in request.POST: if request.POST['action'] == 'select': theme_name = request.POST['theme'].replace(' (current)', '') # Check for differences between the theme's files and those in the working copy. # If there are differences, require a confirmation from the user for each file. differences = tc.check_local_modifications(theme_name) if len(differences) > 0 and keep_files is None: return confirm_overwrite(request, current_theme=theme_name, differences=differences, orig_view='selector') # Display configuration form if one is provided for the selected theme if tc.get_config_form_class(theme_name) is not None: return configure(request, current_theme=theme_name, force_display=True, keep_files=keep_files) tc.save_customizations('%s-last' % tc.get_current_theme()) backup_info = tc.clear_theme(keep_files=keep_files) tc.load_theme(theme_name, backup_info=backup_info) elif request.POST['action'] == 'clear': tc.save_customizations('%s-last' % tc.get_current_theme()) tc.clear_theme() context['theme_name'] = tc.get_current_theme() context['themes'] = tc.get_theme_names() return render_to_response('themes/selector.html', request, context)
def configure(request, current_theme=None, force_display=False): context = {} tc = ThemeController() if current_theme is None: current_theme = request.POST.get('theme', None) or tc.get_current_theme() context['theme_name'] = current_theme form_class = tc.get_config_form_class(current_theme) if form_class is None: form = None return render_to_response('themes/configure_form.html', request, context) if request.method == 'POST' and not force_display: form = form_class(request.POST.copy()) if form.is_valid(): # Done; save results and go back to landing page. if form.cleaned_data['theme'] != tc.get_current_theme(): tc.save_customizations('%s-last' % tc.get_current_theme()) if form.cleaned_data['just_selected']: tc.clear_theme() tc.load_theme(form.cleaned_data['theme']) form.save_to_tag() return HttpResponseRedirect('/themes/') else: form = form_class.load_from_tag(theme_name=current_theme, just_selected=force_display) context['form'] = form return render_to_response('themes/configure_form.html', request, context)
def selector(request): context = {} tc = ThemeController() if request.method == 'POST' and 'action' in request.POST: if request.POST['action'] == 'select': theme_name = request.POST['theme'].replace(' (current)', '') # Display configuration form if one is provided for the selected theme if tc.get_config_form_class(theme_name) is not None: return configure(request, current_theme=theme_name, force_display=True) tc.save_customizations('%s-last' % tc.get_current_theme()) tc.clear_theme() tc.load_theme(theme_name) elif request.POST['action'] == 'clear': tc.save_customizations('%s-last' % tc.get_current_theme()) tc.clear_theme() context['theme_name'] = tc.get_current_theme() context['themes'] = tc.get_theme_names() return render_to_response('themes/selector.html', request, context)
def configure(request, current_theme=None, force_display=False, keep_files=None): if settings.LOCAL_THEME: raise ESPError(THEME_ERROR_STRING, log=False) context = {} tc = ThemeController() if current_theme is None: current_theme = request.POST.get('theme', None) or tc.get_current_theme() context['theme_name'] = current_theme form_class = tc.get_config_form_class(current_theme) if form_class is None: form = None return render_to_response('themes/configure_form.html', request, context) if request.method == 'POST' and not force_display: form = form_class(request.POST.copy()) if form.is_valid(): # Done; save results and go back to landing page. if form.cleaned_data['theme'] != tc.get_current_theme(): tc.save_customizations('%s-last' % tc.get_current_theme()) if form.cleaned_data['just_selected']: # Detect which files (in the active media directories) are being preserved, # and use this information when reloading the theme. keep_files = request.POST.getlist('keep_files', []) backup_info = tc.clear_theme(keep_files=keep_files) tc.load_theme(form.cleaned_data['theme'], backup_info=backup_info) form.save_to_tag() return HttpResponseRedirect('/themes/') else: form = form_class.load_from_tag(theme_name=current_theme, just_selected=force_display) context['form'] = form context['keep_files'] = keep_files context['confirm_overwrite'] = request.POST.get('confirm_overwrite', '0') return render_to_response('themes/configure_form.html', request, context)