mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-02-03 05:42:17 +00:00
Merge pull request #220 from nottinghamtec/merge-interface
Merge interface
This commit is contained in:
@@ -4,16 +4,23 @@ from django.contrib.auth.admin import UserAdmin
|
|||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
import reversion
|
import reversion
|
||||||
|
|
||||||
|
from django.contrib.admin import helpers
|
||||||
|
from django.template.response import TemplateResponse
|
||||||
|
from django.contrib import messages
|
||||||
|
from django.db import transaction
|
||||||
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
|
from django.db.models import Count
|
||||||
|
from django.forms import ModelForm
|
||||||
|
|
||||||
# Register your models here.
|
# Register your models here.
|
||||||
admin.site.register(models.Person, reversion.VersionAdmin)
|
|
||||||
admin.site.register(models.Organisation, reversion.VersionAdmin)
|
|
||||||
admin.site.register(models.VatRate, reversion.VersionAdmin)
|
admin.site.register(models.VatRate, reversion.VersionAdmin)
|
||||||
admin.site.register(models.Venue, reversion.VersionAdmin)
|
|
||||||
admin.site.register(models.Event, reversion.VersionAdmin)
|
admin.site.register(models.Event, reversion.VersionAdmin)
|
||||||
admin.site.register(models.EventItem, reversion.VersionAdmin)
|
admin.site.register(models.EventItem, reversion.VersionAdmin)
|
||||||
admin.site.register(models.Invoice)
|
admin.site.register(models.Invoice)
|
||||||
admin.site.register(models.Payment)
|
admin.site.register(models.Payment)
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(models.Profile)
|
||||||
class ProfileAdmin(UserAdmin):
|
class ProfileAdmin(UserAdmin):
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
(None, {'fields': ('username', 'password')}),
|
(None, {'fields': ('username', 'password')}),
|
||||||
@@ -33,4 +40,76 @@ class ProfileAdmin(UserAdmin):
|
|||||||
form = forms.ProfileChangeForm
|
form = forms.ProfileChangeForm
|
||||||
add_form = forms.ProfileCreationForm
|
add_form = forms.ProfileCreationForm
|
||||||
|
|
||||||
admin.site.register(models.Profile, ProfileAdmin)
|
|
||||||
|
class AssociateAdmin(reversion.VersionAdmin):
|
||||||
|
list_display = ('id', 'name', 'number_of_events')
|
||||||
|
search_fields = ['id', 'name']
|
||||||
|
list_display_links = ['id', 'name']
|
||||||
|
actions = ['merge']
|
||||||
|
|
||||||
|
merge_fields = ['name']
|
||||||
|
|
||||||
|
def get_queryset(self, request):
|
||||||
|
return super(AssociateAdmin, self).get_queryset(request).annotate(event_count=Count('event'))
|
||||||
|
|
||||||
|
def number_of_events(self, obj):
|
||||||
|
return obj.latest_events.count()
|
||||||
|
|
||||||
|
number_of_events.admin_order_field = 'event_count'
|
||||||
|
|
||||||
|
def merge(self, request, queryset):
|
||||||
|
if request.POST.get('post'): # Has the user confirmed which is the master record?
|
||||||
|
try:
|
||||||
|
masterObjectPk = request.POST.get('master')
|
||||||
|
masterObject = queryset.get(pk=masterObjectPk)
|
||||||
|
except ObjectDoesNotExist:
|
||||||
|
self.message_user(request, "An error occured. Did you select a 'master' record?", level=messages.ERROR)
|
||||||
|
return
|
||||||
|
|
||||||
|
with transaction.atomic(), reversion.create_revision():
|
||||||
|
for obj in queryset.exclude(pk=masterObjectPk):
|
||||||
|
events = obj.event_set.all()
|
||||||
|
for event in events:
|
||||||
|
masterObject.event_set.add(event)
|
||||||
|
obj.delete()
|
||||||
|
reversion.set_comment('Merging Objects')
|
||||||
|
|
||||||
|
self.message_user(request, "Objects successfully merged.")
|
||||||
|
return
|
||||||
|
else: # Present the confirmation screen
|
||||||
|
|
||||||
|
class TempForm(ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = queryset.model
|
||||||
|
fields = self.merge_fields
|
||||||
|
|
||||||
|
forms = []
|
||||||
|
for obj in queryset:
|
||||||
|
forms.append(TempForm(instance=obj))
|
||||||
|
|
||||||
|
context = {
|
||||||
|
'title': _("Are you sure?"),
|
||||||
|
'queryset': queryset,
|
||||||
|
'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME,
|
||||||
|
'forms': forms
|
||||||
|
}
|
||||||
|
return TemplateResponse(request, 'RIGS/admin_associate_merge.html', context,
|
||||||
|
current_app=self.admin_site.name)
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(models.Person)
|
||||||
|
class PersonAdmin(AssociateAdmin):
|
||||||
|
list_display = ('id', 'name', 'phone', 'email', 'number_of_events')
|
||||||
|
merge_fields = ['name', 'phone', 'email', 'address', 'notes']
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(models.Venue)
|
||||||
|
class VenueAdmin(AssociateAdmin):
|
||||||
|
list_display = ('id', 'name', 'phone', 'email', 'number_of_events')
|
||||||
|
merge_fields = ['name', 'phone', 'email', 'address', 'notes', 'three_phase_available']
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(models.Organisation)
|
||||||
|
class OrganisationAdmin(AssociateAdmin):
|
||||||
|
list_display = ('id', 'name', 'phone', 'email', 'number_of_events')
|
||||||
|
merge_fields = ['name', 'phone', 'email', 'address', 'notes', 'union_account']
|
||||||
|
|||||||
@@ -40,6 +40,9 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% include 'RIGS/object_button.html' with object=version.new %}
|
{% include 'RIGS/object_button.html' with object=version.new %}
|
||||||
|
{% if version.revision.comment %}
|
||||||
|
({{ version.revision.comment }})
|
||||||
|
{% endif %}
|
||||||
</small>
|
</small>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|||||||
@@ -59,6 +59,7 @@
|
|||||||
<td>Version ID</td>
|
<td>Version ID</td>
|
||||||
<td>User</td>
|
<td>User</td>
|
||||||
<td>Changes</td>
|
<td>Changes</td>
|
||||||
|
<td>Comment</td>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@@ -75,6 +76,7 @@
|
|||||||
{% else %}
|
{% else %}
|
||||||
{% include 'RIGS/version_changes.html' %}
|
{% include 'RIGS/version_changes.html' %}
|
||||||
{% endif %} </td>
|
{% endif %} </td>
|
||||||
|
<td>{{ version.revision.comment }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|||||||
40
RIGS/templates/RIGS/admin_associate_merge.html
Normal file
40
RIGS/templates/RIGS/admin_associate_merge.html
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
{% extends "admin/base_site.html" %}
|
||||||
|
{% load i18n l10n %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<form action="" method="post">{% csrf_token %}
|
||||||
|
<p>The following objects will be merged. Please select the 'master' record which you would like to keep. Other records will have associated events moved to the 'master' copy, and then will be deleted.</p>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
{% for form in forms %}
|
||||||
|
{% if forloop.first %}
|
||||||
|
<tr>
|
||||||
|
<th></th>
|
||||||
|
<th> ID </th>
|
||||||
|
{% for field in form %}
|
||||||
|
<th>{{ field.label }}</th>
|
||||||
|
{% endfor %}
|
||||||
|
</tr>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><input type="radio" name="master" value="{{form.instance.pk|unlocalize}}"></td>
|
||||||
|
<td>{{form.instance.pk}}</td>
|
||||||
|
{% for field in form %}
|
||||||
|
<td> {{ field.value }} </td>
|
||||||
|
{% endfor %}
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
<div>
|
||||||
|
{% for obj in queryset %}
|
||||||
|
<input type="hidden" name="{{ action_checkbox_name }}" value="{{ obj.pk|unlocalize }}" />
|
||||||
|
{% endfor %}
|
||||||
|
<input type="hidden" name="action" value="merge" />
|
||||||
|
<input type="hidden" name="post" value="yes" />
|
||||||
|
<input type="submit" value="Merge them" />
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
||||||
@@ -35,6 +35,7 @@
|
|||||||
<td>Version ID</td>
|
<td>Version ID</td>
|
||||||
<td>User</td>
|
<td>User</td>
|
||||||
<td>Changes</td>
|
<td>Changes</td>
|
||||||
|
<td>Comment</td>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@@ -51,6 +52,9 @@
|
|||||||
{% include 'RIGS/version_changes.html' %}
|
{% include 'RIGS/version_changes.html' %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ version.revision.comment }}
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|||||||
157
RIGS/test_unit.py
Normal file
157
RIGS/test_unit.py
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
from django.core.urlresolvers import reverse
|
||||||
|
from django.test import TestCase
|
||||||
|
from datetime import date
|
||||||
|
|
||||||
|
from RIGS import models
|
||||||
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
|
|
||||||
|
|
||||||
|
class TestAdminMergeObjects(TestCase):
|
||||||
|
@classmethod
|
||||||
|
def setUpTestData(cls):
|
||||||
|
cls.profile = models.Profile.objects.create(username="testuser1", email="1@test.com", is_superuser=True,
|
||||||
|
is_active=True, is_staff=True)
|
||||||
|
|
||||||
|
cls.persons = {
|
||||||
|
1: models.Person.objects.create(name="Person 1"),
|
||||||
|
2: models.Person.objects.create(name="Person 2"),
|
||||||
|
3: models.Person.objects.create(name="Person 3"),
|
||||||
|
}
|
||||||
|
|
||||||
|
cls.organisations = {
|
||||||
|
1: models.Organisation.objects.create(name="Organisation 1"),
|
||||||
|
2: models.Organisation.objects.create(name="Organisation 2"),
|
||||||
|
3: models.Organisation.objects.create(name="Organisation 3"),
|
||||||
|
}
|
||||||
|
|
||||||
|
cls.venues = {
|
||||||
|
1: models.Venue.objects.create(name="Venue 1"),
|
||||||
|
2: models.Venue.objects.create(name="Venue 2"),
|
||||||
|
3: models.Venue.objects.create(name="Venue 3"),
|
||||||
|
}
|
||||||
|
|
||||||
|
cls.events = {
|
||||||
|
1: models.Event.objects.create(name="TE E1", start_date=date.today(), person=cls.persons[1],
|
||||||
|
organisation=cls.organisations[3], venue=cls.venues[2]),
|
||||||
|
2: models.Event.objects.create(name="TE E2", start_date=date.today(), person=cls.persons[2],
|
||||||
|
organisation=cls.organisations[2], venue=cls.venues[3]),
|
||||||
|
3: models.Event.objects.create(name="TE E3", start_date=date.today(), person=cls.persons[3],
|
||||||
|
organisation=cls.organisations[1], venue=cls.venues[1]),
|
||||||
|
4: models.Event.objects.create(name="TE E4", start_date=date.today(), person=cls.persons[3],
|
||||||
|
organisation=cls.organisations[3], venue=cls.venues[3]),
|
||||||
|
}
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.profile.set_password('testuser')
|
||||||
|
self.profile.save()
|
||||||
|
self.assertTrue(self.client.login(username=self.profile.username, password='testuser'))
|
||||||
|
|
||||||
|
def test_merge_confirmation(self):
|
||||||
|
change_url = reverse('admin:RIGS_venue_changelist')
|
||||||
|
data = {
|
||||||
|
'action': 'merge',
|
||||||
|
'_selected_action': [unicode(val.pk) for key, val in self.venues.iteritems()]
|
||||||
|
|
||||||
|
}
|
||||||
|
response = self.client.post(change_url, data, follow=True)
|
||||||
|
|
||||||
|
self.assertContains(response, "The following objects will be merged")
|
||||||
|
for key, venue in self.venues.iteritems():
|
||||||
|
self.assertContains(response, venue.name)
|
||||||
|
|
||||||
|
def test_merge_no_master(self):
|
||||||
|
change_url = reverse('admin:RIGS_venue_changelist')
|
||||||
|
data = {'action': 'merge',
|
||||||
|
'_selected_action': [unicode(val.pk) for key, val in self.venues.iteritems()],
|
||||||
|
'post': 'yes',
|
||||||
|
}
|
||||||
|
response = self.client.post(change_url, data, follow=True)
|
||||||
|
|
||||||
|
self.assertContains(response, "An error occured")
|
||||||
|
|
||||||
|
def test_venue_merge(self):
|
||||||
|
change_url = reverse('admin:RIGS_venue_changelist')
|
||||||
|
|
||||||
|
data = {'action': 'merge',
|
||||||
|
'_selected_action': [unicode(self.venues[1].pk), unicode(self.venues[2].pk)],
|
||||||
|
'post': 'yes',
|
||||||
|
'master': self.venues[1].pk
|
||||||
|
}
|
||||||
|
|
||||||
|
response = self.client.post(change_url, data, follow=True)
|
||||||
|
self.assertContains(response, "Objects successfully merged")
|
||||||
|
self.assertContains(response, self.venues[1].name)
|
||||||
|
|
||||||
|
# Check the master copy still exists
|
||||||
|
self.assertTrue(models.Venue.objects.get(pk=self.venues[1].pk))
|
||||||
|
|
||||||
|
# Check the un-needed venue has been disposed of
|
||||||
|
self.assertRaises(ObjectDoesNotExist, models.Venue.objects.get, pk=self.venues[2].pk)
|
||||||
|
|
||||||
|
# Check the one we didn't delete is still there
|
||||||
|
self.assertEqual(models.Venue.objects.get(pk=self.venues[3].pk), self.venues[3])
|
||||||
|
|
||||||
|
# Check the events have been moved to the master venue
|
||||||
|
for key, event in self.events.iteritems():
|
||||||
|
updatedEvent = models.Event.objects.get(pk=event.pk)
|
||||||
|
if event.venue == self.venues[3]: # The one we left in place
|
||||||
|
continue
|
||||||
|
self.assertEqual(updatedEvent.venue, self.venues[1])
|
||||||
|
|
||||||
|
def test_person_merge(self):
|
||||||
|
change_url = reverse('admin:RIGS_person_changelist')
|
||||||
|
|
||||||
|
data = {'action': 'merge',
|
||||||
|
'_selected_action': [unicode(self.persons[1].pk), unicode(self.persons[2].pk)],
|
||||||
|
'post': 'yes',
|
||||||
|
'master': self.persons[1].pk
|
||||||
|
}
|
||||||
|
|
||||||
|
response = self.client.post(change_url, data, follow=True)
|
||||||
|
self.assertContains(response, "Objects successfully merged")
|
||||||
|
self.assertContains(response, self.persons[1].name)
|
||||||
|
|
||||||
|
# Check the master copy still exists
|
||||||
|
self.assertTrue(models.Person.objects.get(pk=self.persons[1].pk))
|
||||||
|
|
||||||
|
# Check the un-needed people have been disposed of
|
||||||
|
self.assertRaises(ObjectDoesNotExist, models.Person.objects.get, pk=self.persons[2].pk)
|
||||||
|
|
||||||
|
# Check the one we didn't delete is still there
|
||||||
|
self.assertEqual(models.Person.objects.get(pk=self.persons[3].pk), self.persons[3])
|
||||||
|
|
||||||
|
# Check the events have been moved to the master person
|
||||||
|
for key, event in self.events.iteritems():
|
||||||
|
updatedEvent = models.Event.objects.get(pk=event.pk)
|
||||||
|
if event.person == self.persons[3]: # The one we left in place
|
||||||
|
continue
|
||||||
|
self.assertEqual(updatedEvent.person, self.persons[1])
|
||||||
|
|
||||||
|
def test_organisation_merge(self):
|
||||||
|
change_url = reverse('admin:RIGS_organisation_changelist')
|
||||||
|
|
||||||
|
data = {'action': 'merge',
|
||||||
|
'_selected_action': [unicode(self.organisations[1].pk), unicode(self.organisations[2].pk)],
|
||||||
|
'post': 'yes',
|
||||||
|
'master': self.organisations[1].pk
|
||||||
|
}
|
||||||
|
|
||||||
|
response = self.client.post(change_url, data, follow=True)
|
||||||
|
self.assertContains(response, "Objects successfully merged")
|
||||||
|
self.assertContains(response, self.organisations[1].name)
|
||||||
|
|
||||||
|
# Check the master copy still exists
|
||||||
|
self.assertTrue(models.Organisation.objects.get(pk=self.organisations[1].pk))
|
||||||
|
|
||||||
|
# Check the un-needed organisations have been disposed of
|
||||||
|
self.assertRaises(ObjectDoesNotExist, models.Organisation.objects.get, pk=self.organisations[2].pk)
|
||||||
|
|
||||||
|
# Check the one we didn't delete is still there
|
||||||
|
self.assertEqual(models.Organisation.objects.get(pk=self.organisations[3].pk), self.organisations[3])
|
||||||
|
|
||||||
|
# Check the events have been moved to the master organisation
|
||||||
|
for key, event in self.events.iteritems():
|
||||||
|
updatedEvent = models.Event.objects.get(pk=event.pk)
|
||||||
|
if event.organisation == self.organisations[3]: # The one we left in place
|
||||||
|
continue
|
||||||
|
self.assertEqual(updatedEvent.organisation, self.organisations[1])
|
||||||
@@ -1,27 +1,18 @@
|
|||||||
import logging
|
import logging
|
||||||
from django.views import generic
|
|
||||||
from django.core.urlresolvers import reverse_lazy
|
|
||||||
from django.shortcuts import get_object_or_404
|
|
||||||
from django.template import RequestContext
|
|
||||||
from django.template.loader import get_template
|
|
||||||
from django.conf import settings
|
|
||||||
from django.http import HttpResponse
|
|
||||||
from django.db.models import Q
|
|
||||||
from django.contrib import messages
|
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
|
from django.shortcuts import get_object_or_404
|
||||||
|
from django.views import generic
|
||||||
|
|
||||||
# Versioning
|
# Versioning
|
||||||
import reversion
|
import reversion
|
||||||
import simplejson
|
|
||||||
from reversion.models import Version
|
from reversion.models import Version
|
||||||
from django.contrib.contenttypes.models import ContentType # Used to lookup the content_type
|
from django.contrib.contenttypes.models import ContentType # Used to lookup the content_type
|
||||||
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
from django.db.models import IntegerField, EmailField, TextField
|
||||||
from django.db.models import ForeignKey, IntegerField, EmailField, TextField
|
|
||||||
from diff_match_patch import diff_match_patch
|
from diff_match_patch import diff_match_patch
|
||||||
|
|
||||||
from RIGS import models, forms
|
from RIGS import models
|
||||||
import datetime
|
import datetime
|
||||||
import re
|
|
||||||
|
|
||||||
logger = logging.getLogger('tec.pyrigs')
|
logger = logging.getLogger('tec.pyrigs')
|
||||||
|
|
||||||
@@ -33,7 +24,6 @@ def model_compare(oldObj, newObj, excluded_keys=[]):
|
|||||||
except AttributeError:
|
except AttributeError:
|
||||||
theFields = newObj._meta.fields
|
theFields = newObj._meta.fields
|
||||||
|
|
||||||
|
|
||||||
class FieldCompare(object):
|
class FieldCompare(object):
|
||||||
def __init__(self, field=None, old=None, new=None):
|
def __init__(self, field=None, old=None, new=None):
|
||||||
self.field = field
|
self.field = field
|
||||||
@@ -92,8 +82,15 @@ def model_compare(oldObj, newObj, excluded_keys=[]):
|
|||||||
if name in excluded_keys:
|
if name in excluded_keys:
|
||||||
continue # if we're excluding this field, skip over it
|
continue # if we're excluding this field, skip over it
|
||||||
|
|
||||||
|
try:
|
||||||
oldValue = getattr(oldObj, name, None)
|
oldValue = getattr(oldObj, name, None)
|
||||||
|
except ObjectDoesNotExist:
|
||||||
|
oldValue = None
|
||||||
|
|
||||||
|
try:
|
||||||
newValue = getattr(newObj, name, None)
|
newValue = getattr(newObj, name, None)
|
||||||
|
except ObjectDoesNotExist:
|
||||||
|
newValue = None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
bothBlank = (not oldValue) and (not newValue)
|
bothBlank = (not oldValue) and (not newValue)
|
||||||
@@ -105,6 +102,7 @@ def model_compare(oldObj, newObj, excluded_keys=[]):
|
|||||||
|
|
||||||
return changes
|
return changes
|
||||||
|
|
||||||
|
|
||||||
def compare_event_items(old, new):
|
def compare_event_items(old, new):
|
||||||
# Recieves two event version objects and compares their items, returns an array of ItemCompare objects
|
# Recieves two event version objects and compares their items, returns an array of ItemCompare objects
|
||||||
|
|
||||||
@@ -141,6 +139,7 @@ def compare_event_items(old, new):
|
|||||||
|
|
||||||
return changes
|
return changes
|
||||||
|
|
||||||
|
|
||||||
def get_versions_for_model(models):
|
def get_versions_for_model(models):
|
||||||
content_types = []
|
content_types = []
|
||||||
for model in models:
|
for model in models:
|
||||||
@@ -152,6 +151,7 @@ def get_versions_for_model(models):
|
|||||||
|
|
||||||
return versions
|
return versions
|
||||||
|
|
||||||
|
|
||||||
def get_previous_version(version):
|
def get_previous_version(version):
|
||||||
thisId = version.object_id
|
thisId = version.object_id
|
||||||
thisVersionId = version.pk
|
thisVersionId = version.pk
|
||||||
@@ -159,12 +159,14 @@ def get_previous_version(version):
|
|||||||
versions = reversion.get_for_object_reference(version.content_type.model_class(), thisId)
|
versions = reversion.get_for_object_reference(version.content_type.model_class(), thisId)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
previousVersions = versions.filter(revision_id__lt=version.revision_id).latest(field_name='revision__date_created')
|
previousVersions = versions.filter(revision_id__lt=version.revision_id).latest(
|
||||||
|
field_name='revision__date_created')
|
||||||
except ObjectDoesNotExist:
|
except ObjectDoesNotExist:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return previousVersions
|
return previousVersions
|
||||||
|
|
||||||
|
|
||||||
def get_changes_for_version(newVersion, oldVersion=None):
|
def get_changes_for_version(newVersion, oldVersion=None):
|
||||||
# Pass in a previous version if you already know it (for efficiancy)
|
# Pass in a previous version if you already know it (for efficiancy)
|
||||||
# if not provided then it will be looked up in the database
|
# if not provided then it will be looked up in the database
|
||||||
@@ -193,6 +195,7 @@ def get_changes_for_version(newVersion, oldVersion=None):
|
|||||||
|
|
||||||
return compare
|
return compare
|
||||||
|
|
||||||
|
|
||||||
class VersionHistory(generic.ListView):
|
class VersionHistory(generic.ListView):
|
||||||
model = reversion.revisions.Version
|
model = reversion.revisions.Version
|
||||||
template_name = "RIGS/version_history.html"
|
template_name = "RIGS/version_history.html"
|
||||||
@@ -229,6 +232,7 @@ class VersionHistory(generic.ListView):
|
|||||||
|
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
class ActivityTable(generic.ListView):
|
class ActivityTable(generic.ListView):
|
||||||
model = reversion.revisions.Version
|
model = reversion.revisions.Version
|
||||||
template_name = "RIGS/activity_table.html"
|
template_name = "RIGS/activity_table.html"
|
||||||
@@ -239,7 +243,6 @@ class ActivityTable(generic.ListView):
|
|||||||
return versions
|
return versions
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
|
|
||||||
# Call the base implementation first to get a context
|
# Call the base implementation first to get a context
|
||||||
context = super(ActivityTable, self).get_context_data(**kwargs)
|
context = super(ActivityTable, self).get_context_data(**kwargs)
|
||||||
|
|
||||||
@@ -253,6 +256,7 @@ class ActivityTable(generic.ListView):
|
|||||||
|
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
class ActivityFeed(generic.ListView):
|
class ActivityFeed(generic.ListView):
|
||||||
model = reversion.revisions.Version
|
model = reversion.revisions.Version
|
||||||
template_name = "RIGS/activity_feed_data.html"
|
template_name = "RIGS/activity_feed_data.html"
|
||||||
@@ -278,7 +282,8 @@ class ActivityFeed(generic.ListView):
|
|||||||
if thisItem['item_changes'] or thisItem['field_changes'] or thisItem['old'] == None:
|
if thisItem['item_changes'] or thisItem['field_changes'] or thisItem['old'] == None:
|
||||||
thisItem['withPrevious'] = False
|
thisItem['withPrevious'] = False
|
||||||
if len(items) >= 1:
|
if len(items) >= 1:
|
||||||
timeAgo = datetime.datetime.now(thisItem['revision'].date_created.tzinfo) - thisItem['revision'].date_created
|
timeAgo = datetime.datetime.now(thisItem['revision'].date_created.tzinfo) - thisItem[
|
||||||
|
'revision'].date_created
|
||||||
timeDiff = items[-1]['revision'].date_created - thisItem['revision'].date_created
|
timeDiff = items[-1]['revision'].date_created - thisItem['revision'].date_created
|
||||||
timeTogether = False
|
timeTogether = False
|
||||||
for params in maxTimeDelta:
|
for params in maxTimeDelta:
|
||||||
@@ -293,5 +298,4 @@ class ActivityFeed(generic.ListView):
|
|||||||
|
|
||||||
context['object_list'] = items
|
context['object_list'] = items
|
||||||
|
|
||||||
|
|
||||||
return context
|
return context
|
||||||
Reference in New Issue
Block a user