def set_metas(request, cleared, discarded, added): pages = set(cleared) | set(discarded) | set(added) # Discard empties and junk pages = [wikiutil.normalize_pagename(x, request.cfg) for x in pages] pages = [x for x in pages if x] msg = list() # We don't have to check whether the user is allowed to read # the page, as we don't send any info on the pages out. Only # check that we can write to the requested pages. for page in pages: if not request.user.may.write(page): message = "You are not allowed to edit page '%s'" % page return False, request.getText(message) for page in pages: pageCleared = cleared.get(page, set()) pageDiscarded = discarded.get(page, dict()) pageAdded = added.get(page, dict()) # Template clears might make sense at some point, not implemented if TEMPLATE_KEY in pageCleared: pageCleared.remove(TEMPLATE_KEY) # Template changes might make sense at some point, not implemented if TEMPLATE_KEY in pageDiscarded: del pageDiscarded[TEMPLATE_KEY] # Save templates for empty pages if TEMPLATE_KEY in pageAdded: save_template(request, page, ''.join(pageAdded[TEMPLATE_KEY])) del pageAdded[TEMPLATE_KEY] metakeys = set(pageCleared) | set(pageDiscarded) | set(pageAdded) # Filter out uneditables, such as inlinks metakeys = editable_p(metakeys) old = get_metas(request, page, metakeys, checkAccess=False, includeGenerated=False) new = dict() for key in old: values = old.pop(key) old[key] = values new[key] = set(values) for key in pageCleared: new[key] = set() for key, values in pageDiscarded.iteritems(): for v in values: new[key].difference_update(values) for key, values in pageAdded.iteritems(): new[key].update(values) for key, values in new.iteritems(): ordered = copy.copy(old[key]) for index, value in enumerate(ordered): if value not in values: ordered[index] = u"" values.difference_update(ordered) ordered.extend(values) new[key] = ordered msg.append(edit_meta(request, page, old, new)) return True, msg
def show_editform(wr, request, pagename, args): formatter = request.formatter # Note that metatable_parseargs handles read permission checks pagelist, metakeys, _ = metatable_parseargs(request, args, get_all_keys=True) uneditable_pages = list() # See that the user can write each page for page in pagelist: if not request.user.may.write(page): uneditable_pages.append(page) for page in uneditable_pages: pagelist.remove(page) _ = request.getText if uneditable_pages: reason = _("No save permission to some pages (%s)" % ','.join(uneditable_pages)) request.write(render_warning(reason)) if not pagelist: reason = _("No pages to edit.") request.write(render_error(reason)) return wr(u'<form method="POST" action="%s" enctype="multipart/form-data">\n', actionname(request)) wr(u'<input type="hidden" name="action" value="%s">\n', action_name) wr(formatter.table(1)) wr(formatter.table_row(1, {'rowclass': 'meta_header'})) wr(formatter.table_cell(1, {'class': 'meta_page'})) form = values_to_form(request.values) template = form.get('template', [''])[0] if template: wr('<input type="hidden" name="template" value="%s">', template) # Filter out uneditables, such as inlinks metakeys = editable_p(metakeys) _ = request.getText for key in metakeys + ['']: wr(formatter.table_cell(1, {'class': 'meta_header'})) wr(u'<input class="metakey" type="text" name="%s" value="%s">', u':: %s' % key, key) wr(formatter.table_row(0)) values = dict() valnos = dict() for frompage in pagelist: values[frompage] = dict() for key in metakeys + ['']: values[frompage][key] = list() # If the page has no values for this key, it'll # have one in the table to add a value if not valnos.has_key(frompage): valnos[frompage] = 1 keydata = get_metas(request, frompage, [key], abs_attach=False, includeGenerated=False) for i, val in enumerate(keydata[key]): values[frompage][key].append(val) # Enumerate starts from 0: #values++ # One to add a value: #values++ if valnos[frompage] < i + 2: valnos[frompage] = i + 2 values[frompage][key].append('') for frompage in pagelist: wr(formatter.table_row(1)) wr(formatter.table_cell(1, {'class': 'meta_page', 'rowspan': str(valnos[frompage])})) wr(u'%s', frompage) for i in range(valnos[frompage]): # Add <tr>:s for additional values also if i > 0: wr(formatter.table_row(1)) for key in metakeys + ['']: inputname = frompage + SEPARATOR + key if len(values[frompage][key]) >= (i + 1): val = values[frompage][key][i] else: val = '' # Skip default labels if key == 'label' and val == frompage: val = '' wr(formatter.table_cell(1, {'class': 'meta_cell'})) wr(u'<textarea class="metavalue dynamic" rows="1" name="%s">%s</textarea>', inputname, val) #print frompage, key, inputname, values, '<br>' wr(formatter.table_row(0)) wr(formatter.table_row(1)) wr(formatter.table_cell(1, {'class': 'meta_cell'})) for key in metakeys + ['']: inputname = frompage + SEPARATOR + key if len(values[frompage][key]) >= (i + 1): val = values[frompage][key][i] else: val = '' # Skip default labels if key == 'label' and val == frompage: val = '' wr(formatter.table_cell(1)) wr(u'<input class="metavalue" type="file" name="%s">\n', inputname) wr(formatter.table_row(0)) # Proto JS code to warn on leaving an empty key name # <script language="JavaScript" type="text/javascript"> # function myvalid(me) { # if (me.form.subject.value == "") { # if (confirm("Empty subject, send anyway?")) # return true; # else # return false; # } # return true; # } # </script> # <input type="submit" name="send" value="Send" class="button1"tabindex="7" # onClick="return myvalid(this);" /> wr(formatter.table(0)) wr(u'<input type="submit" name="save" value="%s">\n', _('Save')) wr(u'<input type="submit" name="cancel" value="%s">\n', _('Cancel')) wr(u'</form>\n')
def show_editform(wr, request, pagename, args): formatter = request.formatter # Note that metatable_parseargs handles read permission checks pagelist, metakeys, _ = metatable_parseargs(request, args, get_all_keys=True) uneditable_pages = list() # See that the user can write each page for page in pagelist: if not request.user.may.write(page): uneditable_pages.append(page) for page in uneditable_pages: pagelist.remove(page) _ = request.getText if uneditable_pages: reason = _("No save permission to some pages (%s)" % ','.join(uneditable_pages)) request.write(render_warning(reason)) if not pagelist: reason = _("No pages to edit.") request.write(render_error(reason)) return wr(u'<form method="POST" action="%s" enctype="multipart/form-data">\n', actionname(request)) wr(u'<input type="hidden" name="action" value="%s">\n', action_name) wr(formatter.table(1)) wr(formatter.table_row(1, {'rowclass': 'meta_header'})) wr(formatter.table_cell(1, {'class': 'meta_page'})) form = values_to_form(request.values) template = form.get('template', [''])[0] if template: wr('<input type="hidden" name="template" value="%s">', template) # Filter out uneditables, such as inlinks metakeys = editable_p(metakeys) _ = request.getText for key in metakeys + ['']: wr(formatter.table_cell(1, {'class': 'meta_header'})) wr(u'<input class="metakey" type="text" name="%s" value="%s">', u':: %s' % key, key) wr(formatter.table_row(0)) values = dict() valnos = dict() for frompage in pagelist: values[frompage] = dict() for key in metakeys + ['']: values[frompage][key] = list() # If the page has no values for this key, it'll # have one in the table to add a value if not valnos.has_key(frompage): valnos[frompage] = 1 keydata = get_metas(request, frompage, [key], abs_attach=False, includeGenerated=False) for i, val in enumerate(keydata[key]): values[frompage][key].append(val) # Enumerate starts from 0: #values++ # One to add a value: #values++ if valnos[frompage] < i + 2: valnos[frompage] = i + 2 values[frompage][key].append('') for frompage in pagelist: wr(formatter.table_row(1)) wr( formatter.table_cell(1, { 'class': 'meta_page', 'rowspan': str(valnos[frompage]) })) wr(u'%s', frompage) for i in range(valnos[frompage]): # Add <tr>:s for additional values also if i > 0: wr(formatter.table_row(1)) for key in metakeys + ['']: inputname = frompage + SEPARATOR + key if len(values[frompage][key]) >= (i + 1): val = values[frompage][key][i] else: val = '' # Skip default labels if key == 'label' and val == frompage: val = '' wr(formatter.table_cell(1, {'class': 'meta_cell'})) wr( u'<textarea class="metavalue dynamic" rows="1" name="%s">%s</textarea>', inputname, val) #print frompage, key, inputname, values, '<br>' wr(formatter.table_row(0)) wr(formatter.table_row(1)) wr(formatter.table_cell(1, {'class': 'meta_cell'})) for key in metakeys + ['']: inputname = frompage + SEPARATOR + key if len(values[frompage][key]) >= (i + 1): val = values[frompage][key][i] else: val = '' # Skip default labels if key == 'label' and val == frompage: val = '' wr(formatter.table_cell(1)) wr(u'<input class="metavalue" type="file" name="%s">\n', inputname) wr(formatter.table_row(0)) # Proto JS code to warn on leaving an empty key name # <script language="JavaScript" type="text/javascript"> # function myvalid(me) { # if (me.form.subject.value == "") { # if (confirm("Empty subject, send anyway?")) # return true; # else # return false; # } # return true; # } # </script> # <input type="submit" name="send" value="Send" class="button1"tabindex="7" # onClick="return myvalid(this);" /> wr(formatter.table(0)) wr(u'<input type="submit" name="save" value="%s">\n', _('Save')) wr(u'<input type="submit" name="cancel" value="%s">\n', _('Cancel')) wr(u'</form>\n')