def change_view(self, request, object_id, extra_context=None): from moderation import moderation moderated_object = ModeratedObject.objects.get(pk=object_id) changed_object = moderated_object.changed_object moderator = moderation.get_moderator(changed_object.__class__) changes = get_changes_between_models( moderated_object.get_object_for_this_type(), changed_object, moderator.fields_exclude).values() if request.POST: admin_form = self.get_form(request, moderated_object)(request.POST) if admin_form.is_valid(): reason = admin_form.cleaned_data['moderation_reason'] if 'approve' in request.POST: moderated_object.approve(request.user, reason) elif 'reject' in request.POST: moderated_object.reject(request.user, reason) extra_context = {'changes': changes, 'django_version': django.get_version()[:3]} return super(ModeratedObjectAdmin, self).change_view(request, object_id, extra_context)
def test_date_field_in_model_object_should_be_unicode(self): '''Test if when model field value is not unicode, then when getting changes between models, all changes should be unicode. ''' changes = get_changes_between_models(self.obj1, self.obj2) self.assertTrue(isinstance(changes['date'][0], unicode)) self.assertTrue(isinstance(changes['date'][1], unicode))
def test_date_field_in_model_object_should_be_unicode(self): '''Test if when model field value is not unicode, then when getting changes between models, all changes should be unicode. ''' changes = get_changes_between_models(self.obj1, self.obj2) date_change = changes['modelwithdatefield__date'] self.assertTrue(isinstance(date_change.change[0], str)) self.assertTrue(isinstance(date_change.change[1], str))
def test_html_to_list_should_return_list(self): '''Test if changes dict generated from model that has non unicode field is properly used by html_to_list function ''' changes = get_changes_between_models(self.obj1, self.obj2) changes_list1 = html_to_list(changes['date'][0]) changes_list2 = html_to_list(changes['date'][1]) self.assertTrue(isinstance(changes_list1, list)) self.assertTrue(isinstance(changes_list2, list))
def has_object_been_changed(self, original_obj, fields_exclude=None): if fields_exclude is None: fields_exclude = self.moderator.fields_exclude changes = get_changes_between_models(original_obj, self.changed_object, fields_exclude) for change in changes: left_change, right_change = changes[change].change if left_change != right_change: return True return False
def test_get_changes_between_models(self): self.profile.description = 'New description' moderated_object = ModeratedObject(content_object=self.profile) moderated_object.save() self.profile = UserProfile.objects.get(user__username='******') diff = get_changes_between_models(moderated_object.changed_object, self.profile) self.assertEqual(diff, {'description': ('New description', u'Profile description')})
def test_excluded_fields_should_be_excluded_from_changes(self): self.profile.description = 'New description' moderated_object = ModeratedObject(content_object=self.profile) moderated_object.save() self.profile = UserProfile.objects.get(user__username='******') changes = get_changes_between_models(moderated_object.changed_object, self.profile, excludes=['description']) self.assertEqual(unicode(changes), u"{u'userprofile__url': Change object: "\ u"http://www.google.com - http://www.google.com}")
def test_html_to_list_should_return_list(self): '''Test if changes dict generated from model that has non unicode field is properly used by html_to_list function ''' changes = get_changes_between_models(self.obj1, self.obj2) date_change = changes['modelwithdatefield__date'] changes_list1 = html_to_list(date_change.change[0]) changes_list2 = html_to_list(date_change.change[1]) self.assertTrue(isinstance(changes_list1, list)) self.assertTrue(isinstance(changes_list2, list))
def test_get_changes_between_models_image(self): '''Verify proper diff for ImageField fields''' image1 = ModelWithImage(image='tmp/test1.jpg') image1.save() image2 = ModelWithImage(image='tmp/test2.jpg') image2.save() changes = get_changes_between_models(image1, image2) self.assertEqual(norm_whitespace(changes['modelwithimage__image'].diff), norm_whitespace(u'<img src="/media/tmp/test1.jpg"> ' u'<img style="margin-left: 10px;" ' u'src="/media/tmp/test2.jpg">'))
def test_get_changes_between_models_image(self): '''Verify proper diff for ImageField fields''' image1 = ModelWithImage(image='tmp/test1.jpg') image1.save() image2 = ModelWithImage(image='tmp/test2.jpg') image2.save() changes = get_changes_between_models(image1, image2) self.assertEqual( norm_whitespace(changes['modelwithimage__image'].diff), norm_whitespace(u'<img src="/media/tmp/test1.jpg"> ' u'<img style="margin-left: 10px;" ' u'src="/media/tmp/test2.jpg">'))
def test_get_changes_between_models(self): self.profile.description = 'New description' moderated_object = ModeratedObject(content_object=self.profile) moderated_object.save() self.profile = UserProfile.objects.get(user__username='******') changes = get_changes_between_models(moderated_object.changed_object, self.profile) self.assertEqual(unicode(changes), u"{u'userprofile__url': Change object: http://www.google.com"\ u" - http://www.google.com, u'userprofile__description': "\ u"Change object: New description - Old description}")
def change_view(self, request, object_id, extra_context=None): from moderation import moderation moderated_object = ModeratedObject.objects.get(pk=object_id) changed_obj = moderated_object.changed_object moderator = moderation.get_moderator(changed_obj.__class__) if moderator.visible_until_rejected: old_object = changed_obj new_object = moderated_object.get_object_for_this_type() else: old_object = moderated_object.get_object_for_this_type() new_object = changed_obj changes = get_changes_between_models( old_object, new_object, moderator.fields_exclude).values() if request.POST: admin_form = self.get_form(request, moderated_object)(request.POST) if admin_form.is_valid(): reason = admin_form.cleaned_data['moderation_reason'] if 'approve' in request.POST: moderation_message = moderated_object.approve(request.user, reason) messages.add_message(request, messages.INFO, moderation_message) return self.response_change(request, new_object) elif 'reject' in request.POST: moderation_message = moderated_object.reject(request.user, reason) messages.add_message(request, messages.INFO, moderation_message) content_type = ContentType.objects.get_for_model(changed_obj.__class__) try: object_admin_url = urlresolvers.reverse("admin:%s_%s_change" % (content_type.app_label, content_type.model), args=(changed_obj.pk,)) except urlresolvers.NoReverseMatch: object_admin_url = None extra_context = {'changes': changes, 'old_object': old_object, 'new_object': new_object, 'django_version': django.get_version()[:3], 'object_admin_url': object_admin_url} return super(ModeratedObjectAdmin, self).change_view(request, object_id, extra_context)
def test_get_changes_between_models_image(self): '''Verify proper diff for ImageField fields''' image1 = ModelWithImage(image='tmp/test1.jpg') image1.save() image2 = ModelWithImage(image='tmp/test2.jpg') image2.save() changes = get_changes_between_models(image1, image2) self.assertEqual( norm_whitespace(changes['modelwithimage__image'].diff), norm_whitespace('<div class="img-wrapper"> ' '<img src="/media/tmp/test1.jpg"> ' '<img src="/media/tmp/test2.jpg"> ' '</div>'))
def test_excluded_fields_should_be_excluded_from_changes(self): self.profile.description = 'New description' moderated_object = ModeratedObject(content_object=self.profile) moderated_object.save() self.profile = UserProfile.objects.get(user__username='******') changes = get_changes_between_models(moderated_object.changed_object, self.profile, excludes=['description']) self.assertEqual(unicode(changes), u"{u'userprofile__url': Change object: "\ u"http://www.google.com - http://www.google.com, "\ u"u'userprofile__user': Change object: 1 - 1}")
def test_get_changes_between_models(self): self.profile.description = 'New description' moderated_object = ModeratedObject(content_object=self.profile) moderated_object.save() self.profile = UserProfile.objects.get(user__username='******') changes = get_changes_between_models(moderated_object.changed_object, self.profile) self.assertEqual( unicode(changes), u"{u'userprofile__url': Change object: http://www.google.com"\ u" - http://www.google.com, u'userprofile__description': "\ u"Change object: New description - Old description, "\ u"u'userprofile__user': Change object: 1 - 1}")
def change_view(self, request, object_id, extra_context=None): from moderation import moderation moderated_object = ModeratedObject.objects.get(pk=object_id) changed_obj = moderated_object.changed_object moderator = moderation.get_moderator(changed_obj.__class__) if moderator.visible_until_rejected: old_object = changed_obj new_object = moderated_object.get_object_for_this_type() else: old_object = moderated_object.get_object_for_this_type() new_object = changed_obj changes = list( get_changes_between_models(old_object, new_object, moderator.fields_exclude).values()) if request.POST: admin_form = self.get_form(request, moderated_object)(request.POST) if admin_form.is_valid(): reason = admin_form.cleaned_data['moderation_reason'] if 'approve' in request.POST: moderated_object.approve(request.user, reason) elif 'reject' in request.POST: moderated_object.reject(request.user, reason) content_type = ContentType.objects.get_for_model(changed_obj.__class__) try: object_admin_url = urlresolvers.reverse( "admin:%s_%s_change" % (content_type.app_label, content_type.model), args=(changed_obj.pk, )) except urlresolvers.NoReverseMatch: object_admin_url = None extra_context = { 'changes': changes, 'django_version': django.get_version()[:3], 'object_admin_url': object_admin_url } return super(ModeratedObjectAdmin, self).change_view(request, object_id, extra_context=extra_context)
def test_foreign_key_changes(self): self.profile.user = User.objects.get(username='******') moderated_object = ModeratedObject(content_object=self.profile) moderated_object.save() self.profile = UserProfile.objects.get(user__username='******') changes = get_changes_between_models(moderated_object.changed_object, self.profile) self.assertIn("'userprofile__user': Change object: 4 - 1", str(changes)) self.assertIn( "'userprofile__description': Change object: Old description - Old " "description", str(changes)) self.assertIn( "'userprofile__url': Change object: http://www" ".google.com - http://www.google.com", str(changes))
def filter_moderated_objects(self, query_set): from moderation.models import MODERATION_STATUS_PENDING,\ MODERATION_STATUS_REJECTED exclude_pks = [] for obj in query_set: try: changes = get_changes_between_models( obj, obj.moderated_object.changed_object) if obj.moderated_object.moderation_status \ in [MODERATION_STATUS_PENDING, MODERATION_STATUS_REJECTED] \ and not changes: exclude_pks.append(obj.pk) except ObjectDoesNotExist: pass return query_set.exclude(pk__in=exclude_pks)
def test_foreign_key_changes(self): self.profile.user = User.objects.get(username='******') moderated_object = ModeratedObject(content_object=self.profile) moderated_object.save() self.profile = UserProfile.objects.get(user__username='******') changes = get_changes_between_models(moderated_object.changed_object, self.profile) self.assertIn("'userprofile__user': Change object: 4 - 1", str(changes)) self.assertIn( "'userprofile__description': Change object: Old description - Old " "description", str(changes)) self.assertIn("'userprofile__url': Change object: http://www" ".google.com - http://www.google.com", str(changes))
def test_get_changes_between_models(self): self.profile.description = 'New description' moderated_object = ModeratedObject(content_object=self.profile) moderated_object.save() self.profile = UserProfile.objects.get(user__username='******') changes = get_changes_between_models(moderated_object.changed_object, self.profile) self.assertIn( "'userprofile__description': Change object: New description - " "Old description", str(changes)) self.assertIn("'userprofile__user': Change object: 1 - 1", str(changes)) self.assertIn( "'userprofile__url': Change object: http://www.google.com - " "http://www.google.com", str(changes))
def change_view(self, request, object_id, extra_context=None): from moderation import moderation moderated_object = ModeratedObject.objects.get(pk=object_id) changed_object = moderated_object.changed_object moderator = moderation.get_moderator(changed_object.__class__) changes = get_changes_between_models( moderated_object.get_object_for_this_type(), changed_object, moderator.fields_exclude ).values() if request.POST: admin_form = self.get_form(request, moderated_object)(request.POST) if admin_form.is_valid(): reason = admin_form.cleaned_data["moderation_reason"] if "approve" in request.POST: moderated_object.approve(request.user, reason) elif "reject" in request.POST: moderated_object.reject(request.user, reason) content_type = ContentType.objects.get_for_model(changed_object.__class__) try: object_admin_url = urlresolvers.reverse( "admin:%s_%s_change" % (content_type.app_label, content_type.model), args=(changed_object.pk,) ) except urlresolvers.NoReverseMatch: object_admin_url = None extra_context = { "changes": changes, "django_version": django.get_version()[:3], "object_admin_url": object_admin_url, } return super(ModeratedObjectAdmin, self).change_view(request, object_id, extra_context)
def change_view(self, request, object_id, extra_context=None): """ Copied and pasted from the base class as I needed to override extra_context And the class hasn't been sublclassed properly to allow that. """ moderated_object = ModeratedObject.objects.get(pk=object_id) changed_obj = moderated_object.changed_object moderator = moderation.get_moderator(changed_obj.__class__) if moderator.visible_until_rejected: old_object = changed_obj new_object = moderated_object.get_object_for_this_type() else: old_object = moderated_object.get_object_for_this_type() new_object = changed_obj changes = list( get_changes_between_models( old_object, new_object, moderator.fields_exclude, resolve_foreignkeys=moderator.resolve_foreignkeys).values()) if request.POST: admin_form = self.get_form(request, moderated_object)(request.POST) if admin_form.is_valid(): reason = admin_form.cleaned_data['reason'] if 'approve' in request.POST: moderated_object.approve(request.user, reason) elif 'reject' in request.POST: moderated_object.reject(request.user, reason) content_type = ContentType.objects.get_for_model(changed_obj.__class__) try: object_admin_url = urlresolvers.reverse( "admin:%s_%s_change" % (content_type.app_label, content_type.model), args=(changed_obj.pk, )) except urlresolvers.NoReverseMatch: object_admin_url = None # This is the only bit of code overridden. try: preview_links = self.get_pdf_links(moderated_object) except BaseException: preview_links = None extra_context = { 'changes': changes, 'django_version': django.get_version()[:3], 'object_admin_url': object_admin_url, # This is the only bit of code overridden 'preview': preview_links } return super(ModeratedObjectAdmin, self).change_view(request, object_id, extra_context=extra_context)