mirror of
https://github.com/postgres/pgweb.git
synced 2025-08-13 13:12:42 +00:00
Implement proper mergeing of organisations
This commit is contained in:
@ -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
|
||||||
|
@ -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,
|
||||||
|
})
|
||||||
|
@ -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),
|
||||||
|
|
||||||
|
6
templates/admin/core/organisation/change_list.html
Normal file
6
templates/admin/core/organisation/change_list.html
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{%extends "admin/change_list.html"%}
|
||||||
|
{%block pretitle%}
|
||||||
|
<p>
|
||||||
|
<a href="/admin/mergeorg">Merge two organisations</a>
|
||||||
|
</p>
|
||||||
|
{%endblock%}
|
20
templates/core/admin_mergeorg.html
Normal file
20
templates/core/admin_mergeorg.html
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
{%extends "admin/base_site.html"%}
|
||||||
|
|
||||||
|
{%block breadcrumbs%}
|
||||||
|
<div class="breadcrumbs"><a href="/admin/">Home</a> › <a href="/admin/core/organisation/">Organisations</a> › 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%}
|
Reference in New Issue
Block a user