def theme_picker(request, template_name="theme_editor/theme_picker.html"): if not request.user.profile.is_superuser: raise Http403 themes = [] for theme in theme_choices(): theme_info = ThemeInfo(theme) themes.append(theme_info) if request.method == "POST": selected_theme = request.POST.get('theme') if not is_valid_theme(selected_theme): raise Http403 call_command('set_theme', selected_theme) checklist_update('choose-theme') msg_string = "Your theme has been changed to %s." % selected_theme.title( ) messages.add_message(request, messages.SUCCESS, _(msg_string)) return redirect('home') active_theme = get_active_theme() themes = sorted(themes, key=lambda theme: theme.create_dt) return render_to_resp(request=request, template_name=template_name, context={ 'themes': themes, 'current_theme': active_theme, 'theme_choices': theme_choices(), })
def __init__(self, *args, **kwargs): super(ThemeSelectForm, self).__init__(*args, **kwargs) THEME_CHOICES = ((x, x) for x in theme_choices()) self.fields['theme_edit'].choices = THEME_CHOICES
def edit_file(request, form_class=FileForm, template_name="theme_editor/index.html"): selected_theme = request.GET.get("theme_edit", get_theme()) if not is_valid_theme(selected_theme): raise Http404(_('Specified theme does not exist')) # get the default file and clean up any input default_file = request.GET.get("file", DEFAULT_FILE) if default_file: default_file = default_file.replace('\\', '/') default_file = default_file.strip('/') default_file = default_file.replace('////', '/') default_file = default_file.replace('///', '/') default_file = default_file.replace('//', '/') theme_root = get_theme_root(selected_theme) if not is_valid_path(theme_root, default_file): raise Http403 theme_read_only = is_theme_read_only(selected_theme) if request.is_ajax() and request.method == "POST": if theme_read_only: raise Http403 file_form = form_class(request.POST) response_status = 'FAIL' response_message = _('Cannot update file.') if file_form.is_valid(): if file_form.save(theme_root, selected_theme, default_file, request): response_status = 'SUCCESS' response_message = str(_('Your changes have been saved.')) EventLog.objects.log() response = json.dumps({ 'status': response_status, 'message': response_message }) return HttpResponse(response, content_type='application/json') is_file = os.path.isfile(os.path.join(theme_root, default_file)) is_dir = os.path.isdir(os.path.join(theme_root, default_file)) if is_file: pass elif is_dir: # if default_file is a directory then append the # trailing slash so we can get the dirname below default_file = '%s/' % default_file else: # if the default_file is not a directory or file within # the themes folder then return a 404 raise Http404( _("Custom template not found. Make sure you've copied over the themes to the THEME_DIR." )) # get the current file name current_file = os.path.basename(default_file) # get file ext name = current_file.split('/')[-1] ext = name.split('.')[-1] stylesheets = ['css', 'less'] # get the present working directory # and make sure they cannot list root pwd = os.path.dirname(default_file) if pwd == '/': pwd = '' # make sure the path is still valid after stripping off the file name if not is_valid_path(theme_root, pwd): raise Http403 current_file_path = os.path.join(pwd, current_file) # get the previous directory name and path prev_dir = '/' prev_dir_name = 'theme base' pwd_split = pwd.split('/') if len(pwd_split) > 1: prev_dir_name = pwd_split[-2] pwd_split.pop() prev_dir = '/'.join(pwd_split) elif not pwd_split[0]: prev_dir = '' # get the directory list dirs = get_dir_list(theme_root, pwd) # get the file list files, non_editable_files = get_file_list(theme_root, pwd) all_files_folders = get_all_files_list(theme_root, selected_theme) # non-deletable files non_deletable_files = [ 'homepage.html', 'default.html', 'footer.html', 'header.html', 'sidebar.html', 'nav.html', 'styles.less', 'styles.css' ] # get the number of themes in the themes directory on the site theme_count = len([i for i in theme_choices()]) # get a list of revisions archives = ThemeFileVersion.objects.filter( relative_file_path=current_file_path).order_by("-create_dt") # New templates created by clicking the New Template" button are blank. # Add a space for the blank template to make it editable. content = get_file_content(theme_root, selected_theme, current_file_path) or ' ' file_form = form_class({'content': content}) theme_form = ThemeSelectForm(initial={'theme_edit': selected_theme}) return render_to_resp(request=request, template_name=template_name, context={ 'file_form': file_form, 'theme_form': theme_form, 'current_theme': selected_theme, 'current_file_path': current_file_path, 'current_file': current_file, 'prev_dir_name': prev_dir_name, 'prev_dir': prev_dir, 'pwd': pwd, 'dirs': dirs, 'files': files, 'non_editable_files': non_editable_files, 'non_deletable_files': non_deletable_files, 'theme_count': theme_count, 'archives': archives, 'is_file': is_file, 'is_dir': is_dir, 'theme_read_only': theme_read_only, 'can_copy_theme': (not is_base_theme(selected_theme)), 'all_files_folders': all_files_folders, 'ext': ext, 'stylesheets': stylesheets, })