#!/usr/bin/env python3 """ Script to clear existing hadis data created by seeding scripts. This script safely removes all hadis-related data while preserving other application data. """ import os import sys import django from pathlib import Path from django.db import transaction # Setup Django environment BASE_DIR = Path(__file__).resolve().parent.parent sys.path.append(str(BASE_DIR)) os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') django.setup() # Import models after Django setup from apps.hadis.models import ( HadisSect, HadisCategory, HadisStatus, HadisTag, Hadis, Transmitters, HadisTransmitter, HadisReference, ReferenceImage ) from apps.library.models import Book, Category as LibraryCategory, BookCollection class HadisDataCleaner: """Class to safely clear hadis data""" def __init__(self): pass def show_current_data(self): """Show current data counts""" print("=== ТЕКУЩИЕ ДАННЫЕ ===") print(f"HadisSect: {HadisSect.objects.count()}") print(f"HadisCategory: {HadisCategory.objects.count()}") print(f"HadisStatus: {HadisStatus.objects.count()}") print(f"HadisTag: {HadisTag.objects.count()}") print(f"Hadis: {Hadis.objects.count()}") print(f"Transmitters: {Transmitters.objects.count()}") print(f"HadisTransmitter: {HadisTransmitter.objects.count()}") print(f"HadisReference: {HadisReference.objects.count()}") print(f"ReferenceImage: {ReferenceImage.objects.count()}") print(f"Books: {Book.objects.count()}") print(f"Library Categories: {LibraryCategory.objects.count()}") print(f"Book Collections: {BookCollection.objects.count()}") # Show sample data print("\n=== ОБРАЗЦЫ ДАННЫХ ===") if HadisSect.objects.exists(): print("HadisSect samples:") for sect in HadisSect.objects.all()[:3]: print(f" - {sect.title}") if HadisStatus.objects.exists(): print("HadisStatus samples:") for status in HadisStatus.objects.all()[:3]: print(f" - {status.title}") if HadisTag.objects.exists(): print("HadisTag samples:") for tag in HadisTag.objects.all()[:5]: print(f" - {tag.title}") if Transmitters.objects.exists(): print("Transmitters samples:") for trans in Transmitters.objects.all()[:3]: print(f" - {trans.full_name}") if Book.objects.exists(): print("Books samples:") for book in Book.objects.all()[:3]: print(f" - {book.title}") @transaction.atomic def clear_all_hadis_data(self): """Clear all hadis-related data""" print("\n=== ОЧИСТКА ДАННЫХ ХАДИСОВ ===") # Clear in reverse dependency order print("Удаление ReferenceImage...") count = ReferenceImage.objects.count() ReferenceImage.objects.all().delete() print(f" Удалено {count} записей ReferenceImage") print("Удаление HadisReference...") count = HadisReference.objects.count() HadisReference.objects.all().delete() print(f" Удалено {count} записей HadisReference") print("Удаление HadisTransmitter...") count = HadisTransmitter.objects.count() HadisTransmitter.objects.all().delete() print(f" Удалено {count} записей HadisTransmitter") print("Удаление Hadis...") count = Hadis.objects.count() Hadis.objects.all().delete() print(f" Удалено {count} записей Hadis") print("Удаление HadisCategory...") count = HadisCategory.objects.count() HadisCategory.objects.all().delete() print(f" Удалено {count} записей HadisCategory") print("Удаление HadisSect...") count = HadisSect.objects.count() HadisSect.objects.all().delete() print(f" Удалено {count} записей HadisSect") print("Удаление HadisStatus...") count = HadisStatus.objects.count() HadisStatus.objects.all().delete() print(f" Удалено {count} записей HadisStatus") print("Удаление HadisTag...") count = HadisTag.objects.count() HadisTag.objects.all().delete() print(f" Удалено {count} записей HadisTag") print("Удаление Transmitters...") count = Transmitters.objects.count() Transmitters.objects.all().delete() print(f" Удалено {count} записей Transmitters") @transaction.atomic def clear_library_data(self): """Clear library data that was created by seeding""" print("\n=== ОЧИСТКА ДАННЫХ БИБЛИОТЕКИ ===") # Only clear books that seem to be created by seeding script # (based on Russian titles or specific patterns) russian_book_titles = [ 'Аль-Кафи', 'Сахих аль-Бухари', 'Ман ля яхдуруху аль-факих', 'Сунан Абу Дауд' ] books_to_delete = Book.objects.filter(title__in=russian_book_titles) count = books_to_delete.count() if count > 0: books_to_delete.delete() print(f" Удалено {count} книг с русскими названиями") else: print(" Книги с русскими названиями не найдены") # Clear library categories with Russian names russian_categories = [ 'Книги хадисов', 'Книги фикха', 'Книги толкования', 'Книги нравственности', 'Исторические книги' ] categories_to_delete = LibraryCategory.objects.filter(title__in=russian_categories) count = categories_to_delete.count() if count > 0: categories_to_delete.delete() print(f" Удалено {count} категорий библиотеки с русскими названиями") else: print(" Категории библиотеки с русскими названиями не найдены") # Clear book collections with Russian names russian_collections = [ 'Шиитские книги хадисов', 'Суннитские книги хадисов', 'Сборник книг по фикху' ] collections_to_delete = BookCollection.objects.filter(title__in=russian_collections) count = collections_to_delete.count() if count > 0: collections_to_delete.delete() print(f" Удалено {count} коллекций книг с русскими названиями") else: print(" Коллекции книг с русскими названиями не найдены") def run_cleanup(self, include_library=True): """Main method to run cleanup""" print("=" * 60) print("ОЧИСТКА ДАННЫХ ХАДИСОВ") print("=" * 60) try: # Show current state self.show_current_data() # Clear hadis data self.clear_all_hadis_data() # Clear library data if requested if include_library: self.clear_library_data() # Show final state print("\n=== ФИНАЛЬНОЕ СОСТОЯНИЕ ===") self.show_current_data() print("\n✅ Очистка завершена успешно!") except Exception as e: print(f"\n❌ Ошибка при очистке: {e}") print("Откат транзакции...") raise def main(): """Main function to run the cleanup script""" import argparse parser = argparse.ArgumentParser(description='Clear hadis data from database') parser.add_argument( '--hadis-only', action='store_true', help='Clear only hadis data, keep library data' ) parser.add_argument( '--force', action='store_true', help='Skip confirmation prompt' ) args = parser.parse_args() include_library = not args.hadis_only if not args.force: print("Это удалит все данные хадисов из базы данных.") if include_library: print("Также будут удалены связанные данные библиотеки.") response = input("Вы уверены? (да/нет): ") if response.lower() not in ['да', 'yes', 'y']: print("Очистка отменена.") return try: cleaner = HadisDataCleaner() cleaner.run_cleanup(include_library=include_library) except Exception as e: print(f"\n❌ Очистка не удалась: {e}") import traceback traceback.print_exc() sys.exit(1) if __name__ == '__main__': main()