kopia lustrzana https://github.com/wagtail/wagtail
				
				
				
			Support comparison of M2M relations
							rodzic
							
								
									ade7131216
								
							
						
					
					
						commit
						04ac43205b
					
				| 
						 | 
					@ -72,49 +72,60 @@ class ChoiceFieldComparison(FieldComparison):
 | 
				
			||||||
            return escape(val_a)
 | 
					            return escape(val_a)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TagsFieldComparison(FieldComparison):
 | 
					class M2MFieldComparison(FieldComparison):
 | 
				
			||||||
    def get_tags(self):
 | 
					    def get_items(self):
 | 
				
			||||||
        tags_a = [
 | 
					        return list(self.val_a), list(self.val_b)
 | 
				
			||||||
            tag.tag.slug
 | 
					 | 
				
			||||||
            for tag in self.val_a
 | 
					 | 
				
			||||||
        ]
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        tags_b = [
 | 
					    def get_item_display(self, item):
 | 
				
			||||||
            tag.tag.slug
 | 
					        return str(item)
 | 
				
			||||||
            for tag in self.val_b
 | 
					 | 
				
			||||||
        ]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return tags_a, tags_b
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def htmldiff(self):
 | 
					    def htmldiff(self):
 | 
				
			||||||
        # Get tags
 | 
					        # Get tags
 | 
				
			||||||
        tags_a, tags_b = self.get_tags()
 | 
					        items_a, items_b = self.get_items()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Calculate changes
 | 
					        # Calculate changes
 | 
				
			||||||
        sm = difflib.SequenceMatcher(0, tags_a, tags_b)
 | 
					        sm = difflib.SequenceMatcher(0, items_a, items_b)
 | 
				
			||||||
        changes = []
 | 
					        changes = []
 | 
				
			||||||
        for op, i1, i2, j1, j2 in sm.get_opcodes():
 | 
					        for op, i1, i2, j1, j2 in sm.get_opcodes():
 | 
				
			||||||
            if op == 'replace':
 | 
					            if op == 'replace':
 | 
				
			||||||
                for tag in tags_a[i1:i2]:
 | 
					                for item in items_a[i1:i2]:
 | 
				
			||||||
                    changes.append(('deletion', tag))
 | 
					                    changes.append(('deletion', self.get_item_display(item)))
 | 
				
			||||||
                for tag in tags_b[j1:j2]:
 | 
					                for item in items_b[j1:j2]:
 | 
				
			||||||
                    changes.append(('addition', tag))
 | 
					                    changes.append(('addition', self.get_item_display(item)))
 | 
				
			||||||
            elif op == 'delete':
 | 
					            elif op == 'delete':
 | 
				
			||||||
                for tag in tags_a[i1:i2]:
 | 
					                for item in items_a[i1:i2]:
 | 
				
			||||||
                    changes.append(('deletion', tag))
 | 
					                    changes.append(('deletion', self.get_item_display(item)))
 | 
				
			||||||
            elif op == 'insert':
 | 
					            elif op == 'insert':
 | 
				
			||||||
                for tag in tags_b[j1:j2]:
 | 
					                for item in items_b[j1:j2]:
 | 
				
			||||||
                    changes.append(('addition', tag))
 | 
					                    changes.append(('addition', self.get_item_display(item)))
 | 
				
			||||||
            elif op == 'equal':
 | 
					            elif op == 'equal':
 | 
				
			||||||
                for tag in tags_a[i1:i2]:
 | 
					                for item in items_a[i1:i2]:
 | 
				
			||||||
                    changes.append(('equal', tag))
 | 
					                    changes.append(('equal', self.get_item_display(item)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Convert changelist to HTML
 | 
					        # Convert changelist to HTML
 | 
				
			||||||
        return TextDiff(changes, separator=", ").to_html()
 | 
					        return TextDiff(changes, separator=", ").to_html()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def has_changed(self):
 | 
					    def has_changed(self):
 | 
				
			||||||
        tags_a, tags_b = self.get_tags()
 | 
					        items_a, items_b = self.get_items()
 | 
				
			||||||
        return tags_a != tags_b
 | 
					        return items_a != items_b
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TagsFieldComparison(M2MFieldComparison):
 | 
				
			||||||
 | 
					    def get_items(self):
 | 
				
			||||||
 | 
					        tags_a = [
 | 
				
			||||||
 | 
					            tag.tag
 | 
				
			||||||
 | 
					            for tag in self.val_a
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        tags_b = [
 | 
				
			||||||
 | 
					            tag.tag
 | 
				
			||||||
 | 
					            for tag in self.val_b
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return tags_a, tags_b
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_item_display(self, tag):
 | 
				
			||||||
 | 
					        return tag.slug
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ForeignObjectComparison(FieldComparison):
 | 
					class ForeignObjectComparison(FieldComparison):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -482,6 +482,8 @@ class BaseFieldPanel(EditHandler):
 | 
				
			||||||
            if field.is_relation:
 | 
					            if field.is_relation:
 | 
				
			||||||
                if isinstance(field, TaggableManager):
 | 
					                if isinstance(field, TaggableManager):
 | 
				
			||||||
                    return compare.TagsFieldComparison
 | 
					                    return compare.TagsFieldComparison
 | 
				
			||||||
 | 
					                elif field.many_to_many:
 | 
				
			||||||
 | 
					                    return compare.M2MFieldComparison
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                return compare.ForeignObjectComparison
 | 
					                return compare.ForeignObjectComparison
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Ładowanie…
	
		Reference in New Issue