From 786fffe269c5b98e7407bc378c32717d9606b765 Mon Sep 17 00:00:00 2001 From: ilvalle Date: Wed, 17 Jul 2013 11:56:47 +0200 Subject: [PATCH 1/2] settings tab in admin editor --- applications/admin/controllers/default.py | 31 +++++++++- .../static/css/typeahead.js-bootstrap.css | 4 ++ applications/admin/views/default/edit.html | 56 ++++++++----------- .../admin/views/default/editor_settings.html | 24 ++++++++ 4 files changed, 80 insertions(+), 35 deletions(-) create mode 100644 applications/admin/views/default/editor_settings.html diff --git a/applications/admin/controllers/default.py b/applications/admin/controllers/default.py index 490fa907..eca7941f 100644 --- a/applications/admin/controllers/default.py +++ b/applications/admin/controllers/default.py @@ -14,6 +14,7 @@ from gluon.utils import web2py_uuid from glob import glob import shutil import platform +import ConfigParser try: import git if git.__version__ < '0.3.1': @@ -560,6 +561,16 @@ def edit(): """ File edit handler """ # Load json only if it is ajax edited... app = get_app(request.vars.app) + admin_path = apath("admin", r=request) + editor_defaults={'theme':'web2py'} + config = ConfigParser.ConfigParser(editor_defaults) + config.read( os.path.join(admin_path, 'settings.cfg') ) + if not config.has_section('editor'): + config.add_section('editor') + if not( isinstance(session.editor_settings, dict) ): + preferences = dict(config.items('editor')) + else: + preferences = session.editor_settings if not(request.ajax): # return the scaffolding, the rest will be through ajax requests @@ -573,7 +584,25 @@ def edit(): for key in editarea_preferences: if key in globals(): editarea_preferences[key] = globals()[key] - return response.render ('default/edit.html', dict(app=request.args[0], editarea_preferences=editarea_preferences)) + return response.render ('default/edit.html', dict(app=request.args[0], editor_settings=preferences, editarea_preferences=editarea_preferences)) + + # show settings tab and save prefernces + if 'settings' in request.vars: + if request.post_vars: #save new preferences + for option, value in request.post_vars.items(): + config.set('editor', option, value) + try: + config.write(open(os.path.join(admin_path, 'settings.cfg'), 'w')) + response.headers["web2py-component-flash"] = T('Preferences saved correctly') + except: + response.headers["web2py-component-flash"] = T('Preferences saved on session only') + session.editor_settings = dict(config.items('editor')) + response.headers["web2py-component-command"] = "update_theme('%s'); jQuery('a[href=#editor_settings] button.close').click();" % config.get('editor', 'theme') + return + else: + details = {'filename':'settings', 'id':'editor_settings', 'force': False} + details['plain_html'] = response.render('default/editor_settings.html', {'editor_settings':preferences}) + return response.json(details) """ File edit handler """ # Load json only if it is ajax edited... diff --git a/applications/admin/static/css/typeahead.js-bootstrap.css b/applications/admin/static/css/typeahead.js-bootstrap.css index 630ee5c5..f9e5c71b 100644 --- a/applications/admin/static/css/typeahead.js-bootstrap.css +++ b/applications/admin/static/css/typeahead.js-bootstrap.css @@ -1,3 +1,7 @@ +.twitter-typeahead { + width: 100%; +} + .twitter-typeahead .tt-query, .twitter-typeahead .tt-hint { margin-bottom: 0px; diff --git a/applications/admin/views/default/edit.html b/applications/admin/views/default/edit.html index 2f6e2804..62c5aafe 100644 --- a/applications/admin/views/default/edit.html +++ b/applications/admin/views/default/edit.html @@ -16,7 +16,7 @@ }} {{cm=URL('static','codemirror')}} - + @@ -42,7 +42,7 @@ From 50e336bc3a9d47851b2c04d067b09ff1af6bfadb Mon Sep 17 00:00:00 2001 From: ilvalle Date: Wed, 17 Jul 2013 21:47:00 +0200 Subject: [PATCH 2/2] Config API, session is used only when filesystem is not available for storing data --- applications/admin/controllers/default.py | 27 +++++++------------ gluon/tools.py | 32 +++++++++++++++++++++++ 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/applications/admin/controllers/default.py b/applications/admin/controllers/default.py index eca7941f..1d0aef36 100644 --- a/applications/admin/controllers/default.py +++ b/applications/admin/controllers/default.py @@ -11,10 +11,11 @@ import re from gluon.admin import * from gluon.fileutils import abspath, read_file, write_file from gluon.utils import web2py_uuid +from gluon.tools import Config from glob import glob import shutil import platform -import ConfigParser + try: import git if git.__version__ < '0.3.1': @@ -561,16 +562,10 @@ def edit(): """ File edit handler """ # Load json only if it is ajax edited... app = get_app(request.vars.app) - admin_path = apath("admin", r=request) + app_path = apath(app, r=request) editor_defaults={'theme':'web2py'} - config = ConfigParser.ConfigParser(editor_defaults) - config.read( os.path.join(admin_path, 'settings.cfg') ) - if not config.has_section('editor'): - config.add_section('editor') - if not( isinstance(session.editor_settings, dict) ): - preferences = dict(config.items('editor')) - else: - preferences = session.editor_settings + config = Config(os.path.join(app_path, 'settings.cfg'), section='editor', default_values=editor_defaults) + preferences = config.read() if not(request.ajax): # return the scaffolding, the rest will be through ajax requests @@ -586,18 +581,14 @@ def edit(): editarea_preferences[key] = globals()[key] return response.render ('default/edit.html', dict(app=request.args[0], editor_settings=preferences, editarea_preferences=editarea_preferences)) - # show settings tab and save prefernces + # show settings tab and save prefernces if 'settings' in request.vars: if request.post_vars: #save new preferences - for option, value in request.post_vars.items(): - config.set('editor', option, value) - try: - config.write(open(os.path.join(admin_path, 'settings.cfg'), 'w')) + if config.save(request.post_vars.items()): response.headers["web2py-component-flash"] = T('Preferences saved correctly') - except: + else: response.headers["web2py-component-flash"] = T('Preferences saved on session only') - session.editor_settings = dict(config.items('editor')) - response.headers["web2py-component-command"] = "update_theme('%s'); jQuery('a[href=#editor_settings] button.close').click();" % config.get('editor', 'theme') + response.headers["web2py-component-command"] = "update_theme('%s'); jQuery('a[href=#editor_settings] button.close').click();" % config.read()['theme'] return else: details = {'filename':'settings', 'id':'editor_settings', 'force': False} diff --git a/gluon/tools.py b/gluon/tools.py index 3c27a0be..acd4a62b 100644 --- a/gluon/tools.py +++ b/gluon/tools.py @@ -22,6 +22,7 @@ import urllib import urllib2 import Cookie import cStringIO +import ConfigParser from email import MIMEBase, MIMEMultipart, MIMEText, Encoders, Header, message_from_string, Charset from gluon.contenttype import contenttype @@ -5643,6 +5644,37 @@ class Wiki(object): request = current.request return render(request.post_vars) +class Config(object): + def __init__( + self, + filename, + section, + default_values={} + ): + self.config = ConfigParser.ConfigParser(default_values) + self.config.read(filename) + if not self.config.has_section(section): + self.config.add_section(section) + self.section = section + self.filename = filename + + def read(self): + if not( isinstance(current.session['settings_%s' % self.section], dict) ): + settings = dict(self.config.items(self.section)) + else: + settings = current.session['settings_%s' % self.section] + return settings + + def save(self, options): + for option, value in options: + self.config.set(self.section, option, value) + try: + self.config.write(open(self.filename, 'w')) + result = True + except: + current.session['settings_%s' % self.section] = dict(self.config.items(self.section)) + result = False + return result if __name__ == '__main__': import doctest