feat: add location deduplication
This commit is contained in:
		@@ -39,7 +39,8 @@ dependencies = [
 | 
			
		||||
    "djangorestframework",
 | 
			
		||||
    "celery[redis]",
 | 
			
		||||
    "drf-spectacular[sidecar]",
 | 
			
		||||
    "django-widget-tweaks"
 | 
			
		||||
    "django-widget-tweaks",
 | 
			
		||||
    "django-super-deduper"
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
dynamic = ["version", "readme"]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								src/fellchensammlung/management/commands/dedup_locations.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/fellchensammlung/management/commands/dedup_locations.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
from django.core.management import BaseCommand
 | 
			
		||||
from fellchensammlung.tools.admin import dedup_locations
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Command(BaseCommand):
 | 
			
		||||
    help = 'Deduplicate locations based on place_id'
 | 
			
		||||
 | 
			
		||||
    def handle(self, *args, **options):
 | 
			
		||||
        dedup_locations()
 | 
			
		||||
 | 
			
		||||
@@ -3,6 +3,8 @@ import logging
 | 
			
		||||
from django.utils import timezone
 | 
			
		||||
from datetime import timedelta
 | 
			
		||||
 | 
			
		||||
from django_super_deduper.merge import MergedModelInstance
 | 
			
		||||
 | 
			
		||||
from fellchensammlung.models import AdoptionNotice, Location, RescueOrganization, AdoptionNoticeStatus, Log, \
 | 
			
		||||
    AdoptionNoticeNotification
 | 
			
		||||
from fellchensammlung.tools.misc import is_404
 | 
			
		||||
@@ -87,6 +89,26 @@ def deactivate_404_adoption_notices():
 | 
			
		||||
                deactivation_message = f'Die Vermittlung  [{adoption_notice.name}]({adoption_notice.get_absolute_url()}) wurde automatisch deaktiviert, da die Website unter "Mehr Informationen" nicht mehr online ist.'
 | 
			
		||||
                for subscription in adoption_notice.get_subscriptions():
 | 
			
		||||
                    AdoptionNoticeNotification.objects.create(user=subscription.owner,
 | 
			
		||||
                                                               title="Vermittlung deaktiviert",
 | 
			
		||||
                                                               adoption_notice=adoption_notice,
 | 
			
		||||
                                                               text=deactivation_message)
 | 
			
		||||
                                                              title="Vermittlung deaktiviert",
 | 
			
		||||
                                                              adoption_notice=adoption_notice,
 | 
			
		||||
                                                              text=deactivation_message)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def dedup_location(location: Location, destructive=False):
 | 
			
		||||
    duplicates = Location.objects.filter(place_id=location.place_id).exclude(id=location.id)
 | 
			
		||||
    merged_object = MergedModelInstance.create(location, duplicates)
 | 
			
		||||
    if destructive:
 | 
			
		||||
        duplicates.delete()
 | 
			
		||||
        print("Deleted duplicate locations")
 | 
			
		||||
    return merged_object
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def dedup_locations():
 | 
			
		||||
    location_ids = list(Location.objects.values_list("id", flat=True))
 | 
			
		||||
    for location_id in location_ids:
 | 
			
		||||
        try:
 | 
			
		||||
            location = Location.objects.get(id=location_id)
 | 
			
		||||
        except Location.DoesNotExist:
 | 
			
		||||
            # Already deleted as a duplicate
 | 
			
		||||
            continue
 | 
			
		||||
        dedup_location(location, destructive=True)
 | 
			
		||||
 
 | 
			
		||||
@@ -60,6 +60,10 @@ LOGGING = {
 | 
			
		||||
            'handlers': ['console'],
 | 
			
		||||
            'level': APP_LOG_LEVEL,
 | 
			
		||||
        },
 | 
			
		||||
        'django_super_deduper': {
 | 
			
		||||
            'handlers': ['console'],
 | 
			
		||||
            'level': 'DEBUG',
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user