instance = get_object_or_404(models.Site, pk=site_id)
return _add_or_edit_site(request, instance=instance)
-def _add_or_edit_site(request, instance=None):
+def _add_or_edit_site(request, instance=None, basis=None):
is_add = (instance is None)
# Are we looking up owners, or selecting them from a fixed list?
if is_add:
instance = models.Site()
+ if basis:
+ dct = dict((k,v) for k,v in basis.__dict__.items()
+ if not k.startswith('_')
+ and not k in ['start_term_id', 'end_term_id'])
+ del dct['id']
+ instance.__dict__.update(dct)
+
if request.method != 'POST':
form = NewSiteForm(instance=instance)
return g.render('edit_site.xhtml', **locals())
site = form.instance
assert site.id
+ if 'basis' in POST:
+ # We are duplicating a site. Copy all the items over into the new site.
+ source_site = models.Site.objects.get(pk=POST['basis'])
+ _copy_contents(request, source_site, site)
if is_add:
# we need to configure permissions.
return HttpResponseRedirect(site.site_url('edit/permission/'))
_('This site has been marked as the copying source. Visit the new site, '
'and click "Paste to Here," to copy this site\'s materials into the new site.'))
-def site_clipboard_paste_to(request, site_id):
- source_id = request.session['copy_source']
- source_site = get_object_or_404(models.Site, pk=source_id)
- site = get_object_or_404(models.Site, pk=site_id)
- if request.method != 'POST':
- return g.render('site_confirm_paste.xhtml', **locals())
+def _copy_contents(request, source_site, dest_site):
item_map = {}
def process_item(parent, (item, subitems)):
del dct['id']
dct['parent_heading_id'] = parent.id if parent else None
newitem = models.Item.objects.create(**dct)
- newitem.site = site
+ newitem.site = dest_site
newitem.save()
item_map[old_id] = newitem.id
for sub in subitems:
for branch in source_site.item_tree():
process_item(None, branch)
- request.session['last_paste'] = (source_site.id, site.id, item_map.values())
+ request.session['last_paste'] = (source_site.id, dest_site.id, item_map.values())
+
+def site_clipboard_paste_to(request, site_id):
+ source_id = request.session['copy_source']
+ source_site = get_object_or_404(models.Site, pk=source_id)
+ site = get_object_or_404(models.Site, pk=site_id)
+ if request.method != 'POST':
+ return g.render('site_confirm_paste.xhtml', **locals())
+ _copy_contents(request, source_site, site)
return HttpResponseRedirect('../')
def site_clipboard_paste_undo(request, site_id):
pass
del request.session['last_paste']
return HttpResponseRedirect('../')
+
+
+def site_clipboard_copy_whole(request, site_id):
+ site = get_object_or_404(models.Site, pk=site_id)
+ return _add_or_edit_site(request, basis=site)
${show_tree(item_tree, edit=is_editor)}
</div>
<!-- still not perfect placement, but big help for IE -->
- <div id="sidepanel">
+ <div id="sidepanel" class="${is_editor and 'editor' or ''}">
+ <div id="non_copy_stuff">
+ <div py:if="is_editor" id="feeds" class="little_action_panel">
+ <a href="${site.site_url()}feeds/">Feeds</a>
+ </div>
<div py:if="is_editor" id="edit_site" class="little_action_panel">
<div><a href="${site.site_url()}edit/">Setup</a></div>
<div><a href="${site.site_url()}edit/permission/">Permissions</a></div>
<div py:if="is_joinable">
<a href="${site.site_url()}join/">Join this site</a>
</div>
- <div py:if="is_editor" id="feeds" class="little_action_panel">
- <a href="${site.site_url()}feeds/">Feeds</a>
- </div>
- <div py:if="is_editor" id="copy_from" class="little_action_panel">
- <a href="${site.site_url()}copy_from/">Copy from here</a>
</div>
- <div py:if="is_editor and request.session.get('copy_source')" id="paste_to" class="little_action_panel">
- <a href="${site.site_url()}paste_to/">Paste to here</a>
+ <div py:if="is_editor">
+ <a href="javascript:void($('#copypastepanel,#non_copy_stuff').toggle(300));"
+ style="text-decoration: underline;">Copy and Paste</a>
</div>
- <div py:if="is_editor and request.session.get('last_paste', (0,0,0))[1] == site.id"
- id="paste_undo" class="little_action_panel">
- <a href="${site.site_url()}paste_undo/">Undo last paste</a>
+ <div py:if="is_editor" id="copypastepanel" style="display: none;">
+ <div id="copy_from" class="little_action_panel">
+ <a href="${site.site_url()}copy_from/">Copy from here</a>
+ </div>
+ <div py:if="request.session.get('copy_source')" id="paste_to" class="little_action_panel">
+ <a href="${site.site_url()}paste_to/">Paste to here</a>
+ </div>
+ <div py:if="request.session.get('last_paste', (0,0,0))[1] == site.id"
+ id="paste_undo" class="little_action_panel">
+ <a href="${site.site_url()}paste_undo/">Undo last paste</a>
+ </div>
+ <div id="copy_source" class="little_action_panel">
+ <a href="${site.site_url()}copy_whole/">Duplicate site</a>
+ </div>
</div>
-
</div>
<div py:if="is_editor">${add_subs()}</div>
+ <div style="clear: right;"/>
</body>
</html>