Implement proper mergeing of organisations

This commit is contained in:
Magnus Hagander
2011-08-18 10:46:25 +02:00
parent 26a72e1d4c
commit 248d940c7e
5 changed files with 75 additions and 2 deletions

View File

@ -1,4 +1,5 @@
from django import forms from django import forms
from django.forms import ValidationError
from models import Organisation from models import Organisation
@ -7,3 +8,11 @@ class OrganisationForm(forms.ModelForm):
model = Organisation model = Organisation
exclude = ('lastconfirmed', 'approved', 'managers', ) exclude = ('lastconfirmed', 'approved', 'managers', )
class MergeOrgsForm(forms.Form):
merge_into = forms.ModelChoiceField(queryset=Organisation.objects.all())
merge_from = forms.ModelChoiceField(queryset=Organisation.objects.all())
def clean(self):
if self.cleaned_data['merge_into'] == self.cleaned_data['merge_from']:
raise ValidationError("The two organisations selected must be different!")
return self.cleaned_data

View File

@ -1,7 +1,7 @@
from django.shortcuts import render_to_response, get_object_or_404 from django.shortcuts import render_to_response, get_object_or_404
from django.http import HttpResponse, Http404, HttpResponseRedirect from django.http import HttpResponse, Http404, HttpResponseRedirect
from django.template import TemplateDoesNotExist, loader, Context from django.template import TemplateDoesNotExist, loader, Context
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required, user_passes_test
from django.db.models import Count from django.db.models import Count
from django.db import connection, transaction from django.db import connection, transaction
@ -27,7 +27,7 @@ from survey.models import Survey
# models and forms needed for core objects # models and forms needed for core objects
from models import Organisation from models import Organisation
from forms import OrganisationForm from forms import OrganisationForm, MergeOrgsForm
# Front page view # Front page view
@cache(minutes=10) @cache(minutes=10)
@ -162,3 +162,39 @@ def admin_purge(request):
}) })
else: else:
return render_to_response('core/admin_purge.html') return render_to_response('core/admin_purge.html')
# Merge two organisations
@login_required
@user_passes_test(lambda u: u.is_superuser)
@transaction.commit_on_success
def admin_mergeorg(request):
if request.method == 'POST':
form = MergeOrgsForm(data=request.POST)
if form.is_valid():
# Ok, try to actually merge organisations, by moving all objects
# attached
f = form.cleaned_data['merge_from']
t = form.cleaned_data['merge_into']
for e in f.event_set.all():
e.org = t
e.save()
for n in f.newsarticle_set.all():
n.org = t
n.save()
for p in f.product_set.all():
p.publisher = t
p.save()
for p in f.professionalservice_set.all():
p.organisation = t
p.save()
# Now that everything is moved, we can delete the organisation
f.delete()
return HttpResponseRedirect("/admin/core/organisation/")
# Else fall through to re-render form with errors
else:
form = MergeOrgsForm()
return render_to_response('core/admin_mergeorg.html', {
'form': form,
})

View File

@ -110,6 +110,8 @@ urlpatterns = patterns('',
# Override some URLs in admin, to provide our own pages # Override some URLs in admin, to provide our own pages
(r'^admin/pending/$', 'pgweb.core.views.admin_pending'), (r'^admin/pending/$', 'pgweb.core.views.admin_pending'),
(r'^admin/purge/$', 'pgweb.core.views.admin_purge'), (r'^admin/purge/$', 'pgweb.core.views.admin_purge'),
(r'^admin/mergeorg/$', 'pgweb.core.views.admin_mergeorg'),
# Uncomment the next line to enable the admin: # Uncomment the next line to enable the admin:
(r'^admin/(.*)', admin.site.root), (r'^admin/(.*)', admin.site.root),

View File

@ -0,0 +1,6 @@
{%extends "admin/change_list.html"%}
{%block pretitle%}
<p>
<a href="/admin/mergeorg">Merge two organisations</a>
</p>
{%endblock%}

View File

@ -0,0 +1,20 @@
{%extends "admin/base_site.html"%}
{%block breadcrumbs%}
<div class="breadcrumbs"><a href="/admin/">Home</a> &rsaquo; <a href="/admin/core/organisation/">Organisations</a> &rsaquo; Merge organisations</div>
{%endblock%}
{% block bodyclass %}change-list{% endblock %}
{% block coltype %}flex{% endblock %}
{%block content%}
<div id="content-main">
<h1>Merge organisations</h1>
<form method="post" action=".">
<table>
{{form.as_table}}
</table>
<input type="submit" value="Merge organisations">
</form>
</div>
{%endblock%}