1.1 --- a/MoinForms.py Sat Dec 01 23:26:28 2012 +0100
1.2 +++ b/MoinForms.py Sat Dec 01 23:54:16 2012 +0100
1.3 @@ -6,6 +6,7 @@
1.4 @license: GNU GPL (v2 or later), see COPYING.txt for details.
1.5 """
1.6
1.7 +from MoinMoin.action import do_show
1.8 from MoinMoin import wikiutil
1.9 from MoinSupport import *
1.10 import re
1.11 @@ -15,6 +16,101 @@
1.12 form_field_regexp_str = r"<<FormField\((.*?)\)>>"
1.13 form_field_regexp = re.compile(form_field_regexp_str, re.DOTALL)
1.14
1.15 +# Common action functionality.
1.16 +
1.17 +class MoinFormHandlerAction:
1.18 +
1.19 + "A handler action that can be specialised for individual forms."
1.20 +
1.21 + def __init__(self, pagename, request):
1.22 + self.pagename = pagename
1.23 + self.request = request
1.24 +
1.25 + def processForm(self):
1.26 +
1.27 + """
1.28 + Interpret the request details and modify them according to the structure
1.29 + of the interpreted information.
1.30 + """
1.31 +
1.32 + # Get the form fields and obtain the hierarchical field structure.
1.33 +
1.34 + form = get_form(self.request)
1.35 + fields = getFields(form, remove=True)
1.36 +
1.37 + # Modify, serialise and show the form.
1.38 +
1.39 + self.modifyFields(fields)
1.40 + self.serialiseFields(fields, form)
1.41 + do_show(self.pagename, self.request)
1.42 +
1.43 + def serialiseFields(self, fields, form, path=None):
1.44 +
1.45 + """
1.46 + Serialise the given 'fields' to the given 'form', using the given 'path'
1.47 + to name the entries.
1.48 + """
1.49 +
1.50 + for key, value in fields.items():
1.51 +
1.52 + # Serialise sections.
1.53 +
1.54 + if isinstance(value, dict):
1.55 + for index, element in enumerate(getSectionElements(value)):
1.56 + element_ref = "%s$%s" % (key, index)
1.57 +
1.58 + self.serialiseFields(element, form,
1.59 + path and ("%s/%s" % (path, element_ref)) or element_ref
1.60 + )
1.61 +
1.62 + # Serialise fields.
1.63 +
1.64 + else:
1.65 + form[path and ("%s/%s" % (path, key)) or key] = value
1.66 +
1.67 + def modifyFields(self, fields):
1.68 +
1.69 + "Modify the given 'fields', removing and adding items."
1.70 +
1.71 + # First, remove fields.
1.72 +
1.73 + for key in fields.keys():
1.74 + if key.startswith("_remove="):
1.75 + self.removeField(key[8:], fields)
1.76 +
1.77 + # Then, add fields.
1.78 +
1.79 + for key in fields.keys():
1.80 + if key.startswith("_add="):
1.81 + self.addField(key[5:], fields)
1.82 +
1.83 + def removeField(self, path, fields):
1.84 +
1.85 + """
1.86 + Remove the section element indicated by the given 'path' from the
1.87 + 'fields'.
1.88 + """
1.89 +
1.90 + section, (name, index) = getSectionForPath(path, fields)
1.91 + del section[name][index]
1.92 +
1.93 + def addField(self, path, fields):
1.94 +
1.95 + """
1.96 + Add a section element indicated by the given 'path' to the 'fields'.
1.97 + """
1.98 +
1.99 + section, (name, index) = getSectionForPath(path, fields)
1.100 + placeholder = {"_new" : ""}
1.101 +
1.102 + if section.has_key(name):
1.103 + indexes = section[name].keys()
1.104 + max_index = max(map(int, indexes))
1.105 + section[name][max_index + 1] = placeholder
1.106 + else:
1.107 + max_index = -1
1.108 + section[name] = {0 : placeholder}
1.109 +
1.110 # Common formatting functions.
1.111
1.112 def formatForm(text, request, fmt, attrs=None, write=None):
2.1 --- a/actions/MoinFormHandler.py Sat Dec 01 23:26:28 2012 +0100
2.2 +++ b/actions/MoinFormHandler.py Sat Dec 01 23:54:16 2012 +0100
2.3 @@ -6,108 +6,13 @@
2.4 @license: GNU GPL (v2 or later), see COPYING.txt for details.
2.5 """
2.6
2.7 -from MoinMoin.action import do_show
2.8 -from MoinMoin import config
2.9 -from MoinForms import *
2.10 +from MoinForms import MoinFormHandlerAction
2.11
2.12 Dependencies = ['pages']
2.13
2.14 -class MoinFormHandlerAction:
2.15 -
2.16 - "A handler action that can be specialised for individual forms."
2.17 -
2.18 - def __init__(self, pagename):
2.19 - self.pagename = pagename
2.20 -
2.21 - def processForm(self, request):
2.22 -
2.23 - """
2.24 - Interpret the given 'request' details and modify them according to the
2.25 - structure of the interpreted information.
2.26 - """
2.27 -
2.28 - # Get the form fields and obtain the hierarchical field structure.
2.29 -
2.30 - form = get_form(request)
2.31 - fields = getFields(form, remove=True)
2.32 -
2.33 - # Process modification operations.
2.34 -
2.35 - self.modifyFields(fields)
2.36 - self.serialiseFields(fields, form)
2.37 -
2.38 - do_show(self.pagename, request)
2.39 -
2.40 - def serialiseFields(self, fields, form, path=None):
2.41 -
2.42 - """
2.43 - Serialise the given 'fields' to the given 'form', using the given 'path'
2.44 - to name the entries.
2.45 - """
2.46 -
2.47 - for key, value in fields.items():
2.48 -
2.49 - # Serialise sections.
2.50 -
2.51 - if isinstance(value, dict):
2.52 - for index, element in enumerate(getSectionElements(value)):
2.53 - element_ref = "%s$%s" % (key, index)
2.54 -
2.55 - self.serialiseFields(element, form,
2.56 - path and ("%s/%s" % (path, element_ref)) or element_ref
2.57 - )
2.58 -
2.59 - # Serialise fields.
2.60 -
2.61 - else:
2.62 - form[path and ("%s/%s" % (path, key)) or key] = value
2.63 -
2.64 - def modifyFields(self, fields):
2.65 -
2.66 - "Modify the given 'fields', removing and adding items."
2.67 -
2.68 - # First, remove fields.
2.69 -
2.70 - for key in fields.keys():
2.71 - if key.startswith("_remove="):
2.72 - self.removeField(key[8:], fields)
2.73 -
2.74 - # Then, add fields.
2.75 -
2.76 - for key in fields.keys():
2.77 - if key.startswith("_add="):
2.78 - self.addField(key[5:], fields)
2.79 -
2.80 - def removeField(self, path, fields):
2.81 -
2.82 - """
2.83 - Remove the section element indicated by the given 'path' from the
2.84 - 'fields'.
2.85 - """
2.86 -
2.87 - section, (name, index) = getSectionForPath(path, fields)
2.88 - del section[name][index]
2.89 -
2.90 - def addField(self, path, fields):
2.91 -
2.92 - """
2.93 - Add a section element indicated by the given 'path' to the 'fields'.
2.94 - """
2.95 -
2.96 - section, (name, index) = getSectionForPath(path, fields)
2.97 - placeholder = {"_new" : ""}
2.98 -
2.99 - if section.has_key(name):
2.100 - indexes = section[name].keys()
2.101 - max_index = max(map(int, indexes))
2.102 - section[name][max_index + 1] = placeholder
2.103 - else:
2.104 - max_index = -1
2.105 - section[name] = {0 : placeholder}
2.106 -
2.107 # Action function.
2.108
2.109 def execute(pagename, request):
2.110 - MoinFormHandlerAction(pagename).processForm(request)
2.111 + MoinFormHandlerAction(pagename, request).processForm()
2.112
2.113 # vim: tabstop=4 expandtab shiftwidth=4